Path: blob/main/sys/crypto/openssl/arm/armv4-mont.S
39482 views
/* Do not modify. This file is auto-generated from armv4-mont.pl. */1#include "arm_arch.h"23#if defined(__thumb2__)4.syntax unified5.thumb6#else7.code 328#endif910.text1112#if __ARM_MAX_ARCH__>=713.align 514.LOPENSSL_armcap:15# ifdef _WIN3216.word OPENSSL_armcap_P17# else18.word OPENSSL_armcap_P-.Lbn_mul_mont19# endif20#endif2122.globl bn_mul_mont23.type bn_mul_mont,%function2425.align 526bn_mul_mont:27.Lbn_mul_mont:28ldr ip,[sp,#4] @ load num29stmdb sp!,{r0,r2} @ sp points at argument block30#if __ARM_MAX_ARCH__>=731tst ip,#732bne .Lialu33ldr r0,.LOPENSSL_armcap34#if !defined(_WIN32)35adr r2,.Lbn_mul_mont36ldr r0,[r0,r2]37# endif38# if defined(__APPLE__) || defined(_WIN32)39ldr r0,[r0]40# endif41tst r0,#ARMV7_NEON @ NEON available?42ldmia sp, {r0,r2}43beq .Lialu44add sp,sp,#845b bn_mul8x_mont_neon46.align 447.Lialu:48#endif49cmp ip,#250mov r0,ip @ load num51#ifdef __thumb2__52ittt lt53#endif54movlt r0,#055addlt sp,sp,#2*456blt .Labrt5758stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ save 10 registers5960mov r0,r0,lsl#2 @ rescale r0 for byte count61sub sp,sp,r0 @ alloca(4*num)62sub sp,sp,#4 @ +extra dword63sub r0,r0,#4 @ "num=num-1"64add r4,r2,r0 @ &bp[num-1]6566add r0,sp,r0 @ r0 to point at &tp[num-1]67ldr r8,[r0,#14*4] @ &n068ldr r2,[r2] @ bp[0]69ldr r5,[r1],#4 @ ap[0],ap++70ldr r6,[r3],#4 @ np[0],np++71ldr r8,[r8] @ *n072str r4,[r0,#15*4] @ save &bp[num]7374umull r10,r11,r5,r2 @ ap[0]*bp[0]75str r8,[r0,#14*4] @ save n0 value76mul r8,r10,r8 @ "tp[0]"*n077mov r12,#078umlal r10,r12,r6,r8 @ np[0]*n0+"t[0]"79mov r4,sp8081.L1st:82ldr r5,[r1],#4 @ ap[j],ap++83mov r10,r1184ldr r6,[r3],#4 @ np[j],np++85mov r11,#086umlal r10,r11,r5,r2 @ ap[j]*bp[0]87mov r14,#088umlal r12,r14,r6,r8 @ np[j]*n089adds r12,r12,r1090str r12,[r4],#4 @ tp[j-1]=,tp++91adc r12,r14,#092cmp r4,r093bne .L1st9495adds r12,r12,r1196ldr r4,[r0,#13*4] @ restore bp97mov r14,#098ldr r8,[r0,#14*4] @ restore n099adc r14,r14,#0100str r12,[r0] @ tp[num-1]=101mov r7,sp102str r14,[r0,#4] @ tp[num]=103104.Louter:105sub r7,r0,r7 @ "original" r0-1 value106sub r1,r1,r7 @ "rewind" ap to &ap[1]107ldr r2,[r4,#4]! @ *(++bp)108sub r3,r3,r7 @ "rewind" np to &np[1]109ldr r5,[r1,#-4] @ ap[0]110ldr r10,[sp] @ tp[0]111ldr r6,[r3,#-4] @ np[0]112ldr r7,[sp,#4] @ tp[1]113114mov r11,#0115umlal r10,r11,r5,r2 @ ap[0]*bp[i]+tp[0]116str r4,[r0,#13*4] @ save bp117mul r8,r10,r8118mov r12,#0119umlal r10,r12,r6,r8 @ np[0]*n0+"tp[0]"120mov r4,sp121122.Linner:123ldr r5,[r1],#4 @ ap[j],ap++124adds r10,r11,r7 @ +=tp[j]125ldr r6,[r3],#4 @ np[j],np++126mov r11,#0127umlal r10,r11,r5,r2 @ ap[j]*bp[i]128mov r14,#0129umlal r12,r14,r6,r8 @ np[j]*n0130adc r11,r11,#0131ldr r7,[r4,#8] @ tp[j+1]132adds r12,r12,r10133str r12,[r4],#4 @ tp[j-1]=,tp++134adc r12,r14,#0135cmp r4,r0136bne .Linner137138adds r12,r12,r11139mov r14,#0140ldr r4,[r0,#13*4] @ restore bp141adc r14,r14,#0142ldr r8,[r0,#14*4] @ restore n0143adds r12,r12,r7144ldr r7,[r0,#15*4] @ restore &bp[num]145adc r14,r14,#0146str r12,[r0] @ tp[num-1]=147str r14,[r0,#4] @ tp[num]=148149cmp r4,r7150#ifdef __thumb2__151itt ne152#endif153movne r7,sp154bne .Louter155156ldr r2,[r0,#12*4] @ pull rp157mov r5,sp158add r0,r0,#4 @ r0 to point at &tp[num]159sub r5,r0,r5 @ "original" num value160mov r4,sp @ "rewind" r4161mov r1,r4 @ "borrow" r1162sub r3,r3,r5 @ "rewind" r3 to &np[0]163164subs r7,r7,r7 @ "clear" carry flag165.Lsub: ldr r7,[r4],#4166ldr r6,[r3],#4167sbcs r7,r7,r6 @ tp[j]-np[j]168str r7,[r2],#4 @ rp[j]=169teq r4,r0 @ preserve carry170bne .Lsub171sbcs r14,r14,#0 @ upmost carry172mov r4,sp @ "rewind" r4173sub r2,r2,r5 @ "rewind" r2174175.Lcopy: ldr r7,[r4] @ conditional copy176ldr r5,[r2]177str sp,[r4],#4 @ zap tp178#ifdef __thumb2__179it cc180#endif181movcc r5,r7182str r5,[r2],#4183teq r4,r0 @ preserve carry184bne .Lcopy185186mov sp,r0187add sp,sp,#4 @ skip over tp[num+1]188ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ restore registers189add sp,sp,#2*4 @ skip over {r0,r2}190mov r0,#1191.Labrt:192#if __ARM_ARCH__>=5193bx lr @ bx lr194#else195tst lr,#1196moveq pc,lr @ be binary compatible with V4, yet197.word 0xe12fff1e @ interoperable with Thumb ISA:-)198#endif199.size bn_mul_mont,.-bn_mul_mont200#if __ARM_MAX_ARCH__>=7201.arch armv7-a202.fpu neon203204.type bn_mul8x_mont_neon,%function205.align 5206bn_mul8x_mont_neon:207mov ip,sp208stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11}209vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so210ldmia ip,{r4,r5} @ load rest of parameter block211mov ip,sp212213cmp r5,#8214bhi .LNEON_8n215216@ special case for r5==8, everything is in register bank...217218vld1.32 {d28[0]}, [r2,:32]!219veor d8,d8,d8220sub r7,sp,r5,lsl#4221vld1.32 {d0,d1,d2,d3}, [r1]! @ can't specify :32 :-(222and r7,r7,#-64223vld1.32 {d30[0]}, [r4,:32]224mov sp,r7 @ alloca225vzip.16 d28,d8226227vmull.u32 q6,d28,d0[0]228vmull.u32 q7,d28,d0[1]229vmull.u32 q8,d28,d1[0]230vshl.i64 d29,d13,#16231vmull.u32 q9,d28,d1[1]232233vadd.u64 d29,d29,d12234veor d8,d8,d8235vmul.u32 d29,d29,d30236237vmull.u32 q10,d28,d2[0]238vld1.32 {d4,d5,d6,d7}, [r3]!239vmull.u32 q11,d28,d2[1]240vmull.u32 q12,d28,d3[0]241vzip.16 d29,d8242vmull.u32 q13,d28,d3[1]243244vmlal.u32 q6,d29,d4[0]245sub r9,r5,#1246vmlal.u32 q7,d29,d4[1]247vmlal.u32 q8,d29,d5[0]248vmlal.u32 q9,d29,d5[1]249250vmlal.u32 q10,d29,d6[0]251vmov q5,q6252vmlal.u32 q11,d29,d6[1]253vmov q6,q7254vmlal.u32 q12,d29,d7[0]255vmov q7,q8256vmlal.u32 q13,d29,d7[1]257vmov q8,q9258vmov q9,q10259vshr.u64 d10,d10,#16260vmov q10,q11261vmov q11,q12262vadd.u64 d10,d10,d11263vmov q12,q13264veor q13,q13265vshr.u64 d10,d10,#16266267b .LNEON_outer8268269.align 4270.LNEON_outer8:271vld1.32 {d28[0]}, [r2,:32]!272veor d8,d8,d8273vzip.16 d28,d8274vadd.u64 d12,d12,d10275276vmlal.u32 q6,d28,d0[0]277vmlal.u32 q7,d28,d0[1]278vmlal.u32 q8,d28,d1[0]279vshl.i64 d29,d13,#16280vmlal.u32 q9,d28,d1[1]281282vadd.u64 d29,d29,d12283veor d8,d8,d8284subs r9,r9,#1285vmul.u32 d29,d29,d30286287vmlal.u32 q10,d28,d2[0]288vmlal.u32 q11,d28,d2[1]289vmlal.u32 q12,d28,d3[0]290vzip.16 d29,d8291vmlal.u32 q13,d28,d3[1]292293vmlal.u32 q6,d29,d4[0]294vmlal.u32 q7,d29,d4[1]295vmlal.u32 q8,d29,d5[0]296vmlal.u32 q9,d29,d5[1]297298vmlal.u32 q10,d29,d6[0]299vmov q5,q6300vmlal.u32 q11,d29,d6[1]301vmov q6,q7302vmlal.u32 q12,d29,d7[0]303vmov q7,q8304vmlal.u32 q13,d29,d7[1]305vmov q8,q9306vmov q9,q10307vshr.u64 d10,d10,#16308vmov q10,q11309vmov q11,q12310vadd.u64 d10,d10,d11311vmov q12,q13312veor q13,q13313vshr.u64 d10,d10,#16314315bne .LNEON_outer8316317vadd.u64 d12,d12,d10318mov r7,sp319vshr.u64 d10,d12,#16320mov r8,r5321vadd.u64 d13,d13,d10322add r6,sp,#96323vshr.u64 d10,d13,#16324vzip.16 d12,d13325326b .LNEON_tail_entry327328.align 4329.LNEON_8n:330veor q6,q6,q6331sub r7,sp,#128332veor q7,q7,q7333sub r7,r7,r5,lsl#4334veor q8,q8,q8335and r7,r7,#-64336veor q9,q9,q9337mov sp,r7 @ alloca338veor q10,q10,q10339add r7,r7,#256340veor q11,q11,q11341sub r8,r5,#8342veor q12,q12,q12343veor q13,q13,q13344345.LNEON_8n_init:346vst1.64 {q6,q7},[r7,:256]!347subs r8,r8,#8348vst1.64 {q8,q9},[r7,:256]!349vst1.64 {q10,q11},[r7,:256]!350vst1.64 {q12,q13},[r7,:256]!351bne .LNEON_8n_init352353add r6,sp,#256354vld1.32 {d0,d1,d2,d3},[r1]!355add r10,sp,#8356vld1.32 {d30[0]},[r4,:32]357mov r9,r5358b .LNEON_8n_outer359360.align 4361.LNEON_8n_outer:362vld1.32 {d28[0]},[r2,:32]! @ *b++363veor d8,d8,d8364vzip.16 d28,d8365add r7,sp,#128366vld1.32 {d4,d5,d6,d7},[r3]!367368vmlal.u32 q6,d28,d0[0]369vmlal.u32 q7,d28,d0[1]370veor d8,d8,d8371vmlal.u32 q8,d28,d1[0]372vshl.i64 d29,d13,#16373vmlal.u32 q9,d28,d1[1]374vadd.u64 d29,d29,d12375vmlal.u32 q10,d28,d2[0]376vmul.u32 d29,d29,d30377vmlal.u32 q11,d28,d2[1]378vst1.32 {d28},[sp,:64] @ put aside smashed b[8*i+0]379vmlal.u32 q12,d28,d3[0]380vzip.16 d29,d8381vmlal.u32 q13,d28,d3[1]382vld1.32 {d28[0]},[r2,:32]! @ *b++383vmlal.u32 q6,d29,d4[0]384veor d10,d10,d10385vmlal.u32 q7,d29,d4[1]386vzip.16 d28,d10387vmlal.u32 q8,d29,d5[0]388vshr.u64 d12,d12,#16389vmlal.u32 q9,d29,d5[1]390vmlal.u32 q10,d29,d6[0]391vadd.u64 d12,d12,d13392vmlal.u32 q11,d29,d6[1]393vshr.u64 d12,d12,#16394vmlal.u32 q12,d29,d7[0]395vmlal.u32 q13,d29,d7[1]396vadd.u64 d14,d14,d12397vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+0]398vmlal.u32 q7,d28,d0[0]399vld1.64 {q6},[r6,:128]!400vmlal.u32 q8,d28,d0[1]401veor d8,d8,d8402vmlal.u32 q9,d28,d1[0]403vshl.i64 d29,d15,#16404vmlal.u32 q10,d28,d1[1]405vadd.u64 d29,d29,d14406vmlal.u32 q11,d28,d2[0]407vmul.u32 d29,d29,d30408vmlal.u32 q12,d28,d2[1]409vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+1]410vmlal.u32 q13,d28,d3[0]411vzip.16 d29,d8412vmlal.u32 q6,d28,d3[1]413vld1.32 {d28[0]},[r2,:32]! @ *b++414vmlal.u32 q7,d29,d4[0]415veor d10,d10,d10416vmlal.u32 q8,d29,d4[1]417vzip.16 d28,d10418vmlal.u32 q9,d29,d5[0]419vshr.u64 d14,d14,#16420vmlal.u32 q10,d29,d5[1]421vmlal.u32 q11,d29,d6[0]422vadd.u64 d14,d14,d15423vmlal.u32 q12,d29,d6[1]424vshr.u64 d14,d14,#16425vmlal.u32 q13,d29,d7[0]426vmlal.u32 q6,d29,d7[1]427vadd.u64 d16,d16,d14428vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+1]429vmlal.u32 q8,d28,d0[0]430vld1.64 {q7},[r6,:128]!431vmlal.u32 q9,d28,d0[1]432veor d8,d8,d8433vmlal.u32 q10,d28,d1[0]434vshl.i64 d29,d17,#16435vmlal.u32 q11,d28,d1[1]436vadd.u64 d29,d29,d16437vmlal.u32 q12,d28,d2[0]438vmul.u32 d29,d29,d30439vmlal.u32 q13,d28,d2[1]440vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+2]441vmlal.u32 q6,d28,d3[0]442vzip.16 d29,d8443vmlal.u32 q7,d28,d3[1]444vld1.32 {d28[0]},[r2,:32]! @ *b++445vmlal.u32 q8,d29,d4[0]446veor d10,d10,d10447vmlal.u32 q9,d29,d4[1]448vzip.16 d28,d10449vmlal.u32 q10,d29,d5[0]450vshr.u64 d16,d16,#16451vmlal.u32 q11,d29,d5[1]452vmlal.u32 q12,d29,d6[0]453vadd.u64 d16,d16,d17454vmlal.u32 q13,d29,d6[1]455vshr.u64 d16,d16,#16456vmlal.u32 q6,d29,d7[0]457vmlal.u32 q7,d29,d7[1]458vadd.u64 d18,d18,d16459vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+2]460vmlal.u32 q9,d28,d0[0]461vld1.64 {q8},[r6,:128]!462vmlal.u32 q10,d28,d0[1]463veor d8,d8,d8464vmlal.u32 q11,d28,d1[0]465vshl.i64 d29,d19,#16466vmlal.u32 q12,d28,d1[1]467vadd.u64 d29,d29,d18468vmlal.u32 q13,d28,d2[0]469vmul.u32 d29,d29,d30470vmlal.u32 q6,d28,d2[1]471vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+3]472vmlal.u32 q7,d28,d3[0]473vzip.16 d29,d8474vmlal.u32 q8,d28,d3[1]475vld1.32 {d28[0]},[r2,:32]! @ *b++476vmlal.u32 q9,d29,d4[0]477veor d10,d10,d10478vmlal.u32 q10,d29,d4[1]479vzip.16 d28,d10480vmlal.u32 q11,d29,d5[0]481vshr.u64 d18,d18,#16482vmlal.u32 q12,d29,d5[1]483vmlal.u32 q13,d29,d6[0]484vadd.u64 d18,d18,d19485vmlal.u32 q6,d29,d6[1]486vshr.u64 d18,d18,#16487vmlal.u32 q7,d29,d7[0]488vmlal.u32 q8,d29,d7[1]489vadd.u64 d20,d20,d18490vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+3]491vmlal.u32 q10,d28,d0[0]492vld1.64 {q9},[r6,:128]!493vmlal.u32 q11,d28,d0[1]494veor d8,d8,d8495vmlal.u32 q12,d28,d1[0]496vshl.i64 d29,d21,#16497vmlal.u32 q13,d28,d1[1]498vadd.u64 d29,d29,d20499vmlal.u32 q6,d28,d2[0]500vmul.u32 d29,d29,d30501vmlal.u32 q7,d28,d2[1]502vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+4]503vmlal.u32 q8,d28,d3[0]504vzip.16 d29,d8505vmlal.u32 q9,d28,d3[1]506vld1.32 {d28[0]},[r2,:32]! @ *b++507vmlal.u32 q10,d29,d4[0]508veor d10,d10,d10509vmlal.u32 q11,d29,d4[1]510vzip.16 d28,d10511vmlal.u32 q12,d29,d5[0]512vshr.u64 d20,d20,#16513vmlal.u32 q13,d29,d5[1]514vmlal.u32 q6,d29,d6[0]515vadd.u64 d20,d20,d21516vmlal.u32 q7,d29,d6[1]517vshr.u64 d20,d20,#16518vmlal.u32 q8,d29,d7[0]519vmlal.u32 q9,d29,d7[1]520vadd.u64 d22,d22,d20521vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+4]522vmlal.u32 q11,d28,d0[0]523vld1.64 {q10},[r6,:128]!524vmlal.u32 q12,d28,d0[1]525veor d8,d8,d8526vmlal.u32 q13,d28,d1[0]527vshl.i64 d29,d23,#16528vmlal.u32 q6,d28,d1[1]529vadd.u64 d29,d29,d22530vmlal.u32 q7,d28,d2[0]531vmul.u32 d29,d29,d30532vmlal.u32 q8,d28,d2[1]533vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+5]534vmlal.u32 q9,d28,d3[0]535vzip.16 d29,d8536vmlal.u32 q10,d28,d3[1]537vld1.32 {d28[0]},[r2,:32]! @ *b++538vmlal.u32 q11,d29,d4[0]539veor d10,d10,d10540vmlal.u32 q12,d29,d4[1]541vzip.16 d28,d10542vmlal.u32 q13,d29,d5[0]543vshr.u64 d22,d22,#16544vmlal.u32 q6,d29,d5[1]545vmlal.u32 q7,d29,d6[0]546vadd.u64 d22,d22,d23547vmlal.u32 q8,d29,d6[1]548vshr.u64 d22,d22,#16549vmlal.u32 q9,d29,d7[0]550vmlal.u32 q10,d29,d7[1]551vadd.u64 d24,d24,d22552vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+5]553vmlal.u32 q12,d28,d0[0]554vld1.64 {q11},[r6,:128]!555vmlal.u32 q13,d28,d0[1]556veor d8,d8,d8557vmlal.u32 q6,d28,d1[0]558vshl.i64 d29,d25,#16559vmlal.u32 q7,d28,d1[1]560vadd.u64 d29,d29,d24561vmlal.u32 q8,d28,d2[0]562vmul.u32 d29,d29,d30563vmlal.u32 q9,d28,d2[1]564vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+6]565vmlal.u32 q10,d28,d3[0]566vzip.16 d29,d8567vmlal.u32 q11,d28,d3[1]568vld1.32 {d28[0]},[r2,:32]! @ *b++569vmlal.u32 q12,d29,d4[0]570veor d10,d10,d10571vmlal.u32 q13,d29,d4[1]572vzip.16 d28,d10573vmlal.u32 q6,d29,d5[0]574vshr.u64 d24,d24,#16575vmlal.u32 q7,d29,d5[1]576vmlal.u32 q8,d29,d6[0]577vadd.u64 d24,d24,d25578vmlal.u32 q9,d29,d6[1]579vshr.u64 d24,d24,#16580vmlal.u32 q10,d29,d7[0]581vmlal.u32 q11,d29,d7[1]582vadd.u64 d26,d26,d24583vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+6]584vmlal.u32 q13,d28,d0[0]585vld1.64 {q12},[r6,:128]!586vmlal.u32 q6,d28,d0[1]587veor d8,d8,d8588vmlal.u32 q7,d28,d1[0]589vshl.i64 d29,d27,#16590vmlal.u32 q8,d28,d1[1]591vadd.u64 d29,d29,d26592vmlal.u32 q9,d28,d2[0]593vmul.u32 d29,d29,d30594vmlal.u32 q10,d28,d2[1]595vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+7]596vmlal.u32 q11,d28,d3[0]597vzip.16 d29,d8598vmlal.u32 q12,d28,d3[1]599vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0]600vmlal.u32 q13,d29,d4[0]601vld1.32 {d0,d1,d2,d3},[r1]!602vmlal.u32 q6,d29,d4[1]603vmlal.u32 q7,d29,d5[0]604vshr.u64 d26,d26,#16605vmlal.u32 q8,d29,d5[1]606vmlal.u32 q9,d29,d6[0]607vadd.u64 d26,d26,d27608vmlal.u32 q10,d29,d6[1]609vshr.u64 d26,d26,#16610vmlal.u32 q11,d29,d7[0]611vmlal.u32 q12,d29,d7[1]612vadd.u64 d12,d12,d26613vst1.32 {d29},[r10,:64] @ put aside smashed m[8*i+7]614add r10,sp,#8 @ rewind615sub r8,r5,#8616b .LNEON_8n_inner617618.align 4619.LNEON_8n_inner:620subs r8,r8,#8621vmlal.u32 q6,d28,d0[0]622vld1.64 {q13},[r6,:128]623vmlal.u32 q7,d28,d0[1]624vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+0]625vmlal.u32 q8,d28,d1[0]626vld1.32 {d4,d5,d6,d7},[r3]!627vmlal.u32 q9,d28,d1[1]628it ne629addne r6,r6,#16 @ don't advance in last iteration630vmlal.u32 q10,d28,d2[0]631vmlal.u32 q11,d28,d2[1]632vmlal.u32 q12,d28,d3[0]633vmlal.u32 q13,d28,d3[1]634vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+1]635vmlal.u32 q6,d29,d4[0]636vmlal.u32 q7,d29,d4[1]637vmlal.u32 q8,d29,d5[0]638vmlal.u32 q9,d29,d5[1]639vmlal.u32 q10,d29,d6[0]640vmlal.u32 q11,d29,d6[1]641vmlal.u32 q12,d29,d7[0]642vmlal.u32 q13,d29,d7[1]643vst1.64 {q6},[r7,:128]!644vmlal.u32 q7,d28,d0[0]645vld1.64 {q6},[r6,:128]646vmlal.u32 q8,d28,d0[1]647vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+1]648vmlal.u32 q9,d28,d1[0]649it ne650addne r6,r6,#16 @ don't advance in last iteration651vmlal.u32 q10,d28,d1[1]652vmlal.u32 q11,d28,d2[0]653vmlal.u32 q12,d28,d2[1]654vmlal.u32 q13,d28,d3[0]655vmlal.u32 q6,d28,d3[1]656vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+2]657vmlal.u32 q7,d29,d4[0]658vmlal.u32 q8,d29,d4[1]659vmlal.u32 q9,d29,d5[0]660vmlal.u32 q10,d29,d5[1]661vmlal.u32 q11,d29,d6[0]662vmlal.u32 q12,d29,d6[1]663vmlal.u32 q13,d29,d7[0]664vmlal.u32 q6,d29,d7[1]665vst1.64 {q7},[r7,:128]!666vmlal.u32 q8,d28,d0[0]667vld1.64 {q7},[r6,:128]668vmlal.u32 q9,d28,d0[1]669vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+2]670vmlal.u32 q10,d28,d1[0]671it ne672addne r6,r6,#16 @ don't advance in last iteration673vmlal.u32 q11,d28,d1[1]674vmlal.u32 q12,d28,d2[0]675vmlal.u32 q13,d28,d2[1]676vmlal.u32 q6,d28,d3[0]677vmlal.u32 q7,d28,d3[1]678vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+3]679vmlal.u32 q8,d29,d4[0]680vmlal.u32 q9,d29,d4[1]681vmlal.u32 q10,d29,d5[0]682vmlal.u32 q11,d29,d5[1]683vmlal.u32 q12,d29,d6[0]684vmlal.u32 q13,d29,d6[1]685vmlal.u32 q6,d29,d7[0]686vmlal.u32 q7,d29,d7[1]687vst1.64 {q8},[r7,:128]!688vmlal.u32 q9,d28,d0[0]689vld1.64 {q8},[r6,:128]690vmlal.u32 q10,d28,d0[1]691vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+3]692vmlal.u32 q11,d28,d1[0]693it ne694addne r6,r6,#16 @ don't advance in last iteration695vmlal.u32 q12,d28,d1[1]696vmlal.u32 q13,d28,d2[0]697vmlal.u32 q6,d28,d2[1]698vmlal.u32 q7,d28,d3[0]699vmlal.u32 q8,d28,d3[1]700vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+4]701vmlal.u32 q9,d29,d4[0]702vmlal.u32 q10,d29,d4[1]703vmlal.u32 q11,d29,d5[0]704vmlal.u32 q12,d29,d5[1]705vmlal.u32 q13,d29,d6[0]706vmlal.u32 q6,d29,d6[1]707vmlal.u32 q7,d29,d7[0]708vmlal.u32 q8,d29,d7[1]709vst1.64 {q9},[r7,:128]!710vmlal.u32 q10,d28,d0[0]711vld1.64 {q9},[r6,:128]712vmlal.u32 q11,d28,d0[1]713vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+4]714vmlal.u32 q12,d28,d1[0]715it ne716addne r6,r6,#16 @ don't advance in last iteration717vmlal.u32 q13,d28,d1[1]718vmlal.u32 q6,d28,d2[0]719vmlal.u32 q7,d28,d2[1]720vmlal.u32 q8,d28,d3[0]721vmlal.u32 q9,d28,d3[1]722vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+5]723vmlal.u32 q10,d29,d4[0]724vmlal.u32 q11,d29,d4[1]725vmlal.u32 q12,d29,d5[0]726vmlal.u32 q13,d29,d5[1]727vmlal.u32 q6,d29,d6[0]728vmlal.u32 q7,d29,d6[1]729vmlal.u32 q8,d29,d7[0]730vmlal.u32 q9,d29,d7[1]731vst1.64 {q10},[r7,:128]!732vmlal.u32 q11,d28,d0[0]733vld1.64 {q10},[r6,:128]734vmlal.u32 q12,d28,d0[1]735vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+5]736vmlal.u32 q13,d28,d1[0]737it ne738addne r6,r6,#16 @ don't advance in last iteration739vmlal.u32 q6,d28,d1[1]740vmlal.u32 q7,d28,d2[0]741vmlal.u32 q8,d28,d2[1]742vmlal.u32 q9,d28,d3[0]743vmlal.u32 q10,d28,d3[1]744vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+6]745vmlal.u32 q11,d29,d4[0]746vmlal.u32 q12,d29,d4[1]747vmlal.u32 q13,d29,d5[0]748vmlal.u32 q6,d29,d5[1]749vmlal.u32 q7,d29,d6[0]750vmlal.u32 q8,d29,d6[1]751vmlal.u32 q9,d29,d7[0]752vmlal.u32 q10,d29,d7[1]753vst1.64 {q11},[r7,:128]!754vmlal.u32 q12,d28,d0[0]755vld1.64 {q11},[r6,:128]756vmlal.u32 q13,d28,d0[1]757vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+6]758vmlal.u32 q6,d28,d1[0]759it ne760addne r6,r6,#16 @ don't advance in last iteration761vmlal.u32 q7,d28,d1[1]762vmlal.u32 q8,d28,d2[0]763vmlal.u32 q9,d28,d2[1]764vmlal.u32 q10,d28,d3[0]765vmlal.u32 q11,d28,d3[1]766vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+7]767vmlal.u32 q12,d29,d4[0]768vmlal.u32 q13,d29,d4[1]769vmlal.u32 q6,d29,d5[0]770vmlal.u32 q7,d29,d5[1]771vmlal.u32 q8,d29,d6[0]772vmlal.u32 q9,d29,d6[1]773vmlal.u32 q10,d29,d7[0]774vmlal.u32 q11,d29,d7[1]775vst1.64 {q12},[r7,:128]!776vmlal.u32 q13,d28,d0[0]777vld1.64 {q12},[r6,:128]778vmlal.u32 q6,d28,d0[1]779vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+7]780vmlal.u32 q7,d28,d1[0]781it ne782addne r6,r6,#16 @ don't advance in last iteration783vmlal.u32 q8,d28,d1[1]784vmlal.u32 q9,d28,d2[0]785vmlal.u32 q10,d28,d2[1]786vmlal.u32 q11,d28,d3[0]787vmlal.u32 q12,d28,d3[1]788it eq789subeq r1,r1,r5,lsl#2 @ rewind790vmlal.u32 q13,d29,d4[0]791vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0]792vmlal.u32 q6,d29,d4[1]793vld1.32 {d0,d1,d2,d3},[r1]!794vmlal.u32 q7,d29,d5[0]795add r10,sp,#8 @ rewind796vmlal.u32 q8,d29,d5[1]797vmlal.u32 q9,d29,d6[0]798vmlal.u32 q10,d29,d6[1]799vmlal.u32 q11,d29,d7[0]800vst1.64 {q13},[r7,:128]!801vmlal.u32 q12,d29,d7[1]802803bne .LNEON_8n_inner804add r6,sp,#128805vst1.64 {q6,q7},[r7,:256]!806veor q2,q2,q2 @ d4-d5807vst1.64 {q8,q9},[r7,:256]!808veor q3,q3,q3 @ d6-d7809vst1.64 {q10,q11},[r7,:256]!810vst1.64 {q12},[r7,:128]811812subs r9,r9,#8813vld1.64 {q6,q7},[r6,:256]!814vld1.64 {q8,q9},[r6,:256]!815vld1.64 {q10,q11},[r6,:256]!816vld1.64 {q12,q13},[r6,:256]!817818itt ne819subne r3,r3,r5,lsl#2 @ rewind820bne .LNEON_8n_outer821822add r7,sp,#128823vst1.64 {q2,q3}, [sp,:256]! @ start wiping stack frame824vshr.u64 d10,d12,#16825vst1.64 {q2,q3},[sp,:256]!826vadd.u64 d13,d13,d10827vst1.64 {q2,q3}, [sp,:256]!828vshr.u64 d10,d13,#16829vst1.64 {q2,q3}, [sp,:256]!830vzip.16 d12,d13831832mov r8,r5833b .LNEON_tail_entry834835.align 4836.LNEON_tail:837vadd.u64 d12,d12,d10838vshr.u64 d10,d12,#16839vld1.64 {q8,q9}, [r6, :256]!840vadd.u64 d13,d13,d10841vld1.64 {q10,q11}, [r6, :256]!842vshr.u64 d10,d13,#16843vld1.64 {q12,q13}, [r6, :256]!844vzip.16 d12,d13845846.LNEON_tail_entry:847vadd.u64 d14,d14,d10848vst1.32 {d12[0]}, [r7, :32]!849vshr.u64 d10,d14,#16850vadd.u64 d15,d15,d10851vshr.u64 d10,d15,#16852vzip.16 d14,d15853vadd.u64 d16,d16,d10854vst1.32 {d14[0]}, [r7, :32]!855vshr.u64 d10,d16,#16856vadd.u64 d17,d17,d10857vshr.u64 d10,d17,#16858vzip.16 d16,d17859vadd.u64 d18,d18,d10860vst1.32 {d16[0]}, [r7, :32]!861vshr.u64 d10,d18,#16862vadd.u64 d19,d19,d10863vshr.u64 d10,d19,#16864vzip.16 d18,d19865vadd.u64 d20,d20,d10866vst1.32 {d18[0]}, [r7, :32]!867vshr.u64 d10,d20,#16868vadd.u64 d21,d21,d10869vshr.u64 d10,d21,#16870vzip.16 d20,d21871vadd.u64 d22,d22,d10872vst1.32 {d20[0]}, [r7, :32]!873vshr.u64 d10,d22,#16874vadd.u64 d23,d23,d10875vshr.u64 d10,d23,#16876vzip.16 d22,d23877vadd.u64 d24,d24,d10878vst1.32 {d22[0]}, [r7, :32]!879vshr.u64 d10,d24,#16880vadd.u64 d25,d25,d10881vshr.u64 d10,d25,#16882vzip.16 d24,d25883vadd.u64 d26,d26,d10884vst1.32 {d24[0]}, [r7, :32]!885vshr.u64 d10,d26,#16886vadd.u64 d27,d27,d10887vshr.u64 d10,d27,#16888vzip.16 d26,d27889vld1.64 {q6,q7}, [r6, :256]!890subs r8,r8,#8891vst1.32 {d26[0]}, [r7, :32]!892bne .LNEON_tail893894vst1.32 {d10[0]}, [r7, :32] @ top-most bit895sub r3,r3,r5,lsl#2 @ rewind r3896subs r1,sp,#0 @ clear carry flag897add r2,sp,r5,lsl#2898899.LNEON_sub:900ldmia r1!, {r4,r5,r6,r7}901ldmia r3!, {r8,r9,r10,r11}902sbcs r8, r4,r8903sbcs r9, r5,r9904sbcs r10,r6,r10905sbcs r11,r7,r11906teq r1,r2 @ preserves carry907stmia r0!, {r8,r9,r10,r11}908bne .LNEON_sub909910ldr r10, [r1] @ load top-most bit911mov r11,sp912veor q0,q0,q0913sub r11,r2,r11 @ this is num*4914veor q1,q1,q1915mov r1,sp916sub r0,r0,r11 @ rewind r0917mov r3,r2 @ second 3/4th of frame918sbcs r10,r10,#0 @ result is carry flag919920.LNEON_copy_n_zap:921ldmia r1!, {r4,r5,r6,r7}922ldmia r0, {r8,r9,r10,r11}923it cc924movcc r8, r4925vst1.64 {q0,q1}, [r3,:256]! @ wipe926itt cc927movcc r9, r5928movcc r10,r6929vst1.64 {q0,q1}, [r3,:256]! @ wipe930it cc931movcc r11,r7932ldmia r1, {r4,r5,r6,r7}933stmia r0!, {r8,r9,r10,r11}934sub r1,r1,#16935ldmia r0, {r8,r9,r10,r11}936it cc937movcc r8, r4938vst1.64 {q0,q1}, [r1,:256]! @ wipe939itt cc940movcc r9, r5941movcc r10,r6942vst1.64 {q0,q1}, [r3,:256]! @ wipe943it cc944movcc r11,r7945teq r1,r2 @ preserves carry946stmia r0!, {r8,r9,r10,r11}947bne .LNEON_copy_n_zap948949mov sp,ip950vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15}951ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11}952bx lr @ bx lr953.size bn_mul8x_mont_neon,.-bn_mul8x_mont_neon954#endif955.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,0956.align 2957.align 2958#if __ARM_MAX_ARCH__>=7959960.hidden OPENSSL_armcap_P961#endif962963964