126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#include "arm_arch.h"
226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.text
426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.code	32
526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.type	rem_4bit,%object
726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.align	5
826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstromrem_4bit:
926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.short	0x0000,0x1C20,0x3840,0x2460
1026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.short	0x7080,0x6CA0,0x48C0,0x54E0
1126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.short	0xE100,0xFD20,0xD940,0xC560
1226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.short	0x9180,0x8DA0,0xA9C0,0xB5E0
1326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.size	rem_4bit,.-rem_4bit
1426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
1526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.type	rem_4bit_get,%function
1626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstromrem_4bit_get:
1726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	sub	r2,pc,#8
1826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	sub	r2,r2,#32	@ &rem_4bit
1926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	b	.Lrem_4bit_got
2026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	nop
2126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.size	rem_4bit_get,.-rem_4bit_get
2226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
2326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.global	gcm_ghash_4bit
2426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.type	gcm_ghash_4bit,%function
2526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstromgcm_ghash_4bit:
2626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	sub	r12,pc,#8
2726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r3,r2,r3		@ r3 to point at the end
2826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	stmdb	sp!,{r3-r11,lr}		@ save r3/end too
2926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	sub	r12,r12,#48		@ &rem_4bit
3026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
3126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	r12,{r4-r11}		@ copy rem_4bit ...
3226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	stmdb	sp!,{r4-r11}		@ ... to stack
3326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
3426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrb	r12,[r2,#15]
3526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrb	r14,[r0,#15]
3626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.Louter:
3726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r12,r12,r14
3826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r14,r12,#0xf0
3926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r12,r12,#0x0f
4026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r3,#14
4126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
4226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r7,r1,r12,lsl#4
4326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	r7,{r4-r7}	@ load Htbl[nlo]
4426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r11,r1,r14
4526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrb	r12,[r2,#14]
4626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
4726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r14,r4,#0xf		@ rem
4826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	r11,{r8-r11}	@ load Htbl[nhi]
4926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r14,r14,r14
5026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r4,r8,r4,lsr#4
5126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrh	r8,[sp,r14]		@ rem_4bit[rem]
5226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r4,r4,r5,lsl#28
5326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrb	r14,[r0,#14]
5426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r5,r9,r5,lsr#4
5526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r5,r5,r6,lsl#28
5626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r6,r10,r6,lsr#4
5726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r6,r6,r7,lsl#28
5826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r7,r11,r7,lsr#4
5926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r12,r12,r14
6026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r14,r12,#0xf0
6126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r12,r12,#0x0f
6226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r7,r7,r8,lsl#16
6326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
6426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.Linner:
6526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r11,r1,r12,lsl#4
6626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r12,r4,#0xf		@ rem
6726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	subs	r3,r3,#1
6826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r12,r12,r12
6926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	r11,{r8-r11}	@ load Htbl[nlo]
7026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r4,r8,r4,lsr#4
7126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r4,r4,r5,lsl#28
7226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r5,r9,r5,lsr#4
7326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r5,r5,r6,lsl#28
7426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrh	r8,[sp,r12]		@ rem_4bit[rem]
7526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r6,r10,r6,lsr#4
7626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrplb	r12,[r2,r3]
7726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r6,r6,r7,lsl#28
7826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r7,r11,r7,lsr#4
7926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
8026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r11,r1,r14
8126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r14,r4,#0xf		@ rem
8226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r7,r7,r8,lsl#16	@ ^= rem_4bit[rem]
8326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r14,r14,r14
8426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	r11,{r8-r11}	@ load Htbl[nhi]
8526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r4,r8,r4,lsr#4
8626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrplb	r8,[r0,r3]
8726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r4,r4,r5,lsl#28
8826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r5,r9,r5,lsr#4
8926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrh	r9,[sp,r14]
9026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r5,r5,r6,lsl#28
9126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r6,r10,r6,lsr#4
9226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r6,r6,r7,lsl#28
9326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eorpl	r12,r12,r8
9426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r7,r11,r7,lsr#4
9526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	andpl	r14,r12,#0xf0
9626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	andpl	r12,r12,#0x0f
9726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r7,r7,r9,lsl#16	@ ^= rem_4bit[rem]
9826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	bpl	.Linner
9926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
10026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldr	r3,[sp,#32]		@ re-load r3/end
10126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r2,r2,#16
10226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r14,r4
10326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#if __ARM_ARCH__>=7 && defined(__ARMEL__)
10426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	rev	r4,r4
10526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r4,[r0,#12]
10626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#elif defined(__ARMEB__)
10726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r4,[r0,#12]
10826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#else
10926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r9,r4,lsr#8
11026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r4,[r0,#12+3]
11126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r10,r4,lsr#16
11226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r9,[r0,#12+2]
11326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r11,r4,lsr#24
11426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r10,[r0,#12+1]
11526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r11,[r0,#12]
11626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
11726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	cmp	r2,r3
11826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#if __ARM_ARCH__>=7 && defined(__ARMEL__)
11926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	rev	r5,r5
12026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r5,[r0,#8]
12126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#elif defined(__ARMEB__)
12226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r5,[r0,#8]
12326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#else
12426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r9,r5,lsr#8
12526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r5,[r0,#8+3]
12626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r10,r5,lsr#16
12726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r9,[r0,#8+2]
12826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r11,r5,lsr#24
12926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r10,[r0,#8+1]
13026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r11,[r0,#8]
13126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
13226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrneb	r12,[r2,#15]
13326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#if __ARM_ARCH__>=7 && defined(__ARMEL__)
13426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	rev	r6,r6
13526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r6,[r0,#4]
13626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#elif defined(__ARMEB__)
13726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r6,[r0,#4]
13826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#else
13926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r9,r6,lsr#8
14026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r6,[r0,#4+3]
14126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r10,r6,lsr#16
14226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r9,[r0,#4+2]
14326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r11,r6,lsr#24
14426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r10,[r0,#4+1]
14526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r11,[r0,#4]
14626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
14726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
14826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#if __ARM_ARCH__>=7 && defined(__ARMEL__)
14926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	rev	r7,r7
15026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r7,[r0,#0]
15126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#elif defined(__ARMEB__)
15226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r7,[r0,#0]
15326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#else
15426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r9,r7,lsr#8
15526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r7,[r0,#0+3]
15626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r10,r7,lsr#16
15726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r9,[r0,#0+2]
15826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r11,r7,lsr#24
15926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r10,[r0,#0+1]
16026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r11,[r0,#0]
16126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
16226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
16326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	bne	.Louter
16426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
16526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	sp,sp,#36
16626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#if __ARM_ARCH__>=5
16726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	sp!,{r4-r11,pc}
16826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#else
16926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	sp!,{r4-r11,lr}
17026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	tst	lr,#1
17126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	moveq	pc,lr			@ be binary compatible with V4, yet
17226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	.word	0xe12fff1e			@ interoperable with Thumb ISA:-)
17326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
17426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.size	gcm_ghash_4bit,.-gcm_ghash_4bit
17526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
17626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.global	gcm_gmult_4bit
17726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.type	gcm_gmult_4bit,%function
17826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstromgcm_gmult_4bit:
17926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	stmdb	sp!,{r4-r11,lr}
18026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrb	r12,[r0,#15]
18126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	b	rem_4bit_get
18226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.Lrem_4bit_got:
18326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r14,r12,#0xf0
18426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r12,r12,#0x0f
18526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r3,#14
18626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
18726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r7,r1,r12,lsl#4
18826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	r7,{r4-r7}	@ load Htbl[nlo]
18926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrb	r12,[r0,#14]
19026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
19126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r11,r1,r14
19226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r14,r4,#0xf		@ rem
19326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	r11,{r8-r11}	@ load Htbl[nhi]
19426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r14,r14,r14
19526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r4,r8,r4,lsr#4
19626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrh	r8,[r2,r14]	@ rem_4bit[rem]
19726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r4,r4,r5,lsl#28
19826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r5,r9,r5,lsr#4
19926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r5,r5,r6,lsl#28
20026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r6,r10,r6,lsr#4
20126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r6,r6,r7,lsl#28
20226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r7,r11,r7,lsr#4
20326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r14,r12,#0xf0
20426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r7,r7,r8,lsl#16
20526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r12,r12,#0x0f
20626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
20726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.Loop:
20826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r11,r1,r12,lsl#4
20926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r12,r4,#0xf		@ rem
21026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	subs	r3,r3,#1
21126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r12,r12,r12
21226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	r11,{r8-r11}	@ load Htbl[nlo]
21326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r4,r8,r4,lsr#4
21426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r4,r4,r5,lsl#28
21526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r5,r9,r5,lsr#4
21626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r5,r5,r6,lsl#28
21726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrh	r8,[r2,r12]	@ rem_4bit[rem]
21826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r6,r10,r6,lsr#4
21926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrplb	r12,[r0,r3]
22026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r6,r6,r7,lsl#28
22126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r7,r11,r7,lsr#4
22226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
22326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r11,r1,r14
22426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	and	r14,r4,#0xf		@ rem
22526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r7,r7,r8,lsl#16	@ ^= rem_4bit[rem]
22626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	add	r14,r14,r14
22726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	r11,{r8-r11}	@ load Htbl[nhi]
22826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r4,r8,r4,lsr#4
22926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r4,r4,r5,lsl#28
23026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r5,r9,r5,lsr#4
23126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldrh	r8,[r2,r14]	@ rem_4bit[rem]
23226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r5,r5,r6,lsl#28
23326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r6,r10,r6,lsr#4
23426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r6,r6,r7,lsl#28
23526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r7,r11,r7,lsr#4
23626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	andpl	r14,r12,#0xf0
23726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	andpl	r12,r12,#0x0f
23826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	eor	r7,r7,r8,lsl#16	@ ^= rem_4bit[rem]
23926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	bpl	.Loop
24026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#if __ARM_ARCH__>=7 && defined(__ARMEL__)
24126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	rev	r4,r4
24226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r4,[r0,#12]
24326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#elif defined(__ARMEB__)
24426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r4,[r0,#12]
24526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#else
24626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r9,r4,lsr#8
24726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r4,[r0,#12+3]
24826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r10,r4,lsr#16
24926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r9,[r0,#12+2]
25026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r11,r4,lsr#24
25126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r10,[r0,#12+1]
25226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r11,[r0,#12]
25326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
25426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
25526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#if __ARM_ARCH__>=7 && defined(__ARMEL__)
25626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	rev	r5,r5
25726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r5,[r0,#8]
25826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#elif defined(__ARMEB__)
25926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r5,[r0,#8]
26026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#else
26126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r9,r5,lsr#8
26226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r5,[r0,#8+3]
26326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r10,r5,lsr#16
26426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r9,[r0,#8+2]
26526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r11,r5,lsr#24
26626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r10,[r0,#8+1]
26726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r11,[r0,#8]
26826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
26926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
27026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#if __ARM_ARCH__>=7 && defined(__ARMEL__)
27126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	rev	r6,r6
27226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r6,[r0,#4]
27326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#elif defined(__ARMEB__)
27426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r6,[r0,#4]
27526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#else
27626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r9,r6,lsr#8
27726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r6,[r0,#4+3]
27826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r10,r6,lsr#16
27926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r9,[r0,#4+2]
28026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r11,r6,lsr#24
28126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r10,[r0,#4+1]
28226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r11,[r0,#4]
28326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
28426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
28526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#if __ARM_ARCH__>=7 && defined(__ARMEL__)
28626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	rev	r7,r7
28726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r7,[r0,#0]
28826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#elif defined(__ARMEB__)
28926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	str	r7,[r0,#0]
29026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#else
29126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r9,r7,lsr#8
29226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r7,[r0,#0+3]
29326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r10,r7,lsr#16
29426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r9,[r0,#0+2]
29526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov	r11,r7,lsr#24
29626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r10,[r0,#0+1]
29726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	strb	r11,[r0,#0]
29826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
29926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
30026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#if __ARM_ARCH__>=5
30126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	sp!,{r4-r11,pc}
30226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#else
30326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	ldmia	sp!,{r4-r11,lr}
30426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	tst	lr,#1
30526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	moveq	pc,lr			@ be binary compatible with V4, yet
30626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	.word	0xe12fff1e			@ interoperable with Thumb ISA:-)
30726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
30826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.size	gcm_gmult_4bit,.-gcm_gmult_4bit
30926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#if __ARM_ARCH__>=7
31026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.fpu	neon
31126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
31226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.global	gcm_gmult_neon
31326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.type	gcm_gmult_neon,%function
31426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.align	4
31526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstromgcm_gmult_neon:
31626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	sub		r1,#16		@ point at H in GCM128_CTX
31726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vld1.64		d29,[r0,:64]!@ load Xi
31826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vmov.i32	d5,#0xe1		@ our irreducible polynomial
31926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vld1.64		d28,[r0,:64]!
32026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vshr.u64	d5,#32
32126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vldmia		r1,{d0-d1}	@ load H
32226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		q12,q12
32326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#ifdef __ARMEL__
32426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vrev64.8	q14,q14
32526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
32626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		q13,q13
32726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		q11,q11
32826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov		r1,#16
32926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		q10,q10
33026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov		r3,#16
33126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		d2,d2
33226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vdup.8		d4,d28[0]	@ broadcast lowest byte
33326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	b		.Linner_neon
33426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.size	gcm_gmult_neon,.-gcm_gmult_neon
33526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
33626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.global	gcm_ghash_neon
33726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.type	gcm_ghash_neon,%function
33826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.align	4
33926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstromgcm_ghash_neon:
34026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vld1.64		d21,[r0,:64]!	@ load Xi
34126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vmov.i32	d5,#0xe1		@ our irreducible polynomial
34226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vld1.64		d20,[r0,:64]!
34326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vshr.u64	d5,#32
34426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vldmia		r0,{d0-d1}		@ load H
34526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		q12,q12
34626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	nop
34726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#ifdef __ARMEL__
34826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vrev64.8	q10,q10
34926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
35026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.Louter_neon:
35126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vld1.64		d29,[r2]!	@ load inp
35226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		q13,q13
35326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vld1.64		d28,[r2]!
35426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		q11,q11
35526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	mov		r1,#16
35626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#ifdef __ARMEL__
35726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vrev64.8	q14,q14
35826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
35926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		d2,d2
36026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		q14,q10			@ inp^=Xi
36126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		q10,q10
36226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vdup.8		d4,d28[0]	@ broadcast lowest byte
36326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.Linner_neon:
36426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	subs		r1,r1,#1
3651762a559ef393f9c15300398433598989033385fDavid 'Digit' Turner	vmull.p8	q9,d1,d4		@ H.lo·Xi[i]
3661762a559ef393f9c15300398433598989033385fDavid 'Digit' Turner	vmull.p8	q8,d0,d4		@ H.hi·Xi[i]
36726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vext.8		q14,q12,#1		@ IN>>=8
36826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
36926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		q10,q13		@ modulo-scheduled part
37026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vshl.i64	d22,#48
37126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vdup.8		d4,d28[0]	@ broadcast lowest byte
37226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		d3,d18,d20
37326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
37426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		d21,d22
37526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vuzp.8		q9,q8
37626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vsli.8		d2,d3,#1		@ compose the "carry" byte
37726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vext.8		q10,q12,#1		@ Z>>=8
37826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
3791762a559ef393f9c15300398433598989033385fDavid 'Digit' Turner	vmull.p8	q11,d2,d5		@ "carry"·0xe1
38026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vshr.u8		d2,d3,#7		@ save Z's bottom bit
38126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vext.8		q13,q9,q12,#1	@ Qlo>>=8
38226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		q10,q8
38326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	bne		.Linner_neon
38426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
38526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		q10,q13		@ modulo-scheduled artefact
38626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vshl.i64	d22,#48
38726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	veor		d21,d22
38826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
38926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	@ finalization, normalize Z:Zo
39026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vand		d2,d5		@ suffices to mask the bit
39126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vshr.u64	d3,d20,#63
39226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vshl.i64	q10,#1
39326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	subs		r3,#16
39426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vorr		q10,q1		@ Z=Z:Zo<<1
39526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	bne		.Louter_neon
39626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
39726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#ifdef __ARMEL__
39826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vrev64.8	q10,q10
39926674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
40026674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	sub		r0,#16
40126674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vst1.64		d21,[r0,:64]!	@ write out Xi
40226674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	vst1.64		d20,[r0,:64]
40326674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom
40426674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom	.word	0xe12fff1e
40526674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.size	gcm_ghash_neon,.-gcm_ghash_neon
40626674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom#endif
40726674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.asciz  "GHASH for ARMv4/NEON, CRYPTOGAMS by <appro@openssl.org>"
40826674baf1ef727d9c0f12939c08ea90b56f65c26Brian Carlstrom.align  2
409