1*8fb009dcSAndroid Build Coastguard Worker// This file is generated from a similarly-named Perl script in the BoringSSL 2*8fb009dcSAndroid Build Coastguard Worker// source tree. Do not edit by hand. 3*8fb009dcSAndroid Build Coastguard Worker 4*8fb009dcSAndroid Build Coastguard Worker#include <openssl/asm_base.h> 5*8fb009dcSAndroid Build Coastguard Worker 6*8fb009dcSAndroid Build Coastguard Worker#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_AARCH64) && defined(__ELF__) 7*8fb009dcSAndroid Build Coastguard Worker#include <openssl/arm_arch.h> 8*8fb009dcSAndroid Build Coastguard Worker 9*8fb009dcSAndroid Build Coastguard Worker#if __ARM_MAX_ARCH__>=7 10*8fb009dcSAndroid Build Coastguard Worker.text 11*8fb009dcSAndroid Build Coastguard Worker.arch armv8-a+crypto 12*8fb009dcSAndroid Build Coastguard Worker.globl gcm_init_v8 13*8fb009dcSAndroid Build Coastguard Worker.hidden gcm_init_v8 14*8fb009dcSAndroid Build Coastguard Worker.type gcm_init_v8,%function 15*8fb009dcSAndroid Build Coastguard Worker.align 4 16*8fb009dcSAndroid Build Coastguard Workergcm_init_v8: 17*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 18*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.2d},[x1] //load input H 19*8fb009dcSAndroid Build Coastguard Worker movi v19.16b,#0xe1 20*8fb009dcSAndroid Build Coastguard Worker shl v19.2d,v19.2d,#57 //0xc2.0 21*8fb009dcSAndroid Build Coastguard Worker ext v3.16b,v17.16b,v17.16b,#8 22*8fb009dcSAndroid Build Coastguard Worker ushr v18.2d,v19.2d,#63 23*8fb009dcSAndroid Build Coastguard Worker dup v17.4s,v17.s[1] 24*8fb009dcSAndroid Build Coastguard Worker ext v16.16b,v18.16b,v19.16b,#8 //t0=0xc2....01 25*8fb009dcSAndroid Build Coastguard Worker ushr v18.2d,v3.2d,#63 26*8fb009dcSAndroid Build Coastguard Worker sshr v17.4s,v17.4s,#31 //broadcast carry bit 27*8fb009dcSAndroid Build Coastguard Worker and v18.16b,v18.16b,v16.16b 28*8fb009dcSAndroid Build Coastguard Worker shl v3.2d,v3.2d,#1 29*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v18.16b,v18.16b,#8 30*8fb009dcSAndroid Build Coastguard Worker and v16.16b,v16.16b,v17.16b 31*8fb009dcSAndroid Build Coastguard Worker orr v3.16b,v3.16b,v18.16b //H<<<=1 32*8fb009dcSAndroid Build Coastguard Worker eor v20.16b,v3.16b,v16.16b //twisted H 33*8fb009dcSAndroid Build Coastguard Worker st1 {v20.2d},[x0],#16 //store Htable[0] 34*8fb009dcSAndroid Build Coastguard Worker 35*8fb009dcSAndroid Build Coastguard Worker //calculate H^2 36*8fb009dcSAndroid Build Coastguard Worker ext v16.16b,v20.16b,v20.16b,#8 //Karatsuba pre-processing 37*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v20.1d,v20.1d 38*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v16.16b,v20.16b 39*8fb009dcSAndroid Build Coastguard Worker pmull2 v2.1q,v20.2d,v20.2d 40*8fb009dcSAndroid Build Coastguard Worker pmull v1.1q,v16.1d,v16.1d 41*8fb009dcSAndroid Build Coastguard Worker 42*8fb009dcSAndroid Build Coastguard Worker ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing 43*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v0.16b,v2.16b 44*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v17.16b 45*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v18.16b 46*8fb009dcSAndroid Build Coastguard Worker pmull v18.1q,v0.1d,v19.1d //1st phase 47*8fb009dcSAndroid Build Coastguard Worker 48*8fb009dcSAndroid Build Coastguard Worker ins v2.d[0],v1.d[1] 49*8fb009dcSAndroid Build Coastguard Worker ins v1.d[1],v0.d[0] 50*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v1.16b,v18.16b 51*8fb009dcSAndroid Build Coastguard Worker 52*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v0.16b,v0.16b,#8 //2nd phase 53*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v0.1d,v19.1d 54*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v18.16b,v2.16b 55*8fb009dcSAndroid Build Coastguard Worker eor v22.16b,v0.16b,v18.16b 56*8fb009dcSAndroid Build Coastguard Worker 57*8fb009dcSAndroid Build Coastguard Worker ext v17.16b,v22.16b,v22.16b,#8 //Karatsuba pre-processing 58*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v17.16b,v22.16b 59*8fb009dcSAndroid Build Coastguard Worker ext v21.16b,v16.16b,v17.16b,#8 //pack Karatsuba pre-processed 60*8fb009dcSAndroid Build Coastguard Worker st1 {v21.2d,v22.2d},[x0],#32 //store Htable[1..2] 61*8fb009dcSAndroid Build Coastguard Worker //calculate H^3 and H^4 62*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v20.1d, v22.1d 63*8fb009dcSAndroid Build Coastguard Worker pmull v5.1q,v22.1d,v22.1d 64*8fb009dcSAndroid Build Coastguard Worker pmull2 v2.1q,v20.2d, v22.2d 65*8fb009dcSAndroid Build Coastguard Worker pmull2 v7.1q,v22.2d,v22.2d 66*8fb009dcSAndroid Build Coastguard Worker pmull v1.1q,v16.1d,v17.1d 67*8fb009dcSAndroid Build Coastguard Worker pmull v6.1q,v17.1d,v17.1d 68*8fb009dcSAndroid Build Coastguard Worker 69*8fb009dcSAndroid Build Coastguard Worker ext v16.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing 70*8fb009dcSAndroid Build Coastguard Worker ext v17.16b,v5.16b,v7.16b,#8 71*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v0.16b,v2.16b 72*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v16.16b 73*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v5.16b,v7.16b 74*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v17.16b 75*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v18.16b 76*8fb009dcSAndroid Build Coastguard Worker pmull v18.1q,v0.1d,v19.1d //1st phase 77*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v4.16b 78*8fb009dcSAndroid Build Coastguard Worker pmull v4.1q,v5.1d,v19.1d 79*8fb009dcSAndroid Build Coastguard Worker 80*8fb009dcSAndroid Build Coastguard Worker ins v2.d[0],v1.d[1] 81*8fb009dcSAndroid Build Coastguard Worker ins v7.d[0],v6.d[1] 82*8fb009dcSAndroid Build Coastguard Worker ins v1.d[1],v0.d[0] 83*8fb009dcSAndroid Build Coastguard Worker ins v6.d[1],v5.d[0] 84*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v1.16b,v18.16b 85*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v6.16b,v4.16b 86*8fb009dcSAndroid Build Coastguard Worker 87*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v0.16b,v0.16b,#8 //2nd phase 88*8fb009dcSAndroid Build Coastguard Worker ext v4.16b,v5.16b,v5.16b,#8 89*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v0.1d,v19.1d 90*8fb009dcSAndroid Build Coastguard Worker pmull v5.1q,v5.1d,v19.1d 91*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v18.16b,v2.16b 92*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v7.16b 93*8fb009dcSAndroid Build Coastguard Worker eor v20.16b, v0.16b,v18.16b //H^3 94*8fb009dcSAndroid Build Coastguard Worker eor v22.16b,v5.16b,v4.16b //H^4 95*8fb009dcSAndroid Build Coastguard Worker 96*8fb009dcSAndroid Build Coastguard Worker ext v16.16b,v20.16b, v20.16b,#8 //Karatsuba pre-processing 97*8fb009dcSAndroid Build Coastguard Worker ext v17.16b,v22.16b,v22.16b,#8 98*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v16.16b,v20.16b 99*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v17.16b,v22.16b 100*8fb009dcSAndroid Build Coastguard Worker ext v21.16b,v16.16b,v17.16b,#8 //pack Karatsuba pre-processed 101*8fb009dcSAndroid Build Coastguard Worker st1 {v20.2d,v21.2d,v22.2d},[x0] //store Htable[3..5] 102*8fb009dcSAndroid Build Coastguard Worker ret 103*8fb009dcSAndroid Build Coastguard Worker.size gcm_init_v8,.-gcm_init_v8 104*8fb009dcSAndroid Build Coastguard Worker.globl gcm_gmult_v8 105*8fb009dcSAndroid Build Coastguard Worker.hidden gcm_gmult_v8 106*8fb009dcSAndroid Build Coastguard Worker.type gcm_gmult_v8,%function 107*8fb009dcSAndroid Build Coastguard Worker.align 4 108*8fb009dcSAndroid Build Coastguard Workergcm_gmult_v8: 109*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 110*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.2d},[x0] //load Xi 111*8fb009dcSAndroid Build Coastguard Worker movi v19.16b,#0xe1 112*8fb009dcSAndroid Build Coastguard Worker ld1 {v20.2d,v21.2d},[x1] //load twisted H, ... 113*8fb009dcSAndroid Build Coastguard Worker shl v19.2d,v19.2d,#57 114*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 115*8fb009dcSAndroid Build Coastguard Worker rev64 v17.16b,v17.16b 116*8fb009dcSAndroid Build Coastguard Worker#endif 117*8fb009dcSAndroid Build Coastguard Worker ext v3.16b,v17.16b,v17.16b,#8 118*8fb009dcSAndroid Build Coastguard Worker 119*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v20.1d,v3.1d //H.lo·Xi.lo 120*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v17.16b,v3.16b //Karatsuba pre-processing 121*8fb009dcSAndroid Build Coastguard Worker pmull2 v2.1q,v20.2d,v3.2d //H.hi·Xi.hi 122*8fb009dcSAndroid Build Coastguard Worker pmull v1.1q,v21.1d,v17.1d //(H.lo+H.hi)·(Xi.lo+Xi.hi) 123*8fb009dcSAndroid Build Coastguard Worker 124*8fb009dcSAndroid Build Coastguard Worker ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing 125*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v0.16b,v2.16b 126*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v17.16b 127*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v18.16b 128*8fb009dcSAndroid Build Coastguard Worker pmull v18.1q,v0.1d,v19.1d //1st phase of reduction 129*8fb009dcSAndroid Build Coastguard Worker 130*8fb009dcSAndroid Build Coastguard Worker ins v2.d[0],v1.d[1] 131*8fb009dcSAndroid Build Coastguard Worker ins v1.d[1],v0.d[0] 132*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v1.16b,v18.16b 133*8fb009dcSAndroid Build Coastguard Worker 134*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction 135*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v0.1d,v19.1d 136*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v18.16b,v2.16b 137*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v18.16b 138*8fb009dcSAndroid Build Coastguard Worker 139*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 140*8fb009dcSAndroid Build Coastguard Worker rev64 v0.16b,v0.16b 141*8fb009dcSAndroid Build Coastguard Worker#endif 142*8fb009dcSAndroid Build Coastguard Worker ext v0.16b,v0.16b,v0.16b,#8 143*8fb009dcSAndroid Build Coastguard Worker st1 {v0.2d},[x0] //write out Xi 144*8fb009dcSAndroid Build Coastguard Worker 145*8fb009dcSAndroid Build Coastguard Worker ret 146*8fb009dcSAndroid Build Coastguard Worker.size gcm_gmult_v8,.-gcm_gmult_v8 147*8fb009dcSAndroid Build Coastguard Worker.globl gcm_ghash_v8 148*8fb009dcSAndroid Build Coastguard Worker.hidden gcm_ghash_v8 149*8fb009dcSAndroid Build Coastguard Worker.type gcm_ghash_v8,%function 150*8fb009dcSAndroid Build Coastguard Worker.align 4 151*8fb009dcSAndroid Build Coastguard Workergcm_ghash_v8: 152*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 153*8fb009dcSAndroid Build Coastguard Worker cmp x3,#64 154*8fb009dcSAndroid Build Coastguard Worker b.hs .Lgcm_ghash_v8_4x 155*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.2d},[x0] //load [rotated] Xi 156*8fb009dcSAndroid Build Coastguard Worker //"[rotated]" means that 157*8fb009dcSAndroid Build Coastguard Worker //loaded value would have 158*8fb009dcSAndroid Build Coastguard Worker //to be rotated in order to 159*8fb009dcSAndroid Build Coastguard Worker //make it appear as in 160*8fb009dcSAndroid Build Coastguard Worker //algorithm specification 161*8fb009dcSAndroid Build Coastguard Worker subs x3,x3,#32 //see if x3 is 32 or larger 162*8fb009dcSAndroid Build Coastguard Worker mov x12,#16 //x12 is used as post- 163*8fb009dcSAndroid Build Coastguard Worker //increment for input pointer; 164*8fb009dcSAndroid Build Coastguard Worker //as loop is modulo-scheduled 165*8fb009dcSAndroid Build Coastguard Worker //x12 is zeroed just in time 166*8fb009dcSAndroid Build Coastguard Worker //to preclude overstepping 167*8fb009dcSAndroid Build Coastguard Worker //inp[len], which means that 168*8fb009dcSAndroid Build Coastguard Worker //last block[s] are actually 169*8fb009dcSAndroid Build Coastguard Worker //loaded twice, but last 170*8fb009dcSAndroid Build Coastguard Worker //copy is not processed 171*8fb009dcSAndroid Build Coastguard Worker ld1 {v20.2d,v21.2d},[x1],#32 //load twisted H, ..., H^2 172*8fb009dcSAndroid Build Coastguard Worker movi v19.16b,#0xe1 173*8fb009dcSAndroid Build Coastguard Worker ld1 {v22.2d},[x1] 174*8fb009dcSAndroid Build Coastguard Worker csel x12,xzr,x12,eq //is it time to zero x12? 175*8fb009dcSAndroid Build Coastguard Worker ext v0.16b,v0.16b,v0.16b,#8 //rotate Xi 176*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.2d},[x2],#16 //load [rotated] I[0] 177*8fb009dcSAndroid Build Coastguard Worker shl v19.2d,v19.2d,#57 //compose 0xc2.0 constant 178*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 179*8fb009dcSAndroid Build Coastguard Worker rev64 v16.16b,v16.16b 180*8fb009dcSAndroid Build Coastguard Worker rev64 v0.16b,v0.16b 181*8fb009dcSAndroid Build Coastguard Worker#endif 182*8fb009dcSAndroid Build Coastguard Worker ext v3.16b,v16.16b,v16.16b,#8 //rotate I[0] 183*8fb009dcSAndroid Build Coastguard Worker b.lo .Lodd_tail_v8 //x3 was less than 32 184*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.2d},[x2],x12 //load [rotated] I[1] 185*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 186*8fb009dcSAndroid Build Coastguard Worker rev64 v17.16b,v17.16b 187*8fb009dcSAndroid Build Coastguard Worker#endif 188*8fb009dcSAndroid Build Coastguard Worker ext v7.16b,v17.16b,v17.16b,#8 189*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v0.16b //I[i]^=Xi 190*8fb009dcSAndroid Build Coastguard Worker pmull v4.1q,v20.1d,v7.1d //H·Ii+1 191*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v17.16b,v7.16b //Karatsuba pre-processing 192*8fb009dcSAndroid Build Coastguard Worker pmull2 v6.1q,v20.2d,v7.2d 193*8fb009dcSAndroid Build Coastguard Worker b .Loop_mod2x_v8 194*8fb009dcSAndroid Build Coastguard Worker 195*8fb009dcSAndroid Build Coastguard Worker.align 4 196*8fb009dcSAndroid Build Coastguard Worker.Loop_mod2x_v8: 197*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v3.16b,v3.16b,#8 198*8fb009dcSAndroid Build Coastguard Worker subs x3,x3,#32 //is there more data? 199*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v22.1d,v3.1d //H^2.lo·Xi.lo 200*8fb009dcSAndroid Build Coastguard Worker csel x12,xzr,x12,lo //is it time to zero x12? 201*8fb009dcSAndroid Build Coastguard Worker 202*8fb009dcSAndroid Build Coastguard Worker pmull v5.1q,v21.1d,v17.1d 203*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v18.16b,v3.16b //Karatsuba pre-processing 204*8fb009dcSAndroid Build Coastguard Worker pmull2 v2.1q,v22.2d,v3.2d //H^2.hi·Xi.hi 205*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v4.16b //accumulate 206*8fb009dcSAndroid Build Coastguard Worker pmull2 v1.1q,v21.2d,v18.2d //(H^2.lo+H^2.hi)·(Xi.lo+Xi.hi) 207*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.2d},[x2],x12 //load [rotated] I[i+2] 208*8fb009dcSAndroid Build Coastguard Worker 209*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v6.16b 210*8fb009dcSAndroid Build Coastguard Worker csel x12,xzr,x12,eq //is it time to zero x12? 211*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v5.16b 212*8fb009dcSAndroid Build Coastguard Worker 213*8fb009dcSAndroid Build Coastguard Worker ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing 214*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v0.16b,v2.16b 215*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v17.16b 216*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.2d},[x2],x12 //load [rotated] I[i+3] 217*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 218*8fb009dcSAndroid Build Coastguard Worker rev64 v16.16b,v16.16b 219*8fb009dcSAndroid Build Coastguard Worker#endif 220*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v18.16b 221*8fb009dcSAndroid Build Coastguard Worker pmull v18.1q,v0.1d,v19.1d //1st phase of reduction 222*8fb009dcSAndroid Build Coastguard Worker 223*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 224*8fb009dcSAndroid Build Coastguard Worker rev64 v17.16b,v17.16b 225*8fb009dcSAndroid Build Coastguard Worker#endif 226*8fb009dcSAndroid Build Coastguard Worker ins v2.d[0],v1.d[1] 227*8fb009dcSAndroid Build Coastguard Worker ins v1.d[1],v0.d[0] 228*8fb009dcSAndroid Build Coastguard Worker ext v7.16b,v17.16b,v17.16b,#8 229*8fb009dcSAndroid Build Coastguard Worker ext v3.16b,v16.16b,v16.16b,#8 230*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v1.16b,v18.16b 231*8fb009dcSAndroid Build Coastguard Worker pmull v4.1q,v20.1d,v7.1d //H·Ii+1 232*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v2.16b //accumulate v3.16b early 233*8fb009dcSAndroid Build Coastguard Worker 234*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction 235*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v0.1d,v19.1d 236*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v18.16b 237*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v17.16b,v7.16b //Karatsuba pre-processing 238*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v0.16b 239*8fb009dcSAndroid Build Coastguard Worker pmull2 v6.1q,v20.2d,v7.2d 240*8fb009dcSAndroid Build Coastguard Worker b.hs .Loop_mod2x_v8 //there was at least 32 more bytes 241*8fb009dcSAndroid Build Coastguard Worker 242*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v18.16b 243*8fb009dcSAndroid Build Coastguard Worker ext v3.16b,v16.16b,v16.16b,#8 //re-construct v3.16b 244*8fb009dcSAndroid Build Coastguard Worker adds x3,x3,#32 //re-construct x3 245*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v2.16b //re-construct v0.16b 246*8fb009dcSAndroid Build Coastguard Worker b.eq .Ldone_v8 //is x3 zero? 247*8fb009dcSAndroid Build Coastguard Worker.Lodd_tail_v8: 248*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v0.16b,v0.16b,#8 249*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v0.16b //inp^=Xi 250*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v16.16b,v18.16b //v17.16b is rotated inp^Xi 251*8fb009dcSAndroid Build Coastguard Worker 252*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v20.1d,v3.1d //H.lo·Xi.lo 253*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v17.16b,v3.16b //Karatsuba pre-processing 254*8fb009dcSAndroid Build Coastguard Worker pmull2 v2.1q,v20.2d,v3.2d //H.hi·Xi.hi 255*8fb009dcSAndroid Build Coastguard Worker pmull v1.1q,v21.1d,v17.1d //(H.lo+H.hi)·(Xi.lo+Xi.hi) 256*8fb009dcSAndroid Build Coastguard Worker 257*8fb009dcSAndroid Build Coastguard Worker ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing 258*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v0.16b,v2.16b 259*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v17.16b 260*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v18.16b 261*8fb009dcSAndroid Build Coastguard Worker pmull v18.1q,v0.1d,v19.1d //1st phase of reduction 262*8fb009dcSAndroid Build Coastguard Worker 263*8fb009dcSAndroid Build Coastguard Worker ins v2.d[0],v1.d[1] 264*8fb009dcSAndroid Build Coastguard Worker ins v1.d[1],v0.d[0] 265*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v1.16b,v18.16b 266*8fb009dcSAndroid Build Coastguard Worker 267*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction 268*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v0.1d,v19.1d 269*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v18.16b,v2.16b 270*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v18.16b 271*8fb009dcSAndroid Build Coastguard Worker 272*8fb009dcSAndroid Build Coastguard Worker.Ldone_v8: 273*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 274*8fb009dcSAndroid Build Coastguard Worker rev64 v0.16b,v0.16b 275*8fb009dcSAndroid Build Coastguard Worker#endif 276*8fb009dcSAndroid Build Coastguard Worker ext v0.16b,v0.16b,v0.16b,#8 277*8fb009dcSAndroid Build Coastguard Worker st1 {v0.2d},[x0] //write out Xi 278*8fb009dcSAndroid Build Coastguard Worker 279*8fb009dcSAndroid Build Coastguard Worker ret 280*8fb009dcSAndroid Build Coastguard Worker.size gcm_ghash_v8,.-gcm_ghash_v8 281*8fb009dcSAndroid Build Coastguard Worker.type gcm_ghash_v8_4x,%function 282*8fb009dcSAndroid Build Coastguard Worker.align 4 283*8fb009dcSAndroid Build Coastguard Workergcm_ghash_v8_4x: 284*8fb009dcSAndroid Build Coastguard Worker.Lgcm_ghash_v8_4x: 285*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.2d},[x0] //load [rotated] Xi 286*8fb009dcSAndroid Build Coastguard Worker ld1 {v20.2d,v21.2d,v22.2d},[x1],#48 //load twisted H, ..., H^2 287*8fb009dcSAndroid Build Coastguard Worker movi v19.16b,#0xe1 288*8fb009dcSAndroid Build Coastguard Worker ld1 {v26.2d,v27.2d,v28.2d},[x1] //load twisted H^3, ..., H^4 289*8fb009dcSAndroid Build Coastguard Worker shl v19.2d,v19.2d,#57 //compose 0xc2.0 constant 290*8fb009dcSAndroid Build Coastguard Worker 291*8fb009dcSAndroid Build Coastguard Worker ld1 {v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64 292*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 293*8fb009dcSAndroid Build Coastguard Worker rev64 v0.16b,v0.16b 294*8fb009dcSAndroid Build Coastguard Worker rev64 v5.16b,v5.16b 295*8fb009dcSAndroid Build Coastguard Worker rev64 v6.16b,v6.16b 296*8fb009dcSAndroid Build Coastguard Worker rev64 v7.16b,v7.16b 297*8fb009dcSAndroid Build Coastguard Worker rev64 v4.16b,v4.16b 298*8fb009dcSAndroid Build Coastguard Worker#endif 299*8fb009dcSAndroid Build Coastguard Worker ext v25.16b,v7.16b,v7.16b,#8 300*8fb009dcSAndroid Build Coastguard Worker ext v24.16b,v6.16b,v6.16b,#8 301*8fb009dcSAndroid Build Coastguard Worker ext v23.16b,v5.16b,v5.16b,#8 302*8fb009dcSAndroid Build Coastguard Worker 303*8fb009dcSAndroid Build Coastguard Worker pmull v29.1q,v20.1d,v25.1d //H·Ii+3 304*8fb009dcSAndroid Build Coastguard Worker eor v7.16b,v7.16b,v25.16b 305*8fb009dcSAndroid Build Coastguard Worker pmull2 v31.1q,v20.2d,v25.2d 306*8fb009dcSAndroid Build Coastguard Worker pmull v30.1q,v21.1d,v7.1d 307*8fb009dcSAndroid Build Coastguard Worker 308*8fb009dcSAndroid Build Coastguard Worker pmull v16.1q,v22.1d,v24.1d //H^2·Ii+2 309*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v24.16b 310*8fb009dcSAndroid Build Coastguard Worker pmull2 v24.1q,v22.2d,v24.2d 311*8fb009dcSAndroid Build Coastguard Worker pmull2 v6.1q,v21.2d,v6.2d 312*8fb009dcSAndroid Build Coastguard Worker 313*8fb009dcSAndroid Build Coastguard Worker eor v29.16b,v29.16b,v16.16b 314*8fb009dcSAndroid Build Coastguard Worker eor v31.16b,v31.16b,v24.16b 315*8fb009dcSAndroid Build Coastguard Worker eor v30.16b,v30.16b,v6.16b 316*8fb009dcSAndroid Build Coastguard Worker 317*8fb009dcSAndroid Build Coastguard Worker pmull v7.1q,v26.1d,v23.1d //H^3·Ii+1 318*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v5.16b,v23.16b 319*8fb009dcSAndroid Build Coastguard Worker pmull2 v23.1q,v26.2d,v23.2d 320*8fb009dcSAndroid Build Coastguard Worker pmull v5.1q,v27.1d,v5.1d 321*8fb009dcSAndroid Build Coastguard Worker 322*8fb009dcSAndroid Build Coastguard Worker eor v29.16b,v29.16b,v7.16b 323*8fb009dcSAndroid Build Coastguard Worker eor v31.16b,v31.16b,v23.16b 324*8fb009dcSAndroid Build Coastguard Worker eor v30.16b,v30.16b,v5.16b 325*8fb009dcSAndroid Build Coastguard Worker 326*8fb009dcSAndroid Build Coastguard Worker subs x3,x3,#128 327*8fb009dcSAndroid Build Coastguard Worker b.lo .Ltail4x 328*8fb009dcSAndroid Build Coastguard Worker 329*8fb009dcSAndroid Build Coastguard Worker b .Loop4x 330*8fb009dcSAndroid Build Coastguard Worker 331*8fb009dcSAndroid Build Coastguard Worker.align 4 332*8fb009dcSAndroid Build Coastguard Worker.Loop4x: 333*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v4.16b,v0.16b 334*8fb009dcSAndroid Build Coastguard Worker ld1 {v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64 335*8fb009dcSAndroid Build Coastguard Worker ext v3.16b,v16.16b,v16.16b,#8 336*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 337*8fb009dcSAndroid Build Coastguard Worker rev64 v5.16b,v5.16b 338*8fb009dcSAndroid Build Coastguard Worker rev64 v6.16b,v6.16b 339*8fb009dcSAndroid Build Coastguard Worker rev64 v7.16b,v7.16b 340*8fb009dcSAndroid Build Coastguard Worker rev64 v4.16b,v4.16b 341*8fb009dcSAndroid Build Coastguard Worker#endif 342*8fb009dcSAndroid Build Coastguard Worker 343*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v28.1d,v3.1d //H^4·(Xi+Ii) 344*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v16.16b,v3.16b 345*8fb009dcSAndroid Build Coastguard Worker pmull2 v2.1q,v28.2d,v3.2d 346*8fb009dcSAndroid Build Coastguard Worker ext v25.16b,v7.16b,v7.16b,#8 347*8fb009dcSAndroid Build Coastguard Worker pmull2 v1.1q,v27.2d,v16.2d 348*8fb009dcSAndroid Build Coastguard Worker 349*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v29.16b 350*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v31.16b 351*8fb009dcSAndroid Build Coastguard Worker ext v24.16b,v6.16b,v6.16b,#8 352*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v30.16b 353*8fb009dcSAndroid Build Coastguard Worker ext v23.16b,v5.16b,v5.16b,#8 354*8fb009dcSAndroid Build Coastguard Worker 355*8fb009dcSAndroid Build Coastguard Worker ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing 356*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v0.16b,v2.16b 357*8fb009dcSAndroid Build Coastguard Worker pmull v29.1q,v20.1d,v25.1d //H·Ii+3 358*8fb009dcSAndroid Build Coastguard Worker eor v7.16b,v7.16b,v25.16b 359*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v17.16b 360*8fb009dcSAndroid Build Coastguard Worker pmull2 v31.1q,v20.2d,v25.2d 361*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v18.16b 362*8fb009dcSAndroid Build Coastguard Worker pmull v30.1q,v21.1d,v7.1d 363*8fb009dcSAndroid Build Coastguard Worker 364*8fb009dcSAndroid Build Coastguard Worker pmull v18.1q,v0.1d,v19.1d //1st phase of reduction 365*8fb009dcSAndroid Build Coastguard Worker ins v2.d[0],v1.d[1] 366*8fb009dcSAndroid Build Coastguard Worker ins v1.d[1],v0.d[0] 367*8fb009dcSAndroid Build Coastguard Worker pmull v16.1q,v22.1d,v24.1d //H^2·Ii+2 368*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v24.16b 369*8fb009dcSAndroid Build Coastguard Worker pmull2 v24.1q,v22.2d,v24.2d 370*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v1.16b,v18.16b 371*8fb009dcSAndroid Build Coastguard Worker pmull2 v6.1q,v21.2d,v6.2d 372*8fb009dcSAndroid Build Coastguard Worker 373*8fb009dcSAndroid Build Coastguard Worker eor v29.16b,v29.16b,v16.16b 374*8fb009dcSAndroid Build Coastguard Worker eor v31.16b,v31.16b,v24.16b 375*8fb009dcSAndroid Build Coastguard Worker eor v30.16b,v30.16b,v6.16b 376*8fb009dcSAndroid Build Coastguard Worker 377*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction 378*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v0.1d,v19.1d 379*8fb009dcSAndroid Build Coastguard Worker pmull v7.1q,v26.1d,v23.1d //H^3·Ii+1 380*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v5.16b,v23.16b 381*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v18.16b,v2.16b 382*8fb009dcSAndroid Build Coastguard Worker pmull2 v23.1q,v26.2d,v23.2d 383*8fb009dcSAndroid Build Coastguard Worker pmull v5.1q,v27.1d,v5.1d 384*8fb009dcSAndroid Build Coastguard Worker 385*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v18.16b 386*8fb009dcSAndroid Build Coastguard Worker eor v29.16b,v29.16b,v7.16b 387*8fb009dcSAndroid Build Coastguard Worker eor v31.16b,v31.16b,v23.16b 388*8fb009dcSAndroid Build Coastguard Worker ext v0.16b,v0.16b,v0.16b,#8 389*8fb009dcSAndroid Build Coastguard Worker eor v30.16b,v30.16b,v5.16b 390*8fb009dcSAndroid Build Coastguard Worker 391*8fb009dcSAndroid Build Coastguard Worker subs x3,x3,#64 392*8fb009dcSAndroid Build Coastguard Worker b.hs .Loop4x 393*8fb009dcSAndroid Build Coastguard Worker 394*8fb009dcSAndroid Build Coastguard Worker.Ltail4x: 395*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v4.16b,v0.16b 396*8fb009dcSAndroid Build Coastguard Worker ext v3.16b,v16.16b,v16.16b,#8 397*8fb009dcSAndroid Build Coastguard Worker 398*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v28.1d,v3.1d //H^4·(Xi+Ii) 399*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v16.16b,v3.16b 400*8fb009dcSAndroid Build Coastguard Worker pmull2 v2.1q,v28.2d,v3.2d 401*8fb009dcSAndroid Build Coastguard Worker pmull2 v1.1q,v27.2d,v16.2d 402*8fb009dcSAndroid Build Coastguard Worker 403*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v29.16b 404*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v31.16b 405*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v30.16b 406*8fb009dcSAndroid Build Coastguard Worker 407*8fb009dcSAndroid Build Coastguard Worker adds x3,x3,#64 408*8fb009dcSAndroid Build Coastguard Worker b.eq .Ldone4x 409*8fb009dcSAndroid Build Coastguard Worker 410*8fb009dcSAndroid Build Coastguard Worker cmp x3,#32 411*8fb009dcSAndroid Build Coastguard Worker b.lo .Lone 412*8fb009dcSAndroid Build Coastguard Worker b.eq .Ltwo 413*8fb009dcSAndroid Build Coastguard Worker.Lthree: 414*8fb009dcSAndroid Build Coastguard Worker ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing 415*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v0.16b,v2.16b 416*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v17.16b 417*8fb009dcSAndroid Build Coastguard Worker ld1 {v4.2d,v5.2d,v6.2d},[x2] 418*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v18.16b 419*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 420*8fb009dcSAndroid Build Coastguard Worker rev64 v5.16b,v5.16b 421*8fb009dcSAndroid Build Coastguard Worker rev64 v6.16b,v6.16b 422*8fb009dcSAndroid Build Coastguard Worker rev64 v4.16b,v4.16b 423*8fb009dcSAndroid Build Coastguard Worker#endif 424*8fb009dcSAndroid Build Coastguard Worker 425*8fb009dcSAndroid Build Coastguard Worker pmull v18.1q,v0.1d,v19.1d //1st phase of reduction 426*8fb009dcSAndroid Build Coastguard Worker ins v2.d[0],v1.d[1] 427*8fb009dcSAndroid Build Coastguard Worker ins v1.d[1],v0.d[0] 428*8fb009dcSAndroid Build Coastguard Worker ext v24.16b,v6.16b,v6.16b,#8 429*8fb009dcSAndroid Build Coastguard Worker ext v23.16b,v5.16b,v5.16b,#8 430*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v1.16b,v18.16b 431*8fb009dcSAndroid Build Coastguard Worker 432*8fb009dcSAndroid Build Coastguard Worker pmull v29.1q,v20.1d,v24.1d //H·Ii+2 433*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v24.16b 434*8fb009dcSAndroid Build Coastguard Worker 435*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction 436*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v0.1d,v19.1d 437*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v18.16b,v2.16b 438*8fb009dcSAndroid Build Coastguard Worker pmull2 v31.1q,v20.2d,v24.2d 439*8fb009dcSAndroid Build Coastguard Worker pmull v30.1q,v21.1d,v6.1d 440*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v18.16b 441*8fb009dcSAndroid Build Coastguard Worker pmull v7.1q,v22.1d,v23.1d //H^2·Ii+1 442*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v5.16b,v23.16b 443*8fb009dcSAndroid Build Coastguard Worker ext v0.16b,v0.16b,v0.16b,#8 444*8fb009dcSAndroid Build Coastguard Worker 445*8fb009dcSAndroid Build Coastguard Worker pmull2 v23.1q,v22.2d,v23.2d 446*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v4.16b,v0.16b 447*8fb009dcSAndroid Build Coastguard Worker pmull2 v5.1q,v21.2d,v5.2d 448*8fb009dcSAndroid Build Coastguard Worker ext v3.16b,v16.16b,v16.16b,#8 449*8fb009dcSAndroid Build Coastguard Worker 450*8fb009dcSAndroid Build Coastguard Worker eor v29.16b,v29.16b,v7.16b 451*8fb009dcSAndroid Build Coastguard Worker eor v31.16b,v31.16b,v23.16b 452*8fb009dcSAndroid Build Coastguard Worker eor v30.16b,v30.16b,v5.16b 453*8fb009dcSAndroid Build Coastguard Worker 454*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v26.1d,v3.1d //H^3·(Xi+Ii) 455*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v16.16b,v3.16b 456*8fb009dcSAndroid Build Coastguard Worker pmull2 v2.1q,v26.2d,v3.2d 457*8fb009dcSAndroid Build Coastguard Worker pmull v1.1q,v27.1d,v16.1d 458*8fb009dcSAndroid Build Coastguard Worker 459*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v29.16b 460*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v31.16b 461*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v30.16b 462*8fb009dcSAndroid Build Coastguard Worker b .Ldone4x 463*8fb009dcSAndroid Build Coastguard Worker 464*8fb009dcSAndroid Build Coastguard Worker.align 4 465*8fb009dcSAndroid Build Coastguard Worker.Ltwo: 466*8fb009dcSAndroid Build Coastguard Worker ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing 467*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v0.16b,v2.16b 468*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v17.16b 469*8fb009dcSAndroid Build Coastguard Worker ld1 {v4.2d,v5.2d},[x2] 470*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v18.16b 471*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 472*8fb009dcSAndroid Build Coastguard Worker rev64 v5.16b,v5.16b 473*8fb009dcSAndroid Build Coastguard Worker rev64 v4.16b,v4.16b 474*8fb009dcSAndroid Build Coastguard Worker#endif 475*8fb009dcSAndroid Build Coastguard Worker 476*8fb009dcSAndroid Build Coastguard Worker pmull v18.1q,v0.1d,v19.1d //1st phase of reduction 477*8fb009dcSAndroid Build Coastguard Worker ins v2.d[0],v1.d[1] 478*8fb009dcSAndroid Build Coastguard Worker ins v1.d[1],v0.d[0] 479*8fb009dcSAndroid Build Coastguard Worker ext v23.16b,v5.16b,v5.16b,#8 480*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v1.16b,v18.16b 481*8fb009dcSAndroid Build Coastguard Worker 482*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction 483*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v0.1d,v19.1d 484*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v18.16b,v2.16b 485*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v18.16b 486*8fb009dcSAndroid Build Coastguard Worker ext v0.16b,v0.16b,v0.16b,#8 487*8fb009dcSAndroid Build Coastguard Worker 488*8fb009dcSAndroid Build Coastguard Worker pmull v29.1q,v20.1d,v23.1d //H·Ii+1 489*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v5.16b,v23.16b 490*8fb009dcSAndroid Build Coastguard Worker 491*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v4.16b,v0.16b 492*8fb009dcSAndroid Build Coastguard Worker ext v3.16b,v16.16b,v16.16b,#8 493*8fb009dcSAndroid Build Coastguard Worker 494*8fb009dcSAndroid Build Coastguard Worker pmull2 v31.1q,v20.2d,v23.2d 495*8fb009dcSAndroid Build Coastguard Worker pmull v30.1q,v21.1d,v5.1d 496*8fb009dcSAndroid Build Coastguard Worker 497*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v22.1d,v3.1d //H^2·(Xi+Ii) 498*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v16.16b,v3.16b 499*8fb009dcSAndroid Build Coastguard Worker pmull2 v2.1q,v22.2d,v3.2d 500*8fb009dcSAndroid Build Coastguard Worker pmull2 v1.1q,v21.2d,v16.2d 501*8fb009dcSAndroid Build Coastguard Worker 502*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v29.16b 503*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v31.16b 504*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v30.16b 505*8fb009dcSAndroid Build Coastguard Worker b .Ldone4x 506*8fb009dcSAndroid Build Coastguard Worker 507*8fb009dcSAndroid Build Coastguard Worker.align 4 508*8fb009dcSAndroid Build Coastguard Worker.Lone: 509*8fb009dcSAndroid Build Coastguard Worker ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing 510*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v0.16b,v2.16b 511*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v17.16b 512*8fb009dcSAndroid Build Coastguard Worker ld1 {v4.2d},[x2] 513*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v18.16b 514*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 515*8fb009dcSAndroid Build Coastguard Worker rev64 v4.16b,v4.16b 516*8fb009dcSAndroid Build Coastguard Worker#endif 517*8fb009dcSAndroid Build Coastguard Worker 518*8fb009dcSAndroid Build Coastguard Worker pmull v18.1q,v0.1d,v19.1d //1st phase of reduction 519*8fb009dcSAndroid Build Coastguard Worker ins v2.d[0],v1.d[1] 520*8fb009dcSAndroid Build Coastguard Worker ins v1.d[1],v0.d[0] 521*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v1.16b,v18.16b 522*8fb009dcSAndroid Build Coastguard Worker 523*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction 524*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v0.1d,v19.1d 525*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v18.16b,v2.16b 526*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v18.16b 527*8fb009dcSAndroid Build Coastguard Worker ext v0.16b,v0.16b,v0.16b,#8 528*8fb009dcSAndroid Build Coastguard Worker 529*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v4.16b,v0.16b 530*8fb009dcSAndroid Build Coastguard Worker ext v3.16b,v16.16b,v16.16b,#8 531*8fb009dcSAndroid Build Coastguard Worker 532*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v20.1d,v3.1d 533*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v16.16b,v3.16b 534*8fb009dcSAndroid Build Coastguard Worker pmull2 v2.1q,v20.2d,v3.2d 535*8fb009dcSAndroid Build Coastguard Worker pmull v1.1q,v21.1d,v16.1d 536*8fb009dcSAndroid Build Coastguard Worker 537*8fb009dcSAndroid Build Coastguard Worker.Ldone4x: 538*8fb009dcSAndroid Build Coastguard Worker ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing 539*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v0.16b,v2.16b 540*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v17.16b 541*8fb009dcSAndroid Build Coastguard Worker eor v1.16b,v1.16b,v18.16b 542*8fb009dcSAndroid Build Coastguard Worker 543*8fb009dcSAndroid Build Coastguard Worker pmull v18.1q,v0.1d,v19.1d //1st phase of reduction 544*8fb009dcSAndroid Build Coastguard Worker ins v2.d[0],v1.d[1] 545*8fb009dcSAndroid Build Coastguard Worker ins v1.d[1],v0.d[0] 546*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v1.16b,v18.16b 547*8fb009dcSAndroid Build Coastguard Worker 548*8fb009dcSAndroid Build Coastguard Worker ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction 549*8fb009dcSAndroid Build Coastguard Worker pmull v0.1q,v0.1d,v19.1d 550*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v18.16b,v2.16b 551*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v18.16b 552*8fb009dcSAndroid Build Coastguard Worker ext v0.16b,v0.16b,v0.16b,#8 553*8fb009dcSAndroid Build Coastguard Worker 554*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 555*8fb009dcSAndroid Build Coastguard Worker rev64 v0.16b,v0.16b 556*8fb009dcSAndroid Build Coastguard Worker#endif 557*8fb009dcSAndroid Build Coastguard Worker st1 {v0.2d},[x0] //write out Xi 558*8fb009dcSAndroid Build Coastguard Worker 559*8fb009dcSAndroid Build Coastguard Worker ret 560*8fb009dcSAndroid Build Coastguard Worker.size gcm_ghash_v8_4x,.-gcm_ghash_v8_4x 561*8fb009dcSAndroid Build Coastguard Worker.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,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 562*8fb009dcSAndroid Build Coastguard Worker.align 2 563*8fb009dcSAndroid Build Coastguard Worker.align 2 564*8fb009dcSAndroid Build Coastguard Worker#endif 565*8fb009dcSAndroid Build Coastguard Worker#endif // !OPENSSL_NO_ASM && defined(OPENSSL_AARCH64) && defined(__ELF__) 566