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