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