1e1051a39Sopenharmony_ci#! /usr/bin/env perl 2e1051a39Sopenharmony_ci# Copyright 2009-2020 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci# 4e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci# this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci# ==================================================================== 11e1051a39Sopenharmony_ci# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL 12e1051a39Sopenharmony_ci# project. The module is, however, dual licensed under OpenSSL and 13e1051a39Sopenharmony_ci# CRYPTOGAMS licenses depending on where you obtain it. For further 14e1051a39Sopenharmony_ci# details see http://www.openssl.org/~appro/cryptogams/. 15e1051a39Sopenharmony_ci# ==================================================================== 16e1051a39Sopenharmony_ci 17e1051a39Sopenharmony_ci# SHA1 block procedure for Alpha. 18e1051a39Sopenharmony_ci 19e1051a39Sopenharmony_ci# On 21264 performance is 33% better than code generated by vendor 20e1051a39Sopenharmony_ci# compiler, and 75% better than GCC [3.4], and in absolute terms is 21e1051a39Sopenharmony_ci# 8.7 cycles per processed byte. Implementation features vectorized 22e1051a39Sopenharmony_ci# byte swap, but not Xupdate. 23e1051a39Sopenharmony_ci 24e1051a39Sopenharmony_ci@X=( "\$0", "\$1", "\$2", "\$3", "\$4", "\$5", "\$6", "\$7", 25e1051a39Sopenharmony_ci "\$8", "\$9", "\$10", "\$11", "\$12", "\$13", "\$14", "\$15"); 26e1051a39Sopenharmony_ci$ctx="a0"; # $16 27e1051a39Sopenharmony_ci$inp="a1"; 28e1051a39Sopenharmony_ci$num="a2"; 29e1051a39Sopenharmony_ci$A="a3"; 30e1051a39Sopenharmony_ci$B="a4"; # 20 31e1051a39Sopenharmony_ci$C="a5"; 32e1051a39Sopenharmony_ci$D="t8"; 33e1051a39Sopenharmony_ci$E="t9"; @V=($A,$B,$C,$D,$E); 34e1051a39Sopenharmony_ci$t0="t10"; # 24 35e1051a39Sopenharmony_ci$t1="t11"; 36e1051a39Sopenharmony_ci$t2="ra"; 37e1051a39Sopenharmony_ci$t3="t12"; 38e1051a39Sopenharmony_ci$K="AT"; # 28 39e1051a39Sopenharmony_ci 40e1051a39Sopenharmony_cisub BODY_00_19 { 41e1051a39Sopenharmony_cimy ($i,$a,$b,$c,$d,$e)=@_; 42e1051a39Sopenharmony_cimy $j=$i+1; 43e1051a39Sopenharmony_ci$code.=<<___ if ($i==0); 44e1051a39Sopenharmony_ci ldq_u @X[0],0+0($inp) 45e1051a39Sopenharmony_ci ldq_u @X[1],0+7($inp) 46e1051a39Sopenharmony_ci___ 47e1051a39Sopenharmony_ci$code.=<<___ if (!($i&1) && $i<14); 48e1051a39Sopenharmony_ci ldq_u @X[$i+2],($i+2)*4+0($inp) 49e1051a39Sopenharmony_ci ldq_u @X[$i+3],($i+2)*4+7($inp) 50e1051a39Sopenharmony_ci___ 51e1051a39Sopenharmony_ci$code.=<<___ if (!($i&1) && $i<15); 52e1051a39Sopenharmony_ci extql @X[$i],$inp,@X[$i] 53e1051a39Sopenharmony_ci extqh @X[$i+1],$inp,@X[$i+1] 54e1051a39Sopenharmony_ci 55e1051a39Sopenharmony_ci or @X[$i+1],@X[$i],@X[$i] # pair of 32-bit values are fetched 56e1051a39Sopenharmony_ci 57e1051a39Sopenharmony_ci srl @X[$i],24,$t0 # vectorized byte swap 58e1051a39Sopenharmony_ci srl @X[$i],8,$t2 59e1051a39Sopenharmony_ci 60e1051a39Sopenharmony_ci sll @X[$i],8,$t3 61e1051a39Sopenharmony_ci sll @X[$i],24,@X[$i] 62e1051a39Sopenharmony_ci zapnot $t0,0x11,$t0 63e1051a39Sopenharmony_ci zapnot $t2,0x22,$t2 64e1051a39Sopenharmony_ci 65e1051a39Sopenharmony_ci zapnot @X[$i],0x88,@X[$i] 66e1051a39Sopenharmony_ci or $t0,$t2,$t0 67e1051a39Sopenharmony_ci zapnot $t3,0x44,$t3 68e1051a39Sopenharmony_ci sll $a,5,$t1 69e1051a39Sopenharmony_ci 70e1051a39Sopenharmony_ci or @X[$i],$t0,@X[$i] 71e1051a39Sopenharmony_ci addl $K,$e,$e 72e1051a39Sopenharmony_ci and $b,$c,$t2 73e1051a39Sopenharmony_ci zapnot $a,0xf,$a 74e1051a39Sopenharmony_ci 75e1051a39Sopenharmony_ci or @X[$i],$t3,@X[$i] 76e1051a39Sopenharmony_ci srl $a,27,$t0 77e1051a39Sopenharmony_ci bic $d,$b,$t3 78e1051a39Sopenharmony_ci sll $b,30,$b 79e1051a39Sopenharmony_ci 80e1051a39Sopenharmony_ci extll @X[$i],4,@X[$i+1] # extract upper half 81e1051a39Sopenharmony_ci or $t2,$t3,$t2 82e1051a39Sopenharmony_ci addl @X[$i],$e,$e 83e1051a39Sopenharmony_ci 84e1051a39Sopenharmony_ci addl $t1,$e,$e 85e1051a39Sopenharmony_ci srl $b,32,$t3 86e1051a39Sopenharmony_ci zapnot @X[$i],0xf,@X[$i] 87e1051a39Sopenharmony_ci 88e1051a39Sopenharmony_ci addl $t0,$e,$e 89e1051a39Sopenharmony_ci addl $t2,$e,$e 90e1051a39Sopenharmony_ci or $t3,$b,$b 91e1051a39Sopenharmony_ci___ 92e1051a39Sopenharmony_ci$code.=<<___ if (($i&1) && $i<15); 93e1051a39Sopenharmony_ci sll $a,5,$t1 94e1051a39Sopenharmony_ci addl $K,$e,$e 95e1051a39Sopenharmony_ci and $b,$c,$t2 96e1051a39Sopenharmony_ci zapnot $a,0xf,$a 97e1051a39Sopenharmony_ci 98e1051a39Sopenharmony_ci srl $a,27,$t0 99e1051a39Sopenharmony_ci addl @X[$i%16],$e,$e 100e1051a39Sopenharmony_ci bic $d,$b,$t3 101e1051a39Sopenharmony_ci sll $b,30,$b 102e1051a39Sopenharmony_ci 103e1051a39Sopenharmony_ci or $t2,$t3,$t2 104e1051a39Sopenharmony_ci addl $t1,$e,$e 105e1051a39Sopenharmony_ci srl $b,32,$t3 106e1051a39Sopenharmony_ci zapnot @X[$i],0xf,@X[$i] 107e1051a39Sopenharmony_ci 108e1051a39Sopenharmony_ci addl $t0,$e,$e 109e1051a39Sopenharmony_ci addl $t2,$e,$e 110e1051a39Sopenharmony_ci or $t3,$b,$b 111e1051a39Sopenharmony_ci___ 112e1051a39Sopenharmony_ci$code.=<<___ if ($i>=15); # with forward Xupdate 113e1051a39Sopenharmony_ci sll $a,5,$t1 114e1051a39Sopenharmony_ci addl $K,$e,$e 115e1051a39Sopenharmony_ci and $b,$c,$t2 116e1051a39Sopenharmony_ci xor @X[($j+2)%16],@X[$j%16],@X[$j%16] 117e1051a39Sopenharmony_ci 118e1051a39Sopenharmony_ci zapnot $a,0xf,$a 119e1051a39Sopenharmony_ci addl @X[$i%16],$e,$e 120e1051a39Sopenharmony_ci bic $d,$b,$t3 121e1051a39Sopenharmony_ci xor @X[($j+8)%16],@X[$j%16],@X[$j%16] 122e1051a39Sopenharmony_ci 123e1051a39Sopenharmony_ci srl $a,27,$t0 124e1051a39Sopenharmony_ci addl $t1,$e,$e 125e1051a39Sopenharmony_ci or $t2,$t3,$t2 126e1051a39Sopenharmony_ci xor @X[($j+13)%16],@X[$j%16],@X[$j%16] 127e1051a39Sopenharmony_ci 128e1051a39Sopenharmony_ci sll $b,30,$b 129e1051a39Sopenharmony_ci addl $t0,$e,$e 130e1051a39Sopenharmony_ci srl @X[$j%16],31,$t1 131e1051a39Sopenharmony_ci 132e1051a39Sopenharmony_ci addl $t2,$e,$e 133e1051a39Sopenharmony_ci srl $b,32,$t3 134e1051a39Sopenharmony_ci addl @X[$j%16],@X[$j%16],@X[$j%16] 135e1051a39Sopenharmony_ci 136e1051a39Sopenharmony_ci or $t3,$b,$b 137e1051a39Sopenharmony_ci zapnot @X[$i%16],0xf,@X[$i%16] 138e1051a39Sopenharmony_ci or $t1,@X[$j%16],@X[$j%16] 139e1051a39Sopenharmony_ci___ 140e1051a39Sopenharmony_ci} 141e1051a39Sopenharmony_ci 142e1051a39Sopenharmony_cisub BODY_20_39 { 143e1051a39Sopenharmony_cimy ($i,$a,$b,$c,$d,$e)=@_; 144e1051a39Sopenharmony_cimy $j=$i+1; 145e1051a39Sopenharmony_ci$code.=<<___ if ($i<79); # with forward Xupdate 146e1051a39Sopenharmony_ci sll $a,5,$t1 147e1051a39Sopenharmony_ci addl $K,$e,$e 148e1051a39Sopenharmony_ci zapnot $a,0xf,$a 149e1051a39Sopenharmony_ci xor @X[($j+2)%16],@X[$j%16],@X[$j%16] 150e1051a39Sopenharmony_ci 151e1051a39Sopenharmony_ci sll $b,30,$t3 152e1051a39Sopenharmony_ci addl $t1,$e,$e 153e1051a39Sopenharmony_ci xor $b,$c,$t2 154e1051a39Sopenharmony_ci xor @X[($j+8)%16],@X[$j%16],@X[$j%16] 155e1051a39Sopenharmony_ci 156e1051a39Sopenharmony_ci srl $b,2,$b 157e1051a39Sopenharmony_ci addl @X[$i%16],$e,$e 158e1051a39Sopenharmony_ci xor $d,$t2,$t2 159e1051a39Sopenharmony_ci xor @X[($j+13)%16],@X[$j%16],@X[$j%16] 160e1051a39Sopenharmony_ci 161e1051a39Sopenharmony_ci srl @X[$j%16],31,$t1 162e1051a39Sopenharmony_ci addl $t2,$e,$e 163e1051a39Sopenharmony_ci srl $a,27,$t0 164e1051a39Sopenharmony_ci addl @X[$j%16],@X[$j%16],@X[$j%16] 165e1051a39Sopenharmony_ci 166e1051a39Sopenharmony_ci or $t3,$b,$b 167e1051a39Sopenharmony_ci addl $t0,$e,$e 168e1051a39Sopenharmony_ci or $t1,@X[$j%16],@X[$j%16] 169e1051a39Sopenharmony_ci___ 170e1051a39Sopenharmony_ci$code.=<<___ if ($i<77); 171e1051a39Sopenharmony_ci zapnot @X[$i%16],0xf,@X[$i%16] 172e1051a39Sopenharmony_ci___ 173e1051a39Sopenharmony_ci$code.=<<___ if ($i==79); # with context fetch 174e1051a39Sopenharmony_ci sll $a,5,$t1 175e1051a39Sopenharmony_ci addl $K,$e,$e 176e1051a39Sopenharmony_ci zapnot $a,0xf,$a 177e1051a39Sopenharmony_ci ldl @X[0],0($ctx) 178e1051a39Sopenharmony_ci 179e1051a39Sopenharmony_ci sll $b,30,$t3 180e1051a39Sopenharmony_ci addl $t1,$e,$e 181e1051a39Sopenharmony_ci xor $b,$c,$t2 182e1051a39Sopenharmony_ci ldl @X[1],4($ctx) 183e1051a39Sopenharmony_ci 184e1051a39Sopenharmony_ci srl $b,2,$b 185e1051a39Sopenharmony_ci addl @X[$i%16],$e,$e 186e1051a39Sopenharmony_ci xor $d,$t2,$t2 187e1051a39Sopenharmony_ci ldl @X[2],8($ctx) 188e1051a39Sopenharmony_ci 189e1051a39Sopenharmony_ci srl $a,27,$t0 190e1051a39Sopenharmony_ci addl $t2,$e,$e 191e1051a39Sopenharmony_ci ldl @X[3],12($ctx) 192e1051a39Sopenharmony_ci 193e1051a39Sopenharmony_ci or $t3,$b,$b 194e1051a39Sopenharmony_ci addl $t0,$e,$e 195e1051a39Sopenharmony_ci ldl @X[4],16($ctx) 196e1051a39Sopenharmony_ci___ 197e1051a39Sopenharmony_ci} 198e1051a39Sopenharmony_ci 199e1051a39Sopenharmony_cisub BODY_40_59 { 200e1051a39Sopenharmony_cimy ($i,$a,$b,$c,$d,$e)=@_; 201e1051a39Sopenharmony_cimy $j=$i+1; 202e1051a39Sopenharmony_ci$code.=<<___; # with forward Xupdate 203e1051a39Sopenharmony_ci sll $a,5,$t1 204e1051a39Sopenharmony_ci addl $K,$e,$e 205e1051a39Sopenharmony_ci zapnot $a,0xf,$a 206e1051a39Sopenharmony_ci xor @X[($j+2)%16],@X[$j%16],@X[$j%16] 207e1051a39Sopenharmony_ci 208e1051a39Sopenharmony_ci srl $a,27,$t0 209e1051a39Sopenharmony_ci and $b,$c,$t2 210e1051a39Sopenharmony_ci and $b,$d,$t3 211e1051a39Sopenharmony_ci xor @X[($j+8)%16],@X[$j%16],@X[$j%16] 212e1051a39Sopenharmony_ci 213e1051a39Sopenharmony_ci sll $b,30,$b 214e1051a39Sopenharmony_ci addl $t1,$e,$e 215e1051a39Sopenharmony_ci xor @X[($j+13)%16],@X[$j%16],@X[$j%16] 216e1051a39Sopenharmony_ci 217e1051a39Sopenharmony_ci srl @X[$j%16],31,$t1 218e1051a39Sopenharmony_ci addl $t0,$e,$e 219e1051a39Sopenharmony_ci or $t2,$t3,$t2 220e1051a39Sopenharmony_ci and $c,$d,$t3 221e1051a39Sopenharmony_ci 222e1051a39Sopenharmony_ci or $t2,$t3,$t2 223e1051a39Sopenharmony_ci srl $b,32,$t3 224e1051a39Sopenharmony_ci addl @X[$i%16],$e,$e 225e1051a39Sopenharmony_ci addl @X[$j%16],@X[$j%16],@X[$j%16] 226e1051a39Sopenharmony_ci 227e1051a39Sopenharmony_ci or $t3,$b,$b 228e1051a39Sopenharmony_ci addl $t2,$e,$e 229e1051a39Sopenharmony_ci or $t1,@X[$j%16],@X[$j%16] 230e1051a39Sopenharmony_ci zapnot @X[$i%16],0xf,@X[$i%16] 231e1051a39Sopenharmony_ci___ 232e1051a39Sopenharmony_ci} 233e1051a39Sopenharmony_ci 234e1051a39Sopenharmony_ci$code=<<___; 235e1051a39Sopenharmony_ci#ifdef __linux__ 236e1051a39Sopenharmony_ci#include <asm/regdef.h> 237e1051a39Sopenharmony_ci#else 238e1051a39Sopenharmony_ci#include <asm.h> 239e1051a39Sopenharmony_ci#include <regdef.h> 240e1051a39Sopenharmony_ci#endif 241e1051a39Sopenharmony_ci 242e1051a39Sopenharmony_ci.text 243e1051a39Sopenharmony_ci 244e1051a39Sopenharmony_ci.set noat 245e1051a39Sopenharmony_ci.set noreorder 246e1051a39Sopenharmony_ci.globl sha1_block_data_order 247e1051a39Sopenharmony_ci.align 5 248e1051a39Sopenharmony_ci.ent sha1_block_data_order 249e1051a39Sopenharmony_cisha1_block_data_order: 250e1051a39Sopenharmony_ci lda sp,-64(sp) 251e1051a39Sopenharmony_ci stq ra,0(sp) 252e1051a39Sopenharmony_ci stq s0,8(sp) 253e1051a39Sopenharmony_ci stq s1,16(sp) 254e1051a39Sopenharmony_ci stq s2,24(sp) 255e1051a39Sopenharmony_ci stq s3,32(sp) 256e1051a39Sopenharmony_ci stq s4,40(sp) 257e1051a39Sopenharmony_ci stq s5,48(sp) 258e1051a39Sopenharmony_ci stq fp,56(sp) 259e1051a39Sopenharmony_ci .mask 0x0400fe00,-64 260e1051a39Sopenharmony_ci .frame sp,64,ra 261e1051a39Sopenharmony_ci .prologue 0 262e1051a39Sopenharmony_ci 263e1051a39Sopenharmony_ci ldl $A,0($ctx) 264e1051a39Sopenharmony_ci ldl $B,4($ctx) 265e1051a39Sopenharmony_ci sll $num,6,$num 266e1051a39Sopenharmony_ci ldl $C,8($ctx) 267e1051a39Sopenharmony_ci ldl $D,12($ctx) 268e1051a39Sopenharmony_ci ldl $E,16($ctx) 269e1051a39Sopenharmony_ci addq $inp,$num,$num 270e1051a39Sopenharmony_ci 271e1051a39Sopenharmony_ci.Lloop: 272e1051a39Sopenharmony_ci .set noreorder 273e1051a39Sopenharmony_ci ldah $K,23170(zero) 274e1051a39Sopenharmony_ci zapnot $B,0xf,$B 275e1051a39Sopenharmony_ci lda $K,31129($K) # K_00_19 276e1051a39Sopenharmony_ci___ 277e1051a39Sopenharmony_cifor ($i=0;$i<20;$i++) { &BODY_00_19($i,@V); unshift(@V,pop(@V)); } 278e1051a39Sopenharmony_ci 279e1051a39Sopenharmony_ci$code.=<<___; 280e1051a39Sopenharmony_ci ldah $K,28378(zero) 281e1051a39Sopenharmony_ci lda $K,-5215($K) # K_20_39 282e1051a39Sopenharmony_ci___ 283e1051a39Sopenharmony_cifor (;$i<40;$i++) { &BODY_20_39($i,@V); unshift(@V,pop(@V)); } 284e1051a39Sopenharmony_ci 285e1051a39Sopenharmony_ci$code.=<<___; 286e1051a39Sopenharmony_ci ldah $K,-28900(zero) 287e1051a39Sopenharmony_ci lda $K,-17188($K) # K_40_59 288e1051a39Sopenharmony_ci___ 289e1051a39Sopenharmony_cifor (;$i<60;$i++) { &BODY_40_59($i,@V); unshift(@V,pop(@V)); } 290e1051a39Sopenharmony_ci 291e1051a39Sopenharmony_ci$code.=<<___; 292e1051a39Sopenharmony_ci ldah $K,-13725(zero) 293e1051a39Sopenharmony_ci lda $K,-15914($K) # K_60_79 294e1051a39Sopenharmony_ci___ 295e1051a39Sopenharmony_cifor (;$i<80;$i++) { &BODY_20_39($i,@V); unshift(@V,pop(@V)); } 296e1051a39Sopenharmony_ci 297e1051a39Sopenharmony_ci$code.=<<___; 298e1051a39Sopenharmony_ci addl @X[0],$A,$A 299e1051a39Sopenharmony_ci addl @X[1],$B,$B 300e1051a39Sopenharmony_ci addl @X[2],$C,$C 301e1051a39Sopenharmony_ci addl @X[3],$D,$D 302e1051a39Sopenharmony_ci addl @X[4],$E,$E 303e1051a39Sopenharmony_ci stl $A,0($ctx) 304e1051a39Sopenharmony_ci stl $B,4($ctx) 305e1051a39Sopenharmony_ci addq $inp,64,$inp 306e1051a39Sopenharmony_ci stl $C,8($ctx) 307e1051a39Sopenharmony_ci stl $D,12($ctx) 308e1051a39Sopenharmony_ci stl $E,16($ctx) 309e1051a39Sopenharmony_ci cmpult $inp,$num,$t1 310e1051a39Sopenharmony_ci bne $t1,.Lloop 311e1051a39Sopenharmony_ci 312e1051a39Sopenharmony_ci .set noreorder 313e1051a39Sopenharmony_ci ldq ra,0(sp) 314e1051a39Sopenharmony_ci ldq s0,8(sp) 315e1051a39Sopenharmony_ci ldq s1,16(sp) 316e1051a39Sopenharmony_ci ldq s2,24(sp) 317e1051a39Sopenharmony_ci ldq s3,32(sp) 318e1051a39Sopenharmony_ci ldq s4,40(sp) 319e1051a39Sopenharmony_ci ldq s5,48(sp) 320e1051a39Sopenharmony_ci ldq fp,56(sp) 321e1051a39Sopenharmony_ci lda sp,64(sp) 322e1051a39Sopenharmony_ci ret (ra) 323e1051a39Sopenharmony_ci.end sha1_block_data_order 324e1051a39Sopenharmony_ci.ascii "SHA1 block transform for Alpha, CRYPTOGAMS by <appro\@openssl.org>" 325e1051a39Sopenharmony_ci.align 2 326e1051a39Sopenharmony_ci___ 327e1051a39Sopenharmony_ci$output=pop and open STDOUT,">$output"; 328e1051a39Sopenharmony_ciprint $code; 329e1051a39Sopenharmony_ciclose STDOUT or die "error closing STDOUT: $!"; 330