1305153Sjkim/* $FreeBSD$ */ 2305153Sjkim/* Do not modify. This file is auto-generated from armv4-gf2m.pl. */ 3304636Sjkim#include "arm_arch.h" 4304636Sjkim 5304636Sjkim.text 6304636Sjkim.code 32 7304636Sjkim.type mul_1x1_ialu,%function 8304636Sjkim.align 5 9304636Sjkimmul_1x1_ialu: 10304636Sjkim mov r4,#0 11304636Sjkim bic r5,r1,#3<<30 @ a1=a&0x3fffffff 12304636Sjkim str r4,[sp,#0] @ tab[0]=0 13304636Sjkim add r6,r5,r5 @ a2=a1<<1 14304636Sjkim str r5,[sp,#4] @ tab[1]=a1 15304636Sjkim eor r7,r5,r6 @ a1^a2 16304636Sjkim str r6,[sp,#8] @ tab[2]=a2 17304636Sjkim mov r8,r5,lsl#2 @ a4=a1<<2 18304636Sjkim str r7,[sp,#12] @ tab[3]=a1^a2 19304636Sjkim eor r9,r5,r8 @ a1^a4 20304636Sjkim str r8,[sp,#16] @ tab[4]=a4 21304636Sjkim eor r4,r6,r8 @ a2^a4 22304636Sjkim str r9,[sp,#20] @ tab[5]=a1^a4 23304636Sjkim eor r7,r7,r8 @ a1^a2^a4 24304636Sjkim str r4,[sp,#24] @ tab[6]=a2^a4 25304636Sjkim and r8,r12,r0,lsl#2 26304636Sjkim str r7,[sp,#28] @ tab[7]=a1^a2^a4 27304636Sjkim 28304636Sjkim and r9,r12,r0,lsr#1 29304636Sjkim ldr r5,[sp,r8] @ tab[b & 0x7] 30304636Sjkim and r8,r12,r0,lsr#4 31304636Sjkim ldr r7,[sp,r9] @ tab[b >> 3 & 0x7] 32304636Sjkim and r9,r12,r0,lsr#7 33304636Sjkim ldr r6,[sp,r8] @ tab[b >> 6 & 0x7] 34304636Sjkim eor r5,r5,r7,lsl#3 @ stall 35304636Sjkim mov r4,r7,lsr#29 36304636Sjkim ldr r7,[sp,r9] @ tab[b >> 9 & 0x7] 37304636Sjkim 38304636Sjkim and r8,r12,r0,lsr#10 39304636Sjkim eor r5,r5,r6,lsl#6 40304636Sjkim eor r4,r4,r6,lsr#26 41304636Sjkim ldr r6,[sp,r8] @ tab[b >> 12 & 0x7] 42304636Sjkim 43304636Sjkim and r9,r12,r0,lsr#13 44304636Sjkim eor r5,r5,r7,lsl#9 45304636Sjkim eor r4,r4,r7,lsr#23 46304636Sjkim ldr r7,[sp,r9] @ tab[b >> 15 & 0x7] 47304636Sjkim 48304636Sjkim and r8,r12,r0,lsr#16 49304636Sjkim eor r5,r5,r6,lsl#12 50304636Sjkim eor r4,r4,r6,lsr#20 51304636Sjkim ldr r6,[sp,r8] @ tab[b >> 18 & 0x7] 52304636Sjkim 53304636Sjkim and r9,r12,r0,lsr#19 54304636Sjkim eor r5,r5,r7,lsl#15 55304636Sjkim eor r4,r4,r7,lsr#17 56304636Sjkim ldr r7,[sp,r9] @ tab[b >> 21 & 0x7] 57304636Sjkim 58304636Sjkim and r8,r12,r0,lsr#22 59304636Sjkim eor r5,r5,r6,lsl#18 60304636Sjkim eor r4,r4,r6,lsr#14 61304636Sjkim ldr r6,[sp,r8] @ tab[b >> 24 & 0x7] 62304636Sjkim 63304636Sjkim and r9,r12,r0,lsr#25 64304636Sjkim eor r5,r5,r7,lsl#21 65304636Sjkim eor r4,r4,r7,lsr#11 66304636Sjkim ldr r7,[sp,r9] @ tab[b >> 27 & 0x7] 67304636Sjkim 68304636Sjkim tst r1,#1<<30 69304636Sjkim and r8,r12,r0,lsr#28 70304636Sjkim eor r5,r5,r6,lsl#24 71304636Sjkim eor r4,r4,r6,lsr#8 72304636Sjkim ldr r6,[sp,r8] @ tab[b >> 30 ] 73304636Sjkim 74304636Sjkim eorne r5,r5,r0,lsl#30 75304636Sjkim eorne r4,r4,r0,lsr#2 76304636Sjkim tst r1,#1<<31 77304636Sjkim eor r5,r5,r7,lsl#27 78304636Sjkim eor r4,r4,r7,lsr#5 79304636Sjkim eorne r5,r5,r0,lsl#31 80304636Sjkim eorne r4,r4,r0,lsr#1 81304636Sjkim eor r5,r5,r6,lsl#30 82304636Sjkim eor r4,r4,r6,lsr#2 83304636Sjkim 84304636Sjkim mov pc,lr 85304636Sjkim.size mul_1x1_ialu,.-mul_1x1_ialu 86304636Sjkim.global bn_GF2m_mul_2x2 87304636Sjkim.type bn_GF2m_mul_2x2,%function 88304636Sjkim.align 5 89304636Sjkimbn_GF2m_mul_2x2: 90304636Sjkim#if __ARM_MAX_ARCH__>=7 91304636Sjkim ldr r12,.LOPENSSL_armcap 92304636Sjkim.Lpic: ldr r12,[pc,r12] 93304636Sjkim tst r12,#1 94304636Sjkim bne .LNEON 95304636Sjkim#endif 96304636Sjkim stmdb sp!,{r4-r10,lr} 97304636Sjkim mov r10,r0 @ reassign 1st argument 98304636Sjkim mov r0,r3 @ r0=b1 99304636Sjkim ldr r3,[sp,#32] @ load b0 100304636Sjkim mov r12,#7<<2 101304636Sjkim sub sp,sp,#32 @ allocate tab[8] 102304636Sjkim 103304636Sjkim bl mul_1x1_ialu @ a1��b1 104304636Sjkim str r5,[r10,#8] 105304636Sjkim str r4,[r10,#12] 106304636Sjkim 107304636Sjkim eor r0,r0,r3 @ flip b0 and b1 108304636Sjkim eor r1,r1,r2 @ flip a0 and a1 109304636Sjkim eor r3,r3,r0 110304636Sjkim eor r2,r2,r1 111304636Sjkim eor r0,r0,r3 112304636Sjkim eor r1,r1,r2 113304636Sjkim bl mul_1x1_ialu @ a0��b0 114304636Sjkim str r5,[r10] 115304636Sjkim str r4,[r10,#4] 116304636Sjkim 117304636Sjkim eor r1,r1,r2 118304636Sjkim eor r0,r0,r3 119304636Sjkim bl mul_1x1_ialu @ (a1+a0)��(b1+b0) 120304636Sjkim ldmia r10,{r6-r9} 121304636Sjkim eor r5,r5,r4 122304636Sjkim eor r4,r4,r7 123304636Sjkim eor r5,r5,r6 124304636Sjkim eor r4,r4,r8 125304636Sjkim eor r5,r5,r9 126304636Sjkim eor r4,r4,r9 127304636Sjkim str r4,[r10,#8] 128304636Sjkim eor r5,r5,r4 129304636Sjkim add sp,sp,#32 @ destroy tab[8] 130304636Sjkim str r5,[r10,#4] 131304636Sjkim 132304636Sjkim#if __ARM_ARCH__>=5 133304636Sjkim ldmia sp!,{r4-r10,pc} 134304636Sjkim#else 135304636Sjkim ldmia sp!,{r4-r10,lr} 136304636Sjkim tst lr,#1 137304636Sjkim moveq pc,lr @ be binary compatible with V4, yet 138304636Sjkim .word 0xe12fff1e @ interoperable with Thumb ISA:-) 139304636Sjkim#endif 140304636Sjkim#if __ARM_MAX_ARCH__>=7 141304636Sjkim.arch armv7-a 142304636Sjkim.fpu neon 143304636Sjkim 144304636Sjkim.align 5 145304636Sjkim.LNEON: 146304636Sjkim ldr r12, [sp] @ 5th argument 147304636Sjkim vmov d26, r2, r1 148304636Sjkim vmov d27, r12, r3 149304636Sjkim vmov.i64 d28, #0x0000ffffffffffff 150304636Sjkim vmov.i64 d29, #0x00000000ffffffff 151304636Sjkim vmov.i64 d30, #0x000000000000ffff 152304636Sjkim 153304636Sjkim vext.8 d2, d26, d26, #1 @ A1 154304636Sjkim vmull.p8 q1, d2, d27 @ F = A1*B 155304636Sjkim vext.8 d0, d27, d27, #1 @ B1 156304636Sjkim vmull.p8 q0, d26, d0 @ E = A*B1 157304636Sjkim vext.8 d4, d26, d26, #2 @ A2 158304636Sjkim vmull.p8 q2, d4, d27 @ H = A2*B 159304636Sjkim vext.8 d16, d27, d27, #2 @ B2 160304636Sjkim vmull.p8 q8, d26, d16 @ G = A*B2 161304636Sjkim vext.8 d6, d26, d26, #3 @ A3 162304636Sjkim veor q1, q1, q0 @ L = E + F 163304636Sjkim vmull.p8 q3, d6, d27 @ J = A3*B 164304636Sjkim vext.8 d0, d27, d27, #3 @ B3 165304636Sjkim veor q2, q2, q8 @ M = G + H 166304636Sjkim vmull.p8 q0, d26, d0 @ I = A*B3 167304636Sjkim veor d2, d2, d3 @ t0 = (L) (P0 + P1) << 8 168304636Sjkim vand d3, d3, d28 169304636Sjkim vext.8 d16, d27, d27, #4 @ B4 170304636Sjkim veor d4, d4, d5 @ t1 = (M) (P2 + P3) << 16 171304636Sjkim vand d5, d5, d29 172304636Sjkim vmull.p8 q8, d26, d16 @ K = A*B4 173304636Sjkim veor q3, q3, q0 @ N = I + J 174304636Sjkim veor d2, d2, d3 175304636Sjkim veor d4, d4, d5 176304636Sjkim veor d6, d6, d7 @ t2 = (N) (P4 + P5) << 24 177304636Sjkim vand d7, d7, d30 178304636Sjkim vext.8 q1, q1, q1, #15 179304636Sjkim veor d16, d16, d17 @ t3 = (K) (P6 + P7) << 32 180304636Sjkim vmov.i64 d17, #0 181304636Sjkim vext.8 q2, q2, q2, #14 182304636Sjkim veor d6, d6, d7 183304636Sjkim vmull.p8 q0, d26, d27 @ D = A*B 184304636Sjkim vext.8 q8, q8, q8, #12 185304636Sjkim vext.8 q3, q3, q3, #13 186304636Sjkim veor q1, q1, q2 187304636Sjkim veor q3, q3, q8 188304636Sjkim veor q0, q0, q1 189304636Sjkim veor q0, q0, q3 190304636Sjkim 191304636Sjkim vst1.32 {q0}, [r0] 192304636Sjkim bx lr @ bx lr 193304636Sjkim#endif 194304636Sjkim.size bn_GF2m_mul_2x2,.-bn_GF2m_mul_2x2 195304636Sjkim#if __ARM_MAX_ARCH__>=7 196304636Sjkim.align 5 197304636Sjkim.LOPENSSL_armcap: 198304636Sjkim.word OPENSSL_armcap_P-(.Lpic+8) 199304636Sjkim#endif 200304636Sjkim.asciz "GF(2^m) Multiplication for ARMv4/NEON, CRYPTOGAMS by <appro@openssl.org>" 201304636Sjkim.align 5 202304636Sjkim 203304636Sjkim#if __ARM_MAX_ARCH__>=7 204304636Sjkim.comm OPENSSL_armcap_P,4,4 205304636Sjkim#endif 206