We currently use an old version of libgcrypt which results in us having fewer ciphers and missing on many other improvements. Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
900 lines
17 KiB
ArmAsm
900 lines
17 KiB
ArmAsm
/* 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
|
|
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#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:
|
|
* http://cryptojedi.org/papers/#neoncrypto
|
|
*/
|
|
|
|
.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
|