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