1// This file is generated from a similarly-named Perl script in the BoringSSL 2// source tree. Do not edit by hand. 3 4#if !defined(__has_feature) 5#define __has_feature(x) 0 6#endif 7#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) 8#define OPENSSL_NO_ASM 9#endif 10 11#if !defined(OPENSSL_NO_ASM) 12#if defined(BORINGSSL_PREFIX) 13#include <boringssl_prefix_symbols_asm.h> 14#endif 15#include <openssl/arm_arch.h> 16 17@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both 18@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 PMULL 19@ instructions are in aesv8-armx.pl.) 20 21 22.text 23#if defined(__thumb2__) || defined(__clang__) 24.syntax unified 25#define ldrplb ldrbpl 26#define ldrneb ldrbne 27#endif 28#if defined(__thumb2__) 29.thumb 30#else 31.code 32 32#endif 33#if __ARM_MAX_ARCH__>=7 34 35 36 37.globl _gcm_init_neon 38.private_extern _gcm_init_neon 39#ifdef __thumb2__ 40.thumb_func _gcm_init_neon 41#endif 42.align 4 43_gcm_init_neon: 44 vld1.64 d7,[r1]! @ load H 45 vmov.i8 q8,#0xe1 46 vld1.64 d6,[r1] 47 vshl.i64 d17,#57 48 vshr.u64 d16,#63 @ t0=0xc2....01 49 vdup.8 q9,d7[7] 50 vshr.u64 d26,d6,#63 51 vshr.s8 q9,#7 @ broadcast carry bit 52 vshl.i64 q3,q3,#1 53 vand q8,q8,q9 54 vorr d7,d26 @ H<<<=1 55 veor q3,q3,q8 @ twisted H 56 vstmia r0,{q3} 57 58 bx lr @ bx lr 59 60 61.globl _gcm_gmult_neon 62.private_extern _gcm_gmult_neon 63#ifdef __thumb2__ 64.thumb_func _gcm_gmult_neon 65#endif 66.align 4 67_gcm_gmult_neon: 68 vld1.64 d7,[r0]! @ load Xi 69 vld1.64 d6,[r0]! 70 vmov.i64 d29,#0x0000ffffffffffff 71 vldmia r1,{d26,d27} @ load twisted H 72 vmov.i64 d30,#0x00000000ffffffff 73#ifdef __ARMEL__ 74 vrev64.8 q3,q3 75#endif 76 vmov.i64 d31,#0x000000000000ffff 77 veor d28,d26,d27 @ Karatsuba pre-processing 78 mov r3,#16 79 b Lgmult_neon 80 81 82.globl _gcm_ghash_neon 83.private_extern _gcm_ghash_neon 84#ifdef __thumb2__ 85.thumb_func _gcm_ghash_neon 86#endif 87.align 4 88_gcm_ghash_neon: 89 vld1.64 d1,[r0]! @ load Xi 90 vld1.64 d0,[r0]! 91 vmov.i64 d29,#0x0000ffffffffffff 92 vldmia r1,{d26,d27} @ load twisted H 93 vmov.i64 d30,#0x00000000ffffffff 94#ifdef __ARMEL__ 95 vrev64.8 q0,q0 96#endif 97 vmov.i64 d31,#0x000000000000ffff 98 veor d28,d26,d27 @ Karatsuba pre-processing 99 100Loop_neon: 101 vld1.64 d7,[r2]! @ load inp 102 vld1.64 d6,[r2]! 103#ifdef __ARMEL__ 104 vrev64.8 q3,q3 105#endif 106 veor q3,q0 @ inp^=Xi 107Lgmult_neon: 108 vext.8 d16, d26, d26, #1 @ A1 109 vmull.p8 q8, d16, d6 @ F = A1*B 110 vext.8 d0, d6, d6, #1 @ B1 111 vmull.p8 q0, d26, d0 @ E = A*B1 112 vext.8 d18, d26, d26, #2 @ A2 113 vmull.p8 q9, d18, d6 @ H = A2*B 114 vext.8 d22, d6, d6, #2 @ B2 115 vmull.p8 q11, d26, d22 @ G = A*B2 116 vext.8 d20, d26, d26, #3 @ A3 117 veor q8, q8, q0 @ L = E + F 118 vmull.p8 q10, d20, d6 @ J = A3*B 119 vext.8 d0, d6, d6, #3 @ B3 120 veor q9, q9, q11 @ M = G + H 121 vmull.p8 q0, d26, d0 @ I = A*B3 122 veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 123 vand d17, d17, d29 124 vext.8 d22, d6, d6, #4 @ B4 125 veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 126 vand d19, d19, d30 127 vmull.p8 q11, d26, d22 @ K = A*B4 128 veor q10, q10, q0 @ N = I + J 129 veor d16, d16, d17 130 veor d18, d18, d19 131 veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 132 vand d21, d21, d31 133 vext.8 q8, q8, q8, #15 134 veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 135 vmov.i64 d23, #0 136 vext.8 q9, q9, q9, #14 137 veor d20, d20, d21 138 vmull.p8 q0, d26, d6 @ D = A*B 139 vext.8 q11, q11, q11, #12 140 vext.8 q10, q10, q10, #13 141 veor q8, q8, q9 142 veor q10, q10, q11 143 veor q0, q0, q8 144 veor q0, q0, q10 145 veor d6,d6,d7 @ Karatsuba pre-processing 146 vext.8 d16, d28, d28, #1 @ A1 147 vmull.p8 q8, d16, d6 @ F = A1*B 148 vext.8 d2, d6, d6, #1 @ B1 149 vmull.p8 q1, d28, d2 @ E = A*B1 150 vext.8 d18, d28, d28, #2 @ A2 151 vmull.p8 q9, d18, d6 @ H = A2*B 152 vext.8 d22, d6, d6, #2 @ B2 153 vmull.p8 q11, d28, d22 @ G = A*B2 154 vext.8 d20, d28, d28, #3 @ A3 155 veor q8, q8, q1 @ L = E + F 156 vmull.p8 q10, d20, d6 @ J = A3*B 157 vext.8 d2, d6, d6, #3 @ B3 158 veor q9, q9, q11 @ M = G + H 159 vmull.p8 q1, d28, d2 @ I = A*B3 160 veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 161 vand d17, d17, d29 162 vext.8 d22, d6, d6, #4 @ B4 163 veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 164 vand d19, d19, d30 165 vmull.p8 q11, d28, d22 @ K = A*B4 166 veor q10, q10, q1 @ N = I + J 167 veor d16, d16, d17 168 veor d18, d18, d19 169 veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 170 vand d21, d21, d31 171 vext.8 q8, q8, q8, #15 172 veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 173 vmov.i64 d23, #0 174 vext.8 q9, q9, q9, #14 175 veor d20, d20, d21 176 vmull.p8 q1, d28, d6 @ D = A*B 177 vext.8 q11, q11, q11, #12 178 vext.8 q10, q10, q10, #13 179 veor q8, q8, q9 180 veor q10, q10, q11 181 veor q1, q1, q8 182 veor q1, q1, q10 183 vext.8 d16, d27, d27, #1 @ A1 184 vmull.p8 q8, d16, d7 @ F = A1*B 185 vext.8 d4, d7, d7, #1 @ B1 186 vmull.p8 q2, d27, d4 @ E = A*B1 187 vext.8 d18, d27, d27, #2 @ A2 188 vmull.p8 q9, d18, d7 @ H = A2*B 189 vext.8 d22, d7, d7, #2 @ B2 190 vmull.p8 q11, d27, d22 @ G = A*B2 191 vext.8 d20, d27, d27, #3 @ A3 192 veor q8, q8, q2 @ L = E + F 193 vmull.p8 q10, d20, d7 @ J = A3*B 194 vext.8 d4, d7, d7, #3 @ B3 195 veor q9, q9, q11 @ M = G + H 196 vmull.p8 q2, d27, d4 @ I = A*B3 197 veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 198 vand d17, d17, d29 199 vext.8 d22, d7, d7, #4 @ B4 200 veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 201 vand d19, d19, d30 202 vmull.p8 q11, d27, d22 @ K = A*B4 203 veor q10, q10, q2 @ N = I + J 204 veor d16, d16, d17 205 veor d18, d18, d19 206 veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 207 vand d21, d21, d31 208 vext.8 q8, q8, q8, #15 209 veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 210 vmov.i64 d23, #0 211 vext.8 q9, q9, q9, #14 212 veor d20, d20, d21 213 vmull.p8 q2, d27, d7 @ D = A*B 214 vext.8 q11, q11, q11, #12 215 vext.8 q10, q10, q10, #13 216 veor q8, q8, q9 217 veor q10, q10, q11 218 veor q2, q2, q8 219 veor q2, q2, q10 220 veor q1,q1,q0 @ Karatsuba post-processing 221 veor q1,q1,q2 222 veor d1,d1,d2 223 veor d4,d4,d3 @ Xh|Xl - 256-bit result 224 225 @ equivalent of reduction_avx from ghash-x86_64.pl 226 vshl.i64 q9,q0,#57 @ 1st phase 227 vshl.i64 q10,q0,#62 228 veor q10,q10,q9 @ 229 vshl.i64 q9,q0,#63 230 veor q10, q10, q9 @ 231 veor d1,d1,d20 @ 232 veor d4,d4,d21 233 234 vshr.u64 q10,q0,#1 @ 2nd phase 235 veor q2,q2,q0 236 veor q0,q0,q10 @ 237 vshr.u64 q10,q10,#6 238 vshr.u64 q0,q0,#1 @ 239 veor q0,q0,q2 @ 240 veor q0,q0,q10 @ 241 242 subs r3,#16 243 bne Loop_neon 244 245#ifdef __ARMEL__ 246 vrev64.8 q0,q0 247#endif 248 sub r0,#16 249 vst1.64 d1,[r0]! @ write out Xi 250 vst1.64 d0,[r0] 251 252 bx lr @ bx lr 253 254#endif 255.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 256.align 2 257.align 2 258#endif // !OPENSSL_NO_ASM 259