Home | History | Annotate | Line # | Download | only in arm
aes_neon_32.S revision 1.1
      1  1.1  riastrad /*	$NetBSD: aes_neon_32.S,v 1.1 2020/06/29 23:57:56 riastradh Exp $	*/
      2  1.1  riastrad 
      3  1.1  riastrad /*-
      4  1.1  riastrad  * Copyright (c) 2020 The NetBSD Foundation, Inc.
      5  1.1  riastrad  * All rights reserved.
      6  1.1  riastrad  *
      7  1.1  riastrad  * Redistribution and use in source and binary forms, with or without
      8  1.1  riastrad  * modification, are permitted provided that the following conditions
      9  1.1  riastrad  * are met:
     10  1.1  riastrad  * 1. Redistributions of source code must retain the above copyright
     11  1.1  riastrad  *    notice, this list of conditions and the following disclaimer.
     12  1.1  riastrad  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1  riastrad  *    notice, this list of conditions and the following disclaimer in the
     14  1.1  riastrad  *    documentation and/or other materials provided with the distribution.
     15  1.1  riastrad  *
     16  1.1  riastrad  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     17  1.1  riastrad  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18  1.1  riastrad  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19  1.1  riastrad  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     20  1.1  riastrad  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  1.1  riastrad  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  1.1  riastrad  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23  1.1  riastrad  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24  1.1  riastrad  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25  1.1  riastrad  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26  1.1  riastrad  * POSSIBILITY OF SUCH DAMAGE.
     27  1.1  riastrad  */
     28  1.1  riastrad 
     29  1.1  riastrad #include <arm/asm.h>
     30  1.1  riastrad 
     31  1.1  riastrad 	.fpu	neon
     32  1.1  riastrad 
     33  1.1  riastrad 	.section .rodata
     34  1.1  riastrad 	.p2align 4
     35  1.1  riastrad 
     36  1.1  riastrad 	.type	inv,_ASM_TYPE_OBJECT
     37  1.1  riastrad inv:
     38  1.1  riastrad 	.byte	0x80,0x01,0x08,0x0D,0x0F,0x06,0x05,0x0E
     39  1.1  riastrad 	.byte	0x02,0x0C,0x0B,0x0A,0x09,0x03,0x07,0x04
     40  1.1  riastrad END(inv)
     41  1.1  riastrad 
     42  1.1  riastrad 	.type	inva,_ASM_TYPE_OBJECT
     43  1.1  riastrad inva:
     44  1.1  riastrad 	.byte	0x80,0x07,0x0B,0x0F,0x06,0x0A,0x04,0x01
     45  1.1  riastrad 	.byte	0x09,0x08,0x05,0x02,0x0C,0x0E,0x0D,0x03
     46  1.1  riastrad END(inva)
     47  1.1  riastrad 
     48  1.1  riastrad 	.type	mc_forward,_ASM_TYPE_OBJECT
     49  1.1  riastrad mc_forward:
     50  1.1  riastrad 	.byte	0x01,0x02,0x03,0x00,0x05,0x06,0x07,0x04	/* 0 */
     51  1.1  riastrad 	.byte	0x09,0x0A,0x0B,0x08,0x0D,0x0E,0x0F,0x0C
     52  1.1  riastrad 
     53  1.1  riastrad 	.byte	0x05,0x06,0x07,0x04,0x09,0x0A,0x0B,0x08	/* 1 */
     54  1.1  riastrad 	.byte	0x0D,0x0E,0x0F,0x0C,0x01,0x02,0x03,0x00
     55  1.1  riastrad 
     56  1.1  riastrad 	.byte	0x09,0x0A,0x0B,0x08,0x0D,0x0E,0x0F,0x0C	/* 2 */
     57  1.1  riastrad 	.byte	0x01,0x02,0x03,0x00,0x05,0x06,0x07,0x04
     58  1.1  riastrad 
     59  1.1  riastrad .Lmc_forward_3:
     60  1.1  riastrad 	.byte	0x0D,0x0E,0x0F,0x0C,0x01,0x02,0x03,0x00	/* 3 */
     61  1.1  riastrad 	.byte	0x05,0x06,0x07,0x04,0x09,0x0A,0x0B,0x08
     62  1.1  riastrad END(mc_forward)
     63  1.1  riastrad 
     64  1.1  riastrad 	.type	mc_backward,_ASM_TYPE_OBJECT
     65  1.1  riastrad mc_backward:
     66  1.1  riastrad 	.byte	0x03,0x00,0x01,0x02,0x07,0x04,0x05,0x06	/* 0 */
     67  1.1  riastrad 	.byte	0x0B,0x08,0x09,0x0A,0x0F,0x0C,0x0D,0x0E
     68  1.1  riastrad 
     69  1.1  riastrad 	.byte	0x0F,0x0C,0x0D,0x0E,0x03,0x00,0x01,0x02	/* 1 */
     70  1.1  riastrad 	.byte	0x07,0x04,0x05,0x06,0x0B,0x08,0x09,0x0A
     71  1.1  riastrad 
     72  1.1  riastrad 	.byte	0x0B,0x08,0x09,0x0A,0x0F,0x0C,0x0D,0x0E	/* 2 */
     73  1.1  riastrad 	.byte	0x03,0x00,0x01,0x02,0x07,0x04,0x05,0x06
     74  1.1  riastrad 
     75  1.1  riastrad 	.byte	0x07,0x04,0x05,0x06,0x0B,0x08,0x09,0x0A	/* 3 */
     76  1.1  riastrad 	.byte	0x0F,0x0C,0x0D,0x0E,0x03,0x00,0x01,0x02
     77  1.1  riastrad END(mc_backward)
     78  1.1  riastrad 
     79  1.1  riastrad 	.type	sr,_ASM_TYPE_OBJECT
     80  1.1  riastrad sr:
     81  1.1  riastrad 	.byte	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07	/* 0 */
     82  1.1  riastrad 	.byte	0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F
     83  1.1  riastrad 
     84  1.1  riastrad 	.byte	0x00,0x05,0x0A,0x0F,0x04,0x09,0x0E,0x03	/* 1 */
     85  1.1  riastrad 	.byte	0x08,0x0D,0x02,0x07,0x0C,0x01,0x06,0x0B
     86  1.1  riastrad 
     87  1.1  riastrad 	.byte	0x00,0x09,0x02,0x0B,0x04,0x0D,0x06,0x0F	/* 2 */
     88  1.1  riastrad 	.byte	0x08,0x01,0x0A,0x03,0x0C,0x05,0x0E,0x07
     89  1.1  riastrad 
     90  1.1  riastrad 	.byte	0x00,0x0D,0x0A,0x07,0x04,0x01,0x0E,0x0B	/* 3 */
     91  1.1  riastrad 	.byte	0x08,0x05,0x02,0x0F,0x0C,0x09,0x06,0x03
     92  1.1  riastrad END(sr)
     93  1.1  riastrad 
     94  1.1  riastrad 	.type	iptlo,_ASM_TYPE_OBJECT
     95  1.1  riastrad iptlo:
     96  1.1  riastrad 	.byte	0x00,0x70,0x2A,0x5A,0x98,0xE8,0xB2,0xC2
     97  1.1  riastrad 	.byte	0x08,0x78,0x22,0x52,0x90,0xE0,0xBA,0xCA
     98  1.1  riastrad END(iptlo)
     99  1.1  riastrad 
    100  1.1  riastrad 	.type	ipthi,_ASM_TYPE_OBJECT
    101  1.1  riastrad ipthi:
    102  1.1  riastrad 	.byte	0x00,0x4D,0x7C,0x31,0x7D,0x30,0x01,0x4C
    103  1.1  riastrad 	.byte	0x81,0xCC,0xFD,0xB0,0xFC,0xB1,0x80,0xCD
    104  1.1  riastrad END(ipthi)
    105  1.1  riastrad 
    106  1.1  riastrad 	.type	sb1_0,_ASM_TYPE_OBJECT
    107  1.1  riastrad sb1_0:
    108  1.1  riastrad 	.byte	0x00,0x3E,0x50,0xCB,0x8F,0xE1,0x9B,0xB1
    109  1.1  riastrad 	.byte	0x44,0xF5,0x2A,0x14,0x6E,0x7A,0xDF,0xA5
    110  1.1  riastrad END(sb1_0)
    111  1.1  riastrad 
    112  1.1  riastrad 	.type	sb1_1,_ASM_TYPE_OBJECT
    113  1.1  riastrad sb1_1:
    114  1.1  riastrad 	.byte	0x00,0x23,0xE2,0xFA,0x15,0xD4,0x18,0x36
    115  1.1  riastrad 	.byte	0xEF,0xD9,0x2E,0x0D,0xC1,0xCC,0xF7,0x3B
    116  1.1  riastrad END(sb1_1)
    117  1.1  riastrad 
    118  1.1  riastrad 	.type	sb2_0,_ASM_TYPE_OBJECT
    119  1.1  riastrad sb2_0:
    120  1.1  riastrad 	.byte	0x00,0x24,0x71,0x0B,0xC6,0x93,0x7A,0xE2
    121  1.1  riastrad 	.byte	0xCD,0x2F,0x98,0xBC,0x55,0xE9,0xB7,0x5E
    122  1.1  riastrad END(sb2_0)
    123  1.1  riastrad 
    124  1.1  riastrad 	.type	sb2_1,_ASM_TYPE_OBJECT
    125  1.1  riastrad sb2_1:
    126  1.1  riastrad 	.byte	0x00,0x29,0xE1,0x0A,0x40,0x88,0xEB,0x69
    127  1.1  riastrad 	.byte	0x4A,0x23,0x82,0xAB,0xC8,0x63,0xA1,0xC2
    128  1.1  riastrad END(sb2_1)
    129  1.1  riastrad 
    130  1.1  riastrad 	.type	sbo_0,_ASM_TYPE_OBJECT
    131  1.1  riastrad sbo_0:
    132  1.1  riastrad 	.byte	0x00,0xC7,0xBD,0x6F,0x17,0x6D,0xD2,0xD0
    133  1.1  riastrad 	.byte	0x78,0xA8,0x02,0xC5,0x7A,0xBF,0xAA,0x15
    134  1.1  riastrad END(sbo_0)
    135  1.1  riastrad 
    136  1.1  riastrad 	.type	sbo_1,_ASM_TYPE_OBJECT
    137  1.1  riastrad sbo_1:
    138  1.1  riastrad 	.byte	0x00,0x6A,0xBB,0x5F,0xA5,0x74,0xE4,0xCF
    139  1.1  riastrad 	.byte	0xFA,0x35,0x2B,0x41,0xD1,0x90,0x1E,0x8E
    140  1.1  riastrad END(sbo_1)
    141  1.1  riastrad 
    142  1.1  riastrad 	.type	diptlo,_ASM_TYPE_OBJECT
    143  1.1  riastrad diptlo:
    144  1.1  riastrad 	.byte	0x00,0x5F,0x54,0x0B,0x04,0x5B,0x50,0x0F
    145  1.1  riastrad 	.byte	0x1A,0x45,0x4E,0x11,0x1E,0x41,0x4A,0x15
    146  1.1  riastrad END(diptlo)
    147  1.1  riastrad 
    148  1.1  riastrad 	.type	dipthi,_ASM_TYPE_OBJECT
    149  1.1  riastrad dipthi:
    150  1.1  riastrad 	.byte	0x00,0x65,0x05,0x60,0xE6,0x83,0xE3,0x86
    151  1.1  riastrad 	.byte	0x94,0xF1,0x91,0xF4,0x72,0x17,0x77,0x12
    152  1.1  riastrad END(dipthi)
    153  1.1  riastrad 
    154  1.1  riastrad 	.type	dsb9_0,_ASM_TYPE_OBJECT
    155  1.1  riastrad dsb9_0:
    156  1.1  riastrad 	.byte	0x00,0xD6,0x86,0x9A,0x53,0x03,0x1C,0x85
    157  1.1  riastrad 	.byte	0xC9,0x4C,0x99,0x4F,0x50,0x1F,0xD5,0xCA
    158  1.1  riastrad END(dsb9_0)
    159  1.1  riastrad 
    160  1.1  riastrad 	.type	dsb9_1,_ASM_TYPE_OBJECT
    161  1.1  riastrad dsb9_1:
    162  1.1  riastrad 	.byte	0x00,0x49,0xD7,0xEC,0x89,0x17,0x3B,0xC0
    163  1.1  riastrad 	.byte	0x65,0xA5,0xFB,0xB2,0x9E,0x2C,0x5E,0x72
    164  1.1  riastrad END(dsb9_1)
    165  1.1  riastrad 
    166  1.1  riastrad 	.type	dsbd_0,_ASM_TYPE_OBJECT
    167  1.1  riastrad dsbd_0:
    168  1.1  riastrad 	.byte	0x00,0xA2,0xB1,0xE6,0xDF,0xCC,0x57,0x7D
    169  1.1  riastrad 	.byte	0x39,0x44,0x2A,0x88,0x13,0x9B,0x6E,0xF5
    170  1.1  riastrad END(dsbd_0)
    171  1.1  riastrad 
    172  1.1  riastrad 	.type	dsbd_1,_ASM_TYPE_OBJECT
    173  1.1  riastrad dsbd_1:
    174  1.1  riastrad 	.byte	0x00,0xCB,0xC6,0x24,0xF7,0xFA,0xE2,0x3C
    175  1.1  riastrad 	.byte	0xD3,0xEF,0xDE,0x15,0x0D,0x18,0x31,0x29
    176  1.1  riastrad END(dsbd_1)
    177  1.1  riastrad 
    178  1.1  riastrad 	.type	dsbb_0,_ASM_TYPE_OBJECT
    179  1.1  riastrad dsbb_0:
    180  1.1  riastrad 	.byte	0x00,0x42,0xB4,0x96,0x92,0x64,0x22,0xD0
    181  1.1  riastrad 	.byte	0x04,0xD4,0xF2,0xB0,0xF6,0x46,0x26,0x60
    182  1.1  riastrad END(dsbb_0)
    183  1.1  riastrad 
    184  1.1  riastrad 	.type	dsbb_1,_ASM_TYPE_OBJECT
    185  1.1  riastrad dsbb_1:
    186  1.1  riastrad 	.byte	0x00,0x67,0x59,0xCD,0xA6,0x98,0x94,0xC1
    187  1.1  riastrad 	.byte	0x6B,0xAA,0x55,0x32,0x3E,0x0C,0xFF,0xF3
    188  1.1  riastrad END(dsbb_1)
    189  1.1  riastrad 
    190  1.1  riastrad 	.type	dsbe_0,_ASM_TYPE_OBJECT
    191  1.1  riastrad dsbe_0:
    192  1.1  riastrad 	.byte	0x00,0xD0,0xD4,0x26,0x96,0x92,0xF2,0x46
    193  1.1  riastrad 	.byte	0xB0,0xF6,0xB4,0x64,0x04,0x60,0x42,0x22
    194  1.1  riastrad END(dsbe_0)
    195  1.1  riastrad 
    196  1.1  riastrad 	.type	dsbe_1,_ASM_TYPE_OBJECT
    197  1.1  riastrad dsbe_1:
    198  1.1  riastrad 	.byte	0x00,0xC1,0xAA,0xFF,0xCD,0xA6,0x55,0x0C
    199  1.1  riastrad 	.byte	0x32,0x3E,0x59,0x98,0x6B,0xF3,0x67,0x94
    200  1.1  riastrad END(dsbe_1)
    201  1.1  riastrad 
    202  1.1  riastrad 	.type	dsbo_0,_ASM_TYPE_OBJECT
    203  1.1  riastrad dsbo_0:
    204  1.1  riastrad 	.byte	0x00,0x40,0xF9,0x7E,0x53,0xEA,0x87,0x13
    205  1.1  riastrad 	.byte	0x2D,0x3E,0x94,0xD4,0xB9,0x6D,0xAA,0xC7
    206  1.1  riastrad END(dsbo_0)
    207  1.1  riastrad 
    208  1.1  riastrad 	.type	dsbo_1,_ASM_TYPE_OBJECT
    209  1.1  riastrad dsbo_1:
    210  1.1  riastrad 	.byte	0x00,0x1D,0x44,0x93,0x0F,0x56,0xD7,0x12
    211  1.1  riastrad 	.byte	0x9C,0x8E,0xC5,0xD8,0x59,0x81,0x4B,0xCA
    212  1.1  riastrad END(dsbo_1)
    213  1.1  riastrad 
    214  1.1  riastrad /*
    215  1.1  riastrad  * aes_neon_enc1(enc, x, nrounds)
    216  1.1  riastrad  *
    217  1.1  riastrad  *	With -mfloat-abi=hard:
    218  1.1  riastrad  *
    219  1.1  riastrad  * uint8x16_t@q0
    220  1.1  riastrad  * aes_neon_enc1(const struct aesenc *enc@r0, uint8x16_t x@q0,
    221  1.1  riastrad  *     unsigned nrounds@r1)
    222  1.1  riastrad  *
    223  1.1  riastrad  *	With -mfloat-abi=soft(fp) (here spelled `#ifdef _KERNEL'):
    224  1.1  riastrad  *
    225  1.1  riastrad  * uint8x16_t@(r0,r1,r2,r3)
    226  1.1  riastrad  * aes_neon_enc1(const struct aesenc *enc@r0,
    227  1.1  riastrad  *     uint8x16_t x@(r2,r3,sp[0],sp[4]), nrounds@sp[8])
    228  1.1  riastrad  */
    229  1.1  riastrad ENTRY(aes_neon_enc1)
    230  1.1  riastrad #ifdef _KERNEL
    231  1.1  riastrad 	vmov	d0, r2, r3		/* d0 := x lo */
    232  1.1  riastrad 	vldr	d1, [sp]		/* d1 := x hi */
    233  1.1  riastrad 	ldr	r1, [sp, #8]		/* r1 := nrounds */
    234  1.1  riastrad #endif
    235  1.1  riastrad 	push	{r4, r5, r6, r7, r8, r10, r11, lr}
    236  1.1  riastrad 	vpush	{d8-d15}
    237  1.1  riastrad 
    238  1.1  riastrad 	/*
    239  1.1  riastrad 	 * r3: rmod4
    240  1.1  riastrad 	 * r4: mc_forward
    241  1.1  riastrad 	 * r5: mc_backward
    242  1.1  riastrad 	 * r6,r7,r8,r10,r11: temporaries
    243  1.1  riastrad 	 * q0={d0-d1}: x/ak/A
    244  1.1  riastrad 	 * q1={d2-d3}: 0x0f0f...
    245  1.1  riastrad 	 * q2={d4-d5}: lo/k/j/io
    246  1.1  riastrad 	 * q3={d6-d7}: hi/i/jo
    247  1.1  riastrad 	 * q4={d8-d9}: iptlo
    248  1.1  riastrad 	 * q5={d10-d11}: ipthi
    249  1.1  riastrad 	 * q6={d12-d13}: sb1[0]/sbo[0]
    250  1.1  riastrad 	 * q7={d14-d15}: sb1[1]/sbo[1]
    251  1.1  riastrad 	 * q8={d16-d17}: sb2[0]
    252  1.1  riastrad 	 * q9={d18-d19}: sb2[1]
    253  1.1  riastrad 	 * q10={d20-d21}: inv
    254  1.1  riastrad 	 * q11={d22-d23}: inva
    255  1.1  riastrad 	 * q12={d24-d25}: ir/iak/iakr/sb1_0(io)/mc_backward[rmod4]
    256  1.1  riastrad 	 * q13={d26-d27}: jr/jak/jakr/sb1_1(jo)/mc_forward[rmod4]
    257  1.1  riastrad 	 * q14={d28-d29}: rk/A2/A2_B_D
    258  1.1  riastrad 	 * q15={d30-d31}: A2_B/sr[rmod4]
    259  1.1  riastrad 	 */
    260  1.1  riastrad 
    261  1.1  riastrad 	vld1.64	{d28-d29}, [r0 :128]!	/* q14 = *rk++ */
    262  1.1  riastrad 	movw	r3, #0
    263  1.1  riastrad 	vmov.i8	q1, #0x0f
    264  1.1  riastrad 
    265  1.1  riastrad 	/* (q4, q5) := (iptlo, ipthi) */
    266  1.1  riastrad 	ldr	r6, =iptlo
    267  1.1  riastrad 	ldr	r7, =ipthi
    268  1.1  riastrad 	vld1.64	{d8-d9}, [r6 :128]
    269  1.1  riastrad 	vld1.64	{d10-d11}, [r7 :128]
    270  1.1  riastrad 
    271  1.1  riastrad 	/* load the rest of the constants */
    272  1.1  riastrad 	ldr	r4, =sb1_0
    273  1.1  riastrad 	ldr	r5, =sb1_1
    274  1.1  riastrad 	ldr	r6, =sb2_0
    275  1.1  riastrad 	ldr	r7, =sb2_1
    276  1.1  riastrad 	ldr	r8, =inv
    277  1.1  riastrad 	ldr	r10, =inva
    278  1.1  riastrad 	vld1.64	{d12-d13}, [r4 :128]	/* q6 = sb1[0] */
    279  1.1  riastrad 	vld1.64	{d14-d15}, [r5 :128]	/* q7 = sb1[1] */
    280  1.1  riastrad 	vld1.64	{d16-d17}, [r6 :128]	/* q8 = sb2[0] */
    281  1.1  riastrad 	vld1.64	{d18-d19}, [r7 :128]	/* q9 = sb2[1] */
    282  1.1  riastrad 	vld1.64	{d20-d21}, [r8 :128]	/* q10 = inv */
    283  1.1  riastrad 	vld1.64	{d22-d23}, [r10 :128]	/* q11 = inva */
    284  1.1  riastrad 
    285  1.1  riastrad 	/* (r4, r5) := (&mc_forward[0], &mc_backward[0]) */
    286  1.1  riastrad 	ldr	r4, =mc_forward
    287  1.1  riastrad 	ldr	r5, =mc_backward
    288  1.1  riastrad 
    289  1.1  riastrad 	/* (q2, q3) := (lo, hi) */
    290  1.1  riastrad 	vshr.u8	q3, q0, #4
    291  1.1  riastrad 	vand	q2, q0, q1		/* q2 := x & 0x0f0f... */
    292  1.1  riastrad 	vand	q3, q3, q1		/* q3 := (x >> 4) & 0x0f0f... */
    293  1.1  riastrad 
    294  1.1  riastrad 	/* (q2, q3) := (iptlo(lo), ipthi(hi)) */
    295  1.1  riastrad 	vtbl.8	d4, {d8-d9}, d4
    296  1.1  riastrad 	vtbl.8	d5, {d8-d9}, d5
    297  1.1  riastrad 	vtbl.8	d6, {d10-d11}, d6
    298  1.1  riastrad 	vtbl.8	d7, {d10-d11}, d7
    299  1.1  riastrad 
    300  1.1  riastrad 	/* q0 := rk[0] + iptlo(lo) + ipthi(hi) */
    301  1.1  riastrad 	veor	q0, q14, q2
    302  1.1  riastrad 	veor	q0, q0, q3
    303  1.1  riastrad 
    304  1.1  riastrad 	b	2f
    305  1.1  riastrad 
    306  1.1  riastrad 1:	vld1.64	{d28-d29}, [r0 :128]!	/* q14 = *rk++ */
    307  1.1  riastrad 
    308  1.1  riastrad 	/* q0 := A = rk[i] + sb1_0(io) + sb1_1(jo) */
    309  1.1  riastrad 	vtbl.8	d24, {d12-d13}, d4
    310  1.1  riastrad 	vtbl.8	d25, {d12-d13}, d5
    311  1.1  riastrad 	vtbl.8	d26, {d14-d15}, d6
    312  1.1  riastrad 	vtbl.8	d27, {d14-d15}, d7
    313  1.1  riastrad 	veor	q0, q14, q12
    314  1.1  riastrad 	veor	q0, q0, q13
    315  1.1  riastrad 
    316  1.1  riastrad 	/* q14 := A2 = sb2_0[io] + sb2_1[jo] */
    317  1.1  riastrad 	vtbl.8	d24, {d16-d17}, d4
    318  1.1  riastrad 	vtbl.8	d25, {d16-d17}, d5
    319  1.1  riastrad 	vtbl.8	d26, {d18-d19}, d6
    320  1.1  riastrad 	vtbl.8	d27, {d18-d19}, d7
    321  1.1  riastrad 	veor	q14, q12, q13
    322  1.1  riastrad 
    323  1.1  riastrad 	/* (q12, q13) := (mc_forward[rmod4], mc_backward[rmod4]) */
    324  1.1  riastrad 	add	r6, r4, r3, lsl #4
    325  1.1  riastrad 	add	r7, r5, r3, lsl #4
    326  1.1  riastrad 	vld1.64	{d24-d25}, [r6]
    327  1.1  riastrad 	vld1.64	{d26-d27}, [r7]
    328  1.1  riastrad 
    329  1.1  riastrad 	/* q15 := A2_B = A2 + A(mcf) */
    330  1.1  riastrad 	vtbl.8	d30, {d0-d1}, d24
    331  1.1  riastrad 	vtbl.8	d31, {d0-d1}, d25
    332  1.1  riastrad 	veor	q15, q15, q14
    333  1.1  riastrad 
    334  1.1  riastrad 	/* q14 := A2_B_D = A2_B + A(mcb) */
    335  1.1  riastrad 	vtbl.8	d28, {d0-d1}, d26
    336  1.1  riastrad 	vtbl.8	d29, {d0-d1}, d27
    337  1.1  riastrad 	veor	q14, q14, q15
    338  1.1  riastrad 
    339  1.1  riastrad 	/* q0 := x = A2_B_D + A2_B(mcf) */
    340  1.1  riastrad 	vtbl.8	d0, {d30-d31}, d24
    341  1.1  riastrad 	vtbl.8	d1, {d30-d31}, d25
    342  1.1  riastrad 	veor	q0, q0, q14
    343  1.1  riastrad 
    344  1.1  riastrad 2:	/*
    345  1.1  riastrad 	 * SubBytes
    346  1.1  riastrad 	 */
    347  1.1  riastrad 
    348  1.1  riastrad 	/* (q2, q3) := (k, i) */
    349  1.1  riastrad 	vshr.u8	q3, q0, #4
    350  1.1  riastrad 	vand	q2, q0, q1		/* q2 := x & 0x0f0f... */
    351  1.1  riastrad 	vand	q3, q3, q1		/* q3 := (x >> 4) & 0x0f0f... */
    352  1.1  riastrad 
    353  1.1  riastrad 	/* q0 := a/k */
    354  1.1  riastrad 	vtbl.8	d0, {d22-d23}, d4
    355  1.1  riastrad 	vtbl.8	d1, {d22-d23}, d5
    356  1.1  riastrad 
    357  1.1  riastrad 	/* q2 := j = i + k */
    358  1.1  riastrad 	veor	q2, q3, q2
    359  1.1  riastrad 
    360  1.1  riastrad 	/* q12 := ir = 1/i */
    361  1.1  riastrad 	vtbl.8	d24, {d20-d21}, d6
    362  1.1  riastrad 	vtbl.8	d25, {d20-d21}, d7
    363  1.1  riastrad 
    364  1.1  riastrad 	/* q13 := jr = 1/j */
    365  1.1  riastrad 	vtbl.8	d26, {d20-d21}, d4
    366  1.1  riastrad 	vtbl.8	d27, {d20-d21}, d5
    367  1.1  riastrad 
    368  1.1  riastrad 	/* q12 := iak = 1/i + a/k */
    369  1.1  riastrad 	veor	q12, q12, q0
    370  1.1  riastrad 
    371  1.1  riastrad 	/* q13 := jak = 1/j + a/k */
    372  1.1  riastrad 	veor	q13, q13, q0
    373  1.1  riastrad 
    374  1.1  riastrad 	/* q12 := iakr = 1/(1/i + a/k) */
    375  1.1  riastrad 	vtbl.8	d24, {d20-d21}, d24
    376  1.1  riastrad 	vtbl.8	d25, {d20-d21}, d25
    377  1.1  riastrad 
    378  1.1  riastrad 	/* q13 := jakr = 1/(1/j + a/k) */
    379  1.1  riastrad 	vtbl.8	d26, {d20-d21}, d26
    380  1.1  riastrad 	vtbl.8	d27, {d20-d21}, d27
    381  1.1  riastrad 
    382  1.1  riastrad 	/* q2 := io = j + 1/(1/i + a/k) */
    383  1.1  riastrad 	veor	q2, q2, q12
    384  1.1  riastrad 
    385  1.1  riastrad 	/* q3 := jo = i + 1/(1/j + a/k) */
    386  1.1  riastrad 	veor	q3, q3, q13
    387  1.1  riastrad 
    388  1.1  riastrad 	/* advance round */
    389  1.1  riastrad 	add	r3, r3, #1
    390  1.1  riastrad 	subs	r1, r1, #1
    391  1.1  riastrad 	and	r3, r3, #3
    392  1.1  riastrad 	bne	1b
    393  1.1  riastrad 
    394  1.1  riastrad 	/* (q6, q7, q15) := (sbo[0], sbo[1], sr[rmod4]) */
    395  1.1  riastrad 	ldr	r8, =sr
    396  1.1  riastrad 	ldr	r6, =sbo_0
    397  1.1  riastrad 	ldr	r7, =sbo_1
    398  1.1  riastrad 	add	r8, r8, r3, lsl #4
    399  1.1  riastrad 	vld1.64	{d12-d13}, [r6 :128]
    400  1.1  riastrad 	vld1.64	{d14-d15}, [r7 :128]
    401  1.1  riastrad 	vld1.64	{d30-d31}, [r8 :128]
    402  1.1  riastrad 
    403  1.1  riastrad 	vld1.64	{d28-d29}, [r0 :128]!	/* q14 = *rk++ */
    404  1.1  riastrad 
    405  1.1  riastrad 	/* (q2, q3) := (sbo_0(io), sbo_1(jo)) */
    406  1.1  riastrad 	vtbl.8	d4, {d12-d13}, d4
    407  1.1  riastrad 	vtbl.8	d5, {d12-d13}, d5
    408  1.1  riastrad 	vtbl.8	d6, {d14-d15}, d6
    409  1.1  riastrad 	vtbl.8	d7, {d14-d15}, d7
    410  1.1  riastrad 
    411  1.1  riastrad 	/* q2 := x = rk[nr] + sbo_0(io) + sbo_1(jo) */
    412  1.1  riastrad 	veor	q2, q2, q14
    413  1.1  riastrad 	veor	q2, q2, q3
    414  1.1  riastrad 
    415  1.1  riastrad 	/* q0 := x(sr[rmod4]) */
    416  1.1  riastrad 	vtbl.8	d0, {d4-d5}, d30
    417  1.1  riastrad 	vtbl.8	d1, {d4-d5}, d31
    418  1.1  riastrad 
    419  1.1  riastrad 	vpop	{d8-d15}
    420  1.1  riastrad 	pop	{r4, r5, r6, r7, r8, r10, r11, lr}
    421  1.1  riastrad #ifdef _KERNEL
    422  1.1  riastrad 	vmov	r0, r1, d0
    423  1.1  riastrad 	vmov	r2, r3, d1
    424  1.1  riastrad #endif
    425  1.1  riastrad 	bx	lr
    426  1.1  riastrad END(aes_neon_enc1)
    427  1.1  riastrad 
    428  1.1  riastrad /*
    429  1.1  riastrad  * aes_neon_dec1(dec, x, nrounds)
    430  1.1  riastrad  *
    431  1.1  riastrad  *	With -mfloat-abi=hard:
    432  1.1  riastrad  *
    433  1.1  riastrad  * uint8x16_t@q0
    434  1.1  riastrad  * aes_neon_dec1(const struct aesdec *dec@r0, uint8x16_t x@q0,
    435  1.1  riastrad  *     unsigned nrounds@r1)
    436  1.1  riastrad  *
    437  1.1  riastrad  *	With -mfloat-abi=soft(fp) (here spelled `#ifdef _KERNEL'):
    438  1.1  riastrad  *
    439  1.1  riastrad  * uint8x16_t@(r0,r1,r2,r3)
    440  1.1  riastrad  * aes_neon_dec1(const struct aesdec *dec@r0,
    441  1.1  riastrad  *     uint8x16_t x@(r2,r3,sp[0],sp[4]), nrounds@sp[8])
    442  1.1  riastrad  */
    443  1.1  riastrad ENTRY(aes_neon_dec1)
    444  1.1  riastrad #ifdef _KERNEL
    445  1.1  riastrad 	vmov	d0, r2, r3		/* d0 := x lo */
    446  1.1  riastrad 	vldr	d1, [sp]		/* d1 := x hi */
    447  1.1  riastrad 	ldr	r1, [sp, #8]		/* r1 := nrounds */
    448  1.1  riastrad #endif
    449  1.1  riastrad 	push	{r4, r5, r6, r7, r8, r10, r11, lr}
    450  1.1  riastrad 	vpush	{d8-d15}
    451  1.1  riastrad 
    452  1.1  riastrad 	/*
    453  1.1  riastrad 	 * r3: 3 & ~(nrounds - 1)
    454  1.1  riastrad 	 * q0={d0-d1}: x/ak
    455  1.1  riastrad 	 * q1={d2-d3}: 0x0f0f...
    456  1.1  riastrad 	 * q2={d4-d5}: lo/k/j/io
    457  1.1  riastrad 	 * q3={d6-d7}: hi/i/jo
    458  1.1  riastrad 	 * q4={d8-d9}: diptlo/dsb9[0]
    459  1.1  riastrad 	 * q5={d10-d11}: dipthi/dsb9[1]
    460  1.1  riastrad 	 * q6={d12-d13}: dsbb[0]/dsbo[0]
    461  1.1  riastrad 	 * q7={d14-d15}: dsbb[1]/dsbo[1]
    462  1.1  riastrad 	 * q8={d16-d17}: dsbd[0]/dsbe[0]
    463  1.1  riastrad 	 * q9={d18-d19}: dsbd[1]/dsbe[0]
    464  1.1  riastrad 	 * q10={d20-d21}: inv
    465  1.1  riastrad 	 * q11={d22-d23}: inva
    466  1.1  riastrad 	 * q12={d24-d25}: ir/iak/iakr/dsbX_0(io)
    467  1.1  riastrad 	 * q13={d26-d27}: jr/jak/jakr/dsbX_1(jo)
    468  1.1  riastrad 	 * q14={d28-d29}: rk/xmc
    469  1.1  riastrad 	 * q15={d30-d31}: mc/sr[3 & ~(nrounds - 1)]
    470  1.1  riastrad 	 */
    471  1.1  riastrad 
    472  1.1  riastrad 	vld1.64	{d28-d29}, [r0 :128]!	/* q14 = *rk++ */
    473  1.1  riastrad 	rsb	r3, r1, #0		/* r3 := ~(x - 1) = -x */
    474  1.1  riastrad 	vmov.i8	q1, #0x0f
    475  1.1  riastrad 	and	r3, r3, #3		/* r3 := 3 & ~(x - 1) */
    476  1.1  riastrad 
    477  1.1  riastrad 	/* (q4, q5) := (diptlo, dipthi) */
    478  1.1  riastrad 	ldr	r6, =diptlo
    479  1.1  riastrad 	ldr	r7, =dipthi
    480  1.1  riastrad 	vld1.64	{d8-d9}, [r6 :128]
    481  1.1  riastrad 	vld1.64	{d10-d11}, [r7 :128]
    482  1.1  riastrad 
    483  1.1  riastrad 	/* load the rest of the constants */
    484  1.1  riastrad 	ldr	r4, =dsbb_0
    485  1.1  riastrad 	ldr	r5, =dsbb_1
    486  1.1  riastrad 	ldr	r6, =inv
    487  1.1  riastrad 	ldr	r7, =inva
    488  1.1  riastrad 	ldr	r8, =.Lmc_forward_3
    489  1.1  riastrad 	vld1.64	{d12-d13}, [r4 :128]	/* q6 := dsbb[0] */
    490  1.1  riastrad 	vld1.64	{d14-d15}, [r5 :128]	/* q7 := dsbb[1] */
    491  1.1  riastrad 	vld1.64	{d20-d21}, [r6 :128]	/* q10 := inv */
    492  1.1  riastrad 	vld1.64	{d22-d23}, [r7 :128]	/* q11 := inva */
    493  1.1  riastrad 	vld1.64	{d30-d31}, [r8 :128]	/* q15 := mc_forward[3] */
    494  1.1  riastrad 
    495  1.1  riastrad 	/* (q2, q3) := (lo, hi) */
    496  1.1  riastrad 	vshr.u8	q3, q0, #4
    497  1.1  riastrad 	vand	q2, q0, q1		/* q2 := x & 0x0f0f... */
    498  1.1  riastrad 	vand	q3, q3, q1		/* q3 := (x >> 4) & 0x0f0f... */
    499  1.1  riastrad 
    500  1.1  riastrad 	/* (q2, q3) := (diptlo(lo), dipthi(hi)) */
    501  1.1  riastrad 	vtbl.8	d4, {d8-d9}, d4
    502  1.1  riastrad 	vtbl.8	d5, {d8-d9}, d5
    503  1.1  riastrad 	vtbl.8	d6, {d10-d11}, d6
    504  1.1  riastrad 	vtbl.8	d7, {d10-d11}, d7
    505  1.1  riastrad 
    506  1.1  riastrad 	/* load dsb9 */
    507  1.1  riastrad 	ldr	r4, =dsb9_0
    508  1.1  riastrad 	ldr	r5, =dsb9_1
    509  1.1  riastrad 	vld1.64	{d8-d9}, [r4 :128]	/* q4 := dsb9[0] */
    510  1.1  riastrad 	vld1.64	{d10-d11}, [r5 :128]	/* q5 := dsb9[1] */
    511  1.1  riastrad 
    512  1.1  riastrad 	/* q0 := rk[0] + diptlo(lo) + dipthi(hi) */
    513  1.1  riastrad 	veor	q0, q14, q2
    514  1.1  riastrad 	veor	q0, q0, q3
    515  1.1  riastrad 
    516  1.1  riastrad 	b	2f
    517  1.1  riastrad 
    518  1.1  riastrad 1:	/* load dsbd */
    519  1.1  riastrad 	ldr	r4, =dsbd_0
    520  1.1  riastrad 	vld1.64	{d16-d17}, [r4 :128]!	/* q8 := dsbd[0] */
    521  1.1  riastrad 	vld1.64	{d18-d19}, [r4 :128]	/* q9 := dsbd[1] */
    522  1.1  riastrad 
    523  1.1  riastrad 	vld1.64	{d28-d29}, [r0 :128]!	/* q14 = *rk++ */
    524  1.1  riastrad 
    525  1.1  riastrad 	/* q0 := rk[i] + dsb9_0(io) + dsb9_1(jo) */
    526  1.1  riastrad 	vtbl.8	d24, {d8-d9}, d4
    527  1.1  riastrad 	vtbl.8	d25, {d8-d9}, d5
    528  1.1  riastrad 	vtbl.8	d26, {d10-d11}, d6
    529  1.1  riastrad 	vtbl.8	d27, {d10-d11}, d7
    530  1.1  riastrad 	veor	q0, q14, q12
    531  1.1  riastrad 	veor	q0, q0, q13
    532  1.1  riastrad 
    533  1.1  riastrad 	/* q14 := x(mc) */
    534  1.1  riastrad 	vtbl.8	d28, {d0-d1}, d30
    535  1.1  riastrad 	vtbl.8	d29, {d0-d1}, d31
    536  1.1  riastrad 
    537  1.1  riastrad 	/* q0 := x(mc) + dsbd_0(io) + dsbd_1(jo) */
    538  1.1  riastrad 	vtbl.8	d24, {d16-d17}, d4
    539  1.1  riastrad 	vtbl.8	d25, {d16-d17}, d5
    540  1.1  riastrad 	vtbl.8	d26, {d18-d19}, d6
    541  1.1  riastrad 	vtbl.8	d27, {d18-d19}, d7
    542  1.1  riastrad 	veor	q0, q14, q12
    543  1.1  riastrad 	veor	q0, q0, q13
    544  1.1  riastrad 
    545  1.1  riastrad 	/* load dsbe */
    546  1.1  riastrad 	ldr	r4, =dsbe_0
    547  1.1  riastrad 	vld1.64	{d16-d17}, [r4 :128]!	/* q8 := dsbe[0] */
    548  1.1  riastrad 	vld1.64	{d18-d19}, [r4 :128]	/* q9 := dsbe[1] */
    549  1.1  riastrad 
    550  1.1  riastrad 	/* q0 := x(mc) + dsbb_0(io) + dsbb_1(jo) */
    551  1.1  riastrad 	vtbl.8	d28, {d0-d1}, d30
    552  1.1  riastrad 	vtbl.8	d29, {d0-d1}, d31
    553  1.1  riastrad 	vtbl.8	d24, {d12-d13}, d4
    554  1.1  riastrad 	vtbl.8	d25, {d12-d13}, d5
    555  1.1  riastrad 	vtbl.8	d26, {d14-d15}, d6
    556  1.1  riastrad 	vtbl.8	d27, {d14-d15}, d7
    557  1.1  riastrad 	veor	q0, q14, q12
    558  1.1  riastrad 	veor	q0, q0, q13
    559  1.1  riastrad 
    560  1.1  riastrad 	/* q0 := x(mc) + dsbe_0(io) + dsbe_1(jo) */
    561  1.1  riastrad 	vtbl.8	d28, {d0-d1}, d30
    562  1.1  riastrad 	vtbl.8	d29, {d0-d1}, d31
    563  1.1  riastrad 	vtbl.8	d24, {d16-d17}, d4
    564  1.1  riastrad 	vtbl.8	d25, {d16-d17}, d5
    565  1.1  riastrad 	vtbl.8	d26, {d18-d19}, d6
    566  1.1  riastrad 	vtbl.8	d27, {d18-d19}, d7
    567  1.1  riastrad 	veor	q0, q14, q12
    568  1.1  riastrad 	veor	q0, q0, q13
    569  1.1  riastrad 
    570  1.1  riastrad 	/* q15 := mc := mc <<< 12*8 */
    571  1.1  riastrad 	vext.8	q15, q15, q15, #12
    572  1.1  riastrad 
    573  1.1  riastrad 2:	/*
    574  1.1  riastrad 	 * SubBytes
    575  1.1  riastrad 	 */
    576  1.1  riastrad 
    577  1.1  riastrad 	/* (q2, q3) := (k, i) */
    578  1.1  riastrad 	vshr.u8	q3, q0, #4
    579  1.1  riastrad 	vand	q2, q0, q1		/* q2 := x & 0x0f0f... */
    580  1.1  riastrad 	vand	q3, q3, q1		/* q3 := (x >> 4) & 0x0f0f... */
    581  1.1  riastrad 
    582  1.1  riastrad 	/* q0 := a/k */
    583  1.1  riastrad 	vtbl.8	d0, {d22-d23}, d4
    584  1.1  riastrad 	vtbl.8	d1, {d22-d23}, d5
    585  1.1  riastrad 
    586  1.1  riastrad 	/* q2 := j = i + k */
    587  1.1  riastrad 	veor	q2, q3, q2
    588  1.1  riastrad 
    589  1.1  riastrad 	/* q12 := ir = 1/i */
    590  1.1  riastrad 	vtbl.8	d24, {d20-d21}, d6
    591  1.1  riastrad 	vtbl.8	d25, {d20-d21}, d7
    592  1.1  riastrad 
    593  1.1  riastrad 	/* q13 := jr = 1/j */
    594  1.1  riastrad 	vtbl.8	d26, {d20-d21}, d4
    595  1.1  riastrad 	vtbl.8	d27, {d20-d21}, d5
    596  1.1  riastrad 
    597  1.1  riastrad 	/* q12 := iak = 1/i + a/k */
    598  1.1  riastrad 	veor	q12, q12, q0
    599  1.1  riastrad 
    600  1.1  riastrad 	/* q13 := jak = 1/j + a/k */
    601  1.1  riastrad 	veor	q13, q13, q0
    602  1.1  riastrad 
    603  1.1  riastrad 	/* q12 := iakr = 1/(1/i + a/k) */
    604  1.1  riastrad 	vtbl.8	d24, {d20-d21}, d24
    605  1.1  riastrad 	vtbl.8	d25, {d20-d21}, d25
    606  1.1  riastrad 
    607  1.1  riastrad 	/* q13 := jakr = 1/(1/j + a/k) */
    608  1.1  riastrad 	vtbl.8	d26, {d20-d21}, d26
    609  1.1  riastrad 	vtbl.8	d27, {d20-d21}, d27
    610  1.1  riastrad 
    611  1.1  riastrad 	/* q2 := io = j + 1/(1/i + a/k) */
    612  1.1  riastrad 	veor	q2, q2, q12
    613  1.1  riastrad 
    614  1.1  riastrad 	/* q3 := jo = i + 1/(1/j + a/k) */
    615  1.1  riastrad 	veor	q3, q3, q13
    616  1.1  riastrad 
    617  1.1  riastrad 	/* advance round */
    618  1.1  riastrad 	subs	r1, r1, #1
    619  1.1  riastrad 	bne	1b
    620  1.1  riastrad 
    621  1.1  riastrad 	/* (q6, q7, q15) := (dsbo[0], dsbo[1], sr[i]) */
    622  1.1  riastrad 	ldr	r8, =sr
    623  1.1  riastrad 	ldr	r6, =dsbo_0
    624  1.1  riastrad 	ldr	r7, =dsbo_1
    625  1.1  riastrad 	add	r8, r8, r3, lsl #4
    626  1.1  riastrad 	vld1.64	{d12-d13}, [r6 :128]
    627  1.1  riastrad 	vld1.64	{d14-d15}, [r7 :128]
    628  1.1  riastrad 	vld1.64	{d30-d31}, [r8 :128]
    629  1.1  riastrad 
    630  1.1  riastrad 	vld1.64	{d28-d29}, [r0 :128]!	/* q14 = *rk++ */
    631  1.1  riastrad 
    632  1.1  riastrad 	/* (q2, q3) := (dsbo_0(io), dsbo_1(jo)) */
    633  1.1  riastrad 	vtbl.8	d4, {d12-d13}, d4
    634  1.1  riastrad 	vtbl.8	d5, {d12-d13}, d5
    635  1.1  riastrad 	vtbl.8	d6, {d14-d15}, d6
    636  1.1  riastrad 	vtbl.8	d7, {d14-d15}, d7
    637  1.1  riastrad 
    638  1.1  riastrad 	/* q2 := x = rk[nr] + dsbo_0(io) + dsbo_1(jo) */
    639  1.1  riastrad 	veor	q2, q2, q14
    640  1.1  riastrad 	veor	q2, q2, q3
    641  1.1  riastrad 
    642  1.1  riastrad 	/* q0 := x(sr[i]) */
    643  1.1  riastrad 	vtbl.8	d0, {d4-d5}, d30
    644  1.1  riastrad 	vtbl.8	d1, {d4-d5}, d31
    645  1.1  riastrad 
    646  1.1  riastrad 	vpop	{d8-d15}
    647  1.1  riastrad 	pop	{r4, r5, r6, r7, r8, r10, r11, lr}
    648  1.1  riastrad #ifdef _KERNEL
    649  1.1  riastrad 	vmov	r0, r1, d0
    650  1.1  riastrad 	vmov	r2, r3, d1
    651  1.1  riastrad #endif
    652  1.1  riastrad 	bx	lr
    653  1.1  riastrad END(aes_neon_dec1)
    654