Home | History | Annotate | Line # | Download | only in sparc
      1 #ifndef __ASSEMBLER__
      2 # define __ASSEMBLER__ 1
      3 #endif
      4 #include "crypto/sparc_arch.h"
      5 
      6 #define LOCALS (STACK_BIAS+STACK_FRAME)
      7 
      8 .text
      9 
     10 .globl	aes_fx_encrypt
     11 .align	32
     12 aes_fx_encrypt:
     13 	and		%o0, 7, %o4		! is input aligned?
     14 	andn		%o0, 7, %o0
     15 	ldd		[%o2 +  0], %f6	! round[0]
     16 	ldd		[%o2 +  8], %f8
     17 	mov		%o7, %g1
     18 	ld		[%o2 + 240], %o3
     19 
     20 1:	call		.+8
     21 	add		%o7, .Linp_align-1b, %o7
     22 
     23 	sll		%o4, 3, %o4
     24 	ldd		[%o0 + 0], %f0		! load input
     25 	brz,pt		%o4, .Lenc_inp_aligned
     26 	ldd		[%o0 + 8], %f2
     27 
     28 	ldd		[%o7 + %o4], %f14	! shift left params
     29 	ldd		[%o0 + 16], %f4
     30 	.word	0x81b81d62 !fshiftorx	%f0,%f2,%f14,%f0
     31 	.word	0x85b89d64 !fshiftorx	%f2,%f4,%f14,%f2
     32 
     33 .Lenc_inp_aligned:
     34 	ldd		[%o2 + 16], %f10	! round[1]
     35 	ldd		[%o2 + 24], %f12
     36 
     37 	.word	0x81b00d86 !fxor	%f0,%f6,%f0		! ^=round[0]
     38 	.word	0x85b08d88 !fxor	%f2,%f8,%f2
     39 	ldd		[%o2 + 32], %f6	! round[2]
     40 	ldd		[%o2 + 40], %f8
     41 	add		%o2, 32, %o2
     42 	sub		%o3, 4, %o3
     43 
     44 .Loop_enc:
     45 	fmovd		%f0, %f4
     46 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
     47 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
     48 	ldd		[%o2 + 16], %f10
     49 	ldd		[%o2 + 24], %f12
     50 	add		%o2, 32, %o2
     51 
     52 	fmovd		%f0, %f4
     53 	.word	0x81b09206 !faesencx	%f2,%f6,%f0
     54 	.word	0x85b11208 !faesencx	%f4,%f8,%f2
     55 	ldd		[%o2 +  0], %f6
     56 	ldd		[%o2 +  8], %f8
     57 
     58 	brnz,a		%o3, .Loop_enc
     59 	sub		%o3, 2, %o3
     60 
     61 	andcc		%o1, 7, %o4		! is output aligned?
     62 	andn		%o1, 7, %o1
     63 	mov		0xff, %o5
     64 	srl		%o5, %o4, %o5
     65 	add		%o7, 64, %o7
     66 	sll		%o4, 3, %o4
     67 
     68 	fmovd		%f0, %f4
     69 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
     70 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
     71 	ldd		[%o7 + %o4], %f14	! shift right params
     72 
     73 	fmovd		%f0, %f4
     74 	.word	0x81b09246 !faesenclx	%f2,%f6,%f0
     75 	.word	0x85b11248 !faesenclx	%f4,%f8,%f2
     76 
     77 	bnz,pn		%icc, .Lenc_out_unaligned
     78 	mov		%g1, %o7
     79 
     80 	std		%f0, [%o1 + 0]
     81 	retl
     82 	std		%f2, [%o1 + 8]
     83 
     84 .align	16
     85 .Lenc_out_unaligned:
     86 	add		%o1, 16, %o0
     87 	orn		%g0, %o5, %o4
     88 	.word	0x89b81d60 !fshiftorx	%f0,%f0,%f14,%f4
     89 	.word	0x8db81d62 !fshiftorx	%f0,%f2,%f14,%f6
     90 	.word	0x91b89d62 !fshiftorx	%f2,%f2,%f14,%f8
     91 
     92 	stda		%f4, [%o1 + %o5]0xc0	! partial store
     93 	std		%f6, [%o1 + 8]
     94 	stda		%f8, [%o0 + %o4]0xc0	! partial store
     95 	retl
     96 	nop
     97 .type	aes_fx_encrypt,#function
     98 .size	aes_fx_encrypt,.-aes_fx_encrypt
     99 
    100 .globl	aes_fx_decrypt
    101 .align	32
    102 aes_fx_decrypt:
    103 	and		%o0, 7, %o4		! is input aligned?
    104 	andn		%o0, 7, %o0
    105 	ldd		[%o2 +  0], %f6	! round[0]
    106 	ldd		[%o2 +  8], %f8
    107 	mov		%o7, %g1
    108 	ld		[%o2 + 240], %o3
    109 
    110 1:	call		.+8
    111 	add		%o7, .Linp_align-1b, %o7
    112 
    113 	sll		%o4, 3, %o4
    114 	ldd		[%o0 + 0], %f0		! load input
    115 	brz,pt		%o4, .Ldec_inp_aligned
    116 	ldd		[%o0 + 8], %f2
    117 
    118 	ldd		[%o7 + %o4], %f14	! shift left params
    119 	ldd		[%o0 + 16], %f4
    120 	.word	0x81b81d62 !fshiftorx	%f0,%f2,%f14,%f0
    121 	.word	0x85b89d64 !fshiftorx	%f2,%f4,%f14,%f2
    122 
    123 .Ldec_inp_aligned:
    124 	ldd		[%o2 + 16], %f10	! round[1]
    125 	ldd		[%o2 + 24], %f12
    126 
    127 	.word	0x81b00d86 !fxor	%f0,%f6,%f0		! ^=round[0]
    128 	.word	0x85b08d88 !fxor	%f2,%f8,%f2
    129 	ldd		[%o2 + 32], %f6	! round[2]
    130 	ldd		[%o2 + 40], %f8
    131 	add		%o2, 32, %o2
    132 	sub		%o3, 4, %o3
    133 
    134 .Loop_dec:
    135 	fmovd		%f0, %f4
    136 	.word	0x81b0922a !faesdecx	%f2,%f10,%f0
    137 	.word	0x85b1122c !faesdecx	%f4,%f12,%f2
    138 	ldd		[%o2 + 16], %f10
    139 	ldd		[%o2 + 24], %f12
    140 	add		%o2, 32, %o2
    141 
    142 	fmovd		%f0, %f4
    143 	.word	0x81b09226 !faesdecx	%f2,%f6,%f0
    144 	.word	0x85b11228 !faesdecx	%f4,%f8,%f2
    145 	ldd		[%o2 +  0], %f6
    146 	ldd		[%o2 +  8], %f8
    147 
    148 	brnz,a		%o3, .Loop_dec
    149 	sub		%o3, 2, %o3
    150 
    151 	andcc		%o1, 7, %o4		! is output aligned?
    152 	andn		%o1, 7, %o1
    153 	mov		0xff, %o5
    154 	srl		%o5, %o4, %o5
    155 	add		%o7, 64, %o7
    156 	sll		%o4, 3, %o4
    157 
    158 	fmovd		%f0, %f4
    159 	.word	0x81b0922a !faesdecx	%f2,%f10,%f0
    160 	.word	0x85b1122c !faesdecx	%f4,%f12,%f2
    161 	ldd		[%o7 + %o4], %f14	! shift right params
    162 
    163 	fmovd		%f0, %f4
    164 	.word	0x81b09266 !faesdeclx	%f2,%f6,%f0
    165 	.word	0x85b11268 !faesdeclx	%f4,%f8,%f2
    166 
    167 	bnz,pn		%icc, .Ldec_out_unaligned
    168 	mov		%g1, %o7
    169 
    170 	std		%f0, [%o1 + 0]
    171 	retl
    172 	std		%f2, [%o1 + 8]
    173 
    174 .align	16
    175 .Ldec_out_unaligned:
    176 	add		%o1, 16, %o0
    177 	orn		%g0, %o5, %o4
    178 	.word	0x89b81d60 !fshiftorx	%f0,%f0,%f14,%f4
    179 	.word	0x8db81d62 !fshiftorx	%f0,%f2,%f14,%f6
    180 	.word	0x91b89d62 !fshiftorx	%f2,%f2,%f14,%f8
    181 
    182 	stda		%f4, [%o1 + %o5]0xc0	! partial store
    183 	std		%f6, [%o1 + 8]
    184 	stda		%f8, [%o0 + %o4]0xc0	! partial store
    185 	retl
    186 	nop
    187 .type	aes_fx_decrypt,#function
    188 .size	aes_fx_decrypt,.-aes_fx_decrypt
    189 .globl	aes_fx_set_decrypt_key
    190 .align	32
    191 aes_fx_set_decrypt_key:
    192 	b		.Lset_encrypt_key
    193 	mov		-1, %o4
    194 	retl
    195 	nop
    196 .type	aes_fx_set_decrypt_key,#function
    197 .size	aes_fx_set_decrypt_key,.-aes_fx_set_decrypt_key
    198 
    199 .globl	aes_fx_set_encrypt_key
    200 .align	32
    201 aes_fx_set_encrypt_key:
    202 	mov		1, %o4
    203 	nop
    204 .Lset_encrypt_key:
    205 	and		%o0, 7, %o3
    206 	andn		%o0, 7, %o0
    207 	sll		%o3, 3, %o3
    208 	mov		%o7, %g1
    209 
    210 1:	call		.+8
    211 	add		%o7, .Linp_align-1b, %o7
    212 
    213 	ldd		[%o7 + %o3], %f10	! shift left params
    214 	mov		%g1, %o7
    215 
    216 	cmp		%o1, 192
    217 	ldd		[%o0 + 0], %f0
    218 	bl,pt		%icc, .L128
    219 	ldd		[%o0 + 8], %f2
    220 
    221 	be,pt		%icc, .L192
    222 	ldd		[%o0 + 16], %f4
    223 	brz,pt		%o3, .L256aligned
    224 	ldd		[%o0 + 24], %f6
    225 
    226 	ldd		[%o0 + 32], %f8
    227 	.word	0x81b81562 !fshiftorx	%f0,%f2,%f10,%f0
    228 	.word	0x85b89564 !fshiftorx	%f2,%f4,%f10,%f2
    229 	.word	0x89b91566 !fshiftorx	%f4,%f6,%f10,%f4
    230 	.word	0x8db99568 !fshiftorx	%f6,%f8,%f10,%f6
    231 
    232 .L256aligned:
    233 	mov		14, %o1
    234 	and		%o4, 224, %o3
    235 	st		%o1, [%o2 + 240]	! store rounds
    236 	add		%o2, %o3, %o2	! start or end of key schedule
    237 	sllx		%o4, 4, %o4		! 16 or -16
    238 	std		%f0, [%o2 + 0]
    239 	.word	0x81b19290 !faeskeyx	%f6,16,%f0
    240 	std		%f2, [%o2 + 8]
    241 	add		%o2, %o4, %o2
    242 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    243 	std		%f4, [%o2 + 0]
    244 	.word	0x89b09281 !faeskeyx	%f2,0x01,%f4
    245 	std		%f6, [%o2 + 8]
    246 	add		%o2, %o4, %o2
    247 	.word	0x8db11280 !faeskeyx	%f4,0x00,%f6
    248 	std		%f0, [%o2 + 0]
    249 	.word	0x81b19291 !faeskeyx	%f6,17,%f0
    250 	std		%f2, [%o2 + 8]
    251 	add		%o2, %o4, %o2
    252 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    253 	std		%f4, [%o2 + 0]
    254 	.word	0x89b09281 !faeskeyx	%f2,0x01,%f4
    255 	std		%f6, [%o2 + 8]
    256 	add		%o2, %o4, %o2
    257 	.word	0x8db11280 !faeskeyx	%f4,0x00,%f6
    258 	std		%f0, [%o2 + 0]
    259 	.word	0x81b19292 !faeskeyx	%f6,18,%f0
    260 	std		%f2, [%o2 + 8]
    261 	add		%o2, %o4, %o2
    262 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    263 	std		%f4, [%o2 + 0]
    264 	.word	0x89b09281 !faeskeyx	%f2,0x01,%f4
    265 	std		%f6, [%o2 + 8]
    266 	add		%o2, %o4, %o2
    267 	.word	0x8db11280 !faeskeyx	%f4,0x00,%f6
    268 	std		%f0, [%o2 + 0]
    269 	.word	0x81b19293 !faeskeyx	%f6,19,%f0
    270 	std		%f2, [%o2 + 8]
    271 	add		%o2, %o4, %o2
    272 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    273 	std		%f4, [%o2 + 0]
    274 	.word	0x89b09281 !faeskeyx	%f2,0x01,%f4
    275 	std		%f6, [%o2 + 8]
    276 	add		%o2, %o4, %o2
    277 	.word	0x8db11280 !faeskeyx	%f4,0x00,%f6
    278 	std		%f0, [%o2 + 0]
    279 	.word	0x81b19294 !faeskeyx	%f6,20,%f0
    280 	std		%f2, [%o2 + 8]
    281 	add		%o2, %o4, %o2
    282 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    283 	std		%f4, [%o2 + 0]
    284 	.word	0x89b09281 !faeskeyx	%f2,0x01,%f4
    285 	std		%f6, [%o2 + 8]
    286 	add		%o2, %o4, %o2
    287 	.word	0x8db11280 !faeskeyx	%f4,0x00,%f6
    288 	std		%f0, [%o2 + 0]
    289 	.word	0x81b19295 !faeskeyx	%f6,21,%f0
    290 	std		%f2, [%o2 + 8]
    291 	add		%o2, %o4, %o2
    292 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    293 	std		%f4, [%o2 + 0]
    294 	.word	0x89b09281 !faeskeyx	%f2,0x01,%f4
    295 	std		%f6, [%o2 + 8]
    296 	add		%o2, %o4, %o2
    297 	.word	0x8db11280 !faeskeyx	%f4,0x00,%f6
    298 	std		%f0, [%o2 + 0]
    299 	.word	0x81b19296 !faeskeyx	%f6,22,%f0
    300 	std		%f2, [%o2 + 8]
    301 	add		%o2, %o4, %o2
    302 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    303 	std		%f4,[%o2 + 0]
    304 	std		%f6,[%o2 + 8]
    305 	add		%o2, %o4, %o2
    306 	std		%f0,[%o2 + 0]
    307 	std		%f2,[%o2 + 8]
    308 	retl
    309 	xor		%o0, %o0, %o0		! return 0
    310 
    311 .align	16
    312 .L192:
    313 	brz,pt		%o3, .L192aligned
    314 	nop
    315 
    316 	ldd		[%o0 + 24], %f6
    317 	.word	0x81b81562 !fshiftorx	%f0,%f2,%f10,%f0
    318 	.word	0x85b89564 !fshiftorx	%f2,%f4,%f10,%f2
    319 	.word	0x89b91566 !fshiftorx	%f4,%f6,%f10,%f4
    320 
    321 .L192aligned:
    322 	mov		12, %o1
    323 	and		%o4, 192, %o3
    324 	st		%o1, [%o2 + 240]	! store rounds
    325 	add		%o2, %o3, %o2	! start or end of key schedule
    326 	sllx		%o4, 4, %o4		! 16 or -16
    327 	std		%f0, [%o2 + 0]
    328 	.word	0x81b11290 !faeskeyx	%f4,16,%f0
    329 	std		%f2, [%o2 + 8]
    330 	add		%o2, %o4, %o2
    331 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    332 	std		%f4, [%o2 + 0]
    333 	.word	0x89b09280 !faeskeyx	%f2,0x00,%f4
    334 	std		%f0, [%o2 + 8]
    335 	add		%o2, %o4, %o2
    336 	.word	0x81b11291 !faeskeyx	%f4,17,%f0
    337 	std		%f2, [%o2 + 0]
    338 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    339 	std		%f4, [%o2 + 8]
    340 	add		%o2, %o4, %o2
    341 	.word	0x89b09280 !faeskeyx	%f2,0x00,%f4
    342 	std		%f0, [%o2 + 0]
    343 	.word	0x81b11292 !faeskeyx	%f4,18,%f0
    344 	std		%f2, [%o2 + 8]
    345 	add		%o2, %o4, %o2
    346 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    347 	std		%f4, [%o2 + 0]
    348 	.word	0x89b09280 !faeskeyx	%f2,0x00,%f4
    349 	std		%f0, [%o2 + 8]
    350 	add		%o2, %o4, %o2
    351 	.word	0x81b11293 !faeskeyx	%f4,19,%f0
    352 	std		%f2, [%o2 + 0]
    353 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    354 	std		%f4, [%o2 + 8]
    355 	add		%o2, %o4, %o2
    356 	.word	0x89b09280 !faeskeyx	%f2,0x00,%f4
    357 	std		%f0, [%o2 + 0]
    358 	.word	0x81b11294 !faeskeyx	%f4,20,%f0
    359 	std		%f2, [%o2 + 8]
    360 	add		%o2, %o4, %o2
    361 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    362 	std		%f4, [%o2 + 0]
    363 	.word	0x89b09280 !faeskeyx	%f2,0x00,%f4
    364 	std		%f0, [%o2 + 8]
    365 	add		%o2, %o4, %o2
    366 	.word	0x81b11295 !faeskeyx	%f4,21,%f0
    367 	std		%f2, [%o2 + 0]
    368 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    369 	std		%f4, [%o2 + 8]
    370 	add		%o2, %o4, %o2
    371 	.word	0x89b09280 !faeskeyx	%f2,0x00,%f4
    372 	std		%f0, [%o2 + 0]
    373 	.word	0x81b11296 !faeskeyx	%f4,22,%f0
    374 	std		%f2, [%o2 + 8]
    375 	add		%o2, %o4, %o2
    376 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    377 	std		%f4, [%o2 + 0]
    378 	.word	0x89b09280 !faeskeyx	%f2,0x00,%f4
    379 	std		%f0, [%o2 + 8]
    380 	add		%o2, %o4, %o2
    381 	.word	0x81b11297 !faeskeyx	%f4,23,%f0
    382 	std		%f2, [%o2 + 0]
    383 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    384 	std		%f4, [%o2 + 8]
    385 	add		%o2, %o4, %o2
    386 	std		%f0, [%o2 + 0]
    387 	std		%f2, [%o2 + 8]
    388 	retl
    389 	xor		%o0, %o0, %o0		! return 0
    390 
    391 .align	16
    392 .L128:
    393 	brz,pt		%o3, .L128aligned
    394 	nop
    395 
    396 	ldd		[%o0 + 16], %f4
    397 	.word	0x81b81562 !fshiftorx	%f0,%f2,%f10,%f0
    398 	.word	0x85b89564 !fshiftorx	%f2,%f4,%f10,%f2
    399 
    400 .L128aligned:
    401 	mov		10, %o1
    402 	and		%o4, 160, %o3
    403 	st		%o1, [%o2 + 240]	! store rounds
    404 	add		%o2, %o3, %o2	! start or end of key schedule
    405 	sllx		%o4, 4, %o4		! 16 or -16
    406 	std		%f0, [%o2 + 0]
    407 	.word	0x81b09290 !faeskeyx	%f2,16,%f0
    408 	std		%f2, [%o2 + 8]
    409 	add		%o2, %o4, %o2
    410 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    411 	std		%f0, [%o2 + 0]
    412 	.word	0x81b09291 !faeskeyx	%f2,17,%f0
    413 	std		%f2, [%o2 + 8]
    414 	add		%o2, %o4, %o2
    415 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    416 	std		%f0, [%o2 + 0]
    417 	.word	0x81b09292 !faeskeyx	%f2,18,%f0
    418 	std		%f2, [%o2 + 8]
    419 	add		%o2, %o4, %o2
    420 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    421 	std		%f0, [%o2 + 0]
    422 	.word	0x81b09293 !faeskeyx	%f2,19,%f0
    423 	std		%f2, [%o2 + 8]
    424 	add		%o2, %o4, %o2
    425 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    426 	std		%f0, [%o2 + 0]
    427 	.word	0x81b09294 !faeskeyx	%f2,20,%f0
    428 	std		%f2, [%o2 + 8]
    429 	add		%o2, %o4, %o2
    430 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    431 	std		%f0, [%o2 + 0]
    432 	.word	0x81b09295 !faeskeyx	%f2,21,%f0
    433 	std		%f2, [%o2 + 8]
    434 	add		%o2, %o4, %o2
    435 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    436 	std		%f0, [%o2 + 0]
    437 	.word	0x81b09296 !faeskeyx	%f2,22,%f0
    438 	std		%f2, [%o2 + 8]
    439 	add		%o2, %o4, %o2
    440 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    441 	std		%f0, [%o2 + 0]
    442 	.word	0x81b09297 !faeskeyx	%f2,23,%f0
    443 	std		%f2, [%o2 + 8]
    444 	add		%o2, %o4, %o2
    445 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    446 	std		%f0, [%o2 + 0]
    447 	.word	0x81b09298 !faeskeyx	%f2,24,%f0
    448 	std		%f2, [%o2 + 8]
    449 	add		%o2, %o4, %o2
    450 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    451 	std		%f0, [%o2 + 0]
    452 	.word	0x81b09299 !faeskeyx	%f2,25,%f0
    453 	std		%f2, [%o2 + 8]
    454 	add		%o2, %o4, %o2
    455 	.word	0x85b01280 !faeskeyx	%f0,0x00,%f2
    456 	std		%f0, [%o2 + 0]
    457 	std		%f2, [%o2 + 8]
    458 	retl
    459 	xor		%o0, %o0, %o0		! return 0
    460 .type	aes_fx_set_encrypt_key,#function
    461 .size	aes_fx_set_encrypt_key,.-aes_fx_set_encrypt_key
    462 .globl	aes_fx_cbc_encrypt
    463 .align	32
    464 aes_fx_cbc_encrypt:
    465 	save		%sp, -STACK_FRAME-16, %sp
    466 	srln		%i2, 4, %i2
    467 	and		%i0, 7, %l4
    468 	andn		%i0, 7, %i0
    469 	brz,pn		%i2, .Lcbc_no_data
    470 	sll		%l4, 3, %l4
    471 
    472 1:	call		.+8
    473 	add		%o7, .Linp_align-1b, %o7
    474 
    475 	ld		[%i3 + 240], %l0
    476 	and		%i1, 7, %l5
    477 	ld		[%i4 + 0], %f0		! load ivec
    478 	andn		%i1, 7, %i1
    479 	ld		[%i4 + 4], %f1
    480 	sll		%l5, 3, %l6
    481 	ld		[%i4 + 8], %f2
    482 	ld		[%i4 + 12], %f3
    483 
    484 	sll		%l0, 4, %l0
    485 	add		%l0, %i3, %l2
    486 	ldd		[%i3 + 0], %f20	! round[0]
    487 	ldd		[%i3 + 8], %f22
    488 
    489 	add		%i0, 16, %i0
    490 	sub		%i2,  1, %i2
    491 	ldd		[%l2 + 0], %f24	! round[last]
    492 	ldd		[%l2 + 8], %f26
    493 
    494 	mov		16, %l3
    495 	movrz		%i2, 0, %l3
    496 	ldd		[%i3 + 16], %f10	! round[1]
    497 	ldd		[%i3 + 24], %f12
    498 
    499 	ldd		[%o7 + %l4], %f36	! shift left params
    500 	add		%o7, 64, %o7
    501 	ldd		[%i0 - 16], %f28	! load input
    502 	ldd		[%i0 -  8], %f30
    503 	ldda		[%i0]0x82, %f32	! non-faulting load
    504 	brz		%i5, .Lcbc_decrypt
    505 	add		%i0, %l3, %i0	! inp+=16
    506 
    507 	.word	0x81b50d80 !fxor	%f20,%f0,%f0		! ivec^=round[0]
    508 	.word	0x85b58d82 !fxor	%f22,%f2,%f2
    509 	.word	0xb9bf0b7e !fshiftorx	%f28,%f30,%f36,%f28
    510 	.word	0xbdbf8b61 !fshiftorx	%f30,%f32,%f36,%f30
    511 	nop
    512 
    513 .Loop_cbc_enc:
    514 	.word	0x81b70d80 !fxor	%f28,%f0,%f0		! inp^ivec^round[0]
    515 	.word	0x85b78d82 !fxor	%f30,%f2,%f2
    516 	ldd		[%i3 + 32], %f6	! round[2]
    517 	ldd		[%i3 + 40], %f8
    518 	add		%i3, 32, %l2
    519 	sub		%l0, 16*6, %l1
    520 
    521 .Lcbc_enc:
    522 	fmovd		%f0, %f4
    523 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
    524 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
    525 	ldd		[%l2 + 16], %f10
    526 	ldd		[%l2 + 24], %f12
    527 	add		%l2, 32, %l2
    528 
    529 	fmovd		%f0, %f4
    530 	.word	0x81b09206 !faesencx	%f2,%f6,%f0
    531 	.word	0x85b11208 !faesencx	%f4,%f8,%f2
    532 	ldd		[%l2 + 0], %f6
    533 	ldd		[%l2 + 8], %f8
    534 
    535 	brnz,a		%l1, .Lcbc_enc
    536 	sub		%l1, 16*2, %l1
    537 
    538 	fmovd		%f0, %f4
    539 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
    540 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
    541 	ldd		[%l2 + 16], %f10	! round[last-1]
    542 	ldd		[%l2 + 24], %f12
    543 
    544 	movrz		%i2, 0, %l3
    545 	fmovd		%f32, %f28
    546 	ldd		[%i0 - 8], %f30	! load next input block
    547 	ldda		[%i0]0x82, %f32	! non-faulting load
    548 	add		%i0, %l3, %i0	! inp+=16
    549 
    550 	fmovd		%f0, %f4
    551 	.word	0x81b09206 !faesencx	%f2,%f6,%f0
    552 	.word	0x85b11208 !faesencx	%f4,%f8,%f2
    553 
    554 	.word	0xb9bf0b7e !fshiftorx	%f28,%f30,%f36,%f28
    555 	.word	0xbdbf8b61 !fshiftorx	%f30,%f32,%f36,%f30
    556 
    557 	fmovd		%f0, %f4
    558 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
    559 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
    560 	ldd		[%i3 + 16], %f10	! round[1]
    561 	ldd		[%i3 + 24], %f12
    562 
    563 	.word	0xb9b50d9c !fxor	%f20,%f28,%f28	! inp^=round[0]
    564 	.word	0xbdb58d9e !fxor	%f22,%f30,%f30
    565 
    566 	fmovd		%f0, %f4
    567 	.word	0x81b09258 !faesenclx	%f2,%f24,%f0
    568 	.word	0x85b1125a !faesenclx	%f4,%f26,%f2
    569 
    570 	brnz,pn		%l5, .Lcbc_enc_unaligned_out
    571 	nop
    572 
    573 	std		%f0, [%i1 + 0]
    574 	std		%f2, [%i1 + 8]
    575 	add		%i1, 16, %i1
    576 
    577 	brnz,a		%i2, .Loop_cbc_enc
    578 	sub		%i2, 1, %i2
    579 
    580 	st		%f0, [%i4 + 0]		! output ivec
    581 	st		%f1, [%i4 + 4]
    582 	st		%f2, [%i4 + 8]
    583 	st		%f3, [%i4 + 12]
    584 
    585 .Lcbc_no_data:
    586 	ret
    587 	restore
    588 
    589 .align	32
    590 .Lcbc_enc_unaligned_out:
    591 	ldd		[%o7 + %l6], %f36	! shift right params
    592 	mov		0xff, %l6
    593 	srl		%l6, %l5, %l6
    594 	sub		%g0, %l4, %l5
    595 
    596 	.word	0x8db80b60 !fshiftorx	%f0,%f0,%f36,%f6
    597 	.word	0x91b80b62 !fshiftorx	%f0,%f2,%f36,%f8
    598 
    599 	stda		%f6, [%i1 + %l6]0xc0	! partial store
    600 	orn		%g0, %l6, %l6
    601 	std		%f8, [%i1 + 8]
    602 	add		%i1, 16, %i1
    603 	brz		%i2, .Lcbc_enc_unaligned_out_done
    604 	sub		%i2, 1, %i2
    605 	b		.Loop_cbc_enc_unaligned_out
    606 	nop
    607 
    608 .align	32
    609 .Loop_cbc_enc_unaligned_out:
    610 	fmovd		%f2, %f34
    611 	.word	0x81b70d80 !fxor	%f28,%f0,%f0		! inp^ivec^round[0]
    612 	.word	0x85b78d82 !fxor	%f30,%f2,%f2
    613 	ldd		[%i3 + 32], %f6	! round[2]
    614 	ldd		[%i3 + 40], %f8
    615 
    616 	fmovd		%f0, %f4
    617 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
    618 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
    619 	ldd		[%i3 + 48], %f10	! round[3]
    620 	ldd		[%i3 + 56], %f12
    621 
    622 	ldx		[%i0 - 16], %o0
    623 	ldx		[%i0 -  8], %o1
    624 	brz		%l4, .Lcbc_enc_aligned_inp
    625 	movrz		%i2, 0, %l3
    626 
    627 	ldx		[%i0], %o2
    628 	sllx		%o0, %l4, %o0
    629 	srlx		%o1, %l5, %g1
    630 	sllx		%o1, %l4, %o1
    631 	or		%g1, %o0, %o0
    632 	srlx		%o2, %l5, %o2
    633 	or		%o2, %o1, %o1
    634 
    635 .Lcbc_enc_aligned_inp:
    636 	fmovd		%f0, %f4
    637 	.word	0x81b09206 !faesencx	%f2,%f6,%f0
    638 	.word	0x85b11208 !faesencx	%f4,%f8,%f2
    639 	ldd		[%i3 + 64], %f6	! round[4]
    640 	ldd		[%i3 + 72], %f8
    641 	add		%i3, 64, %l2
    642 	sub		%l0, 16*8, %l1
    643 
    644 	stx		%o0, [%sp + LOCALS + 0]
    645 	stx		%o1, [%sp + LOCALS + 8]
    646 	add		%i0, %l3, %i0	! inp+=16
    647 	nop
    648 
    649 .Lcbc_enc_unaligned:
    650 	fmovd		%f0, %f4
    651 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
    652 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
    653 	ldd		[%l2 + 16], %f10
    654 	ldd		[%l2 + 24], %f12
    655 	add		%l2, 32, %l2
    656 
    657 	fmovd		%f0, %f4
    658 	.word	0x81b09206 !faesencx	%f2,%f6,%f0
    659 	.word	0x85b11208 !faesencx	%f4,%f8,%f2
    660 	ldd		[%l2 + 0], %f6
    661 	ldd		[%l2 + 8], %f8
    662 
    663 	brnz,a		%l1, .Lcbc_enc_unaligned
    664 	sub		%l1, 16*2, %l1
    665 
    666 	fmovd		%f0, %f4
    667 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
    668 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
    669 	ldd		[%l2 + 16], %f10	! round[last-1]
    670 	ldd		[%l2 + 24], %f12
    671 
    672 	fmovd		%f0, %f4
    673 	.word	0x81b09206 !faesencx	%f2,%f6,%f0
    674 	.word	0x85b11208 !faesencx	%f4,%f8,%f2
    675 
    676 	ldd		[%sp + LOCALS + 0], %f28
    677 	ldd		[%sp + LOCALS + 8], %f30
    678 
    679 	fmovd		%f0, %f4
    680 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
    681 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
    682 	ldd		[%i3 + 16], %f10	! round[1]
    683 	ldd		[%i3 + 24], %f12
    684 
    685 	.word	0xb9b50d9c !fxor	%f20,%f28,%f28	! inp^=round[0]
    686 	.word	0xbdb58d9e !fxor	%f22,%f30,%f30
    687 
    688 	fmovd		%f0, %f4
    689 	.word	0x81b09258 !faesenclx	%f2,%f24,%f0
    690 	.word	0x85b1125a !faesenclx	%f4,%f26,%f2
    691 
    692 	.word	0x8db8cb60 !fshiftorx	%f34,%f0,%f36,%f6
    693 	.word	0x91b80b62 !fshiftorx	%f0,%f2,%f36,%f8
    694 	std		%f6, [%i1 + 0]
    695 	std		%f8, [%i1 + 8]
    696 	add		%i1, 16, %i1
    697 
    698 	brnz,a		%i2, .Loop_cbc_enc_unaligned_out
    699 	sub		%i2, 1, %i2
    700 
    701 .Lcbc_enc_unaligned_out_done:
    702 	.word	0x91b88b62 !fshiftorx	%f2,%f2,%f36,%f8
    703 	stda		%f8, [%i1 + %l6]0xc0	! partial store
    704 
    705 	st		%f0, [%i4 + 0]		! output ivec
    706 	st		%f1, [%i4 + 4]
    707 	st		%f2, [%i4 + 8]
    708 	st		%f3, [%i4 + 12]
    709 
    710 	ret
    711 	restore
    712 
    713 .align	32
    714 .Lcbc_decrypt:
    715 	.word	0xb9bf0b7e !fshiftorx	%f28,%f30,%f36,%f28
    716 	.word	0xbdbf8b61 !fshiftorx	%f30,%f32,%f36,%f30
    717 	fmovd		%f0, %f16
    718 	fmovd		%f2, %f18
    719 
    720 .Loop_cbc_dec:
    721 	.word	0x81b70d94 !fxor	%f28,%f20,%f0	! inp^round[0]
    722 	.word	0x85b78d96 !fxor	%f30,%f22,%f2
    723 	ldd		[%i3 + 32], %f6	! round[2]
    724 	ldd		[%i3 + 40], %f8
    725 	add		%i3, 32, %l2
    726 	sub		%l0, 16*6, %l1
    727 
    728 .Lcbc_dec:
    729 	fmovd		%f0, %f4
    730 	.word	0x81b0922a !faesdecx	%f2,%f10,%f0
    731 	.word	0x85b1122c !faesdecx	%f4,%f12,%f2
    732 	ldd		[%l2 + 16], %f10
    733 	ldd		[%l2 + 24], %f12
    734 	add		%l2, 32, %l2
    735 
    736 	fmovd		%f0, %f4
    737 	.word	0x81b09226 !faesdecx	%f2,%f6,%f0
    738 	.word	0x85b11228 !faesdecx	%f4,%f8,%f2
    739 	ldd		[%l2 + 0], %f6
    740 	ldd		[%l2 + 8], %f8
    741 
    742 	brnz,a		%l1, .Lcbc_dec
    743 	sub		%l1, 16*2, %l1
    744 
    745 	fmovd		%f0, %f4
    746 	.word	0x81b0922a !faesdecx	%f2,%f10,%f0
    747 	.word	0x85b1122c !faesdecx	%f4,%f12,%f2
    748 	ldd		[%l2 + 16], %f10	! round[last-1]
    749 	ldd		[%l2 + 24], %f12
    750 
    751 	fmovd		%f0, %f4
    752 	.word	0x81b09226 !faesdecx	%f2,%f6,%f0
    753 	.word	0x85b11228 !faesdecx	%f4,%f8,%f2
    754 	.word	0x8db40d98 !fxor	%f16,%f24,%f6	! ivec^round[last]
    755 	.word	0x91b48d9a !fxor	%f18,%f26,%f8
    756 	fmovd		%f28, %f16
    757 	fmovd		%f30, %f18
    758 
    759 	movrz		%i2, 0, %l3
    760 	fmovd		%f32, %f28
    761 	ldd		[%i0 - 8], %f30	! load next input block
    762 	ldda		[%i0]0x82, %f32	! non-faulting load
    763 	add		%i0, %l3, %i0	! inp+=16
    764 
    765 	fmovd		%f0, %f4
    766 	.word	0x81b0922a !faesdecx	%f2,%f10,%f0
    767 	.word	0x85b1122c !faesdecx	%f4,%f12,%f2
    768 	ldd		[%i3 + 16], %f10	! round[1]
    769 	ldd		[%i3 + 24], %f12
    770 
    771 	.word	0xb9bf0b7e !fshiftorx	%f28,%f30,%f36,%f28
    772 	.word	0xbdbf8b61 !fshiftorx	%f30,%f32,%f36,%f30
    773 
    774 	fmovd		%f0, %f4
    775 	.word	0x81b09266 !faesdeclx	%f2,%f6,%f0
    776 	.word	0x85b11268 !faesdeclx	%f4,%f8,%f2
    777 
    778 	brnz,pn		%l5, .Lcbc_dec_unaligned_out
    779 	nop
    780 
    781 	std		%f0, [%i1 + 0]
    782 	std		%f2, [%i1 + 8]
    783 	add		%i1, 16, %i1
    784 
    785 	brnz,a		%i2, .Loop_cbc_dec
    786 	sub		%i2, 1, %i2
    787 
    788 	st		%f16,    [%i4 + 0]	! output ivec
    789 	st		%f17, [%i4 + 4]
    790 	st		%f18,    [%i4 + 8]
    791 	st		%f19, [%i4 + 12]
    792 
    793 	ret
    794 	restore
    795 
    796 .align	32
    797 .Lcbc_dec_unaligned_out:
    798 	ldd		[%o7 + %l6], %f36	! shift right params
    799 	mov		0xff, %l6
    800 	srl		%l6, %l5, %l6
    801 	sub		%g0, %l4, %l5
    802 
    803 	.word	0x8db80b60 !fshiftorx	%f0,%f0,%f36,%f6
    804 	.word	0x91b80b62 !fshiftorx	%f0,%f2,%f36,%f8
    805 
    806 	stda		%f6, [%i1 + %l6]0xc0	! partial store
    807 	orn		%g0, %l6, %l6
    808 	std		%f8, [%i1 + 8]
    809 	add		%i1, 16, %i1
    810 	brz		%i2, .Lcbc_dec_unaligned_out_done
    811 	sub		%i2, 1, %i2
    812 	b		.Loop_cbc_dec_unaligned_out
    813 	nop
    814 
    815 .align	32
    816 .Loop_cbc_dec_unaligned_out:
    817 	fmovd		%f2, %f34
    818 	.word	0x81b70d94 !fxor	%f28,%f20,%f0	! inp^round[0]
    819 	.word	0x85b78d96 !fxor	%f30,%f22,%f2
    820 	ldd		[%i3 + 32], %f6	! round[2]
    821 	ldd		[%i3 + 40], %f8
    822 
    823 	fmovd		%f0, %f4
    824 	.word	0x81b0922a !faesdecx	%f2,%f10,%f0
    825 	.word	0x85b1122c !faesdecx	%f4,%f12,%f2
    826 	ldd		[%i3 + 48], %f10	! round[3]
    827 	ldd		[%i3 + 56], %f12
    828 
    829 	ldx		[%i0 - 16], %o0
    830 	ldx		[%i0 - 8], %o1
    831 	brz		%l4, .Lcbc_dec_aligned_inp
    832 	movrz		%i2, 0, %l3
    833 
    834 	ldx		[%i0], %o2
    835 	sllx		%o0, %l4, %o0
    836 	srlx		%o1, %l5, %g1
    837 	sllx		%o1, %l4, %o1
    838 	or		%g1, %o0, %o0
    839 	srlx		%o2, %l5, %o2
    840 	or		%o2, %o1, %o1
    841 
    842 .Lcbc_dec_aligned_inp:
    843 	fmovd		%f0, %f4
    844 	.word	0x81b09226 !faesdecx	%f2,%f6,%f0
    845 	.word	0x85b11228 !faesdecx	%f4,%f8,%f2
    846 	ldd		[%i3 + 64], %f6	! round[4]
    847 	ldd		[%i3 + 72], %f8
    848 	add		%i3, 64, %l2
    849 	sub		%l0, 16*8, %l1
    850 
    851 	stx		%o0, [%sp + LOCALS + 0]
    852 	stx		%o1, [%sp + LOCALS + 8]
    853 	add		%i0, %l3, %i0	! inp+=16
    854 	nop
    855 
    856 .Lcbc_dec_unaligned:
    857 	fmovd		%f0, %f4
    858 	.word	0x81b0922a !faesdecx	%f2,%f10,%f0
    859 	.word	0x85b1122c !faesdecx	%f4,%f12,%f2
    860 	ldd		[%l2 + 16], %f10
    861 	ldd		[%l2 + 24], %f12
    862 	add		%l2, 32, %l2
    863 
    864 	fmovd		%f0, %f4
    865 	.word	0x81b09226 !faesdecx	%f2,%f6,%f0
    866 	.word	0x85b11228 !faesdecx	%f4,%f8,%f2
    867 	ldd		[%l2 + 0], %f6
    868 	ldd		[%l2 + 8], %f8
    869 
    870 	brnz,a		%l1, .Lcbc_dec_unaligned
    871 	sub		%l1, 16*2, %l1
    872 
    873 	fmovd		%f0, %f4
    874 	.word	0x81b0922a !faesdecx	%f2,%f10,%f0
    875 	.word	0x85b1122c !faesdecx	%f4,%f12,%f2
    876 	ldd		[%l2 + 16], %f10	! round[last-1]
    877 	ldd		[%l2 + 24], %f12
    878 
    879 	fmovd		%f0, %f4
    880 	.word	0x81b09226 !faesdecx	%f2,%f6,%f0
    881 	.word	0x85b11228 !faesdecx	%f4,%f8,%f2
    882 
    883 	.word	0x8db40d98 !fxor	%f16,%f24,%f6	! ivec^round[last]
    884 	.word	0x91b48d9a !fxor	%f18,%f26,%f8
    885 	fmovd		%f28, %f16
    886 	fmovd		%f30, %f18
    887 	ldd		[%sp + LOCALS + 0], %f28
    888 	ldd		[%sp + LOCALS + 8], %f30
    889 
    890 	fmovd		%f0, %f4
    891 	.word	0x81b0922a !faesdecx	%f2,%f10,%f0
    892 	.word	0x85b1122c !faesdecx	%f4,%f12,%f2
    893 	ldd		[%i3 + 16], %f10	! round[1]
    894 	ldd		[%i3 + 24], %f12
    895 
    896 	fmovd		%f0, %f4
    897 	.word	0x81b09266 !faesdeclx	%f2,%f6,%f0
    898 	.word	0x85b11268 !faesdeclx	%f4,%f8,%f2
    899 
    900 	.word	0x8db8cb60 !fshiftorx	%f34,%f0,%f36,%f6
    901 	.word	0x91b80b62 !fshiftorx	%f0,%f2,%f36,%f8
    902 	std		%f6, [%i1 + 0]
    903 	std		%f8, [%i1 + 8]
    904 	add		%i1, 16, %i1
    905 
    906 	brnz,a		%i2, .Loop_cbc_dec_unaligned_out
    907 	sub		%i2, 1, %i2
    908 
    909 .Lcbc_dec_unaligned_out_done:
    910 	.word	0x91b88b62 !fshiftorx	%f2,%f2,%f36,%f8
    911 	stda		%f8, [%i1 + %l6]0xc0	! partial store
    912 
    913 	st		%f16,    [%i4 + 0]	! output ivec
    914 	st		%f17, [%i4 + 4]
    915 	st		%f18,    [%i4 + 8]
    916 	st		%f19, [%i4 + 12]
    917 
    918 	ret
    919 	restore
    920 .type	aes_fx_cbc_encrypt,#function
    921 .size	aes_fx_cbc_encrypt,.-aes_fx_cbc_encrypt
    922 .globl	aes_fx_ctr32_encrypt_blocks
    923 .align	32
    924 aes_fx_ctr32_encrypt_blocks:
    925 	save		%sp, -STACK_FRAME-16, %sp
    926 	srln		%i2, 0, %i2
    927 	and		%i0, 7, %l4
    928 	andn		%i0, 7, %i0
    929 	brz,pn		%i2, .Lctr32_no_data
    930 	sll		%l4, 3, %l4
    931 
    932 .Lpic:	call		.+8
    933 	add		%o7, .Linp_align - .Lpic, %o7
    934 
    935 	ld		[%i3 + 240], %l0
    936 	and		%i1, 7, %l5
    937 	ld		[%i4 +  0], %f16	! load counter
    938 	andn		%i1, 7, %i1
    939 	ld		[%i4 +  4], %f17
    940 	sll		%l5, 3, %l6
    941 	ld		[%i4 +  8], %f18
    942 	ld		[%i4 + 12], %f19
    943 	ldd		[%o7 + 128], %f14
    944 
    945 	sll		%l0, 4, %l0
    946 	add		%l0, %i3, %l2
    947 	ldd		[%i3 + 0], %f20	! round[0]
    948 	ldd		[%i3 + 8], %f22
    949 
    950 	add		%i0, 16, %i0
    951 	sub		%i2, 1, %i2
    952 	ldd		[%i3 + 16], %f10	! round[1]
    953 	ldd		[%i3 + 24], %f12
    954 
    955 	mov		16, %l3
    956 	movrz		%i2, 0, %l3
    957 	ldd		[%l2 + 0], %f24	! round[last]
    958 	ldd		[%l2 + 8], %f26
    959 
    960 	ldd		[%o7 + %l4], %f36	! shiftleft params
    961 	add		%o7, 64, %o7
    962 	ldd		[%i0 - 16], %f28	! load input
    963 	ldd		[%i0 -  8], %f30
    964 	ldda		[%i0]0x82, %f32	! non-faulting load
    965 	add		%i0, %l3, %i0	! inp+=16
    966 
    967 	.word	0xb9bf0b7e !fshiftorx	%f28,%f30,%f36,%f28
    968 	.word	0xbdbf8b61 !fshiftorx	%f30,%f32,%f36,%f30
    969 
    970 .Loop_ctr32:
    971 	.word	0x81b40d94 !fxor	%f16,%f20,%f0	! counter^round[0]
    972 	.word	0x85b48d96 !fxor	%f18,%f22,%f2
    973 	ldd		[%i3 + 32], %f6	! round[2]
    974 	ldd		[%i3 + 40], %f8
    975 	add		%i3, 32, %l2
    976 	sub		%l0, 16*6, %l1
    977 
    978 .Lctr32_enc:
    979 	fmovd		%f0, %f4
    980 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
    981 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
    982 	ldd		[%l2 + 16], %f10
    983 	ldd		[%l2 + 24], %f12
    984 	add		%l2, 32, %l2
    985 
    986 	fmovd		%f0, %f4
    987 	.word	0x81b09206 !faesencx	%f2,%f6,%f0
    988 	.word	0x85b11208 !faesencx	%f4,%f8,%f2
    989 	ldd		[%l2 + 0], %f6
    990 	ldd		[%l2 + 8], %f8
    991 
    992 	brnz,a		%l1, .Lctr32_enc
    993 	sub		%l1, 16*2, %l1
    994 
    995 	fmovd		%f0, %f4
    996 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
    997 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
    998 	ldd		[%l2 + 16], %f10	! round[last-1]
    999 	ldd		[%l2 + 24], %f12
   1000 
   1001 	fmovd		%f0, %f4
   1002 	.word	0x81b09206 !faesencx	%f2,%f6,%f0
   1003 	.word	0x85b11208 !faesencx	%f4,%f8,%f2
   1004 	.word	0x8db70d98 !fxor	%f28,%f24,%f6	! inp^round[last]
   1005 	.word	0x91b78d9a !fxor	%f30,%f26,%f8
   1006 
   1007 	movrz		%i2, 0, %l3
   1008 	fmovd		%f32, %f28
   1009 	ldd		[%i0 - 8], %f30	! load next input block
   1010 	ldda		[%i0]0x82, %f32	! non-faulting load
   1011 	add		%i0, %l3, %i0	! inp+=16
   1012 
   1013 	fmovd		%f0, %f4
   1014 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
   1015 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
   1016 	ldd		[%i3 + 16], %f10	! round[1]
   1017 	ldd		[%i3 + 24], %f12
   1018 
   1019 	.word	0xb9bf0b7e !fshiftorx	%f28,%f30,%f36,%f28
   1020 	.word	0xbdbf8b61 !fshiftorx	%f30,%f32,%f36,%f30
   1021 	.word	0xa5b48a4e !fpadd32	%f18,%f14,%f18	! increment counter
   1022 
   1023 	fmovd		%f0, %f4
   1024 	.word	0x81b09246 !faesenclx	%f2,%f6,%f0
   1025 	.word	0x85b11248 !faesenclx	%f4,%f8,%f2
   1026 
   1027 	brnz,pn		%l5, .Lctr32_unaligned_out
   1028 	nop
   1029 
   1030 	std		%f0, [%i1 + 0]
   1031 	std		%f2, [%i1 + 8]
   1032 	add		%i1, 16, %i1
   1033 
   1034 	brnz,a		%i2, .Loop_ctr32
   1035 	sub		%i2, 1, %i2
   1036 
   1037 .Lctr32_no_data:
   1038 	ret
   1039 	restore
   1040 
   1041 .align	32
   1042 .Lctr32_unaligned_out:
   1043 	ldd		[%o7 + %l6], %f36	! shift right params
   1044 	mov		0xff, %l6
   1045 	srl		%l6, %l5, %l6
   1046 	sub		%g0, %l4, %l5
   1047 
   1048 	.word	0x8db80b60 !fshiftorx	%f0,%f0,%f36,%f6
   1049 	.word	0x91b80b62 !fshiftorx	%f0,%f2,%f36,%f8
   1050 
   1051 	stda		%f6, [%i1 + %l6]0xc0	! partial store
   1052 	orn		%g0, %l6, %l6
   1053 	std		%f8, [%i1 + 8]
   1054 	add		%i1, 16, %i1
   1055 	brz		%i2, .Lctr32_unaligned_out_done
   1056 	sub		%i2, 1, %i2
   1057 	b		.Loop_ctr32_unaligned_out
   1058 	nop
   1059 
   1060 .align	32
   1061 .Loop_ctr32_unaligned_out:
   1062 	fmovd		%f2, %f34
   1063 	.word	0x81b40d94 !fxor	%f16,%f20,%f0	! counter^round[0]
   1064 	.word	0x85b48d96 !fxor	%f18,%f22,%f2
   1065 	ldd		[%i3 + 32], %f6	! round[2]
   1066 	ldd		[%i3 + 40], %f8
   1067 
   1068 	fmovd		%f0, %f4
   1069 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
   1070 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
   1071 	ldd		[%i3 + 48], %f10	! round[3]
   1072 	ldd		[%i3 + 56], %f12
   1073 
   1074 	ldx		[%i0 - 16], %o0
   1075 	ldx		[%i0 -  8], %o1
   1076 	brz		%l4, .Lctr32_aligned_inp
   1077 	movrz		%i2, 0, %l3
   1078 
   1079 	ldx		[%i0], %o2
   1080 	sllx		%o0, %l4, %o0
   1081 	srlx		%o1, %l5, %g1
   1082 	sllx		%o1, %l4, %o1
   1083 	or		%g1, %o0, %o0
   1084 	srlx		%o2, %l5, %o2
   1085 	or		%o2, %o1, %o1
   1086 
   1087 .Lctr32_aligned_inp:
   1088 	fmovd		%f0, %f4
   1089 	.word	0x81b09206 !faesencx	%f2,%f6,%f0
   1090 	.word	0x85b11208 !faesencx	%f4,%f8,%f2
   1091 	ldd		[%i3 + 64], %f6	! round[4]
   1092 	ldd		[%i3 + 72], %f8
   1093 	add		%i3, 64, %l2
   1094 	sub		%l0, 16*8, %l1
   1095 
   1096 	stx		%o0, [%sp + LOCALS + 0]
   1097 	stx		%o1, [%sp + LOCALS + 8]
   1098 	add		%i0, %l3, %i0	! inp+=16
   1099 	nop
   1100 
   1101 .Lctr32_enc_unaligned:
   1102 	fmovd		%f0, %f4
   1103 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
   1104 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
   1105 	ldd		[%l2 + 16], %f10
   1106 	ldd		[%l2 + 24], %f12
   1107 	add		%l2, 32, %l2
   1108 
   1109 	fmovd		%f0, %f4
   1110 	.word	0x81b09206 !faesencx	%f2,%f6,%f0
   1111 	.word	0x85b11208 !faesencx	%f4,%f8,%f2
   1112 	ldd		[%l2 + 0], %f6
   1113 	ldd		[%l2 + 8], %f8
   1114 
   1115 	brnz,a		%l1, .Lctr32_enc_unaligned
   1116 	sub		%l1, 16*2, %l1
   1117 
   1118 	fmovd		%f0, %f4
   1119 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
   1120 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
   1121 	ldd		[%l2 + 16], %f10	! round[last-1]
   1122 	ldd		[%l2 + 24], %f12
   1123 	.word	0xa5b48a4e !fpadd32	%f18,%f14,%f18	! increment counter
   1124 
   1125 	fmovd		%f0, %f4
   1126 	.word	0x81b09206 !faesencx	%f2,%f6,%f0
   1127 	.word	0x85b11208 !faesencx	%f4,%f8,%f2
   1128 	.word	0x8db70d98 !fxor	%f28,%f24,%f6	! inp^round[last]
   1129 	.word	0x91b78d9a !fxor	%f30,%f26,%f8
   1130 	ldd		[%sp + LOCALS + 0], %f28
   1131 	ldd		[%sp + LOCALS + 8], %f30
   1132 
   1133 	fmovd		%f0, %f4
   1134 	.word	0x81b0920a !faesencx	%f2,%f10,%f0
   1135 	.word	0x85b1120c !faesencx	%f4,%f12,%f2
   1136 	ldd		[%i3 + 16], %f10	! round[1]
   1137 	ldd		[%i3 + 24], %f12
   1138 
   1139 	fmovd		%f0, %f4
   1140 	.word	0x81b09246 !faesenclx	%f2,%f6,%f0
   1141 	.word	0x85b11248 !faesenclx	%f4,%f8,%f2
   1142 
   1143 	.word	0x8db8cb60 !fshiftorx	%f34,%f0,%f36,%f6
   1144 	.word	0x91b80b62 !fshiftorx	%f0,%f2,%f36,%f8
   1145 	std		%f6, [%i1 + 0]
   1146 	std		%f8, [%i1 + 8]
   1147 	add		%i1, 16, %i1
   1148 
   1149 	brnz,a		%i2, .Loop_ctr32_unaligned_out
   1150 	sub		%i2, 1, %i2
   1151 
   1152 .Lctr32_unaligned_out_done:
   1153 	.word	0x91b88b62 !fshiftorx	%f2,%f2,%f36,%f8
   1154 	stda		%f8, [%i1 + %l6]0xc0	! partial store
   1155 
   1156 	ret
   1157 	restore
   1158 .type	aes_fx_ctr32_encrypt_blocks,#function
   1159 .size	aes_fx_ctr32_encrypt_blocks,.-aes_fx_ctr32_encrypt_blocks
   1160 
   1161 .align	32
   1162 .Linp_align:		! fshiftorx parameters for left shift toward %rs1
   1163 	.byte	0, 0, 64,  0,	0, 64,  0, -64
   1164 	.byte	0, 0, 56,  8,	0, 56,  8, -56
   1165 	.byte	0, 0, 48, 16,	0, 48, 16, -48
   1166 	.byte	0, 0, 40, 24,	0, 40, 24, -40
   1167 	.byte	0, 0, 32, 32,	0, 32, 32, -32
   1168 	.byte	0, 0, 24, 40,	0, 24, 40, -24
   1169 	.byte	0, 0, 16, 48,	0, 16, 48, -16
   1170 	.byte	0, 0,  8, 56,	0,  8, 56, -8
   1171 .Lout_align:		! fshiftorx parameters for right shift toward %rs2
   1172 	.byte	0, 0,  0, 64,	0,  0, 64,   0
   1173 	.byte	0, 0,  8, 56,	0,  8, 56,  -8
   1174 	.byte	0, 0, 16, 48,	0, 16, 48, -16
   1175 	.byte	0, 0, 24, 40,	0, 24, 40, -24
   1176 	.byte	0, 0, 32, 32,	0, 32, 32, -32
   1177 	.byte	0, 0, 40, 24,	0, 40, 24, -40
   1178 	.byte	0, 0, 48, 16,	0, 48, 16, -48
   1179 	.byte	0, 0, 56,  8,	0, 56,  8, -56
   1180 .Lone:
   1181 	.word	0, 1
   1182 .asciz	"AES for Fujitsu SPARC64 X, CRYPTOGAMS by <appro (at) openssl.org>"
   1183 .align	4
   1184