components/openssl/openssl-1.0.1/inline-t4/vis3-mont.pl
author Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
Tue, 06 Aug 2013 08:08:18 -0700
branchs11-update
changeset 2717 da0ef75be98f
permissions -rw-r--r--
15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src 16921388 T4 DES should be embedded in the OpenSSL upstream src 17193314 ssh dumps core when using aes128-cbc cipher on T4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2717
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     1
#!/usr/bin/env perl
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     2
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     3
# ====================================================================
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     4
# Written by Andy Polyakov <[email protected]> for the OpenSSL
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     5
# project. The module is, however, dual licensed under OpenSSL and
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     6
# CRYPTOGAMS licenses depending on where you obtain it. For further
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     7
# details see http://www.openssl.org/~appro/cryptogams/.
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     8
# ====================================================================
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
     9
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    10
# October 2012.
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    11
#
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    12
# SPARCv9 VIS3 Montgomery multiplicaion procedure suitable for T3 and
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    13
# onward. There are three new instructions used here: umulxhi,
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    14
# addxc[cc] and initializing store. On T3 RSA private key operations
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    15
# are 1.54/1.87/2.11/2.26 times faster for 512/1024/2048/4096-bit key
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    16
# lengths. This is without dedicated squaring procedure. On T4
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    17
# corresponding coefficients are 1.47/2.10/2.80/2.90x, which is mostly
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    18
# for reference purposes, because T4 has dedicated Montgomery
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    19
# multiplication and squaring *instructions* that deliver even more.
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    20
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    21
$bits=32;
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    22
for (@ARGV)     { $bits=64 if (/\-m64/ || /\-xarch\=v9/); }
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    23
if ($bits==64)  { $bias=2047; $frame=192; }
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    24
else            { $bias=0;    $frame=112; }
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    25
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    26
$code.=<<___ if ($bits==64);
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    27
.register	%g2,#scratch
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    28
.register	%g3,#scratch
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    29
___
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    30
$code.=<<___;
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    31
.section	".text",#alloc,#execinstr
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    32
___
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    33
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    34
($n0,$m0,$m1,$lo0,$hi0, $lo1,$hi1,$aj,$alo,$nj,$nlo,$tj)=
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    35
	(map("%g$_",(1..5)),map("%o$_",(0..5,7)));
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    36
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    37
# int bn_mul_mont(
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    38
$rp="%o0";	# BN_ULONG *rp,
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    39
$ap="%o1";	# const BN_ULONG *ap,
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    40
$bp="%o2";	# const BN_ULONG *bp,
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    41
$np="%o3";	# const BN_ULONG *np,
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    42
$n0p="%o4";	# const BN_ULONG *n0,
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    43
$num="%o5";	# int num);	# caller ensures that num is even
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    44
				# and >=6
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    45
$code.=<<___;
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    46
.globl	bn_mul_mont_vis3
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    47
.align	32
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    48
bn_mul_mont_vis3:
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    49
	add	%sp,	$bias,	%g4	! real top of stack
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    50
	sll	$num,	2,	$num	! size in bytes
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    51
	add	$num,	63,	%g5
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    52
	andn	%g5,	63,	%g5	! buffer size rounded up to 64 bytes
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    53
	add	%g5,	%g5,	%g1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    54
	add	%g5,	%g1,	%g1	! 3*buffer size
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    55
	sub	%g4,	%g1,	%g1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    56
	andn	%g1,	63,	%g1	! align at 64 byte
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    57
	sub	%g1,	$frame,	%g1	! new top of stack
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    58
	sub	%g1,	%g4,	%g1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    59
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    60
	save	%sp,	%g1,	%sp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    61
___
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    62

