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# SHA512 block procedure for ARMv4. September 2007.
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# This code is ~4.5 (four and a half) times faster than code generated
1343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom# by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue
1443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom# Xscale PXA250 core].
1543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#
1643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom# July 2010.
1743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#
1843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom# Rescheduling for dual-issue pipeline resulted in 6% improvement on
1943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom# Cortex A8 core and ~40 cycles per processed byte.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
21392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# February 2011.
22392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#
23392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# Profiler-assisted and platform-specific optimization resulted in 7%
24392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# improvement on Coxtex A8 core and ~38 cycles per byte.
25392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
26392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# March 2011.
27392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#
28392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# Add NEON implementation. On Cortex A8 it was measured to process
29392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# one byte in 25.5 cycles or 47% faster than integer-only code.
30392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Byte order [in]dependence. =========================================
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
33392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# Originally caller was expected to maintain specific *dword* order in
34392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# h[0-7], namely with most significant dword at *lower* address, which
35392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# was reflected in below two parameters as 0 and 4. Now caller is
36392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# expected to maintain native byte order for whole 64-bit values.
37392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$hi="HI";
38392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$lo="LO";
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ====================================================================
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
4143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstromwhile (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {}
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectopen STDOUT,">$output";
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
44392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$ctx="r0";	# parameter block
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$inp="r1";
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$len="r2";
47392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Tlo="r3";
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Thi="r4";
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Alo="r5";
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Ahi="r6";
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Elo="r7";
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Ehi="r8";
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t0="r9";
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t1="r10";
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t2="r11";
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t3="r12";
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project############	r13 is stack pointer
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Ktbl="r14";
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project############	r15 is program counter
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Aoff=8*0;
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Boff=8*1;
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Coff=8*2;
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Doff=8*3;
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Eoff=8*4;
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Foff=8*5;
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Goff=8*6;
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Hoff=8*7;
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$Xoff=8*8;
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub BODY_00_15() {
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $magic = shift;
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	@ Sigma1(x)	(ROTR((x),14) ^ ROTR((x),18)  ^ ROTR((x),41))
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	@ LO		lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	@ HI		hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$t0,$Elo,lsr#14
79392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	str	$Tlo,[sp,#$Xoff+0]
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$t1,$Ehi,lsr#14
81392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	str	$Thi,[sp,#$Xoff+4]
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$Ehi,lsl#18
83392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	$t2,[sp,#$Hoff+0]	@ h.lo
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$Elo,lsl#18
85392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	$t3,[sp,#$Hoff+4]	@ h.hi
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$Elo,lsr#18
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$Ehi,lsr#18
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$Ehi,lsl#14
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$Elo,lsl#14
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$Ehi,lsr#9
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$Elo,lsr#9
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$Elo,lsl#23
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$Ehi,lsl#23	@ Sigma1(e)
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$Tlo,$Tlo,$t0
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t0,[sp,#$Foff+0]	@ f.lo
9643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	adc	$Thi,$Thi,$t1		@ T += Sigma1(e)
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t1,[sp,#$Foff+4]	@ f.hi
9843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	adds	$Tlo,$Tlo,$t2
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t2,[sp,#$Goff+0]	@ g.lo
10043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	adc	$Thi,$Thi,$t3		@ T += h
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t3,[sp,#$Goff+4]	@ g.hi
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$t2
10443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	str	$Elo,[sp,#$Eoff+0]
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$t3
10643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	str	$Ehi,[sp,#$Eoff+4]
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	$t0,$t0,$Elo
10843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	str	$Alo,[sp,#$Aoff+0]
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	$t1,$t1,$Ehi
11043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	str	$Ahi,[sp,#$Aoff+4]
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$t2
112392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	$t2,[$Ktbl,#$lo]	@ K[i].lo
11343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	eor	$t1,$t1,$t3		@ Ch(e,f,g)
114392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	$t3,[$Ktbl,#$hi]	@ K[i].hi
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$Tlo,$Tlo,$t0
11743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	ldr	$Elo,[sp,#$Doff+0]	@ d.lo
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adc	$Thi,$Thi,$t1		@ T += Ch(e,f,g)
11943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	ldr	$Ehi,[sp,#$Doff+4]	@ d.hi
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$Tlo,$Tlo,$t2
121392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	and	$t0,$t2,#0xff
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adc	$Thi,$Thi,$t3		@ T += K[i]
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$Elo,$Elo,$Tlo
124392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	$t2,[sp,#$Boff+0]	@ b.lo
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adc	$Ehi,$Ehi,$Thi		@ d += T
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	teq	$t0,#$magic
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t3,[sp,#$Coff+0]	@ c.lo
129392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	orreq	$Ktbl,$Ktbl,#1
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	@ Sigma0(x)	(ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	@ LO		lo>>28^hi<<4  ^ hi>>2^lo<<30 ^ hi>>7^lo<<25
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	@ HI		hi>>28^lo<<4  ^ lo>>2^hi<<30 ^ lo>>7^hi<<25
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$t0,$Alo,lsr#28
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$t1,$Ahi,lsr#28
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$Ahi,lsl#4
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$Alo,lsl#4
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$Ahi,lsr#2
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$Alo,lsr#2
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$Alo,lsl#30
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$Ahi,lsl#30
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$Ahi,lsr#7
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$Alo,lsr#7
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$Alo,lsl#25
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$Ahi,lsl#25	@ Sigma0(a)
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$Tlo,$Tlo,$t0
146392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	and	$t0,$Alo,$t2
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adc	$Thi,$Thi,$t1		@ T += Sigma0(a)
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t1,[sp,#$Boff+4]	@ b.hi
150392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	orr	$Alo,$Alo,$t2
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t2,[sp,#$Coff+4]	@ c.hi
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	$Alo,$Alo,$t3
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	$t3,$Ahi,$t1
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	orr	$Ahi,$Ahi,$t1
155392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	orr	$Alo,$Alo,$t0		@ Maj(a,b,c).lo
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	$Ahi,$Ahi,$t2
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$Alo,$Alo,$Tlo
158392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	orr	$Ahi,$Ahi,$t3		@ Maj(a,b,c).hi
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	sp,sp,#8
160392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adc	$Ahi,$Ahi,$Thi		@ h += T
161392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	tst	$Ktbl,#1
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	$Ktbl,$Ktbl,#8
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code=<<___;
166392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include "arm_arch.h"
167392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef __ARMEL__
168392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# define LO 0
169392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# define HI 4
170392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# define WORD64(hi0,lo0,hi1,lo1)	.word	lo0,hi0, lo1,hi1
171392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#else
172392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# define HI 0
173392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# define LO 4
174392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# define WORD64(hi0,lo0,hi1,lo1)	.word	hi0,lo0, hi1,lo1
175392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
176392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.text
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.code	32
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	K512,%object
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	5
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectK512:
182392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x428a2f98,0xd728ae22, 0x71374491,0x23ef65cd)
183392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0xb5c0fbcf,0xec4d3b2f, 0xe9b5dba5,0x8189dbbc)
184392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x3956c25b,0xf348b538, 0x59f111f1,0xb605d019)
185392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x923f82a4,0xaf194f9b, 0xab1c5ed5,0xda6d8118)
186392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0xd807aa98,0xa3030242, 0x12835b01,0x45706fbe)
187392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x243185be,0x4ee4b28c, 0x550c7dc3,0xd5ffb4e2)
188392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x72be5d74,0xf27b896f, 0x80deb1fe,0x3b1696b1)
189392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x9bdc06a7,0x25c71235, 0xc19bf174,0xcf692694)
190392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0xe49b69c1,0x9ef14ad2, 0xefbe4786,0x384f25e3)
191392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x0fc19dc6,0x8b8cd5b5, 0x240ca1cc,0x77ac9c65)
192392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x2de92c6f,0x592b0275, 0x4a7484aa,0x6ea6e483)
193392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x5cb0a9dc,0xbd41fbd4, 0x76f988da,0x831153b5)
194392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x983e5152,0xee66dfab, 0xa831c66d,0x2db43210)
195392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0xb00327c8,0x98fb213f, 0xbf597fc7,0xbeef0ee4)
196392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0xc6e00bf3,0x3da88fc2, 0xd5a79147,0x930aa725)
197392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x06ca6351,0xe003826f, 0x14292967,0x0a0e6e70)
198392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x27b70a85,0x46d22ffc, 0x2e1b2138,0x5c26c926)
199392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x4d2c6dfc,0x5ac42aed, 0x53380d13,0x9d95b3df)
200392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x650a7354,0x8baf63de, 0x766a0abb,0x3c77b2a8)
201392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x81c2c92e,0x47edaee6, 0x92722c85,0x1482353b)
202392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0xa2bfe8a1,0x4cf10364, 0xa81a664b,0xbc423001)
203392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0xc24b8b70,0xd0f89791, 0xc76c51a3,0x0654be30)
204392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0xd192e819,0xd6ef5218, 0xd6990624,0x5565a910)
205392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0xf40e3585,0x5771202a, 0x106aa070,0x32bbd1b8)
206392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x19a4c116,0xb8d2d0c8, 0x1e376c08,0x5141ab53)
207392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x2748774c,0xdf8eeb99, 0x34b0bcb5,0xe19b48a8)
208392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x391c0cb3,0xc5c95a63, 0x4ed8aa4a,0xe3418acb)
209392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x5b9cca4f,0x7763e373, 0x682e6ff3,0xd6b2b8a3)
210392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x748f82ee,0x5defb2fc, 0x78a5636f,0x43172f60)
211392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x84c87814,0xa1f0ab72, 0x8cc70208,0x1a6439ec)
212392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x90befffa,0x23631e28, 0xa4506ceb,0xde82bde9)
213392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0xbef9a3f7,0xb2c67915, 0xc67178f2,0xe372532b)
214392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0xca273ece,0xea26619c, 0xd186b8c7,0x21c0c207)
215392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0xeada7dd6,0xcde0eb1e, 0xf57d4f7f,0xee6ed178)
216392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x06f067aa,0x72176fba, 0x0a637dc5,0xa2c898a6)
217392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x113f9804,0xbef90dae, 0x1b710b35,0x131c471b)
218392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x28db77f5,0x23047d84, 0x32caab7b,0x40c72493)
219392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x3c9ebe0a,0x15c9bebc, 0x431d67c4,0x9c100d4c)
220392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x4cc5d4be,0xcb3e42b6, 0x597f299c,0xfc657e2a)
221392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromWORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817)
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	K512,.-K512
223392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.LOPENSSL_armcap:
224392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.word	OPENSSL_armcap_P-sha512_block_data_order
225392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.skip	32-4
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.global	sha512_block_data_order
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	sha512_block_data_order,%function
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsha512_block_data_order:
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	r3,pc,#8		@ sha512_block_data_order
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	$len,$inp,$len,lsl#7	@ len to point at the end of inp
232392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if __ARM_ARCH__>=7
233392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	r12,.LOPENSSL_armcap
234392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	r12,[r3,r12]		@ OPENSSL_armcap_P
235392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	tst	r12,#1
236392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	bne	.LNEON
237392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	stmdb	sp!,{r4-r12,lr}
239392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	sub	$Ktbl,r3,#672		@ K512
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	sp,sp,#9*8
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Elo,[$ctx,#$Eoff+$lo]
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Ehi,[$ctx,#$Eoff+$hi]
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t0, [$ctx,#$Goff+$lo]
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t1, [$ctx,#$Goff+$hi]
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t2, [$ctx,#$Hoff+$lo]
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t3, [$ctx,#$Hoff+$hi]
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Loop:
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t0, [sp,#$Goff+0]
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t1, [sp,#$Goff+4]
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t2, [sp,#$Hoff+0]
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t3, [sp,#$Hoff+4]
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Alo,[$ctx,#$Aoff+$lo]
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Ahi,[$ctx,#$Aoff+$hi]
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Tlo,[$ctx,#$Boff+$lo]
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Thi,[$ctx,#$Boff+$hi]
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t0, [$ctx,#$Coff+$lo]
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t1, [$ctx,#$Coff+$hi]
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t2, [$ctx,#$Doff+$lo]
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t3, [$ctx,#$Doff+$hi]
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$Tlo,[sp,#$Boff+0]
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$Thi,[sp,#$Boff+4]
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t0, [sp,#$Coff+0]
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t1, [sp,#$Coff+4]
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t2, [sp,#$Doff+0]
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t3, [sp,#$Doff+4]
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Tlo,[$ctx,#$Foff+$lo]
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Thi,[$ctx,#$Foff+$hi]
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$Tlo,[sp,#$Foff+0]
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$Thi,[sp,#$Foff+4]
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L00_15:
273392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if __ARM_ARCH__<7
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldrb	$Tlo,[$inp,#7]
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldrb	$t0, [$inp,#6]
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldrb	$t1, [$inp,#5]
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldrb	$t2, [$inp,#4]
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldrb	$Thi,[$inp,#3]
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldrb	$t3, [$inp,#2]
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	orr	$Tlo,$Tlo,$t0,lsl#8
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldrb	$t0, [$inp,#1]
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	orr	$Tlo,$Tlo,$t1,lsl#16
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldrb	$t1, [$inp],#8
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	orr	$Tlo,$Tlo,$t2,lsl#24
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	orr	$Thi,$Thi,$t3,lsl#8
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	orr	$Thi,$Thi,$t0,lsl#16
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	orr	$Thi,$Thi,$t1,lsl#24
288392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#else
289392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	$Tlo,[$inp,#4]
290392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	$Thi,[$inp],#8
291392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef __ARMEL__
292392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	rev	$Tlo,$Tlo
293392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	rev	$Thi,$Thi
294392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
295392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&BODY_00_15(0x94);
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tst	$Ktbl,#1
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	beq	.L00_15
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t0,[sp,#`$Xoff+8*(16-1)`+0]
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t1,[sp,#`$Xoff+8*(16-1)`+4]
303392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	bic	$Ktbl,$Ktbl,#1
304392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.L16_79:
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	@ sigma0(x)	(ROTR((x),1)  ^ ROTR((x),8)  ^ ((x)>>7))
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	@ LO		lo>>1^hi<<31  ^ lo>>8^hi<<24 ^ lo>>7^hi<<25
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	@ HI		hi>>1^lo<<31  ^ hi>>8^lo<<24 ^ hi>>7
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$Tlo,$t0,lsr#1
309392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	$t2,[sp,#`$Xoff+8*(16-14)`+0]
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$Thi,$t1,lsr#1
311392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	$t3,[sp,#`$Xoff+8*(16-14)`+4]
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$Tlo,$Tlo,$t1,lsl#31
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$Thi,$Thi,$t0,lsl#31
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$Tlo,$Tlo,$t0,lsr#8
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$Thi,$Thi,$t1,lsr#8
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$Tlo,$Tlo,$t1,lsl#24
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$Thi,$Thi,$t0,lsl#24
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$Tlo,$Tlo,$t0,lsr#7
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$Thi,$Thi,$t1,lsr#7
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$Tlo,$Tlo,$t1,lsl#25
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	@ sigma1(x)	(ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6))
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	@ LO		lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	@ HI		hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$t0,$t2,lsr#19
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$t1,$t3,lsr#19
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$t3,lsl#13
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$t2,lsl#13
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$t3,lsr#29
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$t2,lsr#29
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$t2,lsl#3
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$t3,lsl#3
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$t2,lsr#6
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t1,$t1,$t3,lsr#6
335392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	$t2,[sp,#`$Xoff+8*(16-9)`+0]
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	eor	$t0,$t0,$t3,lsl#26
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t3,[sp,#`$Xoff+8*(16-9)`+4]
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$Tlo,$Tlo,$t0
340392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldr	$t0,[sp,#`$Xoff+8*16`+0]
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adc	$Thi,$Thi,$t1
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t1,[sp,#`$Xoff+8*16`+4]
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$Tlo,$Tlo,$t2
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adc	$Thi,$Thi,$t3
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$Tlo,$Tlo,$t0
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adc	$Thi,$Thi,$t1
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&BODY_00_15(0x17);
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
351392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldreq	$t0,[sp,#`$Xoff+8*(16-1)`+0]
352392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldreq	$t1,[sp,#`$Xoff+8*(16-1)`+4]
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	beq	.L16_79
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bic	$Ktbl,$Ktbl,#1
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Tlo,[sp,#$Boff+0]
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Thi,[sp,#$Boff+4]
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t0, [$ctx,#$Aoff+$lo]
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t1, [$ctx,#$Aoff+$hi]
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t2, [$ctx,#$Boff+$lo]
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t3, [$ctx,#$Boff+$hi]
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$t0,$Alo,$t0
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t0, [$ctx,#$Aoff+$lo]
364392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adc	$t1,$Ahi,$t1
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t1, [$ctx,#$Aoff+$hi]
366392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adds	$t2,$Tlo,$t2
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t2, [$ctx,#$Boff+$lo]
368392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adc	$t3,$Thi,$t3
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t3, [$ctx,#$Boff+$hi]
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Alo,[sp,#$Coff+0]
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Ahi,[sp,#$Coff+4]
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Tlo,[sp,#$Doff+0]
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Thi,[sp,#$Doff+4]
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t0, [$ctx,#$Coff+$lo]
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t1, [$ctx,#$Coff+$hi]
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t2, [$ctx,#$Doff+$lo]
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t3, [$ctx,#$Doff+$hi]
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$t0,$Alo,$t0
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t0, [$ctx,#$Coff+$lo]
381392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adc	$t1,$Ahi,$t1
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t1, [$ctx,#$Coff+$hi]
383392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adds	$t2,$Tlo,$t2
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t2, [$ctx,#$Doff+$lo]
385392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adc	$t3,$Thi,$t3
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t3, [$ctx,#$Doff+$hi]
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Tlo,[sp,#$Foff+0]
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Thi,[sp,#$Foff+4]
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t0, [$ctx,#$Eoff+$lo]
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t1, [$ctx,#$Eoff+$hi]
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t2, [$ctx,#$Foff+$lo]
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t3, [$ctx,#$Foff+$hi]
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$Elo,$Elo,$t0
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$Elo,[$ctx,#$Eoff+$lo]
396392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adc	$Ehi,$Ehi,$t1
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$Ehi,[$ctx,#$Eoff+$hi]
398392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adds	$t2,$Tlo,$t2
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t2, [$ctx,#$Foff+$lo]
400392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adc	$t3,$Thi,$t3
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t3, [$ctx,#$Foff+$hi]
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Alo,[sp,#$Goff+0]
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Ahi,[sp,#$Goff+4]
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Tlo,[sp,#$Hoff+0]
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$Thi,[sp,#$Hoff+4]
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t0, [$ctx,#$Goff+$lo]
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t1, [$ctx,#$Goff+$hi]
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t2, [$ctx,#$Hoff+$lo]
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldr	$t3, [$ctx,#$Hoff+$hi]
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	adds	$t0,$Alo,$t0
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t0, [$ctx,#$Goff+$lo]
413392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adc	$t1,$Ahi,$t1
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t1, [$ctx,#$Goff+$hi]
415392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adds	$t2,$Tlo,$t2
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t2, [$ctx,#$Hoff+$lo]
417392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	adc	$t3,$Thi,$t3
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	str	$t3, [$ctx,#$Hoff+$hi]
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	sp,sp,#640
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	$Ktbl,$Ktbl,#640
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	teq	$inp,$len
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bne	.Loop
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	sp,sp,#8*9		@ destroy frame
427392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if __ARM_ARCH__>=5
428392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ldmia	sp!,{r4-r12,pc}
429392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#else
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ldmia	sp!,{r4-r12,lr}
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tst	lr,#1
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	moveq	pc,lr			@ be binary compatible with V4, yet
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bx	lr			@ interoperable with Thumb ISA:-)
434392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
435392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___
436392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
437392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom{
438392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy @Sigma0=(28,34,39);
439392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy @Sigma1=(14,18,41);
440392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy @sigma0=(1, 8, 7);
441392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy @sigma1=(19,61,6);
442392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
443392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy $Ktbl="r3";
444392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy $cnt="r12";	# volatile register known as ip, intra-procedure-call scratch
445392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
446392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy @X=map("d$_",(0..15));
447392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy @V=($A,$B,$C,$D,$E,$F,$G,$H)=map("d$_",(16..23));
448392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
449392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromsub NEON_00_15() {
450392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy $i=shift;
451392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy ($a,$b,$c,$d,$e,$f,$g,$h)=@_;
452392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy ($t0,$t1,$t2,$T1,$K,$Ch,$Maj)=map("d$_",(24..31));	# temps
453392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
454392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___ if ($i<16 || $i&1);
455392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$t0,$e,#@Sigma1[0]	@ $i
456392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if $i<16
457392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vld1.64		{@X[$i%16]},[$inp]!	@ handles unaligned
458392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
459392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$t1,$e,#@Sigma1[1]
460392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$t2,$e,#@Sigma1[2]
461392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___
462392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___;
463392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vld1.64		{$K},[$Ktbl,:64]!	@ K[i++]
464392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vsli.64		$t0,$e,#`64-@Sigma1[0]`
465392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vsli.64		$t1,$e,#`64-@Sigma1[1]`
466392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vsli.64		$t2,$e,#`64-@Sigma1[2]`
467392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if $i<16 && defined(__ARMEL__)
468392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vrev64.8	@X[$i],@X[$i]
469392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
470392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	$T1,$K,$h
471392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	veor		$Ch,$f,$g
472392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	veor		$t0,$t1
473392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vand		$Ch,$e
474392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	veor		$t0,$t2			@ Sigma1(e)
475392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	veor		$Ch,$g			@ Ch(e,f,g)
476392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	$T1,$t0
477392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$t0,$a,#@Sigma0[0]
478392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	$T1,$Ch
479392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$t1,$a,#@Sigma0[1]
480392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$t2,$a,#@Sigma0[2]
481392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vsli.64		$t0,$a,#`64-@Sigma0[0]`
482392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vsli.64		$t1,$a,#`64-@Sigma0[1]`
483392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vsli.64		$t2,$a,#`64-@Sigma0[2]`
484392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	$T1,@X[$i%16]
485392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vorr		$Maj,$a,$c
486392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vand		$Ch,$a,$c
487392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	veor		$h,$t0,$t1
488392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vand		$Maj,$b
489392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	veor		$h,$t2			@ Sigma0(a)
490392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vorr		$Maj,$Ch		@ Maj(a,b,c)
491392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	$h,$T1
492392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	$d,$T1
493392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	$h,$Maj
494392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___
495392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
496392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
497392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromsub NEON_16_79() {
498392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy $i=shift;
499392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
500392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromif ($i&1)	{ &NEON_00_15($i,@_); return; }
501392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
502392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# 2x-vectorized, therefore runs every 2nd round
503392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy @X=map("q$_",(0..7));			# view @X as 128-bit vector
504392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy ($t0,$t1,$s0,$s1) = map("q$_",(12..15));	# temps
505392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy ($d0,$d1,$d2) = map("d$_",(24..26));		# temps from NEON_00_15
506392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrommy $e=@_[4];					# $e from NEON_00_15
507392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$i /= 2;
508392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___;
509392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$t0,@X[($i+7)%8],#@sigma1[0]
510392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$t1,@X[($i+7)%8],#@sigma1[1]
511392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$s1,@X[($i+7)%8],#@sigma1[2]
512392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vsli.64		$t0,@X[($i+7)%8],#`64-@sigma1[0]`
513392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vext.8		$s0,@X[$i%8],@X[($i+1)%8],#8	@ X[i+1]
514392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vsli.64		$t1,@X[($i+7)%8],#`64-@sigma1[1]`
515392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	veor		$s1,$t0
516392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$t0,$s0,#@sigma0[0]
517392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	veor		$s1,$t1				@ sigma1(X[i+14])
518392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$t1,$s0,#@sigma0[1]
519392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	@X[$i%8],$s1
520392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$s1,$s0,#@sigma0[2]
521392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vsli.64		$t0,$s0,#`64-@sigma0[0]`
522392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vsli.64		$t1,$s0,#`64-@sigma0[1]`
523392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vext.8		$s0,@X[($i+4)%8],@X[($i+5)%8],#8	@ X[i+9]
524392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	veor		$s1,$t0
525392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$d0,$e,#@Sigma1[0]		@ from NEON_00_15
526392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	@X[$i%8],$s0
527392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$d1,$e,#@Sigma1[1]		@ from NEON_00_15
528392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	veor		$s1,$t1				@ sigma0(X[i+1])
529392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vshr.u64	$d2,$e,#@Sigma1[2]		@ from NEON_00_15
530392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	@X[$i%8],$s1
531392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___
532392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	&NEON_00_15(2*$i,@_);
533392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
534392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
535392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___;
536392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#if __ARM_ARCH__>=7
537392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.fpu	neon
538392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
539392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.align	4
540392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.LNEON:
541392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	dmb				@ errata #451034 on early Cortex A8
542392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vstmdb	sp!,{d8-d15}		@ ABI specification says so
543392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	sub	$Ktbl,r3,#672		@ K512
544392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vldmia	$ctx,{$A-$H}		@ load context
545392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.Loop_neon:
546392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___
547392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromfor($i=0;$i<16;$i++)	{ &NEON_00_15($i,@V); unshift(@V,pop(@V)); }
548392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___;
549392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	mov		$cnt,#4
550392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.L16_79_neon:
551392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	subs		$cnt,#1
552392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___
553392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromfor(;$i<32;$i++)	{ &NEON_16_79($i,@V); unshift(@V,pop(@V)); }
554392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___;
555392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	bne		.L16_79_neon
556392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
557392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vldmia		$ctx,{d24-d31}	@ load context to temp
558392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	q8,q12		@ vectorized accumulate
559392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	q9,q13
560392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	q10,q14
561392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vadd.i64	q11,q15
562392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vstmia		$ctx,{$A-$H}	@ save context
563392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	teq		$inp,$len
564392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	sub		$Ktbl,#640	@ rewind K512
565392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	bne		.Loop_neon
566392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
567392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	vldmia	sp!,{d8-d15}		@ epilogue
5683f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root	ret				@ bx lr
569392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
570392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom___
571392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
572392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom$code.=<<___;
573392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size	sha512_block_data_order,.-sha512_block_data_order
574392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.asciz	"SHA512 block transform for ARMv4/NEON, CRYPTOGAMS by <appro\@openssl.org>"
575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	2
576392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.comm	OPENSSL_armcap_P,4,4
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code =~ s/\`([^\`]*)\`/eval $1/gem;
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code =~ s/\bbx\s+lr\b/.word\t0xe12fff1e/gm;	# make it possible to compile with -march=armv4
5813f9e6ada2c9f7183a41081263585e6a70bbd9f59Kenny Root$code =~ s/\bret\b/bx	lr/gm;
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprint $code;
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclose STDOUT; # enforce flush
584