Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/crypto/aes/arch/arm aes neon: Issue 256-bit loads rather...



details:   https://anonhg.NetBSD.org/src/rev/f631de7d6d70
branches:  trunk
changeset: 938522:f631de7d6d70
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Thu Sep 10 11:29:02 2020 +0000

description:
aes neon: Issue 256-bit loads rather than pairs of 128-bit loads.

Not sure why I didn't realize you could do this before!

Saves some temporary registers that can now be allocated to shave off
a few cycles.

diffstat:

 sys/crypto/aes/arch/arm/aes_neon_32.S |  247 ++++++++++++---------------------
 1 files changed, 93 insertions(+), 154 deletions(-)

diffs (truncated from 389 to 300 lines):

diff -r d2b81cf63c44 -r f631de7d6d70 sys/crypto/aes/arch/arm/aes_neon_32.S
--- a/sys/crypto/aes/arch/arm/aes_neon_32.S     Thu Sep 10 06:02:30 2020 +0000
+++ b/sys/crypto/aes/arch/arm/aes_neon_32.S     Thu Sep 10 11:29:02 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: aes_neon_32.S,v 1.6 2020/08/16 18:02:03 riastradh Exp $        */
+/*     $NetBSD: aes_neon_32.S,v 1.7 2020/09/10 11:29:02 riastradh Exp $        */
 
 /*-
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -28,7 +28,7 @@
 
 #include <arm/asm.h>
 
-RCSID("$NetBSD: aes_neon_32.S,v 1.6 2020/08/16 18:02:03 riastradh Exp $")
+RCSID("$NetBSD: aes_neon_32.S,v 1.7 2020/09/10 11:29:02 riastradh Exp $")
 
        .fpu    neon
 
@@ -38,9 +38,10 @@
        .long   .Lconstants - .
 
        .section .rodata
-       .p2align 4
+       .p2align 5
 .Lconstants:
 
+.Linv_inva:    /* inv and inva must be consecutive */
        .type   inv,_ASM_TYPE_OBJECT
 inv:
        .byte   0x80,0x01,0x08,0x0D,0x0F,0x06,0x05,0x0E
@@ -99,125 +100,85 @@
        .byte   0x08,0x05,0x02,0x0F,0x0C,0x09,0x06,0x03
 END(sr)
 
-       .type   iptlo,_ASM_TYPE_OBJECT
-iptlo:
-       .byte   0x00,0x70,0x2A,0x5A,0x98,0xE8,0xB2,0xC2
+       .type   ipt,_ASM_TYPE_OBJECT
+ipt:
+       .byte   0x00,0x70,0x2A,0x5A,0x98,0xE8,0xB2,0xC2 /* lo */
        .byte   0x08,0x78,0x22,0x52,0x90,0xE0,0xBA,0xCA
-END(iptlo)
-
-       .type   ipthi,_ASM_TYPE_OBJECT
-ipthi:
-       .byte   0x00,0x4D,0x7C,0x31,0x7D,0x30,0x01,0x4C
+       .byte   0x00,0x4D,0x7C,0x31,0x7D,0x30,0x01,0x4C /* hi */
        .byte   0x81,0xCC,0xFD,0xB0,0xFC,0xB1,0x80,0xCD
-END(ipthi)
+END(ipt)
 
-       .type   sb1_0,_ASM_TYPE_OBJECT
-sb1_0:
-       .byte   0x00,0x3E,0x50,0xCB,0x8F,0xE1,0x9B,0xB1
+       .type   sb1,_ASM_TYPE_OBJECT
+sb1:
+       .byte   0x00,0x3E,0x50,0xCB,0x8F,0xE1,0x9B,0xB1 /* 0 */
        .byte   0x44,0xF5,0x2A,0x14,0x6E,0x7A,0xDF,0xA5
-END(sb1_0)
-
-       .type   sb1_1,_ASM_TYPE_OBJECT
-sb1_1:
-       .byte   0x00,0x23,0xE2,0xFA,0x15,0xD4,0x18,0x36
+       .byte   0x00,0x23,0xE2,0xFA,0x15,0xD4,0x18,0x36 /* 1 */
        .byte   0xEF,0xD9,0x2E,0x0D,0xC1,0xCC,0xF7,0x3B
-END(sb1_1)
-
-       .type   sb2_0,_ASM_TYPE_OBJECT
-sb2_0:
-       .byte   0x00,0x24,0x71,0x0B,0xC6,0x93,0x7A,0xE2
-       .byte   0xCD,0x2F,0x98,0xBC,0x55,0xE9,0xB7,0x5E
-END(sb2_0)
+END(sb1)
 
