Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   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)