Linux Audio

Check our new training course

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