-       .type   sb2_1,_ASM_TYPE_OBJECT
-sb2_1:
-       .byte   0x00,0x29,0xE1,0x0A,0x40,0x88,0xEB,0x69
+       .type   sb2,_ASM_TYPE_OBJECT
+sb2:
+       .byte   0x00,0x24,0x71,0x0B,0xC6,0x93,0x7A,0xE2 /* 0 */
+       .byte   0xCD,0x2F,0x98,0xBC,0x55,0xE9,0xB7,0x5E
+       .byte   0x00,0x29,0xE1,0x0A,0x40,0x88,0xEB,0x69 /* 1 */
        .byte   0x4A,0x23,0x82,0xAB,0xC8,0x63,0xA1,0xC2
-END(sb2_1)
-
-       .type   sbo_0,_ASM_TYPE_OBJECT
-sbo_0:
-       .byte   0x00,0xC7,0xBD,0x6F,0x17,0x6D,0xD2,0xD0
-       .byte   0x78,0xA8,0x02,0xC5,0x7A,0xBF,0xAA,0x15
-END(sbo_0)
+END(sb2)
 
-       .type   sbo_1,_ASM_TYPE_OBJECT
-sbo_1:
-       .byte   0x00,0x6A,0xBB,0x5F,0xA5,0x74,0xE4,0xCF
+       .type   sbo,_ASM_TYPE_OBJECT
+sbo:
+       .byte   0x00,0xC7,0xBD,0x6F,0x17,0x6D,0xD2,0xD0 /* 0 */
+       .byte   0x78,0xA8,0x02,0xC5,0x7A,0xBF,0xAA,0x15
+       .byte   0x00,0x6A,0xBB,0x5F,0xA5,0x74,0xE4,0xCF /* 1 */
        .byte   0xFA,0x35,0x2B,0x41,0xD1,0x90,0x1E,0x8E
-END(sbo_1)
+END(sbo)
 
-       .type   diptlo,_ASM_TYPE_OBJECT
-diptlo:
-       .byte   0x00,0x5F,0x54,0x0B,0x04,0x5B,0x50,0x0F
+       .type   dipt,_ASM_TYPE_OBJECT
+dipt:
+       .byte   0x00,0x5F,0x54,0x0B,0x04,0x5B,0x50,0x0F /* lo */
        .byte   0x1A,0x45,0x4E,0x11,0x1E,0x41,0x4A,0x15
-END(diptlo)
-
-       .type   dipthi,_ASM_TYPE_OBJECT
-dipthi:
-       .byte   0x00,0x65,0x05,0x60,0xE6,0x83,0xE3,0x86
+       .byte   0x00,0x65,0x05,0x60,0xE6,0x83,0xE3,0x86 /* hi */
        .byte   0x94,0xF1,0x91,0xF4,0x72,0x17,0x77,0x12
-END(dipthi)
+END(dipt)
 
-       .type   dsb9_0,_ASM_TYPE_OBJECT
-dsb9_0:
-       .byte   0x00,0xD6,0x86,0x9A,0x53,0x03,0x1C,0x85
+       .type   dsb9,_ASM_TYPE_OBJECT
+dsb9:
+       .byte   0x00,0xD6,0x86,0x9A,0x53,0x03,0x1C,0x85 /* 0 */
        .byte   0xC9,0x4C,0x99,0x4F,0x50,0x1F,0xD5,0xCA
-END(dsb9_0)
-
-       .type   dsb9_1,_ASM_TYPE_OBJECT
-dsb9_1:
-       .byte   0x00,0x49,0xD7,0xEC,0x89,0x17,0x3B,0xC0
+       .byte   0x00,0x49,0xD7,0xEC,0x89,0x17,0x3B,0xC0 /* 1 */
        .byte   0x65,0xA5,0xFB,0xB2,0x9E,0x2C,0x5E,0x72
-END(dsb9_1)
+END(dsb9)
 
-       .type   dsbd_0,_ASM_TYPE_OBJECT
-dsbd_0:
-       .byte   0x00,0xA2,0xB1,0xE6,0xDF,0xCC,0x57,0x7D
+       .type   dsbd,_ASM_TYPE_OBJECT
+dsbd:
+       .byte   0x00,0xA2,0xB1,0xE6,0xDF,0xCC,0x57,0x7D /* 0 */
        .byte   0x39,0x44,0x2A,0x88,0x13,0x9B,0x6E,0xF5
