sparc64: Move AES driver over to a methods based implementation.
[linux-block.git] / arch / sparc / crypto / aes_asm.S
CommitLineData
9bf4852d
DM
1#include <linux/linkage.h>
2#include <asm/visasm.h>
3
4#define F3F(x,y,z) (((x)<<30)|((y)<<19)|((z)<<5))
5
6#define FPD_ENCODE(x) (((x) >> 5) | ((x) & ~(0x20)))
7
8#define RS1(x) (FPD_ENCODE(x) << 14)
9#define RS2(x) (FPD_ENCODE(x) << 0)
10#define RS3(x) (FPD_ENCODE(x) << 9)
11#define RD(x) (FPD_ENCODE(x) << 25)
12#define IMM5(x) ((x) << 9)
13
14#define AES_EROUND01(a,b,c,d) \
15 .word (F3F(2, 0x19, 0)|RS1(a)|RS2(b)|RS3(c)|RD(d));
16#define AES_EROUND23(a,b,c,d) \
17 .word (F3F(2, 0x19, 1)|RS1(a)|RS2(b)|RS3(c)|RD(d));
18#define AES_DROUND01(a,b,c,d) \
19 .word (F3F(2, 0x19, 2)|RS1(a)|RS2(b)|RS3(c)|RD(d));
20#define AES_DROUND23(a,b,c,d) \
21 .word (F3F(2, 0x19, 3)|RS1(a)|RS2(b)|RS3(c)|RD(d));
22#define AES_EROUND01_L(a,b,c,d) \
23 .word (F3F(2, 0x19, 4)|RS1(a)|RS2(b)|RS3(c)|RD(d));
24#define AES_EROUND23_L(a,b,c,d) \
25 .word (F3F(2, 0x19, 5)|RS1(a)|RS2(b)|RS3(c)|RD(d));
26#define AES_DROUND01_L(a,b,c,d) \
27 .word (F3F(2, 0x19, 6)|RS1(a)|RS2(b)|RS3(c)|RD(d));
28#define AES_DROUND23_L(a,b,c,d) \
29 .word (F3F(2, 0x19, 7)|RS1(a)|RS2(b)|RS3(c)|RD(d));
30#define AES_KEXPAND1(a,b,c,d) \
31 .word (F3F(2, 0x19, 8)|RS1(a)|RS2(b)|IMM5(c)|RD(d));
32#define AES_KEXPAND0(a,b,c) \
33 .word (F3F(2, 0x36, 0x130)|RS1(a)|RS2(b)|RD(c));
34#define AES_KEXPAND2(a,b,c) \
35 .word (F3F(2, 0x36, 0x131)|RS1(a)|RS2(b)|RD(c));
36
37#define MOVXTOD_G3_F4 \
38 .word 0x89b02303;
39#define MOVXTOD_G7_F6 \
40 .word 0x8db02307;
41#define MOVXTOD_G3_F0 \
42 .word 0x81b02303;
43#define MOVXTOD_G7_F2 \
44 .word 0x85b02307;
45#define MOVXTOD_O0_F0 \
46 .word 0x81b02308;
0bdcaf74
DM
47#define MOVXTOD_O5_F2 \
48 .word 0x85b0230d;
9bf4852d
DM
49
50#define ENCRYPT_TWO_ROUNDS(KEY_BASE, I0, I1, T0, T1) \
51 AES_EROUND01(KEY_BASE + 0, I0, I1, T0) \
52 AES_EROUND23(KEY_BASE + 2, I0, I1, T1) \
53 AES_EROUND01(KEY_BASE + 4, T0, T1, I0) \
54 AES_EROUND23(KEY_BASE + 6, T0, T1, I1)
55
56#define ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE, I0, I1, T0, T1) \
57 AES_EROUND01(KEY_BASE + 0, I0, I1, T0) \
58 AES_EROUND23(KEY_BASE + 2, I0, I1, T1) \
59 AES_EROUND01_L(KEY_BASE + 4, T0, T1, I0) \
60 AES_EROUND23_L(KEY_BASE + 6, T0, T1, I1)
61
62 /* 10 rounds */
63#define ENCRYPT_128(KEY_BASE, I0, I1, T0, T1) \
64 ENCRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
65 ENCRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
66 ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
67 ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
68 ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 32, I0, I1, T0, T1)
69
70 /* 12 rounds */
71#define ENCRYPT_192(KEY_BASE, I0, I1, T0, T1) \
72 ENCRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
73 ENCRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
74 ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
75 ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
76 ENCRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
77 ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 40, I0, I1, T0, T1)
78
79 /* 14 rounds */
80#define ENCRYPT_256(KEY_BASE, I0, I1, T0, T1) \
81 ENCRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
82 ENCRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
83 ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
84 ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
85 ENCRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
86 ENCRYPT_TWO_ROUNDS(KEY_BASE + 40, I0, I1, T0, T1) \
87 ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 48, I0, I1, T0, T1)
88
0bdcaf74
DM
89#define DECRYPT_TWO_ROUNDS(KEY_BASE, I0, I1, T0, T1) \
90 AES_DROUND23(KEY_BASE + 0, I0, I1, T1) \
91 AES_DROUND01(KEY_BASE + 2, I0, I1, T0) \
92 AES_DROUND23(KEY_BASE + 4, T0, T1, I1) \
93 AES_DROUND01(KEY_BASE + 6, T0, T1, I0)
9bf4852d 94
0bdcaf74
DM
95#define DECRYPT_TWO_ROUNDS_LAST(KEY_BASE, I0, I1, T0, T1) \
96 AES_DROUND23(KEY_BASE + 0, I0, I1, T1) \
97 AES_DROUND01(KEY_BASE + 2, I0, I1, T0) \
98 AES_DROUND23_L(KEY_BASE + 4, T0, T1, I1) \
99 AES_DROUND01_L(KEY_BASE + 6, T0, T1, I0)
9bf4852d
DM
100
101 /* 10 rounds */
0bdcaf74
DM
102#define DECRYPT_128(KEY_BASE, I0, I1, T0, T1) \
103 DECRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
104 DECRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
105 DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
106 DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
107 DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 32, I0, I1, T0, T1)
9bf4852d
DM
108
109 /* 12 rounds */
0bdcaf74
DM
110#define DECRYPT_192(KEY_BASE, I0, I1, T0, T1) \
111 DECRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
112 DECRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
113 DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
114 DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
115 DECRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
116 DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 40, I0, I1, T0, T1)
9bf4852d
DM
117
118 /* 14 rounds */
0bdcaf74
DM
119#define DECRYPT_256(KEY_BASE, I0, I1, T0, T1) \
120 DECRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
121 DECRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
122 DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
123 DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
124 DECRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
125 DECRYPT_TWO_ROUNDS(KEY_BASE + 40, I0, I1, T0, T1) \
126 DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 48, I0, I1, T0, T1)
127
128 .align 32
9bf4852d
DM
129ENTRY(aes_sparc64_key_expand)
130 /* %o0=input_key, %o1=output_key, %o2=key_len */
131 VISEntry
132 ld [%o0 + 0x00], %f0
133 ld [%o0 + 0x04], %f1
134 ld [%o0 + 0x08], %f2
135 ld [%o0 + 0x0c], %f3
136
137 std %f0, [%o1 + 0x00]
138 std %f2, [%o1 + 0x08]
139 add %o1, 0x10, %o1
140
141 cmp %o2, 24
142 bl 2f
143 nop
144
145 be 1f
146 nop
147
148 /* 256-bit key expansion */
149 ld [%o0 + 0x10], %f4
150 ld [%o0 + 0x14], %f5
151 ld [%o0 + 0x18], %f6
152 ld [%o0 + 0x1c], %f7
153
154 std %f4, [%o1 + 0x00]
155 std %f6, [%o1 + 0x08]
156 add %o1, 0x10, %o1
157
158 AES_KEXPAND1(0, 6, 0x0, 8)
159 AES_KEXPAND2(2, 8, 10)
160 AES_KEXPAND0(4, 10, 12)
161 AES_KEXPAND2(6, 12, 14)
162 AES_KEXPAND1(8, 14, 0x1, 16)
163 AES_KEXPAND2(10, 16, 18)
164 AES_KEXPAND0(12, 18, 20)
165 AES_KEXPAND2(14, 20, 22)
166 AES_KEXPAND1(16, 22, 0x2, 24)
167 AES_KEXPAND2(18, 24, 26)
168 AES_KEXPAND0(20, 26, 28)
169 AES_KEXPAND2(22, 28, 30)
170 AES_KEXPAND1(24, 30, 0x3, 32)
171 AES_KEXPAND2(26, 32, 34)
172 AES_KEXPAND0(28, 34, 36)
173 AES_KEXPAND2(30, 36, 38)
174 AES_KEXPAND1(32, 38, 0x4, 40)
175 AES_KEXPAND2(34, 40, 42)
176 AES_KEXPAND0(36, 42, 44)
177 AES_KEXPAND2(38, 44, 46)
178 AES_KEXPAND1(40, 46, 0x5, 48)
179 AES_KEXPAND2(42, 48, 50)
180 AES_KEXPAND0(44, 50, 52)
181 AES_KEXPAND2(46, 52, 54)
182 AES_KEXPAND1(48, 54, 0x6, 56)
183 AES_KEXPAND2(50, 56, 58)
184
185 std %f8, [%o1 + 0x00]
186 std %f10, [%o1 + 0x08]
187 std %f12, [%o1 + 0x10]
188 std %f14, [%o1 + 0x18]
189 std %f16, [%o1 + 0x20]
190 std %f18, [%o1 + 0x28]
191 std %f20, [%o1 + 0x30]
192 std %f22, [%o1 + 0x38]
193 std %f24, [%o1 + 0x40]
194 std %f26, [%o1 + 0x48]
195 std %f28, [%o1 + 0x50]
196 std %f30, [%o1 + 0x58]
197 std %f32, [%o1 + 0x60]
198 std %f34, [%o1 + 0x68]
199 std %f36, [%o1 + 0x70]
200 std %f38, [%o1 + 0x78]
201 std %f40, [%o1 + 0x80]
202 std %f42, [%o1 + 0x88]
203 std %f44, [%o1 + 0x90]
204 std %f46, [%o1 + 0x98]
205 std %f48, [%o1 + 0xa0]
206 std %f50, [%o1 + 0xa8]
207 std %f52, [%o1 + 0xb0]
208 std %f54, [%o1 + 0xb8]
209 std %f56, [%o1 + 0xc0]
210 ba,pt %xcc, 80f
211 std %f58, [%o1 + 0xc8]
212
2131:
214 /* 192-bit key expansion */
215 ld [%o0 + 0x10], %f4
216 ld [%o0 + 0x14], %f5
217
218 std %f4, [%o1 + 0x00]
219 add %o1, 0x08, %o1
220
221 AES_KEXPAND1(0, 4, 0x0, 6)
222 AES_KEXPAND2(2, 6, 8)
223 AES_KEXPAND2(4, 8, 10)
224 AES_KEXPAND1(6, 10, 0x1, 12)
225 AES_KEXPAND2(8, 12, 14)
226 AES_KEXPAND2(10, 14, 16)
227 AES_KEXPAND1(12, 16, 0x2, 18)
228 AES_KEXPAND2(14, 18, 20)
229 AES_KEXPAND2(16, 20, 22)
230 AES_KEXPAND1(18, 22, 0x3, 24)
231 AES_KEXPAND2(20, 24, 26)
232 AES_KEXPAND2(22, 26, 28)
233 AES_KEXPAND1(24, 28, 0x4, 30)
234 AES_KEXPAND2(26, 30, 32)
235 AES_KEXPAND2(28, 32, 34)
236 AES_KEXPAND1(30, 34, 0x5, 36)
237 AES_KEXPAND2(32, 36, 38)
238 AES_KEXPAND2(34, 38, 40)
239 AES_KEXPAND1(36, 40, 0x6, 42)
240 AES_KEXPAND2(38, 42, 44)
241 AES_KEXPAND2(40, 44, 46)
242 AES_KEXPAND1(42, 46, 0x7, 48)
243 AES_KEXPAND2(44, 48, 50)
244
245 std %f6, [%o1 + 0x00]
246 std %f8, [%o1 + 0x08]
247 std %f10, [%o1 + 0x10]
248 std %f12, [%o1 + 0x18]
249 std %f14, [%o1 + 0x20]
250 std %f16, [%o1 + 0x28]
251 std %f18, [%o1 + 0x30]
252 std %f20, [%o1 + 0x38]
253 std %f22, [%o1 + 0x40]
254 std %f24, [%o1 + 0x48]
255 std %f26, [%o1 + 0x50]
256 std %f28, [%o1 + 0x58]
257 std %f30, [%o1 + 0x60]
258 std %f32, [%o1 + 0x68]
259 std %f34, [%o1 + 0x70]
260 std %f36, [%o1 + 0x78]
261 std %f38, [%o1 + 0x80]
262 std %f40, [%o1 + 0x88]
263 std %f42, [%o1 + 0x90]
264 std %f44, [%o1 + 0x98]
265 std %f46, [%o1 + 0xa0]
266 std %f48, [%o1 + 0xa8]
267 ba,pt %xcc, 80f
268 std %f50, [%o1 + 0xb0]
269
2702:
271 /* 128-bit key expansion */
272 AES_KEXPAND1(0, 2, 0x0, 4)
273 AES_KEXPAND2(2, 4, 6)
274 AES_KEXPAND1(4, 6, 0x1, 8)
275 AES_KEXPAND2(6, 8, 10)
276 AES_KEXPAND1(8, 10, 0x2, 12)
277 AES_KEXPAND2(10, 12, 14)
278 AES_KEXPAND1(12, 14, 0x3, 16)
279 AES_KEXPAND2(14, 16, 18)
280 AES_KEXPAND1(16, 18, 0x4, 20)
281 AES_KEXPAND2(18, 20, 22)
282 AES_KEXPAND1(20, 22, 0x5, 24)
283 AES_KEXPAND2(22, 24, 26)
284 AES_KEXPAND1(24, 26, 0x6, 28)
285 AES_KEXPAND2(26, 28, 30)
286 AES_KEXPAND1(28, 30, 0x7, 32)
287 AES_KEXPAND2(30, 32, 34)
288 AES_KEXPAND1(32, 34, 0x8, 36)
289 AES_KEXPAND2(34, 36, 38)
290 AES_KEXPAND1(36, 38, 0x9, 40)
291 AES_KEXPAND2(38, 40, 42)
292
293 std %f4, [%o1 + 0x00]
294 std %f6, [%o1 + 0x08]
295 std %f8, [%o1 + 0x10]
296 std %f10, [%o1 + 0x18]
297 std %f12, [%o1 + 0x20]
298 std %f14, [%o1 + 0x28]
299 std %f16, [%o1 + 0x30]
300 std %f18, [%o1 + 0x38]
301 std %f20, [%o1 + 0x40]
302 std %f22, [%o1 + 0x48]
303 std %f24, [%o1 + 0x50]
304 std %f26, [%o1 + 0x58]
305 std %f28, [%o1 + 0x60]
306 std %f30, [%o1 + 0x68]
307 std %f32, [%o1 + 0x70]
308 std %f34, [%o1 + 0x78]
309 std %f36, [%o1 + 0x80]
310 std %f38, [%o1 + 0x88]
311 std %f40, [%o1 + 0x90]
312 std %f42, [%o1 + 0x98]
31380:
314 retl
315 VISExit
316ENDPROC(aes_sparc64_key_expand)
317
0bdcaf74
DM
318 .align 32
319ENTRY(aes_sparc64_encrypt_128)
320 /* %o0=key, %o1=input, %o2=output */
9bf4852d
DM
321 VISEntry
322 ld [%o1 + 0x00], %f4
323 ld [%o1 + 0x04], %f5
324 ld [%o1 + 0x08], %f6
325 ld [%o1 + 0x0c], %f7
9bf4852d
DM
326 ldd [%o0 + 0x00], %f8
327 ldd [%o0 + 0x08], %f10
0bdcaf74
DM
328 ldd [%o0 + 0x10], %f12
329 ldd [%o0 + 0x18], %f14
330 ldd [%o0 + 0x20], %f16
331 ldd [%o0 + 0x28], %f18
332 ldd [%o0 + 0x30], %f20
333 ldd [%o0 + 0x38], %f22
334 ldd [%o0 + 0x40], %f24
335 ldd [%o0 + 0x48], %f26
336 ldd [%o0 + 0x50], %f28
337 ldd [%o0 + 0x58], %f30
338 ldd [%o0 + 0x60], %f32
339 ldd [%o0 + 0x68], %f34
340 ldd [%o0 + 0x70], %f36
341 ldd [%o0 + 0x78], %f38
342 ldd [%o0 + 0x80], %f40
343 ldd [%o0 + 0x88], %f42
344 ldd [%o0 + 0x90], %f44
345 ldd [%o0 + 0x98], %f46
346 ldd [%o0 + 0xa0], %f48
347 ldd [%o0 + 0xa8], %f50
9bf4852d 348 fxor %f8, %f4, %f4
0bdcaf74
DM
349 fxor %f10, %f6, %f6
350 ENCRYPT_128(12, 4, 6, 0, 2)
351 st %f4, [%o2 + 0x00]
352 st %f5, [%o2 + 0x04]
353 st %f6, [%o2 + 0x08]
354 st %f7, [%o2 + 0x0c]
355 retl
356 VISExit
357ENDPROC(aes_sparc64_encrypt_128)
9bf4852d 358
0bdcaf74
DM
359 .align 32
360ENTRY(aes_sparc64_encrypt_192)
361 /* %o0=key, %o1=input, %o2=output */
362 VISEntry
363 ld [%o1 + 0x00], %f4
364 ld [%o1 + 0x04], %f5
365 ld [%o1 + 0x08], %f6
366 ld [%o1 + 0x0c], %f7
9bf4852d 367
0bdcaf74
DM
368 ldd [%o0 + 0x00], %f8
369 ldd [%o0 + 0x08], %f10
9bf4852d 370
0bdcaf74
DM
371 fxor %f8, %f4, %f4
372 fxor %f10, %f6, %f6
9bf4852d
DM
373
374 ldd [%o0 + 0x10], %f8
9bf4852d
DM
375 ldd [%o0 + 0x18], %f10
376 ldd [%o0 + 0x20], %f12
377 ldd [%o0 + 0x28], %f14
378 add %o0, 0x20, %o0
379
380 ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
381
9bf4852d
DM
382 ldd [%o0 + 0x10], %f12
383 ldd [%o0 + 0x18], %f14
384 ldd [%o0 + 0x20], %f16
385 ldd [%o0 + 0x28], %f18
386 ldd [%o0 + 0x30], %f20
387 ldd [%o0 + 0x38], %f22
388 ldd [%o0 + 0x40], %f24
389 ldd [%o0 + 0x48], %f26
390 ldd [%o0 + 0x50], %f28
391 ldd [%o0 + 0x58], %f30
392 ldd [%o0 + 0x60], %f32
393 ldd [%o0 + 0x68], %f34
394 ldd [%o0 + 0x70], %f36
395 ldd [%o0 + 0x78], %f38
396 ldd [%o0 + 0x80], %f40
397 ldd [%o0 + 0x88], %f42
398 ldd [%o0 + 0x90], %f44
399 ldd [%o0 + 0x98], %f46
400 ldd [%o0 + 0xa0], %f48
401 ldd [%o0 + 0xa8], %f50
402
403
404 ENCRYPT_128(12, 4, 6, 0, 2)
405
406 st %f4, [%o2 + 0x00]
407 st %f5, [%o2 + 0x04]
408 st %f6, [%o2 + 0x08]
409 st %f7, [%o2 + 0x0c]
410
411 retl
412 VISExit
0bdcaf74 413ENDPROC(aes_sparc64_encrypt_192)
9bf4852d 414
0bdcaf74
DM
415 .align 32
416ENTRY(aes_sparc64_encrypt_256)
417 /* %o0=key, %o1=input, %o2=output */
9bf4852d
DM
418 VISEntry
419 ld [%o1 + 0x00], %f4
9bf4852d
DM
420 ld [%o1 + 0x04], %f5
421 ld [%o1 + 0x08], %f6
422 ld [%o1 + 0x0c], %f7
9bf4852d 423
0bdcaf74
DM
424 ldd [%o0 + 0x00], %f8
425 ldd [%o0 + 0x08], %f10
9bf4852d 426
0bdcaf74
DM
427 fxor %f8, %f4, %f4
428 fxor %f10, %f6, %f6
9bf4852d 429
0bdcaf74 430 ldd [%o0 + 0x10], %f8
9bf4852d 431
0bdcaf74
DM
432 ldd [%o0 + 0x18], %f10
433 ldd [%o0 + 0x20], %f12
434 ldd [%o0 + 0x28], %f14
435 add %o0, 0x20, %o0
9bf4852d 436
0bdcaf74 437 ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
9bf4852d 438
0bdcaf74
DM
439 ldd [%o0 + 0x10], %f8
440
441 ldd [%o0 + 0x18], %f10
442 ldd [%o0 + 0x20], %f12
443 ldd [%o0 + 0x28], %f14
444 add %o0, 0x20, %o0
445
446 ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
447
448 ldd [%o0 + 0x10], %f12
449 ldd [%o0 + 0x18], %f14
450 ldd [%o0 + 0x20], %f16
451 ldd [%o0 + 0x28], %f18
452 ldd [%o0 + 0x30], %f20
453 ldd [%o0 + 0x38], %f22
454 ldd [%o0 + 0x40], %f24
455 ldd [%o0 + 0x48], %f26
456 ldd [%o0 + 0x50], %f28
457 ldd [%o0 + 0x58], %f30
458 ldd [%o0 + 0x60], %f32
459 ldd [%o0 + 0x68], %f34
460 ldd [%o0 + 0x70], %f36
461 ldd [%o0 + 0x78], %f38
462 ldd [%o0 + 0x80], %f40
463 ldd [%o0 + 0x88], %f42
464 ldd [%o0 + 0x90], %f44
465 ldd [%o0 + 0x98], %f46
466 ldd [%o0 + 0xa0], %f48
467 ldd [%o0 + 0xa8], %f50
468
469 ENCRYPT_128(12, 4, 6, 0, 2)
9bf4852d
DM
470
471 st %f4, [%o2 + 0x00]
472 st %f5, [%o2 + 0x04]
473 st %f6, [%o2 + 0x08]
474 st %f7, [%o2 + 0x0c]
475
476 retl
477 VISExit
0bdcaf74 478ENDPROC(aes_sparc64_encrypt_256)
9bf4852d 479
0bdcaf74
DM
480 .align 32
481ENTRY(aes_sparc64_decrypt_128)
482 /* %o0=key, %o1=input, %o2=output */
483 VISEntry
484 ld [%o1 + 0x00], %f4
485 ld [%o1 + 0x04], %f5
486 ld [%o1 + 0x08], %f6
487 ld [%o1 + 0x0c], %f7
488 ldd [%o0 + 0xa0], %f8
489 ldd [%o0 + 0xa8], %f10
490 ldd [%o0 + 0x98], %f12
491 ldd [%o0 + 0x90], %f14
492 ldd [%o0 + 0x88], %f16
493 ldd [%o0 + 0x80], %f18
494 ldd [%o0 + 0x78], %f20
495 ldd [%o0 + 0x70], %f22
496 ldd [%o0 + 0x68], %f24
497 ldd [%o0 + 0x60], %f26
498 ldd [%o0 + 0x58], %f28
499 ldd [%o0 + 0x50], %f30
500 ldd [%o0 + 0x48], %f32
501 ldd [%o0 + 0x40], %f34
502 ldd [%o0 + 0x38], %f36
503 ldd [%o0 + 0x30], %f38
504 ldd [%o0 + 0x28], %f40
505 ldd [%o0 + 0x20], %f42
506 ldd [%o0 + 0x18], %f44
507 ldd [%o0 + 0x10], %f46
508 ldd [%o0 + 0x08], %f48
509 ldd [%o0 + 0x00], %f50
510 fxor %f8, %f4, %f4
511 fxor %f10, %f6, %f6
512 DECRYPT_128(12, 4, 6, 0, 2)
513 st %f4, [%o2 + 0x00]
514 st %f5, [%o2 + 0x04]
515 st %f6, [%o2 + 0x08]
516 st %f7, [%o2 + 0x0c]
517 retl
518 VISExit
519ENDPROC(aes_sparc64_decrypt_128)
520
521 .align 32
522ENTRY(aes_sparc64_decrypt_192)
523 /* %o0=key, %o1=input, %o2=output */
524 VISEntry
525 ld [%o1 + 0x00], %f4
526 ld [%o1 + 0x04], %f5
527 ld [%o1 + 0x08], %f6
528 ld [%o1 + 0x0c], %f7
529 ldd [%o0 + 0xc0], %f8
530 ldd [%o0 + 0xc8], %f10
531 ldd [%o0 + 0xb8], %f12
532 ldd [%o0 + 0xb0], %f14
533 ldd [%o0 + 0xa8], %f16
534 ldd [%o0 + 0xa0], %f18
535 fxor %f8, %f4, %f4
536 fxor %f10, %f6, %f6
537 ldd [%o0 + 0x98], %f20
538 ldd [%o0 + 0x90], %f22
539 ldd [%o0 + 0x88], %f24
540 ldd [%o0 + 0x80], %f26
541 DECRYPT_TWO_ROUNDS(12, 4, 6, 0, 2)
542 ldd [%o0 + 0x78], %f28
543 ldd [%o0 + 0x70], %f30
544 ldd [%o0 + 0x68], %f32
545 ldd [%o0 + 0x60], %f34
546 ldd [%o0 + 0x58], %f36
547 ldd [%o0 + 0x50], %f38
548 ldd [%o0 + 0x48], %f40
549 ldd [%o0 + 0x40], %f42
550 ldd [%o0 + 0x38], %f44
551 ldd [%o0 + 0x30], %f46
552 ldd [%o0 + 0x28], %f48
553 ldd [%o0 + 0x20], %f50
554 ldd [%o0 + 0x18], %f52
555 ldd [%o0 + 0x10], %f54
556 ldd [%o0 + 0x08], %f56
557 ldd [%o0 + 0x00], %f58
558 DECRYPT_128(20, 4, 6, 0, 2)
559 st %f4, [%o2 + 0x00]
560 st %f5, [%o2 + 0x04]
561 st %f6, [%o2 + 0x08]
562 st %f7, [%o2 + 0x0c]
563 retl
564 VISExit
565ENDPROC(aes_sparc64_decrypt_192)
566
567 .align 32
568ENTRY(aes_sparc64_decrypt_256)
569 /* %o0=key, %o1=input, %o2=output */
570 VISEntry
571 ld [%o1 + 0x00], %f4
572 ld [%o1 + 0x04], %f5
573 ld [%o1 + 0x08], %f6
574 ld [%o1 + 0x0c], %f7
575 ldd [%o0 + 0xe0], %f8
576 ldd [%o0 + 0xe8], %f10
577 ldd [%o0 + 0xd8], %f12
578 ldd [%o0 + 0xd0], %f14
579 ldd [%o0 + 0xc8], %f16
580 fxor %f8, %f4, %f4
581 ldd [%o0 + 0xc0], %f18
582 fxor %f10, %f6, %f6
583 ldd [%o0 + 0xb8], %f20
584 AES_DROUND23(12, 4, 6, 2)
585 ldd [%o0 + 0xb0], %f22
586 AES_DROUND01(14, 4, 6, 0)
587 ldd [%o0 + 0xa8], %f24
588 AES_DROUND23(16, 0, 2, 6)
589 ldd [%o0 + 0xa0], %f26
590 AES_DROUND01(18, 0, 2, 4)
591 ldd [%o0 + 0x98], %f12
592 AES_DROUND23(20, 4, 6, 2)
593 ldd [%o0 + 0x90], %f14
594 AES_DROUND01(22, 4, 6, 0)
595 ldd [%o0 + 0x88], %f16
596 AES_DROUND23(24, 0, 2, 6)
597 ldd [%o0 + 0x80], %f18
598 AES_DROUND01(26, 0, 2, 4)
599 ldd [%o0 + 0x78], %f20
600 AES_DROUND23(12, 4, 6, 2)
601 ldd [%o0 + 0x70], %f22
602 AES_DROUND01(14, 4, 6, 0)
603 ldd [%o0 + 0x68], %f24
604 AES_DROUND23(16, 0, 2, 6)
605 ldd [%o0 + 0x60], %f26
606 AES_DROUND01(18, 0, 2, 4)
607 ldd [%o0 + 0x58], %f28
608 AES_DROUND23(20, 4, 6, 2)
609 ldd [%o0 + 0x50], %f30
610 AES_DROUND01(22, 4, 6, 0)
611 ldd [%o0 + 0x48], %f32
612 AES_DROUND23(24, 0, 2, 6)
613 ldd [%o0 + 0x40], %f34
614 AES_DROUND01(26, 0, 2, 4)
615 ldd [%o0 + 0x38], %f36
616 AES_DROUND23(28, 4, 6, 2)
617 ldd [%o0 + 0x30], %f38
618 AES_DROUND01(30, 4, 6, 0)
619 ldd [%o0 + 0x28], %f40
620 AES_DROUND23(32, 0, 2, 6)
621 ldd [%o0 + 0x20], %f42
622 AES_DROUND01(34, 0, 2, 4)
623 ldd [%o0 + 0x18], %f44
624 AES_DROUND23(36, 4, 6, 2)
625 ldd [%o0 + 0x10], %f46
626 AES_DROUND01(38, 4, 6, 0)
627 ldd [%o0 + 0x08], %f48
628 AES_DROUND23(40, 0, 2, 6)
629 ldd [%o0 + 0x00], %f50
630 AES_DROUND01(42, 0, 2, 4)
631 AES_DROUND23(44, 4, 6, 2)
632 AES_DROUND01(46, 4, 6, 0)
633 AES_DROUND23_L(48, 0, 2, 6)
634 AES_DROUND01_L(50, 0, 2, 4)
635 st %f4, [%o2 + 0x00]
636 st %f5, [%o2 + 0x04]
637 st %f6, [%o2 + 0x08]
638 st %f7, [%o2 + 0x0c]
639 retl
640 VISExit
641ENDPROC(aes_sparc64_decrypt_256)
642
643 .align 32
644ENTRY(aes_sparc64_load_encrypt_keys_128)
9bf4852d 645 /* %o0=key */
0bdcaf74
DM
646 VISEntry
647 ldd [%o0 + 0x10], %f8
648 ldd [%o0 + 0x18], %f10
649 ldd [%o0 + 0x20], %f12
650 ldd [%o0 + 0x28], %f14
651 ldd [%o0 + 0x30], %f16
652 ldd [%o0 + 0x38], %f18
653 ldd [%o0 + 0x40], %f20
654 ldd [%o0 + 0x48], %f22
655 ldd [%o0 + 0x50], %f24
656 ldd [%o0 + 0x58], %f26
657 ldd [%o0 + 0x60], %f28
658 ldd [%o0 + 0x68], %f30
659 ldd [%o0 + 0x70], %f32
660 ldd [%o0 + 0x78], %f34
661 ldd [%o0 + 0x80], %f36
662 ldd [%o0 + 0x88], %f38
663 ldd [%o0 + 0x90], %f40
664 ldd [%o0 + 0x98], %f42
665 ldd [%o0 + 0xa0], %f44
666 retl
667 ldd [%o0 + 0xa8], %f46
668ENDPROC(aes_sparc64_load_encrypt_keys_128)
9bf4852d 669
0bdcaf74
DM
670 .align 32
671ENTRY(aes_sparc64_load_encrypt_keys_192)
672 /* %o0=key */
673 VISEntry
674 ldd [%o0 + 0x10], %f8
675 ldd [%o0 + 0x18], %f10
676 ldd [%o0 + 0x20], %f12
677 ldd [%o0 + 0x28], %f14
678 ldd [%o0 + 0x30], %f16
679 ldd [%o0 + 0x38], %f18
680 ldd [%o0 + 0x40], %f20
681 ldd [%o0 + 0x48], %f22
682 ldd [%o0 + 0x50], %f24
683 ldd [%o0 + 0x58], %f26
684 ldd [%o0 + 0x60], %f28
685 ldd [%o0 + 0x68], %f30
686 ldd [%o0 + 0x70], %f32
687 ldd [%o0 + 0x78], %f34
688 ldd [%o0 + 0x80], %f36
689 ldd [%o0 + 0x88], %f38
690 ldd [%o0 + 0x90], %f40
691 ldd [%o0 + 0x98], %f42
692 ldd [%o0 + 0xa0], %f44
693 ldd [%o0 + 0xa8], %f46
694 ldd [%o0 + 0xb0], %f48
695 ldd [%o0 + 0xb8], %f50
696 ldd [%o0 + 0xc0], %f52
697 retl
698 ldd [%o0 + 0xc8], %f54
699ENDPROC(aes_sparc64_load_encrypt_keys_192)
700
701 .align 32
702ENTRY(aes_sparc64_load_encrypt_keys_256)
9bf4852d
DM
703 /* %o0=key */
704 VISEntry
705 ldd [%o0 + 0x10], %f8
706 ldd [%o0 + 0x18], %f10
707 ldd [%o0 + 0x20], %f12
708 ldd [%o0 + 0x28], %f14
709 ldd [%o0 + 0x30], %f16
710 ldd [%o0 + 0x38], %f18
711 ldd [%o0 + 0x40], %f20
712 ldd [%o0 + 0x48], %f22
713 ldd [%o0 + 0x50], %f24
714 ldd [%o0 + 0x58], %f26
715 ldd [%o0 + 0x60], %f28
716 ldd [%o0 + 0x68], %f30
717 ldd [%o0 + 0x70], %f32
718 ldd [%o0 + 0x78], %f34
719 ldd [%o0 + 0x80], %f36
720 ldd [%o0 + 0x88], %f38
721 ldd [%o0 + 0x90], %f40
722 ldd [%o0 + 0x98], %f42
723 ldd [%o0 + 0xa0], %f44
724 ldd [%o0 + 0xa8], %f46
725 ldd [%o0 + 0xb0], %f48
726 ldd [%o0 + 0xb8], %f50
727 ldd [%o0 + 0xc0], %f52
728 ldd [%o0 + 0xc8], %f54
729 ldd [%o0 + 0xd0], %f56
730 ldd [%o0 + 0xd8], %f58
731 ldd [%o0 + 0xe0], %f60
732 retl
733 ldd [%o0 + 0xe8], %f62
0bdcaf74
DM
734ENDPROC(aes_sparc64_load_encrypt_keys_256)
735
736 .align 32
737ENTRY(aes_sparc64_load_decrypt_keys_128)
738 /* %o0=key */
739 VISEntry
740 ldd [%o0 + 0x98], %f8
741 ldd [%o0 + 0x90], %f10
742 ldd [%o0 + 0x88], %f12
743 ldd [%o0 + 0x80], %f14
744 ldd [%o0 + 0x78], %f16
745 ldd [%o0 + 0x70], %f18
746 ldd [%o0 + 0x68], %f20
747 ldd [%o0 + 0x60], %f22
748 ldd [%o0 + 0x58], %f24
749 ldd [%o0 + 0x50], %f26
750 ldd [%o0 + 0x48], %f28
751 ldd [%o0 + 0x40], %f30
752 ldd [%o0 + 0x38], %f32
753 ldd [%o0 + 0x30], %f34
754 ldd [%o0 + 0x28], %f36
755 ldd [%o0 + 0x20], %f38
756 ldd [%o0 + 0x18], %f40
757 ldd [%o0 + 0x10], %f42
758 ldd [%o0 + 0x08], %f44
759 retl
760 ldd [%o0 + 0x00], %f46
761ENDPROC(aes_sparc64_load_decrypt_keys_128)
9bf4852d 762
0bdcaf74
DM
763 .align 32
764ENTRY(aes_sparc64_load_decrypt_keys_192)
765 /* %o0=key */
766 VISEntry
767 ldd [%o0 + 0xb8], %f8
768 ldd [%o0 + 0xb0], %f10
769 ldd [%o0 + 0xa8], %f12
770 ldd [%o0 + 0xa0], %f14
771 ldd [%o0 + 0x98], %f16
772 ldd [%o0 + 0x90], %f18
773 ldd [%o0 + 0x88], %f20
774 ldd [%o0 + 0x80], %f22
775 ldd [%o0 + 0x78], %f24
776 ldd [%o0 + 0x70], %f26
777 ldd [%o0 + 0x68], %f28
778 ldd [%o0 + 0x60], %f30
779 ldd [%o0 + 0x58], %f32
780 ldd [%o0 + 0x50], %f34
781 ldd [%o0 + 0x48], %f36
782 ldd [%o0 + 0x40], %f38
783 ldd [%o0 + 0x38], %f40
784 ldd [%o0 + 0x30], %f42
785 ldd [%o0 + 0x28], %f44
786 ldd [%o0 + 0x20], %f46
787 ldd [%o0 + 0x18], %f48
788 ldd [%o0 + 0x10], %f50
789 ldd [%o0 + 0x08], %f52
790 retl
791 ldd [%o0 + 0x00], %f54
792ENDPROC(aes_sparc64_load_decrypt_keys_192)
793
794 .align 32
795ENTRY(aes_sparc64_load_decrypt_keys_256)
796 /* %o0=key */
797 VISEntry
798 ldd [%o0 + 0xd8], %f8
799 ldd [%o0 + 0xd0], %f10
800 ldd [%o0 + 0xc8], %f12
801 ldd [%o0 + 0xc0], %f14
802 ldd [%o0 + 0xb8], %f16
803 ldd [%o0 + 0xb0], %f18
804 ldd [%o0 + 0xa8], %f20
805 ldd [%o0 + 0xa0], %f22
806 ldd [%o0 + 0x98], %f24
807 ldd [%o0 + 0x90], %f26
808 ldd [%o0 + 0x88], %f28
809 ldd [%o0 + 0x80], %f30
810 ldd [%o0 + 0x78], %f32
811 ldd [%o0 + 0x70], %f34
812 ldd [%o0 + 0x68], %f36
813 ldd [%o0 + 0x60], %f38
814 ldd [%o0 + 0x58], %f40
815 ldd [%o0 + 0x50], %f42
816 ldd [%o0 + 0x48], %f44
817 ldd [%o0 + 0x40], %f46
818 ldd [%o0 + 0x38], %f48
819 ldd [%o0 + 0x30], %f50
820 ldd [%o0 + 0x28], %f52
821 ldd [%o0 + 0x20], %f54
822 ldd [%o0 + 0x18], %f56
823 ldd [%o0 + 0x10], %f58
824 ldd [%o0 + 0x08], %f60
825 retl
826 ldd [%o0 + 0x00], %f62
827ENDPROC(aes_sparc64_load_decrypt_keys_256)
828
829 .align 32
830ENTRY(aes_sparc64_ecb_encrypt_128)
831 /* %o0=key, %o1=input, %o2=output, %o3=len */
9bf4852d
DM
832 ldx [%o0 + 0x00], %g1
833 ldx [%o0 + 0x08], %g2
0bdcaf74 8341: ldx [%o1 + 0x00], %g3
9bf4852d
DM
835 ldx [%o1 + 0x08], %g7
836 add %o1, 0x10, %o1
837 xor %g1, %g3, %g3
838 xor %g2, %g7, %g7
839 MOVXTOD_G3_F4
840 MOVXTOD_G7_F6
0bdcaf74 841 ENCRYPT_128(8, 4, 6, 0, 2)
9bf4852d
DM
842 std %f4, [%o2 + 0x00]
843 std %f6, [%o2 + 0x08]
0bdcaf74
DM
844 subcc %o3, 0x10, %o3
845 bne,pt %xcc, 1b
9bf4852d 846 add %o2, 0x10, %o2
9bf4852d
DM
847 retl
848 nop
0bdcaf74 849ENDPROC(aes_sparc64_ecb_encrypt_128)
9bf4852d 850
0bdcaf74
DM
851 .align 32
852ENTRY(aes_sparc64_ecb_encrypt_192)
853 /* %o0=key, %o1=input, %o2=output, %o3=len */
854 ldx [%o0 + 0x00], %g1
855 ldx [%o0 + 0x08], %g2
8561: ldx [%o1 + 0x00], %g3
9bf4852d
DM
857 ldx [%o1 + 0x08], %g7
858 add %o1, 0x10, %o1
859 xor %g1, %g3, %g3
860 xor %g2, %g7, %g7
861 MOVXTOD_G3_F4
862 MOVXTOD_G7_F6
9bf4852d 863 ENCRYPT_192(8, 4, 6, 0, 2)
9bf4852d
DM
864 std %f4, [%o2 + 0x00]
865 std %f6, [%o2 + 0x08]
0bdcaf74 866 subcc %o3, 0x10, %o3
9bf4852d
DM
867 bne,pt %xcc, 1b
868 add %o2, 0x10, %o2
9bf4852d
DM
869 retl
870 nop
0bdcaf74 871ENDPROC(aes_sparc64_ecb_encrypt_192)
9bf4852d 872
0bdcaf74
DM
873 .align 32
874ENTRY(aes_sparc64_ecb_encrypt_256)
875 /* %o0=key, %o1=input, %o2=output, %o3=len */
876 ldx [%o0 + 0x00], %g1
877 ldx [%o0 + 0x08], %g2
8781: ldx [%o1 + 0x00], %g3
9bf4852d
DM
879 ldx [%o1 + 0x08], %g7
880 add %o1, 0x10, %o1
881 xor %g1, %g3, %g3
882 xor %g2, %g7, %g7
883 MOVXTOD_G3_F4
884 MOVXTOD_G7_F6
0bdcaf74 885 ENCRYPT_256(8, 4, 6, 0, 2)
9bf4852d
DM
886 std %f4, [%o2 + 0x00]
887 std %f6, [%o2 + 0x08]
0bdcaf74
DM
888 subcc %o3, 0x10, %o3
889 bne,pt %xcc, 1b
9bf4852d 890 add %o2, 0x10, %o2
9bf4852d
DM
891 retl
892 nop
0bdcaf74 893ENDPROC(aes_sparc64_ecb_encrypt_256)
9bf4852d 894
0bdcaf74
DM
895 .align 32
896ENTRY(aes_sparc64_ecb_decrypt_128)
897 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
9bf4852d
DM
898 ldx [%o0 - 0x10], %g1
899 ldx [%o0 - 0x08], %g2
0bdcaf74 9001: ldx [%o1 + 0x00], %g3
9bf4852d
DM
901 ldx [%o1 + 0x08], %g7
902 add %o1, 0x10, %o1
903 xor %g1, %g3, %g3
904 xor %g2, %g7, %g7
905 MOVXTOD_G3_F4
906 MOVXTOD_G7_F6
0bdcaf74 907 DECRYPT_128(8, 4, 6, 0, 2)
9bf4852d
DM
908 std %f4, [%o2 + 0x00]
909 std %f6, [%o2 + 0x08]
0bdcaf74
DM
910 subcc %o3, 0x10, %o3
911 bne,pt %xcc, 1b
9bf4852d 912 add %o2, 0x10, %o2
9bf4852d
DM
913 retl
914 nop
0bdcaf74 915ENDPROC(aes_sparc64_ecb_decrypt_128)
9bf4852d 916
0bdcaf74
DM
917 .align 32
918ENTRY(aes_sparc64_ecb_decrypt_192)
919 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
920 ldx [%o0 - 0x10], %g1
921 ldx [%o0 - 0x08], %g2
9221: ldx [%o1 + 0x00], %g3
9bf4852d
DM
923 ldx [%o1 + 0x08], %g7
924 add %o1, 0x10, %o1
925 xor %g1, %g3, %g3
926 xor %g2, %g7, %g7
927 MOVXTOD_G3_F4
928 MOVXTOD_G7_F6
0bdcaf74 929 DECRYPT_192(8, 4, 6, 0, 2)
9bf4852d
DM
930 std %f4, [%o2 + 0x00]
931 std %f6, [%o2 + 0x08]
0bdcaf74 932 subcc %o3, 0x10, %o3
9bf4852d
DM
933 bne,pt %xcc, 1b
934 add %o2, 0x10, %o2
9bf4852d
DM
935 retl
936 nop
0bdcaf74 937ENDPROC(aes_sparc64_ecb_decrypt_192)
9bf4852d 938
0bdcaf74
DM
939 .align 32
940ENTRY(aes_sparc64_ecb_decrypt_256)
941 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
942 ldx [%o0 - 0x10], %g1
943 ldx [%o0 - 0x08], %g2
9441: ldx [%o1 + 0x00], %g3
9bf4852d
DM
945 ldx [%o1 + 0x08], %g7
946 add %o1, 0x10, %o1
947 xor %g1, %g3, %g3
948 xor %g2, %g7, %g7
949 MOVXTOD_G3_F4
950 MOVXTOD_G7_F6
0bdcaf74 951 DECRYPT_256(8, 4, 6, 0, 2)
9bf4852d
DM
952 std %f4, [%o2 + 0x00]
953 std %f6, [%o2 + 0x08]
0bdcaf74
DM
954 subcc %o3, 0x10, %o3
955 bne,pt %xcc, 1b
9bf4852d 956 add %o2, 0x10, %o2
9bf4852d
DM
957 retl
958 nop
0bdcaf74 959ENDPROC(aes_sparc64_ecb_decrypt_256)
9bf4852d 960
0bdcaf74
DM
961 .align 32
962ENTRY(aes_sparc64_cbc_encrypt_128)
963 /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
964 ldd [%o4 + 0x00], %f4
965 ldd [%o4 + 0x08], %f6
9bf4852d
DM
966 ldx [%o0 + 0x00], %g1
967 ldx [%o0 + 0x08], %g2
0bdcaf74 9681: ldx [%o1 + 0x00], %g3
9bf4852d
DM
969 ldx [%o1 + 0x08], %g7
970 add %o1, 0x10, %o1
971 xor %g1, %g3, %g3
972 xor %g2, %g7, %g7
973 MOVXTOD_G3_F0
974 MOVXTOD_G7_F2
975 fxor %f4, %f0, %f4
976 fxor %f6, %f2, %f6
0bdcaf74 977 ENCRYPT_128(8, 4, 6, 0, 2)
9bf4852d
DM
978 std %f4, [%o2 + 0x00]
979 std %f6, [%o2 + 0x08]
0bdcaf74
DM
980 subcc %o3, 0x10, %o3
981 bne,pt %xcc, 1b
9bf4852d 982 add %o2, 0x10, %o2
0bdcaf74
DM
983 std %f4, [%o4 + 0x00]
984 std %f6, [%o4 + 0x08]
9bf4852d
DM
985 retl
986 nop
0bdcaf74 987ENDPROC(aes_sparc64_cbc_encrypt_128)
9bf4852d 988
0bdcaf74
DM
989 .align 32
990ENTRY(aes_sparc64_cbc_encrypt_192)
991 /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
992 ldd [%o4 + 0x00], %f4
993 ldd [%o4 + 0x08], %f6
994 ldx [%o0 + 0x00], %g1
995 ldx [%o0 + 0x08], %g2
9961: ldx [%o1 + 0x00], %g3
9bf4852d
DM
997 ldx [%o1 + 0x08], %g7
998 add %o1, 0x10, %o1
999 xor %g1, %g3, %g3
1000 xor %g2, %g7, %g7
1001 MOVXTOD_G3_F0
1002 MOVXTOD_G7_F2
1003 fxor %f4, %f0, %f4
1004 fxor %f6, %f2, %f6
9bf4852d 1005 ENCRYPT_192(8, 4, 6, 0, 2)
9bf4852d
DM
1006 std %f4, [%o2 + 0x00]
1007 std %f6, [%o2 + 0x08]
0bdcaf74 1008 subcc %o3, 0x10, %o3
9bf4852d
DM
1009 bne,pt %xcc, 1b
1010 add %o2, 0x10, %o2
0bdcaf74
DM
1011 std %f4, [%o4 + 0x00]
1012 std %f6, [%o4 + 0x08]
9bf4852d
DM
1013 retl
1014 nop
0bdcaf74 1015ENDPROC(aes_sparc64_cbc_encrypt_192)
9bf4852d 1016
0bdcaf74
DM
1017 .align 32
1018ENTRY(aes_sparc64_cbc_encrypt_256)
1019 /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1020 ldd [%o4 + 0x00], %f4
1021 ldd [%o4 + 0x08], %f6
1022 ldx [%o0 + 0x00], %g1
1023 ldx [%o0 + 0x08], %g2
10241: ldx [%o1 + 0x00], %g3
9bf4852d
DM
1025 ldx [%o1 + 0x08], %g7
1026 add %o1, 0x10, %o1
1027 xor %g1, %g3, %g3
1028 xor %g2, %g7, %g7
1029 MOVXTOD_G3_F0
1030 MOVXTOD_G7_F2
1031 fxor %f4, %f0, %f4
1032 fxor %f6, %f2, %f6
0bdcaf74 1033 ENCRYPT_256(8, 4, 6, 0, 2)
9bf4852d
DM
1034 std %f4, [%o2 + 0x00]
1035 std %f6, [%o2 + 0x08]
0bdcaf74
DM
1036 subcc %o3, 0x10, %o3
1037 bne,pt %xcc, 1b
9bf4852d 1038 add %o2, 0x10, %o2
0bdcaf74
DM
1039 std %f4, [%o4 + 0x00]
1040 std %f6, [%o4 + 0x08]
9bf4852d
DM
1041 retl
1042 nop
0bdcaf74 1043ENDPROC(aes_sparc64_cbc_encrypt_256)
9bf4852d 1044
0bdcaf74
DM
1045 .align 32
1046ENTRY(aes_sparc64_cbc_decrypt_128)
1047 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
9bf4852d
DM
1048 ldx [%o0 - 0x10], %g1
1049 ldx [%o0 - 0x08], %g2
0bdcaf74
DM
1050 ldx [%o4 + 0x00], %o0
1051 ldx [%o4 + 0x08], %o5
10521: ldx [%o1 + 0x00], %g3
1053 ldx [%o1 + 0x08], %g7
1054 add %o1, 0x10, %o1
9bf4852d
DM
1055 xor %g1, %g3, %g3
1056 xor %g2, %g7, %g7
1057 MOVXTOD_G3_F4
1058 MOVXTOD_G7_F6
0bdcaf74 1059 DECRYPT_128(8, 4, 6, 0, 2)
9bf4852d 1060 MOVXTOD_O0_F0
0bdcaf74 1061 MOVXTOD_O5_F2
9bf4852d 1062 xor %g1, %g3, %o0
0bdcaf74 1063 xor %g2, %g7, %o5
9bf4852d
DM
1064 fxor %f4, %f0, %f4
1065 fxor %f6, %f2, %f6
0bdcaf74
DM
1066 std %f4, [%o2 + 0x00]
1067 std %f6, [%o2 + 0x08]
1068 subcc %o3, 0x10, %o3
1069 bne,pt %xcc, 1b
1070 add %o2, 0x10, %o2
1071 stx %o0, [%o4 + 0x00]
1072 stx %o5, [%o4 + 0x08]
9bf4852d
DM
1073 retl
1074 nop
0bdcaf74 1075ENDPROC(aes_sparc64_cbc_decrypt_128)
9bf4852d 1076
0bdcaf74
DM
1077 .align 32
1078ENTRY(aes_sparc64_cbc_decrypt_192)
1079 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1080 ldx [%o0 - 0x10], %g1
1081 ldx [%o0 - 0x08], %g2
1082 ldx [%o4 + 0x00], %o0
1083 ldx [%o4 + 0x08], %o5
10841: ldx [%o1 + 0x00], %g3
1085 ldx [%o1 + 0x08], %g7
1086 add %o1, 0x10, %o1
9bf4852d
DM
1087 xor %g1, %g3, %g3
1088 xor %g2, %g7, %g7
1089 MOVXTOD_G3_F4
1090 MOVXTOD_G7_F6
0bdcaf74 1091 DECRYPT_192(8, 4, 6, 0, 2)
9bf4852d 1092 MOVXTOD_O0_F0
0bdcaf74 1093 MOVXTOD_O5_F2
9bf4852d 1094 xor %g1, %g3, %o0
0bdcaf74 1095 xor %g2, %g7, %o5
9bf4852d
DM
1096 fxor %f4, %f0, %f4
1097 fxor %f6, %f2, %f6
0bdcaf74
DM
1098 std %f4, [%o2 + 0x00]
1099 std %f6, [%o2 + 0x08]
1100 subcc %o3, 0x10, %o3
9bf4852d 1101 bne,pt %xcc, 1b
0bdcaf74
DM
1102 add %o2, 0x10, %o2
1103 stx %o0, [%o4 + 0x00]
1104 stx %o5, [%o4 + 0x08]
9bf4852d
DM
1105 retl
1106 nop
0bdcaf74 1107ENDPROC(aes_sparc64_cbc_decrypt_192)
9bf4852d 1108
0bdcaf74
DM
1109 .align 32
1110ENTRY(aes_sparc64_cbc_decrypt_256)
1111 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1112 ldx [%o0 - 0x10], %g1
1113 ldx [%o0 - 0x08], %g2
1114 ldx [%o4 + 0x00], %o0
1115 ldx [%o4 + 0x08], %o5
11161: ldx [%o1 + 0x00], %g3
1117 ldx [%o1 + 0x08], %g7
1118 add %o1, 0x10, %o1
9bf4852d
DM
1119 xor %g1, %g3, %g3
1120 xor %g2, %g7, %g7
1121 MOVXTOD_G3_F4
1122 MOVXTOD_G7_F6
0bdcaf74 1123 DECRYPT_256(8, 4, 6, 0, 2)
9bf4852d 1124 MOVXTOD_O0_F0
0bdcaf74 1125 MOVXTOD_O5_F2
9bf4852d 1126 xor %g1, %g3, %o0
0bdcaf74 1127 xor %g2, %g7, %o5
9bf4852d
DM
1128 fxor %f4, %f0, %f4
1129 fxor %f6, %f2, %f6
0bdcaf74
DM
1130 std %f4, [%o2 + 0x00]
1131 std %f6, [%o2 + 0x08]
1132 subcc %o3, 0x10, %o3
1133 bne,pt %xcc, 1b
1134 add %o2, 0x10, %o2
1135 stx %o0, [%o4 + 0x00]
1136 stx %o5, [%o4 + 0x08]
9bf4852d
DM
1137 retl
1138 nop
0bdcaf74 1139ENDPROC(aes_sparc64_cbc_decrypt_256)