components/openssl/openssl-1.0.1/inline-t4/sparcv9_modes.pl
author Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
Thu, 27 Jun 2013 14:24:42 -0700
changeset 1373 2fd83bee8884
parent 1341 af3d6ef22d65
permissions -rw-r--r--
PSARC 2013/034 OpenSSL 1.0.1 16921388 T4 DES should be embedded in the OpenSSL upstream src
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     1
#!/usr/bin/env perl
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     3
# Specific modes implementations for SPARC Architecture 2011. There
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     4
# is T4 dependency though, an ASI value that is not specified in the
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     5
# Architecture Manual. But as SPARC universe is rather monocultural,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     6
# we imply that processor capable of executing crypto instructions
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     7
# can handle the ASI in question as well. This means that we ought to
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     8
# keep eyes open when new processors emerge...
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     9
#
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    10
# As for above mentioned ASI. It's so called "block initializing
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    11
# store" which cancels "read" in "read-update-write" on cache lines.
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    12
# This is "cooperative" optimization, as it reduces overall pressure
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    13
# on memory interface. Benefits can't be observed/quantified with
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    14
# usual benchmarks, on the contrary you can notice that single-thread
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    15
# performance for parallelizable modes is ~1.5% worse for largest
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    16
# block sizes [though few percent better for not so long ones]. All
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    17
# this based on suggestions from David Miller.
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    18
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    19
sub asm_init {		# to be called with @ARGV as argument
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    20
    for (@_)		{ $::abibits=64 if (/\-m64/ || /\-xarch\=v9/); }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    21
    if ($::abibits==64)	{ $::bias=2047; $::frame=192; $::size_t_cc="%xcc"; }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    22
    else		{ $::bias=0;    $::frame=112; $::size_t_cc="%icc"; }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    23
}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    24
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    25
# unified interface
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    26
my ($inp,$out,$len,$key,$ivec)=map("%i$_",(0..5));
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    27
# local variables
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    28
my ($ileft,$iright,$ooff,$omask,$ivoff,$blk_init)=map("%l$_",(0..7));
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    29
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    30
sub alg_cbc_encrypt_implement {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    31
my ($alg,$bits) = @_;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    32
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    33
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    34
.globl	${alg}${bits}_t4_cbc_encrypt
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    35
.align	32
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    36
${alg}${bits}_t4_cbc_encrypt:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    37
	save		%sp, -$::frame, %sp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    38
	sub		$inp, $out, $blk_init	! $inp!=$out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    39
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    40
$::code.=<<___ if (!$::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    41
	andcc		$ivec, 7, $ivoff
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    42
	alignaddr	$ivec, %g0, $ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    43
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    44
	ldd		[$ivec + 0], %f0	! load ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    45
	bz,pt		%icc, 1f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    46
	ldd		[$ivec + 8], %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    47
	ldd		[$ivec + 16], %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    48
	faligndata	%f0, %f2, %f0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    49
	faligndata	%f2, %f4, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    50
1:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    51
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    52
$::code.=<<___ if ($::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    53
	ld		[$ivec + 0], %f0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    54
	ld		[$ivec + 4], %f1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    55
	ld		[$ivec + 8], %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    56
	ld		[$ivec + 12], %f3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    57
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    58
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    59
	prefetch	[$inp], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    60
	prefetch	[$inp + 63], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    61
	call		_${alg}${bits}_load_enckey
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    62
	and		$inp, 7, $ileft
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    63
	andn		$inp, 7, $inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    64
	sll		$ileft, 3, $ileft
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    65
	mov		64, $iright
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    66
	mov		0xff, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    67
	sub		$iright, $ileft, $iright
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    68
	and		$out, 7, $ooff
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    69
	cmp		$len, 127
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    70
	movrnz		$ooff, 0, $blk_init		! if (	$out&7 ||
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    71
	movleu		$::size_t_cc, 0, $blk_init	!	$len<128 ||
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    72
	brnz,pn		$blk_init, .L${bits}cbc_enc_blk	!	$inp==$out)
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    73
	srl		$omask, $ooff, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    74
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    75
	alignaddrl	$out, %g0, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    76
	srlx		$len, 4, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    77
	prefetch	[$out], 22
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    78
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    79
.L${bits}_cbc_enc_loop:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    80
	ldx		[$inp + 0], %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    81
	brz,pt		$ileft, 4f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    82
	ldx		[$inp + 8], %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    83
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    84
	ldx		[$inp + 16], %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    85
	sllx		%o0, $ileft, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    86
	srlx		%o1, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    87
	sllx		%o1, $ileft, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    88
	or		%g1, %o0, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    89
	srlx		%o2, $iright, %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    90
	or		%o2, %o1, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    91
4:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    92
	xor		%g4, %o0, %o0		! ^= rk[0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    93
	xor		%g5, %o1, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    94
	movxtod		%o0, %f12
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    95
	movxtod		%o1, %f14
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    96
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    97
	fxor		%f12, %f0, %f0		! ^= ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    98
	fxor		%f14, %f2, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    99
	prefetch	[$out + 63], 22
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   100
	prefetch	[$inp + 16+63], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   101
	call		_${alg}${bits}_encrypt_1x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   102
	add		$inp, 16, $inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   103
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   104
	brnz,pn		$ooff, 2f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   105
	sub		$len, 1, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   106
		
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   107
	std		%f0, [$out + 0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   108
	std		%f2, [$out + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   109
	brnz,pt		$len, .L${bits}_cbc_enc_loop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   110
	add		$out, 16, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   111
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   112
$::code.=<<___ if ($::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   113
	st		%f0, [$ivec + 0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   114
	st		%f1, [$ivec + 4]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   115
	st		%f2, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   116
	st		%f3, [$ivec + 12]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   117
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   118
$::code.=<<___ if (!$::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   119
	brnz,pn		$ivoff, 3f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   120
	nop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   121
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   122
	std		%f0, [$ivec + 0]	! write out ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   123
	std		%f2, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   124
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   125
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   126
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   127
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   128
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   129
.align	16
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   130
2:	ldxa		[$inp]0x82, %o0		! avoid read-after-write hazard
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   131
						! and ~3x deterioration
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   132
						! in inp==out case
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   133
	faligndata	%f0, %f0, %f4		! handle unaligned output
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   134
	faligndata	%f0, %f2, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   135
	faligndata	%f2, %f2, %f8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   136
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   137
	stda		%f4, [$out + $omask]0xc0	! partial store
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   138
	std		%f6, [$out + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   139
	add		$out, 16, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   140
	orn		%g0, $omask, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   141
	stda		%f8, [$out + $omask]0xc0	! partial store
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   142
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   143
	brnz,pt		$len, .L${bits}_cbc_enc_loop+4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   144
	orn		%g0, $omask, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   145
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   146
$::code.=<<___ if ($::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   147
	st		%f0, [$ivec + 0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   148
	st		%f1, [$ivec + 4]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   149
	st		%f2, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   150
	st		%f3, [$ivec + 12]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   151
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   152
$::code.=<<___ if (!$::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   153
	brnz,pn		$ivoff, 3f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   154
	nop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   155
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   156
	std		%f0, [$ivec + 0]	! write out ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   157
	std		%f2, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   158
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   159
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   160
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   161
.align	16
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   162
3:	alignaddrl	$ivec, $ivoff, %g0	! handle unaligned ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   163
	mov		0xff, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   164
	srl		$omask, $ivoff, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   165
	faligndata	%f0, %f0, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   166
	faligndata	%f0, %f2, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   167
	faligndata	%f2, %f2, %f8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   168
	stda		%f4, [$ivec + $omask]0xc0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   169
	std		%f6, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   170
	add		$ivec, 16, $ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   171
	orn		%g0, $omask, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   172
	stda		%f8, [$ivec + $omask]0xc0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   173
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   174
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   175
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   176
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   177
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   178
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   179
.align	32
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   180
.L${bits}cbc_enc_blk:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   181
	add	$out, $len, $blk_init
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   182
	and	$blk_init, 63, $blk_init	! tail
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   183
	sub	$len, $blk_init, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   184
	add	$blk_init, 15, $blk_init	! round up to 16n
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   185
	srlx	$len, 4, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   186
	srl	$blk_init, 4, $blk_init
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   187
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   188
.L${bits}_cbc_enc_blk_loop:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   189
	ldx		[$inp + 0], %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   190
	brz,pt		$ileft, 5f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   191
	ldx		[$inp + 8], %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   192
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   193
	ldx		[$inp + 16], %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   194
	sllx		%o0, $ileft, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   195
	srlx		%o1, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   196
	sllx		%o1, $ileft, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   197
	or		%g1, %o0, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   198
	srlx		%o2, $iright, %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   199
	or		%o2, %o1, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   200
5:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   201
	xor		%g4, %o0, %o0		! ^= rk[0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   202
	xor		%g5, %o1, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   203
	movxtod		%o0, %f12
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   204
	movxtod		%o1, %f14
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   205
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   206
	fxor		%f12, %f0, %f0		! ^= ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   207
	fxor		%f14, %f2, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   208
	prefetch	[$inp + 16+63], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   209
	call		_${alg}${bits}_encrypt_1x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   210
	add		$inp, 16, $inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   211
	sub		$len, 1, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   212
		
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   213
	stda		%f0, [$out]0xe2		! ASI_BLK_INIT, T4-specific
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   214
	add		$out, 8, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   215
	stda		%f2, [$out]0xe2		! ASI_BLK_INIT, T4-specific
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   216
	brnz,pt		$len, .L${bits}_cbc_enc_blk_loop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   217
	add		$out, 8, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   218
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   219
	membar		#StoreLoad|#StoreStore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   220
	brnz,pt		$blk_init, .L${bits}_cbc_enc_loop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   221
	mov		$blk_init, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   222
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   223
$::code.=<<___ if ($::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   224
	st		%f0, [$ivec + 0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   225
	st		%f1, [$ivec + 4]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   226
	st		%f2, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   227
	st		%f3, [$ivec + 12]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   228
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   229
$::code.=<<___ if (!$::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   230
	brnz,pn		$ivoff, 3b
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   231
	nop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   232
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   233
	std		%f0, [$ivec + 0]	! write out ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   234
	std		%f2, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   235
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   236
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   237
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   238
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   239
.type	${alg}${bits}_t4_cbc_encrypt,#function
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   240
.size	${alg}${bits}_t4_cbc_encrypt,.-${alg}${bits}_t4_cbc_encrypt
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   241
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   242
}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   243
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   244
sub alg_cbc_decrypt_implement {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   245
my ($alg,$bits) = @_;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   246
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   247
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   248
.globl	${alg}${bits}_t4_cbc_decrypt
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   249
.align	32
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   250
${alg}${bits}_t4_cbc_decrypt:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   251
	save		%sp, -$::frame, %sp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   252
	sub		$inp, $out, $blk_init	! $inp!=$out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   253
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   254
$::code.=<<___ if (!$::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   255
	andcc		$ivec, 7, $ivoff
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   256
	alignaddr	$ivec, %g0, $ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   257
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   258
	ldd		[$ivec + 0], %f12	! load ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   259
	bz,pt		%icc, 1f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   260
	ldd		[$ivec + 8], %f14
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   261
	ldd		[$ivec + 16], %f0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   262
	faligndata	%f12, %f14, %f12
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   263
	faligndata	%f14, %f0, %f14
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   264
1:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   265
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   266
$::code.=<<___ if ($::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   267
	ld		[$ivec + 0], %f12	! load ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   268
	ld		[$ivec + 4], %f13
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   269
	ld		[$ivec + 8], %f14
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   270
	ld		[$ivec + 12], %f15
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   271
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   272
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   273
	prefetch	[$inp], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   274
	prefetch	[$inp + 63], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   275
	call		_${alg}${bits}_load_deckey
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   276
	and		$inp, 7, $ileft
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   277
	andn		$inp, 7, $inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   278
	sll		$ileft, 3, $ileft
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   279
	mov		64, $iright
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   280
	mov		0xff, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   281
	sub		$iright, $ileft, $iright
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   282
	and		$out, 7, $ooff
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   283
	cmp		$len, 255
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   284
	movrnz		$ooff, 0, $blk_init		! if (	$out&7 ||
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   285
	movleu		$::size_t_cc, 0, $blk_init	!	$len<256 ||
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   286
	brnz,pn		$blk_init, .L${bits}cbc_dec_blk	!	$inp==$out)
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   287
	srl		$omask, $ooff, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   288
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   289
	andcc		$len, 16, %g0		! is number of blocks even?
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   290
	srlx		$len, 4, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   291
	alignaddrl	$out, %g0, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   292
	bz		%icc, .L${bits}_cbc_dec_loop2x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   293
	prefetch	[$out], 22
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   294
.L${bits}_cbc_dec_loop:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   295
	ldx		[$inp + 0], %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   296
	brz,pt		$ileft, 4f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   297
	ldx		[$inp + 8], %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   298
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   299
	ldx		[$inp + 16], %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   300
	sllx		%o0, $ileft, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   301
	srlx		%o1, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   302
	sllx		%o1, $ileft, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   303
	or		%g1, %o0, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   304
	srlx		%o2, $iright, %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   305
	or		%o2, %o1, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   306
4:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   307
	xor		%g4, %o0, %o2		! ^= rk[0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   308
	xor		%g5, %o1, %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   309
	movxtod		%o2, %f0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   310
	movxtod		%o3, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   311
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   312
	prefetch	[$out + 63], 22
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   313
	prefetch	[$inp + 16+63], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   314
	call		_${alg}${bits}_decrypt_1x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   315
	add		$inp, 16, $inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   316
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   317
	fxor		%f12, %f0, %f0		! ^= ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   318
	fxor		%f14, %f2, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   319
	movxtod		%o0, %f12
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   320
	movxtod		%o1, %f14
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   321
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   322
	brnz,pn		$ooff, 2f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   323
	sub		$len, 1, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   324
		
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   325
	std		%f0, [$out + 0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   326
	std		%f2, [$out + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   327
	brnz,pt		$len, .L${bits}_cbc_dec_loop2x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   328
	add		$out, 16, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   329
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   330
$::code.=<<___ if ($::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   331
	st		%f12, [$ivec + 0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   332
	st		%f13, [$ivec + 4]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   333
	st		%f14, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   334
	st		%f15, [$ivec + 12]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   335
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   336
$::code.=<<___ if (!$::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   337
	brnz,pn		$ivoff, .L${bits}_cbc_dec_unaligned_ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   338
	nop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   339
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   340
	std		%f12, [$ivec + 0]	! write out ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   341
	std		%f14, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   342
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   343
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   344
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   345
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   346
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   347
.align	16
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   348
2:	ldxa		[$inp]0x82, %o0		! avoid read-after-write hazard
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   349
						! and ~3x deterioration
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   350
						! in inp==out case
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   351
	faligndata	%f0, %f0, %f4		! handle unaligned output
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   352
	faligndata	%f0, %f2, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   353
	faligndata	%f2, %f2, %f8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   354
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   355
	stda		%f4, [$out + $omask]0xc0	! partial store
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   356
	std		%f6, [$out + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   357
	add		$out, 16, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   358
	orn		%g0, $omask, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   359
	stda		%f8, [$out + $omask]0xc0	! partial store
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   360
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   361
	brnz,pt		$len, .L${bits}_cbc_dec_loop2x+4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   362
	orn		%g0, $omask, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   363
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   364
$::code.=<<___ if ($::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   365
	st		%f12, [$ivec + 0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   366
	st		%f13, [$ivec + 4]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   367
	st		%f14, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   368
	st		%f15, [$ivec + 12]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   369
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   370
$::code.=<<___ if (!$::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   371
	brnz,pn		$ivoff, .L${bits}_cbc_dec_unaligned_ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   372
	nop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   373
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   374
	std		%f12, [$ivec + 0]	! write out ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   375
	std		%f14, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   376
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   377
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   378
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   379
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   380
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   381
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   382
.align	32
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   383
.L${bits}_cbc_dec_loop2x:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   384
	ldx		[$inp + 0], %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   385
	ldx		[$inp + 8], %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   386
	ldx		[$inp + 16], %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   387
	brz,pt		$ileft, 4f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   388
	ldx		[$inp + 24], %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   389
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   390
	ldx		[$inp + 32], %o4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   391
	sllx		%o0, $ileft, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   392
	srlx		%o1, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   393
	or		%g1, %o0, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   394
	sllx		%o1, $ileft, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   395
	srlx		%o2, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   396
	or		%g1, %o1, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   397
	sllx		%o2, $ileft, %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   398
	srlx		%o3, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   399
	or		%g1, %o2, %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   400
	sllx		%o3, $ileft, %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   401
	srlx		%o4, $iright, %o4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   402
	or		%o4, %o3, %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   403
4:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   404
	xor		%g4, %o0, %o4		! ^= rk[0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   405
	xor		%g5, %o1, %o5
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   406
	movxtod		%o4, %f0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   407
	movxtod		%o5, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   408
	xor		%g4, %o2, %o4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   409
	xor		%g5, %o3, %o5
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   410
	movxtod		%o4, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   411
	movxtod		%o5, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   412
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   413
	prefetch	[$out + 63], 22
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   414
	prefetch	[$inp + 32+63], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   415
	call		_${alg}${bits}_decrypt_2x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   416
	add		$inp, 32, $inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   417
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   418
	movxtod		%o0, %f8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   419
	movxtod		%o1, %f10
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   420
	fxor		%f12, %f0, %f0		! ^= ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   421
	fxor		%f14, %f2, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   422
	movxtod		%o2, %f12
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   423
	movxtod		%o3, %f14
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   424
	fxor		%f8, %f4, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   425
	fxor		%f10, %f6, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   426
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   427
	brnz,pn		$ooff, 2f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   428
	sub		$len, 2, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   429
		
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   430
	std		%f0, [$out + 0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   431
	std		%f2, [$out + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   432
	std		%f4, [$out + 16]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   433
	std		%f6, [$out + 24]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   434
	brnz,pt		$len, .L${bits}_cbc_dec_loop2x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   435
	add		$out, 32, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   436
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   437
$::code.=<<___ if ($::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   438
	st		%f12, [$ivec + 0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   439
	st		%f13, [$ivec + 4]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   440
	st		%f14, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   441
	st		%f15, [$ivec + 12]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   442
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   443
$::code.=<<___ if (!$::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   444
	brnz,pn		$ivoff, .L${bits}_cbc_dec_unaligned_ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   445
	nop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   446
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   447
	std		%f12, [$ivec + 0]	! write out ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   448
	std		%f14, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   449
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   450
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   451
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   452
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   453
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   454
.align	16
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   455
2:	ldxa		[$inp]0x82, %o0		! avoid read-after-write hazard
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   456
						! and ~3x deterioration
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   457
						! in inp==out case
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   458
	faligndata	%f0, %f0, %f8		! handle unaligned output
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   459
	faligndata	%f0, %f2, %f0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   460
	faligndata	%f2, %f4, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   461
	faligndata	%f4, %f6, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   462
	faligndata	%f6, %f6, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   463
	stda		%f8, [$out + $omask]0xc0	! partial store
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   464
	std		%f0, [$out + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   465
	std		%f2, [$out + 16]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   466
	std		%f4, [$out + 24]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   467
	add		$out, 32, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   468
	orn		%g0, $omask, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   469
	stda		%f6, [$out + $omask]0xc0	! partial store
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   470
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   471
	brnz,pt		$len, .L${bits}_cbc_dec_loop2x+4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   472
	orn		%g0, $omask, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   473
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   474
$::code.=<<___ if ($::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   475
	st		%f12, [$ivec + 0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   476
	st		%f13, [$ivec + 4]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   477
	st		%f14, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   478
	st		%f15, [$ivec + 12]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   479
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   480
$::code.=<<___ if (!$::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   481
	brnz,pn		$ivoff, .L${bits}_cbc_dec_unaligned_ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   482
	nop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   483
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   484
	std		%f12, [$ivec + 0]	! write out ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   485
	std		%f14, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   486
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   487
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   488
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   489
.align	16
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   490
.L${bits}_cbc_dec_unaligned_ivec:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   491
	alignaddrl	$ivec, $ivoff, %g0	! handle unaligned ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   492
	mov		0xff, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   493
	srl		$omask, $ivoff, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   494
	faligndata	%f12, %f12, %f0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   495
	faligndata	%f12, %f14, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   496
	faligndata	%f14, %f14, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   497
	stda		%f0, [$ivec + $omask]0xc0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   498
	std		%f2, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   499
	add		$ivec, 16, $ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   500
	orn		%g0, $omask, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   501
	stda		%f4, [$ivec + $omask]0xc0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   502
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   503
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   504
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   505
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   506
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   507
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   508
.align	32
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   509
.L${bits}cbc_dec_blk:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   510
	add	$out, $len, $blk_init
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   511
	and	$blk_init, 63, $blk_init	! tail
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   512
	sub	$len, $blk_init, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   513
	add	$blk_init, 15, $blk_init	! round up to 16n
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   514
	srlx	$len, 4, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   515
	srl	$blk_init, 4, $blk_init
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   516
	sub	$len, 1, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   517
	add	$blk_init, 1, $blk_init
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   518
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   519
.L${bits}_cbc_dec_blk_loop2x:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   520
	ldx		[$inp + 0], %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   521
	ldx		[$inp + 8], %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   522
	ldx		[$inp + 16], %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   523
	brz,pt		$ileft, 5f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   524
	ldx		[$inp + 24], %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   525
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   526
	ldx		[$inp + 32], %o4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   527
	sllx		%o0, $ileft, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   528
	srlx		%o1, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   529
	or		%g1, %o0, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   530
	sllx		%o1, $ileft, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   531
	srlx		%o2, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   532
	or		%g1, %o1, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   533
	sllx		%o2, $ileft, %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   534
	srlx		%o3, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   535
	or		%g1, %o2, %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   536
	sllx		%o3, $ileft, %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   537
	srlx		%o4, $iright, %o4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   538
	or		%o4, %o3, %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   539
5:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   540
	xor		%g4, %o0, %o4		! ^= rk[0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   541
	xor		%g5, %o1, %o5
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   542
	movxtod		%o4, %f0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   543
	movxtod		%o5, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   544
	xor		%g4, %o2, %o4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   545
	xor		%g5, %o3, %o5
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   546
	movxtod		%o4, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   547
	movxtod		%o5, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   548
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   549
	prefetch	[$inp + 32+63], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   550
	call		_${alg}${bits}_decrypt_2x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   551
	add		$inp, 32, $inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   552
	subcc		$len, 2, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   553
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   554
	movxtod		%o0, %f8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   555
	movxtod		%o1, %f10
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   556
	fxor		%f12, %f0, %f0		! ^= ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   557
	fxor		%f14, %f2, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   558
	movxtod		%o2, %f12
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   559
	movxtod		%o3, %f14
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   560
	fxor		%f8, %f4, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   561
	fxor		%f10, %f6, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   562
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   563
	stda		%f0, [$out]0xe2		! ASI_BLK_INIT, T4-specific
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   564
	add		$out, 8, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   565
	stda		%f2, [$out]0xe2		! ASI_BLK_INIT, T4-specific
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   566
	add		$out, 8, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   567
	stda		%f4, [$out]0xe2		! ASI_BLK_INIT, T4-specific
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   568
	add		$out, 8, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   569
	stda		%f6, [$out]0xe2		! ASI_BLK_INIT, T4-specific
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   570
	bgu,pt		$::size_t_cc, .L${bits}_cbc_dec_blk_loop2x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   571
	add		$out, 8, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   572
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   573
	add		$blk_init, $len, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   574
	andcc		$len, 1, %g0		! is number of blocks even?
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   575
	membar		#StoreLoad|#StoreStore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   576
	bnz,pt		%icc, .L${bits}_cbc_dec_loop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   577
	srl		$len, 0, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   578
	brnz,pn		$len, .L${bits}_cbc_dec_loop2x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   579
	nop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   580
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   581
$::code.=<<___ if ($::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   582
	st		%f12, [$ivec + 0]	! write out ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   583
	st		%f13, [$ivec + 4]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   584
	st		%f14, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   585
	st		%f15, [$ivec + 12]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   586
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   587
$::code.=<<___ if (!$::evp);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   588
	brnz,pn		$ivoff, 3b
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   589
	nop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   590
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   591
	std		%f12, [$ivec + 0]	! write out ivec
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   592
	std		%f14, [$ivec + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   593
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   594
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   595
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   596
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   597
.type	${alg}${bits}_t4_cbc_decrypt,#function
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   598
.size	${alg}${bits}_t4_cbc_decrypt,.-${alg}${bits}_t4_cbc_decrypt
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   599
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   600
}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   601
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   602
sub alg_ctr32_implement {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   603
my ($alg,$bits) = @_;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   604
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   605
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   606
.globl	${alg}${bits}_t4_ctr32_encrypt
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   607
.align	32
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   608
${alg}${bits}_t4_ctr32_encrypt:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   609
	save		%sp, -$::frame, %sp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   610
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   611
	prefetch	[$inp], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   612
	prefetch	[$inp + 63], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   613
	call		_${alg}${bits}_load_enckey
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   614
	sllx		$len, 4, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   615
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   616
	ld		[$ivec + 0], %l4	! counter
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   617
	ld		[$ivec + 4], %l5
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   618
	ld		[$ivec + 8], %l6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   619
	ld		[$ivec + 12], %l7
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   620
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   621
	sllx		%l4, 32, %o5
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   622
	or		%l5, %o5, %o5
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   623
	sllx		%l6, 32, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   624
	xor		%o5, %g4, %g4		! ^= rk[0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   625
	xor		%g1, %g5, %g5
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   626
	movxtod		%g4, %f14		! most significant 64 bits
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   627
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   628
	sub		$inp, $out, $blk_init	! $inp!=$out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   629
	and		$inp, 7, $ileft
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   630
	andn		$inp, 7, $inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   631
	sll		$ileft, 3, $ileft
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   632
	mov		64, $iright
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   633
	mov		0xff, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   634
	sub		$iright, $ileft, $iright
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   635
	and		$out, 7, $ooff
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   636
	cmp		$len, 255
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   637
	movrnz		$ooff, 0, $blk_init		! if (	$out&7 ||
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   638
	movleu		$::size_t_cc, 0, $blk_init	!	$len<256 ||
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   639
	brnz,pn		$blk_init, .L${bits}_ctr32_blk	!	$inp==$out)
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   640
	srl		$omask, $ooff, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   641
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   642
	andcc		$len, 16, %g0		! is number of blocks even?
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   643
	alignaddrl	$out, %g0, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   644
	bz		%icc, .L${bits}_ctr32_loop2x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   645
	srlx		$len, 4, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   646
.L${bits}_ctr32_loop:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   647
	ldx		[$inp + 0], %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   648
	brz,pt		$ileft, 4f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   649
	ldx		[$inp + 8], %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   650
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   651
	ldx		[$inp + 16], %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   652
	sllx		%o0, $ileft, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   653
	srlx		%o1, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   654
	sllx		%o1, $ileft, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   655
	or		%g1, %o0, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   656
	srlx		%o2, $iright, %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   657
	or		%o2, %o1, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   658
4:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   659
	xor		%g5, %l7, %g1		! ^= rk[0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   660
	add		%l7, 1, %l7
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   661
	movxtod		%g1, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   662
	srl		%l7, 0, %l7		! clruw
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   663
	prefetch	[$out + 63], 22
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   664
	prefetch	[$inp + 16+63], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   665
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   666
$::code.=<<___ if ($alg eq "aes");
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   667
	aes_eround01	%f16, %f14, %f2, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   668
	aes_eround23	%f18, %f14, %f2, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   669
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   670
$::code.=<<___ if ($alg eq "cmll");
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   671
	camellia_f	%f16, %f2, %f14, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   672
	camellia_f	%f18, %f14, %f2, %f0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   673
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   674
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   675
	call		_${alg}${bits}_encrypt_1x+8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   676
	add		$inp, 16, $inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   677
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   678
	movxtod		%o0, %f10
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   679
	movxtod		%o1, %f12
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   680
	fxor		%f10, %f0, %f0		! ^= inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   681
	fxor		%f12, %f2, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   682
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   683
	brnz,pn		$ooff, 2f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   684
	sub		$len, 1, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   685
		
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   686
	std		%f0, [$out + 0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   687
	std		%f2, [$out + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   688
	brnz,pt		$len, .L${bits}_ctr32_loop2x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   689
	add		$out, 16, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   690
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   691
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   692
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   693
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   694
.align	16
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   695
2:	ldxa		[$inp]0x82, %o0		! avoid read-after-write hazard
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   696
						! and ~3x deterioration
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   697
						! in inp==out case
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   698
	faligndata	%f0, %f0, %f4		! handle unaligned output
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   699
	faligndata	%f0, %f2, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   700
	faligndata	%f2, %f2, %f8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   701
	stda		%f4, [$out + $omask]0xc0	! partial store
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   702
	std		%f6, [$out + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   703
	add		$out, 16, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   704
	orn		%g0, $omask, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   705
	stda		%f8, [$out + $omask]0xc0	! partial store
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   706
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   707
	brnz,pt		$len, .L${bits}_ctr32_loop2x+4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   708
	orn		%g0, $omask, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   709
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   710
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   711
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   712
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   713
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   714
.align	32
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   715
.L${bits}_ctr32_loop2x:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   716
	ldx		[$inp + 0], %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   717
	ldx		[$inp + 8], %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   718
	ldx		[$inp + 16], %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   719
	brz,pt		$ileft, 4f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   720
	ldx		[$inp + 24], %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   721
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   722
	ldx		[$inp + 32], %o4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   723
	sllx		%o0, $ileft, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   724
	srlx		%o1, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   725
	or		%g1, %o0, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   726
	sllx		%o1, $ileft, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   727
	srlx		%o2, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   728
	or		%g1, %o1, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   729
	sllx		%o2, $ileft, %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   730
	srlx		%o3, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   731
	or		%g1, %o2, %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   732
	sllx		%o3, $ileft, %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   733
	srlx		%o4, $iright, %o4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   734
	or		%o4, %o3, %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   735
4:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   736
	xor		%g5, %l7, %g1		! ^= rk[0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   737
	add		%l7, 1, %l7
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   738
	movxtod		%g1, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   739
	srl		%l7, 0, %l7		! clruw
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   740
	xor		%g5, %l7, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   741
	add		%l7, 1, %l7
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   742
	movxtod		%g1, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   743
	srl		%l7, 0, %l7		! clruw
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   744
	prefetch	[$out + 63], 22
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   745
	prefetch	[$inp + 32+63], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   746
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   747
$::code.=<<___ if ($alg eq "aes");
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   748
	aes_eround01	%f16, %f14, %f2, %f8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   749
	aes_eround23	%f18, %f14, %f2, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   750
	aes_eround01	%f16, %f14, %f6, %f10
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   751
	aes_eround23	%f18, %f14, %f6, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   752
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   753
$::code.=<<___ if ($alg eq "cmll");
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   754
	camellia_f	%f16, %f2, %f14, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   755
	camellia_f	%f16, %f6, %f14, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   756
	camellia_f	%f18, %f14, %f2, %f0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   757
	camellia_f	%f18, %f14, %f6, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   758
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   759
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   760
	call		_${alg}${bits}_encrypt_2x+16
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   761
	add		$inp, 32, $inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   762
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   763
	movxtod		%o0, %f8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   764
	movxtod		%o1, %f10
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   765
	movxtod		%o2, %f12
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   766
	fxor		%f8, %f0, %f0		! ^= inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   767
	movxtod		%o3, %f8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   768
	fxor		%f10, %f2, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   769
	fxor		%f12, %f4, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   770
	fxor		%f8, %f6, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   771
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   772
	brnz,pn		$ooff, 2f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   773
	sub		$len, 2, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   774
		
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   775
	std		%f0, [$out + 0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   776
	std		%f2, [$out + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   777
	std		%f4, [$out + 16]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   778
	std		%f6, [$out + 24]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   779
	brnz,pt		$len, .L${bits}_ctr32_loop2x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   780
	add		$out, 32, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   781
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   782
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   783
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   784
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   785
.align	16
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   786
2:	ldxa		[$inp]0x82, %o0		! avoid read-after-write hazard
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   787
						! and ~3x deterioration
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   788
						! in inp==out case
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   789
	faligndata	%f0, %f0, %f8		! handle unaligned output
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   790
	faligndata	%f0, %f2, %f0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   791
	faligndata	%f2, %f4, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   792
	faligndata	%f4, %f6, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   793
	faligndata	%f6, %f6, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   794
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   795
	stda		%f8, [$out + $omask]0xc0	! partial store
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   796
	std		%f0, [$out + 8]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   797
	std		%f2, [$out + 16]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   798
	std		%f4, [$out + 24]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   799
	add		$out, 32, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   800
	orn		%g0, $omask, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   801
	stda		%f6, [$out + $omask]0xc0	! partial store
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   802
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   803
	brnz,pt		$len, .L${bits}_ctr32_loop2x+4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   804
	orn		%g0, $omask, $omask
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   805
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   806
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   807
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   808
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   809
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   810
.align	32
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   811
.L${bits}_ctr32_blk:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   812
	add	$out, $len, $blk_init
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   813
	and	$blk_init, 63, $blk_init	! tail
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   814
	sub	$len, $blk_init, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   815
	add	$blk_init, 15, $blk_init	! round up to 16n
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   816
	srlx	$len, 4, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   817
	srl	$blk_init, 4, $blk_init
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   818
	sub	$len, 1, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   819
	add	$blk_init, 1, $blk_init
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   820
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   821
.L${bits}_ctr32_blk_loop2x:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   822
	ldx		[$inp + 0], %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   823
	ldx		[$inp + 8], %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   824
	ldx		[$inp + 16], %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   825
	brz,pt		$ileft, 5f
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   826
	ldx		[$inp + 24], %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   827
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   828
	ldx		[$inp + 32], %o4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   829
	sllx		%o0, $ileft, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   830
	srlx		%o1, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   831
	or		%g1, %o0, %o0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   832
	sllx		%o1, $ileft, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   833
	srlx		%o2, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   834
	or		%g1, %o1, %o1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   835
	sllx		%o2, $ileft, %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   836
	srlx		%o3, $iright, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   837
	or		%g1, %o2, %o2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   838
	sllx		%o3, $ileft, %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   839
	srlx		%o4, $iright, %o4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   840
	or		%o4, %o3, %o3
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   841
5:
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   842
	xor		%g5, %l7, %g1		! ^= rk[0]
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   843
	add		%l7, 1, %l7
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   844
	movxtod		%g1, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   845
	srl		%l7, 0, %l7		! clruw
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   846
	xor		%g5, %l7, %g1
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   847
	add		%l7, 1, %l7
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   848
	movxtod		%g1, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   849
	srl		%l7, 0, %l7		! clruw
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   850
	prefetch	[$inp + 32+63], 20
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   851
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   852
$::code.=<<___ if ($alg eq "aes");
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   853
	aes_eround01	%f16, %f14, %f2, %f8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   854
	aes_eround23	%f18, %f14, %f2, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   855
	aes_eround01	%f16, %f14, %f6, %f10
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   856
	aes_eround23	%f18, %f14, %f6, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   857
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   858
$::code.=<<___ if ($alg eq "cmll");
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   859
	camellia_f	%f16, %f2, %f14, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   860
	camellia_f	%f16, %f6, %f14, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   861
	camellia_f	%f18, %f14, %f2, %f0
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   862
	camellia_f	%f18, %f14, %f6, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   863
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   864
$::code.=<<___;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   865
	call		_${alg}${bits}_encrypt_2x+16
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   866
	add		$inp, 32, $inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   867
	subcc		$len, 2, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   868
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   869
	movxtod		%o0, %f8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   870
	movxtod		%o1, %f10
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   871
	movxtod		%o2, %f12
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   872
	fxor		%f8, %f0, %f0		! ^= inp
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   873
	movxtod		%o3, %f8
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   874
	fxor		%f10, %f2, %f2
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   875
	fxor		%f12, %f4, %f4
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   876
	fxor		%f8, %f6, %f6
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   877
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   878
	stda		%f0, [$out]0xe2		! ASI_BLK_INIT, T4-specific
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   879
	add		$out, 8, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   880
	stda		%f2, [$out]0xe2		! ASI_BLK_INIT, T4-specific
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   881
	add		$out, 8, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   882
	stda		%f4, [$out]0xe2		! ASI_BLK_INIT, T4-specific
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   883
	add		$out, 8, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   884
	stda		%f6, [$out]0xe2		! ASI_BLK_INIT, T4-specific
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   885
	bgu,pt		$::size_t_cc, .L${bits}_ctr32_blk_loop2x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   886
	add		$out, 8, $out
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   887
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   888
	add		$blk_init, $len, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   889
	andcc		$len, 1, %g0		! is number of blocks even?
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   890
	membar		#StoreLoad|#StoreStore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   891
	bnz,pt		%icc, .L${bits}_ctr32_loop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   892
	srl		$len, 0, $len
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   893
	brnz,pn		$len, .L${bits}_ctr32_loop2x
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   894
	nop
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   895
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   896
	ret
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   897
	restore
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   898
.type	${alg}${bits}_t4_ctr32_encrypt,#function
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   899
.size	${alg}${bits}_t4_ctr32_encrypt,.-${alg}${bits}_t4_ctr32_encrypt
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   900
___
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   901
}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   902
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   903
sub alg_xts_implement {
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   904
my ($alg,$bits,$dir) = @_;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   905
my ($inp,$out,$len,$key1,$key2,$ivec)=map("%i$_",(0..5));
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   906
my $rem=$ivec;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   907
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   908
$::code.=<<___;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   909
.globl	${alg}${bits}_t4_xts_${dir}crypt
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   910
.align	32
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   911
${alg}${bits}_t4_xts_${dir}crypt:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   912
	save		%sp, -$::frame-16, %sp
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   913
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   914
	mov		$ivec, %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   915
	add		%fp, $::bias-16, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   916
	call		${alg}_t4_encrypt
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   917
	mov		$key2, %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   918
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   919
	add		%fp, $::bias-16, %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   920
	ldxa		[%l7]0x88, %g2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   921
	add		%fp, $::bias-8, %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   922
	ldxa		[%l7]0x88, %g3		! %g3:%g2 is tweak
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   923
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   924
	sethi		%hi(0x76543210), %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   925
	or		%l7, %lo(0x76543210), %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   926
	bmask		%l7, %g0, %g0		! byte swap mask
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   927
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   928
	prefetch	[$inp], 20
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   929
	prefetch	[$inp + 63], 20
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   930
	call		_${alg}${bits}_load_${dir}ckey
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   931
	and		$len, 15,  $rem
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   932
	and		$len, -16, $len
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   933
___
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   934
$code.=<<___ if ($dir eq "de");
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   935
	mov		0, %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   936
	movrnz		$rem, 16,  %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   937
	sub		$len, %l7, $len
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   938
___
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   939
$code.=<<___;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   940
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   941
	sub		$inp, $out, $blk_init	! $inp!=$out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   942
	and		$inp, 7, $ileft
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   943
	andn		$inp, 7, $inp
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   944
	sll		$ileft, 3, $ileft
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   945
	mov		64, $iright
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   946
	mov		0xff, $omask
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   947
	sub		$iright, $ileft, $iright
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   948
	and		$out, 7, $ooff
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   949
	cmp		$len, 255
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   950
	movrnz		$ooff, 0, $blk_init		! if (	$out&7 ||
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   951
	movleu		$::size_t_cc, 0, $blk_init	!	$len<256 ||
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   952
	brnz,pn		$blk_init, .L${bits}_xts_${dir}blk !	$inp==$out)
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   953
	srl		$omask, $ooff, $omask
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   954
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   955
	andcc		$len, 16, %g0		! is number of blocks even?
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   956
___
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   957
$code.=<<___ if ($dir eq "de");
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   958
	brz,pn		$len, .L${bits}_xts_${dir}steal
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   959
___
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   960
$code.=<<___;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   961
	alignaddrl	$out, %g0, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   962
	bz		%icc, .L${bits}_xts_${dir}loop2x
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   963
	srlx		$len, 4, $len
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   964
.L${bits}_xts_${dir}loop:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   965
	ldx		[$inp + 0], %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   966
	brz,pt		$ileft, 4f
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   967
	ldx		[$inp + 8], %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   968
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   969
	ldx		[$inp + 16], %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   970
	sllx		%o0, $ileft, %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   971
	srlx		%o1, $iright, %g1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   972
	sllx		%o1, $ileft, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   973
	or		%g1, %o0, %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   974
	srlx		%o2, $iright, %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   975
	or		%o2, %o1, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   976
4:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   977
	movxtod		%g2, %f12
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   978
	movxtod		%g3, %f14
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   979
	bshuffle	%f12, %f12, %f12
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   980
	bshuffle	%f14, %f14, %f14
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   981
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   982
	xor		%g4, %o0, %o0		! ^= rk[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   983
	xor		%g5, %o1, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   984
	movxtod		%o0, %f0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   985
	movxtod		%o1, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   986
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   987
	fxor		%f12, %f0, %f0		! ^= tweak[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   988
	fxor		%f14, %f2, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   989
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   990
	prefetch	[$out + 63], 22
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   991
	prefetch	[$inp + 16+63], 20
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   992
	call		_${alg}${bits}_${dir}crypt_1x
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   993
	add		$inp, 16, $inp
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   994
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   995
	fxor		%f12, %f0, %f0		! ^= tweak[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   996
	fxor		%f14, %f2, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   997
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   998
	srax		%g3, 63, %l7		! next tweak value
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
   999
	addcc		%g2, %g2, %g2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1000
	and		%l7, 0x87, %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1001
	addxc		%g3, %g3, %g3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1002
	xor		%l7, %g2, %g2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1003
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1004
	brnz,pn		$ooff, 2f
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1005
	sub		$len, 1, $len
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1006
		
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1007
	std		%f0, [$out + 0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1008
	std		%f2, [$out + 8]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1009
	brnz,pt		$len, .L${bits}_xts_${dir}loop2x
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1010
	add		$out, 16, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1011
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1012
	brnz,pn		$rem, .L${bits}_xts_${dir}steal
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1013
	nop
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1014
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1015
	ret
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1016
	restore
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1017
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1018
.align	16
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1019
2:	ldxa		[$inp]0x82, %o0		! avoid read-after-write hazard
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1020
						! and ~3x deterioration
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1021
						! in inp==out case
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1022
	faligndata	%f0, %f0, %f4		! handle unaligned output
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1023
	faligndata	%f0, %f2, %f6
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1024
	faligndata	%f2, %f2, %f8
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1025
	stda		%f4, [$out + $omask]0xc0	! partial store
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1026
	std		%f6, [$out + 8]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1027
	add		$out, 16, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1028
	orn		%g0, $omask, $omask
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1029
	stda		%f8, [$out + $omask]0xc0	! partial store
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1030
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1031
	brnz,pt		$len, .L${bits}_xts_${dir}loop2x+4
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1032
	orn		%g0, $omask, $omask
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1033
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1034
	brnz,pn		$rem, .L${bits}_xts_${dir}steal
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1035
	nop
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1036
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1037
	ret
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1038
	restore
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1039
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1040
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1041
.align	32
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1042
.L${bits}_xts_${dir}loop2x:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1043
	ldx		[$inp + 0], %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1044
	ldx		[$inp + 8], %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1045
	ldx		[$inp + 16], %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1046
	brz,pt		$ileft, 4f
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1047
	ldx		[$inp + 24], %o3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1048
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1049
	ldx		[$inp + 32], %o4
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1050
	sllx		%o0, $ileft, %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1051
	srlx		%o1, $iright, %g1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1052
	or		%g1, %o0, %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1053
	sllx		%o1, $ileft, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1054
	srlx		%o2, $iright, %g1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1055
	or		%g1, %o1, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1056
	sllx		%o2, $ileft, %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1057
	srlx		%o3, $iright, %g1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1058
	or		%g1, %o2, %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1059
	sllx		%o3, $ileft, %o3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1060
	srlx		%o4, $iright, %o4
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1061
	or		%o4, %o3, %o3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1062
4:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1063
	movxtod		%g2, %f12
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1064
	movxtod		%g3, %f14
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1065
	bshuffle	%f12, %f12, %f12
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1066
	bshuffle	%f14, %f14, %f14
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1067
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1068
	srax		%g3, 63, %l7		! next tweak value
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1069
	addcc		%g2, %g2, %g2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1070
	and		%l7, 0x87, %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1071
	addxc		%g3, %g3, %g3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1072
	xor		%l7, %g2, %g2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1073
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1074
	movxtod		%g2, %f8
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1075
	movxtod		%g3, %f10
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1076
	bshuffle	%f8,  %f8,  %f8
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1077
	bshuffle	%f10, %f10, %f10
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1078
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1079
	xor		%g4, %o0, %o0		! ^= rk[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1080
	xor		%g5, %o1, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1081
	xor		%g4, %o2, %o2		! ^= rk[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1082
	xor		%g5, %o3, %o3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1083
	movxtod		%o0, %f0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1084
	movxtod		%o1, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1085
	movxtod		%o2, %f4
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1086
	movxtod		%o3, %f6
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1087
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1088
	fxor		%f12, %f0, %f0		! ^= tweak[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1089
	fxor		%f14, %f2, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1090
	fxor		%f8,  %f4, %f4		! ^= tweak[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1091
	fxor		%f10, %f6, %f6
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1092
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1093
	prefetch	[$out + 63], 22
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1094
	prefetch	[$inp + 32+63], 20
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1095
	call		_${alg}${bits}_${dir}crypt_2x
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1096
	add		$inp, 32, $inp
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1097
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1098
	movxtod		%g2, %f8
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1099
	movxtod		%g3, %f10
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1100
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1101
	srax		%g3, 63, %l7		! next tweak value
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1102
	addcc		%g2, %g2, %g2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1103
	and		%l7, 0x87, %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1104
	addxc		%g3, %g3, %g3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1105
	xor		%l7, %g2, %g2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1106
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1107
	bshuffle	%f8,  %f8,  %f8
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1108
	bshuffle	%f10, %f10, %f10
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1109
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1110
	fxor		%f12, %f0, %f0		! ^= tweak[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1111
	fxor		%f14, %f2, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1112
	fxor		%f8,  %f4, %f4
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1113
	fxor		%f10, %f6, %f6
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1114
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1115
	brnz,pn		$ooff, 2f
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1116
	sub		$len, 2, $len
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1117
		
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1118
	std		%f0, [$out + 0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1119
	std		%f2, [$out + 8]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1120
	std		%f4, [$out + 16]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1121
	std		%f6, [$out + 24]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1122
	brnz,pt		$len, .L${bits}_xts_${dir}loop2x
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1123
	add		$out, 32, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1124
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1125
	fsrc2		%f4, %f0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1126
	fsrc2		%f6, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1127
	brnz,pn		$rem, .L${bits}_xts_${dir}steal
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1128
	nop
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1129
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1130
	ret
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1131
	restore
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1132
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1133
.align	16
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1134
2:	ldxa		[$inp]0x82, %o0		! avoid read-after-write hazard
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1135
						! and ~3x deterioration
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1136
						! in inp==out case
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1137
	faligndata	%f0, %f0, %f8		! handle unaligned output
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1138
	faligndata	%f0, %f2, %f10
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1139
	faligndata	%f2, %f4, %f12
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1140
	faligndata	%f4, %f6, %f14
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1141
	faligndata	%f6, %f6, %f0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1142
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1143
	stda		%f8, [$out + $omask]0xc0	! partial store
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1144
	std		%f10, [$out + 8]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1145
	std		%f12, [$out + 16]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1146
	std		%f14, [$out + 24]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1147
	add		$out, 32, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1148
	orn		%g0, $omask, $omask
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1149
	stda		%f0, [$out + $omask]0xc0	! partial store
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1150
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1151
	brnz,pt		$len, .L${bits}_xts_${dir}loop2x+4
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1152
	orn		%g0, $omask, $omask
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1153
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1154
	fsrc2		%f4, %f0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1155
	fsrc2		%f6, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1156
	brnz,pn		$rem, .L${bits}_xts_${dir}steal
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1157
	nop
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1158
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1159
	ret
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1160
	restore
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1161
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1162
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1163
.align	32
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1164
.L${bits}_xts_${dir}blk:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1165
	add	$out, $len, $blk_init
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1166
	and	$blk_init, 63, $blk_init	! tail
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1167
	sub	$len, $blk_init, $len
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1168
	add	$blk_init, 15, $blk_init	! round up to 16n
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1169
	srlx	$len, 4, $len
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1170
	srl	$blk_init, 4, $blk_init
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1171
	sub	$len, 1, $len
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1172
	add	$blk_init, 1, $blk_init
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1173
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1174
.L${bits}_xts_${dir}blk2x:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1175
	ldx		[$inp + 0], %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1176
	ldx		[$inp + 8], %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1177
	ldx		[$inp + 16], %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1178
	brz,pt		$ileft, 5f
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1179
	ldx		[$inp + 24], %o3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1180
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1181
	ldx		[$inp + 32], %o4
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1182
	sllx		%o0, $ileft, %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1183
	srlx		%o1, $iright, %g1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1184
	or		%g1, %o0, %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1185
	sllx		%o1, $ileft, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1186
	srlx		%o2, $iright, %g1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1187
	or		%g1, %o1, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1188
	sllx		%o2, $ileft, %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1189
	srlx		%o3, $iright, %g1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1190
	or		%g1, %o2, %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1191
	sllx		%o3, $ileft, %o3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1192
	srlx		%o4, $iright, %o4
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1193
	or		%o4, %o3, %o3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1194
5:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1195
	movxtod		%g2, %f12
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1196
	movxtod		%g3, %f14
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1197
	bshuffle	%f12, %f12, %f12
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1198
	bshuffle	%f14, %f14, %f14
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1199
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1200
	srax		%g3, 63, %l7		! next tweak value
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1201
	addcc		%g2, %g2, %g2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1202
	and		%l7, 0x87, %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1203
	addxc		%g3, %g3, %g3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1204
	xor		%l7, %g2, %g2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1205
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1206
	movxtod		%g2, %f8
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1207
	movxtod		%g3, %f10
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1208
	bshuffle	%f8,  %f8,  %f8
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1209
	bshuffle	%f10, %f10, %f10
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1210
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1211
	xor		%g4, %o0, %o0		! ^= rk[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1212
	xor		%g5, %o1, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1213
	xor		%g4, %o2, %o2		! ^= rk[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1214
	xor		%g5, %o3, %o3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1215
	movxtod		%o0, %f0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1216
	movxtod		%o1, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1217
	movxtod		%o2, %f4
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1218
	movxtod		%o3, %f6
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1219
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1220
	fxor		%f12, %f0, %f0		! ^= tweak[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1221
	fxor		%f14, %f2, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1222
	fxor		%f8,  %f4, %f4		! ^= tweak[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1223
	fxor		%f10, %f6, %f6
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1224
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1225
	prefetch	[$inp + 32+63], 20
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1226
	call		_${alg}${bits}_${dir}crypt_2x
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1227
	add		$inp, 32, $inp
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1228
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1229
	movxtod		%g2, %f8
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1230
	movxtod		%g3, %f10
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1231
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1232
	srax		%g3, 63, %l7		! next tweak value
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1233
	addcc		%g2, %g2, %g2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1234
	and		%l7, 0x87, %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1235
	addxc		%g3, %g3, %g3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1236
	xor		%l7, %g2, %g2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1237
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1238
	bshuffle	%f8,  %f8,  %f8
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1239
	bshuffle	%f10, %f10, %f10
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1240
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1241
	fxor		%f12, %f0, %f0		! ^= tweak[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1242
	fxor		%f14, %f2, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1243
	fxor		%f8,  %f4, %f4
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1244
	fxor		%f10, %f6, %f6
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1245
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1246
	stda		%f0, [$out]0xe2		! ASI_BLK_INIT, T4-specific
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1247
	add		$out, 8, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1248
	stda		%f2, [$out]0xe2		! ASI_BLK_INIT, T4-specific
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1249
	add		$out, 8, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1250
	stda		%f4, [$out]0xe2		! ASI_BLK_INIT, T4-specific
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1251
	add		$out, 8, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1252
	stda		%f6, [$out]0xe2		! ASI_BLK_INIT, T4-specific
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1253
	bgu,pt		$::size_t_cc, .L${bits}_xts_${dir}blk2x
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1254
	add		$out, 8, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1255
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1256
	add		$blk_init, $len, $len
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1257
	andcc		$len, 1, %g0		! is number of blocks even?
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1258
	membar		#StoreLoad|#StoreStore
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1259
	bnz,pt		%icc, .L${bits}_xts_${dir}loop
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1260
	srl		$len, 0, $len
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1261
	brnz,pn		$len, .L${bits}_xts_${dir}loop2x
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1262
	nop
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1263
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1264
	fsrc2		%f4, %f0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1265
	fsrc2		%f6, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1266
	brnz,pn		$rem, .L${bits}_xts_${dir}steal
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1267
	nop
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1268
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1269
	ret
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1270
	restore
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1271
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1272
___
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1273
$code.=<<___ if ($dir eq "en");
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1274
.align	32
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1275
.L${bits}_xts_${dir}steal:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1276
	std		%f0, [%fp + $::bias-16]	! copy of output
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1277
	std		%f2, [%fp + $::bias-8]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1278
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1279
	srl		$ileft, 3, $ileft
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1280
	add		%fp, $::bias-16, %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1281
	add		$inp, $ileft, $inp	! original $inp+$len&-15
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1282
	add		$out, $ooff, $out	! original $out+$len&-15
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1283
	mov		0, $ileft
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1284
	nop					! align
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1285
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1286
.L${bits}_xts_${dir}stealing:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1287
	ldub		[$inp + $ileft], %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1288
	ldub		[%l7  + $ileft], %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1289
	dec		$rem
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1290
	stb		%o0, [%l7  + $ileft]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1291
	stb		%o1, [$out + $ileft]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1292
	brnz		$rem, .L${bits}_xts_${dir}stealing
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1293
	inc		$ileft
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1294
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1295
	mov		%l7, $inp
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1296
	sub		$out, 16, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1297
	mov		0, $ileft
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1298
	sub		$out, $ooff, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1299
	ba		.L${bits}_xts_${dir}loop	! one more time
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1300
	mov		1, $len				! $rem is 0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1301
___
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1302
$code.=<<___ if ($dir eq "de");
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1303
.align	32
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1304
.L${bits}_xts_${dir}steal:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1305
	ldx		[$inp + 0], %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1306
	brz,pt		$ileft, 8f
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1307
	ldx		[$inp + 8], %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1308
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1309
	ldx		[$inp + 16], %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1310
	sllx		%o0, $ileft, %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1311
	srlx		%o1, $iright, %g1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1312
	sllx		%o1, $ileft, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1313
	or		%g1, %o0, %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1314
	srlx		%o2, $iright, %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1315
	or		%o2, %o1, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1316
8:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1317
	srax		%g3, 63, %l7		! next tweak value
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1318
	addcc		%g2, %g2, %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1319
	and		%l7, 0x87, %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1320
	addxc		%g3, %g3, %o3
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1321
	xor		%l7, %o2, %o2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1322
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1323
	movxtod		%o2, %f12
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1324
	movxtod		%o3, %f14
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1325
	bshuffle	%f12, %f12, %f12
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1326
	bshuffle	%f14, %f14, %f14
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1327
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1328
	xor		%g4, %o0, %o0		! ^= rk[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1329
	xor		%g5, %o1, %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1330
	movxtod		%o0, %f0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1331
	movxtod		%o1, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1332
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1333
	fxor		%f12, %f0, %f0		! ^= tweak[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1334
	fxor		%f14, %f2, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1335
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1336
	call		_${alg}${bits}_${dir}crypt_1x
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1337
	add		$inp, 16, $inp
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1338
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1339
	fxor		%f12, %f0, %f0		! ^= tweak[0]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1340
	fxor		%f14, %f2, %f2
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1341
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1342
	std		%f0, [%fp + $::bias-16]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1343
	std		%f2, [%fp + $::bias-8]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1344
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1345
	srl		$ileft, 3, $ileft
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1346
	add		%fp, $::bias-16, %l7
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1347
	add		$inp, $ileft, $inp	! original $inp+$len&-15
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1348
	add		$out, $ooff, $out	! original $out+$len&-15
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1349
	mov		0, $ileft
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1350
	add		$out, 16, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1351
	nop					! align
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1352
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1353
.L${bits}_xts_${dir}stealing:
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1354
	ldub		[$inp + $ileft], %o0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1355
	ldub		[%l7  + $ileft], %o1
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1356
	dec		$rem
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1357
	stb		%o0, [%l7  + $ileft]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1358
	stb		%o1, [$out + $ileft]
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1359
	brnz		$rem, .L${bits}_xts_${dir}stealing
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1360
	inc		$ileft
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1361
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1362
	mov		%l7, $inp
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1363
	sub		$out, 16, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1364
	mov		0, $ileft
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1365
	sub		$out, $ooff, $out
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1366
	ba		.L${bits}_xts_${dir}loop	! one more time
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1367
	mov		1, $len				! $rem is 0
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1368
___
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1369
$code.=<<___;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1370
	ret
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1371
	restore
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1372
.type	${alg}${bits}_t4_xts_${dir}crypt,#function
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1373
.size	${alg}${bits}_t4_xts_${dir}crypt,.-${alg}${bits}_t4_xts_${dir}crypt
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1374
___
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1375
}
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1376
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1377
# Purpose of these subroutines is to explicitly encode VIS instructions,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1378
# so that one can compile the module without having to specify VIS
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1379
# extentions on compiler command line, e.g. -xarch=v9 vs. -xarch=v9a.
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1380
# Idea is to reserve for option to produce "universal" binary and let
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1381
# programmer detect if current CPU is VIS capable at run-time.
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1382
sub unvis {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1383
my ($mnemonic,$rs1,$rs2,$rd)=@_;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1384
my ($ref,$opf);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1385
my %visopf = (	"faligndata"	=> 0x048,
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1386
		"bshuffle"	=> 0x04c,
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1387
		"fnot2"		=> 0x066,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1388
		"fxor"		=> 0x06c,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1389
		"fsrc2"		=> 0x078	);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1390
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1391
    $ref = "$mnemonic\t$rs1,$rs2,$rd";
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1392
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1393
    if ($opf=$visopf{$mnemonic}) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1394
	foreach ($rs1,$rs2,$rd) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1395
	    return $ref if (!/%f([0-9]{1,2})/);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1396
	    $_=$1;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1397
	    if ($1>=32) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1398
		return $ref if ($1&1);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1399
		# re-encode for upper double register addressing
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1400
		$_=($1|$1>>5)&31;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1401
	    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1402
	}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1403
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1404
	return	sprintf ".word\t0x%08x !%s",
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1405
			0x81b00000|$rd<<25|$rs1<<14|$opf<<5|$rs2,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1406
			$ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1407
    } else {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1408
	return $ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1409
    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1410
}
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1411
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1412
sub unvis3 {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1413
my ($mnemonic,$rs1,$rs2,$rd)=@_;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1414
my %bias = ( "g" => 0, "o" => 8, "l" => 16, "i" => 24 );
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1415
my ($ref,$opf);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1416
my %visopf = (	"addxc"		=> 0x011,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1417
		"addxccc"	=> 0x013,
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1418
		"umulxhi"	=> 0x016,
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1419
		"alignaddr"	=> 0x018,
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1420
		"bmask"		=> 0x019,
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1421
		"alignaddrl"	=> 0x01a	);
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1422
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1423
    $ref = "$mnemonic\t$rs1,$rs2,$rd";
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1424
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1425
    if ($opf=$visopf{$mnemonic}) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1426
	foreach ($rs1,$rs2,$rd) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1427
	    return $ref if (!/%([goli])([0-9])/);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1428
	    $_=$bias{$1}+$2;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1429
	}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1430
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1431
	return	sprintf ".word\t0x%08x !%s",
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1432
			0x81b00000|$rd<<25|$rs1<<14|$opf<<5|$rs2,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1433
			$ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1434
    } else {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1435
	return $ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1436
    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1437
}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1438
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1439
sub unaes_round {	# 4-argument instructions
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1440
my ($mnemonic,$rs1,$rs2,$rs3,$rd)=@_;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1441
my ($ref,$opf);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1442
my %aesopf = (	"aes_eround01"	=> 0,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1443
		"aes_eround23"	=> 1,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1444
		"aes_dround01"	=> 2,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1445
		"aes_dround23"	=> 3,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1446
		"aes_eround01_l"=> 4,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1447
		"aes_eround23_l"=> 5,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1448
		"aes_dround01_l"=> 6,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1449
		"aes_dround23_l"=> 7,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1450
		"aes_kexpand1"	=> 8	);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1451
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1452
    $ref = "$mnemonic\t$rs1,$rs2,$rs3,$rd";
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1453
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1454
    if (defined($opf=$aesopf{$mnemonic})) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1455
	$rs3 = ($rs3 =~ /%f([0-6]*[02468])/) ? (($1|$1>>5)&31) : $rs3;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1456
	foreach ($rs1,$rs2,$rd) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1457
	    return $ref if (!/%f([0-9]{1,2})/);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1458
	    $_=$1;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1459
	    if ($1>=32) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1460
		return $ref if ($1&1);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1461
		# re-encode for upper double register addressing
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1462
		$_=($1|$1>>5)&31;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1463
	    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1464
	}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1465
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1466
	return	sprintf ".word\t0x%08x !%s",
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1467
			2<<30|$rd<<25|0x19<<19|$rs1<<14|$rs3<<9|$opf<<5|$rs2,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1468
			$ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1469
    } else {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1470
	return $ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1471
    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1472
}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1473
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1474
sub unaes_kexpand {	# 3-argument instructions
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1475
my ($mnemonic,$rs1,$rs2,$rd)=@_;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1476
my ($ref,$opf);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1477
my %aesopf = (	"aes_kexpand0"	=> 0x130,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1478
		"aes_kexpand2"	=> 0x131	);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1479
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1480
    $ref = "$mnemonic\t$rs1,$rs2,$rd";
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1481
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1482
    if (defined($opf=$aesopf{$mnemonic})) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1483
	foreach ($rs1,$rs2,$rd) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1484
	    return $ref if (!/%f([0-9]{1,2})/);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1485
	    $_=$1;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1486
	    if ($1>=32) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1487
		return $ref if ($1&1);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1488
		# re-encode for upper double register addressing
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1489
		$_=($1|$1>>5)&31;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1490
	    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1491
	}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1492
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1493
	return	sprintf ".word\t0x%08x !%s",
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1494
			2<<30|$rd<<25|0x36<<19|$rs1<<14|$opf<<5|$rs2,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1495
			$ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1496
    } else {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1497
	return $ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1498
    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1499
}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1500
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1501
sub uncamellia_f {	# 4-argument instructions
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1502
my ($mnemonic,$rs1,$rs2,$rs3,$rd)=@_;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1503
my ($ref,$opf);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1504
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1505
    $ref = "$mnemonic\t$rs1,$rs2,$rs3,$rd";
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1506
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1507
    if (1) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1508
	$rs3 = ($rs3 =~ /%f([0-6]*[02468])/) ? (($1|$1>>5)&31) : $rs3;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1509
	foreach ($rs1,$rs2,$rd) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1510
	    return $ref if (!/%f([0-9]{1,2})/);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1511
	    $_=$1;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1512
	    if ($1>=32) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1513
		return $ref if ($1&1);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1514
		# re-encode for upper double register addressing
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1515
		$_=($1|$1>>5)&31;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1516
	    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1517
	}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1518
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1519
	return	sprintf ".word\t0x%08x !%s",
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1520
			2<<30|$rd<<25|0x19<<19|$rs1<<14|$rs3<<9|0xc<<5|$rs2,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1521
			$ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1522
    } else {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1523
	return $ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1524
    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1525
}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1526
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1527
sub uncamellia3 {	# 3-argument instructions
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1528
my ($mnemonic,$rs1,$rs2,$rd)=@_;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1529
my ($ref,$opf);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1530
my %cmllopf = (	"camellia_fl"	=> 0x13c,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1531
		"camellia_fli"	=> 0x13d	);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1532
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1533
    $ref = "$mnemonic\t$rs1,$rs2,$rd";
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1534
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1535
    if (defined($opf=$cmllopf{$mnemonic})) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1536
	foreach ($rs1,$rs2,$rd) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1537
	    return $ref if (!/%f([0-9]{1,2})/);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1538
	    $_=$1;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1539
	    if ($1>=32) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1540
		return $ref if ($1&1);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1541
		# re-encode for upper double register addressing
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1542
		$_=($1|$1>>5)&31;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1543
	    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1544
	}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1545
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1546
	return	sprintf ".word\t0x%08x !%s",
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1547
			2<<30|$rd<<25|0x36<<19|$rs1<<14|$opf<<5|$rs2,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1548
			$ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1549
    } else {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1550
	return $ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1551
    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1552
}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1553
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1554
sub unmovxtox {		# 2-argument instructions
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1555
my ($mnemonic,$rs,$rd)=@_;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1556
my %bias = ( "g" => 0, "o" => 8, "l" => 16, "i" => 24, "f" => 0 );
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1557
my ($ref,$opf);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1558
my %movxopf = (	"movdtox"	=> 0x110,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1559
		"movstouw"	=> 0x111,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1560
		"movstosw"	=> 0x113,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1561
		"movxtod"	=> 0x118,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1562
		"movwtos"	=> 0x119	);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1563
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1564
    $ref = "$mnemonic\t$rs,$rd";
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1565
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1566
    if (defined($opf=$movxopf{$mnemonic})) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1567
	foreach ($rs,$rd) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1568
	    return $ref if (!/%([fgoli])([0-9]{1,2})/);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1569
	    $_=$bias{$1}+$2;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1570
	    if ($2>=32) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1571
		return $ref if ($2&1);
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1572
		# re-encode for upper double register addressing
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1573
		$_=($2|$2>>5)&31;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1574
	    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1575
	}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1576
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1577
	return	sprintf ".word\t0x%08x !%s",
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1578
			2<<30|$rd<<25|0x36<<19|$opf<<5|$rs,
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1579
			$ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1580
    } else {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1581
	return $ref;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1582
    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1583
}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1584
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1585
sub undes {
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1586
my ($mnemonic)=shift;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1587
my @args=@_;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1588
my ($ref,$opf);
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1589
my %desopf = (	"des_round"	=> 0b1001,
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1590
		"des_ip"	=> 0b100110100,
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1591
		"des_iip"	=> 0b100110101,
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1592
		"des_kexpand"	=> 0b100110110	);
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1593
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1594
    $ref = "$mnemonic\t".join(",",@_);
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1595
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1596
    if (defined($opf=$desopf{$mnemonic})) {	# 4-arg
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1597
	if ($mnemonic eq "des_round") {
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1598
	    foreach (@args[0..3]) {
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1599
		return $ref if (!/%f([0-9]{1,2})/);
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1600
		$_=$1;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1601
		if ($1>=32) {
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1602
		    return $ref if ($1&1);
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1603
		    # re-encode for upper double register addressing
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1604
		    $_=($1|$1>>5)&31;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1605
		}
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1606
	    }
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1607
	    return  sprintf ".word\t0x%08x !%s",
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1608
			    2<<30|0b011001<<19|$opf<<5|$args[0]<<14|$args[1]|$args[2]<<9|$args[3]<<25,
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1609
			    $ref;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1610
	} elsif ($mnemonic eq "des_kexpand") {	# 3-arg
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1611
	    foreach (@args[0..2]) {
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1612
		return $ref if (!/(%f)?([0-9]{1,2})/);
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1613
		$_=$2;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1614
		if ($2>=32) {
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1615
		    return $ref if ($2&1);
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1616
		    # re-encode for upper double register addressing
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1617
		    $_=($2|$2>>5)&31;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1618
		}
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1619
	    }
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1620
	    return  sprintf ".word\t0x%08x !%s",
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1621
			    2<<30|0b110110<<19|$opf<<5|$args[0]<<14|$args[1]|$args[2]<<25,
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1622
			    $ref;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1623
	} else {				# 2-arg
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1624
	    foreach (@args[0..1]) {
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1625
		return $ref if (!/%f([0-9]{1,2})/);
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1626
		$_=$1;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1627
		if ($1>=32) {
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1628
		    return $ref if ($2&1);
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1629
		    # re-encode for upper double register addressing
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1630
		    $_=($1|$1>>5)&31;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1631
		}
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1632
	    }
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1633
	    return  sprintf ".word\t0x%08x !%s",
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1634
			    2<<30|0b110110<<19|$opf<<5|$args[0]<<14|$args[1]<<25,
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1635
			    $ref;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1636
	}
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1637
    } else {
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1638
	return $ref;
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1639
    }
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1640
}
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1641
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1642
sub emit_assembler {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1643
    foreach (split("\n",$::code)) {
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1644
	s/\`([^\`]*)\`/eval $1/ge;
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1645
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1646
	s/\b(f[a-z]+2[sd]*)\s+(%f[0-9]{1,2}),\s*(%f[0-9]{1,2})\s*$/$1\t%f0,$2,$3/go;
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1647
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1648
	s/\b(aes_[edk][^\s]*)\s+(%f[0-9]{1,2}),\s*(%f[0-9]{1,2}),\s*([%fx0-9]+),\s*(%f[0-9]{1,2})/
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1649
		&unaes_round($1,$2,$3,$4,$5)
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1650
	 /geo or
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1651
	s/\b(aes_kexpand[02])\s+(%f[0-9]{1,2}),\s*(%f[0-9]{1,2}),\s*(%f[0-9]{1,2})/
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1652
		&unaes_kexpand($1,$2,$3,$4)
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1653
	 /geo or
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1654
	s/\b(camellia_f)\s+(%f[0-9]{1,2}),\s*(%f[0-9]{1,2}),\s*([%fx0-9]+),\s*(%f[0-9]{1,2})/
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1655
		&uncamellia_f($1,$2,$3,$4,$5)
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1656
	 /geo or
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1657
	s/\b(camellia_[^s]+)\s+(%f[0-9]{1,2}),\s*(%f[0-9]{1,2}),\s*(%f[0-9]{1,2})/
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1658
		&uncamellia3($1,$2,$3,$4)
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1659
	 /geo or
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1660
	s/\b(des_\w+)\s+(?<rs1>%f[0-9]{1,2}),\s*(?<rs2>[%fx0-9]+)(,\s*(?<rs3>%f[0-9]{1,2})(,\s*(?<rs4>%f[0-9]{1,2}))?)?/
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1661
		&undes($1,$+{rs1},$+{rs2},$+{rs3},$+{rs4})
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1662
	 /geo or
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1663
	s/\b(mov[ds]to\w+)\s+(%f[0-9]{1,2}),\s*(%[goli][0-7])/
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1664
		&unmovxtox($1,$2,$3)
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1665
	 /geo or
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1666
	s/\b(mov[xw]to[ds])\s+(%[goli][0-7]),\s*(%f[0-9]{1,2})/
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1667
		&unmovxtox($1,$2,$3)
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1668
	 /geo or
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1669
	s/\b([fb][^\s]*)\s+(%f[0-9]{1,2}),\s*(%f[0-9]{1,2}),\s*(%f[0-9]{1,2})/
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1670
		&unvis($1,$2,$3,$4)
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1671
	 /geo or
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1672
	s/\b(umulxhi|bmask|addxc[c]{0,2}|alignaddr[l]*)\s+(%[goli][0-7]),\s*(%[goli][0-7]),\s*(%[goli][0-7])/
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1673
		&unvis3($1,$2,$3,$4)
1373
2fd83bee8884 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents: 1341
diff changeset
  1674
	 /geo;
1341
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1675
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1676
	print $_,"\n";
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1677
    }
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1678
}
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1679
af3d6ef22d65 PSARC 2013/034 OpenSSL 1.0.1
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
  1680
1;