-END(dsbd_0)
-
-       .type   dsbd_1,_ASM_TYPE_OBJECT
-dsbd_1:
-       .byte   0x00,0xCB,0xC6,0x24,0xF7,0xFA,0xE2,0x3C
+       .byte   0x00,0xCB,0xC6,0x24,0xF7,0xFA,0xE2,0x3C /* 1 */
        .byte   0xD3,0xEF,0xDE,0x15,0x0D,0x18,0x31,0x29
-END(dsbd_1)
-
-       .type   dsbb_0,_ASM_TYPE_OBJECT
-dsbb_0:
-       .byte   0x00,0x42,0xB4,0x96,0x92,0x64,0x22,0xD0
-       .byte   0x04,0xD4,0xF2,0xB0,0xF6,0x46,0x26,0x60
-END(dsbb_0)
+END(dsbd)
 
-       .type   dsbb_1,_ASM_TYPE_OBJECT
-dsbb_1:
-       .byte   0x00,0x67,0x59,0xCD,0xA6,0x98,0x94,0xC1
+       .type   dsbb,_ASM_TYPE_OBJECT
+dsbb:
+       .byte   0x00,0x42,0xB4,0x96,0x92,0x64,0x22,0xD0 /* 0 */
+       .byte   0x04,0xD4,0xF2,0xB0,0xF6,0x46,0x26,0x60
+       .byte   0x00,0x67,0x59,0xCD,0xA6,0x98,0x94,0xC1 /* 1 */
        .byte   0x6B,0xAA,0x55,0x32,0x3E,0x0C,0xFF,0xF3
-END(dsbb_1)
-
-       .type   dsbe_0,_ASM_TYPE_OBJECT
-dsbe_0:
-       .byte   0x00,0xD0,0xD4,0x26,0x96,0x92,0xF2,0x46
-       .byte   0xB0,0xF6,0xB4,0x64,0x04,0x60,0x42,0x22
-END(dsbe_0)
+END(dsbb)
 
-       .type   dsbe_1,_ASM_TYPE_OBJECT
-dsbe_1:
-       .byte   0x00,0xC1,0xAA,0xFF,0xCD,0xA6,0x55,0x0C
+       .type   dsbe,_ASM_TYPE_OBJECT
+dsbe:
+       .byte   0x00,0xD0,0xD4,0x26,0x96,0x92,0xF2,0x46 /* 0 */
+       .byte   0xB0,0xF6,0xB4,0x64,0x04,0x60,0x42,0x22
+       .byte   0x00,0xC1,0xAA,0xFF,0xCD,0xA6,0x55,0x0C /* 1 */
        .byte   0x32,0x3E,0x59,0x98,0x6B,0xF3,0x67,0x94
-END(dsbe_1)
+END(dsbe)
 
-       .type   dsbo_0,_ASM_TYPE_OBJECT
-dsbo_0:
-       .byte   0x00,0x40,0xF9,0x7E,0x53,0xEA,0x87,0x13
+       .type   dsbo,_ASM_TYPE_OBJECT
+dsbo:
+       .byte   0x00,0x40,0xF9,0x7E,0x53,0xEA,0x87,0x13 /* 0 */
        .byte   0x2D,0x3E,0x94,0xD4,0xB9,0x6D,0xAA,0xC7
-END(dsbo_0)
-
-       .type   dsbo_1,_ASM_TYPE_OBJECT
-dsbo_1:
-       .byte   0x00,0x1D,0x44,0x93,0x0F,0x56,0xD7,0x12
+       .byte   0x00,0x1D,0x44,0x93,0x0F,0x56,0xD7,0x12 /* 1 */
        .byte   0x9C,0x8E,0xC5,0xD8,0x59,0x81,0x4B,0xCA
-END(dsbo_1)
+END(dsbo)
 
 /*
  * aes_neon_enc1(enc, x, nrounds)
@@ -274,7 +235,7 @@
        ldr     r12, .Lconstants_addr
        adr     r11, .Lconstants_addr
 
-       vld1.8  {d28-d29}, [r0 :128]!   /* q14 = *rk++ */
+       vld1.8  {q14}, [r0 :128]!       /* q14 = *rk++ */
        movw    r3, #0
        vmov.i8 q1, #0x0f
 
@@ -282,24 +243,16 @@
        add     r12, r12, r11
 
        /* (q4, q5) := (iptlo, ipthi) */