da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    63
#	+-------------------------------+<-----	%sp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    64
#	.				.
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    65
#	+-------------------------------+<-----	aligned at 64 bytes
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    66
#	| __int64 tmp[0]		|
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    67
#	+-------------------------------+
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    68
#	.				.
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    69
#	.				.
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    70
#	+-------------------------------+<----- aligned at 64 bytes
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    71
#	| __int64 ap[1..0]		|	converted ap[]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    72
#	+-------------------------------+
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    73
#	| __int64 np[1..0]		|	converted np[]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    74
#	+-------------------------------+
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    75
#	| __int64 ap[3..2]		|
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    76
#	.				.
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    77
#	.				.
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    78
#	+-------------------------------+
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    79
($rp,$ap,$bp,$np,$n0p,$num)=map("%i$_",(0..5));
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    80
($t0,$t1,$t2,$t3,$cnt,$tp,$bufsz,$anp)=map("%l$_",(0..7));
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    81
($ovf,$i)=($t0,$t1);
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    82
$code.=<<___;
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    83
	ld	[$n0p+0],	$t0	! pull n0[0..1] value
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    84
	add	%sp, $bias+$frame, $tp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    85
	ld	[$n0p+4],	$t1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    86
	add	$tp,	%g5,	$anp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    87
	ld	[$bp+0],	$t2	! m0=bp[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    88
	sllx	$t1,	32,	$n0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    89
	ld	[$bp+4],	$t3
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    90
	or	$t0,	$n0,	$n0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    91
	add	$bp,	8,	$bp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    92

da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    93
	ld	[$ap+0],	$t0	! ap[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    94
	sllx	$t3,	32,	$m0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    95
	ld	[$ap+4],	$t1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    96
	or	$t2,	$m0,	$m0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    97
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    98
	ld	[$ap+8],	$t2	! ap[1]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
    99
	sllx	$t1,	32,	$aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   100
	ld	[$ap+12],	$t3
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   101
	or	$t0,	$aj,	$aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   102
	add	$ap,	16,	$ap
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   103
	stxa	$aj,	[$anp]0xe2	! converted ap[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   104
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   105
	mulx	$aj,	$m0,	$lo0	! ap[0]*bp[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   106
	umulxhi	$aj,	$m0,	$hi0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   107
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   108
	ld	[$np+0],	$t0	! np[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   109
	sllx	$t3,	32,	$aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   110
	ld	[$np+4],	$t1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   111
	or	$t2,	$aj,	$aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   112
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   113
	ld	[$np+8],	$t2	! np[1]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   114
	sllx	$t1,	32,	$nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   115
	ld	[$np+12],	$t3
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   116
	or	$t0, $nj,	$nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   117
	add	$np,	16,	$np
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   118
	stx	$nj,	[$anp+8]	! converted np[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   119
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   120
	mulx	$lo0,	$n0,	$m1	! "tp[0]"*n0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   121
	stx	$aj,	[$anp+16]	! converted ap[1]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   122
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   123
	mulx	$aj,	$m0,	$alo	! ap[1]*bp[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   124
	umulxhi	$aj,	$m0,	$aj	! ahi=aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   125
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   126
	mulx	$nj,	$m1,	$lo1	! np[0]*m1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   127
	umulxhi	$nj,	$m1,	$hi1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   128
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   129
	sllx	$t3,	32,	$nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   130
	or	$t2,	$nj,	$nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   131
	stx	$nj,	[$anp+24]	! converted np[1]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   132
	add	$anp,	32,	$anp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   133
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   134
	addcc	$lo0,	$lo1,	$lo1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   135
	addxc	%g0,	$hi1,	$hi1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   136
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   137
	mulx	$nj,	$m1,	$nlo	! np[1]*m1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   138
	umulxhi	$nj,	$m1,	$nj	! nhi=nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   139

da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   140
	ba	.L1st
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   141
	sub	$num,	24,	$cnt	! cnt=num-3
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   142
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   143
.align	16
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   144
.L1st:
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   145
	ld	[$ap+0],	$t0	! ap[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   146
	addcc	$alo,	$hi0,	$lo0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   147
	ld	[$ap+4],	$t1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   148
	addxc	$aj,	%g0,	$hi0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   149
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   150
	sllx	$t1,	32,	$aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   151
	add	$ap,	8,	$ap
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   152
	or	$t0,	$aj,	$aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   153
	stxa	$aj,	[$anp]0xe2	! converted ap[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   154
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   155
	ld	[$np+0],	$t2	! np[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   156
	addcc	$nlo,	$hi1,	$lo1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   157
	ld	[$np+4],	$t3
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   158
	addxc	$nj,	%g0,	$hi1	! nhi=nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   159
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   160
	sllx	$t3,	32,	$nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   161
	add	$np,	8,	$np
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   162
	mulx	$aj,	$m0,	$alo	! ap[j]*bp[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   163
	or	$t2,	$nj,	$nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   164
	umulxhi	$aj,	$m0,	$aj	! ahi=aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   165
	stx	$nj,	[$anp+8]	! converted np[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   166
	add	$anp,	16,	$anp	! anp++
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   167
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   168
	mulx	$nj,	$m1,	$nlo	! np[j]*m1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   169
	addcc	$lo0,	$lo1,	$lo1	! np[j]*m1+ap[j]*bp[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   170
	umulxhi	$nj,	$m1,	$nj	! nhi=nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   171
	addxc	%g0,	$hi1,	$hi1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   172
	stxa	$lo1,	[$tp]0xe2	! tp[j-1]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   173
	add	$tp,	8,	$tp	! tp++
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   174
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   175
	brnz,pt	$cnt,	.L1st
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   176
	sub	$cnt,	8,	$cnt	! j--
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   177
!.L1st
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   178
	addcc	$alo,	$hi0,	$lo0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   179
	addxc	$aj,	%g0,	$hi0	! ahi=aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   180
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   181
	addcc	$nlo,	$hi1,	$lo1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   182
	addxc	$nj,	%g0,	$hi1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   183
	addcc	$lo0,	$lo1,	$lo1	! np[j]*m1+ap[j]*bp[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   184
	addxc	%g0,	$hi1,	$hi1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   185
	stxa	$lo1,	[$tp]0xe2	! tp[j-1]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   186
	add	$tp,	8,	$tp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   187
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   188
	addcc	$hi0,	$hi1,	$hi1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   189
	addxc	%g0,	%g0,	$ovf	! upmost overflow bit
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   190
	stxa	$hi1,	[$tp]0xe2
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   191
	add	$tp,	8,	$tp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   192

da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   193
	ba	.Louter
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   194
	sub	$num,	16,	$i	! i=num-2
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   195
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   196
.align	16
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   197
.Louter:
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   198
	ld	[$bp+0],	$t2	! m0=bp[i]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   199
	ld	[$bp+4],	$t3
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   200
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   201
	sub	$anp,	$num,	$anp	! rewind
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   202
	sub	$tp,	$num,	$tp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   203
	sub	$anp,	$num,	$anp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   204
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   205
	add	$bp,	8,	$bp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   206
	sllx	$t3,	32,	$m0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   207
	ldx	[$anp+0],	$aj	! ap[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   208
	or	$t2,	$m0,	$m0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   209
	ldx	[$anp+8],	$nj	! np[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   210
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   211
	mulx	$aj,	$m0,	$lo0	! ap[0]*bp[i]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   212
	ldx	[$tp],		$tj	! tp[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   213
	umulxhi	$aj,	$m0,	$hi0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   214
	ldx	[$anp+16],	$aj	! ap[1]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   215
	addcc	$lo0,	$tj,	$lo0	! ap[0]*bp[i]+tp[0]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   216
	mulx	$aj,	$m0,	$alo	! ap[1]*bp[i]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   217
	addxc	%g0,	$hi0,	$hi0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   218
	mulx	$lo0,	$n0,	$m1	! tp[0]*n0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   219
	umulxhi	$aj,	$m0,	$aj	! ahi=aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   220
	mulx	$nj,	$m1,	$lo1	! np[0]*m1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   221
	umulxhi	$nj,	$m1,	$hi1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   222
	ldx	[$anp+24],	$nj	! np[1]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   223
	add	$anp,	32,	$anp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   224
	addcc	$lo1,	$lo0,	$lo1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   225
	mulx	$nj,	$m1,	$nlo	! np[1]*m1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   226
	addxc	%g0,	$hi1,	$hi1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   227
	umulxhi	$nj,	$m1,	$nj	! nhi=nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   228

da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   229
	ba	.Linner
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   230
	sub	$num,	24,	$cnt	! cnt=num-3
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   231
.align	16
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   232
.Linner:
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   233
	addcc	$alo,	$hi0,	$lo0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   234
	ldx	[$tp+8],	$tj	! tp[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   235
	addxc	$aj,	%g0,	$hi0	! ahi=aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   236
	ldx	[$anp+0],	$aj	! ap[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   237
	addcc	$nlo,	$hi1,	$lo1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   238
	mulx	$aj,	$m0,	$alo	! ap[j]*bp[i]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   239
	addxc	$nj,	%g0,	$hi1	! nhi=nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   240
	ldx	[$anp+8],	$nj	! np[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   241
	add	$anp,	16,	$anp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   242
	umulxhi	$aj,	$m0,	$aj	! ahi=aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   243
	addcc	$lo0,	$tj,	$lo0	! ap[j]*bp[i]+tp[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   244
	mulx	$nj,	$m1,	$nlo	! np[j]*m1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   245
	addxc	%g0,	$hi0,	$hi0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   246
	umulxhi	$nj,	$m1,	$nj	! nhi=nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   247
	addcc	$lo1,	$lo0,	$lo1	! np[j]*m1+ap[j]*bp[i]+tp[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   248
	addxc	%g0,	$hi1,	$hi1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   249
	stx	$lo1,	[$tp]		! tp[j-1]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   250
	add	$tp,	8,	$tp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   251
	brnz,pt	$cnt,	.Linner
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   252
	sub	$cnt,	8,	$cnt
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   253
!.Linner
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   254
	ldx	[$tp+8],	$tj	! tp[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   255
	addcc	$alo,	$hi0,	$lo0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   256
	addxc	$aj,	%g0,	$hi0	! ahi=aj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   257
	addcc	$lo0,	$tj,	$lo0	! ap[j]*bp[i]+tp[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   258
	addxc	%g0,	$hi0,	$hi0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   259
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   260
	addcc	$nlo,	$hi1,	$lo1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   261
	addxc	$nj,	%g0,	$hi1	! nhi=nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   262
	addcc	$lo1,	$lo0,	$lo1	! np[j]*m1+ap[j]*bp[i]+tp[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   263
	addxc	%g0,	$hi1,	$hi1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   264
	stx	$lo1,	[$tp]		! tp[j-1]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   265
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   266
	subcc	%g0,	$ovf,	%g0	! move upmost overflow to CCR.xcc
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   267
	addxccc	$hi1,	$hi0,	$hi1
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   268
	addxc	%g0,	%g0,	$ovf
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   269
	stx	$hi1,	[$tp+8]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   270
	add	$tp,	16,	$tp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   271
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   272
	brnz,pt	$i,	.Louter
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   273
	sub	$i,	8,	$i
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   274

da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   275
	sub	$anp,	$num,	$anp	! rewind
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   276
	sub	$tp,	$num,	$tp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   277
	sub	$anp,	$num,	$anp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   278
	ba	.Lsub
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   279
	subcc	$num,	8,	$cnt	! cnt=num-1 and clear CCR.xcc
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   280
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   281
.align	16
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   282
.Lsub:
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   283
	ldx	[$tp],		$tj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   284
	add	$tp,	8,	$tp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   285
	ldx	[$anp+8],	$nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   286
	add	$anp,	16,	$anp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   287
	subccc	$tj,	$nj,	$t2	! tp[j]-np[j]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   288
	srlx	$tj,	32,	$tj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   289
	srlx	$nj,	32,	$nj
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   290
	subccc	$tj,	$nj,	$t3
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   291
	add	$rp,	8,	$rp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   292
	st	$t2,	[$rp-4]		! reverse order
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   293
	st	$t3,	[$rp-8]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   294
	brnz,pt	$cnt,	.Lsub
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   295
	sub	$cnt,	8,	$cnt
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   296
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   297
	sub	$anp,	$num,	$anp	! rewind
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   298
	sub	$tp,	$num,	$tp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   299
	sub	$anp,	$num,	$anp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   300
	sub	$rp,	$num,	$rp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   301
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   302
	subc	$ovf,	%g0,	$ovf	! handle upmost overflow bit
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   303
	and	$tp,	$ovf,	$ap
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   304
	andn	$rp,	$ovf,	$np
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   305
	or	$np,	$ap,	$ap	! ap=borrow?tp:rp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   306
	ba	.Lcopy
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   307
	sub	$num,	8,	$cnt
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   308
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   309
.align	16
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   310
.Lcopy:					! copy or in-place refresh
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   311
	ld	[$ap+0],	$t2
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   312
	ld	[$ap+4],	$t3
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   313
	add	$ap,	8,	$ap
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   314
	stx	%g0,	[$tp]		! zap
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   315
	add	$tp,	8,	$tp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   316
	stx	%g0,	[$anp]		! zap
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   317
	stx	%g0,	[$anp+8]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   318
	add	$anp,	16,	$anp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   319
	st	$t3,	[$rp+0]		! flip order
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   320
	st	$t2,	[$rp+4]
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   321
	add	$rp,	8,	$rp
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   322
	brnz	$cnt,	.Lcopy
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   323
	sub	$cnt,	8,	$cnt
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   324
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   325
	mov	1,	%o0
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   326
	ret
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   327
	restore
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   328
.type	bn_mul_mont_vis3, #function
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   329
.size	bn_mul_mont_vis3, .-bn_mul_mont_vis3
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   330
.asciz  "Montgomery Multiplication for SPARCv9 VIS3, CRYPTOGAMS by <appro\@openssl.org>"
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   331
.align	4
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   332
___
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   333

da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   334
# Purpose of these subroutines is to explicitly encode VIS instructions,
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   335
# so that one can compile the module without having to specify VIS
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   336
# extentions on compiler command line, e.g. -xarch=v9 vs. -xarch=v9a.
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   337
# Idea is to reserve for option to produce "universal" binary and let
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   338
# programmer detect if current CPU is VIS capable at run-time.
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   339
sub unvis3 {
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   340
my ($mnemonic,$rs1,$rs2,$rd)=@_;
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   341
my %bias = ( "g" => 0, "o" => 8, "l" => 16, "i" => 24 );
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   342
my ($ref,$opf);
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   343
my %visopf = (	"addxc"		=> 0x011,
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   344
		"addxccc"	=> 0x013,
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   345
		"umulxhi"	=> 0x016	);
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   346
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   347
    $ref = "$mnemonic\t$rs1,$rs2,$rd";
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   348
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   349
    if ($opf=$visopf{$mnemonic}) {
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   350
	foreach ($rs1,$rs2,$rd) {
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   351
	    return $ref if (!/%([goli])([0-9])/);
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   352
	    $_=$bias{$1}+$2;
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   353
	}
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   354
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   355
	return	sprintf ".word\t0x%08x !%s",
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   356
			0x81b00000|$rd<<25|$rs1<<14|$opf<<5|$rs2,
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   357
			$ref;
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   358
    } else {
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   359
	return $ref;
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   360
    }
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   361
}
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   362
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   363
foreach (split("\n",$code)) {
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   364
	s/\`([^\`]*)\`/eval $1/ge;
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   365
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   366
	s/\b(umulxhi|addxc[c]{0,2})\s+(%[goli][0-7]),\s*(%[goli][0-7]),\s*(%[goli][0-7])/
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   367
		&unvis3($1,$2,$3,$4)
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   368
	 /ge;
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   369
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   370
	print $_,"\n";
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   371
}
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   372
da0ef75be98f 15824600 SUNBT7206152 T4 montmul should be embedded in the OpenSSL upstream src
Misaki Miyashita <Misaki.Miyashita@Oracle.COM>
parents:
diff changeset
   373
close STDOUT;