1238384Sjkim#!/usr/bin/env perl 2238384Sjkim 3238384Sjkim# ==================================================================== 4238384Sjkim# Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL 5238384Sjkim# project. The module is, however, dual licensed under OpenSSL and 6238384Sjkim# CRYPTOGAMS licenses depending on where you obtain it. For further 7238384Sjkim# details see http://www.openssl.org/~appro/cryptogams/. 8238384Sjkim# ==================================================================== 9238384Sjkim 10238384Sjkim# SHA2 block procedures for MIPS. 11238384Sjkim 12238384Sjkim# October 2010. 13238384Sjkim# 14238384Sjkim# SHA256 performance improvement on MIPS R5000 CPU is ~27% over gcc- 15238384Sjkim# generated code in o32 build and ~55% in n32/64 build. SHA512 [which 16238384Sjkim# for now can only be compiled for MIPS64 ISA] improvement is modest 17238384Sjkim# ~17%, but it comes for free, because it's same instruction sequence. 18238384Sjkim# Improvement coefficients are for aligned input. 19238384Sjkim 20238384Sjkim###################################################################### 21238384Sjkim# There is a number of MIPS ABI in use, O32 and N32/64 are most 22238384Sjkim# widely used. Then there is a new contender: NUBI. It appears that if 23238384Sjkim# one picks the latter, it's possible to arrange code in ABI neutral 24238384Sjkim# manner. Therefore let's stick to NUBI register layout: 25238384Sjkim# 26238384Sjkim($zero,$at,$t0,$t1,$t2)=map("\$$_",(0..2,24,25)); 27238384Sjkim($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11)); 28238384Sjkim($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9,$s10,$s11)=map("\$$_",(12..23)); 29238384Sjkim($gp,$tp,$sp,$fp,$ra)=map("\$$_",(3,28..31)); 30238384Sjkim# 31238384Sjkim# The return value is placed in $a0. Following coding rules facilitate 32238384Sjkim# interoperability: 33238384Sjkim# 34238384Sjkim# - never ever touch $tp, "thread pointer", former $gp [o32 can be 35238384Sjkim# excluded from the rule, because it's specified volatile]; 36238384Sjkim# - copy return value to $t0, former $v0 [or to $a0 if you're adapting 37238384Sjkim# old code]; 38238384Sjkim# - on O32 populate $a4-$a7 with 'lw $aN,4*N($sp)' if necessary; 39238384Sjkim# 40238384Sjkim# For reference here is register layout for N32/64 MIPS ABIs: 41238384Sjkim# 42238384Sjkim# ($zero,$at,$v0,$v1)=map("\$$_",(0..3)); 43238384Sjkim# ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11)); 44238384Sjkim# ($t0,$t1,$t2,$t3,$t8,$t9)=map("\$$_",(12..15,24,25)); 45238384Sjkim# ($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7)=map("\$$_",(16..23)); 46238384Sjkim# ($gp,$sp,$fp,$ra)=map("\$$_",(28..31)); 47238384Sjkim# 48238384Sjkim$flavour = shift; # supported flavours are o32,n32,64,nubi32,nubi64 49238384Sjkim 50238384Sjkimif ($flavour =~ /64|n32/i) { 51238384Sjkim $PTR_ADD="dadd"; # incidentally works even on n32 52238384Sjkim $PTR_SUB="dsub"; # incidentally works even on n32 53238384Sjkim $REG_S="sd"; 54238384Sjkim $REG_L="ld"; 55238384Sjkim $PTR_SLL="dsll"; # incidentally works even on n32 56238384Sjkim $SZREG=8; 57238384Sjkim} else { 58238384Sjkim $PTR_ADD="add"; 59238384Sjkim $PTR_SUB="sub"; 60238384Sjkim $REG_S="sw"; 61238384Sjkim $REG_L="lw"; 62238384Sjkim $PTR_SLL="sll"; 63238384Sjkim $SZREG=4; 64238384Sjkim} 65238384Sjkim$pf = ($flavour =~ /nubi/i) ? $t0 : $t2; 66238384Sjkim# 67238384Sjkim# <appro@openssl.org> 68238384Sjkim# 69238384Sjkim###################################################################### 70238384Sjkim 71276864Sjkim$big_endian=(`echo MIPSEL | $ENV{CC} -E -`=~/MIPSEL/)?1:0 if ($ENV{CC}); 72238384Sjkim 73238384Sjkimfor (@ARGV) { $output=$_ if (/^\w[\w\-]*\.\w+$/); } 74238384Sjkimopen STDOUT,">$output"; 75238384Sjkim 76238384Sjkimif (!defined($big_endian)) { $big_endian=(unpack('L',pack('N',1))==1); } 77238384Sjkim 78238384Sjkimif ($output =~ /512/) { 79238384Sjkim $label="512"; 80238384Sjkim $SZ=8; 81238384Sjkim $LD="ld"; # load from memory 82238384Sjkim $ST="sd"; # store to memory 83238384Sjkim $SLL="dsll"; # shift left logical 84238384Sjkim $SRL="dsrl"; # shift right logical 85238384Sjkim $ADDU="daddu"; 86238384Sjkim @Sigma0=(28,34,39); 87238384Sjkim @Sigma1=(14,18,41); 88238384Sjkim @sigma0=( 7, 1, 8); # right shift first 89238384Sjkim @sigma1=( 6,19,61); # right shift first 90238384Sjkim $lastK=0x817; 91238384Sjkim $rounds=80; 92238384Sjkim} else { 93238384Sjkim $label="256"; 94238384Sjkim $SZ=4; 95238384Sjkim $LD="lw"; # load from memory 96238384Sjkim $ST="sw"; # store to memory 97238384Sjkim $SLL="sll"; # shift left logical 98238384Sjkim $SRL="srl"; # shift right logical 99238384Sjkim $ADDU="addu"; 100238384Sjkim @Sigma0=( 2,13,22); 101238384Sjkim @Sigma1=( 6,11,25); 102238384Sjkim @sigma0=( 3, 7,18); # right shift first 103238384Sjkim @sigma1=(10,17,19); # right shift first 104238384Sjkim $lastK=0x8f2; 105238384Sjkim $rounds=64; 106238384Sjkim} 107238384Sjkim 108238384Sjkim$MSB = $big_endian ? 0 : ($SZ-1); 109238384Sjkim$LSB = ($SZ-1)&~$MSB; 110238384Sjkim 111238384Sjkim@V=($A,$B,$C,$D,$E,$F,$G,$H)=map("\$$_",(1,2,3,7,24,25,30,31)); 112238384Sjkim@X=map("\$$_",(8..23)); 113238384Sjkim 114238384Sjkim$ctx=$a0; 115238384Sjkim$inp=$a1; 116238384Sjkim$len=$a2; $Ktbl=$len; 117238384Sjkim 118238384Sjkimsub BODY_00_15 { 119238384Sjkimmy ($i,$a,$b,$c,$d,$e,$f,$g,$h)=@_; 120238384Sjkimmy ($T1,$tmp0,$tmp1,$tmp2)=(@X[4],@X[5],@X[6],@X[7]); 121238384Sjkim 122238384Sjkim$code.=<<___ if ($i<15); 123238384Sjkim ${LD}l @X[1],`($i+1)*$SZ+$MSB`($inp) 124238384Sjkim ${LD}r @X[1],`($i+1)*$SZ+$LSB`($inp) 125238384Sjkim___ 126238384Sjkim$code.=<<___ if (!$big_endian && $i<16 && $SZ==4); 127238384Sjkim srl $tmp0,@X[0],24 # byte swap($i) 128238384Sjkim srl $tmp1,@X[0],8 129238384Sjkim andi $tmp2,@X[0],0xFF00 130238384Sjkim sll @X[0],@X[0],24 131238384Sjkim andi $tmp1,0xFF00 132238384Sjkim sll $tmp2,$tmp2,8 133238384Sjkim or @X[0],$tmp0 134238384Sjkim or $tmp1,$tmp2 135238384Sjkim or @X[0],$tmp1 136238384Sjkim___ 137238384Sjkim$code.=<<___ if (!$big_endian && $i<16 && $SZ==8); 138238384Sjkim ori $tmp0,$zero,0xFF 139238384Sjkim dsll $tmp2,$tmp0,32 140238384Sjkim or $tmp0,$tmp2 # 0x000000FF000000FF 141238384Sjkim and $tmp1,@X[0],$tmp0 # byte swap($i) 142238384Sjkim dsrl $tmp2,@X[0],24 143238384Sjkim dsll $tmp1,24 144238384Sjkim and $tmp2,$tmp0 145238384Sjkim dsll $tmp0,8 # 0x0000FF000000FF00 146238384Sjkim or $tmp1,$tmp2 147238384Sjkim and $tmp2,@X[0],$tmp0 148238384Sjkim dsrl @X[0],8 149238384Sjkim dsll $tmp2,8 150238384Sjkim and @X[0],$tmp0 151238384Sjkim or $tmp1,$tmp2 152238384Sjkim or @X[0],$tmp1 153238384Sjkim dsrl $tmp1,@X[0],32 154238384Sjkim dsll @X[0],32 155238384Sjkim or @X[0],$tmp1 156238384Sjkim___ 157238384Sjkim$code.=<<___; 158238384Sjkim $ADDU $T1,$X[0],$h # $i 159238384Sjkim $SRL $h,$e,@Sigma1[0] 160238384Sjkim xor $tmp2,$f,$g 161238384Sjkim $SLL $tmp1,$e,`$SZ*8-@Sigma1[2]` 162238384Sjkim and $tmp2,$e 163238384Sjkim $SRL $tmp0,$e,@Sigma1[1] 164238384Sjkim xor $h,$tmp1 165238384Sjkim $SLL $tmp1,$e,`$SZ*8-@Sigma1[1]` 166238384Sjkim xor $h,$tmp0 167238384Sjkim $SRL $tmp0,$e,@Sigma1[2] 168238384Sjkim xor $h,$tmp1 169238384Sjkim $SLL $tmp1,$e,`$SZ*8-@Sigma1[0]` 170238384Sjkim xor $h,$tmp0 171238384Sjkim xor $tmp2,$g # Ch(e,f,g) 172238384Sjkim xor $tmp0,$tmp1,$h # Sigma1(e) 173238384Sjkim 174238384Sjkim $SRL $h,$a,@Sigma0[0] 175238384Sjkim $ADDU $T1,$tmp2 176238384Sjkim $LD $tmp2,`$i*$SZ`($Ktbl) # K[$i] 177238384Sjkim $SLL $tmp1,$a,`$SZ*8-@Sigma0[2]` 178238384Sjkim $ADDU $T1,$tmp0 179238384Sjkim $SRL $tmp0,$a,@Sigma0[1] 180238384Sjkim xor $h,$tmp1 181238384Sjkim $SLL $tmp1,$a,`$SZ*8-@Sigma0[1]` 182238384Sjkim xor $h,$tmp0 183238384Sjkim $SRL $tmp0,$a,@Sigma0[2] 184238384Sjkim xor $h,$tmp1 185238384Sjkim $SLL $tmp1,$a,`$SZ*8-@Sigma0[0]` 186238384Sjkim xor $h,$tmp0 187238384Sjkim $ST @X[0],`($i%16)*$SZ`($sp) # offload to ring buffer 188238384Sjkim xor $h,$tmp1 # Sigma0(a) 189238384Sjkim 190238384Sjkim or $tmp0,$a,$b 191238384Sjkim and $tmp1,$a,$b 192238384Sjkim and $tmp0,$c 193238384Sjkim or $tmp1,$tmp0 # Maj(a,b,c) 194238384Sjkim $ADDU $T1,$tmp2 # +=K[$i] 195238384Sjkim $ADDU $h,$tmp1 196238384Sjkim 197238384Sjkim $ADDU $d,$T1 198238384Sjkim $ADDU $h,$T1 199238384Sjkim___ 200238384Sjkim$code.=<<___ if ($i>=13); 201238384Sjkim $LD @X[3],`(($i+3)%16)*$SZ`($sp) # prefetch from ring buffer 202238384Sjkim___ 203238384Sjkim} 204238384Sjkim 205238384Sjkimsub BODY_16_XX { 206238384Sjkimmy $i=@_[0]; 207238384Sjkimmy ($tmp0,$tmp1,$tmp2,$tmp3)=(@X[4],@X[5],@X[6],@X[7]); 208238384Sjkim 209238384Sjkim$code.=<<___; 210238384Sjkim $SRL $tmp2,@X[1],@sigma0[0] # Xupdate($i) 211238384Sjkim $ADDU @X[0],@X[9] # +=X[i+9] 212238384Sjkim $SLL $tmp1,@X[1],`$SZ*8-@sigma0[2]` 213238384Sjkim $SRL $tmp0,@X[1],@sigma0[1] 214238384Sjkim xor $tmp2,$tmp1 215238384Sjkim $SLL $tmp1,`@sigma0[2]-@sigma0[1]` 216238384Sjkim xor $tmp2,$tmp0 217238384Sjkim $SRL $tmp0,@X[1],@sigma0[2] 218238384Sjkim xor $tmp2,$tmp1 219238384Sjkim 220238384Sjkim $SRL $tmp3,@X[14],@sigma1[0] 221238384Sjkim xor $tmp2,$tmp0 # sigma0(X[i+1]) 222238384Sjkim $SLL $tmp1,@X[14],`$SZ*8-@sigma1[2]` 223238384Sjkim $ADDU @X[0],$tmp2 224238384Sjkim $SRL $tmp0,@X[14],@sigma1[1] 225238384Sjkim xor $tmp3,$tmp1 226238384Sjkim $SLL $tmp1,`@sigma1[2]-@sigma1[1]` 227238384Sjkim xor $tmp3,$tmp0 228238384Sjkim $SRL $tmp0,@X[14],@sigma1[2] 229238384Sjkim xor $tmp3,$tmp1 230238384Sjkim 231238384Sjkim xor $tmp3,$tmp0 # sigma1(X[i+14]) 232238384Sjkim $ADDU @X[0],$tmp3 233238384Sjkim___ 234238384Sjkim &BODY_00_15(@_); 235238384Sjkim} 236238384Sjkim 237238384Sjkim$FRAMESIZE=16*$SZ+16*$SZREG; 238238384Sjkim$SAVED_REGS_MASK = ($flavour =~ /nubi/i) ? 0xc0fff008 : 0xc0ff0000; 239238384Sjkim 240238384Sjkim$code.=<<___; 241238384Sjkim#ifdef OPENSSL_FIPSCANISTER 242238384Sjkim# include <openssl/fipssyms.h> 243238384Sjkim#endif 244238384Sjkim 245238384Sjkim.text 246238384Sjkim.set noat 247238384Sjkim#if !defined(__vxworks) || defined(__pic__) 248238384Sjkim.option pic2 249238384Sjkim#endif 250238384Sjkim 251238384Sjkim.align 5 252238384Sjkim.globl sha${label}_block_data_order 253238384Sjkim.ent sha${label}_block_data_order 254238384Sjkimsha${label}_block_data_order: 255238384Sjkim .frame $sp,$FRAMESIZE,$ra 256238384Sjkim .mask $SAVED_REGS_MASK,-$SZREG 257238384Sjkim .set noreorder 258238384Sjkim___ 259238384Sjkim$code.=<<___ if ($flavour =~ /o32/i); # o32 PIC-ification 260238384Sjkim .cpload $pf 261238384Sjkim___ 262238384Sjkim$code.=<<___; 263238384Sjkim $PTR_SUB $sp,$FRAMESIZE 264238384Sjkim $REG_S $ra,$FRAMESIZE-1*$SZREG($sp) 265238384Sjkim $REG_S $fp,$FRAMESIZE-2*$SZREG($sp) 266238384Sjkim $REG_S $s11,$FRAMESIZE-3*$SZREG($sp) 267238384Sjkim $REG_S $s10,$FRAMESIZE-4*$SZREG($sp) 268238384Sjkim $REG_S $s9,$FRAMESIZE-5*$SZREG($sp) 269238384Sjkim $REG_S $s8,$FRAMESIZE-6*$SZREG($sp) 270238384Sjkim $REG_S $s7,$FRAMESIZE-7*$SZREG($sp) 271238384Sjkim $REG_S $s6,$FRAMESIZE-8*$SZREG($sp) 272238384Sjkim $REG_S $s5,$FRAMESIZE-9*$SZREG($sp) 273238384Sjkim $REG_S $s4,$FRAMESIZE-10*$SZREG($sp) 274238384Sjkim___ 275238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i); # optimize non-nubi prologue 276238384Sjkim $REG_S $s3,$FRAMESIZE-11*$SZREG($sp) 277238384Sjkim $REG_S $s2,$FRAMESIZE-12*$SZREG($sp) 278238384Sjkim $REG_S $s1,$FRAMESIZE-13*$SZREG($sp) 279238384Sjkim $REG_S $s0,$FRAMESIZE-14*$SZREG($sp) 280238384Sjkim $REG_S $gp,$FRAMESIZE-15*$SZREG($sp) 281238384Sjkim___ 282238384Sjkim$code.=<<___; 283238384Sjkim $PTR_SLL @X[15],$len,`log(16*$SZ)/log(2)` 284238384Sjkim___ 285238384Sjkim$code.=<<___ if ($flavour !~ /o32/i); # non-o32 PIC-ification 286238384Sjkim .cplocal $Ktbl 287238384Sjkim .cpsetup $pf,$zero,sha${label}_block_data_order 288238384Sjkim___ 289238384Sjkim$code.=<<___; 290238384Sjkim .set reorder 291238384Sjkim la $Ktbl,K${label} # PIC-ified 'load address' 292238384Sjkim 293238384Sjkim $LD $A,0*$SZ($ctx) # load context 294238384Sjkim $LD $B,1*$SZ($ctx) 295238384Sjkim $LD $C,2*$SZ($ctx) 296238384Sjkim $LD $D,3*$SZ($ctx) 297238384Sjkim $LD $E,4*$SZ($ctx) 298238384Sjkim $LD $F,5*$SZ($ctx) 299238384Sjkim $LD $G,6*$SZ($ctx) 300238384Sjkim $LD $H,7*$SZ($ctx) 301238384Sjkim 302238384Sjkim $PTR_ADD @X[15],$inp # pointer to the end of input 303238384Sjkim $REG_S @X[15],16*$SZ($sp) 304238384Sjkim b .Loop 305238384Sjkim 306238384Sjkim.align 5 307238384Sjkim.Loop: 308238384Sjkim ${LD}l @X[0],$MSB($inp) 309238384Sjkim ${LD}r @X[0],$LSB($inp) 310238384Sjkim___ 311238384Sjkimfor ($i=0;$i<16;$i++) 312238384Sjkim{ &BODY_00_15($i,@V); unshift(@V,pop(@V)); push(@X,shift(@X)); } 313238384Sjkim$code.=<<___; 314238384Sjkim b .L16_xx 315238384Sjkim.align 4 316238384Sjkim.L16_xx: 317238384Sjkim___ 318238384Sjkimfor (;$i<32;$i++) 319238384Sjkim{ &BODY_16_XX($i,@V); unshift(@V,pop(@V)); push(@X,shift(@X)); } 320238384Sjkim$code.=<<___; 321238384Sjkim and @X[6],0xfff 322238384Sjkim li @X[7],$lastK 323238384Sjkim .set noreorder 324238384Sjkim bne @X[6],@X[7],.L16_xx 325238384Sjkim $PTR_ADD $Ktbl,16*$SZ # Ktbl+=16 326238384Sjkim 327238384Sjkim $REG_L @X[15],16*$SZ($sp) # restore pointer to the end of input 328238384Sjkim $LD @X[0],0*$SZ($ctx) 329238384Sjkim $LD @X[1],1*$SZ($ctx) 330238384Sjkim $LD @X[2],2*$SZ($ctx) 331238384Sjkim $PTR_ADD $inp,16*$SZ 332238384Sjkim $LD @X[3],3*$SZ($ctx) 333238384Sjkim $ADDU $A,@X[0] 334238384Sjkim $LD @X[4],4*$SZ($ctx) 335238384Sjkim $ADDU $B,@X[1] 336238384Sjkim $LD @X[5],5*$SZ($ctx) 337238384Sjkim $ADDU $C,@X[2] 338238384Sjkim $LD @X[6],6*$SZ($ctx) 339238384Sjkim $ADDU $D,@X[3] 340238384Sjkim $LD @X[7],7*$SZ($ctx) 341238384Sjkim $ADDU $E,@X[4] 342238384Sjkim $ST $A,0*$SZ($ctx) 343238384Sjkim $ADDU $F,@X[5] 344238384Sjkim $ST $B,1*$SZ($ctx) 345238384Sjkim $ADDU $G,@X[6] 346238384Sjkim $ST $C,2*$SZ($ctx) 347238384Sjkim $ADDU $H,@X[7] 348238384Sjkim $ST $D,3*$SZ($ctx) 349238384Sjkim $ST $E,4*$SZ($ctx) 350238384Sjkim $ST $F,5*$SZ($ctx) 351238384Sjkim $ST $G,6*$SZ($ctx) 352238384Sjkim $ST $H,7*$SZ($ctx) 353238384Sjkim 354264331Sjkim bne $inp,@X[15],.Loop 355238384Sjkim $PTR_SUB $Ktbl,`($rounds-16)*$SZ` # rewind $Ktbl 356238384Sjkim 357238384Sjkim $REG_L $ra,$FRAMESIZE-1*$SZREG($sp) 358238384Sjkim $REG_L $fp,$FRAMESIZE-2*$SZREG($sp) 359238384Sjkim $REG_L $s11,$FRAMESIZE-3*$SZREG($sp) 360238384Sjkim $REG_L $s10,$FRAMESIZE-4*$SZREG($sp) 361238384Sjkim $REG_L $s9,$FRAMESIZE-5*$SZREG($sp) 362238384Sjkim $REG_L $s8,$FRAMESIZE-6*$SZREG($sp) 363238384Sjkim $REG_L $s7,$FRAMESIZE-7*$SZREG($sp) 364238384Sjkim $REG_L $s6,$FRAMESIZE-8*$SZREG($sp) 365238384Sjkim $REG_L $s5,$FRAMESIZE-9*$SZREG($sp) 366238384Sjkim $REG_L $s4,$FRAMESIZE-10*$SZREG($sp) 367238384Sjkim___ 368238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i); 369238384Sjkim $REG_L $s3,$FRAMESIZE-11*$SZREG($sp) 370238384Sjkim $REG_L $s2,$FRAMESIZE-12*$SZREG($sp) 371238384Sjkim $REG_L $s1,$FRAMESIZE-13*$SZREG($sp) 372238384Sjkim $REG_L $s0,$FRAMESIZE-14*$SZREG($sp) 373238384Sjkim $REG_L $gp,$FRAMESIZE-15*$SZREG($sp) 374238384Sjkim___ 375238384Sjkim$code.=<<___; 376238384Sjkim jr $ra 377238384Sjkim $PTR_ADD $sp,$FRAMESIZE 378238384Sjkim.end sha${label}_block_data_order 379238384Sjkim 380238384Sjkim.rdata 381238384Sjkim.align 5 382238384SjkimK${label}: 383238384Sjkim___ 384238384Sjkimif ($SZ==4) { 385238384Sjkim$code.=<<___; 386238384Sjkim .word 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5 387238384Sjkim .word 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5 388238384Sjkim .word 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3 389238384Sjkim .word 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174 390238384Sjkim .word 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc 391238384Sjkim .word 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da 392238384Sjkim .word 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7 393238384Sjkim .word 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967 394238384Sjkim .word 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13 395238384Sjkim .word 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85 396238384Sjkim .word 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3 397238384Sjkim .word 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070 398238384Sjkim .word 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5 399238384Sjkim .word 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3 400238384Sjkim .word 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208 401238384Sjkim .word 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 402238384Sjkim___ 403238384Sjkim} else { 404238384Sjkim$code.=<<___; 405238384Sjkim .dword 0x428a2f98d728ae22, 0x7137449123ef65cd 406238384Sjkim .dword 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc 407238384Sjkim .dword 0x3956c25bf348b538, 0x59f111f1b605d019 408238384Sjkim .dword 0x923f82a4af194f9b, 0xab1c5ed5da6d8118 409238384Sjkim .dword 0xd807aa98a3030242, 0x12835b0145706fbe 410238384Sjkim .dword 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2 411238384Sjkim .dword 0x72be5d74f27b896f, 0x80deb1fe3b1696b1 412238384Sjkim .dword 0x9bdc06a725c71235, 0xc19bf174cf692694 413238384Sjkim .dword 0xe49b69c19ef14ad2, 0xefbe4786384f25e3 414238384Sjkim .dword 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65 415238384Sjkim .dword 0x2de92c6f592b0275, 0x4a7484aa6ea6e483 416238384Sjkim .dword 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5 417238384Sjkim .dword 0x983e5152ee66dfab, 0xa831c66d2db43210 418238384Sjkim .dword 0xb00327c898fb213f, 0xbf597fc7beef0ee4 419238384Sjkim .dword 0xc6e00bf33da88fc2, 0xd5a79147930aa725 420238384Sjkim .dword 0x06ca6351e003826f, 0x142929670a0e6e70 421238384Sjkim .dword 0x27b70a8546d22ffc, 0x2e1b21385c26c926 422238384Sjkim .dword 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df 423238384Sjkim .dword 0x650a73548baf63de, 0x766a0abb3c77b2a8 424238384Sjkim .dword 0x81c2c92e47edaee6, 0x92722c851482353b 425238384Sjkim .dword 0xa2bfe8a14cf10364, 0xa81a664bbc423001 426238384Sjkim .dword 0xc24b8b70d0f89791, 0xc76c51a30654be30 427238384Sjkim .dword 0xd192e819d6ef5218, 0xd69906245565a910 428238384Sjkim .dword 0xf40e35855771202a, 0x106aa07032bbd1b8 429238384Sjkim .dword 0x19a4c116b8d2d0c8, 0x1e376c085141ab53 430238384Sjkim .dword 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8 431238384Sjkim .dword 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb 432238384Sjkim .dword 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3 433238384Sjkim .dword 0x748f82ee5defb2fc, 0x78a5636f43172f60 434238384Sjkim .dword 0x84c87814a1f0ab72, 0x8cc702081a6439ec 435238384Sjkim .dword 0x90befffa23631e28, 0xa4506cebde82bde9 436238384Sjkim .dword 0xbef9a3f7b2c67915, 0xc67178f2e372532b 437238384Sjkim .dword 0xca273eceea26619c, 0xd186b8c721c0c207 438238384Sjkim .dword 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178 439238384Sjkim .dword 0x06f067aa72176fba, 0x0a637dc5a2c898a6 440238384Sjkim .dword 0x113f9804bef90dae, 0x1b710b35131c471b 441238384Sjkim .dword 0x28db77f523047d84, 0x32caab7b40c72493 442238384Sjkim .dword 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c 443238384Sjkim .dword 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a 444238384Sjkim .dword 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 445238384Sjkim___ 446238384Sjkim} 447238384Sjkim$code.=<<___; 448238384Sjkim.asciiz "SHA${label} for MIPS, CRYPTOGAMS by <appro\@openssl.org>" 449238384Sjkim.align 5 450238384Sjkim 451238384Sjkim___ 452238384Sjkim 453238384Sjkim$code =~ s/\`([^\`]*)\`/eval $1/gem; 454238384Sjkimprint $code; 455238384Sjkimclose STDOUT; 456