-       add     r6, r12, #(iptlo - .Lconstants)
-       add     r7, r12, #(ipthi - .Lconstants)
-       vld1.8  {d8-d9}, [r6 :128]
-       vld1.8  {d10-d11}, [r7 :128]
+       add     r6, r12, #(ipt - .Lconstants)
+       vld1.8  {q4-q5}, [r6 :256]
 
        /* load the rest of the constants */
-       add     r4, r12, #(sb1_0 - .Lconstants)
-       add     r5, r12, #(sb1_1 - .Lconstants)
-       add     r6, r12, #(sb2_0 - .Lconstants)
-       add     r7, r12, #(sb2_1 - .Lconstants)
-       add     r8, r12, #(inv - .Lconstants)
-       add     r10, r12, #(inva - .Lconstants)
-       vld1.8  {d12-d13}, [r4 :128]    /* q6 = sb1[0] */
-       vld1.8  {d14-d15}, [r5 :128]    /* q7 = sb1[1] */
-       vld1.8  {d16-d17}, [r6 :128]    /* q8 = sb2[0] */
-       vld1.8  {d18-d19}, [r7 :128]    /* q9 = sb2[1] */
-       vld1.8  {d20-d21}, [r8 :128]    /* q10 = inv */
-       vld1.8  {d22-d23}, [r10 :128]   /* q11 = inva */
+       add     r4, r12, #(sb1 - .Lconstants)
+       add     r6, r12, #(sb2 - .Lconstants)
+       add     r8, r12, #(.Linv_inva - .Lconstants)
+       vld1.8  {q6-q7}, [r4 :256]      /* q6 = sb1[0], q7 = sb1[1] */
+       vld1.8  {q8-q9}, [r6 :256]      /* q8 = sb2[0], q9 = sb2[1] */
+       vld1.8  {q10-q11}, [r8 :256]    /* q10 = inv, q11 = inva */
 
        /* (r4, r5) := (&mc_forward[0], &mc_backward[0]) */
        add     r4, r12, #(mc_forward - .Lconstants)
@@ -323,7 +276,7 @@
        b       2f
 
        _ALIGN_TEXT
-1:     vld1.8  {d28-d29}, [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, {d12-d13}, d4
@@ -343,8 +296,8 @@
        /* (q12, q13) := (mc_forward[rmod4], mc_backward[rmod4]) */
        add     r6, r4, r3, lsl #4
        add     r7, r5, r3, lsl #4
-       vld1.8  {d24-d25}, [r6]
-       vld1.8  {d26-d27}, [r7]
+       vld1.8  {q12}, [r6 :128]
+       vld1.8  {q13}, [r7 :128]
 
        /* q15 := A2_B = A2 + A(mcf) */
        vtbl.8  d30, {d0-d1}, d24
@@ -413,14 +366,12 @@
 
        /* (q6, q7, q15) := (sbo[0], sbo[1], sr[rmod4]) */
        add     r8, r12, #(sr - .Lconstants)
-       add     r6, r12, #(sbo_0 - .Lconstants)
-       add     r7, r12, #(sbo_1 - .Lconstants)
+       add     r6, r12, #(sbo - .Lconstants)
        add     r8, r8, r3, lsl #4
-       vld1.8  {d12-d13}, [r6 :128]
-       vld1.8  {d14-d15}, [r7 :128]
-       vld1.8  {d30-d31}, [r8 :128]
+       vld1.8  {q6-q7}, [r6 :256]
+       vld1.8  {q15}, [r8 :128]
 
-       vld1.8  {d28-d29}, [r0 :128]!   /* q14 = *rk++ */
+       vld1.8  {q14}, [r0 :128]!       /* q14 = *rk++ */
 
        /* (q2, q3) := (sbo_0(io), sbo_1(jo)) */
        vtbl.8  d4, {d12-d13}, d4
@@ -502,7 +453,7 @@
        ldr     r12, .Lconstants_addr
        adr     r11, .Lconstants_addr
 
-       vld1.8  {d28-d29}, [r0 :128]!   /* q14 = *rk++ */
+       vld1.8  {q14}, [r0 :128]!       /* q14 = *rk++ */
        rsb     r3, r1, #0              /* r3 := ~(x - 1) = -x */
        vmov.i8 q1, #0x0f
        and     r3, r3, #3              /* r3 := 3 & ~(x - 1) */



Home | Main Index | Thread Index | Old Index