1 # Copyright (c) 2014, Google Inc.
3 # Permission to use, copy, modify, and/or distribute this software for any
4 # purpose with or without fee is hereby granted, provided that the above
5 # copyright notice and this permission notice appear in all copies.
7 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 # This file contains a pre-compiled version of chacha_vec.c for ARM. This is
16 # needed to support switching on NEON code at runtime. If the whole of OpenSSL
17 # were to be compiled with the needed flags to build chacha_vec.c, then it
18 # wouldn't be possible to run on non-NEON systems.
20 # This file was generated by:
22 # /opt/gcc-linaro-arm-linux-gnueabihf-4.7-2012.10-20121022_linux/bin/arm-linux-gnueabihf-gcc -O3 -mcpu=cortex-a8 -mfpu=neon -S chacha_vec.c -I ../../include -fpic -o chacha_vec_arm.S
24 #if !defined(OPENSSL_NO_ASM)
30 # EABI attribute 28 sets whether VFP register arguments were used to build this
31 # file. If object files are inconsistent on this point, the linker will refuse
32 # to link them. Thus we report whatever the compiler expects since we don't use
35 #if defined(__ARM_PCS_VFP)
55 .global CRYPTO_chacha_20_neon
56 .hidden CRYPTO_chacha_20_neon
59 .type CRYPTO_chacha_20_neon, %function
60 CRYPTO_chacha_20_neon:
61 @ args = 8, pretend = 0, frame = 304
62 @ frame_needed = 1, uses_anonymous_args = 0
63 @ link register save eliminated.
64 push {r4, r5, r6, r7, r8, r9, sl, fp}
65 fstmfdd sp!, {d8, d9, d10, d11, d12, d13, d14, d15}
88 ldmia r2, {r0, r1, r2, r3}
91 vld1.64 {d24-d25}, [r5:64]
103 stmia r6, {r0, r1, r2, r3}
151 ldmia r9, {r9, sl, fp}
196 .word .LANCHOR0-(.LPIC24+4)
213 vadd.i32 q15, q15, q8
263 vadd.i32 q15, q15, q14
294 vext.32 q5, q5, q5, #1
297 vext.32 q0, q0, q0, #1
302 vext.32 q3, q3, q3, #3
305 vext.32 q14, q14, q14, #3
312 vext.32 q1, q1, q1, #2
315 vext.32 q15, q15, q15, #2
325 vadd.i32 q15, q15, q8
337 vshl.i32 q14, q0, #12
398 vadd.i32 q15, q15, q8
414 vext.32 q1, q1, q1, #2
430 vext.32 q5, q5, q5, #1
433 vext.32 q15, q15, q15, #2
434 vext.32 q8, q8, q8, #1
435 vext.32 q0, q0, q0, #3
436 vext.32 q3, q3, q3, #3
439 vadd.i32 q14, q10, q9
441 vadd.i32 q10, q10, q5
443 vld1.64 {d12-d13}, [r2:64]
472 vadd.i32 q15, q13, q15
481 vst1.64 {d8-d9}, [r4:64]
519 vadd.i32 q10, q14, q9
521 vadd.i32 q10, q10, q9
639 add r3, r3, r3, lsl #1
640 sub r3, sl, r3, lsl #6
661 vshl.i32 q14, q9, #12
668 vext.32 q9, q9, q9, #3
670 vext.32 q1, q8, q8, #2
673 vext.32 q8, q8, q8, #1
679 vshl.i32 q14, q8, #12
686 vext.32 q8, q8, q8, #1
688 vext.32 q1, q9, q9, #2
691 vext.32 q14, q9, q9, #3
698 vadd.i32 q14, q12, q14
703 vadd.i32 q10, q10, q15
704 vld1.64 {d8-d9}, [r1:64]
706 vst1.64 {d28-d29}, [r2:64]
733 vadd.i32 q15, q15, q9
739 vshl.i32 q14, q9, #12
741 vadd.i32 q15, q15, q14
746 vext.32 q8, q8, q8, #3
748 vext.32 q14, q9, q9, #2
751 vext.32 q9, q9, q9, #1
752 vadd.i32 q15, q15, q9
755 vadd.i32 q14, q14, q3
759 vadd.i32 q15, q15, q9
763 vadd.i32 q14, q14, q8
764 vext.32 q8, q8, q8, #1
766 vext.32 q14, q14, q14, #2
769 vext.32 q9, q9, q9, #3
772 vadd.i32 q11, q11, q15
775 vst1.64 {d22-d23}, [r9:128]
819 ldrb r2, [r5, r3] @ zero_extendqisi2
820 ldrb r1, [r3, r0] @ zero_extendqisi2
829 fldmfdd sp!, {d8, d9, d10, d11, d12, d13, d14, d15}
830 pop {r4, r5, r6, r7, r8, r9, sl, fp}
834 vld1.64 {d0-d1}, [r5:64]
837 vst1.64 {d22-d23}, [r4:64]
842 vadd.i32 q13, q13, q14
878 .size CRYPTO_chacha_20_neon, .-CRYPTO_chacha_20_neon
887 .ident "GCC: (crosstool-NG linaro-1.13.1-4.7-2012.10-20121022 - Linaro GCC 2012.10) 4.7.3 20121001 (prerelease)"
888 .section .note.GNU-stack,"",%progbits
890 #endif /* !OPENSSL_NO_ASM */