1
2
3
4
5
6
7#include <asm/ppc_asm.h>
8#include <asm/asm-offsets.h>
9
10#ifdef __BIG_ENDIAN__
11#define LWZ(rt, d, ra) \
12 lwz rt,d(ra)
13#else
14#define LWZ(rt, d, ra) \
15 li rt,d; \
16 lwbrx rt,rt,ra
17#endif
18
19
20
21
22
23
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)
30
31
32#define W(t) (((t)%16)+16)
33
34#define LOADW(t) \
35 LWZ(W(t),(t)*4,r4)
36
37#define STEPD0_LOAD(t) \
38 andc r0,RD(t),RB(t); \
39 and r6,RB(t),RC(t); \
40 rotlwi RT(t),RA(t),5; \
41 or r6,r6,r0; \
42 add r0,RE(t),r15; \
43 add RT(t),RT(t),r6; \
44 add r14,r0,W(t); \
45 LWZ(W((t)+4),((t)+4)*4,r4); \
46 rotlwi RB(t),RB(t),30; \
47 add RT(t),RT(t),r14
48
49#define STEPD0_UPDATE(t) \
50 and r6,RB(t),RC(t); \
51 andc r0,RD(t),RB(t); \
52 rotlwi RT(t),RA(t),5; \
53 rotlwi RB(t),RB(t),30; \
54 or r6,r6,r0; \
55 add r0,RE(t),r15; \
56 xor r5,W((t)+4-3),W((t)+4-8); \
57 add RT(t),RT(t),r6; \
58 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
59 add r0,r0,W(t); \
60 xor W((t)+4),W((t)+4),r5; \
61 add RT(t),RT(t),r0; \
62 rotlwi W((t)+4),W((t)+4),1
63
64#define STEPD1(t) \
65 xor r6,RB(t),RC(t); \
66 rotlwi RT(t),RA(t),5; \
67 rotlwi RB(t),RB(t),30; \
68 xor r6,r6,RD(t); \
69 add r0,RE(t),r15; \
70 add RT(t),RT(t),r6; \
71 add r0,r0,W(t); \
72 add RT(t),RT(t),r0
73
74#define STEPD1_UPDATE(t) \
75 xor r6,RB(t),RC(t); \
76 rotlwi RT(t),RA(t),5; \
77 rotlwi RB(t),RB(t),30; \
78 xor r6,r6,RD(t); \
79 add r0,RE(t),r15; \
80 xor r5,W((t)+4-3),W((t)+4-8); \
81 add RT(t),RT(t),r6; \
82 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
83 add r0,r0,W(t); \
84 xor W((t)+4),W((t)+4),r5; \
85 add RT(t),RT(t),r0; \
86 rotlwi W((t)+4),W((t)+4),1
87
88#define STEPD2_UPDATE(t) \
89 and r6,RB(t),RC(t); \
90 and r0,RB(t),RD(t); \
91 rotlwi RT(t),RA(t),5; \
92 or r6,r6,r0; \
93 rotlwi RB(t),RB(t),30; \
94 and r0,RC(t),RD(t); \
95 xor r5,W((t)+4-3),W((t)+4-8); \
96 or r6,r6,r0; \
97 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
98 add r0,RE(t),r15; \
99 add RT(t),RT(t),r6; \
100 add r0,r0,W(t); \
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
104
105#define STEP0LD4(t) \
106 STEPD0_LOAD(t); \
107 STEPD0_LOAD((t)+1); \
108 STEPD0_LOAD((t)+2); \
109 STEPD0_LOAD((t)+3)
110
111#define STEPUP4(t, fn) \
112 STEP
113 STEP
114 STEP
115 STEP
116
117#define STEPUP20(t, fn) \
118 STEPUP4(t, fn); \
119 STEPUP4((t)+4, fn); \
120 STEPUP4((t)+8, fn); \
121 STEPUP4((t)+12, fn); \
122 STEPUP4((t)+16, fn)
123
124_GLOBAL(powerpc_sha_transform)
125 PPC_STLU r1,-INT_FRAME_SIZE(r1)
126 SAVE_8GPRS(14, r1)
127 SAVE_10GPRS(22, r1)
128
129
130 lwz RA(0),0(r3)
131 lwz RB(0),4(r3)
132 lwz RC(0),8(r3)
133 lwz RD(0),12(r3)
134 lwz RE(0),16(r3)
135
136 LOADW(0)
137 LOADW(1)
138 LOADW(2)
139 LOADW(3)
140
141 lis r15,0x5a82
142 ori r15,r15,0x7999
143 STEP0LD4(0)
144 STEP0LD4(4)
145 STEP0LD4(8)
146 STEPUP4(12, D0)
147 STEPUP4(16, D0)
148
149 lis r15,0x6ed9
150 ori r15,r15,0xeba1
151 STEPUP20(20, D1)
152
153 lis r15,0x8f1b
154 ori r15,r15,0xbcdc
155 STEPUP20(40, D2)
156
157 lis r15,0xca62
158 ori r15,r15,0xc1d6
159 STEPUP4(60, D1)
160 STEPUP4(64, D1)
161 STEPUP4(68, D1)
162 STEPUP4(72, D1)
163 lwz r20,16(r3)
164 STEPD1(76)
165 lwz r19,12(r3)
166 STEPD1(77)
167 lwz r18,8(r3)
168 STEPD1(78)
169 lwz r17,4(r3)
170 STEPD1(79)
171
172 lwz r16,0(r3)
173 add r20,RE(80),r20
174 add RD(0),RD(80),r19
175 add RC(0),RC(80),r18
176 add RB(0),RB(80),r17
177 add RA(0),RA(80),r16
178 mr RE(0),r20
179 stw RA(0),0(r3)
180 stw RB(0),4(r3)
181 stw RC(0),8(r3)
182 stw RD(0),12(r3)
183 stw RE(0),16(r3)
184
185 REST_8GPRS(14, r1)
186 REST_10GPRS(22, r1)
187 addi r1,r1,INT_FRAME_SIZE
188 blr
189