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