diff -r 83b001debedf -r e2f4eac691d6 sys/crypto/aes/arch/arm/aes_neon_32.S --- a/sys/crypto/aes/arch/arm/aes_neon_32.S Sun Sep 06 22:35:34 2020 +0000 +++ b/sys/crypto/aes/arch/arm/aes_neon_32.S Fri Sep 11 20:25:12 2020 +0000 @@ -32,11 +32,6 @@ RCSID("$NetBSD: aes_neon_32.S,v 1.11 202 .fpu neon - .text - .p2align 2 -.Lconstants_addr: - .long .Lconstants - . - .section .rodata .p2align 5 .Lconstants: @@ -224,8 +219,8 @@ ENTRY(aes_neon_enc1) ldr ip, .Lconstants_addr adr r10, .Lconstants_addr - vld1.8 {q14}, [r0 :128]! /* q14 = *rk++ */ - movw r3, #0 + vld1.8 {q14}, [r0 :128]! /* q14 := *rk++ */ + movw r3, #0 /* r3 := rmod4 = 0 */ vmov.i8 q1, #0x0f /* ip := .Lconstants */ @@ -264,7 +259,7 @@ ENTRY(aes_neon_enc1) b 2f _ALIGN_TEXT -1: vld1.8 {q14}, [r0 :128]! /* q14 = *rk++ */ +1: vld1.8 {q14}, [r0 :128]! /* q14 := *rk++ */ /* q0 := A = rk[i] + sb1_0(io) + sb1_1(jo) */ vtbl.8 d24, {q6}, d4 @@ -350,14 +345,13 @@ 2: /* and r3, r3, #3 bne 1b - /* (q6, q7, q15) := (sbo[0], sbo[1], sr[rmod4]) */ + /* (q6, q7, q14, q15) := (sbo[0], sbo[1], rk[nr], sr[rmod4]) */ add r8, ip, #(sr - .Lconstants) add r6, ip, #(sbo - .Lconstants) add r8, r8, r3, lsl #4 - vld1.8 {q6-q7}, [r6 :256] - vld1.8 {q15}, [r8 :128] - - vld1.8 {q14}, [r0 :128]! /* q14 = *rk++ */ + vld1.8 {q6-q7}, [r6 :256] /* q7-q8 := sbo */ + vld1.8 {q14}, [r0 :128] /* q14 := rk[nr] */ + vld1.8 {q15}, [r8 :128] /* q15 := sr[rmod4] */ /* (q2, q3) := (sbo_0(io), sbo_1(jo)) */ vtbl.8 d4, {q6}, d4 @@ -388,6 +382,335 @@ 2: /* END(aes_neon_enc1) /* + * aes_neon_enc2(enc, {x,y}, nrounds) + * + * With -mfloat-abi=hard: + * + * uint8x16x2_t@{q0,q1} + * aes_neon_enc2(const struct aesenc *enc@r0, uint8x16x2_t {x,y}@{q0,q1}, + * unsigned nrounds@r1) + * + * With -mfloat-abi=soft(fp) (i.e., __SOFTFP__): + * + * uint8x16x2_t@{r0[0..15],r0[16..31]} + * aes_neon_enc2(const struct aesenc *enc@r1, + * uint8x16x2_t {x,y}@(r2,r3,sp[0..7];sp[8..23]), nrounds@sp[24..27]) + * + * We normalize these to: + * + * r1 = nrounds + * r2 = enc + */ +ENTRY(aes_neon_enc2) +#ifdef __SOFTFP__ +#ifdef __ARM_BIG_ENDIAN + vmov d0, r3, r2 /* d0 := x lo */ +#else + vmov d0, r2, r3 /* d0 := x lo */ +#endif + mov r2, r1 /* r2 := enc */ + add r1, sp, #8 + vldr d1, [sp] /* d1 := x hi */ + vld1.64 {d2-d3}, [r1] /* q1=d2-d3 := y */ + ldr r1, [sp, #24] /* r1 := nrounds */ +#else /* !__SOFTFP__ */ + mov r2, r0 /* r2 := enc */ +#endif + push {r4, r5, r6, r8, r10, lr} + vpush {d8-d15} + + /* ip := .Lconstants - .Lconstants_addr, r10 := .Lconstants_addr */ + ldr ip, .Lconstants_addr + adr r10, .Lconstants_addr + + vld1.8 {q7}, [r2 :128]! /* q7 := *rk++ */ + movw r3, #0 /* r3 := rmod4 = 0 */ + vmov.i8 q6, #0x0f /* q6 := 0x0f0f... */ + + /* ip := .Lconstants */ + add ip, ip, r10 + + /* (q4, q5) := (iptlo, ipthi) */ + add r6, ip, #(ipt - .Lconstants) + vld1.8 {q4-q5}, [r6 :256] + + /* load the rest of the constants */ + add r4, ip, #(sb1 - .Lconstants) + add r6, ip, #(sb2 - .Lconstants) + add r8, ip, #(.Linv_inva - .Lconstants) + vld1.8 {q10-q11}, [r4 :256] /* q10 = sb1[0], q11 = sb1[1] */ + vld1.8 {q12-q13}, [r6 :256] /* q12 = sb2[0], q13 = sb2[1] */ + vld1.8 {q14-q15}, [r8 :256] /* q14 = inv, q15 = inva */ + + /* r4 := mc */ + add r4, ip, #(mc - .Lconstants) + + /* (q0, q2) := (x_lo, x_hi), (q1, q3) := (y_lo, y_hi) */ + vshr.u8 q2, q0, #4 + vshr.u8 q3, q1, #4 + vand q0, q0, q6 /* q0 := x & 0x0f0f... */ + vand q1, q1, q6 /* q1 := y & 0x0f0f... */ + vand q2, q2, q6 /* q2 := (x >> 4) & 0x0f0f... */ + vand q3, q3, q6 /* q3 := (y >> 4) & 0x0f0f... */ + + /* + * (q0, q2) := (iptlo(x_lo), ipthi(x_hi)) + * (q1, q3) := (iptlo(y_lo), ipthi(y_hi)) + */ + vtbl.8 d0, {q4}, d0 + vtbl.8 d1, {q4}, d1 + vtbl.8 d2, {q4}, d2 + vtbl.8 d3, {q4}, d3 + vtbl.8 d4, {q5}, d4 + vtbl.8 d5, {q5}, d5 + vtbl.8 d6, {q5}, d6 + vtbl.8 d7, {q5}, d7 + + /* + * q0 := rk[0] + iptlo(x_lo) + ipthi(x_hi) + * q1 := rk[0] + iptlo(y_lo) + ipthi(y_hi) + */ + veor q0, q7, q0 + veor q1, q7, q1 + veor q0, q0, q2 + veor q1, q1, q3 + + b 2f + + _ALIGN_TEXT +1: /* + * (q0, q2) = (io(x), jo(x)) + * (q1, q3) = (io(y), jo(y)) + */ + + vld1.8 {q5}, [r2 :128]! /* q5 := *rk++ */ + + /* + * (q6, q8) := (sb1_0(io(x)), sb1_1(jo(x))) + * (q7, q9) := (sb1_0(io(y)), sb1_1(jo(y))) + */ + vtbl.8 d12, {q10}, d0 + vtbl.8 d13, {q10}, d1 + vtbl.8 d14, {q10}, d2 + vtbl.8 d15, {q10}, d3 + vtbl.8 d16, {q11}, d4 + vtbl.8 d17, {q11}, d5 + vtbl.8 d18, {q11}, d6 + vtbl.8 d19, {q11}, d7 + + add r6, r4, r3, lsl #5 /* r6 := &mc[rmod4] */ + + /* + * q4 := A(x) = rk[i] + sb1_0(io(x)) + sb1_1(jo(x)) + * q5 := A(y) = rk[i] + sb1_0(io(y)) + sb1_1(jo(y)) + */ + veor q4, q5, q6 + veor q5, q5, q7 + veor q4, q4, q8 + veor q5, q5, q9 + + /* (q8, q9) := (mc[rmod4].forward, mc[rmod4].backward) */ + vld1.8 {q8-q9}, [r6 :256] + + /* + * (q6, q0) := (sb2_0(io(x)), sb2_1(jo(x))) + * (q7, q1) := (sb2_0(io(y)), sb2_1(jo(y))) + * + */ + vtbl.8 d12, {q12}, d0 + vtbl.8 d13, {q12}, d1 + vtbl.8 d14, {q12}, d2 + vtbl.8 d15, {q12}, d3 + vtbl.8 d0, {q13}, d4 + vtbl.8 d1, {q13}, d5 + vtbl.8 d2, {q13}, d6 + vtbl.8 d3, {q13}, d7 + + /* + * q6 := A2(x) = sb2_0(io(x)) + sb2_1(jo(x)) + * q7 := A2(y) = sb2_0(io(y)) + sb2_1(jo(y)) + */ + veor q6, q6, q0 + veor q7, q7, q1 + + /* q0 := A(x)(mcf), q1 := A(y)(mcf) */ + vtbl.8 d0, {q4}, d16 + vtbl.8 d1, {q4}, d17 + vtbl.8 d2, {q5}, d16 + vtbl.8 d3, {q5}, d17 + + /* + * q6 := A2_B(x) = A2(x) + A(x)(mcf) + * q7 := A2_B(y) = A2(y) + A(y)(mcf) + */ + veor q6, q6, q0 + veor q7, q7, q1 + + /* q2 := A(x)(mcb), q3 := A(y)(mcb) */ + vtbl.8 d4, {q4}, d18 + vtbl.8 d5, {q4}, d19 + vtbl.8 d6, {q5}, d18 + vtbl.8 d7, {q5}, d19 + + /* + * q2 := A2_B_D(x) = A2_B(x) + A(x)(mcb) + * q3 := A2_B_D(y) = A2_B(y) + A(y)(mcb) + */ + veor q2, q6, q2 + veor q3, q7, q3 + + /* q0 := A2_B(x)(mcf), q1 := A2_B(y)(mcf) */ + vtbl.8 d0, {q6}, d16 + vtbl.8 d1, {q6}, d17 + vtbl.8 d2, {q7}, d16 + vtbl.8 d3, {q7}, d17 + + /* + * q0 := x' := A2_B_D(x) + A2_B(x)(mcf) + * q1 := y' := A2_B_D(y) + A2_B(y)(mcf) + */ + veor q0, q2, q0 + veor q1, q3, q1 + + /* q6 := 0x0f0f... */ + vmov.i8 q6, #0x0f + +2: /* + * SubBytes + */ + + /* (q0, q2) := (k(x), i(x)), (q1, q3) := (k(y), i(y)) */ + vshr.u8 q2, q0, #4 + vshr.u8 q3, q1, #4 + vand q0, q0, q6 /* q0 := x & 0x0f0f... */ + vand q1, q1, q6 /* q1 := y & 0x0f0f... */ + vand q2, q2, q6 /* q2 := (x >> 4) & 0x0f0f... */ + vand q3, q3, q6 /* q3 := (y >> 4) & 0x0f0f... */ + + /* q4 := a/k(x), q5 := a/k(y) */ + vtbl.8 d8, {q15}, d0 + vtbl.8 d9, {q15}, d1 + vtbl.8 d10, {q15}, d2 + vtbl.8 d11, {q15}, d3 + + /* q0 := j(x) = i(x) + k(x), q1 := j(y) = i(y) + k(y) */ + veor q0, q2, q0 + veor q1, q3, q1 + + /* q6 := ir(x) = 1/i(x), q7 := ir(y) = 1/i(y) */ + vtbl.8 d12, {q14}, d4 + vtbl.8 d13, {q14}, d5 + vtbl.8 d14, {q14}, d6 + vtbl.8 d15, {q14}, d7 + + /* q8 := jr(x) = 1/j(x), q9 := jr(y) = 1/j(y) */ + vtbl.8 d16, {q14}, d0 + vtbl.8 d17, {q14}, d1 + vtbl.8 d18, {q14}, d2 + vtbl.8 d19, {q14}, d3 + + /* + * q6 := iak(x) = 1/i(x) + a/k(x) + * q7 := iak(y) = 1/i(y) + a/k(y) + */ + veor q6, q6, q4 + veor q7, q7, q5 + + /* + * q8 := jak(x) = 1/j(x) + a/k(x) + * q9 := jak(y) = 1/j(y) + a/k(y) + */ + veor q8, q8, q4 + veor q9, q9, q5 + + /* + * q6 := iakr(x) = 1/(1/i(x) + a/k(x)) + * q7 := iakr(y) = 1/(1/i(y) + a/k(y)) + */ + vtbl.8 d12, {q14}, d12 + vtbl.8 d13, {q14}, d13 + vtbl.8 d14, {q14}, d14 + vtbl.8 d15, {q14}, d15 + + /* + * q8 := jakr(x) = 1/(1/j(x) + a/k(x)) + * q9 := jakr(y) = 1/(1/j(y) + a/k(y)) + */ + vtbl.8 d16, {q14}, d16 + vtbl.8 d17, {q14}, d17 + vtbl.8 d18, {q14}, d18 + vtbl.8 d19, {q14}, d19 + + /* + * q0 := io(x) = j(x) + 1/(1/i(x) + a/k(x)) + * q1 := io(y) = j(y) + 1/(1/i(y) + a/k(y)) + */ + veor q0, q0, q6 + veor q1, q1, q7 + + /* + * q2 := jo(x) = i(x) + 1/(1/j(x) + a/k(x)) + * q3 := jo(y) = i(y) + 1/(1/j(y) + a/k(y)) + */ + veor q2, q2, q8 + veor q3, q3, q9 + + /* advance round */ + add r3, r3, #1 + subs r1, r1, #1 + and r3, r3, #3 + bne 1b + + /* (q6, q7, q14, q15) := (sbo[0], sbo[1], q14, sr[rmod4]) */ + add r8, ip, #(sr - .Lconstants) + add r6, ip, #(sbo - .Lconstants) + add r8, r8, r3, lsl #4 + vld1.8 {q6-q7}, [r6 :256] /* q6-q7 := sbo */ + vld1.8 {q14}, [r2 :128] /* q14 := rk[nr] */ + vld1.8 {q15}, [r8 :128] /* q15 := sr[rmod4] */ + + /* + * (q0, q2) := (sbo_0(io(x)), sbo_1(jo(x))) + * (q1, q3) := (sbo_0(io(y)), sbo_1(jo(y))) + */ + vtbl.8 d0, {q6}, d0 + vtbl.8 d1, {q6}, d1 + vtbl.8 d2, {q6}, d2 + vtbl.8 d3, {q6}, d3 + vtbl.8 d4, {q7}, d4 + vtbl.8 d5, {q7}, d5 + vtbl.8 d6, {q7}, d6 + vtbl.8 d7, {q7}, d7 + + /* + * q2 := x = rk[nr] + sbo_0(io(x)) + sbo_1(jo(x)) + * q3 := y = rk[nr] + sbo_0(io(y)) + sbo_1(jo(y)) + */ + veor q2, q14, q2 + veor q3, q14, q3 + veor q2, q2, q0 + veor q3, q3, q1 + + /* q0 := x(sr[rmod4]), q1 := y(sr[rmod4]) */ + vtbl.8 d0, {q2}, d30 + vtbl.8 d1, {q2}, d31 + vtbl.8 d2, {q3}, d30 + vtbl.8 d3, {q3}, d31 + + vpop {d8-d15} + pop {r4, r5, r6, r8, r10, lr} +#ifdef __SOFTFP__ + vst1.64 {d0-d3}, [r0 :64] +#endif + bx lr +END(aes_neon_enc2) + + .text + .p2align 2 +.Lconstants_addr: + .long .Lconstants - . + +/* * aes_neon_dec1(dec, x, nrounds) * * With -mfloat-abi=hard: @@ -442,9 +765,9 @@ ENTRY(aes_neon_dec1) ldr ip, .Lconstants_addr adr r10, .Lconstants_addr - vld1.8 {q14}, [r0 :128]! /* q14 = *rk++ */ - rsb r3, r1, #0 /* r3 := ~(x - 1) = -x */ - vmov.i8 q1, #0x0f + vld1.8 {q14}, [r0 :128]! /* q14 := *rk++ */ + rsb r3, r1, #0 /* r3 := ~(nr - 1) = -nr */ + vmov.i8 q1, #0x0f /* q1 := 0x0f0f... */ and r3, r3, #3 /* r3 := 3 & ~(x - 1) */ /* ip := .Lconstants */ @@ -491,7 +814,7 @@ ENTRY(aes_neon_dec1) 1: /* load dsbd */ vld1.8 {q8-q9}, [r4 :256] /* q8 := dsbd[0], q9 := dsbd[1] */ - vld1.8 {q14}, [r0 :128]! /* q14 = *rk++ */ + vld1.8 {q14}, [r0 :128]! /* q14 := *rk++ */ /* q0 := rk[i] + dsb9_0(io) + dsb9_1(jo) */ vtbl.8 d24, {q4}, d4 @@ -536,7 +859,7 @@ 1: /* load dsbd */ veor q0, q14, q12 veor q0, q0, q13 - /* q15 := mc := mc <<< 12*8 */ + /* q15 := mc' = mc <<< 12*8 */ vext.8 q15, q15, q15, #12 2: /* @@ -587,14 +910,13 @@ 2: /* subs r1, r1, #1 bne 1b - /* (q6, q7, q15) := (dsbo[0], dsbo[1], sr[i]) */ + /* (q6, q7, q14, q15) := (dsbo[0], dsbo[1], rk[nr], sr[i]) */ add r8, ip, #(sr - .Lconstants) add r6, ip, #(dsbo - .Lconstants) add r8, r8, r3, lsl #4 - vld1.8 {q6-q7}, [r6 :256] - vld1.8 {q15}, [r8 :128] - - vld1.8 {q14}, [r0 :128]! /* q14 = *rk++ */ + vld1.8 {q6-q7}, [r6 :256] /* q6-q7 := dsbo */ + vld1.8 {q14}, [r0 :128] /* q14 := rk[nr] */ + vld1.8 {q15}, [r8 :128] /* q15 := sr[i] */ /* (q2, q3) := (dsbo_0(io), dsbo_1(jo)) */ vtbl.8 d4, {q6}, d4 @@ -623,3 +945,363 @@ 2: /* #endif bx lr END(aes_neon_dec1) + +/* + * aes_neon_dec2(dec, {x,y}, nrounds) + * + * With -mfloat-abi=hard: + * + * uint8x16x2_t@{q0,q1} + * aes_neon_dec2(const struct aesdec *dec@r0, uint8x16x2_t {x,y}@{q0,q1}, + * unsigned nrounds@r1) + * + * With -mfloat-abi=soft(fp) (i.e., __SOFTFP__): + * + * uint8x16x2_t@{r0[0..15],r0[16..31]} + * aes_neon_dec2(const struct aesdec *dec@r1, + * uint8x16x2_t {x,y}@(r2,r3,sp[0..7];sp[8..23]), nrounds@sp[24..27]) + * + * We normalize these to: + * + * r1 = nrounds + * r2 = dec + */ +ENTRY(aes_neon_dec2) +#ifdef __SOFTFP__ +#ifdef __ARM_BIG_ENDIAN + vmov d0, r3, r2 /* d0 := x lo */ +#else + vmov d0, r2, r3 /* d0 := x lo */ +#endif + mov r2, r1 /* r2 := dec */ + add r1, sp, #8 + vldr d1, [sp] /* d1 := x hi */ + vld1.64 {d2-d3}, [r1] /* q1=d2-d3 := y */ + ldr r1, [sp, #24] /* r1 := nrounds */ +#else /* !__SOFTFP__ */ + mov r2, r0 /* r2 := dec */ +#endif + push {r4, r5, r6, r7, r8, r10, lr} + vpush {d8-d15} + + /* ip := .Lconstants - .Lconstants_addr, r10 := .Lconstants_addr */ + ldr ip, .Lconstants_addr + adr r10, .Lconstants_addr + + vld1.8 {q7}, [r2 :128]! /* q7 := *rk++ */ + rsb r3, r1, #0 /* r3 := ~(nr - 1) = -nr */ + vmov.i8 q6, #0x0f /* q6 := 0x0f0f... */ + and r3, r3, #3 /* r3 := 3 & ~(x - 1) */ + + /* ip := .Lconstants */ + add ip, ip, r10 + + /* (q4, q5) := (diptlo, dipthi) */ + add r6, ip, #(dipt - .Lconstants) + vld1.8 {q4-q5}, [r6 :256] + + /* get the addresses of the dsbX */ + add r4, ip, #(dsb9 - .Lconstants) + add r5, ip, #(dsbd - .Lconstants) + add r6, ip, #(dsbb - .Lconstants) + add r7, ip, #(dsbe - .Lconstants) + + /* load mc[3].forward and inv/inva */ + add r8, ip, #(.Lmc_forward_3 - .Lconstants) + add r10, ip, #(.Linv_inva - .Lconstants) + vld1.8 {q13}, [r8 :128] /* q13 := mc[3].forward */ + vld1.8 {q14-q15}, [r10 :256] /* q14 := inv, q15 := inva */ + + /* (q0, q2) := (x_lo, x_hi), (q1, q3) := (y_lo, y_hi) */ + vshr.u8 q2, q0, #4 + vshr.u8 q3, q1, #4 + vand q0, q0, q6 /* q0 := x & 0x0f0f... */ + vand q1, q1, q6 /* q1 := y & 0x0f0f... */ + vand q2, q2, q6 /* q2 := (x >> 4) & 0x0f0f... */ + vand q3, q3, q6 /* q3 := (y >> 4) & 0x0f0f... */ + + /* + * (q0, q2) := (diptlo(x_lo), dipthi(x_hi)) + * (q1, q3) := (diptlo(y_lo), dipthi(y_hi)) + */ + vtbl.8 d0, {q4}, d0 + vtbl.8 d1, {q4}, d1 + vtbl.8 d2, {q4}, d2 + vtbl.8 d3, {q4}, d3 + vtbl.8 d4, {q5}, d4 + vtbl.8 d5, {q5}, d5 + vtbl.8 d6, {q5}, d6 + vtbl.8 d7, {q5}, d7 + + /* + * q0 := rk[0] + diptlo(x_lo) + dipthi(x_hi) + * q1 := rk[0] + diptlo(y_lo) + dipthi(y_hi) + */ + veor q0, q7, q0 + veor q1, q7, q1 + veor q0, q0, q2 + veor q1, q1, q3 + + /* preload dsb9 */ + vld1.8 {q10-q11}, [r4 :256] /* q10 := dsb9[0], q11 := dsb9[1] */ + + b 2f + + _ALIGN_TEXT +1: /* + * (q0, q2) = (io(x), jo(x)) + * (q1, q3) = (io(y), jo(y)) + */ + + vld1.8 {q12}, [r2 :128]! /* q12 := *rk++ */ + + /* + * (q4, q5) := (dsb9_0(io(x)), dsb9_1(jo(x))) + * (q6, q7) := (dsb9_0(io(y)), dsb9_1(jo(y))) + */ + vtbl.8 d8, {q10}, d0 + vtbl.8 d9, {q10}, d1 + vtbl.8 d10, {q10}, d2 + vtbl.8 d11, {q10}, d3 + vtbl.8 d12, {q11}, d4 + vtbl.8 d13, {q11}, d5 + vtbl.8 d14, {q11}, d6 + vtbl.8 d15, {q11}, d7 + + /* load dsbd */ + vld1.8 {q10-q11}, [r5 :256] /* q10 := dsbd[0], q11 := dsbd[1] */ + + /* + * q4 := x = rk[i] + dsb9_0(io(x)) + dsb9_1(jo(x)) + * q5 := y = rk[i] + dsb9_0(io(y)) + dsb9_1(jo(y)) + */ + veor q4, q12, q4 + veor q5, q12, q5 + veor q4, q4, q6 + veor q5, q5, q7 + + /* q8 := x(mc), q9 := y(mc) */ + vtbl.8 d16, {q4}, d26 + vtbl.8 d17, {q4}, d27 + vtbl.8 d18, {q5}, d26 + vtbl.8 d19, {q5}, d27 + + /* + * (q4, q6) := (dsbd_0(io(x)), dsbd_1(jo(x))) + * (q5, q7) := (dsbd_0(io(y)), dsbd_1(jo(y))) + */ + vtbl.8 d8, {q10}, d0 + vtbl.8 d9, {q10}, d1 + vtbl.8 d10, {q10}, d2 + vtbl.8 d11, {q10}, d3 + vtbl.8 d12, {q11}, d4 + vtbl.8 d13, {q11}, d5 + vtbl.8 d14, {q11}, d6 + vtbl.8 d15, {q11}, d7 + + /* load dsbb */ + vld1.8 {q10-q11}, [r6 :256] /* q10 := dsbb[0], q11 := dsbb[1] */ + + /* + * q4 := x(mc) + dsbd_0(io(x)) + dsbd_1(jo(x)) + * q5 := x(mc) + dsbd_0(io(x)) + dsbd_1(jo(x)) + */ + veor q4, q4, q6 + veor q5, q5, q7 + veor q4, q4, q8 + veor q5, q5, q9 + + /* q8 := x(mc), q9 := y(mc) */ + vtbl.8 d16, {q4}, d26 + vtbl.8 d17, {q4}, d27 + vtbl.8 d18, {q5}, d26 + vtbl.8 d19, {q5}, d27 + + /* + * (q4, q6) := (dsbb_0(io(x)), dsbb_1(jo(x))) + * (q5, q7) := (dsbb_0(io(y)), dsbb_1(jo(y))) + */ + vtbl.8 d8, {q10}, d0 + vtbl.8 d9, {q10}, d1 + vtbl.8 d10, {q10}, d2 + vtbl.8 d11, {q10}, d3 + vtbl.8 d12, {q11}, d4 + vtbl.8 d13, {q11}, d5 + vtbl.8 d14, {q11}, d6 + vtbl.8 d15, {q11}, d7 + + /* load dsbe */ + vld1.8 {q10-q11}, [r7 :256] /* q10 := dsbe[0], q11 := dsbe[1] */ + + /* + * q4 := x(mc) + dsbb_0(io(x)) + dsbb_1(jo(x)) + * q5 := y(mc) + dsbb_0(io(y)) + dsbb_1(jo(y)) + */ + veor q4, q4, q6 + veor q5, q5, q7 + veor q4, q4, q8 + veor q5, q5, q9 + + /* q8 := x(mc), q9 := y(mc) */ + vtbl.8 d16, {q4}, d26 + vtbl.8 d17, {q4}, d27 + vtbl.8 d18, {q5}, d26 + vtbl.8 d19, {q5}, d27 + + /* + * (q4, q6) := (dsbe_0(io(x)), dsbe_1(jo(x))) + * (q5, q7) := (dsbe_0(io(y)), dsbe_1(jo(y))) + */ + vtbl.8 d8, {q10}, d0 + vtbl.8 d9, {q10}, d1 + vtbl.8 d10, {q10}, d2 + vtbl.8 d11, {q10}, d3 + vtbl.8 d12, {q11}, d4 + vtbl.8 d13, {q11}, d5 + vtbl.8 d14, {q11}, d6 + vtbl.8 d15, {q11}, d7 + + /* + * q0 := x(mc) + dsbe_0(io(x)) + dsbe_1(jo(x)) + * q1 := y(mc) + dsbe_0(io(y)) + dsbe_1(jo(y)) + */ + veor q0, q4, q6 + veor q1, q5, q7 + veor q0, q0, q8 + veor q1, q1, q9 + + /* load dsb9 */ + vld1.8 {q10-q11}, [r4 :256] /* q10 := dsb9[0], q11 := dsb9[1] */ + + /* q13 := mc' = mc <<< 12*8 */ + vext.8 q13, q13, q13, #12 + + vmov.i8 q6, #0x0f /* q6 := 0x0f0f... */ + +2: /* + * SubBytes + */ + + /* (q0, q2) := (k(x), i(x)), (q1, q3) := (k(y), i(y)) */ + vshr.u8 q2, q0, #4 + vshr.u8 q3, q1, #4 + vand q0, q0, q6 /* q0 := x & 0x0f0f... */ + vand q1, q1, q6 /* q1 := y & 0x0f0f... */ + vand q2, q2, q6 /* q2 := (x >> 4) & 0x0f0f... */ + vand q3, q3, q6 /* q3 := (y >> 4) & 0x0f0f... */ + + /* q4 := a/k(x), q5 := a/k(y) */ + vtbl.8 d8, {q15}, d0 + vtbl.8 d9, {q15}, d1 + vtbl.8 d10, {q15}, d2 + vtbl.8 d11, {q15}, d3 + + /* q0 := j(x) = i(x) + k(x), q1 := j(y) = i(y) + k(y) */ + veor q0, q2, q0 + veor q1, q3, q1 + + /* q6 := ir(x) = 1/i(x), q7 := ir(y) = 1/i(y) */ + vtbl.8 d12, {q14}, d4 + vtbl.8 d13, {q14}, d5 + vtbl.8 d14, {q14}, d6 + vtbl.8 d15, {q14}, d7 + + /* q8 := jr(x) = 1/j(x), q9 := jr(y) = 1/j(y) */ + vtbl.8 d16, {q14}, d0 + vtbl.8 d17, {q14}, d1 + vtbl.8 d18, {q14}, d2 + vtbl.8 d19, {q14}, d3 + + /* + * q6 := iak(x) = 1/i(x) + a/k(x) + * q7 := iak(y) = 1/i(y) + a/k(y) + */ + veor q6, q6, q4 + veor q7, q7, q5 + + /* + * q8 := jak(x) = 1/j(x) + a/k(x) + * q9 := jak(y) = 1/j(y) + a/k(y) + */ + veor q8, q8, q4 + veor q9, q9, q5 + + /* + * q6 := iakr(x) = 1/(1/i(x) + a/k(x)) + * q7 := iakr(y) = 1/(1/i(y) + a/k(y)) + */ + vtbl.8 d12, {q14}, d12 + vtbl.8 d13, {q14}, d13 + vtbl.8 d14, {q14}, d14 + vtbl.8 d15, {q14}, d15 + + /* + * q8 := jakr(x) = 1/(1/j(x) + a/k(x)) + * q9 := jakr(y) = 1/(1/j(y) + a/k(y)) + */ + vtbl.8 d16, {q14}, d16 + vtbl.8 d17, {q14}, d17 + vtbl.8 d18, {q14}, d18 + vtbl.8 d19, {q14}, d19 + + /* + * q0 := io(x) = j(x) + 1/(1/i(x) + a/k(x)) + * q1 := io(y) = j(y) + 1/(1/i(y) + a/k(y)) + */ + veor q0, q0, q6 + veor q1, q1, q7 + + /* + * q2 := jo(x) = i(x) + 1/(1/j(x) + a/k(x)) + * q3 := jo(y) = i(y) + 1/(1/j(y) + a/k(y)) + */ + veor q2, q2, q8 + veor q3, q3, q9 + + /* advance round */ + subs r1, r1, #1 + bne 1b + + /* (q6, q7, q14, q15) := (dsbo[0], dsbo[1], rk[nr], sr[i]) */ + add r8, ip, #(sr - .Lconstants) + add r6, ip, #(dsbo - .Lconstants) + add r8, r8, r3, lsl #4 + vld1.8 {q6-q7}, [r6 :256] /* q6-q7 := dsbo */ + vld1.8 {q14}, [r2 :128] /* q14 := rk[nr] */ + vld1.8 {q15}, [r8 :128] /* q15 := sr[i] */ + + /* + * (q0, q2) := (dsbo_0(io(x)), dsbo_1(jo(x))) + * (q1, q3) := (dsbo_0(io(y)), dsbo_1(jo(y))) + */ + vtbl.8 d0, {q6}, d0 + vtbl.8 d1, {q6}, d1 + vtbl.8 d2, {q6}, d2 + vtbl.8 d3, {q6}, d3 + vtbl.8 d4, {q7}, d4 + vtbl.8 d5, {q7}, d5 + vtbl.8 d6, {q7}, d6 + vtbl.8 d7, {q7}, d7 + + /* + * q2 := x = rk[nr] + dsbo_0(io(x)) + dsbo_1(jo(x)) + * q3 := y = rk[nr] + dsbo_0(io(y)) + dsbo_1(jo(y)) + */ + veor q2, q14, q2 + veor q3, q14, q3 + veor q2, q2, q0 + veor q3, q3, q1 + + /* q0 := x(sr[i]), q1 := y(sr[i]) */ + vtbl.8 d0, {q2}, d30 + vtbl.8 d1, {q2}, d31 + vtbl.8 d2, {q3}, d30 + vtbl.8 d3, {q3}, d31 + + vpop {d8-d15} + pop {r4, r5, r6, r7, r8, r10, lr} +#ifdef __SOFTFP__ + vst1.64 {d0-d3}, [r0 :64] +#endif + bx lr +END(aes_neon_dec2) diff -r 83b001debedf -r e2f4eac691d6 sys/crypto/aes/arch/arm/aes_neon_impl.h --- a/sys/crypto/aes/arch/arm/aes_neon_impl.h Sun Sep 06 22:35:34 2020 +0000 +++ b/sys/crypto/aes/arch/arm/aes_neon_impl.h Fri Sep 11 20:25:12 2020 +0000 @@ -40,33 +40,7 @@ uint8x16_t aes_neon_enc1(const struct aesenc *, uint8x16_t, unsigned); uint8x16_t aes_neon_dec1(const struct aesdec *, uint8x16_t, unsigned); -#ifdef __aarch64__ - uint8x16x2_t aes_neon_enc2(const struct aesenc *, uint8x16x2_t, unsigned); uint8x16x2_t aes_neon_dec2(const struct aesdec *, uint8x16x2_t, unsigned); -#else - -static inline uint8x16x2_t -aes_neon_enc2(const struct aesenc *enc, uint8x16x2_t b2, unsigned nrounds) -{ - - return (uint8x16x2_t) { .val = { - [0] = aes_neon_enc1(enc, b2.val[0], nrounds), - [1] = aes_neon_enc1(enc, b2.val[1], nrounds), - } }; -} - -static inline uint8x16x2_t -aes_neon_dec2(const struct aesdec *dec, uint8x16x2_t b2, unsigned nrounds) -{ - - return (uint8x16x2_t) { .val = { - [0] = aes_neon_dec1(dec, b2.val[0], nrounds), - [1] = aes_neon_dec1(dec, b2.val[1], nrounds), - } }; -} - -#endif - #endif /* _CRYPTO_AES_ARCH_ARM_AES_NEON_IMPL_H */