1392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#!/usr/bin/env perl 2392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# 3392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# ==================================================================== 4392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL 5392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# project. The module is, however, dual licensed under OpenSSL and 6392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# CRYPTOGAMS licenses depending on where you obtain it. For further 7392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# details see http://www.openssl.org/~appro/cryptogams/. 8392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# ==================================================================== 9392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# 10392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# May 2011 11392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# 12392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# The module implements bn_GF2m_mul_2x2 polynomial multiplication used 13392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# in bn_gf2m.c. It's kind of low-hanging mechanical port from C for 14392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# the time being... gcc 4.3 appeared to generate poor code, therefore 15392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# the effort. And indeed, the module delivers 55%-90%(*) improvement 16392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# on haviest ECDSA verify and ECDH benchmarks for 163- and 571-bit 17392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# key lengths on z990, 30%-55%(*) - on z10, and 70%-110%(*) - on z196. 18392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# This is for 64-bit build. In 32-bit "highgprs" case improvement is 19392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# even higher, for example on z990 it was measured 80%-150%. ECDSA 20392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# sign is modest 9%-12% faster. Keep in mind that these coefficients 21392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# are not ones for bn_GF2m_mul_2x2 itself, as not all CPU time is 22392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# burnt in it... 23392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# 24392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# (*) gcc 4.1 was observed to deliver better results than gcc 4.3, 25392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# so that improvement coefficients can vary from one specific 26392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# setup to another. 27392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 28392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$flavour = shift; 29392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 30392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromif ($flavour =~ /3[12]/) { 31392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom $SIZE_T=4; 32392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom $g=""; 33392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} else { 34392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom $SIZE_T=8; 35392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom $g="g"; 36392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 37392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 38392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromwhile (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {} 39392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromopen STDOUT,">$output"; 40392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 41392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$stdframe=16*$SIZE_T+4*8; 42392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 43392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$rp="%r2"; 44392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$a1="%r3"; 45392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$a0="%r4"; 46392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$b1="%r5"; 47392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$b0="%r6"; 48392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 49392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$ra="%r14"; 50392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$sp="%r15"; 51392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 52392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom@T=("%r0","%r1"); 53392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom@i=("%r12","%r13"); 54392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 55392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom($a1,$a2,$a4,$a8,$a12,$a48)=map("%r$_",(6..11)); 56392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom($lo,$hi,$b)=map("%r$_",(3..5)); $a=$lo; $mask=$a8; 57392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 58392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___; 59392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.text 60392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 61392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type _mul_1x1,\@function 62392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.align 16 63392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom_mul_1x1: 64392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lgr $a1,$a 65392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sllg $a2,$a,1 66392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sllg $a4,$a,2 67392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sllg $a8,$a,3 68392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 69392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srag $lo,$a1,63 # broadcast 63rd bit 70392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom nihh $a1,0x1fff 71392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srag @i[0],$a2,63 # broadcast 62nd bit 72392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom nihh $a2,0x3fff 73392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srag @i[1],$a4,63 # broadcast 61st bit 74392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom nihh $a4,0x7fff 75392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ngr $lo,$b 76392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ngr @i[0],$b 77392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ngr @i[1],$b 78392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 79392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lghi @T[0],0 80392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lgr $a12,$a1 81392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg @T[0],`$stdframe+0*8`($sp) # tab[0]=0 82392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $a12,$a2 83392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a1,`$stdframe+1*8`($sp) # tab[1]=a1 84392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lgr $a48,$a4 85392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a2,`$stdframe+2*8`($sp) # tab[2]=a2 86392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $a48,$a8 87392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a12,`$stdframe+3*8`($sp) # tab[3]=a1^a2 88392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $a1,$a4 89392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 90392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a4,`$stdframe+4*8`($sp) # tab[4]=a4 91392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $a2,$a4 92392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a1,`$stdframe+5*8`($sp) # tab[5]=a1^a4 93392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $a12,$a4 94392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a2,`$stdframe+6*8`($sp) # tab[6]=a2^a4 95392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $a1,$a48 96392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a12,`$stdframe+7*8`($sp) # tab[7]=a1^a2^a4 97392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $a2,$a48 98392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 99392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a8,`$stdframe+8*8`($sp) # tab[8]=a8 100392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $a12,$a48 101392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a1,`$stdframe+9*8`($sp) # tab[9]=a1^a8 102392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $a1,$a4 103392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a2,`$stdframe+10*8`($sp) # tab[10]=a2^a8 104392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $a2,$a4 105392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a12,`$stdframe+11*8`($sp) # tab[11]=a1^a2^a8 106392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 107392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $a12,$a4 108392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a48,`$stdframe+12*8`($sp) # tab[12]=a4^a8 109392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srlg $hi,$lo,1 110392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a1,`$stdframe+13*8`($sp) # tab[13]=a1^a4^a8 111392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sllg $lo,$lo,63 112392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a2,`$stdframe+14*8`($sp) # tab[14]=a2^a4^a8 113392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srlg @T[0],@i[0],2 114392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $a12,`$stdframe+15*8`($sp) # tab[15]=a1^a2^a4^a8 115392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 116392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lghi $mask,`0xf<<3` 117392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sllg $a1,@i[0],62 118392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sllg @i[0],$b,3 119392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srlg @T[1],@i[1],3 120392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ngr @i[0],$mask 121392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sllg $a2,@i[1],61 122392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srlg @i[1],$b,4-3 123392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $hi,@T[0] 124392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ngr @i[1],$mask 125392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $lo,$a1 126392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $hi,@T[1] 127392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $lo,$a2 128392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 129392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xg $lo,$stdframe(@i[0],$sp) 130392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srlg @i[0],$b,8-3 131392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ngr @i[0],$mask 132392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___ 133392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromfor($n=1;$n<14;$n++) { 134392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___; 135392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lg @T[1],$stdframe(@i[1],$sp) 136392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srlg @i[1],$b,`($n+2)*4`-3 137392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sllg @T[0],@T[1],`$n*4` 138392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ngr @i[1],$mask 139392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srlg @T[1],@T[1],`64-$n*4` 140392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $lo,@T[0] 141392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $hi,@T[1] 142392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___ 143392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom push(@i,shift(@i)); push(@T,shift(@T)); 144392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 145392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___; 146392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lg @T[1],$stdframe(@i[1],$sp) 147392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sllg @T[0],@T[1],`$n*4` 148392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srlg @T[1],@T[1],`64-$n*4` 149392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $lo,@T[0] 150392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $hi,@T[1] 151392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 152392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lg @T[0],$stdframe(@i[0],$sp) 153392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sllg @T[1],@T[0],`($n+1)*4` 154392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom srlg @T[0],@T[0],`64-($n+1)*4` 155392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $lo,@T[1] 156392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $hi,@T[0] 157392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 158392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom br $ra 159392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size _mul_1x1,.-_mul_1x1 160392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 161392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.globl bn_GF2m_mul_2x2 162392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type bn_GF2m_mul_2x2,\@function 163392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.align 16 164392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombn_GF2m_mul_2x2: 165392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stm${g} %r3,%r15,3*$SIZE_T($sp) 166392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 167392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lghi %r1,-$stdframe-128 168392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom la %r0,0($sp) 169392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom la $sp,0(%r1,$sp) # alloca 170392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom st${g} %r0,0($sp) # back chain 171392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___ 172392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromif ($SIZE_T==8) { 173392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy @r=map("%r$_",(6..9)); 174392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___; 1751762a559ef393f9c15300398433598989033385fDavid 'Digit' Turner bras $ra,_mul_1x1 # a1·b1 176392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stmg $lo,$hi,16($rp) 177392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 178392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lg $a,`$stdframe+128+4*$SIZE_T`($sp) 179392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lg $b,`$stdframe+128+6*$SIZE_T`($sp) 1801762a559ef393f9c15300398433598989033385fDavid 'Digit' Turner bras $ra,_mul_1x1 # a0·b0 181392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stmg $lo,$hi,0($rp) 182392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 183392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lg $a,`$stdframe+128+3*$SIZE_T`($sp) 184392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lg $b,`$stdframe+128+5*$SIZE_T`($sp) 185392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xg $a,`$stdframe+128+4*$SIZE_T`($sp) 186392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xg $b,`$stdframe+128+6*$SIZE_T`($sp) 1871762a559ef393f9c15300398433598989033385fDavid 'Digit' Turner bras $ra,_mul_1x1 # (a0+a1)·(b0+b1) 188392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lmg @r[0],@r[3],0($rp) 189392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 190392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $lo,$hi 191392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $hi,@r[1] 192392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $lo,@r[0] 193392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $hi,@r[2] 194392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $lo,@r[3] 195392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $hi,@r[3] 196392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom xgr $lo,$hi 197392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $hi,16($rp) 198392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stg $lo,8($rp) 199392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___ 200392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} else { 201392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___; 202392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sllg %r3,%r3,32 203392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom sllg %r5,%r5,32 204392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom or %r3,%r4 205392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom or %r5,%r6 206392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom bras $ra,_mul_1x1 207392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom rllg $lo,$lo,32 208392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom rllg $hi,$hi,32 209392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stmg $lo,$hi,0($rp) 210392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___ 211392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 212392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___; 213392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom lm${g} %r6,%r15,`$stdframe+128+6*$SIZE_T`($sp) 214392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom br $ra 215392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size bn_GF2m_mul_2x2,.-bn_GF2m_mul_2x2 216392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.string "GF(2^m) Multiplication for s390x, CRYPTOGAMS by <appro\@openssl.org>" 217392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___ 218392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 219392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code =~ s/\`([^\`]*)\`/eval($1)/gem; 220392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromprint $code; 221392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromclose STDOUT; 222