GNU Linux-libre 4.9.296-gnu1
[releases.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:     ldd             [%o0 + 0xd0], %f56
1028         ldd             [%o0 + 0xd8], %f58
1029         ldd             [%o0 + 0xe0], %f60
1030         ldd             [%o0 + 0xe8], %f62
1031         ldx             [%o1 + 0x00], %g3
1032         ldx             [%o1 + 0x08], %g7
1033         xor             %g1, %g3, %g3
1034         xor             %g2, %g7, %g7
1035         MOVXTOD_G3_F4
1036         MOVXTOD_G7_F6
1037         ENCRYPT_256(8, 4, 6, 0, 2)
1038         std             %f4, [%o2 + 0x00]
1039         std             %f6, [%o2 + 0x08]
1040 11:     retl
1041          nop
1042 ENDPROC(aes_sparc64_ecb_encrypt_256)
1043
1044         .align          32
1045 ENTRY(aes_sparc64_ecb_decrypt_128)
1046         /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
1047         ldx             [%o0 - 0x10], %g1
1048         subcc           %o3, 0x10, %o3
1049         be              10f
1050          ldx            [%o0 - 0x08], %g2
1051 1:      ldx             [%o1 + 0x00], %g3
1052         ldx             [%o1 + 0x08], %g7
1053         ldx             [%o1 + 0x10], %o4
1054         ldx             [%o1 + 0x18], %o5
1055         xor             %g1, %g3, %g3
1056         xor             %g2, %g7, %g7
1057         MOVXTOD_G3_F4
1058         MOVXTOD_G7_F6
1059         xor             %g1, %o4, %g3
1060         xor             %g2, %o5, %g7
1061         MOVXTOD_G3_F60
1062         MOVXTOD_G7_F62
1063         DECRYPT_128_2(8, 4, 6, 60, 62, 0, 2, 56, 58)
1064         std             %f4, [%o2 + 0x00]
1065         std             %f6, [%o2 + 0x08]
1066         std             %f60, [%o2 + 0x10]
1067         std             %f62, [%o2 + 0x18]
1068         sub             %o3, 0x20, %o3
1069         add             %o1, 0x20, %o1
1070         brgz,pt         %o3, 1b
1071          add            %o2, 0x20, %o2
1072         brlz,pt         %o3, 11f
1073          nop
1074 10:     ldx             [%o1 + 0x00], %g3
1075         ldx             [%o1 + 0x08], %g7
1076         xor             %g1, %g3, %g3
1077         xor             %g2, %g7, %g7
1078         MOVXTOD_G3_F4
1079         MOVXTOD_G7_F6
1080         DECRYPT_128(8, 4, 6, 0, 2)
1081         std             %f4, [%o2 + 0x00]
1082         std             %f6, [%o2 + 0x08]
1083 11:     retl
1084          nop
1085 ENDPROC(aes_sparc64_ecb_decrypt_128)
1086
1087         .align          32
1088 ENTRY(aes_sparc64_ecb_decrypt_192)
1089         /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
1090         ldx             [%o0 - 0x10], %g1
1091         subcc           %o3, 0x10, %o3
1092         be              10f
1093          ldx            [%o0 - 0x08], %g2
1094 1:      ldx             [%o1 + 0x00], %g3
1095         ldx             [%o1 + 0x08], %g7
1096         ldx             [%o1 + 0x10], %o4
1097         ldx             [%o1 + 0x18], %o5
1098         xor             %g1, %g3, %g3
1099         xor             %g2, %g7, %g7
1100         MOVXTOD_G3_F4
1101         MOVXTOD_G7_F6
1102         xor             %g1, %o4, %g3
1103         xor             %g2, %o5, %g7
1104         MOVXTOD_G3_F60
1105         MOVXTOD_G7_F62
1106         DECRYPT_192_2(8, 4, 6, 60, 62, 0, 2, 56, 58)
1107         std             %f4, [%o2 + 0x00]
1108         std             %f6, [%o2 + 0x08]
1109         std             %f60, [%o2 + 0x10]
1110         std             %f62, [%o2 + 0x18]
1111         sub             %o3, 0x20, %o3
1112         add             %o1, 0x20, %o1
1113         brgz,pt         %o3, 1b
1114          add            %o2, 0x20, %o2
1115         brlz,pt         %o3, 11f
1116          nop
1117 10:     ldx             [%o1 + 0x00], %g3
1118         ldx             [%o1 + 0x08], %g7
1119         xor             %g1, %g3, %g3
1120         xor             %g2, %g7, %g7
1121         MOVXTOD_G3_F4
1122         MOVXTOD_G7_F6
1123         DECRYPT_192(8, 4, 6, 0, 2)
1124         std             %f4, [%o2 + 0x00]
1125         std             %f6, [%o2 + 0x08]
1126 11:     retl
1127          nop
1128 ENDPROC(aes_sparc64_ecb_decrypt_192)
1129
1130         .align          32
1131 ENTRY(aes_sparc64_ecb_decrypt_256)
1132         /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
1133         ldx             [%o0 - 0x10], %g1
1134         subcc           %o3, 0x10, %o3
1135         ldx             [%o0 - 0x08], %g2
1136         be              10f
1137          sub            %o0, 0xf0, %o0
1138 1:      ldx             [%o1 + 0x00], %g3
1139         ldx             [%o1 + 0x08], %g7
1140         ldx             [%o1 + 0x10], %o4
1141         ldx             [%o1 + 0x18], %o5
1142         xor             %g1, %g3, %g3
1143         xor             %g2, %g7, %g7
1144         MOVXTOD_G3_F4
1145         MOVXTOD_G7_F6
1146         xor             %g1, %o4, %g3
1147         xor             %g2, %o5, %g7
1148         MOVXTOD_G3_F0
1149         MOVXTOD_G7_F2
1150         DECRYPT_256_2(8, 4, 6, 0, 2)
1151         std             %f4, [%o2 + 0x00]
1152         std             %f6, [%o2 + 0x08]
1153         std             %f0, [%o2 + 0x10]
1154         std             %f2, [%o2 + 0x18]
1155         sub             %o3, 0x20, %o3
1156         add             %o1, 0x20, %o1
1157         brgz,pt         %o3, 1b
1158          add            %o2, 0x20, %o2
1159         brlz,pt         %o3, 11f
1160          nop
1161 10:     ldd             [%o0 + 0x18], %f56
1162         ldd             [%o0 + 0x10], %f58
1163         ldd             [%o0 + 0x08], %f60
1164         ldd             [%o0 + 0x00], %f62
1165         ldx             [%o1 + 0x00], %g3
1166         ldx             [%o1 + 0x08], %g7
1167         xor             %g1, %g3, %g3
1168         xor             %g2, %g7, %g7
1169         MOVXTOD_G3_F4
1170         MOVXTOD_G7_F6
1171         DECRYPT_256(8, 4, 6, 0, 2)
1172         std             %f4, [%o2 + 0x00]
1173         std             %f6, [%o2 + 0x08]
1174 11:     retl
1175          nop
1176 ENDPROC(aes_sparc64_ecb_decrypt_256)
1177
1178         .align          32
1179 ENTRY(aes_sparc64_cbc_encrypt_128)
1180         /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1181         ldd             [%o4 + 0x00], %f4
1182         ldd             [%o4 + 0x08], %f6
1183         ldx             [%o0 + 0x00], %g1
1184         ldx             [%o0 + 0x08], %g2
1185 1:      ldx             [%o1 + 0x00], %g3
1186         ldx             [%o1 + 0x08], %g7
1187         add             %o1, 0x10, %o1
1188         xor             %g1, %g3, %g3
1189         xor             %g2, %g7, %g7
1190         MOVXTOD_G3_F0
1191         MOVXTOD_G7_F2
1192         fxor            %f4, %f0, %f4
1193         fxor            %f6, %f2, %f6
1194         ENCRYPT_128(8, 4, 6, 0, 2)
1195         std             %f4, [%o2 + 0x00]
1196         std             %f6, [%o2 + 0x08]
1197         subcc           %o3, 0x10, %o3
1198         bne,pt          %xcc, 1b
1199          add            %o2, 0x10, %o2
1200         std             %f4, [%o4 + 0x00]
1201         std             %f6, [%o4 + 0x08]
1202         retl
1203          nop
1204 ENDPROC(aes_sparc64_cbc_encrypt_128)
1205
1206         .align          32
1207 ENTRY(aes_sparc64_cbc_encrypt_192)
1208         /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1209         ldd             [%o4 + 0x00], %f4
1210         ldd             [%o4 + 0x08], %f6
1211         ldx             [%o0 + 0x00], %g1
1212         ldx             [%o0 + 0x08], %g2
1213 1:      ldx             [%o1 + 0x00], %g3
1214         ldx             [%o1 + 0x08], %g7
1215         add             %o1, 0x10, %o1
1216         xor             %g1, %g3, %g3
1217         xor             %g2, %g7, %g7
1218         MOVXTOD_G3_F0
1219         MOVXTOD_G7_F2
1220         fxor            %f4, %f0, %f4
1221         fxor            %f6, %f2, %f6
1222         ENCRYPT_192(8, 4, 6, 0, 2)
1223         std             %f4, [%o2 + 0x00]
1224         std             %f6, [%o2 + 0x08]
1225         subcc           %o3, 0x10, %o3
1226         bne,pt          %xcc, 1b
1227          add            %o2, 0x10, %o2
1228         std             %f4, [%o4 + 0x00]
1229         std             %f6, [%o4 + 0x08]
1230         retl
1231          nop
1232 ENDPROC(aes_sparc64_cbc_encrypt_192)
1233
1234         .align          32
1235 ENTRY(aes_sparc64_cbc_encrypt_256)
1236         /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1237         ldd             [%o4 + 0x00], %f4
1238         ldd             [%o4 + 0x08], %f6
1239         ldx             [%o0 + 0x00], %g1
1240         ldx             [%o0 + 0x08], %g2
1241 1:      ldx             [%o1 + 0x00], %g3
1242         ldx             [%o1 + 0x08], %g7
1243         add             %o1, 0x10, %o1
1244         xor             %g1, %g3, %g3
1245         xor             %g2, %g7, %g7
1246         MOVXTOD_G3_F0
1247         MOVXTOD_G7_F2
1248         fxor            %f4, %f0, %f4
1249         fxor            %f6, %f2, %f6
1250         ENCRYPT_256(8, 4, 6, 0, 2)
1251         std             %f4, [%o2 + 0x00]
1252         std             %f6, [%o2 + 0x08]
1253         subcc           %o3, 0x10, %o3
1254         bne,pt          %xcc, 1b
1255          add            %o2, 0x10, %o2
1256         std             %f4, [%o4 + 0x00]
1257         std             %f6, [%o4 + 0x08]
1258         retl
1259          nop
1260 ENDPROC(aes_sparc64_cbc_encrypt_256)
1261
1262         .align          32
1263 ENTRY(aes_sparc64_cbc_decrypt_128)
1264         /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1265         ldx             [%o0 - 0x10], %g1
1266         ldx             [%o0 - 0x08], %g2
1267         ldx             [%o4 + 0x00], %o0
1268         ldx             [%o4 + 0x08], %o5
1269 1:      ldx             [%o1 + 0x00], %g3
1270         ldx             [%o1 + 0x08], %g7
1271         add             %o1, 0x10, %o1
1272         xor             %g1, %g3, %g3
1273         xor             %g2, %g7, %g7
1274         MOVXTOD_G3_F4
1275         MOVXTOD_G7_F6
1276         DECRYPT_128(8, 4, 6, 0, 2)
1277         MOVXTOD_O0_F0
1278         MOVXTOD_O5_F2
1279         xor             %g1, %g3, %o0
1280         xor             %g2, %g7, %o5
1281         fxor            %f4, %f0, %f4
1282         fxor            %f6, %f2, %f6
1283         std             %f4, [%o2 + 0x00]
1284         std             %f6, [%o2 + 0x08]
1285         subcc           %o3, 0x10, %o3
1286         bne,pt          %xcc, 1b
1287          add            %o2, 0x10, %o2
1288         stx             %o0, [%o4 + 0x00]
1289         stx             %o5, [%o4 + 0x08]
1290         retl
1291          nop
1292 ENDPROC(aes_sparc64_cbc_decrypt_128)
1293
1294         .align          32
1295 ENTRY(aes_sparc64_cbc_decrypt_192)
1296         /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1297         ldx             [%o0 - 0x10], %g1
1298         ldx             [%o0 - 0x08], %g2
1299         ldx             [%o4 + 0x00], %o0
1300         ldx             [%o4 + 0x08], %o5
1301 1:      ldx             [%o1 + 0x00], %g3
1302         ldx             [%o1 + 0x08], %g7
1303         add             %o1, 0x10, %o1
1304         xor             %g1, %g3, %g3
1305         xor             %g2, %g7, %g7
1306         MOVXTOD_G3_F4
1307         MOVXTOD_G7_F6
1308         DECRYPT_192(8, 4, 6, 0, 2)
1309         MOVXTOD_O0_F0
1310         MOVXTOD_O5_F2
1311         xor             %g1, %g3, %o0
1312         xor             %g2, %g7, %o5
1313         fxor            %f4, %f0, %f4
1314         fxor            %f6, %f2, %f6
1315         std             %f4, [%o2 + 0x00]
1316         std             %f6, [%o2 + 0x08]
1317         subcc           %o3, 0x10, %o3
1318         bne,pt          %xcc, 1b
1319          add            %o2, 0x10, %o2
1320         stx             %o0, [%o4 + 0x00]
1321         stx             %o5, [%o4 + 0x08]
1322         retl
1323          nop
1324 ENDPROC(aes_sparc64_cbc_decrypt_192)
1325
1326         .align          32
1327 ENTRY(aes_sparc64_cbc_decrypt_256)
1328         /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1329         ldx             [%o0 - 0x10], %g1
1330         ldx             [%o0 - 0x08], %g2
1331         ldx             [%o4 + 0x00], %o0
1332         ldx             [%o4 + 0x08], %o5
1333 1:      ldx             [%o1 + 0x00], %g3
1334         ldx             [%o1 + 0x08], %g7
1335         add             %o1, 0x10, %o1
1336         xor             %g1, %g3, %g3
1337         xor             %g2, %g7, %g7
1338         MOVXTOD_G3_F4
1339         MOVXTOD_G7_F6
1340         DECRYPT_256(8, 4, 6, 0, 2)
1341         MOVXTOD_O0_F0
1342         MOVXTOD_O5_F2
1343         xor             %g1, %g3, %o0
1344         xor             %g2, %g7, %o5
1345         fxor            %f4, %f0, %f4
1346         fxor            %f6, %f2, %f6
1347         std             %f4, [%o2 + 0x00]
1348         std             %f6, [%o2 + 0x08]
1349         subcc           %o3, 0x10, %o3
1350         bne,pt          %xcc, 1b
1351          add            %o2, 0x10, %o2
1352         stx             %o0, [%o4 + 0x00]
1353         stx             %o5, [%o4 + 0x08]
1354         retl
1355          nop
1356 ENDPROC(aes_sparc64_cbc_decrypt_256)
1357
1358         .align          32
1359 ENTRY(aes_sparc64_ctr_crypt_128)
1360         /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1361         ldx             [%o4 + 0x00], %g3
1362         ldx             [%o4 + 0x08], %g7
1363         subcc           %o3, 0x10, %o3
1364         ldx             [%o0 + 0x00], %g1
1365         be              10f
1366          ldx            [%o0 + 0x08], %g2
1367 1:      xor             %g1, %g3, %o5
1368         MOVXTOD_O5_F0
1369         xor             %g2, %g7, %o5
1370         MOVXTOD_O5_F2
1371         add             %g7, 1, %g7
1372         add             %g3, 1, %o5
1373         movrz           %g7, %o5, %g3
1374         xor             %g1, %g3, %o5
1375         MOVXTOD_O5_F4
1376         xor             %g2, %g7, %o5
1377         MOVXTOD_O5_F6
1378         add             %g7, 1, %g7
1379         add             %g3, 1, %o5
1380         movrz           %g7, %o5, %g3
1381         ENCRYPT_128_2(8, 0, 2, 4, 6, 56, 58, 60, 62)
1382         ldd             [%o1 + 0x00], %f56
1383         ldd             [%o1 + 0x08], %f58
1384         ldd             [%o1 + 0x10], %f60
1385         ldd             [%o1 + 0x18], %f62
1386         fxor            %f56, %f0, %f56
1387         fxor            %f58, %f2, %f58
1388         fxor            %f60, %f4, %f60
1389         fxor            %f62, %f6, %f62
1390         std             %f56, [%o2 + 0x00]
1391         std             %f58, [%o2 + 0x08]
1392         std             %f60, [%o2 + 0x10]
1393         std             %f62, [%o2 + 0x18]
1394         subcc           %o3, 0x20, %o3
1395         add             %o1, 0x20, %o1
1396         brgz            %o3, 1b
1397          add            %o2, 0x20, %o2
1398         brlz,pt         %o3, 11f
1399          nop
1400 10:     xor             %g1, %g3, %o5
1401         MOVXTOD_O5_F0
1402         xor             %g2, %g7, %o5
1403         MOVXTOD_O5_F2
1404         add             %g7, 1, %g7
1405         add             %g3, 1, %o5
1406         movrz           %g7, %o5, %g3
1407         ENCRYPT_128(8, 0, 2, 4, 6)
1408         ldd             [%o1 + 0x00], %f4
1409         ldd             [%o1 + 0x08], %f6
1410         fxor            %f4, %f0, %f4
1411         fxor            %f6, %f2, %f6
1412         std             %f4, [%o2 + 0x00]
1413         std             %f6, [%o2 + 0x08]
1414 11:     stx             %g3, [%o4 + 0x00]
1415         retl
1416          stx            %g7, [%o4 + 0x08]
1417 ENDPROC(aes_sparc64_ctr_crypt_128)
1418
1419         .align          32
1420 ENTRY(aes_sparc64_ctr_crypt_192)
1421         /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1422         ldx             [%o4 + 0x00], %g3
1423         ldx             [%o4 + 0x08], %g7
1424         subcc           %o3, 0x10, %o3
1425         ldx             [%o0 + 0x00], %g1
1426         be              10f
1427          ldx            [%o0 + 0x08], %g2
1428 1:      xor             %g1, %g3, %o5
1429         MOVXTOD_O5_F0
1430         xor             %g2, %g7, %o5
1431         MOVXTOD_O5_F2
1432         add             %g7, 1, %g7
1433         add             %g3, 1, %o5
1434         movrz           %g7, %o5, %g3
1435         xor             %g1, %g3, %o5
1436         MOVXTOD_O5_F4
1437         xor             %g2, %g7, %o5
1438         MOVXTOD_O5_F6
1439         add             %g7, 1, %g7
1440         add             %g3, 1, %o5
1441         movrz           %g7, %o5, %g3
1442         ENCRYPT_192_2(8, 0, 2, 4, 6, 56, 58, 60, 62)
1443         ldd             [%o1 + 0x00], %f56
1444         ldd             [%o1 + 0x08], %f58
1445         ldd             [%o1 + 0x10], %f60
1446         ldd             [%o1 + 0x18], %f62
1447         fxor            %f56, %f0, %f56
1448         fxor            %f58, %f2, %f58
1449         fxor            %f60, %f4, %f60
1450         fxor            %f62, %f6, %f62
1451         std             %f56, [%o2 + 0x00]
1452         std             %f58, [%o2 + 0x08]
1453         std             %f60, [%o2 + 0x10]
1454         std             %f62, [%o2 + 0x18]
1455         subcc           %o3, 0x20, %o3
1456         add             %o1, 0x20, %o1
1457         brgz            %o3, 1b
1458          add            %o2, 0x20, %o2
1459         brlz,pt         %o3, 11f
1460          nop
1461 10:     xor             %g1, %g3, %o5
1462         MOVXTOD_O5_F0
1463         xor             %g2, %g7, %o5
1464         MOVXTOD_O5_F2
1465         add             %g7, 1, %g7
1466         add             %g3, 1, %o5
1467         movrz           %g7, %o5, %g3
1468         ENCRYPT_192(8, 0, 2, 4, 6)
1469         ldd             [%o1 + 0x00], %f4
1470         ldd             [%o1 + 0x08], %f6
1471         fxor            %f4, %f0, %f4
1472         fxor            %f6, %f2, %f6
1473         std             %f4, [%o2 + 0x00]
1474         std             %f6, [%o2 + 0x08]
1475 11:     stx             %g3, [%o4 + 0x00]
1476         retl
1477          stx            %g7, [%o4 + 0x08]
1478 ENDPROC(aes_sparc64_ctr_crypt_192)
1479
1480         .align          32
1481 ENTRY(aes_sparc64_ctr_crypt_256)
1482         /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1483         ldx             [%o4 + 0x00], %g3
1484         ldx             [%o4 + 0x08], %g7
1485         subcc           %o3, 0x10, %o3
1486         ldx             [%o0 + 0x00], %g1
1487         be              10f
1488          ldx            [%o0 + 0x08], %g2
1489 1:      xor             %g1, %g3, %o5
1490         MOVXTOD_O5_F0
1491         xor             %g2, %g7, %o5
1492         MOVXTOD_O5_F2
1493         add             %g7, 1, %g7
1494         add             %g3, 1, %o5
1495         movrz           %g7, %o5, %g3
1496         xor             %g1, %g3, %o5
1497         MOVXTOD_O5_F4
1498         xor             %g2, %g7, %o5
1499         MOVXTOD_O5_F6
1500         add             %g7, 1, %g7
1501         add             %g3, 1, %o5
1502         movrz           %g7, %o5, %g3
1503         ENCRYPT_256_2(8, 0, 2, 4, 6)
1504         ldd             [%o1 + 0x00], %f56
1505         ldd             [%o1 + 0x08], %f58
1506         ldd             [%o1 + 0x10], %f60
1507         ldd             [%o1 + 0x18], %f62
1508         fxor            %f56, %f0, %f56
1509         fxor            %f58, %f2, %f58
1510         fxor            %f60, %f4, %f60
1511         fxor            %f62, %f6, %f62
1512         std             %f56, [%o2 + 0x00]
1513         std             %f58, [%o2 + 0x08]
1514         std             %f60, [%o2 + 0x10]
1515         std             %f62, [%o2 + 0x18]
1516         subcc           %o3, 0x20, %o3
1517         add             %o1, 0x20, %o1
1518         brgz            %o3, 1b
1519          add            %o2, 0x20, %o2
1520         brlz,pt         %o3, 11f
1521          nop
1522 10:     ldd             [%o0 + 0xd0], %f56
1523         ldd             [%o0 + 0xd8], %f58
1524         ldd             [%o0 + 0xe0], %f60
1525         ldd             [%o0 + 0xe8], %f62
1526         xor             %g1, %g3, %o5
1527         MOVXTOD_O5_F0
1528         xor             %g2, %g7, %o5
1529         MOVXTOD_O5_F2
1530         add             %g7, 1, %g7
1531         add             %g3, 1, %o5
1532         movrz           %g7, %o5, %g3
1533         ENCRYPT_256(8, 0, 2, 4, 6)
1534         ldd             [%o1 + 0x00], %f4
1535         ldd             [%o1 + 0x08], %f6
1536         fxor            %f4, %f0, %f4
1537         fxor            %f6, %f2, %f6
1538         std             %f4, [%o2 + 0x00]
1539         std             %f6, [%o2 + 0x08]
1540 11:     stx             %g3, [%o4 + 0x00]
1541         retl
1542          stx            %g7, [%o4 + 0x08]
1543 ENDPROC(aes_sparc64_ctr_crypt_256)