1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#!/usr/bin/env perl 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ==================================================================== 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# project. The module is, however, dual licensed under OpenSSL and 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# CRYPTOGAMS licenses depending on where you obtain it. For further 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# details see http://www.openssl.org/~appro/cryptogams/. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ==================================================================== 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# SHA256 block procedure for ARMv4. May 2007. 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Performance is ~2x better than gcc 3.4 generated code and in "abso- 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# lute" terms is ~2250 cycles per 64-byte block or ~35 cycles per 1443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom# byte [on single-issue Xscale PXA250 core]. 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom# July 2010. 1743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom# 1843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom# Rescheduling for dual-issue pipeline resulted in 22% improvement on 1943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom# Cortex A8 core and ~20 cycles per processed byte. 2043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom 21392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# February 2011. 22392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# 23392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# Profiler-assisted and platform-specific optimization resulted in 16% 24392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# improvement on Cortex A8 core and ~17 cycles per processed byte. 25392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstromwhile (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {} 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectopen STDOUT,">$output"; 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$ctx="r0"; $t0="r0"; 30392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$inp="r1"; $t3="r1"; 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$len="r2"; $t1="r2"; 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$T1="r3"; 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$A="r4"; 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$B="r5"; 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$C="r6"; 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$D="r7"; 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$E="r8"; 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$F="r9"; 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$G="r10"; 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$H="r11"; 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project@V=($A,$B,$C,$D,$E,$F,$G,$H); 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t2="r12"; 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Ktbl="r14"; 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project@Sigma0=( 2,13,22); 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project@Sigma1=( 6,11,25); 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project@sigma0=( 7,18, 3); 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project@sigma1=(17,19,10); 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub BODY_00_15 { 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_; 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___ if ($i<16); 54392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if __ARM_ARCH__>=7 55392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ldr $T1,[$inp],#4 56392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#else 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldrb $T1,[$inp,#3] @ $i 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldrb $t2,[$inp,#2] 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldrb $t1,[$inp,#1] 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldrb $t0,[$inp],#4 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project orr $T1,$T1,$t2,lsl#8 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project orr $T1,$T1,$t1,lsl#16 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project orr $T1,$T1,$t0,lsl#24 64392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $t0,$e,ror#$Sigma1[0] 68392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ldr $t2,[$Ktbl],#4 @ *K256++ 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project eor $t0,$t0,$e,ror#$Sigma1[1] 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project eor $t1,$f,$g 71392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if $i>=16 72392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom add $T1,$T1,$t3 @ from BODY_16_xx 73392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#elif __ARM_ARCH__>=7 && defined(__ARMEL__) 74392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom rev $T1,$T1 75392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 76392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if $i==15 77392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom str $inp,[sp,#17*4] @ leave room for $t3 78392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 7943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom eor $t0,$t0,$e,ror#$Sigma1[2] @ Sigma1(e) 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and $t1,$t1,$e 81392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom str $T1,[sp,#`$i%16`*4] 8243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom add $T1,$T1,$t0 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project eor $t1,$t1,$g @ Ch(e,f,g) 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add $T1,$T1,$h 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $h,$a,ror#$Sigma0[0] 8643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom add $T1,$T1,$t1 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project eor $h,$h,$a,ror#$Sigma0[1] 8843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom add $T1,$T1,$t2 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project eor $h,$h,$a,ror#$Sigma0[2] @ Sigma0(a) 90392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if $i>=15 91392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ldr $t3,[sp,#`($i+2)%16`*4] @ from BODY_16_xx 92392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project orr $t0,$a,$b 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and $t1,$a,$b 9543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom and $t0,$t0,$c 9643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom add $h,$h,$T1 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project orr $t0,$t0,$t1 @ Maj(a,b,c) 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add $d,$d,$T1 9943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom add $h,$h,$t0 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub BODY_16_XX { 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_; 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 107392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom @ ldr $t3,[sp,#`($i+1)%16`*4] @ $i 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $t2,[sp,#`($i+14)%16`*4] 109392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom mov $t0,$t3,ror#$sigma0[0] 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $T1,[sp,#`($i+0)%16`*4] 111392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom eor $t0,$t0,$t3,ror#$sigma0[1] 112392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ldr $t1,[sp,#`($i+9)%16`*4] 113392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom eor $t0,$t0,$t3,lsr#$sigma0[2] @ sigma0(X[i+1]) 114392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom mov $t3,$t2,ror#$sigma1[0] 11543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom add $T1,$T1,$t0 116392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom eor $t3,$t3,$t2,ror#$sigma1[1] 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add $T1,$T1,$t1 118392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom eor $t3,$t3,$t2,lsr#$sigma1[2] @ sigma1(X[i+14]) 119392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom @ add $T1,$T1,$t3 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &BODY_00_15(@_); 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code=<<___; 125392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include "arm_arch.h" 126392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.text 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.code 32 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type K256,%object 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 5 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectK256: 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.word 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size K256,.-K256 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.global sha256_block_data_order 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type sha256_block_data_order,%function 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsha256_block_data_order: 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub r3,pc,#8 @ sha256_block_data_order 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add $len,$inp,$len,lsl#6 @ len to point at the end of inp 156392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom stmdb sp!,{$ctx,$inp,$len,r4-r11,lr} 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldmia $ctx,{$A,$B,$C,$D,$E,$F,$G,$H} 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub $Ktbl,r3,#256 @ K256 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub sp,sp,#16*4 @ alloca(X[16]) 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Loop: 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectfor($i=0;$i<16;$i++) { &BODY_00_15($i,@V); unshift(@V,pop(@V)); } 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=".Lrounds_16_xx:\n"; 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectfor (;$i<32;$i++) { &BODY_16_XX($i,@V); unshift(@V,pop(@V)); } 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and $t2,$t2,#0xff 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp $t2,#0xf2 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bne .Lrounds_16_xx 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $T1,[sp,#16*4] @ pull ctx 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $t0,[$T1,#0] 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $t1,[$T1,#4] 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $t2,[$T1,#8] 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add $A,$A,$t0 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $t0,[$T1,#12] 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add $B,$B,$t1 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $t1,[$T1,#16] 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add $C,$C,$t2 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $t2,[$T1,#20] 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add $D,$D,$t0 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $t0,[$T1,#24] 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add $E,$E,$t1 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $t1,[$T1,#28] 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add $F,$F,$t2 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $inp,[sp,#17*4] @ pull inp 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ldr $t2,[sp,#18*4] @ pull inp+len 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add $G,$G,$t0 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add $H,$H,$t1 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project stmia $T1,{$A,$B,$C,$D,$E,$F,$G,$H} 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp $inp,$t2 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub $Ktbl,$Ktbl,#256 @ rewind Ktbl 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bne .Loop 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add sp,sp,#`16+3`*4 @ destroy frame 195392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if __ARM_ARCH__>=5 196392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ldmia sp!,{r4-r11,pc} 197392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#else 198392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ldmia sp!,{r4-r11,lr} 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tst lr,#1 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project moveq pc,lr @ be binary compatible with V4, yet 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bx lr @ interoperable with Thumb ISA:-) 202392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size sha256_block_data_order,.-sha256_block_data_order 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.asciz "SHA256 block transform for ARMv4, CRYPTOGAMS by <appro\@openssl.org>" 205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 2 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code =~ s/\`([^\`]*)\`/eval $1/gem; 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code =~ s/\bbx\s+lr\b/.word\t0xe12fff1e/gm; # make it possible to compile with -march=armv4 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprint $code; 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclose STDOUT; # enforce flush 212