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