]> rtime.felk.cvut.cz Git - can-eth-gw-linux.git/blob - arch/sparc/crypto/aes_asm.S
sparc64: Fix bugs in unrolled 256-bit loops.
[can-eth-gw-linux.git] / arch / sparc / crypto / aes_asm.S
1 #include <linux/linkage.h>
2 #include <asm/visasm.h>
3
4 #include "opcodes.h"
5
6 #define ENCRYPT_TWO_ROUNDS(KEY_BASE, I0, I1, T0, T1) \
7         AES_EROUND01(KEY_BASE +  0, I0, I1, T0) \
8         AES_EROUND23(KEY_BASE +  2, I0, I1, T1) \
9         AES_EROUND01(KEY_BASE +  4, T0, T1, I0) \
10         AES_EROUND23(KEY_BASE +  6, T0, T1, I1)
11
12 #define ENCRYPT_TWO_ROUNDS_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
13         AES_EROUND01(KEY_BASE +  0, I0, I1, T0) \
14         AES_EROUND23(KEY_BASE +  2, I0, I1, T1) \
15         AES_EROUND01(KEY_BASE +  0, I2, I3, T2) \
16         AES_EROUND23(KEY_BASE +  2, I2, I3, T3) \
17         AES_EROUND01(KEY_BASE +  4, T0, T1, I0) \
18         AES_EROUND23(KEY_BASE +  6, T0, T1, I1) \
19         AES_EROUND01(KEY_BASE +  4, T2, T3, I2) \
20         AES_EROUND23(KEY_BASE +  6, T2, T3, I3)
21
22 #define ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE, I0, I1, T0, T1) \
23         AES_EROUND01(KEY_BASE +  0, I0, I1, T0) \
24         AES_EROUND23(KEY_BASE +  2, I0, I1, T1) \
25         AES_EROUND01_L(KEY_BASE +  4, T0, T1, I0) \
26         AES_EROUND23_L(KEY_BASE +  6, T0, T1, I1)
27
28 #define ENCRYPT_TWO_ROUNDS_LAST_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
29         AES_EROUND01(KEY_BASE +  0, I0, I1, T0) \
30         AES_EROUND23(KEY_BASE +  2, I0, I1, T1) \
31         AES_EROUND01(KEY_BASE +  0, I2, I3, T2) \
32         AES_EROUND23(KEY_BASE +  2, I2, I3, T3) \
33         AES_EROUND01_L(KEY_BASE +  4, T0, T1, I0) \
34         AES_EROUND23_L(KEY_BASE +  6, T0, T1, I1) \
35         AES_EROUND01_L(KEY_BASE +  4, T2, T3, I2) \
36         AES_EROUND23_L(KEY_BASE +  6, T2, T3, I3)
37
38         /* 10 rounds */
39 #define ENCRYPT_128(KEY_BASE, I0, I1, T0, T1) \
40         ENCRYPT_TWO_ROUNDS(KEY_BASE +  0, I0, I1, T0, T1) \
41         ENCRYPT_TWO_ROUNDS(KEY_BASE +  8, I0, I1, T0, T1) \
42         ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
43         ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
44         ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 32, I0, I1, T0, T1)
45
46 #define ENCRYPT_128_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
47         ENCRYPT_TWO_ROUNDS_2(KEY_BASE +  0, I0, I1, I2, I3, T0, T1, T2, T3) \
48         ENCRYPT_TWO_ROUNDS_2(KEY_BASE +  8, I0, I1, I2, I3, T0, T1, T2, T3) \
49         ENCRYPT_TWO_ROUNDS_2(KEY_BASE + 16, I0, I1, I2, I3, T0, T1, T2, T3) \
50         ENCRYPT_TWO_ROUNDS_2(KEY_BASE + 24, I0, I1, I2, I3, T0, T1, T2, T3) \
51         ENCRYPT_TWO_ROUNDS_LAST_2(KEY_BASE + 32, I0, I1, I2, I3, T0, T1, T2, T3)
52
53         /* 12 rounds */
54 #define ENCRYPT_192(KEY_BASE, I0, I1, T0, T1) \
55         ENCRYPT_TWO_ROUNDS(KEY_BASE +  0, I0, I1, T0, T1) \
56         ENCRYPT_TWO_ROUNDS(KEY_BASE +  8, I0, I1, T0, T1) \
57         ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
58         ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
59         ENCRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
60         ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 40, I0, I1, T0, T1)
61
62 #define ENCRYPT_192_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
63         ENCRYPT_TWO_ROUNDS_2(KEY_BASE +  0, I0, I1, I2, I3, T0, T1, T2, T3) \
64         ENCRYPT_TWO_ROUNDS_2(KEY_BASE +  8, I0, I1, I2, I3, T0, T1, T2, T3) \
65         ENCRYPT_TWO_ROUNDS_2(KEY_BASE + 16, I0, I1, I2, I3, T0, T1, T2, T3) \
66         ENCRYPT_TWO_ROUNDS_2(KEY_BASE + 24, I0, I1, I2, I3, T0, T1, T2, T3) \
67         ENCRYPT_TWO_ROUNDS_2(KEY_BASE + 32, I0, I1, I2, I3, T0, T1, T2, T3) \
68         ENCRYPT_TWO_ROUNDS_LAST_2(KEY_BASE + 40, I0, I1, I2, I3, T0, T1, T2, T3)
69
70         /* 14 rounds */
71 #define ENCRYPT_256(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(KEY_BASE + 40, I0, I1, T0, T1) \
78         ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 48, I0, I1, T0, T1)
79
80 #define ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE, I0, I1, I2, I3, TMP_BASE) \
81         ENCRYPT_TWO_ROUNDS_2(KEY_BASE, I0, I1, I2, I3, \
82                              TMP_BASE + 0, TMP_BASE + 2, TMP_BASE + 4, TMP_BASE + 6)
83
84 #define ENCRYPT_256_2(KEY_BASE, I0, I1, I2, I3) \
85         ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE +  0, I0, I1, I2, I3, KEY_BASE + 48) \
86         ldd     [%o0 + 0xd0], %f56; \
87         ldd     [%o0 + 0xd8], %f58; \
88         ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE +  8, I0, I1, I2, I3, KEY_BASE +  0) \
89         ldd     [%o0 + 0xe0], %f60; \
90         ldd     [%o0 + 0xe8], %f62; \
91         ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE + 16, I0, I1, I2, I3, KEY_BASE +  0) \
92         ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE + 24, I0, I1, I2, I3, KEY_BASE +  0) \
93         ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE + 32, I0, I1, I2, I3, KEY_BASE +  0) \
94         ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE + 40, I0, I1, I2, I3, KEY_BASE +  0) \
95         AES_EROUND01(KEY_BASE +  48, I0, I1, KEY_BASE + 0) \
96         AES_EROUND23(KEY_BASE +  50, I0, I1, KEY_BASE + 2) \
97         AES_EROUND01(KEY_BASE +  48, I2, I3, KEY_BASE + 4) \
98         AES_EROUND23(KEY_BASE +  50, I2, I3, KEY_BASE + 6) \
99         AES_EROUND01_L(KEY_BASE +  52, KEY_BASE + 0, KEY_BASE + 2, I0) \
100         AES_EROUND23_L(KEY_BASE +  54, KEY_BASE + 0, KEY_BASE + 2, I1) \
101         ldd     [%o0 + 0x10], %f8; \
102         ldd     [%o0 + 0x18], %f10; \
103         AES_EROUND01_L(KEY_BASE +  52, KEY_BASE + 4, KEY_BASE + 6, I2) \
104         AES_EROUND23_L(KEY_BASE +  54, KEY_BASE + 4, KEY_BASE + 6, I3) \
105         ldd     [%o0 + 0x20], %f12; \
106         ldd     [%o0 + 0x28], %f14;
107
108 #define DECRYPT_TWO_ROUNDS(KEY_BASE, I0, I1, T0, T1) \
109         AES_DROUND23(KEY_BASE +  0, I0, I1, T1) \
110         AES_DROUND01(KEY_BASE +  2, I0, I1, T0) \
111         AES_DROUND23(KEY_BASE +  4, T0, T1, I1) \
112         AES_DROUND01(KEY_BASE +  6, T0, T1, I0)
113
114 #define DECRYPT_TWO_ROUNDS_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
115         AES_DROUND23(KEY_BASE +  0, I0, I1, T1) \
116         AES_DROUND01(KEY_BASE +  2, I0, I1, T0) \
117         AES_DROUND23(KEY_BASE +  0, I2, I3, T3) \
118         AES_DROUND01(KEY_BASE +  2, I2, I3, T2) \
119         AES_DROUND23(KEY_BASE +  4, T0, T1, I1) \
120         AES_DROUND01(KEY_BASE +  6, T0, T1, I0) \
121         AES_DROUND23(KEY_BASE +  4, T2, T3, I3) \
122         AES_DROUND01(KEY_BASE +  6, T2, T3, I2)
123
124 #define DECRYPT_TWO_ROUNDS_LAST(KEY_BASE, I0, I1, T0, T1) \
125         AES_DROUND23(KEY_BASE +  0, I0, I1, T1) \
126         AES_DROUND01(KEY_BASE +  2, I0, I1, T0) \
127         AES_DROUND23_L(KEY_BASE +  4, T0, T1, I1) \
128         AES_DROUND01_L(KEY_BASE +  6, T0, T1, I0)
129
130 #define DECRYPT_TWO_ROUNDS_LAST_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
131         AES_DROUND23(KEY_BASE +  0, I0, I1, T1) \
132         AES_DROUND01(KEY_BASE +  2, I0, I1, T0) \
133         AES_DROUND23(KEY_BASE +  0, I2, I3, T3) \
134         AES_DROUND01(KEY_BASE +  2, I2, I3, T2) \
135         AES_DROUND23_L(KEY_BASE +  4, T0, T1, I1) \
136         AES_DROUND01_L(KEY_BASE +  6, T0, T1, I0) \
137         AES_DROUND23_L(KEY_BASE +  4, T2, T3, I3) \
138         AES_DROUND01_L(KEY_BASE +  6, T2, T3, I2)
139
140         /* 10 rounds */
141 #define DECRYPT_128(KEY_BASE, I0, I1, T0, T1) \
142         DECRYPT_TWO_ROUNDS(KEY_BASE +  0, I0, I1, T0, T1) \
143         DECRYPT_TWO_ROUNDS(KEY_BASE +  8, I0, I1, T0, T1) \
144         DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
145         DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
146         DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 32, I0, I1, T0, T1)
147
148 #define DECRYPT_128_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
149         DECRYPT_TWO_ROUNDS_2(KEY_BASE +  0, I0, I1, I2, I3, T0, T1, T2, T3) \
150         DECRYPT_TWO_ROUNDS_2(KEY_BASE +  8, I0, I1, I2, I3, T0, T1, T2, T3) \
151         DECRYPT_TWO_ROUNDS_2(KEY_BASE + 16, I0, I1, I2, I3, T0, T1, T2, T3) \
152         DECRYPT_TWO_ROUNDS_2(KEY_BASE + 24, I0, I1, I2, I3, T0, T1, T2, T3) \
153         DECRYPT_TWO_ROUNDS_LAST_2(KEY_BASE + 32, I0, I1, I2, I3, T0, T1, T2, T3)
154
155         /* 12 rounds */
156 #define DECRYPT_192(KEY_BASE, I0, I1, T0, T1) \
157         DECRYPT_TWO_ROUNDS(KEY_BASE +  0, I0, I1, T0, T1) \
158         DECRYPT_TWO_ROUNDS(KEY_BASE +  8, I0, I1, T0, T1) \
159         DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
160         DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
161         DECRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
162         DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 40, I0, I1, T0, T1)
163
164 #define DECRYPT_192_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
165         DECRYPT_TWO_ROUNDS_2(KEY_BASE +  0, I0, I1, I2, I3, T0, T1, T2, T3) \
166         DECRYPT_TWO_ROUNDS_2(KEY_BASE +  8, I0, I1, I2, I3, T0, T1, T2, T3) \
167         DECRYPT_TWO_ROUNDS_2(KEY_BASE + 16, I0, I1, I2, I3, T0, T1, T2, T3) \
168         DECRYPT_TWO_ROUNDS_2(KEY_BASE + 24, I0, I1, I2, I3, T0, T1, T2, T3) \
169         DECRYPT_TWO_ROUNDS_2(KEY_BASE + 32, I0, I1, I2, I3, T0, T1, T2, T3) \
170         DECRYPT_TWO_ROUNDS_LAST_2(KEY_BASE + 40, I0, I1, I2, I3, T0, T1, T2, T3)
171
172         /* 14 rounds */
173 #define DECRYPT_256(KEY_BASE, I0, I1, T0, T1) \
174         DECRYPT_TWO_ROUNDS(KEY_BASE +  0, I0, I1, T0, T1) \
175         DECRYPT_TWO_ROUNDS(KEY_BASE +  8, I0, I1, T0, T1) \
176         DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
177         DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
178         DECRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
179         DECRYPT_TWO_ROUNDS(KEY_BASE + 40, I0, I1, T0, T1) \
180         DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 48, I0, I1, T0, T1)
181
182 #define DECRYPT_256_TWO_ROUNDS_2(KEY_BASE, I0, I1, I2, I3, TMP_BASE) \
183         DECRYPT_TWO_ROUNDS_2(KEY_BASE, I0, I1, I2, I3, \
184                              TMP_BASE + 0, TMP_BASE + 2, TMP_BASE + 4, TMP_BASE + 6)
185
186 #define DECRYPT_256_2(KEY_BASE, I0, I1, I2, I3) \
187         DECRYPT_256_TWO_ROUNDS_2(KEY_BASE +  0, I0, I1, I2, I3, KEY_BASE + 48) \
188         ldd     [%o0 + 0x18], %f56; \
189         ldd     [%o0 + 0x10], %f58; \
190         DECRYPT_256_TWO_ROUNDS_2(KEY_BASE +  8, I0, I1, I2, I3, KEY_BASE +  0) \
191         ldd     [%o0 + 0x08], %f60; \
192         ldd     [%o0 + 0x00], %f62; \
193         DECRYPT_256_TWO_ROUNDS_2(KEY_BASE + 16, I0, I1, I2, I3, KEY_BASE +  0) \
194         DECRYPT_256_TWO_ROUNDS_2(KEY_BASE + 24, I0, I1, I2, I3, KEY_BASE +  0) \
195         DECRYPT_256_TWO_ROUNDS_2(KEY_BASE + 32, I0, I1, I2, I3, KEY_BASE +  0) \
196         DECRYPT_256_TWO_ROUNDS_2(KEY_BASE + 40, I0, I1, I2, I3, KEY_BASE +  0) \
197         AES_DROUND23(KEY_BASE +  48, I0, I1, KEY_BASE + 2) \
198         AES_DROUND01(KEY_BASE +  50, I0, I1, KEY_BASE + 0) \
199         AES_DROUND23(KEY_BASE +  48, I2, I3, KEY_BASE + 6) \
200         AES_DROUND01(KEY_BASE +  50, I2, I3, KEY_BASE + 4) \
201         AES_DROUND23_L(KEY_BASE +  52, KEY_BASE + 0, KEY_BASE + 2, I1) \
202         AES_DROUND01_L(KEY_BASE +  54, KEY_BASE + 0, KEY_BASE + 2, I0) \
203         ldd     [%o0 + 0xd8], %f8; \
204         ldd     [%o0 + 0xd0], %f10; \
205         AES_DROUND23_L(KEY_BASE +  52, KEY_BASE + 4, KEY_BASE + 6, I3) \
206         AES_DROUND01_L(KEY_BASE +  54, KEY_BASE + 4, KEY_BASE + 6, I2) \
207         ldd     [%o0 + 0xc8], %f12; \
208         ldd     [%o0 + 0xc0], %f14;
209
210         .align  32
211 ENTRY(aes_sparc64_key_expand)
212         /* %o0=input_key, %o1=output_key, %o2=key_len */
213         VISEntry
214         ld      [%o0 + 0x00], %f0
215         ld      [%o0 + 0x04], %f1
216         ld      [%o0 + 0x08], %f2
217         ld      [%o0 + 0x0c], %f3
218
219         std     %f0, [%o1 + 0x00]
220         std     %f2, [%o1 + 0x08]
221         add     %o1, 0x10, %o1
222
223         cmp     %o2, 24
224         bl      2f
225          nop
226
227         be      1f
228          nop
229
230         /* 256-bit key expansion */
231         ld      [%o0 + 0x10], %f4
232         ld      [%o0 + 0x14], %f5
233         ld      [%o0 + 0x18], %f6
234         ld      [%o0 + 0x1c], %f7
235
236         std     %f4, [%o1 + 0x00]
237         std     %f6, [%o1 + 0x08]
238         add     %o1, 0x10, %o1
239
240         AES_KEXPAND1(0, 6, 0x0, 8)
241         AES_KEXPAND2(2, 8, 10)
242         AES_KEXPAND0(4, 10, 12)
243         AES_KEXPAND2(6, 12, 14)
244         AES_KEXPAND1(8, 14, 0x1, 16)
245         AES_KEXPAND2(10, 16, 18)
246         AES_KEXPAND0(12, 18, 20)
247         AES_KEXPAND2(14, 20, 22)
248         AES_KEXPAND1(16, 22, 0x2, 24)
249         AES_KEXPAND2(18, 24, 26)
250         AES_KEXPAND0(20, 26, 28)
251         AES_KEXPAND2(22, 28, 30)
252         AES_KEXPAND1(24, 30, 0x3, 32)
253         AES_KEXPAND2(26, 32, 34)
254         AES_KEXPAND0(28, 34, 36)
255         AES_KEXPAND2(30, 36, 38)
256         AES_KEXPAND1(32, 38, 0x4, 40)
257         AES_KEXPAND2(34, 40, 42)
258         AES_KEXPAND0(36, 42, 44)
259         AES_KEXPAND2(38, 44, 46)
260         AES_KEXPAND1(40, 46, 0x5, 48)
261         AES_KEXPAND2(42, 48, 50)
262         AES_KEXPAND0(44, 50, 52)
263         AES_KEXPAND2(46, 52, 54)
264         AES_KEXPAND1(48, 54, 0x6, 56)
265         AES_KEXPAND2(50, 56, 58)
266
267         std     %f8, [%o1 + 0x00]
268         std     %f10, [%o1 + 0x08]
269         std     %f12, [%o1 + 0x10]
270         std     %f14, [%o1 + 0x18]
271         std     %f16, [%o1 + 0x20]
272         std     %f18, [%o1 + 0x28]
273         std     %f20, [%o1 + 0x30]
274         std     %f22, [%o1 + 0x38]
275         std     %f24, [%o1 + 0x40]
276         std     %f26, [%o1 + 0x48]
277         std     %f28, [%o1 + 0x50]
278         std     %f30, [%o1 + 0x58]
279         std     %f32, [%o1 + 0x60]
280         std     %f34, [%o1 + 0x68]
281         std     %f36, [%o1 + 0x70]
282         std     %f38, [%o1 + 0x78]
283         std     %f40, [%o1 + 0x80]
284         std     %f42, [%o1 + 0x88]
285         std     %f44, [%o1 + 0x90]
286         std     %f46, [%o1 + 0x98]
287         std     %f48, [%o1 + 0xa0]
288         std     %f50, [%o1 + 0xa8]
289         std     %f52, [%o1 + 0xb0]
290         std     %f54, [%o1 + 0xb8]
291         std     %f56, [%o1 + 0xc0]
292         ba,pt   %xcc, 80f
293          std    %f58, [%o1 + 0xc8]
294
295 1:      
296         /* 192-bit key expansion */
297         ld      [%o0 + 0x10], %f4
298         ld      [%o0 + 0x14], %f5
299
300         std     %f4, [%o1 + 0x00]
301         add     %o1, 0x08, %o1
302
303         AES_KEXPAND1(0, 4, 0x0, 6)
304         AES_KEXPAND2(2, 6, 8)
305         AES_KEXPAND2(4, 8, 10)
306         AES_KEXPAND1(6, 10, 0x1, 12)
307         AES_KEXPAND2(8, 12, 14)
308         AES_KEXPAND2(10, 14, 16)
309         AES_KEXPAND1(12, 16, 0x2, 18)
310         AES_KEXPAND2(14, 18, 20)
311         AES_KEXPAND2(16, 20, 22)
312         AES_KEXPAND1(18, 22, 0x3, 24)
313         AES_KEXPAND2(20, 24, 26)
314         AES_KEXPAND2(22, 26, 28)
315         AES_KEXPAND1(24, 28, 0x4, 30)
316         AES_KEXPAND2(26, 30, 32)
317         AES_KEXPAND2(28, 32, 34)
318         AES_KEXPAND1(30, 34, 0x5, 36)
319         AES_KEXPAND2(32, 36, 38)
320         AES_KEXPAND2(34, 38, 40)
321         AES_KEXPAND1(36, 40, 0x6, 42)
322         AES_KEXPAND2(38, 42, 44)
323         AES_KEXPAND2(40, 44, 46)
324         AES_KEXPAND1(42, 46, 0x7, 48)
325         AES_KEXPAND2(44, 48, 50)
326
327         std     %f6, [%o1 + 0x00]
328         std     %f8, [%o1 + 0x08]
329         std     %f10, [%o1 + 0x10]
330         std     %f12, [%o1 + 0x18]
331         std     %f14, [%o1 + 0x20]
332         std     %f16, [%o1 + 0x28]
333         std     %f18, [%o1 + 0x30]
334         std     %f20, [%o1 + 0x38]
335         std     %f22, [%o1 + 0x40]
336         std     %f24, [%o1 + 0x48]
337         std     %f26, [%o1 + 0x50]
338         std     %f28, [%o1 + 0x58]
339         std     %f30, [%o1 + 0x60]
340         std     %f32, [%o1 + 0x68]
341         std     %f34, [%o1 + 0x70]
342         std     %f36, [%o1 + 0x78]
343         std     %f38, [%o1 + 0x80]
344         std     %f40, [%o1 + 0x88]
345         std     %f42, [%o1 + 0x90]
346         std     %f44, [%o1 + 0x98]
347         std     %f46, [%o1 + 0xa0]
348         std     %f48, [%o1 + 0xa8]
349         ba,pt   %xcc, 80f
350          std    %f50, [%o1 + 0xb0]
351
352 2:
353         /* 128-bit key expansion */
354         AES_KEXPAND1(0, 2, 0x0, 4)
355         AES_KEXPAND2(2, 4, 6)
356         AES_KEXPAND1(4, 6, 0x1, 8)
357         AES_KEXPAND2(6, 8, 10)
358         AES_KEXPAND1(8, 10, 0x2, 12)
359         AES_KEXPAND2(10, 12, 14)
360         AES_KEXPAND1(12, 14, 0x3, 16)
361         AES_KEXPAND2(14, 16, 18)
362         AES_KEXPAND1(16, 18, 0x4, 20)
363         AES_KEXPAND2(18, 20, 22)
364         AES_KEXPAND1(20, 22, 0x5, 24)
365         AES_KEXPAND2(22, 24, 26)
366         AES_KEXPAND1(24, 26, 0x6, 28)
367         AES_KEXPAND2(26, 28, 30)
368         AES_KEXPAND1(28, 30, 0x7, 32)
369         AES_KEXPAND2(30, 32, 34)
370         AES_KEXPAND1(32, 34, 0x8, 36)
371         AES_KEXPAND2(34, 36, 38)
372         AES_KEXPAND1(36, 38, 0x9, 40)
373         AES_KEXPAND2(38, 40, 42)
374
375         std     %f4, [%o1 + 0x00]
376         std     %f6, [%o1 + 0x08]
377         std     %f8, [%o1 + 0x10]
378         std     %f10, [%o1 + 0x18]
379         std     %f12, [%o1 + 0x20]
380         std     %f14, [%o1 + 0x28]
381         std     %f16, [%o1 + 0x30]
382         std     %f18, [%o1 + 0x38]
383         std     %f20, [%o1 + 0x40]
384         std     %f22, [%o1 + 0x48]
385         std     %f24, [%o1 + 0x50]
386         std     %f26, [%o1 + 0x58]
387         std     %f28, [%o1 + 0x60]
388         std     %f30, [%o1 + 0x68]
389         std     %f32, [%o1 + 0x70]
390         std     %f34, [%o1 + 0x78]
391         std     %f36, [%o1 + 0x80]
392         std     %f38, [%o1 + 0x88]
393         std     %f40, [%o1 + 0x90]
394         std     %f42, [%o1 + 0x98]
395 80:
396         retl
397          VISExit
398 ENDPROC(aes_sparc64_key_expand)
399
400         .align          32
401 ENTRY(aes_sparc64_encrypt_128)
402         /* %o0=key, %o1=input, %o2=output */
403         VISEntry
404         ld              [%o1 + 0x00], %f4
405         ld              [%o1 + 0x04], %f5
406         ld              [%o1 + 0x08], %f6
407         ld              [%o1 + 0x0c], %f7
408         ldd             [%o0 + 0x00], %f8
409         ldd             [%o0 + 0x08], %f10
410         ldd             [%o0 + 0x10], %f12
411         ldd             [%o0 + 0x18], %f14
412         ldd             [%o0 + 0x20], %f16
413         ldd             [%o0 + 0x28], %f18
414         ldd             [%o0 + 0x30], %f20
415         ldd             [%o0 + 0x38], %f22
416         ldd             [%o0 + 0x40], %f24
417         ldd             [%o0 + 0x48], %f26
418         ldd             [%o0 + 0x50], %f28
419         ldd             [%o0 + 0x58], %f30
420         ldd             [%o0 + 0x60], %f32
421         ldd             [%o0 + 0x68], %f34
422         ldd             [%o0 + 0x70], %f36
423         ldd             [%o0 + 0x78], %f38
424         ldd             [%o0 + 0x80], %f40
425         ldd             [%o0 + 0x88], %f42
426         ldd             [%o0 + 0x90], %f44
427         ldd             [%o0 + 0x98], %f46
428         ldd             [%o0 + 0xa0], %f48
429         ldd             [%o0 + 0xa8], %f50
430         fxor            %f8, %f4, %f4
431         fxor            %f10, %f6, %f6
432         ENCRYPT_128(12, 4, 6, 0, 2)
433         st              %f4, [%o2 + 0x00]
434         st              %f5, [%o2 + 0x04]
435         st              %f6, [%o2 + 0x08]
436         st              %f7, [%o2 + 0x0c]
437         retl
438          VISExit
439 ENDPROC(aes_sparc64_encrypt_128)
440
441         .align          32
442 ENTRY(aes_sparc64_encrypt_192)
443         /* %o0=key, %o1=input, %o2=output */
444         VISEntry
445         ld              [%o1 + 0x00], %f4
446         ld              [%o1 + 0x04], %f5
447         ld              [%o1 + 0x08], %f6
448         ld              [%o1 + 0x0c], %f7
449
450         ldd             [%o0 + 0x00], %f8
451         ldd             [%o0 + 0x08], %f10
452
453         fxor            %f8, %f4, %f4
454         fxor            %f10, %f6, %f6
455
456         ldd             [%o0 + 0x10], %f8
457         ldd             [%o0 + 0x18], %f10
458         ldd             [%o0 + 0x20], %f12
459         ldd             [%o0 + 0x28], %f14
460         add             %o0, 0x20, %o0
461
462         ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
463
464         ldd             [%o0 + 0x10], %f12
465         ldd             [%o0 + 0x18], %f14
466         ldd             [%o0 + 0x20], %f16
467         ldd             [%o0 + 0x28], %f18
468         ldd             [%o0 + 0x30], %f20
469         ldd             [%o0 + 0x38], %f22
470         ldd             [%o0 + 0x40], %f24
471         ldd             [%o0 + 0x48], %f26
472         ldd             [%o0 + 0x50], %f28
473         ldd             [%o0 + 0x58], %f30
474         ldd             [%o0 + 0x60], %f32
475         ldd             [%o0 + 0x68], %f34
476         ldd             [%o0 + 0x70], %f36
477         ldd             [%o0 + 0x78], %f38
478         ldd             [%o0 + 0x80], %f40
479         ldd             [%o0 + 0x88], %f42
480         ldd             [%o0 + 0x90], %f44
481         ldd             [%o0 + 0x98], %f46
482         ldd             [%o0 + 0xa0], %f48
483         ldd             [%o0 + 0xa8], %f50
484
485
486         ENCRYPT_128(12, 4, 6, 0, 2)
487
488         st              %f4, [%o2 + 0x00]
489         st              %f5, [%o2 + 0x04]
490         st              %f6, [%o2 + 0x08]
491         st              %f7, [%o2 + 0x0c]
492
493         retl
494          VISExit
495 ENDPROC(aes_sparc64_encrypt_192)
496
497         .align          32
498 ENTRY(aes_sparc64_encrypt_256)
499         /* %o0=key, %o1=input, %o2=output */
500         VISEntry
501         ld              [%o1 + 0x00], %f4
502         ld              [%o1 + 0x04], %f5
503         ld              [%o1 + 0x08], %f6
504         ld              [%o1 + 0x0c], %f7
505
506         ldd             [%o0 + 0x00], %f8
507         ldd             [%o0 + 0x08], %f10
508
509         fxor            %f8, %f4, %f4
510         fxor            %f10, %f6, %f6
511
512         ldd             [%o0 + 0x10], %f8
513
514         ldd             [%o0 + 0x18], %f10
515         ldd             [%o0 + 0x20], %f12
516         ldd             [%o0 + 0x28], %f14
517         add             %o0, 0x20, %o0
518
519         ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
520
521         ldd             [%o0 + 0x10], %f8
522
523         ldd             [%o0 + 0x18], %f10
524         ldd             [%o0 + 0x20], %f12
525         ldd             [%o0 + 0x28], %f14
526         add             %o0, 0x20, %o0
527
528         ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
529
530         ldd             [%o0 + 0x10], %f12
531         ldd             [%o0 + 0x18], %f14
532         ldd             [%o0 + 0x20], %f16
533         ldd             [%o0 + 0x28], %f18
534         ldd             [%o0 + 0x30], %f20
535         ldd             [%o0 + 0x38], %f22
536         ldd             [%o0 + 0x40], %f24
537         ldd             [%o0 + 0x48], %f26
538         ldd             [%o0 + 0x50], %f28
539         ldd             [%o0 + 0x58], %f30
540         ldd             [%o0 + 0x60], %f32
541         ldd             [%o0 + 0x68], %f34
542         ldd             [%o0 + 0x70], %f36
543         ldd             [%o0 + 0x78], %f38
544         ldd             [%o0 + 0x80], %f40
545         ldd             [%o0 + 0x88], %f42
546         ldd             [%o0 + 0x90], %f44
547         ldd             [%o0 + 0x98], %f46
548         ldd             [%o0 + 0xa0], %f48
549         ldd             [%o0 + 0xa8], %f50
550
551         ENCRYPT_128(12, 4, 6, 0, 2)
552
553         st              %f4, [%o2 + 0x00]
554         st              %f5, [%o2 + 0x04]
555         st              %f6, [%o2 + 0x08]
556         st              %f7, [%o2 + 0x0c]
557
558         retl
559          VISExit
560 ENDPROC(aes_sparc64_encrypt_256)
561
562         .align          32
563 ENTRY(aes_sparc64_decrypt_128)
564         /* %o0=key, %o1=input, %o2=output */
565         VISEntry
566         ld              [%o1 + 0x00], %f4
567         ld              [%o1 + 0x04], %f5
568         ld              [%o1 + 0x08], %f6
569         ld              [%o1 + 0x0c], %f7
570         ldd             [%o0 + 0xa0], %f8
571         ldd             [%o0 + 0xa8], %f10
572         ldd             [%o0 + 0x98], %f12
573         ldd             [%o0 + 0x90], %f14
574         ldd             [%o0 + 0x88], %f16
575         ldd             [%o0 + 0x80], %f18
576         ldd             [%o0 + 0x78], %f20
577         ldd             [%o0 + 0x70], %f22
578         ldd             [%o0 + 0x68], %f24
579         ldd             [%o0 + 0x60], %f26
580         ldd             [%o0 + 0x58], %f28
581         ldd             [%o0 + 0x50], %f30
582         ldd             [%o0 + 0x48], %f32
583         ldd             [%o0 + 0x40], %f34
584         ldd             [%o0 + 0x38], %f36
585         ldd             [%o0 + 0x30], %f38
586         ldd             [%o0 + 0x28], %f40
587         ldd             [%o0 + 0x20], %f42
588         ldd             [%o0 + 0x18], %f44
589         ldd             [%o0 + 0x10], %f46
590         ldd             [%o0 + 0x08], %f48
591         ldd             [%o0 + 0x00], %f50
592         fxor            %f8, %f4, %f4
593         fxor            %f10, %f6, %f6
594         DECRYPT_128(12, 4, 6, 0, 2)
595         st              %f4, [%o2 + 0x00]
596         st              %f5, [%o2 + 0x04]
597         st              %f6, [%o2 + 0x08]
598         st              %f7, [%o2 + 0x0c]
599         retl
600          VISExit
601 ENDPROC(aes_sparc64_decrypt_128)
602
603         .align          32
604 ENTRY(aes_sparc64_decrypt_192)
605         /* %o0=key, %o1=input, %o2=output */
606         VISEntry
607         ld              [%o1 + 0x00], %f4
608         ld              [%o1 + 0x04], %f5
609         ld              [%o1 + 0x08], %f6
610         ld              [%o1 + 0x0c], %f7
611         ldd             [%o0 + 0xc0], %f8
612         ldd             [%o0 + 0xc8], %f10
613         ldd             [%o0 + 0xb8], %f12
614         ldd             [%o0 + 0xb0], %f14
615         ldd             [%o0 + 0xa8], %f16
616         ldd             [%o0 + 0xa0], %f18
617         fxor            %f8, %f4, %f4
618         fxor            %f10, %f6, %f6
619         ldd             [%o0 + 0x98], %f20
620         ldd             [%o0 + 0x90], %f22
621         ldd             [%o0 + 0x88], %f24
622         ldd             [%o0 + 0x80], %f26
623         DECRYPT_TWO_ROUNDS(12, 4, 6, 0, 2)
624         ldd             [%o0 + 0x78], %f28
625         ldd             [%o0 + 0x70], %f30
626         ldd             [%o0 + 0x68], %f32
627         ldd             [%o0 + 0x60], %f34
628         ldd             [%o0 + 0x58], %f36
629         ldd             [%o0 + 0x50], %f38
630         ldd             [%o0 + 0x48], %f40
631         ldd             [%o0 + 0x40], %f42
632         ldd             [%o0 + 0x38], %f44
633         ldd             [%o0 + 0x30], %f46
634         ldd             [%o0 + 0x28], %f48
635         ldd             [%o0 + 0x20], %f50
636         ldd             [%o0 + 0x18], %f52
637         ldd             [%o0 + 0x10], %f54
638         ldd             [%o0 + 0x08], %f56
639         ldd             [%o0 + 0x00], %f58
640         DECRYPT_128(20, 4, 6, 0, 2)
641         st              %f4, [%o2 + 0x00]
642         st              %f5, [%o2 + 0x04]
643         st              %f6, [%o2 + 0x08]
644         st              %f7, [%o2 + 0x0c]
645         retl
646          VISExit
647 ENDPROC(aes_sparc64_decrypt_192)
648
649         .align          32
650 ENTRY(aes_sparc64_decrypt_256)
651         /* %o0=key, %o1=input, %o2=output */
652         VISEntry
653         ld              [%o1 + 0x00], %f4
654         ld              [%o1 + 0x04], %f5
655         ld              [%o1 + 0x08], %f6
656         ld              [%o1 + 0x0c], %f7
657         ldd             [%o0 + 0xe0], %f8
658         ldd             [%o0 + 0xe8], %f10
659         ldd             [%o0 + 0xd8], %f12
660         ldd             [%o0 + 0xd0], %f14
661         ldd             [%o0 + 0xc8], %f16
662         fxor            %f8, %f4, %f4
663         ldd             [%o0 + 0xc0], %f18
664         fxor            %f10, %f6, %f6
665         ldd             [%o0 + 0xb8], %f20
666         AES_DROUND23(12, 4, 6, 2)
667         ldd             [%o0 + 0xb0], %f22
668         AES_DROUND01(14, 4, 6, 0)
669         ldd             [%o0 + 0xa8], %f24
670         AES_DROUND23(16, 0, 2, 6)
671         ldd             [%o0 + 0xa0], %f26
672         AES_DROUND01(18, 0, 2, 4)
673         ldd             [%o0 + 0x98], %f12
674         AES_DROUND23(20, 4, 6, 2)
675         ldd             [%o0 + 0x90], %f14
676         AES_DROUND01(22, 4, 6, 0)
677         ldd             [%o0 + 0x88], %f16
678         AES_DROUND23(24, 0, 2, 6)
679         ldd             [%o0 + 0x80], %f18
680         AES_DROUND01(26, 0, 2, 4)
681         ldd             [%o0 + 0x78], %f20
682         AES_DROUND23(12, 4, 6, 2)
683         ldd             [%o0 + 0x70], %f22
684         AES_DROUND01(14, 4, 6, 0)
685         ldd             [%o0 + 0x68], %f24
686         AES_DROUND23(16, 0, 2, 6)
687         ldd             [%o0 + 0x60], %f26
688         AES_DROUND01(18, 0, 2, 4)
689         ldd             [%o0 + 0x58], %f28
690         AES_DROUND23(20, 4, 6, 2)
691         ldd             [%o0 + 0x50], %f30
692         AES_DROUND01(22, 4, 6, 0)
693         ldd             [%o0 + 0x48], %f32
694         AES_DROUND23(24, 0, 2, 6)
695         ldd             [%o0 + 0x40], %f34
696         AES_DROUND01(26, 0, 2, 4)
697         ldd             [%o0 + 0x38], %f36
698         AES_DROUND23(28, 4, 6, 2)
699         ldd             [%o0 + 0x30], %f38
700         AES_DROUND01(30, 4, 6, 0)
701         ldd             [%o0 + 0x28], %f40
702         AES_DROUND23(32, 0, 2, 6)
703         ldd             [%o0 + 0x20], %f42
704         AES_DROUND01(34, 0, 2, 4)
705         ldd             [%o0 + 0x18], %f44
706         AES_DROUND23(36, 4, 6, 2)
707         ldd             [%o0 + 0x10], %f46
708         AES_DROUND01(38, 4, 6, 0)
709         ldd             [%o0 + 0x08], %f48
710         AES_DROUND23(40, 0, 2, 6)
711         ldd             [%o0 + 0x00], %f50
712         AES_DROUND01(42, 0, 2, 4)
713         AES_DROUND23(44, 4, 6, 2)
714         AES_DROUND01(46, 4, 6, 0)
715         AES_DROUND23_L(48, 0, 2, 6)
716         AES_DROUND01_L(50, 0, 2, 4)
717         st              %f4, [%o2 + 0x00]
718         st              %f5, [%o2 + 0x04]
719         st              %f6, [%o2 + 0x08]
720         st              %f7, [%o2 + 0x0c]
721         retl
722          VISExit
723 ENDPROC(aes_sparc64_decrypt_256)
724
725         .align          32
726 ENTRY(aes_sparc64_load_encrypt_keys_128)
727         /* %o0=key */
728         VISEntry
729         ldd             [%o0 + 0x10], %f8
730         ldd             [%o0 + 0x18], %f10
731         ldd             [%o0 + 0x20], %f12
732         ldd             [%o0 + 0x28], %f14
733         ldd             [%o0 + 0x30], %f16
734         ldd             [%o0 + 0x38], %f18
735         ldd             [%o0 + 0x40], %f20
736         ldd             [%o0 + 0x48], %f22
737         ldd             [%o0 + 0x50], %f24
738         ldd             [%o0 + 0x58], %f26
739         ldd             [%o0 + 0x60], %f28
740         ldd             [%o0 + 0x68], %f30
741         ldd             [%o0 + 0x70], %f32
742         ldd             [%o0 + 0x78], %f34
743         ldd             [%o0 + 0x80], %f36
744         ldd             [%o0 + 0x88], %f38
745         ldd             [%o0 + 0x90], %f40
746         ldd             [%o0 + 0x98], %f42
747         ldd             [%o0 + 0xa0], %f44
748         retl
749          ldd            [%o0 + 0xa8], %f46
750 ENDPROC(aes_sparc64_load_encrypt_keys_128)
751
752         .align          32
753 ENTRY(aes_sparc64_load_encrypt_keys_192)
754         /* %o0=key */
755         VISEntry
756         ldd             [%o0 + 0x10], %f8
757         ldd             [%o0 + 0x18], %f10
758         ldd             [%o0 + 0x20], %f12
759         ldd             [%o0 + 0x28], %f14
760         ldd             [%o0 + 0x30], %f16
761         ldd             [%o0 + 0x38], %f18
762         ldd             [%o0 + 0x40], %f20
763         ldd             [%o0 + 0x48], %f22
764         ldd             [%o0 + 0x50], %f24
765         ldd             [%o0 + 0x58], %f26
766         ldd             [%o0 + 0x60], %f28
767         ldd             [%o0 + 0x68], %f30
768         ldd             [%o0 + 0x70], %f32
769         ldd             [%o0 + 0x78], %f34
770         ldd             [%o0 + 0x80], %f36
771         ldd             [%o0 + 0x88], %f38
772         ldd             [%o0 + 0x90], %f40
773         ldd             [%o0 + 0x98], %f42
774         ldd             [%o0 + 0xa0], %f44
775         ldd             [%o0 + 0xa8], %f46
776         ldd             [%o0 + 0xb0], %f48
777         ldd             [%o0 + 0xb8], %f50
778         ldd             [%o0 + 0xc0], %f52
779         retl
780          ldd            [%o0 + 0xc8], %f54
781 ENDPROC(aes_sparc64_load_encrypt_keys_192)
782
783         .align          32
784 ENTRY(aes_sparc64_load_encrypt_keys_256)
785         /* %o0=key */
786         VISEntry
787         ldd             [%o0 + 0x10], %f8
788         ldd             [%o0 + 0x18], %f10
789         ldd             [%o0 + 0x20], %f12
790         ldd             [%o0 + 0x28], %f14
791         ldd             [%o0 + 0x30], %f16
792         ldd             [%o0 + 0x38], %f18
793         ldd             [%o0 + 0x40], %f20
794         ldd             [%o0 + 0x48], %f22
795         ldd             [%o0 + 0x50], %f24
796         ldd             [%o0 + 0x58], %f26
797         ldd             [%o0 + 0x60], %f28
798         ldd             [%o0 + 0x68], %f30
799         ldd             [%o0 + 0x70], %f32
800         ldd             [%o0 + 0x78], %f34
801         ldd             [%o0 + 0x80], %f36
802         ldd             [%o0 + 0x88], %f38
803         ldd             [%o0 + 0x90], %f40
804         ldd             [%o0 + 0x98], %f42
805         ldd             [%o0 + 0xa0], %f44
806         ldd             [%o0 + 0xa8], %f46
807         ldd             [%o0 + 0xb0], %f48
808         ldd             [%o0 + 0xb8], %f50
809         ldd             [%o0 + 0xc0], %f52
810         ldd             [%o0 + 0xc8], %f54
811         ldd             [%o0 + 0xd0], %f56
812         ldd             [%o0 + 0xd8], %f58
813         ldd             [%o0 + 0xe0], %f60
814         retl
815          ldd            [%o0 + 0xe8], %f62
816 ENDPROC(aes_sparc64_load_encrypt_keys_256)
817
818         .align          32
819 ENTRY(aes_sparc64_load_decrypt_keys_128)
820         /* %o0=key */
821         VISEntry
822         ldd             [%o0 + 0x98], %f8
823         ldd             [%o0 + 0x90], %f10
824         ldd             [%o0 + 0x88], %f12
825         ldd             [%o0 + 0x80], %f14
826         ldd             [%o0 + 0x78], %f16
827         ldd             [%o0 + 0x70], %f18
828         ldd             [%o0 + 0x68], %f20
829         ldd             [%o0 + 0x60], %f22
830         ldd             [%o0 + 0x58], %f24
831         ldd             [%o0 + 0x50], %f26
832         ldd             [%o0 + 0x48], %f28
833         ldd             [%o0 + 0x40], %f30
834         ldd             [%o0 + 0x38], %f32
835         ldd             [%o0 + 0x30], %f34
836         ldd             [%o0 + 0x28], %f36
837         ldd             [%o0 + 0x20], %f38
838         ldd             [%o0 + 0x18], %f40
839         ldd             [%o0 + 0x10], %f42
840         ldd             [%o0 + 0x08], %f44
841         retl
842          ldd            [%o0 + 0x00], %f46
843 ENDPROC(aes_sparc64_load_decrypt_keys_128)
844
845         .align          32
846 ENTRY(aes_sparc64_load_decrypt_keys_192)
847         /* %o0=key */
848         VISEntry
849         ldd             [%o0 + 0xb8], %f8
850         ldd             [%o0 + 0xb0], %f10
851         ldd             [%o0 + 0xa8], %f12
852         ldd             [%o0 + 0xa0], %f14
853         ldd             [%o0 + 0x98], %f16
854         ldd             [%o0 + 0x90], %f18
855         ldd             [%o0 + 0x88], %f20
856         ldd             [%o0 + 0x80], %f22
857         ldd             [%o0 + 0x78], %f24
858         ldd             [%o0 + 0x70], %f26
859         ldd             [%o0 + 0x68], %f28
860         ldd             [%o0 + 0x60], %f30
861         ldd             [%o0 + 0x58], %f32
862         ldd             [%o0 + 0x50], %f34
863         ldd             [%o0 + 0x48], %f36
864         ldd             [%o0 + 0x40], %f38
865         ldd             [%o0 + 0x38], %f40
866         ldd             [%o0 + 0x30], %f42
867         ldd             [%o0 + 0x28], %f44
868         ldd             [%o0 + 0x20], %f46
869         ldd             [%o0 + 0x18], %f48
870         ldd             [%o0 + 0x10], %f50
871         ldd             [%o0 + 0x08], %f52
872         retl
873          ldd            [%o0 + 0x00], %f54
874 ENDPROC(aes_sparc64_load_decrypt_keys_192)
875
876         .align          32
877 ENTRY(aes_sparc64_load_decrypt_keys_256)
878         /* %o0=key */
879         VISEntry
880         ldd             [%o0 + 0xd8], %f8
881         ldd             [%o0 + 0xd0], %f10
882         ldd             [%o0 + 0xc8], %f12
883         ldd             [%o0 + 0xc0], %f14
884         ldd             [%o0 + 0xb8], %f16
885         ldd             [%o0 + 0xb0], %f18
886         ldd             [%o0 + 0xa8], %f20
887         ldd             [%o0 + 0xa0], %f22
888         ldd             [%o0 + 0x98], %f24
889         ldd             [%o0 + 0x90], %f26
890         ldd             [%o0 + 0x88], %f28
891         ldd             [%o0 + 0x80], %f30
892         ldd             [%o0 + 0x78], %f32
893         ldd             [%o0 + 0x70], %f34
894         ldd             [%o0 + 0x68], %f36
895         ldd             [%o0 + 0x60], %f38
896         ldd             [%o0 + 0x58], %f40
897         ldd             [%o0 + 0x50], %f42
898         ldd             [%o0 + 0x48], %f44
899         ldd             [%o0 + 0x40], %f46
900         ldd             [%o0 + 0x38], %f48
901         ldd             [%o0 + 0x30], %f50
902         ldd             [%o0 + 0x28], %f52
903         ldd             [%o0 + 0x20], %f54
904         ldd             [%o0 + 0x18], %f56
905         ldd             [%o0 + 0x10], %f58
906         ldd             [%o0 + 0x08], %f60
907         retl
908          ldd            [%o0 + 0x00], %f62
909 ENDPROC(aes_sparc64_load_decrypt_keys_256)
910
911         .align          32
912 ENTRY(aes_sparc64_ecb_encrypt_128)
913         /* %o0=key, %o1=input, %o2=output, %o3=len */
914         ldx             [%o0 + 0x00], %g1
915         subcc           %o3, 0x10, %o3
916         be              10f
917          ldx            [%o0 + 0x08], %g2
918 1:      ldx             [%o1 + 0x00], %g3
919         ldx             [%o1 + 0x08], %g7
920         ldx             [%o1 + 0x10], %o4
921         ldx             [%o1 + 0x18], %o5
922         xor             %g1, %g3, %g3
923         xor             %g2, %g7, %g7
924         MOVXTOD_G3_F4
925         MOVXTOD_G7_F6
926         xor             %g1, %o4, %g3
927         xor             %g2, %o5, %g7
928         MOVXTOD_G3_F60
929         MOVXTOD_G7_F62
930         ENCRYPT_128_2(8, 4, 6, 60, 62, 0, 2, 56, 58)
931         std             %f4, [%o2 + 0x00]
932         std             %f6, [%o2 + 0x08]
933         std             %f60, [%o2 + 0x10]
934         std             %f62, [%o2 + 0x18]
935         sub             %o3, 0x20, %o3
936         add             %o1, 0x20, %o1
937         brgz            %o3, 1b
938          add            %o2, 0x20, %o2
939         brlz,pt         %o3, 11f
940          nop
941 10:     ldx             [%o1 + 0x00], %g3
942         ldx             [%o1 + 0x08], %g7
943         xor             %g1, %g3, %g3
944         xor             %g2, %g7, %g7
945         MOVXTOD_G3_F4
946         MOVXTOD_G7_F6
947         ENCRYPT_128(8, 4, 6, 0, 2)
948         std             %f4, [%o2 + 0x00]
949         std             %f6, [%o2 + 0x08]
950 11:     retl
951          nop
952 ENDPROC(aes_sparc64_ecb_encrypt_128)
953
954         .align          32
955 ENTRY(aes_sparc64_ecb_encrypt_192)
956         /* %o0=key, %o1=input, %o2=output, %o3=len */
957         ldx             [%o0 + 0x00], %g1
958         subcc           %o3, 0x10, %o3
959         be              10f
960          ldx            [%o0 + 0x08], %g2
961 1:      ldx             [%o1 + 0x00], %g3
962         ldx             [%o1 + 0x08], %g7
963         ldx             [%o1 + 0x10], %o4
964         ldx             [%o1 + 0x18], %o5
965         xor             %g1, %g3, %g3
966         xor             %g2, %g7, %g7
967         MOVXTOD_G3_F4
968         MOVXTOD_G7_F6
969         xor             %g1, %o4, %g3
970         xor             %g2, %o5, %g7
971         MOVXTOD_G3_F60
972         MOVXTOD_G7_F62
973         ENCRYPT_192_2(8, 4, 6, 60, 62, 0, 2, 56, 58)
974         std             %f4, [%o2 + 0x00]
975         std             %f6, [%o2 + 0x08]
976         std             %f60, [%o2 + 0x10]
977         std             %f62, [%o2 + 0x18]
978         sub             %o3, 0x20, %o3
979         add             %o1, 0x20, %o1
980         brgz            %o3, 1b
981          add            %o2, 0x20, %o2
982         brlz,pt         %o3, 11f
983          nop
984 10:     ldx             [%o1 + 0x00], %g3
985         ldx             [%o1 + 0x08], %g7
986         xor             %g1, %g3, %g3
987         xor             %g2, %g7, %g7
988         MOVXTOD_G3_F4
989         MOVXTOD_G7_F6
990         ENCRYPT_192(8, 4, 6, 0, 2)
991         std             %f4, [%o2 + 0x00]
992         std             %f6, [%o2 + 0x08]
993 11:     retl
994          nop
995 ENDPROC(aes_sparc64_ecb_encrypt_192)
996
997         .align          32
998 ENTRY(aes_sparc64_ecb_encrypt_256)
999         /* %o0=key, %o1=input, %o2=output, %o3=len */
1000         ldx             [%o0 + 0x00], %g1
1001         subcc           %o3, 0x10, %o3
1002         be              10f
1003          ldx            [%o0 + 0x08], %g2
1004 1:      ldx             [%o1 + 0x00], %g3
1005         ldx             [%o1 + 0x08], %g7
1006         ldx             [%o1 + 0x10], %o4
1007         ldx             [%o1 + 0x18], %o5
1008         xor             %g1, %g3, %g3
1009         xor             %g2, %g7, %g7
1010         MOVXTOD_G3_F4
1011         MOVXTOD_G7_F6
1012         xor             %g1, %o4, %g3
1013         xor             %g2, %o5, %g7
1014         MOVXTOD_G3_F0
1015         MOVXTOD_G7_F2
1016         ENCRYPT_256_2(8, 4, 6, 0, 2)
1017         std             %f4, [%o2 + 0x00]
1018         std             %f6, [%o2 + 0x08]
1019         std             %f0, [%o2 + 0x10]
1020         std             %f2, [%o2 + 0x18]
1021         sub             %o3, 0x20, %o3
1022         add             %o1, 0x20, %o1
1023         brgz            %o3, 1b
1024          add            %o2, 0x20, %o2
1025         brlz,pt         %o3, 11f
1026          nop
1027 10:     ldx             [%o1 + 0x00], %g3
1028         ldx             [%o1 + 0x08], %g7
1029         xor             %g1, %g3, %g3
1030         xor             %g2, %g7, %g7
1031         MOVXTOD_G3_F4
1032         MOVXTOD_G7_F6
1033         ENCRYPT_256(8, 4, 6, 0, 2)
1034         std             %f4, [%o2 + 0x00]
1035         std             %f6, [%o2 + 0x08]
1036 11:     retl
1037          nop
1038 ENDPROC(aes_sparc64_ecb_encrypt_256)
1039
1040         .align          32
1041 ENTRY(aes_sparc64_ecb_decrypt_128)
1042         /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
1043         ldx             [%o0 - 0x10], %g1
1044         subcc           %o3, 0x10, %o3
1045         be              10f
1046          ldx            [%o0 - 0x08], %g2
1047 1:      ldx             [%o1 + 0x00], %g3
1048         ldx             [%o1 + 0x08], %g7
1049         ldx             [%o1 + 0x10], %o4
1050         ldx             [%o1 + 0x18], %o5
1051         xor             %g1, %g3, %g3
1052         xor             %g2, %g7, %g7
1053         MOVXTOD_G3_F4
1054         MOVXTOD_G7_F6
1055         xor             %g1, %o4, %g3
1056         xor             %g2, %o5, %g7
1057         MOVXTOD_G3_F60
1058         MOVXTOD_G7_F62
1059         DECRYPT_128_2(8, 4, 6, 60, 62, 0, 2, 56, 58)
1060         std             %f4, [%o2 + 0x00]
1061         std             %f6, [%o2 + 0x08]
1062         std             %f60, [%o2 + 0x10]
1063         std             %f62, [%o2 + 0x18]
1064         sub             %o3, 0x20, %o3
1065         add             %o1, 0x20, %o1
1066         brgz,pt         %o3, 1b
1067          add            %o2, 0x20, %o2
1068         brlz,pt         %o3, 11f
1069          nop
1070 10:     ldx             [%o1 + 0x00], %g3
1071         ldx             [%o1 + 0x08], %g7
1072         xor             %g1, %g3, %g3
1073         xor             %g2, %g7, %g7
1074         MOVXTOD_G3_F4
1075         MOVXTOD_G7_F6
1076         DECRYPT_128(8, 4, 6, 0, 2)
1077         std             %f4, [%o2 + 0x00]
1078         std             %f6, [%o2 + 0x08]
1079 11:     retl
1080          nop
1081 ENDPROC(aes_sparc64_ecb_decrypt_128)
1082
1083         .align          32
1084 ENTRY(aes_sparc64_ecb_decrypt_192)
1085         /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
1086         ldx             [%o0 - 0x10], %g1
1087         subcc           %o3, 0x10, %o3
1088         be              10f
1089          ldx            [%o0 - 0x08], %g2
1090 1:      ldx             [%o1 + 0x00], %g3
1091         ldx             [%o1 + 0x08], %g7
1092         ldx             [%o1 + 0x10], %o4
1093         ldx             [%o1 + 0x18], %o5
1094         xor             %g1, %g3, %g3
1095         xor             %g2, %g7, %g7
1096         MOVXTOD_G3_F4
1097         MOVXTOD_G7_F6
1098         xor             %g1, %o4, %g3
1099         xor             %g2, %o5, %g7
1100         MOVXTOD_G3_F60
1101         MOVXTOD_G7_F62
1102         DECRYPT_192_2(8, 4, 6, 60, 62, 0, 2, 56, 58)
1103         std             %f4, [%o2 + 0x00]
1104         std             %f6, [%o2 + 0x08]
1105         std             %f60, [%o2 + 0x10]
1106         std             %f62, [%o2 + 0x18]
1107         sub             %o3, 0x20, %o3
1108         add             %o1, 0x20, %o1
1109         brgz,pt         %o3, 1b
1110          add            %o2, 0x20, %o2
1111         brlz,pt         %o3, 11f
1112          nop
1113 10:     ldx             [%o1 + 0x00], %g3
1114         ldx             [%o1 + 0x08], %g7
1115         xor             %g1, %g3, %g3
1116         xor             %g2, %g7, %g7
1117         MOVXTOD_G3_F4
1118         MOVXTOD_G7_F6
1119         DECRYPT_192(8, 4, 6, 0, 2)
1120         std             %f4, [%o2 + 0x00]
1121         std             %f6, [%o2 + 0x08]
1122 11:     retl
1123          nop
1124 ENDPROC(aes_sparc64_ecb_decrypt_192)
1125
1126         .align          32
1127 ENTRY(aes_sparc64_ecb_decrypt_256)
1128         /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
1129         ldx             [%o0 - 0x10], %g1
1130         subcc           %o3, 0x10, %o3
1131         be              10f
1132          ldx            [%o0 - 0x08], %g2
1133         sub             %o0, 0xf0, %o0
1134 1:      ldx             [%o1 + 0x00], %g3
1135         ldx             [%o1 + 0x08], %g7
1136         ldx             [%o1 + 0x10], %o4
1137         ldx             [%o1 + 0x18], %o5
1138         xor             %g1, %g3, %g3
1139         xor             %g2, %g7, %g7
1140         MOVXTOD_G3_F4
1141         MOVXTOD_G7_F6
1142         xor             %g1, %o4, %g3
1143         xor             %g2, %o5, %g7
1144         MOVXTOD_G3_F0
1145         MOVXTOD_G7_F2
1146         DECRYPT_256_2(8, 4, 6, 0, 2)
1147         std             %f4, [%o2 + 0x00]
1148         std             %f6, [%o2 + 0x08]
1149         std             %f0, [%o2 + 0x10]
1150         std             %f2, [%o2 + 0x18]
1151         sub             %o3, 0x20, %o3
1152         add             %o1, 0x20, %o1
1153         brgz,pt         %o3, 1b
1154          add            %o2, 0x20, %o2
1155         brlz,pt         %o3, 11f
1156          nop
1157 10:     ldx             [%o1 + 0x00], %g3
1158         ldx             [%o1 + 0x08], %g7
1159         xor             %g1, %g3, %g3
1160         xor             %g2, %g7, %g7
1161         MOVXTOD_G3_F4
1162         MOVXTOD_G7_F6
1163         DECRYPT_256(8, 4, 6, 0, 2)
1164         std             %f4, [%o2 + 0x00]
1165         std             %f6, [%o2 + 0x08]
1166 11:     retl
1167          nop
1168 ENDPROC(aes_sparc64_ecb_decrypt_256)
1169
1170         .align          32
1171 ENTRY(aes_sparc64_cbc_encrypt_128)
1172         /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1173         ldd             [%o4 + 0x00], %f4
1174         ldd             [%o4 + 0x08], %f6
1175         ldx             [%o0 + 0x00], %g1
1176         ldx             [%o0 + 0x08], %g2
1177 1:      ldx             [%o1 + 0x00], %g3
1178         ldx             [%o1 + 0x08], %g7
1179         add             %o1, 0x10, %o1
1180         xor             %g1, %g3, %g3
1181         xor             %g2, %g7, %g7
1182         MOVXTOD_G3_F0
1183         MOVXTOD_G7_F2
1184         fxor            %f4, %f0, %f4
1185         fxor            %f6, %f2, %f6
1186         ENCRYPT_128(8, 4, 6, 0, 2)
1187         std             %f4, [%o2 + 0x00]
1188         std             %f6, [%o2 + 0x08]
1189         subcc           %o3, 0x10, %o3
1190         bne,pt          %xcc, 1b
1191          add            %o2, 0x10, %o2
1192         std             %f4, [%o4 + 0x00]
1193         std             %f6, [%o4 + 0x08]
1194         retl
1195          nop
1196 ENDPROC(aes_sparc64_cbc_encrypt_128)
1197
1198         .align          32
1199 ENTRY(aes_sparc64_cbc_encrypt_192)
1200         /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1201         ldd             [%o4 + 0x00], %f4
1202         ldd             [%o4 + 0x08], %f6
1203         ldx             [%o0 + 0x00], %g1
1204         ldx             [%o0 + 0x08], %g2
1205 1:      ldx             [%o1 + 0x00], %g3
1206         ldx             [%o1 + 0x08], %g7
1207         add             %o1, 0x10, %o1
1208         xor             %g1, %g3, %g3
1209         xor             %g2, %g7, %g7
1210         MOVXTOD_G3_F0
1211         MOVXTOD_G7_F2
1212         fxor            %f4, %f0, %f4
1213         fxor            %f6, %f2, %f6
1214         ENCRYPT_192(8, 4, 6, 0, 2)
1215         std             %f4, [%o2 + 0x00]
1216         std             %f6, [%o2 + 0x08]
1217         subcc           %o3, 0x10, %o3
1218         bne,pt          %xcc, 1b
1219          add            %o2, 0x10, %o2
1220         std             %f4, [%o4 + 0x00]
1221         std             %f6, [%o4 + 0x08]
1222         retl
1223          nop
1224 ENDPROC(aes_sparc64_cbc_encrypt_192)
1225
1226         .align          32
1227 ENTRY(aes_sparc64_cbc_encrypt_256)
1228         /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1229         ldd             [%o4 + 0x00], %f4
1230         ldd             [%o4 + 0x08], %f6
1231         ldx             [%o0 + 0x00], %g1
1232         ldx             [%o0 + 0x08], %g2
1233 1:      ldx             [%o1 + 0x00], %g3
1234         ldx             [%o1 + 0x08], %g7
1235         add             %o1, 0x10, %o1
1236         xor             %g1, %g3, %g3
1237         xor             %g2, %g7, %g7
1238         MOVXTOD_G3_F0
1239         MOVXTOD_G7_F2
1240         fxor            %f4, %f0, %f4
1241         fxor            %f6, %f2, %f6
1242         ENCRYPT_256(8, 4, 6, 0, 2)
1243         std             %f4, [%o2 + 0x00]
1244         std             %f6, [%o2 + 0x08]
1245         subcc           %o3, 0x10, %o3
1246         bne,pt          %xcc, 1b
1247          add            %o2, 0x10, %o2
1248         std             %f4, [%o4 + 0x00]
1249         std             %f6, [%o4 + 0x08]
1250         retl
1251          nop
1252 ENDPROC(aes_sparc64_cbc_encrypt_256)
1253
1254         .align          32
1255 ENTRY(aes_sparc64_cbc_decrypt_128)
1256         /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1257         ldx             [%o0 - 0x10], %g1
1258         ldx             [%o0 - 0x08], %g2
1259         ldx             [%o4 + 0x00], %o0
1260         ldx             [%o4 + 0x08], %o5
1261 1:      ldx             [%o1 + 0x00], %g3
1262         ldx             [%o1 + 0x08], %g7
1263         add             %o1, 0x10, %o1
1264         xor             %g1, %g3, %g3
1265         xor             %g2, %g7, %g7
1266         MOVXTOD_G3_F4
1267         MOVXTOD_G7_F6
1268         DECRYPT_128(8, 4, 6, 0, 2)
1269         MOVXTOD_O0_F0
1270         MOVXTOD_O5_F2
1271         xor             %g1, %g3, %o0
1272         xor             %g2, %g7, %o5
1273         fxor            %f4, %f0, %f4
1274         fxor            %f6, %f2, %f6
1275         std             %f4, [%o2 + 0x00]
1276         std             %f6, [%o2 + 0x08]
1277         subcc           %o3, 0x10, %o3
1278         bne,pt          %xcc, 1b
1279          add            %o2, 0x10, %o2
1280         stx             %o0, [%o4 + 0x00]
1281         stx             %o5, [%o4 + 0x08]
1282         retl
1283          nop
1284 ENDPROC(aes_sparc64_cbc_decrypt_128)
1285
1286         .align          32
1287 ENTRY(aes_sparc64_cbc_decrypt_192)
1288         /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1289         ldx             [%o0 - 0x10], %g1
1290         ldx             [%o0 - 0x08], %g2
1291         ldx             [%o4 + 0x00], %o0
1292         ldx             [%o4 + 0x08], %o5
1293 1:      ldx             [%o1 + 0x00], %g3
1294         ldx             [%o1 + 0x08], %g7
1295         add             %o1, 0x10, %o1
1296         xor             %g1, %g3, %g3
1297         xor             %g2, %g7, %g7
1298         MOVXTOD_G3_F4
1299         MOVXTOD_G7_F6
1300         DECRYPT_192(8, 4, 6, 0, 2)
1301         MOVXTOD_O0_F0
1302         MOVXTOD_O5_F2
1303         xor             %g1, %g3, %o0
1304         xor             %g2, %g7, %o5
1305         fxor            %f4, %f0, %f4
1306         fxor            %f6, %f2, %f6
1307         std             %f4, [%o2 + 0x00]
1308         std             %f6, [%o2 + 0x08]
1309         subcc           %o3, 0x10, %o3
1310         bne,pt          %xcc, 1b
1311          add            %o2, 0x10, %o2
1312         stx             %o0, [%o4 + 0x00]
1313         stx             %o5, [%o4 + 0x08]
1314         retl
1315          nop
1316 ENDPROC(aes_sparc64_cbc_decrypt_192)
1317
1318         .align          32
1319 ENTRY(aes_sparc64_cbc_decrypt_256)
1320         /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1321         ldx             [%o0 - 0x10], %g1
1322         ldx             [%o0 - 0x08], %g2
1323         ldx             [%o4 + 0x00], %o0
1324         ldx             [%o4 + 0x08], %o5
1325 1:      ldx             [%o1 + 0x00], %g3
1326         ldx             [%o1 + 0x08], %g7
1327         add             %o1, 0x10, %o1
1328         xor             %g1, %g3, %g3
1329         xor             %g2, %g7, %g7
1330         MOVXTOD_G3_F4
1331         MOVXTOD_G7_F6
1332         DECRYPT_256(8, 4, 6, 0, 2)
1333         MOVXTOD_O0_F0
1334         MOVXTOD_O5_F2
1335         xor             %g1, %g3, %o0
1336         xor             %g2, %g7, %o5
1337         fxor            %f4, %f0, %f4
1338         fxor            %f6, %f2, %f6
1339         std             %f4, [%o2 + 0x00]
1340         std             %f6, [%o2 + 0x08]
1341         subcc           %o3, 0x10, %o3
1342         bne,pt          %xcc, 1b
1343          add            %o2, 0x10, %o2
1344         stx             %o0, [%o4 + 0x00]
1345         stx             %o5, [%o4 + 0x08]
1346         retl
1347          nop
1348 ENDPROC(aes_sparc64_cbc_decrypt_256)
1349
1350         .align          32
1351 ENTRY(aes_sparc64_ctr_crypt_128)
1352         /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1353         ldx             [%o4 + 0x00], %g3
1354         ldx             [%o4 + 0x08], %g7
1355         subcc           %o3, 0x10, %o3
1356         ldx             [%o0 + 0x00], %g1
1357         be              10f
1358          ldx            [%o0 + 0x08], %g2
1359 1:      xor             %g1, %g3, %o5
1360         MOVXTOD_O5_F0
1361         xor             %g2, %g7, %o5
1362         MOVXTOD_O5_F2
1363         add             %g7, 1, %g7
1364         add             %g3, 1, %o5
1365         movrz           %g7, %o5, %g3
1366         xor             %g1, %g3, %o5
1367         MOVXTOD_O5_F4
1368         xor             %g2, %g7, %o5
1369         MOVXTOD_O5_F6
1370         add             %g7, 1, %g7
1371         add             %g3, 1, %o5
1372         movrz           %g7, %o5, %g3
1373         ENCRYPT_128_2(8, 0, 2, 4, 6, 56, 58, 60, 62)
1374         ldd             [%o1 + 0x00], %f56
1375         ldd             [%o1 + 0x08], %f58
1376         ldd             [%o1 + 0x10], %f60
1377         ldd             [%o1 + 0x18], %f62
1378         fxor            %f56, %f0, %f56
1379         fxor            %f58, %f2, %f58
1380         fxor            %f60, %f4, %f60
1381         fxor            %f62, %f6, %f62
1382         std             %f56, [%o2 + 0x00]
1383         std             %f58, [%o2 + 0x08]
1384         std             %f60, [%o2 + 0x10]
1385         std             %f62, [%o2 + 0x18]
1386         subcc           %o3, 0x20, %o3
1387         add             %o1, 0x20, %o1
1388         brgz            %o3, 1b
1389          add            %o2, 0x20, %o2
1390         brlz,pt         %o3, 11f
1391          nop
1392 10:     xor             %g1, %g3, %o5
1393         MOVXTOD_O5_F0
1394         xor             %g2, %g7, %o5
1395         MOVXTOD_O5_F2
1396         add             %g7, 1, %g7
1397         add             %g3, 1, %o5
1398         movrz           %g7, %o5, %g3
1399         ENCRYPT_128(8, 0, 2, 4, 6)
1400         ldd             [%o1 + 0x00], %f4
1401         ldd             [%o1 + 0x08], %f6
1402         fxor            %f4, %f0, %f4
1403         fxor            %f6, %f2, %f6
1404         std             %f4, [%o2 + 0x00]
1405         std             %f6, [%o2 + 0x08]
1406 11:     stx             %g3, [%o4 + 0x00]
1407         retl
1408          stx            %g7, [%o4 + 0x08]
1409 ENDPROC(aes_sparc64_ctr_crypt_128)
1410
1411         .align          32
1412 ENTRY(aes_sparc64_ctr_crypt_192)
1413         /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1414         ldx             [%o4 + 0x00], %g3
1415         ldx             [%o4 + 0x08], %g7
1416         subcc           %o3, 0x10, %o3
1417         ldx             [%o0 + 0x00], %g1
1418         be              10f
1419          ldx            [%o0 + 0x08], %g2
1420 1:      xor             %g1, %g3, %o5
1421         MOVXTOD_O5_F0
1422         xor             %g2, %g7, %o5
1423         MOVXTOD_O5_F2
1424         add             %g7, 1, %g7
1425         add             %g3, 1, %o5
1426         movrz           %g7, %o5, %g3
1427         xor             %g1, %g3, %o5
1428         MOVXTOD_O5_F4
1429         xor             %g2, %g7, %o5
1430         MOVXTOD_O5_F6
1431         add             %g7, 1, %g7
1432         add             %g3, 1, %o5
1433         movrz           %g7, %o5, %g3
1434         ENCRYPT_192_2(8, 0, 2, 4, 6, 56, 58, 60, 62)
1435         ldd             [%o1 + 0x00], %f56
1436         ldd             [%o1 + 0x08], %f58
1437         ldd             [%o1 + 0x10], %f60
1438         ldd             [%o1 + 0x18], %f62
1439         fxor            %f56, %f0, %f56
1440         fxor            %f58, %f2, %f58
1441         fxor            %f60, %f4, %f60
1442         fxor            %f62, %f6, %f62
1443         std             %f56, [%o2 + 0x00]
1444         std             %f58, [%o2 + 0x08]
1445         std             %f60, [%o2 + 0x10]
1446         std             %f62, [%o2 + 0x18]
1447         subcc           %o3, 0x20, %o3
1448         add             %o1, 0x20, %o1
1449         brgz            %o3, 1b
1450          add            %o2, 0x20, %o2
1451         brlz,pt         %o3, 11f
1452          nop
1453 10:     xor             %g1, %g3, %o5
1454         MOVXTOD_O5_F0
1455         xor             %g2, %g7, %o5
1456         MOVXTOD_O5_F2
1457         add             %g7, 1, %g7
1458         add             %g3, 1, %o5
1459         movrz           %g7, %o5, %g3
1460         ENCRYPT_192(8, 0, 2, 4, 6)
1461         ldd             [%o1 + 0x00], %f4
1462         ldd             [%o1 + 0x08], %f6
1463         fxor            %f4, %f0, %f4
1464         fxor            %f6, %f2, %f6
1465         std             %f4, [%o2 + 0x00]
1466         std             %f6, [%o2 + 0x08]
1467 11:     stx             %g3, [%o4 + 0x00]
1468         retl
1469          stx            %g7, [%o4 + 0x08]
1470 ENDPROC(aes_sparc64_ctr_crypt_192)
1471
1472         .align          32
1473 ENTRY(aes_sparc64_ctr_crypt_256)
1474         /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1475         ldx             [%o4 + 0x00], %g3
1476         ldx             [%o4 + 0x08], %g7
1477         subcc           %o3, 0x10, %o3
1478         ldx             [%o0 + 0x00], %g1
1479         be              10f
1480          ldx            [%o0 + 0x08], %g2
1481 1:      xor             %g1, %g3, %o5
1482         MOVXTOD_O5_F0
1483         xor             %g2, %g7, %o5
1484         MOVXTOD_O5_F2
1485         add             %g7, 1, %g7
1486         add             %g3, 1, %o5
1487         movrz           %g7, %o5, %g3
1488         xor             %g1, %g3, %o5
1489         MOVXTOD_O5_F4
1490         xor             %g2, %g7, %o5
1491         MOVXTOD_O5_F6
1492         add             %g7, 1, %g7
1493         add             %g3, 1, %o5
1494         movrz           %g7, %o5, %g3
1495         ENCRYPT_256_2(8, 0, 2, 4, 6)
1496         ldd             [%o1 + 0x00], %f56
1497         ldd             [%o1 + 0x08], %f58
1498         ldd             [%o1 + 0x10], %f60
1499         ldd             [%o1 + 0x18], %f62
1500         fxor            %f56, %f0, %f56
1501         fxor            %f58, %f2, %f58
1502         fxor            %f60, %f4, %f60
1503         fxor            %f62, %f6, %f62
1504         std             %f56, [%o2 + 0x00]
1505         std             %f58, [%o2 + 0x08]
1506         std             %f60, [%o2 + 0x10]
1507         std             %f62, [%o2 + 0x18]
1508         subcc           %o3, 0x20, %o3
1509         add             %o1, 0x20, %o1
1510         brgz            %o3, 1b
1511          add            %o2, 0x20, %o2
1512         brlz,pt         %o3, 11f
1513          nop
1514         ldd             [%o0 + 0xd0], %f56
1515         ldd             [%o0 + 0xd8], %f58
1516         ldd             [%o0 + 0xe0], %f60
1517         ldd             [%o0 + 0xe8], %f62
1518 10:     xor             %g1, %g3, %o5
1519         MOVXTOD_O5_F0
1520         xor             %g2, %g7, %o5
1521         MOVXTOD_O5_F2
1522         add             %g7, 1, %g7
1523         add             %g3, 1, %o5
1524         movrz           %g7, %o5, %g3
1525         ENCRYPT_256(8, 0, 2, 4, 6)
1526         ldd             [%o1 + 0x00], %f4
1527         ldd             [%o1 + 0x08], %f6
1528         fxor            %f4, %f0, %f4
1529         fxor            %f6, %f2, %f6
1530         std             %f4, [%o2 + 0x00]
1531         std             %f6, [%o2 + 0x08]
1532 11:     stx             %g3, [%o4 + 0x00]
1533         retl
1534          stx            %g7, [%o4 + 0x08]
1535 ENDPROC(aes_sparc64_ctr_crypt_256)