2 * SHA-1 implementation for PowerPC.
4 * Copyright (C) 2005 Paul Mackerras <paulus@samba.org>
7 #include <asm/ppc_asm.h>
8 #include <asm/asm-offsets.h>
11 #define LWZ(rt, d, ra) \
14 #define LWZ(rt, d, ra) \
20 * We roll the registers for T, A, B, C, D, E around on each
21 * iteration; T on iteration t is A on iteration t+1, and so on.
22 * We use registers 7 - 12 for this.
24 #define RT(t) ((((t)+5)%6)+7)
25 #define RA(t) ((((t)+4)%6)+7)
26 #define RB(t) ((((t)+3)%6)+7)
27 #define RC(t) ((((t)+2)%6)+7)
28 #define RD(t) ((((t)+1)%6)+7)
29 #define RE(t) ((((t)+0)%6)+7)
31 /* We use registers 16 - 31 for the W values */
32 #define W(t) (((t)%16)+16)
37 #define STEPD0_LOAD(t) \
38 andc r0,RD(t),RB(t); \
40 rotlwi RT(t),RA(t),5; \
45 LWZ(W((t)+4),((t)+4)*4,r4); \
46 rotlwi RB(t),RB(t),30; \
49 #define STEPD0_UPDATE(t) \
51 andc r0,RD(t),RB(t); \
52 rotlwi RT(t),RA(t),5; \
53 rotlwi RB(t),RB(t),30; \
56 xor r5,W((t)+4-3),W((t)+4-8); \
58 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
60 xor W((t)+4),W((t)+4),r5; \
62 rotlwi W((t)+4),W((t)+4),1
66 rotlwi RT(t),RA(t),5; \
67 rotlwi RB(t),RB(t),30; \
74 #define STEPD1_UPDATE(t) \
76 rotlwi RT(t),RA(t),5; \
77 rotlwi RB(t),RB(t),30; \
80 xor r5,W((t)+4-3),W((t)+4-8); \
82 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
84 xor W((t)+4),W((t)+4),r5; \
86 rotlwi W((t)+4),W((t)+4),1
88 #define STEPD2_UPDATE(t) \
91 rotlwi RT(t),RA(t),5; \
93 rotlwi RB(t),RB(t),30; \
95 xor r5,W((t)+4-3),W((t)+4-8); \
97 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
101 xor W((t)+4),W((t)+4),r5; \
102 add RT(t),RT(t),r0; \
103 rotlwi W((t)+4),W((t)+4),1
105 #define STEP0LD4(t) \
107 STEPD0_LOAD((t)+1); \
108 STEPD0_LOAD((t)+2); \
111 #define STEPUP4(t, fn) \
112 STEP##fn##_UPDATE(t); \
113 STEP##fn##_UPDATE((t)+1); \
114 STEP##fn##_UPDATE((t)+2); \
115 STEP##fn##_UPDATE((t)+3)
117 #define STEPUP20(t, fn) \
119 STEPUP4((t)+4, fn); \
120 STEPUP4((t)+8, fn); \
121 STEPUP4((t)+12, fn); \
124 _GLOBAL(powerpc_sha_transform)
125 PPC_STLU r1,-INT_FRAME_SIZE(r1)
130 lwz RA(0),0(r3) /* A */
131 lwz RB(0),4(r3) /* B */
132 lwz RC(0),8(r3) /* C */
133 lwz RD(0),12(r3) /* D */
134 lwz RE(0),16(r3) /* E */
141 lis r15,0x5a82 /* K0-19 */
149 lis r15,0x6ed9 /* K20-39 */
153 lis r15,0x8f1b /* K40-59 */
157 lis r15,0xca62 /* K60-79 */
187 addi r1,r1,INT_FRAME_SIZE