# Copyright (c) 2014, Google Inc. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # This file contains a pre-compiled version of chacha_vec.c for ARM. This is # needed to support switching on NEON code at runtime. If the whole of OpenSSL # were to be compiled with the needed flags to build chacha_vec.c, then it # wouldn't be possible to run on non-NEON systems. # # This file was generated by chacha_vec_arm_generate.go using the following # compiler command: # # /opt/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc -O3 -mcpu=cortex-a8 -mfpu=neon -fpic -DASM_GEN -I ../../include -S chacha_vec.c -o - #if !defined(OPENSSL_NO_ASM) #if defined(__arm__) || defined(__aarch64__) .syntax unified .cpu cortex-a8 .eabi_attribute 27, 3 # EABI attribute 28 sets whether VFP register arguments were used to build this # file. If object files are inconsistent on this point, the linker will refuse # to link them. Thus we report whatever the compiler expects since we don't use # VFP arguments. #if defined(__ARM_PCS_VFP) .eabi_attribute 28, 1 #else .eabi_attribute 28, 0 #endif .fpu neon .eabi_attribute 20, 1 .eabi_attribute 21, 1 .eabi_attribute 23, 3 .eabi_attribute 24, 1 .eabi_attribute 25, 1 .eabi_attribute 26, 2 .eabi_attribute 30, 2 .eabi_attribute 34, 1 .eabi_attribute 18, 4 .thumb .file "chacha_vec.c" .text .align 2 .global CRYPTO_chacha_20_neon .hidden CRYPTO_chacha_20_neon .thumb .thumb_func .type CRYPTO_chacha_20_neon, %function CRYPTO_chacha_20_neon: @ args = 8, pretend = 0, frame = 152 @ frame_needed = 1, uses_anonymous_args = 0 push {r4, r5, r6, r7, r8, r9, r10, fp, lr} mov r8, r3 vpush.64 {d8, d9, d10, d11, d12, d13, d14, d15} mov r9, r2 ldr r4, .L91+16 mov fp, r0 mov r10, r1 mov lr, r8 .LPIC16: add r4, pc sub sp, sp, #156 add r7, sp, #0 sub sp, sp, #112 add r6, r7, #144 str r0, [r7, #88] str r1, [r7, #12] str r2, [r7, #8] ldmia r4, {r0, r1, r2, r3} add r4, sp, #15 bic r4, r4, #15 ldr ip, [r7, #256] str r4, [r7, #84] mov r5, r4 adds r4, r4, #64 adds r5, r5, #80 str r8, [r7, #68] stmia r4, {r0, r1, r2, r3} movw r4, #43691 ldr r0, [ip] @ unaligned movt r4, 43690 ldr r1, [ip, #4] @ unaligned ldr r3, [r7, #84] ldr r2, [r8, #8] @ unaligned mov r8, #0 stmia r6!, {r0, r1} mov r6, r5 ldr r1, [lr, #4] @ unaligned ldr r0, [lr] @ unaligned vldr d24, [r3, #64] vldr d25, [r3, #72] ldr r3, [lr, #12] @ unaligned str r5, [r7, #80] stmia r5!, {r0, r1, r2, r3} ldr r0, [lr, #16]! @ unaligned ldr r2, [r7, #84] umull r4, r5, r9, r4 vldr d26, [r2, #80] vldr d27, [r2, #88] ldr r1, [lr, #4] @ unaligned ldr r2, [lr, #8] @ unaligned ldr r3, [lr, #12] @ unaligned ldr r4, [r7, #260] stmia r6!, {r0, r1, r2, r3} ldr r3, [ip] ldr r1, [r7, #84] ldr r2, [ip, #4] str r3, [r7, #64] vldr d28, [r1, #80] vldr d29, [r1, #88] str r3, [r7, #136] lsrs r3, r5, #7 str r4, [r7, #128] str r2, [r7, #140] str r8, [r7, #132] str r2, [r7, #60] vldr d22, [r7, #128] vldr d23, [r7, #136] beq .L26 lsls r2, r3, #8 ldr r5, [r1, #64] sub r3, r2, r3, lsl #6 ldr r2, [r1, #68] vldr d0, .L91 vldr d1, .L91+8 adds r4, r4, #2 str r5, [r7, #56] str r2, [r7, #52] ldr r5, [r1, #72] ldr r2, [r1, #76] str r3, [r7, #4] str r5, [r7, #48] str r2, [r7, #44] mov r2, fp str r4, [r7, #72] adds r3, r2, r3 str r10, [r7, #76] str r3, [r7, #16] .L4: ldr r5, [r7, #68] add r8, r7, #44 ldr r4, [r7, #72] vadd.i32 q3, q11, q0 ldmia r8, {r8, r9, r10, fp} vmov q8, q14 @ v4si ldr r2, [r5, #4] vmov q1, q13 @ v4si ldr r3, [r5] vmov q9, q12 @ v4si ldr lr, [r5, #20] vmov q2, q11 @ v4si mov r0, r2 ldr r2, [r5, #8] str r3, [r7, #108] mov r3, r5 ldr ip, [r5, #16] vmov q15, q14 @ v4si mov r1, r2 ldr r2, [r5, #12] ldr r5, [r5, #24] vmov q5, q13 @ v4si ldr r6, [r3, #28] vmov q10, q12 @ v4si ldr r3, [r7, #64] str r5, [r7, #116] movs r5, #10 str r6, [r7, #120] str r4, [r7, #112] ldr r6, [r7, #60] str r8, [r7, #96] mov r8, r10 ldr r4, [r7, #108] mov r10, r9 ldr r9, [r7, #116] str lr, [r7, #104] mov lr, r3 str r5, [r7, #92] movs r5, #0 str r6, [r7, #124] str r5, [r7, #100] b .L92 .L93: .align 3 .L91: .word 1 .word 0 .word 0 .word 0 .word .LANCHOR0-(.LPIC16+4) .L92: .L3: vadd.i32 q9, q9, q1 add r3, r8, r0 vadd.i32 q10, q10, q5 add r5, fp, r4 veor q3, q3, q9 mov r6, r3 veor q2, q2, q10 ldr r3, [r7, #96] str r5, [r7, #116] add r10, r10, r1 vrev32.16 q3, q3 eor lr, lr, r10 vadd.i32 q8, q8, q3 vrev32.16 q2, q2 vadd.i32 q15, q15, q2 mov fp, r3 ldr r3, [r7, #112] veor q4, q8, q1 str r6, [r7, #112] veor q6, q15, q5 eors r3, r3, r5 mov r5, r6 ldr r6, [r7, #100] vshl.i32 q1, q4, #12 vshl.i32 q5, q6, #12 add fp, fp, r2 eors r6, r6, r5 ror r3, r3, #16 vsri.32 q1, q4, #20 ror lr, lr, #16 mov r5, r6 ldr r6, [r7, #124] vsri.32 q5, q6, #20 str r3, [r7, #124] eor r6, r6, fp ror r5, r5, #16 vadd.i32 q9, q9, q1 add r9, r9, lr ror r3, r6, #16 ldr r6, [r7, #124] vadd.i32 q10, q10, q5 str r3, [r7, #108] veor q4, q9, q3 add ip, ip, r6 ldr r6, [r7, #104] veor q6, q10, q2 eor r4, ip, r4 eor r1, r9, r1 vshl.i32 q3, q4, #8 mov r8, r6 ldr r6, [r7, #120] vshl.i32 q2, q6, #8 ror r4, r4, #20 add r6, r6, r3 vsri.32 q3, q4, #24 str r6, [r7, #104] eors r2, r2, r6 ldr r6, [r7, #116] vsri.32 q2, q6, #24 add r8, r8, r5 ror r2, r2, #20 adds r6, r4, r6 vadd.i32 q4, q8, q3 eor r0, r8, r0 vadd.i32 q15, q15, q2 mov r3, r6 ldr r6, [r7, #112] veor q6, q4, q1 ror r0, r0, #20 str r3, [r7, #112] veor q5, q15, q5 adds r6, r0, r6 str r6, [r7, #120] mov r6, r3 ldr r3, [r7, #124] vshl.i32 q8, q6, #7 add fp, fp, r2 eors r3, r3, r6 ldr r6, [r7, #120] vshl.i32 q1, q5, #7 ror r1, r1, #20 eors r5, r5, r6 vsri.32 q8, q6, #25 ldr r6, [r7, #108] ror r3, r3, #24 ror r5, r5, #24 vsri.32 q1, q5, #25 str r5, [r7, #116] eor r6, fp, r6 ldr r5, [r7, #116] add r10, r10, r1 add ip, r3, ip vext.32 q8, q8, q8, #1 str ip, [r7, #124] add ip, r5, r8 ldr r5, [r7, #104] eor lr, r10, lr ror r6, r6, #24 vext.32 q1, q1, q1, #1 add r8, r6, r5 vadd.i32 q9, q9, q8 ldr r5, [r7, #124] vext.32 q3, q3, q3, #3 vadd.i32 q10, q10, q1 ror lr, lr, #24 eor r0, ip, r0 vext.32 q2, q2, q2, #3 add r9, r9, lr eors r4, r4, r5 veor q3, q9, q3 ldr r5, [r7, #112] eor r1, r9, r1 ror r0, r0, #25 veor q2, q10, q2 adds r5, r0, r5 vext.32 q4, q4, q4, #2 str r5, [r7, #112] ldr r5, [r7, #120] ror r1, r1, #25 vrev32.16 q3, q3 eor r2, r8, r2 vext.32 q15, q15, q15, #2 adds r5, r1, r5 vadd.i32 q4, q4, q3 ror r4, r4, #25 vrev32.16 q2, q2 str r5, [r7, #100] vadd.i32 q15, q15, q2 eors r3, r3, r5 ldr r5, [r7, #112] add fp, fp, r4 veor q8, q4, q8 ror r2, r2, #25 veor q1, q15, q1 eor lr, fp, lr eors r6, r6, r5 ror r3, r3, #16 ldr r5, [r7, #116] add r10, r10, r2 str r3, [r7, #120] ror lr, lr, #16 ldr r3, [r7, #120] eor r5, r10, r5 vshl.i32 q5, q8, #12 add ip, lr, ip vshl.i32 q6, q1, #12 str ip, [r7, #104] add ip, r3, r8 str ip, [r7, #116] ldr r3, [r7, #124] ror r5, r5, #16 vsri.32 q5, q8, #20 ror r6, r6, #16 add ip, r5, r3 ldr r3, [r7, #104] vsri.32 q6, q1, #20 add r9, r9, r6 eor r2, ip, r2 eors r4, r4, r3 ldr r3, [r7, #116] eor r0, r9, r0 vadd.i32 q9, q9, q5 ror r4, r4, #20 eors r1, r1, r3 vadd.i32 q10, q10, q6 ror r3, r2, #20 str r3, [r7, #108] ldr r3, [r7, #112] veor q3, q9, q3 ror r0, r0, #20 add r8, r4, fp veor q2, q10, q2 add fp, r0, r3 ldr r3, [r7, #100] ror r1, r1, #20 mov r2, r8 vshl.i32 q8, q3, #8 str r8, [r7, #96] add r8, r1, r3 ldr r3, [r7, #108] vmov q1, q6 @ v4si vshl.i32 q6, q2, #8 eor r6, fp, r6 add r10, r10, r3 ldr r3, [r7, #120] vsri.32 q8, q3, #24 eor lr, r2, lr eor r3, r8, r3 ror r2, r6, #24 vsri.32 q6, q2, #24 eor r5, r10, r5 str r2, [r7, #124] ror r2, r3, #24 ldr r3, [r7, #104] vmov q3, q8 @ v4si vadd.i32 q15, q15, q6 ror lr, lr, #24 vadd.i32 q8, q4, q8 ror r6, r5, #24 add r5, lr, r3 ldr r3, [r7, #124] veor q4, q8, q5 add ip, ip, r6 vmov q2, q6 @ v4si add r9, r9, r3 veor q6, q15, q1 ldr r3, [r7, #116] vshl.i32 q1, q4, #7 str r2, [r7, #112] add r3, r3, r2 str r3, [r7, #120] vshl.i32 q5, q6, #7 eors r1, r1, r3 ldr r3, [r7, #108] vsri.32 q1, q4, #25 eors r4, r4, r5 eor r0, r9, r0 eor r2, ip, r3 vsri.32 q5, q6, #25 ldr r3, [r7, #92] ror r4, r4, #25 str r6, [r7, #100] ror r0, r0, #25 subs r3, r3, #1 str r5, [r7, #104] ror r1, r1, #25 ror r2, r2, #25 vext.32 q15, q15, q15, #2 str r3, [r7, #92] vext.32 q2, q2, q2, #1 vext.32 q8, q8, q8, #2 vext.32 q3, q3, q3, #1 vext.32 q5, q5, q5, #3 vext.32 q1, q1, q1, #3 bne .L3 ldr r3, [r7, #80] vadd.i32 q4, q12, q10 str r9, [r7, #116] mov r9, r10 mov r10, r8 ldr r8, [r7, #96] str lr, [r7, #96] mov lr, r5 ldr r5, [r7, #56] vadd.i32 q5, q13, q5 ldr r6, [r7, #76] vadd.i32 q15, q14, q15 add fp, fp, r5 ldr r5, [r7, #52] str r4, [r7, #108] vadd.i32 q7, q14, q8 ldr r4, [r7, #112] add r5, r10, r5 str r3, [r7, #112] vadd.i32 q2, q11, q2 ldr r3, [r6, #12] @ unaligned vadd.i32 q6, q12, q9 str r0, [r7, #92] vadd.i32 q1, q13, q1 ldr r0, [r6] @ unaligned vadd.i32 q11, q11, q0 str r1, [r7, #40] str r2, [r7, #36] vadd.i32 q3, q11, q3 ldr r1, [r6, #4] @ unaligned vadd.i32 q11, q11, q0 ldr r2, [r6, #8] @ unaligned str r5, [r7, #104] vadd.i32 q11, q11, q0 ldr r5, [r7, #112] ldr r10, [r7, #80] stmia r5!, {r0, r1, r2, r3} mov r5, r10 ldr r0, [r7, #84] ldr r2, [r7, #48] ldr r3, [r7, #72] vldr d20, [r0, #80] vldr d21, [r0, #88] add r9, r9, r2 veor q10, q10, q4 ldr r2, [r7, #44] adds r1, r4, r3 str r1, [r7, #28] add r2, r8, r2 str r2, [r7, #32] vstr d20, [r0, #80] vstr d21, [r0, #88] ldmia r5!, {r0, r1, r2, r3} ldr r4, [r7, #96] ldr r5, [r7, #64] add r4, r4, r5 ldr r5, [r7, #124] str r4, [r7, #96] ldr r4, [r7, #60] add r5, r5, r4 ldr r4, [r7, #88] str r5, [r7, #24] mov r5, r10 str r0, [r4] @ unaligned mov r0, r4 str r1, [r4, #4] @ unaligned mov r8, r0 str r2, [r0, #8] @ unaligned mov r4, r10 str r3, [r0, #12] @ unaligned ldr r0, [r6, #16]! @ unaligned ldr r1, [r6, #4] @ unaligned ldr r2, [r6, #8] @ unaligned ldr r3, [r6, #12] @ unaligned ldr r6, [r7, #76] stmia r5!, {r0, r1, r2, r3} mov r5, r10 ldr r3, [r7, #84] vldr d20, [r3, #80] vldr d21, [r3, #88] veor q10, q10, q5 vstr d20, [r3, #80] vstr d21, [r3, #88] ldmia r4!, {r0, r1, r2, r3} mov r4, r8 str r0, [r8, #16] @ unaligned str r1, [r8, #20] @ unaligned str r2, [r8, #24] @ unaligned str r3, [r8, #28] @ unaligned mov r8, r4 ldr r0, [r6, #32]! @ unaligned str r10, [r7, #124] ldr r1, [r6, #4] @ unaligned ldr r2, [r6, #8] @ unaligned ldr r3, [r6, #12] @ unaligned ldr r6, [r7, #76] stmia r5!, {r0, r1, r2, r3} mov r5, r10 ldr r2, [r7, #84] vldr d16, [r2, #80] vldr d17, [r2, #88] veor q15, q8, q15 vstr d30, [r2, #80] vstr d31, [r2, #88] ldmia r10!, {r0, r1, r2, r3} str r0, [r4, #32] @ unaligned str r1, [r4, #36] @ unaligned str r2, [r4, #40] @ unaligned str r3, [r4, #44] @ unaligned ldr r0, [r6, #48]! @ unaligned ldr r1, [r6, #4] @ unaligned ldr r2, [r6, #8] @ unaligned ldr r3, [r6, #12] @ unaligned ldr r6, [r7, #76] stmia r5!, {r0, r1, r2, r3} ldr r1, [r7, #84] vldr d18, [r1, #80] vldr d19, [r1, #88] veor q9, q9, q2 vstr d18, [r1, #80] vstr d19, [r1, #88] ldr r3, [r7, #112] ldr r5, [r7, #80] mov r10, r3 ldmia r10!, {r0, r1, r2, r3} str r0, [r4, #48] @ unaligned str r1, [r4, #52] @ unaligned str r2, [r4, #56] @ unaligned str r3, [r4, #60] @ unaligned ldr r0, [r6, #64]! @ unaligned ldr r1, [r6, #4] @ unaligned ldr r2, [r6, #8] @ unaligned ldr r3, [r6, #12] @ unaligned ldr r6, [r7, #76] stmia r5!, {r0, r1, r2, r3} ldr r1, [r7, #84] ldr r3, [r7, #112] ldr r5, [r7, #80] vldr d18, [r1, #80] vldr d19, [r1, #88] veor q9, q9, q6 mov r10, r3 str r5, [r7, #20] vstr d18, [r1, #80] vstr d19, [r1, #88] ldmia r10!, {r0, r1, r2, r3} str r1, [r4, #68] @ unaligned str r2, [r4, #72] @ unaligned str r3, [r4, #76] @ unaligned str r0, [r4, #64] @ unaligned ldr r0, [r6, #80]! @ unaligned ldr r1, [r6, #4] @ unaligned ldr r2, [r6, #8] @ unaligned ldr r3, [r6, #12] @ unaligned ldr r6, [r7, #76] stmia r5!, {r0, r1, r2, r3} ldr r1, [r7, #84] ldr r3, [r7, #20] ldr r5, [r7, #80] vldr d18, [r1, #80] vldr d19, [r1, #88] veor q1, q9, q1 mov r10, r3 vstr d2, [r1, #80] vstr d3, [r1, #88] ldmia r10!, {r0, r1, r2, r3} mov r10, r5 str r0, [r4, #80] @ unaligned str r1, [r4, #84] @ unaligned str r2, [r4, #88] @ unaligned str r3, [r4, #92] @ unaligned ldr r0, [r6, #96]! @ unaligned ldr r1, [r6, #4] @ unaligned ldr r2, [r6, #8] @ unaligned ldr r3, [r6, #12] @ unaligned ldr r6, [r7, #76] stmia r5!, {r0, r1, r2, r3} mov r5, r10 ldr r3, [r7, #84] vldr d16, [r3, #80] vldr d17, [r3, #88] veor q8, q8, q7 vstr d16, [r3, #80] vstr d17, [r3, #88] ldmia r10!, {r0, r1, r2, r3} str r0, [r4, #96] @ unaligned str r1, [r4, #100] @ unaligned str r2, [r4, #104] @ unaligned str r3, [r4, #108] @ unaligned ldr r0, [r6, #112]! @ unaligned ldr r1, [r6, #4] @ unaligned ldr r2, [r6, #8] @ unaligned ldr r3, [r6, #12] @ unaligned mov r6, r5 stmia r6!, {r0, r1, r2, r3} ldr r3, [r7, #84] vldr d16, [r3, #80] vldr d17, [r3, #88] veor q8, q8, q3 vstr d16, [r3, #80] vstr d17, [r3, #88] ldmia r5!, {r0, r1, r2, r3} str r1, [r4, #116] @ unaligned ldr r1, [r7, #76] str r0, [r4, #112] @ unaligned str r2, [r4, #120] @ unaligned str r3, [r4, #124] @ unaligned ldr r3, [r1, #128] ldr r2, [r7, #104] eor r3, fp, r3 str r3, [r4, #128] ldr r3, [r1, #132] eors r2, r2, r3 str r2, [r8, #132] ldr r3, [r1, #136] ldr r5, [r7, #68] ldr r6, [r7, #32] eor r3, r9, r3 str r3, [r4, #136] ldr r3, [r1, #140] ldr r0, [r7, #92] eors r3, r3, r6 ldr r6, [r7, #108] str r3, [r4, #140] ldr r3, [r5] ldr r2, [r1, #144] add r6, r6, r3 eors r2, r2, r6 str r2, [r4, #144] ldr r2, [r5, #4] ldr r3, [r1, #148] add r0, r0, r2 ldr r6, [r7, #36] eors r3, r3, r0 ldr r0, [r7, #40] str r3, [r4, #148] ldr r2, [r5, #8] ldr r3, [r1, #152] add r0, r0, r2 eors r3, r3, r0 str r3, [r4, #152] ldr r2, [r5, #12] mov r0, r4 ldr r3, [r1, #156] mov r4, r1 add r6, r6, r2 mov r1, r0 eors r3, r3, r6 str r3, [r0, #156] ldr r2, [r5, #16] ldr r3, [r4, #160] add ip, ip, r2 eor r3, ip, r3 str r3, [r1, #160] ldr r2, [r5, #20] ldr r3, [r4, #164] add lr, lr, r2 ldr r2, [r7, #116] eor r3, lr, r3 str r3, [r1, #164] ldr r6, [r5, #24] mov lr, r4 ldr r3, [r4, #168] add r2, r2, r6 mov r6, r4 eors r3, r3, r2 str r3, [r1, #168] ldr r5, [r5, #28] mov r2, r1 ldr r3, [r4, #172] ldr r0, [r7, #120] add r0, r0, r5 ldr r5, [r7, #24] eors r3, r3, r0 str r3, [r1, #172] ldr r3, [r7, #72] ldr r4, [r4, #176] ldr r1, [r7, #28] eors r4, r4, r1 adds r1, r3, #3 str r4, [r2, #176] ldr r3, [r7, #100] ldr r0, [lr, #180] str r1, [r7, #72] eors r3, r3, r0 mov r0, r3 mov r3, r2 str r0, [r2, #180] adds r3, r3, #192 ldr r1, [lr, #184] ldr r2, [r7, #96] eors r1, r1, r2 str r1, [r3, #-8] ldr r2, [lr, #188] mov r1, r6 adds r1, r1, #192 str r1, [r7, #76] eors r2, r2, r5 str r2, [r3, #-4] ldr r2, [r7, #16] str r3, [r7, #88] cmp r2, r3 bne .L4 ldr r3, [r7, #12] ldr r2, [r7, #4] add r3, r3, r2 str r3, [r7, #12] .L2: ldr r1, [r7, #8] movw r2, #43691 movt r2, 43690 umull r2, r3, r1, r2 lsr fp, r3, #7 lsl r3, fp, #8 sub fp, r3, fp, lsl #6 rsb fp, fp, r1 lsrs fp, fp, #6 beq .L6 ldr r5, [r7, #12] ldr r4, [r7, #16] ldr r6, [r7, #84] ldr lr, [r7, #80] vldr d30, .L94 vldr d31, .L94+8 str fp, [r7, #120] str fp, [r7, #124] .L8: vmov q2, q11 @ v4si movs r3, #10 vmov q8, q14 @ v4si vmov q9, q13 @ v4si vmov q10, q12 @ v4si .L7: vadd.i32 q10, q10, q9 subs r3, r3, #1 veor q3, q2, q10 vrev32.16 q3, q3 vadd.i32 q8, q8, q3 veor q9, q8, q9 vshl.i32 q2, q9, #12 vsri.32 q2, q9, #20 vadd.i32 q10, q10, q2 veor q3, q10, q3 vshl.i32 q9, q3, #8 vsri.32 q9, q3, #24 vadd.i32 q8, q8, q9 vext.32 q9, q9, q9, #3 veor q2, q8, q2 vext.32 q8, q8, q8, #2 vshl.i32 q3, q2, #7 vsri.32 q3, q2, #25 vext.32 q3, q3, q3, #1 vadd.i32 q10, q10, q3 veor q9, q10, q9 vrev32.16 q9, q9 vadd.i32 q8, q8, q9 veor q3, q8, q3 vshl.i32 q2, q3, #12 vsri.32 q2, q3, #20 vadd.i32 q10, q10, q2 vmov q3, q2 @ v4si veor q9, q10, q9 vshl.i32 q2, q9, #8 vsri.32 q2, q9, #24 vadd.i32 q8, q8, q2 vext.32 q2, q2, q2, #1 veor q3, q8, q3 vext.32 q8, q8, q8, #2 vshl.i32 q9, q3, #7 vsri.32 q9, q3, #25 vext.32 q9, q9, q9, #3 bne .L7 ldr r0, [r5] @ unaligned vadd.i32 q1, q12, q10 ldr r1, [r5, #4] @ unaligned mov ip, lr ldr r2, [r5, #8] @ unaligned mov r9, lr ldr r3, [r5, #12] @ unaligned mov r10, r5 vadd.i32 q9, q13, q9 mov r8, lr vadd.i32 q8, q14, q8 stmia ip!, {r0, r1, r2, r3} mov ip, lr vldr d20, [r6, #80] vldr d21, [r6, #88] vadd.i32 q3, q11, q2 veor q10, q10, q1 vadd.i32 q11, q11, q15 vstr d20, [r6, #80] vstr d21, [r6, #88] ldmia r9!, {r0, r1, r2, r3} mov r9, r5 str r0, [r4] @ unaligned str r1, [r4, #4] @ unaligned str r2, [r4, #8] @ unaligned str r3, [r4, #12] @ unaligned ldr r0, [r10, #16]! @ unaligned ldr r1, [r10, #4] @ unaligned ldr r2, [r10, #8] @ unaligned ldr r3, [r10, #12] @ unaligned add r10, r4, #48 adds r4, r4, #64 stmia r8!, {r0, r1, r2, r3} mov r8, lr vldr d20, [r6, #80] vldr d21, [r6, #88] veor q10, q10, q9 vstr d20, [r6, #80] vstr d21, [r6, #88] ldmia ip!, {r0, r1, r2, r3} mov ip, lr str r0, [r4, #-48] @ unaligned str r1, [r4, #-44] @ unaligned str r2, [r4, #-40] @ unaligned str r3, [r4, #-36] @ unaligned ldr r0, [r9, #32]! @ unaligned ldr r1, [r9, #4] @ unaligned ldr r2, [r9, #8] @ unaligned ldr r3, [r9, #12] @ unaligned mov r9, r5 adds r5, r5, #64 stmia r8!, {r0, r1, r2, r3} mov r8, lr vldr d18, [r6, #80] vldr d19, [r6, #88] veor q9, q9, q8 vstr d18, [r6, #80] vstr d19, [r6, #88] ldmia ip!, {r0, r1, r2, r3} mov ip, lr str r0, [r4, #-32] @ unaligned str r1, [r4, #-28] @ unaligned str r2, [r4, #-24] @ unaligned str r3, [r4, #-20] @ unaligned ldr r0, [r9, #48]! @ unaligned ldr r1, [r9, #4] @ unaligned ldr r2, [r9, #8] @ unaligned ldr r3, [r9, #12] @ unaligned stmia r8!, {r0, r1, r2, r3} vldr d16, [r6, #80] vldr d17, [r6, #88] veor q8, q8, q3 vstr d16, [r6, #80] vstr d17, [r6, #88] ldmia ip!, {r0, r1, r2, r3} str r0, [r4, #-16] @ unaligned str r1, [r4, #-12] @ unaligned str r3, [r10, #12] @ unaligned ldr r3, [r7, #124] str r2, [r10, #8] @ unaligned cmp r3, #1 beq .L87 movs r3, #1 str r3, [r7, #124] b .L8 .L95: .align 3 .L94: .word 1 .word 0 .word 0 .word 0 .L87: ldr fp, [r7, #120] ldr r3, [r7, #12] lsl fp, fp, #6 add r3, r3, fp str r3, [r7, #12] ldr r3, [r7, #16] add r3, r3, fp str r3, [r7, #16] .L6: ldr r3, [r7, #8] ands r9, r3, #63 beq .L1 vmov q3, q11 @ v4si movs r3, #10 vmov q8, q14 @ v4si mov r5, r9 vmov q15, q13 @ v4si vmov q10, q12 @ v4si .L10: vadd.i32 q10, q10, q15 subs r3, r3, #1 veor q9, q3, q10 vrev32.16 q9, q9 vadd.i32 q8, q8, q9 veor q15, q8, q15 vshl.i32 q3, q15, #12 vsri.32 q3, q15, #20 vadd.i32 q10, q10, q3 veor q15, q10, q9 vshl.i32 q9, q15, #8 vsri.32 q9, q15, #24 vadd.i32 q8, q8, q9 vext.32 q9, q9, q9, #3 veor q3, q8, q3 vext.32 q8, q8, q8, #2 vshl.i32 q15, q3, #7 vsri.32 q15, q3, #25 vext.32 q15, q15, q15, #1 vadd.i32 q10, q10, q15 veor q9, q10, q9 vrev32.16 q9, q9 vadd.i32 q8, q8, q9 veor q15, q8, q15 vshl.i32 q3, q15, #12 vsri.32 q3, q15, #20 vadd.i32 q10, q10, q3 vmov q15, q3 @ v4si veor q9, q10, q9 vshl.i32 q3, q9, #8 vsri.32 q3, q9, #24 vadd.i32 q8, q8, q3 vext.32 q3, q3, q3, #1 veor q9, q8, q15 vext.32 q8, q8, q8, #2 vshl.i32 q15, q9, #7 vsri.32 q15, q9, #25 vext.32 q15, q15, q15, #3 bne .L10 cmp r5, #15 mov r9, r5 bhi .L88 vadd.i32 q12, q12, q10 ldr r3, [r7, #84] vst1.64 {d24-d25}, [r3:128] .L14: ldr r3, [r7, #8] and r2, r3, #48 cmp r9, r2 bls .L1 ldr r6, [r7, #16] add r3, r2, #16 ldr r1, [r7, #12] rsb ip, r2, r9 adds r0, r1, r2 mov r4, r6 add r1, r1, r3 add r4, r4, r2 add r3, r3, r6 cmp r0, r3 it cc cmpcc r4, r1 ite cs movcs r3, #1 movcc r3, #0 cmp ip, #18 ite ls movls r3, #0 andhi r3, r3, #1 cmp r3, #0 beq .L16 and r1, r0, #7 mov r3, r2 negs r1, r1 and r1, r1, #15 cmp r1, ip it cs movcs r1, ip cmp r1, #0 beq .L17 ldr r5, [r7, #84] cmp r1, #1 ldrb r0, [r0] @ zero_extendqisi2 add r3, r2, #1 ldrb lr, [r5, r2] @ zero_extendqisi2 mov r6, r5 eor r0, lr, r0 strb r0, [r4] beq .L17 ldr r0, [r7, #12] cmp r1, #2 ldrb r4, [r5, r3] @ zero_extendqisi2 ldr r5, [r7, #16] ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #2 beq .L17 ldr r0, [r7, #12] cmp r1, #3 ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #3 beq .L17 ldr r0, [r7, #12] cmp r1, #4 ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #4 beq .L17 ldr r0, [r7, #12] cmp r1, #5 ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #5 beq .L17 ldr r0, [r7, #12] cmp r1, #6 ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #6 beq .L17 ldr r0, [r7, #12] cmp r1, #7 ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #7 beq .L17 ldr r0, [r7, #12] cmp r1, #8 ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #8 beq .L17 ldr r0, [r7, #12] cmp r1, #9 ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #9 beq .L17 ldr r0, [r7, #12] cmp r1, #10 ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #10 beq .L17 ldr r0, [r7, #12] cmp r1, #11 ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #11 beq .L17 ldr r0, [r7, #12] cmp r1, #12 ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #12 beq .L17 ldr r0, [r7, #12] cmp r1, #13 ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #13 beq .L17 ldr r0, [r7, #12] cmp r1, #15 ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r3] add r3, r2, #14 bne .L17 ldr r0, [r7, #12] ldrb r4, [r6, r3] @ zero_extendqisi2 ldrb r0, [r0, r3] @ zero_extendqisi2 eors r0, r0, r4 strb r0, [r5, r3] add r3, r2, #15 .L17: rsb r4, r1, ip add r0, ip, #-1 sub r6, r4, #16 subs r0, r0, r1 cmp r0, #14 lsr r6, r6, #4 add r6, r6, #1 lsl lr, r6, #4 bls .L19 add r2, r2, r1 ldr r1, [r7, #12] ldr r5, [r7, #16] cmp r6, #1 add r0, r1, r2 ldr r1, [r7, #84] add r1, r1, r2 vld1.64 {d18-d19}, [r0:64] add r2, r2, r5 vld1.8 {q8}, [r1] veor q8, q8, q9 vst1.8 {q8}, [r2] beq .L20 add r8, r1, #16 add ip, r2, #16 vldr d18, [r0, #16] vldr d19, [r0, #24] cmp r6, #2 vld1.8 {q8}, [r8] veor q8, q8, q9 vst1.8 {q8}, [ip] beq .L20 add r8, r1, #32 add ip, r2, #32 vldr d18, [r0, #32] vldr d19, [r0, #40] cmp r6, #3 vld1.8 {q8}, [r8] veor q8, q8, q9 vst1.8 {q8}, [ip] beq .L20 adds r1, r1, #48 adds r2, r2, #48 vldr d18, [r0, #48] vldr d19, [r0, #56] vld1.8 {q8}, [r1] veor q8, q8, q9 vst1.8 {q8}, [r2] .L20: cmp lr, r4 add r3, r3, lr beq .L1 .L19: ldr r4, [r7, #84] adds r2, r3, #1 ldr r1, [r7, #12] cmp r2, r9 ldr r5, [r7, #16] ldrb r0, [r4, r3] @ zero_extendqisi2 ldrb r1, [r1, r3] @ zero_extendqisi2 eor r1, r1, r0 strb r1, [r5, r3] bcs .L1 ldr r0, [r7, #12] adds r1, r3, #2 mov r6, r4 cmp r9, r1 ldrb r4, [r4, r2] @ zero_extendqisi2 ldrb r0, [r0, r2] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r2] bls .L1 ldr r0, [r7, #12] adds r2, r3, #3 ldrb r4, [r6, r1] @ zero_extendqisi2 cmp r9, r2 ldrb r0, [r0, r1] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r1] bls .L1 ldr r0, [r7, #12] adds r1, r3, #4 ldrb r4, [r6, r2] @ zero_extendqisi2 cmp r9, r1 ldrb r0, [r0, r2] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r2] bls .L1 ldr r0, [r7, #12] adds r2, r3, #5 ldrb r4, [r6, r1] @ zero_extendqisi2 cmp r9, r2 ldrb r0, [r0, r1] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r1] bls .L1 ldr r0, [r7, #12] adds r1, r3, #6 ldrb r4, [r6, r2] @ zero_extendqisi2 cmp r9, r1 ldrb r0, [r0, r2] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r2] bls .L1 ldr r0, [r7, #12] adds r2, r3, #7 ldrb r4, [r6, r1] @ zero_extendqisi2 cmp r9, r2 ldrb r0, [r0, r1] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r1] bls .L1 ldr r0, [r7, #12] add r1, r3, #8 ldrb r4, [r6, r2] @ zero_extendqisi2 cmp r9, r1 ldrb r0, [r0, r2] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r2] bls .L1 ldr r0, [r7, #12] add r2, r3, #9 ldrb r4, [r6, r1] @ zero_extendqisi2 cmp r9, r2 ldrb r0, [r0, r1] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r1] bls .L1 ldr r0, [r7, #12] add r1, r3, #10 ldrb r4, [r6, r2] @ zero_extendqisi2 cmp r9, r1 ldrb r0, [r0, r2] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r2] bls .L1 ldr r0, [r7, #12] add r2, r3, #11 ldrb r4, [r6, r1] @ zero_extendqisi2 cmp r9, r2 ldrb r0, [r0, r1] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r1] bls .L1 ldr r0, [r7, #12] add r1, r3, #12 ldrb r4, [r6, r2] @ zero_extendqisi2 cmp r9, r1 ldrb r0, [r0, r2] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r2] bls .L1 ldr r0, [r7, #12] add r2, r3, #13 ldrb r4, [r6, r1] @ zero_extendqisi2 cmp r9, r2 ldrb r0, [r0, r1] @ zero_extendqisi2 eor r0, r0, r4 strb r0, [r5, r1] bls .L1 ldr r1, [r7, #12] adds r3, r3, #14 ldrb r0, [r6, r2] @ zero_extendqisi2 cmp r9, r3 ldrb r1, [r1, r2] @ zero_extendqisi2 eor r1, r1, r0 strb r1, [r5, r2] bls .L1 ldr r2, [r7, #84] ldrb r1, [r2, r3] @ zero_extendqisi2 ldr r2, [r7, #12] ldrb r2, [r2, r3] @ zero_extendqisi2 eors r2, r2, r1 ldr r1, [r7, #16] strb r2, [r1, r3] .L1: adds r7, r7, #156 mov sp, r7 @ sp needed vldm sp!, {d8-d15} pop {r4, r5, r6, r7, r8, r9, r10, fp, pc} .L88: ldr r5, [r7, #12] vadd.i32 q12, q12, q10 ldr r4, [r7, #80] cmp r9, #31 ldr r0, [r5] @ unaligned ldr r1, [r5, #4] @ unaligned mov r6, r4 ldr r2, [r5, #8] @ unaligned ldr r3, [r5, #12] @ unaligned stmia r6!, {r0, r1, r2, r3} ldr r2, [r7, #84] ldr r6, [r7, #16] vldr d18, [r2, #80] vldr d19, [r2, #88] veor q9, q9, q12 vstr d18, [r2, #80] vstr d19, [r2, #88] ldmia r4!, {r0, r1, r2, r3} str r1, [r6, #4] @ unaligned mov r1, r6 str r0, [r6] @ unaligned str r2, [r6, #8] @ unaligned str r3, [r6, #12] @ unaligned bhi .L89 vadd.i32 q13, q13, q15 ldr r3, [r7, #84] vstr d26, [r3, #16] vstr d27, [r3, #24] b .L14 .L16: subs r3, r2, #1 ldr r2, [r7, #12] add r2, r2, r9 mov r5, r2 ldr r2, [r7, #84] add r2, r2, r3 mov r3, r2 .L24: ldrb r1, [r0], #1 @ zero_extendqisi2 ldrb r2, [r3, #1]! @ zero_extendqisi2 cmp r0, r5 eor r2, r2, r1 strb r2, [r4], #1 bne .L24 adds r7, r7, #156 mov sp, r7 @ sp needed vldm sp!, {d8-d15} pop {r4, r5, r6, r7, r8, r9, r10, fp, pc} .L26: str fp, [r7, #16] b .L2 .L89: mov r3, r5 ldr r4, [r7, #80] ldr r0, [r3, #16]! @ unaligned add lr, r1, #16 mov r5, r1 vadd.i32 q13, q13, q15 mov r6, r4 cmp r9, #47 ldr r1, [r3, #4] @ unaligned ldr r2, [r3, #8] @ unaligned ldr r3, [r3, #12] @ unaligned stmia r6!, {r0, r1, r2, r3} ldr r2, [r7, #84] vldr d18, [r2, #80] vldr d19, [r2, #88] veor q13, q9, q13 vstr d26, [r2, #80] vstr d27, [r2, #88] ldmia r4!, {r0, r1, r2, r3} str r0, [r5, #16] @ unaligned str r1, [lr, #4] @ unaligned str r2, [lr, #8] @ unaligned str r3, [lr, #12] @ unaligned bhi .L90 vadd.i32 q8, q14, q8 ldr r3, [r7, #84] vstr d16, [r3, #32] vstr d17, [r3, #40] b .L14 .L90: ldr r3, [r7, #12] add lr, r5, #32 ldr r4, [r7, #80] vadd.i32 q8, q14, q8 ldr r5, [r7, #84] vadd.i32 q11, q11, q3 ldr r0, [r3, #32]! @ unaligned mov r6, r4 vstr d22, [r5, #48] vstr d23, [r5, #56] ldr r1, [r3, #4] @ unaligned ldr r2, [r3, #8] @ unaligned ldr r3, [r3, #12] @ unaligned stmia r4!, {r0, r1, r2, r3} vldr d18, [r5, #80] vldr d19, [r5, #88] veor q9, q9, q8 ldr r4, [r7, #16] vstr d18, [r5, #80] vstr d19, [r5, #88] ldmia r6!, {r0, r1, r2, r3} str r0, [r4, #32] @ unaligned str r1, [lr, #4] @ unaligned str r2, [lr, #8] @ unaligned str r3, [lr, #12] @ unaligned b .L14 .size CRYPTO_chacha_20_neon, .-CRYPTO_chacha_20_neon .section .rodata .align 2 .LANCHOR0 = . + 0 .LC0: .word 1634760805 .word 857760878 .word 2036477234 .word 1797285236 .ident "GCC: (Linaro GCC 2014.11) 4.9.3 20141031 (prerelease)" .section .note.GNU-stack,"",%progbits #endif /* __arm__ || __aarch64__ */ #endif /* !OPENSSL_NO_ASM */