/* salsa-armv7-neon.S - ARM NEON implementation of Salsa20 cipher * * Copyright (C) 2013 Jussi Kivilinna * * 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 . */ #include #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