Home | History | Annotate | Line # | Download | only in arm
      1      1.1  christos #include "arm_asm.h"
      2  1.1.1.2  christos #include "arm_arch.h"
      3      1.1  christos 
      4      1.1  christos .text
      5  1.1.1.2  christos #if defined(__thumb2__)
      6  1.1.1.2  christos .syntax	unified
      7  1.1.1.2  christos .thumb
      8  1.1.1.2  christos #else
      9      1.1  christos .code	32
     10  1.1.1.2  christos #endif
     11      1.1  christos 
     12      1.1  christos #if __ARM_MAX_ARCH__>=7
     13      1.1  christos .align	5
     14      1.1  christos .LOPENSSL_armcap:
     15  1.1.1.2  christos .word	OPENSSL_armcap_P-.Lbn_mul_mont
     16      1.1  christos #endif
     17      1.1  christos 
     18  1.1.1.2  christos .globl	bn_mul_mont
     19      1.1  christos .type	bn_mul_mont,%function
     20      1.1  christos 
     21      1.1  christos .align	5
     22      1.1  christos bn_mul_mont:
     23  1.1.1.2  christos .Lbn_mul_mont:
     24      1.1  christos 	ldr	ip,[sp,#4]		@ load num
     25      1.1  christos 	stmdb	sp!,{r0,r2}		@ sp points at argument block
     26      1.1  christos #if __ARM_MAX_ARCH__>=7
     27      1.1  christos 	tst	ip,#7
     28      1.1  christos 	bne	.Lialu
     29  1.1.1.2  christos 	adr	r0,.Lbn_mul_mont
     30      1.1  christos 	ldr	r2,.LOPENSSL_armcap
     31      1.1  christos 	ldr	r0,[r0,r2]
     32  1.1.1.2  christos #ifdef	__APPLE__
     33  1.1.1.2  christos 	ldr	r0,[r0]
     34  1.1.1.2  christos #endif
     35  1.1.1.2  christos 	tst	r0,#ARMV7_NEON		@ NEON available?
     36      1.1  christos 	ldmia	sp, {r0,r2}
     37      1.1  christos 	beq	.Lialu
     38      1.1  christos 	add	sp,sp,#8
     39      1.1  christos 	b	bn_mul8x_mont_neon
     40      1.1  christos .align	4
     41      1.1  christos .Lialu:
     42      1.1  christos #endif
     43      1.1  christos 	cmp	ip,#2
     44      1.1  christos 	mov	r0,ip			@ load num
     45  1.1.1.2  christos #ifdef	__thumb2__
     46  1.1.1.2  christos 	ittt	lt
     47  1.1.1.2  christos #endif
     48      1.1  christos 	movlt	r0,#0
     49      1.1  christos 	addlt	sp,sp,#2*4
     50      1.1  christos 	blt	.Labrt
     51      1.1  christos 
     52  1.1.1.2  christos 	stmdb	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}		@ save 10 registers
     53      1.1  christos 
     54      1.1  christos 	mov	r0,r0,lsl#2		@ rescale r0 for byte count
     55      1.1  christos 	sub	sp,sp,r0		@ alloca(4*num)
     56      1.1  christos 	sub	sp,sp,#4		@ +extra dword
     57      1.1  christos 	sub	r0,r0,#4		@ "num=num-1"
     58      1.1  christos 	add	r4,r2,r0		@ &bp[num-1]
     59      1.1  christos 
     60      1.1  christos 	add	r0,sp,r0		@ r0 to point at &tp[num-1]
     61      1.1  christos 	ldr	r8,[r0,#14*4]		@ &n0
     62      1.1  christos 	ldr	r2,[r2]		@ bp[0]
     63      1.1  christos 	ldr	r5,[r1],#4		@ ap[0],ap++
     64      1.1  christos 	ldr	r6,[r3],#4		@ np[0],np++
     65      1.1  christos 	ldr	r8,[r8]		@ *n0
     66      1.1  christos 	str	r4,[r0,#15*4]		@ save &bp[num]
     67      1.1  christos 
     68      1.1  christos 	umull	r10,r11,r5,r2	@ ap[0]*bp[0]
     69      1.1  christos 	str	r8,[r0,#14*4]		@ save n0 value
     70      1.1  christos 	mul	r8,r10,r8		@ "tp[0]"*n0
     71      1.1  christos 	mov	r12,#0
     72      1.1  christos 	umlal	r10,r12,r6,r8	@ np[0]*n0+"t[0]"
     73      1.1  christos 	mov	r4,sp
     74      1.1  christos 
     75      1.1  christos .L1st:
     76      1.1  christos 	ldr	r5,[r1],#4		@ ap[j],ap++
     77      1.1  christos 	mov	r10,r11
     78      1.1  christos 	ldr	r6,[r3],#4		@ np[j],np++
     79      1.1  christos 	mov	r11,#0
     80      1.1  christos 	umlal	r10,r11,r5,r2	@ ap[j]*bp[0]
     81      1.1  christos 	mov	r14,#0
     82      1.1  christos 	umlal	r12,r14,r6,r8	@ np[j]*n0
     83      1.1  christos 	adds	r12,r12,r10
     84      1.1  christos 	str	r12,[r4],#4		@ tp[j-1]=,tp++
     85      1.1  christos 	adc	r12,r14,#0
     86      1.1  christos 	cmp	r4,r0
     87      1.1  christos 	bne	.L1st
     88      1.1  christos 
     89      1.1  christos 	adds	r12,r12,r11
     90      1.1  christos 	ldr	r4,[r0,#13*4]		@ restore bp
     91      1.1  christos 	mov	r14,#0
     92      1.1  christos 	ldr	r8,[r0,#14*4]		@ restore n0
     93      1.1  christos 	adc	r14,r14,#0
     94      1.1  christos 	str	r12,[r0]		@ tp[num-1]=
     95  1.1.1.2  christos 	mov	r7,sp
     96      1.1  christos 	str	r14,[r0,#4]		@ tp[num]=
     97  1.1.1.2  christos 
     98      1.1  christos .Louter:
     99  1.1.1.2  christos 	sub	r7,r0,r7		@ "original" r0-1 value
    100      1.1  christos 	sub	r1,r1,r7		@ "rewind" ap to &ap[1]
    101      1.1  christos 	ldr	r2,[r4,#4]!		@ *(++bp)
    102      1.1  christos 	sub	r3,r3,r7		@ "rewind" np to &np[1]
    103      1.1  christos 	ldr	r5,[r1,#-4]		@ ap[0]
    104      1.1  christos 	ldr	r10,[sp]		@ tp[0]
    105      1.1  christos 	ldr	r6,[r3,#-4]		@ np[0]
    106      1.1  christos 	ldr	r7,[sp,#4]		@ tp[1]
    107      1.1  christos 
    108      1.1  christos 	mov	r11,#0
    109      1.1  christos 	umlal	r10,r11,r5,r2	@ ap[0]*bp[i]+tp[0]
    110      1.1  christos 	str	r4,[r0,#13*4]		@ save bp
    111      1.1  christos 	mul	r8,r10,r8
    112      1.1  christos 	mov	r12,#0
    113      1.1  christos 	umlal	r10,r12,r6,r8	@ np[0]*n0+"tp[0]"
    114      1.1  christos 	mov	r4,sp
    115      1.1  christos 
    116      1.1  christos .Linner:
    117      1.1  christos 	ldr	r5,[r1],#4		@ ap[j],ap++
    118      1.1  christos 	adds	r10,r11,r7		@ +=tp[j]
    119      1.1  christos 	ldr	r6,[r3],#4		@ np[j],np++
    120      1.1  christos 	mov	r11,#0
    121      1.1  christos 	umlal	r10,r11,r5,r2	@ ap[j]*bp[i]
    122      1.1  christos 	mov	r14,#0
    123      1.1  christos 	umlal	r12,r14,r6,r8	@ np[j]*n0
    124      1.1  christos 	adc	r11,r11,#0
    125      1.1  christos 	ldr	r7,[r4,#8]		@ tp[j+1]
    126      1.1  christos 	adds	r12,r12,r10
    127      1.1  christos 	str	r12,[r4],#4		@ tp[j-1]=,tp++
    128      1.1  christos 	adc	r12,r14,#0
    129      1.1  christos 	cmp	r4,r0
    130      1.1  christos 	bne	.Linner
    131      1.1  christos 
    132      1.1  christos 	adds	r12,r12,r11
    133      1.1  christos 	mov	r14,#0
    134      1.1  christos 	ldr	r4,[r0,#13*4]		@ restore bp
    135      1.1  christos 	adc	r14,r14,#0
    136      1.1  christos 	ldr	r8,[r0,#14*4]		@ restore n0
    137      1.1  christos 	adds	r12,r12,r7
    138      1.1  christos 	ldr	r7,[r0,#15*4]		@ restore &bp[num]
    139      1.1  christos 	adc	r14,r14,#0
    140      1.1  christos 	str	r12,[r0]		@ tp[num-1]=
    141      1.1  christos 	str	r14,[r0,#4]		@ tp[num]=
    142      1.1  christos 
    143      1.1  christos 	cmp	r4,r7
    144  1.1.1.2  christos #ifdef	__thumb2__
    145  1.1.1.2  christos 	itt	ne
    146  1.1.1.2  christos #endif
    147  1.1.1.2  christos 	movne	r7,sp
    148      1.1  christos 	bne	.Louter
    149  1.1.1.2  christos 
    150      1.1  christos 	ldr	r2,[r0,#12*4]		@ pull rp
    151  1.1.1.2  christos 	mov	r5,sp
    152      1.1  christos 	add	r0,r0,#4		@ r0 to point at &tp[num]
    153  1.1.1.2  christos 	sub	r5,r0,r5		@ "original" num value
    154      1.1  christos 	mov	r4,sp			@ "rewind" r4
    155      1.1  christos 	mov	r1,r4			@ "borrow" r1
    156      1.1  christos 	sub	r3,r3,r5		@ "rewind" r3 to &np[0]
    157      1.1  christos 
    158      1.1  christos 	subs	r7,r7,r7		@ "clear" carry flag
    159      1.1  christos .Lsub:	ldr	r7,[r4],#4
    160      1.1  christos 	ldr	r6,[r3],#4
    161      1.1  christos 	sbcs	r7,r7,r6		@ tp[j]-np[j]
    162      1.1  christos 	str	r7,[r2],#4		@ rp[j]=
    163      1.1  christos 	teq	r4,r0		@ preserve carry
    164      1.1  christos 	bne	.Lsub
    165      1.1  christos 	sbcs	r14,r14,#0		@ upmost carry
    166      1.1  christos 	mov	r4,sp			@ "rewind" r4
    167      1.1  christos 	sub	r2,r2,r5		@ "rewind" r2
    168      1.1  christos 
    169  1.1.1.2  christos .Lcopy:	ldr	r7,[r4]		@ conditional copy
    170  1.1.1.2  christos 	ldr	r5,[r2]
    171      1.1  christos 	str	sp,[r4],#4		@ zap tp
    172  1.1.1.2  christos #ifdef	__thumb2__
    173  1.1.1.2  christos 	it	cc
    174  1.1.1.2  christos #endif
    175  1.1.1.2  christos 	movcc	r5,r7
    176  1.1.1.2  christos 	str	r5,[r2],#4
    177  1.1.1.2  christos 	teq	r4,r0		@ preserve carry
    178      1.1  christos 	bne	.Lcopy
    179      1.1  christos 
    180  1.1.1.2  christos 	mov	sp,r0
    181  1.1.1.2  christos 	add	sp,sp,#4		@ skip over tp[num+1]
    182  1.1.1.2  christos 	ldmia	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}		@ restore registers
    183      1.1  christos 	add	sp,sp,#2*4		@ skip over {r0,r2}
    184      1.1  christos 	mov	r0,#1
    185      1.1  christos .Labrt:
    186      1.1  christos #if __ARM_ARCH__>=5
    187  1.1.1.2  christos 	RET				@ bx lr
    188      1.1  christos #else
    189      1.1  christos 	tst	lr,#1
    190      1.1  christos 	moveq	pc,lr			@ be binary compatible with V4, yet
    191  1.1.1.2  christos .word	0xe12fff1e			@ interoperable with Thumb ISA:-)
    192      1.1  christos #endif
    193      1.1  christos .size	bn_mul_mont,.-bn_mul_mont
    194      1.1  christos #if __ARM_MAX_ARCH__>=7
    195      1.1  christos .arch	armv7-a
    196      1.1  christos .fpu	neon
    197      1.1  christos 
    198      1.1  christos .type	bn_mul8x_mont_neon,%function
    199      1.1  christos .align	5
    200      1.1  christos bn_mul8x_mont_neon:
    201      1.1  christos 	mov	ip,sp
    202  1.1.1.2  christos 	stmdb	sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
    203  1.1.1.2  christos 	vstmdb	sp!,{d8,d9,d10,d11,d12,d13,d14,d15}		@ ABI specification says so
    204  1.1.1.2  christos 	ldmia	ip,{r4,r5}		@ load rest of parameter block
    205  1.1.1.2  christos 	mov	ip,sp
    206  1.1.1.2  christos 
    207  1.1.1.2  christos 	cmp	r5,#8
    208  1.1.1.2  christos 	bhi	.LNEON_8n
    209  1.1.1.2  christos 
    210  1.1.1.2  christos 	@ special case for r5==8, everything is in register bank...
    211  1.1.1.2  christos 
    212  1.1.1.2  christos 	vld1.32	{d28[0]}, [r2,:32]!
    213  1.1.1.2  christos 	veor	d8,d8,d8
    214  1.1.1.2  christos 	sub	r7,sp,r5,lsl#4
    215  1.1.1.2  christos 	vld1.32	{d0,d1,d2,d3},  [r1]!		@ can't specify :32 :-(
    216  1.1.1.2  christos 	and	r7,r7,#-64
    217  1.1.1.2  christos 	vld1.32	{d30[0]}, [r4,:32]
    218  1.1.1.2  christos 	mov	sp,r7			@ alloca
    219  1.1.1.2  christos 	vzip.16	d28,d8
    220      1.1  christos 
    221      1.1  christos 	vmull.u32	q6,d28,d0[0]
    222      1.1  christos 	vmull.u32	q7,d28,d0[1]
    223      1.1  christos 	vmull.u32	q8,d28,d1[0]
    224  1.1.1.2  christos 	vshl.i64	d29,d13,#16
    225      1.1  christos 	vmull.u32	q9,d28,d1[1]
    226      1.1  christos 
    227  1.1.1.2  christos 	vadd.u64	d29,d29,d12
    228  1.1.1.2  christos 	veor	d8,d8,d8
    229  1.1.1.2  christos 	vmul.u32	d29,d29,d30
    230      1.1  christos 
    231      1.1  christos 	vmull.u32	q10,d28,d2[0]
    232  1.1.1.2  christos 	vld1.32	{d4,d5,d6,d7}, [r3]!
    233      1.1  christos 	vmull.u32	q11,d28,d2[1]
    234      1.1  christos 	vmull.u32	q12,d28,d3[0]
    235  1.1.1.2  christos 	vzip.16	d29,d8
    236      1.1  christos 	vmull.u32	q13,d28,d3[1]
    237      1.1  christos 
    238      1.1  christos 	vmlal.u32	q6,d29,d4[0]
    239  1.1.1.2  christos 	sub	r9,r5,#1
    240      1.1  christos 	vmlal.u32	q7,d29,d4[1]
    241      1.1  christos 	vmlal.u32	q8,d29,d5[0]
    242      1.1  christos 	vmlal.u32	q9,d29,d5[1]
    243      1.1  christos 
    244      1.1  christos 	vmlal.u32	q10,d29,d6[0]
    245  1.1.1.2  christos 	vmov	q5,q6
    246      1.1  christos 	vmlal.u32	q11,d29,d6[1]
    247  1.1.1.2  christos 	vmov	q6,q7
    248      1.1  christos 	vmlal.u32	q12,d29,d7[0]
    249  1.1.1.2  christos 	vmov	q7,q8
    250      1.1  christos 	vmlal.u32	q13,d29,d7[1]
    251  1.1.1.2  christos 	vmov	q8,q9
    252  1.1.1.2  christos 	vmov	q9,q10
    253      1.1  christos 	vshr.u64	d10,d10,#16
    254  1.1.1.2  christos 	vmov	q10,q11
    255  1.1.1.2  christos 	vmov	q11,q12
    256      1.1  christos 	vadd.u64	d10,d10,d11
    257  1.1.1.2  christos 	vmov	q12,q13
    258  1.1.1.2  christos 	veor	q13,q13
    259      1.1  christos 	vshr.u64	d10,d10,#16
    260      1.1  christos 
    261      1.1  christos 	b	.LNEON_outer8
    262      1.1  christos 
    263      1.1  christos .align	4
    264      1.1  christos .LNEON_outer8:
    265  1.1.1.2  christos 	vld1.32	{d28[0]}, [r2,:32]!
    266  1.1.1.2  christos 	veor	d8,d8,d8
    267  1.1.1.2  christos 	vzip.16	d28,d8
    268      1.1  christos 	vadd.u64	d12,d12,d10
    269      1.1  christos 
    270      1.1  christos 	vmlal.u32	q6,d28,d0[0]
    271      1.1  christos 	vmlal.u32	q7,d28,d0[1]
    272      1.1  christos 	vmlal.u32	q8,d28,d1[0]
    273  1.1.1.2  christos 	vshl.i64	d29,d13,#16
    274      1.1  christos 	vmlal.u32	q9,d28,d1[1]
    275      1.1  christos 
    276  1.1.1.2  christos 	vadd.u64	d29,d29,d12
    277  1.1.1.2  christos 	veor	d8,d8,d8
    278  1.1.1.2  christos 	subs	r9,r9,#1
    279  1.1.1.2  christos 	vmul.u32	d29,d29,d30
    280      1.1  christos 
    281      1.1  christos 	vmlal.u32	q10,d28,d2[0]
    282      1.1  christos 	vmlal.u32	q11,d28,d2[1]
    283      1.1  christos 	vmlal.u32	q12,d28,d3[0]
    284  1.1.1.2  christos 	vzip.16	d29,d8
    285      1.1  christos 	vmlal.u32	q13,d28,d3[1]
    286      1.1  christos 
    287      1.1  christos 	vmlal.u32	q6,d29,d4[0]
    288      1.1  christos 	vmlal.u32	q7,d29,d4[1]
    289      1.1  christos 	vmlal.u32	q8,d29,d5[0]
    290      1.1  christos 	vmlal.u32	q9,d29,d5[1]
    291      1.1  christos 
    292      1.1  christos 	vmlal.u32	q10,d29,d6[0]
    293  1.1.1.2  christos 	vmov	q5,q6
    294      1.1  christos 	vmlal.u32	q11,d29,d6[1]
    295  1.1.1.2  christos 	vmov	q6,q7
    296      1.1  christos 	vmlal.u32	q12,d29,d7[0]
    297  1.1.1.2  christos 	vmov	q7,q8
    298      1.1  christos 	vmlal.u32	q13,d29,d7[1]
    299  1.1.1.2  christos 	vmov	q8,q9
    300  1.1.1.2  christos 	vmov	q9,q10
    301      1.1  christos 	vshr.u64	d10,d10,#16
    302  1.1.1.2  christos 	vmov	q10,q11
    303  1.1.1.2  christos 	vmov	q11,q12
    304      1.1  christos 	vadd.u64	d10,d10,d11
    305  1.1.1.2  christos 	vmov	q12,q13
    306  1.1.1.2  christos 	veor	q13,q13
    307      1.1  christos 	vshr.u64	d10,d10,#16
    308      1.1  christos 
    309      1.1  christos 	bne	.LNEON_outer8
    310      1.1  christos 
    311      1.1  christos 	vadd.u64	d12,d12,d10
    312  1.1.1.2  christos 	mov	r7,sp
    313      1.1  christos 	vshr.u64	d10,d12,#16
    314  1.1.1.2  christos 	mov	r8,r5
    315      1.1  christos 	vadd.u64	d13,d13,d10
    316  1.1.1.2  christos 	add	r6,sp,#96
    317      1.1  christos 	vshr.u64	d10,d13,#16
    318  1.1.1.2  christos 	vzip.16	d12,d13
    319      1.1  christos 
    320  1.1.1.2  christos 	b	.LNEON_tail_entry
    321      1.1  christos 
    322      1.1  christos .align	4
    323  1.1.1.2  christos .LNEON_8n:
    324  1.1.1.2  christos 	veor	q6,q6,q6
    325  1.1.1.2  christos 	sub	r7,sp,#128
    326  1.1.1.2  christos 	veor	q7,q7,q7
    327  1.1.1.2  christos 	sub	r7,r7,r5,lsl#4
    328  1.1.1.2  christos 	veor	q8,q8,q8
    329  1.1.1.2  christos 	and	r7,r7,#-64
    330  1.1.1.2  christos 	veor	q9,q9,q9
    331  1.1.1.2  christos 	mov	sp,r7			@ alloca
    332  1.1.1.2  christos 	veor	q10,q10,q10
    333  1.1.1.2  christos 	add	r7,r7,#256
    334  1.1.1.2  christos 	veor	q11,q11,q11
    335  1.1.1.2  christos 	sub	r8,r5,#8
    336  1.1.1.2  christos 	veor	q12,q12,q12
    337  1.1.1.2  christos 	veor	q13,q13,q13
    338  1.1.1.2  christos 
    339  1.1.1.2  christos .LNEON_8n_init:
    340  1.1.1.2  christos 	vst1.64	{q6,q7},[r7,:256]!
    341  1.1.1.2  christos 	subs	r8,r8,#8
    342  1.1.1.2  christos 	vst1.64	{q8,q9},[r7,:256]!
    343  1.1.1.2  christos 	vst1.64	{q10,q11},[r7,:256]!
    344  1.1.1.2  christos 	vst1.64	{q12,q13},[r7,:256]!
    345  1.1.1.2  christos 	bne	.LNEON_8n_init
    346  1.1.1.2  christos 
    347  1.1.1.2  christos 	add	r6,sp,#256
    348  1.1.1.2  christos 	vld1.32	{d0,d1,d2,d3},[r1]!
    349  1.1.1.2  christos 	add	r10,sp,#8
    350  1.1.1.2  christos 	vld1.32	{d30[0]},[r4,:32]
    351  1.1.1.2  christos 	mov	r9,r5
    352  1.1.1.2  christos 	b	.LNEON_8n_outer
    353      1.1  christos 
    354      1.1  christos .align	4
    355  1.1.1.2  christos .LNEON_8n_outer:
    356  1.1.1.2  christos 	vld1.32	{d28[0]},[r2,:32]!	@ *b++
    357  1.1.1.2  christos 	veor	d8,d8,d8
    358  1.1.1.2  christos 	vzip.16	d28,d8
    359  1.1.1.2  christos 	add	r7,sp,#128
    360  1.1.1.2  christos 	vld1.32	{d4,d5,d6,d7},[r3]!
    361      1.1  christos 
    362      1.1  christos 	vmlal.u32	q6,d28,d0[0]
    363      1.1  christos 	vmlal.u32	q7,d28,d0[1]
    364  1.1.1.2  christos 	veor	d8,d8,d8
    365      1.1  christos 	vmlal.u32	q8,d28,d1[0]
    366  1.1.1.2  christos 	vshl.i64	d29,d13,#16
    367      1.1  christos 	vmlal.u32	q9,d28,d1[1]
    368  1.1.1.2  christos 	vadd.u64	d29,d29,d12
    369      1.1  christos 	vmlal.u32	q10,d28,d2[0]
    370  1.1.1.2  christos 	vmul.u32	d29,d29,d30
    371      1.1  christos 	vmlal.u32	q11,d28,d2[1]
    372  1.1.1.2  christos 	vst1.32	{d28},[sp,:64]		@ put aside smashed b[8*i+0]
    373      1.1  christos 	vmlal.u32	q12,d28,d3[0]
    374  1.1.1.2  christos 	vzip.16	d29,d8
    375      1.1  christos 	vmlal.u32	q13,d28,d3[1]
    376  1.1.1.2  christos 	vld1.32	{d28[0]},[r2,:32]!	@ *b++
    377      1.1  christos 	vmlal.u32	q6,d29,d4[0]
    378  1.1.1.2  christos 	veor	d10,d10,d10
    379      1.1  christos 	vmlal.u32	q7,d29,d4[1]
    380  1.1.1.2  christos 	vzip.16	d28,d10
    381      1.1  christos 	vmlal.u32	q8,d29,d5[0]
    382  1.1.1.2  christos 	vshr.u64	d12,d12,#16
    383      1.1  christos 	vmlal.u32	q9,d29,d5[1]
    384      1.1  christos 	vmlal.u32	q10,d29,d6[0]
    385  1.1.1.2  christos 	vadd.u64	d12,d12,d13
    386      1.1  christos 	vmlal.u32	q11,d29,d6[1]
    387  1.1.1.2  christos 	vshr.u64	d12,d12,#16
    388      1.1  christos 	vmlal.u32	q12,d29,d7[0]
    389      1.1  christos 	vmlal.u32	q13,d29,d7[1]
    390  1.1.1.2  christos 	vadd.u64	d14,d14,d12
    391  1.1.1.2  christos 	vst1.32	{d29},[r10,:64]!	@ put aside smashed m[8*i+0]
    392  1.1.1.2  christos 	vmlal.u32	q7,d28,d0[0]
    393  1.1.1.2  christos 	vld1.64	{q6},[r6,:128]!
    394  1.1.1.2  christos 	vmlal.u32	q8,d28,d0[1]
    395  1.1.1.2  christos 	veor	d8,d8,d8
    396  1.1.1.2  christos 	vmlal.u32	q9,d28,d1[0]
    397  1.1.1.2  christos 	vshl.i64	d29,d15,#16
    398  1.1.1.2  christos 	vmlal.u32	q10,d28,d1[1]
    399  1.1.1.2  christos 	vadd.u64	d29,d29,d14
    400  1.1.1.2  christos 	vmlal.u32	q11,d28,d2[0]
    401  1.1.1.2  christos 	vmul.u32	d29,d29,d30
    402  1.1.1.2  christos 	vmlal.u32	q12,d28,d2[1]
    403  1.1.1.2  christos 	vst1.32	{d28},[r10,:64]!	@ put aside smashed b[8*i+1]
    404  1.1.1.2  christos 	vmlal.u32	q13,d28,d3[0]
    405  1.1.1.2  christos 	vzip.16	d29,d8
    406  1.1.1.2  christos 	vmlal.u32	q6,d28,d3[1]
    407  1.1.1.2  christos 	vld1.32	{d28[0]},[r2,:32]!	@ *b++
    408  1.1.1.2  christos 	vmlal.u32	q7,d29,d4[0]
    409  1.1.1.2  christos 	veor	d10,d10,d10
    410  1.1.1.2  christos 	vmlal.u32	q8,d29,d4[1]
    411  1.1.1.2  christos 	vzip.16	d28,d10
    412  1.1.1.2  christos 	vmlal.u32	q9,d29,d5[0]
    413  1.1.1.2  christos 	vshr.u64	d14,d14,#16
    414  1.1.1.2  christos 	vmlal.u32	q10,d29,d5[1]
    415  1.1.1.2  christos 	vmlal.u32	q11,d29,d6[0]
    416  1.1.1.2  christos 	vadd.u64	d14,d14,d15
    417  1.1.1.2  christos 	vmlal.u32	q12,d29,d6[1]
    418  1.1.1.2  christos 	vshr.u64	d14,d14,#16
    419  1.1.1.2  christos 	vmlal.u32	q13,d29,d7[0]
    420  1.1.1.2  christos 	vmlal.u32	q6,d29,d7[1]
    421  1.1.1.2  christos 	vadd.u64	d16,d16,d14
    422  1.1.1.2  christos 	vst1.32	{d29},[r10,:64]!	@ put aside smashed m[8*i+1]
    423  1.1.1.2  christos 	vmlal.u32	q8,d28,d0[0]
    424  1.1.1.2  christos 	vld1.64	{q7},[r6,:128]!
    425  1.1.1.2  christos 	vmlal.u32	q9,d28,d0[1]
    426  1.1.1.2  christos 	veor	d8,d8,d8
    427  1.1.1.2  christos 	vmlal.u32	q10,d28,d1[0]
    428  1.1.1.2  christos 	vshl.i64	d29,d17,#16
    429  1.1.1.2  christos 	vmlal.u32	q11,d28,d1[1]
    430  1.1.1.2  christos 	vadd.u64	d29,d29,d16
    431  1.1.1.2  christos 	vmlal.u32	q12,d28,d2[0]
    432  1.1.1.2  christos 	vmul.u32	d29,d29,d30
    433  1.1.1.2  christos 	vmlal.u32	q13,d28,d2[1]
    434  1.1.1.2  christos 	vst1.32	{d28},[r10,:64]!	@ put aside smashed b[8*i+2]
    435  1.1.1.2  christos 	vmlal.u32	q6,d28,d3[0]
    436  1.1.1.2  christos 	vzip.16	d29,d8
    437  1.1.1.2  christos 	vmlal.u32	q7,d28,d3[1]
    438  1.1.1.2  christos 	vld1.32	{d28[0]},[r2,:32]!	@ *b++
    439  1.1.1.2  christos 	vmlal.u32	q8,d29,d4[0]
    440  1.1.1.2  christos 	veor	d10,d10,d10
    441  1.1.1.2  christos 	vmlal.u32	q9,d29,d4[1]
    442  1.1.1.2  christos 	vzip.16	d28,d10
    443  1.1.1.2  christos 	vmlal.u32	q10,d29,d5[0]
    444  1.1.1.2  christos 	vshr.u64	d16,d16,#16
    445  1.1.1.2  christos 	vmlal.u32	q11,d29,d5[1]
    446  1.1.1.2  christos 	vmlal.u32	q12,d29,d6[0]
    447  1.1.1.2  christos 	vadd.u64	d16,d16,d17
    448  1.1.1.2  christos 	vmlal.u32	q13,d29,d6[1]
    449  1.1.1.2  christos 	vshr.u64	d16,d16,#16
    450  1.1.1.2  christos 	vmlal.u32	q6,d29,d7[0]
    451  1.1.1.2  christos 	vmlal.u32	q7,d29,d7[1]
    452  1.1.1.2  christos 	vadd.u64	d18,d18,d16
    453  1.1.1.2  christos 	vst1.32	{d29},[r10,:64]!	@ put aside smashed m[8*i+2]
    454  1.1.1.2  christos 	vmlal.u32	q9,d28,d0[0]
    455  1.1.1.2  christos 	vld1.64	{q8},[r6,:128]!
    456  1.1.1.2  christos 	vmlal.u32	q10,d28,d0[1]
    457  1.1.1.2  christos 	veor	d8,d8,d8
    458  1.1.1.2  christos 	vmlal.u32	q11,d28,d1[0]
    459  1.1.1.2  christos 	vshl.i64	d29,d19,#16
    460  1.1.1.2  christos 	vmlal.u32	q12,d28,d1[1]
    461  1.1.1.2  christos 	vadd.u64	d29,d29,d18
    462  1.1.1.2  christos 	vmlal.u32	q13,d28,d2[0]
    463  1.1.1.2  christos 	vmul.u32	d29,d29,d30
    464  1.1.1.2  christos 	vmlal.u32	q6,d28,d2[1]
    465  1.1.1.2  christos 	vst1.32	{d28},[r10,:64]!	@ put aside smashed b[8*i+3]
    466  1.1.1.2  christos 	vmlal.u32	q7,d28,d3[0]
    467  1.1.1.2  christos 	vzip.16	d29,d8
    468  1.1.1.2  christos 	vmlal.u32	q8,d28,d3[1]
    469  1.1.1.2  christos 	vld1.32	{d28[0]},[r2,:32]!	@ *b++
    470  1.1.1.2  christos 	vmlal.u32	q9,d29,d4[0]
    471  1.1.1.2  christos 	veor	d10,d10,d10
    472  1.1.1.2  christos 	vmlal.u32	q10,d29,d4[1]
    473  1.1.1.2  christos 	vzip.16	d28,d10
    474  1.1.1.2  christos 	vmlal.u32	q11,d29,d5[0]
    475  1.1.1.2  christos 	vshr.u64	d18,d18,#16
    476  1.1.1.2  christos 	vmlal.u32	q12,d29,d5[1]
    477  1.1.1.2  christos 	vmlal.u32	q13,d29,d6[0]
    478  1.1.1.2  christos 	vadd.u64	d18,d18,d19
    479  1.1.1.2  christos 	vmlal.u32	q6,d29,d6[1]
    480  1.1.1.2  christos 	vshr.u64	d18,d18,#16
    481  1.1.1.2  christos 	vmlal.u32	q7,d29,d7[0]
    482  1.1.1.2  christos 	vmlal.u32	q8,d29,d7[1]
    483  1.1.1.2  christos 	vadd.u64	d20,d20,d18
    484  1.1.1.2  christos 	vst1.32	{d29},[r10,:64]!	@ put aside smashed m[8*i+3]
    485  1.1.1.2  christos 	vmlal.u32	q10,d28,d0[0]
    486  1.1.1.2  christos 	vld1.64	{q9},[r6,:128]!
    487  1.1.1.2  christos 	vmlal.u32	q11,d28,d0[1]
    488  1.1.1.2  christos 	veor	d8,d8,d8
    489  1.1.1.2  christos 	vmlal.u32	q12,d28,d1[0]
    490  1.1.1.2  christos 	vshl.i64	d29,d21,#16
    491  1.1.1.2  christos 	vmlal.u32	q13,d28,d1[1]
    492  1.1.1.2  christos 	vadd.u64	d29,d29,d20
    493  1.1.1.2  christos 	vmlal.u32	q6,d28,d2[0]
    494  1.1.1.2  christos 	vmul.u32	d29,d29,d30
    495  1.1.1.2  christos 	vmlal.u32	q7,d28,d2[1]
    496  1.1.1.2  christos 	vst1.32	{d28},[r10,:64]!	@ put aside smashed b[8*i+4]
    497  1.1.1.2  christos 	vmlal.u32	q8,d28,d3[0]
    498  1.1.1.2  christos 	vzip.16	d29,d8
    499  1.1.1.2  christos 	vmlal.u32	q9,d28,d3[1]
    500  1.1.1.2  christos 	vld1.32	{d28[0]},[r2,:32]!	@ *b++
    501  1.1.1.2  christos 	vmlal.u32	q10,d29,d4[0]
    502  1.1.1.2  christos 	veor	d10,d10,d10
    503  1.1.1.2  christos 	vmlal.u32	q11,d29,d4[1]
    504  1.1.1.2  christos 	vzip.16	d28,d10
    505  1.1.1.2  christos 	vmlal.u32	q12,d29,d5[0]
    506  1.1.1.2  christos 	vshr.u64	d20,d20,#16
    507  1.1.1.2  christos 	vmlal.u32	q13,d29,d5[1]
    508  1.1.1.2  christos 	vmlal.u32	q6,d29,d6[0]
    509  1.1.1.2  christos 	vadd.u64	d20,d20,d21
    510  1.1.1.2  christos 	vmlal.u32	q7,d29,d6[1]
    511  1.1.1.2  christos 	vshr.u64	d20,d20,#16
    512  1.1.1.2  christos 	vmlal.u32	q8,d29,d7[0]
    513  1.1.1.2  christos 	vmlal.u32	q9,d29,d7[1]
    514  1.1.1.2  christos 	vadd.u64	d22,d22,d20
    515  1.1.1.2  christos 	vst1.32	{d29},[r10,:64]!	@ put aside smashed m[8*i+4]
    516  1.1.1.2  christos 	vmlal.u32	q11,d28,d0[0]
    517  1.1.1.2  christos 	vld1.64	{q10},[r6,:128]!
    518  1.1.1.2  christos 	vmlal.u32	q12,d28,d0[1]
    519  1.1.1.2  christos 	veor	d8,d8,d8
    520  1.1.1.2  christos 	vmlal.u32	q13,d28,d1[0]
    521  1.1.1.2  christos 	vshl.i64	d29,d23,#16
    522  1.1.1.2  christos 	vmlal.u32	q6,d28,d1[1]
    523  1.1.1.2  christos 	vadd.u64	d29,d29,d22
    524  1.1.1.2  christos 	vmlal.u32	q7,d28,d2[0]
    525  1.1.1.2  christos 	vmul.u32	d29,d29,d30
    526  1.1.1.2  christos 	vmlal.u32	q8,d28,d2[1]
    527  1.1.1.2  christos 	vst1.32	{d28},[r10,:64]!	@ put aside smashed b[8*i+5]
    528  1.1.1.2  christos 	vmlal.u32	q9,d28,d3[0]
    529  1.1.1.2  christos 	vzip.16	d29,d8
    530  1.1.1.2  christos 	vmlal.u32	q10,d28,d3[1]
    531  1.1.1.2  christos 	vld1.32	{d28[0]},[r2,:32]!	@ *b++
    532  1.1.1.2  christos 	vmlal.u32	q11,d29,d4[0]
    533  1.1.1.2  christos 	veor	d10,d10,d10
    534  1.1.1.2  christos 	vmlal.u32	q12,d29,d4[1]
    535  1.1.1.2  christos 	vzip.16	d28,d10
    536  1.1.1.2  christos 	vmlal.u32	q13,d29,d5[0]
    537  1.1.1.2  christos 	vshr.u64	d22,d22,#16
    538  1.1.1.2  christos 	vmlal.u32	q6,d29,d5[1]
    539  1.1.1.2  christos 	vmlal.u32	q7,d29,d6[0]
    540  1.1.1.2  christos 	vadd.u64	d22,d22,d23
    541  1.1.1.2  christos 	vmlal.u32	q8,d29,d6[1]
    542  1.1.1.2  christos 	vshr.u64	d22,d22,#16
    543  1.1.1.2  christos 	vmlal.u32	q9,d29,d7[0]
    544  1.1.1.2  christos 	vmlal.u32	q10,d29,d7[1]
    545  1.1.1.2  christos 	vadd.u64	d24,d24,d22
    546  1.1.1.2  christos 	vst1.32	{d29},[r10,:64]!	@ put aside smashed m[8*i+5]
    547  1.1.1.2  christos 	vmlal.u32	q12,d28,d0[0]
    548  1.1.1.2  christos 	vld1.64	{q11},[r6,:128]!
    549  1.1.1.2  christos 	vmlal.u32	q13,d28,d0[1]
    550  1.1.1.2  christos 	veor	d8,d8,d8
    551  1.1.1.2  christos 	vmlal.u32	q6,d28,d1[0]
    552  1.1.1.2  christos 	vshl.i64	d29,d25,#16
    553  1.1.1.2  christos 	vmlal.u32	q7,d28,d1[1]
    554  1.1.1.2  christos 	vadd.u64	d29,d29,d24
    555  1.1.1.2  christos 	vmlal.u32	q8,d28,d2[0]
    556  1.1.1.2  christos 	vmul.u32	d29,d29,d30
    557  1.1.1.2  christos 	vmlal.u32	q9,d28,d2[1]
    558  1.1.1.2  christos 	vst1.32	{d28},[r10,:64]!	@ put aside smashed b[8*i+6]
    559  1.1.1.2  christos 	vmlal.u32	q10,d28,d3[0]
    560  1.1.1.2  christos 	vzip.16	d29,d8
    561  1.1.1.2  christos 	vmlal.u32	q11,d28,d3[1]
    562  1.1.1.2  christos 	vld1.32	{d28[0]},[r2,:32]!	@ *b++
    563  1.1.1.2  christos 	vmlal.u32	q12,d29,d4[0]
    564  1.1.1.2  christos 	veor	d10,d10,d10
    565  1.1.1.2  christos 	vmlal.u32	q13,d29,d4[1]
    566  1.1.1.2  christos 	vzip.16	d28,d10
    567  1.1.1.2  christos 	vmlal.u32	q6,d29,d5[0]
    568  1.1.1.2  christos 	vshr.u64	d24,d24,#16
    569  1.1.1.2  christos 	vmlal.u32	q7,d29,d5[1]
    570  1.1.1.2  christos 	vmlal.u32	q8,d29,d6[0]
    571  1.1.1.2  christos 	vadd.u64	d24,d24,d25
    572  1.1.1.2  christos 	vmlal.u32	q9,d29,d6[1]
    573  1.1.1.2  christos 	vshr.u64	d24,d24,#16
    574  1.1.1.2  christos 	vmlal.u32	q10,d29,d7[0]
    575  1.1.1.2  christos 	vmlal.u32	q11,d29,d7[1]
    576  1.1.1.2  christos 	vadd.u64	d26,d26,d24
    577  1.1.1.2  christos 	vst1.32	{d29},[r10,:64]!	@ put aside smashed m[8*i+6]
    578  1.1.1.2  christos 	vmlal.u32	q13,d28,d0[0]
    579  1.1.1.2  christos 	vld1.64	{q12},[r6,:128]!
    580  1.1.1.2  christos 	vmlal.u32	q6,d28,d0[1]
    581  1.1.1.2  christos 	veor	d8,d8,d8
    582  1.1.1.2  christos 	vmlal.u32	q7,d28,d1[0]
    583  1.1.1.2  christos 	vshl.i64	d29,d27,#16
    584  1.1.1.2  christos 	vmlal.u32	q8,d28,d1[1]
    585  1.1.1.2  christos 	vadd.u64	d29,d29,d26
    586  1.1.1.2  christos 	vmlal.u32	q9,d28,d2[0]
    587  1.1.1.2  christos 	vmul.u32	d29,d29,d30
    588  1.1.1.2  christos 	vmlal.u32	q10,d28,d2[1]
    589  1.1.1.2  christos 	vst1.32	{d28},[r10,:64]!	@ put aside smashed b[8*i+7]
    590  1.1.1.2  christos 	vmlal.u32	q11,d28,d3[0]
    591  1.1.1.2  christos 	vzip.16	d29,d8
    592  1.1.1.2  christos 	vmlal.u32	q12,d28,d3[1]
    593  1.1.1.2  christos 	vld1.32	{d28},[sp,:64]		@ pull smashed b[8*i+0]
    594  1.1.1.2  christos 	vmlal.u32	q13,d29,d4[0]
    595  1.1.1.2  christos 	vld1.32	{d0,d1,d2,d3},[r1]!
    596  1.1.1.2  christos 	vmlal.u32	q6,d29,d4[1]
    597  1.1.1.2  christos 	vmlal.u32	q7,d29,d5[0]
    598  1.1.1.2  christos 	vshr.u64	d26,d26,#16
    599  1.1.1.2  christos 	vmlal.u32	q8,d29,d5[1]
    600  1.1.1.2  christos 	vmlal.u32	q9,d29,d6[0]
    601  1.1.1.2  christos 	vadd.u64	d26,d26,d27
    602  1.1.1.2  christos 	vmlal.u32	q10,d29,d6[1]
    603  1.1.1.2  christos 	vshr.u64	d26,d26,#16
    604  1.1.1.2  christos 	vmlal.u32	q11,d29,d7[0]
    605  1.1.1.2  christos 	vmlal.u32	q12,d29,d7[1]
    606  1.1.1.2  christos 	vadd.u64	d12,d12,d26
    607  1.1.1.2  christos 	vst1.32	{d29},[r10,:64]	@ put aside smashed m[8*i+7]
    608  1.1.1.2  christos 	add	r10,sp,#8		@ rewind
    609  1.1.1.2  christos 	sub	r8,r5,#8
    610  1.1.1.2  christos 	b	.LNEON_8n_inner
    611      1.1  christos 
    612  1.1.1.2  christos .align	4
    613  1.1.1.2  christos .LNEON_8n_inner:
    614  1.1.1.2  christos 	subs	r8,r8,#8
    615      1.1  christos 	vmlal.u32	q6,d28,d0[0]
    616  1.1.1.2  christos 	vld1.64	{q13},[r6,:128]
    617      1.1  christos 	vmlal.u32	q7,d28,d0[1]
    618  1.1.1.2  christos 	vld1.32	{d29},[r10,:64]!	@ pull smashed m[8*i+0]
    619      1.1  christos 	vmlal.u32	q8,d28,d1[0]
    620  1.1.1.2  christos 	vld1.32	{d4,d5,d6,d7},[r3]!
    621      1.1  christos 	vmlal.u32	q9,d28,d1[1]
    622  1.1.1.2  christos 	it	ne
    623  1.1.1.2  christos 	addne	r6,r6,#16	@ don't advance in last iteration
    624      1.1  christos 	vmlal.u32	q10,d28,d2[0]
    625      1.1  christos 	vmlal.u32	q11,d28,d2[1]
    626      1.1  christos 	vmlal.u32	q12,d28,d3[0]
    627      1.1  christos 	vmlal.u32	q13,d28,d3[1]
    628  1.1.1.2  christos 	vld1.32	{d28},[r10,:64]!	@ pull smashed b[8*i+1]
    629      1.1  christos 	vmlal.u32	q6,d29,d4[0]
    630      1.1  christos 	vmlal.u32	q7,d29,d4[1]
    631      1.1  christos 	vmlal.u32	q8,d29,d5[0]
    632      1.1  christos 	vmlal.u32	q9,d29,d5[1]
    633      1.1  christos 	vmlal.u32	q10,d29,d6[0]
    634      1.1  christos 	vmlal.u32	q11,d29,d6[1]
    635      1.1  christos 	vmlal.u32	q12,d29,d7[0]
    636      1.1  christos 	vmlal.u32	q13,d29,d7[1]
    637  1.1.1.2  christos 	vst1.64	{q6},[r7,:128]!
    638  1.1.1.2  christos 	vmlal.u32	q7,d28,d0[0]
    639  1.1.1.2  christos 	vld1.64	{q6},[r6,:128]
    640  1.1.1.2  christos 	vmlal.u32	q8,d28,d0[1]
    641  1.1.1.2  christos 	vld1.32	{d29},[r10,:64]!	@ pull smashed m[8*i+1]
    642  1.1.1.2  christos 	vmlal.u32	q9,d28,d1[0]
    643  1.1.1.2  christos 	it	ne
    644  1.1.1.2  christos 	addne	r6,r6,#16	@ don't advance in last iteration
    645  1.1.1.2  christos 	vmlal.u32	q10,d28,d1[1]
    646  1.1.1.2  christos 	vmlal.u32	q11,d28,d2[0]
    647  1.1.1.2  christos 	vmlal.u32	q12,d28,d2[1]
    648  1.1.1.2  christos 	vmlal.u32	q13,d28,d3[0]
    649  1.1.1.2  christos 	vmlal.u32	q6,d28,d3[1]
    650  1.1.1.2  christos 	vld1.32	{d28},[r10,:64]!	@ pull smashed b[8*i+2]
    651  1.1.1.2  christos 	vmlal.u32	q7,d29,d4[0]
    652  1.1.1.2  christos 	vmlal.u32	q8,d29,d4[1]
    653  1.1.1.2  christos 	vmlal.u32	q9,d29,d5[0]
    654  1.1.1.2  christos 	vmlal.u32	q10,d29,d5[1]
    655  1.1.1.2  christos 	vmlal.u32	q11,d29,d6[0]
    656  1.1.1.2  christos 	vmlal.u32	q12,d29,d6[1]
    657  1.1.1.2  christos 	vmlal.u32	q13,d29,d7[0]
    658  1.1.1.2  christos 	vmlal.u32	q6,d29,d7[1]
    659  1.1.1.2  christos 	vst1.64	{q7},[r7,:128]!
    660  1.1.1.2  christos 	vmlal.u32	q8,d28,d0[0]
    661  1.1.1.2  christos 	vld1.64	{q7},[r6,:128]
    662  1.1.1.2  christos 	vmlal.u32	q9,d28,d0[1]
    663  1.1.1.2  christos 	vld1.32	{d29},[r10,:64]!	@ pull smashed m[8*i+2]
    664  1.1.1.2  christos 	vmlal.u32	q10,d28,d1[0]
    665  1.1.1.2  christos 	it	ne
    666  1.1.1.2  christos 	addne	r6,r6,#16	@ don't advance in last iteration
    667  1.1.1.2  christos 	vmlal.u32	q11,d28,d1[1]
    668  1.1.1.2  christos 	vmlal.u32	q12,d28,d2[0]
    669  1.1.1.2  christos 	vmlal.u32	q13,d28,d2[1]
    670  1.1.1.2  christos 	vmlal.u32	q6,d28,d3[0]
    671  1.1.1.2  christos 	vmlal.u32	q7,d28,d3[1]
    672  1.1.1.2  christos 	vld1.32	{d28},[r10,:64]!	@ pull smashed b[8*i+3]
    673  1.1.1.2  christos 	vmlal.u32	q8,d29,d4[0]
    674  1.1.1.2  christos 	vmlal.u32	q9,d29,d4[1]
    675  1.1.1.2  christos 	vmlal.u32	q10,d29,d5[0]
    676  1.1.1.2  christos 	vmlal.u32	q11,d29,d5[1]
    677  1.1.1.2  christos 	vmlal.u32	q12,d29,d6[0]
    678  1.1.1.2  christos 	vmlal.u32	q13,d29,d6[1]
    679  1.1.1.2  christos 	vmlal.u32	q6,d29,d7[0]
    680  1.1.1.2  christos 	vmlal.u32	q7,d29,d7[1]
    681  1.1.1.2  christos 	vst1.64	{q8},[r7,:128]!
    682  1.1.1.2  christos 	vmlal.u32	q9,d28,d0[0]
    683  1.1.1.2  christos 	vld1.64	{q8},[r6,:128]
    684  1.1.1.2  christos 	vmlal.u32	q10,d28,d0[1]
    685  1.1.1.2  christos 	vld1.32	{d29},[r10,:64]!	@ pull smashed m[8*i+3]
    686  1.1.1.2  christos 	vmlal.u32	q11,d28,d1[0]
    687  1.1.1.2  christos 	it	ne
    688  1.1.1.2  christos 	addne	r6,r6,#16	@ don't advance in last iteration
    689  1.1.1.2  christos 	vmlal.u32	q12,d28,d1[1]
    690  1.1.1.2  christos 	vmlal.u32	q13,d28,d2[0]
    691  1.1.1.2  christos 	vmlal.u32	q6,d28,d2[1]
    692  1.1.1.2  christos 	vmlal.u32	q7,d28,d3[0]
    693  1.1.1.2  christos 	vmlal.u32	q8,d28,d3[1]
    694  1.1.1.2  christos 	vld1.32	{d28},[r10,:64]!	@ pull smashed b[8*i+4]
    695  1.1.1.2  christos 	vmlal.u32	q9,d29,d4[0]
    696  1.1.1.2  christos 	vmlal.u32	q10,d29,d4[1]
    697  1.1.1.2  christos 	vmlal.u32	q11,d29,d5[0]
    698  1.1.1.2  christos 	vmlal.u32	q12,d29,d5[1]
    699  1.1.1.2  christos 	vmlal.u32	q13,d29,d6[0]
    700  1.1.1.2  christos 	vmlal.u32	q6,d29,d6[1]
    701  1.1.1.2  christos 	vmlal.u32	q7,d29,d7[0]
    702  1.1.1.2  christos 	vmlal.u32	q8,d29,d7[1]
    703  1.1.1.2  christos 	vst1.64	{q9},[r7,:128]!
    704  1.1.1.2  christos 	vmlal.u32	q10,d28,d0[0]
    705  1.1.1.2  christos 	vld1.64	{q9},[r6,:128]
    706  1.1.1.2  christos 	vmlal.u32	q11,d28,d0[1]
    707  1.1.1.2  christos 	vld1.32	{d29},[r10,:64]!	@ pull smashed m[8*i+4]
    708  1.1.1.2  christos 	vmlal.u32	q12,d28,d1[0]
    709  1.1.1.2  christos 	it	ne
    710  1.1.1.2  christos 	addne	r6,r6,#16	@ don't advance in last iteration
    711  1.1.1.2  christos 	vmlal.u32	q13,d28,d1[1]
    712  1.1.1.2  christos 	vmlal.u32	q6,d28,d2[0]
    713  1.1.1.2  christos 	vmlal.u32	q7,d28,d2[1]
    714  1.1.1.2  christos 	vmlal.u32	q8,d28,d3[0]
    715  1.1.1.2  christos 	vmlal.u32	q9,d28,d3[1]
    716  1.1.1.2  christos 	vld1.32	{d28},[r10,:64]!	@ pull smashed b[8*i+5]
    717  1.1.1.2  christos 	vmlal.u32	q10,d29,d4[0]
    718  1.1.1.2  christos 	vmlal.u32	q11,d29,d4[1]
    719  1.1.1.2  christos 	vmlal.u32	q12,d29,d5[0]
    720  1.1.1.2  christos 	vmlal.u32	q13,d29,d5[1]
    721  1.1.1.2  christos 	vmlal.u32	q6,d29,d6[0]
    722  1.1.1.2  christos 	vmlal.u32	q7,d29,d6[1]
    723  1.1.1.2  christos 	vmlal.u32	q8,d29,d7[0]
    724  1.1.1.2  christos 	vmlal.u32	q9,d29,d7[1]
    725  1.1.1.2  christos 	vst1.64	{q10},[r7,:128]!
    726  1.1.1.2  christos 	vmlal.u32	q11,d28,d0[0]
    727  1.1.1.2  christos 	vld1.64	{q10},[r6,:128]
    728  1.1.1.2  christos 	vmlal.u32	q12,d28,d0[1]
    729  1.1.1.2  christos 	vld1.32	{d29},[r10,:64]!	@ pull smashed m[8*i+5]
    730  1.1.1.2  christos 	vmlal.u32	q13,d28,d1[0]
    731  1.1.1.2  christos 	it	ne
    732  1.1.1.2  christos 	addne	r6,r6,#16	@ don't advance in last iteration
    733  1.1.1.2  christos 	vmlal.u32	q6,d28,d1[1]
    734  1.1.1.2  christos 	vmlal.u32	q7,d28,d2[0]
    735  1.1.1.2  christos 	vmlal.u32	q8,d28,d2[1]
    736  1.1.1.2  christos 	vmlal.u32	q9,d28,d3[0]
    737  1.1.1.2  christos 	vmlal.u32	q10,d28,d3[1]
    738  1.1.1.2  christos 	vld1.32	{d28},[r10,:64]!	@ pull smashed b[8*i+6]
    739  1.1.1.2  christos 	vmlal.u32	q11,d29,d4[0]
    740  1.1.1.2  christos 	vmlal.u32	q12,d29,d4[1]
    741  1.1.1.2  christos 	vmlal.u32	q13,d29,d5[0]
    742  1.1.1.2  christos 	vmlal.u32	q6,d29,d5[1]
    743  1.1.1.2  christos 	vmlal.u32	q7,d29,d6[0]
    744  1.1.1.2  christos 	vmlal.u32	q8,d29,d6[1]
    745  1.1.1.2  christos 	vmlal.u32	q9,d29,d7[0]
    746  1.1.1.2  christos 	vmlal.u32	q10,d29,d7[1]
    747  1.1.1.2  christos 	vst1.64	{q11},[r7,:128]!
    748  1.1.1.2  christos 	vmlal.u32	q12,d28,d0[0]
    749  1.1.1.2  christos 	vld1.64	{q11},[r6,:128]
    750  1.1.1.2  christos 	vmlal.u32	q13,d28,d0[1]
    751  1.1.1.2  christos 	vld1.32	{d29},[r10,:64]!	@ pull smashed m[8*i+6]
    752  1.1.1.2  christos 	vmlal.u32	q6,d28,d1[0]
    753  1.1.1.2  christos 	it	ne
    754  1.1.1.2  christos 	addne	r6,r6,#16	@ don't advance in last iteration
    755  1.1.1.2  christos 	vmlal.u32	q7,d28,d1[1]
    756  1.1.1.2  christos 	vmlal.u32	q8,d28,d2[0]
    757  1.1.1.2  christos 	vmlal.u32	q9,d28,d2[1]
    758  1.1.1.2  christos 	vmlal.u32	q10,d28,d3[0]
    759  1.1.1.2  christos 	vmlal.u32	q11,d28,d3[1]
    760  1.1.1.2  christos 	vld1.32	{d28},[r10,:64]!	@ pull smashed b[8*i+7]
    761  1.1.1.2  christos 	vmlal.u32	q12,d29,d4[0]
    762  1.1.1.2  christos 	vmlal.u32	q13,d29,d4[1]
    763  1.1.1.2  christos 	vmlal.u32	q6,d29,d5[0]
    764  1.1.1.2  christos 	vmlal.u32	q7,d29,d5[1]
    765  1.1.1.2  christos 	vmlal.u32	q8,d29,d6[0]
    766  1.1.1.2  christos 	vmlal.u32	q9,d29,d6[1]
    767  1.1.1.2  christos 	vmlal.u32	q10,d29,d7[0]
    768  1.1.1.2  christos 	vmlal.u32	q11,d29,d7[1]
    769  1.1.1.2  christos 	vst1.64	{q12},[r7,:128]!
    770  1.1.1.2  christos 	vmlal.u32	q13,d28,d0[0]
    771  1.1.1.2  christos 	vld1.64	{q12},[r6,:128]
    772  1.1.1.2  christos 	vmlal.u32	q6,d28,d0[1]
    773  1.1.1.2  christos 	vld1.32	{d29},[r10,:64]!	@ pull smashed m[8*i+7]
    774  1.1.1.2  christos 	vmlal.u32	q7,d28,d1[0]
    775  1.1.1.2  christos 	it	ne
    776  1.1.1.2  christos 	addne	r6,r6,#16	@ don't advance in last iteration
    777  1.1.1.2  christos 	vmlal.u32	q8,d28,d1[1]
    778  1.1.1.2  christos 	vmlal.u32	q9,d28,d2[0]
    779  1.1.1.2  christos 	vmlal.u32	q10,d28,d2[1]
    780  1.1.1.2  christos 	vmlal.u32	q11,d28,d3[0]
    781  1.1.1.2  christos 	vmlal.u32	q12,d28,d3[1]
    782  1.1.1.2  christos 	it	eq
    783  1.1.1.2  christos 	subeq	r1,r1,r5,lsl#2	@ rewind
    784  1.1.1.2  christos 	vmlal.u32	q13,d29,d4[0]
    785  1.1.1.2  christos 	vld1.32	{d28},[sp,:64]		@ pull smashed b[8*i+0]
    786  1.1.1.2  christos 	vmlal.u32	q6,d29,d4[1]
    787  1.1.1.2  christos 	vld1.32	{d0,d1,d2,d3},[r1]!
    788  1.1.1.2  christos 	vmlal.u32	q7,d29,d5[0]
    789  1.1.1.2  christos 	add	r10,sp,#8		@ rewind
    790  1.1.1.2  christos 	vmlal.u32	q8,d29,d5[1]
    791  1.1.1.2  christos 	vmlal.u32	q9,d29,d6[0]
    792  1.1.1.2  christos 	vmlal.u32	q10,d29,d6[1]
    793  1.1.1.2  christos 	vmlal.u32	q11,d29,d7[0]
    794  1.1.1.2  christos 	vst1.64	{q13},[r7,:128]!
    795  1.1.1.2  christos 	vmlal.u32	q12,d29,d7[1]
    796  1.1.1.2  christos 
    797  1.1.1.2  christos 	bne	.LNEON_8n_inner
    798  1.1.1.2  christos 	add	r6,sp,#128
    799  1.1.1.2  christos 	vst1.64	{q6,q7},[r7,:256]!
    800  1.1.1.2  christos 	veor	q2,q2,q2		@ d4-d5
    801  1.1.1.2  christos 	vst1.64	{q8,q9},[r7,:256]!
    802  1.1.1.2  christos 	veor	q3,q3,q3		@ d6-d7
    803  1.1.1.2  christos 	vst1.64	{q10,q11},[r7,:256]!
    804  1.1.1.2  christos 	vst1.64	{q12},[r7,:128]
    805  1.1.1.2  christos 
    806  1.1.1.2  christos 	subs	r9,r9,#8
    807  1.1.1.2  christos 	vld1.64	{q6,q7},[r6,:256]!
    808  1.1.1.2  christos 	vld1.64	{q8,q9},[r6,:256]!
    809  1.1.1.2  christos 	vld1.64	{q10,q11},[r6,:256]!
    810  1.1.1.2  christos 	vld1.64	{q12,q13},[r6,:256]!
    811  1.1.1.2  christos 
    812  1.1.1.2  christos 	itt	ne
    813  1.1.1.2  christos 	subne	r3,r3,r5,lsl#2	@ rewind
    814  1.1.1.2  christos 	bne	.LNEON_8n_outer
    815      1.1  christos 
    816  1.1.1.2  christos 	add	r7,sp,#128
    817  1.1.1.2  christos 	vst1.64	{q2,q3}, [sp,:256]!	@ start wiping stack frame
    818  1.1.1.2  christos 	vshr.u64	d10,d12,#16
    819  1.1.1.2  christos 	vst1.64	{q2,q3},[sp,:256]!
    820  1.1.1.2  christos 	vadd.u64	d13,d13,d10
    821  1.1.1.2  christos 	vst1.64	{q2,q3}, [sp,:256]!
    822  1.1.1.2  christos 	vshr.u64	d10,d13,#16
    823  1.1.1.2  christos 	vst1.64	{q2,q3}, [sp,:256]!
    824  1.1.1.2  christos 	vzip.16	d12,d13
    825      1.1  christos 
    826  1.1.1.2  christos 	mov	r8,r5
    827  1.1.1.2  christos 	b	.LNEON_tail_entry
    828      1.1  christos 
    829  1.1.1.2  christos .align	4
    830      1.1  christos .LNEON_tail:
    831      1.1  christos 	vadd.u64	d12,d12,d10
    832      1.1  christos 	vshr.u64	d10,d12,#16
    833  1.1.1.2  christos 	vld1.64	{q8,q9}, [r6, :256]!
    834      1.1  christos 	vadd.u64	d13,d13,d10
    835  1.1.1.2  christos 	vld1.64	{q10,q11}, [r6, :256]!
    836      1.1  christos 	vshr.u64	d10,d13,#16
    837  1.1.1.2  christos 	vld1.64	{q12,q13}, [r6, :256]!
    838  1.1.1.2  christos 	vzip.16	d12,d13
    839      1.1  christos 
    840  1.1.1.2  christos .LNEON_tail_entry:
    841      1.1  christos 	vadd.u64	d14,d14,d10
    842  1.1.1.2  christos 	vst1.32	{d12[0]}, [r7, :32]!
    843      1.1  christos 	vshr.u64	d10,d14,#16
    844      1.1  christos 	vadd.u64	d15,d15,d10
    845      1.1  christos 	vshr.u64	d10,d15,#16
    846  1.1.1.2  christos 	vzip.16	d14,d15
    847      1.1  christos 	vadd.u64	d16,d16,d10
    848  1.1.1.2  christos 	vst1.32	{d14[0]}, [r7, :32]!
    849      1.1  christos 	vshr.u64	d10,d16,#16
    850      1.1  christos 	vadd.u64	d17,d17,d10
    851      1.1  christos 	vshr.u64	d10,d17,#16
    852  1.1.1.2  christos 	vzip.16	d16,d17
    853      1.1  christos 	vadd.u64	d18,d18,d10
    854  1.1.1.2  christos 	vst1.32	{d16[0]}, [r7, :32]!
    855      1.1  christos 	vshr.u64	d10,d18,#16
    856      1.1  christos 	vadd.u64	d19,d19,d10
    857      1.1  christos 	vshr.u64	d10,d19,#16
    858  1.1.1.2  christos 	vzip.16	d18,d19
    859      1.1  christos 	vadd.u64	d20,d20,d10
    860  1.1.1.2  christos 	vst1.32	{d18[0]}, [r7, :32]!
    861      1.1  christos 	vshr.u64	d10,d20,#16
    862      1.1  christos 	vadd.u64	d21,d21,d10
    863      1.1  christos 	vshr.u64	d10,d21,#16
    864  1.1.1.2  christos 	vzip.16	d20,d21
    865      1.1  christos 	vadd.u64	d22,d22,d10
    866  1.1.1.2  christos 	vst1.32	{d20[0]}, [r7, :32]!
    867      1.1  christos 	vshr.u64	d10,d22,#16
    868      1.1  christos 	vadd.u64	d23,d23,d10
    869      1.1  christos 	vshr.u64	d10,d23,#16
    870  1.1.1.2  christos 	vzip.16	d22,d23
    871      1.1  christos 	vadd.u64	d24,d24,d10
    872  1.1.1.2  christos 	vst1.32	{d22[0]}, [r7, :32]!
    873      1.1  christos 	vshr.u64	d10,d24,#16
    874      1.1  christos 	vadd.u64	d25,d25,d10
    875      1.1  christos 	vshr.u64	d10,d25,#16
    876  1.1.1.2  christos 	vzip.16	d24,d25
    877      1.1  christos 	vadd.u64	d26,d26,d10
    878  1.1.1.2  christos 	vst1.32	{d24[0]}, [r7, :32]!
    879      1.1  christos 	vshr.u64	d10,d26,#16
    880      1.1  christos 	vadd.u64	d27,d27,d10
    881      1.1  christos 	vshr.u64	d10,d27,#16
    882  1.1.1.2  christos 	vzip.16	d26,d27
    883  1.1.1.2  christos 	vld1.64	{q6,q7}, [r6, :256]!
    884  1.1.1.2  christos 	subs	r8,r8,#8
    885  1.1.1.2  christos 	vst1.32	{d26[0]},   [r7, :32]!
    886      1.1  christos 	bne	.LNEON_tail
    887      1.1  christos 
    888      1.1  christos 	vst1.32	{d10[0]}, [r7, :32]		@ top-most bit
    889      1.1  christos 	sub	r3,r3,r5,lsl#2			@ rewind r3
    890      1.1  christos 	subs	r1,sp,#0				@ clear carry flag
    891      1.1  christos 	add	r2,sp,r5,lsl#2
    892      1.1  christos 
    893      1.1  christos .LNEON_sub:
    894  1.1.1.2  christos 	ldmia	r1!, {r4,r5,r6,r7}
    895  1.1.1.2  christos 	ldmia	r3!, {r8,r9,r10,r11}
    896      1.1  christos 	sbcs	r8, r4,r8
    897      1.1  christos 	sbcs	r9, r5,r9
    898      1.1  christos 	sbcs	r10,r6,r10
    899      1.1  christos 	sbcs	r11,r7,r11
    900      1.1  christos 	teq	r1,r2				@ preserves carry
    901  1.1.1.2  christos 	stmia	r0!, {r8,r9,r10,r11}
    902      1.1  christos 	bne	.LNEON_sub
    903      1.1  christos 
    904      1.1  christos 	ldr	r10, [r1]				@ load top-most bit
    905  1.1.1.2  christos 	mov	r11,sp
    906      1.1  christos 	veor	q0,q0,q0
    907  1.1.1.2  christos 	sub	r11,r2,r11				@ this is num*4
    908      1.1  christos 	veor	q1,q1,q1
    909      1.1  christos 	mov	r1,sp
    910      1.1  christos 	sub	r0,r0,r11				@ rewind r0
    911      1.1  christos 	mov	r3,r2				@ second 3/4th of frame
    912      1.1  christos 	sbcs	r10,r10,#0				@ result is carry flag
    913      1.1  christos 
    914      1.1  christos .LNEON_copy_n_zap:
    915  1.1.1.2  christos 	ldmia	r1!, {r4,r5,r6,r7}
    916  1.1.1.2  christos 	ldmia	r0,  {r8,r9,r10,r11}
    917  1.1.1.2  christos 	it	cc
    918      1.1  christos 	movcc	r8, r4
    919  1.1.1.2  christos 	vst1.64	{q0,q1}, [r3,:256]!			@ wipe
    920  1.1.1.2  christos 	itt	cc
    921      1.1  christos 	movcc	r9, r5
    922      1.1  christos 	movcc	r10,r6
    923  1.1.1.2  christos 	vst1.64	{q0,q1}, [r3,:256]!			@ wipe
    924  1.1.1.2  christos 	it	cc
    925      1.1  christos 	movcc	r11,r7
    926  1.1.1.2  christos 	ldmia	r1, {r4,r5,r6,r7}
    927  1.1.1.2  christos 	stmia	r0!, {r8,r9,r10,r11}
    928      1.1  christos 	sub	r1,r1,#16
    929  1.1.1.2  christos 	ldmia	r0, {r8,r9,r10,r11}
    930  1.1.1.2  christos 	it	cc
    931      1.1  christos 	movcc	r8, r4
    932  1.1.1.2  christos 	vst1.64	{q0,q1}, [r1,:256]!			@ wipe
    933  1.1.1.2  christos 	itt	cc
    934      1.1  christos 	movcc	r9, r5
    935      1.1  christos 	movcc	r10,r6
    936  1.1.1.2  christos 	vst1.64	{q0,q1}, [r3,:256]!			@ wipe
    937  1.1.1.2  christos 	it	cc
    938      1.1  christos 	movcc	r11,r7
    939      1.1  christos 	teq	r1,r2				@ preserves carry
    940  1.1.1.2  christos 	stmia	r0!, {r8,r9,r10,r11}
    941      1.1  christos 	bne	.LNEON_copy_n_zap
    942      1.1  christos 
    943  1.1.1.2  christos 	mov	sp,ip
    944  1.1.1.2  christos 	vldmia	sp!,{d8,d9,d10,d11,d12,d13,d14,d15}
    945  1.1.1.2  christos 	ldmia	sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
    946  1.1.1.2  christos 	RET						@ bx lr
    947      1.1  christos .size	bn_mul8x_mont_neon,.-bn_mul8x_mont_neon
    948      1.1  christos #endif
    949  1.1.1.2  christos .byte	77,111,110,116,103,111,109,101,114,121,32,109,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
    950  1.1.1.2  christos .align	2
    951      1.1  christos .align	2
    952      1.1  christos #if __ARM_MAX_ARCH__>=7
    953      1.1  christos .comm	OPENSSL_armcap_P,4,4
    954      1.1  christos #endif
    955