| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455 |
- #define DEC_5 4
- #define DEC_6 5
- #define DEC_7 6
- #define DEC_8 7
- #define DEC(N) uECC_CONCAT(DEC_, N)
- #define REPEAT_1(stuff) stuff
- #define REPEAT_2(stuff) REPEAT_1(stuff) stuff
- #define REPEAT_3(stuff) REPEAT_2(stuff) stuff
- #define REPEAT_4(stuff) REPEAT_3(stuff) stuff
- #define REPEAT_5(stuff) REPEAT_4(stuff) stuff
- #define REPEAT_6(stuff) REPEAT_5(stuff) stuff
- #define REPEAT_7(stuff) REPEAT_6(stuff) stuff
- #define REPEAT_8(stuff) REPEAT_7(stuff) stuff
- #define REPEAT(N, stuff) uECC_CONCAT(REPEAT_, N)(stuff)
- #define STR2(thing) #thing
- #define STR(thing) STR2(thing)
- #if (uECC_ASM == uECC_asm_fast)
- static uint32_t vli_add(uint32_t *result, const uint32_t *left, const uint32_t *right) {
- uint32_t carry = 0;
- uint32_t left_word;
- uint32_t right_word;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "ldmia %[lptr]!, {%[left]} \n\t" /* Load left word. */
- "ldmia %[rptr]!, {%[right]} \n\t" /* Load right word. */
- "adds %[left], %[right] \n\t" /* Add first word. */
- "stmia %[dptr]!, {%[left]} \n\t" /* Store result word. */
-
- /* Now we just do the remaining words with the carry bit (using ADC) */
- REPEAT(DEC(uECC_WORDS),
- "ldmia %[lptr]!, {%[left]} \n\t"
- "ldmia %[rptr]!, {%[right]} \n\t"
- "adcs %[left], %[right] \n\t"
- "stmia %[dptr]!, {%[left]} \n\t")
-
- "adcs %[carry], %[carry] \n\t" /* Store carry bit. */
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- #if (uECC_PLATFORM == uECC_arm_thumb)
- : [dptr] "+l" (result), [lptr] "+l" (left), [rptr] "+l" (right),
- [carry] "+l" (carry), [left] "=l" (left_word), [right] "=l" (right_word)
- #else
- : [dptr] "+r" (result), [lptr] "+r" (left), [rptr] "+r" (right),
- [carry] "+r" (carry), [left] "=r" (left_word), [right] "=r" (right_word)
- #endif
- :
- : "cc", "memory"
- );
- return carry;
- }
- #define asm_add 1
- static uint32_t vli_sub(uint32_t *result, const uint32_t *left, const uint32_t *right) {
- uint32_t carry = 0;
- uint32_t left_word;
- uint32_t right_word;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "ldmia %[lptr]!, {%[left]} \n\t" /* Load left word. */
- "ldmia %[rptr]!, {%[right]} \n\t" /* Load right word. */
- "subs %[left], %[right] \n\t" /* Subtract. */
- "stmia %[dptr]!, {%[left]} \n\t" /* Store result word. */
-
- /* Now we just do the remaining words with the carry bit (using SBC) */
- REPEAT(DEC(uECC_WORDS),
- "ldmia %[lptr]!, {%[left]} \n\t"
- "ldmia %[rptr]!, {%[right]} \n\t"
- "sbcs %[left], %[right] \n\t"
- "stmia %[dptr]!, {%[left]} \n\t")
-
- "adcs %[carry], %[carry] \n\t" /* Store carry bit. */
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- #if (uECC_PLATFORM == uECC_arm_thumb)
- : [dptr] "+l" (result), [lptr] "+l" (left), [rptr] "+l" (right),
- [carry] "+l" (carry), [left] "=l" (left_word), [right] "=l" (right_word)
- #else
- : [dptr] "+r" (result), [lptr] "+r" (left), [rptr] "+r" (right),
- [carry] "+r" (carry), [left] "=r" (left_word), [right] "=r" (right_word)
- #endif
- :
- : "cc", "memory"
- );
- return !carry; // note that on ARM, carry flag set means "no borrow" when subtracting
- // (for some reason...)
- }
- #define asm_sub 1
- #if (uECC_PLATFORM != uECC_arm_thumb)
- #if (uECC_WORDS == 5)
- static void vli_mult(uint32_t *result, const uint32_t *left, const uint32_t *right) {
- register uint32_t *r0 __asm__("r0") = result;
- register const uint32_t *r1 __asm__("r1") = left;
- register const uint32_t *r2 __asm__("r2") = right;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "add r0, 12 \n\t"
- "add r2, 12 \n\t"
- "ldmia r1!, {r3,r4} \n\t"
- "ldmia r2!, {r6,r7} \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r9, r3, r7 \n\t"
- "adds r12, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r11, r14, r4, r6 \n\t"
- "adds r12, r11 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "umull r12, r14, r4, r7 \n\t"
- "adds r9, r12 \n\t"
- "adc r10, r14 \n\t"
- "stmia r0!, {r9, r10} \n\t"
- "sub r0, 28 \n\t"
- "sub r2, 20 \n\t"
- "ldmia r2!, {r6,r7,r8} \n\t"
- "ldmia r1!, {r5} \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r9, r3, r7 \n\t"
- "adds r12, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r11, r14, r4, r6 \n\t"
- "adds r12, r11 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r3, r8 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r4, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r5, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "ldmia r1!, {r3} \n\t"
- "mov r12, #0 \n\t"
- "umull r14, r9, r4, r8 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r5, r7 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r3, r6 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, #0 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "ldmia r1!, {r4} \n\t"
- "mov r14, #0 \n\t"
- "umull r9, r10, r5, r8 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r3, r7 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r4, r6 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "ldr r9, [r0] \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, #0 \n\t"
- "adc r14, #0 \n\t"
- "stmia r0!, {r11} \n\t"
- "ldmia r2!, {r6} \n\t"
- "mov r9, #0 \n\t"
- "umull r10, r11, r5, r6 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r3, r8 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r4, r7 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "ldr r10, [r0] \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, #0 \n\t"
- "adc r9, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "ldmia r2!, {r7} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r12, r5, r7 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r4, r8 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "ldr r11, [r0] \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, #0 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r14} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r3, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r4, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "umull r14, r9, r4, r7 \n\t"
- "adds r10, r14 \n\t"
- "adc r11, r9 \n\t"
- "stmia r0!, {r10, r11} \n\t"
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- : "+r" (r0), "+r" (r1), "+r" (r2)
- :
- : "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14", "cc", "memory"
- );
- }
- #define asm_mult 1
- #endif /* (uECC_WORDS == 5) */
- #if (uECC_WORDS == 6)
- static void vli_mult(uint32_t *result, const uint32_t *left, const uint32_t *right) {
- register uint32_t *r0 __asm__("r0") = result;
- register const uint32_t *r1 __asm__("r1") = left;
- register const uint32_t *r2 __asm__("r2") = right;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "add r0, 12 \n\t"
- "add r2, 12 \n\t"
- "ldmia r1!, {r3,r4,r5} \n\t"
- "ldmia r2!, {r6,r7,r8} \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r9, r3, r7 \n\t"
- "adds r12, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r11, r14, r4, r6 \n\t"
- "adds r12, r11 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r3, r8 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r4, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r5, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "mov r12, #0 \n\t"
- "umull r14, r9, r4, r8 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r5, r7 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "umull r9, r10, r5, r8 \n\t"
- "adds r11, r9 \n\t"
- "adc r12, r10 \n\t"
- "stmia r0!, {r11, r12} \n\t"
- "sub r0, 36 \n\t"
- "sub r2, 24 \n\t"
- "ldmia r2!, {r6,r7,r8} \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r9, r3, r7 \n\t"
- "adds r12, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r11, r14, r4, r6 \n\t"
- "adds r12, r11 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r3, r8 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r4, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r5, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "ldmia r1!, {r3} \n\t"
- "mov r12, #0 \n\t"
- "umull r14, r9, r4, r8 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r5, r7 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r3, r6 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, #0 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "ldmia r1!, {r4} \n\t"
- "mov r14, #0 \n\t"
- "umull r9, r10, r5, r8 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r3, r7 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r4, r6 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "ldr r9, [r0] \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, #0 \n\t"
- "adc r14, #0 \n\t"
- "stmia r0!, {r11} \n\t"
- "ldmia r1!, {r5} \n\t"
- "mov r9, #0 \n\t"
- "umull r10, r11, r3, r8 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r4, r7 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r5, r6 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "ldr r10, [r0] \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, #0 \n\t"
- "adc r9, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "ldmia r2!, {r6} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r4, r8 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r5, r7 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "ldr r11, [r0] \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, #0 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r14} \n\t"
- "ldmia r2!, {r7} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r3, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r4, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r5, r8 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "ldr r12, [r0] \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, #0 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "ldmia r2!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r14, r9, r3, r8 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r4, r7 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r5, r6 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, #0 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "mov r14, #0 \n\t"
- "umull r9, r10, r4, r8 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r5, r7 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "stmia r0!, {r11} \n\t"
- "umull r10, r11, r5, r8 \n\t"
- "adds r12, r10 \n\t"
- "adc r14, r11 \n\t"
- "stmia r0!, {r12, r14} \n\t"
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- : "+r" (r0), "+r" (r1), "+r" (r2)
- :
- : "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14", "cc", "memory"
- );
- }
- #define asm_mult 1
- #endif /* (uECC_WORDS == 6) */
- #if (uECC_WORDS == 7)
- static void vli_mult(uint32_t *result, const uint32_t *left, const uint32_t *right) {
- register uint32_t *r0 __asm__("r0") = result;
- register const uint32_t *r1 __asm__("r1") = left;
- register const uint32_t *r2 __asm__("r2") = right;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "add r0, 24 \n\t"
- "add r2, 24 \n\t"
- "ldmia r1!, {r3} \n\t"
- "ldmia r2!, {r6} \n\t"
- "umull r9, r10, r3, r6 \n\t"
- "stmia r0!, {r9, r10} \n\t"
- "sub r0, 20 \n\t"
- "sub r2, 16 \n\t"
- "ldmia r2!, {r6, r7, r8} \n\t"
- "ldmia r1!, {r4, r5} \n\t"
- "umull r9, r10, r3, r6 \n\t"
- "stmia r0!, {r9} \n\t"
- "mov r14, #0 \n\t"
- "umull r9, r12, r3, r7 \n\t"
- "adds r10, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r9, r11, r4, r6 \n\t"
- "adds r10, r9 \n\t"
- "adcs r12, r11 \n\t"
- "adc r14, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "mov r9, #0 \n\t"
- "umull r10, r11, r3, r8 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r4, r7 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r5, r6 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "ldmia r1!, {r3} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r12, r4, r8 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r5, r7 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "ldr r11, [r0] \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, #0 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r14} \n\t"
- "ldmia r2!, {r6} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r4, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r5, r8 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r3, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "ldr r12, [r0] \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, #0 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "mov r12, #0 \n\t"
- "umull r14, r9, r5, r6 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r3, r8 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "umull r9, r10, r3, r6 \n\t"
- "adds r11, r9 \n\t"
- "adc r12, r10 \n\t"
- "stmia r0!, {r11, r12} \n\t"
- "sub r0, 44 \n\t"
- "sub r1, 16 \n\t"
- "sub r2, 28 \n\t"
- "ldmia r1!, {r3,r4,r5} \n\t"
- "ldmia r2!, {r6,r7,r8} \n\t"
- "umull r9, r10, r3, r6 \n\t"
- "stmia r0!, {r9} \n\t"
- "mov r14, #0 \n\t"
- "umull r9, r12, r3, r7 \n\t"
- "adds r10, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r9, r11, r4, r6 \n\t"
- "adds r10, r9 \n\t"
- "adcs r12, r11 \n\t"
- "adc r14, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "mov r9, #0 \n\t"
- "umull r10, r11, r3, r8 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r4, r7 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r5, r6 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "ldmia r1!, {r3} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r12, r4, r8 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r5, r7 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "ldr r11, [r0] \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, #0 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r14} \n\t"
- "ldmia r1!, {r4} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r5, r8 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r3, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r4, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "ldr r12, [r0] \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, #0 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "ldmia r1!, {r5} \n\t"
- "mov r12, #0 \n\t"
- "umull r14, r9, r3, r8 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r4, r7 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r5, r6 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, #0 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "ldmia r1!, {r3} \n\t"
- "mov r14, #0 \n\t"
- "umull r9, r10, r4, r8 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r5, r7 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r3, r6 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "ldr r9, [r0] \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, #0 \n\t"
- "adc r14, #0 \n\t"
- "stmia r0!, {r11} \n\t"
- "ldmia r2!, {r6} \n\t"
- "mov r9, #0 \n\t"
- "umull r10, r11, r4, r6 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r5, r8 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r3, r7 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "ldr r10, [r0] \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, #0 \n\t"
- "adc r9, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "ldmia r2!, {r7} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r12, r4, r7 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r5, r6 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r3, r8 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "ldr r11, [r0] \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, #0 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r14} \n\t"
- "ldmia r2!, {r8} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r4, r8 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r5, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r3, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "ldr r12, [r0] \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, #0 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "ldmia r2!, {r6} \n\t"
- "mov r12, #0 \n\t"
- "umull r14, r9, r4, r6 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r5, r8 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r3, r7 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, #0 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "mov r14, #0 \n\t"
- "umull r9, r10, r5, r6 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r3, r8 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "stmia r0!, {r11} \n\t"
- "umull r10, r11, r3, r6 \n\t"
- "adds r12, r10 \n\t"
- "adc r14, r11 \n\t"
- "stmia r0!, {r12, r14} \n\t"
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- : "+r" (r0), "+r" (r1), "+r" (r2)
- :
- : "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14", "cc", "memory"
- );
- }
- #define asm_mult 1
- #endif /* (uECC_WORDS == 7) */
- #if (uECC_WORDS == 8)
- static void vli_mult(uint32_t *result, const uint32_t *left, const uint32_t *right) {
- register uint32_t *r0 __asm__("r0") = result;
- register const uint32_t *r1 __asm__("r1") = left;
- register const uint32_t *r2 __asm__("r2") = right;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "add r0, 24 \n\t"
- "add r2, 24 \n\t"
- "ldmia r1!, {r3,r4} \n\t"
- "ldmia r2!, {r6,r7} \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r9, r3, r7 \n\t"
- "adds r12, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r11, r14, r4, r6 \n\t"
- "adds r12, r11 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "umull r12, r14, r4, r7 \n\t"
- "adds r9, r12 \n\t"
- "adc r10, r14 \n\t"
- "stmia r0!, {r9, r10} \n\t"
- "sub r0, 28 \n\t"
- "sub r2, 20 \n\t"
- "ldmia r2!, {r6,r7,r8} \n\t"
- "ldmia r1!, {r5} \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r9, r3, r7 \n\t"
- "adds r12, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r11, r14, r4, r6 \n\t"
- "adds r12, r11 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r3, r8 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r4, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r5, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "ldmia r1!, {r3} \n\t"
- "mov r12, #0 \n\t"
- "umull r14, r9, r4, r8 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r5, r7 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r3, r6 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, #0 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "ldmia r1!, {r4} \n\t"
- "mov r14, #0 \n\t"
- "umull r9, r10, r5, r8 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r3, r7 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r4, r6 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "ldr r9, [r0] \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, #0 \n\t"
- "adc r14, #0 \n\t"
- "stmia r0!, {r11} \n\t"
- "ldmia r2!, {r6} \n\t"
- "mov r9, #0 \n\t"
- "umull r10, r11, r5, r6 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r3, r8 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r4, r7 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "ldr r10, [r0] \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, #0 \n\t"
- "adc r9, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "ldmia r2!, {r7} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r12, r5, r7 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r4, r8 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "ldr r11, [r0] \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, #0 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r14} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r3, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r4, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "umull r14, r9, r4, r7 \n\t"
- "adds r10, r14 \n\t"
- "adc r11, r9 \n\t"
- "stmia r0!, {r10, r11} \n\t"
- "sub r0, 52 \n\t"
- "sub r1, 20 \n\t"
- "sub r2, 32 \n\t"
- "ldmia r1!, {r3,r4,r5} \n\t"
- "ldmia r2!, {r6,r7,r8} \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r9, r3, r7 \n\t"
- "adds r12, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r11, r14, r4, r6 \n\t"
- "adds r12, r11 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r3, r8 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r4, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r5, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "ldmia r1!, {r3} \n\t"
- "mov r12, #0 \n\t"
- "umull r14, r9, r4, r8 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r5, r7 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r3, r6 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, #0 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "ldmia r1!, {r4} \n\t"
- "mov r14, #0 \n\t"
- "umull r9, r10, r5, r8 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r3, r7 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r4, r6 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "ldr r9, [r0] \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, #0 \n\t"
- "adc r14, #0 \n\t"
- "stmia r0!, {r11} \n\t"
- "ldmia r1!, {r5} \n\t"
- "mov r9, #0 \n\t"
- "umull r10, r11, r3, r8 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r4, r7 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r5, r6 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "ldr r10, [r0] \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, #0 \n\t"
- "adc r9, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "ldmia r1!, {r3} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r12, r4, r8 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r5, r7 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r3, r6 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "ldr r11, [r0] \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, #0 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r14} \n\t"
- "ldmia r1!, {r4} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r5, r8 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r3, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r4, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "ldr r12, [r0] \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, #0 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "ldmia r2!, {r6} \n\t"
- "mov r12, #0 \n\t"
- "umull r14, r9, r5, r6 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r3, r8 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r4, r7 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, #0 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "ldmia r2!, {r7} \n\t"
- "mov r14, #0 \n\t"
- "umull r9, r10, r5, r7 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r3, r6 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "umull r9, r10, r4, r8 \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, r10 \n\t"
- "adc r14, #0 \n\t"
- "ldr r9, [r0] \n\t"
- "adds r11, r9 \n\t"
- "adcs r12, #0 \n\t"
- "adc r14, #0 \n\t"
- "stmia r0!, {r11} \n\t"
- "ldmia r2!, {r8} \n\t"
- "mov r9, #0 \n\t"
- "umull r10, r11, r5, r8 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r3, r7 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "umull r10, r11, r4, r6 \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, r11 \n\t"
- "adc r9, #0 \n\t"
- "ldr r10, [r0] \n\t"
- "adds r12, r10 \n\t"
- "adcs r14, #0 \n\t"
- "adc r9, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "ldmia r2!, {r6} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r12, r5, r6 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r3, r8 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r4, r7 \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "ldr r11, [r0] \n\t"
- "adds r14, r11 \n\t"
- "adcs r9, #0 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r14} \n\t"
- "ldmia r2!, {r7} \n\t"
- "mov r11, #0 \n\t"
- "umull r12, r14, r5, r7 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r3, r6 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "umull r12, r14, r4, r8 \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, r14 \n\t"
- "adc r11, #0 \n\t"
- "ldr r12, [r0] \n\t"
- "adds r9, r12 \n\t"
- "adcs r10, #0 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "mov r12, #0 \n\t"
- "umull r14, r9, r3, r7 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "umull r14, r9, r4, r6 \n\t"
- "adds r10, r14 \n\t"
- "adcs r11, r9 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r10} \n\t"
- "umull r9, r10, r4, r7 \n\t"
- "adds r11, r9 \n\t"
- "adc r12, r10 \n\t"
- "stmia r0!, {r11, r12} \n\t"
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- : "+r" (r0), "+r" (r1), "+r" (r2)
- :
- : "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14", "cc", "memory"
- );
- }
- #define asm_mult 1
- #endif /* (uECC_WORDS == 8) */
- #if uECC_SQUARE_FUNC
- #if (uECC_WORDS == 5)
- static void vli_square(uint32_t *result, const uint32_t *left) {
- register uint32_t *r0 __asm__("r0") = result;
- register const uint32_t *r1 __asm__("r1") = left;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "ldmia r1!, {r2,r3,r4,r5,r6} \n\t"
- "umull r11, r12, r2, r2 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r9, #0 \n\t"
- "umull r10, r11, r2, r3 \n\t"
- "adds r12, r10 \n\t"
- "adcs r8, r11, #0 \n\t"
- "adc r9, #0 \n\t"
- "adds r12, r10 \n\t"
- "adcs r8, r11 \n\t"
- "adc r9, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r12, r2, r4 \n\t"
- "adds r11, r11 \n\t"
- "adcs r12, r12 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r3, r3 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r2, r5 \n\t"
- "umull r1, r14, r3, r4 \n\t"
- "adds r8, r1 \n\t"
- "adcs r11, r14 \n\t"
- "adc r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r10, #0 \n\t"
- "umull r8, r9, r2, r6 \n\t"
- "umull r1, r14, r3, r5 \n\t"
- "adds r8, r1 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r9, r9 \n\t"
- "adc r10, r10 \n\t"
- "umull r1, r14, r4, r4 \n\t"
- "adds r8, r1 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r3, r6 \n\t"
- "umull r1, r14, r4, r5 \n\t"
- "adds r8, r1 \n\t"
- "adcs r11, r14 \n\t"
- "adc r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r8, #0 \n\t"
- "umull r1, r10, r4, r6 \n\t"
- "adds r1, r1 \n\t"
- "adcs r10, r10 \n\t"
- "adc r8, #0 \n\t"
- "adds r11, r1 \n\t"
- "adcs r12, r10 \n\t"
- "adc r8, #0 \n\t"
- "umull r1, r10, r5, r5 \n\t"
- "adds r11, r1 \n\t"
- "adcs r12, r10 \n\t"
- "adc r8, #0 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r11, #0 \n\t"
- "umull r1, r10, r5, r6 \n\t"
- "adds r1, r1 \n\t"
- "adcs r10, r10 \n\t"
- "adc r11, #0 \n\t"
- "adds r12, r1 \n\t"
- "adcs r8, r10 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "umull r1, r10, r6, r6 \n\t"
- "adds r8, r1 \n\t"
- "adcs r11, r10 \n\t"
- "stmia r0!, {r8, r11} \n\t"
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- : "+r" (r0), "+r" (r1)
- :
- : "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14", "cc", "memory"
- );
- }
- #define asm_square 1
- #endif /* (uECC_WORDS == 5) */
- #if (uECC_WORDS == 6)
- static void vli_square(uint32_t *result, const uint32_t *left) {
- register uint32_t *r0 __asm__("r0") = result;
- register const uint32_t *r1 __asm__("r1") = left;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "ldmia r1!, {r2,r3,r4,r5,r6,r7} \n\t"
- "umull r11, r12, r2, r2 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r9, #0 \n\t"
- "umull r10, r11, r2, r3 \n\t"
- "adds r12, r10 \n\t"
- "adcs r8, r11, #0 \n\t"
- "adc r9, #0 \n\t"
- "adds r12, r10 \n\t"
- "adcs r8, r11 \n\t"
- "adc r9, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r12, r2, r4 \n\t"
- "adds r11, r11 \n\t"
- "adcs r12, r12 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r3, r3 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r2, r5 \n\t"
- "umull r1, r14, r3, r4 \n\t"
- "adds r8, r1 \n\t"
- "adcs r11, r14 \n\t"
- "adc r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r10, #0 \n\t"
- "umull r8, r9, r2, r6 \n\t"
- "umull r1, r14, r3, r5 \n\t"
- "adds r8, r1 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r9, r9 \n\t"
- "adc r10, r10 \n\t"
- "umull r1, r14, r4, r4 \n\t"
- "adds r8, r1 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r2, r7 \n\t"
- "umull r1, r14, r3, r6 \n\t"
- "adds r8, r1 \n\t"
- "adcs r11, r14 \n\t"
- "adc r12, #0 \n\t"
- "umull r1, r14, r4, r5 \n\t"
- "adds r8, r1 \n\t"
- "adcs r11, r14 \n\t"
- "adc r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r10, #0 \n\t"
- "umull r8, r9, r3, r7 \n\t"
- "umull r1, r14, r4, r6 \n\t"
- "adds r8, r1 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r9, r9 \n\t"
- "adc r10, r10 \n\t"
- "umull r1, r14, r5, r5 \n\t"
- "adds r8, r1 \n\t"
- "adcs r9, r14 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r4, r7 \n\t"
- "umull r1, r14, r5, r6 \n\t"
- "adds r8, r1 \n\t"
- "adcs r11, r14 \n\t"
- "adc r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r8, #0 \n\t"
- "umull r1, r10, r5, r7 \n\t"
- "adds r1, r1 \n\t"
- "adcs r10, r10 \n\t"
- "adc r8, #0 \n\t"
- "adds r11, r1 \n\t"
- "adcs r12, r10 \n\t"
- "adc r8, #0 \n\t"
- "umull r1, r10, r6, r6 \n\t"
- "adds r11, r1 \n\t"
- "adcs r12, r10 \n\t"
- "adc r8, #0 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r11, #0 \n\t"
- "umull r1, r10, r6, r7 \n\t"
- "adds r1, r1 \n\t"
- "adcs r10, r10 \n\t"
- "adc r11, #0 \n\t"
- "adds r12, r1 \n\t"
- "adcs r8, r10 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "umull r1, r10, r7, r7 \n\t"
- "adds r8, r1 \n\t"
- "adcs r11, r10 \n\t"
- "stmia r0!, {r8, r11} \n\t"
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- : "+r" (r0), "+r" (r1)
- :
- : "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14", "cc", "memory"
- );
- }
- #define asm_square 1
- #endif /* (uECC_WORDS == 6) */
- #if (uECC_WORDS == 7)
- static void vli_square(uint32_t *result, const uint32_t *left) {
- register uint32_t *r0 __asm__("r0") = result;
- register const uint32_t *r1 __asm__("r1") = left;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "ldmia r1!, {r2} \n\t"
- "add r1, 20 \n\t"
- "ldmia r1!, {r5} \n\t"
- "add r0, 24 \n\t"
- "umull r8, r9, r2, r5 \n\t"
- "stmia r0!, {r8, r9} \n\t"
- "sub r0, 32 \n\t"
- "sub r1, 28 \n\t"
- "ldmia r1!, {r2, r3, r4, r5, r6, r7} \n\t"
- "umull r11, r12, r2, r2 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r9, #0 \n\t"
- "umull r10, r11, r2, r3 \n\t"
- "adds r12, r10 \n\t"
- "adcs r8, r11, #0 \n\t"
- "adc r9, #0 \n\t"
- "adds r12, r10 \n\t"
- "adcs r8, r11 \n\t"
- "adc r9, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r12, r2, r4 \n\t"
- "adds r11, r11 \n\t"
- "adcs r12, r12 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r3, r3 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r2, r5 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r3, r4 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r10, #0 \n\t"
- "umull r8, r9, r2, r6 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r3, r5 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r9, r9 \n\t"
- "adc r10, r10 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r4, r4 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r2, r7 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r3, r6 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r4, r5 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "ldmia r1!, {r2} \n\t"
- "mov r10, #0 \n\t"
- "umull r8, r9, r3, r7 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r4, r6 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r8, r14 \n\t"
- "adcs r9, #0 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r9, r9 \n\t"
- "adc r10, r10 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r5, r5 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r3, r2 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r4, r7 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r5, r6 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r8, r14 \n\t"
- "adcs r11, #0 \n\t"
- "adc r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r10, #0 \n\t"
- "umull r8, r9, r4, r2 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r5, r7 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r9, r9 \n\t"
- "adc r10, r10 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r6, r6 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r5, r2 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r6, r7 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r8, #0 \n\t"
- "umull r1, r10, r6, r2 \n\t"
- "adds r1, r1 \n\t"
- "adcs r10, r10 \n\t"
- "adc r8, #0 \n\t"
- "adds r11, r1 \n\t"
- "adcs r12, r10 \n\t"
- "adc r8, #0 \n\t"
- "umull r1, r10, r7, r7 \n\t"
- "adds r11, r1 \n\t"
- "adcs r12, r10 \n\t"
- "adc r8, #0 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r11, #0 \n\t"
- "umull r1, r10, r7, r2 \n\t"
- "adds r1, r1 \n\t"
- "adcs r10, r10 \n\t"
- "adc r11, #0 \n\t"
- "adds r12, r1 \n\t"
- "adcs r8, r10 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "umull r1, r10, r2, r2 \n\t"
- "adds r8, r1 \n\t"
- "adcs r11, r10 \n\t"
- "stmia r0!, {r8, r11} \n\t"
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- : "+r" (r0), "+r" (r1)
- :
- : "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14", "cc", "memory"
- );
- }
- #define asm_square 1
- #endif /* (uECC_WORDS == 7) */
- #if (uECC_WORDS == 8)
- static void vli_square(uint32_t *result, const uint32_t *left) {
- register uint32_t *r0 __asm__("r0") = result;
- register const uint32_t *r1 __asm__("r1") = left;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "ldmia r1!, {r2, r3} \n\t"
- "add r1, 16 \n\t"
- "ldmia r1!, {r5, r6} \n\t"
- "add r0, 24 \n\t"
- "umull r8, r9, r2, r5 \n\t"
- "stmia r0!, {r8} \n\t"
- "umull r12, r10, r2, r6 \n\t"
- "adds r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r9} \n\t"
- "umull r8, r9, r3, r6 \n\t"
- "adds r10, r8 \n\t"
- "adc r11, r9, #0 \n\t"
- "stmia r0!, {r10, r11} \n\t"
- "sub r0, 40 \n\t"
- "sub r1, 32 \n\t"
- "ldmia r1!, {r2,r3,r4,r5,r6,r7} \n\t"
- "umull r11, r12, r2, r2 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r9, #0 \n\t"
- "umull r10, r11, r2, r3 \n\t"
- "adds r12, r10 \n\t"
- "adcs r8, r11, #0 \n\t"
- "adc r9, #0 \n\t"
- "adds r12, r10 \n\t"
- "adcs r8, r11 \n\t"
- "adc r9, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "mov r10, #0 \n\t"
- "umull r11, r12, r2, r4 \n\t"
- "adds r11, r11 \n\t"
- "adcs r12, r12 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "umull r11, r12, r3, r3 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r2, r5 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r3, r4 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r10, #0 \n\t"
- "umull r8, r9, r2, r6 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r3, r5 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r9, r9 \n\t"
- "adc r10, r10 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r4, r4 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r2, r7 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r3, r6 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r4, r5 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "ldmia r1!, {r2} \n\t"
- "mov r10, #0 \n\t"
- "umull r8, r9, r3, r7 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r4, r6 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r8, r14 \n\t"
- "adcs r9, #0 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r9, r9 \n\t"
- "adc r10, r10 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r5, r5 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r3, r2 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r4, r7 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r5, r6 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r8, r14 \n\t"
- "adcs r11, #0 \n\t"
- "adc r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "ldmia r1!, {r3} \n\t"
- "mov r10, #0 \n\t"
- "umull r8, r9, r4, r2 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r5, r7 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r8, r14 \n\t"
- "adcs r9, #0 \n\t"
- "adc r10, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r9, r9 \n\t"
- "adc r10, r10 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r6, r6 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r4, r3 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r5, r2 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r6, r7 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "ldr r14, [r0] \n\t"
- "adds r8, r14 \n\t"
- "adcs r11, #0 \n\t"
- "adc r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r10, #0 \n\t"
- "umull r8, r9, r5, r3 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r6, r2 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r9, r9 \n\t"
- "adc r10, r10 \n\t"
- "mov r14, r9 \n\t"
- "umlal r8, r9, r7, r7 \n\t"
- "cmp r14, r9 \n\t"
- "it hi \n\t"
- "adchi r10, #0 \n\t"
- "adds r8, r11 \n\t"
- "adcs r9, r12 \n\t"
- "adc r10, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r12, #0 \n\t"
- "umull r8, r11, r6, r3 \n\t"
- "mov r14, r11 \n\t"
- "umlal r8, r11, r7, r2 \n\t"
- "cmp r14, r11 \n\t"
- "it hi \n\t"
- "adchi r12, #0 \n\t"
- "adds r8, r8 \n\t"
- "adcs r11, r11 \n\t"
- "adc r12, r12 \n\t"
- "adds r8, r9 \n\t"
- "adcs r11, r10 \n\t"
- "adc r12, #0 \n\t"
- "stmia r0!, {r8} \n\t"
- "mov r8, #0 \n\t"
- "umull r1, r10, r7, r3 \n\t"
- "adds r1, r1 \n\t"
- "adcs r10, r10 \n\t"
- "adc r8, #0 \n\t"
- "adds r11, r1 \n\t"
- "adcs r12, r10 \n\t"
- "adc r8, #0 \n\t"
- "umull r1, r10, r2, r2 \n\t"
- "adds r11, r1 \n\t"
- "adcs r12, r10 \n\t"
- "adc r8, #0 \n\t"
- "stmia r0!, {r11} \n\t"
- "mov r11, #0 \n\t"
- "umull r1, r10, r2, r3 \n\t"
- "adds r1, r1 \n\t"
- "adcs r10, r10 \n\t"
- "adc r11, #0 \n\t"
- "adds r12, r1 \n\t"
- "adcs r8, r10 \n\t"
- "adc r11, #0 \n\t"
- "stmia r0!, {r12} \n\t"
- "umull r1, r10, r3, r3 \n\t"
- "adds r8, r1 \n\t"
- "adcs r11, r10 \n\t"
- "stmia r0!, {r8, r11} \n\t"
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- : "+r" (r0), "+r" (r1)
- :
- : "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14", "cc", "memory"
- );
- }
- #define asm_square 1
- #endif /* (uECC_WORDS == 8) */
- #endif /* uECC_SQUARE_FUNC */
- #endif /* (uECC_PLATFORM != uECC_arm_thumb) */
- #endif /* (uECC_ASM == uECC_asm_fast) */
- #if !asm_add
- static uint32_t vli_add(uint32_t *result, const uint32_t *left, const uint32_t *right) {
- uint32_t counter = uECC_WORDS;
- uint32_t carry = 0;
- uint32_t left_word;
- uint32_t right_word;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "1: \n\t"
- "ldmia %[lptr]!, {%[left]} \n\t" /* Load left word. */
- "ldmia %[rptr]!, {%[right]} \n\t" /* Load right word. */
- "lsrs %[carry], #1 \n\t" /* Set up carry flag (carry = 0 after this). */
- "adcs %[left], %[right] \n\t" /* Add with carry. */
- "adcs %[carry], %[carry] \n\t" /* Store carry bit. */
- "stmia %[dptr]!, {%[left]} \n\t" /* Store result word. */
- "subs %[ctr], #1 \n\t" /* Decrement counter. */
- "bne 1b \n\t" /* Loop until counter == 0. */
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- #if (uECC_PLATFORM == uECC_arm_thumb)
- : [dptr] "+l" (result), [lptr] "+l" (left), [rptr] "+l" (right),
- [ctr] "+l" (counter), [carry] "+l" (carry),
- [left] "=l" (left_word), [right] "=l" (right_word)
- #else
- : [dptr] "+r" (result), [lptr] "+r" (left), [rptr] "+r" (right),
- [ctr] "+r" (counter), [carry] "+r" (carry),
- [left] "=r" (left_word), [right] "=r" (right_word)
- #endif
- :
- : "cc", "memory"
- );
- return carry;
- }
- #define asm_add 1
- #endif
- #if !asm_sub
- static uint32_t vli_sub(uint32_t *result, const uint32_t *left, const uint32_t *right) {
- uint32_t counter = uECC_WORDS;
- uint32_t carry = 1; /* carry = 1 initially (means don't borrow) */
- uint32_t left_word;
- uint32_t right_word;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "1: \n\t"
- "ldmia %[lptr]!, {%[left]} \n\t" /* Load left word. */
- "ldmia %[rptr]!, {%[right]} \n\t" /* Load right word. */
- "lsrs %[carry], #1 \n\t" /* Set up carry flag (carry = 0 after this). */
- "sbcs %[left], %[right] \n\t" /* Subtract with borrow. */
- "adcs %[carry], %[carry] \n\t" /* Store carry bit. */
- "stmia %[dptr]!, {%[left]} \n\t" /* Store result word. */
- "subs %[ctr], #1 \n\t" /* Decrement counter. */
- "bne 1b \n\t" /* Loop until counter == 0. */
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- #if (uECC_PLATFORM == uECC_arm_thumb)
- : [dptr] "+l" (result), [lptr] "+l" (left), [rptr] "+l" (right),
- [ctr] "+l" (counter), [carry] "+l" (carry),
- [left] "=l" (left_word), [right] "=l" (right_word)
- #else
- : [dptr] "+r" (result), [lptr] "+r" (left), [rptr] "+r" (right),
- [ctr] "+r" (counter), [carry] "+r" (carry),
- [left] "=r" (left_word), [right] "=r" (right_word)
- #endif
- :
- : "cc", "memory"
- );
- return !carry;
- }
- #define asm_sub 1
- #endif
- #if !asm_mult
- static void vli_mult(uint32_t *result, const uint32_t *left, const uint32_t *right) {
- #if (uECC_PLATFORM != uECC_arm_thumb)
- uint32_t c0 = 0;
- uint32_t c1 = 0;
- uint32_t c2 = 0;
- uint32_t k = 0;
- uint32_t i;
- uint32_t t0, t1;
-
- __asm__ volatile (
- ".syntax unified \n\t"
-
- "1: \n\t" /* outer loop (k < uECC_WORDS) */
- "movs %[i], #0 \n\t" /* i = 0 */
- "b 3f \n\t"
-
- "2: \n\t" /* outer loop (k >= uECC_WORDS) */
- "movs %[i], %[k] \n\t" /* i = k */
- "subs %[i], %[eccdm1] \n\t" /* i = k - (uECC_WORDS - 1) (times 4) */
-
- "3: \n\t" /* inner loop */
- "subs %[t0], %[k], %[i] \n\t" /* t0 = k-i */
-
- "ldr %[t1], [%[right], %[t0]] \n\t" /* t1 = right[k - i] */
- "ldr %[t0], [%[left], %[i]] \n\t" /* t0 = left[i] */
-
- "umull %[t0], %[t1], %[t0], %[t1] \n\t" /* (t0, t1) = left[i] * right[k - i] */
-
- "adds %[c0], %[t0] \n\t" /* add low word to c0 */
- "adcs %[c1], %[t1] \n\t" /* add high word to c1, including carry */
- "adcs %[c2], #0 \n\t" /* add carry to c2 */
- "adds %[i], #4 \n\t" /* i += 4 */
- "cmp %[i], %[eccd] \n\t" /* i < uECC_WORDS (times 4)? */
- "bge 4f \n\t" /* if not, exit the loop */
- "cmp %[i], %[k] \n\t" /* i <= k? */
- "ble 3b \n\t" /* if so, continue looping */
-
- "4: \n\t" /* end inner loop */
-
- "str %[c0], [%[result], %[k]] \n\t" /* result[k] = c0 */
- "mov %[c0], %[c1] \n\t" /* c0 = c1 */
- "mov %[c1], %[c2] \n\t" /* c1 = c2 */
- "movs %[c2], #0 \n\t" /* c2 = 0 */
- "adds %[k], #4 \n\t" /* k += 4 */
- "cmp %[k], %[eccd] \n\t" /* k < uECC_WORDS (times 4) ? */
- "blt 1b \n\t" /* if not, loop back, start with i = 0 */
- "cmp %[k], %[eccd2m1] \n\t" /* k < uECC_WORDS * 2 - 1 (times 4) ? */
- "blt 2b \n\t" /* if not, loop back, start with i = (k + 1) - uECC_WORDS */
- /* end outer loop */
-
- "str %[c0], [%[result], %[k]] \n\t" /* result[uECC_WORDS * 2 - 1] = c0 */
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- : [c0] "+r" (c0), [c1] "+r" (c1), [c2] "+r" (c2),
- [k] "+r" (k), [i] "=&r" (i), [t0] "=&r" (t0), [t1] "=&r" (t1)
- : [result] "r" (result), [left] "r" (left), [right] "r" (right),
- [eccd] "I" (uECC_WORDS * 4), [eccdm1] "I" ((uECC_WORDS-1) * 4),
- [eccd2m1] "I" ((uECC_WORDS * 2 - 1) * 4)
- : "cc", "memory"
- );
-
- #else /* Thumb-1 */
- register uint32_t *r0 __asm__("r0") = result;
- register const uint32_t *r1 __asm__("r1") = left;
- register const uint32_t *r2 __asm__("r2") = right;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "movs r3, #0 \n\t" /* c0 = 0 */
- "movs r4, #0 \n\t" /* c1 = 0 */
- "movs r5, #0 \n\t" /* c2 = 0 */
- "movs r6, #0 \n\t" /* k = 0 */
-
- "push {r0} \n\t" /* keep result on the stack */
-
- "1: \n\t" /* outer loop (k < uECC_WORDS) */
- "movs r7, #0 \n\t" /* r7 = i = 0 */
- "b 3f \n\t"
-
- "2: \n\t" /* outer loop (k >= uECC_WORDS) */
- "movs r7, r6 \n\t" /* r7 = k */
- "subs r7, %[eccdm1] \n\t" /* r7 = i = k - (uECC_WORDS - 1) (times 4) */
-
- "3: \n\t" /* inner loop */
- "push {r3, r4, r5, r6} \n\t" /* push things, r3 (c0) is at the top of stack. */
- "subs r0, r6, r7 \n\t" /* r0 = k - i */
-
- "ldr r4, [r2, r0] \n\t" /* r4 = right[k - i] */
- "ldr r0, [r1, r7] \n\t" /* r0 = left[i] */
-
- "lsrs r3, r0, #16 \n\t" /* r3 = a1 */
- "uxth r0, r0 \n\t" /* r0 = a0 */
-
- "lsrs r5, r4, #16 \n\t" /* r5 = b1 */
- "uxth r4, r4 \n\t" /* r4 = b0 */
-
- "movs r6, r3 \n\t" /* r6 = a1 */
- "muls r6, r5, r6 \n\t" /* r6 = a1 * b1 */
- "muls r3, r4, r3 \n\t" /* r3 = b0 * a1 */
- "muls r5, r0, r5 \n\t" /* r5 = a0 * b1 */
- "muls r0, r4, r0 \n\t" /* r0 = a0 * b0 */
-
- "movs r4, #0 \n\t" /* r4 = 0 */
- "adds r3, r5 \n\t" /* r3 = b0 * a1 + a0 * b1 */
- "adcs r4, r4 \n\t" /* r4 = carry */
- "lsls r4, #16 \n\t" /* r4 = carry << 16 */
- "adds r6, r4 \n\t" /* r6 = a1 * b1 + carry */
-
- "lsls r4, r3, #16 \n\t" /* r4 = (b0 * a1 + a0 * b1) << 16 */
- "lsrs r3, #16 \n\t" /* r3 = (b0 * a1 + a0 * b1) >> 16 */
- "adds r0, r4 \n\t" /* r0 = low word = a0 * b0 + ((b0 * a1 + a0 * b1) << 16) */
- "adcs r6, r3 \n\t" /* r6 = high word = a1 * b1 + carry + ((b0 * a1 + a0 * b1) >> 16) */
-
- "pop {r3, r4, r5} \n\t" /* r3 = c0, r4 = c1, r5 = c2 */
- "adds r3, r0 \n\t" /* add low word to c0 */
- "adcs r4, r6 \n\t" /* add high word to c1, including carry */
- "movs r0, #0 \n\t" /* r0 = 0 (does not affect carry bit) */
- "adcs r5, r0 \n\t" /* add carry to c2 */
-
- "pop {r6} \n\t" /* r6 = k */
- "adds r7, #4 \n\t" /* i += 4 */
- "cmp r7, %[eccd] \n\t" /* i < uECC_WORDS (times 4)? */
- "bge 4f \n\t" /* if not, exit the loop */
- "cmp r7, r6 \n\t" /* i <= k? */
- "ble 3b \n\t" /* if so, continue looping */
-
- "4: \n\t" /* end inner loop */
-
- "ldr r0, [sp, #0] \n\t" /* r0 = result */
-
- "str r3, [r0, r6] \n\t" /* result[k] = c0 */
- "mov r3, r4 \n\t" /* c0 = c1 */
- "mov r4, r5 \n\t" /* c1 = c2 */
- "movs r5, #0 \n\t" /* c2 = 0 */
- "adds r6, #4 \n\t" /* k += 4 */
- "cmp r6, %[eccd] \n\t" /* k < uECC_WORDS (times 4) ? */
- "blt 1b \n\t" /* if not, loop back, start with i = 0 */
- "cmp r6, %[eccd2m1] \n\t" /* k < uECC_WORDS * 2 - 1 (times 4) ? */
- "blt 2b \n\t" /* if not, loop back, start with i = (k + 1) - uECC_WORDS */
- /* end outer loop */
-
- "str r3, [r0, r6] \n\t" /* result[uECC_WORDS * 2 - 1] = c0 */
- "pop {r0} \n\t" /* pop result off the stack */
-
- ".syntax divided \n\t"
- :
- : [r0] "l" (r0), [r1] "l" (r1), [r2] "l" (r2), [eccd] "I" (uECC_WORDS * 4), [eccdm1] "I" ((uECC_WORDS-1) * 4), [eccd2m1] "I" ((uECC_WORDS * 2 - 1) * 4)
- : "r3", "r4", "r5", "r6", "r7", "cc", "memory"
- );
- #endif
- }
- #define asm_mult 1
- #endif /* !asm_mult */
- #if uECC_SQUARE_FUNC
- #if !asm_square
- static void vli_square(uint32_t *result, const uint32_t *left) {
- #if (uECC_PLATFORM != uECC_arm_thumb)
- uint32_t c0 = 0;
- uint32_t c1 = 0;
- uint32_t c2 = 0;
- uint32_t k = 0;
- uint32_t i, tt;
- uint32_t t0, t1;
-
- __asm__ volatile (
- ".syntax unified \n\t"
-
- "1: \n\t" /* outer loop (k < uECC_WORDS) */
- "movs %[i], #0 \n\t" /* i = 0 */
- "b 3f \n\t"
-
- "2: \n\t" /* outer loop (k >= uECC_WORDS) */
- "movs %[i], %[k] \n\t" /* i = k */
- "subs %[i], %[eccdm1] \n\t" /* i = k - (uECC_WORDS - 1) (times 4) */
-
- "3: \n\t" /* inner loop */
- "subs %[tt], %[k], %[i] \n\t" /* tt = k-i */
-
- "ldr %[t1], [%[left], %[tt]] \n\t" /* t1 = left[k - i] */
- "ldr %[t0], [%[left], %[i]] \n\t" /* t0 = left[i] */
-
- "umull %[t0], %[t1], %[t0], %[t1] \n\t" /* (t0, t1) = left[i] * right[k - i] */
-
- "cmp %[i], %[tt] \n\t" /* (i < k - i) ? */
- "bge 4f \n\t" /* if i >= k - i, skip */
- "lsls %[t1], #1 \n\t" /* high word << 1 */
- "adc %[c2], #0 \n\t" /* add carry bit to c2 */
- "lsls %[t0], #1 \n\t" /* low word << 1 */
- "adc %[t1], #0 \n\t" /* add carry bit to high word */
-
- "4: \n\t"
- "adds %[c0], %[t0] \n\t" /* add low word to c0 */
- "adcs %[c1], %[t1] \n\t" /* add high word to c1, including carry */
- "adc %[c2], #0 \n\t" /* add carry to c2 */
-
- "adds %[i], #4 \n\t" /* i += 4 */
- "cmp %[i], %[k] \n\t" /* i <= k? */
- "bge 5f \n\t" /* if not, exit the loop */
- "subs %[tt], %[k], %[i] \n\t" /* tt = k - i */
- "cmp %[i], %[tt] \n\t" /* i <= k - i? */
- "ble 3b \n\t" /* if so, continue looping */
-
- "5: \n\t" /* end inner loop */
-
- "str %[c0], [%[result], %[k]] \n\t" /* result[k] = c0 */
- "mov %[c0], %[c1] \n\t" /* c0 = c1 */
- "mov %[c1], %[c2] \n\t" /* c1 = c2 */
- "movs %[c2], #0 \n\t" /* c2 = 0 */
- "adds %[k], #4 \n\t" /* k += 4 */
- "cmp %[k], %[eccd] \n\t" /* k < uECC_WORDS (times 4) ? */
- "blt 1b \n\t" /* if not, loop back, start with i = 0 */
- "cmp %[k], %[eccd2m1] \n\t" /* k < uECC_WORDS * 2 - 1 (times 4) ? */
- "blt 2b \n\t" /* if not, loop back, start with i = (k + 1) - uECC_WORDS */
- /* end outer loop */
-
- "str %[c0], [%[result], %[k]] \n\t" /* result[uECC_WORDS * 2 - 1] = c0 */
- #if (uECC_PLATFORM != uECC_arm_thumb2)
- ".syntax divided \n\t"
- #endif
- : [c0] "+r" (c0), [c1] "+r" (c1), [c2] "+r" (c2),
- [k] "+r" (k), [i] "=&r" (i), [tt] "=&r" (tt), [t0] "=&r" (t0), [t1] "=&r" (t1)
- : [result] "r" (result), [left] "r" (left),
- [eccd] "I" (uECC_WORDS * 4), [eccdm1] "I" ((uECC_WORDS-1) * 4),
- [eccd2m1] "I" ((uECC_WORDS * 2 - 1) * 4)
- : "cc", "memory"
- );
-
- #else
- register uint32_t *r0 __asm__("r0") = result;
- register const uint32_t *r1 __asm__("r1") = left;
-
- __asm__ volatile (
- ".syntax unified \n\t"
- "movs r2, #0 \n\t" /* c0 = 0 */
- "movs r3, #0 \n\t" /* c1 = 0 */
- "movs r4, #0 \n\t" /* c2 = 0 */
- "movs r5, #0 \n\t" /* k = 0 */
-
- "push {r0} \n\t" /* keep result on the stack */
-
- "1: \n\t" /* outer loop (k < uECC_WORDS) */
- "movs r6, #0 \n\t" /* r6 = i = 0 */
- "b 3f \n\t"
-
- "2: \n\t" /* outer loop (k >= uECC_WORDS) */
- "movs r6, r5 \n\t" /* r6 = k */
- "subs r6, %[eccdm1] \n\t" /* r6 = i = k - (uECC_WORDS - 1) (times 4) */
-
- "3: \n\t" /* inner loop */
- "push {r2, r3, r4, r5} \n\t" /* push things, r2 (c0) is at the top of stack. */
- "subs r7, r5, r6 \n\t" /* r7 = k - i */
-
- "ldr r3, [r1, r7] \n\t" /* r3 = left[k - i] */
- "ldr r0, [r1, r6] \n\t" /* r0 = left[i] */
-
- "lsrs r2, r0, #16 \n\t" /* r2 = a1 */
- "uxth r0, r0 \n\t" /* r0 = a0 */
-
- "lsrs r4, r3, #16 \n\t" /* r4 = b1 */
- "uxth r3, r3 \n\t" /* r3 = b0 */
-
- "movs r5, r2 \n\t" /* r5 = a1 */
- "muls r5, r4, r5 \n\t" /* r5 = a1 * b1 */
- "muls r2, r3, r2 \n\t" /* r2 = b0 * a1 */
- "muls r4, r0, r4 \n\t" /* r4 = a0 * b1 */
- "muls r0, r3, r0 \n\t" /* r0 = a0 * b0 */
-
- "movs r3, #0 \n\t" /* r3 = 0 */
- "adds r2, r4 \n\t" /* r2 = b0 * a1 + a0 * b1 */
- "adcs r3, r3 \n\t" /* r3 = carry */
- "lsls r3, #16 \n\t" /* r3 = carry << 16 */
- "adds r5, r3 \n\t" /* r5 = a1 * b1 + carry */
-
- "lsls r3, r2, #16 \n\t" /* r3 = (b0 * a1 + a0 * b1) << 16 */
- "lsrs r2, #16 \n\t" /* r2 = (b0 * a1 + a0 * b1) >> 16 */
- "adds r0, r3 \n\t" /* r0 = low word = a0 * b0 + ((b0 * a1 + a0 * b1) << 16) */
- "adcs r5, r2 \n\t" /* r5 = high word = a1 * b1 + carry + ((b0 * a1 + a0 * b1) >> 16) */
-
- "movs r3, #0 \n\t" /* r3 = 0 */
- "cmp r6, r7 \n\t" /* (i < k - i) ? */
- "mov r7, r3 \n\t" /* r7 = 0 (does not affect condition)*/
- "bge 4f \n\t" /* if i >= k - i, skip */
- "lsls r5, #1 \n\t" /* high word << 1 */
- "adcs r7, r3 \n\t" /* r7 = carry bit for c2 */
- "lsls r0, #1 \n\t" /* low word << 1 */
- "adcs r5, r3 \n\t" /* add carry from shift to high word */
-
- "4: \n\t"
- "pop {r2, r3, r4} \n\t" /* r2 = c0, r3 = c1, r4 = c2 */
- "adds r2, r0 \n\t" /* add low word to c0 */
- "adcs r3, r5 \n\t" /* add high word to c1, including carry */
- "movs r0, #0 \n\t" /* r0 = 0 (does not affect carry bit) */
- "adcs r4, r0 \n\t" /* add carry to c2 */
- "adds r4, r7 \n\t" /* add carry from doubling (if any) */
-
- "pop {r5} \n\t" /* r5 = k */
-
- "adds r6, #4 \n\t" /* i += 4 */
- "cmp r6, r5 \n\t" /* i <= k? */
- "bge 5f \n\t" /* if not, exit the loop */
- "subs r7, r5, r6 \n\t" /* r7 = k - i */
- "cmp r6, r7 \n\t" /* i <= k - i? */
- "ble 3b \n\t" /* if so, continue looping */
-
- "5: \n\t" /* end inner loop */
-
- "ldr r0, [sp, #0] \n\t" /* r0 = result */
-
- "str r2, [r0, r5] \n\t" /* result[k] = c0 */
- "mov r2, r3 \n\t" /* c0 = c1 */
- "mov r3, r4 \n\t" /* c1 = c2 */
- "movs r4, #0 \n\t" /* c2 = 0 */
- "adds r5, #4 \n\t" /* k += 4 */
- "cmp r5, %[eccd] \n\t" /* k < uECC_WORDS (times 4) ? */
- "blt 1b \n\t" /* if not, loop back, start with i = 0 */
- "cmp r5, %[eccd2m1] \n\t" /* k < uECC_WORDS * 2 - 1 (times 4) ? */
- "blt 2b \n\t" /* if not, loop back, start with i = (k + 1) - uECC_WORDS */
- /* end outer loop */
-
- "str r2, [r0, r5] \n\t" /* result[uECC_WORDS * 2 - 1] = c0 */
- "pop {r0} \n\t" /* pop result off the stack */
- ".syntax divided \n\t"
- : [r0] "+l" (r0), [r1] "+l" (r1)
- : [eccd] "I" (uECC_WORDS * 4), [eccdm1] "I" ((uECC_WORDS-1) * 4),
- [eccd2m1] "I" ((uECC_WORDS * 2 - 1) * 4)
- : "r2", "r3", "r4", "r5", "r6", "r7", "cc", "memory"
- );
- #endif
- }
- #define asm_square 1
- #endif /* !asm_square */
- #endif /* uECC_SQUARE_FUNC */
|