1 #include <linux/linkage.h>
2 #include <asm/visasm.h>
4 #define F3F(x,y,z) (((x)<<30)|((y)<<19)|((z)<<5))
6 #define FPD_ENCODE(x) (((x) >> 5) | ((x) & ~(0x20)))
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)
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));
37 #define MOVXTOD_G3_F4 \
39 #define MOVXTOD_G7_F6 \
41 #define MOVXTOD_G3_F0 \
43 #define MOVXTOD_G7_F2 \
45 #define MOVXTOD_O0_F0 \
47 #define MOVXTOD_O5_F0 \
49 #define MOVXTOD_O5_F2 \
52 #define ENCRYPT_TWO_ROUNDS(KEY_BASE, I0, I1, T0, T1) \
53 AES_EROUND01(KEY_BASE + 0, I0, I1, T0) \
54 AES_EROUND23(KEY_BASE + 2, I0, I1, T1) \
55 AES_EROUND01(KEY_BASE + 4, T0, T1, I0) \
56 AES_EROUND23(KEY_BASE + 6, T0, T1, I1)
58 #define ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE, I0, I1, T0, T1) \
59 AES_EROUND01(KEY_BASE + 0, I0, I1, T0) \
60 AES_EROUND23(KEY_BASE + 2, I0, I1, T1) \
61 AES_EROUND01_L(KEY_BASE + 4, T0, T1, I0) \
62 AES_EROUND23_L(KEY_BASE + 6, T0, T1, I1)
65 #define ENCRYPT_128(KEY_BASE, I0, I1, T0, T1) \
66 ENCRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
67 ENCRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
68 ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
69 ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
70 ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 32, I0, I1, T0, T1)
73 #define ENCRYPT_192(KEY_BASE, I0, I1, T0, T1) \
74 ENCRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
75 ENCRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
76 ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
77 ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
78 ENCRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
79 ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 40, I0, I1, T0, T1)
82 #define ENCRYPT_256(KEY_BASE, I0, I1, T0, T1) \
83 ENCRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
84 ENCRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
85 ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
86 ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
87 ENCRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
88 ENCRYPT_TWO_ROUNDS(KEY_BASE + 40, I0, I1, T0, T1) \
89 ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 48, I0, I1, T0, T1)
91 #define DECRYPT_TWO_ROUNDS(KEY_BASE, I0, I1, T0, T1) \
92 AES_DROUND23(KEY_BASE + 0, I0, I1, T1) \
93 AES_DROUND01(KEY_BASE + 2, I0, I1, T0) \
94 AES_DROUND23(KEY_BASE + 4, T0, T1, I1) \
95 AES_DROUND01(KEY_BASE + 6, T0, T1, I0)
97 #define DECRYPT_TWO_ROUNDS_LAST(KEY_BASE, I0, I1, T0, T1) \
98 AES_DROUND23(KEY_BASE + 0, I0, I1, T1) \
99 AES_DROUND01(KEY_BASE + 2, I0, I1, T0) \
100 AES_DROUND23_L(KEY_BASE + 4, T0, T1, I1) \
101 AES_DROUND01_L(KEY_BASE + 6, T0, T1, I0)
104 #define DECRYPT_128(KEY_BASE, I0, I1, T0, T1) \
105 DECRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
106 DECRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
107 DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
108 DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
109 DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 32, I0, I1, T0, T1)
112 #define DECRYPT_192(KEY_BASE, I0, I1, T0, T1) \
113 DECRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
114 DECRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
115 DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
116 DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
117 DECRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
118 DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 40, I0, I1, T0, T1)
121 #define DECRYPT_256(KEY_BASE, I0, I1, T0, T1) \
122 DECRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
123 DECRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
124 DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
125 DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
126 DECRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
127 DECRYPT_TWO_ROUNDS(KEY_BASE + 40, I0, I1, T0, T1) \
128 DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 48, I0, I1, T0, T1)
131 ENTRY(aes_sparc64_key_expand)
132 /* %o0=input_key, %o1=output_key, %o2=key_len */
139 std %f0, [%o1 + 0x00]
140 std %f2, [%o1 + 0x08]
150 /* 256-bit key expansion */
156 std %f4, [%o1 + 0x00]
157 std %f6, [%o1 + 0x08]
160 AES_KEXPAND1(0, 6, 0x0, 8)
161 AES_KEXPAND2(2, 8, 10)
162 AES_KEXPAND0(4, 10, 12)
163 AES_KEXPAND2(6, 12, 14)
164 AES_KEXPAND1(8, 14, 0x1, 16)
165 AES_KEXPAND2(10, 16, 18)
166 AES_KEXPAND0(12, 18, 20)
167 AES_KEXPAND2(14, 20, 22)
168 AES_KEXPAND1(16, 22, 0x2, 24)
169 AES_KEXPAND2(18, 24, 26)
170 AES_KEXPAND0(20, 26, 28)
171 AES_KEXPAND2(22, 28, 30)
172 AES_KEXPAND1(24, 30, 0x3, 32)
173 AES_KEXPAND2(26, 32, 34)
174 AES_KEXPAND0(28, 34, 36)
175 AES_KEXPAND2(30, 36, 38)
176 AES_KEXPAND1(32, 38, 0x4, 40)
177 AES_KEXPAND2(34, 40, 42)
178 AES_KEXPAND0(36, 42, 44)
179 AES_KEXPAND2(38, 44, 46)
180 AES_KEXPAND1(40, 46, 0x5, 48)
181 AES_KEXPAND2(42, 48, 50)
182 AES_KEXPAND0(44, 50, 52)
183 AES_KEXPAND2(46, 52, 54)
184 AES_KEXPAND1(48, 54, 0x6, 56)
185 AES_KEXPAND2(50, 56, 58)
187 std %f8, [%o1 + 0x00]
188 std %f10, [%o1 + 0x08]
189 std %f12, [%o1 + 0x10]
190 std %f14, [%o1 + 0x18]
191 std %f16, [%o1 + 0x20]
192 std %f18, [%o1 + 0x28]
193 std %f20, [%o1 + 0x30]
194 std %f22, [%o1 + 0x38]
195 std %f24, [%o1 + 0x40]
196 std %f26, [%o1 + 0x48]
197 std %f28, [%o1 + 0x50]
198 std %f30, [%o1 + 0x58]
199 std %f32, [%o1 + 0x60]
200 std %f34, [%o1 + 0x68]
201 std %f36, [%o1 + 0x70]
202 std %f38, [%o1 + 0x78]
203 std %f40, [%o1 + 0x80]
204 std %f42, [%o1 + 0x88]
205 std %f44, [%o1 + 0x90]
206 std %f46, [%o1 + 0x98]
207 std %f48, [%o1 + 0xa0]
208 std %f50, [%o1 + 0xa8]
209 std %f52, [%o1 + 0xb0]
210 std %f54, [%o1 + 0xb8]
211 std %f56, [%o1 + 0xc0]
213 std %f58, [%o1 + 0xc8]
216 /* 192-bit key expansion */
220 std %f4, [%o1 + 0x00]
223 AES_KEXPAND1(0, 4, 0x0, 6)
224 AES_KEXPAND2(2, 6, 8)
225 AES_KEXPAND2(4, 8, 10)
226 AES_KEXPAND1(6, 10, 0x1, 12)
227 AES_KEXPAND2(8, 12, 14)
228 AES_KEXPAND2(10, 14, 16)
229 AES_KEXPAND1(12, 16, 0x2, 18)
230 AES_KEXPAND2(14, 18, 20)
231 AES_KEXPAND2(16, 20, 22)
232 AES_KEXPAND1(18, 22, 0x3, 24)
233 AES_KEXPAND2(20, 24, 26)
234 AES_KEXPAND2(22, 26, 28)
235 AES_KEXPAND1(24, 28, 0x4, 30)
236 AES_KEXPAND2(26, 30, 32)
237 AES_KEXPAND2(28, 32, 34)
238 AES_KEXPAND1(30, 34, 0x5, 36)
239 AES_KEXPAND2(32, 36, 38)
240 AES_KEXPAND2(34, 38, 40)
241 AES_KEXPAND1(36, 40, 0x6, 42)
242 AES_KEXPAND2(38, 42, 44)
243 AES_KEXPAND2(40, 44, 46)
244 AES_KEXPAND1(42, 46, 0x7, 48)
245 AES_KEXPAND2(44, 48, 50)
247 std %f6, [%o1 + 0x00]
248 std %f8, [%o1 + 0x08]
249 std %f10, [%o1 + 0x10]
250 std %f12, [%o1 + 0x18]
251 std %f14, [%o1 + 0x20]
252 std %f16, [%o1 + 0x28]
253 std %f18, [%o1 + 0x30]
254 std %f20, [%o1 + 0x38]
255 std %f22, [%o1 + 0x40]
256 std %f24, [%o1 + 0x48]
257 std %f26, [%o1 + 0x50]
258 std %f28, [%o1 + 0x58]
259 std %f30, [%o1 + 0x60]
260 std %f32, [%o1 + 0x68]
261 std %f34, [%o1 + 0x70]
262 std %f36, [%o1 + 0x78]
263 std %f38, [%o1 + 0x80]
264 std %f40, [%o1 + 0x88]
265 std %f42, [%o1 + 0x90]
266 std %f44, [%o1 + 0x98]
267 std %f46, [%o1 + 0xa0]
268 std %f48, [%o1 + 0xa8]
270 std %f50, [%o1 + 0xb0]
273 /* 128-bit key expansion */
274 AES_KEXPAND1(0, 2, 0x0, 4)
275 AES_KEXPAND2(2, 4, 6)
276 AES_KEXPAND1(4, 6, 0x1, 8)
277 AES_KEXPAND2(6, 8, 10)
278 AES_KEXPAND1(8, 10, 0x2, 12)
279 AES_KEXPAND2(10, 12, 14)
280 AES_KEXPAND1(12, 14, 0x3, 16)
281 AES_KEXPAND2(14, 16, 18)
282 AES_KEXPAND1(16, 18, 0x4, 20)
283 AES_KEXPAND2(18, 20, 22)
284 AES_KEXPAND1(20, 22, 0x5, 24)
285 AES_KEXPAND2(22, 24, 26)
286 AES_KEXPAND1(24, 26, 0x6, 28)
287 AES_KEXPAND2(26, 28, 30)
288 AES_KEXPAND1(28, 30, 0x7, 32)
289 AES_KEXPAND2(30, 32, 34)
290 AES_KEXPAND1(32, 34, 0x8, 36)
291 AES_KEXPAND2(34, 36, 38)
292 AES_KEXPAND1(36, 38, 0x9, 40)
293 AES_KEXPAND2(38, 40, 42)
295 std %f4, [%o1 + 0x00]
296 std %f6, [%o1 + 0x08]
297 std %f8, [%o1 + 0x10]
298 std %f10, [%o1 + 0x18]
299 std %f12, [%o1 + 0x20]
300 std %f14, [%o1 + 0x28]
301 std %f16, [%o1 + 0x30]
302 std %f18, [%o1 + 0x38]
303 std %f20, [%o1 + 0x40]
304 std %f22, [%o1 + 0x48]
305 std %f24, [%o1 + 0x50]
306 std %f26, [%o1 + 0x58]
307 std %f28, [%o1 + 0x60]
308 std %f30, [%o1 + 0x68]
309 std %f32, [%o1 + 0x70]
310 std %f34, [%o1 + 0x78]
311 std %f36, [%o1 + 0x80]
312 std %f38, [%o1 + 0x88]
313 std %f40, [%o1 + 0x90]
314 std %f42, [%o1 + 0x98]
318 ENDPROC(aes_sparc64_key_expand)
321 ENTRY(aes_sparc64_encrypt_128)
322 /* %o0=key, %o1=input, %o2=output */
328 ldd [%o0 + 0x00], %f8
329 ldd [%o0 + 0x08], %f10
330 ldd [%o0 + 0x10], %f12
331 ldd [%o0 + 0x18], %f14
332 ldd [%o0 + 0x20], %f16
333 ldd [%o0 + 0x28], %f18
334 ldd [%o0 + 0x30], %f20
335 ldd [%o0 + 0x38], %f22
336 ldd [%o0 + 0x40], %f24
337 ldd [%o0 + 0x48], %f26
338 ldd [%o0 + 0x50], %f28
339 ldd [%o0 + 0x58], %f30
340 ldd [%o0 + 0x60], %f32
341 ldd [%o0 + 0x68], %f34
342 ldd [%o0 + 0x70], %f36
343 ldd [%o0 + 0x78], %f38
344 ldd [%o0 + 0x80], %f40
345 ldd [%o0 + 0x88], %f42
346 ldd [%o0 + 0x90], %f44
347 ldd [%o0 + 0x98], %f46
348 ldd [%o0 + 0xa0], %f48
349 ldd [%o0 + 0xa8], %f50
352 ENCRYPT_128(12, 4, 6, 0, 2)
359 ENDPROC(aes_sparc64_encrypt_128)
362 ENTRY(aes_sparc64_encrypt_192)
363 /* %o0=key, %o1=input, %o2=output */
370 ldd [%o0 + 0x00], %f8
371 ldd [%o0 + 0x08], %f10
376 ldd [%o0 + 0x10], %f8
377 ldd [%o0 + 0x18], %f10
378 ldd [%o0 + 0x20], %f12
379 ldd [%o0 + 0x28], %f14
382 ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
384 ldd [%o0 + 0x10], %f12
385 ldd [%o0 + 0x18], %f14
386 ldd [%o0 + 0x20], %f16
387 ldd [%o0 + 0x28], %f18
388 ldd [%o0 + 0x30], %f20
389 ldd [%o0 + 0x38], %f22
390 ldd [%o0 + 0x40], %f24
391 ldd [%o0 + 0x48], %f26
392 ldd [%o0 + 0x50], %f28
393 ldd [%o0 + 0x58], %f30
394 ldd [%o0 + 0x60], %f32
395 ldd [%o0 + 0x68], %f34
396 ldd [%o0 + 0x70], %f36
397 ldd [%o0 + 0x78], %f38
398 ldd [%o0 + 0x80], %f40
399 ldd [%o0 + 0x88], %f42
400 ldd [%o0 + 0x90], %f44
401 ldd [%o0 + 0x98], %f46
402 ldd [%o0 + 0xa0], %f48
403 ldd [%o0 + 0xa8], %f50
406 ENCRYPT_128(12, 4, 6, 0, 2)
415 ENDPROC(aes_sparc64_encrypt_192)
418 ENTRY(aes_sparc64_encrypt_256)
419 /* %o0=key, %o1=input, %o2=output */
426 ldd [%o0 + 0x00], %f8
427 ldd [%o0 + 0x08], %f10
432 ldd [%o0 + 0x10], %f8
434 ldd [%o0 + 0x18], %f10
435 ldd [%o0 + 0x20], %f12
436 ldd [%o0 + 0x28], %f14
439 ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
441 ldd [%o0 + 0x10], %f8
443 ldd [%o0 + 0x18], %f10
444 ldd [%o0 + 0x20], %f12
445 ldd [%o0 + 0x28], %f14
448 ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
450 ldd [%o0 + 0x10], %f12
451 ldd [%o0 + 0x18], %f14
452 ldd [%o0 + 0x20], %f16
453 ldd [%o0 + 0x28], %f18
454 ldd [%o0 + 0x30], %f20
455 ldd [%o0 + 0x38], %f22
456 ldd [%o0 + 0x40], %f24
457 ldd [%o0 + 0x48], %f26
458 ldd [%o0 + 0x50], %f28
459 ldd [%o0 + 0x58], %f30
460 ldd [%o0 + 0x60], %f32
461 ldd [%o0 + 0x68], %f34
462 ldd [%o0 + 0x70], %f36
463 ldd [%o0 + 0x78], %f38
464 ldd [%o0 + 0x80], %f40
465 ldd [%o0 + 0x88], %f42
466 ldd [%o0 + 0x90], %f44
467 ldd [%o0 + 0x98], %f46
468 ldd [%o0 + 0xa0], %f48
469 ldd [%o0 + 0xa8], %f50
471 ENCRYPT_128(12, 4, 6, 0, 2)
480 ENDPROC(aes_sparc64_encrypt_256)
483 ENTRY(aes_sparc64_decrypt_128)
484 /* %o0=key, %o1=input, %o2=output */
490 ldd [%o0 + 0xa0], %f8
491 ldd [%o0 + 0xa8], %f10
492 ldd [%o0 + 0x98], %f12
493 ldd [%o0 + 0x90], %f14
494 ldd [%o0 + 0x88], %f16
495 ldd [%o0 + 0x80], %f18
496 ldd [%o0 + 0x78], %f20
497 ldd [%o0 + 0x70], %f22
498 ldd [%o0 + 0x68], %f24
499 ldd [%o0 + 0x60], %f26
500 ldd [%o0 + 0x58], %f28
501 ldd [%o0 + 0x50], %f30
502 ldd [%o0 + 0x48], %f32
503 ldd [%o0 + 0x40], %f34
504 ldd [%o0 + 0x38], %f36
505 ldd [%o0 + 0x30], %f38
506 ldd [%o0 + 0x28], %f40
507 ldd [%o0 + 0x20], %f42
508 ldd [%o0 + 0x18], %f44
509 ldd [%o0 + 0x10], %f46
510 ldd [%o0 + 0x08], %f48
511 ldd [%o0 + 0x00], %f50
514 DECRYPT_128(12, 4, 6, 0, 2)
521 ENDPROC(aes_sparc64_decrypt_128)
524 ENTRY(aes_sparc64_decrypt_192)
525 /* %o0=key, %o1=input, %o2=output */
531 ldd [%o0 + 0xc0], %f8
532 ldd [%o0 + 0xc8], %f10
533 ldd [%o0 + 0xb8], %f12
534 ldd [%o0 + 0xb0], %f14
535 ldd [%o0 + 0xa8], %f16
536 ldd [%o0 + 0xa0], %f18
539 ldd [%o0 + 0x98], %f20
540 ldd [%o0 + 0x90], %f22
541 ldd [%o0 + 0x88], %f24
542 ldd [%o0 + 0x80], %f26
543 DECRYPT_TWO_ROUNDS(12, 4, 6, 0, 2)
544 ldd [%o0 + 0x78], %f28
545 ldd [%o0 + 0x70], %f30
546 ldd [%o0 + 0x68], %f32
547 ldd [%o0 + 0x60], %f34
548 ldd [%o0 + 0x58], %f36
549 ldd [%o0 + 0x50], %f38
550 ldd [%o0 + 0x48], %f40
551 ldd [%o0 + 0x40], %f42
552 ldd [%o0 + 0x38], %f44
553 ldd [%o0 + 0x30], %f46
554 ldd [%o0 + 0x28], %f48
555 ldd [%o0 + 0x20], %f50
556 ldd [%o0 + 0x18], %f52
557 ldd [%o0 + 0x10], %f54
558 ldd [%o0 + 0x08], %f56
559 ldd [%o0 + 0x00], %f58
560 DECRYPT_128(20, 4, 6, 0, 2)
567 ENDPROC(aes_sparc64_decrypt_192)
570 ENTRY(aes_sparc64_decrypt_256)
571 /* %o0=key, %o1=input, %o2=output */
577 ldd [%o0 + 0xe0], %f8
578 ldd [%o0 + 0xe8], %f10
579 ldd [%o0 + 0xd8], %f12
580 ldd [%o0 + 0xd0], %f14
581 ldd [%o0 + 0xc8], %f16
583 ldd [%o0 + 0xc0], %f18
585 ldd [%o0 + 0xb8], %f20
586 AES_DROUND23(12, 4, 6, 2)
587 ldd [%o0 + 0xb0], %f22
588 AES_DROUND01(14, 4, 6, 0)
589 ldd [%o0 + 0xa8], %f24
590 AES_DROUND23(16, 0, 2, 6)
591 ldd [%o0 + 0xa0], %f26
592 AES_DROUND01(18, 0, 2, 4)
593 ldd [%o0 + 0x98], %f12
594 AES_DROUND23(20, 4, 6, 2)
595 ldd [%o0 + 0x90], %f14
596 AES_DROUND01(22, 4, 6, 0)
597 ldd [%o0 + 0x88], %f16
598 AES_DROUND23(24, 0, 2, 6)
599 ldd [%o0 + 0x80], %f18
600 AES_DROUND01(26, 0, 2, 4)
601 ldd [%o0 + 0x78], %f20
602 AES_DROUND23(12, 4, 6, 2)
603 ldd [%o0 + 0x70], %f22
604 AES_DROUND01(14, 4, 6, 0)
605 ldd [%o0 + 0x68], %f24
606 AES_DROUND23(16, 0, 2, 6)
607 ldd [%o0 + 0x60], %f26
608 AES_DROUND01(18, 0, 2, 4)
609 ldd [%o0 + 0x58], %f28
610 AES_DROUND23(20, 4, 6, 2)
611 ldd [%o0 + 0x50], %f30
612 AES_DROUND01(22, 4, 6, 0)
613 ldd [%o0 + 0x48], %f32
614 AES_DROUND23(24, 0, 2, 6)
615 ldd [%o0 + 0x40], %f34
616 AES_DROUND01(26, 0, 2, 4)
617 ldd [%o0 + 0x38], %f36
618 AES_DROUND23(28, 4, 6, 2)
619 ldd [%o0 + 0x30], %f38
620 AES_DROUND01(30, 4, 6, 0)
621 ldd [%o0 + 0x28], %f40
622 AES_DROUND23(32, 0, 2, 6)
623 ldd [%o0 + 0x20], %f42
624 AES_DROUND01(34, 0, 2, 4)
625 ldd [%o0 + 0x18], %f44
626 AES_DROUND23(36, 4, 6, 2)
627 ldd [%o0 + 0x10], %f46
628 AES_DROUND01(38, 4, 6, 0)
629 ldd [%o0 + 0x08], %f48
630 AES_DROUND23(40, 0, 2, 6)
631 ldd [%o0 + 0x00], %f50
632 AES_DROUND01(42, 0, 2, 4)
633 AES_DROUND23(44, 4, 6, 2)
634 AES_DROUND01(46, 4, 6, 0)
635 AES_DROUND23_L(48, 0, 2, 6)
636 AES_DROUND01_L(50, 0, 2, 4)
643 ENDPROC(aes_sparc64_decrypt_256)
646 ENTRY(aes_sparc64_load_encrypt_keys_128)
649 ldd [%o0 + 0x10], %f8
650 ldd [%o0 + 0x18], %f10
651 ldd [%o0 + 0x20], %f12
652 ldd [%o0 + 0x28], %f14
653 ldd [%o0 + 0x30], %f16
654 ldd [%o0 + 0x38], %f18
655 ldd [%o0 + 0x40], %f20
656 ldd [%o0 + 0x48], %f22
657 ldd [%o0 + 0x50], %f24
658 ldd [%o0 + 0x58], %f26
659 ldd [%o0 + 0x60], %f28
660 ldd [%o0 + 0x68], %f30
661 ldd [%o0 + 0x70], %f32
662 ldd [%o0 + 0x78], %f34
663 ldd [%o0 + 0x80], %f36
664 ldd [%o0 + 0x88], %f38
665 ldd [%o0 + 0x90], %f40
666 ldd [%o0 + 0x98], %f42
667 ldd [%o0 + 0xa0], %f44
669 ldd [%o0 + 0xa8], %f46
670 ENDPROC(aes_sparc64_load_encrypt_keys_128)
673 ENTRY(aes_sparc64_load_encrypt_keys_192)
676 ldd [%o0 + 0x10], %f8
677 ldd [%o0 + 0x18], %f10
678 ldd [%o0 + 0x20], %f12
679 ldd [%o0 + 0x28], %f14
680 ldd [%o0 + 0x30], %f16
681 ldd [%o0 + 0x38], %f18
682 ldd [%o0 + 0x40], %f20
683 ldd [%o0 + 0x48], %f22
684 ldd [%o0 + 0x50], %f24
685 ldd [%o0 + 0x58], %f26
686 ldd [%o0 + 0x60], %f28
687 ldd [%o0 + 0x68], %f30
688 ldd [%o0 + 0x70], %f32
689 ldd [%o0 + 0x78], %f34
690 ldd [%o0 + 0x80], %f36
691 ldd [%o0 + 0x88], %f38
692 ldd [%o0 + 0x90], %f40
693 ldd [%o0 + 0x98], %f42
694 ldd [%o0 + 0xa0], %f44
695 ldd [%o0 + 0xa8], %f46
696 ldd [%o0 + 0xb0], %f48
697 ldd [%o0 + 0xb8], %f50
698 ldd [%o0 + 0xc0], %f52
700 ldd [%o0 + 0xc8], %f54
701 ENDPROC(aes_sparc64_load_encrypt_keys_192)
704 ENTRY(aes_sparc64_load_encrypt_keys_256)
707 ldd [%o0 + 0x10], %f8
708 ldd [%o0 + 0x18], %f10
709 ldd [%o0 + 0x20], %f12
710 ldd [%o0 + 0x28], %f14
711 ldd [%o0 + 0x30], %f16
712 ldd [%o0 + 0x38], %f18
713 ldd [%o0 + 0x40], %f20
714 ldd [%o0 + 0x48], %f22
715 ldd [%o0 + 0x50], %f24
716 ldd [%o0 + 0x58], %f26
717 ldd [%o0 + 0x60], %f28
718 ldd [%o0 + 0x68], %f30
719 ldd [%o0 + 0x70], %f32
720 ldd [%o0 + 0x78], %f34
721 ldd [%o0 + 0x80], %f36
722 ldd [%o0 + 0x88], %f38
723 ldd [%o0 + 0x90], %f40
724 ldd [%o0 + 0x98], %f42
725 ldd [%o0 + 0xa0], %f44
726 ldd [%o0 + 0xa8], %f46
727 ldd [%o0 + 0xb0], %f48
728 ldd [%o0 + 0xb8], %f50
729 ldd [%o0 + 0xc0], %f52
730 ldd [%o0 + 0xc8], %f54
731 ldd [%o0 + 0xd0], %f56
732 ldd [%o0 + 0xd8], %f58
733 ldd [%o0 + 0xe0], %f60
735 ldd [%o0 + 0xe8], %f62
736 ENDPROC(aes_sparc64_load_encrypt_keys_256)
739 ENTRY(aes_sparc64_load_decrypt_keys_128)
742 ldd [%o0 + 0x98], %f8
743 ldd [%o0 + 0x90], %f10
744 ldd [%o0 + 0x88], %f12
745 ldd [%o0 + 0x80], %f14
746 ldd [%o0 + 0x78], %f16
747 ldd [%o0 + 0x70], %f18
748 ldd [%o0 + 0x68], %f20
749 ldd [%o0 + 0x60], %f22
750 ldd [%o0 + 0x58], %f24
751 ldd [%o0 + 0x50], %f26
752 ldd [%o0 + 0x48], %f28
753 ldd [%o0 + 0x40], %f30
754 ldd [%o0 + 0x38], %f32
755 ldd [%o0 + 0x30], %f34
756 ldd [%o0 + 0x28], %f36
757 ldd [%o0 + 0x20], %f38
758 ldd [%o0 + 0x18], %f40
759 ldd [%o0 + 0x10], %f42
760 ldd [%o0 + 0x08], %f44
762 ldd [%o0 + 0x00], %f46
763 ENDPROC(aes_sparc64_load_decrypt_keys_128)
766 ENTRY(aes_sparc64_load_decrypt_keys_192)
769 ldd [%o0 + 0xb8], %f8
770 ldd [%o0 + 0xb0], %f10
771 ldd [%o0 + 0xa8], %f12
772 ldd [%o0 + 0xa0], %f14
773 ldd [%o0 + 0x98], %f16
774 ldd [%o0 + 0x90], %f18
775 ldd [%o0 + 0x88], %f20
776 ldd [%o0 + 0x80], %f22
777 ldd [%o0 + 0x78], %f24
778 ldd [%o0 + 0x70], %f26
779 ldd [%o0 + 0x68], %f28
780 ldd [%o0 + 0x60], %f30
781 ldd [%o0 + 0x58], %f32
782 ldd [%o0 + 0x50], %f34
783 ldd [%o0 + 0x48], %f36
784 ldd [%o0 + 0x40], %f38
785 ldd [%o0 + 0x38], %f40
786 ldd [%o0 + 0x30], %f42
787 ldd [%o0 + 0x28], %f44
788 ldd [%o0 + 0x20], %f46
789 ldd [%o0 + 0x18], %f48
790 ldd [%o0 + 0x10], %f50
791 ldd [%o0 + 0x08], %f52
793 ldd [%o0 + 0x00], %f54
794 ENDPROC(aes_sparc64_load_decrypt_keys_192)
797 ENTRY(aes_sparc64_load_decrypt_keys_256)
800 ldd [%o0 + 0xd8], %f8
801 ldd [%o0 + 0xd0], %f10
802 ldd [%o0 + 0xc8], %f12
803 ldd [%o0 + 0xc0], %f14
804 ldd [%o0 + 0xb8], %f16
805 ldd [%o0 + 0xb0], %f18
806 ldd [%o0 + 0xa8], %f20
807 ldd [%o0 + 0xa0], %f22
808 ldd [%o0 + 0x98], %f24
809 ldd [%o0 + 0x90], %f26
810 ldd [%o0 + 0x88], %f28
811 ldd [%o0 + 0x80], %f30
812 ldd [%o0 + 0x78], %f32
813 ldd [%o0 + 0x70], %f34
814 ldd [%o0 + 0x68], %f36
815 ldd [%o0 + 0x60], %f38
816 ldd [%o0 + 0x58], %f40
817 ldd [%o0 + 0x50], %f42
818 ldd [%o0 + 0x48], %f44
819 ldd [%o0 + 0x40], %f46
820 ldd [%o0 + 0x38], %f48
821 ldd [%o0 + 0x30], %f50
822 ldd [%o0 + 0x28], %f52
823 ldd [%o0 + 0x20], %f54
824 ldd [%o0 + 0x18], %f56
825 ldd [%o0 + 0x10], %f58
826 ldd [%o0 + 0x08], %f60
828 ldd [%o0 + 0x00], %f62
829 ENDPROC(aes_sparc64_load_decrypt_keys_256)
832 ENTRY(aes_sparc64_ecb_encrypt_128)
833 /* %o0=key, %o1=input, %o2=output, %o3=len */
834 ldx [%o0 + 0x00], %g1
835 ldx [%o0 + 0x08], %g2
836 1: ldx [%o1 + 0x00], %g3
837 ldx [%o1 + 0x08], %g7
843 ENCRYPT_128(8, 4, 6, 0, 2)
844 std %f4, [%o2 + 0x00]
845 std %f6, [%o2 + 0x08]
851 ENDPROC(aes_sparc64_ecb_encrypt_128)
854 ENTRY(aes_sparc64_ecb_encrypt_192)
855 /* %o0=key, %o1=input, %o2=output, %o3=len */
856 ldx [%o0 + 0x00], %g1
857 ldx [%o0 + 0x08], %g2
858 1: ldx [%o1 + 0x00], %g3
859 ldx [%o1 + 0x08], %g7
865 ENCRYPT_192(8, 4, 6, 0, 2)
866 std %f4, [%o2 + 0x00]
867 std %f6, [%o2 + 0x08]
873 ENDPROC(aes_sparc64_ecb_encrypt_192)
876 ENTRY(aes_sparc64_ecb_encrypt_256)
877 /* %o0=key, %o1=input, %o2=output, %o3=len */
878 ldx [%o0 + 0x00], %g1
879 ldx [%o0 + 0x08], %g2
880 1: ldx [%o1 + 0x00], %g3
881 ldx [%o1 + 0x08], %g7
887 ENCRYPT_256(8, 4, 6, 0, 2)
888 std %f4, [%o2 + 0x00]
889 std %f6, [%o2 + 0x08]
895 ENDPROC(aes_sparc64_ecb_encrypt_256)
898 ENTRY(aes_sparc64_ecb_decrypt_128)
899 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
900 ldx [%o0 - 0x10], %g1
901 ldx [%o0 - 0x08], %g2
902 1: ldx [%o1 + 0x00], %g3
903 ldx [%o1 + 0x08], %g7
909 DECRYPT_128(8, 4, 6, 0, 2)
910 std %f4, [%o2 + 0x00]
911 std %f6, [%o2 + 0x08]
917 ENDPROC(aes_sparc64_ecb_decrypt_128)
920 ENTRY(aes_sparc64_ecb_decrypt_192)
921 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
922 ldx [%o0 - 0x10], %g1
923 ldx [%o0 - 0x08], %g2
924 1: ldx [%o1 + 0x00], %g3
925 ldx [%o1 + 0x08], %g7
931 DECRYPT_192(8, 4, 6, 0, 2)
932 std %f4, [%o2 + 0x00]
933 std %f6, [%o2 + 0x08]
939 ENDPROC(aes_sparc64_ecb_decrypt_192)
942 ENTRY(aes_sparc64_ecb_decrypt_256)
943 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
944 ldx [%o0 - 0x10], %g1
945 ldx [%o0 - 0x08], %g2
946 1: ldx [%o1 + 0x00], %g3
947 ldx [%o1 + 0x08], %g7
953 DECRYPT_256(8, 4, 6, 0, 2)
954 std %f4, [%o2 + 0x00]
955 std %f6, [%o2 + 0x08]
961 ENDPROC(aes_sparc64_ecb_decrypt_256)
964 ENTRY(aes_sparc64_cbc_encrypt_128)
965 /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
966 ldd [%o4 + 0x00], %f4
967 ldd [%o4 + 0x08], %f6
968 ldx [%o0 + 0x00], %g1
969 ldx [%o0 + 0x08], %g2
970 1: ldx [%o1 + 0x00], %g3
971 ldx [%o1 + 0x08], %g7
979 ENCRYPT_128(8, 4, 6, 0, 2)
980 std %f4, [%o2 + 0x00]
981 std %f6, [%o2 + 0x08]
985 std %f4, [%o4 + 0x00]
986 std %f6, [%o4 + 0x08]
989 ENDPROC(aes_sparc64_cbc_encrypt_128)
992 ENTRY(aes_sparc64_cbc_encrypt_192)
993 /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
994 ldd [%o4 + 0x00], %f4
995 ldd [%o4 + 0x08], %f6
996 ldx [%o0 + 0x00], %g1
997 ldx [%o0 + 0x08], %g2
998 1: ldx [%o1 + 0x00], %g3
999 ldx [%o1 + 0x08], %g7
1007 ENCRYPT_192(8, 4, 6, 0, 2)
1008 std %f4, [%o2 + 0x00]
1009 std %f6, [%o2 + 0x08]
1010 subcc %o3, 0x10, %o3
1013 std %f4, [%o4 + 0x00]
1014 std %f6, [%o4 + 0x08]
1017 ENDPROC(aes_sparc64_cbc_encrypt_192)
1020 ENTRY(aes_sparc64_cbc_encrypt_256)
1021 /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1022 ldd [%o4 + 0x00], %f4
1023 ldd [%o4 + 0x08], %f6
1024 ldx [%o0 + 0x00], %g1
1025 ldx [%o0 + 0x08], %g2
1026 1: ldx [%o1 + 0x00], %g3
1027 ldx [%o1 + 0x08], %g7
1035 ENCRYPT_256(8, 4, 6, 0, 2)
1036 std %f4, [%o2 + 0x00]
1037 std %f6, [%o2 + 0x08]
1038 subcc %o3, 0x10, %o3
1041 std %f4, [%o4 + 0x00]
1042 std %f6, [%o4 + 0x08]
1045 ENDPROC(aes_sparc64_cbc_encrypt_256)
1048 ENTRY(aes_sparc64_cbc_decrypt_128)
1049 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1050 ldx [%o0 - 0x10], %g1
1051 ldx [%o0 - 0x08], %g2
1052 ldx [%o4 + 0x00], %o0
1053 ldx [%o4 + 0x08], %o5
1054 1: ldx [%o1 + 0x00], %g3
1055 ldx [%o1 + 0x08], %g7
1061 DECRYPT_128(8, 4, 6, 0, 2)
1068 std %f4, [%o2 + 0x00]
1069 std %f6, [%o2 + 0x08]
1070 subcc %o3, 0x10, %o3
1073 stx %o0, [%o4 + 0x00]
1074 stx %o5, [%o4 + 0x08]
1077 ENDPROC(aes_sparc64_cbc_decrypt_128)
1080 ENTRY(aes_sparc64_cbc_decrypt_192)
1081 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1082 ldx [%o0 - 0x10], %g1
1083 ldx [%o0 - 0x08], %g2
1084 ldx [%o4 + 0x00], %o0
1085 ldx [%o4 + 0x08], %o5
1086 1: ldx [%o1 + 0x00], %g3
1087 ldx [%o1 + 0x08], %g7
1093 DECRYPT_192(8, 4, 6, 0, 2)
1100 std %f4, [%o2 + 0x00]
1101 std %f6, [%o2 + 0x08]
1102 subcc %o3, 0x10, %o3
1105 stx %o0, [%o4 + 0x00]
1106 stx %o5, [%o4 + 0x08]
1109 ENDPROC(aes_sparc64_cbc_decrypt_192)
1112 ENTRY(aes_sparc64_cbc_decrypt_256)
1113 /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1114 ldx [%o0 - 0x10], %g1
1115 ldx [%o0 - 0x08], %g2
1116 ldx [%o4 + 0x00], %o0
1117 ldx [%o4 + 0x08], %o5
1118 1: ldx [%o1 + 0x00], %g3
1119 ldx [%o1 + 0x08], %g7
1125 DECRYPT_256(8, 4, 6, 0, 2)
1132 std %f4, [%o2 + 0x00]
1133 std %f6, [%o2 + 0x08]
1134 subcc %o3, 0x10, %o3
1137 stx %o0, [%o4 + 0x00]
1138 stx %o5, [%o4 + 0x08]
1141 ENDPROC(aes_sparc64_cbc_decrypt_256)
1144 ENTRY(aes_sparc64_ctr_crypt_128)
1145 /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1146 ldx [%o4 + 0x00], %g3
1147 ldx [%o4 + 0x08], %g7
1148 ldx [%o0 + 0x00], %g1
1149 ldx [%o0 + 0x08], %g2
1150 1: xor %g1, %g3, %o5
1157 ENCRYPT_128(8, 0, 2, 4, 6)
1158 ldd [%o1 + 0x00], %f4
1159 ldd [%o1 + 0x08], %f6
1162 std %f4, [%o2 + 0x00]
1163 std %f6, [%o2 + 0x08]
1164 subcc %o3, 0x10, %o3
1168 stx %g3, [%o4 + 0x00]
1169 stx %g7, [%o4 + 0x08]
1172 ENDPROC(aes_sparc64_ctr_crypt_128)
1175 ENTRY(aes_sparc64_ctr_crypt_192)
1176 /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1177 ldx [%o4 + 0x00], %g3
1178 ldx [%o4 + 0x08], %g7
1179 ldx [%o0 + 0x00], %g1
1180 ldx [%o0 + 0x08], %g2
1181 1: xor %g1, %g3, %o5
1188 ENCRYPT_192(8, 0, 2, 4, 6)
1189 ldd [%o1 + 0x00], %f4
1190 ldd [%o1 + 0x08], %f6
1193 std %f4, [%o2 + 0x00]
1194 std %f6, [%o2 + 0x08]
1195 subcc %o3, 0x10, %o3
1199 stx %g3, [%o4 + 0x00]
1200 stx %g7, [%o4 + 0x08]
1203 ENDPROC(aes_sparc64_ctr_crypt_192)
1206 ENTRY(aes_sparc64_ctr_crypt_256)
1207 /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1208 ldx [%o4 + 0x00], %g3
1209 ldx [%o4 + 0x08], %g7
1210 ldx [%o0 + 0x00], %g1
1211 ldx [%o0 + 0x08], %g2
1212 1: xor %g1, %g3, %o5
1219 ENCRYPT_256(8, 0, 2, 4, 6)
1220 ldd [%o1 + 0x00], %f4
1221 ldd [%o1 + 0x08], %f6
1224 std %f4, [%o2 + 0x00]
1225 std %f6, [%o2 + 0x08]
1226 subcc %o3, 0x10, %o3
1230 stx %g3, [%o4 + 0x00]
1231 stx %g7, [%o4 + 0x08]
1234 ENDPROC(aes_sparc64_ctr_crypt_256)