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.section .rodata 13*8fb009dcSAndroid Build Coastguard Worker.align 5 14*8fb009dcSAndroid Build Coastguard Worker.Lrcon: 15*8fb009dcSAndroid Build Coastguard Worker.long 0x01,0x01,0x01,0x01 16*8fb009dcSAndroid Build Coastguard Worker.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d // rotate-n-splat 17*8fb009dcSAndroid Build Coastguard Worker.long 0x1b,0x1b,0x1b,0x1b 18*8fb009dcSAndroid Build Coastguard Worker 19*8fb009dcSAndroid Build Coastguard Worker.text 20*8fb009dcSAndroid Build Coastguard Worker 21*8fb009dcSAndroid Build Coastguard Worker.globl aes_hw_set_encrypt_key 22*8fb009dcSAndroid Build Coastguard Worker.hidden aes_hw_set_encrypt_key 23*8fb009dcSAndroid Build Coastguard Worker.type aes_hw_set_encrypt_key,%function 24*8fb009dcSAndroid Build Coastguard Worker.align 5 25*8fb009dcSAndroid Build Coastguard Workeraes_hw_set_encrypt_key: 26*8fb009dcSAndroid Build Coastguard Worker.Lenc_key: 27*8fb009dcSAndroid Build Coastguard Worker // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. 28*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 29*8fb009dcSAndroid Build Coastguard Worker stp x29,x30,[sp,#-16]! 30*8fb009dcSAndroid Build Coastguard Worker add x29,sp,#0 31*8fb009dcSAndroid Build Coastguard Worker mov x3,#-2 32*8fb009dcSAndroid Build Coastguard Worker cmp w1,#128 33*8fb009dcSAndroid Build Coastguard Worker b.lt .Lenc_key_abort 34*8fb009dcSAndroid Build Coastguard Worker cmp w1,#256 35*8fb009dcSAndroid Build Coastguard Worker b.gt .Lenc_key_abort 36*8fb009dcSAndroid Build Coastguard Worker tst w1,#0x3f 37*8fb009dcSAndroid Build Coastguard Worker b.ne .Lenc_key_abort 38*8fb009dcSAndroid Build Coastguard Worker 39*8fb009dcSAndroid Build Coastguard Worker adrp x3,.Lrcon 40*8fb009dcSAndroid Build Coastguard Worker add x3,x3,:lo12:.Lrcon 41*8fb009dcSAndroid Build Coastguard Worker cmp w1,#192 42*8fb009dcSAndroid Build Coastguard Worker 43*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v0.16b 44*8fb009dcSAndroid Build Coastguard Worker ld1 {v3.16b},[x0],#16 45*8fb009dcSAndroid Build Coastguard Worker mov w1,#8 // reuse w1 46*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s,v2.4s},[x3],#32 47*8fb009dcSAndroid Build Coastguard Worker 48*8fb009dcSAndroid Build Coastguard Worker b.lt .Loop128 49*8fb009dcSAndroid Build Coastguard Worker b.eq .L192 50*8fb009dcSAndroid Build Coastguard Worker b .L256 51*8fb009dcSAndroid Build Coastguard Worker 52*8fb009dcSAndroid Build Coastguard Worker.align 4 53*8fb009dcSAndroid Build Coastguard Worker.Loop128: 54*8fb009dcSAndroid Build Coastguard Worker tbl v6.16b,{v3.16b},v2.16b 55*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v3.16b,#12 56*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 57*8fb009dcSAndroid Build Coastguard Worker aese v6.16b,v0.16b 58*8fb009dcSAndroid Build Coastguard Worker subs w1,w1,#1 59*8fb009dcSAndroid Build Coastguard Worker 60*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 61*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 62*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 63*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 64*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v1.16b 65*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 66*8fb009dcSAndroid Build Coastguard Worker shl v1.16b,v1.16b,#1 67*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v6.16b 68*8fb009dcSAndroid Build Coastguard Worker b.ne .Loop128 69*8fb009dcSAndroid Build Coastguard Worker 70*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x3] 71*8fb009dcSAndroid Build Coastguard Worker 72*8fb009dcSAndroid Build Coastguard Worker tbl v6.16b,{v3.16b},v2.16b 73*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v3.16b,#12 74*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 75*8fb009dcSAndroid Build Coastguard Worker aese v6.16b,v0.16b 76*8fb009dcSAndroid Build Coastguard Worker 77*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 78*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 79*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 80*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 81*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v1.16b 82*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 83*8fb009dcSAndroid Build Coastguard Worker shl v1.16b,v1.16b,#1 84*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v6.16b 85*8fb009dcSAndroid Build Coastguard Worker 86*8fb009dcSAndroid Build Coastguard Worker tbl v6.16b,{v3.16b},v2.16b 87*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v3.16b,#12 88*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 89*8fb009dcSAndroid Build Coastguard Worker aese v6.16b,v0.16b 90*8fb009dcSAndroid Build Coastguard Worker 91*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 92*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 93*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 94*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 95*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v1.16b 96*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 97*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v6.16b 98*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2] 99*8fb009dcSAndroid Build Coastguard Worker add x2,x2,#0x50 100*8fb009dcSAndroid Build Coastguard Worker 101*8fb009dcSAndroid Build Coastguard Worker mov w12,#10 102*8fb009dcSAndroid Build Coastguard Worker b .Ldone 103*8fb009dcSAndroid Build Coastguard Worker 104*8fb009dcSAndroid Build Coastguard Worker.align 4 105*8fb009dcSAndroid Build Coastguard Worker.L192: 106*8fb009dcSAndroid Build Coastguard Worker ld1 {v4.8b},[x0],#8 107*8fb009dcSAndroid Build Coastguard Worker movi v6.16b,#8 // borrow v6.16b 108*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 109*8fb009dcSAndroid Build Coastguard Worker sub v2.16b,v2.16b,v6.16b // adjust the mask 110*8fb009dcSAndroid Build Coastguard Worker 111*8fb009dcSAndroid Build Coastguard Worker.Loop192: 112*8fb009dcSAndroid Build Coastguard Worker tbl v6.16b,{v4.16b},v2.16b 113*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v3.16b,#12 114*8fb009dcSAndroid Build Coastguard Worker st1 {v4.8b},[x2],#8 115*8fb009dcSAndroid Build Coastguard Worker aese v6.16b,v0.16b 116*8fb009dcSAndroid Build Coastguard Worker subs w1,w1,#1 117*8fb009dcSAndroid Build Coastguard Worker 118*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 119*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 120*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 121*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 122*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 123*8fb009dcSAndroid Build Coastguard Worker 124*8fb009dcSAndroid Build Coastguard Worker dup v5.4s,v3.s[3] 125*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v5.16b,v4.16b 126*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v1.16b 127*8fb009dcSAndroid Build Coastguard Worker ext v4.16b,v0.16b,v4.16b,#12 128*8fb009dcSAndroid Build Coastguard Worker shl v1.16b,v1.16b,#1 129*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v5.16b 130*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v6.16b 131*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v6.16b 132*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 133*8fb009dcSAndroid Build Coastguard Worker b.ne .Loop192 134*8fb009dcSAndroid Build Coastguard Worker 135*8fb009dcSAndroid Build Coastguard Worker mov w12,#12 136*8fb009dcSAndroid Build Coastguard Worker add x2,x2,#0x20 137*8fb009dcSAndroid Build Coastguard Worker b .Ldone 138*8fb009dcSAndroid Build Coastguard Worker 139*8fb009dcSAndroid Build Coastguard Worker.align 4 140*8fb009dcSAndroid Build Coastguard Worker.L256: 141*8fb009dcSAndroid Build Coastguard Worker ld1 {v4.16b},[x0] 142*8fb009dcSAndroid Build Coastguard Worker mov w1,#7 143*8fb009dcSAndroid Build Coastguard Worker mov w12,#14 144*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 145*8fb009dcSAndroid Build Coastguard Worker 146*8fb009dcSAndroid Build Coastguard Worker.Loop256: 147*8fb009dcSAndroid Build Coastguard Worker tbl v6.16b,{v4.16b},v2.16b 148*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v3.16b,#12 149*8fb009dcSAndroid Build Coastguard Worker st1 {v4.4s},[x2],#16 150*8fb009dcSAndroid Build Coastguard Worker aese v6.16b,v0.16b 151*8fb009dcSAndroid Build Coastguard Worker subs w1,w1,#1 152*8fb009dcSAndroid Build Coastguard Worker 153*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 154*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 155*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 156*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 157*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v1.16b 158*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 159*8fb009dcSAndroid Build Coastguard Worker shl v1.16b,v1.16b,#1 160*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v6.16b 161*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 162*8fb009dcSAndroid Build Coastguard Worker b.eq .Ldone 163*8fb009dcSAndroid Build Coastguard Worker 164*8fb009dcSAndroid Build Coastguard Worker dup v6.4s,v3.s[3] // just splat 165*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v4.16b,#12 166*8fb009dcSAndroid Build Coastguard Worker aese v6.16b,v0.16b 167*8fb009dcSAndroid Build Coastguard Worker 168*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v5.16b 169*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 170*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v5.16b 171*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 172*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v5.16b 173*8fb009dcSAndroid Build Coastguard Worker 174*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v6.16b 175*8fb009dcSAndroid Build Coastguard Worker b .Loop256 176*8fb009dcSAndroid Build Coastguard Worker 177*8fb009dcSAndroid Build Coastguard Worker.Ldone: 178*8fb009dcSAndroid Build Coastguard Worker str w12,[x2] 179*8fb009dcSAndroid Build Coastguard Worker mov x3,#0 180*8fb009dcSAndroid Build Coastguard Worker 181*8fb009dcSAndroid Build Coastguard Worker.Lenc_key_abort: 182*8fb009dcSAndroid Build Coastguard Worker mov x0,x3 // return value 183*8fb009dcSAndroid Build Coastguard Worker ldr x29,[sp],#16 184*8fb009dcSAndroid Build Coastguard Worker ret 185*8fb009dcSAndroid Build Coastguard Worker.size aes_hw_set_encrypt_key,.-aes_hw_set_encrypt_key 186*8fb009dcSAndroid Build Coastguard Worker 187*8fb009dcSAndroid Build Coastguard Worker.globl aes_hw_set_decrypt_key 188*8fb009dcSAndroid Build Coastguard Worker.hidden aes_hw_set_decrypt_key 189*8fb009dcSAndroid Build Coastguard Worker.type aes_hw_set_decrypt_key,%function 190*8fb009dcSAndroid Build Coastguard Worker.align 5 191*8fb009dcSAndroid Build Coastguard Workeraes_hw_set_decrypt_key: 192*8fb009dcSAndroid Build Coastguard Worker AARCH64_SIGN_LINK_REGISTER 193*8fb009dcSAndroid Build Coastguard Worker stp x29,x30,[sp,#-16]! 194*8fb009dcSAndroid Build Coastguard Worker add x29,sp,#0 195*8fb009dcSAndroid Build Coastguard Worker bl .Lenc_key 196*8fb009dcSAndroid Build Coastguard Worker 197*8fb009dcSAndroid Build Coastguard Worker cmp x0,#0 198*8fb009dcSAndroid Build Coastguard Worker b.ne .Ldec_key_abort 199*8fb009dcSAndroid Build Coastguard Worker 200*8fb009dcSAndroid Build Coastguard Worker sub x2,x2,#240 // restore original x2 201*8fb009dcSAndroid Build Coastguard Worker mov x4,#-16 202*8fb009dcSAndroid Build Coastguard Worker add x0,x2,x12,lsl#4 // end of key schedule 203*8fb009dcSAndroid Build Coastguard Worker 204*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2] 205*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x0] 206*8fb009dcSAndroid Build Coastguard Worker st1 {v0.4s},[x0],x4 207*8fb009dcSAndroid Build Coastguard Worker st1 {v1.4s},[x2],#16 208*8fb009dcSAndroid Build Coastguard Worker 209*8fb009dcSAndroid Build Coastguard Worker.Loop_imc: 210*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2] 211*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x0] 212*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 213*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 214*8fb009dcSAndroid Build Coastguard Worker st1 {v0.4s},[x0],x4 215*8fb009dcSAndroid Build Coastguard Worker st1 {v1.4s},[x2],#16 216*8fb009dcSAndroid Build Coastguard Worker cmp x0,x2 217*8fb009dcSAndroid Build Coastguard Worker b.hi .Loop_imc 218*8fb009dcSAndroid Build Coastguard Worker 219*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2] 220*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 221*8fb009dcSAndroid Build Coastguard Worker st1 {v0.4s},[x0] 222*8fb009dcSAndroid Build Coastguard Worker 223*8fb009dcSAndroid Build Coastguard Worker eor x0,x0,x0 // return value 224*8fb009dcSAndroid Build Coastguard Worker.Ldec_key_abort: 225*8fb009dcSAndroid Build Coastguard Worker ldp x29,x30,[sp],#16 226*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALIDATE_LINK_REGISTER 227*8fb009dcSAndroid Build Coastguard Worker ret 228*8fb009dcSAndroid Build Coastguard Worker.size aes_hw_set_decrypt_key,.-aes_hw_set_decrypt_key 229*8fb009dcSAndroid Build Coastguard Worker.globl aes_hw_encrypt 230*8fb009dcSAndroid Build Coastguard Worker.hidden aes_hw_encrypt 231*8fb009dcSAndroid Build Coastguard Worker.type aes_hw_encrypt,%function 232*8fb009dcSAndroid Build Coastguard Worker.align 5 233*8fb009dcSAndroid Build Coastguard Workeraes_hw_encrypt: 234*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 235*8fb009dcSAndroid Build Coastguard Worker ldr w3,[x2,#240] 236*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2],#16 237*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.16b},[x0] 238*8fb009dcSAndroid Build Coastguard Worker sub w3,w3,#2 239*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x2],#16 240*8fb009dcSAndroid Build Coastguard Worker 241*8fb009dcSAndroid Build Coastguard Worker.Loop_enc: 242*8fb009dcSAndroid Build Coastguard Worker aese v2.16b,v0.16b 243*8fb009dcSAndroid Build Coastguard Worker aesmc v2.16b,v2.16b 244*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2],#16 245*8fb009dcSAndroid Build Coastguard Worker subs w3,w3,#2 246*8fb009dcSAndroid Build Coastguard Worker aese v2.16b,v1.16b 247*8fb009dcSAndroid Build Coastguard Worker aesmc v2.16b,v2.16b 248*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x2],#16 249*8fb009dcSAndroid Build Coastguard Worker b.gt .Loop_enc 250*8fb009dcSAndroid Build Coastguard Worker 251*8fb009dcSAndroid Build Coastguard Worker aese v2.16b,v0.16b 252*8fb009dcSAndroid Build Coastguard Worker aesmc v2.16b,v2.16b 253*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2] 254*8fb009dcSAndroid Build Coastguard Worker aese v2.16b,v1.16b 255*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v0.16b 256*8fb009dcSAndroid Build Coastguard Worker 257*8fb009dcSAndroid Build Coastguard Worker st1 {v2.16b},[x1] 258*8fb009dcSAndroid Build Coastguard Worker ret 259*8fb009dcSAndroid Build Coastguard Worker.size aes_hw_encrypt,.-aes_hw_encrypt 260*8fb009dcSAndroid Build Coastguard Worker.globl aes_hw_decrypt 261*8fb009dcSAndroid Build Coastguard Worker.hidden aes_hw_decrypt 262*8fb009dcSAndroid Build Coastguard Worker.type aes_hw_decrypt,%function 263*8fb009dcSAndroid Build Coastguard Worker.align 5 264*8fb009dcSAndroid Build Coastguard Workeraes_hw_decrypt: 265*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 266*8fb009dcSAndroid Build Coastguard Worker ldr w3,[x2,#240] 267*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2],#16 268*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.16b},[x0] 269*8fb009dcSAndroid Build Coastguard Worker sub w3,w3,#2 270*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x2],#16 271*8fb009dcSAndroid Build Coastguard Worker 272*8fb009dcSAndroid Build Coastguard Worker.Loop_dec: 273*8fb009dcSAndroid Build Coastguard Worker aesd v2.16b,v0.16b 274*8fb009dcSAndroid Build Coastguard Worker aesimc v2.16b,v2.16b 275*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2],#16 276*8fb009dcSAndroid Build Coastguard Worker subs w3,w3,#2 277*8fb009dcSAndroid Build Coastguard Worker aesd v2.16b,v1.16b 278*8fb009dcSAndroid Build Coastguard Worker aesimc v2.16b,v2.16b 279*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x2],#16 280*8fb009dcSAndroid Build Coastguard Worker b.gt .Loop_dec 281*8fb009dcSAndroid Build Coastguard Worker 282*8fb009dcSAndroid Build Coastguard Worker aesd v2.16b,v0.16b 283*8fb009dcSAndroid Build Coastguard Worker aesimc v2.16b,v2.16b 284*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2] 285*8fb009dcSAndroid Build Coastguard Worker aesd v2.16b,v1.16b 286*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v0.16b 287*8fb009dcSAndroid Build Coastguard Worker 288*8fb009dcSAndroid Build Coastguard Worker st1 {v2.16b},[x1] 289*8fb009dcSAndroid Build Coastguard Worker ret 290*8fb009dcSAndroid Build Coastguard Worker.size aes_hw_decrypt,.-aes_hw_decrypt 291*8fb009dcSAndroid Build Coastguard Worker.globl aes_hw_cbc_encrypt 292*8fb009dcSAndroid Build Coastguard Worker.hidden aes_hw_cbc_encrypt 293*8fb009dcSAndroid Build Coastguard Worker.type aes_hw_cbc_encrypt,%function 294*8fb009dcSAndroid Build Coastguard Worker.align 5 295*8fb009dcSAndroid Build Coastguard Workeraes_hw_cbc_encrypt: 296*8fb009dcSAndroid Build Coastguard Worker // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. 297*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 298*8fb009dcSAndroid Build Coastguard Worker stp x29,x30,[sp,#-16]! 299*8fb009dcSAndroid Build Coastguard Worker add x29,sp,#0 300*8fb009dcSAndroid Build Coastguard Worker subs x2,x2,#16 301*8fb009dcSAndroid Build Coastguard Worker mov x8,#16 302*8fb009dcSAndroid Build Coastguard Worker b.lo .Lcbc_abort 303*8fb009dcSAndroid Build Coastguard Worker csel x8,xzr,x8,eq 304*8fb009dcSAndroid Build Coastguard Worker 305*8fb009dcSAndroid Build Coastguard Worker cmp w5,#0 // en- or decrypting? 306*8fb009dcSAndroid Build Coastguard Worker ldr w5,[x3,#240] 307*8fb009dcSAndroid Build Coastguard Worker and x2,x2,#-16 308*8fb009dcSAndroid Build Coastguard Worker ld1 {v6.16b},[x4] 309*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.16b},[x0],x8 310*8fb009dcSAndroid Build Coastguard Worker 311*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s,v17.4s},[x3] // load key schedule... 312*8fb009dcSAndroid Build Coastguard Worker sub w5,w5,#6 313*8fb009dcSAndroid Build Coastguard Worker add x7,x3,x5,lsl#4 // pointer to last 7 round keys 314*8fb009dcSAndroid Build Coastguard Worker sub w5,w5,#2 315*8fb009dcSAndroid Build Coastguard Worker ld1 {v18.4s,v19.4s},[x7],#32 316*8fb009dcSAndroid Build Coastguard Worker ld1 {v20.4s,v21.4s},[x7],#32 317*8fb009dcSAndroid Build Coastguard Worker ld1 {v22.4s,v23.4s},[x7],#32 318*8fb009dcSAndroid Build Coastguard Worker ld1 {v7.4s},[x7] 319*8fb009dcSAndroid Build Coastguard Worker 320*8fb009dcSAndroid Build Coastguard Worker add x7,x3,#32 321*8fb009dcSAndroid Build Coastguard Worker mov w6,w5 322*8fb009dcSAndroid Build Coastguard Worker b.eq .Lcbc_dec 323*8fb009dcSAndroid Build Coastguard Worker 324*8fb009dcSAndroid Build Coastguard Worker cmp w5,#2 325*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v6.16b 326*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v16.16b,v7.16b 327*8fb009dcSAndroid Build Coastguard Worker b.eq .Lcbc_enc128 328*8fb009dcSAndroid Build Coastguard Worker 329*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.4s,v3.4s},[x7] 330*8fb009dcSAndroid Build Coastguard Worker add x7,x3,#16 331*8fb009dcSAndroid Build Coastguard Worker add x6,x3,#16*4 332*8fb009dcSAndroid Build Coastguard Worker add x12,x3,#16*5 333*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 334*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 335*8fb009dcSAndroid Build Coastguard Worker add x14,x3,#16*6 336*8fb009dcSAndroid Build Coastguard Worker add x3,x3,#16*7 337*8fb009dcSAndroid Build Coastguard Worker b .Lenter_cbc_enc 338*8fb009dcSAndroid Build Coastguard Worker 339*8fb009dcSAndroid Build Coastguard Worker.align 4 340*8fb009dcSAndroid Build Coastguard Worker.Loop_cbc_enc: 341*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 342*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 343*8fb009dcSAndroid Build Coastguard Worker st1 {v6.16b},[x1],#16 344*8fb009dcSAndroid Build Coastguard Worker.Lenter_cbc_enc: 345*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 346*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 347*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v2.16b 348*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 349*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x6] 350*8fb009dcSAndroid Build Coastguard Worker cmp w5,#4 351*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v3.16b 352*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 353*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x12] 354*8fb009dcSAndroid Build Coastguard Worker b.eq .Lcbc_enc192 355*8fb009dcSAndroid Build Coastguard Worker 356*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 357*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 358*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x14] 359*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 360*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 361*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x3] 362*8fb009dcSAndroid Build Coastguard Worker nop 363*8fb009dcSAndroid Build Coastguard Worker 364*8fb009dcSAndroid Build Coastguard Worker.Lcbc_enc192: 365*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 366*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 367*8fb009dcSAndroid Build Coastguard Worker subs x2,x2,#16 368*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 369*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 370*8fb009dcSAndroid Build Coastguard Worker csel x8,xzr,x8,eq 371*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v18.16b 372*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 373*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v19.16b 374*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 375*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.16b},[x0],x8 376*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v20.16b 377*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 378*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v16.16b,v5.16b 379*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v21.16b 380*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 381*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7] // re-pre-load rndkey[1] 382*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v22.16b 383*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 384*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v23.16b 385*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v0.16b,v7.16b 386*8fb009dcSAndroid Build Coastguard Worker b.hs .Loop_cbc_enc 387*8fb009dcSAndroid Build Coastguard Worker 388*8fb009dcSAndroid Build Coastguard Worker st1 {v6.16b},[x1],#16 389*8fb009dcSAndroid Build Coastguard Worker b .Lcbc_done 390*8fb009dcSAndroid Build Coastguard Worker 391*8fb009dcSAndroid Build Coastguard Worker.align 5 392*8fb009dcSAndroid Build Coastguard Worker.Lcbc_enc128: 393*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.4s,v3.4s},[x7] 394*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 395*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 396*8fb009dcSAndroid Build Coastguard Worker b .Lenter_cbc_enc128 397*8fb009dcSAndroid Build Coastguard Worker.Loop_cbc_enc128: 398*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 399*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 400*8fb009dcSAndroid Build Coastguard Worker st1 {v6.16b},[x1],#16 401*8fb009dcSAndroid Build Coastguard Worker.Lenter_cbc_enc128: 402*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 403*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 404*8fb009dcSAndroid Build Coastguard Worker subs x2,x2,#16 405*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v2.16b 406*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 407*8fb009dcSAndroid Build Coastguard Worker csel x8,xzr,x8,eq 408*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v3.16b 409*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 410*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v18.16b 411*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 412*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v19.16b 413*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 414*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.16b},[x0],x8 415*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v20.16b 416*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 417*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v21.16b 418*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 419*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v22.16b 420*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 421*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v16.16b,v5.16b 422*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v23.16b 423*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v0.16b,v7.16b 424*8fb009dcSAndroid Build Coastguard Worker b.hs .Loop_cbc_enc128 425*8fb009dcSAndroid Build Coastguard Worker 426*8fb009dcSAndroid Build Coastguard Worker st1 {v6.16b},[x1],#16 427*8fb009dcSAndroid Build Coastguard Worker b .Lcbc_done 428*8fb009dcSAndroid Build Coastguard Worker.align 5 429*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec: 430*8fb009dcSAndroid Build Coastguard Worker ld1 {v18.16b},[x0],#16 431*8fb009dcSAndroid Build Coastguard Worker subs x2,x2,#32 // bias 432*8fb009dcSAndroid Build Coastguard Worker add w6,w5,#2 433*8fb009dcSAndroid Build Coastguard Worker orr v3.16b,v0.16b,v0.16b 434*8fb009dcSAndroid Build Coastguard Worker orr v1.16b,v0.16b,v0.16b 435*8fb009dcSAndroid Build Coastguard Worker orr v19.16b,v18.16b,v18.16b 436*8fb009dcSAndroid Build Coastguard Worker b.lo .Lcbc_dec_tail 437*8fb009dcSAndroid Build Coastguard Worker 438*8fb009dcSAndroid Build Coastguard Worker orr v1.16b,v18.16b,v18.16b 439*8fb009dcSAndroid Build Coastguard Worker ld1 {v18.16b},[x0],#16 440*8fb009dcSAndroid Build Coastguard Worker orr v2.16b,v0.16b,v0.16b 441*8fb009dcSAndroid Build Coastguard Worker orr v3.16b,v1.16b,v1.16b 442*8fb009dcSAndroid Build Coastguard Worker orr v19.16b,v18.16b,v18.16b 443*8fb009dcSAndroid Build Coastguard Worker 444*8fb009dcSAndroid Build Coastguard Worker.Loop3x_cbc_dec: 445*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v16.16b 446*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 447*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v16.16b 448*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 449*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v16.16b 450*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 451*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x7],#16 452*8fb009dcSAndroid Build Coastguard Worker subs w6,w6,#2 453*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v17.16b 454*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 455*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v17.16b 456*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 457*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v17.16b 458*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 459*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7],#16 460*8fb009dcSAndroid Build Coastguard Worker b.gt .Loop3x_cbc_dec 461*8fb009dcSAndroid Build Coastguard Worker 462*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v16.16b 463*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 464*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v16.16b 465*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 466*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v16.16b 467*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 468*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v6.16b,v7.16b 469*8fb009dcSAndroid Build Coastguard Worker subs x2,x2,#0x30 470*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v2.16b,v7.16b 471*8fb009dcSAndroid Build Coastguard Worker csel x6,x2,x6,lo // x6, w6, is zero at this point 472*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v17.16b 473*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 474*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v17.16b 475*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 476*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v17.16b 477*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 478*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v3.16b,v7.16b 479*8fb009dcSAndroid Build Coastguard Worker add x0,x0,x6 // x0 is adjusted in such way that 480*8fb009dcSAndroid Build Coastguard Worker // at exit from the loop v1.16b-v18.16b 481*8fb009dcSAndroid Build Coastguard Worker // are loaded with last "words" 482*8fb009dcSAndroid Build Coastguard Worker orr v6.16b,v19.16b,v19.16b 483*8fb009dcSAndroid Build Coastguard Worker mov x7,x3 484*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v20.16b 485*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 486*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v20.16b 487*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 488*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v20.16b 489*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 490*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.16b},[x0],#16 491*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v21.16b 492*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 493*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v21.16b 494*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 495*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v21.16b 496*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 497*8fb009dcSAndroid Build Coastguard Worker ld1 {v3.16b},[x0],#16 498*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v22.16b 499*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 500*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v22.16b 501*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 502*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v22.16b 503*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 504*8fb009dcSAndroid Build Coastguard Worker ld1 {v19.16b},[x0],#16 505*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v23.16b 506*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v23.16b 507*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v23.16b 508*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] 509*8fb009dcSAndroid Build Coastguard Worker add w6,w5,#2 510*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v0.16b 511*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v5.16b,v1.16b 512*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v18.16b,v17.16b 513*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] 514*8fb009dcSAndroid Build Coastguard Worker st1 {v4.16b},[x1],#16 515*8fb009dcSAndroid Build Coastguard Worker orr v0.16b,v2.16b,v2.16b 516*8fb009dcSAndroid Build Coastguard Worker st1 {v5.16b},[x1],#16 517*8fb009dcSAndroid Build Coastguard Worker orr v1.16b,v3.16b,v3.16b 518*8fb009dcSAndroid Build Coastguard Worker st1 {v18.16b},[x1],#16 519*8fb009dcSAndroid Build Coastguard Worker orr v18.16b,v19.16b,v19.16b 520*8fb009dcSAndroid Build Coastguard Worker b.hs .Loop3x_cbc_dec 521*8fb009dcSAndroid Build Coastguard Worker 522*8fb009dcSAndroid Build Coastguard Worker cmn x2,#0x30 523*8fb009dcSAndroid Build Coastguard Worker b.eq .Lcbc_done 524*8fb009dcSAndroid Build Coastguard Worker nop 525*8fb009dcSAndroid Build Coastguard Worker 526*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_tail: 527*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v16.16b 528*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 529*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v16.16b 530*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 531*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x7],#16 532*8fb009dcSAndroid Build Coastguard Worker subs w6,w6,#2 533*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v17.16b 534*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 535*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v17.16b 536*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 537*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7],#16 538*8fb009dcSAndroid Build Coastguard Worker b.gt .Lcbc_dec_tail 539*8fb009dcSAndroid Build Coastguard Worker 540*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v16.16b 541*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 542*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v16.16b 543*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 544*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v17.16b 545*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 546*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v17.16b 547*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 548*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v20.16b 549*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 550*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v20.16b 551*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 552*8fb009dcSAndroid Build Coastguard Worker cmn x2,#0x20 553*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v21.16b 554*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 555*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v21.16b 556*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 557*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v6.16b,v7.16b 558*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v22.16b 559*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 560*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v22.16b 561*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 562*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v3.16b,v7.16b 563*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v23.16b 564*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v23.16b 565*8fb009dcSAndroid Build Coastguard Worker b.eq .Lcbc_dec_one 566*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v5.16b,v1.16b 567*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v17.16b,v18.16b 568*8fb009dcSAndroid Build Coastguard Worker orr v6.16b,v19.16b,v19.16b 569*8fb009dcSAndroid Build Coastguard Worker st1 {v5.16b},[x1],#16 570*8fb009dcSAndroid Build Coastguard Worker st1 {v17.16b},[x1],#16 571*8fb009dcSAndroid Build Coastguard Worker b .Lcbc_done 572*8fb009dcSAndroid Build Coastguard Worker 573*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_one: 574*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v5.16b,v18.16b 575*8fb009dcSAndroid Build Coastguard Worker orr v6.16b,v19.16b,v19.16b 576*8fb009dcSAndroid Build Coastguard Worker st1 {v5.16b},[x1],#16 577*8fb009dcSAndroid Build Coastguard Worker 578*8fb009dcSAndroid Build Coastguard Worker.Lcbc_done: 579*8fb009dcSAndroid Build Coastguard Worker st1 {v6.16b},[x4] 580*8fb009dcSAndroid Build Coastguard Worker.Lcbc_abort: 581*8fb009dcSAndroid Build Coastguard Worker ldr x29,[sp],#16 582*8fb009dcSAndroid Build Coastguard Worker ret 583*8fb009dcSAndroid Build Coastguard Worker.size aes_hw_cbc_encrypt,.-aes_hw_cbc_encrypt 584*8fb009dcSAndroid Build Coastguard Worker.globl aes_hw_ctr32_encrypt_blocks 585*8fb009dcSAndroid Build Coastguard Worker.hidden aes_hw_ctr32_encrypt_blocks 586*8fb009dcSAndroid Build Coastguard Worker.type aes_hw_ctr32_encrypt_blocks,%function 587*8fb009dcSAndroid Build Coastguard Worker.align 5 588*8fb009dcSAndroid Build Coastguard Workeraes_hw_ctr32_encrypt_blocks: 589*8fb009dcSAndroid Build Coastguard Worker // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. 590*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 591*8fb009dcSAndroid Build Coastguard Worker stp x29,x30,[sp,#-16]! 592*8fb009dcSAndroid Build Coastguard Worker add x29,sp,#0 593*8fb009dcSAndroid Build Coastguard Worker ldr w5,[x3,#240] 594*8fb009dcSAndroid Build Coastguard Worker 595*8fb009dcSAndroid Build Coastguard Worker ldr w8, [x4, #12] 596*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x4] 597*8fb009dcSAndroid Build Coastguard Worker 598*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s,v17.4s},[x3] // load key schedule... 599*8fb009dcSAndroid Build Coastguard Worker sub w5,w5,#4 600*8fb009dcSAndroid Build Coastguard Worker mov x12,#16 601*8fb009dcSAndroid Build Coastguard Worker cmp x2,#2 602*8fb009dcSAndroid Build Coastguard Worker add x7,x3,x5,lsl#4 // pointer to last 5 round keys 603*8fb009dcSAndroid Build Coastguard Worker sub w5,w5,#2 604*8fb009dcSAndroid Build Coastguard Worker ld1 {v20.4s,v21.4s},[x7],#32 605*8fb009dcSAndroid Build Coastguard Worker ld1 {v22.4s,v23.4s},[x7],#32 606*8fb009dcSAndroid Build Coastguard Worker ld1 {v7.4s},[x7] 607*8fb009dcSAndroid Build Coastguard Worker add x7,x3,#32 608*8fb009dcSAndroid Build Coastguard Worker mov w6,w5 609*8fb009dcSAndroid Build Coastguard Worker csel x12,xzr,x12,lo 610*8fb009dcSAndroid Build Coastguard Worker 611*8fb009dcSAndroid Build Coastguard Worker // ARM Cortex-A57 and Cortex-A72 cores running in 32-bit mode are 612*8fb009dcSAndroid Build Coastguard Worker // affected by silicon errata #1742098 [0] and #1655431 [1], 613*8fb009dcSAndroid Build Coastguard Worker // respectively, where the second instruction of an aese/aesmc 614*8fb009dcSAndroid Build Coastguard Worker // instruction pair may execute twice if an interrupt is taken right 615*8fb009dcSAndroid Build Coastguard Worker // after the first instruction consumes an input register of which a 616*8fb009dcSAndroid Build Coastguard Worker // single 32-bit lane has been updated the last time it was modified. 617*8fb009dcSAndroid Build Coastguard Worker // 618*8fb009dcSAndroid Build Coastguard Worker // This function uses a counter in one 32-bit lane. The vmov lines 619*8fb009dcSAndroid Build Coastguard Worker // could write to v1.16b and v18.16b directly, but that trips this bugs. 620*8fb009dcSAndroid Build Coastguard Worker // We write to v6.16b and copy to the final register as a workaround. 621*8fb009dcSAndroid Build Coastguard Worker // 622*8fb009dcSAndroid Build Coastguard Worker // [0] ARM-EPM-049219 v23 Cortex-A57 MPCore Software Developers Errata Notice 623*8fb009dcSAndroid Build Coastguard Worker // [1] ARM-EPM-012079 v11.0 Cortex-A72 MPCore Software Developers Errata Notice 624*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 625*8fb009dcSAndroid Build Coastguard Worker rev w8, w8 626*8fb009dcSAndroid Build Coastguard Worker#endif 627*8fb009dcSAndroid Build Coastguard Worker add w10, w8, #1 628*8fb009dcSAndroid Build Coastguard Worker orr v6.16b,v0.16b,v0.16b 629*8fb009dcSAndroid Build Coastguard Worker rev w10, w10 630*8fb009dcSAndroid Build Coastguard Worker mov v6.s[3],w10 631*8fb009dcSAndroid Build Coastguard Worker add w8, w8, #2 632*8fb009dcSAndroid Build Coastguard Worker orr v1.16b,v6.16b,v6.16b 633*8fb009dcSAndroid Build Coastguard Worker b.ls .Lctr32_tail 634*8fb009dcSAndroid Build Coastguard Worker rev w12, w8 635*8fb009dcSAndroid Build Coastguard Worker mov v6.s[3],w12 636*8fb009dcSAndroid Build Coastguard Worker sub x2,x2,#3 // bias 637*8fb009dcSAndroid Build Coastguard Worker orr v18.16b,v6.16b,v6.16b 638*8fb009dcSAndroid Build Coastguard Worker b .Loop3x_ctr32 639*8fb009dcSAndroid Build Coastguard Worker 640*8fb009dcSAndroid Build Coastguard Worker.align 4 641*8fb009dcSAndroid Build Coastguard Worker.Loop3x_ctr32: 642*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 643*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 644*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v16.16b 645*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 646*8fb009dcSAndroid Build Coastguard Worker aese v18.16b,v16.16b 647*8fb009dcSAndroid Build Coastguard Worker aesmc v18.16b,v18.16b 648*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x7],#16 649*8fb009dcSAndroid Build Coastguard Worker subs w6,w6,#2 650*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 651*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 652*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v17.16b 653*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 654*8fb009dcSAndroid Build Coastguard Worker aese v18.16b,v17.16b 655*8fb009dcSAndroid Build Coastguard Worker aesmc v18.16b,v18.16b 656*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7],#16 657*8fb009dcSAndroid Build Coastguard Worker b.gt .Loop3x_ctr32 658*8fb009dcSAndroid Build Coastguard Worker 659*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 660*8fb009dcSAndroid Build Coastguard Worker aesmc v4.16b,v0.16b 661*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v16.16b 662*8fb009dcSAndroid Build Coastguard Worker aesmc v5.16b,v1.16b 663*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.16b},[x0],#16 664*8fb009dcSAndroid Build Coastguard Worker add w9,w8,#1 665*8fb009dcSAndroid Build Coastguard Worker aese v18.16b,v16.16b 666*8fb009dcSAndroid Build Coastguard Worker aesmc v18.16b,v18.16b 667*8fb009dcSAndroid Build Coastguard Worker ld1 {v3.16b},[x0],#16 668*8fb009dcSAndroid Build Coastguard Worker rev w9,w9 669*8fb009dcSAndroid Build Coastguard Worker aese v4.16b,v17.16b 670*8fb009dcSAndroid Build Coastguard Worker aesmc v4.16b,v4.16b 671*8fb009dcSAndroid Build Coastguard Worker aese v5.16b,v17.16b 672*8fb009dcSAndroid Build Coastguard Worker aesmc v5.16b,v5.16b 673*8fb009dcSAndroid Build Coastguard Worker ld1 {v19.16b},[x0],#16 674*8fb009dcSAndroid Build Coastguard Worker mov x7,x3 675*8fb009dcSAndroid Build Coastguard Worker aese v18.16b,v17.16b 676*8fb009dcSAndroid Build Coastguard Worker aesmc v17.16b,v18.16b 677*8fb009dcSAndroid Build Coastguard Worker aese v4.16b,v20.16b 678*8fb009dcSAndroid Build Coastguard Worker aesmc v4.16b,v4.16b 679*8fb009dcSAndroid Build Coastguard Worker aese v5.16b,v20.16b 680*8fb009dcSAndroid Build Coastguard Worker aesmc v5.16b,v5.16b 681*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v7.16b 682*8fb009dcSAndroid Build Coastguard Worker add w10,w8,#2 683*8fb009dcSAndroid Build Coastguard Worker aese v17.16b,v20.16b 684*8fb009dcSAndroid Build Coastguard Worker aesmc v17.16b,v17.16b 685*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v7.16b 686*8fb009dcSAndroid Build Coastguard Worker add w8,w8,#3 687*8fb009dcSAndroid Build Coastguard Worker aese v4.16b,v21.16b 688*8fb009dcSAndroid Build Coastguard Worker aesmc v4.16b,v4.16b 689*8fb009dcSAndroid Build Coastguard Worker aese v5.16b,v21.16b 690*8fb009dcSAndroid Build Coastguard Worker aesmc v5.16b,v5.16b 691*8fb009dcSAndroid Build Coastguard Worker // Note the logic to update v0.16b, v1.16b, and v1.16b is written to work 692*8fb009dcSAndroid Build Coastguard Worker // around a bug in ARM Cortex-A57 and Cortex-A72 cores running in 693*8fb009dcSAndroid Build Coastguard Worker // 32-bit mode. See the comment above. 694*8fb009dcSAndroid Build Coastguard Worker eor v19.16b,v19.16b,v7.16b 695*8fb009dcSAndroid Build Coastguard Worker mov v6.s[3], w9 696*8fb009dcSAndroid Build Coastguard Worker aese v17.16b,v21.16b 697*8fb009dcSAndroid Build Coastguard Worker aesmc v17.16b,v17.16b 698*8fb009dcSAndroid Build Coastguard Worker orr v0.16b,v6.16b,v6.16b 699*8fb009dcSAndroid Build Coastguard Worker rev w10,w10 700*8fb009dcSAndroid Build Coastguard Worker aese v4.16b,v22.16b 701*8fb009dcSAndroid Build Coastguard Worker aesmc v4.16b,v4.16b 702*8fb009dcSAndroid Build Coastguard Worker mov v6.s[3], w10 703*8fb009dcSAndroid Build Coastguard Worker rev w12,w8 704*8fb009dcSAndroid Build Coastguard Worker aese v5.16b,v22.16b 705*8fb009dcSAndroid Build Coastguard Worker aesmc v5.16b,v5.16b 706*8fb009dcSAndroid Build Coastguard Worker orr v1.16b,v6.16b,v6.16b 707*8fb009dcSAndroid Build Coastguard Worker mov v6.s[3], w12 708*8fb009dcSAndroid Build Coastguard Worker aese v17.16b,v22.16b 709*8fb009dcSAndroid Build Coastguard Worker aesmc v17.16b,v17.16b 710*8fb009dcSAndroid Build Coastguard Worker orr v18.16b,v6.16b,v6.16b 711*8fb009dcSAndroid Build Coastguard Worker subs x2,x2,#3 712*8fb009dcSAndroid Build Coastguard Worker aese v4.16b,v23.16b 713*8fb009dcSAndroid Build Coastguard Worker aese v5.16b,v23.16b 714*8fb009dcSAndroid Build Coastguard Worker aese v17.16b,v23.16b 715*8fb009dcSAndroid Build Coastguard Worker 716*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v4.16b 717*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] 718*8fb009dcSAndroid Build Coastguard Worker st1 {v2.16b},[x1],#16 719*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 720*8fb009dcSAndroid Build Coastguard Worker mov w6,w5 721*8fb009dcSAndroid Build Coastguard Worker st1 {v3.16b},[x1],#16 722*8fb009dcSAndroid Build Coastguard Worker eor v19.16b,v19.16b,v17.16b 723*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] 724*8fb009dcSAndroid Build Coastguard Worker st1 {v19.16b},[x1],#16 725*8fb009dcSAndroid Build Coastguard Worker b.hs .Loop3x_ctr32 726*8fb009dcSAndroid Build Coastguard Worker 727*8fb009dcSAndroid Build Coastguard Worker adds x2,x2,#3 728*8fb009dcSAndroid Build Coastguard Worker b.eq .Lctr32_done 729*8fb009dcSAndroid Build Coastguard Worker cmp x2,#1 730*8fb009dcSAndroid Build Coastguard Worker mov x12,#16 731*8fb009dcSAndroid Build Coastguard Worker csel x12,xzr,x12,eq 732*8fb009dcSAndroid Build Coastguard Worker 733*8fb009dcSAndroid Build Coastguard Worker.Lctr32_tail: 734*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 735*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 736*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v16.16b 737*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 738*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x7],#16 739*8fb009dcSAndroid Build Coastguard Worker subs w6,w6,#2 740*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 741*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 742*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v17.16b 743*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 744*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7],#16 745*8fb009dcSAndroid Build Coastguard Worker b.gt .Lctr32_tail 746*8fb009dcSAndroid Build Coastguard Worker 747*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 748*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 749*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v16.16b 750*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 751*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 752*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 753*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v17.16b 754*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 755*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.16b},[x0],x12 756*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v20.16b 757*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 758*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v20.16b 759*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 760*8fb009dcSAndroid Build Coastguard Worker ld1 {v3.16b},[x0] 761*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v21.16b 762*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 763*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v21.16b 764*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 765*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v7.16b 766*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v22.16b 767*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 768*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v22.16b 769*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 770*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v7.16b 771*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v23.16b 772*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v23.16b 773*8fb009dcSAndroid Build Coastguard Worker 774*8fb009dcSAndroid Build Coastguard Worker cmp x2,#1 775*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v0.16b 776*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v1.16b 777*8fb009dcSAndroid Build Coastguard Worker st1 {v2.16b},[x1],#16 778*8fb009dcSAndroid Build Coastguard Worker b.eq .Lctr32_done 779*8fb009dcSAndroid Build Coastguard Worker st1 {v3.16b},[x1] 780*8fb009dcSAndroid Build Coastguard Worker 781*8fb009dcSAndroid Build Coastguard Worker.Lctr32_done: 782*8fb009dcSAndroid Build Coastguard Worker ldr x29,[sp],#16 783*8fb009dcSAndroid Build Coastguard Worker ret 784*8fb009dcSAndroid Build Coastguard Worker.size aes_hw_ctr32_encrypt_blocks,.-aes_hw_ctr32_encrypt_blocks 785*8fb009dcSAndroid Build Coastguard Worker#endif 786*8fb009dcSAndroid Build Coastguard Worker#endif // !OPENSSL_NO_ASM && defined(OPENSSL_AARCH64) && defined(__ELF__) 787