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