1*8fb009dcSAndroid Build Coastguard Worker// This file is generated from a similarly-named Perl script in the BoringSSL 2*8fb009dcSAndroid Build Coastguard Worker// source tree. Do not edit by hand. 3*8fb009dcSAndroid Build Coastguard Worker 4*8fb009dcSAndroid Build Coastguard Worker#include <openssl/asm_base.h> 5*8fb009dcSAndroid Build Coastguard Worker 6*8fb009dcSAndroid Build Coastguard Worker#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_ARM) && defined(__ELF__) 7*8fb009dcSAndroid Build Coastguard Worker#include <openssl/arm_arch.h> 8*8fb009dcSAndroid Build Coastguard Worker 9*8fb009dcSAndroid Build Coastguard Worker@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both 10*8fb009dcSAndroid Build Coastguard Worker@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. 11*8fb009dcSAndroid Build Coastguard Worker.arch armv7-a 12*8fb009dcSAndroid Build Coastguard Worker 13*8fb009dcSAndroid Build Coastguard Worker.text 14*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) || defined(__clang__) 15*8fb009dcSAndroid Build Coastguard Worker.syntax unified 16*8fb009dcSAndroid Build Coastguard Worker#endif 17*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) 18*8fb009dcSAndroid Build Coastguard Worker.thumb 19*8fb009dcSAndroid Build Coastguard Worker#else 20*8fb009dcSAndroid Build Coastguard Worker.code 32 21*8fb009dcSAndroid Build Coastguard Worker#endif 22*8fb009dcSAndroid Build Coastguard Worker 23*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) || defined(__clang__) 24*8fb009dcSAndroid Build Coastguard Worker#define ldrhsb ldrbhs 25*8fb009dcSAndroid Build Coastguard Worker#endif 26*8fb009dcSAndroid Build Coastguard Worker 27*8fb009dcSAndroid Build Coastguard Worker.align 5 28*8fb009dcSAndroid Build Coastguard Worker.Lsigma: 29*8fb009dcSAndroid Build Coastguard Worker.long 0x61707865,0x3320646e,0x79622d32,0x6b206574 @ endian-neutral 30*8fb009dcSAndroid Build Coastguard Worker.Lone: 31*8fb009dcSAndroid Build Coastguard Worker.long 1,0,0,0 32*8fb009dcSAndroid Build Coastguard Worker 33*8fb009dcSAndroid Build Coastguard Worker.globl ChaCha20_ctr32_nohw 34*8fb009dcSAndroid Build Coastguard Worker.hidden ChaCha20_ctr32_nohw 35*8fb009dcSAndroid Build Coastguard Worker.type ChaCha20_ctr32_nohw,%function 36*8fb009dcSAndroid Build Coastguard Worker.align 5 37*8fb009dcSAndroid Build Coastguard WorkerChaCha20_ctr32_nohw: 38*8fb009dcSAndroid Build Coastguard Worker ldr r12,[sp,#0] @ pull pointer to counter and nonce 39*8fb009dcSAndroid Build Coastguard Worker stmdb sp!,{r0,r1,r2,r4-r11,lr} 40*8fb009dcSAndroid Build Coastguard Worker adr r14,.Lsigma 41*8fb009dcSAndroid Build Coastguard Worker ldmia r12,{r4,r5,r6,r7} @ load counter and nonce 42*8fb009dcSAndroid Build Coastguard Worker sub sp,sp,#4*(16) @ off-load area 43*8fb009dcSAndroid Build Coastguard Worker stmdb sp!,{r4,r5,r6,r7} @ copy counter and nonce 44*8fb009dcSAndroid Build Coastguard Worker ldmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} @ load key 45*8fb009dcSAndroid Build Coastguard Worker ldmia r14,{r0,r1,r2,r3} @ load sigma 46*8fb009dcSAndroid Build Coastguard Worker stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy key 47*8fb009dcSAndroid Build Coastguard Worker stmdb sp!,{r0,r1,r2,r3} @ copy sigma 48*8fb009dcSAndroid Build Coastguard Worker str r10,[sp,#4*(16+10)] @ off-load "rx" 49*8fb009dcSAndroid Build Coastguard Worker str r11,[sp,#4*(16+11)] @ off-load "rx" 50*8fb009dcSAndroid Build Coastguard Worker b .Loop_outer_enter 51*8fb009dcSAndroid Build Coastguard Worker 52*8fb009dcSAndroid Build Coastguard Worker.align 4 53*8fb009dcSAndroid Build Coastguard Worker.Loop_outer: 54*8fb009dcSAndroid Build Coastguard Worker ldmia sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ load key material 55*8fb009dcSAndroid Build Coastguard Worker str r11,[sp,#4*(32+2)] @ save len 56*8fb009dcSAndroid Build Coastguard Worker str r12, [sp,#4*(32+1)] @ save inp 57*8fb009dcSAndroid Build Coastguard Worker str r14, [sp,#4*(32+0)] @ save out 58*8fb009dcSAndroid Build Coastguard Worker.Loop_outer_enter: 59*8fb009dcSAndroid Build Coastguard Worker ldr r11, [sp,#4*(15)] 60*8fb009dcSAndroid Build Coastguard Worker ldr r12,[sp,#4*(12)] @ modulo-scheduled load 61*8fb009dcSAndroid Build Coastguard Worker ldr r10, [sp,#4*(13)] 62*8fb009dcSAndroid Build Coastguard Worker ldr r14,[sp,#4*(14)] 63*8fb009dcSAndroid Build Coastguard Worker str r11, [sp,#4*(16+15)] 64*8fb009dcSAndroid Build Coastguard Worker mov r11,#10 65*8fb009dcSAndroid Build Coastguard Worker b .Loop 66*8fb009dcSAndroid Build Coastguard Worker 67*8fb009dcSAndroid Build Coastguard Worker.align 4 68*8fb009dcSAndroid Build Coastguard Worker.Loop: 69*8fb009dcSAndroid Build Coastguard Worker subs r11,r11,#1 70*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r4 71*8fb009dcSAndroid Build Coastguard Worker mov r12,r12,ror#16 72*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r5 73*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#16 74*8fb009dcSAndroid Build Coastguard Worker eor r12,r12,r0,ror#16 75*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r1,ror#16 76*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r12 77*8fb009dcSAndroid Build Coastguard Worker mov r4,r4,ror#20 78*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r10 79*8fb009dcSAndroid Build Coastguard Worker mov r5,r5,ror#20 80*8fb009dcSAndroid Build Coastguard Worker eor r4,r4,r8,ror#20 81*8fb009dcSAndroid Build Coastguard Worker eor r5,r5,r9,ror#20 82*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r4 83*8fb009dcSAndroid Build Coastguard Worker mov r12,r12,ror#24 84*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r5 85*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#24 86*8fb009dcSAndroid Build Coastguard Worker eor r12,r12,r0,ror#24 87*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r1,ror#24 88*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r12 89*8fb009dcSAndroid Build Coastguard Worker mov r4,r4,ror#25 90*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r10 91*8fb009dcSAndroid Build Coastguard Worker mov r5,r5,ror#25 92*8fb009dcSAndroid Build Coastguard Worker str r10,[sp,#4*(16+13)] 93*8fb009dcSAndroid Build Coastguard Worker ldr r10,[sp,#4*(16+15)] 94*8fb009dcSAndroid Build Coastguard Worker eor r4,r4,r8,ror#25 95*8fb009dcSAndroid Build Coastguard Worker eor r5,r5,r9,ror#25 96*8fb009dcSAndroid Build Coastguard Worker str r8,[sp,#4*(16+8)] 97*8fb009dcSAndroid Build Coastguard Worker ldr r8,[sp,#4*(16+10)] 98*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r6 99*8fb009dcSAndroid Build Coastguard Worker mov r14,r14,ror#16 100*8fb009dcSAndroid Build Coastguard Worker str r9,[sp,#4*(16+9)] 101*8fb009dcSAndroid Build Coastguard Worker ldr r9,[sp,#4*(16+11)] 102*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r7 103*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#16 104*8fb009dcSAndroid Build Coastguard Worker eor r14,r14,r2,ror#16 105*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r3,ror#16 106*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r14 107*8fb009dcSAndroid Build Coastguard Worker mov r6,r6,ror#20 108*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r10 109*8fb009dcSAndroid Build Coastguard Worker mov r7,r7,ror#20 110*8fb009dcSAndroid Build Coastguard Worker eor r6,r6,r8,ror#20 111*8fb009dcSAndroid Build Coastguard Worker eor r7,r7,r9,ror#20 112*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r6 113*8fb009dcSAndroid Build Coastguard Worker mov r14,r14,ror#24 114*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r7 115*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#24 116*8fb009dcSAndroid Build Coastguard Worker eor r14,r14,r2,ror#24 117*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r3,ror#24 118*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r14 119*8fb009dcSAndroid Build Coastguard Worker mov r6,r6,ror#25 120*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r10 121*8fb009dcSAndroid Build Coastguard Worker mov r7,r7,ror#25 122*8fb009dcSAndroid Build Coastguard Worker eor r6,r6,r8,ror#25 123*8fb009dcSAndroid Build Coastguard Worker eor r7,r7,r9,ror#25 124*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r5 125*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#16 126*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r6 127*8fb009dcSAndroid Build Coastguard Worker mov r12,r12,ror#16 128*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r0,ror#16 129*8fb009dcSAndroid Build Coastguard Worker eor r12,r12,r1,ror#16 130*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r10 131*8fb009dcSAndroid Build Coastguard Worker mov r5,r5,ror#20 132*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r12 133*8fb009dcSAndroid Build Coastguard Worker mov r6,r6,ror#20 134*8fb009dcSAndroid Build Coastguard Worker eor r5,r5,r8,ror#20 135*8fb009dcSAndroid Build Coastguard Worker eor r6,r6,r9,ror#20 136*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r5 137*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#24 138*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r6 139*8fb009dcSAndroid Build Coastguard Worker mov r12,r12,ror#24 140*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r0,ror#24 141*8fb009dcSAndroid Build Coastguard Worker eor r12,r12,r1,ror#24 142*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r10 143*8fb009dcSAndroid Build Coastguard Worker mov r5,r5,ror#25 144*8fb009dcSAndroid Build Coastguard Worker str r10,[sp,#4*(16+15)] 145*8fb009dcSAndroid Build Coastguard Worker ldr r10,[sp,#4*(16+13)] 146*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r12 147*8fb009dcSAndroid Build Coastguard Worker mov r6,r6,ror#25 148*8fb009dcSAndroid Build Coastguard Worker eor r5,r5,r8,ror#25 149*8fb009dcSAndroid Build Coastguard Worker eor r6,r6,r9,ror#25 150*8fb009dcSAndroid Build Coastguard Worker str r8,[sp,#4*(16+10)] 151*8fb009dcSAndroid Build Coastguard Worker ldr r8,[sp,#4*(16+8)] 152*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r7 153*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#16 154*8fb009dcSAndroid Build Coastguard Worker str r9,[sp,#4*(16+11)] 155*8fb009dcSAndroid Build Coastguard Worker ldr r9,[sp,#4*(16+9)] 156*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r4 157*8fb009dcSAndroid Build Coastguard Worker mov r14,r14,ror#16 158*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r2,ror#16 159*8fb009dcSAndroid Build Coastguard Worker eor r14,r14,r3,ror#16 160*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r10 161*8fb009dcSAndroid Build Coastguard Worker mov r7,r7,ror#20 162*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r14 163*8fb009dcSAndroid Build Coastguard Worker mov r4,r4,ror#20 164*8fb009dcSAndroid Build Coastguard Worker eor r7,r7,r8,ror#20 165*8fb009dcSAndroid Build Coastguard Worker eor r4,r4,r9,ror#20 166*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r7 167*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#24 168*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r4 169*8fb009dcSAndroid Build Coastguard Worker mov r14,r14,ror#24 170*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r2,ror#24 171*8fb009dcSAndroid Build Coastguard Worker eor r14,r14,r3,ror#24 172*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r10 173*8fb009dcSAndroid Build Coastguard Worker mov r7,r7,ror#25 174*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r14 175*8fb009dcSAndroid Build Coastguard Worker mov r4,r4,ror#25 176*8fb009dcSAndroid Build Coastguard Worker eor r7,r7,r8,ror#25 177*8fb009dcSAndroid Build Coastguard Worker eor r4,r4,r9,ror#25 178*8fb009dcSAndroid Build Coastguard Worker bne .Loop 179*8fb009dcSAndroid Build Coastguard Worker 180*8fb009dcSAndroid Build Coastguard Worker ldr r11,[sp,#4*(32+2)] @ load len 181*8fb009dcSAndroid Build Coastguard Worker 182*8fb009dcSAndroid Build Coastguard Worker str r8, [sp,#4*(16+8)] @ modulo-scheduled store 183*8fb009dcSAndroid Build Coastguard Worker str r9, [sp,#4*(16+9)] 184*8fb009dcSAndroid Build Coastguard Worker str r12,[sp,#4*(16+12)] 185*8fb009dcSAndroid Build Coastguard Worker str r10, [sp,#4*(16+13)] 186*8fb009dcSAndroid Build Coastguard Worker str r14,[sp,#4*(16+14)] 187*8fb009dcSAndroid Build Coastguard Worker 188*8fb009dcSAndroid Build Coastguard Worker @ at this point we have first half of 512-bit result in 189*8fb009dcSAndroid Build Coastguard Worker @ rx and second half at sp+4*(16+8) 190*8fb009dcSAndroid Build Coastguard Worker 191*8fb009dcSAndroid Build Coastguard Worker cmp r11,#64 @ done yet? 192*8fb009dcSAndroid Build Coastguard Worker#ifdef __thumb2__ 193*8fb009dcSAndroid Build Coastguard Worker itete lo 194*8fb009dcSAndroid Build Coastguard Worker#endif 195*8fb009dcSAndroid Build Coastguard Worker addlo r12,sp,#4*(0) @ shortcut or ... 196*8fb009dcSAndroid Build Coastguard Worker ldrhs r12,[sp,#4*(32+1)] @ ... load inp 197*8fb009dcSAndroid Build Coastguard Worker addlo r14,sp,#4*(0) @ shortcut or ... 198*8fb009dcSAndroid Build Coastguard Worker ldrhs r14,[sp,#4*(32+0)] @ ... load out 199*8fb009dcSAndroid Build Coastguard Worker 200*8fb009dcSAndroid Build Coastguard Worker ldr r8,[sp,#4*(0)] @ load key material 201*8fb009dcSAndroid Build Coastguard Worker ldr r9,[sp,#4*(1)] 202*8fb009dcSAndroid Build Coastguard Worker 203*8fb009dcSAndroid Build Coastguard Worker#if __ARM_ARCH>=6 || !defined(__ARMEB__) 204*8fb009dcSAndroid Build Coastguard Worker# if __ARM_ARCH<7 205*8fb009dcSAndroid Build Coastguard Worker orr r10,r12,r14 206*8fb009dcSAndroid Build Coastguard Worker tst r10,#3 @ are input and output aligned? 207*8fb009dcSAndroid Build Coastguard Worker ldr r10,[sp,#4*(2)] 208*8fb009dcSAndroid Build Coastguard Worker bne .Lunaligned 209*8fb009dcSAndroid Build Coastguard Worker cmp r11,#64 @ restore flags 210*8fb009dcSAndroid Build Coastguard Worker# else 211*8fb009dcSAndroid Build Coastguard Worker ldr r10,[sp,#4*(2)] 212*8fb009dcSAndroid Build Coastguard Worker# endif 213*8fb009dcSAndroid Build Coastguard Worker ldr r11,[sp,#4*(3)] 214*8fb009dcSAndroid Build Coastguard Worker 215*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r8 @ accumulate key material 216*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r9 217*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 218*8fb009dcSAndroid Build Coastguard Worker itt hs 219*8fb009dcSAndroid Build Coastguard Worker# endif 220*8fb009dcSAndroid Build Coastguard Worker ldrhs r8,[r12],#16 @ load input 221*8fb009dcSAndroid Build Coastguard Worker ldrhs r9,[r12,#-12] 222*8fb009dcSAndroid Build Coastguard Worker 223*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r10 224*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r11 225*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 226*8fb009dcSAndroid Build Coastguard Worker itt hs 227*8fb009dcSAndroid Build Coastguard Worker# endif 228*8fb009dcSAndroid Build Coastguard Worker ldrhs r10,[r12,#-8] 229*8fb009dcSAndroid Build Coastguard Worker ldrhs r11,[r12,#-4] 230*8fb009dcSAndroid Build Coastguard Worker# if __ARM_ARCH>=6 && defined(__ARMEB__) 231*8fb009dcSAndroid Build Coastguard Worker rev r0,r0 232*8fb009dcSAndroid Build Coastguard Worker rev r1,r1 233*8fb009dcSAndroid Build Coastguard Worker rev r2,r2 234*8fb009dcSAndroid Build Coastguard Worker rev r3,r3 235*8fb009dcSAndroid Build Coastguard Worker# endif 236*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 237*8fb009dcSAndroid Build Coastguard Worker itt hs 238*8fb009dcSAndroid Build Coastguard Worker# endif 239*8fb009dcSAndroid Build Coastguard Worker eorhs r0,r0,r8 @ xor with input 240*8fb009dcSAndroid Build Coastguard Worker eorhs r1,r1,r9 241*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(4) 242*8fb009dcSAndroid Build Coastguard Worker str r0,[r14],#16 @ store output 243*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 244*8fb009dcSAndroid Build Coastguard Worker itt hs 245*8fb009dcSAndroid Build Coastguard Worker# endif 246*8fb009dcSAndroid Build Coastguard Worker eorhs r2,r2,r10 247*8fb009dcSAndroid Build Coastguard Worker eorhs r3,r3,r11 248*8fb009dcSAndroid Build Coastguard Worker ldmia r8,{r8,r9,r10,r11} @ load key material 249*8fb009dcSAndroid Build Coastguard Worker str r1,[r14,#-12] 250*8fb009dcSAndroid Build Coastguard Worker str r2,[r14,#-8] 251*8fb009dcSAndroid Build Coastguard Worker str r3,[r14,#-4] 252*8fb009dcSAndroid Build Coastguard Worker 253*8fb009dcSAndroid Build Coastguard Worker add r4,r4,r8 @ accumulate key material 254*8fb009dcSAndroid Build Coastguard Worker add r5,r5,r9 255*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 256*8fb009dcSAndroid Build Coastguard Worker itt hs 257*8fb009dcSAndroid Build Coastguard Worker# endif 258*8fb009dcSAndroid Build Coastguard Worker ldrhs r8,[r12],#16 @ load input 259*8fb009dcSAndroid Build Coastguard Worker ldrhs r9,[r12,#-12] 260*8fb009dcSAndroid Build Coastguard Worker add r6,r6,r10 261*8fb009dcSAndroid Build Coastguard Worker add r7,r7,r11 262*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 263*8fb009dcSAndroid Build Coastguard Worker itt hs 264*8fb009dcSAndroid Build Coastguard Worker# endif 265*8fb009dcSAndroid Build Coastguard Worker ldrhs r10,[r12,#-8] 266*8fb009dcSAndroid Build Coastguard Worker ldrhs r11,[r12,#-4] 267*8fb009dcSAndroid Build Coastguard Worker# if __ARM_ARCH>=6 && defined(__ARMEB__) 268*8fb009dcSAndroid Build Coastguard Worker rev r4,r4 269*8fb009dcSAndroid Build Coastguard Worker rev r5,r5 270*8fb009dcSAndroid Build Coastguard Worker rev r6,r6 271*8fb009dcSAndroid Build Coastguard Worker rev r7,r7 272*8fb009dcSAndroid Build Coastguard Worker# endif 273*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 274*8fb009dcSAndroid Build Coastguard Worker itt hs 275*8fb009dcSAndroid Build Coastguard Worker# endif 276*8fb009dcSAndroid Build Coastguard Worker eorhs r4,r4,r8 277*8fb009dcSAndroid Build Coastguard Worker eorhs r5,r5,r9 278*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(8) 279*8fb009dcSAndroid Build Coastguard Worker str r4,[r14],#16 @ store output 280*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 281*8fb009dcSAndroid Build Coastguard Worker itt hs 282*8fb009dcSAndroid Build Coastguard Worker# endif 283*8fb009dcSAndroid Build Coastguard Worker eorhs r6,r6,r10 284*8fb009dcSAndroid Build Coastguard Worker eorhs r7,r7,r11 285*8fb009dcSAndroid Build Coastguard Worker str r5,[r14,#-12] 286*8fb009dcSAndroid Build Coastguard Worker ldmia r8,{r8,r9,r10,r11} @ load key material 287*8fb009dcSAndroid Build Coastguard Worker str r6,[r14,#-8] 288*8fb009dcSAndroid Build Coastguard Worker add r0,sp,#4*(16+8) 289*8fb009dcSAndroid Build Coastguard Worker str r7,[r14,#-4] 290*8fb009dcSAndroid Build Coastguard Worker 291*8fb009dcSAndroid Build Coastguard Worker ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half 292*8fb009dcSAndroid Build Coastguard Worker 293*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r8 @ accumulate key material 294*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r9 295*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 296*8fb009dcSAndroid Build Coastguard Worker itt hs 297*8fb009dcSAndroid Build Coastguard Worker# endif 298*8fb009dcSAndroid Build Coastguard Worker ldrhs r8,[r12],#16 @ load input 299*8fb009dcSAndroid Build Coastguard Worker ldrhs r9,[r12,#-12] 300*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 301*8fb009dcSAndroid Build Coastguard Worker itt hi 302*8fb009dcSAndroid Build Coastguard Worker# endif 303*8fb009dcSAndroid Build Coastguard Worker strhi r10,[sp,#4*(16+10)] @ copy "rx" while at it 304*8fb009dcSAndroid Build Coastguard Worker strhi r11,[sp,#4*(16+11)] @ copy "rx" while at it 305*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r10 306*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r11 307*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 308*8fb009dcSAndroid Build Coastguard Worker itt hs 309*8fb009dcSAndroid Build Coastguard Worker# endif 310*8fb009dcSAndroid Build Coastguard Worker ldrhs r10,[r12,#-8] 311*8fb009dcSAndroid Build Coastguard Worker ldrhs r11,[r12,#-4] 312*8fb009dcSAndroid Build Coastguard Worker# if __ARM_ARCH>=6 && defined(__ARMEB__) 313*8fb009dcSAndroid Build Coastguard Worker rev r0,r0 314*8fb009dcSAndroid Build Coastguard Worker rev r1,r1 315*8fb009dcSAndroid Build Coastguard Worker rev r2,r2 316*8fb009dcSAndroid Build Coastguard Worker rev r3,r3 317*8fb009dcSAndroid Build Coastguard Worker# endif 318*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 319*8fb009dcSAndroid Build Coastguard Worker itt hs 320*8fb009dcSAndroid Build Coastguard Worker# endif 321*8fb009dcSAndroid Build Coastguard Worker eorhs r0,r0,r8 322*8fb009dcSAndroid Build Coastguard Worker eorhs r1,r1,r9 323*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(12) 324*8fb009dcSAndroid Build Coastguard Worker str r0,[r14],#16 @ store output 325*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 326*8fb009dcSAndroid Build Coastguard Worker itt hs 327*8fb009dcSAndroid Build Coastguard Worker# endif 328*8fb009dcSAndroid Build Coastguard Worker eorhs r2,r2,r10 329*8fb009dcSAndroid Build Coastguard Worker eorhs r3,r3,r11 330*8fb009dcSAndroid Build Coastguard Worker str r1,[r14,#-12] 331*8fb009dcSAndroid Build Coastguard Worker ldmia r8,{r8,r9,r10,r11} @ load key material 332*8fb009dcSAndroid Build Coastguard Worker str r2,[r14,#-8] 333*8fb009dcSAndroid Build Coastguard Worker str r3,[r14,#-4] 334*8fb009dcSAndroid Build Coastguard Worker 335*8fb009dcSAndroid Build Coastguard Worker add r4,r4,r8 @ accumulate key material 336*8fb009dcSAndroid Build Coastguard Worker add r5,r5,r9 337*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 338*8fb009dcSAndroid Build Coastguard Worker itt hi 339*8fb009dcSAndroid Build Coastguard Worker# endif 340*8fb009dcSAndroid Build Coastguard Worker addhi r8,r8,#1 @ next counter value 341*8fb009dcSAndroid Build Coastguard Worker strhi r8,[sp,#4*(12)] @ save next counter value 342*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 343*8fb009dcSAndroid Build Coastguard Worker itt hs 344*8fb009dcSAndroid Build Coastguard Worker# endif 345*8fb009dcSAndroid Build Coastguard Worker ldrhs r8,[r12],#16 @ load input 346*8fb009dcSAndroid Build Coastguard Worker ldrhs r9,[r12,#-12] 347*8fb009dcSAndroid Build Coastguard Worker add r6,r6,r10 348*8fb009dcSAndroid Build Coastguard Worker add r7,r7,r11 349*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 350*8fb009dcSAndroid Build Coastguard Worker itt hs 351*8fb009dcSAndroid Build Coastguard Worker# endif 352*8fb009dcSAndroid Build Coastguard Worker ldrhs r10,[r12,#-8] 353*8fb009dcSAndroid Build Coastguard Worker ldrhs r11,[r12,#-4] 354*8fb009dcSAndroid Build Coastguard Worker# if __ARM_ARCH>=6 && defined(__ARMEB__) 355*8fb009dcSAndroid Build Coastguard Worker rev r4,r4 356*8fb009dcSAndroid Build Coastguard Worker rev r5,r5 357*8fb009dcSAndroid Build Coastguard Worker rev r6,r6 358*8fb009dcSAndroid Build Coastguard Worker rev r7,r7 359*8fb009dcSAndroid Build Coastguard Worker# endif 360*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 361*8fb009dcSAndroid Build Coastguard Worker itt hs 362*8fb009dcSAndroid Build Coastguard Worker# endif 363*8fb009dcSAndroid Build Coastguard Worker eorhs r4,r4,r8 364*8fb009dcSAndroid Build Coastguard Worker eorhs r5,r5,r9 365*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 366*8fb009dcSAndroid Build Coastguard Worker it ne 367*8fb009dcSAndroid Build Coastguard Worker# endif 368*8fb009dcSAndroid Build Coastguard Worker ldrne r8,[sp,#4*(32+2)] @ re-load len 369*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 370*8fb009dcSAndroid Build Coastguard Worker itt hs 371*8fb009dcSAndroid Build Coastguard Worker# endif 372*8fb009dcSAndroid Build Coastguard Worker eorhs r6,r6,r10 373*8fb009dcSAndroid Build Coastguard Worker eorhs r7,r7,r11 374*8fb009dcSAndroid Build Coastguard Worker str r4,[r14],#16 @ store output 375*8fb009dcSAndroid Build Coastguard Worker str r5,[r14,#-12] 376*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 377*8fb009dcSAndroid Build Coastguard Worker it hs 378*8fb009dcSAndroid Build Coastguard Worker# endif 379*8fb009dcSAndroid Build Coastguard Worker subhs r11,r8,#64 @ len-=64 380*8fb009dcSAndroid Build Coastguard Worker str r6,[r14,#-8] 381*8fb009dcSAndroid Build Coastguard Worker str r7,[r14,#-4] 382*8fb009dcSAndroid Build Coastguard Worker bhi .Loop_outer 383*8fb009dcSAndroid Build Coastguard Worker 384*8fb009dcSAndroid Build Coastguard Worker beq .Ldone 385*8fb009dcSAndroid Build Coastguard Worker# if __ARM_ARCH<7 386*8fb009dcSAndroid Build Coastguard Worker b .Ltail 387*8fb009dcSAndroid Build Coastguard Worker 388*8fb009dcSAndroid Build Coastguard Worker.align 4 389*8fb009dcSAndroid Build Coastguard Worker.Lunaligned:@ unaligned endian-neutral path 390*8fb009dcSAndroid Build Coastguard Worker cmp r11,#64 @ restore flags 391*8fb009dcSAndroid Build Coastguard Worker# endif 392*8fb009dcSAndroid Build Coastguard Worker#endif 393*8fb009dcSAndroid Build Coastguard Worker#if __ARM_ARCH<7 394*8fb009dcSAndroid Build Coastguard Worker ldr r11,[sp,#4*(3)] 395*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r8 @ accumulate key material 396*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r9 397*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r10 398*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 399*8fb009dcSAndroid Build Coastguard Worker itete lo 400*8fb009dcSAndroid Build Coastguard Worker# endif 401*8fb009dcSAndroid Build Coastguard Worker eorlo r8,r8,r8 @ zero or ... 402*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12],#16 @ ... load input 403*8fb009dcSAndroid Build Coastguard Worker eorlo r9,r9,r9 404*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-12] 405*8fb009dcSAndroid Build Coastguard Worker 406*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r11 407*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 408*8fb009dcSAndroid Build Coastguard Worker itete lo 409*8fb009dcSAndroid Build Coastguard Worker# endif 410*8fb009dcSAndroid Build Coastguard Worker eorlo r10,r10,r10 411*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-8] 412*8fb009dcSAndroid Build Coastguard Worker eorlo r11,r11,r11 413*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-4] 414*8fb009dcSAndroid Build Coastguard Worker 415*8fb009dcSAndroid Build Coastguard Worker eor r0,r8,r0 @ xor with input (or zero) 416*8fb009dcSAndroid Build Coastguard Worker eor r1,r9,r1 417*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 418*8fb009dcSAndroid Build Coastguard Worker itt hs 419*8fb009dcSAndroid Build Coastguard Worker# endif 420*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12,#-15] @ load more input 421*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-11] 422*8fb009dcSAndroid Build Coastguard Worker eor r2,r10,r2 423*8fb009dcSAndroid Build Coastguard Worker strb r0,[r14],#16 @ store output 424*8fb009dcSAndroid Build Coastguard Worker eor r3,r11,r3 425*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 426*8fb009dcSAndroid Build Coastguard Worker itt hs 427*8fb009dcSAndroid Build Coastguard Worker# endif 428*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-7] 429*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-3] 430*8fb009dcSAndroid Build Coastguard Worker strb r1,[r14,#-12] 431*8fb009dcSAndroid Build Coastguard Worker eor r0,r8,r0,lsr#8 432*8fb009dcSAndroid Build Coastguard Worker strb r2,[r14,#-8] 433*8fb009dcSAndroid Build Coastguard Worker eor r1,r9,r1,lsr#8 434*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 435*8fb009dcSAndroid Build Coastguard Worker itt hs 436*8fb009dcSAndroid Build Coastguard Worker# endif 437*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12,#-14] @ load more input 438*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-10] 439*8fb009dcSAndroid Build Coastguard Worker strb r3,[r14,#-4] 440*8fb009dcSAndroid Build Coastguard Worker eor r2,r10,r2,lsr#8 441*8fb009dcSAndroid Build Coastguard Worker strb r0,[r14,#-15] 442*8fb009dcSAndroid Build Coastguard Worker eor r3,r11,r3,lsr#8 443*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 444*8fb009dcSAndroid Build Coastguard Worker itt hs 445*8fb009dcSAndroid Build Coastguard Worker# endif 446*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-6] 447*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-2] 448*8fb009dcSAndroid Build Coastguard Worker strb r1,[r14,#-11] 449*8fb009dcSAndroid Build Coastguard Worker eor r0,r8,r0,lsr#8 450*8fb009dcSAndroid Build Coastguard Worker strb r2,[r14,#-7] 451*8fb009dcSAndroid Build Coastguard Worker eor r1,r9,r1,lsr#8 452*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 453*8fb009dcSAndroid Build Coastguard Worker itt hs 454*8fb009dcSAndroid Build Coastguard Worker# endif 455*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12,#-13] @ load more input 456*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-9] 457*8fb009dcSAndroid Build Coastguard Worker strb r3,[r14,#-3] 458*8fb009dcSAndroid Build Coastguard Worker eor r2,r10,r2,lsr#8 459*8fb009dcSAndroid Build Coastguard Worker strb r0,[r14,#-14] 460*8fb009dcSAndroid Build Coastguard Worker eor r3,r11,r3,lsr#8 461*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 462*8fb009dcSAndroid Build Coastguard Worker itt hs 463*8fb009dcSAndroid Build Coastguard Worker# endif 464*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-5] 465*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-1] 466*8fb009dcSAndroid Build Coastguard Worker strb r1,[r14,#-10] 467*8fb009dcSAndroid Build Coastguard Worker strb r2,[r14,#-6] 468*8fb009dcSAndroid Build Coastguard Worker eor r0,r8,r0,lsr#8 469*8fb009dcSAndroid Build Coastguard Worker strb r3,[r14,#-2] 470*8fb009dcSAndroid Build Coastguard Worker eor r1,r9,r1,lsr#8 471*8fb009dcSAndroid Build Coastguard Worker strb r0,[r14,#-13] 472*8fb009dcSAndroid Build Coastguard Worker eor r2,r10,r2,lsr#8 473*8fb009dcSAndroid Build Coastguard Worker strb r1,[r14,#-9] 474*8fb009dcSAndroid Build Coastguard Worker eor r3,r11,r3,lsr#8 475*8fb009dcSAndroid Build Coastguard Worker strb r2,[r14,#-5] 476*8fb009dcSAndroid Build Coastguard Worker strb r3,[r14,#-1] 477*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(4+0) 478*8fb009dcSAndroid Build Coastguard Worker ldmia r8,{r8,r9,r10,r11} @ load key material 479*8fb009dcSAndroid Build Coastguard Worker add r0,sp,#4*(16+8) 480*8fb009dcSAndroid Build Coastguard Worker add r4,r4,r8 @ accumulate key material 481*8fb009dcSAndroid Build Coastguard Worker add r5,r5,r9 482*8fb009dcSAndroid Build Coastguard Worker add r6,r6,r10 483*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 484*8fb009dcSAndroid Build Coastguard Worker itete lo 485*8fb009dcSAndroid Build Coastguard Worker# endif 486*8fb009dcSAndroid Build Coastguard Worker eorlo r8,r8,r8 @ zero or ... 487*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12],#16 @ ... load input 488*8fb009dcSAndroid Build Coastguard Worker eorlo r9,r9,r9 489*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-12] 490*8fb009dcSAndroid Build Coastguard Worker 491*8fb009dcSAndroid Build Coastguard Worker add r7,r7,r11 492*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 493*8fb009dcSAndroid Build Coastguard Worker itete lo 494*8fb009dcSAndroid Build Coastguard Worker# endif 495*8fb009dcSAndroid Build Coastguard Worker eorlo r10,r10,r10 496*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-8] 497*8fb009dcSAndroid Build Coastguard Worker eorlo r11,r11,r11 498*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-4] 499*8fb009dcSAndroid Build Coastguard Worker 500*8fb009dcSAndroid Build Coastguard Worker eor r4,r8,r4 @ xor with input (or zero) 501*8fb009dcSAndroid Build Coastguard Worker eor r5,r9,r5 502*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 503*8fb009dcSAndroid Build Coastguard Worker itt hs 504*8fb009dcSAndroid Build Coastguard Worker# endif 505*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12,#-15] @ load more input 506*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-11] 507*8fb009dcSAndroid Build Coastguard Worker eor r6,r10,r6 508*8fb009dcSAndroid Build Coastguard Worker strb r4,[r14],#16 @ store output 509*8fb009dcSAndroid Build Coastguard Worker eor r7,r11,r7 510*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 511*8fb009dcSAndroid Build Coastguard Worker itt hs 512*8fb009dcSAndroid Build Coastguard Worker# endif 513*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-7] 514*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-3] 515*8fb009dcSAndroid Build Coastguard Worker strb r5,[r14,#-12] 516*8fb009dcSAndroid Build Coastguard Worker eor r4,r8,r4,lsr#8 517*8fb009dcSAndroid Build Coastguard Worker strb r6,[r14,#-8] 518*8fb009dcSAndroid Build Coastguard Worker eor r5,r9,r5,lsr#8 519*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 520*8fb009dcSAndroid Build Coastguard Worker itt hs 521*8fb009dcSAndroid Build Coastguard Worker# endif 522*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12,#-14] @ load more input 523*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-10] 524*8fb009dcSAndroid Build Coastguard Worker strb r7,[r14,#-4] 525*8fb009dcSAndroid Build Coastguard Worker eor r6,r10,r6,lsr#8 526*8fb009dcSAndroid Build Coastguard Worker strb r4,[r14,#-15] 527*8fb009dcSAndroid Build Coastguard Worker eor r7,r11,r7,lsr#8 528*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 529*8fb009dcSAndroid Build Coastguard Worker itt hs 530*8fb009dcSAndroid Build Coastguard Worker# endif 531*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-6] 532*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-2] 533*8fb009dcSAndroid Build Coastguard Worker strb r5,[r14,#-11] 534*8fb009dcSAndroid Build Coastguard Worker eor r4,r8,r4,lsr#8 535*8fb009dcSAndroid Build Coastguard Worker strb r6,[r14,#-7] 536*8fb009dcSAndroid Build Coastguard Worker eor r5,r9,r5,lsr#8 537*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 538*8fb009dcSAndroid Build Coastguard Worker itt hs 539*8fb009dcSAndroid Build Coastguard Worker# endif 540*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12,#-13] @ load more input 541*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-9] 542*8fb009dcSAndroid Build Coastguard Worker strb r7,[r14,#-3] 543*8fb009dcSAndroid Build Coastguard Worker eor r6,r10,r6,lsr#8 544*8fb009dcSAndroid Build Coastguard Worker strb r4,[r14,#-14] 545*8fb009dcSAndroid Build Coastguard Worker eor r7,r11,r7,lsr#8 546*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 547*8fb009dcSAndroid Build Coastguard Worker itt hs 548*8fb009dcSAndroid Build Coastguard Worker# endif 549*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-5] 550*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-1] 551*8fb009dcSAndroid Build Coastguard Worker strb r5,[r14,#-10] 552*8fb009dcSAndroid Build Coastguard Worker strb r6,[r14,#-6] 553*8fb009dcSAndroid Build Coastguard Worker eor r4,r8,r4,lsr#8 554*8fb009dcSAndroid Build Coastguard Worker strb r7,[r14,#-2] 555*8fb009dcSAndroid Build Coastguard Worker eor r5,r9,r5,lsr#8 556*8fb009dcSAndroid Build Coastguard Worker strb r4,[r14,#-13] 557*8fb009dcSAndroid Build Coastguard Worker eor r6,r10,r6,lsr#8 558*8fb009dcSAndroid Build Coastguard Worker strb r5,[r14,#-9] 559*8fb009dcSAndroid Build Coastguard Worker eor r7,r11,r7,lsr#8 560*8fb009dcSAndroid Build Coastguard Worker strb r6,[r14,#-5] 561*8fb009dcSAndroid Build Coastguard Worker strb r7,[r14,#-1] 562*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(4+4) 563*8fb009dcSAndroid Build Coastguard Worker ldmia r8,{r8,r9,r10,r11} @ load key material 564*8fb009dcSAndroid Build Coastguard Worker ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half 565*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 566*8fb009dcSAndroid Build Coastguard Worker itt hi 567*8fb009dcSAndroid Build Coastguard Worker# endif 568*8fb009dcSAndroid Build Coastguard Worker strhi r10,[sp,#4*(16+10)] @ copy "rx" 569*8fb009dcSAndroid Build Coastguard Worker strhi r11,[sp,#4*(16+11)] @ copy "rx" 570*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r8 @ accumulate key material 571*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r9 572*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r10 573*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 574*8fb009dcSAndroid Build Coastguard Worker itete lo 575*8fb009dcSAndroid Build Coastguard Worker# endif 576*8fb009dcSAndroid Build Coastguard Worker eorlo r8,r8,r8 @ zero or ... 577*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12],#16 @ ... load input 578*8fb009dcSAndroid Build Coastguard Worker eorlo r9,r9,r9 579*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-12] 580*8fb009dcSAndroid Build Coastguard Worker 581*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r11 582*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 583*8fb009dcSAndroid Build Coastguard Worker itete lo 584*8fb009dcSAndroid Build Coastguard Worker# endif 585*8fb009dcSAndroid Build Coastguard Worker eorlo r10,r10,r10 586*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-8] 587*8fb009dcSAndroid Build Coastguard Worker eorlo r11,r11,r11 588*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-4] 589*8fb009dcSAndroid Build Coastguard Worker 590*8fb009dcSAndroid Build Coastguard Worker eor r0,r8,r0 @ xor with input (or zero) 591*8fb009dcSAndroid Build Coastguard Worker eor r1,r9,r1 592*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 593*8fb009dcSAndroid Build Coastguard Worker itt hs 594*8fb009dcSAndroid Build Coastguard Worker# endif 595*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12,#-15] @ load more input 596*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-11] 597*8fb009dcSAndroid Build Coastguard Worker eor r2,r10,r2 598*8fb009dcSAndroid Build Coastguard Worker strb r0,[r14],#16 @ store output 599*8fb009dcSAndroid Build Coastguard Worker eor r3,r11,r3 600*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 601*8fb009dcSAndroid Build Coastguard Worker itt hs 602*8fb009dcSAndroid Build Coastguard Worker# endif 603*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-7] 604*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-3] 605*8fb009dcSAndroid Build Coastguard Worker strb r1,[r14,#-12] 606*8fb009dcSAndroid Build Coastguard Worker eor r0,r8,r0,lsr#8 607*8fb009dcSAndroid Build Coastguard Worker strb r2,[r14,#-8] 608*8fb009dcSAndroid Build Coastguard Worker eor r1,r9,r1,lsr#8 609*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 610*8fb009dcSAndroid Build Coastguard Worker itt hs 611*8fb009dcSAndroid Build Coastguard Worker# endif 612*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12,#-14] @ load more input 613*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-10] 614*8fb009dcSAndroid Build Coastguard Worker strb r3,[r14,#-4] 615*8fb009dcSAndroid Build Coastguard Worker eor r2,r10,r2,lsr#8 616*8fb009dcSAndroid Build Coastguard Worker strb r0,[r14,#-15] 617*8fb009dcSAndroid Build Coastguard Worker eor r3,r11,r3,lsr#8 618*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 619*8fb009dcSAndroid Build Coastguard Worker itt hs 620*8fb009dcSAndroid Build Coastguard Worker# endif 621*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-6] 622*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-2] 623*8fb009dcSAndroid Build Coastguard Worker strb r1,[r14,#-11] 624*8fb009dcSAndroid Build Coastguard Worker eor r0,r8,r0,lsr#8 625*8fb009dcSAndroid Build Coastguard Worker strb r2,[r14,#-7] 626*8fb009dcSAndroid Build Coastguard Worker eor r1,r9,r1,lsr#8 627*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 628*8fb009dcSAndroid Build Coastguard Worker itt hs 629*8fb009dcSAndroid Build Coastguard Worker# endif 630*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12,#-13] @ load more input 631*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-9] 632*8fb009dcSAndroid Build Coastguard Worker strb r3,[r14,#-3] 633*8fb009dcSAndroid Build Coastguard Worker eor r2,r10,r2,lsr#8 634*8fb009dcSAndroid Build Coastguard Worker strb r0,[r14,#-14] 635*8fb009dcSAndroid Build Coastguard Worker eor r3,r11,r3,lsr#8 636*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 637*8fb009dcSAndroid Build Coastguard Worker itt hs 638*8fb009dcSAndroid Build Coastguard Worker# endif 639*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-5] 640*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-1] 641*8fb009dcSAndroid Build Coastguard Worker strb r1,[r14,#-10] 642*8fb009dcSAndroid Build Coastguard Worker strb r2,[r14,#-6] 643*8fb009dcSAndroid Build Coastguard Worker eor r0,r8,r0,lsr#8 644*8fb009dcSAndroid Build Coastguard Worker strb r3,[r14,#-2] 645*8fb009dcSAndroid Build Coastguard Worker eor r1,r9,r1,lsr#8 646*8fb009dcSAndroid Build Coastguard Worker strb r0,[r14,#-13] 647*8fb009dcSAndroid Build Coastguard Worker eor r2,r10,r2,lsr#8 648*8fb009dcSAndroid Build Coastguard Worker strb r1,[r14,#-9] 649*8fb009dcSAndroid Build Coastguard Worker eor r3,r11,r3,lsr#8 650*8fb009dcSAndroid Build Coastguard Worker strb r2,[r14,#-5] 651*8fb009dcSAndroid Build Coastguard Worker strb r3,[r14,#-1] 652*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(4+8) 653*8fb009dcSAndroid Build Coastguard Worker ldmia r8,{r8,r9,r10,r11} @ load key material 654*8fb009dcSAndroid Build Coastguard Worker add r4,r4,r8 @ accumulate key material 655*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 656*8fb009dcSAndroid Build Coastguard Worker itt hi 657*8fb009dcSAndroid Build Coastguard Worker# endif 658*8fb009dcSAndroid Build Coastguard Worker addhi r8,r8,#1 @ next counter value 659*8fb009dcSAndroid Build Coastguard Worker strhi r8,[sp,#4*(12)] @ save next counter value 660*8fb009dcSAndroid Build Coastguard Worker add r5,r5,r9 661*8fb009dcSAndroid Build Coastguard Worker add r6,r6,r10 662*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 663*8fb009dcSAndroid Build Coastguard Worker itete lo 664*8fb009dcSAndroid Build Coastguard Worker# endif 665*8fb009dcSAndroid Build Coastguard Worker eorlo r8,r8,r8 @ zero or ... 666*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12],#16 @ ... load input 667*8fb009dcSAndroid Build Coastguard Worker eorlo r9,r9,r9 668*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-12] 669*8fb009dcSAndroid Build Coastguard Worker 670*8fb009dcSAndroid Build Coastguard Worker add r7,r7,r11 671*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 672*8fb009dcSAndroid Build Coastguard Worker itete lo 673*8fb009dcSAndroid Build Coastguard Worker# endif 674*8fb009dcSAndroid Build Coastguard Worker eorlo r10,r10,r10 675*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-8] 676*8fb009dcSAndroid Build Coastguard Worker eorlo r11,r11,r11 677*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-4] 678*8fb009dcSAndroid Build Coastguard Worker 679*8fb009dcSAndroid Build Coastguard Worker eor r4,r8,r4 @ xor with input (or zero) 680*8fb009dcSAndroid Build Coastguard Worker eor r5,r9,r5 681*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 682*8fb009dcSAndroid Build Coastguard Worker itt hs 683*8fb009dcSAndroid Build Coastguard Worker# endif 684*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12,#-15] @ load more input 685*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-11] 686*8fb009dcSAndroid Build Coastguard Worker eor r6,r10,r6 687*8fb009dcSAndroid Build Coastguard Worker strb r4,[r14],#16 @ store output 688*8fb009dcSAndroid Build Coastguard Worker eor r7,r11,r7 689*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 690*8fb009dcSAndroid Build Coastguard Worker itt hs 691*8fb009dcSAndroid Build Coastguard Worker# endif 692*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-7] 693*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-3] 694*8fb009dcSAndroid Build Coastguard Worker strb r5,[r14,#-12] 695*8fb009dcSAndroid Build Coastguard Worker eor r4,r8,r4,lsr#8 696*8fb009dcSAndroid Build Coastguard Worker strb r6,[r14,#-8] 697*8fb009dcSAndroid Build Coastguard Worker eor r5,r9,r5,lsr#8 698*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 699*8fb009dcSAndroid Build Coastguard Worker itt hs 700*8fb009dcSAndroid Build Coastguard Worker# endif 701*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12,#-14] @ load more input 702*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-10] 703*8fb009dcSAndroid Build Coastguard Worker strb r7,[r14,#-4] 704*8fb009dcSAndroid Build Coastguard Worker eor r6,r10,r6,lsr#8 705*8fb009dcSAndroid Build Coastguard Worker strb r4,[r14,#-15] 706*8fb009dcSAndroid Build Coastguard Worker eor r7,r11,r7,lsr#8 707*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 708*8fb009dcSAndroid Build Coastguard Worker itt hs 709*8fb009dcSAndroid Build Coastguard Worker# endif 710*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-6] 711*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-2] 712*8fb009dcSAndroid Build Coastguard Worker strb r5,[r14,#-11] 713*8fb009dcSAndroid Build Coastguard Worker eor r4,r8,r4,lsr#8 714*8fb009dcSAndroid Build Coastguard Worker strb r6,[r14,#-7] 715*8fb009dcSAndroid Build Coastguard Worker eor r5,r9,r5,lsr#8 716*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 717*8fb009dcSAndroid Build Coastguard Worker itt hs 718*8fb009dcSAndroid Build Coastguard Worker# endif 719*8fb009dcSAndroid Build Coastguard Worker ldrhsb r8,[r12,#-13] @ load more input 720*8fb009dcSAndroid Build Coastguard Worker ldrhsb r9,[r12,#-9] 721*8fb009dcSAndroid Build Coastguard Worker strb r7,[r14,#-3] 722*8fb009dcSAndroid Build Coastguard Worker eor r6,r10,r6,lsr#8 723*8fb009dcSAndroid Build Coastguard Worker strb r4,[r14,#-14] 724*8fb009dcSAndroid Build Coastguard Worker eor r7,r11,r7,lsr#8 725*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 726*8fb009dcSAndroid Build Coastguard Worker itt hs 727*8fb009dcSAndroid Build Coastguard Worker# endif 728*8fb009dcSAndroid Build Coastguard Worker ldrhsb r10,[r12,#-5] 729*8fb009dcSAndroid Build Coastguard Worker ldrhsb r11,[r12,#-1] 730*8fb009dcSAndroid Build Coastguard Worker strb r5,[r14,#-10] 731*8fb009dcSAndroid Build Coastguard Worker strb r6,[r14,#-6] 732*8fb009dcSAndroid Build Coastguard Worker eor r4,r8,r4,lsr#8 733*8fb009dcSAndroid Build Coastguard Worker strb r7,[r14,#-2] 734*8fb009dcSAndroid Build Coastguard Worker eor r5,r9,r5,lsr#8 735*8fb009dcSAndroid Build Coastguard Worker strb r4,[r14,#-13] 736*8fb009dcSAndroid Build Coastguard Worker eor r6,r10,r6,lsr#8 737*8fb009dcSAndroid Build Coastguard Worker strb r5,[r14,#-9] 738*8fb009dcSAndroid Build Coastguard Worker eor r7,r11,r7,lsr#8 739*8fb009dcSAndroid Build Coastguard Worker strb r6,[r14,#-5] 740*8fb009dcSAndroid Build Coastguard Worker strb r7,[r14,#-1] 741*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 742*8fb009dcSAndroid Build Coastguard Worker it ne 743*8fb009dcSAndroid Build Coastguard Worker# endif 744*8fb009dcSAndroid Build Coastguard Worker ldrne r8,[sp,#4*(32+2)] @ re-load len 745*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 746*8fb009dcSAndroid Build Coastguard Worker it hs 747*8fb009dcSAndroid Build Coastguard Worker# endif 748*8fb009dcSAndroid Build Coastguard Worker subhs r11,r8,#64 @ len-=64 749*8fb009dcSAndroid Build Coastguard Worker bhi .Loop_outer 750*8fb009dcSAndroid Build Coastguard Worker 751*8fb009dcSAndroid Build Coastguard Worker beq .Ldone 752*8fb009dcSAndroid Build Coastguard Worker#endif 753*8fb009dcSAndroid Build Coastguard Worker 754*8fb009dcSAndroid Build Coastguard Worker.Ltail: 755*8fb009dcSAndroid Build Coastguard Worker ldr r12,[sp,#4*(32+1)] @ load inp 756*8fb009dcSAndroid Build Coastguard Worker add r9,sp,#4*(0) 757*8fb009dcSAndroid Build Coastguard Worker ldr r14,[sp,#4*(32+0)] @ load out 758*8fb009dcSAndroid Build Coastguard Worker 759*8fb009dcSAndroid Build Coastguard Worker.Loop_tail: 760*8fb009dcSAndroid Build Coastguard Worker ldrb r10,[r9],#1 @ read buffer on stack 761*8fb009dcSAndroid Build Coastguard Worker ldrb r11,[r12],#1 @ read input 762*8fb009dcSAndroid Build Coastguard Worker subs r8,r8,#1 763*8fb009dcSAndroid Build Coastguard Worker eor r11,r11,r10 764*8fb009dcSAndroid Build Coastguard Worker strb r11,[r14],#1 @ store output 765*8fb009dcSAndroid Build Coastguard Worker bne .Loop_tail 766*8fb009dcSAndroid Build Coastguard Worker 767*8fb009dcSAndroid Build Coastguard Worker.Ldone: 768*8fb009dcSAndroid Build Coastguard Worker add sp,sp,#4*(32+3) 769*8fb009dcSAndroid Build Coastguard Worker ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} 770*8fb009dcSAndroid Build Coastguard Worker.size ChaCha20_ctr32_nohw,.-ChaCha20_ctr32_nohw 771*8fb009dcSAndroid Build Coastguard Worker#if __ARM_MAX_ARCH__>=7 772*8fb009dcSAndroid Build Coastguard Worker.arch armv7-a 773*8fb009dcSAndroid Build Coastguard Worker.fpu neon 774*8fb009dcSAndroid Build Coastguard Worker 775*8fb009dcSAndroid Build Coastguard Worker.globl ChaCha20_ctr32_neon 776*8fb009dcSAndroid Build Coastguard Worker.hidden ChaCha20_ctr32_neon 777*8fb009dcSAndroid Build Coastguard Worker.type ChaCha20_ctr32_neon,%function 778*8fb009dcSAndroid Build Coastguard Worker.align 5 779*8fb009dcSAndroid Build Coastguard WorkerChaCha20_ctr32_neon: 780*8fb009dcSAndroid Build Coastguard Worker ldr r12,[sp,#0] @ pull pointer to counter and nonce 781*8fb009dcSAndroid Build Coastguard Worker stmdb sp!,{r0,r1,r2,r4-r11,lr} 782*8fb009dcSAndroid Build Coastguard Worker adr r14,.Lsigma 783*8fb009dcSAndroid Build Coastguard Worker vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI spec says so 784*8fb009dcSAndroid Build Coastguard Worker stmdb sp!,{r0,r1,r2,r3} 785*8fb009dcSAndroid Build Coastguard Worker 786*8fb009dcSAndroid Build Coastguard Worker vld1.32 {q1,q2},[r3] @ load key 787*8fb009dcSAndroid Build Coastguard Worker ldmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} @ load key 788*8fb009dcSAndroid Build Coastguard Worker 789*8fb009dcSAndroid Build Coastguard Worker sub sp,sp,#4*(16+16) 790*8fb009dcSAndroid Build Coastguard Worker vld1.32 {q3},[r12] @ load counter and nonce 791*8fb009dcSAndroid Build Coastguard Worker add r12,sp,#4*8 792*8fb009dcSAndroid Build Coastguard Worker ldmia r14,{r0,r1,r2,r3} @ load sigma 793*8fb009dcSAndroid Build Coastguard Worker vld1.32 {q0},[r14]! @ load sigma 794*8fb009dcSAndroid Build Coastguard Worker vld1.32 {q12},[r14] @ one 795*8fb009dcSAndroid Build Coastguard Worker vst1.32 {q2,q3},[r12] @ copy 1/2key|counter|nonce 796*8fb009dcSAndroid Build Coastguard Worker vst1.32 {q0,q1},[sp] @ copy sigma|1/2key 797*8fb009dcSAndroid Build Coastguard Worker 798*8fb009dcSAndroid Build Coastguard Worker str r10,[sp,#4*(16+10)] @ off-load "rx" 799*8fb009dcSAndroid Build Coastguard Worker str r11,[sp,#4*(16+11)] @ off-load "rx" 800*8fb009dcSAndroid Build Coastguard Worker vshl.i32 d26,d24,#1 @ two 801*8fb009dcSAndroid Build Coastguard Worker vstr d24,[sp,#4*(16+0)] 802*8fb009dcSAndroid Build Coastguard Worker vshl.i32 d28,d24,#2 @ four 803*8fb009dcSAndroid Build Coastguard Worker vstr d26,[sp,#4*(16+2)] 804*8fb009dcSAndroid Build Coastguard Worker vmov q4,q0 805*8fb009dcSAndroid Build Coastguard Worker vstr d28,[sp,#4*(16+4)] 806*8fb009dcSAndroid Build Coastguard Worker vmov q8,q0 807*8fb009dcSAndroid Build Coastguard Worker vmov q5,q1 808*8fb009dcSAndroid Build Coastguard Worker vmov q9,q1 809*8fb009dcSAndroid Build Coastguard Worker b .Loop_neon_enter 810*8fb009dcSAndroid Build Coastguard Worker 811*8fb009dcSAndroid Build Coastguard Worker.align 4 812*8fb009dcSAndroid Build Coastguard Worker.Loop_neon_outer: 813*8fb009dcSAndroid Build Coastguard Worker ldmia sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ load key material 814*8fb009dcSAndroid Build Coastguard Worker cmp r11,#64*2 @ if len<=64*2 815*8fb009dcSAndroid Build Coastguard Worker bls .Lbreak_neon @ switch to integer-only 816*8fb009dcSAndroid Build Coastguard Worker vmov q4,q0 817*8fb009dcSAndroid Build Coastguard Worker str r11,[sp,#4*(32+2)] @ save len 818*8fb009dcSAndroid Build Coastguard Worker vmov q8,q0 819*8fb009dcSAndroid Build Coastguard Worker str r12, [sp,#4*(32+1)] @ save inp 820*8fb009dcSAndroid Build Coastguard Worker vmov q5,q1 821*8fb009dcSAndroid Build Coastguard Worker str r14, [sp,#4*(32+0)] @ save out 822*8fb009dcSAndroid Build Coastguard Worker vmov q9,q1 823*8fb009dcSAndroid Build Coastguard Worker.Loop_neon_enter: 824*8fb009dcSAndroid Build Coastguard Worker ldr r11, [sp,#4*(15)] 825*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q7,q3,q12 @ counter+1 826*8fb009dcSAndroid Build Coastguard Worker ldr r12,[sp,#4*(12)] @ modulo-scheduled load 827*8fb009dcSAndroid Build Coastguard Worker vmov q6,q2 828*8fb009dcSAndroid Build Coastguard Worker ldr r10, [sp,#4*(13)] 829*8fb009dcSAndroid Build Coastguard Worker vmov q10,q2 830*8fb009dcSAndroid Build Coastguard Worker ldr r14,[sp,#4*(14)] 831*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q11,q7,q12 @ counter+2 832*8fb009dcSAndroid Build Coastguard Worker str r11, [sp,#4*(16+15)] 833*8fb009dcSAndroid Build Coastguard Worker mov r11,#10 834*8fb009dcSAndroid Build Coastguard Worker add r12,r12,#3 @ counter+3 835*8fb009dcSAndroid Build Coastguard Worker b .Loop_neon 836*8fb009dcSAndroid Build Coastguard Worker 837*8fb009dcSAndroid Build Coastguard Worker.align 4 838*8fb009dcSAndroid Build Coastguard Worker.Loop_neon: 839*8fb009dcSAndroid Build Coastguard Worker subs r11,r11,#1 840*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q0,q0,q1 841*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r4 842*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q4,q4,q5 843*8fb009dcSAndroid Build Coastguard Worker mov r12,r12,ror#16 844*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q8,q8,q9 845*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r5 846*8fb009dcSAndroid Build Coastguard Worker veor q3,q3,q0 847*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#16 848*8fb009dcSAndroid Build Coastguard Worker veor q7,q7,q4 849*8fb009dcSAndroid Build Coastguard Worker eor r12,r12,r0,ror#16 850*8fb009dcSAndroid Build Coastguard Worker veor q11,q11,q8 851*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r1,ror#16 852*8fb009dcSAndroid Build Coastguard Worker vrev32.16 q3,q3 853*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r12 854*8fb009dcSAndroid Build Coastguard Worker vrev32.16 q7,q7 855*8fb009dcSAndroid Build Coastguard Worker mov r4,r4,ror#20 856*8fb009dcSAndroid Build Coastguard Worker vrev32.16 q11,q11 857*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r10 858*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q2,q2,q3 859*8fb009dcSAndroid Build Coastguard Worker mov r5,r5,ror#20 860*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q6,q6,q7 861*8fb009dcSAndroid Build Coastguard Worker eor r4,r4,r8,ror#20 862*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q10,q10,q11 863*8fb009dcSAndroid Build Coastguard Worker eor r5,r5,r9,ror#20 864*8fb009dcSAndroid Build Coastguard Worker veor q12,q1,q2 865*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r4 866*8fb009dcSAndroid Build Coastguard Worker veor q13,q5,q6 867*8fb009dcSAndroid Build Coastguard Worker mov r12,r12,ror#24 868*8fb009dcSAndroid Build Coastguard Worker veor q14,q9,q10 869*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r5 870*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q1,q12,#20 871*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#24 872*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q5,q13,#20 873*8fb009dcSAndroid Build Coastguard Worker eor r12,r12,r0,ror#24 874*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q9,q14,#20 875*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r1,ror#24 876*8fb009dcSAndroid Build Coastguard Worker vsli.32 q1,q12,#12 877*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r12 878*8fb009dcSAndroid Build Coastguard Worker vsli.32 q5,q13,#12 879*8fb009dcSAndroid Build Coastguard Worker mov r4,r4,ror#25 880*8fb009dcSAndroid Build Coastguard Worker vsli.32 q9,q14,#12 881*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r10 882*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q0,q0,q1 883*8fb009dcSAndroid Build Coastguard Worker mov r5,r5,ror#25 884*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q4,q4,q5 885*8fb009dcSAndroid Build Coastguard Worker str r10,[sp,#4*(16+13)] 886*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q8,q8,q9 887*8fb009dcSAndroid Build Coastguard Worker ldr r10,[sp,#4*(16+15)] 888*8fb009dcSAndroid Build Coastguard Worker veor q12,q3,q0 889*8fb009dcSAndroid Build Coastguard Worker eor r4,r4,r8,ror#25 890*8fb009dcSAndroid Build Coastguard Worker veor q13,q7,q4 891*8fb009dcSAndroid Build Coastguard Worker eor r5,r5,r9,ror#25 892*8fb009dcSAndroid Build Coastguard Worker veor q14,q11,q8 893*8fb009dcSAndroid Build Coastguard Worker str r8,[sp,#4*(16+8)] 894*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q3,q12,#24 895*8fb009dcSAndroid Build Coastguard Worker ldr r8,[sp,#4*(16+10)] 896*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q7,q13,#24 897*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r6 898*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q11,q14,#24 899*8fb009dcSAndroid Build Coastguard Worker mov r14,r14,ror#16 900*8fb009dcSAndroid Build Coastguard Worker vsli.32 q3,q12,#8 901*8fb009dcSAndroid Build Coastguard Worker str r9,[sp,#4*(16+9)] 902*8fb009dcSAndroid Build Coastguard Worker vsli.32 q7,q13,#8 903*8fb009dcSAndroid Build Coastguard Worker ldr r9,[sp,#4*(16+11)] 904*8fb009dcSAndroid Build Coastguard Worker vsli.32 q11,q14,#8 905*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r7 906*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q2,q2,q3 907*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#16 908*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q6,q6,q7 909*8fb009dcSAndroid Build Coastguard Worker eor r14,r14,r2,ror#16 910*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q10,q10,q11 911*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r3,ror#16 912*8fb009dcSAndroid Build Coastguard Worker veor q12,q1,q2 913*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r14 914*8fb009dcSAndroid Build Coastguard Worker veor q13,q5,q6 915*8fb009dcSAndroid Build Coastguard Worker mov r6,r6,ror#20 916*8fb009dcSAndroid Build Coastguard Worker veor q14,q9,q10 917*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r10 918*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q1,q12,#25 919*8fb009dcSAndroid Build Coastguard Worker mov r7,r7,ror#20 920*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q5,q13,#25 921*8fb009dcSAndroid Build Coastguard Worker eor r6,r6,r8,ror#20 922*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q9,q14,#25 923*8fb009dcSAndroid Build Coastguard Worker eor r7,r7,r9,ror#20 924*8fb009dcSAndroid Build Coastguard Worker vsli.32 q1,q12,#7 925*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r6 926*8fb009dcSAndroid Build Coastguard Worker vsli.32 q5,q13,#7 927*8fb009dcSAndroid Build Coastguard Worker mov r14,r14,ror#24 928*8fb009dcSAndroid Build Coastguard Worker vsli.32 q9,q14,#7 929*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r7 930*8fb009dcSAndroid Build Coastguard Worker vext.8 q2,q2,q2,#8 931*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#24 932*8fb009dcSAndroid Build Coastguard Worker vext.8 q6,q6,q6,#8 933*8fb009dcSAndroid Build Coastguard Worker eor r14,r14,r2,ror#24 934*8fb009dcSAndroid Build Coastguard Worker vext.8 q10,q10,q10,#8 935*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r3,ror#24 936*8fb009dcSAndroid Build Coastguard Worker vext.8 q1,q1,q1,#4 937*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r14 938*8fb009dcSAndroid Build Coastguard Worker vext.8 q5,q5,q5,#4 939*8fb009dcSAndroid Build Coastguard Worker mov r6,r6,ror#25 940*8fb009dcSAndroid Build Coastguard Worker vext.8 q9,q9,q9,#4 941*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r10 942*8fb009dcSAndroid Build Coastguard Worker vext.8 q3,q3,q3,#12 943*8fb009dcSAndroid Build Coastguard Worker mov r7,r7,ror#25 944*8fb009dcSAndroid Build Coastguard Worker vext.8 q7,q7,q7,#12 945*8fb009dcSAndroid Build Coastguard Worker eor r6,r6,r8,ror#25 946*8fb009dcSAndroid Build Coastguard Worker vext.8 q11,q11,q11,#12 947*8fb009dcSAndroid Build Coastguard Worker eor r7,r7,r9,ror#25 948*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q0,q0,q1 949*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r5 950*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q4,q4,q5 951*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#16 952*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q8,q8,q9 953*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r6 954*8fb009dcSAndroid Build Coastguard Worker veor q3,q3,q0 955*8fb009dcSAndroid Build Coastguard Worker mov r12,r12,ror#16 956*8fb009dcSAndroid Build Coastguard Worker veor q7,q7,q4 957*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r0,ror#16 958*8fb009dcSAndroid Build Coastguard Worker veor q11,q11,q8 959*8fb009dcSAndroid Build Coastguard Worker eor r12,r12,r1,ror#16 960*8fb009dcSAndroid Build Coastguard Worker vrev32.16 q3,q3 961*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r10 962*8fb009dcSAndroid Build Coastguard Worker vrev32.16 q7,q7 963*8fb009dcSAndroid Build Coastguard Worker mov r5,r5,ror#20 964*8fb009dcSAndroid Build Coastguard Worker vrev32.16 q11,q11 965*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r12 966*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q2,q2,q3 967*8fb009dcSAndroid Build Coastguard Worker mov r6,r6,ror#20 968*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q6,q6,q7 969*8fb009dcSAndroid Build Coastguard Worker eor r5,r5,r8,ror#20 970*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q10,q10,q11 971*8fb009dcSAndroid Build Coastguard Worker eor r6,r6,r9,ror#20 972*8fb009dcSAndroid Build Coastguard Worker veor q12,q1,q2 973*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r5 974*8fb009dcSAndroid Build Coastguard Worker veor q13,q5,q6 975*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#24 976*8fb009dcSAndroid Build Coastguard Worker veor q14,q9,q10 977*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r6 978*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q1,q12,#20 979*8fb009dcSAndroid Build Coastguard Worker mov r12,r12,ror#24 980*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q5,q13,#20 981*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r0,ror#24 982*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q9,q14,#20 983*8fb009dcSAndroid Build Coastguard Worker eor r12,r12,r1,ror#24 984*8fb009dcSAndroid Build Coastguard Worker vsli.32 q1,q12,#12 985*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r10 986*8fb009dcSAndroid Build Coastguard Worker vsli.32 q5,q13,#12 987*8fb009dcSAndroid Build Coastguard Worker mov r5,r5,ror#25 988*8fb009dcSAndroid Build Coastguard Worker vsli.32 q9,q14,#12 989*8fb009dcSAndroid Build Coastguard Worker str r10,[sp,#4*(16+15)] 990*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q0,q0,q1 991*8fb009dcSAndroid Build Coastguard Worker ldr r10,[sp,#4*(16+13)] 992*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q4,q4,q5 993*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r12 994*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q8,q8,q9 995*8fb009dcSAndroid Build Coastguard Worker mov r6,r6,ror#25 996*8fb009dcSAndroid Build Coastguard Worker veor q12,q3,q0 997*8fb009dcSAndroid Build Coastguard Worker eor r5,r5,r8,ror#25 998*8fb009dcSAndroid Build Coastguard Worker veor q13,q7,q4 999*8fb009dcSAndroid Build Coastguard Worker eor r6,r6,r9,ror#25 1000*8fb009dcSAndroid Build Coastguard Worker veor q14,q11,q8 1001*8fb009dcSAndroid Build Coastguard Worker str r8,[sp,#4*(16+10)] 1002*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q3,q12,#24 1003*8fb009dcSAndroid Build Coastguard Worker ldr r8,[sp,#4*(16+8)] 1004*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q7,q13,#24 1005*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r7 1006*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q11,q14,#24 1007*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#16 1008*8fb009dcSAndroid Build Coastguard Worker vsli.32 q3,q12,#8 1009*8fb009dcSAndroid Build Coastguard Worker str r9,[sp,#4*(16+11)] 1010*8fb009dcSAndroid Build Coastguard Worker vsli.32 q7,q13,#8 1011*8fb009dcSAndroid Build Coastguard Worker ldr r9,[sp,#4*(16+9)] 1012*8fb009dcSAndroid Build Coastguard Worker vsli.32 q11,q14,#8 1013*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r4 1014*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q2,q2,q3 1015*8fb009dcSAndroid Build Coastguard Worker mov r14,r14,ror#16 1016*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q6,q6,q7 1017*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r2,ror#16 1018*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q10,q10,q11 1019*8fb009dcSAndroid Build Coastguard Worker eor r14,r14,r3,ror#16 1020*8fb009dcSAndroid Build Coastguard Worker veor q12,q1,q2 1021*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r10 1022*8fb009dcSAndroid Build Coastguard Worker veor q13,q5,q6 1023*8fb009dcSAndroid Build Coastguard Worker mov r7,r7,ror#20 1024*8fb009dcSAndroid Build Coastguard Worker veor q14,q9,q10 1025*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r14 1026*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q1,q12,#25 1027*8fb009dcSAndroid Build Coastguard Worker mov r4,r4,ror#20 1028*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q5,q13,#25 1029*8fb009dcSAndroid Build Coastguard Worker eor r7,r7,r8,ror#20 1030*8fb009dcSAndroid Build Coastguard Worker vshr.u32 q9,q14,#25 1031*8fb009dcSAndroid Build Coastguard Worker eor r4,r4,r9,ror#20 1032*8fb009dcSAndroid Build Coastguard Worker vsli.32 q1,q12,#7 1033*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r7 1034*8fb009dcSAndroid Build Coastguard Worker vsli.32 q5,q13,#7 1035*8fb009dcSAndroid Build Coastguard Worker mov r10,r10,ror#24 1036*8fb009dcSAndroid Build Coastguard Worker vsli.32 q9,q14,#7 1037*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r4 1038*8fb009dcSAndroid Build Coastguard Worker vext.8 q2,q2,q2,#8 1039*8fb009dcSAndroid Build Coastguard Worker mov r14,r14,ror#24 1040*8fb009dcSAndroid Build Coastguard Worker vext.8 q6,q6,q6,#8 1041*8fb009dcSAndroid Build Coastguard Worker eor r10,r10,r2,ror#24 1042*8fb009dcSAndroid Build Coastguard Worker vext.8 q10,q10,q10,#8 1043*8fb009dcSAndroid Build Coastguard Worker eor r14,r14,r3,ror#24 1044*8fb009dcSAndroid Build Coastguard Worker vext.8 q1,q1,q1,#12 1045*8fb009dcSAndroid Build Coastguard Worker add r8,r8,r10 1046*8fb009dcSAndroid Build Coastguard Worker vext.8 q5,q5,q5,#12 1047*8fb009dcSAndroid Build Coastguard Worker mov r7,r7,ror#25 1048*8fb009dcSAndroid Build Coastguard Worker vext.8 q9,q9,q9,#12 1049*8fb009dcSAndroid Build Coastguard Worker add r9,r9,r14 1050*8fb009dcSAndroid Build Coastguard Worker vext.8 q3,q3,q3,#4 1051*8fb009dcSAndroid Build Coastguard Worker mov r4,r4,ror#25 1052*8fb009dcSAndroid Build Coastguard Worker vext.8 q7,q7,q7,#4 1053*8fb009dcSAndroid Build Coastguard Worker eor r7,r7,r8,ror#25 1054*8fb009dcSAndroid Build Coastguard Worker vext.8 q11,q11,q11,#4 1055*8fb009dcSAndroid Build Coastguard Worker eor r4,r4,r9,ror#25 1056*8fb009dcSAndroid Build Coastguard Worker bne .Loop_neon 1057*8fb009dcSAndroid Build Coastguard Worker 1058*8fb009dcSAndroid Build Coastguard Worker add r11,sp,#32 1059*8fb009dcSAndroid Build Coastguard Worker vld1.32 {q12,q13},[sp] @ load key material 1060*8fb009dcSAndroid Build Coastguard Worker vld1.32 {q14,q15},[r11] 1061*8fb009dcSAndroid Build Coastguard Worker 1062*8fb009dcSAndroid Build Coastguard Worker ldr r11,[sp,#4*(32+2)] @ load len 1063*8fb009dcSAndroid Build Coastguard Worker 1064*8fb009dcSAndroid Build Coastguard Worker str r8, [sp,#4*(16+8)] @ modulo-scheduled store 1065*8fb009dcSAndroid Build Coastguard Worker str r9, [sp,#4*(16+9)] 1066*8fb009dcSAndroid Build Coastguard Worker str r12,[sp,#4*(16+12)] 1067*8fb009dcSAndroid Build Coastguard Worker str r10, [sp,#4*(16+13)] 1068*8fb009dcSAndroid Build Coastguard Worker str r14,[sp,#4*(16+14)] 1069*8fb009dcSAndroid Build Coastguard Worker 1070*8fb009dcSAndroid Build Coastguard Worker @ at this point we have first half of 512-bit result in 1071*8fb009dcSAndroid Build Coastguard Worker @ rx and second half at sp+4*(16+8) 1072*8fb009dcSAndroid Build Coastguard Worker 1073*8fb009dcSAndroid Build Coastguard Worker ldr r12,[sp,#4*(32+1)] @ load inp 1074*8fb009dcSAndroid Build Coastguard Worker ldr r14,[sp,#4*(32+0)] @ load out 1075*8fb009dcSAndroid Build Coastguard Worker 1076*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q0,q0,q12 @ accumulate key material 1077*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q4,q4,q12 1078*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q8,q8,q12 1079*8fb009dcSAndroid Build Coastguard Worker vldr d24,[sp,#4*(16+0)] @ one 1080*8fb009dcSAndroid Build Coastguard Worker 1081*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q1,q1,q13 1082*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q5,q5,q13 1083*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q9,q9,q13 1084*8fb009dcSAndroid Build Coastguard Worker vldr d26,[sp,#4*(16+2)] @ two 1085*8fb009dcSAndroid Build Coastguard Worker 1086*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q2,q2,q14 1087*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q6,q6,q14 1088*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q10,q10,q14 1089*8fb009dcSAndroid Build Coastguard Worker vadd.i32 d14,d14,d24 @ counter+1 1090*8fb009dcSAndroid Build Coastguard Worker vadd.i32 d22,d22,d26 @ counter+2 1091*8fb009dcSAndroid Build Coastguard Worker 1092*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q3,q3,q15 1093*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q7,q7,q15 1094*8fb009dcSAndroid Build Coastguard Worker vadd.i32 q11,q11,q15 1095*8fb009dcSAndroid Build Coastguard Worker 1096*8fb009dcSAndroid Build Coastguard Worker cmp r11,#64*4 1097*8fb009dcSAndroid Build Coastguard Worker blo .Ltail_neon 1098*8fb009dcSAndroid Build Coastguard Worker 1099*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12,q13},[r12]! @ load input 1100*8fb009dcSAndroid Build Coastguard Worker mov r11,sp 1101*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q14,q15},[r12]! 1102*8fb009dcSAndroid Build Coastguard Worker veor q0,q0,q12 @ xor with input 1103*8fb009dcSAndroid Build Coastguard Worker veor q1,q1,q13 1104*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12,q13},[r12]! 1105*8fb009dcSAndroid Build Coastguard Worker veor q2,q2,q14 1106*8fb009dcSAndroid Build Coastguard Worker veor q3,q3,q15 1107*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q14,q15},[r12]! 1108*8fb009dcSAndroid Build Coastguard Worker 1109*8fb009dcSAndroid Build Coastguard Worker veor q4,q4,q12 1110*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1},[r14]! @ store output 1111*8fb009dcSAndroid Build Coastguard Worker veor q5,q5,q13 1112*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12,q13},[r12]! 1113*8fb009dcSAndroid Build Coastguard Worker veor q6,q6,q14 1114*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q2,q3},[r14]! 1115*8fb009dcSAndroid Build Coastguard Worker veor q7,q7,q15 1116*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q14,q15},[r12]! 1117*8fb009dcSAndroid Build Coastguard Worker 1118*8fb009dcSAndroid Build Coastguard Worker veor q8,q8,q12 1119*8fb009dcSAndroid Build Coastguard Worker vld1.32 {q0,q1},[r11]! @ load for next iteration 1120*8fb009dcSAndroid Build Coastguard Worker veor d25,d25,d25 1121*8fb009dcSAndroid Build Coastguard Worker vldr d24,[sp,#4*(16+4)] @ four 1122*8fb009dcSAndroid Build Coastguard Worker veor q9,q9,q13 1123*8fb009dcSAndroid Build Coastguard Worker vld1.32 {q2,q3},[r11] 1124*8fb009dcSAndroid Build Coastguard Worker veor q10,q10,q14 1125*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q4,q5},[r14]! 1126*8fb009dcSAndroid Build Coastguard Worker veor q11,q11,q15 1127*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q6,q7},[r14]! 1128*8fb009dcSAndroid Build Coastguard Worker 1129*8fb009dcSAndroid Build Coastguard Worker vadd.i32 d6,d6,d24 @ next counter value 1130*8fb009dcSAndroid Build Coastguard Worker vldr d24,[sp,#4*(16+0)] @ one 1131*8fb009dcSAndroid Build Coastguard Worker 1132*8fb009dcSAndroid Build Coastguard Worker ldmia sp,{r8,r9,r10,r11} @ load key material 1133*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r8 @ accumulate key material 1134*8fb009dcSAndroid Build Coastguard Worker ldr r8,[r12],#16 @ load input 1135*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q8,q9},[r14]! 1136*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r9 1137*8fb009dcSAndroid Build Coastguard Worker ldr r9,[r12,#-12] 1138*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q10,q11},[r14]! 1139*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r10 1140*8fb009dcSAndroid Build Coastguard Worker ldr r10,[r12,#-8] 1141*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r11 1142*8fb009dcSAndroid Build Coastguard Worker ldr r11,[r12,#-4] 1143*8fb009dcSAndroid Build Coastguard Worker# ifdef __ARMEB__ 1144*8fb009dcSAndroid Build Coastguard Worker rev r0,r0 1145*8fb009dcSAndroid Build Coastguard Worker rev r1,r1 1146*8fb009dcSAndroid Build Coastguard Worker rev r2,r2 1147*8fb009dcSAndroid Build Coastguard Worker rev r3,r3 1148*8fb009dcSAndroid Build Coastguard Worker# endif 1149*8fb009dcSAndroid Build Coastguard Worker eor r0,r0,r8 @ xor with input 1150*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(4) 1151*8fb009dcSAndroid Build Coastguard Worker eor r1,r1,r9 1152*8fb009dcSAndroid Build Coastguard Worker str r0,[r14],#16 @ store output 1153*8fb009dcSAndroid Build Coastguard Worker eor r2,r2,r10 1154*8fb009dcSAndroid Build Coastguard Worker str r1,[r14,#-12] 1155*8fb009dcSAndroid Build Coastguard Worker eor r3,r3,r11 1156*8fb009dcSAndroid Build Coastguard Worker ldmia r8,{r8,r9,r10,r11} @ load key material 1157*8fb009dcSAndroid Build Coastguard Worker str r2,[r14,#-8] 1158*8fb009dcSAndroid Build Coastguard Worker str r3,[r14,#-4] 1159*8fb009dcSAndroid Build Coastguard Worker 1160*8fb009dcSAndroid Build Coastguard Worker add r4,r4,r8 @ accumulate key material 1161*8fb009dcSAndroid Build Coastguard Worker ldr r8,[r12],#16 @ load input 1162*8fb009dcSAndroid Build Coastguard Worker add r5,r5,r9 1163*8fb009dcSAndroid Build Coastguard Worker ldr r9,[r12,#-12] 1164*8fb009dcSAndroid Build Coastguard Worker add r6,r6,r10 1165*8fb009dcSAndroid Build Coastguard Worker ldr r10,[r12,#-8] 1166*8fb009dcSAndroid Build Coastguard Worker add r7,r7,r11 1167*8fb009dcSAndroid Build Coastguard Worker ldr r11,[r12,#-4] 1168*8fb009dcSAndroid Build Coastguard Worker# ifdef __ARMEB__ 1169*8fb009dcSAndroid Build Coastguard Worker rev r4,r4 1170*8fb009dcSAndroid Build Coastguard Worker rev r5,r5 1171*8fb009dcSAndroid Build Coastguard Worker rev r6,r6 1172*8fb009dcSAndroid Build Coastguard Worker rev r7,r7 1173*8fb009dcSAndroid Build Coastguard Worker# endif 1174*8fb009dcSAndroid Build Coastguard Worker eor r4,r4,r8 1175*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(8) 1176*8fb009dcSAndroid Build Coastguard Worker eor r5,r5,r9 1177*8fb009dcSAndroid Build Coastguard Worker str r4,[r14],#16 @ store output 1178*8fb009dcSAndroid Build Coastguard Worker eor r6,r6,r10 1179*8fb009dcSAndroid Build Coastguard Worker str r5,[r14,#-12] 1180*8fb009dcSAndroid Build Coastguard Worker eor r7,r7,r11 1181*8fb009dcSAndroid Build Coastguard Worker ldmia r8,{r8,r9,r10,r11} @ load key material 1182*8fb009dcSAndroid Build Coastguard Worker str r6,[r14,#-8] 1183*8fb009dcSAndroid Build Coastguard Worker add r0,sp,#4*(16+8) 1184*8fb009dcSAndroid Build Coastguard Worker str r7,[r14,#-4] 1185*8fb009dcSAndroid Build Coastguard Worker 1186*8fb009dcSAndroid Build Coastguard Worker ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half 1187*8fb009dcSAndroid Build Coastguard Worker 1188*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r8 @ accumulate key material 1189*8fb009dcSAndroid Build Coastguard Worker ldr r8,[r12],#16 @ load input 1190*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r9 1191*8fb009dcSAndroid Build Coastguard Worker ldr r9,[r12,#-12] 1192*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 1193*8fb009dcSAndroid Build Coastguard Worker it hi 1194*8fb009dcSAndroid Build Coastguard Worker# endif 1195*8fb009dcSAndroid Build Coastguard Worker strhi r10,[sp,#4*(16+10)] @ copy "rx" while at it 1196*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r10 1197*8fb009dcSAndroid Build Coastguard Worker ldr r10,[r12,#-8] 1198*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 1199*8fb009dcSAndroid Build Coastguard Worker it hi 1200*8fb009dcSAndroid Build Coastguard Worker# endif 1201*8fb009dcSAndroid Build Coastguard Worker strhi r11,[sp,#4*(16+11)] @ copy "rx" while at it 1202*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r11 1203*8fb009dcSAndroid Build Coastguard Worker ldr r11,[r12,#-4] 1204*8fb009dcSAndroid Build Coastguard Worker# ifdef __ARMEB__ 1205*8fb009dcSAndroid Build Coastguard Worker rev r0,r0 1206*8fb009dcSAndroid Build Coastguard Worker rev r1,r1 1207*8fb009dcSAndroid Build Coastguard Worker rev r2,r2 1208*8fb009dcSAndroid Build Coastguard Worker rev r3,r3 1209*8fb009dcSAndroid Build Coastguard Worker# endif 1210*8fb009dcSAndroid Build Coastguard Worker eor r0,r0,r8 1211*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(12) 1212*8fb009dcSAndroid Build Coastguard Worker eor r1,r1,r9 1213*8fb009dcSAndroid Build Coastguard Worker str r0,[r14],#16 @ store output 1214*8fb009dcSAndroid Build Coastguard Worker eor r2,r2,r10 1215*8fb009dcSAndroid Build Coastguard Worker str r1,[r14,#-12] 1216*8fb009dcSAndroid Build Coastguard Worker eor r3,r3,r11 1217*8fb009dcSAndroid Build Coastguard Worker ldmia r8,{r8,r9,r10,r11} @ load key material 1218*8fb009dcSAndroid Build Coastguard Worker str r2,[r14,#-8] 1219*8fb009dcSAndroid Build Coastguard Worker str r3,[r14,#-4] 1220*8fb009dcSAndroid Build Coastguard Worker 1221*8fb009dcSAndroid Build Coastguard Worker add r4,r4,r8 @ accumulate key material 1222*8fb009dcSAndroid Build Coastguard Worker add r8,r8,#4 @ next counter value 1223*8fb009dcSAndroid Build Coastguard Worker add r5,r5,r9 1224*8fb009dcSAndroid Build Coastguard Worker str r8,[sp,#4*(12)] @ save next counter value 1225*8fb009dcSAndroid Build Coastguard Worker ldr r8,[r12],#16 @ load input 1226*8fb009dcSAndroid Build Coastguard Worker add r6,r6,r10 1227*8fb009dcSAndroid Build Coastguard Worker add r4,r4,#3 @ counter+3 1228*8fb009dcSAndroid Build Coastguard Worker ldr r9,[r12,#-12] 1229*8fb009dcSAndroid Build Coastguard Worker add r7,r7,r11 1230*8fb009dcSAndroid Build Coastguard Worker ldr r10,[r12,#-8] 1231*8fb009dcSAndroid Build Coastguard Worker ldr r11,[r12,#-4] 1232*8fb009dcSAndroid Build Coastguard Worker# ifdef __ARMEB__ 1233*8fb009dcSAndroid Build Coastguard Worker rev r4,r4 1234*8fb009dcSAndroid Build Coastguard Worker rev r5,r5 1235*8fb009dcSAndroid Build Coastguard Worker rev r6,r6 1236*8fb009dcSAndroid Build Coastguard Worker rev r7,r7 1237*8fb009dcSAndroid Build Coastguard Worker# endif 1238*8fb009dcSAndroid Build Coastguard Worker eor r4,r4,r8 1239*8fb009dcSAndroid Build Coastguard Worker# ifdef __thumb2__ 1240*8fb009dcSAndroid Build Coastguard Worker it hi 1241*8fb009dcSAndroid Build Coastguard Worker# endif 1242*8fb009dcSAndroid Build Coastguard Worker ldrhi r8,[sp,#4*(32+2)] @ re-load len 1243*8fb009dcSAndroid Build Coastguard Worker eor r5,r5,r9 1244*8fb009dcSAndroid Build Coastguard Worker eor r6,r6,r10 1245*8fb009dcSAndroid Build Coastguard Worker str r4,[r14],#16 @ store output 1246*8fb009dcSAndroid Build Coastguard Worker eor r7,r7,r11 1247*8fb009dcSAndroid Build Coastguard Worker str r5,[r14,#-12] 1248*8fb009dcSAndroid Build Coastguard Worker sub r11,r8,#64*4 @ len-=64*4 1249*8fb009dcSAndroid Build Coastguard Worker str r6,[r14,#-8] 1250*8fb009dcSAndroid Build Coastguard Worker str r7,[r14,#-4] 1251*8fb009dcSAndroid Build Coastguard Worker bhi .Loop_neon_outer 1252*8fb009dcSAndroid Build Coastguard Worker 1253*8fb009dcSAndroid Build Coastguard Worker b .Ldone_neon 1254*8fb009dcSAndroid Build Coastguard Worker 1255*8fb009dcSAndroid Build Coastguard Worker.align 4 1256*8fb009dcSAndroid Build Coastguard Worker.Lbreak_neon: 1257*8fb009dcSAndroid Build Coastguard Worker @ harmonize NEON and integer-only stack frames: load data 1258*8fb009dcSAndroid Build Coastguard Worker @ from NEON frame, but save to integer-only one; distance 1259*8fb009dcSAndroid Build Coastguard Worker @ between the two is 4*(32+4+16-32)=4*(20). 1260*8fb009dcSAndroid Build Coastguard Worker 1261*8fb009dcSAndroid Build Coastguard Worker str r11, [sp,#4*(20+32+2)] @ save len 1262*8fb009dcSAndroid Build Coastguard Worker add r11,sp,#4*(32+4) 1263*8fb009dcSAndroid Build Coastguard Worker str r12, [sp,#4*(20+32+1)] @ save inp 1264*8fb009dcSAndroid Build Coastguard Worker str r14, [sp,#4*(20+32+0)] @ save out 1265*8fb009dcSAndroid Build Coastguard Worker 1266*8fb009dcSAndroid Build Coastguard Worker ldr r12,[sp,#4*(16+10)] 1267*8fb009dcSAndroid Build Coastguard Worker ldr r14,[sp,#4*(16+11)] 1268*8fb009dcSAndroid Build Coastguard Worker vldmia r11,{d8,d9,d10,d11,d12,d13,d14,d15} @ fulfill ABI requirement 1269*8fb009dcSAndroid Build Coastguard Worker str r12,[sp,#4*(20+16+10)] @ copy "rx" 1270*8fb009dcSAndroid Build Coastguard Worker str r14,[sp,#4*(20+16+11)] @ copy "rx" 1271*8fb009dcSAndroid Build Coastguard Worker 1272*8fb009dcSAndroid Build Coastguard Worker ldr r11, [sp,#4*(15)] 1273*8fb009dcSAndroid Build Coastguard Worker ldr r12,[sp,#4*(12)] @ modulo-scheduled load 1274*8fb009dcSAndroid Build Coastguard Worker ldr r10, [sp,#4*(13)] 1275*8fb009dcSAndroid Build Coastguard Worker ldr r14,[sp,#4*(14)] 1276*8fb009dcSAndroid Build Coastguard Worker str r11, [sp,#4*(20+16+15)] 1277*8fb009dcSAndroid Build Coastguard Worker add r11,sp,#4*(20) 1278*8fb009dcSAndroid Build Coastguard Worker vst1.32 {q0,q1},[r11]! @ copy key 1279*8fb009dcSAndroid Build Coastguard Worker add sp,sp,#4*(20) @ switch frame 1280*8fb009dcSAndroid Build Coastguard Worker vst1.32 {q2,q3},[r11] 1281*8fb009dcSAndroid Build Coastguard Worker mov r11,#10 1282*8fb009dcSAndroid Build Coastguard Worker b .Loop @ go integer-only 1283*8fb009dcSAndroid Build Coastguard Worker 1284*8fb009dcSAndroid Build Coastguard Worker.align 4 1285*8fb009dcSAndroid Build Coastguard Worker.Ltail_neon: 1286*8fb009dcSAndroid Build Coastguard Worker cmp r11,#64*3 1287*8fb009dcSAndroid Build Coastguard Worker bhs .L192_or_more_neon 1288*8fb009dcSAndroid Build Coastguard Worker cmp r11,#64*2 1289*8fb009dcSAndroid Build Coastguard Worker bhs .L128_or_more_neon 1290*8fb009dcSAndroid Build Coastguard Worker cmp r11,#64*1 1291*8fb009dcSAndroid Build Coastguard Worker bhs .L64_or_more_neon 1292*8fb009dcSAndroid Build Coastguard Worker 1293*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(8) 1294*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1},[sp] 1295*8fb009dcSAndroid Build Coastguard Worker add r10,sp,#4*(0) 1296*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q2,q3},[r8] 1297*8fb009dcSAndroid Build Coastguard Worker b .Loop_tail_neon 1298*8fb009dcSAndroid Build Coastguard Worker 1299*8fb009dcSAndroid Build Coastguard Worker.align 4 1300*8fb009dcSAndroid Build Coastguard Worker.L64_or_more_neon: 1301*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12,q13},[r12]! 1302*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q14,q15},[r12]! 1303*8fb009dcSAndroid Build Coastguard Worker veor q0,q0,q12 1304*8fb009dcSAndroid Build Coastguard Worker veor q1,q1,q13 1305*8fb009dcSAndroid Build Coastguard Worker veor q2,q2,q14 1306*8fb009dcSAndroid Build Coastguard Worker veor q3,q3,q15 1307*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1},[r14]! 1308*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q2,q3},[r14]! 1309*8fb009dcSAndroid Build Coastguard Worker 1310*8fb009dcSAndroid Build Coastguard Worker beq .Ldone_neon 1311*8fb009dcSAndroid Build Coastguard Worker 1312*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(8) 1313*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q4,q5},[sp] 1314*8fb009dcSAndroid Build Coastguard Worker add r10,sp,#4*(0) 1315*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q6,q7},[r8] 1316*8fb009dcSAndroid Build Coastguard Worker sub r11,r11,#64*1 @ len-=64*1 1317*8fb009dcSAndroid Build Coastguard Worker b .Loop_tail_neon 1318*8fb009dcSAndroid Build Coastguard Worker 1319*8fb009dcSAndroid Build Coastguard Worker.align 4 1320*8fb009dcSAndroid Build Coastguard Worker.L128_or_more_neon: 1321*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12,q13},[r12]! 1322*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q14,q15},[r12]! 1323*8fb009dcSAndroid Build Coastguard Worker veor q0,q0,q12 1324*8fb009dcSAndroid Build Coastguard Worker veor q1,q1,q13 1325*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12,q13},[r12]! 1326*8fb009dcSAndroid Build Coastguard Worker veor q2,q2,q14 1327*8fb009dcSAndroid Build Coastguard Worker veor q3,q3,q15 1328*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q14,q15},[r12]! 1329*8fb009dcSAndroid Build Coastguard Worker 1330*8fb009dcSAndroid Build Coastguard Worker veor q4,q4,q12 1331*8fb009dcSAndroid Build Coastguard Worker veor q5,q5,q13 1332*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1},[r14]! 1333*8fb009dcSAndroid Build Coastguard Worker veor q6,q6,q14 1334*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q2,q3},[r14]! 1335*8fb009dcSAndroid Build Coastguard Worker veor q7,q7,q15 1336*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q4,q5},[r14]! 1337*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q6,q7},[r14]! 1338*8fb009dcSAndroid Build Coastguard Worker 1339*8fb009dcSAndroid Build Coastguard Worker beq .Ldone_neon 1340*8fb009dcSAndroid Build Coastguard Worker 1341*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(8) 1342*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q8,q9},[sp] 1343*8fb009dcSAndroid Build Coastguard Worker add r10,sp,#4*(0) 1344*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q10,q11},[r8] 1345*8fb009dcSAndroid Build Coastguard Worker sub r11,r11,#64*2 @ len-=64*2 1346*8fb009dcSAndroid Build Coastguard Worker b .Loop_tail_neon 1347*8fb009dcSAndroid Build Coastguard Worker 1348*8fb009dcSAndroid Build Coastguard Worker.align 4 1349*8fb009dcSAndroid Build Coastguard Worker.L192_or_more_neon: 1350*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12,q13},[r12]! 1351*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q14,q15},[r12]! 1352*8fb009dcSAndroid Build Coastguard Worker veor q0,q0,q12 1353*8fb009dcSAndroid Build Coastguard Worker veor q1,q1,q13 1354*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12,q13},[r12]! 1355*8fb009dcSAndroid Build Coastguard Worker veor q2,q2,q14 1356*8fb009dcSAndroid Build Coastguard Worker veor q3,q3,q15 1357*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q14,q15},[r12]! 1358*8fb009dcSAndroid Build Coastguard Worker 1359*8fb009dcSAndroid Build Coastguard Worker veor q4,q4,q12 1360*8fb009dcSAndroid Build Coastguard Worker veor q5,q5,q13 1361*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12,q13},[r12]! 1362*8fb009dcSAndroid Build Coastguard Worker veor q6,q6,q14 1363*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1},[r14]! 1364*8fb009dcSAndroid Build Coastguard Worker veor q7,q7,q15 1365*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q14,q15},[r12]! 1366*8fb009dcSAndroid Build Coastguard Worker 1367*8fb009dcSAndroid Build Coastguard Worker veor q8,q8,q12 1368*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q2,q3},[r14]! 1369*8fb009dcSAndroid Build Coastguard Worker veor q9,q9,q13 1370*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q4,q5},[r14]! 1371*8fb009dcSAndroid Build Coastguard Worker veor q10,q10,q14 1372*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q6,q7},[r14]! 1373*8fb009dcSAndroid Build Coastguard Worker veor q11,q11,q15 1374*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q8,q9},[r14]! 1375*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q10,q11},[r14]! 1376*8fb009dcSAndroid Build Coastguard Worker 1377*8fb009dcSAndroid Build Coastguard Worker beq .Ldone_neon 1378*8fb009dcSAndroid Build Coastguard Worker 1379*8fb009dcSAndroid Build Coastguard Worker ldmia sp,{r8,r9,r10,r11} @ load key material 1380*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r8 @ accumulate key material 1381*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(4) 1382*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r9 1383*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r10 1384*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r11 1385*8fb009dcSAndroid Build Coastguard Worker ldmia r8,{r8,r9,r10,r11} @ load key material 1386*8fb009dcSAndroid Build Coastguard Worker 1387*8fb009dcSAndroid Build Coastguard Worker add r4,r4,r8 @ accumulate key material 1388*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(8) 1389*8fb009dcSAndroid Build Coastguard Worker add r5,r5,r9 1390*8fb009dcSAndroid Build Coastguard Worker add r6,r6,r10 1391*8fb009dcSAndroid Build Coastguard Worker add r7,r7,r11 1392*8fb009dcSAndroid Build Coastguard Worker ldmia r8,{r8,r9,r10,r11} @ load key material 1393*8fb009dcSAndroid Build Coastguard Worker# ifdef __ARMEB__ 1394*8fb009dcSAndroid Build Coastguard Worker rev r0,r0 1395*8fb009dcSAndroid Build Coastguard Worker rev r1,r1 1396*8fb009dcSAndroid Build Coastguard Worker rev r2,r2 1397*8fb009dcSAndroid Build Coastguard Worker rev r3,r3 1398*8fb009dcSAndroid Build Coastguard Worker rev r4,r4 1399*8fb009dcSAndroid Build Coastguard Worker rev r5,r5 1400*8fb009dcSAndroid Build Coastguard Worker rev r6,r6 1401*8fb009dcSAndroid Build Coastguard Worker rev r7,r7 1402*8fb009dcSAndroid Build Coastguard Worker# endif 1403*8fb009dcSAndroid Build Coastguard Worker stmia sp,{r0,r1,r2,r3,r4,r5,r6,r7} 1404*8fb009dcSAndroid Build Coastguard Worker add r0,sp,#4*(16+8) 1405*8fb009dcSAndroid Build Coastguard Worker 1406*8fb009dcSAndroid Build Coastguard Worker ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half 1407*8fb009dcSAndroid Build Coastguard Worker 1408*8fb009dcSAndroid Build Coastguard Worker add r0,r0,r8 @ accumulate key material 1409*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(12) 1410*8fb009dcSAndroid Build Coastguard Worker add r1,r1,r9 1411*8fb009dcSAndroid Build Coastguard Worker add r2,r2,r10 1412*8fb009dcSAndroid Build Coastguard Worker add r3,r3,r11 1413*8fb009dcSAndroid Build Coastguard Worker ldmia r8,{r8,r9,r10,r11} @ load key material 1414*8fb009dcSAndroid Build Coastguard Worker 1415*8fb009dcSAndroid Build Coastguard Worker add r4,r4,r8 @ accumulate key material 1416*8fb009dcSAndroid Build Coastguard Worker add r8,sp,#4*(8) 1417*8fb009dcSAndroid Build Coastguard Worker add r5,r5,r9 1418*8fb009dcSAndroid Build Coastguard Worker add r4,r4,#3 @ counter+3 1419*8fb009dcSAndroid Build Coastguard Worker add r6,r6,r10 1420*8fb009dcSAndroid Build Coastguard Worker add r7,r7,r11 1421*8fb009dcSAndroid Build Coastguard Worker ldr r11,[sp,#4*(32+2)] @ re-load len 1422*8fb009dcSAndroid Build Coastguard Worker# ifdef __ARMEB__ 1423*8fb009dcSAndroid Build Coastguard Worker rev r0,r0 1424*8fb009dcSAndroid Build Coastguard Worker rev r1,r1 1425*8fb009dcSAndroid Build Coastguard Worker rev r2,r2 1426*8fb009dcSAndroid Build Coastguard Worker rev r3,r3 1427*8fb009dcSAndroid Build Coastguard Worker rev r4,r4 1428*8fb009dcSAndroid Build Coastguard Worker rev r5,r5 1429*8fb009dcSAndroid Build Coastguard Worker rev r6,r6 1430*8fb009dcSAndroid Build Coastguard Worker rev r7,r7 1431*8fb009dcSAndroid Build Coastguard Worker# endif 1432*8fb009dcSAndroid Build Coastguard Worker stmia r8,{r0,r1,r2,r3,r4,r5,r6,r7} 1433*8fb009dcSAndroid Build Coastguard Worker add r10,sp,#4*(0) 1434*8fb009dcSAndroid Build Coastguard Worker sub r11,r11,#64*3 @ len-=64*3 1435*8fb009dcSAndroid Build Coastguard Worker 1436*8fb009dcSAndroid Build Coastguard Worker.Loop_tail_neon: 1437*8fb009dcSAndroid Build Coastguard Worker ldrb r8,[r10],#1 @ read buffer on stack 1438*8fb009dcSAndroid Build Coastguard Worker ldrb r9,[r12],#1 @ read input 1439*8fb009dcSAndroid Build Coastguard Worker subs r11,r11,#1 1440*8fb009dcSAndroid Build Coastguard Worker eor r8,r8,r9 1441*8fb009dcSAndroid Build Coastguard Worker strb r8,[r14],#1 @ store output 1442*8fb009dcSAndroid Build Coastguard Worker bne .Loop_tail_neon 1443*8fb009dcSAndroid Build Coastguard Worker 1444*8fb009dcSAndroid Build Coastguard Worker.Ldone_neon: 1445*8fb009dcSAndroid Build Coastguard Worker add sp,sp,#4*(32+4) 1446*8fb009dcSAndroid Build Coastguard Worker vldmia sp,{d8,d9,d10,d11,d12,d13,d14,d15} 1447*8fb009dcSAndroid Build Coastguard Worker add sp,sp,#4*(16+3) 1448*8fb009dcSAndroid Build Coastguard Worker ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} 1449*8fb009dcSAndroid Build Coastguard Worker.size ChaCha20_ctr32_neon,.-ChaCha20_ctr32_neon 1450*8fb009dcSAndroid Build Coastguard Worker#endif 1451*8fb009dcSAndroid Build Coastguard Worker#endif // !OPENSSL_NO_ASM && defined(OPENSSL_ARM) && defined(__ELF__) 1452