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