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