Revision control
Copy as Markdown
Other Tools
/* salsa-armv7-neon.S - ARM NEON implementation of Salsa20 cipher
*
* Copyright (C) 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
*
* This file is part of Libgcrypt.
*
* Libgcrypt is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* Libgcrypt is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
*/
#include <config.h>
#if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) && \
defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) && \
defined(HAVE_GCC_INLINE_ASM_NEON) && defined(USE_SALSA20)
/*
* Based on public domain implementation from SUPERCOP benchmarking framework
* by Peter Schwabe and D. J. Bernstein. Paper about the implementation at:
*/
.syntax unified
.arm
.fpu neon
.text
.align 2
.globl _gcry_arm_neon_salsa20_encrypt
.type _gcry_arm_neon_salsa20_encrypt,%function;
_gcry_arm_neon_salsa20_encrypt:
/* Modifications:
* - arguments changed to (void *c, const void *m, unsigned int nblks,
* void *ctx, unsigned int rounds) from (void *c, const void *m,
* unsigned long long mlen, const void *n, const void *k)
* - nonce and key read from 'ctx' as well as sigma and counter.
* - read in counter from 'ctx' at the start.
* - update counter in 'ctx' at the end.
* - length is input as number of blocks, so don't handle tail bytes
* (this is done in salsa20.c).
*/
lsl r2,r2,#6
vpush {q4,q5,q6,q7}
mov r12,sp
sub sp,sp,#352
and sp,sp,#0xffffffe0
strd r4,[sp,#0]
strd r6,[sp,#8]
strd r8,[sp,#16]
strd r10,[sp,#24]
str r14,[sp,#224]
str r12,[sp,#228]
str r0,[sp,#232]
str r1,[sp,#236]
str r2,[sp,#240]
ldr r4,[r12,#64]
str r4,[sp,#244]
mov r2,r3
add r3,r2,#48
vld1.8 {q3},[r2]
add r0,r2,#32
add r14,r2,#40
vmov.i64 q3,#0xff
str r14,[sp,#160]
ldrd r8,[r2,#4]
vld1.8 {d0},[r0]
ldrd r4,[r2,#20]
vld1.8 {d8-d9},[r2]!
ldrd r6,[r0,#0]
vmov d4,d9
ldr r0,[r14]
vrev64.i32 d0,d0
ldr r1,[r14,#4]
vld1.8 {d10-d11},[r2]
strd r6,[sp,#32]
sub r2,r2,#16
strd r0,[sp,#40]
vmov d5,d11
strd r8,[sp,#48]
vext.32 d1,d0,d10,#1
strd r4,[sp,#56]
ldr r1,[r2,#0]
vshr.u32 q3,q3,#7
ldr r4,[r2,#12]
vext.32 d3,d11,d9,#1
ldr r11,[r2,#16]
vext.32 d2,d8,d0,#1
ldr r8,[r2,#28]
vext.32 d0,d10,d8,#1
ldr r0,[r3,#0]
add r2,r2,#44
vmov q4,q3
vld1.8 {d6-d7},[r14]
vadd.i64 q3,q3,q4
ldr r5,[r3,#4]
add r12,sp,#256
vst1.8 {d4-d5},[r12,: 128]
ldr r10,[r3,#8]
add r14,sp,#272
vst1.8 {d2-d3},[r14,: 128]
ldr r9,[r3,#12]
vld1.8 {d2-d3},[r3]
strd r0,[sp,#64]
ldr r0,[sp,#240]
strd r4,[sp,#72]
strd r10,[sp,#80]
strd r8,[sp,#88]
nop
cmp r0,#192
blo .L_mlenlowbelow192
.L_mlenatleast192:
ldrd r2,[sp,#48]
vext.32 d7,d6,d6,#1
vmov q8,q1
ldrd r6,[sp,#32]
vld1.8 {d18-d19},[r12,: 128]
vmov q10,q0
str r0,[sp,#240]
vext.32 d4,d7,d19,#1
vmov q11,q8
vext.32 d10,d18,d7,#1
vadd.i64 q3,q3,q4
ldrd r0,[sp,#64]
vld1.8 {d24-d25},[r14,: 128]
vmov d5,d24
add r8,sp,#288
ldrd r4,[sp,#72]
vmov d11,d25
add r9,sp,#304
ldrd r10,[sp,#80]
vst1.8 {d4-d5},[r8,: 128]
strd r2,[sp,#96]
vext.32 d7,d6,d6,#1
vmov q13,q10
strd r6,[sp,#104]
vmov d13,d24
vst1.8 {d10-d11},[r9,: 128]
add r2,sp,#320
vext.32 d12,d7,d19,#1
vmov d15,d25
add r6,sp,#336
ldr r12,[sp,#244]
vext.32 d14,d18,d7,#1
vadd.i64 q3,q3,q4
ldrd r8,[sp,#88]
vst1.8 {d12-d13},[r2,: 128]
ldrd r2,[sp,#56]
vst1.8 {d14-d15},[r6,: 128]
ldrd r6,[sp,#40]
.L_mainloop2:
str r12,[sp,#248]
vadd.i32 q4,q10,q8
vadd.i32 q9,q13,q11
add r12,r0,r2
add r14,r5,r1
vshl.i32 q12,q4,#7
vshl.i32 q14,q9,#7
vshr.u32 q4,q4,#25
vshr.u32 q9,q9,#25
eor r4,r4,r12,ROR #25
eor r7,r7,r14,ROR #25
add r12,r4,r0
add r14,r7,r5
veor q5,q5,q12
veor q7,q7,q14
veor q4,q5,q4
veor q5,q7,q9
eor r6,r6,r12,ROR #23
eor r3,r3,r14,ROR #23
add r12,r6,r4
str r7,[sp,#116]
add r7,r3,r7
ldr r14,[sp,#108]
vadd.i32 q7,q8,q4
vadd.i32 q9,q11,q5
vshl.i32 q12,q7,#9
vshl.i32 q14,q9,#9
vshr.u32 q7,q7,#23
vshr.u32 q9,q9,#23
veor q2,q2,q12
veor q6,q6,q14
veor q2,q2,q7
veor q6,q6,q9
eor r2,r2,r12,ROR #19
str r2,[sp,#120]
eor r1,r1,r7,ROR #19
ldr r7,[sp,#96]
add r2,r2,r6
str r6,[sp,#112]
add r6,r1,r3
ldr r12,[sp,#104]
vadd.i32 q7,q4,q2
vext.32 q4,q4,q4,#3
vadd.i32 q9,q5,q6
vshl.i32 q12,q7,#13
vext.32 q5,q5,q5,#3
vshl.i32 q14,q9,#13
eor r0,r0,r2,ROR #14
eor r2,r5,r6,ROR #14
str r3,[sp,#124]
add r3,r10,r12
ldr r5,[sp,#100]
add r6,r9,r11
vshr.u32 q7,q7,#19
vshr.u32 q9,q9,#19
veor q10,q10,q12
veor q12,q13,q14
eor r8,r8,r3,ROR #25
eor r3,r5,r6,ROR #25
add r5,r8,r10
add r6,r3,r9
veor q7,q10,q7
veor q9,q12,q9
eor r5,r7,r5,ROR #23
eor r6,r14,r6,ROR #23
add r7,r5,r8
add r14,r6,r3
vadd.i32 q10,q2,q7
vswp d4,d5
vadd.i32 q12,q6,q9
vshl.i32 q13,q10,#18
vswp d12,d13
vshl.i32 q14,q12,#18
eor r7,r12,r7,ROR #19
eor r11,r11,r14,ROR #19
add r12,r7,r5
add r14,r11,r6
vshr.u32 q10,q10,#14
vext.32 q7,q7,q7,#1
vshr.u32 q12,q12,#14
veor q8,q8,q13
vext.32 q9,q9,q9,#1
veor q11,q11,q14
eor r10,r10,r12,ROR #14
eor r9,r9,r14,ROR #14
add r12,r0,r3
add r14,r2,r4
veor q8,q8,q10
veor q10,q11,q12
eor r1,r1,r12,ROR #25
eor r7,r7,r14,ROR #25
add r12,r1,r0
add r14,r7,r2
vadd.i32 q11,q4,q8
vadd.i32 q12,q5,q10
vshl.i32 q13,q11,#7
vshl.i32 q14,q12,#7
eor r5,r5,r12,ROR #23
eor r6,r6,r14,ROR #23
vshr.u32 q11,q11,#25
vshr.u32 q12,q12,#25
add r12,r5,r1
add r14,r6,r7
veor q7,q7,q13
veor q9,q9,q14
veor q7,q7,q11
veor q9,q9,q12
vadd.i32 q11,q8,q7
vadd.i32 q12,q10,q9
vshl.i32 q13,q11,#9
vshl.i32 q14,q12,#9
eor r3,r3,r12,ROR #19
str r7,[sp,#104]
eor r4,r4,r14,ROR #19
ldr r7,[sp,#112]
add r12,r3,r5
str r6,[sp,#108]
add r6,r4,r6
ldr r14,[sp,#116]
eor r0,r0,r12,ROR #14
str r5,[sp,#96]
eor r5,r2,r6,ROR #14
ldr r2,[sp,#120]
vshr.u32 q11,q11,#23
vshr.u32 q12,q12,#23
veor q2,q2,q13
veor q6,q6,q14
veor q2,q2,q11
veor q6,q6,q12
add r6,r10,r14
add r12,r9,r8
vadd.i32 q11,q7,q2
vext.32 q7,q7,q7,#3
vadd.i32 q12,q9,q6
vshl.i32 q13,q11,#13
vext.32 q9,q9,q9,#3
vshl.i32 q14,q12,#13
vshr.u32 q11,q11,#19
vshr.u32 q12,q12,#19
eor r11,r11,r6,ROR #25
eor r2,r2,r12,ROR #25
add r6,r11,r10
str r3,[sp,#100]
add r3,r2,r9
ldr r12,[sp,#124]
veor q4,q4,q13
veor q5,q5,q14
veor q4,q4,q11
veor q5,q5,q12
eor r6,r7,r6,ROR #23
eor r3,r12,r3,ROR #23
add r7,r6,r11
add r12,r3,r2
vadd.i32 q11,q2,q4
vswp d4,d5
vadd.i32 q12,q6,q5
vshl.i32 q13,q11,#18
vswp d12,d13
vshl.i32 q14,q12,#18
eor r7,r14,r7,ROR #19
eor r8,r8,r12,ROR #19
add r12,r7,r6
add r14,r8,r3
vshr.u32 q11,q11,#14
vext.32 q4,q4,q4,#1
vshr.u32 q12,q12,#14
veor q8,q8,q13
vext.32 q5,q5,q5,#1
veor q10,q10,q14
eor r10,r10,r12,ROR #14
veor q8,q8,q11
eor r9,r9,r14,ROR #14
veor q10,q10,q12
vadd.i32 q11,q7,q8
vadd.i32 q12,q9,q10
add r12,r0,r2
add r14,r5,r1
vshl.i32 q13,q11,#7
vshl.i32 q14,q12,#7
vshr.u32 q11,q11,#25
vshr.u32 q12,q12,#25
eor r4,r4,r12,ROR #25
eor r7,r7,r14,ROR #25
add r12,r4,r0
add r14,r7,r5
veor q4,q4,q13
veor q5,q5,q14
veor q4,q4,q11
veor q5,q5,q12
eor r6,r6,r12,ROR #23
eor r3,r3,r14,ROR #23
add r12,r6,r4
str r7,[sp,#116]
add r7,r3,r7
ldr r14,[sp,#108]
vadd.i32 q11,q8,q4
vadd.i32 q12,q10,q5
vshl.i32 q13,q11,#9
vshl.i32 q14,q12,#9
vshr.u32 q11,q11,#23
vshr.u32 q12,q12,#23
veor q2,q2,q13
veor q6,q6,q14
veor q2,q2,q11
veor q6,q6,q12
eor r2,r2,r12,ROR #19
str r2,[sp,#120]
eor r1,r1,r7,ROR #19
ldr r7,[sp,#96]
add r2,r2,r6
str r6,[sp,#112]
add r6,r1,r3
ldr r12,[sp,#104]
vadd.i32 q11,q4,q2
vext.32 q4,q4,q4,#3
vadd.i32 q12,q5,q6
vshl.i32 q13,q11,#13
vext.32 q5,q5,q5,#3
vshl.i32 q14,q12,#13
eor r0,r0,r2,ROR #14
eor r2,r5,r6,ROR #14
str r3,[sp,#124]
add r3,r10,r12
ldr r5,[sp,#100]
add r6,r9,r11
vshr.u32 q11,q11,#19
vshr.u32 q12,q12,#19
veor q7,q7,q13
veor q9,q9,q14
eor r8,r8,r3,ROR #25
eor r3,r5,r6,ROR #25
add r5,r8,r10
add r6,r3,r9
veor q7,q7,q11
veor q9,q9,q12
eor r5,r7,r5,ROR #23
eor r6,r14,r6,ROR #23
add r7,r5,r8
add r14,r6,r3
vadd.i32 q11,q2,q7
vswp d4,d5
vadd.i32 q12,q6,q9
vshl.i32 q13,q11,#18
vswp d12,d13
vshl.i32 q14,q12,#18
eor r7,r12,r7,ROR #19
eor r11,r11,r14,ROR #19
add r12,r7,r5
add r14,r11,r6
vshr.u32 q11,q11,#14
vext.32 q7,q7,q7,#1
vshr.u32 q12,q12,#14
veor q8,q8,q13
vext.32 q9,q9,q9,#1
veor q10,q10,q14
eor r10,r10,r12,ROR #14
eor r9,r9,r14,ROR #14
add r12,r0,r3
add r14,r2,r4
veor q8,q8,q11
veor q11,q10,q12
eor r1,r1,r12,ROR #25
eor r7,r7,r14,ROR #25
add r12,r1,r0
add r14,r7,r2
vadd.i32 q10,q4,q8
vadd.i32 q12,q5,q11
vshl.i32 q13,q10,#7
vshl.i32 q14,q12,#7
eor r5,r5,r12,ROR #23
eor r6,r6,r14,ROR #23
vshr.u32 q10,q10,#25
vshr.u32 q12,q12,#25
add r12,r5,r1
add r14,r6,r7
veor q7,q7,q13
veor q9,q9,q14
veor q7,q7,q10
veor q9,q9,q12
vadd.i32 q10,q8,q7
vadd.i32 q12,q11,q9
vshl.i32 q13,q10,#9
vshl.i32 q14,q12,#9
eor r3,r3,r12,ROR #19
str r7,[sp,#104]
eor r4,r4,r14,ROR #19
ldr r7,[sp,#112]
add r12,r3,r5
str r6,[sp,#108]
add r6,r4,r6
ldr r14,[sp,#116]
eor r0,r0,r12,ROR #14
str r5,[sp,#96]
eor r5,r2,r6,ROR #14
ldr r2,[sp,#120]
vshr.u32 q10,q10,#23
vshr.u32 q12,q12,#23
veor q2,q2,q13
veor q6,q6,q14
veor q2,q2,q10
veor q6,q6,q12
add r6,r10,r14
add r12,r9,r8
vadd.i32 q12,q7,q2
vext.32 q10,q7,q7,#3
vadd.i32 q7,q9,q6
vshl.i32 q14,q12,#13
vext.32 q13,q9,q9,#3
vshl.i32 q9,q7,#13
vshr.u32 q12,q12,#19
vshr.u32 q7,q7,#19
eor r11,r11,r6,ROR #25
eor r2,r2,r12,ROR #25
add r6,r11,r10
str r3,[sp,#100]
add r3,r2,r9
ldr r12,[sp,#124]
veor q4,q4,q14
veor q5,q5,q9
veor q4,q4,q12
veor q7,q5,q7
eor r6,r7,r6,ROR #23
eor r3,r12,r3,ROR #23
add r7,r6,r11
add r12,r3,r2
vadd.i32 q5,q2,q4
vswp d4,d5
vadd.i32 q9,q6,q7
vshl.i32 q12,q5,#18
vswp d12,d13
vshl.i32 q14,q9,#18
eor r7,r14,r7,ROR #19
eor r8,r8,r12,ROR #19
add r12,r7,r6
add r14,r8,r3
vshr.u32 q15,q5,#14
vext.32 q5,q4,q4,#1
vshr.u32 q4,q9,#14
veor q8,q8,q12
vext.32 q7,q7,q7,#1
veor q9,q11,q14
eor r10,r10,r12,ROR #14
ldr r12,[sp,#248]
veor q8,q8,q15
eor r9,r9,r14,ROR #14
veor q11,q9,q4
subs r12,r12,#4
bhi .L_mainloop2
strd r8,[sp,#112]
ldrd r8,[sp,#64]
strd r2,[sp,#120]
ldrd r2,[sp,#96]
add r0,r0,r8
strd r10,[sp,#96]
add r1,r1,r9
ldrd r10,[sp,#48]
ldrd r8,[sp,#72]
add r2,r2,r10
strd r6,[sp,#128]
add r3,r3,r11
ldrd r6,[sp,#104]
ldrd r10,[sp,#32]
ldr r12,[sp,#236]
add r4,r4,r8
add r5,r5,r9
add r6,r6,r10
add r7,r7,r11
cmp r12,#0
beq .L_nomessage1
ldr r8,[r12,#0]
ldr r9,[r12,#4]
ldr r10,[r12,#8]
ldr r11,[r12,#12]
eor r0,r0,r8
ldr r8,[r12,#16]
eor r1,r1,r9
ldr r9,[r12,#20]
eor r2,r2,r10
ldr r10,[r12,#24]
eor r3,r3,r11
ldr r11,[r12,#28]
eor r4,r4,r8
eor r5,r5,r9
eor r6,r6,r10
eor r7,r7,r11
.L_nomessage1:
ldr r14,[sp,#232]
vadd.i32 q4,q8,q1
str r0,[r14,#0]
add r0,sp,#304
str r1,[r14,#4]
vld1.8 {d16-d17},[r0,: 128]
str r2,[r14,#8]
vadd.i32 q5,q8,q5
str r3,[r14,#12]
add r0,sp,#288
str r4,[r14,#16]
vld1.8 {d16-d17},[r0,: 128]
str r5,[r14,#20]
vadd.i32 q9,q10,q0
str r6,[r14,#24]
vadd.i32 q2,q8,q2
str r7,[r14,#28]
vmov.i64 q8,#0xffffffff
ldrd r6,[sp,#128]
vext.32 d20,d8,d10,#1
ldrd r0,[sp,#40]
vext.32 d25,d9,d11,#1
ldrd r2,[sp,#120]
vbif q4,q9,q8
ldrd r4,[sp,#56]
vext.32 d21,d5,d19,#1
add r6,r6,r0
vext.32 d24,d4,d18,#1
add r7,r7,r1
vbif q2,q5,q8
add r2,r2,r4
vrev64.i32 q5,q10
add r3,r3,r5
vrev64.i32 q9,q12
adds r0,r0,#3
vswp d5,d9
adc r1,r1,#0
strd r0,[sp,#40]
ldrd r8,[sp,#112]
ldrd r0,[sp,#88]
ldrd r10,[sp,#96]
ldrd r4,[sp,#80]
add r0,r8,r0
add r1,r9,r1
add r4,r10,r4
add r5,r11,r5
add r8,r14,#64
cmp r12,#0
beq .L_nomessage2
ldr r9,[r12,#32]
ldr r10,[r12,#36]
ldr r11,[r12,#40]
ldr r14,[r12,#44]
eor r6,r6,r9
ldr r9,[r12,#48]
eor r7,r7,r10
ldr r10,[r12,#52]
eor r4,r4,r11
ldr r11,[r12,#56]
eor r5,r5,r14
ldr r14,[r12,#60]
add r12,r12,#64
eor r2,r2,r9
vld1.8 {d20-d21},[r12]!
veor q4,q4,q10
eor r3,r3,r10
vld1.8 {d20-d21},[r12]!
veor q5,q5,q10
eor r0,r0,r11
vld1.8 {d20-d21},[r12]!
veor q2,q2,q10
eor r1,r1,r14
vld1.8 {d20-d21},[r12]!
veor q9,q9,q10
.L_nomessage2:
vst1.8 {d8-d9},[r8]!
vst1.8 {d10-d11},[r8]!
vmov.i64 q4,#0xff
vst1.8 {d4-d5},[r8]!
vst1.8 {d18-d19},[r8]!
str r6,[r8,#-96]
add r6,sp,#336
str r7,[r8,#-92]
add r7,sp,#320
str r4,[r8,#-88]
vadd.i32 q2,q11,q1
vld1.8 {d10-d11},[r6,: 128]
vadd.i32 q5,q5,q7
vld1.8 {d14-d15},[r7,: 128]
vadd.i32 q9,q13,q0
vadd.i32 q6,q7,q6
str r5,[r8,#-84]
vext.32 d14,d4,d10,#1
str r2,[r8,#-80]
vext.32 d21,d5,d11,#1
str r3,[r8,#-76]
vbif q2,q9,q8
str r0,[r8,#-72]
vext.32 d15,d13,d19,#1
vshr.u32 q4,q4,#7
str r1,[r8,#-68]
vext.32 d20,d12,d18,#1
vbif q6,q5,q8
ldr r0,[sp,#240]
vrev64.i32 q5,q7
vrev64.i32 q7,q10
vswp d13,d5
vadd.i64 q3,q3,q4
sub r0,r0,#192
cmp r12,#0
beq .L_nomessage21
vld1.8 {d16-d17},[r12]!
veor q2,q2,q8
vld1.8 {d16-d17},[r12]!
veor q5,q5,q8
vld1.8 {d16-d17},[r12]!
veor q6,q6,q8
vld1.8 {d16-d17},[r12]!
veor q7,q7,q8
.L_nomessage21:
vst1.8 {d4-d5},[r8]!
vst1.8 {d10-d11},[r8]!
vst1.8 {d12-d13},[r8]!
vst1.8 {d14-d15},[r8]!
str r12,[sp,#236]
add r14,sp,#272
add r12,sp,#256
str r8,[sp,#232]
cmp r0,#192
bhs .L_mlenatleast192
.L_mlenlowbelow192:
cmp r0,#0
beq .L_done
b .L_mlenatleast1
.L_nextblock:
sub r0,r0,#64
.L_mlenatleast1:
.L_handleblock:
str r0,[sp,#248]
ldrd r2,[sp,#48]
ldrd r6,[sp,#32]
ldrd r0,[sp,#64]
ldrd r4,[sp,#72]
ldrd r10,[sp,#80]
ldrd r8,[sp,#88]
strd r2,[sp,#96]
strd r6,[sp,#104]
ldrd r2,[sp,#56]
ldrd r6,[sp,#40]
ldr r12,[sp,#244]
.L_mainloop1:
str r12,[sp,#252]
add r12,r0,r2
add r14,r5,r1
eor r4,r4,r12,ROR #25
eor r7,r7,r14,ROR #25
add r12,r4,r0
add r14,r7,r5
eor r6,r6,r12,ROR #23
eor r3,r3,r14,ROR #23
add r12,r6,r4
str r7,[sp,#132]
add r7,r3,r7
ldr r14,[sp,#104]
eor r2,r2,r12,ROR #19
str r6,[sp,#128]
eor r1,r1,r7,ROR #19
ldr r7,[sp,#100]
add r6,r2,r6
str r2,[sp,#120]
add r2,r1,r3
ldr r12,[sp,#96]
eor r0,r0,r6,ROR #14
str r3,[sp,#124]
eor r2,r5,r2,ROR #14
ldr r3,[sp,#108]
add r5,r10,r14
add r6,r9,r11
eor r8,r8,r5,ROR #25
eor r5,r7,r6,ROR #25
add r6,r8,r10
add r7,r5,r9
eor r6,r12,r6,ROR #23
eor r3,r3,r7,ROR #23
add r7,r6,r8
add r12,r3,r5
eor r7,r14,r7,ROR #19
eor r11,r11,r12,ROR #19
add r12,r7,r6
add r14,r11,r3
eor r10,r10,r12,ROR #14
eor r9,r9,r14,ROR #14
add r12,r0,r5
add r14,r2,r4
eor r1,r1,r12,ROR #25
eor r7,r7,r14,ROR #25
add r12,r1,r0
add r14,r7,r2
eor r6,r6,r12,ROR #23
eor r3,r3,r14,ROR #23
add r12,r6,r1
str r7,[sp,#104]
add r7,r3,r7
ldr r14,[sp,#128]
eor r5,r5,r12,ROR #19
str r3,[sp,#108]
eor r4,r4,r7,ROR #19
ldr r7,[sp,#132]
add r12,r5,r6
str r6,[sp,#96]
add r3,r4,r3
ldr r6,[sp,#120]
eor r0,r0,r12,ROR #14
str r5,[sp,#100]
eor r5,r2,r3,ROR #14
ldr r3,[sp,#124]
add r2,r10,r7
add r12,r9,r8
eor r11,r11,r2,ROR #25
eor r2,r6,r12,ROR #25
add r6,r11,r10
add r12,r2,r9
eor r6,r14,r6,ROR #23
eor r3,r3,r12,ROR #23
add r12,r6,r11
add r14,r3,r2
eor r7,r7,r12,ROR #19
eor r8,r8,r14,ROR #19
add r12,r7,r6
add r14,r8,r3
eor r10,r10,r12,ROR #14
eor r9,r9,r14,ROR #14
ldr r12,[sp,#252]
subs r12,r12,#2
bhi .L_mainloop1
strd r6,[sp,#128]
strd r2,[sp,#120]
strd r10,[sp,#112]
strd r8,[sp,#136]
ldrd r2,[sp,#96]
ldrd r6,[sp,#104]
ldrd r8,[sp,#64]
ldrd r10,[sp,#48]
add r0,r0,r8
add r1,r1,r9
add r2,r2,r10
add r3,r3,r11
ldrd r8,[sp,#72]
ldrd r10,[sp,#32]
add r4,r4,r8
add r5,r5,r9
add r6,r6,r10
add r7,r7,r11
ldr r12,[sp,#236]
cmp r12,#0
beq .L_nomessage10
ldr r8,[r12,#0]
ldr r9,[r12,#4]
ldr r10,[r12,#8]
ldr r11,[r12,#12]
eor r0,r0,r8
ldr r8,[r12,#16]
eor r1,r1,r9
ldr r9,[r12,#20]
eor r2,r2,r10
ldr r10,[r12,#24]
eor r3,r3,r11
ldr r11,[r12,#28]
eor r4,r4,r8
eor r5,r5,r9
eor r6,r6,r10
eor r7,r7,r11
.L_nomessage10:
ldr r14,[sp,#232]
str r0,[r14,#0]
str r1,[r14,#4]
str r2,[r14,#8]
str r3,[r14,#12]
str r4,[r14,#16]
str r5,[r14,#20]
str r6,[r14,#24]
str r7,[r14,#28]
ldrd r6,[sp,#128]
ldrd r10,[sp,#112]
ldrd r0,[sp,#40]
ldrd r4,[sp,#80]
add r6,r6,r0
add r7,r7,r1
add r10,r10,r4
add r11,r11,r5
adds r0,r0,#1
adc r1,r1,#0
strd r0,[sp,#40]
ldrd r2,[sp,#120]
ldrd r8,[sp,#136]
ldrd r4,[sp,#56]
ldrd r0,[sp,#88]
add r2,r2,r4
add r3,r3,r5
add r0,r8,r0
add r1,r9,r1
cmp r12,#0
beq .L_nomessage11
ldr r4,[r12,#32]
ldr r5,[r12,#36]
ldr r8,[r12,#40]
ldr r9,[r12,#44]
eor r6,r6,r4
ldr r4,[r12,#48]
eor r7,r7,r5
ldr r5,[r12,#52]
eor r10,r10,r8
ldr r8,[r12,#56]
eor r11,r11,r9
ldr r9,[r12,#60]
eor r2,r2,r4
eor r3,r3,r5
eor r0,r0,r8
eor r1,r1,r9
add r4,r12,#64
str r4,[sp,#236]
.L_nomessage11:
str r6,[r14,#32]
str r7,[r14,#36]
str r10,[r14,#40]
str r11,[r14,#44]
str r2,[r14,#48]
str r3,[r14,#52]
str r0,[r14,#56]
str r1,[r14,#60]
add r0,r14,#64
str r0,[sp,#232]
ldr r0,[sp,#248]
cmp r0,#64
bhi .L_nextblock
.L_done:
ldr r2,[sp,#160]
ldrd r4,[sp,#0]
ldrd r6,[sp,#8]
ldrd r8,[sp,#16]
ldrd r10,[sp,#24]
ldr r12,[sp,#228]
ldr r14,[sp,#224]
ldrd r0,[sp,#40]
strd r0,[r2]
sub r0,r12,sp
mov sp,r12
vpop {q4,q5,q6,q7}
add r0,r0,#64
bx lr
.size _gcry_arm_neon_salsa20_encrypt,.-_gcry_arm_neon_salsa20_encrypt;
#endif