sp_arm32.c 4.7 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499107500107501107502107503107504107505107506107507107508107509107510107511107512107513107514107515107516107517107518107519107520107521107522107523107524107525107526107527107528107529107530107531107532107533107534107535107536107537107538107539107540107541107542107543107544107545107546107547107548107549107550107551107552107553107554107555107556107557107558107559107560107561107562107563107564107565107566107567107568107569107570107571107572107573107574107575107576107577107578107579107580107581107582107583107584107585107586107587107588107589107590107591107592107593107594107595107596107597107598107599107600107601107602107603107604107605107606107607107608107609107610107611107612107613107614107615107616107617107618107619107620107621107622107623107624107625107626107627107628107629107630107631107632107633107634107635107636107637107638107639107640107641107642107643107644107645107646107647107648107649107650107651107652107653107654107655107656107657107658107659107660107661107662107663107664107665107666107667107668107669107670107671107672107673107674107675107676107677107678107679107680107681107682107683107684107685107686107687107688107689107690107691107692107693107694107695107696107697107698107699107700107701107702107703107704107705107706107707107708107709107710107711107712107713107714107715107716107717107718107719107720107721107722107723107724107725107726107727107728107729107730107731107732107733107734107735107736107737107738107739107740107741107742107743107744107745107746107747107748107749107750107751107752107753107754107755107756107757107758107759107760107761107762107763107764107765107766107767107768107769107770107771107772107773107774107775107776107777107778107779107780107781107782107783107784107785107786107787107788107789107790107791107792107793107794107795107796107797107798107799107800107801107802107803107804107805107806107807107808107809107810107811107812107813107814107815107816107817107818107819107820107821107822107823107824107825107826107827107828107829107830107831107832107833107834107835107836107837107838107839107840107841107842107843107844107845107846107847107848107849107850107851107852107853107854107855107856107857107858107859107860107861107862107863107864107865107866107867107868107869107870107871107872107873107874107875107876107877107878107879107880107881107882107883107884107885107886107887107888107889107890107891107892107893107894107895107896107897107898107899107900107901107902107903107904107905107906107907107908107909107910107911107912107913107914107915107916107917107918107919107920107921107922107923107924107925107926107927107928107929107930107931107932107933107934107935107936107937107938107939107940107941107942107943107944107945107946107947107948107949107950107951107952107953107954107955107956107957107958107959107960107961107962107963107964107965107966107967107968107969107970107971107972107973107974107975107976107977107978107979107980107981107982107983107984107985107986107987107988107989107990107991107992107993107994107995107996107997107998107999108000108001108002108003108004108005108006108007108008108009108010108011108012108013108014108015108016108017108018108019108020108021108022108023108024108025108026108027108028108029108030108031108032108033108034108035108036108037108038108039108040108041108042108043108044108045108046108047108048108049108050108051108052108053108054108055108056108057108058108059108060108061108062108063108064108065108066108067108068108069108070108071108072108073108074108075108076108077108078108079108080108081108082108083108084108085108086108087108088108089108090108091108092108093108094108095108096108097108098108099108100108101108102108103108104108105108106108107108108108109108110108111108112108113108114108115108116108117108118108119108120108121108122108123108124108125108126108127108128108129108130108131108132108133108134108135108136108137108138108139108140108141108142108143108144108145108146108147108148108149108150108151108152108153108154108155108156108157108158108159108160108161108162108163108164108165108166108167108168108169108170108171108172108173108174108175108176108177108178108179108180108181108182108183108184108185108186108187108188108189108190108191108192108193108194108195108196108197108198108199108200108201108202108203108204108205108206108207108208108209108210108211108212108213108214108215108216108217108218108219108220108221108222108223108224108225108226108227108228108229108230108231108232108233108234108235108236108237108238108239108240108241108242108243108244108245108246108247108248108249108250108251108252108253108254108255108256108257108258108259108260108261108262108263108264108265108266108267108268108269108270108271108272108273108274108275108276108277108278108279108280108281108282108283108284108285108286108287108288108289108290108291108292108293108294108295108296108297108298108299108300108301108302108303108304108305108306108307108308108309108310108311108312108313108314108315108316108317108318108319108320108321108322108323108324108325108326108327108328108329108330108331108332108333108334108335108336108337108338108339108340108341108342108343108344108345108346108347108348108349108350108351108352108353108354108355108356108357108358108359108360108361108362108363108364108365108366108367108368108369108370108371108372108373108374108375108376108377108378108379108380108381108382108383108384108385108386108387108388108389108390108391108392108393108394108395108396108397108398108399108400108401108402108403108404108405108406108407108408108409108410108411108412108413108414108415108416108417108418108419108420108421108422108423108424108425108426108427108428108429108430108431108432108433108434108435108436108437108438108439108440108441108442108443108444108445108446108447108448108449108450108451108452108453108454108455108456108457108458108459108460108461108462108463108464108465108466108467108468108469108470108471108472108473108474108475108476108477108478108479108480108481108482108483108484108485108486108487108488108489108490108491108492108493108494108495108496108497108498108499108500108501108502108503108504108505108506108507108508108509108510108511108512108513108514108515108516108517108518108519108520108521108522108523108524108525108526108527108528108529108530108531108532108533108534108535108536108537108538108539108540108541108542108543108544108545108546108547108548108549108550108551108552108553108554108555108556108557108558108559108560108561108562108563108564108565108566108567108568108569108570108571108572108573108574108575108576108577108578108579108580108581108582108583108584108585108586108587108588108589108590108591108592108593108594108595108596108597108598108599108600108601108602108603108604108605108606108607108608108609108610108611108612108613108614108615108616108617108618108619108620108621108622108623108624108625108626108627108628108629108630108631108632108633108634108635108636108637108638108639108640108641108642108643108644108645108646108647108648108649108650108651108652108653108654108655108656108657108658108659108660108661108662108663108664108665108666108667108668108669108670108671108672108673108674108675108676108677108678108679108680108681108682108683108684108685108686108687108688108689108690108691108692108693108694108695108696108697108698108699108700108701108702108703108704108705108706108707108708108709108710108711108712108713108714108715108716108717108718108719108720108721108722108723108724108725108726108727108728108729108730108731108732108733108734108735108736108737108738108739108740108741108742108743108744108745108746108747108748108749108750108751108752108753108754108755108756108757108758108759108760108761108762108763108764108765108766108767108768108769108770108771108772108773108774108775108776108777108778108779108780108781108782108783108784108785108786108787108788108789108790108791108792108793108794108795108796108797108798108799108800108801108802108803108804108805108806108807108808108809108810108811108812108813108814108815108816108817108818108819108820108821108822108823108824108825108826108827108828108829108830108831108832108833108834108835108836108837108838108839108840108841108842108843108844108845108846108847108848108849108850108851108852108853108854108855108856108857108858108859108860108861108862108863108864108865108866108867108868108869108870108871108872108873108874108875108876108877108878108879108880108881108882108883108884108885108886108887108888108889108890108891108892108893108894108895108896108897108898108899108900108901108902108903108904108905108906108907108908108909108910108911108912108913108914108915108916108917108918108919108920108921108922108923108924108925108926108927108928108929108930108931108932108933108934108935108936108937108938108939108940108941108942108943108944108945108946108947108948108949108950108951108952108953108954108955108956108957108958108959108960108961108962108963108964108965108966108967108968108969108970108971108972108973108974108975108976108977108978108979108980108981108982108983108984108985108986108987108988108989108990108991108992108993108994108995108996108997108998108999109000109001109002109003109004109005109006109007109008109009109010109011109012109013109014109015109016109017109018109019109020109021109022109023109024109025109026109027109028109029109030109031109032109033109034109035109036109037109038109039109040109041109042109043109044109045109046109047109048109049109050109051109052109053109054109055109056109057109058109059109060109061109062109063109064109065109066109067109068109069109070109071109072109073109074109075109076109077109078109079109080109081109082109083109084109085109086109087109088109089109090109091109092109093109094109095109096109097109098109099109100109101109102109103109104109105109106109107109108109109109110109111109112109113109114109115109116109117109118109119109120109121109122109123109124109125109126109127109128109129109130109131109132109133109134109135109136109137109138109139109140109141109142109143109144109145109146109147109148109149109150109151109152109153109154109155109156109157109158109159109160109161109162109163109164109165109166109167109168109169109170109171109172109173109174109175109176109177109178109179109180109181109182109183109184109185109186109187109188109189109190109191109192109193109194109195109196109197109198109199109200109201109202109203109204109205109206109207109208109209109210109211109212109213109214109215109216109217109218109219109220109221109222109223109224109225109226109227109228109229109230109231109232109233109234109235109236109237109238109239109240109241109242109243109244109245109246109247109248109249109250109251109252109253109254109255109256109257109258109259109260109261109262109263109264109265109266109267109268109269109270109271109272109273109274109275109276109277109278109279109280109281109282109283109284109285109286109287109288109289109290109291109292109293109294109295109296109297109298109299109300109301109302109303109304109305109306109307109308109309109310109311109312109313109314109315109316109317109318109319109320109321109322109323109324109325109326109327109328109329109330109331109332109333109334109335109336109337109338109339109340109341109342109343109344109345109346109347109348109349109350109351109352109353109354109355109356109357109358109359109360109361109362109363109364109365109366109367109368109369109370109371109372109373109374109375109376109377109378109379109380109381109382109383109384109385109386109387109388109389109390109391109392109393109394109395109396109397109398109399109400109401109402109403109404109405109406109407109408109409109410109411109412109413109414109415109416109417109418109419109420109421109422109423109424109425109426109427109428109429109430109431109432109433109434109435109436109437109438109439109440109441109442109443109444109445109446109447109448109449109450109451109452109453109454109455109456109457109458109459109460109461109462109463109464109465109466109467109468109469109470109471109472109473109474109475109476109477109478109479109480109481109482109483109484109485109486109487109488109489109490109491109492109493109494109495109496109497109498109499109500109501109502109503109504109505109506109507109508109509109510109511109512109513109514109515109516109517109518109519109520109521109522109523109524109525109526109527109528109529109530109531109532109533109534109535109536109537109538109539109540109541109542109543109544109545109546109547109548109549109550109551109552109553109554109555109556109557109558109559109560109561109562109563109564109565109566109567109568109569109570109571109572109573109574109575109576109577109578109579109580109581109582109583109584109585109586109587109588109589109590109591109592109593109594109595109596109597109598109599109600109601109602109603109604109605109606109607109608109609109610109611109612109613109614109615109616109617109618109619109620109621109622109623109624109625109626109627109628109629109630109631109632109633109634109635109636109637109638109639109640109641109642109643109644109645109646109647109648109649109650109651109652109653109654109655109656109657109658109659109660109661109662109663109664109665109666109667109668109669109670109671109672109673109674109675109676109677109678109679109680109681109682109683109684109685109686109687109688109689109690109691109692109693109694109695109696109697109698109699109700109701109702109703109704109705109706109707109708109709109710109711109712109713109714109715109716109717109718109719109720109721109722109723109724109725109726109727109728109729109730109731109732109733109734109735109736109737109738109739109740109741109742109743109744109745109746109747109748109749109750109751109752109753109754109755109756109757109758109759109760109761109762109763109764109765109766109767109768109769109770109771109772109773109774109775109776109777109778109779109780109781109782109783109784109785109786109787109788109789109790109791109792109793109794109795109796109797109798109799109800109801109802109803109804109805109806109807109808109809109810109811109812109813109814109815109816109817109818109819109820109821109822109823109824109825109826109827109828109829109830109831109832109833109834109835109836109837109838109839109840109841109842109843109844109845109846109847109848109849109850109851109852109853109854109855109856109857109858109859109860109861109862109863109864109865109866109867109868109869109870109871109872109873109874109875109876109877109878109879109880109881109882109883109884109885109886109887109888109889109890109891109892109893109894109895109896109897109898109899109900109901109902109903109904109905109906109907109908109909109910109911109912109913109914109915109916109917109918109919109920109921109922109923109924109925109926109927109928109929109930109931109932109933109934109935109936109937109938109939109940109941109942109943109944109945109946109947109948109949109950109951109952109953109954109955109956109957109958109959109960109961109962109963109964109965109966109967109968109969109970109971109972109973109974109975109976109977109978109979109980109981109982109983109984109985109986109987109988109989109990109991109992109993109994109995109996109997109998109999110000110001110002110003110004110005110006110007110008110009110010110011110012110013110014110015110016110017110018110019110020110021110022110023110024110025110026110027110028110029110030110031110032110033110034110035110036110037110038110039110040110041110042110043110044110045110046110047110048110049110050110051110052110053110054110055110056110057110058110059110060110061110062110063110064110065110066110067110068110069110070110071110072110073110074110075110076110077110078110079110080110081110082110083110084110085110086110087110088110089110090110091110092110093110094110095110096110097110098110099110100110101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110161110162110163110164110165110166110167110168110169110170110171110172110173110174110175110176110177110178110179110180110181110182110183110184110185110186110187110188110189110190110191110192110193110194110195110196110197110198110199110200110201110202110203110204110205110206110207110208110209110210110211110212110213110214110215110216110217110218110219110220110221110222110223110224110225110226110227110228110229110230110231110232110233110234110235110236110237110238110239110240110241110242110243110244110245110246110247110248110249110250110251110252110253110254110255110256110257110258110259110260110261110262110263110264110265110266110267110268110269110270110271110272110273110274110275110276110277110278110279110280110281110282110283110284110285110286110287110288110289110290110291110292110293110294110295110296110297110298110299110300110301110302110303110304110305110306110307110308110309110310110311110312110313110314110315110316110317110318110319110320110321110322110323110324110325110326110327110328110329110330110331110332110333110334110335110336110337110338110339110340110341110342110343110344110345110346110347110348110349110350110351110352110353110354110355110356110357110358110359110360110361110362110363110364110365110366110367110368110369110370110371110372110373110374110375110376110377110378110379110380110381110382110383110384110385110386110387110388110389110390110391110392110393110394110395110396110397110398110399110400110401110402110403110404110405110406110407110408110409110410110411110412110413110414110415110416110417110418110419110420110421110422110423110424110425110426110427110428110429110430110431110432110433110434110435110436110437110438110439110440110441110442110443110444110445110446110447110448110449110450110451110452110453110454110455110456110457110458110459110460110461110462110463110464110465110466110467110468110469110470110471110472110473110474110475110476110477110478110479110480110481110482110483110484110485110486110487110488110489110490110491110492110493110494110495110496110497110498110499110500110501110502110503110504110505110506110507110508110509110510110511110512110513110514110515110516110517110518110519110520110521110522110523110524110525110526110527110528110529110530110531110532110533110534110535110536110537110538110539110540110541110542110543110544110545110546110547110548110549110550110551110552110553110554110555110556110557110558110559110560110561110562110563110564110565110566110567110568110569110570110571110572110573110574110575110576110577110578110579110580110581110582110583110584110585110586110587110588110589110590110591110592110593110594110595110596110597110598110599110600110601110602110603110604110605110606110607110608110609110610110611110612110613110614110615110616110617110618110619110620110621110622110623110624110625110626110627110628110629110630110631110632110633110634110635110636110637110638110639110640110641110642110643110644110645110646110647110648110649110650110651110652110653110654110655110656110657110658110659110660110661110662110663110664110665110666110667110668110669110670110671110672110673110674110675110676110677110678110679110680110681110682110683110684110685110686110687110688110689110690110691110692110693110694110695110696110697110698110699110700110701110702110703110704110705110706110707110708110709110710110711110712110713110714110715110716110717110718110719110720110721110722110723110724110725110726110727110728110729110730110731110732110733110734110735110736110737110738110739110740110741110742110743110744110745110746110747110748110749110750110751110752110753110754110755110756110757110758110759110760110761110762110763110764110765110766110767110768110769110770110771110772110773110774110775110776110777110778110779110780110781110782110783110784110785110786110787110788110789110790110791110792110793110794110795110796110797110798110799110800110801110802110803110804110805110806110807110808110809110810110811110812110813110814110815110816110817110818110819110820110821110822110823110824110825110826110827110828110829110830110831110832110833110834110835110836110837110838110839110840110841110842110843110844110845110846110847110848110849110850110851110852110853110854110855110856110857110858110859110860110861110862110863110864110865110866110867110868110869110870110871110872110873110874110875110876110877110878110879110880110881110882110883110884110885110886110887110888110889110890110891110892110893110894110895110896110897110898110899110900110901110902110903110904110905110906110907110908110909110910110911110912110913110914110915110916110917110918110919110920110921110922110923110924110925110926110927110928110929110930110931110932110933110934110935110936110937110938110939110940110941110942110943110944110945110946110947110948110949110950110951110952110953110954110955110956110957110958110959110960110961110962110963110964110965110966110967110968110969110970110971110972110973110974110975110976110977110978110979110980110981110982110983110984110985110986110987110988110989110990110991110992110993110994110995110996110997110998110999111000111001111002111003111004111005111006111007111008111009111010111011111012111013111014111015111016111017111018111019111020111021111022111023111024111025111026111027111028111029111030111031111032111033111034111035111036111037111038111039111040111041111042111043111044111045111046111047111048111049111050111051111052111053111054111055111056111057111058111059111060111061111062111063111064111065111066111067111068111069111070111071111072111073111074111075111076111077111078111079111080111081111082111083111084111085111086111087111088111089111090111091111092111093111094111095111096111097111098111099111100111101111102111103111104111105111106111107111108111109111110111111111112111113111114111115111116111117111118111119111120111121111122111123111124111125111126111127111128111129111130111131111132111133111134111135111136111137111138111139111140111141111142111143111144111145111146111147111148111149111150111151111152111153111154111155111156111157111158111159111160111161111162111163111164111165111166111167111168111169111170111171111172111173111174111175111176111177111178111179111180111181111182111183111184111185111186111187111188111189111190111191111192111193111194111195111196111197111198111199111200111201111202111203111204111205111206111207111208111209111210111211111212111213111214111215111216111217111218111219111220111221111222111223111224111225111226111227111228111229111230111231111232111233111234111235111236111237111238111239111240111241111242111243111244111245111246111247111248111249111250111251111252111253111254111255111256111257111258111259111260111261111262111263111264111265111266111267111268111269111270111271111272111273111274111275111276111277111278111279111280111281111282111283111284111285111286111287111288111289111290111291111292111293111294111295111296111297111298111299111300111301111302111303111304111305111306111307111308111309111310111311111312111313111314111315111316111317111318111319111320111321111322111323111324111325111326111327111328111329111330111331111332111333111334111335111336111337111338111339111340111341111342111343111344111345111346111347111348111349111350111351111352111353111354111355111356111357111358111359111360111361111362111363111364111365111366111367111368111369111370111371111372111373111374111375111376111377111378111379111380111381111382111383111384111385111386111387111388111389111390111391111392111393111394111395111396111397111398111399111400111401111402111403111404111405111406111407111408111409111410111411111412111413111414111415111416111417111418111419111420111421111422111423111424111425111426111427111428111429111430111431111432111433111434111435111436111437111438111439111440111441111442111443111444111445111446111447111448111449111450111451111452111453111454111455111456111457111458111459111460111461111462111463111464111465111466111467111468111469111470111471111472111473111474111475111476111477111478111479111480111481111482111483111484111485111486111487111488111489111490111491111492111493111494111495111496111497111498111499111500111501111502111503111504111505111506111507111508111509111510111511111512111513111514111515111516111517111518111519111520111521111522111523111524111525111526111527111528111529111530111531111532111533111534111535111536111537111538111539111540111541111542111543111544111545111546111547111548111549111550111551111552111553111554111555111556111557111558111559111560111561111562111563111564111565111566111567111568111569111570111571111572111573111574111575111576111577111578111579111580111581111582111583111584111585111586111587111588111589111590111591111592111593111594111595111596111597111598111599111600111601111602111603111604111605111606111607111608111609111610111611111612111613111614111615111616111617111618111619111620111621111622111623111624111625111626111627111628111629111630111631111632111633111634111635111636111637111638111639111640111641111642111643111644111645111646111647111648111649111650111651111652111653111654111655111656111657111658111659111660111661111662111663111664111665111666111667111668111669111670111671111672111673111674111675111676111677111678111679111680111681111682111683111684111685111686111687111688111689111690111691111692111693111694111695111696111697111698111699111700111701111702111703111704111705111706111707111708111709111710111711111712111713111714111715111716111717111718111719111720111721111722111723111724111725111726111727111728111729111730111731111732111733111734111735111736111737111738111739111740111741111742111743111744111745111746111747111748111749111750111751111752111753111754111755111756111757111758111759111760111761111762111763111764111765111766111767111768111769111770111771111772111773111774111775111776111777111778111779111780111781111782111783111784111785111786111787111788111789111790111791111792111793111794111795111796111797111798111799111800111801111802111803111804111805111806111807111808111809111810111811111812111813111814111815111816111817111818111819111820111821111822111823111824111825111826111827111828111829111830111831111832111833111834111835111836111837111838111839111840111841111842111843111844111845111846111847111848111849111850111851111852111853111854111855111856111857111858111859111860111861111862111863111864111865111866111867111868111869111870111871111872111873111874111875111876111877111878111879111880111881111882111883111884111885111886111887111888111889111890111891111892111893111894111895111896111897111898111899111900111901111902111903111904111905111906111907111908111909111910111911111912111913111914111915111916111917111918111919111920111921111922111923111924111925111926111927111928111929111930111931111932111933111934111935111936111937111938111939111940111941111942111943111944111945111946111947111948111949111950111951111952111953111954111955111956111957111958111959111960111961111962111963111964111965111966111967111968111969111970111971111972111973111974111975111976111977111978111979111980111981111982111983111984111985111986111987111988111989111990111991111992111993111994111995111996111997111998111999112000112001112002112003112004112005112006112007112008112009112010112011112012112013112014112015112016112017112018112019112020112021112022112023112024112025112026112027112028112029112030112031112032112033112034112035112036112037112038112039112040112041112042112043112044112045112046112047112048112049112050112051112052112053112054112055112056112057112058112059112060112061112062112063112064112065112066112067112068112069112070112071112072112073112074112075112076112077112078112079112080112081112082112083112084112085112086112087112088112089112090112091112092112093112094112095112096112097112098112099112100112101112102112103112104112105112106112107112108112109112110112111112112112113112114112115112116112117112118112119112120112121112122112123112124112125112126112127112128112129112130112131112132112133112134112135112136112137112138112139112140112141112142112143112144112145112146112147112148112149112150112151112152112153112154112155112156112157112158112159112160112161112162112163112164112165112166112167112168112169112170112171112172112173112174112175112176112177112178112179112180112181112182112183112184112185112186112187112188112189112190112191112192112193112194112195112196112197112198112199112200112201112202112203112204112205112206112207112208112209112210112211112212112213112214112215112216112217112218112219112220112221112222112223112224112225112226112227112228112229112230112231112232112233112234112235112236112237112238112239112240112241112242112243112244112245112246112247112248112249112250112251112252112253112254112255112256112257112258112259112260112261112262112263112264112265112266112267112268112269112270112271112272112273112274112275112276112277112278112279112280112281112282112283112284112285112286112287112288112289112290112291112292112293112294112295112296112297112298112299112300112301112302112303112304112305112306112307112308112309112310112311112312112313112314112315112316112317112318112319112320112321112322112323112324112325112326112327112328112329112330112331112332112333112334112335112336112337112338112339112340112341112342112343112344112345112346112347112348112349112350112351112352112353112354112355112356112357112358112359112360112361112362112363112364112365112366112367112368112369112370112371112372112373112374112375112376112377112378112379112380112381112382112383112384112385112386112387112388112389112390112391112392112393112394112395112396112397112398112399112400112401112402112403112404112405112406112407112408112409112410112411112412112413112414112415112416112417112418112419112420112421112422112423112424112425112426112427112428112429112430112431112432112433112434112435112436112437112438112439112440112441112442112443112444112445112446112447112448112449112450112451112452112453112454112455112456112457112458112459112460112461112462112463112464112465112466112467112468112469112470112471112472112473112474112475112476112477112478112479112480112481112482112483112484112485112486112487112488112489112490112491112492112493112494112495112496112497112498112499112500112501112502112503112504112505112506112507112508112509112510112511112512112513112514112515112516112517112518112519112520112521112522112523112524112525112526112527112528112529112530112531112532112533112534112535112536112537112538112539112540112541112542112543112544112545112546112547112548112549112550112551112552112553112554112555112556112557112558112559112560112561112562112563112564112565112566112567112568112569112570112571112572112573112574112575112576112577112578112579112580112581112582112583112584112585112586112587112588112589112590112591112592112593112594112595112596112597112598112599112600112601112602112603112604112605112606112607112608112609112610112611112612112613112614112615112616112617112618112619112620112621112622112623112624112625112626112627112628112629112630112631112632112633112634112635112636112637112638112639112640112641112642112643112644112645112646112647112648112649112650112651112652112653112654112655112656112657112658112659112660112661112662112663112664112665112666112667112668112669112670112671112672112673112674112675112676112677112678112679112680112681112682112683112684112685112686112687112688112689112690112691112692112693112694112695112696112697112698112699112700112701112702112703112704112705112706112707112708112709112710112711112712112713112714112715112716112717112718112719112720112721112722112723112724112725112726112727112728112729112730112731112732112733112734112735112736112737112738112739112740112741112742112743112744112745112746112747112748112749112750112751112752112753112754112755112756112757112758112759112760112761112762112763112764112765112766112767112768112769112770112771112772112773112774112775112776112777112778112779112780112781112782112783112784112785112786112787112788112789112790112791112792112793112794112795112796112797112798112799112800112801112802112803112804112805112806112807112808112809112810112811112812112813112814112815112816112817112818112819112820112821112822112823112824112825112826112827112828112829112830112831112832112833112834112835112836112837112838112839112840112841112842112843112844112845112846112847112848112849112850112851112852112853112854112855112856112857112858112859112860112861112862112863112864112865112866112867112868112869112870112871112872112873112874112875112876112877112878112879112880112881112882112883112884112885112886112887112888112889112890112891112892112893112894112895112896112897112898112899112900112901112902112903112904112905112906112907112908112909112910112911112912112913112914112915112916112917112918112919112920112921112922112923112924112925112926112927112928112929112930112931112932112933112934112935112936112937112938112939112940112941112942112943112944112945112946112947112948112949112950112951112952112953112954112955112956112957112958112959112960112961112962112963112964112965112966112967112968112969112970112971112972112973112974112975112976112977112978112979112980112981112982112983112984112985112986112987112988112989112990112991112992112993112994112995112996112997112998112999113000113001113002113003113004113005113006113007113008113009113010113011113012113013113014113015113016113017113018113019113020113021113022113023113024113025113026113027113028113029113030113031113032113033113034113035113036113037113038113039113040113041113042113043113044113045113046113047113048113049113050113051113052113053113054113055113056113057113058113059113060113061113062113063113064113065113066113067113068113069113070113071113072113073113074113075113076113077113078113079113080113081113082113083113084113085113086113087113088113089113090113091113092113093113094113095113096113097113098113099113100113101113102113103113104113105113106113107113108113109113110113111113112113113113114113115113116113117113118113119113120113121113122113123113124113125113126113127113128113129113130113131113132113133113134113135113136113137113138113139113140113141113142113143113144113145113146113147113148113149113150113151113152113153113154113155113156113157113158113159113160113161113162113163113164113165113166113167113168113169113170113171113172113173113174113175113176113177113178113179113180113181113182113183113184113185113186113187113188113189113190113191113192113193113194113195113196113197113198113199113200113201113202113203113204113205113206113207113208113209113210113211113212113213113214113215113216113217113218113219113220113221113222113223113224113225113226113227113228113229113230113231113232113233113234113235113236113237113238113239113240113241113242113243113244113245113246113247113248113249113250113251113252113253113254113255113256113257113258113259113260113261113262113263113264113265113266113267113268113269113270113271113272113273113274113275113276113277113278113279113280113281113282113283113284113285113286113287113288113289113290113291113292113293113294113295113296113297113298113299113300113301113302113303113304113305113306113307113308113309113310113311113312113313113314113315113316113317113318113319113320113321113322113323113324113325113326113327113328113329113330113331113332113333113334113335113336113337113338113339113340113341113342113343113344113345113346113347113348113349113350113351113352113353113354113355113356113357113358113359113360113361113362113363113364113365113366113367113368113369113370113371113372113373113374113375113376113377113378113379113380113381113382113383113384113385113386113387113388113389113390113391113392113393113394113395113396113397113398113399113400113401113402113403113404113405113406113407113408113409113410113411113412113413113414113415113416113417113418113419113420113421113422113423113424113425113426113427113428113429113430113431113432113433113434113435113436113437113438113439113440113441113442113443113444113445113446113447113448113449113450113451113452113453113454113455113456113457113458113459113460113461113462113463113464113465113466113467113468113469113470113471113472113473113474113475113476113477113478113479113480113481113482113483113484113485113486113487113488113489113490113491113492113493113494113495113496113497113498113499113500113501113502113503113504113505113506113507113508113509113510113511113512113513113514113515113516113517113518113519113520113521113522113523113524113525113526113527113528113529113530113531113532113533113534113535113536113537113538113539113540113541113542113543113544113545113546113547113548113549113550113551113552113553113554113555113556113557113558113559113560113561113562113563113564113565113566113567113568113569113570113571113572113573113574113575113576113577113578113579113580113581113582113583113584113585113586113587113588113589113590113591113592113593113594113595113596113597113598113599113600113601113602113603113604113605113606113607113608113609113610113611113612113613113614113615113616113617113618113619113620113621113622113623113624113625113626113627113628113629113630113631113632113633113634113635113636113637113638113639113640113641113642113643113644113645113646113647113648113649113650113651113652113653113654113655113656113657113658113659113660113661113662113663113664113665113666113667113668113669113670113671113672113673113674113675113676113677113678113679113680113681113682113683113684113685113686113687113688113689113690113691113692113693113694113695113696113697113698113699113700113701113702113703113704113705113706113707113708113709113710113711113712113713113714113715113716113717113718113719113720113721113722113723113724113725113726113727113728113729113730113731113732113733113734113735113736113737113738113739113740113741113742113743113744113745113746113747113748113749113750113751113752113753113754113755113756113757113758113759113760113761113762113763113764113765113766113767113768113769113770113771113772113773113774113775113776113777113778113779113780113781113782113783113784113785113786113787113788113789113790113791113792113793113794113795113796113797113798113799113800113801113802113803113804113805113806113807113808113809113810113811113812113813113814113815113816113817113818113819113820113821113822113823113824113825113826113827113828113829113830113831113832113833113834113835113836113837113838113839113840113841113842113843113844113845113846113847113848113849113850113851113852113853113854113855113856113857113858113859113860113861113862113863113864113865113866113867113868113869113870113871113872113873113874113875113876113877113878113879113880113881113882113883113884113885113886113887113888113889113890113891113892113893113894113895113896113897113898113899113900113901113902113903113904113905113906113907113908113909113910113911113912113913113914113915113916113917113918113919113920113921113922113923113924113925113926113927113928113929113930113931113932113933113934113935113936113937113938113939113940113941113942113943113944113945113946113947113948113949113950113951113952113953113954113955113956113957113958113959113960113961113962113963113964113965113966113967113968113969113970113971113972113973113974113975113976113977113978113979113980113981113982113983113984113985113986113987113988113989113990113991113992113993113994113995113996113997113998113999114000114001114002114003114004114005114006114007114008114009114010114011114012114013114014114015114016114017114018114019114020114021114022114023114024114025114026114027114028114029114030114031114032114033114034114035114036114037114038114039114040114041114042114043114044114045114046114047114048114049114050114051114052114053114054114055114056114057114058114059114060114061114062114063114064114065114066114067114068114069114070114071114072114073114074114075114076114077114078114079114080114081114082114083114084114085114086114087114088114089114090114091114092114093114094114095114096114097114098114099114100114101114102114103114104114105114106114107114108114109114110114111114112114113114114114115114116114117114118114119114120114121114122114123114124114125114126114127114128114129114130114131114132114133114134114135114136114137114138114139114140114141114142114143114144114145114146114147114148114149114150114151114152114153114154114155114156114157114158114159114160114161114162114163114164114165114166114167114168114169114170114171114172114173114174114175114176114177114178114179114180114181114182114183114184114185114186114187114188114189114190114191114192114193114194114195114196114197114198114199114200114201114202114203114204114205114206114207114208114209114210114211114212114213114214114215114216114217114218114219114220114221114222114223114224114225114226114227114228114229114230114231114232114233114234114235114236114237114238114239114240114241114242114243114244114245114246114247114248114249114250114251114252114253114254114255114256114257114258114259114260114261114262114263114264114265114266114267114268114269114270114271114272114273114274114275114276114277114278114279114280114281114282114283114284114285114286114287114288114289114290114291114292114293114294114295114296114297114298114299114300114301114302114303114304114305114306114307114308114309114310114311114312114313114314114315114316114317114318114319114320114321114322114323114324114325114326114327114328114329114330114331114332114333114334114335114336114337114338114339114340114341114342114343114344114345114346114347114348114349114350114351114352114353114354114355114356114357114358114359114360114361114362114363114364114365114366114367114368114369114370114371114372114373114374114375114376114377114378114379114380114381114382114383114384114385114386114387114388114389114390114391114392114393114394114395114396114397114398114399114400114401114402114403114404114405114406114407114408114409114410114411114412114413114414114415114416114417114418114419114420114421114422114423114424114425114426114427114428114429114430114431114432114433114434114435114436114437114438114439114440114441114442114443114444114445114446114447114448114449114450114451114452114453114454114455114456114457114458114459114460114461114462114463114464114465114466114467114468114469114470114471114472114473114474114475114476114477114478114479114480114481114482114483114484114485114486114487114488114489114490114491114492114493114494114495114496114497114498114499114500114501114502114503114504114505114506114507114508114509114510114511114512114513114514114515114516114517114518114519114520114521114522114523114524114525114526114527114528114529114530114531114532114533114534114535114536114537114538114539114540114541114542114543114544114545114546114547114548114549114550114551114552114553114554114555114556114557114558114559114560114561114562114563114564114565114566114567114568114569114570114571114572114573114574114575114576114577114578114579114580114581114582114583114584114585114586114587114588114589114590114591114592114593114594114595114596114597114598114599114600114601114602114603114604114605114606114607114608114609114610114611114612114613114614114615114616114617114618114619114620114621114622114623114624114625114626114627114628114629114630114631114632114633114634114635114636114637114638114639114640114641114642114643114644114645114646114647114648114649114650114651114652114653114654114655114656114657114658114659114660114661114662114663114664114665114666114667114668114669114670114671114672114673114674114675114676114677114678114679114680114681114682114683114684114685114686114687114688114689114690114691114692114693114694114695114696114697114698114699114700114701114702114703114704114705114706114707114708114709114710114711114712114713114714114715114716114717114718114719114720114721114722114723114724114725114726114727114728114729114730114731114732114733114734114735114736114737114738114739114740114741114742114743114744114745114746114747114748114749114750114751114752114753114754114755114756114757114758114759114760114761114762114763114764114765114766114767114768114769114770114771114772114773114774114775114776114777114778114779114780114781114782114783114784114785114786114787114788114789114790114791114792114793114794114795114796114797114798114799114800114801114802114803114804114805114806114807114808114809114810114811114812114813114814114815114816114817114818114819114820114821114822114823114824114825114826114827114828114829114830114831114832114833114834114835114836114837114838114839114840114841114842114843114844114845114846114847114848114849114850114851114852114853114854114855114856114857114858114859114860114861114862114863114864114865114866114867114868114869114870114871114872114873114874114875114876114877114878114879114880114881114882114883114884114885114886114887114888114889114890114891114892114893114894114895114896114897114898114899114900114901114902114903114904114905114906114907114908114909114910114911114912114913114914114915114916114917114918114919114920114921114922114923114924114925114926114927114928114929114930114931114932114933114934114935114936114937114938114939114940114941114942114943114944114945114946114947114948114949114950114951114952114953114954114955114956114957114958114959114960114961114962114963114964114965114966114967114968114969114970114971114972114973114974114975114976114977114978114979114980114981114982114983114984114985114986114987114988114989114990114991114992114993114994114995114996114997114998114999115000115001115002115003115004115005115006115007115008115009115010115011115012115013115014115015115016115017115018115019115020115021115022115023115024115025115026115027115028115029115030115031115032115033115034115035115036115037115038115039115040115041115042115043115044115045115046115047115048115049115050115051115052115053115054115055115056115057115058115059115060115061115062115063115064115065115066115067115068115069115070115071115072115073115074115075115076115077115078115079115080115081115082115083115084115085115086115087115088115089115090115091115092115093115094115095115096115097115098115099115100115101115102115103115104115105115106115107115108115109115110115111115112115113115114115115115116115117115118115119115120115121115122115123115124115125115126115127115128115129115130115131115132115133115134115135115136115137115138115139115140115141115142115143115144115145115146115147115148115149115150115151115152115153115154115155115156115157115158115159115160115161115162115163115164115165115166115167115168115169115170115171115172115173115174115175115176115177115178115179115180115181115182115183115184115185115186115187115188115189115190115191115192115193115194115195115196115197115198115199115200115201115202115203115204115205115206115207115208115209115210115211115212115213115214115215115216115217115218115219115220115221115222115223115224115225115226115227115228115229115230115231115232115233115234115235115236115237115238115239115240115241115242115243115244115245115246115247115248115249115250115251115252115253115254115255115256115257115258115259115260115261115262115263115264115265115266115267115268115269115270115271115272115273115274115275115276115277115278115279115280115281115282115283115284115285115286115287115288115289115290115291115292115293115294115295115296115297115298115299115300115301115302115303115304115305115306115307115308115309115310115311115312115313115314115315115316115317115318115319115320115321115322115323115324115325115326115327115328115329115330115331115332115333115334115335115336115337115338115339115340115341115342115343115344115345115346115347115348115349115350115351115352115353115354115355115356115357115358115359115360115361115362115363115364115365115366115367115368115369115370115371115372115373115374115375115376115377115378115379115380115381115382115383115384115385115386115387115388115389115390115391115392115393115394115395115396115397115398115399115400115401115402115403115404115405115406115407115408115409115410115411115412115413115414115415115416115417115418115419115420115421115422115423115424115425115426115427115428115429115430115431115432115433115434115435115436115437115438115439115440115441115442115443115444115445115446115447115448115449115450115451115452115453115454115455115456115457115458115459115460115461115462115463115464115465115466115467115468115469115470115471115472115473115474115475115476115477115478115479115480115481115482115483115484115485115486115487115488115489115490115491115492115493115494115495115496115497115498115499115500115501115502115503115504115505115506115507115508115509115510115511115512115513115514115515115516115517115518115519115520115521115522115523115524115525115526115527115528115529115530115531115532115533115534115535115536115537115538115539115540115541115542115543115544115545115546115547115548115549115550115551115552115553115554115555115556115557115558115559115560115561115562115563115564115565115566115567115568115569115570115571115572115573115574115575115576115577115578115579115580115581115582115583115584115585115586115587115588115589115590115591115592115593115594115595115596115597115598115599115600115601115602115603115604115605115606115607115608115609115610115611115612115613115614115615115616115617115618115619115620115621115622115623115624115625115626115627115628115629115630115631115632115633115634115635115636115637115638115639115640115641115642115643115644115645115646115647115648115649115650115651115652115653115654115655115656115657115658115659115660115661115662115663115664115665115666115667115668115669115670115671115672115673115674115675115676115677115678115679115680115681115682115683115684115685115686115687115688115689115690115691115692115693115694115695115696115697115698115699115700115701115702115703115704115705115706115707115708115709115710115711115712115713115714115715115716115717115718115719115720115721115722115723115724115725115726115727115728115729115730115731115732115733115734115735115736115737115738115739115740115741115742115743115744115745115746115747115748115749115750115751115752115753115754115755115756115757115758115759115760115761115762115763115764115765115766115767115768115769115770115771115772115773115774115775115776115777115778115779115780115781115782115783115784115785115786115787115788115789115790115791115792115793115794115795115796115797115798115799115800115801115802115803115804115805115806115807115808115809115810115811115812115813115814115815115816115817115818115819115820115821115822115823115824115825115826115827115828115829115830115831115832115833115834115835115836115837115838115839115840115841115842115843115844115845115846115847115848115849115850115851115852115853115854115855115856115857115858115859115860115861115862115863115864115865115866115867115868115869115870115871115872115873115874115875115876115877115878115879115880115881115882115883115884115885115886115887115888115889115890115891115892115893115894115895115896115897115898115899115900115901115902115903115904115905115906115907115908115909115910115911115912115913115914115915115916115917115918115919115920115921115922115923115924115925115926115927115928115929115930115931115932115933115934115935115936115937115938115939115940115941115942115943115944115945115946115947115948115949115950115951115952115953115954115955115956115957115958115959115960115961115962115963115964115965115966115967115968115969115970115971115972115973115974115975115976115977115978115979115980115981115982115983115984115985115986115987115988115989115990115991115992115993115994115995115996115997115998115999116000116001116002116003116004116005116006116007116008116009116010116011116012116013116014116015116016116017116018116019116020116021116022116023116024116025116026116027116028116029116030116031116032116033116034116035116036116037116038116039116040116041116042116043116044116045116046116047116048116049116050116051116052116053116054116055116056116057116058116059116060116061116062116063116064116065116066116067116068116069116070116071116072116073116074116075116076116077116078116079116080116081116082116083116084116085116086116087116088116089116090116091116092116093116094116095116096116097116098116099116100116101116102116103116104116105116106116107116108116109116110116111116112116113116114116115116116116117116118116119116120116121116122116123116124116125116126116127116128116129116130116131116132116133116134116135116136116137116138116139116140116141116142116143116144116145116146116147116148116149116150116151116152116153116154116155116156116157116158116159116160116161116162116163116164116165116166116167116168116169116170116171116172116173116174116175116176116177116178116179116180116181116182116183116184116185116186116187116188116189116190116191116192116193116194116195116196116197116198116199116200116201116202116203116204116205116206116207116208116209116210116211116212116213116214116215116216116217116218116219116220116221116222116223116224116225116226116227116228116229116230116231116232116233116234116235116236116237116238116239116240116241116242116243116244116245116246116247116248116249116250116251116252116253116254116255116256116257116258116259116260116261116262116263116264116265116266116267116268116269116270116271116272116273116274116275116276116277116278116279116280116281116282116283116284116285116286116287116288116289116290116291116292116293116294116295116296116297116298116299116300116301116302116303116304116305116306116307116308116309116310116311116312116313116314116315116316116317116318116319116320116321116322116323116324116325116326116327116328116329116330116331116332116333116334116335116336116337116338116339116340116341116342116343116344116345116346116347116348116349116350116351116352116353116354116355116356116357116358116359116360116361116362116363116364116365116366116367116368116369116370116371116372116373116374116375116376116377116378116379116380116381116382116383116384116385116386116387116388116389116390116391116392116393116394116395116396116397116398116399116400116401116402116403116404116405116406116407116408116409116410116411116412116413116414116415116416116417116418116419116420116421116422116423116424116425116426116427116428116429116430116431116432116433116434116435116436116437116438116439116440116441116442116443116444116445116446116447116448116449116450116451116452116453116454116455116456116457116458116459116460116461116462116463116464116465116466116467116468116469116470116471116472116473116474116475116476116477116478116479116480116481116482116483116484116485116486116487116488116489116490116491116492116493116494116495116496116497116498116499116500116501116502116503116504116505116506116507116508116509116510116511116512116513116514116515116516116517116518116519116520116521116522116523116524116525116526116527116528116529116530116531116532116533116534116535116536116537116538116539116540116541116542116543116544116545116546116547116548116549116550116551116552116553116554116555116556116557116558116559116560116561116562116563116564116565116566116567116568116569116570116571116572116573116574116575116576116577116578116579116580116581116582116583116584116585116586116587116588116589116590116591116592116593116594116595116596116597116598116599116600116601116602116603116604116605116606116607116608116609116610116611116612116613116614116615116616116617116618116619116620116621116622116623116624116625116626116627116628116629116630116631116632116633116634116635116636116637116638116639116640116641116642116643116644116645116646116647116648116649116650116651116652116653116654116655116656116657116658116659116660116661116662116663116664116665116666116667116668116669116670116671116672116673116674116675116676116677116678116679116680116681116682116683116684116685116686116687116688116689116690116691116692116693116694116695116696116697116698116699116700116701116702116703116704116705116706116707116708116709116710116711116712116713116714116715116716116717116718116719116720116721116722116723116724116725116726116727116728116729116730116731116732116733116734116735116736116737116738116739116740116741116742116743116744116745116746116747116748116749116750116751116752116753116754116755116756116757116758116759116760116761116762116763116764116765116766116767116768116769116770116771116772116773116774116775116776116777116778116779116780116781116782116783116784116785116786116787116788116789116790116791116792116793116794116795116796116797116798116799116800116801116802116803116804116805116806116807116808116809116810116811116812116813116814116815116816116817116818116819116820116821116822116823116824116825116826116827116828116829116830116831116832116833116834116835116836116837116838116839116840116841116842116843116844116845116846116847116848116849116850116851116852116853116854116855116856116857116858116859116860116861116862116863116864116865116866116867116868116869116870116871116872116873116874116875116876116877116878116879116880116881116882116883116884116885116886116887116888116889116890116891116892116893116894116895116896116897116898116899116900116901116902116903116904116905116906116907116908116909116910116911116912116913116914116915116916116917116918116919116920116921116922116923116924116925116926116927116928116929116930116931116932116933116934116935116936116937116938116939116940116941116942116943116944116945116946116947116948116949116950116951116952116953116954116955116956116957116958116959116960116961116962116963116964116965116966116967116968116969116970116971116972116973116974116975116976116977116978116979116980116981116982116983116984116985116986116987116988116989116990116991116992116993116994116995116996116997116998116999117000117001117002117003117004117005117006117007117008117009117010117011117012117013117014117015117016117017117018117019117020117021117022117023117024117025117026117027117028117029117030117031117032117033117034117035117036117037117038117039117040117041117042117043117044117045117046117047117048117049117050117051117052117053117054117055117056117057117058117059117060117061117062117063117064117065117066117067117068117069117070117071117072117073117074117075117076117077117078117079117080117081117082117083117084117085117086117087117088117089117090117091117092117093117094117095117096117097117098117099117100117101117102117103117104117105117106117107117108117109117110117111117112117113117114117115117116117117117118117119117120117121117122117123117124117125117126117127117128117129117130117131117132117133117134117135117136117137117138117139117140117141117142117143117144117145117146117147117148117149117150117151117152117153117154117155117156117157117158117159117160117161117162117163117164117165117166117167117168117169117170117171117172117173117174117175117176117177117178117179117180117181117182117183117184117185117186117187117188117189117190117191117192117193117194117195117196117197117198117199117200117201117202117203117204117205117206117207117208117209117210117211117212117213117214117215117216117217117218117219117220117221117222117223117224117225117226117227117228117229117230117231117232117233117234117235117236117237117238117239117240117241117242117243117244117245117246117247117248117249117250117251117252117253117254117255117256117257117258117259117260117261117262117263117264117265117266117267117268117269117270117271117272117273117274117275117276117277117278117279117280117281117282117283117284117285117286117287117288117289117290117291117292117293117294117295117296117297117298117299117300117301117302117303117304117305117306117307117308117309117310117311117312117313117314117315117316117317117318117319117320117321117322117323117324117325117326117327117328117329117330117331117332117333117334117335117336117337117338117339117340117341117342117343117344117345117346117347117348117349117350117351117352117353117354117355117356117357117358117359117360117361117362117363117364117365117366117367117368117369117370117371117372117373117374117375117376117377117378117379117380117381117382117383117384117385117386117387117388117389117390117391117392117393117394117395117396117397117398117399117400117401117402117403117404117405117406117407117408117409117410117411117412117413117414117415117416117417117418117419117420117421117422117423117424117425117426117427117428117429117430117431117432117433117434117435117436117437117438117439117440117441117442117443117444117445117446117447117448117449117450117451117452117453117454117455117456117457117458117459117460117461117462117463117464117465117466117467117468117469117470117471117472117473117474117475117476117477117478117479117480117481117482117483117484117485117486117487117488117489117490117491117492117493117494117495117496117497117498117499117500117501117502117503117504117505117506117507117508117509117510117511117512117513117514117515117516117517117518117519117520117521117522117523117524117525117526117527117528117529117530117531117532117533117534117535117536117537117538117539117540117541117542117543117544117545117546117547117548117549117550117551117552117553117554117555117556117557117558117559117560117561117562117563117564117565117566117567117568117569117570117571117572117573117574117575117576117577117578117579117580117581117582117583117584117585117586117587117588117589117590117591117592117593117594117595117596117597117598117599117600117601117602117603117604117605117606117607117608117609117610117611117612117613117614117615117616117617117618117619117620117621117622117623117624117625117626117627117628117629117630117631117632117633117634117635117636117637117638117639117640117641117642117643117644117645117646117647117648117649117650117651117652117653117654117655117656117657117658117659117660117661117662117663117664117665117666117667117668117669117670117671117672117673117674117675117676117677117678117679117680117681117682117683117684117685117686117687117688117689117690117691117692117693117694117695117696117697117698117699117700117701117702117703117704117705117706117707117708117709117710117711117712117713117714117715117716117717117718117719117720117721117722117723117724117725117726117727117728117729117730117731117732117733117734117735117736117737117738117739117740117741117742117743117744117745117746117747117748117749117750117751117752117753117754117755117756117757117758117759117760117761117762117763117764117765117766117767117768117769117770117771117772117773117774117775117776117777117778117779117780117781117782117783117784117785117786117787117788117789117790117791117792117793117794117795117796117797117798117799117800117801117802117803117804117805117806117807117808117809117810117811117812117813117814117815117816117817117818117819117820117821117822117823117824117825117826117827117828117829117830117831117832117833117834117835117836117837117838117839117840117841117842117843117844117845117846117847117848117849117850117851117852117853117854117855117856117857117858117859117860117861117862117863117864117865117866117867117868117869117870117871117872117873117874117875117876117877117878117879117880117881117882117883117884117885117886117887117888117889117890117891117892117893117894117895117896117897117898117899117900117901117902117903117904117905117906117907117908117909117910117911117912117913117914117915117916117917117918117919117920117921117922117923117924117925117926117927117928117929117930117931117932117933117934117935117936117937117938117939117940117941117942117943117944117945117946117947117948117949117950117951117952117953117954117955117956117957117958117959117960117961117962117963117964117965117966117967117968117969117970117971117972117973117974117975117976117977117978117979117980117981117982117983117984117985117986117987117988117989117990117991117992117993117994117995117996117997117998117999118000118001118002118003118004118005118006118007118008118009118010118011118012118013118014118015118016118017118018118019118020118021118022118023118024118025118026118027118028118029118030118031118032118033118034118035118036118037118038118039118040118041118042118043118044118045118046118047118048118049118050118051118052118053118054118055118056118057118058118059118060118061118062118063118064118065118066118067118068118069118070118071118072118073118074118075118076118077118078118079118080118081118082118083118084118085118086118087118088118089118090118091118092118093118094118095118096118097118098118099118100118101118102118103118104118105118106118107118108118109118110118111118112118113118114118115118116118117118118118119118120118121118122118123118124118125118126118127118128118129118130118131118132118133118134118135118136118137118138118139118140118141118142118143118144118145118146118147118148118149118150118151118152118153118154118155118156118157118158118159118160118161118162118163118164118165118166118167118168118169118170118171118172118173118174118175118176118177118178118179118180118181118182118183118184118185118186118187118188118189118190118191118192118193118194118195118196118197118198118199118200118201118202118203118204118205118206118207118208118209118210118211118212118213118214118215118216118217118218118219118220118221118222118223118224118225118226118227118228118229118230118231118232118233118234118235118236118237118238118239118240118241118242118243118244118245118246118247118248118249118250118251118252118253118254118255118256118257118258118259118260118261118262118263118264118265118266118267118268118269118270118271118272118273118274118275118276118277118278118279118280118281118282118283118284118285118286118287118288118289118290118291118292118293118294118295118296118297118298118299118300118301118302118303118304118305118306118307118308118309118310118311118312118313118314118315118316118317118318118319118320118321118322118323118324118325118326118327118328118329118330118331118332118333118334118335118336118337118338118339118340118341118342118343118344118345118346118347118348118349118350118351118352118353118354118355118356118357118358118359118360118361118362118363118364118365118366118367118368118369118370118371118372118373118374118375118376118377118378118379118380118381118382118383118384118385118386118387118388118389118390118391118392118393118394118395118396118397118398118399118400118401118402118403118404118405118406118407118408118409118410118411118412118413118414118415118416118417118418118419118420118421118422118423118424118425118426118427118428118429118430118431118432118433118434118435118436118437118438118439118440118441118442118443118444118445118446118447118448118449118450118451118452118453118454118455118456118457118458118459118460118461118462118463118464118465118466118467118468118469118470118471118472118473118474118475118476118477118478118479118480118481118482118483118484118485118486118487118488118489118490118491118492118493118494118495118496118497118498118499118500118501118502118503118504118505118506118507118508118509118510118511118512118513118514118515118516118517118518118519118520118521118522118523118524118525118526118527118528118529118530118531118532118533118534118535118536118537118538118539118540118541118542118543118544118545118546118547118548118549118550118551118552118553118554118555118556118557118558118559118560118561118562118563118564118565118566118567118568118569118570118571118572118573118574118575118576118577118578118579118580118581118582118583118584118585118586118587118588118589118590118591118592118593118594118595118596118597118598118599118600118601118602118603118604118605118606118607118608118609118610118611118612118613118614118615118616118617118618118619118620118621118622118623118624118625118626118627118628118629118630118631118632118633118634118635118636118637118638118639118640118641118642118643118644118645118646118647118648118649118650118651118652118653118654118655118656118657118658118659118660118661118662118663118664118665118666118667118668118669118670118671118672118673118674118675118676118677118678118679118680118681118682118683118684118685118686118687118688118689118690118691118692118693118694118695118696118697118698118699118700118701118702118703118704118705118706118707118708118709118710118711118712118713118714118715118716118717118718118719118720118721118722118723118724118725118726118727118728118729118730118731118732118733118734118735118736118737118738118739118740118741118742118743118744118745118746118747118748118749118750118751118752118753118754118755118756118757118758118759118760118761118762118763118764118765118766118767118768118769118770118771118772118773118774118775118776118777118778118779118780118781118782118783118784118785118786118787118788118789118790118791118792118793118794118795118796118797118798118799118800118801118802118803118804118805118806118807118808118809118810118811118812118813118814118815118816118817118818118819118820118821118822118823118824118825118826118827118828118829118830118831118832118833118834118835118836118837118838118839118840118841118842118843118844118845118846118847118848118849118850118851118852118853118854118855118856118857118858118859118860118861118862118863118864118865118866118867118868118869118870118871118872118873118874118875118876118877118878118879118880118881118882118883118884118885118886118887118888118889118890118891118892118893118894118895118896118897118898118899118900118901118902118903118904118905118906118907118908118909118910118911118912118913118914118915118916118917118918118919118920118921118922118923118924118925118926118927118928118929118930118931118932118933118934118935118936118937118938118939118940118941118942118943118944118945118946118947118948118949118950118951118952118953118954118955118956118957118958118959118960118961118962118963118964118965118966118967118968118969118970118971118972118973118974118975118976118977118978118979118980118981118982118983118984118985118986118987118988118989118990118991118992118993118994118995118996118997118998118999119000119001119002119003119004119005119006119007119008119009119010119011119012119013119014119015119016119017119018119019119020119021119022119023119024119025119026119027119028119029119030119031119032119033119034119035119036119037119038119039119040119041119042119043119044119045119046119047119048119049119050119051119052119053119054119055119056119057119058119059119060119061119062119063119064119065119066119067119068119069119070119071119072119073119074119075119076119077119078119079119080119081119082119083119084119085119086119087119088119089119090119091119092119093119094119095119096119097119098119099119100119101119102119103119104119105119106119107119108119109119110119111119112119113119114119115119116119117119118119119119120119121119122119123119124119125119126119127119128119129119130119131119132119133119134119135119136119137119138119139119140119141119142119143119144119145119146119147119148119149119150119151119152119153119154119155119156119157119158119159119160119161119162119163119164119165119166119167119168119169119170119171119172119173119174119175119176119177119178119179119180119181119182119183119184119185119186119187119188119189119190119191119192119193119194119195119196119197119198119199119200119201119202119203119204119205119206119207119208119209119210119211119212119213119214119215119216119217119218119219119220119221119222119223119224119225119226119227119228119229119230119231119232119233119234119235119236119237119238119239119240119241119242119243119244119245119246119247119248119249119250119251119252119253119254119255119256119257119258119259119260119261119262119263119264119265119266119267119268119269119270119271119272119273119274119275119276119277119278119279119280119281119282119283119284119285119286119287119288119289119290119291119292119293119294119295119296119297119298119299119300119301119302119303119304119305119306119307119308119309119310119311119312119313119314119315119316119317119318119319119320119321119322119323119324119325119326119327119328119329119330119331119332119333119334119335119336119337119338119339119340119341119342119343119344119345119346119347119348119349119350119351119352119353119354119355119356119357119358119359119360119361119362119363119364119365119366119367119368119369119370119371119372119373119374119375119376119377119378119379119380119381119382119383119384119385119386119387119388119389119390119391119392119393119394119395119396119397119398119399119400119401119402119403119404119405119406119407119408119409119410119411119412119413119414119415119416119417119418119419119420119421119422119423119424119425119426119427119428119429119430119431119432119433119434119435119436119437119438119439119440119441119442119443119444119445119446119447119448119449119450119451119452119453119454119455119456119457119458119459119460119461119462119463119464119465119466119467119468119469119470119471119472119473119474119475119476119477119478119479119480119481119482119483119484119485119486119487119488119489119490119491119492119493119494119495119496119497119498119499119500119501119502119503119504119505119506119507119508119509119510119511119512119513119514119515119516119517119518119519119520119521119522119523119524119525119526119527119528119529119530119531119532119533119534119535119536119537119538119539119540119541119542119543119544119545119546119547119548119549119550119551119552119553119554119555119556119557119558119559119560119561119562119563119564119565119566119567119568119569119570119571119572119573119574119575119576119577119578119579119580119581119582119583119584119585119586119587119588119589119590119591119592119593119594119595119596119597119598119599119600119601119602119603119604119605119606119607119608119609119610119611119612119613119614119615119616119617119618119619119620119621119622119623119624119625119626119627119628119629119630119631119632119633119634119635119636119637119638119639119640119641119642119643119644119645119646119647119648119649119650119651119652119653119654119655119656119657119658119659119660119661119662119663119664119665119666119667119668119669119670119671119672119673119674119675119676119677119678119679119680119681119682119683119684119685119686119687119688119689119690119691119692119693119694119695119696119697119698119699119700119701119702119703119704119705119706119707119708119709119710119711119712119713119714119715119716119717119718119719119720119721119722119723119724119725119726119727119728119729119730119731119732119733119734119735119736119737119738119739119740119741119742119743119744119745119746119747119748119749119750119751119752119753119754119755119756119757119758119759119760119761119762119763119764119765119766119767119768119769119770119771119772119773119774119775119776119777119778119779119780119781119782119783119784119785119786119787119788119789119790119791119792119793119794119795119796119797119798119799119800119801119802119803119804119805119806119807119808119809119810119811119812119813119814119815119816119817119818119819119820119821119822119823119824119825119826119827119828119829119830119831119832119833119834119835119836119837119838119839119840119841119842119843119844119845119846119847119848119849119850119851119852119853119854119855119856119857119858119859119860119861119862119863119864119865119866119867119868119869119870119871119872119873119874119875119876119877119878119879119880119881119882119883119884119885119886119887119888119889119890119891119892119893119894119895119896119897119898119899119900119901119902119903119904119905119906119907119908119909119910119911119912119913119914119915119916119917119918119919119920119921119922119923119924119925119926119927119928119929119930119931119932119933119934119935119936119937119938119939119940119941119942119943119944119945119946119947119948119949119950119951119952119953119954119955119956119957119958119959119960119961119962119963119964119965119966119967119968119969119970119971119972119973119974119975119976119977119978119979119980119981119982119983119984119985119986119987119988119989119990119991119992119993119994119995119996119997119998119999120000120001120002120003120004120005120006120007120008120009120010120011120012120013120014120015120016120017120018120019120020120021120022120023120024120025120026120027120028120029120030120031120032120033120034120035120036120037120038120039120040120041120042120043120044120045120046120047120048120049120050120051120052120053120054120055120056120057120058120059120060120061120062120063120064120065120066120067120068120069120070120071120072120073120074120075120076120077120078120079120080120081120082120083120084120085120086120087120088120089120090120091120092120093120094120095120096120097120098120099120100120101120102120103120104120105120106120107120108120109120110120111120112120113120114120115120116120117120118120119120120120121120122120123120124120125120126120127120128120129120130120131120132120133120134120135120136120137120138120139120140120141120142120143120144120145120146120147120148120149120150120151120152120153120154120155120156120157120158120159120160120161120162120163120164120165120166120167120168120169120170120171120172120173120174120175120176120177120178120179120180120181120182120183120184120185120186120187120188120189120190120191120192120193120194120195120196120197120198120199120200120201120202120203120204120205120206120207120208120209120210120211120212120213120214120215120216120217120218120219120220120221120222120223120224120225120226120227120228120229120230120231120232120233120234120235120236120237120238120239120240120241120242120243120244120245120246120247120248120249120250120251120252120253120254120255120256120257120258120259120260120261120262120263120264120265120266120267120268120269120270120271120272120273120274120275120276120277120278120279120280120281120282120283120284120285120286120287120288120289120290120291120292120293120294120295120296120297120298120299120300120301120302120303120304120305120306120307120308120309120310120311120312120313120314120315120316120317120318120319120320120321120322120323120324120325120326120327120328120329120330120331120332120333120334120335120336120337120338120339120340120341120342120343120344120345120346120347120348120349120350120351120352120353120354120355120356120357120358120359120360120361120362120363120364120365120366120367120368120369120370120371120372120373120374120375120376120377120378120379120380120381120382120383120384120385120386120387120388120389120390120391120392120393120394120395120396120397120398120399120400120401120402120403120404120405120406120407120408120409120410120411120412120413120414120415120416120417120418120419120420120421120422120423120424120425120426120427120428120429120430120431120432120433120434120435120436120437120438120439120440120441120442120443120444120445120446120447120448120449120450120451120452120453120454120455120456120457120458120459120460120461120462120463120464120465120466120467120468120469120470120471120472120473120474120475120476120477120478120479120480120481120482120483120484120485120486120487120488120489120490120491120492120493120494120495120496120497120498120499120500120501120502120503120504120505120506120507120508120509120510120511120512120513120514120515120516120517120518120519120520120521120522120523120524120525120526120527120528120529120530120531120532120533120534120535120536120537120538120539120540120541120542120543120544120545120546120547120548120549120550120551120552120553120554120555120556120557120558120559120560120561120562120563120564120565120566120567120568120569120570120571120572120573120574120575120576120577120578120579120580120581120582120583120584120585120586120587120588120589120590120591120592120593120594120595120596120597120598120599120600120601120602120603120604120605120606120607120608120609120610120611120612120613120614120615120616120617120618120619120620120621120622120623120624120625120626120627120628120629120630120631120632120633120634120635120636120637120638120639120640120641120642120643120644120645120646120647120648120649120650120651120652120653120654120655120656120657120658120659120660120661120662120663120664120665120666120667120668120669120670120671120672120673120674120675120676120677120678120679120680120681120682120683120684120685120686120687120688120689120690120691120692120693120694120695120696120697120698120699120700120701120702120703120704120705120706120707120708120709120710120711120712120713120714120715120716120717120718120719120720120721120722120723120724120725120726120727120728120729120730120731120732120733120734120735120736120737120738120739120740120741120742120743120744120745120746120747120748120749120750120751120752120753120754120755120756120757120758120759120760120761120762120763120764120765120766120767120768120769120770120771120772120773120774120775120776120777120778120779120780120781120782120783120784120785120786120787120788120789120790120791120792120793120794120795120796120797120798120799120800120801120802120803120804120805120806120807120808120809120810120811120812120813120814120815120816120817120818120819120820120821120822120823120824120825120826120827120828120829120830120831120832120833120834120835120836120837120838120839120840120841120842120843120844120845120846120847120848120849120850120851120852120853120854120855120856120857120858120859120860120861120862120863120864120865120866120867120868120869120870120871120872120873120874120875120876120877120878120879120880120881120882120883120884120885120886120887120888120889120890120891120892120893120894120895120896120897120898120899120900120901120902120903120904120905120906120907120908120909120910120911120912120913120914120915120916120917120918120919120920120921120922120923120924120925120926120927120928120929120930120931120932120933120934120935120936120937120938120939120940120941120942120943120944120945120946120947120948120949120950120951120952120953120954120955120956120957120958120959120960120961120962120963120964120965120966120967120968120969120970120971120972120973120974120975120976120977120978120979120980120981120982120983120984120985120986120987120988120989120990120991120992120993120994120995120996120997120998120999121000121001121002121003121004121005121006121007121008121009121010121011121012121013121014121015121016121017121018121019121020121021121022121023121024121025121026121027121028121029121030121031121032121033121034121035121036121037121038121039121040121041121042121043121044121045121046121047121048121049121050121051121052121053121054121055121056121057121058121059121060121061121062121063121064121065121066121067121068121069121070121071121072121073121074121075121076121077121078121079121080121081121082121083121084121085121086121087121088121089121090121091121092121093121094121095121096121097121098121099121100121101121102121103121104121105121106121107121108121109121110121111121112121113121114121115121116121117121118121119121120121121121122121123121124121125121126121127121128121129121130121131121132121133121134121135121136121137121138121139121140121141121142121143121144121145121146121147121148121149121150121151121152121153121154121155121156121157121158121159121160121161121162121163121164121165121166121167121168121169121170121171121172121173121174121175121176121177121178121179121180121181121182121183121184121185121186121187121188121189121190121191121192121193121194121195121196121197121198121199121200121201121202121203121204121205121206121207121208121209121210121211121212121213121214121215121216121217121218121219121220121221121222121223121224121225121226121227121228121229121230121231121232121233121234121235121236121237121238121239121240121241121242121243121244121245121246121247121248121249121250121251121252121253121254121255121256121257121258121259121260121261121262121263121264121265121266121267121268121269121270121271121272121273121274121275121276121277121278121279121280121281121282121283121284121285121286121287121288121289121290121291121292121293121294121295121296121297121298121299121300121301121302121303121304121305121306121307121308121309121310121311121312121313121314121315121316121317121318121319121320121321121322121323121324121325121326121327121328121329121330121331121332121333121334121335121336121337121338121339121340121341121342121343121344121345121346121347121348121349121350121351121352121353121354121355121356121357121358121359121360121361121362121363121364121365121366121367121368121369121370121371121372121373121374121375121376121377121378121379121380121381121382121383121384121385121386121387121388121389121390121391121392121393121394121395121396121397121398121399121400121401121402121403121404121405121406121407121408121409121410121411121412121413121414121415121416121417121418121419121420121421121422121423121424121425121426121427121428121429121430121431121432121433121434121435121436121437121438121439121440121441121442121443121444121445121446121447121448121449121450121451121452121453121454121455121456121457121458121459121460121461121462121463121464121465121466121467121468121469121470121471121472121473121474121475121476121477121478121479121480121481121482121483121484121485121486121487121488121489121490121491121492121493121494121495121496121497121498121499121500121501121502121503121504121505121506121507121508121509121510121511121512121513121514121515121516121517121518121519121520121521121522121523121524121525121526121527121528121529121530121531121532121533121534121535121536121537121538121539121540121541121542121543121544121545121546121547121548121549121550121551121552121553121554121555121556121557121558121559121560121561121562121563121564121565121566121567121568121569121570121571121572121573121574121575121576121577121578121579121580121581121582121583121584121585121586121587121588121589121590121591121592121593121594121595121596121597121598121599121600121601121602121603121604121605121606121607121608121609121610121611121612121613121614121615121616121617121618121619121620121621121622121623121624121625121626121627121628121629121630121631121632121633121634121635121636121637121638121639121640121641121642121643121644121645121646121647121648121649121650121651121652121653121654121655121656121657121658121659121660121661121662121663121664121665121666121667121668121669121670121671121672121673121674121675121676121677121678121679121680121681121682121683121684121685121686121687121688121689121690121691121692121693121694121695121696121697121698121699121700121701121702121703121704121705121706121707121708121709121710121711121712121713121714121715121716121717121718121719121720121721121722121723121724121725121726121727121728121729121730121731121732121733121734121735121736121737121738121739121740121741121742121743121744121745121746121747121748121749121750121751121752121753121754121755121756121757121758121759121760121761121762121763121764121765121766121767121768121769121770121771121772121773121774121775121776121777121778121779121780121781121782121783121784121785121786121787121788121789121790121791121792121793121794121795121796121797121798121799121800121801121802121803121804121805121806121807121808121809121810121811121812121813121814121815121816121817121818121819121820121821121822121823121824121825121826121827121828121829121830121831121832121833121834121835121836121837121838121839121840121841121842121843121844121845121846121847121848121849121850121851121852121853121854121855121856121857121858121859121860121861121862121863121864121865121866121867121868121869121870121871121872121873121874121875121876121877121878121879121880121881121882121883121884121885121886121887121888121889121890121891121892121893121894121895121896121897121898121899121900121901121902121903121904121905121906121907121908121909121910121911121912121913121914121915121916121917121918121919121920121921121922121923121924121925121926121927121928121929121930121931121932121933121934121935121936121937121938121939121940121941121942121943121944121945121946121947121948121949121950121951121952121953121954121955121956121957121958121959121960121961121962121963121964121965121966121967121968121969121970121971121972121973121974121975121976121977121978121979121980121981121982121983121984121985121986121987121988121989121990121991121992121993121994121995121996121997121998121999122000122001122002122003122004122005122006122007122008122009122010122011122012122013122014122015122016122017122018122019122020122021122022122023122024122025122026122027122028122029122030122031122032122033122034122035122036122037122038122039122040122041122042122043122044122045122046122047122048122049122050122051122052122053122054122055122056122057122058122059122060122061122062122063122064122065122066122067122068122069122070122071122072122073122074122075122076122077122078122079122080122081122082122083122084122085122086122087122088122089122090122091122092122093122094122095122096122097122098122099122100122101122102122103122104122105122106122107122108122109122110122111122112122113122114122115122116122117122118122119122120122121122122122123122124122125122126122127122128122129122130122131122132122133122134122135122136122137122138122139122140122141122142122143122144122145122146122147122148122149122150122151122152122153122154122155122156122157122158122159122160122161122162122163122164122165122166122167122168122169122170122171122172122173122174122175122176122177122178122179122180122181122182122183122184122185122186122187122188122189122190122191122192122193122194122195122196122197122198122199122200122201122202122203122204122205122206122207122208122209122210122211122212122213122214122215122216122217122218122219122220122221122222122223122224122225122226122227122228122229122230122231122232122233122234122235122236122237122238122239122240122241122242122243122244122245122246122247122248122249122250122251122252122253122254122255122256122257122258122259122260122261122262122263122264122265122266122267122268122269122270122271122272122273122274122275122276122277122278122279122280122281122282122283122284122285122286122287122288122289122290122291122292122293122294122295122296122297122298122299122300122301122302122303122304122305122306122307122308122309122310122311122312122313122314122315122316122317122318122319122320122321122322122323122324122325122326122327122328122329122330122331122332122333122334122335122336122337122338122339122340122341122342122343122344122345122346122347122348122349122350122351122352122353122354122355122356122357122358122359122360122361122362122363122364122365122366122367122368122369122370122371122372122373122374122375122376122377122378122379122380122381122382122383122384122385122386122387122388122389122390122391122392122393122394122395122396122397122398122399122400122401122402122403122404122405122406122407122408122409122410122411122412122413122414122415122416122417122418122419122420122421122422122423122424122425122426122427122428122429122430122431122432122433122434122435122436122437122438122439122440122441122442122443122444122445122446122447122448122449122450122451122452122453122454122455122456122457122458122459122460122461122462122463122464122465122466122467122468122469122470122471122472122473122474122475122476122477122478122479122480122481122482122483122484122485122486122487122488122489122490122491122492122493122494122495122496122497122498122499122500122501122502122503122504122505122506122507122508122509122510122511122512122513122514122515122516122517122518122519122520122521122522122523122524122525122526122527122528122529122530122531122532122533122534122535122536122537122538122539122540122541122542122543122544122545122546122547122548122549122550122551122552122553122554122555122556122557122558122559122560122561122562122563122564122565122566122567122568122569122570122571122572122573122574122575122576122577122578122579122580122581122582122583122584122585122586122587122588122589122590122591122592122593122594122595122596122597122598122599122600122601122602122603122604122605122606122607122608122609122610122611122612122613122614122615122616122617122618122619122620122621122622122623122624122625122626122627122628122629122630122631122632122633122634122635122636122637122638122639122640122641122642122643122644122645122646122647122648122649122650122651122652122653122654122655122656122657122658122659122660122661122662122663122664122665122666122667122668122669122670122671122672122673122674122675122676122677122678122679122680122681122682122683122684122685122686122687122688122689122690122691122692122693122694122695122696122697122698122699122700122701122702122703122704122705122706122707122708122709122710122711122712122713122714122715122716122717122718122719122720122721122722122723122724122725122726122727122728122729122730122731122732122733122734122735122736122737122738122739122740122741122742122743122744122745122746122747122748122749122750122751122752122753122754122755122756122757122758122759122760122761122762122763122764122765122766122767122768122769122770122771122772122773122774122775122776122777122778122779122780122781122782122783122784122785122786122787122788122789122790122791122792122793122794122795122796122797122798122799122800122801122802122803122804122805122806122807122808122809122810122811122812122813122814122815122816122817122818122819122820122821122822122823122824122825122826122827122828122829122830122831122832122833122834122835122836122837122838122839122840122841122842122843122844122845122846122847122848122849122850122851122852122853122854122855122856122857122858122859122860122861122862122863122864122865122866122867122868122869122870122871122872122873122874122875122876122877122878122879122880122881122882122883122884122885122886122887122888122889122890122891122892122893122894122895122896122897122898122899122900122901122902122903122904122905122906122907122908122909122910122911122912122913122914122915122916122917122918122919122920122921122922122923122924122925122926122927122928122929122930122931122932122933122934122935122936122937122938122939122940122941122942122943122944122945122946122947122948122949122950122951122952122953122954122955122956122957122958122959122960122961122962122963122964122965122966122967122968122969122970122971122972122973122974122975122976122977122978122979122980122981122982122983122984122985122986122987122988122989122990122991122992122993122994122995122996122997122998122999123000123001123002123003123004123005123006123007123008123009123010123011123012123013123014123015123016123017123018123019123020123021123022123023123024123025123026123027123028123029123030123031123032123033123034123035123036123037123038123039123040123041123042123043123044123045123046123047123048123049123050123051123052123053123054123055123056123057123058123059123060123061123062123063123064123065123066123067123068123069123070123071123072123073123074123075123076123077123078123079123080123081123082123083123084123085123086123087123088123089123090123091123092123093123094123095123096123097123098123099123100123101123102123103123104123105123106123107123108123109123110123111123112123113123114123115123116123117123118123119123120123121123122123123123124123125123126123127123128123129123130123131123132123133123134123135123136123137123138123139123140123141123142123143123144123145123146123147123148123149123150123151123152123153123154123155123156123157123158123159123160123161123162123163123164123165123166123167123168123169123170123171123172123173123174123175123176123177123178123179123180123181123182123183123184123185123186123187123188123189123190123191123192123193123194123195123196123197123198123199123200123201123202123203123204123205123206123207123208123209123210123211123212123213123214123215123216123217123218123219123220123221123222123223123224123225123226123227123228123229123230123231123232123233123234123235123236123237123238123239123240123241123242123243123244123245123246123247123248123249123250123251123252123253123254123255123256123257123258123259123260123261123262123263123264123265123266123267123268123269123270123271123272123273123274123275123276123277123278123279123280123281123282123283123284123285123286123287123288123289123290123291123292123293123294123295123296123297123298123299123300123301123302123303123304123305123306123307123308123309123310123311123312123313123314123315123316123317123318123319123320123321123322123323123324123325123326123327123328123329123330123331123332123333123334123335123336123337123338123339123340123341123342123343123344123345123346123347123348123349123350123351123352123353123354123355123356123357123358123359123360123361123362123363123364123365123366123367123368123369123370123371123372123373123374123375123376123377123378123379123380123381123382123383123384123385123386123387123388123389123390123391123392123393123394123395123396123397123398123399123400123401123402123403123404123405123406123407123408123409123410123411123412123413123414123415123416123417123418123419123420123421123422123423123424123425123426123427123428123429123430123431123432123433123434123435123436123437123438123439123440123441123442123443123444123445123446123447123448123449123450123451123452123453123454123455123456123457123458123459123460123461123462123463123464123465123466123467123468123469123470123471123472123473123474123475123476123477123478123479123480123481123482123483123484123485123486123487123488123489123490123491123492123493123494123495123496123497123498123499123500123501123502123503123504123505123506123507123508123509123510123511123512123513123514123515123516123517123518123519123520123521123522123523123524123525123526123527123528123529123530123531123532123533123534123535123536123537123538123539123540123541123542123543123544123545123546123547123548123549123550123551123552123553123554123555123556123557123558123559123560123561123562123563123564123565123566123567123568123569123570123571123572123573123574123575123576123577123578123579123580123581123582123583123584123585123586123587123588123589123590123591123592123593123594123595123596123597123598123599123600123601123602123603123604123605123606123607123608123609123610123611123612123613123614123615123616123617123618123619123620123621123622123623123624123625123626123627123628123629123630123631123632123633123634123635123636123637123638123639123640123641123642123643123644123645123646123647123648123649123650123651123652123653123654123655123656123657123658123659123660123661123662123663123664123665123666123667123668123669123670123671123672123673123674123675123676123677123678123679123680123681123682123683123684123685123686123687123688123689123690123691123692123693123694123695123696123697123698123699123700123701123702123703123704123705123706123707123708123709123710123711123712123713123714123715123716123717123718123719123720123721123722123723123724123725123726123727123728123729123730123731123732123733123734123735123736123737123738123739123740123741123742123743123744123745123746123747123748123749123750123751123752123753123754123755123756123757123758123759123760123761123762123763123764123765123766123767123768123769123770123771123772123773123774123775123776123777123778123779123780123781123782123783123784123785123786123787123788123789123790123791123792123793123794123795123796123797123798123799123800123801123802123803123804123805123806123807123808123809123810123811123812123813123814123815123816123817123818123819123820123821123822123823123824123825123826123827123828123829123830123831123832123833123834123835123836123837123838123839123840123841123842123843123844123845123846123847123848123849123850123851123852123853123854123855123856123857123858123859123860123861123862123863123864123865123866123867123868123869123870123871123872123873123874123875123876123877123878123879123880123881123882123883123884123885123886123887123888123889123890123891123892123893123894123895123896123897123898123899123900123901123902123903123904123905123906123907123908123909123910123911123912123913123914123915123916123917123918123919123920123921123922123923123924123925123926123927123928123929123930123931123932123933123934123935123936123937123938123939123940123941123942123943123944123945123946123947123948123949123950123951123952123953123954123955123956123957123958123959123960123961123962123963123964123965123966123967123968123969123970123971123972123973123974123975123976123977123978123979123980123981123982123983123984123985123986123987123988123989123990123991123992123993123994123995123996123997123998123999124000124001124002124003124004124005124006124007124008124009124010124011124012124013124014124015124016124017124018124019124020124021124022124023124024124025124026124027124028124029124030124031124032124033124034124035124036124037124038124039124040124041124042124043124044124045124046124047124048124049124050124051124052124053124054124055124056124057124058124059124060124061124062124063124064124065124066124067124068124069124070124071124072124073124074124075124076124077124078124079124080124081124082124083124084124085124086124087124088124089124090124091124092124093124094124095124096124097124098124099124100124101124102124103124104124105124106124107124108124109124110124111124112124113124114124115124116124117124118124119124120124121124122124123124124124125124126124127124128124129124130124131124132124133124134124135124136124137124138124139124140124141124142124143124144124145124146124147124148124149124150124151124152124153124154124155124156124157124158124159124160124161124162124163124164124165124166124167124168124169124170124171124172124173124174124175124176124177124178124179124180124181124182124183124184124185124186124187124188124189124190124191124192124193124194124195124196124197124198124199124200124201124202124203124204124205124206124207124208124209124210124211124212124213124214124215124216124217124218124219124220124221124222124223124224124225124226124227124228124229124230124231124232124233124234124235124236124237124238124239124240124241124242124243124244124245124246124247124248124249124250124251124252124253124254124255124256124257124258124259124260124261124262124263124264124265124266124267124268124269124270124271124272124273124274124275124276124277124278124279124280124281124282124283124284124285124286124287124288124289124290124291124292124293124294124295124296124297124298124299124300124301124302124303124304124305124306124307124308124309124310124311124312124313124314124315124316124317124318124319124320124321124322124323124324124325124326124327124328124329124330124331124332124333124334124335124336124337124338124339124340124341124342124343124344124345124346124347124348124349124350124351124352124353124354124355124356124357124358124359124360124361124362124363124364124365124366124367124368124369124370124371124372124373124374124375124376124377124378124379124380124381124382124383124384124385124386124387124388124389124390124391124392124393124394124395124396124397124398124399124400124401124402124403124404124405124406124407124408124409124410124411124412124413124414124415124416124417124418124419124420124421124422124423124424124425124426124427124428124429124430124431124432124433124434124435124436124437124438124439124440124441124442124443124444124445124446124447124448124449124450124451124452124453124454124455124456124457124458124459124460124461124462124463124464124465124466124467124468124469124470124471124472124473124474124475124476124477124478124479124480124481124482124483124484124485124486124487124488124489124490124491124492124493124494124495124496124497124498124499124500124501124502124503124504124505124506124507124508124509124510124511124512124513124514124515124516124517124518124519124520124521124522124523124524124525124526124527124528124529124530124531124532124533124534124535124536124537124538124539124540124541124542124543124544124545124546124547124548124549124550124551124552124553124554124555124556124557124558124559124560124561124562124563124564124565124566124567124568124569124570124571124572124573124574124575124576124577124578124579124580124581124582124583124584124585124586124587124588124589124590124591124592124593124594124595124596124597124598124599124600124601124602124603124604124605124606124607124608124609124610124611124612124613124614124615124616124617124618124619124620124621124622124623124624124625124626124627124628124629124630124631124632124633124634124635124636124637124638124639124640124641124642124643124644124645124646124647124648124649124650124651124652124653124654124655124656124657124658124659124660124661124662124663124664124665124666124667124668124669124670124671124672124673124674124675124676124677124678124679124680124681124682124683124684124685124686124687124688124689124690124691124692124693124694124695124696124697124698124699124700124701124702124703124704124705124706124707124708124709124710124711124712124713124714124715124716124717124718124719124720124721124722124723124724124725124726124727124728124729124730124731124732124733124734124735124736124737124738124739124740124741124742124743124744124745124746124747124748124749124750124751124752124753124754124755124756124757124758124759124760124761124762124763124764124765124766124767124768124769124770124771124772124773124774124775124776124777124778124779124780124781124782124783124784124785124786124787124788124789124790124791124792124793124794124795124796124797124798124799124800124801124802124803124804124805124806124807124808124809124810124811124812124813124814124815124816124817124818124819124820124821124822124823124824124825124826124827124828124829124830124831124832124833124834124835124836124837124838124839124840124841124842124843124844124845124846124847124848124849124850124851124852124853124854124855124856124857124858124859124860124861124862124863124864124865124866124867124868124869124870124871124872124873124874124875124876124877124878124879124880124881124882124883124884124885124886124887124888124889124890124891124892124893124894124895124896124897124898124899124900124901124902124903124904124905124906124907124908124909124910124911124912124913124914124915124916124917124918124919124920124921124922124923124924124925124926124927124928124929124930124931124932124933124934124935124936124937124938124939124940124941124942124943124944124945124946124947124948124949124950124951124952124953124954124955124956124957124958124959124960124961124962124963124964124965124966124967124968124969124970124971124972124973124974124975124976124977124978124979124980124981124982124983124984124985124986124987124988124989124990124991124992124993124994124995124996124997124998124999125000125001125002125003125004125005125006125007125008125009125010125011125012125013125014125015125016125017125018125019125020125021125022125023125024125025125026125027125028125029125030125031125032125033125034125035125036125037125038125039125040125041125042125043125044125045125046125047125048125049125050125051125052125053125054125055125056125057125058125059125060125061125062125063125064125065125066125067125068125069125070125071125072125073125074125075125076125077125078125079125080125081125082125083125084125085125086125087125088125089125090125091125092125093125094125095125096125097125098125099125100125101125102125103125104125105125106125107125108125109125110125111125112125113125114125115125116125117125118125119125120125121125122125123125124125125125126125127125128125129125130125131125132125133125134125135125136125137125138125139125140125141125142125143125144125145125146125147125148125149125150125151125152125153125154125155125156125157125158125159125160125161125162125163125164125165125166125167125168125169125170125171125172125173125174125175125176125177125178125179125180125181125182125183125184125185125186125187125188125189125190125191125192125193125194125195125196125197125198125199125200125201125202125203125204125205125206125207125208125209125210125211125212125213125214125215125216125217125218125219125220125221125222125223125224125225125226125227125228125229125230125231125232125233125234125235125236125237125238125239125240125241125242125243125244125245125246125247125248125249125250125251125252125253125254125255125256125257125258125259125260125261125262125263125264125265125266125267125268125269125270125271125272125273125274125275125276125277125278125279125280125281125282125283125284125285125286125287125288125289125290125291125292125293125294125295125296125297125298125299125300125301125302125303125304125305125306125307125308125309125310125311125312125313125314125315125316125317125318125319125320125321125322125323125324125325125326125327125328125329125330125331125332125333125334125335125336125337125338125339125340125341125342125343125344125345125346125347125348125349125350125351125352125353125354125355125356125357125358125359125360125361125362125363125364125365125366125367125368125369125370125371125372125373125374125375125376125377125378125379125380125381125382125383125384125385125386125387125388125389125390125391125392125393125394125395125396125397125398125399125400125401125402125403125404125405125406125407125408125409125410125411125412125413125414125415125416125417125418125419125420125421125422125423125424125425125426125427125428125429125430125431125432125433125434125435125436125437125438125439125440125441125442125443125444125445125446125447125448125449125450125451125452125453125454125455125456125457125458125459125460125461125462125463125464125465125466125467125468125469125470125471125472125473125474125475125476125477125478125479125480125481125482125483125484125485125486125487125488125489125490125491125492125493125494125495125496125497125498125499125500125501125502125503125504125505125506125507125508125509125510125511125512125513125514125515125516125517125518125519125520125521125522125523125524125525125526125527125528125529125530125531125532125533125534125535125536125537125538125539125540125541125542125543125544125545125546125547125548125549125550125551125552125553125554125555125556125557125558125559125560125561125562125563125564125565125566125567125568125569125570125571125572125573125574125575125576125577125578125579125580125581125582125583125584125585125586125587125588125589125590125591125592125593125594125595125596125597125598125599125600125601125602125603125604125605125606125607125608125609125610125611125612125613125614125615125616125617125618125619125620125621125622125623125624125625125626125627125628125629125630125631125632125633125634125635125636125637125638125639125640125641125642125643125644125645125646125647125648125649125650125651125652125653125654125655125656125657125658125659125660125661125662125663125664125665125666125667125668125669125670125671125672125673125674125675125676125677125678125679125680125681125682125683125684125685125686125687125688125689125690125691125692125693125694125695125696125697125698125699125700125701125702125703125704125705125706125707125708125709125710125711125712125713125714125715125716125717125718125719125720125721125722125723125724125725125726125727125728125729125730125731125732125733125734125735125736125737125738125739125740125741125742125743125744125745125746125747125748125749125750125751125752125753125754125755125756125757125758125759125760125761125762125763125764125765125766125767125768125769125770125771125772125773125774125775125776125777125778125779125780125781125782125783125784125785125786125787125788125789125790125791125792125793125794125795125796125797125798125799125800125801125802125803125804125805125806125807125808125809125810125811125812125813125814125815125816125817125818125819125820125821125822125823125824125825125826125827125828125829125830125831125832125833125834125835125836125837125838125839125840125841125842125843125844125845125846125847125848125849125850125851125852125853125854125855125856125857125858125859125860125861125862125863125864125865125866125867125868125869125870125871125872125873125874125875125876125877125878125879125880125881125882125883125884125885125886125887125888125889125890125891125892125893125894125895125896125897125898125899125900125901125902125903125904125905125906125907125908125909125910125911125912125913125914125915125916125917125918125919125920125921125922125923125924125925125926125927125928125929125930125931125932125933125934125935125936125937125938125939125940125941125942125943125944125945125946125947125948125949125950125951125952125953125954125955125956125957125958125959125960125961125962125963125964125965125966125967125968125969125970125971125972125973125974125975125976125977125978125979125980125981125982125983125984125985125986125987125988125989125990125991125992125993125994125995125996125997125998125999126000126001126002126003126004126005126006126007126008126009126010126011126012126013126014126015126016126017126018126019126020126021126022126023126024126025126026126027126028126029126030126031126032126033126034126035126036126037126038126039126040126041126042126043126044126045126046126047126048126049126050126051126052126053126054126055126056126057126058126059126060126061126062126063126064126065126066126067126068126069126070126071126072126073126074126075126076126077126078126079126080126081126082126083126084126085126086126087126088126089126090126091126092126093126094126095126096126097126098126099126100126101126102126103126104126105126106126107126108126109126110126111126112126113126114126115126116126117126118126119126120126121126122126123126124126125126126126127126128126129126130126131126132126133126134126135126136126137126138126139126140126141126142126143126144126145126146126147126148126149126150126151126152126153126154126155126156126157126158126159126160126161126162126163126164126165126166126167126168126169126170126171126172126173126174126175126176126177126178126179126180126181126182126183126184126185126186126187126188126189126190126191126192126193126194126195126196126197126198126199126200126201126202126203126204126205126206126207126208126209126210126211126212126213126214126215126216126217126218126219126220126221126222126223126224126225126226126227126228126229126230126231126232126233126234126235126236126237126238126239126240126241126242126243126244126245126246126247126248126249126250126251126252126253126254126255126256126257126258126259126260126261126262126263126264126265126266126267126268126269126270126271126272126273126274126275126276126277126278126279126280126281126282126283126284126285126286126287126288126289126290126291126292126293126294126295126296126297126298126299126300126301126302126303126304126305126306126307126308126309126310126311126312126313126314126315126316126317126318126319126320126321126322126323126324126325126326126327126328126329126330126331126332126333126334126335126336126337126338126339126340126341126342126343126344126345126346126347126348126349126350126351126352126353126354126355126356126357126358126359126360126361126362126363126364126365126366126367126368126369126370126371126372126373126374126375126376126377126378126379126380126381126382126383126384126385126386126387126388126389126390126391126392126393126394126395126396126397126398126399126400126401126402126403126404126405126406126407126408126409126410126411126412126413126414126415126416126417126418126419126420126421126422126423126424126425126426126427126428126429126430126431126432126433126434126435126436126437126438126439126440126441126442126443126444126445126446126447126448126449126450126451126452126453126454126455126456126457126458126459126460126461126462126463126464126465126466126467126468126469126470126471126472126473126474126475126476126477126478126479126480126481126482126483126484126485126486126487126488126489126490126491126492126493126494126495126496126497126498126499126500126501126502126503126504126505126506126507126508126509126510126511126512126513126514126515126516126517126518126519126520126521126522126523126524126525126526126527126528126529126530126531126532126533126534126535126536126537126538126539126540126541126542126543126544126545126546126547126548126549126550126551126552126553126554126555126556126557126558126559126560126561126562126563126564126565126566126567126568126569126570126571126572126573126574126575126576126577126578126579126580126581126582126583126584126585126586126587126588126589126590126591126592126593126594126595126596126597126598126599126600126601126602126603126604126605126606126607126608126609126610126611126612126613126614126615126616126617126618126619126620126621126622126623126624126625126626126627126628126629126630126631126632126633126634126635126636126637126638126639126640126641126642126643126644126645126646126647126648126649126650126651126652126653126654126655126656126657126658126659126660126661126662126663126664126665126666126667126668126669126670126671126672126673126674126675126676126677126678126679126680126681126682126683126684126685126686126687126688126689126690126691126692126693126694126695126696126697126698126699126700126701126702126703126704126705126706126707126708126709126710126711126712126713126714126715126716126717126718126719126720126721126722126723126724126725126726126727126728126729126730126731126732126733126734126735126736126737126738126739126740126741126742126743126744126745126746126747126748126749126750126751126752126753126754126755126756126757126758126759126760126761126762126763126764126765126766126767126768126769126770126771126772126773126774126775126776126777126778126779126780126781126782126783126784126785126786126787126788126789126790126791126792126793126794126795126796126797126798126799126800126801126802126803126804126805126806126807126808126809126810126811126812126813126814126815126816126817126818126819126820126821126822126823126824126825126826126827126828126829126830126831126832126833126834126835126836126837126838126839126840126841126842126843126844126845126846126847126848126849126850126851126852126853126854126855126856126857126858126859126860126861126862126863126864126865126866126867126868126869126870126871126872126873126874126875126876126877126878126879126880126881126882126883126884126885126886126887126888126889126890126891126892126893126894126895126896126897126898126899126900126901126902126903126904126905126906126907126908126909126910126911126912126913126914126915126916126917126918126919126920126921126922126923126924126925126926126927126928126929126930126931126932126933126934126935126936126937126938126939126940126941126942126943126944126945126946126947126948126949126950126951126952126953126954126955126956126957126958126959126960126961126962126963126964126965126966126967126968126969126970126971126972126973126974126975126976126977126978126979126980126981126982126983126984126985126986126987126988126989126990126991126992126993126994126995126996126997126998126999127000127001127002127003127004127005127006127007127008127009127010127011127012127013127014127015127016127017127018127019127020127021127022127023127024127025127026127027127028127029127030127031127032127033127034127035127036127037127038127039127040127041127042127043127044127045127046127047127048127049127050127051127052127053127054127055127056127057127058127059127060127061127062127063127064127065127066127067127068127069127070127071127072127073127074127075127076127077127078127079127080127081127082127083127084127085127086127087127088127089127090127091127092127093127094127095127096127097127098127099127100127101127102127103127104127105127106127107127108127109127110127111127112127113127114127115127116127117127118127119127120127121127122127123127124127125127126127127127128127129127130127131127132127133127134127135127136127137127138127139127140127141127142127143127144127145127146127147127148127149127150127151127152127153127154127155127156127157127158127159127160127161127162127163127164127165127166127167127168127169127170127171127172127173127174127175127176127177127178127179127180127181127182127183127184127185127186127187127188127189127190127191127192127193127194127195127196127197127198127199127200127201127202127203127204127205127206127207127208127209127210127211127212127213127214127215127216127217127218127219127220127221127222127223127224127225127226127227127228127229127230127231127232127233127234127235127236127237127238127239127240127241127242127243127244127245127246127247127248127249127250127251127252127253127254127255127256127257127258127259127260127261127262127263127264127265127266127267127268127269127270127271127272127273127274127275127276127277127278127279127280127281127282127283127284127285127286127287127288127289127290127291127292127293127294127295127296127297127298127299127300127301127302127303127304127305127306127307127308127309127310127311127312127313127314127315127316127317127318127319127320127321127322127323127324127325127326127327127328127329127330127331127332127333127334127335127336127337127338127339127340127341127342127343127344127345127346127347127348127349127350127351127352127353127354127355127356127357127358127359127360127361127362127363127364127365127366127367127368127369127370127371127372127373127374127375127376127377127378127379127380127381127382127383127384127385127386127387127388127389127390127391127392127393127394127395127396127397127398127399127400127401127402127403127404127405127406127407127408127409127410127411127412127413127414127415127416127417127418127419127420127421127422127423127424127425127426127427127428127429127430127431127432127433127434127435127436127437127438127439127440127441127442127443127444127445127446127447127448127449127450127451127452127453127454127455127456127457127458127459127460127461127462127463127464127465127466127467127468127469127470127471127472127473127474127475127476127477127478127479127480127481127482127483127484127485127486127487127488127489127490127491127492127493127494127495127496127497127498127499127500127501127502127503127504127505127506127507127508127509127510127511127512127513127514127515127516127517127518127519127520127521127522127523127524127525127526127527127528127529127530127531127532127533127534127535127536127537127538127539127540127541127542127543127544127545127546127547127548127549127550127551127552127553127554127555127556127557127558127559127560127561127562127563127564127565127566127567127568127569127570127571127572127573127574127575127576127577127578127579127580127581127582127583127584127585127586127587127588127589127590127591127592127593127594127595127596127597127598127599127600127601127602127603127604127605127606127607127608127609127610127611127612127613127614127615127616127617127618127619127620127621127622127623127624127625127626127627127628127629127630127631127632127633127634127635127636127637127638127639127640127641127642127643127644127645127646127647127648127649127650127651127652127653127654127655127656127657127658127659127660127661127662127663127664127665127666127667127668127669127670127671127672127673127674127675127676127677127678127679127680127681127682127683127684127685127686127687127688127689127690127691127692127693127694127695127696127697127698127699127700127701127702127703127704127705127706127707127708127709127710127711127712127713127714127715127716127717127718127719127720127721127722127723127724127725127726127727127728127729127730127731127732127733127734127735127736127737127738127739127740127741127742127743127744127745127746127747127748127749127750127751127752127753127754127755127756127757127758127759127760127761127762127763127764127765127766127767127768127769127770127771127772127773127774127775127776127777127778127779127780127781127782127783127784127785127786127787127788127789127790127791127792127793127794127795127796127797127798127799127800127801127802127803127804127805127806127807127808127809127810127811127812127813127814127815127816127817127818127819127820127821127822127823127824127825127826127827127828127829127830127831127832127833127834127835127836127837127838127839127840127841127842127843127844127845127846127847127848127849127850127851127852127853127854127855127856127857127858127859127860127861127862127863127864127865127866127867127868127869127870127871127872127873127874127875127876127877127878127879127880127881127882127883127884127885127886127887127888127889127890127891127892127893127894127895127896127897127898127899127900127901127902127903127904127905127906127907127908127909127910127911127912127913127914127915127916127917127918127919127920127921127922127923127924127925127926127927127928127929127930127931127932127933127934127935127936127937127938127939127940127941127942127943127944127945127946127947127948127949127950127951127952127953127954127955127956127957127958127959127960127961127962127963127964127965127966127967127968127969127970127971127972127973127974127975127976127977127978127979127980127981127982127983127984127985127986127987127988127989127990127991127992127993127994127995127996127997127998127999128000128001128002128003128004128005128006128007128008128009128010128011128012128013128014128015128016128017128018128019128020128021128022128023128024128025128026128027128028128029128030128031128032128033128034128035128036128037128038128039128040128041128042128043128044128045128046128047128048128049128050128051128052128053128054128055128056128057128058128059128060128061128062128063128064128065128066128067128068128069128070128071128072128073128074128075128076128077128078128079128080128081128082128083128084128085128086128087128088128089128090128091128092128093128094128095128096128097128098128099128100128101128102128103128104128105128106128107128108128109128110128111128112128113128114128115128116128117128118128119128120128121128122128123128124128125128126128127128128128129128130128131128132128133128134128135128136128137128138128139128140128141128142128143128144128145128146128147128148128149128150128151128152128153128154128155128156128157128158128159128160128161128162128163128164128165128166128167128168128169128170128171128172128173128174128175128176128177128178128179128180128181128182128183128184128185128186128187128188128189128190128191128192128193128194128195128196128197128198128199128200128201128202128203128204128205128206128207128208128209128210128211128212128213128214128215128216128217128218128219128220128221128222128223128224128225128226128227128228128229128230128231128232128233128234128235128236128237128238128239128240128241128242128243128244128245128246128247128248128249128250128251128252128253128254128255128256128257128258128259128260128261128262128263128264128265128266128267128268128269128270128271128272128273128274128275128276128277128278128279128280128281128282128283128284128285128286128287128288128289128290128291128292128293128294128295128296128297128298128299128300128301128302128303128304128305128306128307128308128309128310128311128312128313128314128315128316128317128318128319128320128321128322128323128324128325128326128327128328128329128330128331128332128333128334128335128336128337128338128339128340128341128342128343128344128345128346128347128348128349128350128351128352128353128354128355128356128357128358128359128360128361128362128363128364128365128366128367128368128369128370128371128372128373128374128375128376128377128378128379128380128381128382128383128384128385128386128387128388128389128390128391128392128393128394128395128396128397128398128399128400128401128402128403128404128405128406128407128408128409128410128411128412128413128414128415128416128417128418128419128420128421128422128423128424128425128426128427128428128429128430128431128432128433128434128435128436128437128438128439128440128441128442128443128444128445128446128447128448128449128450128451128452128453128454128455128456128457128458128459128460128461128462128463128464128465128466128467128468128469128470128471128472128473128474128475128476128477128478128479128480128481128482128483128484128485128486128487128488128489128490128491128492128493128494128495128496128497128498128499128500128501128502128503128504128505128506128507128508128509128510128511128512128513128514128515128516128517128518128519128520128521128522128523128524128525128526128527128528128529128530128531128532128533128534128535128536128537128538128539128540128541128542128543128544128545128546128547128548128549128550128551128552128553128554128555128556128557128558128559128560128561128562128563128564128565128566128567128568128569128570128571128572128573128574128575128576128577128578128579128580128581128582128583128584128585128586128587128588128589128590128591128592128593128594128595128596128597128598128599128600128601128602128603128604128605128606128607128608128609128610128611128612128613128614128615128616128617128618128619128620128621128622128623128624128625128626128627128628128629128630128631128632128633128634128635128636128637128638128639128640128641128642128643128644128645128646128647128648128649128650128651128652128653128654128655128656128657128658128659128660128661128662128663128664128665128666128667128668128669128670128671128672128673128674128675128676128677128678128679128680128681128682128683128684128685128686128687128688128689128690128691128692128693128694128695128696128697128698128699128700128701128702128703128704128705128706128707128708128709128710128711128712128713128714128715128716128717128718128719128720128721128722128723128724128725128726128727128728128729128730128731128732128733128734128735128736128737128738128739128740128741128742128743128744128745128746128747128748128749128750128751128752128753128754128755128756128757128758128759128760128761128762128763128764128765128766128767128768128769128770128771128772128773128774128775128776128777128778128779128780128781128782128783128784128785128786128787128788128789128790128791128792128793128794128795128796128797128798128799128800128801128802128803128804128805128806128807128808128809128810128811128812128813128814128815128816128817128818128819128820128821128822128823128824128825128826128827128828128829128830128831128832128833128834128835128836128837128838128839128840128841128842128843128844128845128846128847128848128849128850128851128852128853128854128855128856128857128858128859128860128861128862128863128864128865128866128867128868128869128870128871128872128873128874128875128876128877128878128879128880128881128882128883128884128885128886128887128888128889128890128891128892128893128894128895128896128897128898128899128900128901128902128903128904128905128906128907128908128909128910128911128912128913128914128915128916128917128918128919128920128921128922128923128924128925128926128927128928128929128930128931128932128933128934128935128936128937128938128939128940128941128942128943128944128945128946128947128948128949128950128951128952128953128954128955128956128957128958128959128960128961128962128963128964128965128966128967128968128969128970128971128972128973128974128975128976128977128978128979128980128981128982128983128984128985128986128987128988128989128990128991128992128993128994128995128996128997128998128999129000129001129002129003129004129005129006129007129008129009129010129011129012129013129014129015129016129017129018129019129020129021129022129023129024129025129026129027129028129029129030129031129032129033129034129035129036129037129038129039129040129041129042129043129044129045129046129047129048129049129050129051129052129053129054129055129056129057129058129059129060129061129062129063129064129065129066129067129068129069129070129071129072129073129074129075129076129077129078129079129080129081129082129083129084129085129086129087129088129089129090129091129092129093129094129095129096129097129098129099129100129101129102129103129104129105129106129107129108129109129110129111129112129113129114129115129116129117129118129119129120129121129122129123129124129125129126129127129128129129129130129131129132129133129134129135129136129137129138129139129140129141129142129143129144129145129146129147129148129149129150129151129152129153129154129155129156129157129158129159129160129161129162129163129164129165129166129167129168129169129170129171129172129173129174129175129176129177129178129179129180129181129182129183129184129185129186129187129188129189129190129191129192129193129194129195129196129197129198129199129200129201129202129203129204129205129206129207129208129209129210129211129212129213129214129215129216129217129218129219129220129221129222129223129224129225129226129227129228129229129230129231129232129233129234129235129236129237129238129239129240129241129242129243129244129245129246129247129248129249129250129251129252129253129254129255129256129257129258129259129260129261129262129263129264129265129266129267129268129269129270129271129272129273129274129275129276129277129278129279129280129281129282129283129284129285129286129287129288129289129290129291129292129293129294129295129296129297129298129299129300129301129302129303129304129305129306129307129308129309129310129311129312129313129314129315129316129317129318129319129320129321129322129323129324129325129326129327129328129329129330129331129332129333129334129335129336129337129338129339129340129341129342129343129344129345129346129347129348129349129350129351129352129353129354129355129356129357129358129359129360129361129362129363129364129365129366129367129368129369129370129371129372129373129374129375129376129377129378129379129380129381129382129383129384129385129386129387129388129389129390129391129392129393129394129395129396129397129398129399129400129401129402129403129404129405129406129407129408129409129410129411129412129413129414129415129416129417129418129419129420129421129422129423129424129425129426129427129428129429129430129431129432129433129434129435129436129437129438129439129440129441129442129443129444129445129446129447129448129449129450129451129452129453129454129455129456129457129458129459129460129461129462129463129464129465129466129467129468129469129470129471129472129473129474129475129476129477129478129479129480129481129482129483129484129485129486129487129488129489129490129491129492129493129494129495129496129497129498129499129500129501129502129503129504129505129506129507129508129509129510129511129512129513129514129515129516129517129518129519129520129521129522129523129524129525129526129527129528129529129530129531129532129533129534129535129536129537129538129539129540129541129542129543129544129545129546129547129548129549129550129551129552129553129554129555129556129557129558129559129560129561129562129563129564129565129566129567129568129569129570129571129572129573129574129575129576129577129578129579129580129581129582129583129584129585129586129587129588129589129590129591129592129593129594129595129596129597129598129599129600129601129602129603129604129605129606129607129608129609129610129611129612129613129614129615129616129617129618129619129620129621129622129623129624129625129626129627129628129629129630129631129632129633129634129635129636129637129638129639129640129641129642129643129644129645129646129647129648129649129650129651129652129653129654129655129656129657129658129659129660129661129662129663129664129665129666129667129668129669129670129671129672129673129674129675129676129677129678129679129680129681129682129683129684129685129686129687129688129689129690129691129692129693129694129695129696129697129698129699129700129701129702129703129704129705129706129707129708129709129710129711129712129713129714129715129716129717129718129719129720129721129722129723129724129725129726129727129728129729129730129731129732129733129734129735129736129737129738129739129740129741129742129743129744129745129746129747129748129749129750129751129752129753129754129755129756129757129758129759129760129761129762129763129764129765129766129767129768129769129770129771129772129773129774129775129776129777129778129779129780129781129782129783129784129785129786129787129788129789129790129791129792129793129794129795129796129797129798129799129800129801129802129803129804129805129806129807129808129809129810129811129812129813129814129815129816129817129818129819129820129821129822129823129824129825129826129827129828129829129830129831129832129833129834129835129836129837129838129839129840129841129842129843129844129845129846129847129848129849129850129851129852129853129854129855129856129857129858129859129860129861129862129863129864129865129866129867129868129869129870129871129872129873129874129875129876129877129878129879129880129881129882129883129884129885129886129887129888129889129890129891129892129893129894129895129896129897129898129899129900129901129902129903129904129905129906129907129908129909129910129911129912129913129914129915129916129917129918129919129920129921129922129923129924129925129926129927129928129929129930129931129932129933129934129935129936129937129938129939129940129941129942129943129944129945129946129947129948129949129950129951129952129953129954129955129956129957129958129959129960129961129962129963129964129965129966129967129968129969129970129971129972129973129974129975129976129977129978129979129980129981129982129983129984129985129986129987129988129989129990129991129992129993129994129995129996129997129998129999130000130001130002130003130004130005130006130007130008130009130010130011130012130013130014130015130016130017130018130019130020130021130022130023130024130025130026130027130028130029130030130031130032130033130034130035130036130037130038130039130040130041130042130043130044130045130046130047130048130049130050130051130052130053130054130055130056130057130058130059130060130061130062130063130064130065130066130067130068130069130070130071130072130073130074130075130076130077130078130079130080130081130082130083130084130085130086130087130088130089130090130091130092130093130094130095130096130097130098130099130100130101130102130103130104130105130106130107130108130109130110130111130112130113130114130115130116130117130118130119130120130121130122130123130124130125130126130127130128130129130130130131130132130133130134130135130136130137130138130139130140130141130142130143130144130145130146130147130148130149130150130151130152130153130154130155130156130157130158130159130160130161130162130163130164130165130166130167130168130169130170130171130172130173130174130175130176130177130178130179130180130181130182130183130184130185130186130187130188130189130190130191130192130193130194130195130196130197130198130199130200130201130202130203130204130205130206130207130208130209130210130211130212130213130214130215130216130217130218130219130220130221130222130223130224130225130226130227130228130229130230130231130232130233130234130235130236130237130238130239130240130241130242130243130244130245130246130247130248130249130250130251130252130253130254130255130256130257130258130259130260130261130262130263130264130265130266130267130268130269130270130271130272130273130274130275130276130277130278130279130280130281130282130283130284130285130286130287130288130289130290130291130292130293130294130295130296130297130298130299130300130301130302130303130304130305130306130307130308130309130310130311130312130313130314130315130316130317130318130319130320130321130322130323130324130325130326130327130328130329130330130331130332130333130334130335130336130337130338130339130340130341130342130343130344130345130346130347130348130349130350130351130352130353130354130355130356130357130358130359130360130361130362130363130364130365130366130367130368130369130370130371130372130373130374130375130376130377130378130379130380130381130382130383130384130385130386130387130388130389130390130391130392130393130394130395130396130397130398130399130400130401130402130403130404130405130406130407130408130409130410130411130412130413130414130415130416130417130418130419130420130421130422130423130424130425130426130427130428130429130430130431130432130433130434130435130436130437130438130439130440130441130442130443130444130445130446130447130448130449130450130451130452130453130454130455130456130457130458130459130460130461130462130463130464130465130466130467130468130469130470130471130472130473130474130475130476130477130478130479130480130481130482130483130484130485130486130487130488130489130490130491130492130493130494130495130496130497130498130499130500130501130502130503130504130505130506130507130508130509130510130511130512130513130514130515130516130517130518130519130520130521130522130523130524130525130526130527130528130529130530130531130532130533130534130535130536130537130538130539130540130541130542130543130544130545130546130547130548130549130550130551130552130553130554130555130556130557130558130559130560130561130562130563130564130565130566130567130568130569130570130571130572130573130574130575130576130577130578130579130580130581130582130583130584130585130586130587130588130589130590130591130592130593130594130595130596130597130598130599130600130601130602130603130604130605130606130607130608130609130610130611130612130613130614130615130616130617130618130619130620130621130622130623130624130625130626130627130628130629130630130631130632130633130634130635130636130637130638130639130640130641130642130643130644130645130646130647130648130649130650130651130652130653130654130655130656130657130658130659130660130661130662130663130664130665130666130667130668130669130670130671130672130673130674130675130676130677130678130679130680130681130682130683130684130685130686130687130688130689130690130691130692130693130694130695130696130697130698130699130700130701130702130703130704130705130706130707130708130709130710130711130712130713130714130715130716130717130718130719130720130721130722130723130724130725130726130727130728130729130730130731130732130733130734130735130736130737130738130739130740130741130742130743130744130745130746130747130748130749130750130751130752130753130754130755130756130757130758130759130760130761130762130763130764130765130766130767130768130769130770130771130772130773130774130775130776130777130778130779130780130781130782130783130784130785130786130787130788130789130790130791130792130793130794130795130796130797130798130799130800130801130802130803130804130805130806130807130808130809130810130811130812130813130814130815130816130817130818130819130820130821130822130823130824130825130826130827130828130829130830130831130832130833130834130835130836130837130838130839130840130841130842130843130844130845130846130847130848130849130850130851130852130853130854130855130856130857130858130859130860130861130862130863130864130865130866130867130868130869130870130871130872130873130874130875130876130877130878130879130880130881130882130883130884130885130886130887130888130889130890130891130892130893130894130895130896130897130898130899130900130901130902130903130904130905130906130907130908130909130910130911130912130913130914130915130916130917130918130919130920130921130922130923130924130925130926130927130928130929130930130931130932130933130934130935130936130937130938130939130940130941130942130943130944130945130946130947130948130949130950130951130952130953130954130955130956130957130958130959130960130961130962130963130964130965130966130967130968130969130970130971130972130973130974130975130976130977130978130979130980130981130982130983130984130985130986130987130988130989130990130991130992130993130994130995130996130997130998130999131000131001131002131003131004131005131006131007131008131009131010131011131012131013131014131015131016131017131018131019131020131021131022131023131024131025131026131027131028131029131030131031131032131033131034131035131036131037131038131039131040131041131042131043131044131045131046131047131048131049131050131051131052131053131054131055131056131057131058131059131060131061131062131063131064131065131066131067131068131069131070131071131072131073131074131075131076131077131078131079131080131081131082131083131084131085131086131087131088131089131090131091131092131093131094131095131096131097131098131099131100131101131102131103131104131105131106131107131108131109131110131111131112131113131114131115131116131117131118131119131120131121131122131123131124131125131126131127131128131129131130131131131132131133131134131135131136131137131138131139131140131141131142131143131144131145131146131147131148131149131150131151131152131153131154131155131156131157131158131159131160131161131162131163131164131165131166131167131168131169131170131171131172131173131174131175131176131177131178131179131180131181131182131183131184131185131186131187131188131189131190131191131192131193131194131195131196131197131198131199131200131201131202131203131204131205131206131207131208131209131210131211131212131213131214131215131216131217131218131219131220131221131222131223131224131225131226131227131228131229131230131231131232131233131234131235131236131237131238131239131240131241131242131243131244131245131246131247131248131249131250131251131252131253131254131255131256131257131258131259131260131261131262131263131264131265131266131267131268131269131270131271131272131273131274131275131276131277131278131279131280131281131282131283131284131285131286131287131288131289131290131291131292131293131294131295131296131297131298131299131300131301131302131303131304131305131306131307131308131309131310131311131312131313131314131315131316131317131318131319131320131321131322131323131324131325131326131327131328131329131330131331131332131333131334131335131336131337131338131339131340131341131342131343131344131345131346131347131348131349131350131351131352131353131354131355131356131357131358131359131360131361131362131363131364131365131366131367131368131369131370131371131372131373131374131375131376131377131378131379131380131381131382131383131384131385131386131387131388131389131390131391131392131393131394131395131396131397131398131399131400131401131402131403131404131405131406131407131408131409131410131411131412131413131414131415131416131417131418131419131420131421131422131423131424131425131426131427131428131429131430131431131432131433131434131435131436131437131438131439131440131441131442131443131444131445131446131447131448131449131450131451131452131453131454131455131456131457131458131459131460131461131462131463131464131465131466131467131468131469131470131471131472131473131474131475131476131477131478131479131480131481131482131483131484131485131486131487131488131489131490131491131492131493131494131495131496131497131498131499131500131501131502131503131504131505131506131507131508131509131510131511131512131513131514131515131516131517131518131519131520131521131522131523131524131525131526131527131528131529131530131531131532131533131534131535131536131537131538131539131540131541131542131543131544131545131546131547131548131549131550131551131552131553131554131555131556131557131558131559131560131561131562131563131564131565131566131567131568131569131570131571131572131573131574131575131576131577131578131579131580131581131582131583131584131585131586131587131588131589131590131591131592131593131594131595131596131597131598131599131600131601131602131603131604131605131606131607131608131609131610131611131612131613131614131615131616131617131618131619131620131621131622131623131624131625131626131627131628131629131630131631131632131633131634131635131636131637131638131639131640131641131642131643131644131645131646131647131648131649131650131651131652131653131654131655131656131657131658131659131660131661131662131663131664131665131666131667131668131669131670131671131672131673131674131675131676131677131678131679131680131681131682131683131684131685131686131687131688131689131690131691131692131693131694131695131696131697131698131699131700131701131702131703131704131705131706131707131708131709131710131711131712131713131714131715131716131717131718131719131720131721131722131723131724131725131726131727131728131729131730131731131732131733131734131735131736131737131738131739131740131741131742131743131744131745131746131747131748131749131750131751131752131753131754131755131756131757131758131759131760131761131762131763131764131765131766131767131768131769131770131771131772131773131774131775131776131777131778131779131780131781131782131783131784131785131786131787131788131789131790131791131792131793131794131795131796131797131798131799131800131801131802131803131804131805131806131807131808131809131810131811131812131813131814131815131816131817131818131819131820131821131822131823131824131825131826131827131828131829131830131831131832131833131834131835131836131837131838131839131840131841131842131843131844131845131846131847131848131849131850131851131852131853131854131855131856131857131858131859131860131861131862131863131864131865131866131867131868131869131870131871131872131873131874131875131876131877131878131879131880131881131882131883131884131885131886131887131888131889131890131891131892131893131894131895131896131897131898131899131900131901131902131903131904131905131906131907131908131909131910131911131912131913131914131915131916131917131918131919131920131921131922131923131924131925131926131927131928131929131930131931131932131933131934131935131936131937131938131939131940131941131942131943131944131945131946131947131948131949131950131951131952131953131954131955131956131957131958131959131960131961131962131963131964131965131966131967131968131969131970131971131972131973131974131975131976131977131978131979131980131981131982131983131984131985131986131987131988131989131990131991131992131993131994131995131996131997131998131999132000132001132002132003132004132005132006132007132008132009132010132011132012132013132014132015132016132017132018132019132020132021132022132023132024132025132026132027132028132029132030132031132032132033132034132035132036132037132038132039132040132041132042132043132044132045132046132047132048132049132050132051132052132053132054132055132056132057132058132059132060132061132062132063132064132065132066132067132068132069132070132071132072132073132074132075132076132077132078132079132080132081132082132083132084132085132086132087132088132089132090132091132092132093132094132095132096132097132098132099132100132101132102132103132104132105132106132107132108132109132110132111132112132113132114132115132116132117132118132119132120132121132122132123132124132125132126132127132128132129132130132131132132132133132134132135132136132137132138132139132140132141132142132143132144132145132146132147132148132149132150132151132152132153132154132155132156132157132158132159132160132161132162132163132164132165132166132167132168132169132170132171132172132173132174132175132176132177132178132179132180132181132182132183132184132185132186132187132188132189132190132191132192132193132194132195132196132197132198132199132200132201132202132203132204132205132206132207132208132209132210132211132212132213132214132215132216132217132218132219132220132221132222132223132224132225132226132227132228132229132230132231132232132233132234132235132236132237132238132239132240132241132242132243132244132245132246132247132248132249132250132251132252132253132254132255132256132257132258132259132260132261132262132263132264132265132266132267132268132269132270132271132272132273132274132275132276132277132278132279132280132281132282132283132284132285132286132287132288132289132290132291132292132293132294132295132296132297132298132299132300132301132302132303132304132305132306132307132308132309132310132311132312132313132314132315132316132317132318132319132320132321132322132323132324132325132326132327132328132329132330132331132332132333132334132335132336132337132338132339132340132341132342132343132344132345132346132347132348132349132350132351132352132353132354132355132356132357132358132359132360132361132362132363132364132365132366132367132368132369132370132371132372132373132374132375132376132377132378132379132380132381132382132383132384132385132386132387132388132389132390132391132392132393132394132395132396132397132398132399132400132401132402132403132404132405132406132407132408132409132410132411132412132413132414132415132416132417132418132419132420132421132422132423132424132425132426132427132428132429132430132431132432132433132434132435132436132437132438132439132440132441132442132443132444132445132446132447132448132449132450132451132452132453132454132455132456132457132458132459132460132461132462132463132464132465132466132467132468132469132470132471132472132473132474132475132476132477132478132479132480132481132482132483132484132485132486132487132488132489132490132491132492132493132494132495132496132497132498132499132500132501132502132503132504132505132506132507132508132509132510132511132512132513132514132515132516132517132518132519132520132521132522132523132524132525132526132527132528132529132530132531132532132533132534132535132536132537132538132539132540132541132542132543132544132545132546132547132548132549132550132551132552132553132554132555132556132557132558132559132560132561132562132563132564132565132566132567132568132569132570132571132572132573132574132575132576132577132578132579132580132581132582132583132584132585132586132587132588132589132590132591132592132593132594132595132596132597132598132599132600132601132602132603132604132605132606132607132608132609132610132611132612132613132614132615132616132617132618132619132620132621132622132623132624132625132626132627132628132629132630132631132632132633132634132635132636132637132638132639132640132641132642132643132644132645132646132647132648132649132650132651132652132653132654132655132656132657132658132659132660132661132662132663132664132665132666132667132668132669132670132671132672132673132674132675132676132677132678132679132680132681132682132683132684132685132686132687132688132689132690132691132692132693132694132695132696132697132698132699132700132701132702132703132704132705132706132707132708132709132710132711132712132713132714132715132716132717132718132719132720132721132722132723132724132725132726132727132728132729132730132731132732132733132734132735132736132737132738132739132740132741132742132743132744132745132746132747132748132749132750132751132752132753132754132755132756132757132758132759132760132761132762132763132764132765132766132767132768132769132770132771132772132773132774132775132776132777132778132779132780132781132782132783132784132785132786132787132788132789132790132791132792132793132794132795132796132797132798132799132800132801132802132803132804132805132806132807132808132809132810132811132812132813132814132815132816132817132818132819132820132821132822132823132824132825132826132827132828132829132830132831132832132833132834132835132836132837132838132839132840132841132842132843132844132845132846132847132848132849132850132851132852132853132854132855132856132857132858132859132860132861132862132863132864132865132866132867132868132869132870132871132872132873132874132875132876132877132878132879132880132881132882132883132884132885132886132887132888132889132890132891132892132893132894132895132896132897132898132899132900132901132902132903132904132905132906132907132908132909132910132911132912132913132914132915132916132917132918132919132920132921132922132923132924132925132926132927132928132929132930132931132932132933132934132935132936132937132938132939132940132941132942132943132944132945132946132947132948132949132950132951132952132953132954132955132956132957132958132959132960132961132962132963132964132965132966132967132968132969132970132971132972132973132974132975132976132977132978132979132980132981132982132983132984132985132986132987132988132989132990132991132992132993132994132995132996132997132998132999133000133001133002133003133004133005133006133007133008133009133010133011133012133013133014133015133016133017133018133019133020133021133022133023133024133025133026133027133028133029133030133031133032133033133034133035133036133037133038133039133040133041133042133043133044133045133046133047133048133049133050133051133052133053133054133055133056133057133058133059133060133061133062133063133064133065133066133067133068133069133070133071133072133073133074133075133076133077133078133079133080133081133082133083133084133085133086133087133088133089133090133091133092133093133094133095133096133097133098133099133100133101133102133103133104133105133106133107133108133109133110133111133112133113133114133115133116133117133118133119133120133121133122133123133124133125133126133127133128133129133130133131133132133133133134133135133136133137133138133139133140133141133142133143133144133145133146133147133148133149133150133151133152133153133154133155133156133157133158133159133160133161133162133163133164133165133166133167133168133169133170133171133172133173133174133175133176133177133178133179133180133181133182133183133184133185133186133187133188133189133190133191133192133193133194133195133196133197133198133199133200133201133202133203133204133205133206133207133208133209133210133211133212133213133214133215133216133217133218133219133220133221133222133223133224133225133226133227133228133229133230133231133232133233133234133235133236133237133238133239133240133241133242133243133244133245133246133247133248133249133250133251133252133253133254133255133256133257133258133259133260133261133262133263133264133265133266133267133268133269133270133271133272133273133274133275133276133277133278133279133280133281133282133283133284133285133286133287133288133289133290133291133292133293133294133295133296133297133298133299133300133301133302133303133304133305133306133307133308133309133310133311133312133313133314133315133316133317133318133319133320133321133322133323133324133325133326133327133328133329133330133331133332133333133334133335133336133337133338133339133340133341133342133343133344133345133346133347133348133349133350133351133352133353133354133355133356133357133358133359133360133361133362133363133364133365133366133367133368133369133370133371133372133373133374133375133376133377133378133379133380133381133382133383133384133385133386133387133388133389133390133391133392133393133394133395133396133397133398133399133400133401133402133403133404133405133406133407133408133409133410133411133412133413133414133415133416133417133418133419133420133421133422133423133424133425133426133427133428133429133430133431133432133433133434133435133436133437133438133439133440133441133442133443133444133445133446133447133448133449133450133451133452133453133454133455133456133457133458133459133460133461133462133463133464133465133466133467133468133469133470133471133472133473133474133475133476133477133478133479133480133481133482133483133484133485133486133487133488133489133490133491133492133493133494133495133496133497133498133499133500133501133502133503133504133505133506133507133508133509133510133511133512133513133514133515133516133517133518133519133520133521133522133523133524133525133526133527133528133529133530133531133532133533133534133535133536133537133538133539133540133541133542133543133544133545133546133547133548133549133550133551133552133553133554133555133556133557133558133559133560133561133562133563133564133565133566133567133568133569133570133571133572133573133574133575133576133577133578133579133580133581133582133583133584133585133586133587133588133589133590133591133592133593133594133595133596133597133598133599133600133601133602133603133604133605133606133607133608133609133610133611133612133613133614133615133616133617133618133619133620133621133622133623133624133625133626133627133628133629133630133631133632133633133634133635133636133637133638133639133640133641133642133643133644133645133646133647133648133649133650133651133652133653133654133655133656133657133658133659133660133661133662133663133664133665133666133667133668133669133670133671133672133673133674133675133676133677133678133679133680133681133682133683133684133685133686133687133688133689133690133691133692133693133694133695133696133697133698133699133700133701133702133703133704133705133706133707133708133709133710133711133712133713133714133715133716133717133718133719133720133721133722133723133724133725133726133727133728133729133730133731133732133733133734133735133736133737133738133739133740133741133742133743133744133745133746133747133748133749133750133751133752133753133754133755133756133757133758133759133760133761133762133763133764133765133766133767133768133769133770133771133772133773133774133775133776133777133778133779133780133781133782133783133784133785133786133787133788133789133790133791133792133793133794133795133796133797133798133799133800133801133802133803133804133805133806133807133808133809133810133811133812133813133814133815133816133817133818133819133820133821133822133823133824133825133826133827133828133829133830133831133832133833133834133835133836133837133838133839133840133841133842133843133844133845133846133847133848133849133850133851133852133853133854133855133856133857133858133859133860133861133862133863133864133865133866133867133868133869133870133871133872133873133874133875133876133877133878133879133880133881133882133883133884133885133886133887133888133889133890133891133892133893133894133895133896133897133898133899133900133901133902133903133904133905133906133907133908133909133910133911133912133913133914133915133916133917133918133919133920133921133922133923133924133925133926133927133928133929133930133931133932133933133934133935133936133937133938133939133940133941133942133943133944133945133946133947133948133949133950133951133952133953133954133955133956133957133958133959133960133961133962133963133964133965133966133967133968133969133970133971133972133973133974133975133976133977133978133979133980133981133982133983133984133985133986133987133988133989133990133991133992133993133994133995133996133997133998133999134000134001134002134003134004134005134006134007134008134009134010134011134012134013134014134015134016134017134018134019134020134021134022134023134024134025134026134027134028134029134030134031134032134033134034134035134036134037134038134039134040134041134042134043134044134045134046134047134048134049134050134051134052134053134054134055134056134057134058134059134060134061134062134063134064134065134066134067134068134069134070134071134072134073134074134075134076134077134078134079134080134081134082134083134084134085134086134087134088134089134090134091134092134093134094134095134096134097134098134099134100134101134102134103134104134105134106134107134108134109134110134111134112134113134114134115134116134117134118134119134120134121134122134123134124134125134126134127134128134129134130134131134132134133134134134135134136134137134138134139134140134141134142134143134144134145134146134147134148134149134150134151134152134153134154134155134156134157134158134159134160134161134162134163134164134165134166134167134168134169134170134171134172134173134174134175134176134177134178134179134180134181134182134183134184134185134186134187134188134189134190134191134192134193134194134195134196134197134198134199134200134201134202134203134204134205134206134207134208134209134210134211134212134213134214134215134216134217134218134219134220134221134222134223134224134225134226134227134228134229134230134231134232134233134234134235134236134237134238134239134240134241134242134243134244134245134246134247134248134249134250134251134252134253134254134255134256134257134258134259134260134261134262134263134264134265134266134267134268134269134270134271134272134273134274134275134276134277134278134279134280134281134282134283134284134285134286134287134288134289134290134291134292134293134294134295134296134297134298134299134300134301134302134303134304134305134306134307134308134309134310134311134312134313134314134315134316134317134318134319134320134321134322134323134324134325134326134327134328134329134330134331134332134333134334134335134336134337134338134339134340134341134342134343134344134345134346134347134348134349134350134351134352134353134354134355134356134357134358134359134360134361134362134363134364134365134366134367134368134369134370134371134372134373134374134375134376134377134378134379134380134381134382134383134384134385134386134387134388134389134390134391134392134393134394134395134396134397134398134399134400134401134402134403134404134405134406134407134408134409134410134411134412134413134414134415134416134417134418134419134420134421134422134423134424134425134426134427134428134429134430134431134432134433134434134435134436134437134438134439134440134441134442134443134444134445134446134447134448134449134450134451134452134453134454134455134456134457134458134459134460134461134462134463134464134465134466134467134468134469134470134471134472134473134474134475134476134477134478134479134480134481134482134483134484134485134486134487134488134489134490134491134492134493134494134495134496134497134498134499134500134501134502134503134504134505134506134507134508134509134510134511134512134513134514134515134516134517134518134519134520134521134522134523134524134525134526134527134528134529134530134531134532134533134534134535134536134537134538134539134540134541134542134543134544134545134546134547134548134549134550134551134552134553134554134555134556134557134558134559134560134561134562134563134564134565134566134567134568134569134570134571134572134573134574134575134576134577134578134579134580134581134582134583134584134585134586134587134588134589134590134591134592134593134594134595134596134597134598134599134600134601134602134603134604134605134606134607134608134609134610134611134612134613134614134615134616134617134618134619134620134621134622134623134624134625134626134627134628134629134630134631134632134633134634134635134636134637134638134639134640134641134642134643134644134645134646134647134648134649134650134651134652134653134654134655134656134657134658134659134660134661134662134663134664134665134666134667134668134669134670134671134672134673134674134675134676134677134678134679134680134681134682134683134684134685134686134687134688134689134690134691134692134693134694134695134696134697134698134699134700134701134702134703134704134705134706134707134708134709134710134711134712134713134714134715134716134717134718134719134720134721134722134723134724134725134726134727134728134729134730134731134732134733134734134735134736134737134738134739134740134741134742134743134744134745134746134747134748134749134750134751134752134753134754134755134756134757134758134759134760134761134762134763134764134765134766134767134768134769134770134771134772134773134774134775134776134777134778134779134780134781134782134783134784134785134786134787134788134789134790134791134792134793134794134795134796134797134798134799134800134801134802134803134804134805134806134807134808134809134810134811134812134813134814134815134816134817134818134819134820134821134822134823134824134825134826134827134828134829134830134831134832134833134834134835134836134837134838134839134840134841134842134843134844134845134846134847134848134849134850134851134852134853134854134855134856134857134858134859134860134861134862134863134864134865134866134867134868134869134870134871134872134873134874134875134876134877134878134879134880134881134882134883134884134885134886134887134888134889134890134891134892134893134894134895134896134897134898134899134900134901134902134903134904134905134906134907134908134909134910134911134912134913134914134915134916134917134918134919134920134921134922134923134924134925134926134927134928134929134930134931134932134933134934134935134936134937134938134939134940134941134942134943134944134945134946134947134948134949134950134951134952134953134954134955134956134957134958134959134960134961134962134963134964134965134966134967134968134969134970134971134972134973134974134975134976134977134978134979134980134981134982134983134984134985134986134987134988134989134990134991134992134993134994134995134996134997134998134999135000135001135002135003135004135005135006135007135008135009135010135011135012135013135014135015135016135017135018135019135020135021135022135023135024135025135026135027135028135029135030135031135032135033135034135035135036135037135038135039135040135041135042135043135044135045135046135047135048135049135050135051135052135053135054135055135056135057135058135059135060135061135062135063135064135065135066135067135068135069135070135071135072135073135074135075135076135077135078135079135080135081135082135083135084135085135086135087135088135089135090135091135092135093135094135095135096135097135098135099135100135101135102135103135104135105135106135107135108135109135110135111135112135113135114135115135116135117135118135119135120135121135122135123135124135125135126135127135128135129135130135131135132135133135134135135135136135137135138135139135140135141135142135143135144135145135146135147135148135149135150135151135152135153135154135155135156135157135158135159135160135161135162135163135164135165135166135167135168135169135170135171135172135173135174135175135176135177135178135179135180135181135182135183135184135185135186135187135188135189135190135191135192135193135194135195135196135197135198135199135200135201135202135203135204135205135206135207135208135209135210135211135212135213135214135215135216135217135218135219135220135221135222135223135224135225135226135227135228135229135230135231135232135233135234135235135236135237135238135239135240135241135242135243135244135245135246135247135248135249135250135251135252135253135254135255135256135257135258135259135260135261135262135263135264135265135266135267135268135269135270135271135272135273135274135275135276135277135278135279135280135281135282135283135284135285135286135287135288135289135290135291135292135293135294135295135296135297135298135299135300135301135302135303135304135305135306135307135308135309135310135311135312135313135314135315135316135317135318135319135320135321135322135323135324135325135326135327135328135329135330135331135332135333135334135335135336135337135338135339135340135341135342135343135344135345135346135347135348135349135350135351135352135353135354135355135356135357135358135359135360135361135362135363135364135365135366135367135368135369135370135371135372135373135374135375135376135377135378135379135380135381135382135383135384135385135386135387135388135389135390135391135392135393135394135395135396135397135398135399135400135401135402135403135404135405135406135407135408135409135410135411135412135413135414135415135416135417135418135419135420135421135422135423135424135425135426135427135428135429135430135431135432135433135434135435135436135437135438135439135440135441135442135443135444135445135446135447135448135449135450135451135452135453135454135455135456135457135458135459135460135461135462135463135464135465135466135467135468135469135470135471135472135473135474135475135476135477135478135479135480135481135482135483135484135485135486135487135488135489135490135491135492135493135494135495135496135497135498135499135500135501135502135503135504135505135506135507135508135509135510135511135512135513135514135515135516135517135518135519135520135521135522135523135524135525135526135527135528135529135530135531135532135533135534135535135536135537135538135539135540135541135542135543135544135545135546135547135548135549135550135551135552135553135554135555135556135557135558135559135560135561135562135563135564135565135566135567135568135569135570135571135572135573135574135575135576135577135578135579135580135581135582135583135584135585135586135587135588135589135590135591135592135593135594135595135596135597135598135599135600135601135602135603135604135605135606135607135608135609135610135611135612135613135614135615135616135617135618135619135620135621135622135623135624135625135626135627135628135629135630135631135632135633135634135635135636135637135638135639135640135641135642135643135644135645135646135647135648135649135650135651135652135653135654135655135656135657135658135659135660135661135662135663135664135665135666135667135668135669135670135671135672135673135674135675135676135677135678135679135680135681135682135683135684135685135686135687135688135689135690135691135692135693135694135695135696135697135698135699135700135701135702135703135704135705135706135707135708135709135710135711135712135713135714135715135716135717135718135719135720135721135722135723135724135725135726135727135728135729135730135731135732135733135734135735135736135737135738135739135740135741135742135743135744135745135746135747135748135749135750135751135752135753135754135755135756135757135758135759135760135761135762135763135764135765135766135767135768135769135770135771135772135773135774135775135776135777135778135779135780135781135782135783135784135785135786135787135788135789135790135791135792135793135794135795135796135797135798135799135800135801135802135803135804135805135806135807135808135809135810135811135812135813135814135815135816135817135818135819135820135821135822135823135824135825135826135827135828135829135830135831135832135833135834135835135836135837135838135839135840135841135842135843135844135845135846135847135848135849135850135851135852135853135854135855135856135857135858135859135860135861135862135863135864135865135866135867135868135869135870135871135872135873135874135875135876135877135878135879135880135881135882135883135884135885135886135887135888135889135890135891135892135893135894135895135896135897135898135899135900135901135902135903135904135905135906135907135908135909135910135911135912135913135914135915135916135917135918135919135920135921135922135923135924135925135926135927135928135929135930135931135932135933135934135935135936135937135938135939135940135941135942135943135944135945135946135947135948135949135950135951135952135953135954135955135956135957135958135959135960135961135962135963135964135965135966135967135968135969135970135971135972135973135974135975135976135977135978135979135980135981135982135983135984135985135986135987135988135989135990135991135992135993135994135995135996135997135998135999136000136001136002136003136004136005136006136007136008136009136010136011136012136013136014136015136016136017136018136019136020136021136022136023136024136025136026136027136028136029136030136031136032136033136034136035136036136037136038136039136040136041136042136043136044136045136046136047136048136049136050136051136052136053136054136055136056136057136058136059136060136061136062136063136064136065136066136067136068136069136070136071136072136073136074136075136076136077136078136079136080136081136082136083136084136085136086136087136088136089136090136091136092136093136094136095136096136097136098136099136100136101136102136103136104136105136106136107136108136109136110136111136112136113136114136115136116136117136118136119136120136121136122136123136124136125136126136127136128136129136130136131136132136133136134136135136136136137136138136139136140136141136142136143136144136145136146136147136148136149136150136151136152136153136154136155136156136157136158136159136160136161136162136163136164136165136166136167136168136169136170136171136172136173136174136175136176136177136178136179136180136181136182136183136184136185136186136187136188136189136190136191136192136193136194136195136196136197136198136199136200136201136202136203136204136205136206136207136208136209136210136211136212136213136214136215136216136217136218136219136220136221136222136223136224136225136226136227136228136229136230136231136232136233136234136235136236136237136238136239136240136241136242136243136244136245136246136247136248136249136250136251136252136253136254136255136256136257136258136259136260136261136262136263136264136265136266136267136268136269136270136271136272136273136274136275136276136277136278136279136280136281136282136283136284136285136286136287136288136289136290136291136292136293136294136295136296136297136298136299136300136301136302136303136304136305136306136307136308136309136310136311136312136313136314136315136316136317136318136319136320136321136322136323136324136325136326136327136328136329136330136331136332136333136334136335136336136337136338136339136340136341136342136343136344136345136346136347136348136349136350136351136352136353136354136355136356136357136358136359136360136361136362136363136364136365136366136367136368136369136370136371136372136373136374136375136376136377136378136379136380136381136382136383136384136385136386136387136388136389136390136391136392136393136394136395136396136397136398136399136400136401136402136403136404136405136406136407136408136409136410136411136412136413136414136415136416136417136418136419136420136421136422136423136424136425136426136427136428136429136430136431136432136433136434136435136436136437136438136439136440136441136442136443136444136445136446136447136448136449136450136451136452136453136454136455136456136457136458136459136460136461136462136463136464136465136466136467136468136469136470136471136472136473136474136475136476136477136478136479136480136481136482136483136484136485136486136487136488136489136490136491136492136493136494136495136496136497136498136499136500136501136502136503136504136505136506136507136508136509136510136511136512136513136514136515136516136517136518136519136520136521136522136523136524136525136526136527136528136529136530136531136532136533136534136535136536136537136538136539136540136541136542136543136544136545136546136547136548136549136550136551136552136553136554136555136556136557136558136559136560136561136562136563136564136565136566136567136568136569136570136571136572136573136574136575136576136577136578136579136580136581136582136583136584136585136586136587136588136589136590136591136592136593136594136595136596136597136598136599136600136601136602136603136604136605136606136607136608136609136610136611136612136613136614136615136616136617136618136619136620136621136622136623136624136625136626136627136628136629136630136631136632136633136634136635136636136637136638136639136640136641136642136643136644136645136646136647136648136649136650136651136652136653136654136655136656136657136658136659136660136661136662136663136664136665136666136667136668136669136670136671136672136673136674136675136676136677136678136679136680136681136682136683136684136685136686136687136688136689136690136691136692136693136694136695136696136697136698136699136700136701136702136703136704136705136706136707136708136709136710136711136712136713136714136715136716136717136718136719136720136721136722136723136724136725136726136727136728136729136730136731136732136733136734136735136736136737136738136739136740136741136742136743136744136745136746136747136748136749136750136751136752136753136754136755136756136757136758136759136760136761136762136763136764136765136766136767136768136769136770136771136772136773136774136775136776136777136778136779136780136781136782136783136784136785136786136787136788136789136790136791136792136793136794136795136796136797136798136799136800136801136802136803136804136805136806136807136808136809136810136811136812136813136814136815136816136817136818136819136820136821136822136823136824136825136826136827136828136829136830136831136832136833136834136835136836136837136838136839136840136841136842136843136844136845136846136847136848136849136850136851136852136853136854136855136856136857136858136859136860136861136862136863136864136865136866136867136868136869136870136871136872136873136874136875136876136877136878136879136880136881136882136883136884136885136886136887136888136889136890136891136892136893136894136895136896136897136898136899136900136901136902136903136904136905136906136907136908136909136910136911136912136913136914136915136916136917136918136919136920136921136922136923136924136925136926136927136928136929136930136931136932136933136934136935136936136937136938136939136940136941136942136943136944136945136946136947136948136949136950136951136952136953136954136955136956136957136958136959136960136961136962136963136964136965136966136967136968136969136970136971136972136973136974136975136976136977136978136979136980136981136982136983136984136985136986136987136988136989136990136991136992136993136994136995136996136997136998136999137000137001137002137003137004137005137006137007137008137009137010137011137012137013137014137015137016137017137018137019137020137021137022137023137024137025137026137027137028137029137030137031137032137033137034137035137036137037137038137039137040137041137042137043137044137045137046137047137048137049137050137051137052137053137054137055137056137057137058137059137060137061137062137063137064137065137066137067137068137069137070137071137072137073137074137075137076137077137078137079137080137081137082137083137084137085137086137087137088137089137090137091137092137093137094137095137096137097137098137099137100137101137102137103137104137105137106137107137108137109137110137111137112137113137114137115137116137117137118137119137120137121137122137123137124137125137126137127137128137129137130137131137132137133137134137135137136137137137138137139137140137141137142137143137144137145137146137147137148137149137150137151137152137153137154137155137156137157137158137159137160137161137162137163137164137165137166137167137168137169137170137171137172137173137174137175137176137177137178137179137180137181137182137183137184137185137186137187137188137189137190137191137192137193137194137195137196137197137198137199137200137201137202137203137204137205137206137207137208137209137210137211137212137213137214137215137216137217137218137219137220137221137222137223137224137225137226137227137228137229137230137231137232137233137234137235137236137237137238137239137240137241137242137243137244137245137246137247137248137249137250137251137252137253137254137255137256137257137258137259137260137261137262137263137264137265137266137267137268137269137270137271137272137273137274137275137276137277137278137279137280137281137282137283137284137285137286137287137288137289137290137291137292137293137294137295137296137297137298137299137300137301137302137303137304137305137306137307137308137309137310137311137312137313137314137315137316137317137318137319137320137321137322137323137324137325137326137327137328137329137330137331137332137333137334137335137336137337137338137339137340137341137342137343137344137345137346137347137348137349137350137351137352137353137354137355137356137357137358137359137360137361137362137363137364137365137366137367137368137369137370137371137372137373137374137375137376137377137378137379137380137381137382137383137384137385137386137387137388137389137390137391137392137393137394137395137396137397137398137399137400137401137402137403137404137405137406137407137408137409137410137411137412137413137414137415137416137417137418137419137420137421137422137423137424137425137426137427137428137429137430137431137432137433137434137435137436137437137438137439137440137441137442137443137444137445137446137447137448137449137450137451137452137453137454137455137456137457137458137459137460137461137462137463137464137465137466137467137468137469137470137471137472137473137474137475137476137477137478137479137480137481137482137483137484137485137486137487137488137489137490137491137492137493137494137495137496137497137498137499137500137501137502137503137504137505137506137507137508137509137510137511137512137513137514137515137516137517137518137519137520137521137522137523137524137525137526137527137528137529137530137531137532137533137534137535137536137537137538137539137540137541137542137543137544137545137546137547137548137549137550137551137552137553137554137555137556137557137558137559137560137561137562137563137564137565137566137567137568137569137570137571137572137573137574137575137576137577137578137579137580137581137582137583137584137585137586137587137588137589137590137591137592137593137594137595137596137597137598137599137600137601137602137603137604137605137606137607137608137609137610137611137612137613137614137615137616137617137618137619137620137621137622137623137624137625137626137627137628137629137630137631137632137633137634137635137636137637137638137639137640137641137642137643137644137645137646137647137648137649137650137651137652137653137654137655137656137657137658137659137660137661137662137663137664137665137666137667137668137669137670137671137672137673137674137675137676137677137678137679137680137681137682137683137684137685137686137687137688137689137690137691137692137693137694137695137696137697137698137699137700137701137702137703137704137705137706137707137708137709137710137711137712137713137714137715137716137717137718137719137720137721137722137723137724137725137726137727137728137729137730137731137732137733137734137735137736137737137738137739137740137741137742137743137744137745137746137747137748137749137750137751137752137753137754137755137756137757137758137759137760137761137762137763137764137765137766137767137768137769137770137771137772137773137774137775137776137777137778137779137780137781137782137783137784137785137786137787137788137789137790137791137792137793137794137795137796137797137798137799137800137801137802137803137804137805137806137807137808137809137810137811137812137813137814137815137816137817137818137819137820137821137822137823137824137825137826137827137828137829137830137831137832137833137834137835137836137837137838137839137840137841137842137843137844137845137846137847137848137849137850137851137852137853137854137855137856137857137858137859137860137861137862137863137864137865137866137867137868137869137870137871137872137873137874137875137876137877137878137879137880137881137882137883137884137885137886137887137888137889137890137891137892137893137894137895137896137897137898137899137900137901137902137903137904137905137906137907137908137909137910137911137912137913137914137915137916137917137918137919137920137921137922137923137924137925137926137927137928137929137930137931137932137933137934137935137936137937137938137939137940137941137942137943137944137945137946137947137948137949137950137951137952137953137954137955137956137957137958137959137960137961137962137963137964137965137966137967137968137969137970137971137972137973137974137975137976137977137978137979137980137981137982137983137984137985137986137987137988137989137990137991137992137993137994137995137996137997137998137999138000138001138002138003138004138005138006138007138008138009138010138011138012138013138014138015138016138017138018138019138020138021138022138023138024138025138026138027138028138029138030138031138032138033138034138035138036138037138038138039138040138041138042138043138044138045138046138047138048138049138050138051138052138053138054138055138056138057138058138059138060138061138062138063138064138065138066138067138068138069138070138071138072138073138074138075138076138077138078138079138080138081138082138083138084138085138086138087138088138089138090138091138092138093138094138095138096138097138098138099138100138101138102138103138104138105138106138107138108138109138110138111138112138113138114138115138116138117138118138119138120138121138122138123138124138125138126138127138128138129138130138131138132138133138134138135138136138137138138138139138140138141138142138143138144138145138146138147138148138149138150138151138152138153138154138155138156138157138158138159138160138161138162138163138164138165138166138167138168138169138170138171138172138173138174138175138176138177138178138179138180138181138182138183138184138185138186138187138188138189138190138191138192138193138194138195138196138197138198138199138200138201138202138203138204138205138206138207138208138209138210138211138212138213138214138215138216138217138218138219138220138221138222138223138224138225138226138227138228138229138230138231138232138233138234138235138236138237138238138239138240138241138242138243138244138245138246138247138248138249138250138251138252138253138254138255138256138257138258138259138260138261138262138263138264138265138266138267138268138269138270138271138272138273138274138275138276138277138278138279138280138281138282138283138284138285138286138287138288138289138290138291138292138293138294138295138296138297138298138299138300138301138302138303138304138305138306138307138308138309138310138311138312138313138314138315138316138317138318138319138320138321138322138323138324138325138326138327138328138329138330138331138332138333138334138335138336138337138338138339138340138341138342138343138344138345138346138347138348138349138350138351138352138353138354138355138356138357138358138359138360138361138362138363138364138365138366138367138368138369138370138371138372138373138374138375138376138377138378138379138380138381138382138383138384138385138386138387138388138389138390138391138392138393138394138395138396138397138398138399138400138401138402138403138404138405138406138407138408138409138410138411138412138413138414138415138416138417138418138419138420138421138422138423138424138425138426138427138428138429138430138431138432138433138434138435138436138437138438138439138440138441138442138443138444138445138446138447138448138449138450138451138452138453138454138455138456138457138458138459138460138461138462138463138464138465138466138467138468138469138470138471138472138473138474138475138476138477138478138479138480138481138482138483138484138485138486138487138488138489138490138491138492138493138494138495138496138497138498138499138500138501138502138503138504138505138506138507138508138509138510138511138512138513138514138515138516138517138518138519138520138521138522138523138524138525138526138527138528138529138530138531138532138533138534138535138536138537138538138539138540138541138542138543138544138545138546138547138548138549138550138551138552138553138554138555138556138557138558138559138560138561138562138563138564138565138566138567138568138569138570138571138572138573138574138575138576138577138578138579138580138581138582138583138584138585138586138587138588138589138590138591138592138593138594138595138596138597138598138599138600138601138602138603138604138605138606138607138608138609138610138611138612138613138614138615138616138617138618138619138620138621138622138623138624138625138626138627138628138629138630138631138632138633138634138635138636138637138638138639138640138641138642138643138644138645138646138647138648138649138650138651138652138653138654138655138656138657138658138659138660138661138662138663138664138665138666138667138668138669138670138671138672138673138674138675138676138677138678138679138680138681138682138683138684138685138686138687138688138689138690138691138692138693138694138695138696138697138698138699138700138701138702138703138704138705138706138707138708138709138710138711138712138713138714138715138716138717138718138719138720138721138722138723138724138725138726138727138728138729138730138731138732138733138734138735138736138737138738138739138740138741138742138743138744138745138746138747138748138749138750138751138752138753138754138755138756138757138758138759138760138761138762138763138764138765138766138767138768138769138770138771138772138773138774138775138776138777138778138779138780138781138782138783138784138785138786138787138788138789138790138791138792138793138794138795138796138797138798138799138800138801138802138803138804138805138806138807138808138809138810138811138812138813138814138815138816138817138818138819138820138821138822138823138824138825138826138827138828138829138830138831138832138833138834138835138836138837138838138839138840138841138842138843138844138845138846138847138848138849138850138851138852138853138854138855138856138857138858138859138860138861138862138863138864138865138866138867138868138869138870138871138872138873138874138875138876138877138878138879138880138881138882138883138884138885138886138887138888138889138890138891138892138893138894138895138896138897138898138899138900138901138902138903138904138905138906138907138908138909138910138911138912138913138914138915138916138917138918138919138920138921138922138923138924138925138926138927138928138929138930138931138932138933138934138935138936138937138938138939138940138941138942138943138944138945138946138947138948138949138950138951138952138953138954138955138956138957138958138959138960138961138962138963138964138965138966138967138968138969138970138971138972138973138974138975138976138977138978138979138980138981138982138983138984138985138986138987138988138989138990138991138992138993138994138995138996138997138998138999139000139001139002139003139004139005139006139007139008139009139010139011139012139013139014139015139016139017139018139019139020139021139022139023139024139025139026139027139028139029139030139031139032139033139034139035139036139037139038139039139040139041139042139043139044139045139046139047139048139049139050139051139052139053139054139055139056139057139058139059139060139061139062139063139064139065139066139067139068139069139070139071139072139073139074139075139076139077139078139079139080139081139082139083139084139085139086139087139088139089139090139091139092139093139094139095139096139097139098139099139100139101139102139103139104139105139106139107139108139109139110139111139112139113139114139115139116139117139118139119139120139121139122139123139124139125139126139127139128139129139130139131139132139133139134139135139136139137139138139139139140139141139142139143139144139145139146139147139148139149139150139151139152139153139154139155139156139157139158139159139160139161139162139163139164139165139166139167139168139169139170139171139172139173139174139175139176139177139178139179139180139181139182139183139184139185139186139187139188139189139190139191139192139193139194139195139196139197139198139199139200139201139202139203139204139205139206139207139208139209139210139211139212139213139214139215139216139217139218139219139220139221139222139223139224139225139226139227139228139229139230139231139232139233139234139235139236139237139238139239139240139241139242139243139244139245139246139247139248139249139250139251139252139253139254139255139256139257139258139259139260139261139262139263139264139265139266139267139268139269139270139271139272139273139274139275139276139277139278139279139280139281139282139283139284139285139286139287139288139289139290139291139292139293139294139295139296139297139298139299139300139301139302139303139304139305139306139307139308139309139310139311139312139313139314139315139316139317139318139319139320139321139322139323139324139325139326139327139328139329139330139331139332139333139334139335139336139337139338139339139340139341139342139343139344139345139346139347139348139349139350139351139352139353139354139355139356139357139358139359139360139361139362139363139364139365139366139367139368139369139370139371139372139373139374139375139376139377139378139379139380139381139382139383139384139385139386139387139388139389139390139391139392139393139394139395139396139397139398139399139400139401139402139403139404139405139406139407139408139409139410139411139412139413139414139415139416139417139418139419139420139421139422139423139424139425139426139427139428139429139430139431139432139433139434139435139436139437139438139439139440139441139442139443139444139445139446139447139448139449139450139451139452139453139454139455139456139457139458139459139460139461139462139463139464139465139466139467139468139469139470139471139472139473139474139475139476139477139478139479139480139481139482139483139484139485139486139487139488139489139490139491139492139493139494139495139496139497139498139499139500139501139502139503139504139505139506139507139508139509139510139511139512139513139514139515139516139517139518139519139520139521139522139523139524139525139526139527139528139529139530139531139532139533139534139535139536139537139538139539139540139541139542139543139544139545139546139547139548139549139550139551139552139553139554139555139556139557139558139559139560139561139562139563139564139565139566139567139568139569139570139571139572139573139574139575139576139577139578139579139580139581139582139583139584139585139586139587139588139589139590139591139592139593139594139595139596139597139598139599139600139601139602139603139604139605139606139607139608139609139610139611139612139613139614139615139616139617139618139619139620139621139622139623139624139625139626139627139628139629139630139631139632139633139634139635139636139637139638139639139640139641139642139643139644139645139646139647139648139649139650139651139652139653139654139655139656139657139658139659139660139661139662139663139664139665139666139667139668139669139670139671139672139673139674139675139676139677139678139679139680139681139682139683139684139685139686139687139688139689139690139691139692139693139694139695139696139697139698139699139700139701139702139703139704139705139706139707139708139709139710139711139712139713139714139715139716139717139718139719139720139721139722139723139724139725139726139727139728139729139730139731139732139733139734139735139736139737139738139739139740139741139742139743139744139745139746139747139748139749139750139751139752139753139754139755139756139757139758139759139760139761139762139763139764139765139766139767139768139769139770139771139772139773139774139775139776139777139778139779139780139781139782139783139784139785139786139787139788139789139790139791139792139793139794139795139796139797139798139799139800139801139802139803139804139805139806139807139808139809139810139811139812139813139814139815139816139817139818139819139820139821139822139823139824139825139826139827139828139829139830139831139832139833139834139835139836139837139838139839139840139841139842139843139844139845139846139847139848139849139850139851139852139853139854139855139856139857139858139859139860139861139862139863139864139865139866139867139868139869139870139871139872139873139874139875139876139877139878139879139880139881139882139883139884139885139886139887139888139889139890139891139892139893139894139895139896139897139898139899139900139901139902139903139904139905139906139907139908139909139910139911139912139913139914139915139916139917139918139919139920139921139922139923139924139925139926139927139928139929139930139931139932139933139934139935139936139937139938139939139940139941139942139943139944139945139946139947139948139949139950139951139952139953139954139955139956139957139958139959139960139961139962139963139964139965139966139967139968139969139970139971139972139973139974139975139976139977139978139979139980139981139982139983139984139985139986139987139988139989139990139991139992139993139994139995139996139997139998139999140000140001140002140003140004140005140006140007140008140009140010140011140012140013140014140015140016140017140018140019140020140021140022140023140024140025140026140027140028140029140030140031140032140033140034140035140036140037140038140039140040140041140042140043140044140045140046140047140048140049140050140051140052140053140054140055140056140057140058140059140060140061140062140063140064140065140066140067140068140069140070140071140072140073140074140075140076140077140078140079140080140081140082140083140084140085140086140087140088140089140090140091140092140093140094140095140096140097140098140099140100140101140102140103140104140105140106140107140108140109140110140111140112140113140114140115140116140117140118140119140120140121140122140123140124140125140126140127140128140129140130140131140132140133140134140135140136140137140138140139140140140141140142140143140144140145140146140147140148140149140150140151140152140153140154140155140156140157140158140159140160140161140162140163140164140165140166140167140168140169140170140171140172140173140174140175140176140177140178140179140180140181140182140183140184140185140186140187140188140189140190140191140192140193140194140195140196140197140198140199140200140201140202140203140204140205140206140207140208140209140210140211140212140213140214140215140216140217140218140219140220140221140222140223140224140225140226140227140228140229140230140231140232140233140234140235140236140237140238140239140240140241140242140243140244140245140246140247140248140249140250140251140252140253140254140255140256140257140258140259140260140261140262140263140264140265140266140267140268140269140270140271140272140273140274140275140276140277140278140279140280140281140282140283140284140285140286140287140288140289140290140291140292140293140294140295140296140297140298140299140300140301140302140303140304140305140306140307140308140309140310140311140312140313140314140315140316140317140318140319140320140321140322140323140324140325140326140327140328140329140330140331140332140333140334140335140336140337140338140339140340140341140342140343140344140345140346140347140348140349140350140351140352140353140354140355140356140357140358140359140360140361140362140363140364140365140366140367140368140369140370140371140372140373140374140375140376140377140378140379140380140381140382140383140384140385140386140387140388140389140390140391140392140393140394140395140396140397140398140399140400140401140402140403140404140405140406140407140408140409140410140411140412140413140414140415140416140417140418140419140420140421140422140423140424140425140426140427140428140429140430140431140432140433140434140435140436140437140438140439140440140441140442140443140444140445140446140447140448140449140450140451140452140453140454140455140456140457140458140459140460140461140462140463140464140465140466140467140468140469140470140471140472140473140474140475140476140477140478140479140480140481140482140483140484140485140486140487140488140489140490140491140492140493140494140495140496140497140498140499140500140501140502140503140504140505140506140507140508140509140510140511140512140513140514140515140516140517140518140519140520140521140522140523140524140525140526140527140528140529140530140531140532140533140534140535140536140537140538140539140540140541140542140543140544140545140546140547140548140549140550140551140552140553140554140555140556140557140558140559140560140561140562140563140564140565140566140567140568140569140570140571140572140573140574140575140576140577140578140579140580140581140582140583140584140585140586140587140588140589140590140591140592140593140594140595140596140597140598140599140600140601140602140603140604140605140606140607140608140609140610140611140612140613140614140615140616140617140618140619140620140621140622140623140624140625140626140627140628140629140630140631140632140633140634140635140636140637140638140639140640140641140642140643140644140645140646140647140648140649140650140651140652140653140654140655140656140657140658140659140660140661140662140663140664140665140666140667140668140669140670140671140672140673140674140675140676140677140678140679140680140681140682140683140684140685140686140687140688140689140690140691140692140693140694140695140696140697140698140699140700140701140702140703140704140705140706140707140708140709140710140711140712140713140714140715140716140717140718140719140720140721140722140723140724140725140726140727140728140729140730140731140732140733140734140735140736140737140738140739140740140741140742140743140744140745140746140747140748140749140750140751140752140753140754140755140756140757140758140759140760140761140762140763140764140765140766140767140768140769140770140771140772140773140774140775140776140777140778140779140780140781140782140783140784140785140786140787140788140789140790140791140792140793140794140795140796140797140798140799140800140801140802140803140804140805140806140807140808140809140810140811140812140813140814140815140816140817140818140819140820140821140822140823140824140825140826140827140828140829140830140831140832140833140834140835140836140837140838140839140840140841140842140843140844140845140846140847140848140849140850140851140852140853140854140855140856140857140858140859140860140861140862140863140864140865140866140867140868140869140870140871140872140873140874140875140876140877140878140879140880140881140882140883140884140885140886140887140888140889140890140891140892140893140894140895140896140897140898140899140900140901140902140903140904140905140906140907140908140909140910140911140912140913140914140915140916140917140918140919140920140921140922140923140924140925140926140927140928140929140930140931140932140933140934140935140936140937140938140939140940140941140942140943140944140945140946140947140948140949140950140951140952140953140954140955140956140957140958140959140960140961140962140963140964140965140966140967140968140969140970140971140972140973140974140975140976140977140978140979140980140981140982140983140984140985140986140987140988140989140990140991140992140993140994140995140996140997140998140999141000141001141002141003141004141005141006141007141008141009141010141011141012141013141014141015141016141017141018141019141020141021141022141023141024141025141026141027141028141029141030141031141032141033141034141035141036141037141038141039141040141041141042141043141044141045141046141047141048141049141050141051141052141053141054141055141056141057141058141059141060141061141062141063141064141065141066141067141068141069141070141071141072141073141074141075141076141077141078141079141080141081141082141083141084141085141086141087141088141089141090141091141092141093141094141095141096141097141098141099141100141101141102141103141104141105141106141107141108141109141110141111141112141113141114141115141116141117141118141119141120141121141122141123141124141125141126141127141128141129141130141131141132141133141134141135141136141137141138141139141140141141141142141143141144141145141146141147141148141149141150141151141152141153141154141155141156141157141158141159141160141161141162141163141164141165141166141167141168141169141170141171141172141173141174141175141176141177141178141179141180141181141182141183141184141185141186141187141188141189141190141191141192141193141194141195141196141197141198141199141200141201141202141203141204141205141206141207141208141209141210141211141212141213141214141215141216141217141218141219141220141221141222141223141224141225141226141227141228141229141230141231141232141233141234141235141236141237141238141239141240141241141242141243141244141245141246141247141248141249141250141251141252141253141254141255141256141257141258141259141260141261141262141263141264141265141266141267141268141269141270141271141272141273141274141275141276141277141278141279141280141281141282141283141284141285141286141287141288141289141290141291141292141293141294141295141296141297141298141299141300141301141302141303141304141305141306141307141308141309141310141311141312141313141314141315141316141317141318141319141320141321141322141323141324141325141326141327141328141329141330141331141332141333141334141335141336141337141338141339141340141341141342141343141344141345141346141347141348141349141350141351141352141353141354141355141356141357141358141359141360141361141362141363141364141365141366141367141368141369141370141371141372141373141374141375141376141377141378141379141380141381141382141383141384141385141386141387141388141389141390141391141392141393141394141395141396141397141398141399141400141401141402141403141404141405141406141407141408141409141410141411141412141413141414141415141416141417141418141419141420141421141422141423141424141425141426141427141428141429141430141431141432141433141434141435141436141437141438141439141440141441141442141443141444141445141446141447141448141449141450141451141452141453141454141455141456141457141458141459141460141461141462141463141464141465141466141467141468141469141470141471141472141473141474141475141476141477141478141479141480141481141482141483141484141485141486141487141488141489141490141491141492141493141494141495141496141497141498141499141500141501141502141503141504141505141506141507141508141509141510141511141512141513141514141515141516141517141518141519141520141521141522141523141524141525141526141527141528141529141530141531141532141533141534141535141536141537141538141539141540141541141542141543141544141545141546141547141548141549141550141551141552141553141554141555141556141557141558141559141560141561141562141563141564141565141566141567141568141569141570141571141572141573141574141575141576141577141578141579141580141581141582141583141584141585141586141587141588141589141590141591141592141593141594141595141596141597141598141599141600141601141602141603141604141605141606141607141608141609141610141611141612141613141614141615141616141617141618141619141620141621141622141623141624141625141626141627141628141629141630141631141632141633141634141635141636141637141638141639141640141641141642141643141644141645141646141647141648141649141650141651141652141653141654141655141656141657141658141659141660141661141662141663141664141665141666141667141668141669141670141671141672141673141674141675141676141677141678141679141680141681141682141683141684141685141686141687141688141689141690141691141692141693141694141695141696141697141698141699141700141701141702141703141704141705141706141707141708141709141710141711141712141713141714141715141716141717141718141719141720141721141722141723141724141725141726141727141728141729141730141731141732141733141734141735141736141737141738141739141740141741141742141743141744141745141746141747141748141749141750141751141752141753141754141755141756141757141758141759141760141761141762141763141764141765141766141767141768141769141770141771141772141773141774141775141776141777141778141779141780141781141782141783141784141785141786141787141788141789141790141791141792141793141794141795141796141797141798141799141800141801141802141803141804141805141806141807141808141809141810141811141812141813141814141815141816141817141818141819141820141821141822141823141824141825141826141827141828141829141830141831141832141833141834141835141836141837141838141839141840141841141842141843141844141845141846141847141848141849141850141851141852141853141854141855141856141857141858141859141860141861141862141863141864141865141866141867141868141869141870141871141872141873141874141875141876141877141878141879141880141881141882141883141884141885141886141887141888141889141890141891141892141893141894141895141896141897141898141899141900141901141902141903141904141905141906141907141908141909141910141911141912141913141914141915141916141917141918141919141920141921141922141923141924141925141926141927141928141929141930141931141932141933141934141935141936141937141938141939141940141941141942141943141944141945141946141947141948141949141950141951141952141953141954141955141956141957141958141959141960141961141962141963141964141965141966141967141968141969141970141971141972141973141974141975141976141977141978141979141980141981141982141983141984141985141986141987141988141989141990141991141992141993141994141995141996141997141998141999142000142001142002142003142004142005142006142007142008142009142010142011142012142013142014142015142016142017142018142019142020142021142022142023142024142025142026142027142028142029142030142031142032142033142034142035142036142037142038142039142040142041142042142043142044142045142046142047142048142049142050142051142052142053142054142055142056142057142058142059142060142061142062142063142064142065142066142067142068142069142070142071142072142073142074142075142076142077142078142079142080142081142082142083142084142085142086142087142088142089142090142091142092142093142094142095142096142097142098142099142100142101142102142103142104142105142106142107142108142109142110142111142112142113142114142115142116142117142118142119142120142121142122142123142124142125142126142127142128142129142130142131142132142133142134142135142136142137142138142139142140142141142142142143142144142145142146142147142148142149142150142151142152142153142154142155142156142157142158142159142160142161142162142163142164142165142166142167142168142169142170142171142172142173142174142175142176142177142178142179142180142181142182142183142184142185142186142187142188142189142190142191142192142193142194142195142196142197142198142199142200142201142202142203142204142205142206142207142208142209142210142211142212142213142214142215142216142217142218142219142220142221142222142223142224142225142226142227142228142229142230142231142232142233142234142235142236142237142238142239142240142241142242142243142244142245142246142247142248142249142250142251142252142253142254142255142256142257142258142259142260142261142262142263142264142265142266142267142268142269142270142271142272142273142274142275142276142277142278142279142280142281142282142283142284142285142286142287142288142289142290142291142292142293142294142295142296142297142298142299142300142301142302142303142304142305142306142307142308142309142310142311142312142313142314142315142316142317142318142319142320142321142322142323142324142325142326142327142328142329142330142331142332142333142334142335142336142337142338142339142340142341142342142343142344142345142346142347142348142349142350142351142352142353142354142355142356142357142358142359142360142361142362142363142364142365142366142367142368142369142370142371142372142373142374142375142376142377142378142379142380142381142382142383142384142385142386142387142388142389142390142391142392142393142394142395142396142397142398142399142400142401142402142403142404142405142406142407142408142409142410142411142412142413142414142415142416142417142418142419142420142421142422142423142424142425142426142427142428142429142430142431142432142433142434142435142436142437142438142439142440142441142442142443142444142445142446142447142448142449142450142451142452142453142454142455142456142457142458142459142460142461142462142463142464142465142466142467142468142469142470142471142472142473142474142475142476142477142478142479142480142481142482142483142484142485142486142487142488142489142490142491142492142493142494142495142496142497142498142499142500142501142502142503142504142505142506142507142508142509142510142511142512142513142514142515142516142517142518142519142520142521142522142523142524142525142526142527142528142529142530142531142532142533142534142535142536142537142538142539142540142541142542142543142544142545142546142547142548142549142550142551142552142553142554142555142556142557142558142559142560142561142562142563142564142565142566142567142568142569142570142571142572142573142574142575142576142577142578142579142580142581142582142583142584142585142586142587142588142589142590142591142592142593142594142595142596142597142598142599142600142601142602142603142604142605142606142607142608142609142610142611142612142613142614142615142616142617142618142619142620142621142622142623142624142625142626142627142628142629142630142631142632142633142634142635142636142637142638142639142640142641142642142643142644142645142646142647142648142649142650142651142652142653142654142655142656142657142658142659142660142661142662142663142664142665142666142667142668142669142670142671142672142673142674142675142676142677142678142679142680142681142682142683142684142685142686142687142688142689142690142691142692142693142694142695142696142697142698142699142700142701142702142703142704142705142706142707142708142709142710142711142712142713142714142715142716142717142718142719142720142721142722142723142724142725142726142727142728142729142730142731142732142733142734142735142736142737142738142739142740142741142742142743142744142745142746142747142748142749142750142751142752142753142754142755142756142757142758142759142760142761142762142763142764142765142766142767142768142769142770142771142772142773142774142775142776142777142778142779142780142781142782142783142784142785142786142787142788142789142790142791142792142793142794142795142796142797142798142799142800142801142802142803142804142805142806142807142808142809142810142811142812142813142814142815142816142817142818142819142820142821142822142823142824142825142826142827142828142829142830142831142832142833142834142835142836142837142838142839142840142841142842142843142844142845142846142847142848142849142850142851142852142853142854142855142856142857142858142859142860142861142862142863142864142865142866142867142868142869142870142871142872142873142874142875142876142877142878142879142880142881142882142883142884142885142886142887142888142889142890142891142892142893142894142895142896142897142898142899142900142901142902142903142904142905142906142907142908142909142910142911142912142913142914142915142916142917142918142919142920142921142922142923142924142925142926142927142928142929142930142931142932142933142934142935142936142937142938142939142940142941142942142943142944142945142946142947142948142949142950142951142952142953142954142955142956142957142958142959142960142961142962142963142964142965142966142967142968142969142970142971142972142973142974142975142976142977142978142979142980142981142982142983142984142985142986142987142988142989142990142991142992142993142994142995142996142997142998142999143000143001143002143003143004143005143006143007143008143009143010143011143012143013143014143015143016143017143018143019143020143021143022143023143024143025143026143027143028143029143030143031143032143033143034143035143036143037143038143039143040143041143042143043143044143045143046143047143048143049143050143051143052143053143054143055143056143057143058143059143060143061143062143063143064143065143066143067143068143069143070143071143072143073143074143075143076143077143078143079143080143081143082143083143084143085143086143087143088143089143090143091143092143093143094143095143096143097143098143099143100143101143102143103143104143105143106143107143108143109143110143111143112143113143114143115143116143117143118143119143120143121143122143123143124143125143126143127143128143129143130143131143132143133143134143135143136143137143138143139143140143141143142143143143144143145143146143147143148143149143150143151143152143153143154143155143156143157143158143159143160143161143162143163143164143165143166143167143168143169143170143171143172143173143174143175143176143177143178143179143180143181143182143183143184143185143186143187143188143189143190143191143192143193143194143195143196143197143198143199143200143201143202143203143204143205143206143207143208143209143210143211143212143213143214143215143216143217143218143219143220143221143222143223143224143225143226143227143228143229143230143231143232143233143234143235143236143237143238143239143240143241143242143243143244143245143246143247143248143249143250143251143252143253143254143255143256143257143258143259143260143261143262143263143264143265143266143267143268143269143270143271143272143273143274143275143276143277143278143279143280143281143282143283143284143285143286143287143288143289143290143291143292143293143294143295143296143297143298143299143300143301143302143303143304143305143306143307143308143309143310143311143312143313143314143315143316143317143318143319143320143321143322143323143324143325143326143327143328143329143330143331143332143333143334143335143336143337143338143339143340143341143342143343143344143345143346143347143348143349143350143351143352143353143354143355143356143357143358143359143360143361143362143363143364143365143366143367143368143369143370143371143372143373143374143375143376143377143378143379143380143381143382143383143384143385143386143387143388143389143390143391143392143393143394143395143396143397143398143399143400143401143402143403143404143405143406143407143408143409143410143411143412143413143414143415143416143417143418143419143420143421143422143423143424143425143426143427143428143429143430143431143432143433143434143435143436143437143438143439143440143441143442143443143444143445143446143447143448143449143450143451143452143453143454143455143456143457143458143459143460143461143462143463143464143465143466143467143468143469143470143471143472143473143474143475143476143477143478143479143480143481143482143483143484143485143486143487143488143489143490143491143492143493143494143495143496143497143498143499143500143501143502143503143504143505143506143507143508143509143510143511143512143513143514143515143516143517143518143519143520143521143522143523143524143525143526143527143528143529143530143531143532143533143534143535143536143537143538143539143540143541143542143543143544143545143546143547143548143549143550143551143552143553143554143555143556143557143558143559143560143561143562143563143564143565143566143567143568143569143570143571143572143573143574143575143576143577143578143579143580143581143582143583143584143585143586143587143588143589143590143591143592143593143594143595143596143597143598143599143600143601143602143603143604143605143606143607143608143609143610143611143612143613143614143615143616143617143618143619143620143621143622143623143624143625143626143627143628143629143630143631143632143633143634143635143636143637143638143639143640143641143642143643143644143645143646143647143648143649143650143651143652143653143654143655143656143657143658143659143660143661143662143663143664143665143666143667143668143669143670143671143672143673143674143675143676143677143678143679143680143681143682143683143684143685143686143687143688143689143690143691143692143693143694143695143696143697143698143699143700143701143702143703143704143705143706143707143708143709143710143711143712143713143714143715143716143717143718143719143720143721143722143723143724143725143726143727143728143729143730143731143732143733143734143735143736143737143738143739143740143741143742143743143744143745143746143747143748143749143750143751143752143753143754143755143756143757143758143759143760143761143762143763143764143765143766143767143768143769143770143771143772143773143774143775143776143777143778143779143780143781143782143783143784143785143786143787143788143789143790143791143792143793143794143795143796143797143798143799143800143801143802143803143804143805143806143807143808143809143810143811143812143813143814143815143816143817143818143819143820143821143822143823143824143825143826143827143828143829143830143831143832143833143834143835143836143837143838143839143840143841143842143843143844143845143846143847143848143849143850143851143852143853143854143855143856143857143858143859143860143861143862143863143864143865143866143867143868143869143870143871143872143873143874143875143876143877143878143879143880143881143882143883143884143885143886143887143888143889143890143891143892143893143894143895143896143897143898143899143900143901143902143903143904143905143906143907143908143909143910143911143912143913143914143915143916143917143918143919143920143921143922143923143924143925143926143927143928143929143930143931143932143933143934143935143936143937143938143939143940143941143942143943143944143945143946143947143948143949143950143951143952143953143954143955143956143957143958143959143960143961143962143963143964143965143966143967143968143969143970143971143972143973143974143975143976143977143978143979143980143981143982143983143984143985143986143987143988143989143990143991143992143993143994143995143996143997143998143999144000144001144002144003144004144005144006144007144008144009144010144011144012144013144014144015144016144017144018144019144020144021144022144023144024144025144026144027144028144029144030144031144032144033144034144035144036144037144038144039144040144041144042144043144044144045144046144047144048144049144050144051144052144053144054144055144056144057144058144059144060144061144062144063144064144065144066144067144068144069144070144071144072144073144074144075144076144077144078144079144080144081144082144083144084144085144086144087144088144089144090144091144092144093144094144095144096144097144098144099144100144101144102144103144104144105144106144107144108144109144110144111144112144113144114144115144116144117144118144119144120144121144122144123144124144125144126144127144128144129144130144131144132144133144134144135144136144137144138144139144140144141144142144143144144144145144146144147144148144149144150144151144152144153144154144155144156144157144158144159144160144161144162144163144164144165144166144167144168144169144170144171144172144173144174144175144176144177144178144179144180144181144182144183144184144185144186144187144188144189144190144191144192144193144194144195144196144197144198144199144200144201144202144203144204144205144206144207144208144209144210144211144212144213144214144215144216144217144218144219144220144221144222144223144224144225144226144227144228144229144230144231144232144233144234144235144236144237144238144239144240144241144242144243144244144245144246144247144248144249144250144251144252144253144254144255144256144257144258144259144260144261144262144263144264144265144266144267144268144269144270144271144272144273144274144275144276144277144278144279144280144281144282144283144284144285144286144287144288144289144290144291144292144293144294144295144296144297144298144299144300144301144302144303144304144305144306144307144308144309144310144311144312144313144314144315144316144317144318144319144320144321144322144323144324144325144326144327144328144329144330144331144332144333144334144335144336144337144338144339144340144341144342144343144344144345144346144347144348144349144350144351144352144353144354144355144356144357144358144359144360144361144362144363144364144365144366144367144368144369144370144371144372144373144374144375144376144377144378144379144380144381144382144383144384144385144386144387144388144389144390144391144392144393144394144395144396144397144398144399144400144401144402144403144404144405144406144407144408144409144410144411144412144413144414144415144416144417144418144419144420144421144422144423144424144425144426144427144428144429144430144431144432144433144434144435144436144437144438144439144440144441144442144443144444144445144446144447144448144449144450144451144452144453144454144455144456144457144458144459144460144461144462144463144464144465144466144467144468144469144470144471144472144473144474144475144476144477144478144479144480144481144482144483144484144485144486144487144488144489144490144491144492144493144494144495144496144497144498144499144500144501144502144503144504144505144506144507144508144509144510144511144512144513144514144515144516144517144518144519144520144521144522144523144524144525144526144527144528144529144530144531144532144533144534144535144536144537144538144539144540144541144542144543144544144545144546144547144548144549144550144551144552144553144554144555144556144557144558144559144560144561144562144563144564144565144566144567144568144569144570144571144572144573144574144575144576144577144578144579144580144581144582144583144584144585144586144587144588144589144590144591144592144593144594144595144596144597144598144599144600144601144602144603144604144605144606144607144608144609144610144611144612144613144614144615144616144617144618144619144620144621144622144623144624144625144626144627144628144629144630144631144632144633144634144635144636144637144638144639144640144641144642144643144644144645144646144647144648144649144650144651144652144653144654144655144656144657144658144659144660144661144662144663144664144665144666144667144668144669144670144671144672144673144674144675144676144677144678144679144680144681144682144683144684144685144686144687144688144689144690144691144692144693144694144695144696144697144698144699144700144701144702144703144704144705144706144707144708144709144710144711144712144713144714144715144716144717144718144719144720144721144722144723144724144725144726144727144728144729144730144731144732144733144734144735144736144737144738144739144740144741144742144743144744144745144746144747144748144749144750144751144752144753144754144755144756144757144758144759144760144761144762144763144764144765144766144767144768144769144770144771144772144773144774144775144776144777144778144779144780144781144782144783144784144785144786144787144788144789144790144791144792144793144794144795144796144797144798144799144800144801144802144803144804144805144806144807144808144809144810144811144812144813144814144815144816144817144818144819144820144821144822144823144824144825144826144827144828144829144830144831144832144833144834144835144836144837144838144839144840144841144842144843144844144845144846144847144848144849144850144851144852144853144854144855144856144857144858144859144860144861144862144863144864144865144866144867144868144869144870144871144872144873144874144875144876144877144878144879144880144881144882144883144884144885144886144887144888144889144890144891144892144893144894144895144896144897144898144899144900144901144902144903144904144905144906144907144908144909144910144911144912144913144914144915144916144917144918144919144920144921144922144923144924144925144926144927144928144929144930144931144932144933144934144935144936144937144938144939144940144941144942144943144944144945144946144947144948144949144950144951144952144953144954144955144956144957144958144959144960144961144962144963144964144965144966144967144968144969144970144971144972144973144974144975144976144977144978144979144980144981144982144983144984144985144986144987144988144989144990144991144992144993144994144995144996144997144998144999145000145001145002145003145004145005145006145007145008145009145010145011145012145013145014145015145016145017145018145019145020145021145022145023145024145025145026145027145028145029145030145031145032145033145034145035145036145037145038145039145040145041145042145043145044145045145046145047145048145049145050145051145052145053145054145055145056145057145058145059145060145061145062145063145064145065145066145067145068145069145070145071145072145073145074145075145076145077145078145079145080145081145082145083145084145085145086145087145088145089145090145091145092145093145094145095145096145097145098145099145100145101145102145103145104145105145106145107145108145109145110145111145112145113145114145115145116145117145118145119145120145121145122145123145124145125145126145127145128145129145130145131145132145133145134145135145136145137145138145139145140145141145142145143145144145145145146145147145148145149145150145151145152145153145154145155145156145157145158145159145160145161145162145163145164145165145166145167145168145169145170145171145172145173145174145175145176145177145178145179145180145181145182145183145184145185145186145187145188145189145190145191145192145193145194145195145196145197145198145199145200145201145202145203145204145205145206145207145208145209145210145211145212145213145214145215145216145217145218145219145220145221145222145223145224145225145226145227145228145229145230145231145232145233145234145235145236145237145238145239145240145241145242145243145244145245145246145247145248145249145250145251145252145253145254145255145256145257145258145259145260145261145262145263145264145265145266145267145268145269145270145271145272145273145274145275145276145277145278145279145280145281145282145283145284145285145286145287145288145289145290145291145292145293145294145295145296145297145298145299145300145301145302145303145304145305145306145307145308145309145310145311145312145313145314145315145316145317145318145319145320145321145322145323145324145325145326145327145328145329145330145331145332145333145334145335145336145337145338145339145340145341145342145343145344145345145346145347145348145349145350145351145352145353145354145355145356145357145358145359145360145361145362145363145364145365145366145367145368145369145370145371145372145373145374145375145376145377145378145379145380145381145382145383145384145385145386145387145388145389145390145391145392145393145394145395145396145397145398145399145400145401145402145403145404145405145406145407145408145409145410145411145412145413145414145415145416145417145418145419145420145421145422145423145424145425145426145427145428145429145430145431145432145433145434145435145436145437145438145439145440145441145442145443145444145445145446145447145448145449145450145451145452145453145454145455145456145457145458145459145460145461145462145463145464145465145466145467145468145469145470145471145472145473145474145475145476145477145478145479145480145481145482145483145484145485145486145487145488145489145490145491145492145493145494145495145496145497145498145499145500145501145502145503145504145505145506145507145508145509145510145511145512145513145514145515145516145517145518145519145520145521145522145523145524145525145526145527145528145529145530145531145532145533145534145535145536145537145538145539145540145541145542145543145544145545145546145547145548145549145550145551145552145553145554145555145556145557145558145559145560145561145562145563145564145565145566145567145568145569145570145571145572145573145574145575145576145577145578145579145580145581145582145583145584145585145586145587145588145589145590145591145592145593145594145595145596145597145598145599145600145601145602145603145604145605145606145607145608145609145610145611145612145613145614145615145616145617145618145619145620145621145622145623145624145625145626145627145628145629145630145631145632145633145634145635145636145637145638145639145640145641145642145643145644145645145646145647145648145649145650145651145652145653145654145655145656145657145658145659145660145661145662145663145664145665145666145667145668145669145670145671145672145673145674145675145676145677145678145679145680145681145682145683145684145685145686145687145688145689145690145691145692145693145694145695145696145697145698145699145700145701145702145703145704145705145706145707145708145709145710145711145712145713145714145715145716145717145718145719145720145721145722145723145724145725145726145727145728145729145730145731145732145733145734145735145736145737145738145739145740145741145742145743145744145745145746145747145748145749145750145751145752145753145754145755145756145757145758145759145760145761145762145763145764145765145766145767145768145769145770145771145772145773145774145775145776145777145778145779145780145781145782145783145784145785145786145787145788145789145790145791145792145793145794145795145796145797145798145799145800145801145802145803145804145805145806145807145808145809145810145811145812145813145814145815145816145817145818145819145820145821145822145823145824145825145826145827145828145829145830145831145832145833145834145835145836145837145838145839145840145841145842145843145844145845145846145847145848145849145850145851145852145853145854145855145856145857145858145859145860145861145862145863145864145865145866145867145868145869145870145871145872145873145874145875145876145877145878145879145880145881145882145883145884145885145886145887145888145889145890145891145892145893145894145895145896145897145898145899145900145901145902145903145904145905145906145907145908145909145910145911145912145913145914145915145916145917145918145919145920145921145922145923145924145925145926145927145928145929145930145931145932145933145934145935145936145937145938145939145940145941145942145943145944145945145946145947145948145949145950145951145952145953145954145955145956145957145958145959145960145961145962145963145964145965145966145967145968145969145970145971145972145973145974145975145976145977145978145979145980145981145982145983145984145985145986145987145988145989145990145991145992145993145994145995145996145997145998145999146000146001146002146003146004146005146006146007146008146009146010146011146012146013146014146015146016146017146018146019146020146021146022146023146024146025146026146027146028146029146030146031146032146033146034146035146036146037146038146039146040146041146042146043146044146045146046146047146048146049146050146051146052146053146054146055146056146057146058146059146060146061146062146063146064146065146066146067146068146069146070146071146072146073146074146075146076146077146078146079146080146081146082146083146084146085146086146087146088146089146090146091146092146093146094146095146096146097146098146099146100146101146102146103146104146105146106146107146108146109146110146111146112146113146114146115146116146117146118146119146120146121146122146123146124146125146126146127146128146129146130146131146132146133146134146135146136146137146138146139146140146141146142146143146144146145146146146147146148146149146150146151146152146153146154146155146156146157146158146159146160146161146162146163146164146165146166146167146168146169146170146171146172146173146174146175146176146177146178146179146180146181146182146183146184146185146186146187146188146189146190146191146192146193146194146195146196146197146198146199146200146201146202146203146204146205146206146207146208146209146210146211146212146213146214146215146216146217146218146219146220146221146222146223146224146225146226146227146228146229146230146231146232146233146234146235146236146237146238146239146240146241146242146243146244146245146246146247146248146249146250146251146252146253146254146255146256146257146258146259146260146261146262146263146264146265146266146267146268146269146270146271146272146273146274146275146276146277146278146279146280146281146282146283146284146285146286146287146288146289146290146291146292146293146294146295146296146297146298146299146300146301146302146303146304146305146306146307146308146309146310146311146312146313146314146315146316146317146318146319146320146321146322146323146324146325146326146327146328146329146330146331146332146333146334146335146336146337146338146339146340146341146342146343146344146345146346146347146348146349146350146351146352146353146354146355146356146357146358146359146360146361146362146363146364146365146366146367146368146369146370146371146372146373146374146375146376146377146378146379146380146381146382146383146384146385146386146387146388146389146390146391146392146393146394146395146396146397146398146399146400146401146402146403146404146405146406146407146408146409146410146411146412146413146414146415146416146417146418146419146420146421146422146423146424146425146426146427146428146429146430146431146432146433146434146435146436146437146438146439146440146441146442146443146444146445146446146447146448146449146450146451146452146453146454146455146456146457146458146459146460146461146462146463146464146465146466146467146468146469146470146471146472146473146474146475146476146477146478146479146480146481146482146483146484146485146486146487146488146489146490146491146492146493146494146495146496146497146498146499146500146501146502146503146504146505146506146507146508146509146510146511146512146513146514146515146516146517146518146519146520146521146522146523146524146525146526146527146528146529146530146531146532146533146534146535146536146537146538146539146540146541146542146543146544146545146546146547146548146549146550146551146552146553146554146555146556146557146558146559146560146561146562146563146564146565146566146567146568146569146570146571146572146573146574146575146576146577146578146579146580146581146582146583146584146585146586146587146588146589146590146591146592146593146594146595146596146597146598146599146600146601146602146603146604146605146606146607146608146609146610146611146612146613146614146615146616146617146618146619146620146621146622146623146624146625146626146627146628146629146630146631146632146633146634146635146636146637146638146639146640146641146642146643146644146645146646146647146648146649146650146651146652146653146654146655146656146657146658146659146660146661146662146663146664146665146666146667146668146669146670146671146672146673146674146675146676146677146678146679146680146681146682146683146684146685146686146687146688146689146690146691146692146693146694146695146696146697146698146699146700146701146702146703146704146705146706146707146708146709146710146711146712146713146714146715146716146717146718146719146720146721146722146723146724146725146726146727146728146729146730146731146732146733146734146735146736146737146738146739146740146741146742146743146744146745146746146747146748146749146750146751146752146753146754146755146756146757146758146759146760146761146762146763146764146765146766146767146768146769146770146771146772146773146774146775146776146777146778146779146780146781146782146783146784146785146786146787146788146789146790146791146792146793146794146795146796146797146798146799146800146801146802146803146804146805146806146807146808146809146810146811146812146813146814146815146816146817146818146819146820146821146822146823146824146825146826146827146828146829146830146831146832146833146834146835146836146837146838146839146840146841146842146843146844146845146846146847146848146849146850146851146852146853146854146855146856146857146858146859146860146861146862146863146864146865146866146867146868146869146870146871146872146873146874146875146876146877146878146879146880146881146882146883146884146885146886146887146888146889146890146891146892146893146894146895146896146897146898146899146900146901146902146903146904146905146906146907146908146909146910146911146912146913146914146915146916146917146918146919146920146921146922146923146924146925146926146927146928146929146930146931146932146933146934146935146936146937146938146939146940146941146942146943146944146945146946146947146948146949146950146951146952146953146954146955146956146957146958146959146960146961146962146963146964146965146966146967146968146969146970146971146972146973146974146975146976146977146978146979146980146981146982146983146984146985146986146987146988146989146990146991146992146993146994146995146996146997146998146999147000147001147002147003147004147005147006147007147008147009147010147011147012147013147014147015147016147017147018147019147020147021147022147023147024147025147026147027147028147029147030147031147032147033147034147035147036147037147038147039147040147041147042147043147044147045147046147047147048147049147050147051147052147053147054147055147056147057147058147059147060147061147062147063147064147065147066147067147068147069147070147071147072147073147074147075147076147077147078147079147080147081147082147083147084147085147086147087147088147089147090147091147092147093147094147095147096147097147098147099147100147101147102147103147104147105147106147107147108147109147110147111147112147113147114147115147116147117147118147119147120147121147122147123147124147125147126147127147128147129147130147131147132147133147134147135147136147137147138147139147140147141147142147143147144147145147146147147147148147149147150147151147152147153147154147155147156147157147158147159147160147161147162147163147164147165147166147167147168147169147170147171147172147173147174147175147176147177147178147179147180147181147182147183147184147185147186147187147188147189147190147191147192147193147194147195147196147197147198147199147200147201147202147203147204147205147206147207147208147209147210147211147212147213147214147215147216147217147218147219147220147221147222147223147224147225147226147227147228147229147230147231147232147233147234147235147236147237147238147239147240147241147242147243147244147245147246147247147248147249147250147251147252147253147254147255147256147257147258147259147260147261147262147263147264147265147266147267147268147269147270147271147272147273147274147275147276147277147278147279147280147281147282147283147284147285147286147287147288147289147290147291147292147293147294147295147296147297147298147299147300147301147302147303147304147305147306147307147308147309147310147311147312147313147314147315147316147317147318147319147320147321147322147323147324147325147326147327147328147329147330147331147332147333147334147335147336147337147338147339147340147341147342147343147344147345147346147347147348147349147350147351147352147353147354147355147356147357147358147359147360147361147362147363147364147365147366147367147368147369147370147371147372147373147374147375147376147377147378147379147380147381147382147383147384147385147386147387147388147389147390147391147392147393147394147395147396147397147398147399147400147401147402147403147404147405147406147407147408147409147410147411147412147413147414147415147416147417147418147419147420147421147422147423147424147425147426147427147428147429147430147431147432147433147434147435147436147437147438147439147440147441147442147443147444147445147446147447147448147449147450147451147452147453147454147455147456147457147458147459147460147461147462147463147464147465147466147467147468147469147470147471147472147473147474147475147476147477147478147479147480147481147482147483147484147485147486147487147488147489147490147491147492147493147494147495147496147497147498147499147500147501147502147503147504147505147506147507147508147509147510147511147512147513147514147515147516147517147518147519147520147521147522147523147524147525147526147527147528147529147530147531147532147533147534147535147536147537147538147539147540147541147542147543147544147545147546147547147548147549147550147551147552147553147554147555147556147557147558147559147560147561147562147563147564147565147566147567147568147569147570147571147572147573147574147575147576147577147578147579147580147581147582147583147584147585147586147587147588147589147590147591147592147593147594147595147596147597147598147599147600147601147602147603147604147605147606147607147608147609147610147611147612147613147614147615147616147617147618147619147620147621147622147623147624147625147626147627147628147629147630147631147632147633147634147635147636147637147638147639147640147641147642147643147644147645147646147647147648147649147650147651147652147653147654147655147656147657147658147659147660147661147662147663147664147665147666147667147668147669147670147671147672147673147674147675147676147677147678147679147680147681147682147683147684147685147686147687147688147689147690147691147692147693147694147695147696147697147698147699147700147701147702147703147704147705147706147707147708147709147710147711147712147713147714147715147716147717147718147719147720147721147722147723147724147725147726147727147728147729147730147731147732147733147734147735147736147737147738147739147740147741147742147743147744147745147746147747147748147749147750147751147752147753147754147755147756147757147758147759147760147761147762147763147764147765147766147767147768147769147770147771147772147773147774147775147776147777147778147779147780147781147782147783147784147785147786147787147788147789147790147791147792147793147794147795147796147797147798147799147800147801147802147803147804147805147806147807147808147809147810147811147812147813147814147815147816147817147818147819147820147821147822147823147824147825147826147827147828147829147830147831147832147833147834147835147836147837147838147839147840147841147842147843147844147845147846147847147848147849147850147851147852147853147854147855147856147857147858147859147860147861147862147863147864147865147866147867147868147869147870147871147872147873147874147875147876147877147878147879147880147881147882147883147884147885147886147887147888147889147890147891147892147893147894147895147896147897147898147899147900147901147902147903147904147905147906147907147908147909147910147911147912147913147914147915147916147917147918147919147920147921147922147923147924147925147926147927147928147929147930147931147932147933147934147935147936147937147938147939147940147941147942147943147944147945147946147947147948147949147950147951147952147953147954147955147956147957147958147959147960147961147962147963147964147965147966147967147968147969147970147971147972147973147974147975147976147977147978147979147980147981147982147983147984147985147986147987147988147989147990147991147992147993147994147995147996147997147998147999148000148001148002148003148004148005148006148007148008148009148010148011148012148013148014148015148016148017148018148019148020148021148022148023148024148025148026148027148028148029148030148031148032148033148034148035148036148037148038148039148040148041148042148043148044148045148046148047148048148049148050148051148052148053148054148055148056148057148058148059148060148061148062148063148064148065148066148067148068148069148070148071148072148073148074148075148076148077148078148079148080148081148082148083148084148085148086148087148088148089148090148091148092148093148094148095148096148097148098148099148100148101148102148103148104148105148106148107148108148109148110148111148112148113148114148115148116148117148118148119148120148121148122148123148124148125148126148127148128148129148130148131148132148133148134148135148136148137148138148139148140148141148142148143148144148145148146148147148148148149148150148151148152148153148154148155148156148157148158148159148160148161148162148163148164148165148166148167148168148169148170148171148172148173148174148175148176148177148178148179148180148181148182148183148184148185148186148187148188148189148190148191148192148193148194148195148196148197148198148199148200148201148202148203148204148205148206148207148208148209148210148211148212148213148214148215148216148217148218148219148220148221148222148223148224148225148226148227148228148229148230148231148232148233148234148235148236148237148238148239148240148241148242148243148244148245148246148247148248148249148250148251148252148253148254148255148256148257148258148259148260148261148262148263148264148265148266148267148268148269148270148271148272148273148274148275148276148277148278148279148280148281148282148283148284148285148286148287148288148289148290148291148292148293148294148295148296148297148298148299148300148301148302148303148304148305148306148307148308148309148310148311148312148313148314148315148316148317148318148319148320148321148322148323148324148325148326148327148328148329148330148331148332148333148334148335148336148337148338148339148340148341148342148343148344148345148346148347148348148349148350148351148352148353148354148355148356148357148358148359148360148361148362148363148364148365148366148367148368148369148370148371148372148373148374148375148376148377148378148379148380148381148382148383148384148385148386148387148388148389148390148391148392148393148394148395148396148397148398148399148400148401148402148403148404148405148406148407148408148409148410148411148412148413148414148415148416148417148418148419148420148421148422148423148424148425148426148427148428148429148430148431148432148433148434148435148436148437148438148439148440148441148442148443148444148445148446148447148448148449148450148451148452148453148454148455148456148457148458148459148460148461148462148463148464148465148466148467148468148469148470148471148472148473148474148475148476148477148478148479148480148481148482148483148484148485148486148487148488148489148490148491148492148493148494148495148496148497148498148499148500148501148502148503148504148505148506148507148508148509148510148511148512148513148514148515148516148517148518148519148520148521148522148523148524148525148526148527148528148529148530148531148532148533148534148535148536148537148538148539148540148541148542148543148544148545148546148547148548148549148550148551148552148553148554148555148556148557148558148559148560148561148562148563148564148565148566148567148568148569148570148571148572148573148574148575148576148577148578148579148580148581148582148583148584148585148586148587148588148589148590148591148592148593148594148595148596148597148598148599148600148601148602148603148604148605148606148607148608148609148610148611148612148613148614148615148616148617148618148619148620148621148622148623148624148625148626148627148628148629148630148631148632148633148634148635148636148637148638148639148640148641148642148643148644148645148646148647148648148649148650148651148652148653148654148655148656148657148658148659148660148661148662148663148664148665148666148667148668148669148670148671148672148673148674148675148676148677148678148679148680148681148682148683148684148685148686148687148688148689148690148691148692148693148694148695148696148697148698148699148700148701148702148703148704148705148706148707148708148709148710148711148712148713148714148715148716148717148718148719148720148721148722148723148724148725148726148727148728148729148730148731148732148733148734148735148736148737148738148739148740148741148742148743148744148745148746148747148748148749148750148751148752148753148754148755148756148757148758148759148760148761148762148763148764148765148766148767148768148769148770148771148772148773148774148775148776148777148778148779148780148781148782148783148784148785148786148787148788148789148790148791148792148793148794148795148796148797148798148799148800148801148802148803148804148805148806148807148808148809148810148811148812148813148814148815148816148817148818148819148820148821148822148823148824148825148826148827148828148829148830148831148832148833148834148835148836148837148838148839148840148841148842148843148844148845148846148847148848148849148850148851148852148853148854148855148856148857148858148859148860148861148862148863148864148865148866148867148868148869148870148871148872148873148874148875148876148877148878148879148880148881148882148883148884148885148886148887148888148889148890148891148892148893148894148895148896148897148898148899148900148901148902148903148904148905148906148907148908148909148910148911148912148913148914148915148916148917148918148919148920148921148922148923148924148925148926148927148928148929148930148931148932148933148934148935148936148937148938148939148940148941148942148943148944148945148946148947148948148949148950148951148952148953148954148955148956148957148958148959148960148961148962148963148964148965148966148967148968148969148970148971148972148973148974148975148976148977148978148979148980148981148982148983148984148985148986148987148988148989148990148991148992148993148994148995148996148997148998148999149000149001149002149003149004149005149006149007149008149009149010149011149012149013149014149015149016149017149018149019149020149021149022149023149024149025149026149027149028149029149030149031149032149033149034149035149036149037149038149039149040149041149042149043149044149045149046149047149048149049149050149051149052149053149054149055149056149057149058149059149060149061149062149063149064149065149066149067149068149069149070149071149072149073149074149075149076149077149078149079149080149081149082149083149084149085149086149087149088149089149090149091149092149093149094149095149096149097149098149099149100149101149102149103149104149105149106149107149108149109149110149111149112149113149114149115149116149117149118149119149120149121149122149123149124149125149126149127149128149129149130149131149132149133149134149135149136149137149138149139149140149141149142149143149144149145149146149147149148149149149150149151149152149153149154149155149156149157149158149159149160149161149162149163149164149165149166149167149168149169149170149171149172149173149174149175149176149177149178149179149180149181149182149183149184149185149186149187149188149189149190149191149192149193149194149195149196149197149198149199149200149201149202149203149204149205149206149207149208149209149210149211149212149213149214149215149216149217149218149219149220149221149222149223149224149225149226149227149228149229149230149231149232149233149234149235149236149237149238149239149240149241149242149243149244149245149246149247149248149249149250149251149252149253149254149255149256149257149258149259149260149261149262149263149264149265149266149267149268149269149270149271149272149273149274149275149276149277149278149279149280149281149282149283149284149285149286149287149288149289149290149291149292149293149294149295149296149297149298149299149300149301149302149303149304149305149306149307149308149309149310149311149312149313149314149315149316149317149318149319149320149321149322149323149324149325149326149327149328149329149330149331149332149333149334149335149336149337149338149339149340149341149342149343149344149345149346149347149348149349149350149351149352149353149354149355149356149357149358149359149360149361149362149363149364149365149366149367149368149369149370149371149372149373149374149375149376149377149378149379149380149381149382149383149384149385149386149387149388149389149390149391149392149393149394149395149396149397149398149399149400149401149402149403149404149405149406149407149408149409149410149411149412149413149414149415149416149417149418149419149420149421149422149423149424149425149426149427149428149429149430149431149432149433149434149435149436149437149438149439149440149441149442149443149444149445149446149447149448149449149450149451149452149453149454149455149456149457149458149459149460149461149462149463149464149465149466149467149468149469149470149471149472149473149474149475149476149477149478149479149480149481149482149483149484149485149486149487149488149489149490149491149492149493149494149495149496149497149498149499149500149501149502149503149504149505149506149507149508149509149510149511149512149513149514149515149516149517149518149519149520149521149522149523149524149525149526149527149528149529149530149531149532149533149534149535149536149537149538149539149540149541149542149543149544149545149546149547149548149549149550149551149552149553149554149555149556149557149558149559149560149561149562149563149564149565149566149567149568149569149570149571149572149573149574149575149576149577149578149579149580149581149582149583149584149585149586149587149588149589149590149591149592149593149594149595149596149597149598149599149600149601149602149603149604149605149606149607149608149609149610149611149612149613149614149615149616149617149618149619149620149621149622149623149624149625149626149627149628149629149630149631149632149633149634149635149636149637149638149639149640149641149642149643149644149645149646149647149648149649149650149651149652149653149654149655149656149657149658149659149660149661149662149663149664149665149666149667149668149669149670149671149672149673149674149675149676149677149678149679149680149681149682149683149684149685149686149687149688149689149690149691149692149693149694149695149696149697149698149699149700149701149702149703149704149705149706149707149708149709149710149711149712149713149714149715149716149717149718149719149720149721149722149723149724149725149726149727149728149729149730149731149732149733149734149735149736149737149738149739149740149741149742149743149744149745149746149747149748149749149750149751149752149753149754149755149756149757149758149759149760149761149762149763149764149765149766149767149768149769149770149771149772149773149774149775149776149777149778149779149780149781149782149783149784149785149786149787149788149789149790149791149792149793149794149795149796149797149798149799149800149801149802149803149804149805149806149807149808149809149810149811149812149813149814149815149816149817149818149819149820149821149822149823149824149825149826149827149828149829149830149831149832149833149834149835149836149837149838149839149840149841149842149843149844149845149846149847149848149849149850149851149852149853149854149855149856149857149858149859149860149861149862149863149864149865149866149867149868149869149870149871149872149873149874149875149876149877149878149879149880149881149882149883149884149885149886149887149888149889149890149891149892149893149894149895149896149897149898149899149900149901149902149903149904149905149906149907149908149909149910149911149912149913149914149915149916149917149918149919149920149921149922149923149924149925149926149927149928149929149930149931149932149933149934149935149936149937149938149939149940149941149942149943149944149945149946149947149948149949149950149951149952149953149954149955149956149957149958149959149960149961149962149963149964149965149966149967149968149969149970149971149972149973149974149975149976149977149978149979149980149981149982149983149984149985149986149987149988149989149990149991149992149993149994149995149996149997149998149999150000150001150002150003150004150005150006150007150008150009150010150011150012150013150014150015150016150017150018150019150020150021150022150023150024150025150026150027150028150029150030150031150032150033150034150035150036150037150038150039150040150041150042150043150044150045150046150047150048150049150050150051150052150053150054150055150056150057150058150059150060150061150062150063150064150065150066150067150068150069150070150071150072150073150074150075150076150077150078150079150080150081150082150083150084150085150086150087150088150089150090150091150092150093150094150095150096150097150098150099150100150101150102150103150104150105150106150107150108150109150110150111150112150113150114150115150116150117150118150119150120150121150122150123150124150125150126150127150128150129150130150131150132150133150134150135150136150137150138150139150140150141150142150143150144150145150146150147150148150149150150150151150152150153150154150155150156150157150158150159150160150161150162150163150164150165150166150167150168150169150170150171150172150173150174150175150176150177150178150179150180150181150182150183150184150185150186150187150188150189150190150191150192150193150194150195150196150197150198150199150200150201150202150203150204150205150206150207150208150209150210150211150212150213150214150215150216150217150218150219150220150221150222150223150224150225150226150227150228150229150230150231150232150233150234150235150236150237150238150239150240150241150242150243150244150245150246150247150248150249150250150251150252150253150254150255150256150257150258150259150260150261150262150263150264150265150266150267150268150269150270150271150272150273150274150275150276150277150278150279150280150281150282150283150284150285150286150287150288150289150290150291150292150293150294150295150296150297150298150299150300150301150302150303150304150305150306150307150308150309150310150311150312150313150314150315150316150317150318150319150320150321150322150323150324150325150326150327150328150329150330150331150332150333150334150335150336150337150338150339150340150341150342150343150344150345150346150347150348150349150350150351150352150353150354150355150356150357150358150359150360150361150362150363150364150365150366150367150368150369150370150371150372150373150374150375150376150377150378150379150380150381150382150383150384150385150386150387150388150389150390150391150392150393150394150395150396150397150398150399150400150401150402150403150404150405150406150407150408150409150410150411150412150413150414150415150416150417150418150419150420150421150422150423150424150425150426150427150428150429150430150431150432150433150434150435150436150437150438150439150440150441150442150443150444150445150446150447150448150449150450150451150452150453150454150455150456150457150458150459150460150461150462150463150464150465150466150467150468150469150470150471150472150473150474150475150476150477150478150479150480150481150482150483150484150485150486150487150488150489150490150491150492150493150494150495150496150497150498150499150500150501150502150503150504150505150506150507150508150509150510150511150512150513150514150515150516150517150518150519150520150521150522150523150524150525150526150527150528150529150530150531150532150533150534150535150536150537150538150539150540150541150542150543150544150545150546150547150548150549150550150551150552150553150554150555150556150557150558150559150560150561150562150563150564150565150566150567150568150569150570150571150572150573150574150575150576150577150578150579150580150581150582150583150584150585150586150587150588150589150590150591150592150593150594150595150596150597150598150599150600150601150602150603150604150605150606150607150608150609150610150611150612150613150614150615150616150617150618150619150620150621150622150623150624150625150626150627150628150629150630150631150632150633150634150635150636150637150638150639150640150641150642150643150644150645150646150647150648150649150650150651150652150653150654150655150656150657150658150659150660150661150662150663150664150665150666150667150668150669150670150671150672150673150674150675150676150677150678150679150680150681150682150683150684150685150686150687150688150689150690150691150692150693150694150695150696150697150698150699150700150701150702150703150704150705150706150707150708150709150710150711150712150713150714150715150716150717150718150719150720150721150722150723150724150725150726150727150728150729150730150731150732150733150734150735150736150737150738150739150740150741150742150743150744150745150746150747150748150749150750150751150752150753150754150755150756150757150758150759150760150761150762150763150764150765150766150767150768150769150770150771150772150773150774150775150776150777150778150779150780150781150782150783150784150785150786150787150788150789150790150791150792150793150794150795150796150797150798150799150800150801150802150803150804150805150806150807150808150809150810150811150812150813150814150815150816150817150818150819150820150821150822150823150824150825150826150827150828150829150830150831150832150833150834150835150836150837150838150839150840150841150842150843150844150845150846150847150848150849150850150851150852150853150854150855150856150857150858150859150860150861150862150863150864150865150866150867150868150869150870150871150872150873150874150875150876150877150878150879150880150881150882150883150884150885150886150887150888150889150890150891150892150893150894150895150896150897150898150899150900150901150902150903150904150905150906150907150908150909150910150911150912150913150914150915150916150917150918150919150920150921150922150923150924150925150926150927150928150929150930150931150932150933150934150935150936150937150938150939150940150941150942150943150944150945150946150947150948150949150950150951150952150953150954150955150956150957150958150959150960150961150962150963150964150965150966150967150968150969150970150971150972150973150974150975150976150977150978150979150980150981150982150983150984150985150986150987150988150989150990150991150992150993150994150995150996150997150998150999151000151001151002151003151004151005151006151007151008151009151010151011151012151013151014151015151016151017151018151019151020151021151022151023151024151025151026151027151028151029151030151031151032151033151034151035151036151037151038151039151040151041151042151043151044151045151046151047151048151049151050151051151052151053151054151055151056151057151058151059151060151061151062151063151064151065151066151067151068151069151070151071151072151073151074151075151076151077151078151079151080151081151082151083151084151085151086151087151088151089151090151091151092151093151094151095151096151097151098151099151100151101151102151103151104151105151106151107151108151109151110151111151112151113151114151115151116151117151118151119151120151121151122151123151124151125151126151127151128151129151130151131151132151133151134151135151136151137151138151139151140151141151142151143151144151145151146151147151148151149151150151151151152151153151154151155151156151157151158151159151160151161151162151163151164151165151166151167151168151169151170151171151172151173151174151175151176151177151178151179151180151181151182151183151184151185151186151187151188151189151190151191151192151193151194151195151196151197151198151199151200151201151202151203151204151205151206151207151208151209151210151211151212151213151214151215151216151217151218151219151220151221151222151223151224151225151226151227151228151229151230151231151232151233151234151235151236151237151238151239151240151241151242151243151244151245151246151247151248151249151250151251151252151253151254151255151256151257151258151259151260151261151262151263151264151265151266151267151268151269151270151271151272151273151274151275151276151277151278151279151280151281151282151283151284151285151286151287151288151289151290151291151292151293151294151295151296151297151298151299151300151301151302151303151304151305151306151307151308151309151310151311151312151313151314151315151316151317151318151319151320151321151322151323151324151325151326151327151328151329151330151331151332151333151334151335151336151337151338151339151340151341151342151343151344151345151346151347151348151349151350151351151352151353151354151355151356151357151358151359151360151361151362151363151364151365151366151367151368151369151370151371151372151373151374151375151376151377151378151379151380151381151382151383151384151385151386151387151388151389151390151391151392151393151394151395151396151397151398151399151400151401151402151403151404151405151406151407151408151409151410151411151412151413151414151415151416151417151418151419151420151421151422151423151424151425151426151427151428151429151430151431151432151433151434151435151436151437151438151439151440151441151442151443151444151445151446151447151448151449151450151451151452151453151454151455151456151457151458151459151460151461151462151463151464151465151466151467151468151469151470151471151472151473151474151475151476151477151478151479151480151481151482151483151484151485151486151487151488151489151490151491151492151493151494151495151496151497151498151499151500151501151502151503151504151505151506151507151508151509151510151511151512151513151514151515151516151517151518151519151520151521151522151523151524151525151526151527151528151529151530151531151532151533151534151535151536151537151538151539151540151541151542151543151544151545151546151547151548151549151550151551151552151553151554151555151556151557151558151559151560151561151562151563151564151565151566151567151568151569151570151571151572151573151574151575151576151577151578151579151580151581151582151583151584151585151586151587151588151589151590151591151592151593151594151595151596151597151598151599151600151601151602151603151604151605151606151607151608151609151610151611151612151613151614151615151616151617151618151619151620151621151622151623151624151625151626151627151628151629151630151631151632151633151634151635151636151637151638151639151640151641151642151643151644151645151646151647151648151649151650151651151652151653151654151655151656151657151658151659151660151661151662151663151664151665151666151667151668151669151670151671151672151673151674151675151676151677151678151679151680151681151682151683151684151685151686151687151688151689151690151691151692151693151694151695151696151697151698151699151700151701151702151703151704151705151706151707151708151709151710151711151712151713151714151715151716151717151718151719151720151721151722151723151724151725151726151727151728151729151730151731151732151733151734151735151736151737151738151739151740151741151742151743151744151745151746151747151748151749151750151751151752151753151754151755151756151757151758151759151760151761151762151763151764151765151766151767151768151769151770151771151772151773151774151775151776151777151778151779151780151781151782151783151784151785151786151787151788151789151790151791151792151793151794151795151796151797151798151799151800151801151802151803151804151805151806151807151808151809151810151811151812151813151814151815151816151817151818151819151820151821151822151823151824151825151826151827151828151829151830151831151832151833151834151835151836151837151838151839151840151841151842151843151844151845151846151847151848151849151850151851151852151853151854151855151856151857151858151859151860151861151862151863151864151865151866151867151868151869151870151871151872151873151874151875151876151877151878151879151880151881151882151883151884151885151886151887151888151889151890151891151892151893151894151895151896151897151898151899151900151901151902151903151904151905151906151907151908151909151910151911151912151913151914151915151916151917151918151919151920151921151922151923151924151925151926151927151928151929151930151931151932151933151934151935151936151937151938151939151940151941151942151943151944151945151946151947151948151949151950151951151952151953151954151955151956151957151958151959151960151961151962151963151964151965151966151967151968151969151970151971151972151973151974151975151976151977151978151979151980151981151982151983151984151985151986151987151988151989151990151991151992151993151994151995151996151997151998151999152000152001152002152003152004152005152006152007152008152009152010152011152012152013152014152015152016152017152018152019152020152021152022152023152024152025152026152027152028152029152030152031152032152033152034152035152036152037152038152039152040152041152042152043152044152045152046152047152048152049152050152051152052152053152054152055152056152057152058152059152060152061152062152063152064152065152066152067152068152069152070152071152072152073152074152075152076152077152078152079152080152081152082152083152084152085152086152087152088152089152090152091152092152093152094152095152096152097152098152099152100152101152102152103152104152105152106152107152108152109152110152111152112152113152114152115152116152117152118152119152120152121152122152123152124152125152126152127152128152129152130152131152132152133152134152135152136152137152138152139152140152141152142152143152144152145152146152147152148152149152150152151152152152153152154152155152156152157152158152159152160152161152162152163152164152165152166152167152168152169152170152171152172152173152174152175152176152177152178152179152180152181152182152183152184152185152186152187152188152189152190152191152192152193152194152195152196152197152198152199152200152201152202152203152204152205152206152207152208152209152210152211152212152213152214152215152216152217152218152219152220152221152222152223152224152225152226152227152228152229152230152231152232152233152234152235152236152237152238152239152240152241152242152243152244152245152246152247152248152249152250152251152252152253152254152255152256152257152258152259152260152261152262152263152264152265152266152267152268152269152270152271152272152273152274152275152276152277152278152279152280152281152282152283152284152285152286152287152288152289152290152291152292152293152294152295152296152297152298152299152300152301152302152303152304152305152306152307152308152309152310152311152312152313152314152315152316152317152318152319152320152321152322152323152324152325152326152327152328152329152330152331152332152333152334152335152336152337152338152339152340152341152342152343152344152345152346152347152348152349152350152351152352152353152354152355152356152357152358152359152360152361152362152363152364152365152366152367152368152369152370152371152372152373152374152375152376152377152378152379152380152381152382152383152384152385152386152387152388152389152390152391152392152393152394152395152396152397152398152399152400152401152402152403152404152405152406152407152408152409152410152411152412152413152414152415152416152417152418152419152420152421152422152423152424152425152426152427152428152429152430152431152432152433152434152435152436152437152438152439152440152441152442152443152444152445152446152447152448152449152450152451152452152453152454152455152456152457152458152459152460152461152462152463152464152465152466152467152468152469152470152471152472152473152474152475152476152477152478152479152480152481152482152483152484152485152486152487152488152489152490152491152492152493152494152495152496152497152498152499152500152501152502152503152504152505152506152507152508152509152510152511152512152513152514152515152516152517152518152519152520152521152522152523152524152525152526152527152528152529152530152531152532152533152534152535152536152537152538152539152540152541152542152543152544152545152546152547152548152549152550152551152552152553152554152555152556152557152558152559152560152561152562152563152564152565152566152567152568152569152570152571152572152573152574152575152576152577152578152579152580152581152582152583152584152585152586152587152588152589152590152591152592152593152594152595152596152597152598152599152600152601152602152603152604152605152606152607152608152609152610152611152612152613152614152615152616152617152618152619152620152621152622152623152624152625152626152627152628152629152630152631152632152633152634152635152636152637152638152639152640152641152642152643152644152645152646152647152648152649152650152651152652152653152654152655152656152657152658152659152660152661152662152663152664152665152666152667152668152669152670152671152672152673152674152675152676152677152678152679152680152681152682152683152684152685152686152687152688152689152690152691152692152693152694152695152696152697152698152699152700152701152702152703152704152705152706152707152708152709152710152711152712152713152714152715152716152717152718152719152720152721152722152723152724152725152726152727152728152729152730152731152732152733152734152735152736152737152738152739152740152741152742152743152744152745152746152747152748152749152750152751152752152753152754152755152756152757152758152759152760152761152762152763152764152765152766152767152768152769152770152771152772152773152774152775152776152777152778152779152780152781152782152783152784152785152786152787152788152789152790152791152792152793152794152795152796152797152798152799152800152801152802152803152804152805152806152807152808152809152810152811152812152813152814152815152816152817152818152819152820152821152822152823152824152825152826152827152828152829152830152831152832152833152834152835152836152837152838152839152840152841152842152843152844152845152846152847152848152849152850152851152852152853152854152855152856152857152858152859152860152861152862152863152864152865152866152867152868152869152870152871152872152873152874152875152876152877152878152879152880152881152882152883152884152885152886152887152888152889152890152891152892152893152894152895152896152897152898152899152900152901152902152903152904152905152906152907152908152909152910152911152912152913152914152915152916152917152918152919152920152921152922152923152924152925152926152927152928152929152930152931152932152933152934152935152936152937152938152939152940152941152942152943152944152945152946152947152948152949152950152951152952152953152954152955152956152957152958152959152960152961152962152963152964152965152966152967152968152969152970152971152972152973152974152975152976152977152978152979152980152981152982152983152984152985152986152987152988152989152990152991152992152993152994152995152996152997152998152999153000153001153002153003153004153005153006153007153008153009153010153011153012153013153014153015153016153017153018153019153020153021153022153023153024153025153026153027153028153029153030153031153032153033153034153035153036153037153038153039153040153041153042153043153044153045153046153047153048153049153050153051153052153053153054153055153056153057153058153059153060153061153062153063153064153065153066153067153068153069153070153071153072153073153074153075153076153077153078153079153080153081153082153083153084153085153086153087153088153089153090153091153092153093153094153095153096153097153098153099153100153101153102153103153104153105153106153107153108153109153110153111153112153113153114153115153116153117153118153119153120153121153122153123153124153125153126153127153128153129153130153131153132153133153134153135153136153137153138153139153140153141153142153143153144153145153146153147153148153149153150153151153152153153153154153155153156153157153158153159153160153161153162153163153164153165153166153167153168153169153170153171153172153173153174153175153176153177153178153179153180153181153182153183153184153185153186153187153188153189153190153191153192153193153194153195153196153197153198153199153200153201153202153203153204153205153206153207153208153209153210153211153212153213153214153215153216153217153218153219153220153221153222153223153224153225153226153227153228153229153230153231153232153233153234153235153236153237153238153239153240153241153242153243153244153245153246153247153248153249153250153251153252153253153254153255153256153257153258153259153260153261153262153263153264153265153266153267153268153269153270153271153272153273153274153275153276153277153278153279153280153281153282153283153284153285153286153287153288153289153290153291153292153293153294153295153296153297153298153299153300153301153302153303153304153305153306153307153308153309153310153311153312153313153314153315153316153317153318153319153320153321153322153323153324153325153326153327153328153329153330153331153332153333153334153335153336153337153338153339153340153341153342153343153344153345153346153347153348153349153350153351153352153353153354153355153356153357153358153359153360153361153362153363153364153365153366153367153368153369153370153371153372153373153374153375153376153377153378153379153380153381153382153383153384153385153386153387153388153389153390153391153392153393153394153395153396153397153398153399153400153401153402153403153404153405153406153407153408153409153410153411153412153413153414153415153416153417153418153419153420153421153422153423153424153425153426153427153428153429153430153431153432153433153434153435153436153437153438153439153440153441153442153443153444153445153446153447153448153449153450153451153452153453153454153455153456153457153458153459153460153461153462153463153464153465153466153467153468153469153470153471153472153473153474153475153476153477153478153479153480153481153482153483153484153485153486153487153488153489153490153491153492153493153494153495153496153497153498153499153500153501153502153503153504153505153506153507153508153509153510153511153512153513153514153515153516153517153518153519153520153521153522153523153524153525153526153527153528153529153530153531153532153533153534153535153536153537153538153539153540153541153542153543153544153545153546153547153548153549153550153551153552153553153554153555153556153557153558153559153560153561153562153563153564153565153566153567153568153569153570153571153572153573153574153575153576153577153578153579153580153581153582153583153584153585153586153587153588153589153590153591153592153593153594153595153596153597153598153599153600153601153602153603153604153605153606153607153608153609153610153611153612153613153614153615153616153617153618153619153620153621153622153623153624153625153626153627153628153629153630153631153632153633153634153635153636153637153638153639153640153641153642153643153644153645153646153647153648153649153650153651153652153653153654153655153656153657153658153659153660153661153662153663153664153665153666153667153668153669153670153671153672153673153674153675153676153677153678153679153680153681153682153683153684153685153686153687153688153689153690153691153692153693153694153695153696153697153698153699153700153701153702153703153704153705153706153707153708153709153710153711153712153713153714153715153716153717153718153719153720153721153722153723153724153725153726153727153728153729153730153731153732153733153734153735153736153737153738153739153740153741153742153743153744153745153746153747153748153749153750153751153752153753153754153755153756153757153758153759153760153761153762153763153764153765153766153767153768153769153770153771153772153773153774153775153776153777153778153779153780153781153782153783153784153785153786153787153788153789153790153791153792153793153794153795153796153797153798153799153800153801153802153803153804153805153806153807153808153809153810153811153812153813153814153815153816153817153818153819153820153821153822153823153824153825153826153827153828153829153830153831153832153833153834153835153836153837153838153839153840153841153842153843153844153845153846153847153848153849153850153851153852153853153854153855153856153857153858153859153860153861153862153863153864153865153866153867153868153869153870153871153872153873153874153875153876153877153878153879153880153881153882153883153884153885153886153887153888153889153890153891153892153893153894153895153896153897153898153899153900153901153902153903153904153905153906153907153908153909153910153911153912153913153914153915153916153917153918153919153920153921153922153923153924153925153926153927153928153929153930153931153932153933153934153935153936153937153938153939153940153941153942153943153944153945153946153947153948153949153950153951153952153953153954153955153956153957153958153959153960153961153962153963153964153965153966153967153968153969153970153971153972153973153974153975153976153977153978153979153980153981153982153983153984153985153986153987153988153989153990153991153992153993153994
  1. /* sp.c
  2. *
  3. * Copyright (C) 2006-2022 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. /* Implementation by Sean Parkinson. */
  22. #ifdef HAVE_CONFIG_H
  23. #include <config.h>
  24. #endif
  25. #include <wolfssl/wolfcrypt/settings.h>
  26. #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH) || \
  27. defined(WOLFSSL_HAVE_SP_ECC)
  28. #include <wolfssl/wolfcrypt/error-crypt.h>
  29. #include <wolfssl/wolfcrypt/cpuid.h>
  30. #ifdef NO_INLINE
  31. #include <wolfssl/wolfcrypt/misc.h>
  32. #else
  33. #define WOLFSSL_MISC_INCLUDED
  34. #include <wolfcrypt/src/misc.c>
  35. #endif
  36. #ifdef RSA_LOW_MEM
  37. #ifndef WOLFSSL_SP_SMALL
  38. #define WOLFSSL_SP_SMALL
  39. #endif
  40. #endif
  41. #include <wolfssl/wolfcrypt/sp.h>
  42. #ifdef WOLFSSL_SP_ARM32_ASM
  43. #define SP_PRINT_NUM(var, name, total, words, bits) \
  44. do { \
  45. int ii; \
  46. fprintf(stderr, name "=0x"); \
  47. for (ii = ((bits + 31) / 32) - 1; ii >= 0; ii--) \
  48. fprintf(stderr, SP_PRINT_FMT, (var)[ii]); \
  49. fprintf(stderr, "\n"); \
  50. } while (0)
  51. #define SP_PRINT_VAL(var, name) \
  52. fprintf(stderr, name "=0x" SP_PRINT_FMT "\n", var)
  53. #define SP_PRINT_INT(var, name) \
  54. fprintf(stderr, name "=%d\n", var)
  55. #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH)
  56. #ifndef WOLFSSL_SP_NO_2048
  57. /* Read big endian unsigned byte array into r.
  58. *
  59. * r A single precision integer.
  60. * size Maximum number of bytes to convert
  61. * a Byte array.
  62. * n Number of bytes in array to read.
  63. */
  64. static void sp_2048_from_bin(sp_digit* r, int size, const byte* a, int n)
  65. {
  66. int i;
  67. int j;
  68. byte* d;
  69. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  70. r[j] = ((sp_digit)a[i - 0] << 0) |
  71. ((sp_digit)a[i - 1] << 8) |
  72. ((sp_digit)a[i - 2] << 16) |
  73. ((sp_digit)a[i - 3] << 24);
  74. j++;
  75. }
  76. if (i >= 0) {
  77. r[j] = 0;
  78. d = (byte*)r;
  79. switch (i) {
  80. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  81. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  82. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  83. }
  84. j++;
  85. }
  86. for (; j < size; j++) {
  87. r[j] = 0;
  88. }
  89. }
  90. /* Convert an mp_int to an array of sp_digit.
  91. *
  92. * r A single precision integer.
  93. * size Maximum number of bytes to convert
  94. * a A multi-precision integer.
  95. */
  96. static void sp_2048_from_mp(sp_digit* r, int size, const mp_int* a)
  97. {
  98. #if DIGIT_BIT == 32
  99. int i;
  100. int j = 0;
  101. for (i = 0; i < size; i++) {
  102. sp_digit mask =
  103. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  104. r[i] = a->dp[j] & mask;
  105. j += (int)(((sp_digit)1) -
  106. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  107. }
  108. #elif DIGIT_BIT > 32
  109. int i;
  110. int j = 0;
  111. word32 s = 0;
  112. r[0] = 0;
  113. for (i = 0; i < a->used && j < size; i++) {
  114. r[j] |= ((sp_digit)a->dp[i] << s);
  115. r[j] &= 0xffffffff;
  116. s = 32U - s;
  117. if (j + 1 >= size) {
  118. break;
  119. }
  120. /* lint allow cast of mismatch word32 and mp_digit */
  121. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  122. while ((s + 32U) <= (word32)DIGIT_BIT) {
  123. s += 32U;
  124. r[j] &= 0xffffffff;
  125. if (j + 1 >= size) {
  126. break;
  127. }
  128. if (s < (word32)DIGIT_BIT) {
  129. /* lint allow cast of mismatch word32 and mp_digit */
  130. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  131. }
  132. else {
  133. r[++j] = (sp_digit)0;
  134. }
  135. }
  136. s = (word32)DIGIT_BIT - s;
  137. }
  138. for (j++; j < size; j++) {
  139. r[j] = 0;
  140. }
  141. #else
  142. int i;
  143. int j = 0;
  144. int s = 0;
  145. r[0] = 0;
  146. for (i = 0; i < a->used && j < size; i++) {
  147. r[j] |= ((sp_digit)a->dp[i]) << s;
  148. if (s + DIGIT_BIT >= 32) {
  149. r[j] &= 0xffffffff;
  150. if (j + 1 >= size) {
  151. break;
  152. }
  153. s = 32 - s;
  154. if (s == DIGIT_BIT) {
  155. r[++j] = 0;
  156. s = 0;
  157. }
  158. else {
  159. r[++j] = a->dp[i] >> s;
  160. s = DIGIT_BIT - s;
  161. }
  162. }
  163. else {
  164. s += DIGIT_BIT;
  165. }
  166. }
  167. for (j++; j < size; j++) {
  168. r[j] = 0;
  169. }
  170. #endif
  171. }
  172. /* Write r as big endian to byte array.
  173. * Fixed length number of bytes written: 256
  174. *
  175. * r A single precision integer.
  176. * a Byte array.
  177. */
  178. static void sp_2048_to_bin_64(sp_digit* r, byte* a)
  179. {
  180. int i;
  181. int j = 0;
  182. for (i = 63; i >= 0; i--) {
  183. a[j++] = r[i] >> 24;
  184. a[j++] = r[i] >> 16;
  185. a[j++] = r[i] >> 8;
  186. a[j++] = r[i] >> 0;
  187. }
  188. }
  189. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  190. /* Normalize the values in each word to 32.
  191. *
  192. * a Array of sp_digit to normalize.
  193. */
  194. #define sp_2048_norm_64(a)
  195. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  196. /* Normalize the values in each word to 32.
  197. *
  198. * a Array of sp_digit to normalize.
  199. */
  200. #define sp_2048_norm_64(a)
  201. #ifndef WOLFSSL_SP_SMALL
  202. /* Multiply a and b into r. (r = a * b)
  203. *
  204. * r A single precision integer.
  205. * a A single precision integer.
  206. * b A single precision integer.
  207. */
  208. static void sp_2048_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  209. {
  210. register sp_digit* r asm ("r0") = r_p;
  211. register const sp_digit* a asm ("r1") = a_p;
  212. register const sp_digit* b asm ("r2") = b_p;
  213. __asm__ __volatile__ (
  214. "sub sp, sp, #32\n\t"
  215. "mov r10, #0\n\t"
  216. /* A[0] * B[0] */
  217. "ldr r11, [%[a]]\n\t"
  218. "ldr r12, [%[b]]\n\t"
  219. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  220. "lsl r6, r11, #16\n\t"
  221. "lsl r3, r12, #16\n\t"
  222. "lsr r6, r6, #16\n\t"
  223. "lsr r3, r3, #16\n\t"
  224. "mul r3, r6, r3\n\t"
  225. "lsr r7, r12, #16\n\t"
  226. "mul r6, r7, r6\n\t"
  227. "lsr r4, r6, #16\n\t"
  228. "lsl r6, r6, #16\n\t"
  229. "adds r3, r3, r6\n\t"
  230. "adc r4, r4, #0\n\t"
  231. "lsr r6, r11, #16\n\t"
  232. "mul r7, r6, r7\n\t"
  233. "add r4, r4, r7\n\t"
  234. "lsl r7, r12, #16\n\t"
  235. "lsr r7, r7, #16\n\t"
  236. "mul r6, r7, r6\n\t"
  237. "lsr r7, r6, #16\n\t"
  238. "lsl r6, r6, #16\n\t"
  239. "adds r3, r3, r6\n\t"
  240. "adc r4, r4, r7\n\t"
  241. "mov r5, #0\n\t"
  242. #else
  243. "umull r3, r4, r11, r12\n\t"
  244. "mov r5, #0\n\t"
  245. #endif
  246. "str r3, [sp]\n\t"
  247. /* A[0] * B[1] */
  248. "ldr r9, [%[b], #4]\n\t"
  249. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  250. "lsl r6, r11, #16\n\t"
  251. "lsl r7, r9, #16\n\t"
  252. "lsr r6, r6, #16\n\t"
  253. "lsr r7, r7, #16\n\t"
  254. "mul r7, r6, r7\n\t"
  255. "adds r4, r4, r7\n\t"
  256. "adcs r5, r5, #0\n\t"
  257. "mov r3, #0\n\t"
  258. "adc r3, r3, #0\n\t"
  259. "lsr r7, r9, #16\n\t"
  260. "mul r6, r7, r6\n\t"
  261. "lsr r7, r6, #16\n\t"
  262. "lsl r6, r6, #16\n\t"
  263. "adds r4, r4, r6\n\t"
  264. "adcs r5, r5, r7\n\t"
  265. "adc r3, r3, #0\n\t"
  266. "lsr r6, r11, #16\n\t"
  267. "lsr r7, r9, #16\n\t"
  268. "mul r7, r6, r7\n\t"
  269. "adds r5, r5, r7\n\t"
  270. "adc r3, r3, #0\n\t"
  271. "lsl r7, r9, #16\n\t"
  272. "lsr r7, r7, #16\n\t"
  273. "mul r6, r7, r6\n\t"
  274. "lsr r7, r6, #16\n\t"
  275. "lsl r6, r6, #16\n\t"
  276. "adds r4, r4, r6\n\t"
  277. "adcs r5, r5, r7\n\t"
  278. "adc r3, r3, #0\n\t"
  279. #else
  280. "umull r6, r7, r11, r9\n\t"
  281. "adds r4, r4, r6\n\t"
  282. "adcs r5, r5, r7\n\t"
  283. "mov r3, #0\n\t"
  284. "adc r3, r3, #0\n\t"
  285. #endif
  286. /* A[1] * B[0] */
  287. "ldr r8, [%[a], #4]\n\t"
  288. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  289. "lsl r6, r8, #16\n\t"
  290. "lsl r7, r12, #16\n\t"
  291. "lsr r6, r6, #16\n\t"
  292. "lsr r7, r7, #16\n\t"
  293. "mul r7, r6, r7\n\t"
  294. "adds r4, r4, r7\n\t"
  295. "adcs r5, r5, #0\n\t"
  296. "adc r3, r3, #0\n\t"
  297. "lsr r7, r12, #16\n\t"
  298. "mul r6, r7, r6\n\t"
  299. "lsr r7, r6, #16\n\t"
  300. "lsl r6, r6, #16\n\t"
  301. "adds r4, r4, r6\n\t"
  302. "adcs r5, r5, r7\n\t"
  303. "adc r3, r3, #0\n\t"
  304. "lsr r6, r8, #16\n\t"
  305. "lsr r7, r12, #16\n\t"
  306. "mul r7, r6, r7\n\t"
  307. "adds r5, r5, r7\n\t"
  308. "adc r3, r3, #0\n\t"
  309. "lsl r7, r12, #16\n\t"
  310. "lsr r7, r7, #16\n\t"
  311. "mul r6, r7, r6\n\t"
  312. "lsr r7, r6, #16\n\t"
  313. "lsl r6, r6, #16\n\t"
  314. "adds r4, r4, r6\n\t"
  315. "adcs r5, r5, r7\n\t"
  316. "adc r3, r3, #0\n\t"
  317. #else
  318. "umull r6, r7, r8, r12\n\t"
  319. "adds r4, r4, r6\n\t"
  320. "adcs r5, r5, r7\n\t"
  321. "adc r3, r3, #0\n\t"
  322. #endif
  323. "str r4, [sp, #4]\n\t"
  324. /* A[2] * B[0] */
  325. "ldr r8, [%[a], #8]\n\t"
  326. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  327. "lsl r6, r8, #16\n\t"
  328. "lsl r7, r12, #16\n\t"
  329. "lsr r6, r6, #16\n\t"
  330. "lsr r7, r7, #16\n\t"
  331. "mul r7, r6, r7\n\t"
  332. "adds r5, r5, r7\n\t"
  333. "adcs r3, r3, #0\n\t"
  334. "mov r4, #0\n\t"
  335. "adc r4, r4, #0\n\t"
  336. "lsr r7, r12, #16\n\t"
  337. "mul r6, r7, r6\n\t"
  338. "lsr r7, r6, #16\n\t"
  339. "lsl r6, r6, #16\n\t"
  340. "adds r5, r5, r6\n\t"
  341. "adcs r3, r3, r7\n\t"
  342. "adc r4, r4, #0\n\t"
  343. "lsr r6, r8, #16\n\t"
  344. "lsr r7, r12, #16\n\t"
  345. "mul r7, r6, r7\n\t"
  346. "adds r3, r3, r7\n\t"
  347. "adc r4, r4, #0\n\t"
  348. "lsl r7, r12, #16\n\t"
  349. "lsr r7, r7, #16\n\t"
  350. "mul r6, r7, r6\n\t"
  351. "lsr r7, r6, #16\n\t"
  352. "lsl r6, r6, #16\n\t"
  353. "adds r5, r5, r6\n\t"
  354. "adcs r3, r3, r7\n\t"
  355. "adc r4, r4, #0\n\t"
  356. #else
  357. "umull r6, r7, r8, r12\n\t"
  358. "adds r5, r5, r6\n\t"
  359. "adcs r3, r3, r7\n\t"
  360. "mov r4, #0\n\t"
  361. "adc r4, r4, #0\n\t"
  362. #endif
  363. /* A[1] * B[1] */
  364. "ldr r11, [%[a], #4]\n\t"
  365. "ldr r12, [%[b], #4]\n\t"
  366. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  367. "lsl r6, r11, #16\n\t"
  368. "lsl r7, r12, #16\n\t"
  369. "lsr r6, r6, #16\n\t"
  370. "lsr r7, r7, #16\n\t"
  371. "mul r7, r6, r7\n\t"
  372. "adds r5, r5, r7\n\t"
  373. "adcs r3, r3, #0\n\t"
  374. "adc r4, r4, #0\n\t"
  375. "lsr r7, r12, #16\n\t"
  376. "mul r6, r7, r6\n\t"
  377. "lsr r7, r6, #16\n\t"
  378. "lsl r6, r6, #16\n\t"
  379. "adds r5, r5, r6\n\t"
  380. "adcs r3, r3, r7\n\t"
  381. "adc r4, r4, #0\n\t"
  382. "lsr r6, r11, #16\n\t"
  383. "lsr r7, r12, #16\n\t"
  384. "mul r7, r6, r7\n\t"
  385. "adds r3, r3, r7\n\t"
  386. "adc r4, r4, #0\n\t"
  387. "lsl r7, r12, #16\n\t"
  388. "lsr r7, r7, #16\n\t"
  389. "mul r6, r7, r6\n\t"
  390. "lsr r7, r6, #16\n\t"
  391. "lsl r6, r6, #16\n\t"
  392. "adds r5, r5, r6\n\t"
  393. "adcs r3, r3, r7\n\t"
  394. "adc r4, r4, #0\n\t"
  395. #else
  396. "umull r6, r7, r11, r12\n\t"
  397. "adds r5, r5, r6\n\t"
  398. "adcs r3, r3, r7\n\t"
  399. "adc r4, r4, #0\n\t"
  400. #endif
  401. /* A[0] * B[2] */
  402. "ldr r8, [%[a]]\n\t"
  403. "ldr r9, [%[b], #8]\n\t"
  404. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  405. "lsl r6, r8, #16\n\t"
  406. "lsl r7, r9, #16\n\t"
  407. "lsr r6, r6, #16\n\t"
  408. "lsr r7, r7, #16\n\t"
  409. "mul r7, r6, r7\n\t"
  410. "adds r5, r5, r7\n\t"
  411. "adcs r3, r3, #0\n\t"
  412. "adc r4, r4, #0\n\t"
  413. "lsr r7, r9, #16\n\t"
  414. "mul r6, r7, r6\n\t"
  415. "lsr r7, r6, #16\n\t"
  416. "lsl r6, r6, #16\n\t"
  417. "adds r5, r5, r6\n\t"
  418. "adcs r3, r3, r7\n\t"
  419. "adc r4, r4, #0\n\t"
  420. "lsr r6, r8, #16\n\t"
  421. "lsr r7, r9, #16\n\t"
  422. "mul r7, r6, r7\n\t"
  423. "adds r3, r3, r7\n\t"
  424. "adc r4, r4, #0\n\t"
  425. "lsl r7, r9, #16\n\t"
  426. "lsr r7, r7, #16\n\t"
  427. "mul r6, r7, r6\n\t"
  428. "lsr r7, r6, #16\n\t"
  429. "lsl r6, r6, #16\n\t"
  430. "adds r5, r5, r6\n\t"
  431. "adcs r3, r3, r7\n\t"
  432. "adc r4, r4, #0\n\t"
  433. #else
  434. "umull r6, r7, r8, r9\n\t"
  435. "adds r5, r5, r6\n\t"
  436. "adcs r3, r3, r7\n\t"
  437. "adc r4, r4, #0\n\t"
  438. #endif
  439. "str r5, [sp, #8]\n\t"
  440. /* A[0] * B[3] */
  441. "ldr r9, [%[b], #12]\n\t"
  442. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  443. "lsl r6, r8, #16\n\t"
  444. "lsl r7, r9, #16\n\t"
  445. "lsr r6, r6, #16\n\t"
  446. "lsr r7, r7, #16\n\t"
  447. "mul r7, r6, r7\n\t"
  448. "adds r3, r3, r7\n\t"
  449. "adcs r4, r4, #0\n\t"
  450. "mov r5, #0\n\t"
  451. "adc r5, r5, #0\n\t"
  452. "lsr r7, r9, #16\n\t"
  453. "mul r6, r7, r6\n\t"
  454. "lsr r7, r6, #16\n\t"
  455. "lsl r6, r6, #16\n\t"
  456. "adds r3, r3, r6\n\t"
  457. "adcs r4, r4, r7\n\t"
  458. "adc r5, r5, #0\n\t"
  459. "lsr r6, r8, #16\n\t"
  460. "lsr r7, r9, #16\n\t"
  461. "mul r7, r6, r7\n\t"
  462. "adds r4, r4, r7\n\t"
  463. "adc r5, r5, #0\n\t"
  464. "lsl r7, r9, #16\n\t"
  465. "lsr r7, r7, #16\n\t"
  466. "mul r6, r7, r6\n\t"
  467. "lsr r7, r6, #16\n\t"
  468. "lsl r6, r6, #16\n\t"
  469. "adds r3, r3, r6\n\t"
  470. "adcs r4, r4, r7\n\t"
  471. "adc r5, r5, #0\n\t"
  472. #else
  473. "umull r6, r7, r8, r9\n\t"
  474. "adds r3, r3, r6\n\t"
  475. "adcs r4, r4, r7\n\t"
  476. "mov r5, #0\n\t"
  477. "adc r5, r5, #0\n\t"
  478. #endif
  479. /* A[1] * B[2] */
  480. "ldr r9, [%[b], #8]\n\t"
  481. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  482. "lsl r6, r11, #16\n\t"
  483. "lsl r7, r9, #16\n\t"
  484. "lsr r6, r6, #16\n\t"
  485. "lsr r7, r7, #16\n\t"
  486. "mul r7, r6, r7\n\t"
  487. "adds r3, r3, r7\n\t"
  488. "adcs r4, r4, #0\n\t"
  489. "adc r5, r5, #0\n\t"
  490. "lsr r7, r9, #16\n\t"
  491. "mul r6, r7, r6\n\t"
  492. "lsr r7, r6, #16\n\t"
  493. "lsl r6, r6, #16\n\t"
  494. "adds r3, r3, r6\n\t"
  495. "adcs r4, r4, r7\n\t"
  496. "adc r5, r5, #0\n\t"
  497. "lsr r6, r11, #16\n\t"
  498. "lsr r7, r9, #16\n\t"
  499. "mul r7, r6, r7\n\t"
  500. "adds r4, r4, r7\n\t"
  501. "adc r5, r5, #0\n\t"
  502. "lsl r7, r9, #16\n\t"
  503. "lsr r7, r7, #16\n\t"
  504. "mul r6, r7, r6\n\t"
  505. "lsr r7, r6, #16\n\t"
  506. "lsl r6, r6, #16\n\t"
  507. "adds r3, r3, r6\n\t"
  508. "adcs r4, r4, r7\n\t"
  509. "adc r5, r5, #0\n\t"
  510. #else
  511. "umull r6, r7, r11, r9\n\t"
  512. "adds r3, r3, r6\n\t"
  513. "adcs r4, r4, r7\n\t"
  514. "adc r5, r5, #0\n\t"
  515. #endif
  516. /* A[2] * B[1] */
  517. "ldr r8, [%[a], #8]\n\t"
  518. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  519. "lsl r6, r8, #16\n\t"
  520. "lsl r7, r12, #16\n\t"
  521. "lsr r6, r6, #16\n\t"
  522. "lsr r7, r7, #16\n\t"
  523. "mul r7, r6, r7\n\t"
  524. "adds r3, r3, r7\n\t"
  525. "adcs r4, r4, #0\n\t"
  526. "adc r5, r5, #0\n\t"
  527. "lsr r7, r12, #16\n\t"
  528. "mul r6, r7, r6\n\t"
  529. "lsr r7, r6, #16\n\t"
  530. "lsl r6, r6, #16\n\t"
  531. "adds r3, r3, r6\n\t"
  532. "adcs r4, r4, r7\n\t"
  533. "adc r5, r5, #0\n\t"
  534. "lsr r6, r8, #16\n\t"
  535. "lsr r7, r12, #16\n\t"
  536. "mul r7, r6, r7\n\t"
  537. "adds r4, r4, r7\n\t"
  538. "adc r5, r5, #0\n\t"
  539. "lsl r7, r12, #16\n\t"
  540. "lsr r7, r7, #16\n\t"
  541. "mul r6, r7, r6\n\t"
  542. "lsr r7, r6, #16\n\t"
  543. "lsl r6, r6, #16\n\t"
  544. "adds r3, r3, r6\n\t"
  545. "adcs r4, r4, r7\n\t"
  546. "adc r5, r5, #0\n\t"
  547. #else
  548. "umull r6, r7, r8, r12\n\t"
  549. "adds r3, r3, r6\n\t"
  550. "adcs r4, r4, r7\n\t"
  551. "adc r5, r5, #0\n\t"
  552. #endif
  553. /* A[3] * B[0] */
  554. "ldr r8, [%[a], #12]\n\t"
  555. "ldr r9, [%[b]]\n\t"
  556. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  557. "lsl r6, r8, #16\n\t"
  558. "lsl r7, r9, #16\n\t"
  559. "lsr r6, r6, #16\n\t"
  560. "lsr r7, r7, #16\n\t"
  561. "mul r7, r6, r7\n\t"
  562. "adds r3, r3, r7\n\t"
  563. "adcs r4, r4, #0\n\t"
  564. "adc r5, r5, #0\n\t"
  565. "lsr r7, r9, #16\n\t"
  566. "mul r6, r7, r6\n\t"
  567. "lsr r7, r6, #16\n\t"
  568. "lsl r6, r6, #16\n\t"
  569. "adds r3, r3, r6\n\t"
  570. "adcs r4, r4, r7\n\t"
  571. "adc r5, r5, #0\n\t"
  572. "lsr r6, r8, #16\n\t"
  573. "lsr r7, r9, #16\n\t"
  574. "mul r7, r6, r7\n\t"
  575. "adds r4, r4, r7\n\t"
  576. "adc r5, r5, #0\n\t"
  577. "lsl r7, r9, #16\n\t"
  578. "lsr r7, r7, #16\n\t"
  579. "mul r6, r7, r6\n\t"
  580. "lsr r7, r6, #16\n\t"
  581. "lsl r6, r6, #16\n\t"
  582. "adds r3, r3, r6\n\t"
  583. "adcs r4, r4, r7\n\t"
  584. "adc r5, r5, #0\n\t"
  585. #else
  586. "umull r6, r7, r8, r9\n\t"
  587. "adds r3, r3, r6\n\t"
  588. "adcs r4, r4, r7\n\t"
  589. "adc r5, r5, #0\n\t"
  590. #endif
  591. "str r3, [sp, #12]\n\t"
  592. /* A[4] * B[0] */
  593. "ldr r8, [%[a], #16]\n\t"
  594. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  595. "lsl r6, r8, #16\n\t"
  596. "lsl r7, r9, #16\n\t"
  597. "lsr r6, r6, #16\n\t"
  598. "lsr r7, r7, #16\n\t"
  599. "mul r7, r6, r7\n\t"
  600. "adds r4, r4, r7\n\t"
  601. "adcs r5, r5, #0\n\t"
  602. "mov r3, #0\n\t"
  603. "adc r3, r3, #0\n\t"
  604. "lsr r7, r9, #16\n\t"
  605. "mul r6, r7, r6\n\t"
  606. "lsr r7, r6, #16\n\t"
  607. "lsl r6, r6, #16\n\t"
  608. "adds r4, r4, r6\n\t"
  609. "adcs r5, r5, r7\n\t"
  610. "adc r3, r3, #0\n\t"
  611. "lsr r6, r8, #16\n\t"
  612. "lsr r7, r9, #16\n\t"
  613. "mul r7, r6, r7\n\t"
  614. "adds r5, r5, r7\n\t"
  615. "adc r3, r3, #0\n\t"
  616. "lsl r7, r9, #16\n\t"
  617. "lsr r7, r7, #16\n\t"
  618. "mul r6, r7, r6\n\t"
  619. "lsr r7, r6, #16\n\t"
  620. "lsl r6, r6, #16\n\t"
  621. "adds r4, r4, r6\n\t"
  622. "adcs r5, r5, r7\n\t"
  623. "adc r3, r3, #0\n\t"
  624. #else
  625. "umull r6, r7, r8, r9\n\t"
  626. "adds r4, r4, r6\n\t"
  627. "adcs r5, r5, r7\n\t"
  628. "mov r3, #0\n\t"
  629. "adc r3, r3, #0\n\t"
  630. #endif
  631. /* A[3] * B[1] */
  632. "ldr r8, [%[a], #12]\n\t"
  633. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  634. "lsl r6, r8, #16\n\t"
  635. "lsl r7, r12, #16\n\t"
  636. "lsr r6, r6, #16\n\t"
  637. "lsr r7, r7, #16\n\t"
  638. "mul r7, r6, r7\n\t"
  639. "adds r4, r4, r7\n\t"
  640. "adcs r5, r5, #0\n\t"
  641. "adc r3, r3, #0\n\t"
  642. "lsr r7, r12, #16\n\t"
  643. "mul r6, r7, r6\n\t"
  644. "lsr r7, r6, #16\n\t"
  645. "lsl r6, r6, #16\n\t"
  646. "adds r4, r4, r6\n\t"
  647. "adcs r5, r5, r7\n\t"
  648. "adc r3, r3, #0\n\t"
  649. "lsr r6, r8, #16\n\t"
  650. "lsr r7, r12, #16\n\t"
  651. "mul r7, r6, r7\n\t"
  652. "adds r5, r5, r7\n\t"
  653. "adc r3, r3, #0\n\t"
  654. "lsl r7, r12, #16\n\t"
  655. "lsr r7, r7, #16\n\t"
  656. "mul r6, r7, r6\n\t"
  657. "lsr r7, r6, #16\n\t"
  658. "lsl r6, r6, #16\n\t"
  659. "adds r4, r4, r6\n\t"
  660. "adcs r5, r5, r7\n\t"
  661. "adc r3, r3, #0\n\t"
  662. #else
  663. "umull r6, r7, r8, r12\n\t"
  664. "adds r4, r4, r6\n\t"
  665. "adcs r5, r5, r7\n\t"
  666. "adc r3, r3, #0\n\t"
  667. #endif
  668. /* A[2] * B[2] */
  669. "ldr r11, [%[a], #8]\n\t"
  670. "ldr r12, [%[b], #8]\n\t"
  671. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  672. "lsl r6, r11, #16\n\t"
  673. "lsl r7, r12, #16\n\t"
  674. "lsr r6, r6, #16\n\t"
  675. "lsr r7, r7, #16\n\t"
  676. "mul r7, r6, r7\n\t"
  677. "adds r4, r4, r7\n\t"
  678. "adcs r5, r5, #0\n\t"
  679. "adc r3, r3, #0\n\t"
  680. "lsr r7, r12, #16\n\t"
  681. "mul r6, r7, r6\n\t"
  682. "lsr r7, r6, #16\n\t"
  683. "lsl r6, r6, #16\n\t"
  684. "adds r4, r4, r6\n\t"
  685. "adcs r5, r5, r7\n\t"
  686. "adc r3, r3, #0\n\t"
  687. "lsr r6, r11, #16\n\t"
  688. "lsr r7, r12, #16\n\t"
  689. "mul r7, r6, r7\n\t"
  690. "adds r5, r5, r7\n\t"
  691. "adc r3, r3, #0\n\t"
  692. "lsl r7, r12, #16\n\t"
  693. "lsr r7, r7, #16\n\t"
  694. "mul r6, r7, r6\n\t"
  695. "lsr r7, r6, #16\n\t"
  696. "lsl r6, r6, #16\n\t"
  697. "adds r4, r4, r6\n\t"
  698. "adcs r5, r5, r7\n\t"
  699. "adc r3, r3, #0\n\t"
  700. #else
  701. "umull r6, r7, r11, r12\n\t"
  702. "adds r4, r4, r6\n\t"
  703. "adcs r5, r5, r7\n\t"
  704. "adc r3, r3, #0\n\t"
  705. #endif
  706. /* A[1] * B[3] */
  707. "ldr r8, [%[a], #4]\n\t"
  708. "ldr r9, [%[b], #12]\n\t"
  709. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  710. "lsl r6, r8, #16\n\t"
  711. "lsl r7, r9, #16\n\t"
  712. "lsr r6, r6, #16\n\t"
  713. "lsr r7, r7, #16\n\t"
  714. "mul r7, r6, r7\n\t"
  715. "adds r4, r4, r7\n\t"
  716. "adcs r5, r5, #0\n\t"
  717. "adc r3, r3, #0\n\t"
  718. "lsr r7, r9, #16\n\t"
  719. "mul r6, r7, r6\n\t"
  720. "lsr r7, r6, #16\n\t"
  721. "lsl r6, r6, #16\n\t"
  722. "adds r4, r4, r6\n\t"
  723. "adcs r5, r5, r7\n\t"
  724. "adc r3, r3, #0\n\t"
  725. "lsr r6, r8, #16\n\t"
  726. "lsr r7, r9, #16\n\t"
  727. "mul r7, r6, r7\n\t"
  728. "adds r5, r5, r7\n\t"
  729. "adc r3, r3, #0\n\t"
  730. "lsl r7, r9, #16\n\t"
  731. "lsr r7, r7, #16\n\t"
  732. "mul r6, r7, r6\n\t"
  733. "lsr r7, r6, #16\n\t"
  734. "lsl r6, r6, #16\n\t"
  735. "adds r4, r4, r6\n\t"
  736. "adcs r5, r5, r7\n\t"
  737. "adc r3, r3, #0\n\t"
  738. #else
  739. "umull r6, r7, r8, r9\n\t"
  740. "adds r4, r4, r6\n\t"
  741. "adcs r5, r5, r7\n\t"
  742. "adc r3, r3, #0\n\t"
  743. #endif
  744. /* A[0] * B[4] */
  745. "ldr r8, [%[a]]\n\t"
  746. "ldr r9, [%[b], #16]\n\t"
  747. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  748. "lsl r6, r8, #16\n\t"
  749. "lsl r7, r9, #16\n\t"
  750. "lsr r6, r6, #16\n\t"
  751. "lsr r7, r7, #16\n\t"
  752. "mul r7, r6, r7\n\t"
  753. "adds r4, r4, r7\n\t"
  754. "adcs r5, r5, #0\n\t"
  755. "adc r3, r3, #0\n\t"
  756. "lsr r7, r9, #16\n\t"
  757. "mul r6, r7, r6\n\t"
  758. "lsr r7, r6, #16\n\t"
  759. "lsl r6, r6, #16\n\t"
  760. "adds r4, r4, r6\n\t"
  761. "adcs r5, r5, r7\n\t"
  762. "adc r3, r3, #0\n\t"
  763. "lsr r6, r8, #16\n\t"
  764. "lsr r7, r9, #16\n\t"
  765. "mul r7, r6, r7\n\t"
  766. "adds r5, r5, r7\n\t"
  767. "adc r3, r3, #0\n\t"
  768. "lsl r7, r9, #16\n\t"
  769. "lsr r7, r7, #16\n\t"
  770. "mul r6, r7, r6\n\t"
  771. "lsr r7, r6, #16\n\t"
  772. "lsl r6, r6, #16\n\t"
  773. "adds r4, r4, r6\n\t"
  774. "adcs r5, r5, r7\n\t"
  775. "adc r3, r3, #0\n\t"
  776. #else
  777. "umull r6, r7, r8, r9\n\t"
  778. "adds r4, r4, r6\n\t"
  779. "adcs r5, r5, r7\n\t"
  780. "adc r3, r3, #0\n\t"
  781. #endif
  782. "str r4, [sp, #16]\n\t"
  783. /* A[0] * B[5] */
  784. "ldr r9, [%[b], #20]\n\t"
  785. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  786. "lsl r6, r8, #16\n\t"
  787. "lsl r7, r9, #16\n\t"
  788. "lsr r6, r6, #16\n\t"
  789. "lsr r7, r7, #16\n\t"
  790. "mul r7, r6, r7\n\t"
  791. "adds r5, r5, r7\n\t"
  792. "adcs r3, r3, #0\n\t"
  793. "mov r4, #0\n\t"
  794. "adc r4, r4, #0\n\t"
  795. "lsr r7, r9, #16\n\t"
  796. "mul r6, r7, r6\n\t"
  797. "lsr r7, r6, #16\n\t"
  798. "lsl r6, r6, #16\n\t"
  799. "adds r5, r5, r6\n\t"
  800. "adcs r3, r3, r7\n\t"
  801. "adc r4, r4, #0\n\t"
  802. "lsr r6, r8, #16\n\t"
  803. "lsr r7, r9, #16\n\t"
  804. "mul r7, r6, r7\n\t"
  805. "adds r3, r3, r7\n\t"
  806. "adc r4, r4, #0\n\t"
  807. "lsl r7, r9, #16\n\t"
  808. "lsr r7, r7, #16\n\t"
  809. "mul r6, r7, r6\n\t"
  810. "lsr r7, r6, #16\n\t"
  811. "lsl r6, r6, #16\n\t"
  812. "adds r5, r5, r6\n\t"
  813. "adcs r3, r3, r7\n\t"
  814. "adc r4, r4, #0\n\t"
  815. #else
  816. "umull r6, r7, r8, r9\n\t"
  817. "adds r5, r5, r6\n\t"
  818. "adcs r3, r3, r7\n\t"
  819. "mov r4, #0\n\t"
  820. "adc r4, r4, #0\n\t"
  821. #endif
  822. /* A[1] * B[4] */
  823. "ldr r8, [%[a], #4]\n\t"
  824. "ldr r9, [%[b], #16]\n\t"
  825. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  826. "lsl r6, r8, #16\n\t"
  827. "lsl r7, r9, #16\n\t"
  828. "lsr r6, r6, #16\n\t"
  829. "lsr r7, r7, #16\n\t"
  830. "mul r7, r6, r7\n\t"
  831. "adds r5, r5, r7\n\t"
  832. "adcs r3, r3, #0\n\t"
  833. "adc r4, r4, #0\n\t"
  834. "lsr r7, r9, #16\n\t"
  835. "mul r6, r7, r6\n\t"
  836. "lsr r7, r6, #16\n\t"
  837. "lsl r6, r6, #16\n\t"
  838. "adds r5, r5, r6\n\t"
  839. "adcs r3, r3, r7\n\t"
  840. "adc r4, r4, #0\n\t"
  841. "lsr r6, r8, #16\n\t"
  842. "lsr r7, r9, #16\n\t"
  843. "mul r7, r6, r7\n\t"
  844. "adds r3, r3, r7\n\t"
  845. "adc r4, r4, #0\n\t"
  846. "lsl r7, r9, #16\n\t"
  847. "lsr r7, r7, #16\n\t"
  848. "mul r6, r7, r6\n\t"
  849. "lsr r7, r6, #16\n\t"
  850. "lsl r6, r6, #16\n\t"
  851. "adds r5, r5, r6\n\t"
  852. "adcs r3, r3, r7\n\t"
  853. "adc r4, r4, #0\n\t"
  854. #else
  855. "umull r6, r7, r8, r9\n\t"
  856. "adds r5, r5, r6\n\t"
  857. "adcs r3, r3, r7\n\t"
  858. "adc r4, r4, #0\n\t"
  859. #endif
  860. /* A[2] * B[3] */
  861. "ldr r9, [%[b], #12]\n\t"
  862. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  863. "lsl r6, r11, #16\n\t"
  864. "lsl r7, r9, #16\n\t"
  865. "lsr r6, r6, #16\n\t"
  866. "lsr r7, r7, #16\n\t"
  867. "mul r7, r6, r7\n\t"
  868. "adds r5, r5, r7\n\t"
  869. "adcs r3, r3, #0\n\t"
  870. "adc r4, r4, #0\n\t"
  871. "lsr r7, r9, #16\n\t"
  872. "mul r6, r7, r6\n\t"
  873. "lsr r7, r6, #16\n\t"
  874. "lsl r6, r6, #16\n\t"
  875. "adds r5, r5, r6\n\t"
  876. "adcs r3, r3, r7\n\t"
  877. "adc r4, r4, #0\n\t"
  878. "lsr r6, r11, #16\n\t"
  879. "lsr r7, r9, #16\n\t"
  880. "mul r7, r6, r7\n\t"
  881. "adds r3, r3, r7\n\t"
  882. "adc r4, r4, #0\n\t"
  883. "lsl r7, r9, #16\n\t"
  884. "lsr r7, r7, #16\n\t"
  885. "mul r6, r7, r6\n\t"
  886. "lsr r7, r6, #16\n\t"
  887. "lsl r6, r6, #16\n\t"
  888. "adds r5, r5, r6\n\t"
  889. "adcs r3, r3, r7\n\t"
  890. "adc r4, r4, #0\n\t"
  891. #else
  892. "umull r6, r7, r11, r9\n\t"
  893. "adds r5, r5, r6\n\t"
  894. "adcs r3, r3, r7\n\t"
  895. "adc r4, r4, #0\n\t"
  896. #endif
  897. /* A[3] * B[2] */
  898. "ldr r8, [%[a], #12]\n\t"
  899. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  900. "lsl r6, r8, #16\n\t"
  901. "lsl r7, r12, #16\n\t"
  902. "lsr r6, r6, #16\n\t"
  903. "lsr r7, r7, #16\n\t"
  904. "mul r7, r6, r7\n\t"
  905. "adds r5, r5, r7\n\t"
  906. "adcs r3, r3, #0\n\t"
  907. "adc r4, r4, #0\n\t"
  908. "lsr r7, r12, #16\n\t"
  909. "mul r6, r7, r6\n\t"
  910. "lsr r7, r6, #16\n\t"
  911. "lsl r6, r6, #16\n\t"
  912. "adds r5, r5, r6\n\t"
  913. "adcs r3, r3, r7\n\t"
  914. "adc r4, r4, #0\n\t"
  915. "lsr r6, r8, #16\n\t"
  916. "lsr r7, r12, #16\n\t"
  917. "mul r7, r6, r7\n\t"
  918. "adds r3, r3, r7\n\t"
  919. "adc r4, r4, #0\n\t"
  920. "lsl r7, r12, #16\n\t"
  921. "lsr r7, r7, #16\n\t"
  922. "mul r6, r7, r6\n\t"
  923. "lsr r7, r6, #16\n\t"
  924. "lsl r6, r6, #16\n\t"
  925. "adds r5, r5, r6\n\t"
  926. "adcs r3, r3, r7\n\t"
  927. "adc r4, r4, #0\n\t"
  928. #else
  929. "umull r6, r7, r8, r12\n\t"
  930. "adds r5, r5, r6\n\t"
  931. "adcs r3, r3, r7\n\t"
  932. "adc r4, r4, #0\n\t"
  933. #endif
  934. /* A[4] * B[1] */
  935. "ldr r8, [%[a], #16]\n\t"
  936. "ldr r9, [%[b], #4]\n\t"
  937. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  938. "lsl r6, r8, #16\n\t"
  939. "lsl r7, r9, #16\n\t"
  940. "lsr r6, r6, #16\n\t"
  941. "lsr r7, r7, #16\n\t"
  942. "mul r7, r6, r7\n\t"
  943. "adds r5, r5, r7\n\t"
  944. "adcs r3, r3, #0\n\t"
  945. "adc r4, r4, #0\n\t"
  946. "lsr r7, r9, #16\n\t"
  947. "mul r6, r7, r6\n\t"
  948. "lsr r7, r6, #16\n\t"
  949. "lsl r6, r6, #16\n\t"
  950. "adds r5, r5, r6\n\t"
  951. "adcs r3, r3, r7\n\t"
  952. "adc r4, r4, #0\n\t"
  953. "lsr r6, r8, #16\n\t"
  954. "lsr r7, r9, #16\n\t"
  955. "mul r7, r6, r7\n\t"
  956. "adds r3, r3, r7\n\t"
  957. "adc r4, r4, #0\n\t"
  958. "lsl r7, r9, #16\n\t"
  959. "lsr r7, r7, #16\n\t"
  960. "mul r6, r7, r6\n\t"
  961. "lsr r7, r6, #16\n\t"
  962. "lsl r6, r6, #16\n\t"
  963. "adds r5, r5, r6\n\t"
  964. "adcs r3, r3, r7\n\t"
  965. "adc r4, r4, #0\n\t"
  966. #else
  967. "umull r6, r7, r8, r9\n\t"
  968. "adds r5, r5, r6\n\t"
  969. "adcs r3, r3, r7\n\t"
  970. "adc r4, r4, #0\n\t"
  971. #endif
  972. /* A[5] * B[0] */
  973. "ldr r8, [%[a], #20]\n\t"
  974. "ldr r9, [%[b]]\n\t"
  975. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  976. "lsl r6, r8, #16\n\t"
  977. "lsl r7, r9, #16\n\t"
  978. "lsr r6, r6, #16\n\t"
  979. "lsr r7, r7, #16\n\t"
  980. "mul r7, r6, r7\n\t"
  981. "adds r5, r5, r7\n\t"
  982. "adcs r3, r3, #0\n\t"
  983. "adc r4, r4, #0\n\t"
  984. "lsr r7, r9, #16\n\t"
  985. "mul r6, r7, r6\n\t"
  986. "lsr r7, r6, #16\n\t"
  987. "lsl r6, r6, #16\n\t"
  988. "adds r5, r5, r6\n\t"
  989. "adcs r3, r3, r7\n\t"
  990. "adc r4, r4, #0\n\t"
  991. "lsr r6, r8, #16\n\t"
  992. "lsr r7, r9, #16\n\t"
  993. "mul r7, r6, r7\n\t"
  994. "adds r3, r3, r7\n\t"
  995. "adc r4, r4, #0\n\t"
  996. "lsl r7, r9, #16\n\t"
  997. "lsr r7, r7, #16\n\t"
  998. "mul r6, r7, r6\n\t"
  999. "lsr r7, r6, #16\n\t"
  1000. "lsl r6, r6, #16\n\t"
  1001. "adds r5, r5, r6\n\t"
  1002. "adcs r3, r3, r7\n\t"
  1003. "adc r4, r4, #0\n\t"
  1004. #else
  1005. "umull r6, r7, r8, r9\n\t"
  1006. "adds r5, r5, r6\n\t"
  1007. "adcs r3, r3, r7\n\t"
  1008. "adc r4, r4, #0\n\t"
  1009. #endif
  1010. "str r5, [sp, #20]\n\t"
  1011. /* A[6] * B[0] */
  1012. "ldr r8, [%[a], #24]\n\t"
  1013. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1014. "lsl r6, r8, #16\n\t"
  1015. "lsl r7, r9, #16\n\t"
  1016. "lsr r6, r6, #16\n\t"
  1017. "lsr r7, r7, #16\n\t"
  1018. "mul r7, r6, r7\n\t"
  1019. "adds r3, r3, r7\n\t"
  1020. "adcs r4, r4, #0\n\t"
  1021. "mov r5, #0\n\t"
  1022. "adc r5, r5, #0\n\t"
  1023. "lsr r7, r9, #16\n\t"
  1024. "mul r6, r7, r6\n\t"
  1025. "lsr r7, r6, #16\n\t"
  1026. "lsl r6, r6, #16\n\t"
  1027. "adds r3, r3, r6\n\t"
  1028. "adcs r4, r4, r7\n\t"
  1029. "adc r5, r5, #0\n\t"
  1030. "lsr r6, r8, #16\n\t"
  1031. "lsr r7, r9, #16\n\t"
  1032. "mul r7, r6, r7\n\t"
  1033. "adds r4, r4, r7\n\t"
  1034. "adc r5, r5, #0\n\t"
  1035. "lsl r7, r9, #16\n\t"
  1036. "lsr r7, r7, #16\n\t"
  1037. "mul r6, r7, r6\n\t"
  1038. "lsr r7, r6, #16\n\t"
  1039. "lsl r6, r6, #16\n\t"
  1040. "adds r3, r3, r6\n\t"
  1041. "adcs r4, r4, r7\n\t"
  1042. "adc r5, r5, #0\n\t"
  1043. #else
  1044. "umull r6, r7, r8, r9\n\t"
  1045. "adds r3, r3, r6\n\t"
  1046. "adcs r4, r4, r7\n\t"
  1047. "mov r5, #0\n\t"
  1048. "adc r5, r5, #0\n\t"
  1049. #endif
  1050. /* A[5] * B[1] */
  1051. "ldr r8, [%[a], #20]\n\t"
  1052. "ldr r9, [%[b], #4]\n\t"
  1053. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1054. "lsl r6, r8, #16\n\t"
  1055. "lsl r7, r9, #16\n\t"
  1056. "lsr r6, r6, #16\n\t"
  1057. "lsr r7, r7, #16\n\t"
  1058. "mul r7, r6, r7\n\t"
  1059. "adds r3, r3, r7\n\t"
  1060. "adcs r4, r4, #0\n\t"
  1061. "adc r5, r5, #0\n\t"
  1062. "lsr r7, r9, #16\n\t"
  1063. "mul r6, r7, r6\n\t"
  1064. "lsr r7, r6, #16\n\t"
  1065. "lsl r6, r6, #16\n\t"
  1066. "adds r3, r3, r6\n\t"
  1067. "adcs r4, r4, r7\n\t"
  1068. "adc r5, r5, #0\n\t"
  1069. "lsr r6, r8, #16\n\t"
  1070. "lsr r7, r9, #16\n\t"
  1071. "mul r7, r6, r7\n\t"
  1072. "adds r4, r4, r7\n\t"
  1073. "adc r5, r5, #0\n\t"
  1074. "lsl r7, r9, #16\n\t"
  1075. "lsr r7, r7, #16\n\t"
  1076. "mul r6, r7, r6\n\t"
  1077. "lsr r7, r6, #16\n\t"
  1078. "lsl r6, r6, #16\n\t"
  1079. "adds r3, r3, r6\n\t"
  1080. "adcs r4, r4, r7\n\t"
  1081. "adc r5, r5, #0\n\t"
  1082. #else
  1083. "umull r6, r7, r8, r9\n\t"
  1084. "adds r3, r3, r6\n\t"
  1085. "adcs r4, r4, r7\n\t"
  1086. "adc r5, r5, #0\n\t"
  1087. #endif
  1088. /* A[4] * B[2] */
  1089. "ldr r8, [%[a], #16]\n\t"
  1090. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1091. "lsl r6, r8, #16\n\t"
  1092. "lsl r7, r12, #16\n\t"
  1093. "lsr r6, r6, #16\n\t"
  1094. "lsr r7, r7, #16\n\t"
  1095. "mul r7, r6, r7\n\t"
  1096. "adds r3, r3, r7\n\t"
  1097. "adcs r4, r4, #0\n\t"
  1098. "adc r5, r5, #0\n\t"
  1099. "lsr r7, r12, #16\n\t"
  1100. "mul r6, r7, r6\n\t"
  1101. "lsr r7, r6, #16\n\t"
  1102. "lsl r6, r6, #16\n\t"
  1103. "adds r3, r3, r6\n\t"
  1104. "adcs r4, r4, r7\n\t"
  1105. "adc r5, r5, #0\n\t"
  1106. "lsr r6, r8, #16\n\t"
  1107. "lsr r7, r12, #16\n\t"
  1108. "mul r7, r6, r7\n\t"
  1109. "adds r4, r4, r7\n\t"
  1110. "adc r5, r5, #0\n\t"
  1111. "lsl r7, r12, #16\n\t"
  1112. "lsr r7, r7, #16\n\t"
  1113. "mul r6, r7, r6\n\t"
  1114. "lsr r7, r6, #16\n\t"
  1115. "lsl r6, r6, #16\n\t"
  1116. "adds r3, r3, r6\n\t"
  1117. "adcs r4, r4, r7\n\t"
  1118. "adc r5, r5, #0\n\t"
  1119. #else
  1120. "umull r6, r7, r8, r12\n\t"
  1121. "adds r3, r3, r6\n\t"
  1122. "adcs r4, r4, r7\n\t"
  1123. "adc r5, r5, #0\n\t"
  1124. #endif
  1125. /* A[3] * B[3] */
  1126. "ldr r11, [%[a], #12]\n\t"
  1127. "ldr r12, [%[b], #12]\n\t"
  1128. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1129. "lsl r6, r11, #16\n\t"
  1130. "lsl r7, r12, #16\n\t"
  1131. "lsr r6, r6, #16\n\t"
  1132. "lsr r7, r7, #16\n\t"
  1133. "mul r7, r6, r7\n\t"
  1134. "adds r3, r3, r7\n\t"
  1135. "adcs r4, r4, #0\n\t"
  1136. "adc r5, r5, #0\n\t"
  1137. "lsr r7, r12, #16\n\t"
  1138. "mul r6, r7, r6\n\t"
  1139. "lsr r7, r6, #16\n\t"
  1140. "lsl r6, r6, #16\n\t"
  1141. "adds r3, r3, r6\n\t"
  1142. "adcs r4, r4, r7\n\t"
  1143. "adc r5, r5, #0\n\t"
  1144. "lsr r6, r11, #16\n\t"
  1145. "lsr r7, r12, #16\n\t"
  1146. "mul r7, r6, r7\n\t"
  1147. "adds r4, r4, r7\n\t"
  1148. "adc r5, r5, #0\n\t"
  1149. "lsl r7, r12, #16\n\t"
  1150. "lsr r7, r7, #16\n\t"
  1151. "mul r6, r7, r6\n\t"
  1152. "lsr r7, r6, #16\n\t"
  1153. "lsl r6, r6, #16\n\t"
  1154. "adds r3, r3, r6\n\t"
  1155. "adcs r4, r4, r7\n\t"
  1156. "adc r5, r5, #0\n\t"
  1157. #else
  1158. "umull r6, r7, r11, r12\n\t"
  1159. "adds r3, r3, r6\n\t"
  1160. "adcs r4, r4, r7\n\t"
  1161. "adc r5, r5, #0\n\t"
  1162. #endif
  1163. /* A[2] * B[4] */
  1164. "ldr r8, [%[a], #8]\n\t"
  1165. "ldr r9, [%[b], #16]\n\t"
  1166. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1167. "lsl r6, r8, #16\n\t"
  1168. "lsl r7, r9, #16\n\t"
  1169. "lsr r6, r6, #16\n\t"
  1170. "lsr r7, r7, #16\n\t"
  1171. "mul r7, r6, r7\n\t"
  1172. "adds r3, r3, r7\n\t"
  1173. "adcs r4, r4, #0\n\t"
  1174. "adc r5, r5, #0\n\t"
  1175. "lsr r7, r9, #16\n\t"
  1176. "mul r6, r7, r6\n\t"
  1177. "lsr r7, r6, #16\n\t"
  1178. "lsl r6, r6, #16\n\t"
  1179. "adds r3, r3, r6\n\t"
  1180. "adcs r4, r4, r7\n\t"
  1181. "adc r5, r5, #0\n\t"
  1182. "lsr r6, r8, #16\n\t"
  1183. "lsr r7, r9, #16\n\t"
  1184. "mul r7, r6, r7\n\t"
  1185. "adds r4, r4, r7\n\t"
  1186. "adc r5, r5, #0\n\t"
  1187. "lsl r7, r9, #16\n\t"
  1188. "lsr r7, r7, #16\n\t"
  1189. "mul r6, r7, r6\n\t"
  1190. "lsr r7, r6, #16\n\t"
  1191. "lsl r6, r6, #16\n\t"
  1192. "adds r3, r3, r6\n\t"
  1193. "adcs r4, r4, r7\n\t"
  1194. "adc r5, r5, #0\n\t"
  1195. #else
  1196. "umull r6, r7, r8, r9\n\t"
  1197. "adds r3, r3, r6\n\t"
  1198. "adcs r4, r4, r7\n\t"
  1199. "adc r5, r5, #0\n\t"
  1200. #endif
  1201. /* A[1] * B[5] */
  1202. "ldr r8, [%[a], #4]\n\t"
  1203. "ldr r9, [%[b], #20]\n\t"
  1204. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1205. "lsl r6, r8, #16\n\t"
  1206. "lsl r7, r9, #16\n\t"
  1207. "lsr r6, r6, #16\n\t"
  1208. "lsr r7, r7, #16\n\t"
  1209. "mul r7, r6, r7\n\t"
  1210. "adds r3, r3, r7\n\t"
  1211. "adcs r4, r4, #0\n\t"
  1212. "adc r5, r5, #0\n\t"
  1213. "lsr r7, r9, #16\n\t"
  1214. "mul r6, r7, r6\n\t"
  1215. "lsr r7, r6, #16\n\t"
  1216. "lsl r6, r6, #16\n\t"
  1217. "adds r3, r3, r6\n\t"
  1218. "adcs r4, r4, r7\n\t"
  1219. "adc r5, r5, #0\n\t"
  1220. "lsr r6, r8, #16\n\t"
  1221. "lsr r7, r9, #16\n\t"
  1222. "mul r7, r6, r7\n\t"
  1223. "adds r4, r4, r7\n\t"
  1224. "adc r5, r5, #0\n\t"
  1225. "lsl r7, r9, #16\n\t"
  1226. "lsr r7, r7, #16\n\t"
  1227. "mul r6, r7, r6\n\t"
  1228. "lsr r7, r6, #16\n\t"
  1229. "lsl r6, r6, #16\n\t"
  1230. "adds r3, r3, r6\n\t"
  1231. "adcs r4, r4, r7\n\t"
  1232. "adc r5, r5, #0\n\t"
  1233. #else
  1234. "umull r6, r7, r8, r9\n\t"
  1235. "adds r3, r3, r6\n\t"
  1236. "adcs r4, r4, r7\n\t"
  1237. "adc r5, r5, #0\n\t"
  1238. #endif
  1239. /* A[0] * B[6] */
  1240. "ldr r8, [%[a]]\n\t"
  1241. "ldr r9, [%[b], #24]\n\t"
  1242. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1243. "lsl r6, r8, #16\n\t"
  1244. "lsl r7, r9, #16\n\t"
  1245. "lsr r6, r6, #16\n\t"
  1246. "lsr r7, r7, #16\n\t"
  1247. "mul r7, r6, r7\n\t"
  1248. "adds r3, r3, r7\n\t"
  1249. "adcs r4, r4, #0\n\t"
  1250. "adc r5, r5, #0\n\t"
  1251. "lsr r7, r9, #16\n\t"
  1252. "mul r6, r7, r6\n\t"
  1253. "lsr r7, r6, #16\n\t"
  1254. "lsl r6, r6, #16\n\t"
  1255. "adds r3, r3, r6\n\t"
  1256. "adcs r4, r4, r7\n\t"
  1257. "adc r5, r5, #0\n\t"
  1258. "lsr r6, r8, #16\n\t"
  1259. "lsr r7, r9, #16\n\t"
  1260. "mul r7, r6, r7\n\t"
  1261. "adds r4, r4, r7\n\t"
  1262. "adc r5, r5, #0\n\t"
  1263. "lsl r7, r9, #16\n\t"
  1264. "lsr r7, r7, #16\n\t"
  1265. "mul r6, r7, r6\n\t"
  1266. "lsr r7, r6, #16\n\t"
  1267. "lsl r6, r6, #16\n\t"
  1268. "adds r3, r3, r6\n\t"
  1269. "adcs r4, r4, r7\n\t"
  1270. "adc r5, r5, #0\n\t"
  1271. #else
  1272. "umull r6, r7, r8, r9\n\t"
  1273. "adds r3, r3, r6\n\t"
  1274. "adcs r4, r4, r7\n\t"
  1275. "adc r5, r5, #0\n\t"
  1276. #endif
  1277. "str r3, [sp, #24]\n\t"
  1278. /* A[0] * B[7] */
  1279. "ldr r9, [%[b], #28]\n\t"
  1280. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1281. "lsl r6, r8, #16\n\t"
  1282. "lsl r7, r9, #16\n\t"
  1283. "lsr r6, r6, #16\n\t"
  1284. "lsr r7, r7, #16\n\t"
  1285. "mul r7, r6, r7\n\t"
  1286. "adds r4, r4, r7\n\t"
  1287. "adcs r5, r5, #0\n\t"
  1288. "mov r3, #0\n\t"
  1289. "adc r3, r3, #0\n\t"
  1290. "lsr r7, r9, #16\n\t"
  1291. "mul r6, r7, r6\n\t"
  1292. "lsr r7, r6, #16\n\t"
  1293. "lsl r6, r6, #16\n\t"
  1294. "adds r4, r4, r6\n\t"
  1295. "adcs r5, r5, r7\n\t"
  1296. "adc r3, r3, #0\n\t"
  1297. "lsr r6, r8, #16\n\t"
  1298. "lsr r7, r9, #16\n\t"
  1299. "mul r7, r6, r7\n\t"
  1300. "adds r5, r5, r7\n\t"
  1301. "adc r3, r3, #0\n\t"
  1302. "lsl r7, r9, #16\n\t"
  1303. "lsr r7, r7, #16\n\t"
  1304. "mul r6, r7, r6\n\t"
  1305. "lsr r7, r6, #16\n\t"
  1306. "lsl r6, r6, #16\n\t"
  1307. "adds r4, r4, r6\n\t"
  1308. "adcs r5, r5, r7\n\t"
  1309. "adc r3, r3, #0\n\t"
  1310. #else
  1311. "umull r6, r7, r8, r9\n\t"
  1312. "adds r4, r4, r6\n\t"
  1313. "adcs r5, r5, r7\n\t"
  1314. "mov r3, #0\n\t"
  1315. "adc r3, r3, #0\n\t"
  1316. #endif
  1317. /* A[1] * B[6] */
  1318. "ldr r8, [%[a], #4]\n\t"
  1319. "ldr r9, [%[b], #24]\n\t"
  1320. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1321. "lsl r6, r8, #16\n\t"
  1322. "lsl r7, r9, #16\n\t"
  1323. "lsr r6, r6, #16\n\t"
  1324. "lsr r7, r7, #16\n\t"
  1325. "mul r7, r6, r7\n\t"
  1326. "adds r4, r4, r7\n\t"
  1327. "adcs r5, r5, #0\n\t"
  1328. "adc r3, r3, #0\n\t"
  1329. "lsr r7, r9, #16\n\t"
  1330. "mul r6, r7, r6\n\t"
  1331. "lsr r7, r6, #16\n\t"
  1332. "lsl r6, r6, #16\n\t"
  1333. "adds r4, r4, r6\n\t"
  1334. "adcs r5, r5, r7\n\t"
  1335. "adc r3, r3, #0\n\t"
  1336. "lsr r6, r8, #16\n\t"
  1337. "lsr r7, r9, #16\n\t"
  1338. "mul r7, r6, r7\n\t"
  1339. "adds r5, r5, r7\n\t"
  1340. "adc r3, r3, #0\n\t"
  1341. "lsl r7, r9, #16\n\t"
  1342. "lsr r7, r7, #16\n\t"
  1343. "mul r6, r7, r6\n\t"
  1344. "lsr r7, r6, #16\n\t"
  1345. "lsl r6, r6, #16\n\t"
  1346. "adds r4, r4, r6\n\t"
  1347. "adcs r5, r5, r7\n\t"
  1348. "adc r3, r3, #0\n\t"
  1349. #else
  1350. "umull r6, r7, r8, r9\n\t"
  1351. "adds r4, r4, r6\n\t"
  1352. "adcs r5, r5, r7\n\t"
  1353. "adc r3, r3, #0\n\t"
  1354. #endif
  1355. /* A[2] * B[5] */
  1356. "ldr r8, [%[a], #8]\n\t"
  1357. "ldr r9, [%[b], #20]\n\t"
  1358. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1359. "lsl r6, r8, #16\n\t"
  1360. "lsl r7, r9, #16\n\t"
  1361. "lsr r6, r6, #16\n\t"
  1362. "lsr r7, r7, #16\n\t"
  1363. "mul r7, r6, r7\n\t"
  1364. "adds r4, r4, r7\n\t"
  1365. "adcs r5, r5, #0\n\t"
  1366. "adc r3, r3, #0\n\t"
  1367. "lsr r7, r9, #16\n\t"
  1368. "mul r6, r7, r6\n\t"
  1369. "lsr r7, r6, #16\n\t"
  1370. "lsl r6, r6, #16\n\t"
  1371. "adds r4, r4, r6\n\t"
  1372. "adcs r5, r5, r7\n\t"
  1373. "adc r3, r3, #0\n\t"
  1374. "lsr r6, r8, #16\n\t"
  1375. "lsr r7, r9, #16\n\t"
  1376. "mul r7, r6, r7\n\t"
  1377. "adds r5, r5, r7\n\t"
  1378. "adc r3, r3, #0\n\t"
  1379. "lsl r7, r9, #16\n\t"
  1380. "lsr r7, r7, #16\n\t"
  1381. "mul r6, r7, r6\n\t"
  1382. "lsr r7, r6, #16\n\t"
  1383. "lsl r6, r6, #16\n\t"
  1384. "adds r4, r4, r6\n\t"
  1385. "adcs r5, r5, r7\n\t"
  1386. "adc r3, r3, #0\n\t"
  1387. #else
  1388. "umull r6, r7, r8, r9\n\t"
  1389. "adds r4, r4, r6\n\t"
  1390. "adcs r5, r5, r7\n\t"
  1391. "adc r3, r3, #0\n\t"
  1392. #endif
  1393. /* A[3] * B[4] */
  1394. "ldr r9, [%[b], #16]\n\t"
  1395. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1396. "lsl r6, r11, #16\n\t"
  1397. "lsl r7, r9, #16\n\t"
  1398. "lsr r6, r6, #16\n\t"
  1399. "lsr r7, r7, #16\n\t"
  1400. "mul r7, r6, r7\n\t"
  1401. "adds r4, r4, r7\n\t"
  1402. "adcs r5, r5, #0\n\t"
  1403. "adc r3, r3, #0\n\t"
  1404. "lsr r7, r9, #16\n\t"
  1405. "mul r6, r7, r6\n\t"
  1406. "lsr r7, r6, #16\n\t"
  1407. "lsl r6, r6, #16\n\t"
  1408. "adds r4, r4, r6\n\t"
  1409. "adcs r5, r5, r7\n\t"
  1410. "adc r3, r3, #0\n\t"
  1411. "lsr r6, r11, #16\n\t"
  1412. "lsr r7, r9, #16\n\t"
  1413. "mul r7, r6, r7\n\t"
  1414. "adds r5, r5, r7\n\t"
  1415. "adc r3, r3, #0\n\t"
  1416. "lsl r7, r9, #16\n\t"
  1417. "lsr r7, r7, #16\n\t"
  1418. "mul r6, r7, r6\n\t"
  1419. "lsr r7, r6, #16\n\t"
  1420. "lsl r6, r6, #16\n\t"
  1421. "adds r4, r4, r6\n\t"
  1422. "adcs r5, r5, r7\n\t"
  1423. "adc r3, r3, #0\n\t"
  1424. #else
  1425. "umull r6, r7, r11, r9\n\t"
  1426. "adds r4, r4, r6\n\t"
  1427. "adcs r5, r5, r7\n\t"
  1428. "adc r3, r3, #0\n\t"
  1429. #endif
  1430. /* A[4] * B[3] */
  1431. "ldr r8, [%[a], #16]\n\t"
  1432. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1433. "lsl r6, r8, #16\n\t"
  1434. "lsl r7, r12, #16\n\t"
  1435. "lsr r6, r6, #16\n\t"
  1436. "lsr r7, r7, #16\n\t"
  1437. "mul r7, r6, r7\n\t"
  1438. "adds r4, r4, r7\n\t"
  1439. "adcs r5, r5, #0\n\t"
  1440. "adc r3, r3, #0\n\t"
  1441. "lsr r7, r12, #16\n\t"
  1442. "mul r6, r7, r6\n\t"
  1443. "lsr r7, r6, #16\n\t"
  1444. "lsl r6, r6, #16\n\t"
  1445. "adds r4, r4, r6\n\t"
  1446. "adcs r5, r5, r7\n\t"
  1447. "adc r3, r3, #0\n\t"
  1448. "lsr r6, r8, #16\n\t"
  1449. "lsr r7, r12, #16\n\t"
  1450. "mul r7, r6, r7\n\t"
  1451. "adds r5, r5, r7\n\t"
  1452. "adc r3, r3, #0\n\t"
  1453. "lsl r7, r12, #16\n\t"
  1454. "lsr r7, r7, #16\n\t"
  1455. "mul r6, r7, r6\n\t"
  1456. "lsr r7, r6, #16\n\t"
  1457. "lsl r6, r6, #16\n\t"
  1458. "adds r4, r4, r6\n\t"
  1459. "adcs r5, r5, r7\n\t"
  1460. "adc r3, r3, #0\n\t"
  1461. #else
  1462. "umull r6, r7, r8, r12\n\t"
  1463. "adds r4, r4, r6\n\t"
  1464. "adcs r5, r5, r7\n\t"
  1465. "adc r3, r3, #0\n\t"
  1466. #endif
  1467. /* A[5] * B[2] */
  1468. "ldr r8, [%[a], #20]\n\t"
  1469. "ldr r9, [%[b], #8]\n\t"
  1470. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1471. "lsl r6, r8, #16\n\t"
  1472. "lsl r7, r9, #16\n\t"
  1473. "lsr r6, r6, #16\n\t"
  1474. "lsr r7, r7, #16\n\t"
  1475. "mul r7, r6, r7\n\t"
  1476. "adds r4, r4, r7\n\t"
  1477. "adcs r5, r5, #0\n\t"
  1478. "adc r3, r3, #0\n\t"
  1479. "lsr r7, r9, #16\n\t"
  1480. "mul r6, r7, r6\n\t"
  1481. "lsr r7, r6, #16\n\t"
  1482. "lsl r6, r6, #16\n\t"
  1483. "adds r4, r4, r6\n\t"
  1484. "adcs r5, r5, r7\n\t"
  1485. "adc r3, r3, #0\n\t"
  1486. "lsr r6, r8, #16\n\t"
  1487. "lsr r7, r9, #16\n\t"
  1488. "mul r7, r6, r7\n\t"
  1489. "adds r5, r5, r7\n\t"
  1490. "adc r3, r3, #0\n\t"
  1491. "lsl r7, r9, #16\n\t"
  1492. "lsr r7, r7, #16\n\t"
  1493. "mul r6, r7, r6\n\t"
  1494. "lsr r7, r6, #16\n\t"
  1495. "lsl r6, r6, #16\n\t"
  1496. "adds r4, r4, r6\n\t"
  1497. "adcs r5, r5, r7\n\t"
  1498. "adc r3, r3, #0\n\t"
  1499. #else
  1500. "umull r6, r7, r8, r9\n\t"
  1501. "adds r4, r4, r6\n\t"
  1502. "adcs r5, r5, r7\n\t"
  1503. "adc r3, r3, #0\n\t"
  1504. #endif
  1505. /* A[6] * B[1] */
  1506. "ldr r8, [%[a], #24]\n\t"
  1507. "ldr r9, [%[b], #4]\n\t"
  1508. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1509. "lsl r6, r8, #16\n\t"
  1510. "lsl r7, r9, #16\n\t"
  1511. "lsr r6, r6, #16\n\t"
  1512. "lsr r7, r7, #16\n\t"
  1513. "mul r7, r6, r7\n\t"
  1514. "adds r4, r4, r7\n\t"
  1515. "adcs r5, r5, #0\n\t"
  1516. "adc r3, r3, #0\n\t"
  1517. "lsr r7, r9, #16\n\t"
  1518. "mul r6, r7, r6\n\t"
  1519. "lsr r7, r6, #16\n\t"
  1520. "lsl r6, r6, #16\n\t"
  1521. "adds r4, r4, r6\n\t"
  1522. "adcs r5, r5, r7\n\t"
  1523. "adc r3, r3, #0\n\t"
  1524. "lsr r6, r8, #16\n\t"
  1525. "lsr r7, r9, #16\n\t"
  1526. "mul r7, r6, r7\n\t"
  1527. "adds r5, r5, r7\n\t"
  1528. "adc r3, r3, #0\n\t"
  1529. "lsl r7, r9, #16\n\t"
  1530. "lsr r7, r7, #16\n\t"
  1531. "mul r6, r7, r6\n\t"
  1532. "lsr r7, r6, #16\n\t"
  1533. "lsl r6, r6, #16\n\t"
  1534. "adds r4, r4, r6\n\t"
  1535. "adcs r5, r5, r7\n\t"
  1536. "adc r3, r3, #0\n\t"
  1537. #else
  1538. "umull r6, r7, r8, r9\n\t"
  1539. "adds r4, r4, r6\n\t"
  1540. "adcs r5, r5, r7\n\t"
  1541. "adc r3, r3, #0\n\t"
  1542. #endif
  1543. /* A[7] * B[0] */
  1544. "ldr r8, [%[a], #28]\n\t"
  1545. "ldr r9, [%[b]]\n\t"
  1546. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1547. "lsl r6, r8, #16\n\t"
  1548. "lsl r7, r9, #16\n\t"
  1549. "lsr r6, r6, #16\n\t"
  1550. "lsr r7, r7, #16\n\t"
  1551. "mul r7, r6, r7\n\t"
  1552. "adds r4, r4, r7\n\t"
  1553. "adcs r5, r5, #0\n\t"
  1554. "adc r3, r3, #0\n\t"
  1555. "lsr r7, r9, #16\n\t"
  1556. "mul r6, r7, r6\n\t"
  1557. "lsr r7, r6, #16\n\t"
  1558. "lsl r6, r6, #16\n\t"
  1559. "adds r4, r4, r6\n\t"
  1560. "adcs r5, r5, r7\n\t"
  1561. "adc r3, r3, #0\n\t"
  1562. "lsr r6, r8, #16\n\t"
  1563. "lsr r7, r9, #16\n\t"
  1564. "mul r7, r6, r7\n\t"
  1565. "adds r5, r5, r7\n\t"
  1566. "adc r3, r3, #0\n\t"
  1567. "lsl r7, r9, #16\n\t"
  1568. "lsr r7, r7, #16\n\t"
  1569. "mul r6, r7, r6\n\t"
  1570. "lsr r7, r6, #16\n\t"
  1571. "lsl r6, r6, #16\n\t"
  1572. "adds r4, r4, r6\n\t"
  1573. "adcs r5, r5, r7\n\t"
  1574. "adc r3, r3, #0\n\t"
  1575. #else
  1576. "umull r6, r7, r8, r9\n\t"
  1577. "adds r4, r4, r6\n\t"
  1578. "adcs r5, r5, r7\n\t"
  1579. "adc r3, r3, #0\n\t"
  1580. #endif
  1581. "str r4, [sp, #28]\n\t"
  1582. /* A[7] * B[1] */
  1583. "ldr r9, [%[b], #4]\n\t"
  1584. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1585. "lsl r6, r8, #16\n\t"
  1586. "lsl r7, r9, #16\n\t"
  1587. "lsr r6, r6, #16\n\t"
  1588. "lsr r7, r7, #16\n\t"
  1589. "mul r7, r6, r7\n\t"
  1590. "adds r5, r5, r7\n\t"
  1591. "adcs r3, r3, #0\n\t"
  1592. "mov r4, #0\n\t"
  1593. "adc r4, r4, #0\n\t"
  1594. "lsr r7, r9, #16\n\t"
  1595. "mul r6, r7, r6\n\t"
  1596. "lsr r7, r6, #16\n\t"
  1597. "lsl r6, r6, #16\n\t"
  1598. "adds r5, r5, r6\n\t"
  1599. "adcs r3, r3, r7\n\t"
  1600. "adc r4, r4, #0\n\t"
  1601. "lsr r6, r8, #16\n\t"
  1602. "lsr r7, r9, #16\n\t"
  1603. "mul r7, r6, r7\n\t"
  1604. "adds r3, r3, r7\n\t"
  1605. "adc r4, r4, #0\n\t"
  1606. "lsl r7, r9, #16\n\t"
  1607. "lsr r7, r7, #16\n\t"
  1608. "mul r6, r7, r6\n\t"
  1609. "lsr r7, r6, #16\n\t"
  1610. "lsl r6, r6, #16\n\t"
  1611. "adds r5, r5, r6\n\t"
  1612. "adcs r3, r3, r7\n\t"
  1613. "adc r4, r4, #0\n\t"
  1614. #else
  1615. "umull r6, r7, r8, r9\n\t"
  1616. "adds r5, r5, r6\n\t"
  1617. "adcs r3, r3, r7\n\t"
  1618. "mov r4, #0\n\t"
  1619. "adc r4, r4, #0\n\t"
  1620. #endif
  1621. /* A[6] * B[2] */
  1622. "ldr r8, [%[a], #24]\n\t"
  1623. "ldr r9, [%[b], #8]\n\t"
  1624. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1625. "lsl r6, r8, #16\n\t"
  1626. "lsl r7, r9, #16\n\t"
  1627. "lsr r6, r6, #16\n\t"
  1628. "lsr r7, r7, #16\n\t"
  1629. "mul r7, r6, r7\n\t"
  1630. "adds r5, r5, r7\n\t"
  1631. "adcs r3, r3, #0\n\t"
  1632. "adc r4, r4, #0\n\t"
  1633. "lsr r7, r9, #16\n\t"
  1634. "mul r6, r7, r6\n\t"
  1635. "lsr r7, r6, #16\n\t"
  1636. "lsl r6, r6, #16\n\t"
  1637. "adds r5, r5, r6\n\t"
  1638. "adcs r3, r3, r7\n\t"
  1639. "adc r4, r4, #0\n\t"
  1640. "lsr r6, r8, #16\n\t"
  1641. "lsr r7, r9, #16\n\t"
  1642. "mul r7, r6, r7\n\t"
  1643. "adds r3, r3, r7\n\t"
  1644. "adc r4, r4, #0\n\t"
  1645. "lsl r7, r9, #16\n\t"
  1646. "lsr r7, r7, #16\n\t"
  1647. "mul r6, r7, r6\n\t"
  1648. "lsr r7, r6, #16\n\t"
  1649. "lsl r6, r6, #16\n\t"
  1650. "adds r5, r5, r6\n\t"
  1651. "adcs r3, r3, r7\n\t"
  1652. "adc r4, r4, #0\n\t"
  1653. #else
  1654. "umull r6, r7, r8, r9\n\t"
  1655. "adds r5, r5, r6\n\t"
  1656. "adcs r3, r3, r7\n\t"
  1657. "adc r4, r4, #0\n\t"
  1658. #endif
  1659. /* A[5] * B[3] */
  1660. "ldr r8, [%[a], #20]\n\t"
  1661. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1662. "lsl r6, r8, #16\n\t"
  1663. "lsl r7, r12, #16\n\t"
  1664. "lsr r6, r6, #16\n\t"
  1665. "lsr r7, r7, #16\n\t"
  1666. "mul r7, r6, r7\n\t"
  1667. "adds r5, r5, r7\n\t"
  1668. "adcs r3, r3, #0\n\t"
  1669. "adc r4, r4, #0\n\t"
  1670. "lsr r7, r12, #16\n\t"
  1671. "mul r6, r7, r6\n\t"
  1672. "lsr r7, r6, #16\n\t"
  1673. "lsl r6, r6, #16\n\t"
  1674. "adds r5, r5, r6\n\t"
  1675. "adcs r3, r3, r7\n\t"
  1676. "adc r4, r4, #0\n\t"
  1677. "lsr r6, r8, #16\n\t"
  1678. "lsr r7, r12, #16\n\t"
  1679. "mul r7, r6, r7\n\t"
  1680. "adds r3, r3, r7\n\t"
  1681. "adc r4, r4, #0\n\t"
  1682. "lsl r7, r12, #16\n\t"
  1683. "lsr r7, r7, #16\n\t"
  1684. "mul r6, r7, r6\n\t"
  1685. "lsr r7, r6, #16\n\t"
  1686. "lsl r6, r6, #16\n\t"
  1687. "adds r5, r5, r6\n\t"
  1688. "adcs r3, r3, r7\n\t"
  1689. "adc r4, r4, #0\n\t"
  1690. #else
  1691. "umull r6, r7, r8, r12\n\t"
  1692. "adds r5, r5, r6\n\t"
  1693. "adcs r3, r3, r7\n\t"
  1694. "adc r4, r4, #0\n\t"
  1695. #endif
  1696. /* A[4] * B[4] */
  1697. "ldr r11, [%[a], #16]\n\t"
  1698. "ldr r12, [%[b], #16]\n\t"
  1699. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1700. "lsl r6, r11, #16\n\t"
  1701. "lsl r7, r12, #16\n\t"
  1702. "lsr r6, r6, #16\n\t"
  1703. "lsr r7, r7, #16\n\t"
  1704. "mul r7, r6, r7\n\t"
  1705. "adds r5, r5, r7\n\t"
  1706. "adcs r3, r3, #0\n\t"
  1707. "adc r4, r4, #0\n\t"
  1708. "lsr r7, r12, #16\n\t"
  1709. "mul r6, r7, r6\n\t"
  1710. "lsr r7, r6, #16\n\t"
  1711. "lsl r6, r6, #16\n\t"
  1712. "adds r5, r5, r6\n\t"
  1713. "adcs r3, r3, r7\n\t"
  1714. "adc r4, r4, #0\n\t"
  1715. "lsr r6, r11, #16\n\t"
  1716. "lsr r7, r12, #16\n\t"
  1717. "mul r7, r6, r7\n\t"
  1718. "adds r3, r3, r7\n\t"
  1719. "adc r4, r4, #0\n\t"
  1720. "lsl r7, r12, #16\n\t"
  1721. "lsr r7, r7, #16\n\t"
  1722. "mul r6, r7, r6\n\t"
  1723. "lsr r7, r6, #16\n\t"
  1724. "lsl r6, r6, #16\n\t"
  1725. "adds r5, r5, r6\n\t"
  1726. "adcs r3, r3, r7\n\t"
  1727. "adc r4, r4, #0\n\t"
  1728. #else
  1729. "umull r6, r7, r11, r12\n\t"
  1730. "adds r5, r5, r6\n\t"
  1731. "adcs r3, r3, r7\n\t"
  1732. "adc r4, r4, #0\n\t"
  1733. #endif
  1734. /* A[3] * B[5] */
  1735. "ldr r8, [%[a], #12]\n\t"
  1736. "ldr r9, [%[b], #20]\n\t"
  1737. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1738. "lsl r6, r8, #16\n\t"
  1739. "lsl r7, r9, #16\n\t"
  1740. "lsr r6, r6, #16\n\t"
  1741. "lsr r7, r7, #16\n\t"
  1742. "mul r7, r6, r7\n\t"
  1743. "adds r5, r5, r7\n\t"
  1744. "adcs r3, r3, #0\n\t"
  1745. "adc r4, r4, #0\n\t"
  1746. "lsr r7, r9, #16\n\t"
  1747. "mul r6, r7, r6\n\t"
  1748. "lsr r7, r6, #16\n\t"
  1749. "lsl r6, r6, #16\n\t"
  1750. "adds r5, r5, r6\n\t"
  1751. "adcs r3, r3, r7\n\t"
  1752. "adc r4, r4, #0\n\t"
  1753. "lsr r6, r8, #16\n\t"
  1754. "lsr r7, r9, #16\n\t"
  1755. "mul r7, r6, r7\n\t"
  1756. "adds r3, r3, r7\n\t"
  1757. "adc r4, r4, #0\n\t"
  1758. "lsl r7, r9, #16\n\t"
  1759. "lsr r7, r7, #16\n\t"
  1760. "mul r6, r7, r6\n\t"
  1761. "lsr r7, r6, #16\n\t"
  1762. "lsl r6, r6, #16\n\t"
  1763. "adds r5, r5, r6\n\t"
  1764. "adcs r3, r3, r7\n\t"
  1765. "adc r4, r4, #0\n\t"
  1766. #else
  1767. "umull r6, r7, r8, r9\n\t"
  1768. "adds r5, r5, r6\n\t"
  1769. "adcs r3, r3, r7\n\t"
  1770. "adc r4, r4, #0\n\t"
  1771. #endif
  1772. /* A[2] * B[6] */
  1773. "ldr r8, [%[a], #8]\n\t"
  1774. "ldr r9, [%[b], #24]\n\t"
  1775. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1776. "lsl r6, r8, #16\n\t"
  1777. "lsl r7, r9, #16\n\t"
  1778. "lsr r6, r6, #16\n\t"
  1779. "lsr r7, r7, #16\n\t"
  1780. "mul r7, r6, r7\n\t"
  1781. "adds r5, r5, r7\n\t"
  1782. "adcs r3, r3, #0\n\t"
  1783. "adc r4, r4, #0\n\t"
  1784. "lsr r7, r9, #16\n\t"
  1785. "mul r6, r7, r6\n\t"
  1786. "lsr r7, r6, #16\n\t"
  1787. "lsl r6, r6, #16\n\t"
  1788. "adds r5, r5, r6\n\t"
  1789. "adcs r3, r3, r7\n\t"
  1790. "adc r4, r4, #0\n\t"
  1791. "lsr r6, r8, #16\n\t"
  1792. "lsr r7, r9, #16\n\t"
  1793. "mul r7, r6, r7\n\t"
  1794. "adds r3, r3, r7\n\t"
  1795. "adc r4, r4, #0\n\t"
  1796. "lsl r7, r9, #16\n\t"
  1797. "lsr r7, r7, #16\n\t"
  1798. "mul r6, r7, r6\n\t"
  1799. "lsr r7, r6, #16\n\t"
  1800. "lsl r6, r6, #16\n\t"
  1801. "adds r5, r5, r6\n\t"
  1802. "adcs r3, r3, r7\n\t"
  1803. "adc r4, r4, #0\n\t"
  1804. #else
  1805. "umull r6, r7, r8, r9\n\t"
  1806. "adds r5, r5, r6\n\t"
  1807. "adcs r3, r3, r7\n\t"
  1808. "adc r4, r4, #0\n\t"
  1809. #endif
  1810. /* A[1] * B[7] */
  1811. "ldr r8, [%[a], #4]\n\t"
  1812. "ldr r9, [%[b], #28]\n\t"
  1813. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1814. "lsl r6, r8, #16\n\t"
  1815. "lsl r7, r9, #16\n\t"
  1816. "lsr r6, r6, #16\n\t"
  1817. "lsr r7, r7, #16\n\t"
  1818. "mul r7, r6, r7\n\t"
  1819. "adds r5, r5, r7\n\t"
  1820. "adcs r3, r3, #0\n\t"
  1821. "adc r4, r4, #0\n\t"
  1822. "lsr r7, r9, #16\n\t"
  1823. "mul r6, r7, r6\n\t"
  1824. "lsr r7, r6, #16\n\t"
  1825. "lsl r6, r6, #16\n\t"
  1826. "adds r5, r5, r6\n\t"
  1827. "adcs r3, r3, r7\n\t"
  1828. "adc r4, r4, #0\n\t"
  1829. "lsr r6, r8, #16\n\t"
  1830. "lsr r7, r9, #16\n\t"
  1831. "mul r7, r6, r7\n\t"
  1832. "adds r3, r3, r7\n\t"
  1833. "adc r4, r4, #0\n\t"
  1834. "lsl r7, r9, #16\n\t"
  1835. "lsr r7, r7, #16\n\t"
  1836. "mul r6, r7, r6\n\t"
  1837. "lsr r7, r6, #16\n\t"
  1838. "lsl r6, r6, #16\n\t"
  1839. "adds r5, r5, r6\n\t"
  1840. "adcs r3, r3, r7\n\t"
  1841. "adc r4, r4, #0\n\t"
  1842. #else
  1843. "umull r6, r7, r8, r9\n\t"
  1844. "adds r5, r5, r6\n\t"
  1845. "adcs r3, r3, r7\n\t"
  1846. "adc r4, r4, #0\n\t"
  1847. #endif
  1848. "str r5, [%[r], #32]\n\t"
  1849. /* A[2] * B[7] */
  1850. "ldr r8, [%[a], #8]\n\t"
  1851. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1852. "lsl r6, r8, #16\n\t"
  1853. "lsl r7, r9, #16\n\t"
  1854. "lsr r6, r6, #16\n\t"
  1855. "lsr r7, r7, #16\n\t"
  1856. "mul r7, r6, r7\n\t"
  1857. "adds r3, r3, r7\n\t"
  1858. "adcs r4, r4, #0\n\t"
  1859. "mov r5, #0\n\t"
  1860. "adc r5, r5, #0\n\t"
  1861. "lsr r7, r9, #16\n\t"
  1862. "mul r6, r7, r6\n\t"
  1863. "lsr r7, r6, #16\n\t"
  1864. "lsl r6, r6, #16\n\t"
  1865. "adds r3, r3, r6\n\t"
  1866. "adcs r4, r4, r7\n\t"
  1867. "adc r5, r5, #0\n\t"
  1868. "lsr r6, r8, #16\n\t"
  1869. "lsr r7, r9, #16\n\t"
  1870. "mul r7, r6, r7\n\t"
  1871. "adds r4, r4, r7\n\t"
  1872. "adc r5, r5, #0\n\t"
  1873. "lsl r7, r9, #16\n\t"
  1874. "lsr r7, r7, #16\n\t"
  1875. "mul r6, r7, r6\n\t"
  1876. "lsr r7, r6, #16\n\t"
  1877. "lsl r6, r6, #16\n\t"
  1878. "adds r3, r3, r6\n\t"
  1879. "adcs r4, r4, r7\n\t"
  1880. "adc r5, r5, #0\n\t"
  1881. #else
  1882. "umull r6, r7, r8, r9\n\t"
  1883. "adds r3, r3, r6\n\t"
  1884. "adcs r4, r4, r7\n\t"
  1885. "mov r5, #0\n\t"
  1886. "adc r5, r5, #0\n\t"
  1887. #endif
  1888. /* A[3] * B[6] */
  1889. "ldr r8, [%[a], #12]\n\t"
  1890. "ldr r9, [%[b], #24]\n\t"
  1891. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1892. "lsl r6, r8, #16\n\t"
  1893. "lsl r7, r9, #16\n\t"
  1894. "lsr r6, r6, #16\n\t"
  1895. "lsr r7, r7, #16\n\t"
  1896. "mul r7, r6, r7\n\t"
  1897. "adds r3, r3, r7\n\t"
  1898. "adcs r4, r4, #0\n\t"
  1899. "adc r5, r5, #0\n\t"
  1900. "lsr r7, r9, #16\n\t"
  1901. "mul r6, r7, r6\n\t"
  1902. "lsr r7, r6, #16\n\t"
  1903. "lsl r6, r6, #16\n\t"
  1904. "adds r3, r3, r6\n\t"
  1905. "adcs r4, r4, r7\n\t"
  1906. "adc r5, r5, #0\n\t"
  1907. "lsr r6, r8, #16\n\t"
  1908. "lsr r7, r9, #16\n\t"
  1909. "mul r7, r6, r7\n\t"
  1910. "adds r4, r4, r7\n\t"
  1911. "adc r5, r5, #0\n\t"
  1912. "lsl r7, r9, #16\n\t"
  1913. "lsr r7, r7, #16\n\t"
  1914. "mul r6, r7, r6\n\t"
  1915. "lsr r7, r6, #16\n\t"
  1916. "lsl r6, r6, #16\n\t"
  1917. "adds r3, r3, r6\n\t"
  1918. "adcs r4, r4, r7\n\t"
  1919. "adc r5, r5, #0\n\t"
  1920. #else
  1921. "umull r6, r7, r8, r9\n\t"
  1922. "adds r3, r3, r6\n\t"
  1923. "adcs r4, r4, r7\n\t"
  1924. "adc r5, r5, #0\n\t"
  1925. #endif
  1926. /* A[4] * B[5] */
  1927. "ldr r9, [%[b], #20]\n\t"
  1928. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1929. "lsl r6, r11, #16\n\t"
  1930. "lsl r7, r9, #16\n\t"
  1931. "lsr r6, r6, #16\n\t"
  1932. "lsr r7, r7, #16\n\t"
  1933. "mul r7, r6, r7\n\t"
  1934. "adds r3, r3, r7\n\t"
  1935. "adcs r4, r4, #0\n\t"
  1936. "adc r5, r5, #0\n\t"
  1937. "lsr r7, r9, #16\n\t"
  1938. "mul r6, r7, r6\n\t"
  1939. "lsr r7, r6, #16\n\t"
  1940. "lsl r6, r6, #16\n\t"
  1941. "adds r3, r3, r6\n\t"
  1942. "adcs r4, r4, r7\n\t"
  1943. "adc r5, r5, #0\n\t"
  1944. "lsr r6, r11, #16\n\t"
  1945. "lsr r7, r9, #16\n\t"
  1946. "mul r7, r6, r7\n\t"
  1947. "adds r4, r4, r7\n\t"
  1948. "adc r5, r5, #0\n\t"
  1949. "lsl r7, r9, #16\n\t"
  1950. "lsr r7, r7, #16\n\t"
  1951. "mul r6, r7, r6\n\t"
  1952. "lsr r7, r6, #16\n\t"
  1953. "lsl r6, r6, #16\n\t"
  1954. "adds r3, r3, r6\n\t"
  1955. "adcs r4, r4, r7\n\t"
  1956. "adc r5, r5, #0\n\t"
  1957. #else
  1958. "umull r6, r7, r11, r9\n\t"
  1959. "adds r3, r3, r6\n\t"
  1960. "adcs r4, r4, r7\n\t"
  1961. "adc r5, r5, #0\n\t"
  1962. #endif
  1963. /* A[5] * B[4] */
  1964. "ldr r8, [%[a], #20]\n\t"
  1965. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  1966. "lsl r6, r8, #16\n\t"
  1967. "lsl r7, r12, #16\n\t"
  1968. "lsr r6, r6, #16\n\t"
  1969. "lsr r7, r7, #16\n\t"
  1970. "mul r7, r6, r7\n\t"
  1971. "adds r3, r3, r7\n\t"
  1972. "adcs r4, r4, #0\n\t"
  1973. "adc r5, r5, #0\n\t"
  1974. "lsr r7, r12, #16\n\t"
  1975. "mul r6, r7, r6\n\t"
  1976. "lsr r7, r6, #16\n\t"
  1977. "lsl r6, r6, #16\n\t"
  1978. "adds r3, r3, r6\n\t"
  1979. "adcs r4, r4, r7\n\t"
  1980. "adc r5, r5, #0\n\t"
  1981. "lsr r6, r8, #16\n\t"
  1982. "lsr r7, r12, #16\n\t"
  1983. "mul r7, r6, r7\n\t"
  1984. "adds r4, r4, r7\n\t"
  1985. "adc r5, r5, #0\n\t"
  1986. "lsl r7, r12, #16\n\t"
  1987. "lsr r7, r7, #16\n\t"
  1988. "mul r6, r7, r6\n\t"
  1989. "lsr r7, r6, #16\n\t"
  1990. "lsl r6, r6, #16\n\t"
  1991. "adds r3, r3, r6\n\t"
  1992. "adcs r4, r4, r7\n\t"
  1993. "adc r5, r5, #0\n\t"
  1994. #else
  1995. "umull r6, r7, r8, r12\n\t"
  1996. "adds r3, r3, r6\n\t"
  1997. "adcs r4, r4, r7\n\t"
  1998. "adc r5, r5, #0\n\t"
  1999. #endif
  2000. /* A[6] * B[3] */
  2001. "ldr r8, [%[a], #24]\n\t"
  2002. "ldr r9, [%[b], #12]\n\t"
  2003. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2004. "lsl r6, r8, #16\n\t"
  2005. "lsl r7, r9, #16\n\t"
  2006. "lsr r6, r6, #16\n\t"
  2007. "lsr r7, r7, #16\n\t"
  2008. "mul r7, r6, r7\n\t"
  2009. "adds r3, r3, r7\n\t"
  2010. "adcs r4, r4, #0\n\t"
  2011. "adc r5, r5, #0\n\t"
  2012. "lsr r7, r9, #16\n\t"
  2013. "mul r6, r7, r6\n\t"
  2014. "lsr r7, r6, #16\n\t"
  2015. "lsl r6, r6, #16\n\t"
  2016. "adds r3, r3, r6\n\t"
  2017. "adcs r4, r4, r7\n\t"
  2018. "adc r5, r5, #0\n\t"
  2019. "lsr r6, r8, #16\n\t"
  2020. "lsr r7, r9, #16\n\t"
  2021. "mul r7, r6, r7\n\t"
  2022. "adds r4, r4, r7\n\t"
  2023. "adc r5, r5, #0\n\t"
  2024. "lsl r7, r9, #16\n\t"
  2025. "lsr r7, r7, #16\n\t"
  2026. "mul r6, r7, r6\n\t"
  2027. "lsr r7, r6, #16\n\t"
  2028. "lsl r6, r6, #16\n\t"
  2029. "adds r3, r3, r6\n\t"
  2030. "adcs r4, r4, r7\n\t"
  2031. "adc r5, r5, #0\n\t"
  2032. #else
  2033. "umull r6, r7, r8, r9\n\t"
  2034. "adds r3, r3, r6\n\t"
  2035. "adcs r4, r4, r7\n\t"
  2036. "adc r5, r5, #0\n\t"
  2037. #endif
  2038. /* A[7] * B[2] */
  2039. "ldr r8, [%[a], #28]\n\t"
  2040. "ldr r9, [%[b], #8]\n\t"
  2041. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2042. "lsl r6, r8, #16\n\t"
  2043. "lsl r7, r9, #16\n\t"
  2044. "lsr r6, r6, #16\n\t"
  2045. "lsr r7, r7, #16\n\t"
  2046. "mul r7, r6, r7\n\t"
  2047. "adds r3, r3, r7\n\t"
  2048. "adcs r4, r4, #0\n\t"
  2049. "adc r5, r5, #0\n\t"
  2050. "lsr r7, r9, #16\n\t"
  2051. "mul r6, r7, r6\n\t"
  2052. "lsr r7, r6, #16\n\t"
  2053. "lsl r6, r6, #16\n\t"
  2054. "adds r3, r3, r6\n\t"
  2055. "adcs r4, r4, r7\n\t"
  2056. "adc r5, r5, #0\n\t"
  2057. "lsr r6, r8, #16\n\t"
  2058. "lsr r7, r9, #16\n\t"
  2059. "mul r7, r6, r7\n\t"
  2060. "adds r4, r4, r7\n\t"
  2061. "adc r5, r5, #0\n\t"
  2062. "lsl r7, r9, #16\n\t"
  2063. "lsr r7, r7, #16\n\t"
  2064. "mul r6, r7, r6\n\t"
  2065. "lsr r7, r6, #16\n\t"
  2066. "lsl r6, r6, #16\n\t"
  2067. "adds r3, r3, r6\n\t"
  2068. "adcs r4, r4, r7\n\t"
  2069. "adc r5, r5, #0\n\t"
  2070. #else
  2071. "umull r6, r7, r8, r9\n\t"
  2072. "adds r3, r3, r6\n\t"
  2073. "adcs r4, r4, r7\n\t"
  2074. "adc r5, r5, #0\n\t"
  2075. #endif
  2076. "str r3, [%[r], #36]\n\t"
  2077. /* A[7] * B[3] */
  2078. "ldr r9, [%[b], #12]\n\t"
  2079. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2080. "lsl r6, r8, #16\n\t"
  2081. "lsl r7, r9, #16\n\t"
  2082. "lsr r6, r6, #16\n\t"
  2083. "lsr r7, r7, #16\n\t"
  2084. "mul r7, r6, r7\n\t"
  2085. "adds r4, r4, r7\n\t"
  2086. "adcs r5, r5, #0\n\t"
  2087. "mov r3, #0\n\t"
  2088. "adc r3, r3, #0\n\t"
  2089. "lsr r7, r9, #16\n\t"
  2090. "mul r6, r7, r6\n\t"
  2091. "lsr r7, r6, #16\n\t"
  2092. "lsl r6, r6, #16\n\t"
  2093. "adds r4, r4, r6\n\t"
  2094. "adcs r5, r5, r7\n\t"
  2095. "adc r3, r3, #0\n\t"
  2096. "lsr r6, r8, #16\n\t"
  2097. "lsr r7, r9, #16\n\t"
  2098. "mul r7, r6, r7\n\t"
  2099. "adds r5, r5, r7\n\t"
  2100. "adc r3, r3, #0\n\t"
  2101. "lsl r7, r9, #16\n\t"
  2102. "lsr r7, r7, #16\n\t"
  2103. "mul r6, r7, r6\n\t"
  2104. "lsr r7, r6, #16\n\t"
  2105. "lsl r6, r6, #16\n\t"
  2106. "adds r4, r4, r6\n\t"
  2107. "adcs r5, r5, r7\n\t"
  2108. "adc r3, r3, #0\n\t"
  2109. #else
  2110. "umull r6, r7, r8, r9\n\t"
  2111. "adds r4, r4, r6\n\t"
  2112. "adcs r5, r5, r7\n\t"
  2113. "mov r3, #0\n\t"
  2114. "adc r3, r3, #0\n\t"
  2115. #endif
  2116. /* A[6] * B[4] */
  2117. "ldr r8, [%[a], #24]\n\t"
  2118. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2119. "lsl r6, r8, #16\n\t"
  2120. "lsl r7, r12, #16\n\t"
  2121. "lsr r6, r6, #16\n\t"
  2122. "lsr r7, r7, #16\n\t"
  2123. "mul r7, r6, r7\n\t"
  2124. "adds r4, r4, r7\n\t"
  2125. "adcs r5, r5, #0\n\t"
  2126. "adc r3, r3, #0\n\t"
  2127. "lsr r7, r12, #16\n\t"
  2128. "mul r6, r7, r6\n\t"
  2129. "lsr r7, r6, #16\n\t"
  2130. "lsl r6, r6, #16\n\t"
  2131. "adds r4, r4, r6\n\t"
  2132. "adcs r5, r5, r7\n\t"
  2133. "adc r3, r3, #0\n\t"
  2134. "lsr r6, r8, #16\n\t"
  2135. "lsr r7, r12, #16\n\t"
  2136. "mul r7, r6, r7\n\t"
  2137. "adds r5, r5, r7\n\t"
  2138. "adc r3, r3, #0\n\t"
  2139. "lsl r7, r12, #16\n\t"
  2140. "lsr r7, r7, #16\n\t"
  2141. "mul r6, r7, r6\n\t"
  2142. "lsr r7, r6, #16\n\t"
  2143. "lsl r6, r6, #16\n\t"
  2144. "adds r4, r4, r6\n\t"
  2145. "adcs r5, r5, r7\n\t"
  2146. "adc r3, r3, #0\n\t"
  2147. #else
  2148. "umull r6, r7, r8, r12\n\t"
  2149. "adds r4, r4, r6\n\t"
  2150. "adcs r5, r5, r7\n\t"
  2151. "adc r3, r3, #0\n\t"
  2152. #endif
  2153. /* A[5] * B[5] */
  2154. "ldr r11, [%[a], #20]\n\t"
  2155. "ldr r12, [%[b], #20]\n\t"
  2156. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2157. "lsl r6, r11, #16\n\t"
  2158. "lsl r7, r12, #16\n\t"
  2159. "lsr r6, r6, #16\n\t"
  2160. "lsr r7, r7, #16\n\t"
  2161. "mul r7, r6, r7\n\t"
  2162. "adds r4, r4, r7\n\t"
  2163. "adcs r5, r5, #0\n\t"
  2164. "adc r3, r3, #0\n\t"
  2165. "lsr r7, r12, #16\n\t"
  2166. "mul r6, r7, r6\n\t"
  2167. "lsr r7, r6, #16\n\t"
  2168. "lsl r6, r6, #16\n\t"
  2169. "adds r4, r4, r6\n\t"
  2170. "adcs r5, r5, r7\n\t"
  2171. "adc r3, r3, #0\n\t"
  2172. "lsr r6, r11, #16\n\t"
  2173. "lsr r7, r12, #16\n\t"
  2174. "mul r7, r6, r7\n\t"
  2175. "adds r5, r5, r7\n\t"
  2176. "adc r3, r3, #0\n\t"
  2177. "lsl r7, r12, #16\n\t"
  2178. "lsr r7, r7, #16\n\t"
  2179. "mul r6, r7, r6\n\t"
  2180. "lsr r7, r6, #16\n\t"
  2181. "lsl r6, r6, #16\n\t"
  2182. "adds r4, r4, r6\n\t"
  2183. "adcs r5, r5, r7\n\t"
  2184. "adc r3, r3, #0\n\t"
  2185. #else
  2186. "umull r6, r7, r11, r12\n\t"
  2187. "adds r4, r4, r6\n\t"
  2188. "adcs r5, r5, r7\n\t"
  2189. "adc r3, r3, #0\n\t"
  2190. #endif
  2191. /* A[4] * B[6] */
  2192. "ldr r8, [%[a], #16]\n\t"
  2193. "ldr r9, [%[b], #24]\n\t"
  2194. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2195. "lsl r6, r8, #16\n\t"
  2196. "lsl r7, r9, #16\n\t"
  2197. "lsr r6, r6, #16\n\t"
  2198. "lsr r7, r7, #16\n\t"
  2199. "mul r7, r6, r7\n\t"
  2200. "adds r4, r4, r7\n\t"
  2201. "adcs r5, r5, #0\n\t"
  2202. "adc r3, r3, #0\n\t"
  2203. "lsr r7, r9, #16\n\t"
  2204. "mul r6, r7, r6\n\t"
  2205. "lsr r7, r6, #16\n\t"
  2206. "lsl r6, r6, #16\n\t"
  2207. "adds r4, r4, r6\n\t"
  2208. "adcs r5, r5, r7\n\t"
  2209. "adc r3, r3, #0\n\t"
  2210. "lsr r6, r8, #16\n\t"
  2211. "lsr r7, r9, #16\n\t"
  2212. "mul r7, r6, r7\n\t"
  2213. "adds r5, r5, r7\n\t"
  2214. "adc r3, r3, #0\n\t"
  2215. "lsl r7, r9, #16\n\t"
  2216. "lsr r7, r7, #16\n\t"
  2217. "mul r6, r7, r6\n\t"
  2218. "lsr r7, r6, #16\n\t"
  2219. "lsl r6, r6, #16\n\t"
  2220. "adds r4, r4, r6\n\t"
  2221. "adcs r5, r5, r7\n\t"
  2222. "adc r3, r3, #0\n\t"
  2223. #else
  2224. "umull r6, r7, r8, r9\n\t"
  2225. "adds r4, r4, r6\n\t"
  2226. "adcs r5, r5, r7\n\t"
  2227. "adc r3, r3, #0\n\t"
  2228. #endif
  2229. /* A[3] * B[7] */
  2230. "ldr r8, [%[a], #12]\n\t"
  2231. "ldr r9, [%[b], #28]\n\t"
  2232. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2233. "lsl r6, r8, #16\n\t"
  2234. "lsl r7, r9, #16\n\t"
  2235. "lsr r6, r6, #16\n\t"
  2236. "lsr r7, r7, #16\n\t"
  2237. "mul r7, r6, r7\n\t"
  2238. "adds r4, r4, r7\n\t"
  2239. "adcs r5, r5, #0\n\t"
  2240. "adc r3, r3, #0\n\t"
  2241. "lsr r7, r9, #16\n\t"
  2242. "mul r6, r7, r6\n\t"
  2243. "lsr r7, r6, #16\n\t"
  2244. "lsl r6, r6, #16\n\t"
  2245. "adds r4, r4, r6\n\t"
  2246. "adcs r5, r5, r7\n\t"
  2247. "adc r3, r3, #0\n\t"
  2248. "lsr r6, r8, #16\n\t"
  2249. "lsr r7, r9, #16\n\t"
  2250. "mul r7, r6, r7\n\t"
  2251. "adds r5, r5, r7\n\t"
  2252. "adc r3, r3, #0\n\t"
  2253. "lsl r7, r9, #16\n\t"
  2254. "lsr r7, r7, #16\n\t"
  2255. "mul r6, r7, r6\n\t"
  2256. "lsr r7, r6, #16\n\t"
  2257. "lsl r6, r6, #16\n\t"
  2258. "adds r4, r4, r6\n\t"
  2259. "adcs r5, r5, r7\n\t"
  2260. "adc r3, r3, #0\n\t"
  2261. #else
  2262. "umull r6, r7, r8, r9\n\t"
  2263. "adds r4, r4, r6\n\t"
  2264. "adcs r5, r5, r7\n\t"
  2265. "adc r3, r3, #0\n\t"
  2266. #endif
  2267. "str r4, [%[r], #40]\n\t"
  2268. /* A[4] * B[7] */
  2269. "ldr r8, [%[a], #16]\n\t"
  2270. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2271. "lsl r6, r8, #16\n\t"
  2272. "lsl r7, r9, #16\n\t"
  2273. "lsr r6, r6, #16\n\t"
  2274. "lsr r7, r7, #16\n\t"
  2275. "mul r7, r6, r7\n\t"
  2276. "adds r5, r5, r7\n\t"
  2277. "adcs r3, r3, #0\n\t"
  2278. "mov r4, #0\n\t"
  2279. "adc r4, r4, #0\n\t"
  2280. "lsr r7, r9, #16\n\t"
  2281. "mul r6, r7, r6\n\t"
  2282. "lsr r7, r6, #16\n\t"
  2283. "lsl r6, r6, #16\n\t"
  2284. "adds r5, r5, r6\n\t"
  2285. "adcs r3, r3, r7\n\t"
  2286. "adc r4, r4, #0\n\t"
  2287. "lsr r6, r8, #16\n\t"
  2288. "lsr r7, r9, #16\n\t"
  2289. "mul r7, r6, r7\n\t"
  2290. "adds r3, r3, r7\n\t"
  2291. "adc r4, r4, #0\n\t"
  2292. "lsl r7, r9, #16\n\t"
  2293. "lsr r7, r7, #16\n\t"
  2294. "mul r6, r7, r6\n\t"
  2295. "lsr r7, r6, #16\n\t"
  2296. "lsl r6, r6, #16\n\t"
  2297. "adds r5, r5, r6\n\t"
  2298. "adcs r3, r3, r7\n\t"
  2299. "adc r4, r4, #0\n\t"
  2300. #else
  2301. "umull r6, r7, r8, r9\n\t"
  2302. "adds r5, r5, r6\n\t"
  2303. "adcs r3, r3, r7\n\t"
  2304. "mov r4, #0\n\t"
  2305. "adc r4, r4, #0\n\t"
  2306. #endif
  2307. /* A[5] * B[6] */
  2308. "ldr r9, [%[b], #24]\n\t"
  2309. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2310. "lsl r6, r11, #16\n\t"
  2311. "lsl r7, r9, #16\n\t"
  2312. "lsr r6, r6, #16\n\t"
  2313. "lsr r7, r7, #16\n\t"
  2314. "mul r7, r6, r7\n\t"
  2315. "adds r5, r5, r7\n\t"
  2316. "adcs r3, r3, #0\n\t"
  2317. "adc r4, r4, #0\n\t"
  2318. "lsr r7, r9, #16\n\t"
  2319. "mul r6, r7, r6\n\t"
  2320. "lsr r7, r6, #16\n\t"
  2321. "lsl r6, r6, #16\n\t"
  2322. "adds r5, r5, r6\n\t"
  2323. "adcs r3, r3, r7\n\t"
  2324. "adc r4, r4, #0\n\t"
  2325. "lsr r6, r11, #16\n\t"
  2326. "lsr r7, r9, #16\n\t"
  2327. "mul r7, r6, r7\n\t"
  2328. "adds r3, r3, r7\n\t"
  2329. "adc r4, r4, #0\n\t"
  2330. "lsl r7, r9, #16\n\t"
  2331. "lsr r7, r7, #16\n\t"
  2332. "mul r6, r7, r6\n\t"
  2333. "lsr r7, r6, #16\n\t"
  2334. "lsl r6, r6, #16\n\t"
  2335. "adds r5, r5, r6\n\t"
  2336. "adcs r3, r3, r7\n\t"
  2337. "adc r4, r4, #0\n\t"
  2338. #else
  2339. "umull r6, r7, r11, r9\n\t"
  2340. "adds r5, r5, r6\n\t"
  2341. "adcs r3, r3, r7\n\t"
  2342. "adc r4, r4, #0\n\t"
  2343. #endif
  2344. /* A[6] * B[5] */
  2345. "ldr r8, [%[a], #24]\n\t"
  2346. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2347. "lsl r6, r8, #16\n\t"
  2348. "lsl r7, r12, #16\n\t"
  2349. "lsr r6, r6, #16\n\t"
  2350. "lsr r7, r7, #16\n\t"
  2351. "mul r7, r6, r7\n\t"
  2352. "adds r5, r5, r7\n\t"
  2353. "adcs r3, r3, #0\n\t"
  2354. "adc r4, r4, #0\n\t"
  2355. "lsr r7, r12, #16\n\t"
  2356. "mul r6, r7, r6\n\t"
  2357. "lsr r7, r6, #16\n\t"
  2358. "lsl r6, r6, #16\n\t"
  2359. "adds r5, r5, r6\n\t"
  2360. "adcs r3, r3, r7\n\t"
  2361. "adc r4, r4, #0\n\t"
  2362. "lsr r6, r8, #16\n\t"
  2363. "lsr r7, r12, #16\n\t"
  2364. "mul r7, r6, r7\n\t"
  2365. "adds r3, r3, r7\n\t"
  2366. "adc r4, r4, #0\n\t"
  2367. "lsl r7, r12, #16\n\t"
  2368. "lsr r7, r7, #16\n\t"
  2369. "mul r6, r7, r6\n\t"
  2370. "lsr r7, r6, #16\n\t"
  2371. "lsl r6, r6, #16\n\t"
  2372. "adds r5, r5, r6\n\t"
  2373. "adcs r3, r3, r7\n\t"
  2374. "adc r4, r4, #0\n\t"
  2375. #else
  2376. "umull r6, r7, r8, r12\n\t"
  2377. "adds r5, r5, r6\n\t"
  2378. "adcs r3, r3, r7\n\t"
  2379. "adc r4, r4, #0\n\t"
  2380. #endif
  2381. /* A[7] * B[4] */
  2382. "ldr r8, [%[a], #28]\n\t"
  2383. "ldr r9, [%[b], #16]\n\t"
  2384. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2385. "lsl r6, r8, #16\n\t"
  2386. "lsl r7, r9, #16\n\t"
  2387. "lsr r6, r6, #16\n\t"
  2388. "lsr r7, r7, #16\n\t"
  2389. "mul r7, r6, r7\n\t"
  2390. "adds r5, r5, r7\n\t"
  2391. "adcs r3, r3, #0\n\t"
  2392. "adc r4, r4, #0\n\t"
  2393. "lsr r7, r9, #16\n\t"
  2394. "mul r6, r7, r6\n\t"
  2395. "lsr r7, r6, #16\n\t"
  2396. "lsl r6, r6, #16\n\t"
  2397. "adds r5, r5, r6\n\t"
  2398. "adcs r3, r3, r7\n\t"
  2399. "adc r4, r4, #0\n\t"
  2400. "lsr r6, r8, #16\n\t"
  2401. "lsr r7, r9, #16\n\t"
  2402. "mul r7, r6, r7\n\t"
  2403. "adds r3, r3, r7\n\t"
  2404. "adc r4, r4, #0\n\t"
  2405. "lsl r7, r9, #16\n\t"
  2406. "lsr r7, r7, #16\n\t"
  2407. "mul r6, r7, r6\n\t"
  2408. "lsr r7, r6, #16\n\t"
  2409. "lsl r6, r6, #16\n\t"
  2410. "adds r5, r5, r6\n\t"
  2411. "adcs r3, r3, r7\n\t"
  2412. "adc r4, r4, #0\n\t"
  2413. #else
  2414. "umull r6, r7, r8, r9\n\t"
  2415. "adds r5, r5, r6\n\t"
  2416. "adcs r3, r3, r7\n\t"
  2417. "adc r4, r4, #0\n\t"
  2418. #endif
  2419. "str r5, [%[r], #44]\n\t"
  2420. /* A[7] * B[5] */
  2421. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2422. "lsl r6, r8, #16\n\t"
  2423. "lsl r7, r12, #16\n\t"
  2424. "lsr r6, r6, #16\n\t"
  2425. "lsr r7, r7, #16\n\t"
  2426. "mul r7, r6, r7\n\t"
  2427. "adds r3, r3, r7\n\t"
  2428. "adcs r4, r4, #0\n\t"
  2429. "mov r5, #0\n\t"
  2430. "adc r5, r5, #0\n\t"
  2431. "lsr r7, r12, #16\n\t"
  2432. "mul r6, r7, r6\n\t"
  2433. "lsr r7, r6, #16\n\t"
  2434. "lsl r6, r6, #16\n\t"
  2435. "adds r3, r3, r6\n\t"
  2436. "adcs r4, r4, r7\n\t"
  2437. "adc r5, r5, #0\n\t"
  2438. "lsr r6, r8, #16\n\t"
  2439. "lsr r7, r12, #16\n\t"
  2440. "mul r7, r6, r7\n\t"
  2441. "adds r4, r4, r7\n\t"
  2442. "adc r5, r5, #0\n\t"
  2443. "lsl r7, r12, #16\n\t"
  2444. "lsr r7, r7, #16\n\t"
  2445. "mul r6, r7, r6\n\t"
  2446. "lsr r7, r6, #16\n\t"
  2447. "lsl r6, r6, #16\n\t"
  2448. "adds r3, r3, r6\n\t"
  2449. "adcs r4, r4, r7\n\t"
  2450. "adc r5, r5, #0\n\t"
  2451. #else
  2452. "umull r6, r7, r8, r12\n\t"
  2453. "adds r3, r3, r6\n\t"
  2454. "adcs r4, r4, r7\n\t"
  2455. "mov r5, #0\n\t"
  2456. "adc r5, r5, #0\n\t"
  2457. #endif
  2458. /* A[6] * B[6] */
  2459. "ldr r11, [%[a], #24]\n\t"
  2460. "ldr r12, [%[b], #24]\n\t"
  2461. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2462. "lsl r6, r11, #16\n\t"
  2463. "lsl r7, r12, #16\n\t"
  2464. "lsr r6, r6, #16\n\t"
  2465. "lsr r7, r7, #16\n\t"
  2466. "mul r7, r6, r7\n\t"
  2467. "adds r3, r3, r7\n\t"
  2468. "adcs r4, r4, #0\n\t"
  2469. "adc r5, r5, #0\n\t"
  2470. "lsr r7, r12, #16\n\t"
  2471. "mul r6, r7, r6\n\t"
  2472. "lsr r7, r6, #16\n\t"
  2473. "lsl r6, r6, #16\n\t"
  2474. "adds r3, r3, r6\n\t"
  2475. "adcs r4, r4, r7\n\t"
  2476. "adc r5, r5, #0\n\t"
  2477. "lsr r6, r11, #16\n\t"
  2478. "lsr r7, r12, #16\n\t"
  2479. "mul r7, r6, r7\n\t"
  2480. "adds r4, r4, r7\n\t"
  2481. "adc r5, r5, #0\n\t"
  2482. "lsl r7, r12, #16\n\t"
  2483. "lsr r7, r7, #16\n\t"
  2484. "mul r6, r7, r6\n\t"
  2485. "lsr r7, r6, #16\n\t"
  2486. "lsl r6, r6, #16\n\t"
  2487. "adds r3, r3, r6\n\t"
  2488. "adcs r4, r4, r7\n\t"
  2489. "adc r5, r5, #0\n\t"
  2490. #else
  2491. "umull r6, r7, r11, r12\n\t"
  2492. "adds r3, r3, r6\n\t"
  2493. "adcs r4, r4, r7\n\t"
  2494. "adc r5, r5, #0\n\t"
  2495. #endif
  2496. /* A[5] * B[7] */
  2497. "ldr r8, [%[a], #20]\n\t"
  2498. "ldr r9, [%[b], #28]\n\t"
  2499. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2500. "lsl r6, r8, #16\n\t"
  2501. "lsl r7, r9, #16\n\t"
  2502. "lsr r6, r6, #16\n\t"
  2503. "lsr r7, r7, #16\n\t"
  2504. "mul r7, r6, r7\n\t"
  2505. "adds r3, r3, r7\n\t"
  2506. "adcs r4, r4, #0\n\t"
  2507. "adc r5, r5, #0\n\t"
  2508. "lsr r7, r9, #16\n\t"
  2509. "mul r6, r7, r6\n\t"
  2510. "lsr r7, r6, #16\n\t"
  2511. "lsl r6, r6, #16\n\t"
  2512. "adds r3, r3, r6\n\t"
  2513. "adcs r4, r4, r7\n\t"
  2514. "adc r5, r5, #0\n\t"
  2515. "lsr r6, r8, #16\n\t"
  2516. "lsr r7, r9, #16\n\t"
  2517. "mul r7, r6, r7\n\t"
  2518. "adds r4, r4, r7\n\t"
  2519. "adc r5, r5, #0\n\t"
  2520. "lsl r7, r9, #16\n\t"
  2521. "lsr r7, r7, #16\n\t"
  2522. "mul r6, r7, r6\n\t"
  2523. "lsr r7, r6, #16\n\t"
  2524. "lsl r6, r6, #16\n\t"
  2525. "adds r3, r3, r6\n\t"
  2526. "adcs r4, r4, r7\n\t"
  2527. "adc r5, r5, #0\n\t"
  2528. #else
  2529. "umull r6, r7, r8, r9\n\t"
  2530. "adds r3, r3, r6\n\t"
  2531. "adcs r4, r4, r7\n\t"
  2532. "adc r5, r5, #0\n\t"
  2533. #endif
  2534. "str r3, [%[r], #48]\n\t"
  2535. /* A[6] * B[7] */
  2536. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2537. "lsl r6, r11, #16\n\t"
  2538. "lsl r7, r9, #16\n\t"
  2539. "lsr r6, r6, #16\n\t"
  2540. "lsr r7, r7, #16\n\t"
  2541. "mul r7, r6, r7\n\t"
  2542. "adds r4, r4, r7\n\t"
  2543. "adcs r5, r5, #0\n\t"
  2544. "mov r3, #0\n\t"
  2545. "adc r3, r3, #0\n\t"
  2546. "lsr r7, r9, #16\n\t"
  2547. "mul r6, r7, r6\n\t"
  2548. "lsr r7, r6, #16\n\t"
  2549. "lsl r6, r6, #16\n\t"
  2550. "adds r4, r4, r6\n\t"
  2551. "adcs r5, r5, r7\n\t"
  2552. "adc r3, r3, #0\n\t"
  2553. "lsr r6, r11, #16\n\t"
  2554. "lsr r7, r9, #16\n\t"
  2555. "mul r7, r6, r7\n\t"
  2556. "adds r5, r5, r7\n\t"
  2557. "adc r3, r3, #0\n\t"
  2558. "lsl r7, r9, #16\n\t"
  2559. "lsr r7, r7, #16\n\t"
  2560. "mul r6, r7, r6\n\t"
  2561. "lsr r7, r6, #16\n\t"
  2562. "lsl r6, r6, #16\n\t"
  2563. "adds r4, r4, r6\n\t"
  2564. "adcs r5, r5, r7\n\t"
  2565. "adc r3, r3, #0\n\t"
  2566. #else
  2567. "umull r6, r7, r11, r9\n\t"
  2568. "adds r4, r4, r6\n\t"
  2569. "adcs r5, r5, r7\n\t"
  2570. "mov r3, #0\n\t"
  2571. "adc r3, r3, #0\n\t"
  2572. #endif
  2573. /* A[7] * B[6] */
  2574. "ldr r8, [%[a], #28]\n\t"
  2575. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2576. "lsl r6, r8, #16\n\t"
  2577. "lsl r7, r12, #16\n\t"
  2578. "lsr r6, r6, #16\n\t"
  2579. "lsr r7, r7, #16\n\t"
  2580. "mul r7, r6, r7\n\t"
  2581. "adds r4, r4, r7\n\t"
  2582. "adcs r5, r5, #0\n\t"
  2583. "adc r3, r3, #0\n\t"
  2584. "lsr r7, r12, #16\n\t"
  2585. "mul r6, r7, r6\n\t"
  2586. "lsr r7, r6, #16\n\t"
  2587. "lsl r6, r6, #16\n\t"
  2588. "adds r4, r4, r6\n\t"
  2589. "adcs r5, r5, r7\n\t"
  2590. "adc r3, r3, #0\n\t"
  2591. "lsr r6, r8, #16\n\t"
  2592. "lsr r7, r12, #16\n\t"
  2593. "mul r7, r6, r7\n\t"
  2594. "adds r5, r5, r7\n\t"
  2595. "adc r3, r3, #0\n\t"
  2596. "lsl r7, r12, #16\n\t"
  2597. "lsr r7, r7, #16\n\t"
  2598. "mul r6, r7, r6\n\t"
  2599. "lsr r7, r6, #16\n\t"
  2600. "lsl r6, r6, #16\n\t"
  2601. "adds r4, r4, r6\n\t"
  2602. "adcs r5, r5, r7\n\t"
  2603. "adc r3, r3, #0\n\t"
  2604. #else
  2605. "umull r6, r7, r8, r12\n\t"
  2606. "adds r4, r4, r6\n\t"
  2607. "adcs r5, r5, r7\n\t"
  2608. "adc r3, r3, #0\n\t"
  2609. #endif
  2610. "str r4, [%[r], #52]\n\t"
  2611. /* A[7] * B[7] */
  2612. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  2613. "lsl r6, r8, #16\n\t"
  2614. "lsl r7, r9, #16\n\t"
  2615. "lsr r6, r6, #16\n\t"
  2616. "lsr r7, r7, #16\n\t"
  2617. "mul r7, r6, r7\n\t"
  2618. "adds r5, r5, r7\n\t"
  2619. "adc r3, r3, #0\n\t"
  2620. "lsr r7, r9, #16\n\t"
  2621. "mul r6, r7, r6\n\t"
  2622. "lsr r7, r6, #16\n\t"
  2623. "lsl r6, r6, #16\n\t"
  2624. "adds r5, r5, r6\n\t"
  2625. "adc r3, r3, r7\n\t"
  2626. "lsr r6, r8, #16\n\t"
  2627. "lsr r7, r9, #16\n\t"
  2628. "mul r7, r6, r7\n\t"
  2629. "add r3, r3, r7\n\t"
  2630. "lsl r7, r9, #16\n\t"
  2631. "lsr r7, r7, #16\n\t"
  2632. "mul r6, r7, r6\n\t"
  2633. "lsr r7, r6, #16\n\t"
  2634. "lsl r6, r6, #16\n\t"
  2635. "adds r5, r5, r6\n\t"
  2636. "adc r3, r3, r7\n\t"
  2637. #else
  2638. "umull r6, r7, r8, r9\n\t"
  2639. "adds r5, r5, r6\n\t"
  2640. "adc r3, r3, r7\n\t"
  2641. #endif
  2642. "str r5, [%[r], #56]\n\t"
  2643. "str r3, [%[r], #60]\n\t"
  2644. "ldm sp!, {r3, r4, r5, r6}\n\t"
  2645. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2646. "ldm sp!, {r3, r4, r5, r6}\n\t"
  2647. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2648. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  2649. :
  2650. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  2651. );
  2652. }
  2653. /* Add b to a into r. (r = a + b)
  2654. *
  2655. * r A single precision integer.
  2656. * a A single precision integer.
  2657. * b A single precision integer.
  2658. */
  2659. static sp_digit sp_2048_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  2660. {
  2661. register sp_digit* r asm ("r0") = r_p;
  2662. register const sp_digit* a asm ("r1") = a_p;
  2663. register const sp_digit* b asm ("r2") = b_p;
  2664. __asm__ __volatile__ (
  2665. "mov r12, #0\n\t"
  2666. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2667. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2668. "adds r3, r3, r7\n\t"
  2669. "adcs r4, r4, r8\n\t"
  2670. "adcs r5, r5, r9\n\t"
  2671. "adcs r6, r6, r10\n\t"
  2672. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2673. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2674. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2675. "adcs r3, r3, r7\n\t"
  2676. "adcs r4, r4, r8\n\t"
  2677. "adcs r5, r5, r9\n\t"
  2678. "adcs r6, r6, r10\n\t"
  2679. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2680. "adc %[r], r12, r12\n\t"
  2681. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  2682. :
  2683. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  2684. );
  2685. return (uint32_t)(size_t)r;
  2686. }
  2687. /* Sub b from a into a. (a -= b)
  2688. *
  2689. * a A single precision integer and result.
  2690. * b A single precision integer.
  2691. */
  2692. static sp_digit sp_2048_sub_in_place_16(sp_digit* a_p, const sp_digit* b_p)
  2693. {
  2694. register sp_digit* a asm ("r0") = a_p;
  2695. register const sp_digit* b asm ("r1") = b_p;
  2696. __asm__ __volatile__ (
  2697. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2698. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2699. "subs r2, r2, r6\n\t"
  2700. "sbcs r3, r3, r7\n\t"
  2701. "sbcs r4, r4, r8\n\t"
  2702. "sbcs r5, r5, r9\n\t"
  2703. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2704. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2705. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2706. "sbcs r2, r2, r6\n\t"
  2707. "sbcs r3, r3, r7\n\t"
  2708. "sbcs r4, r4, r8\n\t"
  2709. "sbcs r5, r5, r9\n\t"
  2710. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2711. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2712. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2713. "sbcs r2, r2, r6\n\t"
  2714. "sbcs r3, r3, r7\n\t"
  2715. "sbcs r4, r4, r8\n\t"
  2716. "sbcs r5, r5, r9\n\t"
  2717. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2718. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2719. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2720. "sbcs r2, r2, r6\n\t"
  2721. "sbcs r3, r3, r7\n\t"
  2722. "sbcs r4, r4, r8\n\t"
  2723. "sbcs r5, r5, r9\n\t"
  2724. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2725. "sbc %[a], r9, r9\n\t"
  2726. : [a] "+r" (a), [b] "+r" (b)
  2727. :
  2728. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  2729. );
  2730. return (uint32_t)(size_t)a;
  2731. }
  2732. /* Add b to a into r. (r = a + b)
  2733. *
  2734. * r A single precision integer.
  2735. * a A single precision integer.
  2736. * b A single precision integer.
  2737. */
  2738. static sp_digit sp_2048_add_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  2739. {
  2740. register sp_digit* r asm ("r0") = r_p;
  2741. register const sp_digit* a asm ("r1") = a_p;
  2742. register const sp_digit* b asm ("r2") = b_p;
  2743. __asm__ __volatile__ (
  2744. "mov r12, #0\n\t"
  2745. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2746. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2747. "adds r3, r3, r7\n\t"
  2748. "adcs r4, r4, r8\n\t"
  2749. "adcs r5, r5, r9\n\t"
  2750. "adcs r6, r6, r10\n\t"
  2751. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2752. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2753. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2754. "adcs r3, r3, r7\n\t"
  2755. "adcs r4, r4, r8\n\t"
  2756. "adcs r5, r5, r9\n\t"
  2757. "adcs r6, r6, r10\n\t"
  2758. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2759. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2760. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2761. "adcs r3, r3, r7\n\t"
  2762. "adcs r4, r4, r8\n\t"
  2763. "adcs r5, r5, r9\n\t"
  2764. "adcs r6, r6, r10\n\t"
  2765. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2766. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2767. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2768. "adcs r3, r3, r7\n\t"
  2769. "adcs r4, r4, r8\n\t"
  2770. "adcs r5, r5, r9\n\t"
  2771. "adcs r6, r6, r10\n\t"
  2772. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2773. "adc %[r], r12, r12\n\t"
  2774. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  2775. :
  2776. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  2777. );
  2778. return (uint32_t)(size_t)r;
  2779. }
  2780. /* AND m into each word of a and store in r.
  2781. *
  2782. * r A single precision integer.
  2783. * a A single precision integer.
  2784. * m Mask to AND against each digit.
  2785. */
  2786. static void sp_2048_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  2787. {
  2788. #ifdef WOLFSSL_SP_SMALL
  2789. int i;
  2790. for (i=0; i<8; i++) {
  2791. r[i] = a[i] & m;
  2792. }
  2793. #else
  2794. r[0] = a[0] & m;
  2795. r[1] = a[1] & m;
  2796. r[2] = a[2] & m;
  2797. r[3] = a[3] & m;
  2798. r[4] = a[4] & m;
  2799. r[5] = a[5] & m;
  2800. r[6] = a[6] & m;
  2801. r[7] = a[7] & m;
  2802. #endif
  2803. }
  2804. /* Multiply a and b into r. (r = a * b)
  2805. *
  2806. * r A single precision integer.
  2807. * a A single precision integer.
  2808. * b A single precision integer.
  2809. */
  2810. SP_NOINLINE static void sp_2048_mul_16(sp_digit* r, const sp_digit* a,
  2811. const sp_digit* b)
  2812. {
  2813. sp_digit* z0 = r;
  2814. sp_digit z1[16];
  2815. sp_digit a1[8];
  2816. sp_digit b1[8];
  2817. sp_digit* z2 = r + 16;
  2818. sp_digit u;
  2819. sp_digit ca;
  2820. sp_digit cb;
  2821. ca = sp_2048_add_8(a1, a, &a[8]);
  2822. cb = sp_2048_add_8(b1, b, &b[8]);
  2823. u = ca & cb;
  2824. sp_2048_mul_8(z2, &a[8], &b[8]);
  2825. sp_2048_mul_8(z0, a, b);
  2826. sp_2048_mul_8(z1, a1, b1);
  2827. u += sp_2048_sub_in_place_16(z1, z0);
  2828. u += sp_2048_sub_in_place_16(z1, z2);
  2829. sp_2048_mask_8(a1, a1, 0 - cb);
  2830. u += sp_2048_add_8(z1 + 8, z1 + 8, a1);
  2831. sp_2048_mask_8(b1, b1, 0 - ca);
  2832. u += sp_2048_add_8(z1 + 8, z1 + 8, b1);
  2833. u += sp_2048_add_16(r + 8, r + 8, z1);
  2834. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (8 - 1));
  2835. a1[0] = u;
  2836. (void)sp_2048_add_8(r + 24, r + 24, a1);
  2837. }
  2838. /* Sub b from a into a. (a -= b)
  2839. *
  2840. * a A single precision integer and result.
  2841. * b A single precision integer.
  2842. */
  2843. static sp_digit sp_2048_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p)
  2844. {
  2845. register sp_digit* a asm ("r0") = a_p;
  2846. register const sp_digit* b asm ("r1") = b_p;
  2847. __asm__ __volatile__ (
  2848. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2849. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2850. "subs r2, r2, r6\n\t"
  2851. "sbcs r3, r3, r7\n\t"
  2852. "sbcs r4, r4, r8\n\t"
  2853. "sbcs r5, r5, r9\n\t"
  2854. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2855. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2856. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2857. "sbcs r2, r2, r6\n\t"
  2858. "sbcs r3, r3, r7\n\t"
  2859. "sbcs r4, r4, r8\n\t"
  2860. "sbcs r5, r5, r9\n\t"
  2861. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2862. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2863. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2864. "sbcs r2, r2, r6\n\t"
  2865. "sbcs r3, r3, r7\n\t"
  2866. "sbcs r4, r4, r8\n\t"
  2867. "sbcs r5, r5, r9\n\t"
  2868. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2869. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2870. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2871. "sbcs r2, r2, r6\n\t"
  2872. "sbcs r3, r3, r7\n\t"
  2873. "sbcs r4, r4, r8\n\t"
  2874. "sbcs r5, r5, r9\n\t"
  2875. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2876. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2877. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2878. "sbcs r2, r2, r6\n\t"
  2879. "sbcs r3, r3, r7\n\t"
  2880. "sbcs r4, r4, r8\n\t"
  2881. "sbcs r5, r5, r9\n\t"
  2882. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2883. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2884. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2885. "sbcs r2, r2, r6\n\t"
  2886. "sbcs r3, r3, r7\n\t"
  2887. "sbcs r4, r4, r8\n\t"
  2888. "sbcs r5, r5, r9\n\t"
  2889. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2890. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2891. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2892. "sbcs r2, r2, r6\n\t"
  2893. "sbcs r3, r3, r7\n\t"
  2894. "sbcs r4, r4, r8\n\t"
  2895. "sbcs r5, r5, r9\n\t"
  2896. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2897. "ldm %[a], {r2, r3, r4, r5}\n\t"
  2898. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  2899. "sbcs r2, r2, r6\n\t"
  2900. "sbcs r3, r3, r7\n\t"
  2901. "sbcs r4, r4, r8\n\t"
  2902. "sbcs r5, r5, r9\n\t"
  2903. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  2904. "sbc %[a], r9, r9\n\t"
  2905. : [a] "+r" (a), [b] "+r" (b)
  2906. :
  2907. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  2908. );
  2909. return (uint32_t)(size_t)a;
  2910. }
  2911. /* Add b to a into r. (r = a + b)
  2912. *
  2913. * r A single precision integer.
  2914. * a A single precision integer.
  2915. * b A single precision integer.
  2916. */
  2917. static sp_digit sp_2048_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  2918. {
  2919. register sp_digit* r asm ("r0") = r_p;
  2920. register const sp_digit* a asm ("r1") = a_p;
  2921. register const sp_digit* b asm ("r2") = b_p;
  2922. __asm__ __volatile__ (
  2923. "mov r12, #0\n\t"
  2924. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2925. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2926. "adds r3, r3, r7\n\t"
  2927. "adcs r4, r4, r8\n\t"
  2928. "adcs r5, r5, r9\n\t"
  2929. "adcs r6, r6, r10\n\t"
  2930. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2931. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2932. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2933. "adcs r3, r3, r7\n\t"
  2934. "adcs r4, r4, r8\n\t"
  2935. "adcs r5, r5, r9\n\t"
  2936. "adcs r6, r6, r10\n\t"
  2937. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2938. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2939. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2940. "adcs r3, r3, r7\n\t"
  2941. "adcs r4, r4, r8\n\t"
  2942. "adcs r5, r5, r9\n\t"
  2943. "adcs r6, r6, r10\n\t"
  2944. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2945. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2946. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2947. "adcs r3, r3, r7\n\t"
  2948. "adcs r4, r4, r8\n\t"
  2949. "adcs r5, r5, r9\n\t"
  2950. "adcs r6, r6, r10\n\t"
  2951. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2952. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2953. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2954. "adcs r3, r3, r7\n\t"
  2955. "adcs r4, r4, r8\n\t"
  2956. "adcs r5, r5, r9\n\t"
  2957. "adcs r6, r6, r10\n\t"
  2958. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2959. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2960. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2961. "adcs r3, r3, r7\n\t"
  2962. "adcs r4, r4, r8\n\t"
  2963. "adcs r5, r5, r9\n\t"
  2964. "adcs r6, r6, r10\n\t"
  2965. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2966. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2967. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2968. "adcs r3, r3, r7\n\t"
  2969. "adcs r4, r4, r8\n\t"
  2970. "adcs r5, r5, r9\n\t"
  2971. "adcs r6, r6, r10\n\t"
  2972. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2973. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  2974. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  2975. "adcs r3, r3, r7\n\t"
  2976. "adcs r4, r4, r8\n\t"
  2977. "adcs r5, r5, r9\n\t"
  2978. "adcs r6, r6, r10\n\t"
  2979. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  2980. "adc %[r], r12, r12\n\t"
  2981. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  2982. :
  2983. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  2984. );
  2985. return (uint32_t)(size_t)r;
  2986. }
  2987. /* AND m into each word of a and store in r.
  2988. *
  2989. * r A single precision integer.
  2990. * a A single precision integer.
  2991. * m Mask to AND against each digit.
  2992. */
  2993. static void sp_2048_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  2994. {
  2995. #ifdef WOLFSSL_SP_SMALL
  2996. int i;
  2997. for (i=0; i<16; i++) {
  2998. r[i] = a[i] & m;
  2999. }
  3000. #else
  3001. int i;
  3002. for (i = 0; i < 16; i += 8) {
  3003. r[i+0] = a[i+0] & m;
  3004. r[i+1] = a[i+1] & m;
  3005. r[i+2] = a[i+2] & m;
  3006. r[i+3] = a[i+3] & m;
  3007. r[i+4] = a[i+4] & m;
  3008. r[i+5] = a[i+5] & m;
  3009. r[i+6] = a[i+6] & m;
  3010. r[i+7] = a[i+7] & m;
  3011. }
  3012. #endif
  3013. }
  3014. /* Multiply a and b into r. (r = a * b)
  3015. *
  3016. * r A single precision integer.
  3017. * a A single precision integer.
  3018. * b A single precision integer.
  3019. */
  3020. SP_NOINLINE static void sp_2048_mul_32(sp_digit* r, const sp_digit* a,
  3021. const sp_digit* b)
  3022. {
  3023. sp_digit* z0 = r;
  3024. sp_digit z1[32];
  3025. sp_digit a1[16];
  3026. sp_digit b1[16];
  3027. sp_digit* z2 = r + 32;
  3028. sp_digit u;
  3029. sp_digit ca;
  3030. sp_digit cb;
  3031. ca = sp_2048_add_16(a1, a, &a[16]);
  3032. cb = sp_2048_add_16(b1, b, &b[16]);
  3033. u = ca & cb;
  3034. sp_2048_mul_16(z2, &a[16], &b[16]);
  3035. sp_2048_mul_16(z0, a, b);
  3036. sp_2048_mul_16(z1, a1, b1);
  3037. u += sp_2048_sub_in_place_32(z1, z0);
  3038. u += sp_2048_sub_in_place_32(z1, z2);
  3039. sp_2048_mask_16(a1, a1, 0 - cb);
  3040. u += sp_2048_add_16(z1 + 16, z1 + 16, a1);
  3041. sp_2048_mask_16(b1, b1, 0 - ca);
  3042. u += sp_2048_add_16(z1 + 16, z1 + 16, b1);
  3043. u += sp_2048_add_32(r + 16, r + 16, z1);
  3044. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (16 - 1));
  3045. a1[0] = u;
  3046. (void)sp_2048_add_16(r + 48, r + 48, a1);
  3047. }
  3048. /* Sub b from a into a. (a -= b)
  3049. *
  3050. * a A single precision integer and result.
  3051. * b A single precision integer.
  3052. */
  3053. static sp_digit sp_2048_sub_in_place_64(sp_digit* a_p, const sp_digit* b_p)
  3054. {
  3055. register sp_digit* a asm ("r0") = a_p;
  3056. register const sp_digit* b asm ("r1") = b_p;
  3057. __asm__ __volatile__ (
  3058. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3059. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3060. "subs r2, r2, r6\n\t"
  3061. "sbcs r3, r3, r7\n\t"
  3062. "sbcs r4, r4, r8\n\t"
  3063. "sbcs r5, r5, r9\n\t"
  3064. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3065. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3066. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3067. "sbcs r2, r2, r6\n\t"
  3068. "sbcs r3, r3, r7\n\t"
  3069. "sbcs r4, r4, r8\n\t"
  3070. "sbcs r5, r5, r9\n\t"
  3071. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3072. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3073. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3074. "sbcs r2, r2, r6\n\t"
  3075. "sbcs r3, r3, r7\n\t"
  3076. "sbcs r4, r4, r8\n\t"
  3077. "sbcs r5, r5, r9\n\t"
  3078. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3079. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3080. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3081. "sbcs r2, r2, r6\n\t"
  3082. "sbcs r3, r3, r7\n\t"
  3083. "sbcs r4, r4, r8\n\t"
  3084. "sbcs r5, r5, r9\n\t"
  3085. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3086. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3087. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3088. "sbcs r2, r2, r6\n\t"
  3089. "sbcs r3, r3, r7\n\t"
  3090. "sbcs r4, r4, r8\n\t"
  3091. "sbcs r5, r5, r9\n\t"
  3092. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3093. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3094. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3095. "sbcs r2, r2, r6\n\t"
  3096. "sbcs r3, r3, r7\n\t"
  3097. "sbcs r4, r4, r8\n\t"
  3098. "sbcs r5, r5, r9\n\t"
  3099. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3100. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3101. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3102. "sbcs r2, r2, r6\n\t"
  3103. "sbcs r3, r3, r7\n\t"
  3104. "sbcs r4, r4, r8\n\t"
  3105. "sbcs r5, r5, r9\n\t"
  3106. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3107. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3108. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3109. "sbcs r2, r2, r6\n\t"
  3110. "sbcs r3, r3, r7\n\t"
  3111. "sbcs r4, r4, r8\n\t"
  3112. "sbcs r5, r5, r9\n\t"
  3113. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3114. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3115. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3116. "sbcs r2, r2, r6\n\t"
  3117. "sbcs r3, r3, r7\n\t"
  3118. "sbcs r4, r4, r8\n\t"
  3119. "sbcs r5, r5, r9\n\t"
  3120. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3121. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3122. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3123. "sbcs r2, r2, r6\n\t"
  3124. "sbcs r3, r3, r7\n\t"
  3125. "sbcs r4, r4, r8\n\t"
  3126. "sbcs r5, r5, r9\n\t"
  3127. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3128. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3129. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3130. "sbcs r2, r2, r6\n\t"
  3131. "sbcs r3, r3, r7\n\t"
  3132. "sbcs r4, r4, r8\n\t"
  3133. "sbcs r5, r5, r9\n\t"
  3134. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3135. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3136. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3137. "sbcs r2, r2, r6\n\t"
  3138. "sbcs r3, r3, r7\n\t"
  3139. "sbcs r4, r4, r8\n\t"
  3140. "sbcs r5, r5, r9\n\t"
  3141. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3142. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3143. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3144. "sbcs r2, r2, r6\n\t"
  3145. "sbcs r3, r3, r7\n\t"
  3146. "sbcs r4, r4, r8\n\t"
  3147. "sbcs r5, r5, r9\n\t"
  3148. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3149. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3150. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3151. "sbcs r2, r2, r6\n\t"
  3152. "sbcs r3, r3, r7\n\t"
  3153. "sbcs r4, r4, r8\n\t"
  3154. "sbcs r5, r5, r9\n\t"
  3155. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3156. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3157. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3158. "sbcs r2, r2, r6\n\t"
  3159. "sbcs r3, r3, r7\n\t"
  3160. "sbcs r4, r4, r8\n\t"
  3161. "sbcs r5, r5, r9\n\t"
  3162. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3163. "ldm %[a], {r2, r3, r4, r5}\n\t"
  3164. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  3165. "sbcs r2, r2, r6\n\t"
  3166. "sbcs r3, r3, r7\n\t"
  3167. "sbcs r4, r4, r8\n\t"
  3168. "sbcs r5, r5, r9\n\t"
  3169. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  3170. "sbc %[a], r9, r9\n\t"
  3171. : [a] "+r" (a), [b] "+r" (b)
  3172. :
  3173. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  3174. );
  3175. return (uint32_t)(size_t)a;
  3176. }
  3177. /* Add b to a into r. (r = a + b)
  3178. *
  3179. * r A single precision integer.
  3180. * a A single precision integer.
  3181. * b A single precision integer.
  3182. */
  3183. static sp_digit sp_2048_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  3184. {
  3185. register sp_digit* r asm ("r0") = r_p;
  3186. register const sp_digit* a asm ("r1") = a_p;
  3187. register const sp_digit* b asm ("r2") = b_p;
  3188. __asm__ __volatile__ (
  3189. "mov r12, #0\n\t"
  3190. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3191. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3192. "adds r3, r3, r7\n\t"
  3193. "adcs r4, r4, r8\n\t"
  3194. "adcs r5, r5, r9\n\t"
  3195. "adcs r6, r6, r10\n\t"
  3196. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3197. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3198. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3199. "adcs r3, r3, r7\n\t"
  3200. "adcs r4, r4, r8\n\t"
  3201. "adcs r5, r5, r9\n\t"
  3202. "adcs r6, r6, r10\n\t"
  3203. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3204. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3205. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3206. "adcs r3, r3, r7\n\t"
  3207. "adcs r4, r4, r8\n\t"
  3208. "adcs r5, r5, r9\n\t"
  3209. "adcs r6, r6, r10\n\t"
  3210. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3211. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3212. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3213. "adcs r3, r3, r7\n\t"
  3214. "adcs r4, r4, r8\n\t"
  3215. "adcs r5, r5, r9\n\t"
  3216. "adcs r6, r6, r10\n\t"
  3217. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3218. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3219. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3220. "adcs r3, r3, r7\n\t"
  3221. "adcs r4, r4, r8\n\t"
  3222. "adcs r5, r5, r9\n\t"
  3223. "adcs r6, r6, r10\n\t"
  3224. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3225. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3226. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3227. "adcs r3, r3, r7\n\t"
  3228. "adcs r4, r4, r8\n\t"
  3229. "adcs r5, r5, r9\n\t"
  3230. "adcs r6, r6, r10\n\t"
  3231. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3232. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3233. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3234. "adcs r3, r3, r7\n\t"
  3235. "adcs r4, r4, r8\n\t"
  3236. "adcs r5, r5, r9\n\t"
  3237. "adcs r6, r6, r10\n\t"
  3238. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3239. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3240. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3241. "adcs r3, r3, r7\n\t"
  3242. "adcs r4, r4, r8\n\t"
  3243. "adcs r5, r5, r9\n\t"
  3244. "adcs r6, r6, r10\n\t"
  3245. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3246. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3247. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3248. "adcs r3, r3, r7\n\t"
  3249. "adcs r4, r4, r8\n\t"
  3250. "adcs r5, r5, r9\n\t"
  3251. "adcs r6, r6, r10\n\t"
  3252. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3253. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3254. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3255. "adcs r3, r3, r7\n\t"
  3256. "adcs r4, r4, r8\n\t"
  3257. "adcs r5, r5, r9\n\t"
  3258. "adcs r6, r6, r10\n\t"
  3259. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3260. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3261. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3262. "adcs r3, r3, r7\n\t"
  3263. "adcs r4, r4, r8\n\t"
  3264. "adcs r5, r5, r9\n\t"
  3265. "adcs r6, r6, r10\n\t"
  3266. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3267. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3268. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3269. "adcs r3, r3, r7\n\t"
  3270. "adcs r4, r4, r8\n\t"
  3271. "adcs r5, r5, r9\n\t"
  3272. "adcs r6, r6, r10\n\t"
  3273. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3274. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3275. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3276. "adcs r3, r3, r7\n\t"
  3277. "adcs r4, r4, r8\n\t"
  3278. "adcs r5, r5, r9\n\t"
  3279. "adcs r6, r6, r10\n\t"
  3280. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3281. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3282. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3283. "adcs r3, r3, r7\n\t"
  3284. "adcs r4, r4, r8\n\t"
  3285. "adcs r5, r5, r9\n\t"
  3286. "adcs r6, r6, r10\n\t"
  3287. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3288. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3289. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3290. "adcs r3, r3, r7\n\t"
  3291. "adcs r4, r4, r8\n\t"
  3292. "adcs r5, r5, r9\n\t"
  3293. "adcs r6, r6, r10\n\t"
  3294. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3295. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  3296. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  3297. "adcs r3, r3, r7\n\t"
  3298. "adcs r4, r4, r8\n\t"
  3299. "adcs r5, r5, r9\n\t"
  3300. "adcs r6, r6, r10\n\t"
  3301. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  3302. "adc %[r], r12, r12\n\t"
  3303. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  3304. :
  3305. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  3306. );
  3307. return (uint32_t)(size_t)r;
  3308. }
  3309. /* AND m into each word of a and store in r.
  3310. *
  3311. * r A single precision integer.
  3312. * a A single precision integer.
  3313. * m Mask to AND against each digit.
  3314. */
  3315. static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  3316. {
  3317. #ifdef WOLFSSL_SP_SMALL
  3318. int i;
  3319. for (i=0; i<32; i++) {
  3320. r[i] = a[i] & m;
  3321. }
  3322. #else
  3323. int i;
  3324. for (i = 0; i < 32; i += 8) {
  3325. r[i+0] = a[i+0] & m;
  3326. r[i+1] = a[i+1] & m;
  3327. r[i+2] = a[i+2] & m;
  3328. r[i+3] = a[i+3] & m;
  3329. r[i+4] = a[i+4] & m;
  3330. r[i+5] = a[i+5] & m;
  3331. r[i+6] = a[i+6] & m;
  3332. r[i+7] = a[i+7] & m;
  3333. }
  3334. #endif
  3335. }
  3336. /* Multiply a and b into r. (r = a * b)
  3337. *
  3338. * r A single precision integer.
  3339. * a A single precision integer.
  3340. * b A single precision integer.
  3341. */
  3342. SP_NOINLINE static void sp_2048_mul_64(sp_digit* r, const sp_digit* a,
  3343. const sp_digit* b)
  3344. {
  3345. sp_digit* z0 = r;
  3346. sp_digit z1[64];
  3347. sp_digit a1[32];
  3348. sp_digit b1[32];
  3349. sp_digit* z2 = r + 64;
  3350. sp_digit u;
  3351. sp_digit ca;
  3352. sp_digit cb;
  3353. ca = sp_2048_add_32(a1, a, &a[32]);
  3354. cb = sp_2048_add_32(b1, b, &b[32]);
  3355. u = ca & cb;
  3356. sp_2048_mul_32(z2, &a[32], &b[32]);
  3357. sp_2048_mul_32(z0, a, b);
  3358. sp_2048_mul_32(z1, a1, b1);
  3359. u += sp_2048_sub_in_place_64(z1, z0);
  3360. u += sp_2048_sub_in_place_64(z1, z2);
  3361. sp_2048_mask_32(a1, a1, 0 - cb);
  3362. u += sp_2048_add_32(z1 + 32, z1 + 32, a1);
  3363. sp_2048_mask_32(b1, b1, 0 - ca);
  3364. u += sp_2048_add_32(z1 + 32, z1 + 32, b1);
  3365. u += sp_2048_add_64(r + 32, r + 32, z1);
  3366. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (32 - 1));
  3367. a1[0] = u;
  3368. (void)sp_2048_add_32(r + 96, r + 96, a1);
  3369. }
  3370. /* Square a and put result in r. (r = a * a)
  3371. *
  3372. * r A single precision integer.
  3373. * a A single precision integer.
  3374. */
  3375. static void sp_2048_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  3376. {
  3377. register sp_digit* r asm ("r0") = r_p;
  3378. register const sp_digit* a asm ("r1") = a_p;
  3379. __asm__ __volatile__ (
  3380. "sub sp, sp, #32\n\t"
  3381. /* A[0] * A[0] */
  3382. "ldr r10, [%[a]]\n\t"
  3383. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3384. "lsr r9, r10, #16\n\t"
  3385. "lsl r2, r10, #16\n\t"
  3386. "lsr r2, r2, #16\n\t"
  3387. "mul r8, r2, r2\n\t"
  3388. "mul r3, r9, r9\n\t"
  3389. "mul r2, r9, r2\n\t"
  3390. "lsr r9, r2, #15\n\t"
  3391. "lsl r2, r2, #17\n\t"
  3392. "adds r8, r8, r2\n\t"
  3393. "adc r3, r3, r9\n\t"
  3394. #else
  3395. "umull r8, r3, r10, r10\n\t"
  3396. #endif
  3397. "mov r4, #0\n\t"
  3398. "str r8, [sp]\n\t"
  3399. /* A[0] * A[1] */
  3400. "ldr r10, [%[a], #4]\n\t"
  3401. "ldr r12, [%[a]]\n\t"
  3402. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3403. "lsl r8, r10, #16\n\t"
  3404. "lsl r9, r12, #16\n\t"
  3405. "lsr r8, r8, #16\n\t"
  3406. "lsr r9, r9, #16\n\t"
  3407. "mul r9, r8, r9\n\t"
  3408. "adds r3, r3, r9\n\t"
  3409. "adcs r4, r4, #0\n\t"
  3410. "mov r2, #0\n\t"
  3411. "adc r2, r2, #0\n\t"
  3412. "adds r3, r3, r9\n\t"
  3413. "adcs r4, r4, #0\n\t"
  3414. "adc r2, r2, #0\n\t"
  3415. "lsr r9, r12, #16\n\t"
  3416. "mul r8, r9, r8\n\t"
  3417. "lsr r9, r8, #16\n\t"
  3418. "lsl r8, r8, #16\n\t"
  3419. "adds r3, r3, r8\n\t"
  3420. "adcs r4, r4, r9\n\t"
  3421. "adc r2, r2, #0\n\t"
  3422. "adds r3, r3, r8\n\t"
  3423. "adcs r4, r4, r9\n\t"
  3424. "adc r2, r2, #0\n\t"
  3425. "lsr r8, r10, #16\n\t"
  3426. "lsr r9, r12, #16\n\t"
  3427. "mul r9, r8, r9\n\t"
  3428. "adds r4, r4, r9\n\t"
  3429. "adc r2, r2, #0\n\t"
  3430. "adds r4, r4, r9\n\t"
  3431. "adc r2, r2, #0\n\t"
  3432. "lsl r9, r12, #16\n\t"
  3433. "lsr r9, r9, #16\n\t"
  3434. "mul r8, r9, r8\n\t"
  3435. "lsr r9, r8, #16\n\t"
  3436. "lsl r8, r8, #16\n\t"
  3437. "adds r3, r3, r8\n\t"
  3438. "adcs r4, r4, r9\n\t"
  3439. "adc r2, r2, #0\n\t"
  3440. "adds r3, r3, r8\n\t"
  3441. "adcs r4, r4, r9\n\t"
  3442. "adc r2, r2, #0\n\t"
  3443. #else
  3444. "umull r8, r9, r10, r12\n\t"
  3445. "adds r3, r3, r8\n\t"
  3446. "adcs r4, r4, r9\n\t"
  3447. "mov r2, #0\n\t"
  3448. "adc r2, r2, #0\n\t"
  3449. "adds r3, r3, r8\n\t"
  3450. "adcs r4, r4, r9\n\t"
  3451. "mov r2, #0\n\t"
  3452. "adc r2, r2, #0\n\t"
  3453. #endif
  3454. "str r3, [sp, #4]\n\t"
  3455. /* A[0] * A[2] */
  3456. "ldr r10, [%[a], #8]\n\t"
  3457. "ldr r12, [%[a]]\n\t"
  3458. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3459. "lsl r8, r10, #16\n\t"
  3460. "lsl r9, r12, #16\n\t"
  3461. "lsr r8, r8, #16\n\t"
  3462. "lsr r9, r9, #16\n\t"
  3463. "mul r9, r8, r9\n\t"
  3464. "adds r4, r4, r9\n\t"
  3465. "adcs r2, r2, #0\n\t"
  3466. "mov r3, #0\n\t"
  3467. "adc r3, r3, #0\n\t"
  3468. "adds r4, r4, r9\n\t"
  3469. "adcs r2, r2, #0\n\t"
  3470. "adc r3, r3, #0\n\t"
  3471. "lsr r9, r12, #16\n\t"
  3472. "mul r8, r9, r8\n\t"
  3473. "lsr r9, r8, #16\n\t"
  3474. "lsl r8, r8, #16\n\t"
  3475. "adds r4, r4, r8\n\t"
  3476. "adcs r2, r2, r9\n\t"
  3477. "adc r3, r3, #0\n\t"
  3478. "adds r4, r4, r8\n\t"
  3479. "adcs r2, r2, r9\n\t"
  3480. "adc r3, r3, #0\n\t"
  3481. "lsr r8, r10, #16\n\t"
  3482. "lsr r9, r12, #16\n\t"
  3483. "mul r9, r8, r9\n\t"
  3484. "adds r2, r2, r9\n\t"
  3485. "adc r3, r3, #0\n\t"
  3486. "adds r2, r2, r9\n\t"
  3487. "adc r3, r3, #0\n\t"
  3488. "lsl r9, r12, #16\n\t"
  3489. "lsr r9, r9, #16\n\t"
  3490. "mul r8, r9, r8\n\t"
  3491. "lsr r9, r8, #16\n\t"
  3492. "lsl r8, r8, #16\n\t"
  3493. "adds r4, r4, r8\n\t"
  3494. "adcs r2, r2, r9\n\t"
  3495. "adc r3, r3, #0\n\t"
  3496. "adds r4, r4, r8\n\t"
  3497. "adcs r2, r2, r9\n\t"
  3498. "adc r3, r3, #0\n\t"
  3499. #else
  3500. "umull r8, r9, r10, r12\n\t"
  3501. "adds r4, r4, r8\n\t"
  3502. "adcs r2, r2, r9\n\t"
  3503. "mov r3, #0\n\t"
  3504. "adc r3, r3, #0\n\t"
  3505. "adds r4, r4, r8\n\t"
  3506. "adcs r2, r2, r9\n\t"
  3507. "mov r3, #0\n\t"
  3508. "adc r3, r3, #0\n\t"
  3509. #endif
  3510. /* A[1] * A[1] */
  3511. "ldr r10, [%[a], #4]\n\t"
  3512. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3513. "lsl r8, r10, #16\n\t"
  3514. "lsr r9, r10, #16\n\t"
  3515. "lsr r8, r8, #16\n\t"
  3516. "mov r12, r8\n\t"
  3517. "mul r8, r12, r8\n\t"
  3518. "mov r12, r9\n\t"
  3519. "mul r9, r12, r9\n\t"
  3520. "adds r4, r4, r8\n\t"
  3521. "adcs r2, r2, r9\n\t"
  3522. "adc r3, r3, #0\n\t"
  3523. "lsr r9, r10, #16\n\t"
  3524. "lsl r8, r10, #16\n\t"
  3525. "lsr r8, r8, #16\n\t"
  3526. "mul r8, r9, r8\n\t"
  3527. "lsr r9, r8, #15\n\t"
  3528. "lsl r8, r8, #17\n\t"
  3529. "adds r4, r4, r8\n\t"
  3530. "adcs r2, r2, r9\n\t"
  3531. "adc r3, r3, #0\n\t"
  3532. #else
  3533. "umull r8, r9, r10, r10\n\t"
  3534. "adds r4, r4, r8\n\t"
  3535. "adcs r2, r2, r9\n\t"
  3536. "adc r3, r3, #0\n\t"
  3537. #endif
  3538. "str r4, [sp, #8]\n\t"
  3539. /* A[0] * A[3] */
  3540. "ldr r10, [%[a], #12]\n\t"
  3541. "ldr r12, [%[a]]\n\t"
  3542. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3543. "lsl r8, r10, #16\n\t"
  3544. "lsl r9, r12, #16\n\t"
  3545. "lsr r8, r8, #16\n\t"
  3546. "lsr r9, r9, #16\n\t"
  3547. "mul r9, r8, r9\n\t"
  3548. "adds r2, r2, r9\n\t"
  3549. "adcs r3, r3, #0\n\t"
  3550. "mov r4, #0\n\t"
  3551. "adc r4, r4, #0\n\t"
  3552. "adds r2, r2, r9\n\t"
  3553. "adcs r3, r3, #0\n\t"
  3554. "adc r4, r4, #0\n\t"
  3555. "lsr r9, r12, #16\n\t"
  3556. "mul r8, r9, r8\n\t"
  3557. "lsr r9, r8, #16\n\t"
  3558. "lsl r8, r8, #16\n\t"
  3559. "adds r2, r2, r8\n\t"
  3560. "adcs r3, r3, r9\n\t"
  3561. "adc r4, r4, #0\n\t"
  3562. "adds r2, r2, r8\n\t"
  3563. "adcs r3, r3, r9\n\t"
  3564. "adc r4, r4, #0\n\t"
  3565. "lsr r8, r10, #16\n\t"
  3566. "lsr r9, r12, #16\n\t"
  3567. "mul r9, r8, r9\n\t"
  3568. "adds r3, r3, r9\n\t"
  3569. "adc r4, r4, #0\n\t"
  3570. "adds r3, r3, r9\n\t"
  3571. "adc r4, r4, #0\n\t"
  3572. "lsl r9, r12, #16\n\t"
  3573. "lsr r9, r9, #16\n\t"
  3574. "mul r8, r9, r8\n\t"
  3575. "lsr r9, r8, #16\n\t"
  3576. "lsl r8, r8, #16\n\t"
  3577. "adds r2, r2, r8\n\t"
  3578. "adcs r3, r3, r9\n\t"
  3579. "adc r4, r4, #0\n\t"
  3580. "adds r2, r2, r8\n\t"
  3581. "adcs r3, r3, r9\n\t"
  3582. "adc r4, r4, #0\n\t"
  3583. #else
  3584. "umull r8, r9, r10, r12\n\t"
  3585. "adds r2, r2, r8\n\t"
  3586. "adcs r3, r3, r9\n\t"
  3587. "mov r4, #0\n\t"
  3588. "adc r4, r4, #0\n\t"
  3589. "adds r2, r2, r8\n\t"
  3590. "adcs r3, r3, r9\n\t"
  3591. "mov r4, #0\n\t"
  3592. "adc r4, r4, #0\n\t"
  3593. #endif
  3594. /* A[1] * A[2] */
  3595. "ldr r10, [%[a], #8]\n\t"
  3596. "ldr r12, [%[a], #4]\n\t"
  3597. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3598. "lsl r8, r10, #16\n\t"
  3599. "lsl r9, r12, #16\n\t"
  3600. "lsr r8, r8, #16\n\t"
  3601. "lsr r9, r9, #16\n\t"
  3602. "mul r9, r8, r9\n\t"
  3603. "adds r2, r2, r9\n\t"
  3604. "adcs r3, r3, #0\n\t"
  3605. "adc r4, r4, #0\n\t"
  3606. "adds r2, r2, r9\n\t"
  3607. "adcs r3, r3, #0\n\t"
  3608. "adc r4, r4, #0\n\t"
  3609. "lsr r9, r12, #16\n\t"
  3610. "mul r8, r9, r8\n\t"
  3611. "lsr r9, r8, #16\n\t"
  3612. "lsl r8, r8, #16\n\t"
  3613. "adds r2, r2, r8\n\t"
  3614. "adcs r3, r3, r9\n\t"
  3615. "adc r4, r4, #0\n\t"
  3616. "adds r2, r2, r8\n\t"
  3617. "adcs r3, r3, r9\n\t"
  3618. "adc r4, r4, #0\n\t"
  3619. "lsr r8, r10, #16\n\t"
  3620. "lsr r9, r12, #16\n\t"
  3621. "mul r9, r8, r9\n\t"
  3622. "adds r3, r3, r9\n\t"
  3623. "adc r4, r4, #0\n\t"
  3624. "adds r3, r3, r9\n\t"
  3625. "adc r4, r4, #0\n\t"
  3626. "lsl r9, r12, #16\n\t"
  3627. "lsr r9, r9, #16\n\t"
  3628. "mul r8, r9, r8\n\t"
  3629. "lsr r9, r8, #16\n\t"
  3630. "lsl r8, r8, #16\n\t"
  3631. "adds r2, r2, r8\n\t"
  3632. "adcs r3, r3, r9\n\t"
  3633. "adc r4, r4, #0\n\t"
  3634. "adds r2, r2, r8\n\t"
  3635. "adcs r3, r3, r9\n\t"
  3636. "adc r4, r4, #0\n\t"
  3637. #else
  3638. "umull r8, r9, r10, r12\n\t"
  3639. "adds r2, r2, r8\n\t"
  3640. "adcs r3, r3, r9\n\t"
  3641. "adc r4, r4, #0\n\t"
  3642. "adds r2, r2, r8\n\t"
  3643. "adcs r3, r3, r9\n\t"
  3644. "adc r4, r4, #0\n\t"
  3645. #endif
  3646. "str r2, [sp, #12]\n\t"
  3647. /* A[0] * A[4] */
  3648. "ldr r10, [%[a], #16]\n\t"
  3649. "ldr r12, [%[a]]\n\t"
  3650. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3651. "lsl r8, r10, #16\n\t"
  3652. "lsl r9, r12, #16\n\t"
  3653. "lsr r8, r8, #16\n\t"
  3654. "lsr r9, r9, #16\n\t"
  3655. "mul r9, r8, r9\n\t"
  3656. "adds r3, r3, r9\n\t"
  3657. "adcs r4, r4, #0\n\t"
  3658. "mov r2, #0\n\t"
  3659. "adc r2, r2, #0\n\t"
  3660. "adds r3, r3, r9\n\t"
  3661. "adcs r4, r4, #0\n\t"
  3662. "adc r2, r2, #0\n\t"
  3663. "lsr r9, r12, #16\n\t"
  3664. "mul r8, r9, r8\n\t"
  3665. "lsr r9, r8, #16\n\t"
  3666. "lsl r8, r8, #16\n\t"
  3667. "adds r3, r3, r8\n\t"
  3668. "adcs r4, r4, r9\n\t"
  3669. "adc r2, r2, #0\n\t"
  3670. "adds r3, r3, r8\n\t"
  3671. "adcs r4, r4, r9\n\t"
  3672. "adc r2, r2, #0\n\t"
  3673. "lsr r8, r10, #16\n\t"
  3674. "lsr r9, r12, #16\n\t"
  3675. "mul r9, r8, r9\n\t"
  3676. "adds r4, r4, r9\n\t"
  3677. "adc r2, r2, #0\n\t"
  3678. "adds r4, r4, r9\n\t"
  3679. "adc r2, r2, #0\n\t"
  3680. "lsl r9, r12, #16\n\t"
  3681. "lsr r9, r9, #16\n\t"
  3682. "mul r8, r9, r8\n\t"
  3683. "lsr r9, r8, #16\n\t"
  3684. "lsl r8, r8, #16\n\t"
  3685. "adds r3, r3, r8\n\t"
  3686. "adcs r4, r4, r9\n\t"
  3687. "adc r2, r2, #0\n\t"
  3688. "adds r3, r3, r8\n\t"
  3689. "adcs r4, r4, r9\n\t"
  3690. "adc r2, r2, #0\n\t"
  3691. #else
  3692. "umull r8, r9, r10, r12\n\t"
  3693. "adds r3, r3, r8\n\t"
  3694. "adcs r4, r4, r9\n\t"
  3695. "mov r2, #0\n\t"
  3696. "adc r2, r2, #0\n\t"
  3697. "adds r3, r3, r8\n\t"
  3698. "adcs r4, r4, r9\n\t"
  3699. "mov r2, #0\n\t"
  3700. "adc r2, r2, #0\n\t"
  3701. #endif
  3702. /* A[1] * A[3] */
  3703. "ldr r10, [%[a], #12]\n\t"
  3704. "ldr r12, [%[a], #4]\n\t"
  3705. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3706. "lsl r8, r10, #16\n\t"
  3707. "lsl r9, r12, #16\n\t"
  3708. "lsr r8, r8, #16\n\t"
  3709. "lsr r9, r9, #16\n\t"
  3710. "mul r9, r8, r9\n\t"
  3711. "adds r3, r3, r9\n\t"
  3712. "adcs r4, r4, #0\n\t"
  3713. "adc r2, r2, #0\n\t"
  3714. "adds r3, r3, r9\n\t"
  3715. "adcs r4, r4, #0\n\t"
  3716. "adc r2, r2, #0\n\t"
  3717. "lsr r9, r12, #16\n\t"
  3718. "mul r8, r9, r8\n\t"
  3719. "lsr r9, r8, #16\n\t"
  3720. "lsl r8, r8, #16\n\t"
  3721. "adds r3, r3, r8\n\t"
  3722. "adcs r4, r4, r9\n\t"
  3723. "adc r2, r2, #0\n\t"
  3724. "adds r3, r3, r8\n\t"
  3725. "adcs r4, r4, r9\n\t"
  3726. "adc r2, r2, #0\n\t"
  3727. "lsr r8, r10, #16\n\t"
  3728. "lsr r9, r12, #16\n\t"
  3729. "mul r9, r8, r9\n\t"
  3730. "adds r4, r4, r9\n\t"
  3731. "adc r2, r2, #0\n\t"
  3732. "adds r4, r4, r9\n\t"
  3733. "adc r2, r2, #0\n\t"
  3734. "lsl r9, r12, #16\n\t"
  3735. "lsr r9, r9, #16\n\t"
  3736. "mul r8, r9, r8\n\t"
  3737. "lsr r9, r8, #16\n\t"
  3738. "lsl r8, r8, #16\n\t"
  3739. "adds r3, r3, r8\n\t"
  3740. "adcs r4, r4, r9\n\t"
  3741. "adc r2, r2, #0\n\t"
  3742. "adds r3, r3, r8\n\t"
  3743. "adcs r4, r4, r9\n\t"
  3744. "adc r2, r2, #0\n\t"
  3745. #else
  3746. "umull r8, r9, r10, r12\n\t"
  3747. "adds r3, r3, r8\n\t"
  3748. "adcs r4, r4, r9\n\t"
  3749. "adc r2, r2, #0\n\t"
  3750. "adds r3, r3, r8\n\t"
  3751. "adcs r4, r4, r9\n\t"
  3752. "adc r2, r2, #0\n\t"
  3753. #endif
  3754. /* A[2] * A[2] */
  3755. "ldr r10, [%[a], #8]\n\t"
  3756. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3757. "lsl r8, r10, #16\n\t"
  3758. "lsr r9, r10, #16\n\t"
  3759. "lsr r8, r8, #16\n\t"
  3760. "mov r12, r8\n\t"
  3761. "mul r8, r12, r8\n\t"
  3762. "mov r12, r9\n\t"
  3763. "mul r9, r12, r9\n\t"
  3764. "adds r3, r3, r8\n\t"
  3765. "adcs r4, r4, r9\n\t"
  3766. "adc r2, r2, #0\n\t"
  3767. "lsr r9, r10, #16\n\t"
  3768. "lsl r8, r10, #16\n\t"
  3769. "lsr r8, r8, #16\n\t"
  3770. "mul r8, r9, r8\n\t"
  3771. "lsr r9, r8, #15\n\t"
  3772. "lsl r8, r8, #17\n\t"
  3773. "adds r3, r3, r8\n\t"
  3774. "adcs r4, r4, r9\n\t"
  3775. "adc r2, r2, #0\n\t"
  3776. #else
  3777. "umull r8, r9, r10, r10\n\t"
  3778. "adds r3, r3, r8\n\t"
  3779. "adcs r4, r4, r9\n\t"
  3780. "adc r2, r2, #0\n\t"
  3781. #endif
  3782. "str r3, [sp, #16]\n\t"
  3783. /* A[0] * A[5] */
  3784. "ldr r10, [%[a], #20]\n\t"
  3785. "ldr r12, [%[a]]\n\t"
  3786. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3787. "lsl r8, r10, #16\n\t"
  3788. "lsl r5, r12, #16\n\t"
  3789. "lsr r8, r8, #16\n\t"
  3790. "lsr r5, r5, #16\n\t"
  3791. "mul r5, r8, r5\n\t"
  3792. "lsr r9, r12, #16\n\t"
  3793. "mul r8, r9, r8\n\t"
  3794. "lsr r6, r8, #16\n\t"
  3795. "lsl r8, r8, #16\n\t"
  3796. "adds r5, r5, r8\n\t"
  3797. "adc r6, r6, #0\n\t"
  3798. "lsr r8, r10, #16\n\t"
  3799. "mul r9, r8, r9\n\t"
  3800. "add r6, r6, r9\n\t"
  3801. "lsl r9, r12, #16\n\t"
  3802. "lsr r9, r9, #16\n\t"
  3803. "mul r8, r9, r8\n\t"
  3804. "lsr r9, r8, #16\n\t"
  3805. "lsl r8, r8, #16\n\t"
  3806. "adds r5, r5, r8\n\t"
  3807. "adc r6, r6, r9\n\t"
  3808. #else
  3809. "umull r5, r6, r10, r12\n\t"
  3810. #endif
  3811. "mov r3, #0\n\t"
  3812. "mov r7, #0\n\t"
  3813. /* A[1] * A[4] */
  3814. "ldr r10, [%[a], #16]\n\t"
  3815. "ldr r12, [%[a], #4]\n\t"
  3816. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3817. "lsl r8, r10, #16\n\t"
  3818. "lsl r9, r12, #16\n\t"
  3819. "lsr r8, r8, #16\n\t"
  3820. "lsr r9, r9, #16\n\t"
  3821. "mul r9, r8, r9\n\t"
  3822. "adds r5, r5, r9\n\t"
  3823. "adcs r6, r6, #0\n\t"
  3824. "adc r7, r7, #0\n\t"
  3825. "lsr r9, r12, #16\n\t"
  3826. "mul r8, r9, r8\n\t"
  3827. "lsr r9, r8, #16\n\t"
  3828. "lsl r8, r8, #16\n\t"
  3829. "adds r5, r5, r8\n\t"
  3830. "adcs r6, r6, r9\n\t"
  3831. "adc r7, r7, #0\n\t"
  3832. "lsr r8, r10, #16\n\t"
  3833. "lsr r9, r12, #16\n\t"
  3834. "mul r9, r8, r9\n\t"
  3835. "adds r6, r6, r9\n\t"
  3836. "adc r7, r7, #0\n\t"
  3837. "lsl r9, r12, #16\n\t"
  3838. "lsr r9, r9, #16\n\t"
  3839. "mul r8, r9, r8\n\t"
  3840. "lsr r9, r8, #16\n\t"
  3841. "lsl r8, r8, #16\n\t"
  3842. "adds r5, r5, r8\n\t"
  3843. "adcs r6, r6, r9\n\t"
  3844. "adc r7, r7, #0\n\t"
  3845. #else
  3846. "umull r8, r9, r10, r12\n\t"
  3847. "adds r5, r5, r8\n\t"
  3848. "adcs r6, r6, r9\n\t"
  3849. "adc r7, r7, #0\n\t"
  3850. #endif
  3851. /* A[2] * A[3] */
  3852. "ldr r10, [%[a], #12]\n\t"
  3853. "ldr r12, [%[a], #8]\n\t"
  3854. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3855. "lsl r8, r10, #16\n\t"
  3856. "lsl r9, r12, #16\n\t"
  3857. "lsr r8, r8, #16\n\t"
  3858. "lsr r9, r9, #16\n\t"
  3859. "mul r9, r8, r9\n\t"
  3860. "adds r5, r5, r9\n\t"
  3861. "adcs r6, r6, #0\n\t"
  3862. "adc r7, r7, #0\n\t"
  3863. "lsr r9, r12, #16\n\t"
  3864. "mul r8, r9, r8\n\t"
  3865. "lsr r9, r8, #16\n\t"
  3866. "lsl r8, r8, #16\n\t"
  3867. "adds r5, r5, r8\n\t"
  3868. "adcs r6, r6, r9\n\t"
  3869. "adc r7, r7, #0\n\t"
  3870. "lsr r8, r10, #16\n\t"
  3871. "lsr r9, r12, #16\n\t"
  3872. "mul r9, r8, r9\n\t"
  3873. "adds r6, r6, r9\n\t"
  3874. "adc r7, r7, #0\n\t"
  3875. "lsl r9, r12, #16\n\t"
  3876. "lsr r9, r9, #16\n\t"
  3877. "mul r8, r9, r8\n\t"
  3878. "lsr r9, r8, #16\n\t"
  3879. "lsl r8, r8, #16\n\t"
  3880. "adds r5, r5, r8\n\t"
  3881. "adcs r6, r6, r9\n\t"
  3882. "adc r7, r7, #0\n\t"
  3883. #else
  3884. "umull r8, r9, r10, r12\n\t"
  3885. "adds r5, r5, r8\n\t"
  3886. "adcs r6, r6, r9\n\t"
  3887. "adc r7, r7, #0\n\t"
  3888. #endif
  3889. "adds r5, r5, r5\n\t"
  3890. "adcs r6, r6, r6\n\t"
  3891. "adc r7, r7, r7\n\t"
  3892. "adds r4, r4, r5\n\t"
  3893. "adcs r2, r2, r6\n\t"
  3894. "adc r3, r3, r7\n\t"
  3895. "str r4, [sp, #20]\n\t"
  3896. /* A[0] * A[6] */
  3897. "ldr r10, [%[a], #24]\n\t"
  3898. "ldr r12, [%[a]]\n\t"
  3899. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3900. "lsl r8, r10, #16\n\t"
  3901. "lsl r5, r12, #16\n\t"
  3902. "lsr r8, r8, #16\n\t"
  3903. "lsr r5, r5, #16\n\t"
  3904. "mul r5, r8, r5\n\t"
  3905. "lsr r9, r12, #16\n\t"
  3906. "mul r8, r9, r8\n\t"
  3907. "lsr r6, r8, #16\n\t"
  3908. "lsl r8, r8, #16\n\t"
  3909. "adds r5, r5, r8\n\t"
  3910. "adc r6, r6, #0\n\t"
  3911. "lsr r8, r10, #16\n\t"
  3912. "mul r9, r8, r9\n\t"
  3913. "add r6, r6, r9\n\t"
  3914. "lsl r9, r12, #16\n\t"
  3915. "lsr r9, r9, #16\n\t"
  3916. "mul r8, r9, r8\n\t"
  3917. "lsr r9, r8, #16\n\t"
  3918. "lsl r8, r8, #16\n\t"
  3919. "adds r5, r5, r8\n\t"
  3920. "adc r6, r6, r9\n\t"
  3921. #else
  3922. "umull r5, r6, r10, r12\n\t"
  3923. #endif
  3924. "mov r4, #0\n\t"
  3925. "mov r7, #0\n\t"
  3926. /* A[1] * A[5] */
  3927. "ldr r10, [%[a], #20]\n\t"
  3928. "ldr r12, [%[a], #4]\n\t"
  3929. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3930. "lsl r8, r10, #16\n\t"
  3931. "lsl r9, r12, #16\n\t"
  3932. "lsr r8, r8, #16\n\t"
  3933. "lsr r9, r9, #16\n\t"
  3934. "mul r9, r8, r9\n\t"
  3935. "adds r5, r5, r9\n\t"
  3936. "adcs r6, r6, #0\n\t"
  3937. "adc r7, r7, #0\n\t"
  3938. "lsr r9, r12, #16\n\t"
  3939. "mul r8, r9, r8\n\t"
  3940. "lsr r9, r8, #16\n\t"
  3941. "lsl r8, r8, #16\n\t"
  3942. "adds r5, r5, r8\n\t"
  3943. "adcs r6, r6, r9\n\t"
  3944. "adc r7, r7, #0\n\t"
  3945. "lsr r8, r10, #16\n\t"
  3946. "lsr r9, r12, #16\n\t"
  3947. "mul r9, r8, r9\n\t"
  3948. "adds r6, r6, r9\n\t"
  3949. "adc r7, r7, #0\n\t"
  3950. "lsl r9, r12, #16\n\t"
  3951. "lsr r9, r9, #16\n\t"
  3952. "mul r8, r9, r8\n\t"
  3953. "lsr r9, r8, #16\n\t"
  3954. "lsl r8, r8, #16\n\t"
  3955. "adds r5, r5, r8\n\t"
  3956. "adcs r6, r6, r9\n\t"
  3957. "adc r7, r7, #0\n\t"
  3958. #else
  3959. "umull r8, r9, r10, r12\n\t"
  3960. "adds r5, r5, r8\n\t"
  3961. "adcs r6, r6, r9\n\t"
  3962. "adc r7, r7, #0\n\t"
  3963. #endif
  3964. /* A[2] * A[4] */
  3965. "ldr r10, [%[a], #16]\n\t"
  3966. "ldr r12, [%[a], #8]\n\t"
  3967. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  3968. "lsl r8, r10, #16\n\t"
  3969. "lsl r9, r12, #16\n\t"
  3970. "lsr r8, r8, #16\n\t"
  3971. "lsr r9, r9, #16\n\t"
  3972. "mul r9, r8, r9\n\t"
  3973. "adds r5, r5, r9\n\t"
  3974. "adcs r6, r6, #0\n\t"
  3975. "adc r7, r7, #0\n\t"
  3976. "lsr r9, r12, #16\n\t"
  3977. "mul r8, r9, r8\n\t"
  3978. "lsr r9, r8, #16\n\t"
  3979. "lsl r8, r8, #16\n\t"
  3980. "adds r5, r5, r8\n\t"
  3981. "adcs r6, r6, r9\n\t"
  3982. "adc r7, r7, #0\n\t"
  3983. "lsr r8, r10, #16\n\t"
  3984. "lsr r9, r12, #16\n\t"
  3985. "mul r9, r8, r9\n\t"
  3986. "adds r6, r6, r9\n\t"
  3987. "adc r7, r7, #0\n\t"
  3988. "lsl r9, r12, #16\n\t"
  3989. "lsr r9, r9, #16\n\t"
  3990. "mul r8, r9, r8\n\t"
  3991. "lsr r9, r8, #16\n\t"
  3992. "lsl r8, r8, #16\n\t"
  3993. "adds r5, r5, r8\n\t"
  3994. "adcs r6, r6, r9\n\t"
  3995. "adc r7, r7, #0\n\t"
  3996. #else
  3997. "umull r8, r9, r10, r12\n\t"
  3998. "adds r5, r5, r8\n\t"
  3999. "adcs r6, r6, r9\n\t"
  4000. "adc r7, r7, #0\n\t"
  4001. #endif
  4002. /* A[3] * A[3] */
  4003. "ldr r10, [%[a], #12]\n\t"
  4004. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4005. "lsl r8, r10, #16\n\t"
  4006. "lsr r9, r10, #16\n\t"
  4007. "lsr r8, r8, #16\n\t"
  4008. "mov r12, r8\n\t"
  4009. "mul r8, r12, r8\n\t"
  4010. "mov r12, r9\n\t"
  4011. "mul r9, r12, r9\n\t"
  4012. "adds r2, r2, r8\n\t"
  4013. "adcs r3, r3, r9\n\t"
  4014. "adc r4, r4, #0\n\t"
  4015. "lsr r9, r10, #16\n\t"
  4016. "lsl r8, r10, #16\n\t"
  4017. "lsr r8, r8, #16\n\t"
  4018. "mul r8, r9, r8\n\t"
  4019. "lsr r9, r8, #15\n\t"
  4020. "lsl r8, r8, #17\n\t"
  4021. "adds r2, r2, r8\n\t"
  4022. "adcs r3, r3, r9\n\t"
  4023. "adc r4, r4, #0\n\t"
  4024. "adds r5, r5, r5\n\t"
  4025. "adcs r6, r6, r6\n\t"
  4026. "adc r7, r7, r7\n\t"
  4027. #else
  4028. "umull r8, r9, r10, r10\n\t"
  4029. "adds r5, r5, r5\n\t"
  4030. "adcs r6, r6, r6\n\t"
  4031. "adc r7, r7, r7\n\t"
  4032. "adds r2, r2, r8\n\t"
  4033. "adcs r3, r3, r9\n\t"
  4034. "adc r4, r4, #0\n\t"
  4035. #endif
  4036. "adds r2, r2, r5\n\t"
  4037. "adcs r3, r3, r6\n\t"
  4038. "adc r4, r4, r7\n\t"
  4039. "str r2, [sp, #24]\n\t"
  4040. /* A[0] * A[7] */
  4041. "ldr r10, [%[a], #28]\n\t"
  4042. "ldr r12, [%[a]]\n\t"
  4043. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4044. "lsl r8, r10, #16\n\t"
  4045. "lsl r5, r12, #16\n\t"
  4046. "lsr r8, r8, #16\n\t"
  4047. "lsr r5, r5, #16\n\t"
  4048. "mul r5, r8, r5\n\t"
  4049. "lsr r9, r12, #16\n\t"
  4050. "mul r8, r9, r8\n\t"
  4051. "lsr r6, r8, #16\n\t"
  4052. "lsl r8, r8, #16\n\t"
  4053. "adds r5, r5, r8\n\t"
  4054. "adc r6, r6, #0\n\t"
  4055. "lsr r8, r10, #16\n\t"
  4056. "mul r9, r8, r9\n\t"
  4057. "add r6, r6, r9\n\t"
  4058. "lsl r9, r12, #16\n\t"
  4059. "lsr r9, r9, #16\n\t"
  4060. "mul r8, r9, r8\n\t"
  4061. "lsr r9, r8, #16\n\t"
  4062. "lsl r8, r8, #16\n\t"
  4063. "adds r5, r5, r8\n\t"
  4064. "adc r6, r6, r9\n\t"
  4065. #else
  4066. "umull r5, r6, r10, r12\n\t"
  4067. #endif
  4068. "mov r2, #0\n\t"
  4069. "mov r7, #0\n\t"
  4070. /* A[1] * A[6] */
  4071. "ldr r10, [%[a], #24]\n\t"
  4072. "ldr r12, [%[a], #4]\n\t"
  4073. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4074. "lsl r8, r10, #16\n\t"
  4075. "lsl r9, r12, #16\n\t"
  4076. "lsr r8, r8, #16\n\t"
  4077. "lsr r9, r9, #16\n\t"
  4078. "mul r9, r8, r9\n\t"
  4079. "adds r5, r5, r9\n\t"
  4080. "adcs r6, r6, #0\n\t"
  4081. "adc r7, r7, #0\n\t"
  4082. "lsr r9, r12, #16\n\t"
  4083. "mul r8, r9, r8\n\t"
  4084. "lsr r9, r8, #16\n\t"
  4085. "lsl r8, r8, #16\n\t"
  4086. "adds r5, r5, r8\n\t"
  4087. "adcs r6, r6, r9\n\t"
  4088. "adc r7, r7, #0\n\t"
  4089. "lsr r8, r10, #16\n\t"
  4090. "lsr r9, r12, #16\n\t"
  4091. "mul r9, r8, r9\n\t"
  4092. "adds r6, r6, r9\n\t"
  4093. "adc r7, r7, #0\n\t"
  4094. "lsl r9, r12, #16\n\t"
  4095. "lsr r9, r9, #16\n\t"
  4096. "mul r8, r9, r8\n\t"
  4097. "lsr r9, r8, #16\n\t"
  4098. "lsl r8, r8, #16\n\t"
  4099. "adds r5, r5, r8\n\t"
  4100. "adcs r6, r6, r9\n\t"
  4101. "adc r7, r7, #0\n\t"
  4102. #else
  4103. "umull r8, r9, r10, r12\n\t"
  4104. "adds r5, r5, r8\n\t"
  4105. "adcs r6, r6, r9\n\t"
  4106. "adc r7, r7, #0\n\t"
  4107. #endif
  4108. /* A[2] * A[5] */
  4109. "ldr r10, [%[a], #20]\n\t"
  4110. "ldr r12, [%[a], #8]\n\t"
  4111. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4112. "lsl r8, r10, #16\n\t"
  4113. "lsl r9, r12, #16\n\t"
  4114. "lsr r8, r8, #16\n\t"
  4115. "lsr r9, r9, #16\n\t"
  4116. "mul r9, r8, r9\n\t"
  4117. "adds r5, r5, r9\n\t"
  4118. "adcs r6, r6, #0\n\t"
  4119. "adc r7, r7, #0\n\t"
  4120. "lsr r9, r12, #16\n\t"
  4121. "mul r8, r9, r8\n\t"
  4122. "lsr r9, r8, #16\n\t"
  4123. "lsl r8, r8, #16\n\t"
  4124. "adds r5, r5, r8\n\t"
  4125. "adcs r6, r6, r9\n\t"
  4126. "adc r7, r7, #0\n\t"
  4127. "lsr r8, r10, #16\n\t"
  4128. "lsr r9, r12, #16\n\t"
  4129. "mul r9, r8, r9\n\t"
  4130. "adds r6, r6, r9\n\t"
  4131. "adc r7, r7, #0\n\t"
  4132. "lsl r9, r12, #16\n\t"
  4133. "lsr r9, r9, #16\n\t"
  4134. "mul r8, r9, r8\n\t"
  4135. "lsr r9, r8, #16\n\t"
  4136. "lsl r8, r8, #16\n\t"
  4137. "adds r5, r5, r8\n\t"
  4138. "adcs r6, r6, r9\n\t"
  4139. "adc r7, r7, #0\n\t"
  4140. #else
  4141. "umull r8, r9, r10, r12\n\t"
  4142. "adds r5, r5, r8\n\t"
  4143. "adcs r6, r6, r9\n\t"
  4144. "adc r7, r7, #0\n\t"
  4145. #endif
  4146. /* A[3] * A[4] */
  4147. "ldr r10, [%[a], #16]\n\t"
  4148. "ldr r12, [%[a], #12]\n\t"
  4149. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4150. "lsl r8, r10, #16\n\t"
  4151. "lsl r9, r12, #16\n\t"
  4152. "lsr r8, r8, #16\n\t"
  4153. "lsr r9, r9, #16\n\t"
  4154. "mul r9, r8, r9\n\t"
  4155. "adds r5, r5, r9\n\t"
  4156. "adcs r6, r6, #0\n\t"
  4157. "adc r7, r7, #0\n\t"
  4158. "lsr r9, r12, #16\n\t"
  4159. "mul r8, r9, r8\n\t"
  4160. "lsr r9, r8, #16\n\t"
  4161. "lsl r8, r8, #16\n\t"
  4162. "adds r5, r5, r8\n\t"
  4163. "adcs r6, r6, r9\n\t"
  4164. "adc r7, r7, #0\n\t"
  4165. "lsr r8, r10, #16\n\t"
  4166. "lsr r9, r12, #16\n\t"
  4167. "mul r9, r8, r9\n\t"
  4168. "adds r6, r6, r9\n\t"
  4169. "adc r7, r7, #0\n\t"
  4170. "lsl r9, r12, #16\n\t"
  4171. "lsr r9, r9, #16\n\t"
  4172. "mul r8, r9, r8\n\t"
  4173. "lsr r9, r8, #16\n\t"
  4174. "lsl r8, r8, #16\n\t"
  4175. "adds r5, r5, r8\n\t"
  4176. "adcs r6, r6, r9\n\t"
  4177. "adc r7, r7, #0\n\t"
  4178. #else
  4179. "umull r8, r9, r10, r12\n\t"
  4180. "adds r5, r5, r8\n\t"
  4181. "adcs r6, r6, r9\n\t"
  4182. "adc r7, r7, #0\n\t"
  4183. #endif
  4184. "adds r5, r5, r5\n\t"
  4185. "adcs r6, r6, r6\n\t"
  4186. "adc r7, r7, r7\n\t"
  4187. "adds r3, r3, r5\n\t"
  4188. "adcs r4, r4, r6\n\t"
  4189. "adc r2, r2, r7\n\t"
  4190. "str r3, [sp, #28]\n\t"
  4191. /* A[1] * A[7] */
  4192. "ldr r10, [%[a], #28]\n\t"
  4193. "ldr r12, [%[a], #4]\n\t"
  4194. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4195. "lsl r8, r10, #16\n\t"
  4196. "lsl r5, r12, #16\n\t"
  4197. "lsr r8, r8, #16\n\t"
  4198. "lsr r5, r5, #16\n\t"
  4199. "mul r5, r8, r5\n\t"
  4200. "lsr r9, r12, #16\n\t"
  4201. "mul r8, r9, r8\n\t"
  4202. "lsr r6, r8, #16\n\t"
  4203. "lsl r8, r8, #16\n\t"
  4204. "adds r5, r5, r8\n\t"
  4205. "adc r6, r6, #0\n\t"
  4206. "lsr r8, r10, #16\n\t"
  4207. "mul r9, r8, r9\n\t"
  4208. "add r6, r6, r9\n\t"
  4209. "lsl r9, r12, #16\n\t"
  4210. "lsr r9, r9, #16\n\t"
  4211. "mul r8, r9, r8\n\t"
  4212. "lsr r9, r8, #16\n\t"
  4213. "lsl r8, r8, #16\n\t"
  4214. "adds r5, r5, r8\n\t"
  4215. "adc r6, r6, r9\n\t"
  4216. #else
  4217. "umull r5, r6, r10, r12\n\t"
  4218. #endif
  4219. "mov r3, #0\n\t"
  4220. "mov r7, #0\n\t"
  4221. /* A[2] * A[6] */
  4222. "ldr r10, [%[a], #24]\n\t"
  4223. "ldr r12, [%[a], #8]\n\t"
  4224. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4225. "lsl r8, r10, #16\n\t"
  4226. "lsl r9, r12, #16\n\t"
  4227. "lsr r8, r8, #16\n\t"
  4228. "lsr r9, r9, #16\n\t"
  4229. "mul r9, r8, r9\n\t"
  4230. "adds r5, r5, r9\n\t"
  4231. "adcs r6, r6, #0\n\t"
  4232. "adc r7, r7, #0\n\t"
  4233. "lsr r9, r12, #16\n\t"
  4234. "mul r8, r9, r8\n\t"
  4235. "lsr r9, r8, #16\n\t"
  4236. "lsl r8, r8, #16\n\t"
  4237. "adds r5, r5, r8\n\t"
  4238. "adcs r6, r6, r9\n\t"
  4239. "adc r7, r7, #0\n\t"
  4240. "lsr r8, r10, #16\n\t"
  4241. "lsr r9, r12, #16\n\t"
  4242. "mul r9, r8, r9\n\t"
  4243. "adds r6, r6, r9\n\t"
  4244. "adc r7, r7, #0\n\t"
  4245. "lsl r9, r12, #16\n\t"
  4246. "lsr r9, r9, #16\n\t"
  4247. "mul r8, r9, r8\n\t"
  4248. "lsr r9, r8, #16\n\t"
  4249. "lsl r8, r8, #16\n\t"
  4250. "adds r5, r5, r8\n\t"
  4251. "adcs r6, r6, r9\n\t"
  4252. "adc r7, r7, #0\n\t"
  4253. #else
  4254. "umull r8, r9, r10, r12\n\t"
  4255. "adds r5, r5, r8\n\t"
  4256. "adcs r6, r6, r9\n\t"
  4257. "adc r7, r7, #0\n\t"
  4258. #endif
  4259. /* A[3] * A[5] */
  4260. "ldr r10, [%[a], #20]\n\t"
  4261. "ldr r12, [%[a], #12]\n\t"
  4262. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4263. "lsl r8, r10, #16\n\t"
  4264. "lsl r9, r12, #16\n\t"
  4265. "lsr r8, r8, #16\n\t"
  4266. "lsr r9, r9, #16\n\t"
  4267. "mul r9, r8, r9\n\t"
  4268. "adds r5, r5, r9\n\t"
  4269. "adcs r6, r6, #0\n\t"
  4270. "adc r7, r7, #0\n\t"
  4271. "lsr r9, r12, #16\n\t"
  4272. "mul r8, r9, r8\n\t"
  4273. "lsr r9, r8, #16\n\t"
  4274. "lsl r8, r8, #16\n\t"
  4275. "adds r5, r5, r8\n\t"
  4276. "adcs r6, r6, r9\n\t"
  4277. "adc r7, r7, #0\n\t"
  4278. "lsr r8, r10, #16\n\t"
  4279. "lsr r9, r12, #16\n\t"
  4280. "mul r9, r8, r9\n\t"
  4281. "adds r6, r6, r9\n\t"
  4282. "adc r7, r7, #0\n\t"
  4283. "lsl r9, r12, #16\n\t"
  4284. "lsr r9, r9, #16\n\t"
  4285. "mul r8, r9, r8\n\t"
  4286. "lsr r9, r8, #16\n\t"
  4287. "lsl r8, r8, #16\n\t"
  4288. "adds r5, r5, r8\n\t"
  4289. "adcs r6, r6, r9\n\t"
  4290. "adc r7, r7, #0\n\t"
  4291. #else
  4292. "umull r8, r9, r10, r12\n\t"
  4293. "adds r5, r5, r8\n\t"
  4294. "adcs r6, r6, r9\n\t"
  4295. "adc r7, r7, #0\n\t"
  4296. #endif
  4297. /* A[4] * A[4] */
  4298. "ldr r10, [%[a], #16]\n\t"
  4299. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4300. "lsl r8, r10, #16\n\t"
  4301. "lsr r9, r10, #16\n\t"
  4302. "lsr r8, r8, #16\n\t"
  4303. "mov r12, r8\n\t"
  4304. "mul r8, r12, r8\n\t"
  4305. "mov r12, r9\n\t"
  4306. "mul r9, r12, r9\n\t"
  4307. "adds r4, r4, r8\n\t"
  4308. "adcs r2, r2, r9\n\t"
  4309. "adc r3, r3, #0\n\t"
  4310. "lsr r9, r10, #16\n\t"
  4311. "lsl r8, r10, #16\n\t"
  4312. "lsr r8, r8, #16\n\t"
  4313. "mul r8, r9, r8\n\t"
  4314. "lsr r9, r8, #15\n\t"
  4315. "lsl r8, r8, #17\n\t"
  4316. "adds r4, r4, r8\n\t"
  4317. "adcs r2, r2, r9\n\t"
  4318. "adc r3, r3, #0\n\t"
  4319. "adds r5, r5, r5\n\t"
  4320. "adcs r6, r6, r6\n\t"
  4321. "adc r7, r7, r7\n\t"
  4322. #else
  4323. "umull r8, r9, r10, r10\n\t"
  4324. "adds r5, r5, r5\n\t"
  4325. "adcs r6, r6, r6\n\t"
  4326. "adc r7, r7, r7\n\t"
  4327. "adds r4, r4, r8\n\t"
  4328. "adcs r2, r2, r9\n\t"
  4329. "adc r3, r3, #0\n\t"
  4330. #endif
  4331. "adds r4, r4, r5\n\t"
  4332. "adcs r2, r2, r6\n\t"
  4333. "adc r3, r3, r7\n\t"
  4334. "str r4, [%[r], #32]\n\t"
  4335. /* A[2] * A[7] */
  4336. "ldr r10, [%[a], #28]\n\t"
  4337. "ldr r12, [%[a], #8]\n\t"
  4338. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4339. "lsl r8, r10, #16\n\t"
  4340. "lsl r5, r12, #16\n\t"
  4341. "lsr r8, r8, #16\n\t"
  4342. "lsr r5, r5, #16\n\t"
  4343. "mul r5, r8, r5\n\t"
  4344. "lsr r9, r12, #16\n\t"
  4345. "mul r8, r9, r8\n\t"
  4346. "lsr r6, r8, #16\n\t"
  4347. "lsl r8, r8, #16\n\t"
  4348. "adds r5, r5, r8\n\t"
  4349. "adc r6, r6, #0\n\t"
  4350. "lsr r8, r10, #16\n\t"
  4351. "mul r9, r8, r9\n\t"
  4352. "add r6, r6, r9\n\t"
  4353. "lsl r9, r12, #16\n\t"
  4354. "lsr r9, r9, #16\n\t"
  4355. "mul r8, r9, r8\n\t"
  4356. "lsr r9, r8, #16\n\t"
  4357. "lsl r8, r8, #16\n\t"
  4358. "adds r5, r5, r8\n\t"
  4359. "adc r6, r6, r9\n\t"
  4360. #else
  4361. "umull r5, r6, r10, r12\n\t"
  4362. #endif
  4363. "mov r4, #0\n\t"
  4364. "mov r7, #0\n\t"
  4365. /* A[3] * A[6] */
  4366. "ldr r10, [%[a], #24]\n\t"
  4367. "ldr r12, [%[a], #12]\n\t"
  4368. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4369. "lsl r8, r10, #16\n\t"
  4370. "lsl r9, r12, #16\n\t"
  4371. "lsr r8, r8, #16\n\t"
  4372. "lsr r9, r9, #16\n\t"
  4373. "mul r9, r8, r9\n\t"
  4374. "adds r5, r5, r9\n\t"
  4375. "adcs r6, r6, #0\n\t"
  4376. "adc r7, r7, #0\n\t"
  4377. "lsr r9, r12, #16\n\t"
  4378. "mul r8, r9, r8\n\t"
  4379. "lsr r9, r8, #16\n\t"
  4380. "lsl r8, r8, #16\n\t"
  4381. "adds r5, r5, r8\n\t"
  4382. "adcs r6, r6, r9\n\t"
  4383. "adc r7, r7, #0\n\t"
  4384. "lsr r8, r10, #16\n\t"
  4385. "lsr r9, r12, #16\n\t"
  4386. "mul r9, r8, r9\n\t"
  4387. "adds r6, r6, r9\n\t"
  4388. "adc r7, r7, #0\n\t"
  4389. "lsl r9, r12, #16\n\t"
  4390. "lsr r9, r9, #16\n\t"
  4391. "mul r8, r9, r8\n\t"
  4392. "lsr r9, r8, #16\n\t"
  4393. "lsl r8, r8, #16\n\t"
  4394. "adds r5, r5, r8\n\t"
  4395. "adcs r6, r6, r9\n\t"
  4396. "adc r7, r7, #0\n\t"
  4397. #else
  4398. "umull r8, r9, r10, r12\n\t"
  4399. "adds r5, r5, r8\n\t"
  4400. "adcs r6, r6, r9\n\t"
  4401. "adc r7, r7, #0\n\t"
  4402. #endif
  4403. /* A[4] * A[5] */
  4404. "ldr r10, [%[a], #20]\n\t"
  4405. "ldr r12, [%[a], #16]\n\t"
  4406. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4407. "lsl r8, r10, #16\n\t"
  4408. "lsl r9, r12, #16\n\t"
  4409. "lsr r8, r8, #16\n\t"
  4410. "lsr r9, r9, #16\n\t"
  4411. "mul r9, r8, r9\n\t"
  4412. "adds r5, r5, r9\n\t"
  4413. "adcs r6, r6, #0\n\t"
  4414. "adc r7, r7, #0\n\t"
  4415. "lsr r9, r12, #16\n\t"
  4416. "mul r8, r9, r8\n\t"
  4417. "lsr r9, r8, #16\n\t"
  4418. "lsl r8, r8, #16\n\t"
  4419. "adds r5, r5, r8\n\t"
  4420. "adcs r6, r6, r9\n\t"
  4421. "adc r7, r7, #0\n\t"
  4422. "lsr r8, r10, #16\n\t"
  4423. "lsr r9, r12, #16\n\t"
  4424. "mul r9, r8, r9\n\t"
  4425. "adds r6, r6, r9\n\t"
  4426. "adc r7, r7, #0\n\t"
  4427. "lsl r9, r12, #16\n\t"
  4428. "lsr r9, r9, #16\n\t"
  4429. "mul r8, r9, r8\n\t"
  4430. "lsr r9, r8, #16\n\t"
  4431. "lsl r8, r8, #16\n\t"
  4432. "adds r5, r5, r8\n\t"
  4433. "adcs r6, r6, r9\n\t"
  4434. "adc r7, r7, #0\n\t"
  4435. #else
  4436. "umull r8, r9, r10, r12\n\t"
  4437. "adds r5, r5, r8\n\t"
  4438. "adcs r6, r6, r9\n\t"
  4439. "adc r7, r7, #0\n\t"
  4440. #endif
  4441. "adds r5, r5, r5\n\t"
  4442. "adcs r6, r6, r6\n\t"
  4443. "adc r7, r7, r7\n\t"
  4444. "adds r2, r2, r5\n\t"
  4445. "adcs r3, r3, r6\n\t"
  4446. "adc r4, r4, r7\n\t"
  4447. "str r2, [%[r], #36]\n\t"
  4448. /* A[3] * A[7] */
  4449. "ldr r10, [%[a], #28]\n\t"
  4450. "ldr r12, [%[a], #12]\n\t"
  4451. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4452. "lsl r8, r10, #16\n\t"
  4453. "lsl r9, r12, #16\n\t"
  4454. "lsr r8, r8, #16\n\t"
  4455. "lsr r9, r9, #16\n\t"
  4456. "mul r9, r8, r9\n\t"
  4457. "adds r3, r3, r9\n\t"
  4458. "adcs r4, r4, #0\n\t"
  4459. "mov r2, #0\n\t"
  4460. "adc r2, r2, #0\n\t"
  4461. "adds r3, r3, r9\n\t"
  4462. "adcs r4, r4, #0\n\t"
  4463. "adc r2, r2, #0\n\t"
  4464. "lsr r9, r12, #16\n\t"
  4465. "mul r8, r9, r8\n\t"
  4466. "lsr r9, r8, #16\n\t"
  4467. "lsl r8, r8, #16\n\t"
  4468. "adds r3, r3, r8\n\t"
  4469. "adcs r4, r4, r9\n\t"
  4470. "adc r2, r2, #0\n\t"
  4471. "adds r3, r3, r8\n\t"
  4472. "adcs r4, r4, r9\n\t"
  4473. "adc r2, r2, #0\n\t"
  4474. "lsr r8, r10, #16\n\t"
  4475. "lsr r9, r12, #16\n\t"
  4476. "mul r9, r8, r9\n\t"
  4477. "adds r4, r4, r9\n\t"
  4478. "adc r2, r2, #0\n\t"
  4479. "adds r4, r4, r9\n\t"
  4480. "adc r2, r2, #0\n\t"
  4481. "lsl r9, r12, #16\n\t"
  4482. "lsr r9, r9, #16\n\t"
  4483. "mul r8, r9, r8\n\t"
  4484. "lsr r9, r8, #16\n\t"
  4485. "lsl r8, r8, #16\n\t"
  4486. "adds r3, r3, r8\n\t"
  4487. "adcs r4, r4, r9\n\t"
  4488. "adc r2, r2, #0\n\t"
  4489. "adds r3, r3, r8\n\t"
  4490. "adcs r4, r4, r9\n\t"
  4491. "adc r2, r2, #0\n\t"
  4492. #else
  4493. "umull r8, r9, r10, r12\n\t"
  4494. "adds r3, r3, r8\n\t"
  4495. "adcs r4, r4, r9\n\t"
  4496. "mov r2, #0\n\t"
  4497. "adc r2, r2, #0\n\t"
  4498. "adds r3, r3, r8\n\t"
  4499. "adcs r4, r4, r9\n\t"
  4500. "mov r2, #0\n\t"
  4501. "adc r2, r2, #0\n\t"
  4502. #endif
  4503. /* A[4] * A[6] */
  4504. "ldr r10, [%[a], #24]\n\t"
  4505. "ldr r12, [%[a], #16]\n\t"
  4506. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4507. "lsl r8, r10, #16\n\t"
  4508. "lsl r9, r12, #16\n\t"
  4509. "lsr r8, r8, #16\n\t"
  4510. "lsr r9, r9, #16\n\t"
  4511. "mul r9, r8, r9\n\t"
  4512. "adds r3, r3, r9\n\t"
  4513. "adcs r4, r4, #0\n\t"
  4514. "adc r2, r2, #0\n\t"
  4515. "adds r3, r3, r9\n\t"
  4516. "adcs r4, r4, #0\n\t"
  4517. "adc r2, r2, #0\n\t"
  4518. "lsr r9, r12, #16\n\t"
  4519. "mul r8, r9, r8\n\t"
  4520. "lsr r9, r8, #16\n\t"
  4521. "lsl r8, r8, #16\n\t"
  4522. "adds r3, r3, r8\n\t"
  4523. "adcs r4, r4, r9\n\t"
  4524. "adc r2, r2, #0\n\t"
  4525. "adds r3, r3, r8\n\t"
  4526. "adcs r4, r4, r9\n\t"
  4527. "adc r2, r2, #0\n\t"
  4528. "lsr r8, r10, #16\n\t"
  4529. "lsr r9, r12, #16\n\t"
  4530. "mul r9, r8, r9\n\t"
  4531. "adds r4, r4, r9\n\t"
  4532. "adc r2, r2, #0\n\t"
  4533. "adds r4, r4, r9\n\t"
  4534. "adc r2, r2, #0\n\t"
  4535. "lsl r9, r12, #16\n\t"
  4536. "lsr r9, r9, #16\n\t"
  4537. "mul r8, r9, r8\n\t"
  4538. "lsr r9, r8, #16\n\t"
  4539. "lsl r8, r8, #16\n\t"
  4540. "adds r3, r3, r8\n\t"
  4541. "adcs r4, r4, r9\n\t"
  4542. "adc r2, r2, #0\n\t"
  4543. "adds r3, r3, r8\n\t"
  4544. "adcs r4, r4, r9\n\t"
  4545. "adc r2, r2, #0\n\t"
  4546. #else
  4547. "umull r8, r9, r10, r12\n\t"
  4548. "adds r3, r3, r8\n\t"
  4549. "adcs r4, r4, r9\n\t"
  4550. "adc r2, r2, #0\n\t"
  4551. "adds r3, r3, r8\n\t"
  4552. "adcs r4, r4, r9\n\t"
  4553. "adc r2, r2, #0\n\t"
  4554. #endif
  4555. /* A[5] * A[5] */
  4556. "ldr r10, [%[a], #20]\n\t"
  4557. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4558. "lsl r8, r10, #16\n\t"
  4559. "lsr r9, r10, #16\n\t"
  4560. "lsr r8, r8, #16\n\t"
  4561. "mov r12, r8\n\t"
  4562. "mul r8, r12, r8\n\t"
  4563. "mov r12, r9\n\t"
  4564. "mul r9, r12, r9\n\t"
  4565. "adds r3, r3, r8\n\t"
  4566. "adcs r4, r4, r9\n\t"
  4567. "adc r2, r2, #0\n\t"
  4568. "lsr r9, r10, #16\n\t"
  4569. "lsl r8, r10, #16\n\t"
  4570. "lsr r8, r8, #16\n\t"
  4571. "mul r8, r9, r8\n\t"
  4572. "lsr r9, r8, #15\n\t"
  4573. "lsl r8, r8, #17\n\t"
  4574. "adds r3, r3, r8\n\t"
  4575. "adcs r4, r4, r9\n\t"
  4576. "adc r2, r2, #0\n\t"
  4577. #else
  4578. "umull r8, r9, r10, r10\n\t"
  4579. "adds r3, r3, r8\n\t"
  4580. "adcs r4, r4, r9\n\t"
  4581. "adc r2, r2, #0\n\t"
  4582. #endif
  4583. "str r3, [%[r], #40]\n\t"
  4584. /* A[4] * A[7] */
  4585. "ldr r10, [%[a], #28]\n\t"
  4586. "ldr r12, [%[a], #16]\n\t"
  4587. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4588. "lsl r8, r10, #16\n\t"
  4589. "lsl r9, r12, #16\n\t"
  4590. "lsr r8, r8, #16\n\t"
  4591. "lsr r9, r9, #16\n\t"
  4592. "mul r9, r8, r9\n\t"
  4593. "adds r4, r4, r9\n\t"
  4594. "adcs r2, r2, #0\n\t"
  4595. "mov r3, #0\n\t"
  4596. "adc r3, r3, #0\n\t"
  4597. "adds r4, r4, r9\n\t"
  4598. "adcs r2, r2, #0\n\t"
  4599. "adc r3, r3, #0\n\t"
  4600. "lsr r9, r12, #16\n\t"
  4601. "mul r8, r9, r8\n\t"
  4602. "lsr r9, r8, #16\n\t"
  4603. "lsl r8, r8, #16\n\t"
  4604. "adds r4, r4, r8\n\t"
  4605. "adcs r2, r2, r9\n\t"
  4606. "adc r3, r3, #0\n\t"
  4607. "adds r4, r4, r8\n\t"
  4608. "adcs r2, r2, r9\n\t"
  4609. "adc r3, r3, #0\n\t"
  4610. "lsr r8, r10, #16\n\t"
  4611. "lsr r9, r12, #16\n\t"
  4612. "mul r9, r8, r9\n\t"
  4613. "adds r2, r2, r9\n\t"
  4614. "adc r3, r3, #0\n\t"
  4615. "adds r2, r2, r9\n\t"
  4616. "adc r3, r3, #0\n\t"
  4617. "lsl r9, r12, #16\n\t"
  4618. "lsr r9, r9, #16\n\t"
  4619. "mul r8, r9, r8\n\t"
  4620. "lsr r9, r8, #16\n\t"
  4621. "lsl r8, r8, #16\n\t"
  4622. "adds r4, r4, r8\n\t"
  4623. "adcs r2, r2, r9\n\t"
  4624. "adc r3, r3, #0\n\t"
  4625. "adds r4, r4, r8\n\t"
  4626. "adcs r2, r2, r9\n\t"
  4627. "adc r3, r3, #0\n\t"
  4628. #else
  4629. "umull r8, r9, r10, r12\n\t"
  4630. "adds r4, r4, r8\n\t"
  4631. "adcs r2, r2, r9\n\t"
  4632. "mov r3, #0\n\t"
  4633. "adc r3, r3, #0\n\t"
  4634. "adds r4, r4, r8\n\t"
  4635. "adcs r2, r2, r9\n\t"
  4636. "mov r3, #0\n\t"
  4637. "adc r3, r3, #0\n\t"
  4638. #endif
  4639. /* A[5] * A[6] */
  4640. "ldr r10, [%[a], #24]\n\t"
  4641. "ldr r12, [%[a], #20]\n\t"
  4642. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4643. "lsl r8, r10, #16\n\t"
  4644. "lsl r9, r12, #16\n\t"
  4645. "lsr r8, r8, #16\n\t"
  4646. "lsr r9, r9, #16\n\t"
  4647. "mul r9, r8, r9\n\t"
  4648. "adds r4, r4, r9\n\t"
  4649. "adcs r2, r2, #0\n\t"
  4650. "adc r3, r3, #0\n\t"
  4651. "adds r4, r4, r9\n\t"
  4652. "adcs r2, r2, #0\n\t"
  4653. "adc r3, r3, #0\n\t"
  4654. "lsr r9, r12, #16\n\t"
  4655. "mul r8, r9, r8\n\t"
  4656. "lsr r9, r8, #16\n\t"
  4657. "lsl r8, r8, #16\n\t"
  4658. "adds r4, r4, r8\n\t"
  4659. "adcs r2, r2, r9\n\t"
  4660. "adc r3, r3, #0\n\t"
  4661. "adds r4, r4, r8\n\t"
  4662. "adcs r2, r2, r9\n\t"
  4663. "adc r3, r3, #0\n\t"
  4664. "lsr r8, r10, #16\n\t"
  4665. "lsr r9, r12, #16\n\t"
  4666. "mul r9, r8, r9\n\t"
  4667. "adds r2, r2, r9\n\t"
  4668. "adc r3, r3, #0\n\t"
  4669. "adds r2, r2, r9\n\t"
  4670. "adc r3, r3, #0\n\t"
  4671. "lsl r9, r12, #16\n\t"
  4672. "lsr r9, r9, #16\n\t"
  4673. "mul r8, r9, r8\n\t"
  4674. "lsr r9, r8, #16\n\t"
  4675. "lsl r8, r8, #16\n\t"
  4676. "adds r4, r4, r8\n\t"
  4677. "adcs r2, r2, r9\n\t"
  4678. "adc r3, r3, #0\n\t"
  4679. "adds r4, r4, r8\n\t"
  4680. "adcs r2, r2, r9\n\t"
  4681. "adc r3, r3, #0\n\t"
  4682. #else
  4683. "umull r8, r9, r10, r12\n\t"
  4684. "adds r4, r4, r8\n\t"
  4685. "adcs r2, r2, r9\n\t"
  4686. "adc r3, r3, #0\n\t"
  4687. "adds r4, r4, r8\n\t"
  4688. "adcs r2, r2, r9\n\t"
  4689. "adc r3, r3, #0\n\t"
  4690. #endif
  4691. "str r4, [%[r], #44]\n\t"
  4692. /* A[5] * A[7] */
  4693. "ldr r10, [%[a], #28]\n\t"
  4694. "ldr r12, [%[a], #20]\n\t"
  4695. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4696. "lsl r8, r10, #16\n\t"
  4697. "lsl r9, r12, #16\n\t"
  4698. "lsr r8, r8, #16\n\t"
  4699. "lsr r9, r9, #16\n\t"
  4700. "mul r9, r8, r9\n\t"
  4701. "adds r2, r2, r9\n\t"
  4702. "adcs r3, r3, #0\n\t"
  4703. "mov r4, #0\n\t"
  4704. "adc r4, r4, #0\n\t"
  4705. "adds r2, r2, r9\n\t"
  4706. "adcs r3, r3, #0\n\t"
  4707. "adc r4, r4, #0\n\t"
  4708. "lsr r9, r12, #16\n\t"
  4709. "mul r8, r9, r8\n\t"
  4710. "lsr r9, r8, #16\n\t"
  4711. "lsl r8, r8, #16\n\t"
  4712. "adds r2, r2, r8\n\t"
  4713. "adcs r3, r3, r9\n\t"
  4714. "adc r4, r4, #0\n\t"
  4715. "adds r2, r2, r8\n\t"
  4716. "adcs r3, r3, r9\n\t"
  4717. "adc r4, r4, #0\n\t"
  4718. "lsr r8, r10, #16\n\t"
  4719. "lsr r9, r12, #16\n\t"
  4720. "mul r9, r8, r9\n\t"
  4721. "adds r3, r3, r9\n\t"
  4722. "adc r4, r4, #0\n\t"
  4723. "adds r3, r3, r9\n\t"
  4724. "adc r4, r4, #0\n\t"
  4725. "lsl r9, r12, #16\n\t"
  4726. "lsr r9, r9, #16\n\t"
  4727. "mul r8, r9, r8\n\t"
  4728. "lsr r9, r8, #16\n\t"
  4729. "lsl r8, r8, #16\n\t"
  4730. "adds r2, r2, r8\n\t"
  4731. "adcs r3, r3, r9\n\t"
  4732. "adc r4, r4, #0\n\t"
  4733. "adds r2, r2, r8\n\t"
  4734. "adcs r3, r3, r9\n\t"
  4735. "adc r4, r4, #0\n\t"
  4736. #else
  4737. "umull r8, r9, r10, r12\n\t"
  4738. "adds r2, r2, r8\n\t"
  4739. "adcs r3, r3, r9\n\t"
  4740. "mov r4, #0\n\t"
  4741. "adc r4, r4, #0\n\t"
  4742. "adds r2, r2, r8\n\t"
  4743. "adcs r3, r3, r9\n\t"
  4744. "mov r4, #0\n\t"
  4745. "adc r4, r4, #0\n\t"
  4746. #endif
  4747. /* A[6] * A[6] */
  4748. "ldr r10, [%[a], #24]\n\t"
  4749. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4750. "lsl r8, r10, #16\n\t"
  4751. "lsr r9, r10, #16\n\t"
  4752. "lsr r8, r8, #16\n\t"
  4753. "mov r12, r8\n\t"
  4754. "mul r8, r12, r8\n\t"
  4755. "mov r12, r9\n\t"
  4756. "mul r9, r12, r9\n\t"
  4757. "adds r2, r2, r8\n\t"
  4758. "adcs r3, r3, r9\n\t"
  4759. "adc r4, r4, #0\n\t"
  4760. "lsr r9, r10, #16\n\t"
  4761. "lsl r8, r10, #16\n\t"
  4762. "lsr r8, r8, #16\n\t"
  4763. "mul r8, r9, r8\n\t"
  4764. "lsr r9, r8, #15\n\t"
  4765. "lsl r8, r8, #17\n\t"
  4766. "adds r2, r2, r8\n\t"
  4767. "adcs r3, r3, r9\n\t"
  4768. "adc r4, r4, #0\n\t"
  4769. #else
  4770. "umull r8, r9, r10, r10\n\t"
  4771. "adds r2, r2, r8\n\t"
  4772. "adcs r3, r3, r9\n\t"
  4773. "adc r4, r4, #0\n\t"
  4774. #endif
  4775. "str r2, [%[r], #48]\n\t"
  4776. /* A[6] * A[7] */
  4777. "ldr r10, [%[a], #28]\n\t"
  4778. "ldr r12, [%[a], #24]\n\t"
  4779. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4780. "lsl r8, r10, #16\n\t"
  4781. "lsl r9, r12, #16\n\t"
  4782. "lsr r8, r8, #16\n\t"
  4783. "lsr r9, r9, #16\n\t"
  4784. "mul r9, r8, r9\n\t"
  4785. "adds r3, r3, r9\n\t"
  4786. "adcs r4, r4, #0\n\t"
  4787. "mov r2, #0\n\t"
  4788. "adc r2, r2, #0\n\t"
  4789. "adds r3, r3, r9\n\t"
  4790. "adcs r4, r4, #0\n\t"
  4791. "adc r2, r2, #0\n\t"
  4792. "lsr r9, r12, #16\n\t"
  4793. "mul r8, r9, r8\n\t"
  4794. "lsr r9, r8, #16\n\t"
  4795. "lsl r8, r8, #16\n\t"
  4796. "adds r3, r3, r8\n\t"
  4797. "adcs r4, r4, r9\n\t"
  4798. "adc r2, r2, #0\n\t"
  4799. "adds r3, r3, r8\n\t"
  4800. "adcs r4, r4, r9\n\t"
  4801. "adc r2, r2, #0\n\t"
  4802. "lsr r8, r10, #16\n\t"
  4803. "lsr r9, r12, #16\n\t"
  4804. "mul r9, r8, r9\n\t"
  4805. "adds r4, r4, r9\n\t"
  4806. "adc r2, r2, #0\n\t"
  4807. "adds r4, r4, r9\n\t"
  4808. "adc r2, r2, #0\n\t"
  4809. "lsl r9, r12, #16\n\t"
  4810. "lsr r9, r9, #16\n\t"
  4811. "mul r8, r9, r8\n\t"
  4812. "lsr r9, r8, #16\n\t"
  4813. "lsl r8, r8, #16\n\t"
  4814. "adds r3, r3, r8\n\t"
  4815. "adcs r4, r4, r9\n\t"
  4816. "adc r2, r2, #0\n\t"
  4817. "adds r3, r3, r8\n\t"
  4818. "adcs r4, r4, r9\n\t"
  4819. "adc r2, r2, #0\n\t"
  4820. #else
  4821. "umull r8, r9, r10, r12\n\t"
  4822. "adds r3, r3, r8\n\t"
  4823. "adcs r4, r4, r9\n\t"
  4824. "mov r2, #0\n\t"
  4825. "adc r2, r2, #0\n\t"
  4826. "adds r3, r3, r8\n\t"
  4827. "adcs r4, r4, r9\n\t"
  4828. "mov r2, #0\n\t"
  4829. "adc r2, r2, #0\n\t"
  4830. #endif
  4831. "str r3, [%[r], #52]\n\t"
  4832. /* A[7] * A[7] */
  4833. "ldr r10, [%[a], #28]\n\t"
  4834. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  4835. "lsl r8, r10, #16\n\t"
  4836. "lsr r9, r10, #16\n\t"
  4837. "lsr r8, r8, #16\n\t"
  4838. "mov r12, r8\n\t"
  4839. "mul r8, r12, r8\n\t"
  4840. "mov r12, r9\n\t"
  4841. "mul r9, r12, r9\n\t"
  4842. "adds r4, r4, r8\n\t"
  4843. "adc r2, r2, r9\n\t"
  4844. "lsr r9, r10, #16\n\t"
  4845. "lsl r8, r10, #16\n\t"
  4846. "lsr r8, r8, #16\n\t"
  4847. "mul r8, r9, r8\n\t"
  4848. "lsr r9, r8, #15\n\t"
  4849. "lsl r8, r8, #17\n\t"
  4850. "adds r4, r4, r8\n\t"
  4851. "adc r2, r2, r9\n\t"
  4852. #else
  4853. "umull r8, r9, r10, r10\n\t"
  4854. "adds r4, r4, r8\n\t"
  4855. "adc r2, r2, r9\n\t"
  4856. #endif
  4857. "str r4, [%[r], #56]\n\t"
  4858. "str r2, [%[r], #60]\n\t"
  4859. "ldm sp!, {r2, r3, r4, r8}\n\t"
  4860. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  4861. "ldm sp!, {r2, r3, r4, r8}\n\t"
  4862. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  4863. : [r] "+r" (r), [a] "+r" (a)
  4864. :
  4865. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  4866. );
  4867. }
  4868. /* Sub b from a into r. (r = a - b)
  4869. *
  4870. * r A single precision integer.
  4871. * a A single precision integer.
  4872. * b A single precision integer.
  4873. */
  4874. static sp_digit sp_2048_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  4875. {
  4876. register sp_digit* r asm ("r0") = r_p;
  4877. register const sp_digit* a asm ("r1") = a_p;
  4878. register const sp_digit* b asm ("r2") = b_p;
  4879. __asm__ __volatile__ (
  4880. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  4881. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  4882. "subs r3, r3, r7\n\t"
  4883. "sbcs r4, r4, r8\n\t"
  4884. "sbcs r5, r5, r9\n\t"
  4885. "sbcs r6, r6, r10\n\t"
  4886. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  4887. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  4888. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  4889. "sbcs r3, r3, r7\n\t"
  4890. "sbcs r4, r4, r8\n\t"
  4891. "sbcs r5, r5, r9\n\t"
  4892. "sbcs r6, r6, r10\n\t"
  4893. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  4894. "sbc %[r], r6, r6\n\t"
  4895. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  4896. :
  4897. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  4898. );
  4899. return (uint32_t)(size_t)r;
  4900. }
  4901. /* Square a and put result in r. (r = a * a)
  4902. *
  4903. * r A single precision integer.
  4904. * a A single precision integer.
  4905. */
  4906. SP_NOINLINE static void sp_2048_sqr_16(sp_digit* r, const sp_digit* a)
  4907. {
  4908. sp_digit* z0 = r;
  4909. sp_digit* z2 = r + 16;
  4910. sp_digit z1[16];
  4911. sp_digit* a1 = z1;
  4912. sp_digit zero[8];
  4913. sp_digit u;
  4914. sp_digit mask;
  4915. sp_digit* p1;
  4916. sp_digit* p2;
  4917. XMEMSET(zero, 0, sizeof(sp_digit) * 8);
  4918. mask = sp_2048_sub_8(a1, a, &a[8]);
  4919. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  4920. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  4921. (void)sp_2048_sub_8(a1, p1, p2);
  4922. sp_2048_sqr_8(z2, &a[8]);
  4923. sp_2048_sqr_8(z0, a);
  4924. sp_2048_sqr_8(z1, a1);
  4925. u = 0;
  4926. u -= sp_2048_sub_in_place_16(z1, z2);
  4927. u -= sp_2048_sub_in_place_16(z1, z0);
  4928. u += sp_2048_sub_in_place_16(r + 8, z1);
  4929. zero[0] = u;
  4930. (void)sp_2048_add_8(r + 24, r + 24, zero);
  4931. }
  4932. /* Sub b from a into r. (r = a - b)
  4933. *
  4934. * r A single precision integer.
  4935. * a A single precision integer.
  4936. * b A single precision integer.
  4937. */
  4938. static sp_digit sp_2048_sub_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  4939. {
  4940. register sp_digit* r asm ("r0") = r_p;
  4941. register const sp_digit* a asm ("r1") = a_p;
  4942. register const sp_digit* b asm ("r2") = b_p;
  4943. __asm__ __volatile__ (
  4944. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  4945. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  4946. "subs r3, r3, r7\n\t"
  4947. "sbcs r4, r4, r8\n\t"
  4948. "sbcs r5, r5, r9\n\t"
  4949. "sbcs r6, r6, r10\n\t"
  4950. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  4951. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  4952. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  4953. "sbcs r3, r3, r7\n\t"
  4954. "sbcs r4, r4, r8\n\t"
  4955. "sbcs r5, r5, r9\n\t"
  4956. "sbcs r6, r6, r10\n\t"
  4957. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  4958. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  4959. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  4960. "sbcs r3, r3, r7\n\t"
  4961. "sbcs r4, r4, r8\n\t"
  4962. "sbcs r5, r5, r9\n\t"
  4963. "sbcs r6, r6, r10\n\t"
  4964. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  4965. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  4966. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  4967. "sbcs r3, r3, r7\n\t"
  4968. "sbcs r4, r4, r8\n\t"
  4969. "sbcs r5, r5, r9\n\t"
  4970. "sbcs r6, r6, r10\n\t"
  4971. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  4972. "sbc %[r], r6, r6\n\t"
  4973. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  4974. :
  4975. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  4976. );
  4977. return (uint32_t)(size_t)r;
  4978. }
  4979. /* Square a and put result in r. (r = a * a)
  4980. *
  4981. * r A single precision integer.
  4982. * a A single precision integer.
  4983. */
  4984. SP_NOINLINE static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
  4985. {
  4986. sp_digit* z0 = r;
  4987. sp_digit* z2 = r + 32;
  4988. sp_digit z1[32];
  4989. sp_digit* a1 = z1;
  4990. sp_digit zero[16];
  4991. sp_digit u;
  4992. sp_digit mask;
  4993. sp_digit* p1;
  4994. sp_digit* p2;
  4995. XMEMSET(zero, 0, sizeof(sp_digit) * 16);
  4996. mask = sp_2048_sub_16(a1, a, &a[16]);
  4997. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  4998. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  4999. (void)sp_2048_sub_16(a1, p1, p2);
  5000. sp_2048_sqr_16(z2, &a[16]);
  5001. sp_2048_sqr_16(z0, a);
  5002. sp_2048_sqr_16(z1, a1);
  5003. u = 0;
  5004. u -= sp_2048_sub_in_place_32(z1, z2);
  5005. u -= sp_2048_sub_in_place_32(z1, z0);
  5006. u += sp_2048_sub_in_place_32(r + 16, z1);
  5007. zero[0] = u;
  5008. (void)sp_2048_add_16(r + 48, r + 48, zero);
  5009. }
  5010. /* Sub b from a into r. (r = a - b)
  5011. *
  5012. * r A single precision integer.
  5013. * a A single precision integer.
  5014. * b A single precision integer.
  5015. */
  5016. static sp_digit sp_2048_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  5017. {
  5018. register sp_digit* r asm ("r0") = r_p;
  5019. register const sp_digit* a asm ("r1") = a_p;
  5020. register const sp_digit* b asm ("r2") = b_p;
  5021. __asm__ __volatile__ (
  5022. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5023. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5024. "subs r3, r3, r7\n\t"
  5025. "sbcs r4, r4, r8\n\t"
  5026. "sbcs r5, r5, r9\n\t"
  5027. "sbcs r6, r6, r10\n\t"
  5028. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5029. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5030. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5031. "sbcs r3, r3, r7\n\t"
  5032. "sbcs r4, r4, r8\n\t"
  5033. "sbcs r5, r5, r9\n\t"
  5034. "sbcs r6, r6, r10\n\t"
  5035. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5036. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5037. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5038. "sbcs r3, r3, r7\n\t"
  5039. "sbcs r4, r4, r8\n\t"
  5040. "sbcs r5, r5, r9\n\t"
  5041. "sbcs r6, r6, r10\n\t"
  5042. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5043. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5044. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5045. "sbcs r3, r3, r7\n\t"
  5046. "sbcs r4, r4, r8\n\t"
  5047. "sbcs r5, r5, r9\n\t"
  5048. "sbcs r6, r6, r10\n\t"
  5049. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5050. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5051. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5052. "sbcs r3, r3, r7\n\t"
  5053. "sbcs r4, r4, r8\n\t"
  5054. "sbcs r5, r5, r9\n\t"
  5055. "sbcs r6, r6, r10\n\t"
  5056. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5057. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5058. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5059. "sbcs r3, r3, r7\n\t"
  5060. "sbcs r4, r4, r8\n\t"
  5061. "sbcs r5, r5, r9\n\t"
  5062. "sbcs r6, r6, r10\n\t"
  5063. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5064. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5065. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5066. "sbcs r3, r3, r7\n\t"
  5067. "sbcs r4, r4, r8\n\t"
  5068. "sbcs r5, r5, r9\n\t"
  5069. "sbcs r6, r6, r10\n\t"
  5070. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5071. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  5072. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  5073. "sbcs r3, r3, r7\n\t"
  5074. "sbcs r4, r4, r8\n\t"
  5075. "sbcs r5, r5, r9\n\t"
  5076. "sbcs r6, r6, r10\n\t"
  5077. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  5078. "sbc %[r], r6, r6\n\t"
  5079. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  5080. :
  5081. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  5082. );
  5083. return (uint32_t)(size_t)r;
  5084. }
  5085. /* Square a and put result in r. (r = a * a)
  5086. *
  5087. * r A single precision integer.
  5088. * a A single precision integer.
  5089. */
  5090. SP_NOINLINE static void sp_2048_sqr_64(sp_digit* r, const sp_digit* a)
  5091. {
  5092. sp_digit* z0 = r;
  5093. sp_digit* z2 = r + 64;
  5094. sp_digit z1[64];
  5095. sp_digit* a1 = z1;
  5096. sp_digit zero[32];
  5097. sp_digit u;
  5098. sp_digit mask;
  5099. sp_digit* p1;
  5100. sp_digit* p2;
  5101. XMEMSET(zero, 0, sizeof(sp_digit) * 32);
  5102. mask = sp_2048_sub_32(a1, a, &a[32]);
  5103. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  5104. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  5105. (void)sp_2048_sub_32(a1, p1, p2);
  5106. sp_2048_sqr_32(z2, &a[32]);
  5107. sp_2048_sqr_32(z0, a);
  5108. sp_2048_sqr_32(z1, a1);
  5109. u = 0;
  5110. u -= sp_2048_sub_in_place_64(z1, z2);
  5111. u -= sp_2048_sub_in_place_64(z1, z0);
  5112. u += sp_2048_sub_in_place_64(r + 32, z1);
  5113. zero[0] = u;
  5114. (void)sp_2048_add_32(r + 96, r + 96, zero);
  5115. }
  5116. #endif /* !WOLFSSL_SP_SMALL */
  5117. #ifdef WOLFSSL_SP_SMALL
  5118. /* Add b to a into r. (r = a + b)
  5119. *
  5120. * r A single precision integer.
  5121. * a A single precision integer.
  5122. * b A single precision integer.
  5123. */
  5124. static sp_digit sp_2048_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  5125. {
  5126. register sp_digit* r asm ("r0") = r_p;
  5127. register const sp_digit* a asm ("r1") = a_p;
  5128. register const sp_digit* b asm ("r2") = b_p;
  5129. __asm__ __volatile__ (
  5130. "mov r3, #0\n\t"
  5131. "add r12, %[a], #0x100\n\t"
  5132. "\n"
  5133. "L_sp_2048_add_64_word_%=: \n\t"
  5134. "adds r3, r3, #-1\n\t"
  5135. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  5136. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  5137. "adcs r4, r4, r8\n\t"
  5138. "adcs r5, r5, r9\n\t"
  5139. "adcs r6, r6, r10\n\t"
  5140. "adcs r7, r7, r11\n\t"
  5141. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  5142. "mov r4, #0\n\t"
  5143. "adc r3, r4, #0\n\t"
  5144. "cmp %[a], r12\n\t"
  5145. "bne L_sp_2048_add_64_word_%=\n\t"
  5146. "mov %[r], r3\n\t"
  5147. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  5148. :
  5149. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  5150. );
  5151. return (uint32_t)(size_t)r;
  5152. }
  5153. #endif /* WOLFSSL_SP_SMALL */
  5154. #ifdef WOLFSSL_SP_SMALL
  5155. /* Sub b from a into a. (a -= b)
  5156. *
  5157. * a A single precision integer.
  5158. * b A single precision integer.
  5159. */
  5160. static sp_digit sp_2048_sub_in_place_64(sp_digit* a_p, const sp_digit* b_p)
  5161. {
  5162. register sp_digit* a asm ("r0") = a_p;
  5163. register const sp_digit* b asm ("r1") = b_p;
  5164. __asm__ __volatile__ (
  5165. "mov r10, #0\n\t"
  5166. "mov r12, #0\n\t"
  5167. "add lr, %[a], #0x100\n\t"
  5168. "\n"
  5169. "L_sp_2048_sub_in_pkace_64_word_%=: \n\t"
  5170. "subs r12, r10, r12\n\t"
  5171. "ldm %[a], {r2, r3, r4, r5}\n\t"
  5172. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  5173. "sbcs r2, r2, r6\n\t"
  5174. "sbcs r3, r3, r7\n\t"
  5175. "sbcs r4, r4, r8\n\t"
  5176. "sbcs r5, r5, r9\n\t"
  5177. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  5178. "sbc r12, r10, r10\n\t"
  5179. "cmp %[a], lr\n\t"
  5180. "bne L_sp_2048_sub_in_pkace_64_word_%=\n\t"
  5181. "mov %[a], r12\n\t"
  5182. : [a] "+r" (a), [b] "+r" (b)
  5183. :
  5184. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10"
  5185. );
  5186. return (uint32_t)(size_t)a;
  5187. }
  5188. #endif /* WOLFSSL_SP_SMALL */
  5189. #ifdef WOLFSSL_SP_SMALL
  5190. /* Multiply a and b into r. (r = a * b)
  5191. *
  5192. * r A single precision integer.
  5193. * a A single precision integer.
  5194. * b A single precision integer.
  5195. */
  5196. static void sp_2048_mul_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  5197. {
  5198. register sp_digit* r asm ("r0") = r_p;
  5199. register const sp_digit* a asm ("r1") = a_p;
  5200. register const sp_digit* b asm ("r2") = b_p;
  5201. __asm__ __volatile__ (
  5202. "sub sp, sp, #0x200\n\t"
  5203. "mov r5, #0\n\t"
  5204. "mov r6, #0\n\t"
  5205. "mov r7, #0\n\t"
  5206. "mov r8, #0\n\t"
  5207. "\n"
  5208. "L_sp_2048_mul_64_outer_%=: \n\t"
  5209. "subs r3, r5, #0xfc\n\t"
  5210. "it cc\n\t"
  5211. "movcc r3, #0\n\t"
  5212. "sub r4, r5, r3\n\t"
  5213. "\n"
  5214. "L_sp_2048_mul_64_inner_%=: \n\t"
  5215. "ldr lr, [%[a], r3]\n\t"
  5216. "ldr r11, [%[b], r4]\n\t"
  5217. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  5218. "lsl r9, lr, #16\n\t"
  5219. "lsl r10, r11, #16\n\t"
  5220. "lsr r9, r9, #16\n\t"
  5221. "lsr r10, r10, #16\n\t"
  5222. "mul r10, r9, r10\n\t"
  5223. "adds r6, r6, r10\n\t"
  5224. "adcs r7, r7, #0\n\t"
  5225. "adc r8, r8, #0\n\t"
  5226. "lsr r10, r11, #16\n\t"
  5227. "mul r9, r10, r9\n\t"
  5228. "lsr r10, r9, #16\n\t"
  5229. "lsl r9, r9, #16\n\t"
  5230. "adds r6, r6, r9\n\t"
  5231. "adcs r7, r7, r10\n\t"
  5232. "adc r8, r8, #0\n\t"
  5233. "lsr r9, lr, #16\n\t"
  5234. "lsr r10, r11, #16\n\t"
  5235. "mul r10, r9, r10\n\t"
  5236. "adds r7, r7, r10\n\t"
  5237. "adc r8, r8, #0\n\t"
  5238. "lsl r10, r11, #16\n\t"
  5239. "lsr r10, r10, #16\n\t"
  5240. "mul r9, r10, r9\n\t"
  5241. "lsr r10, r9, #16\n\t"
  5242. "lsl r9, r9, #16\n\t"
  5243. "adds r6, r6, r9\n\t"
  5244. "adcs r7, r7, r10\n\t"
  5245. "adc r8, r8, #0\n\t"
  5246. #else
  5247. "umull r9, r10, lr, r11\n\t"
  5248. "adds r6, r6, r9\n\t"
  5249. "adcs r7, r7, r10\n\t"
  5250. "adc r8, r8, #0\n\t"
  5251. #endif
  5252. "add r3, r3, #4\n\t"
  5253. "sub r4, r4, #4\n\t"
  5254. "cmp r3, #0x100\n\t"
  5255. "beq L_sp_2048_mul_64_inner_done_%=\n\t"
  5256. "cmp r3, r5\n\t"
  5257. "ble L_sp_2048_mul_64_inner_%=\n\t"
  5258. "\n"
  5259. "L_sp_2048_mul_64_inner_done_%=: \n\t"
  5260. "str r6, [sp, r5]\n\t"
  5261. "mov r6, r7\n\t"
  5262. "mov r7, r8\n\t"
  5263. "mov r8, #0\n\t"
  5264. "add r5, r5, #4\n\t"
  5265. "cmp r5, #0x1f8\n\t"
  5266. "ble L_sp_2048_mul_64_outer_%=\n\t"
  5267. "str r6, [sp, r5]\n\t"
  5268. "\n"
  5269. "L_sp_2048_mul_64_store_%=: \n\t"
  5270. "ldm sp!, {r6, r7, r8, r9}\n\t"
  5271. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  5272. "subs r5, r5, #16\n\t"
  5273. "bgt L_sp_2048_mul_64_store_%=\n\t"
  5274. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  5275. :
  5276. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11"
  5277. );
  5278. }
  5279. /* Square a and put result in r. (r = a * a)
  5280. *
  5281. * r A single precision integer.
  5282. * a A single precision integer.
  5283. */
  5284. static void sp_2048_sqr_64(sp_digit* r_p, const sp_digit* a_p)
  5285. {
  5286. register sp_digit* r asm ("r0") = r_p;
  5287. register const sp_digit* a asm ("r1") = a_p;
  5288. __asm__ __volatile__ (
  5289. "sub sp, sp, #0x200\n\t"
  5290. "mov r12, #0\n\t"
  5291. "mov r6, #0\n\t"
  5292. "mov r7, #0\n\t"
  5293. "mov r8, #0\n\t"
  5294. "mov r5, #0\n\t"
  5295. "\n"
  5296. "L_sp_2048_sqr_64_outer_%=: \n\t"
  5297. "subs r3, r5, #0xfc\n\t"
  5298. "it cc\n\t"
  5299. "movcc r3, r12\n\t"
  5300. "sub r4, r5, r3\n\t"
  5301. "\n"
  5302. "L_sp_2048_sqr_64_inner_%=: \n\t"
  5303. "cmp r4, r3\n\t"
  5304. "beq L_sp_2048_sqr_64_op_sqr_%=\n\t"
  5305. "ldr lr, [%[a], r3]\n\t"
  5306. "ldr r11, [%[a], r4]\n\t"
  5307. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  5308. "lsl r9, lr, #16\n\t"
  5309. "lsl r10, r11, #16\n\t"
  5310. "lsr r9, r9, #16\n\t"
  5311. "lsr r10, r10, #16\n\t"
  5312. "mul r10, r9, r10\n\t"
  5313. "adds r6, r6, r10\n\t"
  5314. "adcs r7, r7, #0\n\t"
  5315. "adc r8, r8, #0\n\t"
  5316. "adds r6, r6, r10\n\t"
  5317. "adcs r7, r7, #0\n\t"
  5318. "adc r8, r8, #0\n\t"
  5319. "lsr r10, r11, #16\n\t"
  5320. "mul r9, r10, r9\n\t"
  5321. "lsr r10, r9, #16\n\t"
  5322. "lsl r9, r9, #16\n\t"
  5323. "adds r6, r6, r9\n\t"
  5324. "adcs r7, r7, r10\n\t"
  5325. "adc r8, r8, #0\n\t"
  5326. "adds r6, r6, r9\n\t"
  5327. "adcs r7, r7, r10\n\t"
  5328. "adc r8, r8, #0\n\t"
  5329. "lsr r9, lr, #16\n\t"
  5330. "lsr r10, r11, #16\n\t"
  5331. "mul r10, r9, r10\n\t"
  5332. "adds r7, r7, r10\n\t"
  5333. "adc r8, r8, #0\n\t"
  5334. "adds r7, r7, r10\n\t"
  5335. "adc r8, r8, #0\n\t"
  5336. "lsl r10, r11, #16\n\t"
  5337. "lsr r10, r10, #16\n\t"
  5338. "mul r9, r10, r9\n\t"
  5339. "lsr r10, r9, #16\n\t"
  5340. "lsl r9, r9, #16\n\t"
  5341. "adds r6, r6, r9\n\t"
  5342. "adcs r7, r7, r10\n\t"
  5343. "adc r8, r8, #0\n\t"
  5344. "adds r6, r6, r9\n\t"
  5345. "adcs r7, r7, r10\n\t"
  5346. "adc r8, r8, #0\n\t"
  5347. #else
  5348. "umull r9, r10, lr, r11\n\t"
  5349. "adds r6, r6, r9\n\t"
  5350. "adcs r7, r7, r10\n\t"
  5351. "adc r8, r8, #0\n\t"
  5352. "adds r6, r6, r9\n\t"
  5353. "adcs r7, r7, r10\n\t"
  5354. "adc r8, r8, #0\n\t"
  5355. #endif
  5356. "bal L_sp_2048_sqr_64_op_done_%=\n\t"
  5357. "\n"
  5358. "L_sp_2048_sqr_64_op_sqr_%=: \n\t"
  5359. "ldr lr, [%[a], r3]\n\t"
  5360. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  5361. "lsl r9, lr, #16\n\t"
  5362. "lsr r10, lr, #16\n\t"
  5363. "lsr r9, r9, #16\n\t"
  5364. "mov r11, r9\n\t"
  5365. "mul r9, r11, r9\n\t"
  5366. "mov r11, r10\n\t"
  5367. "mul r10, r11, r10\n\t"
  5368. "adds r6, r6, r9\n\t"
  5369. "adcs r7, r7, r10\n\t"
  5370. "adc r8, r8, #0\n\t"
  5371. "lsr r10, lr, #16\n\t"
  5372. "lsl r9, lr, #16\n\t"
  5373. "lsr r9, r9, #16\n\t"
  5374. "mul r9, r10, r9\n\t"
  5375. "lsr r10, r9, #15\n\t"
  5376. "lsl r9, r9, #17\n\t"
  5377. "adds r6, r6, r9\n\t"
  5378. "adcs r7, r7, r10\n\t"
  5379. "adc r8, r8, #0\n\t"
  5380. #else
  5381. "umull r9, r10, lr, lr\n\t"
  5382. "adds r6, r6, r9\n\t"
  5383. "adcs r7, r7, r10\n\t"
  5384. "adc r8, r8, #0\n\t"
  5385. #endif
  5386. "\n"
  5387. "L_sp_2048_sqr_64_op_done_%=: \n\t"
  5388. "add r3, r3, #4\n\t"
  5389. "sub r4, r4, #4\n\t"
  5390. "cmp r3, #0x100\n\t"
  5391. "beq L_sp_2048_sqr_64_inner_done_%=\n\t"
  5392. "cmp r3, r4\n\t"
  5393. "bgt L_sp_2048_sqr_64_inner_done_%=\n\t"
  5394. "cmp r3, r5\n\t"
  5395. "ble L_sp_2048_sqr_64_inner_%=\n\t"
  5396. "\n"
  5397. "L_sp_2048_sqr_64_inner_done_%=: \n\t"
  5398. "str r6, [sp, r5]\n\t"
  5399. "mov r6, r7\n\t"
  5400. "mov r7, r8\n\t"
  5401. "mov r8, #0\n\t"
  5402. "add r5, r5, #4\n\t"
  5403. "cmp r5, #0x1f8\n\t"
  5404. "ble L_sp_2048_sqr_64_outer_%=\n\t"
  5405. "str r6, [sp, r5]\n\t"
  5406. "\n"
  5407. "L_sp_2048_sqr_64_store_%=: \n\t"
  5408. "ldm sp!, {r6, r7, r8, r9}\n\t"
  5409. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  5410. "subs r5, r5, #16\n\t"
  5411. "bgt L_sp_2048_sqr_64_store_%=\n\t"
  5412. : [r] "+r" (r), [a] "+r" (a)
  5413. :
  5414. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12"
  5415. );
  5416. }
  5417. #endif /* WOLFSSL_SP_SMALL */
  5418. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  5419. #ifdef WOLFSSL_SP_SMALL
  5420. /* AND m into each word of a and store in r.
  5421. *
  5422. * r A single precision integer.
  5423. * a A single precision integer.
  5424. * m Mask to AND against each digit.
  5425. */
  5426. static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  5427. {
  5428. int i;
  5429. for (i=0; i<32; i++) {
  5430. r[i] = a[i] & m;
  5431. }
  5432. }
  5433. #endif /* WOLFSSL_SP_SMALL */
  5434. #ifdef WOLFSSL_SP_SMALL
  5435. /* Add b to a into r. (r = a + b)
  5436. *
  5437. * r A single precision integer.
  5438. * a A single precision integer.
  5439. * b A single precision integer.
  5440. */
  5441. static sp_digit sp_2048_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  5442. {
  5443. register sp_digit* r asm ("r0") = r_p;
  5444. register const sp_digit* a asm ("r1") = a_p;
  5445. register const sp_digit* b asm ("r2") = b_p;
  5446. __asm__ __volatile__ (
  5447. "mov r3, #0\n\t"
  5448. "add r12, %[a], #0x80\n\t"
  5449. "\n"
  5450. "L_sp_2048_add_32_word_%=: \n\t"
  5451. "adds r3, r3, #-1\n\t"
  5452. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  5453. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  5454. "adcs r4, r4, r8\n\t"
  5455. "adcs r5, r5, r9\n\t"
  5456. "adcs r6, r6, r10\n\t"
  5457. "adcs r7, r7, r11\n\t"
  5458. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  5459. "mov r4, #0\n\t"
  5460. "adc r3, r4, #0\n\t"
  5461. "cmp %[a], r12\n\t"
  5462. "bne L_sp_2048_add_32_word_%=\n\t"
  5463. "mov %[r], r3\n\t"
  5464. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  5465. :
  5466. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  5467. );
  5468. return (uint32_t)(size_t)r;
  5469. }
  5470. #endif /* WOLFSSL_SP_SMALL */
  5471. #ifdef WOLFSSL_SP_SMALL
  5472. /* Sub b from a into a. (a -= b)
  5473. *
  5474. * a A single precision integer.
  5475. * b A single precision integer.
  5476. */
  5477. static sp_digit sp_2048_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p)
  5478. {
  5479. register sp_digit* a asm ("r0") = a_p;
  5480. register const sp_digit* b asm ("r1") = b_p;
  5481. __asm__ __volatile__ (
  5482. "mov r10, #0\n\t"
  5483. "mov r12, #0\n\t"
  5484. "add lr, %[a], #0x80\n\t"
  5485. "\n"
  5486. "L_sp_2048_sub_in_pkace_32_word_%=: \n\t"
  5487. "subs r12, r10, r12\n\t"
  5488. "ldm %[a], {r2, r3, r4, r5}\n\t"
  5489. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  5490. "sbcs r2, r2, r6\n\t"
  5491. "sbcs r3, r3, r7\n\t"
  5492. "sbcs r4, r4, r8\n\t"
  5493. "sbcs r5, r5, r9\n\t"
  5494. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  5495. "sbc r12, r10, r10\n\t"
  5496. "cmp %[a], lr\n\t"
  5497. "bne L_sp_2048_sub_in_pkace_32_word_%=\n\t"
  5498. "mov %[a], r12\n\t"
  5499. : [a] "+r" (a), [b] "+r" (b)
  5500. :
  5501. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10"
  5502. );
  5503. return (uint32_t)(size_t)a;
  5504. }
  5505. #endif /* WOLFSSL_SP_SMALL */
  5506. #ifdef WOLFSSL_SP_SMALL
  5507. /* Multiply a and b into r. (r = a * b)
  5508. *
  5509. * r A single precision integer.
  5510. * a A single precision integer.
  5511. * b A single precision integer.
  5512. */
  5513. static void sp_2048_mul_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  5514. {
  5515. register sp_digit* r asm ("r0") = r_p;
  5516. register const sp_digit* a asm ("r1") = a_p;
  5517. register const sp_digit* b asm ("r2") = b_p;
  5518. __asm__ __volatile__ (
  5519. "sub sp, sp, #0x100\n\t"
  5520. "mov r5, #0\n\t"
  5521. "mov r6, #0\n\t"
  5522. "mov r7, #0\n\t"
  5523. "mov r8, #0\n\t"
  5524. "\n"
  5525. "L_sp_2048_mul_32_outer_%=: \n\t"
  5526. "subs r3, r5, #0x7c\n\t"
  5527. "it cc\n\t"
  5528. "movcc r3, #0\n\t"
  5529. "sub r4, r5, r3\n\t"
  5530. "\n"
  5531. "L_sp_2048_mul_32_inner_%=: \n\t"
  5532. "ldr lr, [%[a], r3]\n\t"
  5533. "ldr r11, [%[b], r4]\n\t"
  5534. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  5535. "lsl r9, lr, #16\n\t"
  5536. "lsl r10, r11, #16\n\t"
  5537. "lsr r9, r9, #16\n\t"
  5538. "lsr r10, r10, #16\n\t"
  5539. "mul r10, r9, r10\n\t"
  5540. "adds r6, r6, r10\n\t"
  5541. "adcs r7, r7, #0\n\t"
  5542. "adc r8, r8, #0\n\t"
  5543. "lsr r10, r11, #16\n\t"
  5544. "mul r9, r10, r9\n\t"
  5545. "lsr r10, r9, #16\n\t"
  5546. "lsl r9, r9, #16\n\t"
  5547. "adds r6, r6, r9\n\t"
  5548. "adcs r7, r7, r10\n\t"
  5549. "adc r8, r8, #0\n\t"
  5550. "lsr r9, lr, #16\n\t"
  5551. "lsr r10, r11, #16\n\t"
  5552. "mul r10, r9, r10\n\t"
  5553. "adds r7, r7, r10\n\t"
  5554. "adc r8, r8, #0\n\t"
  5555. "lsl r10, r11, #16\n\t"
  5556. "lsr r10, r10, #16\n\t"
  5557. "mul r9, r10, r9\n\t"
  5558. "lsr r10, r9, #16\n\t"
  5559. "lsl r9, r9, #16\n\t"
  5560. "adds r6, r6, r9\n\t"
  5561. "adcs r7, r7, r10\n\t"
  5562. "adc r8, r8, #0\n\t"
  5563. #else
  5564. "umull r9, r10, lr, r11\n\t"
  5565. "adds r6, r6, r9\n\t"
  5566. "adcs r7, r7, r10\n\t"
  5567. "adc r8, r8, #0\n\t"
  5568. #endif
  5569. "add r3, r3, #4\n\t"
  5570. "sub r4, r4, #4\n\t"
  5571. "cmp r3, #0x80\n\t"
  5572. "beq L_sp_2048_mul_32_inner_done_%=\n\t"
  5573. "cmp r3, r5\n\t"
  5574. "ble L_sp_2048_mul_32_inner_%=\n\t"
  5575. "\n"
  5576. "L_sp_2048_mul_32_inner_done_%=: \n\t"
  5577. "str r6, [sp, r5]\n\t"
  5578. "mov r6, r7\n\t"
  5579. "mov r7, r8\n\t"
  5580. "mov r8, #0\n\t"
  5581. "add r5, r5, #4\n\t"
  5582. "cmp r5, #0xf8\n\t"
  5583. "ble L_sp_2048_mul_32_outer_%=\n\t"
  5584. "str r6, [sp, r5]\n\t"
  5585. "\n"
  5586. "L_sp_2048_mul_32_store_%=: \n\t"
  5587. "ldm sp!, {r6, r7, r8, r9}\n\t"
  5588. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  5589. "subs r5, r5, #16\n\t"
  5590. "bgt L_sp_2048_mul_32_store_%=\n\t"
  5591. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  5592. :
  5593. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11"
  5594. );
  5595. }
  5596. /* Square a and put result in r. (r = a * a)
  5597. *
  5598. * r A single precision integer.
  5599. * a A single precision integer.
  5600. */
  5601. static void sp_2048_sqr_32(sp_digit* r_p, const sp_digit* a_p)
  5602. {
  5603. register sp_digit* r asm ("r0") = r_p;
  5604. register const sp_digit* a asm ("r1") = a_p;
  5605. __asm__ __volatile__ (
  5606. "sub sp, sp, #0x100\n\t"
  5607. "mov r12, #0\n\t"
  5608. "mov r6, #0\n\t"
  5609. "mov r7, #0\n\t"
  5610. "mov r8, #0\n\t"
  5611. "mov r5, #0\n\t"
  5612. "\n"
  5613. "L_sp_2048_sqr_32_outer_%=: \n\t"
  5614. "subs r3, r5, #0x7c\n\t"
  5615. "it cc\n\t"
  5616. "movcc r3, r12\n\t"
  5617. "sub r4, r5, r3\n\t"
  5618. "\n"
  5619. "L_sp_2048_sqr_32_inner_%=: \n\t"
  5620. "cmp r4, r3\n\t"
  5621. "beq L_sp_2048_sqr_32_op_sqr_%=\n\t"
  5622. "ldr lr, [%[a], r3]\n\t"
  5623. "ldr r11, [%[a], r4]\n\t"
  5624. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  5625. "lsl r9, lr, #16\n\t"
  5626. "lsl r10, r11, #16\n\t"
  5627. "lsr r9, r9, #16\n\t"
  5628. "lsr r10, r10, #16\n\t"
  5629. "mul r10, r9, r10\n\t"
  5630. "adds r6, r6, r10\n\t"
  5631. "adcs r7, r7, #0\n\t"
  5632. "adc r8, r8, #0\n\t"
  5633. "adds r6, r6, r10\n\t"
  5634. "adcs r7, r7, #0\n\t"
  5635. "adc r8, r8, #0\n\t"
  5636. "lsr r10, r11, #16\n\t"
  5637. "mul r9, r10, r9\n\t"
  5638. "lsr r10, r9, #16\n\t"
  5639. "lsl r9, r9, #16\n\t"
  5640. "adds r6, r6, r9\n\t"
  5641. "adcs r7, r7, r10\n\t"
  5642. "adc r8, r8, #0\n\t"
  5643. "adds r6, r6, r9\n\t"
  5644. "adcs r7, r7, r10\n\t"
  5645. "adc r8, r8, #0\n\t"
  5646. "lsr r9, lr, #16\n\t"
  5647. "lsr r10, r11, #16\n\t"
  5648. "mul r10, r9, r10\n\t"
  5649. "adds r7, r7, r10\n\t"
  5650. "adc r8, r8, #0\n\t"
  5651. "adds r7, r7, r10\n\t"
  5652. "adc r8, r8, #0\n\t"
  5653. "lsl r10, r11, #16\n\t"
  5654. "lsr r10, r10, #16\n\t"
  5655. "mul r9, r10, r9\n\t"
  5656. "lsr r10, r9, #16\n\t"
  5657. "lsl r9, r9, #16\n\t"
  5658. "adds r6, r6, r9\n\t"
  5659. "adcs r7, r7, r10\n\t"
  5660. "adc r8, r8, #0\n\t"
  5661. "adds r6, r6, r9\n\t"
  5662. "adcs r7, r7, r10\n\t"
  5663. "adc r8, r8, #0\n\t"
  5664. #else
  5665. "umull r9, r10, lr, r11\n\t"
  5666. "adds r6, r6, r9\n\t"
  5667. "adcs r7, r7, r10\n\t"
  5668. "adc r8, r8, #0\n\t"
  5669. "adds r6, r6, r9\n\t"
  5670. "adcs r7, r7, r10\n\t"
  5671. "adc r8, r8, #0\n\t"
  5672. #endif
  5673. "bal L_sp_2048_sqr_32_op_done_%=\n\t"
  5674. "\n"
  5675. "L_sp_2048_sqr_32_op_sqr_%=: \n\t"
  5676. "ldr lr, [%[a], r3]\n\t"
  5677. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  5678. "lsl r9, lr, #16\n\t"
  5679. "lsr r10, lr, #16\n\t"
  5680. "lsr r9, r9, #16\n\t"
  5681. "mov r11, r9\n\t"
  5682. "mul r9, r11, r9\n\t"
  5683. "mov r11, r10\n\t"
  5684. "mul r10, r11, r10\n\t"
  5685. "adds r6, r6, r9\n\t"
  5686. "adcs r7, r7, r10\n\t"
  5687. "adc r8, r8, #0\n\t"
  5688. "lsr r10, lr, #16\n\t"
  5689. "lsl r9, lr, #16\n\t"
  5690. "lsr r9, r9, #16\n\t"
  5691. "mul r9, r10, r9\n\t"
  5692. "lsr r10, r9, #15\n\t"
  5693. "lsl r9, r9, #17\n\t"
  5694. "adds r6, r6, r9\n\t"
  5695. "adcs r7, r7, r10\n\t"
  5696. "adc r8, r8, #0\n\t"
  5697. #else
  5698. "umull r9, r10, lr, lr\n\t"
  5699. "adds r6, r6, r9\n\t"
  5700. "adcs r7, r7, r10\n\t"
  5701. "adc r8, r8, #0\n\t"
  5702. #endif
  5703. "\n"
  5704. "L_sp_2048_sqr_32_op_done_%=: \n\t"
  5705. "add r3, r3, #4\n\t"
  5706. "sub r4, r4, #4\n\t"
  5707. "cmp r3, #0x80\n\t"
  5708. "beq L_sp_2048_sqr_32_inner_done_%=\n\t"
  5709. "cmp r3, r4\n\t"
  5710. "bgt L_sp_2048_sqr_32_inner_done_%=\n\t"
  5711. "cmp r3, r5\n\t"
  5712. "ble L_sp_2048_sqr_32_inner_%=\n\t"
  5713. "\n"
  5714. "L_sp_2048_sqr_32_inner_done_%=: \n\t"
  5715. "str r6, [sp, r5]\n\t"
  5716. "mov r6, r7\n\t"
  5717. "mov r7, r8\n\t"
  5718. "mov r8, #0\n\t"
  5719. "add r5, r5, #4\n\t"
  5720. "cmp r5, #0xf8\n\t"
  5721. "ble L_sp_2048_sqr_32_outer_%=\n\t"
  5722. "str r6, [sp, r5]\n\t"
  5723. "\n"
  5724. "L_sp_2048_sqr_32_store_%=: \n\t"
  5725. "ldm sp!, {r6, r7, r8, r9}\n\t"
  5726. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  5727. "subs r5, r5, #16\n\t"
  5728. "bgt L_sp_2048_sqr_32_store_%=\n\t"
  5729. : [r] "+r" (r), [a] "+r" (a)
  5730. :
  5731. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12"
  5732. );
  5733. }
  5734. #endif /* WOLFSSL_SP_SMALL */
  5735. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  5736. /* Caclulate the bottom digit of -1/a mod 2^n.
  5737. *
  5738. * a A single precision number.
  5739. * rho Bottom word of inverse.
  5740. */
  5741. static void sp_2048_mont_setup(const sp_digit* a, sp_digit* rho)
  5742. {
  5743. sp_digit x;
  5744. sp_digit b;
  5745. b = a[0];
  5746. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  5747. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  5748. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  5749. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  5750. /* rho = -1/m mod b */
  5751. *rho = (sp_digit)0 - x;
  5752. }
  5753. #ifdef WOLFSSL_SP_SMALL
  5754. /* Mul a by digit b into r. (r = a * b)
  5755. *
  5756. * r A single precision integer.
  5757. * a A single precision integer.
  5758. * b A single precision digit.
  5759. */
  5760. static void sp_2048_mul_d_64(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  5761. {
  5762. register sp_digit* r asm ("r0") = r_p;
  5763. register const sp_digit* a asm ("r1") = a_p;
  5764. register sp_digit b asm ("r2") = b_p;
  5765. __asm__ __volatile__ (
  5766. "mov r10, #0\n\t"
  5767. /* A[0] * B */
  5768. "ldr r8, [%[a]]\n\t"
  5769. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  5770. "lsl r6, %[b], #16\n\t"
  5771. "lsl r5, r8, #16\n\t"
  5772. "lsr r6, r6, #16\n\t"
  5773. "lsr r5, r5, #16\n\t"
  5774. "mul r5, r6, r5\n\t"
  5775. "lsr r7, r8, #16\n\t"
  5776. "mul r6, r7, r6\n\t"
  5777. "lsr r3, r6, #16\n\t"
  5778. "lsl r6, r6, #16\n\t"
  5779. "adds r5, r5, r6\n\t"
  5780. "adc r3, r3, #0\n\t"
  5781. "lsr r6, %[b], #16\n\t"
  5782. "mul r7, r6, r7\n\t"
  5783. "add r3, r3, r7\n\t"
  5784. "lsl r7, r8, #16\n\t"
  5785. "lsr r7, r7, #16\n\t"
  5786. "mul r6, r7, r6\n\t"
  5787. "lsr r7, r6, #16\n\t"
  5788. "lsl r6, r6, #16\n\t"
  5789. "adds r5, r5, r6\n\t"
  5790. "adc r3, r3, r7\n\t"
  5791. #else
  5792. "umull r5, r3, %[b], r8\n\t"
  5793. #endif
  5794. "mov r4, #0\n\t"
  5795. "str r5, [%[r]]\n\t"
  5796. "mov r5, #0\n\t"
  5797. "mov r9, #4\n\t"
  5798. "\n"
  5799. "L_sp_2048_mul_d_64_word_%=: \n\t"
  5800. /* A[i] * B */
  5801. "ldr r8, [%[a], r9]\n\t"
  5802. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  5803. "lsl r6, %[b], #16\n\t"
  5804. "lsl r7, r8, #16\n\t"
  5805. "lsr r6, r6, #16\n\t"
  5806. "lsr r7, r7, #16\n\t"
  5807. "mul r7, r6, r7\n\t"
  5808. "adds r3, r3, r7\n\t"
  5809. "adcs r4, r4, #0\n\t"
  5810. "adc r5, r5, #0\n\t"
  5811. "lsr r7, r8, #16\n\t"
  5812. "mul r6, r7, r6\n\t"
  5813. "lsr r7, r6, #16\n\t"
  5814. "lsl r6, r6, #16\n\t"
  5815. "adds r3, r3, r6\n\t"
  5816. "adcs r4, r4, r7\n\t"
  5817. "adc r5, r5, #0\n\t"
  5818. "lsr r6, %[b], #16\n\t"
  5819. "lsr r7, r8, #16\n\t"
  5820. "mul r7, r6, r7\n\t"
  5821. "adds r4, r4, r7\n\t"
  5822. "adc r5, r5, #0\n\t"
  5823. "lsl r7, r8, #16\n\t"
  5824. "lsr r7, r7, #16\n\t"
  5825. "mul r6, r7, r6\n\t"
  5826. "lsr r7, r6, #16\n\t"
  5827. "lsl r6, r6, #16\n\t"
  5828. "adds r3, r3, r6\n\t"
  5829. "adcs r4, r4, r7\n\t"
  5830. "adc r5, r5, #0\n\t"
  5831. #else
  5832. "umull r6, r7, %[b], r8\n\t"
  5833. "adds r3, r3, r6\n\t"
  5834. "adcs r4, r4, r7\n\t"
  5835. "adc r5, r5, #0\n\t"
  5836. #endif
  5837. "str r3, [%[r], r9]\n\t"
  5838. "mov r3, r4\n\t"
  5839. "mov r4, r5\n\t"
  5840. "mov r5, #0\n\t"
  5841. "add r9, r9, #4\n\t"
  5842. "cmp r9, #0x100\n\t"
  5843. "blt L_sp_2048_mul_d_64_word_%=\n\t"
  5844. "str r3, [%[r], #256]\n\t"
  5845. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  5846. :
  5847. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  5848. );
  5849. }
  5850. #else
  5851. /* Mul a by digit b into r. (r = a * b)
  5852. *
  5853. * r A single precision integer.
  5854. * a A single precision integer.
  5855. * b A single precision digit.
  5856. */
  5857. static void sp_2048_mul_d_64(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  5858. {
  5859. register sp_digit* r asm ("r0") = r_p;
  5860. register const sp_digit* a asm ("r1") = a_p;
  5861. register sp_digit b asm ("r2") = b_p;
  5862. __asm__ __volatile__ (
  5863. "mov r10, #0\n\t"
  5864. /* A[0] * B */
  5865. "ldr r8, [%[a]], #4\n\t"
  5866. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  5867. "lsl r6, %[b], #16\n\t"
  5868. "lsl r3, r8, #16\n\t"
  5869. "lsr r6, r6, #16\n\t"
  5870. "lsr r3, r3, #16\n\t"
  5871. "mul r3, r6, r3\n\t"
  5872. "lsr r7, r8, #16\n\t"
  5873. "mul r6, r7, r6\n\t"
  5874. "lsr r4, r6, #16\n\t"
  5875. "lsl r6, r6, #16\n\t"
  5876. "adds r3, r3, r6\n\t"
  5877. "adc r4, r4, #0\n\t"
  5878. "lsr r6, %[b], #16\n\t"
  5879. "mul r7, r6, r7\n\t"
  5880. "add r4, r4, r7\n\t"
  5881. "lsl r7, r8, #16\n\t"
  5882. "lsr r7, r7, #16\n\t"
  5883. "mul r6, r7, r6\n\t"
  5884. "lsr r7, r6, #16\n\t"
  5885. "lsl r6, r6, #16\n\t"
  5886. "adds r3, r3, r6\n\t"
  5887. "adc r4, r4, r7\n\t"
  5888. #else
  5889. "umull r3, r4, %[b], r8\n\t"
  5890. #endif
  5891. "mov r5, #0\n\t"
  5892. "str r3, [%[r]], #4\n\t"
  5893. /* A[1] * B */
  5894. "ldr r8, [%[a]], #4\n\t"
  5895. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  5896. "lsl r6, %[b], #16\n\t"
  5897. "lsl r7, r8, #16\n\t"
  5898. "lsr r6, r6, #16\n\t"
  5899. "lsr r7, r7, #16\n\t"
  5900. "mul r7, r6, r7\n\t"
  5901. "adds r4, r4, r7\n\t"
  5902. "adcs r5, r5, #0\n\t"
  5903. "mov r3, #0\n\t"
  5904. "adc r3, r3, #0\n\t"
  5905. "lsr r7, r8, #16\n\t"
  5906. "mul r6, r7, r6\n\t"
  5907. "lsr r7, r6, #16\n\t"
  5908. "lsl r6, r6, #16\n\t"
  5909. "adds r4, r4, r6\n\t"
  5910. "adcs r5, r5, r7\n\t"
  5911. "adc r3, r3, #0\n\t"
  5912. "lsr r6, %[b], #16\n\t"
  5913. "lsr r7, r8, #16\n\t"
  5914. "mul r7, r6, r7\n\t"
  5915. "adds r5, r5, r7\n\t"
  5916. "adc r3, r3, #0\n\t"
  5917. "lsl r7, r8, #16\n\t"
  5918. "lsr r7, r7, #16\n\t"
  5919. "mul r6, r7, r6\n\t"
  5920. "lsr r7, r6, #16\n\t"
  5921. "lsl r6, r6, #16\n\t"
  5922. "adds r4, r4, r6\n\t"
  5923. "adcs r5, r5, r7\n\t"
  5924. "adc r3, r3, #0\n\t"
  5925. #else
  5926. "umull r6, r7, %[b], r8\n\t"
  5927. "adds r4, r4, r6\n\t"
  5928. "adcs r5, r5, r7\n\t"
  5929. "mov r3, #0\n\t"
  5930. "adc r3, r3, #0\n\t"
  5931. #endif
  5932. "str r4, [%[r]], #4\n\t"
  5933. /* A[2] * B */
  5934. "ldr r8, [%[a]], #4\n\t"
  5935. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  5936. "lsl r6, %[b], #16\n\t"
  5937. "lsl r7, r8, #16\n\t"
  5938. "lsr r6, r6, #16\n\t"
  5939. "lsr r7, r7, #16\n\t"
  5940. "mul r7, r6, r7\n\t"
  5941. "adds r5, r5, r7\n\t"
  5942. "adcs r3, r3, #0\n\t"
  5943. "mov r4, #0\n\t"
  5944. "adc r4, r4, #0\n\t"
  5945. "lsr r7, r8, #16\n\t"
  5946. "mul r6, r7, r6\n\t"
  5947. "lsr r7, r6, #16\n\t"
  5948. "lsl r6, r6, #16\n\t"
  5949. "adds r5, r5, r6\n\t"
  5950. "adcs r3, r3, r7\n\t"
  5951. "adc r4, r4, #0\n\t"
  5952. "lsr r6, %[b], #16\n\t"
  5953. "lsr r7, r8, #16\n\t"
  5954. "mul r7, r6, r7\n\t"
  5955. "adds r3, r3, r7\n\t"
  5956. "adc r4, r4, #0\n\t"
  5957. "lsl r7, r8, #16\n\t"
  5958. "lsr r7, r7, #16\n\t"
  5959. "mul r6, r7, r6\n\t"
  5960. "lsr r7, r6, #16\n\t"
  5961. "lsl r6, r6, #16\n\t"
  5962. "adds r5, r5, r6\n\t"
  5963. "adcs r3, r3, r7\n\t"
  5964. "adc r4, r4, #0\n\t"
  5965. #else
  5966. "umull r6, r7, %[b], r8\n\t"
  5967. "adds r5, r5, r6\n\t"
  5968. "adcs r3, r3, r7\n\t"
  5969. "mov r4, #0\n\t"
  5970. "adc r4, r4, #0\n\t"
  5971. #endif
  5972. "str r5, [%[r]], #4\n\t"
  5973. /* A[3] * B */
  5974. "ldr r8, [%[a]], #4\n\t"
  5975. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  5976. "lsl r6, %[b], #16\n\t"
  5977. "lsl r7, r8, #16\n\t"
  5978. "lsr r6, r6, #16\n\t"
  5979. "lsr r7, r7, #16\n\t"
  5980. "mul r7, r6, r7\n\t"
  5981. "adds r3, r3, r7\n\t"
  5982. "adcs r4, r4, #0\n\t"
  5983. "mov r5, #0\n\t"
  5984. "adc r5, r5, #0\n\t"
  5985. "lsr r7, r8, #16\n\t"
  5986. "mul r6, r7, r6\n\t"
  5987. "lsr r7, r6, #16\n\t"
  5988. "lsl r6, r6, #16\n\t"
  5989. "adds r3, r3, r6\n\t"
  5990. "adcs r4, r4, r7\n\t"
  5991. "adc r5, r5, #0\n\t"
  5992. "lsr r6, %[b], #16\n\t"
  5993. "lsr r7, r8, #16\n\t"
  5994. "mul r7, r6, r7\n\t"
  5995. "adds r4, r4, r7\n\t"
  5996. "adc r5, r5, #0\n\t"
  5997. "lsl r7, r8, #16\n\t"
  5998. "lsr r7, r7, #16\n\t"
  5999. "mul r6, r7, r6\n\t"
  6000. "lsr r7, r6, #16\n\t"
  6001. "lsl r6, r6, #16\n\t"
  6002. "adds r3, r3, r6\n\t"
  6003. "adcs r4, r4, r7\n\t"
  6004. "adc r5, r5, #0\n\t"
  6005. #else
  6006. "umull r6, r7, %[b], r8\n\t"
  6007. "adds r3, r3, r6\n\t"
  6008. "adcs r4, r4, r7\n\t"
  6009. "mov r5, #0\n\t"
  6010. "adc r5, r5, #0\n\t"
  6011. #endif
  6012. "str r3, [%[r]], #4\n\t"
  6013. /* A[4] * B */
  6014. "ldr r8, [%[a]], #4\n\t"
  6015. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6016. "lsl r6, %[b], #16\n\t"
  6017. "lsl r7, r8, #16\n\t"
  6018. "lsr r6, r6, #16\n\t"
  6019. "lsr r7, r7, #16\n\t"
  6020. "mul r7, r6, r7\n\t"
  6021. "adds r4, r4, r7\n\t"
  6022. "adcs r5, r5, #0\n\t"
  6023. "mov r3, #0\n\t"
  6024. "adc r3, r3, #0\n\t"
  6025. "lsr r7, r8, #16\n\t"
  6026. "mul r6, r7, r6\n\t"
  6027. "lsr r7, r6, #16\n\t"
  6028. "lsl r6, r6, #16\n\t"
  6029. "adds r4, r4, r6\n\t"
  6030. "adcs r5, r5, r7\n\t"
  6031. "adc r3, r3, #0\n\t"
  6032. "lsr r6, %[b], #16\n\t"
  6033. "lsr r7, r8, #16\n\t"
  6034. "mul r7, r6, r7\n\t"
  6035. "adds r5, r5, r7\n\t"
  6036. "adc r3, r3, #0\n\t"
  6037. "lsl r7, r8, #16\n\t"
  6038. "lsr r7, r7, #16\n\t"
  6039. "mul r6, r7, r6\n\t"
  6040. "lsr r7, r6, #16\n\t"
  6041. "lsl r6, r6, #16\n\t"
  6042. "adds r4, r4, r6\n\t"
  6043. "adcs r5, r5, r7\n\t"
  6044. "adc r3, r3, #0\n\t"
  6045. #else
  6046. "umull r6, r7, %[b], r8\n\t"
  6047. "adds r4, r4, r6\n\t"
  6048. "adcs r5, r5, r7\n\t"
  6049. "mov r3, #0\n\t"
  6050. "adc r3, r3, #0\n\t"
  6051. #endif
  6052. "str r4, [%[r]], #4\n\t"
  6053. /* A[5] * B */
  6054. "ldr r8, [%[a]], #4\n\t"
  6055. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6056. "lsl r6, %[b], #16\n\t"
  6057. "lsl r7, r8, #16\n\t"
  6058. "lsr r6, r6, #16\n\t"
  6059. "lsr r7, r7, #16\n\t"
  6060. "mul r7, r6, r7\n\t"
  6061. "adds r5, r5, r7\n\t"
  6062. "adcs r3, r3, #0\n\t"
  6063. "mov r4, #0\n\t"
  6064. "adc r4, r4, #0\n\t"
  6065. "lsr r7, r8, #16\n\t"
  6066. "mul r6, r7, r6\n\t"
  6067. "lsr r7, r6, #16\n\t"
  6068. "lsl r6, r6, #16\n\t"
  6069. "adds r5, r5, r6\n\t"
  6070. "adcs r3, r3, r7\n\t"
  6071. "adc r4, r4, #0\n\t"
  6072. "lsr r6, %[b], #16\n\t"
  6073. "lsr r7, r8, #16\n\t"
  6074. "mul r7, r6, r7\n\t"
  6075. "adds r3, r3, r7\n\t"
  6076. "adc r4, r4, #0\n\t"
  6077. "lsl r7, r8, #16\n\t"
  6078. "lsr r7, r7, #16\n\t"
  6079. "mul r6, r7, r6\n\t"
  6080. "lsr r7, r6, #16\n\t"
  6081. "lsl r6, r6, #16\n\t"
  6082. "adds r5, r5, r6\n\t"
  6083. "adcs r3, r3, r7\n\t"
  6084. "adc r4, r4, #0\n\t"
  6085. #else
  6086. "umull r6, r7, %[b], r8\n\t"
  6087. "adds r5, r5, r6\n\t"
  6088. "adcs r3, r3, r7\n\t"
  6089. "mov r4, #0\n\t"
  6090. "adc r4, r4, #0\n\t"
  6091. #endif
  6092. "str r5, [%[r]], #4\n\t"
  6093. /* A[6] * B */
  6094. "ldr r8, [%[a]], #4\n\t"
  6095. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6096. "lsl r6, %[b], #16\n\t"
  6097. "lsl r7, r8, #16\n\t"
  6098. "lsr r6, r6, #16\n\t"
  6099. "lsr r7, r7, #16\n\t"
  6100. "mul r7, r6, r7\n\t"
  6101. "adds r3, r3, r7\n\t"
  6102. "adcs r4, r4, #0\n\t"
  6103. "mov r5, #0\n\t"
  6104. "adc r5, r5, #0\n\t"
  6105. "lsr r7, r8, #16\n\t"
  6106. "mul r6, r7, r6\n\t"
  6107. "lsr r7, r6, #16\n\t"
  6108. "lsl r6, r6, #16\n\t"
  6109. "adds r3, r3, r6\n\t"
  6110. "adcs r4, r4, r7\n\t"
  6111. "adc r5, r5, #0\n\t"
  6112. "lsr r6, %[b], #16\n\t"
  6113. "lsr r7, r8, #16\n\t"
  6114. "mul r7, r6, r7\n\t"
  6115. "adds r4, r4, r7\n\t"
  6116. "adc r5, r5, #0\n\t"
  6117. "lsl r7, r8, #16\n\t"
  6118. "lsr r7, r7, #16\n\t"
  6119. "mul r6, r7, r6\n\t"
  6120. "lsr r7, r6, #16\n\t"
  6121. "lsl r6, r6, #16\n\t"
  6122. "adds r3, r3, r6\n\t"
  6123. "adcs r4, r4, r7\n\t"
  6124. "adc r5, r5, #0\n\t"
  6125. #else
  6126. "umull r6, r7, %[b], r8\n\t"
  6127. "adds r3, r3, r6\n\t"
  6128. "adcs r4, r4, r7\n\t"
  6129. "mov r5, #0\n\t"
  6130. "adc r5, r5, #0\n\t"
  6131. #endif
  6132. "str r3, [%[r]], #4\n\t"
  6133. /* A[7] * B */
  6134. "ldr r8, [%[a]], #4\n\t"
  6135. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6136. "lsl r6, %[b], #16\n\t"
  6137. "lsl r7, r8, #16\n\t"
  6138. "lsr r6, r6, #16\n\t"
  6139. "lsr r7, r7, #16\n\t"
  6140. "mul r7, r6, r7\n\t"
  6141. "adds r4, r4, r7\n\t"
  6142. "adcs r5, r5, #0\n\t"
  6143. "mov r3, #0\n\t"
  6144. "adc r3, r3, #0\n\t"
  6145. "lsr r7, r8, #16\n\t"
  6146. "mul r6, r7, r6\n\t"
  6147. "lsr r7, r6, #16\n\t"
  6148. "lsl r6, r6, #16\n\t"
  6149. "adds r4, r4, r6\n\t"
  6150. "adcs r5, r5, r7\n\t"
  6151. "adc r3, r3, #0\n\t"
  6152. "lsr r6, %[b], #16\n\t"
  6153. "lsr r7, r8, #16\n\t"
  6154. "mul r7, r6, r7\n\t"
  6155. "adds r5, r5, r7\n\t"
  6156. "adc r3, r3, #0\n\t"
  6157. "lsl r7, r8, #16\n\t"
  6158. "lsr r7, r7, #16\n\t"
  6159. "mul r6, r7, r6\n\t"
  6160. "lsr r7, r6, #16\n\t"
  6161. "lsl r6, r6, #16\n\t"
  6162. "adds r4, r4, r6\n\t"
  6163. "adcs r5, r5, r7\n\t"
  6164. "adc r3, r3, #0\n\t"
  6165. #else
  6166. "umull r6, r7, %[b], r8\n\t"
  6167. "adds r4, r4, r6\n\t"
  6168. "adcs r5, r5, r7\n\t"
  6169. "mov r3, #0\n\t"
  6170. "adc r3, r3, #0\n\t"
  6171. #endif
  6172. "str r4, [%[r]], #4\n\t"
  6173. /* A[8] * B */
  6174. "ldr r8, [%[a]], #4\n\t"
  6175. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6176. "lsl r6, %[b], #16\n\t"
  6177. "lsl r7, r8, #16\n\t"
  6178. "lsr r6, r6, #16\n\t"
  6179. "lsr r7, r7, #16\n\t"
  6180. "mul r7, r6, r7\n\t"
  6181. "adds r5, r5, r7\n\t"
  6182. "adcs r3, r3, #0\n\t"
  6183. "mov r4, #0\n\t"
  6184. "adc r4, r4, #0\n\t"
  6185. "lsr r7, r8, #16\n\t"
  6186. "mul r6, r7, r6\n\t"
  6187. "lsr r7, r6, #16\n\t"
  6188. "lsl r6, r6, #16\n\t"
  6189. "adds r5, r5, r6\n\t"
  6190. "adcs r3, r3, r7\n\t"
  6191. "adc r4, r4, #0\n\t"
  6192. "lsr r6, %[b], #16\n\t"
  6193. "lsr r7, r8, #16\n\t"
  6194. "mul r7, r6, r7\n\t"
  6195. "adds r3, r3, r7\n\t"
  6196. "adc r4, r4, #0\n\t"
  6197. "lsl r7, r8, #16\n\t"
  6198. "lsr r7, r7, #16\n\t"
  6199. "mul r6, r7, r6\n\t"
  6200. "lsr r7, r6, #16\n\t"
  6201. "lsl r6, r6, #16\n\t"
  6202. "adds r5, r5, r6\n\t"
  6203. "adcs r3, r3, r7\n\t"
  6204. "adc r4, r4, #0\n\t"
  6205. #else
  6206. "umull r6, r7, %[b], r8\n\t"
  6207. "adds r5, r5, r6\n\t"
  6208. "adcs r3, r3, r7\n\t"
  6209. "mov r4, #0\n\t"
  6210. "adc r4, r4, #0\n\t"
  6211. #endif
  6212. "str r5, [%[r]], #4\n\t"
  6213. /* A[9] * B */
  6214. "ldr r8, [%[a]], #4\n\t"
  6215. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6216. "lsl r6, %[b], #16\n\t"
  6217. "lsl r7, r8, #16\n\t"
  6218. "lsr r6, r6, #16\n\t"
  6219. "lsr r7, r7, #16\n\t"
  6220. "mul r7, r6, r7\n\t"
  6221. "adds r3, r3, r7\n\t"
  6222. "adcs r4, r4, #0\n\t"
  6223. "mov r5, #0\n\t"
  6224. "adc r5, r5, #0\n\t"
  6225. "lsr r7, r8, #16\n\t"
  6226. "mul r6, r7, r6\n\t"
  6227. "lsr r7, r6, #16\n\t"
  6228. "lsl r6, r6, #16\n\t"
  6229. "adds r3, r3, r6\n\t"
  6230. "adcs r4, r4, r7\n\t"
  6231. "adc r5, r5, #0\n\t"
  6232. "lsr r6, %[b], #16\n\t"
  6233. "lsr r7, r8, #16\n\t"
  6234. "mul r7, r6, r7\n\t"
  6235. "adds r4, r4, r7\n\t"
  6236. "adc r5, r5, #0\n\t"
  6237. "lsl r7, r8, #16\n\t"
  6238. "lsr r7, r7, #16\n\t"
  6239. "mul r6, r7, r6\n\t"
  6240. "lsr r7, r6, #16\n\t"
  6241. "lsl r6, r6, #16\n\t"
  6242. "adds r3, r3, r6\n\t"
  6243. "adcs r4, r4, r7\n\t"
  6244. "adc r5, r5, #0\n\t"
  6245. #else
  6246. "umull r6, r7, %[b], r8\n\t"
  6247. "adds r3, r3, r6\n\t"
  6248. "adcs r4, r4, r7\n\t"
  6249. "mov r5, #0\n\t"
  6250. "adc r5, r5, #0\n\t"
  6251. #endif
  6252. "str r3, [%[r]], #4\n\t"
  6253. /* A[10] * B */
  6254. "ldr r8, [%[a]], #4\n\t"
  6255. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6256. "lsl r6, %[b], #16\n\t"
  6257. "lsl r7, r8, #16\n\t"
  6258. "lsr r6, r6, #16\n\t"
  6259. "lsr r7, r7, #16\n\t"
  6260. "mul r7, r6, r7\n\t"
  6261. "adds r4, r4, r7\n\t"
  6262. "adcs r5, r5, #0\n\t"
  6263. "mov r3, #0\n\t"
  6264. "adc r3, r3, #0\n\t"
  6265. "lsr r7, r8, #16\n\t"
  6266. "mul r6, r7, r6\n\t"
  6267. "lsr r7, r6, #16\n\t"
  6268. "lsl r6, r6, #16\n\t"
  6269. "adds r4, r4, r6\n\t"
  6270. "adcs r5, r5, r7\n\t"
  6271. "adc r3, r3, #0\n\t"
  6272. "lsr r6, %[b], #16\n\t"
  6273. "lsr r7, r8, #16\n\t"
  6274. "mul r7, r6, r7\n\t"
  6275. "adds r5, r5, r7\n\t"
  6276. "adc r3, r3, #0\n\t"
  6277. "lsl r7, r8, #16\n\t"
  6278. "lsr r7, r7, #16\n\t"
  6279. "mul r6, r7, r6\n\t"
  6280. "lsr r7, r6, #16\n\t"
  6281. "lsl r6, r6, #16\n\t"
  6282. "adds r4, r4, r6\n\t"
  6283. "adcs r5, r5, r7\n\t"
  6284. "adc r3, r3, #0\n\t"
  6285. #else
  6286. "umull r6, r7, %[b], r8\n\t"
  6287. "adds r4, r4, r6\n\t"
  6288. "adcs r5, r5, r7\n\t"
  6289. "mov r3, #0\n\t"
  6290. "adc r3, r3, #0\n\t"
  6291. #endif
  6292. "str r4, [%[r]], #4\n\t"
  6293. /* A[11] * B */
  6294. "ldr r8, [%[a]], #4\n\t"
  6295. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6296. "lsl r6, %[b], #16\n\t"
  6297. "lsl r7, r8, #16\n\t"
  6298. "lsr r6, r6, #16\n\t"
  6299. "lsr r7, r7, #16\n\t"
  6300. "mul r7, r6, r7\n\t"
  6301. "adds r5, r5, r7\n\t"
  6302. "adcs r3, r3, #0\n\t"
  6303. "mov r4, #0\n\t"
  6304. "adc r4, r4, #0\n\t"
  6305. "lsr r7, r8, #16\n\t"
  6306. "mul r6, r7, r6\n\t"
  6307. "lsr r7, r6, #16\n\t"
  6308. "lsl r6, r6, #16\n\t"
  6309. "adds r5, r5, r6\n\t"
  6310. "adcs r3, r3, r7\n\t"
  6311. "adc r4, r4, #0\n\t"
  6312. "lsr r6, %[b], #16\n\t"
  6313. "lsr r7, r8, #16\n\t"
  6314. "mul r7, r6, r7\n\t"
  6315. "adds r3, r3, r7\n\t"
  6316. "adc r4, r4, #0\n\t"
  6317. "lsl r7, r8, #16\n\t"
  6318. "lsr r7, r7, #16\n\t"
  6319. "mul r6, r7, r6\n\t"
  6320. "lsr r7, r6, #16\n\t"
  6321. "lsl r6, r6, #16\n\t"
  6322. "adds r5, r5, r6\n\t"
  6323. "adcs r3, r3, r7\n\t"
  6324. "adc r4, r4, #0\n\t"
  6325. #else
  6326. "umull r6, r7, %[b], r8\n\t"
  6327. "adds r5, r5, r6\n\t"
  6328. "adcs r3, r3, r7\n\t"
  6329. "mov r4, #0\n\t"
  6330. "adc r4, r4, #0\n\t"
  6331. #endif
  6332. "str r5, [%[r]], #4\n\t"
  6333. /* A[12] * B */
  6334. "ldr r8, [%[a]], #4\n\t"
  6335. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6336. "lsl r6, %[b], #16\n\t"
  6337. "lsl r7, r8, #16\n\t"
  6338. "lsr r6, r6, #16\n\t"
  6339. "lsr r7, r7, #16\n\t"
  6340. "mul r7, r6, r7\n\t"
  6341. "adds r3, r3, r7\n\t"
  6342. "adcs r4, r4, #0\n\t"
  6343. "mov r5, #0\n\t"
  6344. "adc r5, r5, #0\n\t"
  6345. "lsr r7, r8, #16\n\t"
  6346. "mul r6, r7, r6\n\t"
  6347. "lsr r7, r6, #16\n\t"
  6348. "lsl r6, r6, #16\n\t"
  6349. "adds r3, r3, r6\n\t"
  6350. "adcs r4, r4, r7\n\t"
  6351. "adc r5, r5, #0\n\t"
  6352. "lsr r6, %[b], #16\n\t"
  6353. "lsr r7, r8, #16\n\t"
  6354. "mul r7, r6, r7\n\t"
  6355. "adds r4, r4, r7\n\t"
  6356. "adc r5, r5, #0\n\t"
  6357. "lsl r7, r8, #16\n\t"
  6358. "lsr r7, r7, #16\n\t"
  6359. "mul r6, r7, r6\n\t"
  6360. "lsr r7, r6, #16\n\t"
  6361. "lsl r6, r6, #16\n\t"
  6362. "adds r3, r3, r6\n\t"
  6363. "adcs r4, r4, r7\n\t"
  6364. "adc r5, r5, #0\n\t"
  6365. #else
  6366. "umull r6, r7, %[b], r8\n\t"
  6367. "adds r3, r3, r6\n\t"
  6368. "adcs r4, r4, r7\n\t"
  6369. "mov r5, #0\n\t"
  6370. "adc r5, r5, #0\n\t"
  6371. #endif
  6372. "str r3, [%[r]], #4\n\t"
  6373. /* A[13] * B */
  6374. "ldr r8, [%[a]], #4\n\t"
  6375. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6376. "lsl r6, %[b], #16\n\t"
  6377. "lsl r7, r8, #16\n\t"
  6378. "lsr r6, r6, #16\n\t"
  6379. "lsr r7, r7, #16\n\t"
  6380. "mul r7, r6, r7\n\t"
  6381. "adds r4, r4, r7\n\t"
  6382. "adcs r5, r5, #0\n\t"
  6383. "mov r3, #0\n\t"
  6384. "adc r3, r3, #0\n\t"
  6385. "lsr r7, r8, #16\n\t"
  6386. "mul r6, r7, r6\n\t"
  6387. "lsr r7, r6, #16\n\t"
  6388. "lsl r6, r6, #16\n\t"
  6389. "adds r4, r4, r6\n\t"
  6390. "adcs r5, r5, r7\n\t"
  6391. "adc r3, r3, #0\n\t"
  6392. "lsr r6, %[b], #16\n\t"
  6393. "lsr r7, r8, #16\n\t"
  6394. "mul r7, r6, r7\n\t"
  6395. "adds r5, r5, r7\n\t"
  6396. "adc r3, r3, #0\n\t"
  6397. "lsl r7, r8, #16\n\t"
  6398. "lsr r7, r7, #16\n\t"
  6399. "mul r6, r7, r6\n\t"
  6400. "lsr r7, r6, #16\n\t"
  6401. "lsl r6, r6, #16\n\t"
  6402. "adds r4, r4, r6\n\t"
  6403. "adcs r5, r5, r7\n\t"
  6404. "adc r3, r3, #0\n\t"
  6405. #else
  6406. "umull r6, r7, %[b], r8\n\t"
  6407. "adds r4, r4, r6\n\t"
  6408. "adcs r5, r5, r7\n\t"
  6409. "mov r3, #0\n\t"
  6410. "adc r3, r3, #0\n\t"
  6411. #endif
  6412. "str r4, [%[r]], #4\n\t"
  6413. /* A[14] * B */
  6414. "ldr r8, [%[a]], #4\n\t"
  6415. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6416. "lsl r6, %[b], #16\n\t"
  6417. "lsl r7, r8, #16\n\t"
  6418. "lsr r6, r6, #16\n\t"
  6419. "lsr r7, r7, #16\n\t"
  6420. "mul r7, r6, r7\n\t"
  6421. "adds r5, r5, r7\n\t"
  6422. "adcs r3, r3, #0\n\t"
  6423. "mov r4, #0\n\t"
  6424. "adc r4, r4, #0\n\t"
  6425. "lsr r7, r8, #16\n\t"
  6426. "mul r6, r7, r6\n\t"
  6427. "lsr r7, r6, #16\n\t"
  6428. "lsl r6, r6, #16\n\t"
  6429. "adds r5, r5, r6\n\t"
  6430. "adcs r3, r3, r7\n\t"
  6431. "adc r4, r4, #0\n\t"
  6432. "lsr r6, %[b], #16\n\t"
  6433. "lsr r7, r8, #16\n\t"
  6434. "mul r7, r6, r7\n\t"
  6435. "adds r3, r3, r7\n\t"
  6436. "adc r4, r4, #0\n\t"
  6437. "lsl r7, r8, #16\n\t"
  6438. "lsr r7, r7, #16\n\t"
  6439. "mul r6, r7, r6\n\t"
  6440. "lsr r7, r6, #16\n\t"
  6441. "lsl r6, r6, #16\n\t"
  6442. "adds r5, r5, r6\n\t"
  6443. "adcs r3, r3, r7\n\t"
  6444. "adc r4, r4, #0\n\t"
  6445. #else
  6446. "umull r6, r7, %[b], r8\n\t"
  6447. "adds r5, r5, r6\n\t"
  6448. "adcs r3, r3, r7\n\t"
  6449. "mov r4, #0\n\t"
  6450. "adc r4, r4, #0\n\t"
  6451. #endif
  6452. "str r5, [%[r]], #4\n\t"
  6453. /* A[15] * B */
  6454. "ldr r8, [%[a]], #4\n\t"
  6455. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6456. "lsl r6, %[b], #16\n\t"
  6457. "lsl r7, r8, #16\n\t"
  6458. "lsr r6, r6, #16\n\t"
  6459. "lsr r7, r7, #16\n\t"
  6460. "mul r7, r6, r7\n\t"
  6461. "adds r3, r3, r7\n\t"
  6462. "adcs r4, r4, #0\n\t"
  6463. "mov r5, #0\n\t"
  6464. "adc r5, r5, #0\n\t"
  6465. "lsr r7, r8, #16\n\t"
  6466. "mul r6, r7, r6\n\t"
  6467. "lsr r7, r6, #16\n\t"
  6468. "lsl r6, r6, #16\n\t"
  6469. "adds r3, r3, r6\n\t"
  6470. "adcs r4, r4, r7\n\t"
  6471. "adc r5, r5, #0\n\t"
  6472. "lsr r6, %[b], #16\n\t"
  6473. "lsr r7, r8, #16\n\t"
  6474. "mul r7, r6, r7\n\t"
  6475. "adds r4, r4, r7\n\t"
  6476. "adc r5, r5, #0\n\t"
  6477. "lsl r7, r8, #16\n\t"
  6478. "lsr r7, r7, #16\n\t"
  6479. "mul r6, r7, r6\n\t"
  6480. "lsr r7, r6, #16\n\t"
  6481. "lsl r6, r6, #16\n\t"
  6482. "adds r3, r3, r6\n\t"
  6483. "adcs r4, r4, r7\n\t"
  6484. "adc r5, r5, #0\n\t"
  6485. #else
  6486. "umull r6, r7, %[b], r8\n\t"
  6487. "adds r3, r3, r6\n\t"
  6488. "adcs r4, r4, r7\n\t"
  6489. "mov r5, #0\n\t"
  6490. "adc r5, r5, #0\n\t"
  6491. #endif
  6492. "str r3, [%[r]], #4\n\t"
  6493. /* A[16] * B */
  6494. "ldr r8, [%[a]], #4\n\t"
  6495. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6496. "lsl r6, %[b], #16\n\t"
  6497. "lsl r7, r8, #16\n\t"
  6498. "lsr r6, r6, #16\n\t"
  6499. "lsr r7, r7, #16\n\t"
  6500. "mul r7, r6, r7\n\t"
  6501. "adds r4, r4, r7\n\t"
  6502. "adcs r5, r5, #0\n\t"
  6503. "mov r3, #0\n\t"
  6504. "adc r3, r3, #0\n\t"
  6505. "lsr r7, r8, #16\n\t"
  6506. "mul r6, r7, r6\n\t"
  6507. "lsr r7, r6, #16\n\t"
  6508. "lsl r6, r6, #16\n\t"
  6509. "adds r4, r4, r6\n\t"
  6510. "adcs r5, r5, r7\n\t"
  6511. "adc r3, r3, #0\n\t"
  6512. "lsr r6, %[b], #16\n\t"
  6513. "lsr r7, r8, #16\n\t"
  6514. "mul r7, r6, r7\n\t"
  6515. "adds r5, r5, r7\n\t"
  6516. "adc r3, r3, #0\n\t"
  6517. "lsl r7, r8, #16\n\t"
  6518. "lsr r7, r7, #16\n\t"
  6519. "mul r6, r7, r6\n\t"
  6520. "lsr r7, r6, #16\n\t"
  6521. "lsl r6, r6, #16\n\t"
  6522. "adds r4, r4, r6\n\t"
  6523. "adcs r5, r5, r7\n\t"
  6524. "adc r3, r3, #0\n\t"
  6525. #else
  6526. "umull r6, r7, %[b], r8\n\t"
  6527. "adds r4, r4, r6\n\t"
  6528. "adcs r5, r5, r7\n\t"
  6529. "mov r3, #0\n\t"
  6530. "adc r3, r3, #0\n\t"
  6531. #endif
  6532. "str r4, [%[r]], #4\n\t"
  6533. /* A[17] * B */
  6534. "ldr r8, [%[a]], #4\n\t"
  6535. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6536. "lsl r6, %[b], #16\n\t"
  6537. "lsl r7, r8, #16\n\t"
  6538. "lsr r6, r6, #16\n\t"
  6539. "lsr r7, r7, #16\n\t"
  6540. "mul r7, r6, r7\n\t"
  6541. "adds r5, r5, r7\n\t"
  6542. "adcs r3, r3, #0\n\t"
  6543. "mov r4, #0\n\t"
  6544. "adc r4, r4, #0\n\t"
  6545. "lsr r7, r8, #16\n\t"
  6546. "mul r6, r7, r6\n\t"
  6547. "lsr r7, r6, #16\n\t"
  6548. "lsl r6, r6, #16\n\t"
  6549. "adds r5, r5, r6\n\t"
  6550. "adcs r3, r3, r7\n\t"
  6551. "adc r4, r4, #0\n\t"
  6552. "lsr r6, %[b], #16\n\t"
  6553. "lsr r7, r8, #16\n\t"
  6554. "mul r7, r6, r7\n\t"
  6555. "adds r3, r3, r7\n\t"
  6556. "adc r4, r4, #0\n\t"
  6557. "lsl r7, r8, #16\n\t"
  6558. "lsr r7, r7, #16\n\t"
  6559. "mul r6, r7, r6\n\t"
  6560. "lsr r7, r6, #16\n\t"
  6561. "lsl r6, r6, #16\n\t"
  6562. "adds r5, r5, r6\n\t"
  6563. "adcs r3, r3, r7\n\t"
  6564. "adc r4, r4, #0\n\t"
  6565. #else
  6566. "umull r6, r7, %[b], r8\n\t"
  6567. "adds r5, r5, r6\n\t"
  6568. "adcs r3, r3, r7\n\t"
  6569. "mov r4, #0\n\t"
  6570. "adc r4, r4, #0\n\t"
  6571. #endif
  6572. "str r5, [%[r]], #4\n\t"
  6573. /* A[18] * B */
  6574. "ldr r8, [%[a]], #4\n\t"
  6575. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6576. "lsl r6, %[b], #16\n\t"
  6577. "lsl r7, r8, #16\n\t"
  6578. "lsr r6, r6, #16\n\t"
  6579. "lsr r7, r7, #16\n\t"
  6580. "mul r7, r6, r7\n\t"
  6581. "adds r3, r3, r7\n\t"
  6582. "adcs r4, r4, #0\n\t"
  6583. "mov r5, #0\n\t"
  6584. "adc r5, r5, #0\n\t"
  6585. "lsr r7, r8, #16\n\t"
  6586. "mul r6, r7, r6\n\t"
  6587. "lsr r7, r6, #16\n\t"
  6588. "lsl r6, r6, #16\n\t"
  6589. "adds r3, r3, r6\n\t"
  6590. "adcs r4, r4, r7\n\t"
  6591. "adc r5, r5, #0\n\t"
  6592. "lsr r6, %[b], #16\n\t"
  6593. "lsr r7, r8, #16\n\t"
  6594. "mul r7, r6, r7\n\t"
  6595. "adds r4, r4, r7\n\t"
  6596. "adc r5, r5, #0\n\t"
  6597. "lsl r7, r8, #16\n\t"
  6598. "lsr r7, r7, #16\n\t"
  6599. "mul r6, r7, r6\n\t"
  6600. "lsr r7, r6, #16\n\t"
  6601. "lsl r6, r6, #16\n\t"
  6602. "adds r3, r3, r6\n\t"
  6603. "adcs r4, r4, r7\n\t"
  6604. "adc r5, r5, #0\n\t"
  6605. #else
  6606. "umull r6, r7, %[b], r8\n\t"
  6607. "adds r3, r3, r6\n\t"
  6608. "adcs r4, r4, r7\n\t"
  6609. "mov r5, #0\n\t"
  6610. "adc r5, r5, #0\n\t"
  6611. #endif
  6612. "str r3, [%[r]], #4\n\t"
  6613. /* A[19] * B */
  6614. "ldr r8, [%[a]], #4\n\t"
  6615. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6616. "lsl r6, %[b], #16\n\t"
  6617. "lsl r7, r8, #16\n\t"
  6618. "lsr r6, r6, #16\n\t"
  6619. "lsr r7, r7, #16\n\t"
  6620. "mul r7, r6, r7\n\t"
  6621. "adds r4, r4, r7\n\t"
  6622. "adcs r5, r5, #0\n\t"
  6623. "mov r3, #0\n\t"
  6624. "adc r3, r3, #0\n\t"
  6625. "lsr r7, r8, #16\n\t"
  6626. "mul r6, r7, r6\n\t"
  6627. "lsr r7, r6, #16\n\t"
  6628. "lsl r6, r6, #16\n\t"
  6629. "adds r4, r4, r6\n\t"
  6630. "adcs r5, r5, r7\n\t"
  6631. "adc r3, r3, #0\n\t"
  6632. "lsr r6, %[b], #16\n\t"
  6633. "lsr r7, r8, #16\n\t"
  6634. "mul r7, r6, r7\n\t"
  6635. "adds r5, r5, r7\n\t"
  6636. "adc r3, r3, #0\n\t"
  6637. "lsl r7, r8, #16\n\t"
  6638. "lsr r7, r7, #16\n\t"
  6639. "mul r6, r7, r6\n\t"
  6640. "lsr r7, r6, #16\n\t"
  6641. "lsl r6, r6, #16\n\t"
  6642. "adds r4, r4, r6\n\t"
  6643. "adcs r5, r5, r7\n\t"
  6644. "adc r3, r3, #0\n\t"
  6645. #else
  6646. "umull r6, r7, %[b], r8\n\t"
  6647. "adds r4, r4, r6\n\t"
  6648. "adcs r5, r5, r7\n\t"
  6649. "mov r3, #0\n\t"
  6650. "adc r3, r3, #0\n\t"
  6651. #endif
  6652. "str r4, [%[r]], #4\n\t"
  6653. /* A[20] * B */
  6654. "ldr r8, [%[a]], #4\n\t"
  6655. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6656. "lsl r6, %[b], #16\n\t"
  6657. "lsl r7, r8, #16\n\t"
  6658. "lsr r6, r6, #16\n\t"
  6659. "lsr r7, r7, #16\n\t"
  6660. "mul r7, r6, r7\n\t"
  6661. "adds r5, r5, r7\n\t"
  6662. "adcs r3, r3, #0\n\t"
  6663. "mov r4, #0\n\t"
  6664. "adc r4, r4, #0\n\t"
  6665. "lsr r7, r8, #16\n\t"
  6666. "mul r6, r7, r6\n\t"
  6667. "lsr r7, r6, #16\n\t"
  6668. "lsl r6, r6, #16\n\t"
  6669. "adds r5, r5, r6\n\t"
  6670. "adcs r3, r3, r7\n\t"
  6671. "adc r4, r4, #0\n\t"
  6672. "lsr r6, %[b], #16\n\t"
  6673. "lsr r7, r8, #16\n\t"
  6674. "mul r7, r6, r7\n\t"
  6675. "adds r3, r3, r7\n\t"
  6676. "adc r4, r4, #0\n\t"
  6677. "lsl r7, r8, #16\n\t"
  6678. "lsr r7, r7, #16\n\t"
  6679. "mul r6, r7, r6\n\t"
  6680. "lsr r7, r6, #16\n\t"
  6681. "lsl r6, r6, #16\n\t"
  6682. "adds r5, r5, r6\n\t"
  6683. "adcs r3, r3, r7\n\t"
  6684. "adc r4, r4, #0\n\t"
  6685. #else
  6686. "umull r6, r7, %[b], r8\n\t"
  6687. "adds r5, r5, r6\n\t"
  6688. "adcs r3, r3, r7\n\t"
  6689. "mov r4, #0\n\t"
  6690. "adc r4, r4, #0\n\t"
  6691. #endif
  6692. "str r5, [%[r]], #4\n\t"
  6693. /* A[21] * B */
  6694. "ldr r8, [%[a]], #4\n\t"
  6695. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6696. "lsl r6, %[b], #16\n\t"
  6697. "lsl r7, r8, #16\n\t"
  6698. "lsr r6, r6, #16\n\t"
  6699. "lsr r7, r7, #16\n\t"
  6700. "mul r7, r6, r7\n\t"
  6701. "adds r3, r3, r7\n\t"
  6702. "adcs r4, r4, #0\n\t"
  6703. "mov r5, #0\n\t"
  6704. "adc r5, r5, #0\n\t"
  6705. "lsr r7, r8, #16\n\t"
  6706. "mul r6, r7, r6\n\t"
  6707. "lsr r7, r6, #16\n\t"
  6708. "lsl r6, r6, #16\n\t"
  6709. "adds r3, r3, r6\n\t"
  6710. "adcs r4, r4, r7\n\t"
  6711. "adc r5, r5, #0\n\t"
  6712. "lsr r6, %[b], #16\n\t"
  6713. "lsr r7, r8, #16\n\t"
  6714. "mul r7, r6, r7\n\t"
  6715. "adds r4, r4, r7\n\t"
  6716. "adc r5, r5, #0\n\t"
  6717. "lsl r7, r8, #16\n\t"
  6718. "lsr r7, r7, #16\n\t"
  6719. "mul r6, r7, r6\n\t"
  6720. "lsr r7, r6, #16\n\t"
  6721. "lsl r6, r6, #16\n\t"
  6722. "adds r3, r3, r6\n\t"
  6723. "adcs r4, r4, r7\n\t"
  6724. "adc r5, r5, #0\n\t"
  6725. #else
  6726. "umull r6, r7, %[b], r8\n\t"
  6727. "adds r3, r3, r6\n\t"
  6728. "adcs r4, r4, r7\n\t"
  6729. "mov r5, #0\n\t"
  6730. "adc r5, r5, #0\n\t"
  6731. #endif
  6732. "str r3, [%[r]], #4\n\t"
  6733. /* A[22] * B */
  6734. "ldr r8, [%[a]], #4\n\t"
  6735. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6736. "lsl r6, %[b], #16\n\t"
  6737. "lsl r7, r8, #16\n\t"
  6738. "lsr r6, r6, #16\n\t"
  6739. "lsr r7, r7, #16\n\t"
  6740. "mul r7, r6, r7\n\t"
  6741. "adds r4, r4, r7\n\t"
  6742. "adcs r5, r5, #0\n\t"
  6743. "mov r3, #0\n\t"
  6744. "adc r3, r3, #0\n\t"
  6745. "lsr r7, r8, #16\n\t"
  6746. "mul r6, r7, r6\n\t"
  6747. "lsr r7, r6, #16\n\t"
  6748. "lsl r6, r6, #16\n\t"
  6749. "adds r4, r4, r6\n\t"
  6750. "adcs r5, r5, r7\n\t"
  6751. "adc r3, r3, #0\n\t"
  6752. "lsr r6, %[b], #16\n\t"
  6753. "lsr r7, r8, #16\n\t"
  6754. "mul r7, r6, r7\n\t"
  6755. "adds r5, r5, r7\n\t"
  6756. "adc r3, r3, #0\n\t"
  6757. "lsl r7, r8, #16\n\t"
  6758. "lsr r7, r7, #16\n\t"
  6759. "mul r6, r7, r6\n\t"
  6760. "lsr r7, r6, #16\n\t"
  6761. "lsl r6, r6, #16\n\t"
  6762. "adds r4, r4, r6\n\t"
  6763. "adcs r5, r5, r7\n\t"
  6764. "adc r3, r3, #0\n\t"
  6765. #else
  6766. "umull r6, r7, %[b], r8\n\t"
  6767. "adds r4, r4, r6\n\t"
  6768. "adcs r5, r5, r7\n\t"
  6769. "mov r3, #0\n\t"
  6770. "adc r3, r3, #0\n\t"
  6771. #endif
  6772. "str r4, [%[r]], #4\n\t"
  6773. /* A[23] * B */
  6774. "ldr r8, [%[a]], #4\n\t"
  6775. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6776. "lsl r6, %[b], #16\n\t"
  6777. "lsl r7, r8, #16\n\t"
  6778. "lsr r6, r6, #16\n\t"
  6779. "lsr r7, r7, #16\n\t"
  6780. "mul r7, r6, r7\n\t"
  6781. "adds r5, r5, r7\n\t"
  6782. "adcs r3, r3, #0\n\t"
  6783. "mov r4, #0\n\t"
  6784. "adc r4, r4, #0\n\t"
  6785. "lsr r7, r8, #16\n\t"
  6786. "mul r6, r7, r6\n\t"
  6787. "lsr r7, r6, #16\n\t"
  6788. "lsl r6, r6, #16\n\t"
  6789. "adds r5, r5, r6\n\t"
  6790. "adcs r3, r3, r7\n\t"
  6791. "adc r4, r4, #0\n\t"
  6792. "lsr r6, %[b], #16\n\t"
  6793. "lsr r7, r8, #16\n\t"
  6794. "mul r7, r6, r7\n\t"
  6795. "adds r3, r3, r7\n\t"
  6796. "adc r4, r4, #0\n\t"
  6797. "lsl r7, r8, #16\n\t"
  6798. "lsr r7, r7, #16\n\t"
  6799. "mul r6, r7, r6\n\t"
  6800. "lsr r7, r6, #16\n\t"
  6801. "lsl r6, r6, #16\n\t"
  6802. "adds r5, r5, r6\n\t"
  6803. "adcs r3, r3, r7\n\t"
  6804. "adc r4, r4, #0\n\t"
  6805. #else
  6806. "umull r6, r7, %[b], r8\n\t"
  6807. "adds r5, r5, r6\n\t"
  6808. "adcs r3, r3, r7\n\t"
  6809. "mov r4, #0\n\t"
  6810. "adc r4, r4, #0\n\t"
  6811. #endif
  6812. "str r5, [%[r]], #4\n\t"
  6813. /* A[24] * B */
  6814. "ldr r8, [%[a]], #4\n\t"
  6815. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6816. "lsl r6, %[b], #16\n\t"
  6817. "lsl r7, r8, #16\n\t"
  6818. "lsr r6, r6, #16\n\t"
  6819. "lsr r7, r7, #16\n\t"
  6820. "mul r7, r6, r7\n\t"
  6821. "adds r3, r3, r7\n\t"
  6822. "adcs r4, r4, #0\n\t"
  6823. "mov r5, #0\n\t"
  6824. "adc r5, r5, #0\n\t"
  6825. "lsr r7, r8, #16\n\t"
  6826. "mul r6, r7, r6\n\t"
  6827. "lsr r7, r6, #16\n\t"
  6828. "lsl r6, r6, #16\n\t"
  6829. "adds r3, r3, r6\n\t"
  6830. "adcs r4, r4, r7\n\t"
  6831. "adc r5, r5, #0\n\t"
  6832. "lsr r6, %[b], #16\n\t"
  6833. "lsr r7, r8, #16\n\t"
  6834. "mul r7, r6, r7\n\t"
  6835. "adds r4, r4, r7\n\t"
  6836. "adc r5, r5, #0\n\t"
  6837. "lsl r7, r8, #16\n\t"
  6838. "lsr r7, r7, #16\n\t"
  6839. "mul r6, r7, r6\n\t"
  6840. "lsr r7, r6, #16\n\t"
  6841. "lsl r6, r6, #16\n\t"
  6842. "adds r3, r3, r6\n\t"
  6843. "adcs r4, r4, r7\n\t"
  6844. "adc r5, r5, #0\n\t"
  6845. #else
  6846. "umull r6, r7, %[b], r8\n\t"
  6847. "adds r3, r3, r6\n\t"
  6848. "adcs r4, r4, r7\n\t"
  6849. "mov r5, #0\n\t"
  6850. "adc r5, r5, #0\n\t"
  6851. #endif
  6852. "str r3, [%[r]], #4\n\t"
  6853. /* A[25] * B */
  6854. "ldr r8, [%[a]], #4\n\t"
  6855. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6856. "lsl r6, %[b], #16\n\t"
  6857. "lsl r7, r8, #16\n\t"
  6858. "lsr r6, r6, #16\n\t"
  6859. "lsr r7, r7, #16\n\t"
  6860. "mul r7, r6, r7\n\t"
  6861. "adds r4, r4, r7\n\t"
  6862. "adcs r5, r5, #0\n\t"
  6863. "mov r3, #0\n\t"
  6864. "adc r3, r3, #0\n\t"
  6865. "lsr r7, r8, #16\n\t"
  6866. "mul r6, r7, r6\n\t"
  6867. "lsr r7, r6, #16\n\t"
  6868. "lsl r6, r6, #16\n\t"
  6869. "adds r4, r4, r6\n\t"
  6870. "adcs r5, r5, r7\n\t"
  6871. "adc r3, r3, #0\n\t"
  6872. "lsr r6, %[b], #16\n\t"
  6873. "lsr r7, r8, #16\n\t"
  6874. "mul r7, r6, r7\n\t"
  6875. "adds r5, r5, r7\n\t"
  6876. "adc r3, r3, #0\n\t"
  6877. "lsl r7, r8, #16\n\t"
  6878. "lsr r7, r7, #16\n\t"
  6879. "mul r6, r7, r6\n\t"
  6880. "lsr r7, r6, #16\n\t"
  6881. "lsl r6, r6, #16\n\t"
  6882. "adds r4, r4, r6\n\t"
  6883. "adcs r5, r5, r7\n\t"
  6884. "adc r3, r3, #0\n\t"
  6885. #else
  6886. "umull r6, r7, %[b], r8\n\t"
  6887. "adds r4, r4, r6\n\t"
  6888. "adcs r5, r5, r7\n\t"
  6889. "mov r3, #0\n\t"
  6890. "adc r3, r3, #0\n\t"
  6891. #endif
  6892. "str r4, [%[r]], #4\n\t"
  6893. /* A[26] * B */
  6894. "ldr r8, [%[a]], #4\n\t"
  6895. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6896. "lsl r6, %[b], #16\n\t"
  6897. "lsl r7, r8, #16\n\t"
  6898. "lsr r6, r6, #16\n\t"
  6899. "lsr r7, r7, #16\n\t"
  6900. "mul r7, r6, r7\n\t"
  6901. "adds r5, r5, r7\n\t"
  6902. "adcs r3, r3, #0\n\t"
  6903. "mov r4, #0\n\t"
  6904. "adc r4, r4, #0\n\t"
  6905. "lsr r7, r8, #16\n\t"
  6906. "mul r6, r7, r6\n\t"
  6907. "lsr r7, r6, #16\n\t"
  6908. "lsl r6, r6, #16\n\t"
  6909. "adds r5, r5, r6\n\t"
  6910. "adcs r3, r3, r7\n\t"
  6911. "adc r4, r4, #0\n\t"
  6912. "lsr r6, %[b], #16\n\t"
  6913. "lsr r7, r8, #16\n\t"
  6914. "mul r7, r6, r7\n\t"
  6915. "adds r3, r3, r7\n\t"
  6916. "adc r4, r4, #0\n\t"
  6917. "lsl r7, r8, #16\n\t"
  6918. "lsr r7, r7, #16\n\t"
  6919. "mul r6, r7, r6\n\t"
  6920. "lsr r7, r6, #16\n\t"
  6921. "lsl r6, r6, #16\n\t"
  6922. "adds r5, r5, r6\n\t"
  6923. "adcs r3, r3, r7\n\t"
  6924. "adc r4, r4, #0\n\t"
  6925. #else
  6926. "umull r6, r7, %[b], r8\n\t"
  6927. "adds r5, r5, r6\n\t"
  6928. "adcs r3, r3, r7\n\t"
  6929. "mov r4, #0\n\t"
  6930. "adc r4, r4, #0\n\t"
  6931. #endif
  6932. "str r5, [%[r]], #4\n\t"
  6933. /* A[27] * B */
  6934. "ldr r8, [%[a]], #4\n\t"
  6935. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6936. "lsl r6, %[b], #16\n\t"
  6937. "lsl r7, r8, #16\n\t"
  6938. "lsr r6, r6, #16\n\t"
  6939. "lsr r7, r7, #16\n\t"
  6940. "mul r7, r6, r7\n\t"
  6941. "adds r3, r3, r7\n\t"
  6942. "adcs r4, r4, #0\n\t"
  6943. "mov r5, #0\n\t"
  6944. "adc r5, r5, #0\n\t"
  6945. "lsr r7, r8, #16\n\t"
  6946. "mul r6, r7, r6\n\t"
  6947. "lsr r7, r6, #16\n\t"
  6948. "lsl r6, r6, #16\n\t"
  6949. "adds r3, r3, r6\n\t"
  6950. "adcs r4, r4, r7\n\t"
  6951. "adc r5, r5, #0\n\t"
  6952. "lsr r6, %[b], #16\n\t"
  6953. "lsr r7, r8, #16\n\t"
  6954. "mul r7, r6, r7\n\t"
  6955. "adds r4, r4, r7\n\t"
  6956. "adc r5, r5, #0\n\t"
  6957. "lsl r7, r8, #16\n\t"
  6958. "lsr r7, r7, #16\n\t"
  6959. "mul r6, r7, r6\n\t"
  6960. "lsr r7, r6, #16\n\t"
  6961. "lsl r6, r6, #16\n\t"
  6962. "adds r3, r3, r6\n\t"
  6963. "adcs r4, r4, r7\n\t"
  6964. "adc r5, r5, #0\n\t"
  6965. #else
  6966. "umull r6, r7, %[b], r8\n\t"
  6967. "adds r3, r3, r6\n\t"
  6968. "adcs r4, r4, r7\n\t"
  6969. "mov r5, #0\n\t"
  6970. "adc r5, r5, #0\n\t"
  6971. #endif
  6972. "str r3, [%[r]], #4\n\t"
  6973. /* A[28] * B */
  6974. "ldr r8, [%[a]], #4\n\t"
  6975. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  6976. "lsl r6, %[b], #16\n\t"
  6977. "lsl r7, r8, #16\n\t"
  6978. "lsr r6, r6, #16\n\t"
  6979. "lsr r7, r7, #16\n\t"
  6980. "mul r7, r6, r7\n\t"
  6981. "adds r4, r4, r7\n\t"
  6982. "adcs r5, r5, #0\n\t"
  6983. "mov r3, #0\n\t"
  6984. "adc r3, r3, #0\n\t"
  6985. "lsr r7, r8, #16\n\t"
  6986. "mul r6, r7, r6\n\t"
  6987. "lsr r7, r6, #16\n\t"
  6988. "lsl r6, r6, #16\n\t"
  6989. "adds r4, r4, r6\n\t"
  6990. "adcs r5, r5, r7\n\t"
  6991. "adc r3, r3, #0\n\t"
  6992. "lsr r6, %[b], #16\n\t"
  6993. "lsr r7, r8, #16\n\t"
  6994. "mul r7, r6, r7\n\t"
  6995. "adds r5, r5, r7\n\t"
  6996. "adc r3, r3, #0\n\t"
  6997. "lsl r7, r8, #16\n\t"
  6998. "lsr r7, r7, #16\n\t"
  6999. "mul r6, r7, r6\n\t"
  7000. "lsr r7, r6, #16\n\t"
  7001. "lsl r6, r6, #16\n\t"
  7002. "adds r4, r4, r6\n\t"
  7003. "adcs r5, r5, r7\n\t"
  7004. "adc r3, r3, #0\n\t"
  7005. #else
  7006. "umull r6, r7, %[b], r8\n\t"
  7007. "adds r4, r4, r6\n\t"
  7008. "adcs r5, r5, r7\n\t"
  7009. "mov r3, #0\n\t"
  7010. "adc r3, r3, #0\n\t"
  7011. #endif
  7012. "str r4, [%[r]], #4\n\t"
  7013. /* A[29] * B */
  7014. "ldr r8, [%[a]], #4\n\t"
  7015. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7016. "lsl r6, %[b], #16\n\t"
  7017. "lsl r7, r8, #16\n\t"
  7018. "lsr r6, r6, #16\n\t"
  7019. "lsr r7, r7, #16\n\t"
  7020. "mul r7, r6, r7\n\t"
  7021. "adds r5, r5, r7\n\t"
  7022. "adcs r3, r3, #0\n\t"
  7023. "mov r4, #0\n\t"
  7024. "adc r4, r4, #0\n\t"
  7025. "lsr r7, r8, #16\n\t"
  7026. "mul r6, r7, r6\n\t"
  7027. "lsr r7, r6, #16\n\t"
  7028. "lsl r6, r6, #16\n\t"
  7029. "adds r5, r5, r6\n\t"
  7030. "adcs r3, r3, r7\n\t"
  7031. "adc r4, r4, #0\n\t"
  7032. "lsr r6, %[b], #16\n\t"
  7033. "lsr r7, r8, #16\n\t"
  7034. "mul r7, r6, r7\n\t"
  7035. "adds r3, r3, r7\n\t"
  7036. "adc r4, r4, #0\n\t"
  7037. "lsl r7, r8, #16\n\t"
  7038. "lsr r7, r7, #16\n\t"
  7039. "mul r6, r7, r6\n\t"
  7040. "lsr r7, r6, #16\n\t"
  7041. "lsl r6, r6, #16\n\t"
  7042. "adds r5, r5, r6\n\t"
  7043. "adcs r3, r3, r7\n\t"
  7044. "adc r4, r4, #0\n\t"
  7045. #else
  7046. "umull r6, r7, %[b], r8\n\t"
  7047. "adds r5, r5, r6\n\t"
  7048. "adcs r3, r3, r7\n\t"
  7049. "mov r4, #0\n\t"
  7050. "adc r4, r4, #0\n\t"
  7051. #endif
  7052. "str r5, [%[r]], #4\n\t"
  7053. /* A[30] * B */
  7054. "ldr r8, [%[a]], #4\n\t"
  7055. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7056. "lsl r6, %[b], #16\n\t"
  7057. "lsl r7, r8, #16\n\t"
  7058. "lsr r6, r6, #16\n\t"
  7059. "lsr r7, r7, #16\n\t"
  7060. "mul r7, r6, r7\n\t"
  7061. "adds r3, r3, r7\n\t"
  7062. "adcs r4, r4, #0\n\t"
  7063. "mov r5, #0\n\t"
  7064. "adc r5, r5, #0\n\t"
  7065. "lsr r7, r8, #16\n\t"
  7066. "mul r6, r7, r6\n\t"
  7067. "lsr r7, r6, #16\n\t"
  7068. "lsl r6, r6, #16\n\t"
  7069. "adds r3, r3, r6\n\t"
  7070. "adcs r4, r4, r7\n\t"
  7071. "adc r5, r5, #0\n\t"
  7072. "lsr r6, %[b], #16\n\t"
  7073. "lsr r7, r8, #16\n\t"
  7074. "mul r7, r6, r7\n\t"
  7075. "adds r4, r4, r7\n\t"
  7076. "adc r5, r5, #0\n\t"
  7077. "lsl r7, r8, #16\n\t"
  7078. "lsr r7, r7, #16\n\t"
  7079. "mul r6, r7, r6\n\t"
  7080. "lsr r7, r6, #16\n\t"
  7081. "lsl r6, r6, #16\n\t"
  7082. "adds r3, r3, r6\n\t"
  7083. "adcs r4, r4, r7\n\t"
  7084. "adc r5, r5, #0\n\t"
  7085. #else
  7086. "umull r6, r7, %[b], r8\n\t"
  7087. "adds r3, r3, r6\n\t"
  7088. "adcs r4, r4, r7\n\t"
  7089. "mov r5, #0\n\t"
  7090. "adc r5, r5, #0\n\t"
  7091. #endif
  7092. "str r3, [%[r]], #4\n\t"
  7093. /* A[31] * B */
  7094. "ldr r8, [%[a]], #4\n\t"
  7095. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7096. "lsl r6, %[b], #16\n\t"
  7097. "lsl r7, r8, #16\n\t"
  7098. "lsr r6, r6, #16\n\t"
  7099. "lsr r7, r7, #16\n\t"
  7100. "mul r7, r6, r7\n\t"
  7101. "adds r4, r4, r7\n\t"
  7102. "adcs r5, r5, #0\n\t"
  7103. "mov r3, #0\n\t"
  7104. "adc r3, r3, #0\n\t"
  7105. "lsr r7, r8, #16\n\t"
  7106. "mul r6, r7, r6\n\t"
  7107. "lsr r7, r6, #16\n\t"
  7108. "lsl r6, r6, #16\n\t"
  7109. "adds r4, r4, r6\n\t"
  7110. "adcs r5, r5, r7\n\t"
  7111. "adc r3, r3, #0\n\t"
  7112. "lsr r6, %[b], #16\n\t"
  7113. "lsr r7, r8, #16\n\t"
  7114. "mul r7, r6, r7\n\t"
  7115. "adds r5, r5, r7\n\t"
  7116. "adc r3, r3, #0\n\t"
  7117. "lsl r7, r8, #16\n\t"
  7118. "lsr r7, r7, #16\n\t"
  7119. "mul r6, r7, r6\n\t"
  7120. "lsr r7, r6, #16\n\t"
  7121. "lsl r6, r6, #16\n\t"
  7122. "adds r4, r4, r6\n\t"
  7123. "adcs r5, r5, r7\n\t"
  7124. "adc r3, r3, #0\n\t"
  7125. #else
  7126. "umull r6, r7, %[b], r8\n\t"
  7127. "adds r4, r4, r6\n\t"
  7128. "adcs r5, r5, r7\n\t"
  7129. "mov r3, #0\n\t"
  7130. "adc r3, r3, #0\n\t"
  7131. #endif
  7132. "str r4, [%[r]], #4\n\t"
  7133. /* A[32] * B */
  7134. "ldr r8, [%[a]], #4\n\t"
  7135. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7136. "lsl r6, %[b], #16\n\t"
  7137. "lsl r7, r8, #16\n\t"
  7138. "lsr r6, r6, #16\n\t"
  7139. "lsr r7, r7, #16\n\t"
  7140. "mul r7, r6, r7\n\t"
  7141. "adds r5, r5, r7\n\t"
  7142. "adcs r3, r3, #0\n\t"
  7143. "mov r4, #0\n\t"
  7144. "adc r4, r4, #0\n\t"
  7145. "lsr r7, r8, #16\n\t"
  7146. "mul r6, r7, r6\n\t"
  7147. "lsr r7, r6, #16\n\t"
  7148. "lsl r6, r6, #16\n\t"
  7149. "adds r5, r5, r6\n\t"
  7150. "adcs r3, r3, r7\n\t"
  7151. "adc r4, r4, #0\n\t"
  7152. "lsr r6, %[b], #16\n\t"
  7153. "lsr r7, r8, #16\n\t"
  7154. "mul r7, r6, r7\n\t"
  7155. "adds r3, r3, r7\n\t"
  7156. "adc r4, r4, #0\n\t"
  7157. "lsl r7, r8, #16\n\t"
  7158. "lsr r7, r7, #16\n\t"
  7159. "mul r6, r7, r6\n\t"
  7160. "lsr r7, r6, #16\n\t"
  7161. "lsl r6, r6, #16\n\t"
  7162. "adds r5, r5, r6\n\t"
  7163. "adcs r3, r3, r7\n\t"
  7164. "adc r4, r4, #0\n\t"
  7165. #else
  7166. "umull r6, r7, %[b], r8\n\t"
  7167. "adds r5, r5, r6\n\t"
  7168. "adcs r3, r3, r7\n\t"
  7169. "mov r4, #0\n\t"
  7170. "adc r4, r4, #0\n\t"
  7171. #endif
  7172. "str r5, [%[r]], #4\n\t"
  7173. /* A[33] * B */
  7174. "ldr r8, [%[a]], #4\n\t"
  7175. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7176. "lsl r6, %[b], #16\n\t"
  7177. "lsl r7, r8, #16\n\t"
  7178. "lsr r6, r6, #16\n\t"
  7179. "lsr r7, r7, #16\n\t"
  7180. "mul r7, r6, r7\n\t"
  7181. "adds r3, r3, r7\n\t"
  7182. "adcs r4, r4, #0\n\t"
  7183. "mov r5, #0\n\t"
  7184. "adc r5, r5, #0\n\t"
  7185. "lsr r7, r8, #16\n\t"
  7186. "mul r6, r7, r6\n\t"
  7187. "lsr r7, r6, #16\n\t"
  7188. "lsl r6, r6, #16\n\t"
  7189. "adds r3, r3, r6\n\t"
  7190. "adcs r4, r4, r7\n\t"
  7191. "adc r5, r5, #0\n\t"
  7192. "lsr r6, %[b], #16\n\t"
  7193. "lsr r7, r8, #16\n\t"
  7194. "mul r7, r6, r7\n\t"
  7195. "adds r4, r4, r7\n\t"
  7196. "adc r5, r5, #0\n\t"
  7197. "lsl r7, r8, #16\n\t"
  7198. "lsr r7, r7, #16\n\t"
  7199. "mul r6, r7, r6\n\t"
  7200. "lsr r7, r6, #16\n\t"
  7201. "lsl r6, r6, #16\n\t"
  7202. "adds r3, r3, r6\n\t"
  7203. "adcs r4, r4, r7\n\t"
  7204. "adc r5, r5, #0\n\t"
  7205. #else
  7206. "umull r6, r7, %[b], r8\n\t"
  7207. "adds r3, r3, r6\n\t"
  7208. "adcs r4, r4, r7\n\t"
  7209. "mov r5, #0\n\t"
  7210. "adc r5, r5, #0\n\t"
  7211. #endif
  7212. "str r3, [%[r]], #4\n\t"
  7213. /* A[34] * B */
  7214. "ldr r8, [%[a]], #4\n\t"
  7215. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7216. "lsl r6, %[b], #16\n\t"
  7217. "lsl r7, r8, #16\n\t"
  7218. "lsr r6, r6, #16\n\t"
  7219. "lsr r7, r7, #16\n\t"
  7220. "mul r7, r6, r7\n\t"
  7221. "adds r4, r4, r7\n\t"
  7222. "adcs r5, r5, #0\n\t"
  7223. "mov r3, #0\n\t"
  7224. "adc r3, r3, #0\n\t"
  7225. "lsr r7, r8, #16\n\t"
  7226. "mul r6, r7, r6\n\t"
  7227. "lsr r7, r6, #16\n\t"
  7228. "lsl r6, r6, #16\n\t"
  7229. "adds r4, r4, r6\n\t"
  7230. "adcs r5, r5, r7\n\t"
  7231. "adc r3, r3, #0\n\t"
  7232. "lsr r6, %[b], #16\n\t"
  7233. "lsr r7, r8, #16\n\t"
  7234. "mul r7, r6, r7\n\t"
  7235. "adds r5, r5, r7\n\t"
  7236. "adc r3, r3, #0\n\t"
  7237. "lsl r7, r8, #16\n\t"
  7238. "lsr r7, r7, #16\n\t"
  7239. "mul r6, r7, r6\n\t"
  7240. "lsr r7, r6, #16\n\t"
  7241. "lsl r6, r6, #16\n\t"
  7242. "adds r4, r4, r6\n\t"
  7243. "adcs r5, r5, r7\n\t"
  7244. "adc r3, r3, #0\n\t"
  7245. #else
  7246. "umull r6, r7, %[b], r8\n\t"
  7247. "adds r4, r4, r6\n\t"
  7248. "adcs r5, r5, r7\n\t"
  7249. "mov r3, #0\n\t"
  7250. "adc r3, r3, #0\n\t"
  7251. #endif
  7252. "str r4, [%[r]], #4\n\t"
  7253. /* A[35] * B */
  7254. "ldr r8, [%[a]], #4\n\t"
  7255. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7256. "lsl r6, %[b], #16\n\t"
  7257. "lsl r7, r8, #16\n\t"
  7258. "lsr r6, r6, #16\n\t"
  7259. "lsr r7, r7, #16\n\t"
  7260. "mul r7, r6, r7\n\t"
  7261. "adds r5, r5, r7\n\t"
  7262. "adcs r3, r3, #0\n\t"
  7263. "mov r4, #0\n\t"
  7264. "adc r4, r4, #0\n\t"
  7265. "lsr r7, r8, #16\n\t"
  7266. "mul r6, r7, r6\n\t"
  7267. "lsr r7, r6, #16\n\t"
  7268. "lsl r6, r6, #16\n\t"
  7269. "adds r5, r5, r6\n\t"
  7270. "adcs r3, r3, r7\n\t"
  7271. "adc r4, r4, #0\n\t"
  7272. "lsr r6, %[b], #16\n\t"
  7273. "lsr r7, r8, #16\n\t"
  7274. "mul r7, r6, r7\n\t"
  7275. "adds r3, r3, r7\n\t"
  7276. "adc r4, r4, #0\n\t"
  7277. "lsl r7, r8, #16\n\t"
  7278. "lsr r7, r7, #16\n\t"
  7279. "mul r6, r7, r6\n\t"
  7280. "lsr r7, r6, #16\n\t"
  7281. "lsl r6, r6, #16\n\t"
  7282. "adds r5, r5, r6\n\t"
  7283. "adcs r3, r3, r7\n\t"
  7284. "adc r4, r4, #0\n\t"
  7285. #else
  7286. "umull r6, r7, %[b], r8\n\t"
  7287. "adds r5, r5, r6\n\t"
  7288. "adcs r3, r3, r7\n\t"
  7289. "mov r4, #0\n\t"
  7290. "adc r4, r4, #0\n\t"
  7291. #endif
  7292. "str r5, [%[r]], #4\n\t"
  7293. /* A[36] * B */
  7294. "ldr r8, [%[a]], #4\n\t"
  7295. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7296. "lsl r6, %[b], #16\n\t"
  7297. "lsl r7, r8, #16\n\t"
  7298. "lsr r6, r6, #16\n\t"
  7299. "lsr r7, r7, #16\n\t"
  7300. "mul r7, r6, r7\n\t"
  7301. "adds r3, r3, r7\n\t"
  7302. "adcs r4, r4, #0\n\t"
  7303. "mov r5, #0\n\t"
  7304. "adc r5, r5, #0\n\t"
  7305. "lsr r7, r8, #16\n\t"
  7306. "mul r6, r7, r6\n\t"
  7307. "lsr r7, r6, #16\n\t"
  7308. "lsl r6, r6, #16\n\t"
  7309. "adds r3, r3, r6\n\t"
  7310. "adcs r4, r4, r7\n\t"
  7311. "adc r5, r5, #0\n\t"
  7312. "lsr r6, %[b], #16\n\t"
  7313. "lsr r7, r8, #16\n\t"
  7314. "mul r7, r6, r7\n\t"
  7315. "adds r4, r4, r7\n\t"
  7316. "adc r5, r5, #0\n\t"
  7317. "lsl r7, r8, #16\n\t"
  7318. "lsr r7, r7, #16\n\t"
  7319. "mul r6, r7, r6\n\t"
  7320. "lsr r7, r6, #16\n\t"
  7321. "lsl r6, r6, #16\n\t"
  7322. "adds r3, r3, r6\n\t"
  7323. "adcs r4, r4, r7\n\t"
  7324. "adc r5, r5, #0\n\t"
  7325. #else
  7326. "umull r6, r7, %[b], r8\n\t"
  7327. "adds r3, r3, r6\n\t"
  7328. "adcs r4, r4, r7\n\t"
  7329. "mov r5, #0\n\t"
  7330. "adc r5, r5, #0\n\t"
  7331. #endif
  7332. "str r3, [%[r]], #4\n\t"
  7333. /* A[37] * B */
  7334. "ldr r8, [%[a]], #4\n\t"
  7335. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7336. "lsl r6, %[b], #16\n\t"
  7337. "lsl r7, r8, #16\n\t"
  7338. "lsr r6, r6, #16\n\t"
  7339. "lsr r7, r7, #16\n\t"
  7340. "mul r7, r6, r7\n\t"
  7341. "adds r4, r4, r7\n\t"
  7342. "adcs r5, r5, #0\n\t"
  7343. "mov r3, #0\n\t"
  7344. "adc r3, r3, #0\n\t"
  7345. "lsr r7, r8, #16\n\t"
  7346. "mul r6, r7, r6\n\t"
  7347. "lsr r7, r6, #16\n\t"
  7348. "lsl r6, r6, #16\n\t"
  7349. "adds r4, r4, r6\n\t"
  7350. "adcs r5, r5, r7\n\t"
  7351. "adc r3, r3, #0\n\t"
  7352. "lsr r6, %[b], #16\n\t"
  7353. "lsr r7, r8, #16\n\t"
  7354. "mul r7, r6, r7\n\t"
  7355. "adds r5, r5, r7\n\t"
  7356. "adc r3, r3, #0\n\t"
  7357. "lsl r7, r8, #16\n\t"
  7358. "lsr r7, r7, #16\n\t"
  7359. "mul r6, r7, r6\n\t"
  7360. "lsr r7, r6, #16\n\t"
  7361. "lsl r6, r6, #16\n\t"
  7362. "adds r4, r4, r6\n\t"
  7363. "adcs r5, r5, r7\n\t"
  7364. "adc r3, r3, #0\n\t"
  7365. #else
  7366. "umull r6, r7, %[b], r8\n\t"
  7367. "adds r4, r4, r6\n\t"
  7368. "adcs r5, r5, r7\n\t"
  7369. "mov r3, #0\n\t"
  7370. "adc r3, r3, #0\n\t"
  7371. #endif
  7372. "str r4, [%[r]], #4\n\t"
  7373. /* A[38] * B */
  7374. "ldr r8, [%[a]], #4\n\t"
  7375. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7376. "lsl r6, %[b], #16\n\t"
  7377. "lsl r7, r8, #16\n\t"
  7378. "lsr r6, r6, #16\n\t"
  7379. "lsr r7, r7, #16\n\t"
  7380. "mul r7, r6, r7\n\t"
  7381. "adds r5, r5, r7\n\t"
  7382. "adcs r3, r3, #0\n\t"
  7383. "mov r4, #0\n\t"
  7384. "adc r4, r4, #0\n\t"
  7385. "lsr r7, r8, #16\n\t"
  7386. "mul r6, r7, r6\n\t"
  7387. "lsr r7, r6, #16\n\t"
  7388. "lsl r6, r6, #16\n\t"
  7389. "adds r5, r5, r6\n\t"
  7390. "adcs r3, r3, r7\n\t"
  7391. "adc r4, r4, #0\n\t"
  7392. "lsr r6, %[b], #16\n\t"
  7393. "lsr r7, r8, #16\n\t"
  7394. "mul r7, r6, r7\n\t"
  7395. "adds r3, r3, r7\n\t"
  7396. "adc r4, r4, #0\n\t"
  7397. "lsl r7, r8, #16\n\t"
  7398. "lsr r7, r7, #16\n\t"
  7399. "mul r6, r7, r6\n\t"
  7400. "lsr r7, r6, #16\n\t"
  7401. "lsl r6, r6, #16\n\t"
  7402. "adds r5, r5, r6\n\t"
  7403. "adcs r3, r3, r7\n\t"
  7404. "adc r4, r4, #0\n\t"
  7405. #else
  7406. "umull r6, r7, %[b], r8\n\t"
  7407. "adds r5, r5, r6\n\t"
  7408. "adcs r3, r3, r7\n\t"
  7409. "mov r4, #0\n\t"
  7410. "adc r4, r4, #0\n\t"
  7411. #endif
  7412. "str r5, [%[r]], #4\n\t"
  7413. /* A[39] * B */
  7414. "ldr r8, [%[a]], #4\n\t"
  7415. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7416. "lsl r6, %[b], #16\n\t"
  7417. "lsl r7, r8, #16\n\t"
  7418. "lsr r6, r6, #16\n\t"
  7419. "lsr r7, r7, #16\n\t"
  7420. "mul r7, r6, r7\n\t"
  7421. "adds r3, r3, r7\n\t"
  7422. "adcs r4, r4, #0\n\t"
  7423. "mov r5, #0\n\t"
  7424. "adc r5, r5, #0\n\t"
  7425. "lsr r7, r8, #16\n\t"
  7426. "mul r6, r7, r6\n\t"
  7427. "lsr r7, r6, #16\n\t"
  7428. "lsl r6, r6, #16\n\t"
  7429. "adds r3, r3, r6\n\t"
  7430. "adcs r4, r4, r7\n\t"
  7431. "adc r5, r5, #0\n\t"
  7432. "lsr r6, %[b], #16\n\t"
  7433. "lsr r7, r8, #16\n\t"
  7434. "mul r7, r6, r7\n\t"
  7435. "adds r4, r4, r7\n\t"
  7436. "adc r5, r5, #0\n\t"
  7437. "lsl r7, r8, #16\n\t"
  7438. "lsr r7, r7, #16\n\t"
  7439. "mul r6, r7, r6\n\t"
  7440. "lsr r7, r6, #16\n\t"
  7441. "lsl r6, r6, #16\n\t"
  7442. "adds r3, r3, r6\n\t"
  7443. "adcs r4, r4, r7\n\t"
  7444. "adc r5, r5, #0\n\t"
  7445. #else
  7446. "umull r6, r7, %[b], r8\n\t"
  7447. "adds r3, r3, r6\n\t"
  7448. "adcs r4, r4, r7\n\t"
  7449. "mov r5, #0\n\t"
  7450. "adc r5, r5, #0\n\t"
  7451. #endif
  7452. "str r3, [%[r]], #4\n\t"
  7453. /* A[40] * B */
  7454. "ldr r8, [%[a]], #4\n\t"
  7455. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7456. "lsl r6, %[b], #16\n\t"
  7457. "lsl r7, r8, #16\n\t"
  7458. "lsr r6, r6, #16\n\t"
  7459. "lsr r7, r7, #16\n\t"
  7460. "mul r7, r6, r7\n\t"
  7461. "adds r4, r4, r7\n\t"
  7462. "adcs r5, r5, #0\n\t"
  7463. "mov r3, #0\n\t"
  7464. "adc r3, r3, #0\n\t"
  7465. "lsr r7, r8, #16\n\t"
  7466. "mul r6, r7, r6\n\t"
  7467. "lsr r7, r6, #16\n\t"
  7468. "lsl r6, r6, #16\n\t"
  7469. "adds r4, r4, r6\n\t"
  7470. "adcs r5, r5, r7\n\t"
  7471. "adc r3, r3, #0\n\t"
  7472. "lsr r6, %[b], #16\n\t"
  7473. "lsr r7, r8, #16\n\t"
  7474. "mul r7, r6, r7\n\t"
  7475. "adds r5, r5, r7\n\t"
  7476. "adc r3, r3, #0\n\t"
  7477. "lsl r7, r8, #16\n\t"
  7478. "lsr r7, r7, #16\n\t"
  7479. "mul r6, r7, r6\n\t"
  7480. "lsr r7, r6, #16\n\t"
  7481. "lsl r6, r6, #16\n\t"
  7482. "adds r4, r4, r6\n\t"
  7483. "adcs r5, r5, r7\n\t"
  7484. "adc r3, r3, #0\n\t"
  7485. #else
  7486. "umull r6, r7, %[b], r8\n\t"
  7487. "adds r4, r4, r6\n\t"
  7488. "adcs r5, r5, r7\n\t"
  7489. "mov r3, #0\n\t"
  7490. "adc r3, r3, #0\n\t"
  7491. #endif
  7492. "str r4, [%[r]], #4\n\t"
  7493. /* A[41] * B */
  7494. "ldr r8, [%[a]], #4\n\t"
  7495. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7496. "lsl r6, %[b], #16\n\t"
  7497. "lsl r7, r8, #16\n\t"
  7498. "lsr r6, r6, #16\n\t"
  7499. "lsr r7, r7, #16\n\t"
  7500. "mul r7, r6, r7\n\t"
  7501. "adds r5, r5, r7\n\t"
  7502. "adcs r3, r3, #0\n\t"
  7503. "mov r4, #0\n\t"
  7504. "adc r4, r4, #0\n\t"
  7505. "lsr r7, r8, #16\n\t"
  7506. "mul r6, r7, r6\n\t"
  7507. "lsr r7, r6, #16\n\t"
  7508. "lsl r6, r6, #16\n\t"
  7509. "adds r5, r5, r6\n\t"
  7510. "adcs r3, r3, r7\n\t"
  7511. "adc r4, r4, #0\n\t"
  7512. "lsr r6, %[b], #16\n\t"
  7513. "lsr r7, r8, #16\n\t"
  7514. "mul r7, r6, r7\n\t"
  7515. "adds r3, r3, r7\n\t"
  7516. "adc r4, r4, #0\n\t"
  7517. "lsl r7, r8, #16\n\t"
  7518. "lsr r7, r7, #16\n\t"
  7519. "mul r6, r7, r6\n\t"
  7520. "lsr r7, r6, #16\n\t"
  7521. "lsl r6, r6, #16\n\t"
  7522. "adds r5, r5, r6\n\t"
  7523. "adcs r3, r3, r7\n\t"
  7524. "adc r4, r4, #0\n\t"
  7525. #else
  7526. "umull r6, r7, %[b], r8\n\t"
  7527. "adds r5, r5, r6\n\t"
  7528. "adcs r3, r3, r7\n\t"
  7529. "mov r4, #0\n\t"
  7530. "adc r4, r4, #0\n\t"
  7531. #endif
  7532. "str r5, [%[r]], #4\n\t"
  7533. /* A[42] * B */
  7534. "ldr r8, [%[a]], #4\n\t"
  7535. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7536. "lsl r6, %[b], #16\n\t"
  7537. "lsl r7, r8, #16\n\t"
  7538. "lsr r6, r6, #16\n\t"
  7539. "lsr r7, r7, #16\n\t"
  7540. "mul r7, r6, r7\n\t"
  7541. "adds r3, r3, r7\n\t"
  7542. "adcs r4, r4, #0\n\t"
  7543. "mov r5, #0\n\t"
  7544. "adc r5, r5, #0\n\t"
  7545. "lsr r7, r8, #16\n\t"
  7546. "mul r6, r7, r6\n\t"
  7547. "lsr r7, r6, #16\n\t"
  7548. "lsl r6, r6, #16\n\t"
  7549. "adds r3, r3, r6\n\t"
  7550. "adcs r4, r4, r7\n\t"
  7551. "adc r5, r5, #0\n\t"
  7552. "lsr r6, %[b], #16\n\t"
  7553. "lsr r7, r8, #16\n\t"
  7554. "mul r7, r6, r7\n\t"
  7555. "adds r4, r4, r7\n\t"
  7556. "adc r5, r5, #0\n\t"
  7557. "lsl r7, r8, #16\n\t"
  7558. "lsr r7, r7, #16\n\t"
  7559. "mul r6, r7, r6\n\t"
  7560. "lsr r7, r6, #16\n\t"
  7561. "lsl r6, r6, #16\n\t"
  7562. "adds r3, r3, r6\n\t"
  7563. "adcs r4, r4, r7\n\t"
  7564. "adc r5, r5, #0\n\t"
  7565. #else
  7566. "umull r6, r7, %[b], r8\n\t"
  7567. "adds r3, r3, r6\n\t"
  7568. "adcs r4, r4, r7\n\t"
  7569. "mov r5, #0\n\t"
  7570. "adc r5, r5, #0\n\t"
  7571. #endif
  7572. "str r3, [%[r]], #4\n\t"
  7573. /* A[43] * B */
  7574. "ldr r8, [%[a]], #4\n\t"
  7575. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7576. "lsl r6, %[b], #16\n\t"
  7577. "lsl r7, r8, #16\n\t"
  7578. "lsr r6, r6, #16\n\t"
  7579. "lsr r7, r7, #16\n\t"
  7580. "mul r7, r6, r7\n\t"
  7581. "adds r4, r4, r7\n\t"
  7582. "adcs r5, r5, #0\n\t"
  7583. "mov r3, #0\n\t"
  7584. "adc r3, r3, #0\n\t"
  7585. "lsr r7, r8, #16\n\t"
  7586. "mul r6, r7, r6\n\t"
  7587. "lsr r7, r6, #16\n\t"
  7588. "lsl r6, r6, #16\n\t"
  7589. "adds r4, r4, r6\n\t"
  7590. "adcs r5, r5, r7\n\t"
  7591. "adc r3, r3, #0\n\t"
  7592. "lsr r6, %[b], #16\n\t"
  7593. "lsr r7, r8, #16\n\t"
  7594. "mul r7, r6, r7\n\t"
  7595. "adds r5, r5, r7\n\t"
  7596. "adc r3, r3, #0\n\t"
  7597. "lsl r7, r8, #16\n\t"
  7598. "lsr r7, r7, #16\n\t"
  7599. "mul r6, r7, r6\n\t"
  7600. "lsr r7, r6, #16\n\t"
  7601. "lsl r6, r6, #16\n\t"
  7602. "adds r4, r4, r6\n\t"
  7603. "adcs r5, r5, r7\n\t"
  7604. "adc r3, r3, #0\n\t"
  7605. #else
  7606. "umull r6, r7, %[b], r8\n\t"
  7607. "adds r4, r4, r6\n\t"
  7608. "adcs r5, r5, r7\n\t"
  7609. "mov r3, #0\n\t"
  7610. "adc r3, r3, #0\n\t"
  7611. #endif
  7612. "str r4, [%[r]], #4\n\t"
  7613. /* A[44] * B */
  7614. "ldr r8, [%[a]], #4\n\t"
  7615. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7616. "lsl r6, %[b], #16\n\t"
  7617. "lsl r7, r8, #16\n\t"
  7618. "lsr r6, r6, #16\n\t"
  7619. "lsr r7, r7, #16\n\t"
  7620. "mul r7, r6, r7\n\t"
  7621. "adds r5, r5, r7\n\t"
  7622. "adcs r3, r3, #0\n\t"
  7623. "mov r4, #0\n\t"
  7624. "adc r4, r4, #0\n\t"
  7625. "lsr r7, r8, #16\n\t"
  7626. "mul r6, r7, r6\n\t"
  7627. "lsr r7, r6, #16\n\t"
  7628. "lsl r6, r6, #16\n\t"
  7629. "adds r5, r5, r6\n\t"
  7630. "adcs r3, r3, r7\n\t"
  7631. "adc r4, r4, #0\n\t"
  7632. "lsr r6, %[b], #16\n\t"
  7633. "lsr r7, r8, #16\n\t"
  7634. "mul r7, r6, r7\n\t"
  7635. "adds r3, r3, r7\n\t"
  7636. "adc r4, r4, #0\n\t"
  7637. "lsl r7, r8, #16\n\t"
  7638. "lsr r7, r7, #16\n\t"
  7639. "mul r6, r7, r6\n\t"
  7640. "lsr r7, r6, #16\n\t"
  7641. "lsl r6, r6, #16\n\t"
  7642. "adds r5, r5, r6\n\t"
  7643. "adcs r3, r3, r7\n\t"
  7644. "adc r4, r4, #0\n\t"
  7645. #else
  7646. "umull r6, r7, %[b], r8\n\t"
  7647. "adds r5, r5, r6\n\t"
  7648. "adcs r3, r3, r7\n\t"
  7649. "mov r4, #0\n\t"
  7650. "adc r4, r4, #0\n\t"
  7651. #endif
  7652. "str r5, [%[r]], #4\n\t"
  7653. /* A[45] * B */
  7654. "ldr r8, [%[a]], #4\n\t"
  7655. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7656. "lsl r6, %[b], #16\n\t"
  7657. "lsl r7, r8, #16\n\t"
  7658. "lsr r6, r6, #16\n\t"
  7659. "lsr r7, r7, #16\n\t"
  7660. "mul r7, r6, r7\n\t"
  7661. "adds r3, r3, r7\n\t"
  7662. "adcs r4, r4, #0\n\t"
  7663. "mov r5, #0\n\t"
  7664. "adc r5, r5, #0\n\t"
  7665. "lsr r7, r8, #16\n\t"
  7666. "mul r6, r7, r6\n\t"
  7667. "lsr r7, r6, #16\n\t"
  7668. "lsl r6, r6, #16\n\t"
  7669. "adds r3, r3, r6\n\t"
  7670. "adcs r4, r4, r7\n\t"
  7671. "adc r5, r5, #0\n\t"
  7672. "lsr r6, %[b], #16\n\t"
  7673. "lsr r7, r8, #16\n\t"
  7674. "mul r7, r6, r7\n\t"
  7675. "adds r4, r4, r7\n\t"
  7676. "adc r5, r5, #0\n\t"
  7677. "lsl r7, r8, #16\n\t"
  7678. "lsr r7, r7, #16\n\t"
  7679. "mul r6, r7, r6\n\t"
  7680. "lsr r7, r6, #16\n\t"
  7681. "lsl r6, r6, #16\n\t"
  7682. "adds r3, r3, r6\n\t"
  7683. "adcs r4, r4, r7\n\t"
  7684. "adc r5, r5, #0\n\t"
  7685. #else
  7686. "umull r6, r7, %[b], r8\n\t"
  7687. "adds r3, r3, r6\n\t"
  7688. "adcs r4, r4, r7\n\t"
  7689. "mov r5, #0\n\t"
  7690. "adc r5, r5, #0\n\t"
  7691. #endif
  7692. "str r3, [%[r]], #4\n\t"
  7693. /* A[46] * B */
  7694. "ldr r8, [%[a]], #4\n\t"
  7695. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7696. "lsl r6, %[b], #16\n\t"
  7697. "lsl r7, r8, #16\n\t"
  7698. "lsr r6, r6, #16\n\t"
  7699. "lsr r7, r7, #16\n\t"
  7700. "mul r7, r6, r7\n\t"
  7701. "adds r4, r4, r7\n\t"
  7702. "adcs r5, r5, #0\n\t"
  7703. "mov r3, #0\n\t"
  7704. "adc r3, r3, #0\n\t"
  7705. "lsr r7, r8, #16\n\t"
  7706. "mul r6, r7, r6\n\t"
  7707. "lsr r7, r6, #16\n\t"
  7708. "lsl r6, r6, #16\n\t"
  7709. "adds r4, r4, r6\n\t"
  7710. "adcs r5, r5, r7\n\t"
  7711. "adc r3, r3, #0\n\t"
  7712. "lsr r6, %[b], #16\n\t"
  7713. "lsr r7, r8, #16\n\t"
  7714. "mul r7, r6, r7\n\t"
  7715. "adds r5, r5, r7\n\t"
  7716. "adc r3, r3, #0\n\t"
  7717. "lsl r7, r8, #16\n\t"
  7718. "lsr r7, r7, #16\n\t"
  7719. "mul r6, r7, r6\n\t"
  7720. "lsr r7, r6, #16\n\t"
  7721. "lsl r6, r6, #16\n\t"
  7722. "adds r4, r4, r6\n\t"
  7723. "adcs r5, r5, r7\n\t"
  7724. "adc r3, r3, #0\n\t"
  7725. #else
  7726. "umull r6, r7, %[b], r8\n\t"
  7727. "adds r4, r4, r6\n\t"
  7728. "adcs r5, r5, r7\n\t"
  7729. "mov r3, #0\n\t"
  7730. "adc r3, r3, #0\n\t"
  7731. #endif
  7732. "str r4, [%[r]], #4\n\t"
  7733. /* A[47] * B */
  7734. "ldr r8, [%[a]], #4\n\t"
  7735. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7736. "lsl r6, %[b], #16\n\t"
  7737. "lsl r7, r8, #16\n\t"
  7738. "lsr r6, r6, #16\n\t"
  7739. "lsr r7, r7, #16\n\t"
  7740. "mul r7, r6, r7\n\t"
  7741. "adds r5, r5, r7\n\t"
  7742. "adcs r3, r3, #0\n\t"
  7743. "mov r4, #0\n\t"
  7744. "adc r4, r4, #0\n\t"
  7745. "lsr r7, r8, #16\n\t"
  7746. "mul r6, r7, r6\n\t"
  7747. "lsr r7, r6, #16\n\t"
  7748. "lsl r6, r6, #16\n\t"
  7749. "adds r5, r5, r6\n\t"
  7750. "adcs r3, r3, r7\n\t"
  7751. "adc r4, r4, #0\n\t"
  7752. "lsr r6, %[b], #16\n\t"
  7753. "lsr r7, r8, #16\n\t"
  7754. "mul r7, r6, r7\n\t"
  7755. "adds r3, r3, r7\n\t"
  7756. "adc r4, r4, #0\n\t"
  7757. "lsl r7, r8, #16\n\t"
  7758. "lsr r7, r7, #16\n\t"
  7759. "mul r6, r7, r6\n\t"
  7760. "lsr r7, r6, #16\n\t"
  7761. "lsl r6, r6, #16\n\t"
  7762. "adds r5, r5, r6\n\t"
  7763. "adcs r3, r3, r7\n\t"
  7764. "adc r4, r4, #0\n\t"
  7765. #else
  7766. "umull r6, r7, %[b], r8\n\t"
  7767. "adds r5, r5, r6\n\t"
  7768. "adcs r3, r3, r7\n\t"
  7769. "mov r4, #0\n\t"
  7770. "adc r4, r4, #0\n\t"
  7771. #endif
  7772. "str r5, [%[r]], #4\n\t"
  7773. /* A[48] * B */
  7774. "ldr r8, [%[a]], #4\n\t"
  7775. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7776. "lsl r6, %[b], #16\n\t"
  7777. "lsl r7, r8, #16\n\t"
  7778. "lsr r6, r6, #16\n\t"
  7779. "lsr r7, r7, #16\n\t"
  7780. "mul r7, r6, r7\n\t"
  7781. "adds r3, r3, r7\n\t"
  7782. "adcs r4, r4, #0\n\t"
  7783. "mov r5, #0\n\t"
  7784. "adc r5, r5, #0\n\t"
  7785. "lsr r7, r8, #16\n\t"
  7786. "mul r6, r7, r6\n\t"
  7787. "lsr r7, r6, #16\n\t"
  7788. "lsl r6, r6, #16\n\t"
  7789. "adds r3, r3, r6\n\t"
  7790. "adcs r4, r4, r7\n\t"
  7791. "adc r5, r5, #0\n\t"
  7792. "lsr r6, %[b], #16\n\t"
  7793. "lsr r7, r8, #16\n\t"
  7794. "mul r7, r6, r7\n\t"
  7795. "adds r4, r4, r7\n\t"
  7796. "adc r5, r5, #0\n\t"
  7797. "lsl r7, r8, #16\n\t"
  7798. "lsr r7, r7, #16\n\t"
  7799. "mul r6, r7, r6\n\t"
  7800. "lsr r7, r6, #16\n\t"
  7801. "lsl r6, r6, #16\n\t"
  7802. "adds r3, r3, r6\n\t"
  7803. "adcs r4, r4, r7\n\t"
  7804. "adc r5, r5, #0\n\t"
  7805. #else
  7806. "umull r6, r7, %[b], r8\n\t"
  7807. "adds r3, r3, r6\n\t"
  7808. "adcs r4, r4, r7\n\t"
  7809. "mov r5, #0\n\t"
  7810. "adc r5, r5, #0\n\t"
  7811. #endif
  7812. "str r3, [%[r]], #4\n\t"
  7813. /* A[49] * B */
  7814. "ldr r8, [%[a]], #4\n\t"
  7815. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7816. "lsl r6, %[b], #16\n\t"
  7817. "lsl r7, r8, #16\n\t"
  7818. "lsr r6, r6, #16\n\t"
  7819. "lsr r7, r7, #16\n\t"
  7820. "mul r7, r6, r7\n\t"
  7821. "adds r4, r4, r7\n\t"
  7822. "adcs r5, r5, #0\n\t"
  7823. "mov r3, #0\n\t"
  7824. "adc r3, r3, #0\n\t"
  7825. "lsr r7, r8, #16\n\t"
  7826. "mul r6, r7, r6\n\t"
  7827. "lsr r7, r6, #16\n\t"
  7828. "lsl r6, r6, #16\n\t"
  7829. "adds r4, r4, r6\n\t"
  7830. "adcs r5, r5, r7\n\t"
  7831. "adc r3, r3, #0\n\t"
  7832. "lsr r6, %[b], #16\n\t"
  7833. "lsr r7, r8, #16\n\t"
  7834. "mul r7, r6, r7\n\t"
  7835. "adds r5, r5, r7\n\t"
  7836. "adc r3, r3, #0\n\t"
  7837. "lsl r7, r8, #16\n\t"
  7838. "lsr r7, r7, #16\n\t"
  7839. "mul r6, r7, r6\n\t"
  7840. "lsr r7, r6, #16\n\t"
  7841. "lsl r6, r6, #16\n\t"
  7842. "adds r4, r4, r6\n\t"
  7843. "adcs r5, r5, r7\n\t"
  7844. "adc r3, r3, #0\n\t"
  7845. #else
  7846. "umull r6, r7, %[b], r8\n\t"
  7847. "adds r4, r4, r6\n\t"
  7848. "adcs r5, r5, r7\n\t"
  7849. "mov r3, #0\n\t"
  7850. "adc r3, r3, #0\n\t"
  7851. #endif
  7852. "str r4, [%[r]], #4\n\t"
  7853. /* A[50] * B */
  7854. "ldr r8, [%[a]], #4\n\t"
  7855. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7856. "lsl r6, %[b], #16\n\t"
  7857. "lsl r7, r8, #16\n\t"
  7858. "lsr r6, r6, #16\n\t"
  7859. "lsr r7, r7, #16\n\t"
  7860. "mul r7, r6, r7\n\t"
  7861. "adds r5, r5, r7\n\t"
  7862. "adcs r3, r3, #0\n\t"
  7863. "mov r4, #0\n\t"
  7864. "adc r4, r4, #0\n\t"
  7865. "lsr r7, r8, #16\n\t"
  7866. "mul r6, r7, r6\n\t"
  7867. "lsr r7, r6, #16\n\t"
  7868. "lsl r6, r6, #16\n\t"
  7869. "adds r5, r5, r6\n\t"
  7870. "adcs r3, r3, r7\n\t"
  7871. "adc r4, r4, #0\n\t"
  7872. "lsr r6, %[b], #16\n\t"
  7873. "lsr r7, r8, #16\n\t"
  7874. "mul r7, r6, r7\n\t"
  7875. "adds r3, r3, r7\n\t"
  7876. "adc r4, r4, #0\n\t"
  7877. "lsl r7, r8, #16\n\t"
  7878. "lsr r7, r7, #16\n\t"
  7879. "mul r6, r7, r6\n\t"
  7880. "lsr r7, r6, #16\n\t"
  7881. "lsl r6, r6, #16\n\t"
  7882. "adds r5, r5, r6\n\t"
  7883. "adcs r3, r3, r7\n\t"
  7884. "adc r4, r4, #0\n\t"
  7885. #else
  7886. "umull r6, r7, %[b], r8\n\t"
  7887. "adds r5, r5, r6\n\t"
  7888. "adcs r3, r3, r7\n\t"
  7889. "mov r4, #0\n\t"
  7890. "adc r4, r4, #0\n\t"
  7891. #endif
  7892. "str r5, [%[r]], #4\n\t"
  7893. /* A[51] * B */
  7894. "ldr r8, [%[a]], #4\n\t"
  7895. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7896. "lsl r6, %[b], #16\n\t"
  7897. "lsl r7, r8, #16\n\t"
  7898. "lsr r6, r6, #16\n\t"
  7899. "lsr r7, r7, #16\n\t"
  7900. "mul r7, r6, r7\n\t"
  7901. "adds r3, r3, r7\n\t"
  7902. "adcs r4, r4, #0\n\t"
  7903. "mov r5, #0\n\t"
  7904. "adc r5, r5, #0\n\t"
  7905. "lsr r7, r8, #16\n\t"
  7906. "mul r6, r7, r6\n\t"
  7907. "lsr r7, r6, #16\n\t"
  7908. "lsl r6, r6, #16\n\t"
  7909. "adds r3, r3, r6\n\t"
  7910. "adcs r4, r4, r7\n\t"
  7911. "adc r5, r5, #0\n\t"
  7912. "lsr r6, %[b], #16\n\t"
  7913. "lsr r7, r8, #16\n\t"
  7914. "mul r7, r6, r7\n\t"
  7915. "adds r4, r4, r7\n\t"
  7916. "adc r5, r5, #0\n\t"
  7917. "lsl r7, r8, #16\n\t"
  7918. "lsr r7, r7, #16\n\t"
  7919. "mul r6, r7, r6\n\t"
  7920. "lsr r7, r6, #16\n\t"
  7921. "lsl r6, r6, #16\n\t"
  7922. "adds r3, r3, r6\n\t"
  7923. "adcs r4, r4, r7\n\t"
  7924. "adc r5, r5, #0\n\t"
  7925. #else
  7926. "umull r6, r7, %[b], r8\n\t"
  7927. "adds r3, r3, r6\n\t"
  7928. "adcs r4, r4, r7\n\t"
  7929. "mov r5, #0\n\t"
  7930. "adc r5, r5, #0\n\t"
  7931. #endif
  7932. "str r3, [%[r]], #4\n\t"
  7933. /* A[52] * B */
  7934. "ldr r8, [%[a]], #4\n\t"
  7935. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7936. "lsl r6, %[b], #16\n\t"
  7937. "lsl r7, r8, #16\n\t"
  7938. "lsr r6, r6, #16\n\t"
  7939. "lsr r7, r7, #16\n\t"
  7940. "mul r7, r6, r7\n\t"
  7941. "adds r4, r4, r7\n\t"
  7942. "adcs r5, r5, #0\n\t"
  7943. "mov r3, #0\n\t"
  7944. "adc r3, r3, #0\n\t"
  7945. "lsr r7, r8, #16\n\t"
  7946. "mul r6, r7, r6\n\t"
  7947. "lsr r7, r6, #16\n\t"
  7948. "lsl r6, r6, #16\n\t"
  7949. "adds r4, r4, r6\n\t"
  7950. "adcs r5, r5, r7\n\t"
  7951. "adc r3, r3, #0\n\t"
  7952. "lsr r6, %[b], #16\n\t"
  7953. "lsr r7, r8, #16\n\t"
  7954. "mul r7, r6, r7\n\t"
  7955. "adds r5, r5, r7\n\t"
  7956. "adc r3, r3, #0\n\t"
  7957. "lsl r7, r8, #16\n\t"
  7958. "lsr r7, r7, #16\n\t"
  7959. "mul r6, r7, r6\n\t"
  7960. "lsr r7, r6, #16\n\t"
  7961. "lsl r6, r6, #16\n\t"
  7962. "adds r4, r4, r6\n\t"
  7963. "adcs r5, r5, r7\n\t"
  7964. "adc r3, r3, #0\n\t"
  7965. #else
  7966. "umull r6, r7, %[b], r8\n\t"
  7967. "adds r4, r4, r6\n\t"
  7968. "adcs r5, r5, r7\n\t"
  7969. "mov r3, #0\n\t"
  7970. "adc r3, r3, #0\n\t"
  7971. #endif
  7972. "str r4, [%[r]], #4\n\t"
  7973. /* A[53] * B */
  7974. "ldr r8, [%[a]], #4\n\t"
  7975. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  7976. "lsl r6, %[b], #16\n\t"
  7977. "lsl r7, r8, #16\n\t"
  7978. "lsr r6, r6, #16\n\t"
  7979. "lsr r7, r7, #16\n\t"
  7980. "mul r7, r6, r7\n\t"
  7981. "adds r5, r5, r7\n\t"
  7982. "adcs r3, r3, #0\n\t"
  7983. "mov r4, #0\n\t"
  7984. "adc r4, r4, #0\n\t"
  7985. "lsr r7, r8, #16\n\t"
  7986. "mul r6, r7, r6\n\t"
  7987. "lsr r7, r6, #16\n\t"
  7988. "lsl r6, r6, #16\n\t"
  7989. "adds r5, r5, r6\n\t"
  7990. "adcs r3, r3, r7\n\t"
  7991. "adc r4, r4, #0\n\t"
  7992. "lsr r6, %[b], #16\n\t"
  7993. "lsr r7, r8, #16\n\t"
  7994. "mul r7, r6, r7\n\t"
  7995. "adds r3, r3, r7\n\t"
  7996. "adc r4, r4, #0\n\t"
  7997. "lsl r7, r8, #16\n\t"
  7998. "lsr r7, r7, #16\n\t"
  7999. "mul r6, r7, r6\n\t"
  8000. "lsr r7, r6, #16\n\t"
  8001. "lsl r6, r6, #16\n\t"
  8002. "adds r5, r5, r6\n\t"
  8003. "adcs r3, r3, r7\n\t"
  8004. "adc r4, r4, #0\n\t"
  8005. #else
  8006. "umull r6, r7, %[b], r8\n\t"
  8007. "adds r5, r5, r6\n\t"
  8008. "adcs r3, r3, r7\n\t"
  8009. "mov r4, #0\n\t"
  8010. "adc r4, r4, #0\n\t"
  8011. #endif
  8012. "str r5, [%[r]], #4\n\t"
  8013. /* A[54] * B */
  8014. "ldr r8, [%[a]], #4\n\t"
  8015. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8016. "lsl r6, %[b], #16\n\t"
  8017. "lsl r7, r8, #16\n\t"
  8018. "lsr r6, r6, #16\n\t"
  8019. "lsr r7, r7, #16\n\t"
  8020. "mul r7, r6, r7\n\t"
  8021. "adds r3, r3, r7\n\t"
  8022. "adcs r4, r4, #0\n\t"
  8023. "mov r5, #0\n\t"
  8024. "adc r5, r5, #0\n\t"
  8025. "lsr r7, r8, #16\n\t"
  8026. "mul r6, r7, r6\n\t"
  8027. "lsr r7, r6, #16\n\t"
  8028. "lsl r6, r6, #16\n\t"
  8029. "adds r3, r3, r6\n\t"
  8030. "adcs r4, r4, r7\n\t"
  8031. "adc r5, r5, #0\n\t"
  8032. "lsr r6, %[b], #16\n\t"
  8033. "lsr r7, r8, #16\n\t"
  8034. "mul r7, r6, r7\n\t"
  8035. "adds r4, r4, r7\n\t"
  8036. "adc r5, r5, #0\n\t"
  8037. "lsl r7, r8, #16\n\t"
  8038. "lsr r7, r7, #16\n\t"
  8039. "mul r6, r7, r6\n\t"
  8040. "lsr r7, r6, #16\n\t"
  8041. "lsl r6, r6, #16\n\t"
  8042. "adds r3, r3, r6\n\t"
  8043. "adcs r4, r4, r7\n\t"
  8044. "adc r5, r5, #0\n\t"
  8045. #else
  8046. "umull r6, r7, %[b], r8\n\t"
  8047. "adds r3, r3, r6\n\t"
  8048. "adcs r4, r4, r7\n\t"
  8049. "mov r5, #0\n\t"
  8050. "adc r5, r5, #0\n\t"
  8051. #endif
  8052. "str r3, [%[r]], #4\n\t"
  8053. /* A[55] * B */
  8054. "ldr r8, [%[a]], #4\n\t"
  8055. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8056. "lsl r6, %[b], #16\n\t"
  8057. "lsl r7, r8, #16\n\t"
  8058. "lsr r6, r6, #16\n\t"
  8059. "lsr r7, r7, #16\n\t"
  8060. "mul r7, r6, r7\n\t"
  8061. "adds r4, r4, r7\n\t"
  8062. "adcs r5, r5, #0\n\t"
  8063. "mov r3, #0\n\t"
  8064. "adc r3, r3, #0\n\t"
  8065. "lsr r7, r8, #16\n\t"
  8066. "mul r6, r7, r6\n\t"
  8067. "lsr r7, r6, #16\n\t"
  8068. "lsl r6, r6, #16\n\t"
  8069. "adds r4, r4, r6\n\t"
  8070. "adcs r5, r5, r7\n\t"
  8071. "adc r3, r3, #0\n\t"
  8072. "lsr r6, %[b], #16\n\t"
  8073. "lsr r7, r8, #16\n\t"
  8074. "mul r7, r6, r7\n\t"
  8075. "adds r5, r5, r7\n\t"
  8076. "adc r3, r3, #0\n\t"
  8077. "lsl r7, r8, #16\n\t"
  8078. "lsr r7, r7, #16\n\t"
  8079. "mul r6, r7, r6\n\t"
  8080. "lsr r7, r6, #16\n\t"
  8081. "lsl r6, r6, #16\n\t"
  8082. "adds r4, r4, r6\n\t"
  8083. "adcs r5, r5, r7\n\t"
  8084. "adc r3, r3, #0\n\t"
  8085. #else
  8086. "umull r6, r7, %[b], r8\n\t"
  8087. "adds r4, r4, r6\n\t"
  8088. "adcs r5, r5, r7\n\t"
  8089. "mov r3, #0\n\t"
  8090. "adc r3, r3, #0\n\t"
  8091. #endif
  8092. "str r4, [%[r]], #4\n\t"
  8093. /* A[56] * B */
  8094. "ldr r8, [%[a]], #4\n\t"
  8095. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8096. "lsl r6, %[b], #16\n\t"
  8097. "lsl r7, r8, #16\n\t"
  8098. "lsr r6, r6, #16\n\t"
  8099. "lsr r7, r7, #16\n\t"
  8100. "mul r7, r6, r7\n\t"
  8101. "adds r5, r5, r7\n\t"
  8102. "adcs r3, r3, #0\n\t"
  8103. "mov r4, #0\n\t"
  8104. "adc r4, r4, #0\n\t"
  8105. "lsr r7, r8, #16\n\t"
  8106. "mul r6, r7, r6\n\t"
  8107. "lsr r7, r6, #16\n\t"
  8108. "lsl r6, r6, #16\n\t"
  8109. "adds r5, r5, r6\n\t"
  8110. "adcs r3, r3, r7\n\t"
  8111. "adc r4, r4, #0\n\t"
  8112. "lsr r6, %[b], #16\n\t"
  8113. "lsr r7, r8, #16\n\t"
  8114. "mul r7, r6, r7\n\t"
  8115. "adds r3, r3, r7\n\t"
  8116. "adc r4, r4, #0\n\t"
  8117. "lsl r7, r8, #16\n\t"
  8118. "lsr r7, r7, #16\n\t"
  8119. "mul r6, r7, r6\n\t"
  8120. "lsr r7, r6, #16\n\t"
  8121. "lsl r6, r6, #16\n\t"
  8122. "adds r5, r5, r6\n\t"
  8123. "adcs r3, r3, r7\n\t"
  8124. "adc r4, r4, #0\n\t"
  8125. #else
  8126. "umull r6, r7, %[b], r8\n\t"
  8127. "adds r5, r5, r6\n\t"
  8128. "adcs r3, r3, r7\n\t"
  8129. "mov r4, #0\n\t"
  8130. "adc r4, r4, #0\n\t"
  8131. #endif
  8132. "str r5, [%[r]], #4\n\t"
  8133. /* A[57] * B */
  8134. "ldr r8, [%[a]], #4\n\t"
  8135. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8136. "lsl r6, %[b], #16\n\t"
  8137. "lsl r7, r8, #16\n\t"
  8138. "lsr r6, r6, #16\n\t"
  8139. "lsr r7, r7, #16\n\t"
  8140. "mul r7, r6, r7\n\t"
  8141. "adds r3, r3, r7\n\t"
  8142. "adcs r4, r4, #0\n\t"
  8143. "mov r5, #0\n\t"
  8144. "adc r5, r5, #0\n\t"
  8145. "lsr r7, r8, #16\n\t"
  8146. "mul r6, r7, r6\n\t"
  8147. "lsr r7, r6, #16\n\t"
  8148. "lsl r6, r6, #16\n\t"
  8149. "adds r3, r3, r6\n\t"
  8150. "adcs r4, r4, r7\n\t"
  8151. "adc r5, r5, #0\n\t"
  8152. "lsr r6, %[b], #16\n\t"
  8153. "lsr r7, r8, #16\n\t"
  8154. "mul r7, r6, r7\n\t"
  8155. "adds r4, r4, r7\n\t"
  8156. "adc r5, r5, #0\n\t"
  8157. "lsl r7, r8, #16\n\t"
  8158. "lsr r7, r7, #16\n\t"
  8159. "mul r6, r7, r6\n\t"
  8160. "lsr r7, r6, #16\n\t"
  8161. "lsl r6, r6, #16\n\t"
  8162. "adds r3, r3, r6\n\t"
  8163. "adcs r4, r4, r7\n\t"
  8164. "adc r5, r5, #0\n\t"
  8165. #else
  8166. "umull r6, r7, %[b], r8\n\t"
  8167. "adds r3, r3, r6\n\t"
  8168. "adcs r4, r4, r7\n\t"
  8169. "mov r5, #0\n\t"
  8170. "adc r5, r5, #0\n\t"
  8171. #endif
  8172. "str r3, [%[r]], #4\n\t"
  8173. /* A[58] * B */
  8174. "ldr r8, [%[a]], #4\n\t"
  8175. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8176. "lsl r6, %[b], #16\n\t"
  8177. "lsl r7, r8, #16\n\t"
  8178. "lsr r6, r6, #16\n\t"
  8179. "lsr r7, r7, #16\n\t"
  8180. "mul r7, r6, r7\n\t"
  8181. "adds r4, r4, r7\n\t"
  8182. "adcs r5, r5, #0\n\t"
  8183. "mov r3, #0\n\t"
  8184. "adc r3, r3, #0\n\t"
  8185. "lsr r7, r8, #16\n\t"
  8186. "mul r6, r7, r6\n\t"
  8187. "lsr r7, r6, #16\n\t"
  8188. "lsl r6, r6, #16\n\t"
  8189. "adds r4, r4, r6\n\t"
  8190. "adcs r5, r5, r7\n\t"
  8191. "adc r3, r3, #0\n\t"
  8192. "lsr r6, %[b], #16\n\t"
  8193. "lsr r7, r8, #16\n\t"
  8194. "mul r7, r6, r7\n\t"
  8195. "adds r5, r5, r7\n\t"
  8196. "adc r3, r3, #0\n\t"
  8197. "lsl r7, r8, #16\n\t"
  8198. "lsr r7, r7, #16\n\t"
  8199. "mul r6, r7, r6\n\t"
  8200. "lsr r7, r6, #16\n\t"
  8201. "lsl r6, r6, #16\n\t"
  8202. "adds r4, r4, r6\n\t"
  8203. "adcs r5, r5, r7\n\t"
  8204. "adc r3, r3, #0\n\t"
  8205. #else
  8206. "umull r6, r7, %[b], r8\n\t"
  8207. "adds r4, r4, r6\n\t"
  8208. "adcs r5, r5, r7\n\t"
  8209. "mov r3, #0\n\t"
  8210. "adc r3, r3, #0\n\t"
  8211. #endif
  8212. "str r4, [%[r]], #4\n\t"
  8213. /* A[59] * B */
  8214. "ldr r8, [%[a]], #4\n\t"
  8215. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8216. "lsl r6, %[b], #16\n\t"
  8217. "lsl r7, r8, #16\n\t"
  8218. "lsr r6, r6, #16\n\t"
  8219. "lsr r7, r7, #16\n\t"
  8220. "mul r7, r6, r7\n\t"
  8221. "adds r5, r5, r7\n\t"
  8222. "adcs r3, r3, #0\n\t"
  8223. "mov r4, #0\n\t"
  8224. "adc r4, r4, #0\n\t"
  8225. "lsr r7, r8, #16\n\t"
  8226. "mul r6, r7, r6\n\t"
  8227. "lsr r7, r6, #16\n\t"
  8228. "lsl r6, r6, #16\n\t"
  8229. "adds r5, r5, r6\n\t"
  8230. "adcs r3, r3, r7\n\t"
  8231. "adc r4, r4, #0\n\t"
  8232. "lsr r6, %[b], #16\n\t"
  8233. "lsr r7, r8, #16\n\t"
  8234. "mul r7, r6, r7\n\t"
  8235. "adds r3, r3, r7\n\t"
  8236. "adc r4, r4, #0\n\t"
  8237. "lsl r7, r8, #16\n\t"
  8238. "lsr r7, r7, #16\n\t"
  8239. "mul r6, r7, r6\n\t"
  8240. "lsr r7, r6, #16\n\t"
  8241. "lsl r6, r6, #16\n\t"
  8242. "adds r5, r5, r6\n\t"
  8243. "adcs r3, r3, r7\n\t"
  8244. "adc r4, r4, #0\n\t"
  8245. #else
  8246. "umull r6, r7, %[b], r8\n\t"
  8247. "adds r5, r5, r6\n\t"
  8248. "adcs r3, r3, r7\n\t"
  8249. "mov r4, #0\n\t"
  8250. "adc r4, r4, #0\n\t"
  8251. #endif
  8252. "str r5, [%[r]], #4\n\t"
  8253. /* A[60] * B */
  8254. "ldr r8, [%[a]], #4\n\t"
  8255. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8256. "lsl r6, %[b], #16\n\t"
  8257. "lsl r7, r8, #16\n\t"
  8258. "lsr r6, r6, #16\n\t"
  8259. "lsr r7, r7, #16\n\t"
  8260. "mul r7, r6, r7\n\t"
  8261. "adds r3, r3, r7\n\t"
  8262. "adcs r4, r4, #0\n\t"
  8263. "mov r5, #0\n\t"
  8264. "adc r5, r5, #0\n\t"
  8265. "lsr r7, r8, #16\n\t"
  8266. "mul r6, r7, r6\n\t"
  8267. "lsr r7, r6, #16\n\t"
  8268. "lsl r6, r6, #16\n\t"
  8269. "adds r3, r3, r6\n\t"
  8270. "adcs r4, r4, r7\n\t"
  8271. "adc r5, r5, #0\n\t"
  8272. "lsr r6, %[b], #16\n\t"
  8273. "lsr r7, r8, #16\n\t"
  8274. "mul r7, r6, r7\n\t"
  8275. "adds r4, r4, r7\n\t"
  8276. "adc r5, r5, #0\n\t"
  8277. "lsl r7, r8, #16\n\t"
  8278. "lsr r7, r7, #16\n\t"
  8279. "mul r6, r7, r6\n\t"
  8280. "lsr r7, r6, #16\n\t"
  8281. "lsl r6, r6, #16\n\t"
  8282. "adds r3, r3, r6\n\t"
  8283. "adcs r4, r4, r7\n\t"
  8284. "adc r5, r5, #0\n\t"
  8285. #else
  8286. "umull r6, r7, %[b], r8\n\t"
  8287. "adds r3, r3, r6\n\t"
  8288. "adcs r4, r4, r7\n\t"
  8289. "mov r5, #0\n\t"
  8290. "adc r5, r5, #0\n\t"
  8291. #endif
  8292. "str r3, [%[r]], #4\n\t"
  8293. /* A[61] * B */
  8294. "ldr r8, [%[a]], #4\n\t"
  8295. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8296. "lsl r6, %[b], #16\n\t"
  8297. "lsl r7, r8, #16\n\t"
  8298. "lsr r6, r6, #16\n\t"
  8299. "lsr r7, r7, #16\n\t"
  8300. "mul r7, r6, r7\n\t"
  8301. "adds r4, r4, r7\n\t"
  8302. "adcs r5, r5, #0\n\t"
  8303. "mov r3, #0\n\t"
  8304. "adc r3, r3, #0\n\t"
  8305. "lsr r7, r8, #16\n\t"
  8306. "mul r6, r7, r6\n\t"
  8307. "lsr r7, r6, #16\n\t"
  8308. "lsl r6, r6, #16\n\t"
  8309. "adds r4, r4, r6\n\t"
  8310. "adcs r5, r5, r7\n\t"
  8311. "adc r3, r3, #0\n\t"
  8312. "lsr r6, %[b], #16\n\t"
  8313. "lsr r7, r8, #16\n\t"
  8314. "mul r7, r6, r7\n\t"
  8315. "adds r5, r5, r7\n\t"
  8316. "adc r3, r3, #0\n\t"
  8317. "lsl r7, r8, #16\n\t"
  8318. "lsr r7, r7, #16\n\t"
  8319. "mul r6, r7, r6\n\t"
  8320. "lsr r7, r6, #16\n\t"
  8321. "lsl r6, r6, #16\n\t"
  8322. "adds r4, r4, r6\n\t"
  8323. "adcs r5, r5, r7\n\t"
  8324. "adc r3, r3, #0\n\t"
  8325. #else
  8326. "umull r6, r7, %[b], r8\n\t"
  8327. "adds r4, r4, r6\n\t"
  8328. "adcs r5, r5, r7\n\t"
  8329. "mov r3, #0\n\t"
  8330. "adc r3, r3, #0\n\t"
  8331. #endif
  8332. "str r4, [%[r]], #4\n\t"
  8333. /* A[62] * B */
  8334. "ldr r8, [%[a]], #4\n\t"
  8335. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8336. "lsl r6, %[b], #16\n\t"
  8337. "lsl r7, r8, #16\n\t"
  8338. "lsr r6, r6, #16\n\t"
  8339. "lsr r7, r7, #16\n\t"
  8340. "mul r7, r6, r7\n\t"
  8341. "adds r5, r5, r7\n\t"
  8342. "adcs r3, r3, #0\n\t"
  8343. "mov r4, #0\n\t"
  8344. "adc r4, r4, #0\n\t"
  8345. "lsr r7, r8, #16\n\t"
  8346. "mul r6, r7, r6\n\t"
  8347. "lsr r7, r6, #16\n\t"
  8348. "lsl r6, r6, #16\n\t"
  8349. "adds r5, r5, r6\n\t"
  8350. "adcs r3, r3, r7\n\t"
  8351. "adc r4, r4, #0\n\t"
  8352. "lsr r6, %[b], #16\n\t"
  8353. "lsr r7, r8, #16\n\t"
  8354. "mul r7, r6, r7\n\t"
  8355. "adds r3, r3, r7\n\t"
  8356. "adc r4, r4, #0\n\t"
  8357. "lsl r7, r8, #16\n\t"
  8358. "lsr r7, r7, #16\n\t"
  8359. "mul r6, r7, r6\n\t"
  8360. "lsr r7, r6, #16\n\t"
  8361. "lsl r6, r6, #16\n\t"
  8362. "adds r5, r5, r6\n\t"
  8363. "adcs r3, r3, r7\n\t"
  8364. "adc r4, r4, #0\n\t"
  8365. #else
  8366. "umull r6, r7, %[b], r8\n\t"
  8367. "adds r5, r5, r6\n\t"
  8368. "adcs r3, r3, r7\n\t"
  8369. "mov r4, #0\n\t"
  8370. "adc r4, r4, #0\n\t"
  8371. #endif
  8372. "str r5, [%[r]], #4\n\t"
  8373. /* A[63] * B */
  8374. "ldr r8, [%[a]], #4\n\t"
  8375. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8376. "lsl r6, %[b], #16\n\t"
  8377. "lsl r7, r8, #16\n\t"
  8378. "lsr r6, r6, #16\n\t"
  8379. "lsr r7, r7, #16\n\t"
  8380. "mul r7, r6, r7\n\t"
  8381. "adds r3, r3, r7\n\t"
  8382. "adc r4, r4, #0\n\t"
  8383. "lsr r7, r8, #16\n\t"
  8384. "mul r6, r7, r6\n\t"
  8385. "lsr r7, r6, #16\n\t"
  8386. "lsl r6, r6, #16\n\t"
  8387. "adds r3, r3, r6\n\t"
  8388. "adc r4, r4, r7\n\t"
  8389. "lsr r6, %[b], #16\n\t"
  8390. "lsr r7, r8, #16\n\t"
  8391. "mul r7, r6, r7\n\t"
  8392. "add r4, r4, r7\n\t"
  8393. "lsl r7, r8, #16\n\t"
  8394. "lsr r7, r7, #16\n\t"
  8395. "mul r6, r7, r6\n\t"
  8396. "lsr r7, r6, #16\n\t"
  8397. "lsl r6, r6, #16\n\t"
  8398. "adds r3, r3, r6\n\t"
  8399. "adc r4, r4, r7\n\t"
  8400. #else
  8401. "umull r6, r7, %[b], r8\n\t"
  8402. "adds r3, r3, r6\n\t"
  8403. "adc r4, r4, r7\n\t"
  8404. #endif
  8405. "str r3, [%[r]], #4\n\t"
  8406. "str r4, [%[r]]\n\t"
  8407. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  8408. :
  8409. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10"
  8410. );
  8411. }
  8412. #endif /* WOLFSSL_SP_SMALL */
  8413. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  8414. /* r = 2^n mod m where n is the number of bits to reduce by.
  8415. * Given m must be 2048 bits, just need to subtract.
  8416. *
  8417. * r A single precision number.
  8418. * m A single precision number.
  8419. */
  8420. static void sp_2048_mont_norm_32(sp_digit* r, const sp_digit* m)
  8421. {
  8422. XMEMSET(r, 0, sizeof(sp_digit) * 32);
  8423. /* r = 2^n mod m */
  8424. sp_2048_sub_in_place_32(r, m);
  8425. }
  8426. #ifdef WOLFSSL_SP_SMALL
  8427. /* Conditionally subtract b from a using the mask m.
  8428. * m is -1 to subtract and 0 when not copying.
  8429. *
  8430. * r A single precision number representing condition subtract result.
  8431. * a A single precision number to subtract from.
  8432. * b A single precision number to subtract.
  8433. * m Mask value to apply.
  8434. */
  8435. static sp_digit sp_2048_cond_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  8436. {
  8437. register sp_digit* r asm ("r0") = r_p;
  8438. register const sp_digit* a asm ("r1") = a_p;
  8439. register const sp_digit* b asm ("r2") = b_p;
  8440. register sp_digit m asm ("r3") = m_p;
  8441. __asm__ __volatile__ (
  8442. "mov r6, #0\n\t"
  8443. "mov r12, #0\n\t"
  8444. "mov lr, #0\n\t"
  8445. "\n"
  8446. "L_sp_2048_cond_sub_32_words_%=: \n\t"
  8447. "subs r12, r6, r12\n\t"
  8448. "ldr r4, [%[a], lr]\n\t"
  8449. "ldr r5, [%[b], lr]\n\t"
  8450. "and r5, r5, %[m]\n\t"
  8451. "sbcs r4, r4, r5\n\t"
  8452. "sbc r12, r6, r6\n\t"
  8453. "str r4, [%[r], lr]\n\t"
  8454. "add lr, lr, #4\n\t"
  8455. "cmp lr, #0x80\n\t"
  8456. "blt L_sp_2048_cond_sub_32_words_%=\n\t"
  8457. "mov %[r], r12\n\t"
  8458. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  8459. :
  8460. : "memory", "r12", "lr", "r4", "r5", "r6"
  8461. );
  8462. return (uint32_t)(size_t)r;
  8463. }
  8464. #else
  8465. /* Conditionally subtract b from a using the mask m.
  8466. * m is -1 to subtract and 0 when not copying.
  8467. *
  8468. * r A single precision number representing condition subtract result.
  8469. * a A single precision number to subtract from.
  8470. * b A single precision number to subtract.
  8471. * m Mask value to apply.
  8472. */
  8473. static sp_digit sp_2048_cond_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  8474. {
  8475. register sp_digit* r asm ("r0") = r_p;
  8476. register const sp_digit* a asm ("r1") = a_p;
  8477. register const sp_digit* b asm ("r2") = b_p;
  8478. register sp_digit m asm ("r3") = m_p;
  8479. __asm__ __volatile__ (
  8480. "mov lr, #0\n\t"
  8481. "ldm %[a]!, {r4, r5}\n\t"
  8482. "ldm %[b]!, {r6, r7}\n\t"
  8483. "and r6, r6, %[m]\n\t"
  8484. "and r7, r7, %[m]\n\t"
  8485. "subs r4, r4, r6\n\t"
  8486. "sbcs r5, r5, r7\n\t"
  8487. "stm %[r]!, {r4, r5}\n\t"
  8488. "ldm %[a]!, {r4, r5}\n\t"
  8489. "ldm %[b]!, {r6, r7}\n\t"
  8490. "and r6, r6, %[m]\n\t"
  8491. "and r7, r7, %[m]\n\t"
  8492. "sbcs r4, r4, r6\n\t"
  8493. "sbcs r5, r5, r7\n\t"
  8494. "stm %[r]!, {r4, r5}\n\t"
  8495. "ldm %[a]!, {r4, r5}\n\t"
  8496. "ldm %[b]!, {r6, r7}\n\t"
  8497. "and r6, r6, %[m]\n\t"
  8498. "and r7, r7, %[m]\n\t"
  8499. "sbcs r4, r4, r6\n\t"
  8500. "sbcs r5, r5, r7\n\t"
  8501. "stm %[r]!, {r4, r5}\n\t"
  8502. "ldm %[a]!, {r4, r5}\n\t"
  8503. "ldm %[b]!, {r6, r7}\n\t"
  8504. "and r6, r6, %[m]\n\t"
  8505. "and r7, r7, %[m]\n\t"
  8506. "sbcs r4, r4, r6\n\t"
  8507. "sbcs r5, r5, r7\n\t"
  8508. "stm %[r]!, {r4, r5}\n\t"
  8509. "ldm %[a]!, {r4, r5}\n\t"
  8510. "ldm %[b]!, {r6, r7}\n\t"
  8511. "and r6, r6, %[m]\n\t"
  8512. "and r7, r7, %[m]\n\t"
  8513. "sbcs r4, r4, r6\n\t"
  8514. "sbcs r5, r5, r7\n\t"
  8515. "stm %[r]!, {r4, r5}\n\t"
  8516. "ldm %[a]!, {r4, r5}\n\t"
  8517. "ldm %[b]!, {r6, r7}\n\t"
  8518. "and r6, r6, %[m]\n\t"
  8519. "and r7, r7, %[m]\n\t"
  8520. "sbcs r4, r4, r6\n\t"
  8521. "sbcs r5, r5, r7\n\t"
  8522. "stm %[r]!, {r4, r5}\n\t"
  8523. "ldm %[a]!, {r4, r5}\n\t"
  8524. "ldm %[b]!, {r6, r7}\n\t"
  8525. "and r6, r6, %[m]\n\t"
  8526. "and r7, r7, %[m]\n\t"
  8527. "sbcs r4, r4, r6\n\t"
  8528. "sbcs r5, r5, r7\n\t"
  8529. "stm %[r]!, {r4, r5}\n\t"
  8530. "ldm %[a]!, {r4, r5}\n\t"
  8531. "ldm %[b]!, {r6, r7}\n\t"
  8532. "and r6, r6, %[m]\n\t"
  8533. "and r7, r7, %[m]\n\t"
  8534. "sbcs r4, r4, r6\n\t"
  8535. "sbcs r5, r5, r7\n\t"
  8536. "stm %[r]!, {r4, r5}\n\t"
  8537. "ldm %[a]!, {r4, r5}\n\t"
  8538. "ldm %[b]!, {r6, r7}\n\t"
  8539. "and r6, r6, %[m]\n\t"
  8540. "and r7, r7, %[m]\n\t"
  8541. "sbcs r4, r4, r6\n\t"
  8542. "sbcs r5, r5, r7\n\t"
  8543. "stm %[r]!, {r4, r5}\n\t"
  8544. "ldm %[a]!, {r4, r5}\n\t"
  8545. "ldm %[b]!, {r6, r7}\n\t"
  8546. "and r6, r6, %[m]\n\t"
  8547. "and r7, r7, %[m]\n\t"
  8548. "sbcs r4, r4, r6\n\t"
  8549. "sbcs r5, r5, r7\n\t"
  8550. "stm %[r]!, {r4, r5}\n\t"
  8551. "ldm %[a]!, {r4, r5}\n\t"
  8552. "ldm %[b]!, {r6, r7}\n\t"
  8553. "and r6, r6, %[m]\n\t"
  8554. "and r7, r7, %[m]\n\t"
  8555. "sbcs r4, r4, r6\n\t"
  8556. "sbcs r5, r5, r7\n\t"
  8557. "stm %[r]!, {r4, r5}\n\t"
  8558. "ldm %[a]!, {r4, r5}\n\t"
  8559. "ldm %[b]!, {r6, r7}\n\t"
  8560. "and r6, r6, %[m]\n\t"
  8561. "and r7, r7, %[m]\n\t"
  8562. "sbcs r4, r4, r6\n\t"
  8563. "sbcs r5, r5, r7\n\t"
  8564. "stm %[r]!, {r4, r5}\n\t"
  8565. "ldm %[a]!, {r4, r5}\n\t"
  8566. "ldm %[b]!, {r6, r7}\n\t"
  8567. "and r6, r6, %[m]\n\t"
  8568. "and r7, r7, %[m]\n\t"
  8569. "sbcs r4, r4, r6\n\t"
  8570. "sbcs r5, r5, r7\n\t"
  8571. "stm %[r]!, {r4, r5}\n\t"
  8572. "ldm %[a]!, {r4, r5}\n\t"
  8573. "ldm %[b]!, {r6, r7}\n\t"
  8574. "and r6, r6, %[m]\n\t"
  8575. "and r7, r7, %[m]\n\t"
  8576. "sbcs r4, r4, r6\n\t"
  8577. "sbcs r5, r5, r7\n\t"
  8578. "stm %[r]!, {r4, r5}\n\t"
  8579. "ldm %[a]!, {r4, r5}\n\t"
  8580. "ldm %[b]!, {r6, r7}\n\t"
  8581. "and r6, r6, %[m]\n\t"
  8582. "and r7, r7, %[m]\n\t"
  8583. "sbcs r4, r4, r6\n\t"
  8584. "sbcs r5, r5, r7\n\t"
  8585. "stm %[r]!, {r4, r5}\n\t"
  8586. "ldm %[a]!, {r4, r5}\n\t"
  8587. "ldm %[b]!, {r6, r7}\n\t"
  8588. "and r6, r6, %[m]\n\t"
  8589. "and r7, r7, %[m]\n\t"
  8590. "sbcs r4, r4, r6\n\t"
  8591. "sbcs r5, r5, r7\n\t"
  8592. "stm %[r]!, {r4, r5}\n\t"
  8593. "sbc %[r], lr, lr\n\t"
  8594. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  8595. :
  8596. : "memory", "r12", "lr", "r4", "r5", "r6", "r7"
  8597. );
  8598. return (uint32_t)(size_t)r;
  8599. }
  8600. #endif /* WOLFSSL_SP_SMALL */
  8601. /* Reduce the number back to 2048 bits using Montgomery reduction.
  8602. *
  8603. * a A single precision number to reduce in place.
  8604. * m The single precision number representing the modulus.
  8605. * mp The digit representing the negative inverse of m mod 2^n.
  8606. */
  8607. static SP_NOINLINE void sp_2048_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  8608. {
  8609. register sp_digit* a asm ("r0") = a_p;
  8610. register const sp_digit* m asm ("r1") = m_p;
  8611. register sp_digit mp asm ("r2") = mp_p;
  8612. __asm__ __volatile__ (
  8613. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  8614. "ldr r11, [%[m]]\n\t"
  8615. #endif
  8616. /* i = 0 */
  8617. "mov r9, #0\n\t"
  8618. "mov r3, #0\n\t"
  8619. "ldr r12, [%[a]]\n\t"
  8620. "ldr lr, [%[a], #4]\n\t"
  8621. "\n"
  8622. "L_sp_2048_mont_reduce_32_word_%=: \n\t"
  8623. /* mu = a[i] * mp */
  8624. "mul r8, %[mp], r12\n\t"
  8625. /* a[i+0] += m[0] * mu */
  8626. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8627. "ldr r11, [%[m]]\n\t"
  8628. #endif
  8629. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8630. "lsr r7, r11, #16\n\t"
  8631. "lsr r6, r8, #16\n\t"
  8632. "mul r5, r6, r7\n\t"
  8633. "lsl r7, r11, #16\n\t"
  8634. "lsr r7, r7, #16\n\t"
  8635. "mul r6, r7, r6\n\t"
  8636. "lsr r7, r6, #16\n\t"
  8637. "lsl r6, r6, #16\n\t"
  8638. "adds r12, r12, r6\n\t"
  8639. "adc r5, r5, r7\n\t"
  8640. "lsl r6, r8, #16\n\t"
  8641. "lsl r7, r11, #16\n\t"
  8642. "lsr r6, r6, #16\n\t"
  8643. "lsr r7, r7, #16\n\t"
  8644. "mul r7, r6, r7\n\t"
  8645. "adds r12, r12, r7\n\t"
  8646. "adc r5, r5, #0\n\t"
  8647. "lsr r7, r11, #16\n\t"
  8648. "mul r6, r7, r6\n\t"
  8649. "lsr r7, r6, #16\n\t"
  8650. "lsl r6, r6, #16\n\t"
  8651. "adds r12, r12, r6\n\t"
  8652. "adc r5, r5, r7\n\t"
  8653. #else
  8654. "umull r6, r7, r8, r11\n\t"
  8655. "adds r12, r12, r6\n\t"
  8656. "adc r5, r7, #0\n\t"
  8657. #endif
  8658. /* a[i+1] += m[1] * mu */
  8659. "ldr r7, [%[m], #4]\n\t"
  8660. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8661. "lsr r10, r7, #16\n\t"
  8662. "lsr r6, r8, #16\n\t"
  8663. "mul r4, r6, r10\n\t"
  8664. "lsl r10, r7, #16\n\t"
  8665. "lsr r10, r10, #16\n\t"
  8666. "mul r6, r10, r6\n\t"
  8667. "lsr r10, r6, #16\n\t"
  8668. "lsl r6, r6, #16\n\t"
  8669. "adds lr, lr, r6\n\t"
  8670. "adc r4, r4, r10\n\t"
  8671. "lsl r6, r8, #16\n\t"
  8672. "lsl r10, r7, #16\n\t"
  8673. "lsr r6, r6, #16\n\t"
  8674. "lsr r10, r10, #16\n\t"
  8675. "mul r10, r6, r10\n\t"
  8676. "adds lr, lr, r10\n\t"
  8677. "adc r4, r4, #0\n\t"
  8678. "lsr r10, r7, #16\n\t"
  8679. "mul r6, r10, r6\n\t"
  8680. "lsr r10, r6, #16\n\t"
  8681. "lsl r6, r6, #16\n\t"
  8682. "adds lr, lr, r6\n\t"
  8683. "adc r4, r4, r10\n\t"
  8684. #else
  8685. "umull r6, r10, r8, r7\n\t"
  8686. "adds lr, lr, r6\n\t"
  8687. "adc r4, r10, #0\n\t"
  8688. #endif
  8689. "mov r12, lr\n\t"
  8690. "adds r12, r12, r5\n\t"
  8691. "adc r4, r4, #0\n\t"
  8692. /* a[i+2] += m[2] * mu */
  8693. "ldr r7, [%[m], #8]\n\t"
  8694. "ldr lr, [%[a], #8]\n\t"
  8695. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8696. "lsr r10, r7, #16\n\t"
  8697. "lsr r6, r8, #16\n\t"
  8698. "mul r5, r6, r10\n\t"
  8699. "lsl r10, r7, #16\n\t"
  8700. "lsr r10, r10, #16\n\t"
  8701. "mul r6, r10, r6\n\t"
  8702. "lsr r10, r6, #16\n\t"
  8703. "lsl r6, r6, #16\n\t"
  8704. "adds lr, lr, r6\n\t"
  8705. "adc r5, r5, r10\n\t"
  8706. "lsl r6, r8, #16\n\t"
  8707. "lsl r10, r7, #16\n\t"
  8708. "lsr r6, r6, #16\n\t"
  8709. "lsr r10, r10, #16\n\t"
  8710. "mul r10, r6, r10\n\t"
  8711. "adds lr, lr, r10\n\t"
  8712. "adc r5, r5, #0\n\t"
  8713. "lsr r10, r7, #16\n\t"
  8714. "mul r6, r10, r6\n\t"
  8715. "lsr r10, r6, #16\n\t"
  8716. "lsl r6, r6, #16\n\t"
  8717. "adds lr, lr, r6\n\t"
  8718. "adc r5, r5, r10\n\t"
  8719. #else
  8720. "umull r6, r10, r8, r7\n\t"
  8721. "adds lr, lr, r6\n\t"
  8722. "adc r5, r10, #0\n\t"
  8723. #endif
  8724. "adds lr, lr, r4\n\t"
  8725. "adc r5, r5, #0\n\t"
  8726. /* a[i+3] += m[3] * mu */
  8727. "ldr r7, [%[m], #12]\n\t"
  8728. "ldr r10, [%[a], #12]\n\t"
  8729. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8730. "lsr r11, r7, #16\n\t"
  8731. "lsr r6, r8, #16\n\t"
  8732. "mul r4, r6, r11\n\t"
  8733. "lsl r11, r7, #16\n\t"
  8734. "lsr r11, r11, #16\n\t"
  8735. "mul r6, r11, r6\n\t"
  8736. "lsr r11, r6, #16\n\t"
  8737. "lsl r6, r6, #16\n\t"
  8738. "adds r10, r10, r6\n\t"
  8739. "adc r4, r4, r11\n\t"
  8740. "lsl r6, r8, #16\n\t"
  8741. "lsl r11, r7, #16\n\t"
  8742. "lsr r6, r6, #16\n\t"
  8743. "lsr r11, r11, #16\n\t"
  8744. "mul r11, r6, r11\n\t"
  8745. "adds r10, r10, r11\n\t"
  8746. "adc r4, r4, #0\n\t"
  8747. "lsr r11, r7, #16\n\t"
  8748. "mul r6, r11, r6\n\t"
  8749. "lsr r11, r6, #16\n\t"
  8750. "lsl r6, r6, #16\n\t"
  8751. "adds r10, r10, r6\n\t"
  8752. "adc r4, r4, r11\n\t"
  8753. #else
  8754. "umull r6, r7, r8, r7\n\t"
  8755. "adds r10, r10, r6\n\t"
  8756. "adc r4, r7, #0\n\t"
  8757. #endif
  8758. "adds r10, r10, r5\n\t"
  8759. "str r10, [%[a], #12]\n\t"
  8760. "adc r4, r4, #0\n\t"
  8761. /* a[i+4] += m[4] * mu */
  8762. "ldr r7, [%[m], #16]\n\t"
  8763. "ldr r10, [%[a], #16]\n\t"
  8764. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8765. "lsr r11, r7, #16\n\t"
  8766. "lsr r6, r8, #16\n\t"
  8767. "mul r5, r6, r11\n\t"
  8768. "lsl r11, r7, #16\n\t"
  8769. "lsr r11, r11, #16\n\t"
  8770. "mul r6, r11, r6\n\t"
  8771. "lsr r11, r6, #16\n\t"
  8772. "lsl r6, r6, #16\n\t"
  8773. "adds r10, r10, r6\n\t"
  8774. "adc r5, r5, r11\n\t"
  8775. "lsl r6, r8, #16\n\t"
  8776. "lsl r11, r7, #16\n\t"
  8777. "lsr r6, r6, #16\n\t"
  8778. "lsr r11, r11, #16\n\t"
  8779. "mul r11, r6, r11\n\t"
  8780. "adds r10, r10, r11\n\t"
  8781. "adc r5, r5, #0\n\t"
  8782. "lsr r11, r7, #16\n\t"
  8783. "mul r6, r11, r6\n\t"
  8784. "lsr r11, r6, #16\n\t"
  8785. "lsl r6, r6, #16\n\t"
  8786. "adds r10, r10, r6\n\t"
  8787. "adc r5, r5, r11\n\t"
  8788. #else
  8789. "umull r6, r7, r8, r7\n\t"
  8790. "adds r10, r10, r6\n\t"
  8791. "adc r5, r7, #0\n\t"
  8792. #endif
  8793. "adds r10, r10, r4\n\t"
  8794. "str r10, [%[a], #16]\n\t"
  8795. "adc r5, r5, #0\n\t"
  8796. /* a[i+5] += m[5] * mu */
  8797. "ldr r7, [%[m], #20]\n\t"
  8798. "ldr r10, [%[a], #20]\n\t"
  8799. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8800. "lsr r11, r7, #16\n\t"
  8801. "lsr r6, r8, #16\n\t"
  8802. "mul r4, r6, r11\n\t"
  8803. "lsl r11, r7, #16\n\t"
  8804. "lsr r11, r11, #16\n\t"
  8805. "mul r6, r11, r6\n\t"
  8806. "lsr r11, r6, #16\n\t"
  8807. "lsl r6, r6, #16\n\t"
  8808. "adds r10, r10, r6\n\t"
  8809. "adc r4, r4, r11\n\t"
  8810. "lsl r6, r8, #16\n\t"
  8811. "lsl r11, r7, #16\n\t"
  8812. "lsr r6, r6, #16\n\t"
  8813. "lsr r11, r11, #16\n\t"
  8814. "mul r11, r6, r11\n\t"
  8815. "adds r10, r10, r11\n\t"
  8816. "adc r4, r4, #0\n\t"
  8817. "lsr r11, r7, #16\n\t"
  8818. "mul r6, r11, r6\n\t"
  8819. "lsr r11, r6, #16\n\t"
  8820. "lsl r6, r6, #16\n\t"
  8821. "adds r10, r10, r6\n\t"
  8822. "adc r4, r4, r11\n\t"
  8823. #else
  8824. "umull r6, r7, r8, r7\n\t"
  8825. "adds r10, r10, r6\n\t"
  8826. "adc r4, r7, #0\n\t"
  8827. #endif
  8828. "adds r10, r10, r5\n\t"
  8829. "str r10, [%[a], #20]\n\t"
  8830. "adc r4, r4, #0\n\t"
  8831. /* a[i+6] += m[6] * mu */
  8832. "ldr r7, [%[m], #24]\n\t"
  8833. "ldr r10, [%[a], #24]\n\t"
  8834. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8835. "lsr r11, r7, #16\n\t"
  8836. "lsr r6, r8, #16\n\t"
  8837. "mul r5, r6, r11\n\t"
  8838. "lsl r11, r7, #16\n\t"
  8839. "lsr r11, r11, #16\n\t"
  8840. "mul r6, r11, r6\n\t"
  8841. "lsr r11, r6, #16\n\t"
  8842. "lsl r6, r6, #16\n\t"
  8843. "adds r10, r10, r6\n\t"
  8844. "adc r5, r5, r11\n\t"
  8845. "lsl r6, r8, #16\n\t"
  8846. "lsl r11, r7, #16\n\t"
  8847. "lsr r6, r6, #16\n\t"
  8848. "lsr r11, r11, #16\n\t"
  8849. "mul r11, r6, r11\n\t"
  8850. "adds r10, r10, r11\n\t"
  8851. "adc r5, r5, #0\n\t"
  8852. "lsr r11, r7, #16\n\t"
  8853. "mul r6, r11, r6\n\t"
  8854. "lsr r11, r6, #16\n\t"
  8855. "lsl r6, r6, #16\n\t"
  8856. "adds r10, r10, r6\n\t"
  8857. "adc r5, r5, r11\n\t"
  8858. #else
  8859. "umull r6, r7, r8, r7\n\t"
  8860. "adds r10, r10, r6\n\t"
  8861. "adc r5, r7, #0\n\t"
  8862. #endif
  8863. "adds r10, r10, r4\n\t"
  8864. "str r10, [%[a], #24]\n\t"
  8865. "adc r5, r5, #0\n\t"
  8866. /* a[i+7] += m[7] * mu */
  8867. "ldr r7, [%[m], #28]\n\t"
  8868. "ldr r10, [%[a], #28]\n\t"
  8869. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8870. "lsr r11, r7, #16\n\t"
  8871. "lsr r6, r8, #16\n\t"
  8872. "mul r4, r6, r11\n\t"
  8873. "lsl r11, r7, #16\n\t"
  8874. "lsr r11, r11, #16\n\t"
  8875. "mul r6, r11, r6\n\t"
  8876. "lsr r11, r6, #16\n\t"
  8877. "lsl r6, r6, #16\n\t"
  8878. "adds r10, r10, r6\n\t"
  8879. "adc r4, r4, r11\n\t"
  8880. "lsl r6, r8, #16\n\t"
  8881. "lsl r11, r7, #16\n\t"
  8882. "lsr r6, r6, #16\n\t"
  8883. "lsr r11, r11, #16\n\t"
  8884. "mul r11, r6, r11\n\t"
  8885. "adds r10, r10, r11\n\t"
  8886. "adc r4, r4, #0\n\t"
  8887. "lsr r11, r7, #16\n\t"
  8888. "mul r6, r11, r6\n\t"
  8889. "lsr r11, r6, #16\n\t"
  8890. "lsl r6, r6, #16\n\t"
  8891. "adds r10, r10, r6\n\t"
  8892. "adc r4, r4, r11\n\t"
  8893. #else
  8894. "umull r6, r7, r8, r7\n\t"
  8895. "adds r10, r10, r6\n\t"
  8896. "adc r4, r7, #0\n\t"
  8897. #endif
  8898. "adds r10, r10, r5\n\t"
  8899. "str r10, [%[a], #28]\n\t"
  8900. "adc r4, r4, #0\n\t"
  8901. /* a[i+8] += m[8] * mu */
  8902. "ldr r7, [%[m], #32]\n\t"
  8903. "ldr r10, [%[a], #32]\n\t"
  8904. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8905. "lsr r11, r7, #16\n\t"
  8906. "lsr r6, r8, #16\n\t"
  8907. "mul r5, r6, r11\n\t"
  8908. "lsl r11, r7, #16\n\t"
  8909. "lsr r11, r11, #16\n\t"
  8910. "mul r6, r11, r6\n\t"
  8911. "lsr r11, r6, #16\n\t"
  8912. "lsl r6, r6, #16\n\t"
  8913. "adds r10, r10, r6\n\t"
  8914. "adc r5, r5, r11\n\t"
  8915. "lsl r6, r8, #16\n\t"
  8916. "lsl r11, r7, #16\n\t"
  8917. "lsr r6, r6, #16\n\t"
  8918. "lsr r11, r11, #16\n\t"
  8919. "mul r11, r6, r11\n\t"
  8920. "adds r10, r10, r11\n\t"
  8921. "adc r5, r5, #0\n\t"
  8922. "lsr r11, r7, #16\n\t"
  8923. "mul r6, r11, r6\n\t"
  8924. "lsr r11, r6, #16\n\t"
  8925. "lsl r6, r6, #16\n\t"
  8926. "adds r10, r10, r6\n\t"
  8927. "adc r5, r5, r11\n\t"
  8928. #else
  8929. "umull r6, r7, r8, r7\n\t"
  8930. "adds r10, r10, r6\n\t"
  8931. "adc r5, r7, #0\n\t"
  8932. #endif
  8933. "adds r10, r10, r4\n\t"
  8934. "str r10, [%[a], #32]\n\t"
  8935. "adc r5, r5, #0\n\t"
  8936. /* a[i+9] += m[9] * mu */
  8937. "ldr r7, [%[m], #36]\n\t"
  8938. "ldr r10, [%[a], #36]\n\t"
  8939. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8940. "lsr r11, r7, #16\n\t"
  8941. "lsr r6, r8, #16\n\t"
  8942. "mul r4, r6, r11\n\t"
  8943. "lsl r11, r7, #16\n\t"
  8944. "lsr r11, r11, #16\n\t"
  8945. "mul r6, r11, r6\n\t"
  8946. "lsr r11, r6, #16\n\t"
  8947. "lsl r6, r6, #16\n\t"
  8948. "adds r10, r10, r6\n\t"
  8949. "adc r4, r4, r11\n\t"
  8950. "lsl r6, r8, #16\n\t"
  8951. "lsl r11, r7, #16\n\t"
  8952. "lsr r6, r6, #16\n\t"
  8953. "lsr r11, r11, #16\n\t"
  8954. "mul r11, r6, r11\n\t"
  8955. "adds r10, r10, r11\n\t"
  8956. "adc r4, r4, #0\n\t"
  8957. "lsr r11, r7, #16\n\t"
  8958. "mul r6, r11, r6\n\t"
  8959. "lsr r11, r6, #16\n\t"
  8960. "lsl r6, r6, #16\n\t"
  8961. "adds r10, r10, r6\n\t"
  8962. "adc r4, r4, r11\n\t"
  8963. #else
  8964. "umull r6, r7, r8, r7\n\t"
  8965. "adds r10, r10, r6\n\t"
  8966. "adc r4, r7, #0\n\t"
  8967. #endif
  8968. "adds r10, r10, r5\n\t"
  8969. "str r10, [%[a], #36]\n\t"
  8970. "adc r4, r4, #0\n\t"
  8971. /* a[i+10] += m[10] * mu */
  8972. "ldr r7, [%[m], #40]\n\t"
  8973. "ldr r10, [%[a], #40]\n\t"
  8974. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  8975. "lsr r11, r7, #16\n\t"
  8976. "lsr r6, r8, #16\n\t"
  8977. "mul r5, r6, r11\n\t"
  8978. "lsl r11, r7, #16\n\t"
  8979. "lsr r11, r11, #16\n\t"
  8980. "mul r6, r11, r6\n\t"
  8981. "lsr r11, r6, #16\n\t"
  8982. "lsl r6, r6, #16\n\t"
  8983. "adds r10, r10, r6\n\t"
  8984. "adc r5, r5, r11\n\t"
  8985. "lsl r6, r8, #16\n\t"
  8986. "lsl r11, r7, #16\n\t"
  8987. "lsr r6, r6, #16\n\t"
  8988. "lsr r11, r11, #16\n\t"
  8989. "mul r11, r6, r11\n\t"
  8990. "adds r10, r10, r11\n\t"
  8991. "adc r5, r5, #0\n\t"
  8992. "lsr r11, r7, #16\n\t"
  8993. "mul r6, r11, r6\n\t"
  8994. "lsr r11, r6, #16\n\t"
  8995. "lsl r6, r6, #16\n\t"
  8996. "adds r10, r10, r6\n\t"
  8997. "adc r5, r5, r11\n\t"
  8998. #else
  8999. "umull r6, r7, r8, r7\n\t"
  9000. "adds r10, r10, r6\n\t"
  9001. "adc r5, r7, #0\n\t"
  9002. #endif
  9003. "adds r10, r10, r4\n\t"
  9004. "str r10, [%[a], #40]\n\t"
  9005. "adc r5, r5, #0\n\t"
  9006. /* a[i+11] += m[11] * mu */
  9007. "ldr r7, [%[m], #44]\n\t"
  9008. "ldr r10, [%[a], #44]\n\t"
  9009. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9010. "lsr r11, r7, #16\n\t"
  9011. "lsr r6, r8, #16\n\t"
  9012. "mul r4, r6, r11\n\t"
  9013. "lsl r11, r7, #16\n\t"
  9014. "lsr r11, r11, #16\n\t"
  9015. "mul r6, r11, r6\n\t"
  9016. "lsr r11, r6, #16\n\t"
  9017. "lsl r6, r6, #16\n\t"
  9018. "adds r10, r10, r6\n\t"
  9019. "adc r4, r4, r11\n\t"
  9020. "lsl r6, r8, #16\n\t"
  9021. "lsl r11, r7, #16\n\t"
  9022. "lsr r6, r6, #16\n\t"
  9023. "lsr r11, r11, #16\n\t"
  9024. "mul r11, r6, r11\n\t"
  9025. "adds r10, r10, r11\n\t"
  9026. "adc r4, r4, #0\n\t"
  9027. "lsr r11, r7, #16\n\t"
  9028. "mul r6, r11, r6\n\t"
  9029. "lsr r11, r6, #16\n\t"
  9030. "lsl r6, r6, #16\n\t"
  9031. "adds r10, r10, r6\n\t"
  9032. "adc r4, r4, r11\n\t"
  9033. #else
  9034. "umull r6, r7, r8, r7\n\t"
  9035. "adds r10, r10, r6\n\t"
  9036. "adc r4, r7, #0\n\t"
  9037. #endif
  9038. "adds r10, r10, r5\n\t"
  9039. "str r10, [%[a], #44]\n\t"
  9040. "adc r4, r4, #0\n\t"
  9041. /* a[i+12] += m[12] * mu */
  9042. "ldr r7, [%[m], #48]\n\t"
  9043. "ldr r10, [%[a], #48]\n\t"
  9044. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9045. "lsr r11, r7, #16\n\t"
  9046. "lsr r6, r8, #16\n\t"
  9047. "mul r5, r6, r11\n\t"
  9048. "lsl r11, r7, #16\n\t"
  9049. "lsr r11, r11, #16\n\t"
  9050. "mul r6, r11, r6\n\t"
  9051. "lsr r11, r6, #16\n\t"
  9052. "lsl r6, r6, #16\n\t"
  9053. "adds r10, r10, r6\n\t"
  9054. "adc r5, r5, r11\n\t"
  9055. "lsl r6, r8, #16\n\t"
  9056. "lsl r11, r7, #16\n\t"
  9057. "lsr r6, r6, #16\n\t"
  9058. "lsr r11, r11, #16\n\t"
  9059. "mul r11, r6, r11\n\t"
  9060. "adds r10, r10, r11\n\t"
  9061. "adc r5, r5, #0\n\t"
  9062. "lsr r11, r7, #16\n\t"
  9063. "mul r6, r11, r6\n\t"
  9064. "lsr r11, r6, #16\n\t"
  9065. "lsl r6, r6, #16\n\t"
  9066. "adds r10, r10, r6\n\t"
  9067. "adc r5, r5, r11\n\t"
  9068. #else
  9069. "umull r6, r7, r8, r7\n\t"
  9070. "adds r10, r10, r6\n\t"
  9071. "adc r5, r7, #0\n\t"
  9072. #endif
  9073. "adds r10, r10, r4\n\t"
  9074. "str r10, [%[a], #48]\n\t"
  9075. "adc r5, r5, #0\n\t"
  9076. /* a[i+13] += m[13] * mu */
  9077. "ldr r7, [%[m], #52]\n\t"
  9078. "ldr r10, [%[a], #52]\n\t"
  9079. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9080. "lsr r11, r7, #16\n\t"
  9081. "lsr r6, r8, #16\n\t"
  9082. "mul r4, r6, r11\n\t"
  9083. "lsl r11, r7, #16\n\t"
  9084. "lsr r11, r11, #16\n\t"
  9085. "mul r6, r11, r6\n\t"
  9086. "lsr r11, r6, #16\n\t"
  9087. "lsl r6, r6, #16\n\t"
  9088. "adds r10, r10, r6\n\t"
  9089. "adc r4, r4, r11\n\t"
  9090. "lsl r6, r8, #16\n\t"
  9091. "lsl r11, r7, #16\n\t"
  9092. "lsr r6, r6, #16\n\t"
  9093. "lsr r11, r11, #16\n\t"
  9094. "mul r11, r6, r11\n\t"
  9095. "adds r10, r10, r11\n\t"
  9096. "adc r4, r4, #0\n\t"
  9097. "lsr r11, r7, #16\n\t"
  9098. "mul r6, r11, r6\n\t"
  9099. "lsr r11, r6, #16\n\t"
  9100. "lsl r6, r6, #16\n\t"
  9101. "adds r10, r10, r6\n\t"
  9102. "adc r4, r4, r11\n\t"
  9103. #else
  9104. "umull r6, r7, r8, r7\n\t"
  9105. "adds r10, r10, r6\n\t"
  9106. "adc r4, r7, #0\n\t"
  9107. #endif
  9108. "adds r10, r10, r5\n\t"
  9109. "str r10, [%[a], #52]\n\t"
  9110. "adc r4, r4, #0\n\t"
  9111. /* a[i+14] += m[14] * mu */
  9112. "ldr r7, [%[m], #56]\n\t"
  9113. "ldr r10, [%[a], #56]\n\t"
  9114. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9115. "lsr r11, r7, #16\n\t"
  9116. "lsr r6, r8, #16\n\t"
  9117. "mul r5, r6, r11\n\t"
  9118. "lsl r11, r7, #16\n\t"
  9119. "lsr r11, r11, #16\n\t"
  9120. "mul r6, r11, r6\n\t"
  9121. "lsr r11, r6, #16\n\t"
  9122. "lsl r6, r6, #16\n\t"
  9123. "adds r10, r10, r6\n\t"
  9124. "adc r5, r5, r11\n\t"
  9125. "lsl r6, r8, #16\n\t"
  9126. "lsl r11, r7, #16\n\t"
  9127. "lsr r6, r6, #16\n\t"
  9128. "lsr r11, r11, #16\n\t"
  9129. "mul r11, r6, r11\n\t"
  9130. "adds r10, r10, r11\n\t"
  9131. "adc r5, r5, #0\n\t"
  9132. "lsr r11, r7, #16\n\t"
  9133. "mul r6, r11, r6\n\t"
  9134. "lsr r11, r6, #16\n\t"
  9135. "lsl r6, r6, #16\n\t"
  9136. "adds r10, r10, r6\n\t"
  9137. "adc r5, r5, r11\n\t"
  9138. #else
  9139. "umull r6, r7, r8, r7\n\t"
  9140. "adds r10, r10, r6\n\t"
  9141. "adc r5, r7, #0\n\t"
  9142. #endif
  9143. "adds r10, r10, r4\n\t"
  9144. "str r10, [%[a], #56]\n\t"
  9145. "adc r5, r5, #0\n\t"
  9146. /* a[i+15] += m[15] * mu */
  9147. "ldr r7, [%[m], #60]\n\t"
  9148. "ldr r10, [%[a], #60]\n\t"
  9149. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9150. "lsr r11, r7, #16\n\t"
  9151. "lsr r6, r8, #16\n\t"
  9152. "mul r4, r6, r11\n\t"
  9153. "lsl r11, r7, #16\n\t"
  9154. "lsr r11, r11, #16\n\t"
  9155. "mul r6, r11, r6\n\t"
  9156. "lsr r11, r6, #16\n\t"
  9157. "lsl r6, r6, #16\n\t"
  9158. "adds r10, r10, r6\n\t"
  9159. "adc r4, r4, r11\n\t"
  9160. "lsl r6, r8, #16\n\t"
  9161. "lsl r11, r7, #16\n\t"
  9162. "lsr r6, r6, #16\n\t"
  9163. "lsr r11, r11, #16\n\t"
  9164. "mul r11, r6, r11\n\t"
  9165. "adds r10, r10, r11\n\t"
  9166. "adc r4, r4, #0\n\t"
  9167. "lsr r11, r7, #16\n\t"
  9168. "mul r6, r11, r6\n\t"
  9169. "lsr r11, r6, #16\n\t"
  9170. "lsl r6, r6, #16\n\t"
  9171. "adds r10, r10, r6\n\t"
  9172. "adc r4, r4, r11\n\t"
  9173. #else
  9174. "umull r6, r7, r8, r7\n\t"
  9175. "adds r10, r10, r6\n\t"
  9176. "adc r4, r7, #0\n\t"
  9177. #endif
  9178. "adds r10, r10, r5\n\t"
  9179. "str r10, [%[a], #60]\n\t"
  9180. "adc r4, r4, #0\n\t"
  9181. /* a[i+16] += m[16] * mu */
  9182. "ldr r7, [%[m], #64]\n\t"
  9183. "ldr r10, [%[a], #64]\n\t"
  9184. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9185. "lsr r11, r7, #16\n\t"
  9186. "lsr r6, r8, #16\n\t"
  9187. "mul r5, r6, r11\n\t"
  9188. "lsl r11, r7, #16\n\t"
  9189. "lsr r11, r11, #16\n\t"
  9190. "mul r6, r11, r6\n\t"
  9191. "lsr r11, r6, #16\n\t"
  9192. "lsl r6, r6, #16\n\t"
  9193. "adds r10, r10, r6\n\t"
  9194. "adc r5, r5, r11\n\t"
  9195. "lsl r6, r8, #16\n\t"
  9196. "lsl r11, r7, #16\n\t"
  9197. "lsr r6, r6, #16\n\t"
  9198. "lsr r11, r11, #16\n\t"
  9199. "mul r11, r6, r11\n\t"
  9200. "adds r10, r10, r11\n\t"
  9201. "adc r5, r5, #0\n\t"
  9202. "lsr r11, r7, #16\n\t"
  9203. "mul r6, r11, r6\n\t"
  9204. "lsr r11, r6, #16\n\t"
  9205. "lsl r6, r6, #16\n\t"
  9206. "adds r10, r10, r6\n\t"
  9207. "adc r5, r5, r11\n\t"
  9208. #else
  9209. "umull r6, r7, r8, r7\n\t"
  9210. "adds r10, r10, r6\n\t"
  9211. "adc r5, r7, #0\n\t"
  9212. #endif
  9213. "adds r10, r10, r4\n\t"
  9214. "str r10, [%[a], #64]\n\t"
  9215. "adc r5, r5, #0\n\t"
  9216. /* a[i+17] += m[17] * mu */
  9217. "ldr r7, [%[m], #68]\n\t"
  9218. "ldr r10, [%[a], #68]\n\t"
  9219. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9220. "lsr r11, r7, #16\n\t"
  9221. "lsr r6, r8, #16\n\t"
  9222. "mul r4, r6, r11\n\t"
  9223. "lsl r11, r7, #16\n\t"
  9224. "lsr r11, r11, #16\n\t"
  9225. "mul r6, r11, r6\n\t"
  9226. "lsr r11, r6, #16\n\t"
  9227. "lsl r6, r6, #16\n\t"
  9228. "adds r10, r10, r6\n\t"
  9229. "adc r4, r4, r11\n\t"
  9230. "lsl r6, r8, #16\n\t"
  9231. "lsl r11, r7, #16\n\t"
  9232. "lsr r6, r6, #16\n\t"
  9233. "lsr r11, r11, #16\n\t"
  9234. "mul r11, r6, r11\n\t"
  9235. "adds r10, r10, r11\n\t"
  9236. "adc r4, r4, #0\n\t"
  9237. "lsr r11, r7, #16\n\t"
  9238. "mul r6, r11, r6\n\t"
  9239. "lsr r11, r6, #16\n\t"
  9240. "lsl r6, r6, #16\n\t"
  9241. "adds r10, r10, r6\n\t"
  9242. "adc r4, r4, r11\n\t"
  9243. #else
  9244. "umull r6, r7, r8, r7\n\t"
  9245. "adds r10, r10, r6\n\t"
  9246. "adc r4, r7, #0\n\t"
  9247. #endif
  9248. "adds r10, r10, r5\n\t"
  9249. "str r10, [%[a], #68]\n\t"
  9250. "adc r4, r4, #0\n\t"
  9251. /* a[i+18] += m[18] * mu */
  9252. "ldr r7, [%[m], #72]\n\t"
  9253. "ldr r10, [%[a], #72]\n\t"
  9254. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9255. "lsr r11, r7, #16\n\t"
  9256. "lsr r6, r8, #16\n\t"
  9257. "mul r5, r6, r11\n\t"
  9258. "lsl r11, r7, #16\n\t"
  9259. "lsr r11, r11, #16\n\t"
  9260. "mul r6, r11, r6\n\t"
  9261. "lsr r11, r6, #16\n\t"
  9262. "lsl r6, r6, #16\n\t"
  9263. "adds r10, r10, r6\n\t"
  9264. "adc r5, r5, r11\n\t"
  9265. "lsl r6, r8, #16\n\t"
  9266. "lsl r11, r7, #16\n\t"
  9267. "lsr r6, r6, #16\n\t"
  9268. "lsr r11, r11, #16\n\t"
  9269. "mul r11, r6, r11\n\t"
  9270. "adds r10, r10, r11\n\t"
  9271. "adc r5, r5, #0\n\t"
  9272. "lsr r11, r7, #16\n\t"
  9273. "mul r6, r11, r6\n\t"
  9274. "lsr r11, r6, #16\n\t"
  9275. "lsl r6, r6, #16\n\t"
  9276. "adds r10, r10, r6\n\t"
  9277. "adc r5, r5, r11\n\t"
  9278. #else
  9279. "umull r6, r7, r8, r7\n\t"
  9280. "adds r10, r10, r6\n\t"
  9281. "adc r5, r7, #0\n\t"
  9282. #endif
  9283. "adds r10, r10, r4\n\t"
  9284. "str r10, [%[a], #72]\n\t"
  9285. "adc r5, r5, #0\n\t"
  9286. /* a[i+19] += m[19] * mu */
  9287. "ldr r7, [%[m], #76]\n\t"
  9288. "ldr r10, [%[a], #76]\n\t"
  9289. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9290. "lsr r11, r7, #16\n\t"
  9291. "lsr r6, r8, #16\n\t"
  9292. "mul r4, r6, r11\n\t"
  9293. "lsl r11, r7, #16\n\t"
  9294. "lsr r11, r11, #16\n\t"
  9295. "mul r6, r11, r6\n\t"
  9296. "lsr r11, r6, #16\n\t"
  9297. "lsl r6, r6, #16\n\t"
  9298. "adds r10, r10, r6\n\t"
  9299. "adc r4, r4, r11\n\t"
  9300. "lsl r6, r8, #16\n\t"
  9301. "lsl r11, r7, #16\n\t"
  9302. "lsr r6, r6, #16\n\t"
  9303. "lsr r11, r11, #16\n\t"
  9304. "mul r11, r6, r11\n\t"
  9305. "adds r10, r10, r11\n\t"
  9306. "adc r4, r4, #0\n\t"
  9307. "lsr r11, r7, #16\n\t"
  9308. "mul r6, r11, r6\n\t"
  9309. "lsr r11, r6, #16\n\t"
  9310. "lsl r6, r6, #16\n\t"
  9311. "adds r10, r10, r6\n\t"
  9312. "adc r4, r4, r11\n\t"
  9313. #else
  9314. "umull r6, r7, r8, r7\n\t"
  9315. "adds r10, r10, r6\n\t"
  9316. "adc r4, r7, #0\n\t"
  9317. #endif
  9318. "adds r10, r10, r5\n\t"
  9319. "str r10, [%[a], #76]\n\t"
  9320. "adc r4, r4, #0\n\t"
  9321. /* a[i+20] += m[20] * mu */
  9322. "ldr r7, [%[m], #80]\n\t"
  9323. "ldr r10, [%[a], #80]\n\t"
  9324. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9325. "lsr r11, r7, #16\n\t"
  9326. "lsr r6, r8, #16\n\t"
  9327. "mul r5, r6, r11\n\t"
  9328. "lsl r11, r7, #16\n\t"
  9329. "lsr r11, r11, #16\n\t"
  9330. "mul r6, r11, r6\n\t"
  9331. "lsr r11, r6, #16\n\t"
  9332. "lsl r6, r6, #16\n\t"
  9333. "adds r10, r10, r6\n\t"
  9334. "adc r5, r5, r11\n\t"
  9335. "lsl r6, r8, #16\n\t"
  9336. "lsl r11, r7, #16\n\t"
  9337. "lsr r6, r6, #16\n\t"
  9338. "lsr r11, r11, #16\n\t"
  9339. "mul r11, r6, r11\n\t"
  9340. "adds r10, r10, r11\n\t"
  9341. "adc r5, r5, #0\n\t"
  9342. "lsr r11, r7, #16\n\t"
  9343. "mul r6, r11, r6\n\t"
  9344. "lsr r11, r6, #16\n\t"
  9345. "lsl r6, r6, #16\n\t"
  9346. "adds r10, r10, r6\n\t"
  9347. "adc r5, r5, r11\n\t"
  9348. #else
  9349. "umull r6, r7, r8, r7\n\t"
  9350. "adds r10, r10, r6\n\t"
  9351. "adc r5, r7, #0\n\t"
  9352. #endif
  9353. "adds r10, r10, r4\n\t"
  9354. "str r10, [%[a], #80]\n\t"
  9355. "adc r5, r5, #0\n\t"
  9356. /* a[i+21] += m[21] * mu */
  9357. "ldr r7, [%[m], #84]\n\t"
  9358. "ldr r10, [%[a], #84]\n\t"
  9359. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9360. "lsr r11, r7, #16\n\t"
  9361. "lsr r6, r8, #16\n\t"
  9362. "mul r4, r6, r11\n\t"
  9363. "lsl r11, r7, #16\n\t"
  9364. "lsr r11, r11, #16\n\t"
  9365. "mul r6, r11, r6\n\t"
  9366. "lsr r11, r6, #16\n\t"
  9367. "lsl r6, r6, #16\n\t"
  9368. "adds r10, r10, r6\n\t"
  9369. "adc r4, r4, r11\n\t"
  9370. "lsl r6, r8, #16\n\t"
  9371. "lsl r11, r7, #16\n\t"
  9372. "lsr r6, r6, #16\n\t"
  9373. "lsr r11, r11, #16\n\t"
  9374. "mul r11, r6, r11\n\t"
  9375. "adds r10, r10, r11\n\t"
  9376. "adc r4, r4, #0\n\t"
  9377. "lsr r11, r7, #16\n\t"
  9378. "mul r6, r11, r6\n\t"
  9379. "lsr r11, r6, #16\n\t"
  9380. "lsl r6, r6, #16\n\t"
  9381. "adds r10, r10, r6\n\t"
  9382. "adc r4, r4, r11\n\t"
  9383. #else
  9384. "umull r6, r7, r8, r7\n\t"
  9385. "adds r10, r10, r6\n\t"
  9386. "adc r4, r7, #0\n\t"
  9387. #endif
  9388. "adds r10, r10, r5\n\t"
  9389. "str r10, [%[a], #84]\n\t"
  9390. "adc r4, r4, #0\n\t"
  9391. /* a[i+22] += m[22] * mu */
  9392. "ldr r7, [%[m], #88]\n\t"
  9393. "ldr r10, [%[a], #88]\n\t"
  9394. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9395. "lsr r11, r7, #16\n\t"
  9396. "lsr r6, r8, #16\n\t"
  9397. "mul r5, r6, r11\n\t"
  9398. "lsl r11, r7, #16\n\t"
  9399. "lsr r11, r11, #16\n\t"
  9400. "mul r6, r11, r6\n\t"
  9401. "lsr r11, r6, #16\n\t"
  9402. "lsl r6, r6, #16\n\t"
  9403. "adds r10, r10, r6\n\t"
  9404. "adc r5, r5, r11\n\t"
  9405. "lsl r6, r8, #16\n\t"
  9406. "lsl r11, r7, #16\n\t"
  9407. "lsr r6, r6, #16\n\t"
  9408. "lsr r11, r11, #16\n\t"
  9409. "mul r11, r6, r11\n\t"
  9410. "adds r10, r10, r11\n\t"
  9411. "adc r5, r5, #0\n\t"
  9412. "lsr r11, r7, #16\n\t"
  9413. "mul r6, r11, r6\n\t"
  9414. "lsr r11, r6, #16\n\t"
  9415. "lsl r6, r6, #16\n\t"
  9416. "adds r10, r10, r6\n\t"
  9417. "adc r5, r5, r11\n\t"
  9418. #else
  9419. "umull r6, r7, r8, r7\n\t"
  9420. "adds r10, r10, r6\n\t"
  9421. "adc r5, r7, #0\n\t"
  9422. #endif
  9423. "adds r10, r10, r4\n\t"
  9424. "str r10, [%[a], #88]\n\t"
  9425. "adc r5, r5, #0\n\t"
  9426. /* a[i+23] += m[23] * mu */
  9427. "ldr r7, [%[m], #92]\n\t"
  9428. "ldr r10, [%[a], #92]\n\t"
  9429. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9430. "lsr r11, r7, #16\n\t"
  9431. "lsr r6, r8, #16\n\t"
  9432. "mul r4, r6, r11\n\t"
  9433. "lsl r11, r7, #16\n\t"
  9434. "lsr r11, r11, #16\n\t"
  9435. "mul r6, r11, r6\n\t"
  9436. "lsr r11, r6, #16\n\t"
  9437. "lsl r6, r6, #16\n\t"
  9438. "adds r10, r10, r6\n\t"
  9439. "adc r4, r4, r11\n\t"
  9440. "lsl r6, r8, #16\n\t"
  9441. "lsl r11, r7, #16\n\t"
  9442. "lsr r6, r6, #16\n\t"
  9443. "lsr r11, r11, #16\n\t"
  9444. "mul r11, r6, r11\n\t"
  9445. "adds r10, r10, r11\n\t"
  9446. "adc r4, r4, #0\n\t"
  9447. "lsr r11, r7, #16\n\t"
  9448. "mul r6, r11, r6\n\t"
  9449. "lsr r11, r6, #16\n\t"
  9450. "lsl r6, r6, #16\n\t"
  9451. "adds r10, r10, r6\n\t"
  9452. "adc r4, r4, r11\n\t"
  9453. #else
  9454. "umull r6, r7, r8, r7\n\t"
  9455. "adds r10, r10, r6\n\t"
  9456. "adc r4, r7, #0\n\t"
  9457. #endif
  9458. "adds r10, r10, r5\n\t"
  9459. "str r10, [%[a], #92]\n\t"
  9460. "adc r4, r4, #0\n\t"
  9461. /* a[i+24] += m[24] * mu */
  9462. "ldr r7, [%[m], #96]\n\t"
  9463. "ldr r10, [%[a], #96]\n\t"
  9464. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9465. "lsr r11, r7, #16\n\t"
  9466. "lsr r6, r8, #16\n\t"
  9467. "mul r5, r6, r11\n\t"
  9468. "lsl r11, r7, #16\n\t"
  9469. "lsr r11, r11, #16\n\t"
  9470. "mul r6, r11, r6\n\t"
  9471. "lsr r11, r6, #16\n\t"
  9472. "lsl r6, r6, #16\n\t"
  9473. "adds r10, r10, r6\n\t"
  9474. "adc r5, r5, r11\n\t"
  9475. "lsl r6, r8, #16\n\t"
  9476. "lsl r11, r7, #16\n\t"
  9477. "lsr r6, r6, #16\n\t"
  9478. "lsr r11, r11, #16\n\t"
  9479. "mul r11, r6, r11\n\t"
  9480. "adds r10, r10, r11\n\t"
  9481. "adc r5, r5, #0\n\t"
  9482. "lsr r11, r7, #16\n\t"
  9483. "mul r6, r11, r6\n\t"
  9484. "lsr r11, r6, #16\n\t"
  9485. "lsl r6, r6, #16\n\t"
  9486. "adds r10, r10, r6\n\t"
  9487. "adc r5, r5, r11\n\t"
  9488. #else
  9489. "umull r6, r7, r8, r7\n\t"
  9490. "adds r10, r10, r6\n\t"
  9491. "adc r5, r7, #0\n\t"
  9492. #endif
  9493. "adds r10, r10, r4\n\t"
  9494. "str r10, [%[a], #96]\n\t"
  9495. "adc r5, r5, #0\n\t"
  9496. /* a[i+25] += m[25] * mu */
  9497. "ldr r7, [%[m], #100]\n\t"
  9498. "ldr r10, [%[a], #100]\n\t"
  9499. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9500. "lsr r11, r7, #16\n\t"
  9501. "lsr r6, r8, #16\n\t"
  9502. "mul r4, r6, r11\n\t"
  9503. "lsl r11, r7, #16\n\t"
  9504. "lsr r11, r11, #16\n\t"
  9505. "mul r6, r11, r6\n\t"
  9506. "lsr r11, r6, #16\n\t"
  9507. "lsl r6, r6, #16\n\t"
  9508. "adds r10, r10, r6\n\t"
  9509. "adc r4, r4, r11\n\t"
  9510. "lsl r6, r8, #16\n\t"
  9511. "lsl r11, r7, #16\n\t"
  9512. "lsr r6, r6, #16\n\t"
  9513. "lsr r11, r11, #16\n\t"
  9514. "mul r11, r6, r11\n\t"
  9515. "adds r10, r10, r11\n\t"
  9516. "adc r4, r4, #0\n\t"
  9517. "lsr r11, r7, #16\n\t"
  9518. "mul r6, r11, r6\n\t"
  9519. "lsr r11, r6, #16\n\t"
  9520. "lsl r6, r6, #16\n\t"
  9521. "adds r10, r10, r6\n\t"
  9522. "adc r4, r4, r11\n\t"
  9523. #else
  9524. "umull r6, r7, r8, r7\n\t"
  9525. "adds r10, r10, r6\n\t"
  9526. "adc r4, r7, #0\n\t"
  9527. #endif
  9528. "adds r10, r10, r5\n\t"
  9529. "str r10, [%[a], #100]\n\t"
  9530. "adc r4, r4, #0\n\t"
  9531. /* a[i+26] += m[26] * mu */
  9532. "ldr r7, [%[m], #104]\n\t"
  9533. "ldr r10, [%[a], #104]\n\t"
  9534. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9535. "lsr r11, r7, #16\n\t"
  9536. "lsr r6, r8, #16\n\t"
  9537. "mul r5, r6, r11\n\t"
  9538. "lsl r11, r7, #16\n\t"
  9539. "lsr r11, r11, #16\n\t"
  9540. "mul r6, r11, r6\n\t"
  9541. "lsr r11, r6, #16\n\t"
  9542. "lsl r6, r6, #16\n\t"
  9543. "adds r10, r10, r6\n\t"
  9544. "adc r5, r5, r11\n\t"
  9545. "lsl r6, r8, #16\n\t"
  9546. "lsl r11, r7, #16\n\t"
  9547. "lsr r6, r6, #16\n\t"
  9548. "lsr r11, r11, #16\n\t"
  9549. "mul r11, r6, r11\n\t"
  9550. "adds r10, r10, r11\n\t"
  9551. "adc r5, r5, #0\n\t"
  9552. "lsr r11, r7, #16\n\t"
  9553. "mul r6, r11, r6\n\t"
  9554. "lsr r11, r6, #16\n\t"
  9555. "lsl r6, r6, #16\n\t"
  9556. "adds r10, r10, r6\n\t"
  9557. "adc r5, r5, r11\n\t"
  9558. #else
  9559. "umull r6, r7, r8, r7\n\t"
  9560. "adds r10, r10, r6\n\t"
  9561. "adc r5, r7, #0\n\t"
  9562. #endif
  9563. "adds r10, r10, r4\n\t"
  9564. "str r10, [%[a], #104]\n\t"
  9565. "adc r5, r5, #0\n\t"
  9566. /* a[i+27] += m[27] * mu */
  9567. "ldr r7, [%[m], #108]\n\t"
  9568. "ldr r10, [%[a], #108]\n\t"
  9569. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9570. "lsr r11, r7, #16\n\t"
  9571. "lsr r6, r8, #16\n\t"
  9572. "mul r4, r6, r11\n\t"
  9573. "lsl r11, r7, #16\n\t"
  9574. "lsr r11, r11, #16\n\t"
  9575. "mul r6, r11, r6\n\t"
  9576. "lsr r11, r6, #16\n\t"
  9577. "lsl r6, r6, #16\n\t"
  9578. "adds r10, r10, r6\n\t"
  9579. "adc r4, r4, r11\n\t"
  9580. "lsl r6, r8, #16\n\t"
  9581. "lsl r11, r7, #16\n\t"
  9582. "lsr r6, r6, #16\n\t"
  9583. "lsr r11, r11, #16\n\t"
  9584. "mul r11, r6, r11\n\t"
  9585. "adds r10, r10, r11\n\t"
  9586. "adc r4, r4, #0\n\t"
  9587. "lsr r11, r7, #16\n\t"
  9588. "mul r6, r11, r6\n\t"
  9589. "lsr r11, r6, #16\n\t"
  9590. "lsl r6, r6, #16\n\t"
  9591. "adds r10, r10, r6\n\t"
  9592. "adc r4, r4, r11\n\t"
  9593. #else
  9594. "umull r6, r7, r8, r7\n\t"
  9595. "adds r10, r10, r6\n\t"
  9596. "adc r4, r7, #0\n\t"
  9597. #endif
  9598. "adds r10, r10, r5\n\t"
  9599. "str r10, [%[a], #108]\n\t"
  9600. "adc r4, r4, #0\n\t"
  9601. /* a[i+28] += m[28] * mu */
  9602. "ldr r7, [%[m], #112]\n\t"
  9603. "ldr r10, [%[a], #112]\n\t"
  9604. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9605. "lsr r11, r7, #16\n\t"
  9606. "lsr r6, r8, #16\n\t"
  9607. "mul r5, r6, r11\n\t"
  9608. "lsl r11, r7, #16\n\t"
  9609. "lsr r11, r11, #16\n\t"
  9610. "mul r6, r11, r6\n\t"
  9611. "lsr r11, r6, #16\n\t"
  9612. "lsl r6, r6, #16\n\t"
  9613. "adds r10, r10, r6\n\t"
  9614. "adc r5, r5, r11\n\t"
  9615. "lsl r6, r8, #16\n\t"
  9616. "lsl r11, r7, #16\n\t"
  9617. "lsr r6, r6, #16\n\t"
  9618. "lsr r11, r11, #16\n\t"
  9619. "mul r11, r6, r11\n\t"
  9620. "adds r10, r10, r11\n\t"
  9621. "adc r5, r5, #0\n\t"
  9622. "lsr r11, r7, #16\n\t"
  9623. "mul r6, r11, r6\n\t"
  9624. "lsr r11, r6, #16\n\t"
  9625. "lsl r6, r6, #16\n\t"
  9626. "adds r10, r10, r6\n\t"
  9627. "adc r5, r5, r11\n\t"
  9628. #else
  9629. "umull r6, r7, r8, r7\n\t"
  9630. "adds r10, r10, r6\n\t"
  9631. "adc r5, r7, #0\n\t"
  9632. #endif
  9633. "adds r10, r10, r4\n\t"
  9634. "str r10, [%[a], #112]\n\t"
  9635. "adc r5, r5, #0\n\t"
  9636. /* a[i+29] += m[29] * mu */
  9637. "ldr r7, [%[m], #116]\n\t"
  9638. "ldr r10, [%[a], #116]\n\t"
  9639. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9640. "lsr r11, r7, #16\n\t"
  9641. "lsr r6, r8, #16\n\t"
  9642. "mul r4, r6, r11\n\t"
  9643. "lsl r11, r7, #16\n\t"
  9644. "lsr r11, r11, #16\n\t"
  9645. "mul r6, r11, r6\n\t"
  9646. "lsr r11, r6, #16\n\t"
  9647. "lsl r6, r6, #16\n\t"
  9648. "adds r10, r10, r6\n\t"
  9649. "adc r4, r4, r11\n\t"
  9650. "lsl r6, r8, #16\n\t"
  9651. "lsl r11, r7, #16\n\t"
  9652. "lsr r6, r6, #16\n\t"
  9653. "lsr r11, r11, #16\n\t"
  9654. "mul r11, r6, r11\n\t"
  9655. "adds r10, r10, r11\n\t"
  9656. "adc r4, r4, #0\n\t"
  9657. "lsr r11, r7, #16\n\t"
  9658. "mul r6, r11, r6\n\t"
  9659. "lsr r11, r6, #16\n\t"
  9660. "lsl r6, r6, #16\n\t"
  9661. "adds r10, r10, r6\n\t"
  9662. "adc r4, r4, r11\n\t"
  9663. #else
  9664. "umull r6, r7, r8, r7\n\t"
  9665. "adds r10, r10, r6\n\t"
  9666. "adc r4, r7, #0\n\t"
  9667. #endif
  9668. "adds r10, r10, r5\n\t"
  9669. "str r10, [%[a], #116]\n\t"
  9670. "adc r4, r4, #0\n\t"
  9671. /* a[i+30] += m[30] * mu */
  9672. "ldr r7, [%[m], #120]\n\t"
  9673. "ldr r10, [%[a], #120]\n\t"
  9674. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9675. "lsr r11, r7, #16\n\t"
  9676. "lsr r6, r8, #16\n\t"
  9677. "mul r5, r6, r11\n\t"
  9678. "lsl r11, r7, #16\n\t"
  9679. "lsr r11, r11, #16\n\t"
  9680. "mul r6, r11, r6\n\t"
  9681. "lsr r11, r6, #16\n\t"
  9682. "lsl r6, r6, #16\n\t"
  9683. "adds r10, r10, r6\n\t"
  9684. "adc r5, r5, r11\n\t"
  9685. "lsl r6, r8, #16\n\t"
  9686. "lsl r11, r7, #16\n\t"
  9687. "lsr r6, r6, #16\n\t"
  9688. "lsr r11, r11, #16\n\t"
  9689. "mul r11, r6, r11\n\t"
  9690. "adds r10, r10, r11\n\t"
  9691. "adc r5, r5, #0\n\t"
  9692. "lsr r11, r7, #16\n\t"
  9693. "mul r6, r11, r6\n\t"
  9694. "lsr r11, r6, #16\n\t"
  9695. "lsl r6, r6, #16\n\t"
  9696. "adds r10, r10, r6\n\t"
  9697. "adc r5, r5, r11\n\t"
  9698. #else
  9699. "umull r6, r7, r8, r7\n\t"
  9700. "adds r10, r10, r6\n\t"
  9701. "adc r5, r7, #0\n\t"
  9702. #endif
  9703. "adds r10, r10, r4\n\t"
  9704. "str r10, [%[a], #120]\n\t"
  9705. "adc r5, r5, #0\n\t"
  9706. /* a[i+31] += m[31] * mu */
  9707. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  9708. "ldr r7, [%[m], #124]\n\t"
  9709. #else
  9710. "ldr r11, [%[m], #124]\n\t"
  9711. #endif
  9712. "ldr r10, [%[a], #124]\n\t"
  9713. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9714. "lsl r6, r8, #16\n\t"
  9715. "lsl r7, r11, #16\n\t"
  9716. "lsr r6, r6, #16\n\t"
  9717. "lsr r7, r7, #16\n\t"
  9718. "mul r7, r6, r7\n\t"
  9719. "adds r5, r5, r7\n\t"
  9720. "adcs r4, r3, #0\n\t"
  9721. "mov r3, #0\n\t"
  9722. "adc r3, r3, r3\n\t"
  9723. "lsr r7, r11, #16\n\t"
  9724. "mul r6, r7, r6\n\t"
  9725. "lsr r7, r6, #16\n\t"
  9726. "lsl r6, r6, #16\n\t"
  9727. "adds r5, r5, r6\n\t"
  9728. "adcs r4, r4, r7\n\t"
  9729. "adc r3, r3, #0\n\t"
  9730. "mov r6, r8\n\t"
  9731. "lsr r7, r11, #16\n\t"
  9732. "lsr r6, r6, #16\n\t"
  9733. "mul r7, r6, r7\n\t"
  9734. "adds r4, r4, r7\n\t"
  9735. "lsl r7, r11, #16\n\t"
  9736. "adc r3, r3, #0\n\t"
  9737. "lsr r7, r7, #16\n\t"
  9738. "mul r6, r7, r6\n\t"
  9739. "lsr r7, r6, #16\n\t"
  9740. "lsl r6, r6, #16\n\t"
  9741. "adds r5, r5, r6\n\t"
  9742. "adcs r4, r4, r7\n\t"
  9743. "adc r3, r3, #0\n\t"
  9744. #else
  9745. "umull r6, r7, r8, r7\n\t"
  9746. "adds r5, r5, r6\n\t"
  9747. "adcs r4, r7, r3\n\t"
  9748. "mov r3, #0\n\t"
  9749. "adc r3, r3, r3\n\t"
  9750. #endif
  9751. "adds r10, r10, r5\n\t"
  9752. "str r10, [%[a], #124]\n\t"
  9753. "ldr r10, [%[a], #128]\n\t"
  9754. "adcs r10, r10, r4\n\t"
  9755. "str r10, [%[a], #128]\n\t"
  9756. "adc r3, r3, #0\n\t"
  9757. /* i += 1 */
  9758. "add r9, r9, #4\n\t"
  9759. "add %[a], %[a], #4\n\t"
  9760. "cmp r9, #0x80\n\t"
  9761. "blt L_sp_2048_mont_reduce_32_word_%=\n\t"
  9762. "str r12, [%[a]]\n\t"
  9763. "str lr, [%[a], #4]\n\t"
  9764. "mov %[mp], r3\n\t"
  9765. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  9766. :
  9767. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  9768. );
  9769. sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - mp);
  9770. }
  9771. /* Multiply two Montgomery form numbers mod the modulus (prime).
  9772. * (r = a * b mod m)
  9773. *
  9774. * r Result of multiplication.
  9775. * a First number to multiply in Montgomery form.
  9776. * b Second number to multiply in Montgomery form.
  9777. * m Modulus (prime).
  9778. * mp Montgomery mulitplier.
  9779. */
  9780. SP_NOINLINE static void sp_2048_mont_mul_32(sp_digit* r, const sp_digit* a,
  9781. const sp_digit* b, const sp_digit* m, sp_digit mp)
  9782. {
  9783. sp_2048_mul_32(r, a, b);
  9784. sp_2048_mont_reduce_32(r, m, mp);
  9785. }
  9786. /* Square the Montgomery form number. (r = a * a mod m)
  9787. *
  9788. * r Result of squaring.
  9789. * a Number to square in Montgomery form.
  9790. * m Modulus (prime).
  9791. * mp Montgomery mulitplier.
  9792. */
  9793. SP_NOINLINE static void sp_2048_mont_sqr_32(sp_digit* r, const sp_digit* a,
  9794. const sp_digit* m, sp_digit mp)
  9795. {
  9796. sp_2048_sqr_32(r, a);
  9797. sp_2048_mont_reduce_32(r, m, mp);
  9798. }
  9799. #ifdef WOLFSSL_SP_SMALL
  9800. /* Mul a by digit b into r. (r = a * b)
  9801. *
  9802. * r A single precision integer.
  9803. * a A single precision integer.
  9804. * b A single precision digit.
  9805. */
  9806. static void sp_2048_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  9807. {
  9808. register sp_digit* r asm ("r0") = r_p;
  9809. register const sp_digit* a asm ("r1") = a_p;
  9810. register sp_digit b asm ("r2") = b_p;
  9811. __asm__ __volatile__ (
  9812. "mov r10, #0\n\t"
  9813. /* A[0] * B */
  9814. "ldr r8, [%[a]]\n\t"
  9815. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9816. "lsl r6, %[b], #16\n\t"
  9817. "lsl r5, r8, #16\n\t"
  9818. "lsr r6, r6, #16\n\t"
  9819. "lsr r5, r5, #16\n\t"
  9820. "mul r5, r6, r5\n\t"
  9821. "lsr r7, r8, #16\n\t"
  9822. "mul r6, r7, r6\n\t"
  9823. "lsr r3, r6, #16\n\t"
  9824. "lsl r6, r6, #16\n\t"
  9825. "adds r5, r5, r6\n\t"
  9826. "adc r3, r3, #0\n\t"
  9827. "lsr r6, %[b], #16\n\t"
  9828. "mul r7, r6, r7\n\t"
  9829. "add r3, r3, r7\n\t"
  9830. "lsl r7, r8, #16\n\t"
  9831. "lsr r7, r7, #16\n\t"
  9832. "mul r6, r7, r6\n\t"
  9833. "lsr r7, r6, #16\n\t"
  9834. "lsl r6, r6, #16\n\t"
  9835. "adds r5, r5, r6\n\t"
  9836. "adc r3, r3, r7\n\t"
  9837. #else
  9838. "umull r5, r3, %[b], r8\n\t"
  9839. #endif
  9840. "mov r4, #0\n\t"
  9841. "str r5, [%[r]]\n\t"
  9842. "mov r5, #0\n\t"
  9843. "mov r9, #4\n\t"
  9844. "\n"
  9845. "L_sp_2048_mul_d_32_word_%=: \n\t"
  9846. /* A[i] * B */
  9847. "ldr r8, [%[a], r9]\n\t"
  9848. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9849. "lsl r6, %[b], #16\n\t"
  9850. "lsl r7, r8, #16\n\t"
  9851. "lsr r6, r6, #16\n\t"
  9852. "lsr r7, r7, #16\n\t"
  9853. "mul r7, r6, r7\n\t"
  9854. "adds r3, r3, r7\n\t"
  9855. "adcs r4, r4, #0\n\t"
  9856. "adc r5, r5, #0\n\t"
  9857. "lsr r7, r8, #16\n\t"
  9858. "mul r6, r7, r6\n\t"
  9859. "lsr r7, r6, #16\n\t"
  9860. "lsl r6, r6, #16\n\t"
  9861. "adds r3, r3, r6\n\t"
  9862. "adcs r4, r4, r7\n\t"
  9863. "adc r5, r5, #0\n\t"
  9864. "lsr r6, %[b], #16\n\t"
  9865. "lsr r7, r8, #16\n\t"
  9866. "mul r7, r6, r7\n\t"
  9867. "adds r4, r4, r7\n\t"
  9868. "adc r5, r5, #0\n\t"
  9869. "lsl r7, r8, #16\n\t"
  9870. "lsr r7, r7, #16\n\t"
  9871. "mul r6, r7, r6\n\t"
  9872. "lsr r7, r6, #16\n\t"
  9873. "lsl r6, r6, #16\n\t"
  9874. "adds r3, r3, r6\n\t"
  9875. "adcs r4, r4, r7\n\t"
  9876. "adc r5, r5, #0\n\t"
  9877. #else
  9878. "umull r6, r7, %[b], r8\n\t"
  9879. "adds r3, r3, r6\n\t"
  9880. "adcs r4, r4, r7\n\t"
  9881. "adc r5, r5, #0\n\t"
  9882. #endif
  9883. "str r3, [%[r], r9]\n\t"
  9884. "mov r3, r4\n\t"
  9885. "mov r4, r5\n\t"
  9886. "mov r5, #0\n\t"
  9887. "add r9, r9, #4\n\t"
  9888. "cmp r9, #0x80\n\t"
  9889. "blt L_sp_2048_mul_d_32_word_%=\n\t"
  9890. "str r3, [%[r], #128]\n\t"
  9891. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  9892. :
  9893. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  9894. );
  9895. }
  9896. #else
  9897. /* Mul a by digit b into r. (r = a * b)
  9898. *
  9899. * r A single precision integer.
  9900. * a A single precision integer.
  9901. * b A single precision digit.
  9902. */
  9903. static void sp_2048_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  9904. {
  9905. register sp_digit* r asm ("r0") = r_p;
  9906. register const sp_digit* a asm ("r1") = a_p;
  9907. register sp_digit b asm ("r2") = b_p;
  9908. __asm__ __volatile__ (
  9909. "mov r10, #0\n\t"
  9910. /* A[0] * B */
  9911. "ldr r8, [%[a]], #4\n\t"
  9912. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9913. "lsl r6, %[b], #16\n\t"
  9914. "lsl r3, r8, #16\n\t"
  9915. "lsr r6, r6, #16\n\t"
  9916. "lsr r3, r3, #16\n\t"
  9917. "mul r3, r6, r3\n\t"
  9918. "lsr r7, r8, #16\n\t"
  9919. "mul r6, r7, r6\n\t"
  9920. "lsr r4, r6, #16\n\t"
  9921. "lsl r6, r6, #16\n\t"
  9922. "adds r3, r3, r6\n\t"
  9923. "adc r4, r4, #0\n\t"
  9924. "lsr r6, %[b], #16\n\t"
  9925. "mul r7, r6, r7\n\t"
  9926. "add r4, r4, r7\n\t"
  9927. "lsl r7, r8, #16\n\t"
  9928. "lsr r7, r7, #16\n\t"
  9929. "mul r6, r7, r6\n\t"
  9930. "lsr r7, r6, #16\n\t"
  9931. "lsl r6, r6, #16\n\t"
  9932. "adds r3, r3, r6\n\t"
  9933. "adc r4, r4, r7\n\t"
  9934. #else
  9935. "umull r3, r4, %[b], r8\n\t"
  9936. #endif
  9937. "mov r5, #0\n\t"
  9938. "str r3, [%[r]], #4\n\t"
  9939. /* A[1] * B */
  9940. "ldr r8, [%[a]], #4\n\t"
  9941. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9942. "lsl r6, %[b], #16\n\t"
  9943. "lsl r7, r8, #16\n\t"
  9944. "lsr r6, r6, #16\n\t"
  9945. "lsr r7, r7, #16\n\t"
  9946. "mul r7, r6, r7\n\t"
  9947. "adds r4, r4, r7\n\t"
  9948. "adcs r5, r5, #0\n\t"
  9949. "mov r3, #0\n\t"
  9950. "adc r3, r3, #0\n\t"
  9951. "lsr r7, r8, #16\n\t"
  9952. "mul r6, r7, r6\n\t"
  9953. "lsr r7, r6, #16\n\t"
  9954. "lsl r6, r6, #16\n\t"
  9955. "adds r4, r4, r6\n\t"
  9956. "adcs r5, r5, r7\n\t"
  9957. "adc r3, r3, #0\n\t"
  9958. "lsr r6, %[b], #16\n\t"
  9959. "lsr r7, r8, #16\n\t"
  9960. "mul r7, r6, r7\n\t"
  9961. "adds r5, r5, r7\n\t"
  9962. "adc r3, r3, #0\n\t"
  9963. "lsl r7, r8, #16\n\t"
  9964. "lsr r7, r7, #16\n\t"
  9965. "mul r6, r7, r6\n\t"
  9966. "lsr r7, r6, #16\n\t"
  9967. "lsl r6, r6, #16\n\t"
  9968. "adds r4, r4, r6\n\t"
  9969. "adcs r5, r5, r7\n\t"
  9970. "adc r3, r3, #0\n\t"
  9971. #else
  9972. "umull r6, r7, %[b], r8\n\t"
  9973. "adds r4, r4, r6\n\t"
  9974. "adcs r5, r5, r7\n\t"
  9975. "mov r3, #0\n\t"
  9976. "adc r3, r3, #0\n\t"
  9977. #endif
  9978. "str r4, [%[r]], #4\n\t"
  9979. /* A[2] * B */
  9980. "ldr r8, [%[a]], #4\n\t"
  9981. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  9982. "lsl r6, %[b], #16\n\t"
  9983. "lsl r7, r8, #16\n\t"
  9984. "lsr r6, r6, #16\n\t"
  9985. "lsr r7, r7, #16\n\t"
  9986. "mul r7, r6, r7\n\t"
  9987. "adds r5, r5, r7\n\t"
  9988. "adcs r3, r3, #0\n\t"
  9989. "mov r4, #0\n\t"
  9990. "adc r4, r4, #0\n\t"
  9991. "lsr r7, r8, #16\n\t"
  9992. "mul r6, r7, r6\n\t"
  9993. "lsr r7, r6, #16\n\t"
  9994. "lsl r6, r6, #16\n\t"
  9995. "adds r5, r5, r6\n\t"
  9996. "adcs r3, r3, r7\n\t"
  9997. "adc r4, r4, #0\n\t"
  9998. "lsr r6, %[b], #16\n\t"
  9999. "lsr r7, r8, #16\n\t"
  10000. "mul r7, r6, r7\n\t"
  10001. "adds r3, r3, r7\n\t"
  10002. "adc r4, r4, #0\n\t"
  10003. "lsl r7, r8, #16\n\t"
  10004. "lsr r7, r7, #16\n\t"
  10005. "mul r6, r7, r6\n\t"
  10006. "lsr r7, r6, #16\n\t"
  10007. "lsl r6, r6, #16\n\t"
  10008. "adds r5, r5, r6\n\t"
  10009. "adcs r3, r3, r7\n\t"
  10010. "adc r4, r4, #0\n\t"
  10011. #else
  10012. "umull r6, r7, %[b], r8\n\t"
  10013. "adds r5, r5, r6\n\t"
  10014. "adcs r3, r3, r7\n\t"
  10015. "mov r4, #0\n\t"
  10016. "adc r4, r4, #0\n\t"
  10017. #endif
  10018. "str r5, [%[r]], #4\n\t"
  10019. /* A[3] * B */
  10020. "ldr r8, [%[a]], #4\n\t"
  10021. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10022. "lsl r6, %[b], #16\n\t"
  10023. "lsl r7, r8, #16\n\t"
  10024. "lsr r6, r6, #16\n\t"
  10025. "lsr r7, r7, #16\n\t"
  10026. "mul r7, r6, r7\n\t"
  10027. "adds r3, r3, r7\n\t"
  10028. "adcs r4, r4, #0\n\t"
  10029. "mov r5, #0\n\t"
  10030. "adc r5, r5, #0\n\t"
  10031. "lsr r7, r8, #16\n\t"
  10032. "mul r6, r7, r6\n\t"
  10033. "lsr r7, r6, #16\n\t"
  10034. "lsl r6, r6, #16\n\t"
  10035. "adds r3, r3, r6\n\t"
  10036. "adcs r4, r4, r7\n\t"
  10037. "adc r5, r5, #0\n\t"
  10038. "lsr r6, %[b], #16\n\t"
  10039. "lsr r7, r8, #16\n\t"
  10040. "mul r7, r6, r7\n\t"
  10041. "adds r4, r4, r7\n\t"
  10042. "adc r5, r5, #0\n\t"
  10043. "lsl r7, r8, #16\n\t"
  10044. "lsr r7, r7, #16\n\t"
  10045. "mul r6, r7, r6\n\t"
  10046. "lsr r7, r6, #16\n\t"
  10047. "lsl r6, r6, #16\n\t"
  10048. "adds r3, r3, r6\n\t"
  10049. "adcs r4, r4, r7\n\t"
  10050. "adc r5, r5, #0\n\t"
  10051. #else
  10052. "umull r6, r7, %[b], r8\n\t"
  10053. "adds r3, r3, r6\n\t"
  10054. "adcs r4, r4, r7\n\t"
  10055. "mov r5, #0\n\t"
  10056. "adc r5, r5, #0\n\t"
  10057. #endif
  10058. "str r3, [%[r]], #4\n\t"
  10059. /* A[4] * B */
  10060. "ldr r8, [%[a]], #4\n\t"
  10061. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10062. "lsl r6, %[b], #16\n\t"
  10063. "lsl r7, r8, #16\n\t"
  10064. "lsr r6, r6, #16\n\t"
  10065. "lsr r7, r7, #16\n\t"
  10066. "mul r7, r6, r7\n\t"
  10067. "adds r4, r4, r7\n\t"
  10068. "adcs r5, r5, #0\n\t"
  10069. "mov r3, #0\n\t"
  10070. "adc r3, r3, #0\n\t"
  10071. "lsr r7, r8, #16\n\t"
  10072. "mul r6, r7, r6\n\t"
  10073. "lsr r7, r6, #16\n\t"
  10074. "lsl r6, r6, #16\n\t"
  10075. "adds r4, r4, r6\n\t"
  10076. "adcs r5, r5, r7\n\t"
  10077. "adc r3, r3, #0\n\t"
  10078. "lsr r6, %[b], #16\n\t"
  10079. "lsr r7, r8, #16\n\t"
  10080. "mul r7, r6, r7\n\t"
  10081. "adds r5, r5, r7\n\t"
  10082. "adc r3, r3, #0\n\t"
  10083. "lsl r7, r8, #16\n\t"
  10084. "lsr r7, r7, #16\n\t"
  10085. "mul r6, r7, r6\n\t"
  10086. "lsr r7, r6, #16\n\t"
  10087. "lsl r6, r6, #16\n\t"
  10088. "adds r4, r4, r6\n\t"
  10089. "adcs r5, r5, r7\n\t"
  10090. "adc r3, r3, #0\n\t"
  10091. #else
  10092. "umull r6, r7, %[b], r8\n\t"
  10093. "adds r4, r4, r6\n\t"
  10094. "adcs r5, r5, r7\n\t"
  10095. "mov r3, #0\n\t"
  10096. "adc r3, r3, #0\n\t"
  10097. #endif
  10098. "str r4, [%[r]], #4\n\t"
  10099. /* A[5] * B */
  10100. "ldr r8, [%[a]], #4\n\t"
  10101. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10102. "lsl r6, %[b], #16\n\t"
  10103. "lsl r7, r8, #16\n\t"
  10104. "lsr r6, r6, #16\n\t"
  10105. "lsr r7, r7, #16\n\t"
  10106. "mul r7, r6, r7\n\t"
  10107. "adds r5, r5, r7\n\t"
  10108. "adcs r3, r3, #0\n\t"
  10109. "mov r4, #0\n\t"
  10110. "adc r4, r4, #0\n\t"
  10111. "lsr r7, r8, #16\n\t"
  10112. "mul r6, r7, r6\n\t"
  10113. "lsr r7, r6, #16\n\t"
  10114. "lsl r6, r6, #16\n\t"
  10115. "adds r5, r5, r6\n\t"
  10116. "adcs r3, r3, r7\n\t"
  10117. "adc r4, r4, #0\n\t"
  10118. "lsr r6, %[b], #16\n\t"
  10119. "lsr r7, r8, #16\n\t"
  10120. "mul r7, r6, r7\n\t"
  10121. "adds r3, r3, r7\n\t"
  10122. "adc r4, r4, #0\n\t"
  10123. "lsl r7, r8, #16\n\t"
  10124. "lsr r7, r7, #16\n\t"
  10125. "mul r6, r7, r6\n\t"
  10126. "lsr r7, r6, #16\n\t"
  10127. "lsl r6, r6, #16\n\t"
  10128. "adds r5, r5, r6\n\t"
  10129. "adcs r3, r3, r7\n\t"
  10130. "adc r4, r4, #0\n\t"
  10131. #else
  10132. "umull r6, r7, %[b], r8\n\t"
  10133. "adds r5, r5, r6\n\t"
  10134. "adcs r3, r3, r7\n\t"
  10135. "mov r4, #0\n\t"
  10136. "adc r4, r4, #0\n\t"
  10137. #endif
  10138. "str r5, [%[r]], #4\n\t"
  10139. /* A[6] * B */
  10140. "ldr r8, [%[a]], #4\n\t"
  10141. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10142. "lsl r6, %[b], #16\n\t"
  10143. "lsl r7, r8, #16\n\t"
  10144. "lsr r6, r6, #16\n\t"
  10145. "lsr r7, r7, #16\n\t"
  10146. "mul r7, r6, r7\n\t"
  10147. "adds r3, r3, r7\n\t"
  10148. "adcs r4, r4, #0\n\t"
  10149. "mov r5, #0\n\t"
  10150. "adc r5, r5, #0\n\t"
  10151. "lsr r7, r8, #16\n\t"
  10152. "mul r6, r7, r6\n\t"
  10153. "lsr r7, r6, #16\n\t"
  10154. "lsl r6, r6, #16\n\t"
  10155. "adds r3, r3, r6\n\t"
  10156. "adcs r4, r4, r7\n\t"
  10157. "adc r5, r5, #0\n\t"
  10158. "lsr r6, %[b], #16\n\t"
  10159. "lsr r7, r8, #16\n\t"
  10160. "mul r7, r6, r7\n\t"
  10161. "adds r4, r4, r7\n\t"
  10162. "adc r5, r5, #0\n\t"
  10163. "lsl r7, r8, #16\n\t"
  10164. "lsr r7, r7, #16\n\t"
  10165. "mul r6, r7, r6\n\t"
  10166. "lsr r7, r6, #16\n\t"
  10167. "lsl r6, r6, #16\n\t"
  10168. "adds r3, r3, r6\n\t"
  10169. "adcs r4, r4, r7\n\t"
  10170. "adc r5, r5, #0\n\t"
  10171. #else
  10172. "umull r6, r7, %[b], r8\n\t"
  10173. "adds r3, r3, r6\n\t"
  10174. "adcs r4, r4, r7\n\t"
  10175. "mov r5, #0\n\t"
  10176. "adc r5, r5, #0\n\t"
  10177. #endif
  10178. "str r3, [%[r]], #4\n\t"
  10179. /* A[7] * B */
  10180. "ldr r8, [%[a]], #4\n\t"
  10181. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10182. "lsl r6, %[b], #16\n\t"
  10183. "lsl r7, r8, #16\n\t"
  10184. "lsr r6, r6, #16\n\t"
  10185. "lsr r7, r7, #16\n\t"
  10186. "mul r7, r6, r7\n\t"
  10187. "adds r4, r4, r7\n\t"
  10188. "adcs r5, r5, #0\n\t"
  10189. "mov r3, #0\n\t"
  10190. "adc r3, r3, #0\n\t"
  10191. "lsr r7, r8, #16\n\t"
  10192. "mul r6, r7, r6\n\t"
  10193. "lsr r7, r6, #16\n\t"
  10194. "lsl r6, r6, #16\n\t"
  10195. "adds r4, r4, r6\n\t"
  10196. "adcs r5, r5, r7\n\t"
  10197. "adc r3, r3, #0\n\t"
  10198. "lsr r6, %[b], #16\n\t"
  10199. "lsr r7, r8, #16\n\t"
  10200. "mul r7, r6, r7\n\t"
  10201. "adds r5, r5, r7\n\t"
  10202. "adc r3, r3, #0\n\t"
  10203. "lsl r7, r8, #16\n\t"
  10204. "lsr r7, r7, #16\n\t"
  10205. "mul r6, r7, r6\n\t"
  10206. "lsr r7, r6, #16\n\t"
  10207. "lsl r6, r6, #16\n\t"
  10208. "adds r4, r4, r6\n\t"
  10209. "adcs r5, r5, r7\n\t"
  10210. "adc r3, r3, #0\n\t"
  10211. #else
  10212. "umull r6, r7, %[b], r8\n\t"
  10213. "adds r4, r4, r6\n\t"
  10214. "adcs r5, r5, r7\n\t"
  10215. "mov r3, #0\n\t"
  10216. "adc r3, r3, #0\n\t"
  10217. #endif
  10218. "str r4, [%[r]], #4\n\t"
  10219. /* A[8] * B */
  10220. "ldr r8, [%[a]], #4\n\t"
  10221. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10222. "lsl r6, %[b], #16\n\t"
  10223. "lsl r7, r8, #16\n\t"
  10224. "lsr r6, r6, #16\n\t"
  10225. "lsr r7, r7, #16\n\t"
  10226. "mul r7, r6, r7\n\t"
  10227. "adds r5, r5, r7\n\t"
  10228. "adcs r3, r3, #0\n\t"
  10229. "mov r4, #0\n\t"
  10230. "adc r4, r4, #0\n\t"
  10231. "lsr r7, r8, #16\n\t"
  10232. "mul r6, r7, r6\n\t"
  10233. "lsr r7, r6, #16\n\t"
  10234. "lsl r6, r6, #16\n\t"
  10235. "adds r5, r5, r6\n\t"
  10236. "adcs r3, r3, r7\n\t"
  10237. "adc r4, r4, #0\n\t"
  10238. "lsr r6, %[b], #16\n\t"
  10239. "lsr r7, r8, #16\n\t"
  10240. "mul r7, r6, r7\n\t"
  10241. "adds r3, r3, r7\n\t"
  10242. "adc r4, r4, #0\n\t"
  10243. "lsl r7, r8, #16\n\t"
  10244. "lsr r7, r7, #16\n\t"
  10245. "mul r6, r7, r6\n\t"
  10246. "lsr r7, r6, #16\n\t"
  10247. "lsl r6, r6, #16\n\t"
  10248. "adds r5, r5, r6\n\t"
  10249. "adcs r3, r3, r7\n\t"
  10250. "adc r4, r4, #0\n\t"
  10251. #else
  10252. "umull r6, r7, %[b], r8\n\t"
  10253. "adds r5, r5, r6\n\t"
  10254. "adcs r3, r3, r7\n\t"
  10255. "mov r4, #0\n\t"
  10256. "adc r4, r4, #0\n\t"
  10257. #endif
  10258. "str r5, [%[r]], #4\n\t"
  10259. /* A[9] * B */
  10260. "ldr r8, [%[a]], #4\n\t"
  10261. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10262. "lsl r6, %[b], #16\n\t"
  10263. "lsl r7, r8, #16\n\t"
  10264. "lsr r6, r6, #16\n\t"
  10265. "lsr r7, r7, #16\n\t"
  10266. "mul r7, r6, r7\n\t"
  10267. "adds r3, r3, r7\n\t"
  10268. "adcs r4, r4, #0\n\t"
  10269. "mov r5, #0\n\t"
  10270. "adc r5, r5, #0\n\t"
  10271. "lsr r7, r8, #16\n\t"
  10272. "mul r6, r7, r6\n\t"
  10273. "lsr r7, r6, #16\n\t"
  10274. "lsl r6, r6, #16\n\t"
  10275. "adds r3, r3, r6\n\t"
  10276. "adcs r4, r4, r7\n\t"
  10277. "adc r5, r5, #0\n\t"
  10278. "lsr r6, %[b], #16\n\t"
  10279. "lsr r7, r8, #16\n\t"
  10280. "mul r7, r6, r7\n\t"
  10281. "adds r4, r4, r7\n\t"
  10282. "adc r5, r5, #0\n\t"
  10283. "lsl r7, r8, #16\n\t"
  10284. "lsr r7, r7, #16\n\t"
  10285. "mul r6, r7, r6\n\t"
  10286. "lsr r7, r6, #16\n\t"
  10287. "lsl r6, r6, #16\n\t"
  10288. "adds r3, r3, r6\n\t"
  10289. "adcs r4, r4, r7\n\t"
  10290. "adc r5, r5, #0\n\t"
  10291. #else
  10292. "umull r6, r7, %[b], r8\n\t"
  10293. "adds r3, r3, r6\n\t"
  10294. "adcs r4, r4, r7\n\t"
  10295. "mov r5, #0\n\t"
  10296. "adc r5, r5, #0\n\t"
  10297. #endif
  10298. "str r3, [%[r]], #4\n\t"
  10299. /* A[10] * B */
  10300. "ldr r8, [%[a]], #4\n\t"
  10301. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10302. "lsl r6, %[b], #16\n\t"
  10303. "lsl r7, r8, #16\n\t"
  10304. "lsr r6, r6, #16\n\t"
  10305. "lsr r7, r7, #16\n\t"
  10306. "mul r7, r6, r7\n\t"
  10307. "adds r4, r4, r7\n\t"
  10308. "adcs r5, r5, #0\n\t"
  10309. "mov r3, #0\n\t"
  10310. "adc r3, r3, #0\n\t"
  10311. "lsr r7, r8, #16\n\t"
  10312. "mul r6, r7, r6\n\t"
  10313. "lsr r7, r6, #16\n\t"
  10314. "lsl r6, r6, #16\n\t"
  10315. "adds r4, r4, r6\n\t"
  10316. "adcs r5, r5, r7\n\t"
  10317. "adc r3, r3, #0\n\t"
  10318. "lsr r6, %[b], #16\n\t"
  10319. "lsr r7, r8, #16\n\t"
  10320. "mul r7, r6, r7\n\t"
  10321. "adds r5, r5, r7\n\t"
  10322. "adc r3, r3, #0\n\t"
  10323. "lsl r7, r8, #16\n\t"
  10324. "lsr r7, r7, #16\n\t"
  10325. "mul r6, r7, r6\n\t"
  10326. "lsr r7, r6, #16\n\t"
  10327. "lsl r6, r6, #16\n\t"
  10328. "adds r4, r4, r6\n\t"
  10329. "adcs r5, r5, r7\n\t"
  10330. "adc r3, r3, #0\n\t"
  10331. #else
  10332. "umull r6, r7, %[b], r8\n\t"
  10333. "adds r4, r4, r6\n\t"
  10334. "adcs r5, r5, r7\n\t"
  10335. "mov r3, #0\n\t"
  10336. "adc r3, r3, #0\n\t"
  10337. #endif
  10338. "str r4, [%[r]], #4\n\t"
  10339. /* A[11] * B */
  10340. "ldr r8, [%[a]], #4\n\t"
  10341. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10342. "lsl r6, %[b], #16\n\t"
  10343. "lsl r7, r8, #16\n\t"
  10344. "lsr r6, r6, #16\n\t"
  10345. "lsr r7, r7, #16\n\t"
  10346. "mul r7, r6, r7\n\t"
  10347. "adds r5, r5, r7\n\t"
  10348. "adcs r3, r3, #0\n\t"
  10349. "mov r4, #0\n\t"
  10350. "adc r4, r4, #0\n\t"
  10351. "lsr r7, r8, #16\n\t"
  10352. "mul r6, r7, r6\n\t"
  10353. "lsr r7, r6, #16\n\t"
  10354. "lsl r6, r6, #16\n\t"
  10355. "adds r5, r5, r6\n\t"
  10356. "adcs r3, r3, r7\n\t"
  10357. "adc r4, r4, #0\n\t"
  10358. "lsr r6, %[b], #16\n\t"
  10359. "lsr r7, r8, #16\n\t"
  10360. "mul r7, r6, r7\n\t"
  10361. "adds r3, r3, r7\n\t"
  10362. "adc r4, r4, #0\n\t"
  10363. "lsl r7, r8, #16\n\t"
  10364. "lsr r7, r7, #16\n\t"
  10365. "mul r6, r7, r6\n\t"
  10366. "lsr r7, r6, #16\n\t"
  10367. "lsl r6, r6, #16\n\t"
  10368. "adds r5, r5, r6\n\t"
  10369. "adcs r3, r3, r7\n\t"
  10370. "adc r4, r4, #0\n\t"
  10371. #else
  10372. "umull r6, r7, %[b], r8\n\t"
  10373. "adds r5, r5, r6\n\t"
  10374. "adcs r3, r3, r7\n\t"
  10375. "mov r4, #0\n\t"
  10376. "adc r4, r4, #0\n\t"
  10377. #endif
  10378. "str r5, [%[r]], #4\n\t"
  10379. /* A[12] * B */
  10380. "ldr r8, [%[a]], #4\n\t"
  10381. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10382. "lsl r6, %[b], #16\n\t"
  10383. "lsl r7, r8, #16\n\t"
  10384. "lsr r6, r6, #16\n\t"
  10385. "lsr r7, r7, #16\n\t"
  10386. "mul r7, r6, r7\n\t"
  10387. "adds r3, r3, r7\n\t"
  10388. "adcs r4, r4, #0\n\t"
  10389. "mov r5, #0\n\t"
  10390. "adc r5, r5, #0\n\t"
  10391. "lsr r7, r8, #16\n\t"
  10392. "mul r6, r7, r6\n\t"
  10393. "lsr r7, r6, #16\n\t"
  10394. "lsl r6, r6, #16\n\t"
  10395. "adds r3, r3, r6\n\t"
  10396. "adcs r4, r4, r7\n\t"
  10397. "adc r5, r5, #0\n\t"
  10398. "lsr r6, %[b], #16\n\t"
  10399. "lsr r7, r8, #16\n\t"
  10400. "mul r7, r6, r7\n\t"
  10401. "adds r4, r4, r7\n\t"
  10402. "adc r5, r5, #0\n\t"
  10403. "lsl r7, r8, #16\n\t"
  10404. "lsr r7, r7, #16\n\t"
  10405. "mul r6, r7, r6\n\t"
  10406. "lsr r7, r6, #16\n\t"
  10407. "lsl r6, r6, #16\n\t"
  10408. "adds r3, r3, r6\n\t"
  10409. "adcs r4, r4, r7\n\t"
  10410. "adc r5, r5, #0\n\t"
  10411. #else
  10412. "umull r6, r7, %[b], r8\n\t"
  10413. "adds r3, r3, r6\n\t"
  10414. "adcs r4, r4, r7\n\t"
  10415. "mov r5, #0\n\t"
  10416. "adc r5, r5, #0\n\t"
  10417. #endif
  10418. "str r3, [%[r]], #4\n\t"
  10419. /* A[13] * B */
  10420. "ldr r8, [%[a]], #4\n\t"
  10421. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10422. "lsl r6, %[b], #16\n\t"
  10423. "lsl r7, r8, #16\n\t"
  10424. "lsr r6, r6, #16\n\t"
  10425. "lsr r7, r7, #16\n\t"
  10426. "mul r7, r6, r7\n\t"
  10427. "adds r4, r4, r7\n\t"
  10428. "adcs r5, r5, #0\n\t"
  10429. "mov r3, #0\n\t"
  10430. "adc r3, r3, #0\n\t"
  10431. "lsr r7, r8, #16\n\t"
  10432. "mul r6, r7, r6\n\t"
  10433. "lsr r7, r6, #16\n\t"
  10434. "lsl r6, r6, #16\n\t"
  10435. "adds r4, r4, r6\n\t"
  10436. "adcs r5, r5, r7\n\t"
  10437. "adc r3, r3, #0\n\t"
  10438. "lsr r6, %[b], #16\n\t"
  10439. "lsr r7, r8, #16\n\t"
  10440. "mul r7, r6, r7\n\t"
  10441. "adds r5, r5, r7\n\t"
  10442. "adc r3, r3, #0\n\t"
  10443. "lsl r7, r8, #16\n\t"
  10444. "lsr r7, r7, #16\n\t"
  10445. "mul r6, r7, r6\n\t"
  10446. "lsr r7, r6, #16\n\t"
  10447. "lsl r6, r6, #16\n\t"
  10448. "adds r4, r4, r6\n\t"
  10449. "adcs r5, r5, r7\n\t"
  10450. "adc r3, r3, #0\n\t"
  10451. #else
  10452. "umull r6, r7, %[b], r8\n\t"
  10453. "adds r4, r4, r6\n\t"
  10454. "adcs r5, r5, r7\n\t"
  10455. "mov r3, #0\n\t"
  10456. "adc r3, r3, #0\n\t"
  10457. #endif
  10458. "str r4, [%[r]], #4\n\t"
  10459. /* A[14] * B */
  10460. "ldr r8, [%[a]], #4\n\t"
  10461. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10462. "lsl r6, %[b], #16\n\t"
  10463. "lsl r7, r8, #16\n\t"
  10464. "lsr r6, r6, #16\n\t"
  10465. "lsr r7, r7, #16\n\t"
  10466. "mul r7, r6, r7\n\t"
  10467. "adds r5, r5, r7\n\t"
  10468. "adcs r3, r3, #0\n\t"
  10469. "mov r4, #0\n\t"
  10470. "adc r4, r4, #0\n\t"
  10471. "lsr r7, r8, #16\n\t"
  10472. "mul r6, r7, r6\n\t"
  10473. "lsr r7, r6, #16\n\t"
  10474. "lsl r6, r6, #16\n\t"
  10475. "adds r5, r5, r6\n\t"
  10476. "adcs r3, r3, r7\n\t"
  10477. "adc r4, r4, #0\n\t"
  10478. "lsr r6, %[b], #16\n\t"
  10479. "lsr r7, r8, #16\n\t"
  10480. "mul r7, r6, r7\n\t"
  10481. "adds r3, r3, r7\n\t"
  10482. "adc r4, r4, #0\n\t"
  10483. "lsl r7, r8, #16\n\t"
  10484. "lsr r7, r7, #16\n\t"
  10485. "mul r6, r7, r6\n\t"
  10486. "lsr r7, r6, #16\n\t"
  10487. "lsl r6, r6, #16\n\t"
  10488. "adds r5, r5, r6\n\t"
  10489. "adcs r3, r3, r7\n\t"
  10490. "adc r4, r4, #0\n\t"
  10491. #else
  10492. "umull r6, r7, %[b], r8\n\t"
  10493. "adds r5, r5, r6\n\t"
  10494. "adcs r3, r3, r7\n\t"
  10495. "mov r4, #0\n\t"
  10496. "adc r4, r4, #0\n\t"
  10497. #endif
  10498. "str r5, [%[r]], #4\n\t"
  10499. /* A[15] * B */
  10500. "ldr r8, [%[a]], #4\n\t"
  10501. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10502. "lsl r6, %[b], #16\n\t"
  10503. "lsl r7, r8, #16\n\t"
  10504. "lsr r6, r6, #16\n\t"
  10505. "lsr r7, r7, #16\n\t"
  10506. "mul r7, r6, r7\n\t"
  10507. "adds r3, r3, r7\n\t"
  10508. "adcs r4, r4, #0\n\t"
  10509. "mov r5, #0\n\t"
  10510. "adc r5, r5, #0\n\t"
  10511. "lsr r7, r8, #16\n\t"
  10512. "mul r6, r7, r6\n\t"
  10513. "lsr r7, r6, #16\n\t"
  10514. "lsl r6, r6, #16\n\t"
  10515. "adds r3, r3, r6\n\t"
  10516. "adcs r4, r4, r7\n\t"
  10517. "adc r5, r5, #0\n\t"
  10518. "lsr r6, %[b], #16\n\t"
  10519. "lsr r7, r8, #16\n\t"
  10520. "mul r7, r6, r7\n\t"
  10521. "adds r4, r4, r7\n\t"
  10522. "adc r5, r5, #0\n\t"
  10523. "lsl r7, r8, #16\n\t"
  10524. "lsr r7, r7, #16\n\t"
  10525. "mul r6, r7, r6\n\t"
  10526. "lsr r7, r6, #16\n\t"
  10527. "lsl r6, r6, #16\n\t"
  10528. "adds r3, r3, r6\n\t"
  10529. "adcs r4, r4, r7\n\t"
  10530. "adc r5, r5, #0\n\t"
  10531. #else
  10532. "umull r6, r7, %[b], r8\n\t"
  10533. "adds r3, r3, r6\n\t"
  10534. "adcs r4, r4, r7\n\t"
  10535. "mov r5, #0\n\t"
  10536. "adc r5, r5, #0\n\t"
  10537. #endif
  10538. "str r3, [%[r]], #4\n\t"
  10539. /* A[16] * B */
  10540. "ldr r8, [%[a]], #4\n\t"
  10541. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10542. "lsl r6, %[b], #16\n\t"
  10543. "lsl r7, r8, #16\n\t"
  10544. "lsr r6, r6, #16\n\t"
  10545. "lsr r7, r7, #16\n\t"
  10546. "mul r7, r6, r7\n\t"
  10547. "adds r4, r4, r7\n\t"
  10548. "adcs r5, r5, #0\n\t"
  10549. "mov r3, #0\n\t"
  10550. "adc r3, r3, #0\n\t"
  10551. "lsr r7, r8, #16\n\t"
  10552. "mul r6, r7, r6\n\t"
  10553. "lsr r7, r6, #16\n\t"
  10554. "lsl r6, r6, #16\n\t"
  10555. "adds r4, r4, r6\n\t"
  10556. "adcs r5, r5, r7\n\t"
  10557. "adc r3, r3, #0\n\t"
  10558. "lsr r6, %[b], #16\n\t"
  10559. "lsr r7, r8, #16\n\t"
  10560. "mul r7, r6, r7\n\t"
  10561. "adds r5, r5, r7\n\t"
  10562. "adc r3, r3, #0\n\t"
  10563. "lsl r7, r8, #16\n\t"
  10564. "lsr r7, r7, #16\n\t"
  10565. "mul r6, r7, r6\n\t"
  10566. "lsr r7, r6, #16\n\t"
  10567. "lsl r6, r6, #16\n\t"
  10568. "adds r4, r4, r6\n\t"
  10569. "adcs r5, r5, r7\n\t"
  10570. "adc r3, r3, #0\n\t"
  10571. #else
  10572. "umull r6, r7, %[b], r8\n\t"
  10573. "adds r4, r4, r6\n\t"
  10574. "adcs r5, r5, r7\n\t"
  10575. "mov r3, #0\n\t"
  10576. "adc r3, r3, #0\n\t"
  10577. #endif
  10578. "str r4, [%[r]], #4\n\t"
  10579. /* A[17] * B */
  10580. "ldr r8, [%[a]], #4\n\t"
  10581. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10582. "lsl r6, %[b], #16\n\t"
  10583. "lsl r7, r8, #16\n\t"
  10584. "lsr r6, r6, #16\n\t"
  10585. "lsr r7, r7, #16\n\t"
  10586. "mul r7, r6, r7\n\t"
  10587. "adds r5, r5, r7\n\t"
  10588. "adcs r3, r3, #0\n\t"
  10589. "mov r4, #0\n\t"
  10590. "adc r4, r4, #0\n\t"
  10591. "lsr r7, r8, #16\n\t"
  10592. "mul r6, r7, r6\n\t"
  10593. "lsr r7, r6, #16\n\t"
  10594. "lsl r6, r6, #16\n\t"
  10595. "adds r5, r5, r6\n\t"
  10596. "adcs r3, r3, r7\n\t"
  10597. "adc r4, r4, #0\n\t"
  10598. "lsr r6, %[b], #16\n\t"
  10599. "lsr r7, r8, #16\n\t"
  10600. "mul r7, r6, r7\n\t"
  10601. "adds r3, r3, r7\n\t"
  10602. "adc r4, r4, #0\n\t"
  10603. "lsl r7, r8, #16\n\t"
  10604. "lsr r7, r7, #16\n\t"
  10605. "mul r6, r7, r6\n\t"
  10606. "lsr r7, r6, #16\n\t"
  10607. "lsl r6, r6, #16\n\t"
  10608. "adds r5, r5, r6\n\t"
  10609. "adcs r3, r3, r7\n\t"
  10610. "adc r4, r4, #0\n\t"
  10611. #else
  10612. "umull r6, r7, %[b], r8\n\t"
  10613. "adds r5, r5, r6\n\t"
  10614. "adcs r3, r3, r7\n\t"
  10615. "mov r4, #0\n\t"
  10616. "adc r4, r4, #0\n\t"
  10617. #endif
  10618. "str r5, [%[r]], #4\n\t"
  10619. /* A[18] * B */
  10620. "ldr r8, [%[a]], #4\n\t"
  10621. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10622. "lsl r6, %[b], #16\n\t"
  10623. "lsl r7, r8, #16\n\t"
  10624. "lsr r6, r6, #16\n\t"
  10625. "lsr r7, r7, #16\n\t"
  10626. "mul r7, r6, r7\n\t"
  10627. "adds r3, r3, r7\n\t"
  10628. "adcs r4, r4, #0\n\t"
  10629. "mov r5, #0\n\t"
  10630. "adc r5, r5, #0\n\t"
  10631. "lsr r7, r8, #16\n\t"
  10632. "mul r6, r7, r6\n\t"
  10633. "lsr r7, r6, #16\n\t"
  10634. "lsl r6, r6, #16\n\t"
  10635. "adds r3, r3, r6\n\t"
  10636. "adcs r4, r4, r7\n\t"
  10637. "adc r5, r5, #0\n\t"
  10638. "lsr r6, %[b], #16\n\t"
  10639. "lsr r7, r8, #16\n\t"
  10640. "mul r7, r6, r7\n\t"
  10641. "adds r4, r4, r7\n\t"
  10642. "adc r5, r5, #0\n\t"
  10643. "lsl r7, r8, #16\n\t"
  10644. "lsr r7, r7, #16\n\t"
  10645. "mul r6, r7, r6\n\t"
  10646. "lsr r7, r6, #16\n\t"
  10647. "lsl r6, r6, #16\n\t"
  10648. "adds r3, r3, r6\n\t"
  10649. "adcs r4, r4, r7\n\t"
  10650. "adc r5, r5, #0\n\t"
  10651. #else
  10652. "umull r6, r7, %[b], r8\n\t"
  10653. "adds r3, r3, r6\n\t"
  10654. "adcs r4, r4, r7\n\t"
  10655. "mov r5, #0\n\t"
  10656. "adc r5, r5, #0\n\t"
  10657. #endif
  10658. "str r3, [%[r]], #4\n\t"
  10659. /* A[19] * B */
  10660. "ldr r8, [%[a]], #4\n\t"
  10661. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10662. "lsl r6, %[b], #16\n\t"
  10663. "lsl r7, r8, #16\n\t"
  10664. "lsr r6, r6, #16\n\t"
  10665. "lsr r7, r7, #16\n\t"
  10666. "mul r7, r6, r7\n\t"
  10667. "adds r4, r4, r7\n\t"
  10668. "adcs r5, r5, #0\n\t"
  10669. "mov r3, #0\n\t"
  10670. "adc r3, r3, #0\n\t"
  10671. "lsr r7, r8, #16\n\t"
  10672. "mul r6, r7, r6\n\t"
  10673. "lsr r7, r6, #16\n\t"
  10674. "lsl r6, r6, #16\n\t"
  10675. "adds r4, r4, r6\n\t"
  10676. "adcs r5, r5, r7\n\t"
  10677. "adc r3, r3, #0\n\t"
  10678. "lsr r6, %[b], #16\n\t"
  10679. "lsr r7, r8, #16\n\t"
  10680. "mul r7, r6, r7\n\t"
  10681. "adds r5, r5, r7\n\t"
  10682. "adc r3, r3, #0\n\t"
  10683. "lsl r7, r8, #16\n\t"
  10684. "lsr r7, r7, #16\n\t"
  10685. "mul r6, r7, r6\n\t"
  10686. "lsr r7, r6, #16\n\t"
  10687. "lsl r6, r6, #16\n\t"
  10688. "adds r4, r4, r6\n\t"
  10689. "adcs r5, r5, r7\n\t"
  10690. "adc r3, r3, #0\n\t"
  10691. #else
  10692. "umull r6, r7, %[b], r8\n\t"
  10693. "adds r4, r4, r6\n\t"
  10694. "adcs r5, r5, r7\n\t"
  10695. "mov r3, #0\n\t"
  10696. "adc r3, r3, #0\n\t"
  10697. #endif
  10698. "str r4, [%[r]], #4\n\t"
  10699. /* A[20] * B */
  10700. "ldr r8, [%[a]], #4\n\t"
  10701. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10702. "lsl r6, %[b], #16\n\t"
  10703. "lsl r7, r8, #16\n\t"
  10704. "lsr r6, r6, #16\n\t"
  10705. "lsr r7, r7, #16\n\t"
  10706. "mul r7, r6, r7\n\t"
  10707. "adds r5, r5, r7\n\t"
  10708. "adcs r3, r3, #0\n\t"
  10709. "mov r4, #0\n\t"
  10710. "adc r4, r4, #0\n\t"
  10711. "lsr r7, r8, #16\n\t"
  10712. "mul r6, r7, r6\n\t"
  10713. "lsr r7, r6, #16\n\t"
  10714. "lsl r6, r6, #16\n\t"
  10715. "adds r5, r5, r6\n\t"
  10716. "adcs r3, r3, r7\n\t"
  10717. "adc r4, r4, #0\n\t"
  10718. "lsr r6, %[b], #16\n\t"
  10719. "lsr r7, r8, #16\n\t"
  10720. "mul r7, r6, r7\n\t"
  10721. "adds r3, r3, r7\n\t"
  10722. "adc r4, r4, #0\n\t"
  10723. "lsl r7, r8, #16\n\t"
  10724. "lsr r7, r7, #16\n\t"
  10725. "mul r6, r7, r6\n\t"
  10726. "lsr r7, r6, #16\n\t"
  10727. "lsl r6, r6, #16\n\t"
  10728. "adds r5, r5, r6\n\t"
  10729. "adcs r3, r3, r7\n\t"
  10730. "adc r4, r4, #0\n\t"
  10731. #else
  10732. "umull r6, r7, %[b], r8\n\t"
  10733. "adds r5, r5, r6\n\t"
  10734. "adcs r3, r3, r7\n\t"
  10735. "mov r4, #0\n\t"
  10736. "adc r4, r4, #0\n\t"
  10737. #endif
  10738. "str r5, [%[r]], #4\n\t"
  10739. /* A[21] * B */
  10740. "ldr r8, [%[a]], #4\n\t"
  10741. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10742. "lsl r6, %[b], #16\n\t"
  10743. "lsl r7, r8, #16\n\t"
  10744. "lsr r6, r6, #16\n\t"
  10745. "lsr r7, r7, #16\n\t"
  10746. "mul r7, r6, r7\n\t"
  10747. "adds r3, r3, r7\n\t"
  10748. "adcs r4, r4, #0\n\t"
  10749. "mov r5, #0\n\t"
  10750. "adc r5, r5, #0\n\t"
  10751. "lsr r7, r8, #16\n\t"
  10752. "mul r6, r7, r6\n\t"
  10753. "lsr r7, r6, #16\n\t"
  10754. "lsl r6, r6, #16\n\t"
  10755. "adds r3, r3, r6\n\t"
  10756. "adcs r4, r4, r7\n\t"
  10757. "adc r5, r5, #0\n\t"
  10758. "lsr r6, %[b], #16\n\t"
  10759. "lsr r7, r8, #16\n\t"
  10760. "mul r7, r6, r7\n\t"
  10761. "adds r4, r4, r7\n\t"
  10762. "adc r5, r5, #0\n\t"
  10763. "lsl r7, r8, #16\n\t"
  10764. "lsr r7, r7, #16\n\t"
  10765. "mul r6, r7, r6\n\t"
  10766. "lsr r7, r6, #16\n\t"
  10767. "lsl r6, r6, #16\n\t"
  10768. "adds r3, r3, r6\n\t"
  10769. "adcs r4, r4, r7\n\t"
  10770. "adc r5, r5, #0\n\t"
  10771. #else
  10772. "umull r6, r7, %[b], r8\n\t"
  10773. "adds r3, r3, r6\n\t"
  10774. "adcs r4, r4, r7\n\t"
  10775. "mov r5, #0\n\t"
  10776. "adc r5, r5, #0\n\t"
  10777. #endif
  10778. "str r3, [%[r]], #4\n\t"
  10779. /* A[22] * B */
  10780. "ldr r8, [%[a]], #4\n\t"
  10781. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10782. "lsl r6, %[b], #16\n\t"
  10783. "lsl r7, r8, #16\n\t"
  10784. "lsr r6, r6, #16\n\t"
  10785. "lsr r7, r7, #16\n\t"
  10786. "mul r7, r6, r7\n\t"
  10787. "adds r4, r4, r7\n\t"
  10788. "adcs r5, r5, #0\n\t"
  10789. "mov r3, #0\n\t"
  10790. "adc r3, r3, #0\n\t"
  10791. "lsr r7, r8, #16\n\t"
  10792. "mul r6, r7, r6\n\t"
  10793. "lsr r7, r6, #16\n\t"
  10794. "lsl r6, r6, #16\n\t"
  10795. "adds r4, r4, r6\n\t"
  10796. "adcs r5, r5, r7\n\t"
  10797. "adc r3, r3, #0\n\t"
  10798. "lsr r6, %[b], #16\n\t"
  10799. "lsr r7, r8, #16\n\t"
  10800. "mul r7, r6, r7\n\t"
  10801. "adds r5, r5, r7\n\t"
  10802. "adc r3, r3, #0\n\t"
  10803. "lsl r7, r8, #16\n\t"
  10804. "lsr r7, r7, #16\n\t"
  10805. "mul r6, r7, r6\n\t"
  10806. "lsr r7, r6, #16\n\t"
  10807. "lsl r6, r6, #16\n\t"
  10808. "adds r4, r4, r6\n\t"
  10809. "adcs r5, r5, r7\n\t"
  10810. "adc r3, r3, #0\n\t"
  10811. #else
  10812. "umull r6, r7, %[b], r8\n\t"
  10813. "adds r4, r4, r6\n\t"
  10814. "adcs r5, r5, r7\n\t"
  10815. "mov r3, #0\n\t"
  10816. "adc r3, r3, #0\n\t"
  10817. #endif
  10818. "str r4, [%[r]], #4\n\t"
  10819. /* A[23] * B */
  10820. "ldr r8, [%[a]], #4\n\t"
  10821. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10822. "lsl r6, %[b], #16\n\t"
  10823. "lsl r7, r8, #16\n\t"
  10824. "lsr r6, r6, #16\n\t"
  10825. "lsr r7, r7, #16\n\t"
  10826. "mul r7, r6, r7\n\t"
  10827. "adds r5, r5, r7\n\t"
  10828. "adcs r3, r3, #0\n\t"
  10829. "mov r4, #0\n\t"
  10830. "adc r4, r4, #0\n\t"
  10831. "lsr r7, r8, #16\n\t"
  10832. "mul r6, r7, r6\n\t"
  10833. "lsr r7, r6, #16\n\t"
  10834. "lsl r6, r6, #16\n\t"
  10835. "adds r5, r5, r6\n\t"
  10836. "adcs r3, r3, r7\n\t"
  10837. "adc r4, r4, #0\n\t"
  10838. "lsr r6, %[b], #16\n\t"
  10839. "lsr r7, r8, #16\n\t"
  10840. "mul r7, r6, r7\n\t"
  10841. "adds r3, r3, r7\n\t"
  10842. "adc r4, r4, #0\n\t"
  10843. "lsl r7, r8, #16\n\t"
  10844. "lsr r7, r7, #16\n\t"
  10845. "mul r6, r7, r6\n\t"
  10846. "lsr r7, r6, #16\n\t"
  10847. "lsl r6, r6, #16\n\t"
  10848. "adds r5, r5, r6\n\t"
  10849. "adcs r3, r3, r7\n\t"
  10850. "adc r4, r4, #0\n\t"
  10851. #else
  10852. "umull r6, r7, %[b], r8\n\t"
  10853. "adds r5, r5, r6\n\t"
  10854. "adcs r3, r3, r7\n\t"
  10855. "mov r4, #0\n\t"
  10856. "adc r4, r4, #0\n\t"
  10857. #endif
  10858. "str r5, [%[r]], #4\n\t"
  10859. /* A[24] * B */
  10860. "ldr r8, [%[a]], #4\n\t"
  10861. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10862. "lsl r6, %[b], #16\n\t"
  10863. "lsl r7, r8, #16\n\t"
  10864. "lsr r6, r6, #16\n\t"
  10865. "lsr r7, r7, #16\n\t"
  10866. "mul r7, r6, r7\n\t"
  10867. "adds r3, r3, r7\n\t"
  10868. "adcs r4, r4, #0\n\t"
  10869. "mov r5, #0\n\t"
  10870. "adc r5, r5, #0\n\t"
  10871. "lsr r7, r8, #16\n\t"
  10872. "mul r6, r7, r6\n\t"
  10873. "lsr r7, r6, #16\n\t"
  10874. "lsl r6, r6, #16\n\t"
  10875. "adds r3, r3, r6\n\t"
  10876. "adcs r4, r4, r7\n\t"
  10877. "adc r5, r5, #0\n\t"
  10878. "lsr r6, %[b], #16\n\t"
  10879. "lsr r7, r8, #16\n\t"
  10880. "mul r7, r6, r7\n\t"
  10881. "adds r4, r4, r7\n\t"
  10882. "adc r5, r5, #0\n\t"
  10883. "lsl r7, r8, #16\n\t"
  10884. "lsr r7, r7, #16\n\t"
  10885. "mul r6, r7, r6\n\t"
  10886. "lsr r7, r6, #16\n\t"
  10887. "lsl r6, r6, #16\n\t"
  10888. "adds r3, r3, r6\n\t"
  10889. "adcs r4, r4, r7\n\t"
  10890. "adc r5, r5, #0\n\t"
  10891. #else
  10892. "umull r6, r7, %[b], r8\n\t"
  10893. "adds r3, r3, r6\n\t"
  10894. "adcs r4, r4, r7\n\t"
  10895. "mov r5, #0\n\t"
  10896. "adc r5, r5, #0\n\t"
  10897. #endif
  10898. "str r3, [%[r]], #4\n\t"
  10899. /* A[25] * B */
  10900. "ldr r8, [%[a]], #4\n\t"
  10901. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10902. "lsl r6, %[b], #16\n\t"
  10903. "lsl r7, r8, #16\n\t"
  10904. "lsr r6, r6, #16\n\t"
  10905. "lsr r7, r7, #16\n\t"
  10906. "mul r7, r6, r7\n\t"
  10907. "adds r4, r4, r7\n\t"
  10908. "adcs r5, r5, #0\n\t"
  10909. "mov r3, #0\n\t"
  10910. "adc r3, r3, #0\n\t"
  10911. "lsr r7, r8, #16\n\t"
  10912. "mul r6, r7, r6\n\t"
  10913. "lsr r7, r6, #16\n\t"
  10914. "lsl r6, r6, #16\n\t"
  10915. "adds r4, r4, r6\n\t"
  10916. "adcs r5, r5, r7\n\t"
  10917. "adc r3, r3, #0\n\t"
  10918. "lsr r6, %[b], #16\n\t"
  10919. "lsr r7, r8, #16\n\t"
  10920. "mul r7, r6, r7\n\t"
  10921. "adds r5, r5, r7\n\t"
  10922. "adc r3, r3, #0\n\t"
  10923. "lsl r7, r8, #16\n\t"
  10924. "lsr r7, r7, #16\n\t"
  10925. "mul r6, r7, r6\n\t"
  10926. "lsr r7, r6, #16\n\t"
  10927. "lsl r6, r6, #16\n\t"
  10928. "adds r4, r4, r6\n\t"
  10929. "adcs r5, r5, r7\n\t"
  10930. "adc r3, r3, #0\n\t"
  10931. #else
  10932. "umull r6, r7, %[b], r8\n\t"
  10933. "adds r4, r4, r6\n\t"
  10934. "adcs r5, r5, r7\n\t"
  10935. "mov r3, #0\n\t"
  10936. "adc r3, r3, #0\n\t"
  10937. #endif
  10938. "str r4, [%[r]], #4\n\t"
  10939. /* A[26] * B */
  10940. "ldr r8, [%[a]], #4\n\t"
  10941. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10942. "lsl r6, %[b], #16\n\t"
  10943. "lsl r7, r8, #16\n\t"
  10944. "lsr r6, r6, #16\n\t"
  10945. "lsr r7, r7, #16\n\t"
  10946. "mul r7, r6, r7\n\t"
  10947. "adds r5, r5, r7\n\t"
  10948. "adcs r3, r3, #0\n\t"
  10949. "mov r4, #0\n\t"
  10950. "adc r4, r4, #0\n\t"
  10951. "lsr r7, r8, #16\n\t"
  10952. "mul r6, r7, r6\n\t"
  10953. "lsr r7, r6, #16\n\t"
  10954. "lsl r6, r6, #16\n\t"
  10955. "adds r5, r5, r6\n\t"
  10956. "adcs r3, r3, r7\n\t"
  10957. "adc r4, r4, #0\n\t"
  10958. "lsr r6, %[b], #16\n\t"
  10959. "lsr r7, r8, #16\n\t"
  10960. "mul r7, r6, r7\n\t"
  10961. "adds r3, r3, r7\n\t"
  10962. "adc r4, r4, #0\n\t"
  10963. "lsl r7, r8, #16\n\t"
  10964. "lsr r7, r7, #16\n\t"
  10965. "mul r6, r7, r6\n\t"
  10966. "lsr r7, r6, #16\n\t"
  10967. "lsl r6, r6, #16\n\t"
  10968. "adds r5, r5, r6\n\t"
  10969. "adcs r3, r3, r7\n\t"
  10970. "adc r4, r4, #0\n\t"
  10971. #else
  10972. "umull r6, r7, %[b], r8\n\t"
  10973. "adds r5, r5, r6\n\t"
  10974. "adcs r3, r3, r7\n\t"
  10975. "mov r4, #0\n\t"
  10976. "adc r4, r4, #0\n\t"
  10977. #endif
  10978. "str r5, [%[r]], #4\n\t"
  10979. /* A[27] * B */
  10980. "ldr r8, [%[a]], #4\n\t"
  10981. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  10982. "lsl r6, %[b], #16\n\t"
  10983. "lsl r7, r8, #16\n\t"
  10984. "lsr r6, r6, #16\n\t"
  10985. "lsr r7, r7, #16\n\t"
  10986. "mul r7, r6, r7\n\t"
  10987. "adds r3, r3, r7\n\t"
  10988. "adcs r4, r4, #0\n\t"
  10989. "mov r5, #0\n\t"
  10990. "adc r5, r5, #0\n\t"
  10991. "lsr r7, r8, #16\n\t"
  10992. "mul r6, r7, r6\n\t"
  10993. "lsr r7, r6, #16\n\t"
  10994. "lsl r6, r6, #16\n\t"
  10995. "adds r3, r3, r6\n\t"
  10996. "adcs r4, r4, r7\n\t"
  10997. "adc r5, r5, #0\n\t"
  10998. "lsr r6, %[b], #16\n\t"
  10999. "lsr r7, r8, #16\n\t"
  11000. "mul r7, r6, r7\n\t"
  11001. "adds r4, r4, r7\n\t"
  11002. "adc r5, r5, #0\n\t"
  11003. "lsl r7, r8, #16\n\t"
  11004. "lsr r7, r7, #16\n\t"
  11005. "mul r6, r7, r6\n\t"
  11006. "lsr r7, r6, #16\n\t"
  11007. "lsl r6, r6, #16\n\t"
  11008. "adds r3, r3, r6\n\t"
  11009. "adcs r4, r4, r7\n\t"
  11010. "adc r5, r5, #0\n\t"
  11011. #else
  11012. "umull r6, r7, %[b], r8\n\t"
  11013. "adds r3, r3, r6\n\t"
  11014. "adcs r4, r4, r7\n\t"
  11015. "mov r5, #0\n\t"
  11016. "adc r5, r5, #0\n\t"
  11017. #endif
  11018. "str r3, [%[r]], #4\n\t"
  11019. /* A[28] * B */
  11020. "ldr r8, [%[a]], #4\n\t"
  11021. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  11022. "lsl r6, %[b], #16\n\t"
  11023. "lsl r7, r8, #16\n\t"
  11024. "lsr r6, r6, #16\n\t"
  11025. "lsr r7, r7, #16\n\t"
  11026. "mul r7, r6, r7\n\t"
  11027. "adds r4, r4, r7\n\t"
  11028. "adcs r5, r5, #0\n\t"
  11029. "mov r3, #0\n\t"
  11030. "adc r3, r3, #0\n\t"
  11031. "lsr r7, r8, #16\n\t"
  11032. "mul r6, r7, r6\n\t"
  11033. "lsr r7, r6, #16\n\t"
  11034. "lsl r6, r6, #16\n\t"
  11035. "adds r4, r4, r6\n\t"
  11036. "adcs r5, r5, r7\n\t"
  11037. "adc r3, r3, #0\n\t"
  11038. "lsr r6, %[b], #16\n\t"
  11039. "lsr r7, r8, #16\n\t"
  11040. "mul r7, r6, r7\n\t"
  11041. "adds r5, r5, r7\n\t"
  11042. "adc r3, r3, #0\n\t"
  11043. "lsl r7, r8, #16\n\t"
  11044. "lsr r7, r7, #16\n\t"
  11045. "mul r6, r7, r6\n\t"
  11046. "lsr r7, r6, #16\n\t"
  11047. "lsl r6, r6, #16\n\t"
  11048. "adds r4, r4, r6\n\t"
  11049. "adcs r5, r5, r7\n\t"
  11050. "adc r3, r3, #0\n\t"
  11051. #else
  11052. "umull r6, r7, %[b], r8\n\t"
  11053. "adds r4, r4, r6\n\t"
  11054. "adcs r5, r5, r7\n\t"
  11055. "mov r3, #0\n\t"
  11056. "adc r3, r3, #0\n\t"
  11057. #endif
  11058. "str r4, [%[r]], #4\n\t"
  11059. /* A[29] * B */
  11060. "ldr r8, [%[a]], #4\n\t"
  11061. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  11062. "lsl r6, %[b], #16\n\t"
  11063. "lsl r7, r8, #16\n\t"
  11064. "lsr r6, r6, #16\n\t"
  11065. "lsr r7, r7, #16\n\t"
  11066. "mul r7, r6, r7\n\t"
  11067. "adds r5, r5, r7\n\t"
  11068. "adcs r3, r3, #0\n\t"
  11069. "mov r4, #0\n\t"
  11070. "adc r4, r4, #0\n\t"
  11071. "lsr r7, r8, #16\n\t"
  11072. "mul r6, r7, r6\n\t"
  11073. "lsr r7, r6, #16\n\t"
  11074. "lsl r6, r6, #16\n\t"
  11075. "adds r5, r5, r6\n\t"
  11076. "adcs r3, r3, r7\n\t"
  11077. "adc r4, r4, #0\n\t"
  11078. "lsr r6, %[b], #16\n\t"
  11079. "lsr r7, r8, #16\n\t"
  11080. "mul r7, r6, r7\n\t"
  11081. "adds r3, r3, r7\n\t"
  11082. "adc r4, r4, #0\n\t"
  11083. "lsl r7, r8, #16\n\t"
  11084. "lsr r7, r7, #16\n\t"
  11085. "mul r6, r7, r6\n\t"
  11086. "lsr r7, r6, #16\n\t"
  11087. "lsl r6, r6, #16\n\t"
  11088. "adds r5, r5, r6\n\t"
  11089. "adcs r3, r3, r7\n\t"
  11090. "adc r4, r4, #0\n\t"
  11091. #else
  11092. "umull r6, r7, %[b], r8\n\t"
  11093. "adds r5, r5, r6\n\t"
  11094. "adcs r3, r3, r7\n\t"
  11095. "mov r4, #0\n\t"
  11096. "adc r4, r4, #0\n\t"
  11097. #endif
  11098. "str r5, [%[r]], #4\n\t"
  11099. /* A[30] * B */
  11100. "ldr r8, [%[a]], #4\n\t"
  11101. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  11102. "lsl r6, %[b], #16\n\t"
  11103. "lsl r7, r8, #16\n\t"
  11104. "lsr r6, r6, #16\n\t"
  11105. "lsr r7, r7, #16\n\t"
  11106. "mul r7, r6, r7\n\t"
  11107. "adds r3, r3, r7\n\t"
  11108. "adcs r4, r4, #0\n\t"
  11109. "mov r5, #0\n\t"
  11110. "adc r5, r5, #0\n\t"
  11111. "lsr r7, r8, #16\n\t"
  11112. "mul r6, r7, r6\n\t"
  11113. "lsr r7, r6, #16\n\t"
  11114. "lsl r6, r6, #16\n\t"
  11115. "adds r3, r3, r6\n\t"
  11116. "adcs r4, r4, r7\n\t"
  11117. "adc r5, r5, #0\n\t"
  11118. "lsr r6, %[b], #16\n\t"
  11119. "lsr r7, r8, #16\n\t"
  11120. "mul r7, r6, r7\n\t"
  11121. "adds r4, r4, r7\n\t"
  11122. "adc r5, r5, #0\n\t"
  11123. "lsl r7, r8, #16\n\t"
  11124. "lsr r7, r7, #16\n\t"
  11125. "mul r6, r7, r6\n\t"
  11126. "lsr r7, r6, #16\n\t"
  11127. "lsl r6, r6, #16\n\t"
  11128. "adds r3, r3, r6\n\t"
  11129. "adcs r4, r4, r7\n\t"
  11130. "adc r5, r5, #0\n\t"
  11131. #else
  11132. "umull r6, r7, %[b], r8\n\t"
  11133. "adds r3, r3, r6\n\t"
  11134. "adcs r4, r4, r7\n\t"
  11135. "mov r5, #0\n\t"
  11136. "adc r5, r5, #0\n\t"
  11137. #endif
  11138. "str r3, [%[r]], #4\n\t"
  11139. /* A[31] * B */
  11140. "ldr r8, [%[a]], #4\n\t"
  11141. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  11142. "lsl r6, %[b], #16\n\t"
  11143. "lsl r7, r8, #16\n\t"
  11144. "lsr r6, r6, #16\n\t"
  11145. "lsr r7, r7, #16\n\t"
  11146. "mul r7, r6, r7\n\t"
  11147. "adds r4, r4, r7\n\t"
  11148. "adc r5, r5, #0\n\t"
  11149. "lsr r7, r8, #16\n\t"
  11150. "mul r6, r7, r6\n\t"
  11151. "lsr r7, r6, #16\n\t"
  11152. "lsl r6, r6, #16\n\t"
  11153. "adds r4, r4, r6\n\t"
  11154. "adc r5, r5, r7\n\t"
  11155. "lsr r6, %[b], #16\n\t"
  11156. "lsr r7, r8, #16\n\t"
  11157. "mul r7, r6, r7\n\t"
  11158. "add r5, r5, r7\n\t"
  11159. "lsl r7, r8, #16\n\t"
  11160. "lsr r7, r7, #16\n\t"
  11161. "mul r6, r7, r6\n\t"
  11162. "lsr r7, r6, #16\n\t"
  11163. "lsl r6, r6, #16\n\t"
  11164. "adds r4, r4, r6\n\t"
  11165. "adc r5, r5, r7\n\t"
  11166. #else
  11167. "umull r6, r7, %[b], r8\n\t"
  11168. "adds r4, r4, r6\n\t"
  11169. "adc r5, r5, r7\n\t"
  11170. #endif
  11171. "str r4, [%[r]], #4\n\t"
  11172. "str r5, [%[r]]\n\t"
  11173. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  11174. :
  11175. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10"
  11176. );
  11177. }
  11178. #endif /* WOLFSSL_SP_SMALL */
  11179. #ifdef WOLFSSL_SP_USE_UDIV
  11180. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  11181. *
  11182. * d1 The high order half of the number to divide.
  11183. * d0 The low order half of the number to divide.
  11184. * div The divisor.
  11185. * returns the result of the division.
  11186. *
  11187. * Note that this is an approximate div. It may give an answer 1 larger.
  11188. */
  11189. static sp_digit div_2048_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  11190. {
  11191. register sp_digit d1 asm ("r0") = d1_p;
  11192. register sp_digit d0 asm ("r1") = d0_p;
  11193. register sp_digit div asm ("r2") = div_p;
  11194. __asm__ __volatile__ (
  11195. "lsr r6, %[div], #16\n\t"
  11196. "add lr, r6, #1\n\t"
  11197. "udiv r4, %[d1], lr\n\t"
  11198. "lsl r5, %[div], #16\n\t"
  11199. "lsl r4, r4, #16\n\t"
  11200. "umull r3, r12, %[div], r4\n\t"
  11201. "subs %[d0], %[d0], r3\n\t"
  11202. "sbc %[d1], %[d1], r12\n\t"
  11203. "subs r3, %[d1], lr\n\t"
  11204. "sbc r7, r7, r7\n\t"
  11205. "add r7, r7, #1\n\t"
  11206. "rsb r8, r7, #0\n\t"
  11207. "lsl r7, r7, #16\n\t"
  11208. "and r5, r5, r8\n\t"
  11209. "and r6, r6, r8\n\t"
  11210. "subs %[d0], %[d0], r5\n\t"
  11211. "add r4, r4, r7\n\t"
  11212. "sbc %[d1], %[d1], r6\n\t"
  11213. "lsl r12, %[d1], #16\n\t"
  11214. "lsr r3, %[d0], #16\n\t"
  11215. "orr r3, r3, r12\n\t"
  11216. "udiv r3, r3, lr\n\t"
  11217. "add r4, r4, r3\n\t"
  11218. "umull r3, r12, %[div], r3\n\t"
  11219. "subs %[d0], %[d0], r3\n\t"
  11220. "sbc %[d1], %[d1], r12\n\t"
  11221. "lsl r12, %[d1], #16\n\t"
  11222. "lsr r3, %[d0], #16\n\t"
  11223. "orr r3, r3, r12\n\t"
  11224. "udiv r3, r3, lr\n\t"
  11225. "add r4, r4, r3\n\t"
  11226. "mul r3, %[div], r3\n\t"
  11227. "sub %[d0], %[d0], r3\n\t"
  11228. "udiv r3, %[d0], %[div]\n\t"
  11229. "add %[d1], r4, r3\n\t"
  11230. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  11231. :
  11232. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  11233. );
  11234. return (uint32_t)(size_t)d1;
  11235. }
  11236. #else
  11237. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  11238. *
  11239. * d1 The high order half of the number to divide.
  11240. * d0 The low order half of the number to divide.
  11241. * div The divisor.
  11242. * returns the result of the division.
  11243. *
  11244. * Note that this is an approximate div. It may give an answer 1 larger.
  11245. */
  11246. static sp_digit div_2048_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  11247. {
  11248. register sp_digit d1 asm ("r0") = d1_p;
  11249. register sp_digit d0 asm ("r1") = d0_p;
  11250. register sp_digit div asm ("r2") = div_p;
  11251. __asm__ __volatile__ (
  11252. "lsr lr, %[div], #1\n\t"
  11253. "add lr, lr, #1\n\t"
  11254. "mov r4, %[d0]\n\t"
  11255. "mov r5, %[d1]\n\t"
  11256. /* Do top 32 */
  11257. "subs r6, lr, r5\n\t"
  11258. "sbc r6, r6, r6\n\t"
  11259. "mov r3, #0\n\t"
  11260. "sub r3, r3, r6\n\t"
  11261. "and r6, r6, lr\n\t"
  11262. "subs r5, r5, r6\n\t"
  11263. /* Next 30 bits */
  11264. "mov r12, #29\n\t"
  11265. "\n"
  11266. "L_div_2048_word_32_bit_%=: \n\t"
  11267. "lsls r4, r4, #1\n\t"
  11268. "adc r5, r5, r5\n\t"
  11269. "subs r6, lr, r5\n\t"
  11270. "sbc r6, r6, r6\n\t"
  11271. "add r3, r3, r3\n\t"
  11272. "sub r3, r3, r6\n\t"
  11273. "and r6, r6, lr\n\t"
  11274. "subs r5, r5, r6\n\t"
  11275. "subs r12, r12, #1\n\t"
  11276. "bpl L_div_2048_word_32_bit_%=\n\t"
  11277. "add r3, r3, r3\n\t"
  11278. "add r3, r3, #1\n\t"
  11279. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  11280. "lsl r7, r3, #16\n\t"
  11281. "lsl r4, %[div], #16\n\t"
  11282. "lsr r7, r7, #16\n\t"
  11283. "lsr r4, r4, #16\n\t"
  11284. "mul r4, r7, r4\n\t"
  11285. "lsr r8, %[div], #16\n\t"
  11286. "mul r7, r8, r7\n\t"
  11287. "lsr r5, r7, #16\n\t"
  11288. "lsl r7, r7, #16\n\t"
  11289. "adds r4, r4, r7\n\t"
  11290. "adc r5, r5, #0\n\t"
  11291. "lsr r7, r3, #16\n\t"
  11292. "mul r8, r7, r8\n\t"
  11293. "add r5, r5, r8\n\t"
  11294. "lsl r8, %[div], #16\n\t"
  11295. "lsr r8, r8, #16\n\t"
  11296. "mul r7, r8, r7\n\t"
  11297. "lsr r8, r7, #16\n\t"
  11298. "lsl r7, r7, #16\n\t"
  11299. "adds r4, r4, r7\n\t"
  11300. "adc r5, r5, r8\n\t"
  11301. #else
  11302. "umull r4, r5, r3, %[div]\n\t"
  11303. #endif
  11304. "subs r7, %[d0], r4\n\t"
  11305. "sbc r8, %[d1], r5\n\t"
  11306. "add r3, r3, r8\n\t"
  11307. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  11308. "lsl r7, r3, #16\n\t"
  11309. "lsl r4, %[div], #16\n\t"
  11310. "lsr r7, r7, #16\n\t"
  11311. "lsr r4, r4, #16\n\t"
  11312. "mul r4, r7, r4\n\t"
  11313. "lsr r8, %[div], #16\n\t"
  11314. "mul r7, r8, r7\n\t"
  11315. "lsr r5, r7, #16\n\t"
  11316. "lsl r7, r7, #16\n\t"
  11317. "adds r4, r4, r7\n\t"
  11318. "adc r5, r5, #0\n\t"
  11319. "lsr r7, r3, #16\n\t"
  11320. "mul r8, r7, r8\n\t"
  11321. "add r5, r5, r8\n\t"
  11322. "lsl r8, %[div], #16\n\t"
  11323. "lsr r8, r8, #16\n\t"
  11324. "mul r7, r8, r7\n\t"
  11325. "lsr r8, r7, #16\n\t"
  11326. "lsl r7, r7, #16\n\t"
  11327. "adds r4, r4, r7\n\t"
  11328. "adc r5, r5, r8\n\t"
  11329. #else
  11330. "umull r4, r5, r3, %[div]\n\t"
  11331. #endif
  11332. "subs r7, %[d0], r4\n\t"
  11333. "sbc r8, %[d1], r5\n\t"
  11334. "add r3, r3, r8\n\t"
  11335. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  11336. "lsl r7, r3, #16\n\t"
  11337. "lsl r4, %[div], #16\n\t"
  11338. "lsr r7, r7, #16\n\t"
  11339. "lsr r4, r4, #16\n\t"
  11340. "mul r4, r7, r4\n\t"
  11341. "lsr r8, %[div], #16\n\t"
  11342. "mul r7, r8, r7\n\t"
  11343. "lsr r5, r7, #16\n\t"
  11344. "lsl r7, r7, #16\n\t"
  11345. "adds r4, r4, r7\n\t"
  11346. "adc r5, r5, #0\n\t"
  11347. "lsr r7, r3, #16\n\t"
  11348. "mul r8, r7, r8\n\t"
  11349. "add r5, r5, r8\n\t"
  11350. "lsl r8, %[div], #16\n\t"
  11351. "lsr r8, r8, #16\n\t"
  11352. "mul r7, r8, r7\n\t"
  11353. "lsr r8, r7, #16\n\t"
  11354. "lsl r7, r7, #16\n\t"
  11355. "adds r4, r4, r7\n\t"
  11356. "adc r5, r5, r8\n\t"
  11357. #else
  11358. "umull r4, r5, r3, %[div]\n\t"
  11359. #endif
  11360. "subs r7, %[d0], r4\n\t"
  11361. "sbc r8, %[d1], r5\n\t"
  11362. "add r3, r3, r8\n\t"
  11363. "subs r6, %[div], r7\n\t"
  11364. "sbc r6, r6, r6\n\t"
  11365. "sub %[d1], r3, r6\n\t"
  11366. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  11367. :
  11368. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  11369. );
  11370. return (uint32_t)(size_t)d1;
  11371. }
  11372. #endif
  11373. /* Compare a with b in constant time.
  11374. *
  11375. * a A single precision integer.
  11376. * b A single precision integer.
  11377. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  11378. * respectively.
  11379. */
  11380. static sp_int32 sp_2048_cmp_32(const sp_digit* a_p, const sp_digit* b_p)
  11381. {
  11382. register const sp_digit* a asm ("r0") = a_p;
  11383. register const sp_digit* b asm ("r1") = b_p;
  11384. __asm__ __volatile__ (
  11385. "mov r2, #-1\n\t"
  11386. "mov r6, #1\n\t"
  11387. "mov r5, #0\n\t"
  11388. "mov r3, #-1\n\t"
  11389. #ifdef WOLFSSL_SP_SMALL
  11390. "mov r4, #0x7c\n\t"
  11391. "\n"
  11392. "L_sp_2048_cmp_32_words_%=: \n\t"
  11393. "ldr r12, [%[a], r4]\n\t"
  11394. "ldr lr, [%[b], r4]\n\t"
  11395. "and r12, r12, r3\n\t"
  11396. "and lr, lr, r3\n\t"
  11397. "subs r12, r12, lr\n\t"
  11398. "it hi\n\t"
  11399. "movhi r2, r6\n\t"
  11400. "it lo\n\t"
  11401. "movlo r2, r3\n\t"
  11402. "it ne\n\t"
  11403. "movne r3, r5\n\t"
  11404. "subs r4, r4, #4\n\t"
  11405. "bcs L_sp_2048_cmp_32_words_%=\n\t"
  11406. "eor r2, r2, r3\n\t"
  11407. #else
  11408. "ldr r12, [%[a], #124]\n\t"
  11409. "ldr lr, [%[b], #124]\n\t"
  11410. "and r12, r12, r3\n\t"
  11411. "and lr, lr, r3\n\t"
  11412. "subs r12, r12, lr\n\t"
  11413. "it hi\n\t"
  11414. "movhi r2, r6\n\t"
  11415. "it lo\n\t"
  11416. "movlo r2, r3\n\t"
  11417. "it ne\n\t"
  11418. "movne r3, r5\n\t"
  11419. "ldr r12, [%[a], #120]\n\t"
  11420. "ldr lr, [%[b], #120]\n\t"
  11421. "and r12, r12, r3\n\t"
  11422. "and lr, lr, r3\n\t"
  11423. "subs r12, r12, lr\n\t"
  11424. "it hi\n\t"
  11425. "movhi r2, r6\n\t"
  11426. "it lo\n\t"
  11427. "movlo r2, r3\n\t"
  11428. "it ne\n\t"
  11429. "movne r3, r5\n\t"
  11430. "ldr r12, [%[a], #116]\n\t"
  11431. "ldr lr, [%[b], #116]\n\t"
  11432. "and r12, r12, r3\n\t"
  11433. "and lr, lr, r3\n\t"
  11434. "subs r12, r12, lr\n\t"
  11435. "it hi\n\t"
  11436. "movhi r2, r6\n\t"
  11437. "it lo\n\t"
  11438. "movlo r2, r3\n\t"
  11439. "it ne\n\t"
  11440. "movne r3, r5\n\t"
  11441. "ldr r12, [%[a], #112]\n\t"
  11442. "ldr lr, [%[b], #112]\n\t"
  11443. "and r12, r12, r3\n\t"
  11444. "and lr, lr, r3\n\t"
  11445. "subs r12, r12, lr\n\t"
  11446. "it hi\n\t"
  11447. "movhi r2, r6\n\t"
  11448. "it lo\n\t"
  11449. "movlo r2, r3\n\t"
  11450. "it ne\n\t"
  11451. "movne r3, r5\n\t"
  11452. "ldr r12, [%[a], #108]\n\t"
  11453. "ldr lr, [%[b], #108]\n\t"
  11454. "and r12, r12, r3\n\t"
  11455. "and lr, lr, r3\n\t"
  11456. "subs r12, r12, lr\n\t"
  11457. "it hi\n\t"
  11458. "movhi r2, r6\n\t"
  11459. "it lo\n\t"
  11460. "movlo r2, r3\n\t"
  11461. "it ne\n\t"
  11462. "movne r3, r5\n\t"
  11463. "ldr r12, [%[a], #104]\n\t"
  11464. "ldr lr, [%[b], #104]\n\t"
  11465. "and r12, r12, r3\n\t"
  11466. "and lr, lr, r3\n\t"
  11467. "subs r12, r12, lr\n\t"
  11468. "it hi\n\t"
  11469. "movhi r2, r6\n\t"
  11470. "it lo\n\t"
  11471. "movlo r2, r3\n\t"
  11472. "it ne\n\t"
  11473. "movne r3, r5\n\t"
  11474. "ldr r12, [%[a], #100]\n\t"
  11475. "ldr lr, [%[b], #100]\n\t"
  11476. "and r12, r12, r3\n\t"
  11477. "and lr, lr, r3\n\t"
  11478. "subs r12, r12, lr\n\t"
  11479. "it hi\n\t"
  11480. "movhi r2, r6\n\t"
  11481. "it lo\n\t"
  11482. "movlo r2, r3\n\t"
  11483. "it ne\n\t"
  11484. "movne r3, r5\n\t"
  11485. "ldr r12, [%[a], #96]\n\t"
  11486. "ldr lr, [%[b], #96]\n\t"
  11487. "and r12, r12, r3\n\t"
  11488. "and lr, lr, r3\n\t"
  11489. "subs r12, r12, lr\n\t"
  11490. "it hi\n\t"
  11491. "movhi r2, r6\n\t"
  11492. "it lo\n\t"
  11493. "movlo r2, r3\n\t"
  11494. "it ne\n\t"
  11495. "movne r3, r5\n\t"
  11496. "ldr r12, [%[a], #92]\n\t"
  11497. "ldr lr, [%[b], #92]\n\t"
  11498. "and r12, r12, r3\n\t"
  11499. "and lr, lr, r3\n\t"
  11500. "subs r12, r12, lr\n\t"
  11501. "it hi\n\t"
  11502. "movhi r2, r6\n\t"
  11503. "it lo\n\t"
  11504. "movlo r2, r3\n\t"
  11505. "it ne\n\t"
  11506. "movne r3, r5\n\t"
  11507. "ldr r12, [%[a], #88]\n\t"
  11508. "ldr lr, [%[b], #88]\n\t"
  11509. "and r12, r12, r3\n\t"
  11510. "and lr, lr, r3\n\t"
  11511. "subs r12, r12, lr\n\t"
  11512. "it hi\n\t"
  11513. "movhi r2, r6\n\t"
  11514. "it lo\n\t"
  11515. "movlo r2, r3\n\t"
  11516. "it ne\n\t"
  11517. "movne r3, r5\n\t"
  11518. "ldr r12, [%[a], #84]\n\t"
  11519. "ldr lr, [%[b], #84]\n\t"
  11520. "and r12, r12, r3\n\t"
  11521. "and lr, lr, r3\n\t"
  11522. "subs r12, r12, lr\n\t"
  11523. "it hi\n\t"
  11524. "movhi r2, r6\n\t"
  11525. "it lo\n\t"
  11526. "movlo r2, r3\n\t"
  11527. "it ne\n\t"
  11528. "movne r3, r5\n\t"
  11529. "ldr r12, [%[a], #80]\n\t"
  11530. "ldr lr, [%[b], #80]\n\t"
  11531. "and r12, r12, r3\n\t"
  11532. "and lr, lr, r3\n\t"
  11533. "subs r12, r12, lr\n\t"
  11534. "it hi\n\t"
  11535. "movhi r2, r6\n\t"
  11536. "it lo\n\t"
  11537. "movlo r2, r3\n\t"
  11538. "it ne\n\t"
  11539. "movne r3, r5\n\t"
  11540. "ldr r12, [%[a], #76]\n\t"
  11541. "ldr lr, [%[b], #76]\n\t"
  11542. "and r12, r12, r3\n\t"
  11543. "and lr, lr, r3\n\t"
  11544. "subs r12, r12, lr\n\t"
  11545. "it hi\n\t"
  11546. "movhi r2, r6\n\t"
  11547. "it lo\n\t"
  11548. "movlo r2, r3\n\t"
  11549. "it ne\n\t"
  11550. "movne r3, r5\n\t"
  11551. "ldr r12, [%[a], #72]\n\t"
  11552. "ldr lr, [%[b], #72]\n\t"
  11553. "and r12, r12, r3\n\t"
  11554. "and lr, lr, r3\n\t"
  11555. "subs r12, r12, lr\n\t"
  11556. "it hi\n\t"
  11557. "movhi r2, r6\n\t"
  11558. "it lo\n\t"
  11559. "movlo r2, r3\n\t"
  11560. "it ne\n\t"
  11561. "movne r3, r5\n\t"
  11562. "ldr r12, [%[a], #68]\n\t"
  11563. "ldr lr, [%[b], #68]\n\t"
  11564. "and r12, r12, r3\n\t"
  11565. "and lr, lr, r3\n\t"
  11566. "subs r12, r12, lr\n\t"
  11567. "it hi\n\t"
  11568. "movhi r2, r6\n\t"
  11569. "it lo\n\t"
  11570. "movlo r2, r3\n\t"
  11571. "it ne\n\t"
  11572. "movne r3, r5\n\t"
  11573. "ldr r12, [%[a], #64]\n\t"
  11574. "ldr lr, [%[b], #64]\n\t"
  11575. "and r12, r12, r3\n\t"
  11576. "and lr, lr, r3\n\t"
  11577. "subs r12, r12, lr\n\t"
  11578. "it hi\n\t"
  11579. "movhi r2, r6\n\t"
  11580. "it lo\n\t"
  11581. "movlo r2, r3\n\t"
  11582. "it ne\n\t"
  11583. "movne r3, r5\n\t"
  11584. "ldr r12, [%[a], #60]\n\t"
  11585. "ldr lr, [%[b], #60]\n\t"
  11586. "and r12, r12, r3\n\t"
  11587. "and lr, lr, r3\n\t"
  11588. "subs r12, r12, lr\n\t"
  11589. "it hi\n\t"
  11590. "movhi r2, r6\n\t"
  11591. "it lo\n\t"
  11592. "movlo r2, r3\n\t"
  11593. "it ne\n\t"
  11594. "movne r3, r5\n\t"
  11595. "ldr r12, [%[a], #56]\n\t"
  11596. "ldr lr, [%[b], #56]\n\t"
  11597. "and r12, r12, r3\n\t"
  11598. "and lr, lr, r3\n\t"
  11599. "subs r12, r12, lr\n\t"
  11600. "it hi\n\t"
  11601. "movhi r2, r6\n\t"
  11602. "it lo\n\t"
  11603. "movlo r2, r3\n\t"
  11604. "it ne\n\t"
  11605. "movne r3, r5\n\t"
  11606. "ldr r12, [%[a], #52]\n\t"
  11607. "ldr lr, [%[b], #52]\n\t"
  11608. "and r12, r12, r3\n\t"
  11609. "and lr, lr, r3\n\t"
  11610. "subs r12, r12, lr\n\t"
  11611. "it hi\n\t"
  11612. "movhi r2, r6\n\t"
  11613. "it lo\n\t"
  11614. "movlo r2, r3\n\t"
  11615. "it ne\n\t"
  11616. "movne r3, r5\n\t"
  11617. "ldr r12, [%[a], #48]\n\t"
  11618. "ldr lr, [%[b], #48]\n\t"
  11619. "and r12, r12, r3\n\t"
  11620. "and lr, lr, r3\n\t"
  11621. "subs r12, r12, lr\n\t"
  11622. "it hi\n\t"
  11623. "movhi r2, r6\n\t"
  11624. "it lo\n\t"
  11625. "movlo r2, r3\n\t"
  11626. "it ne\n\t"
  11627. "movne r3, r5\n\t"
  11628. "ldr r12, [%[a], #44]\n\t"
  11629. "ldr lr, [%[b], #44]\n\t"
  11630. "and r12, r12, r3\n\t"
  11631. "and lr, lr, r3\n\t"
  11632. "subs r12, r12, lr\n\t"
  11633. "it hi\n\t"
  11634. "movhi r2, r6\n\t"
  11635. "it lo\n\t"
  11636. "movlo r2, r3\n\t"
  11637. "it ne\n\t"
  11638. "movne r3, r5\n\t"
  11639. "ldr r12, [%[a], #40]\n\t"
  11640. "ldr lr, [%[b], #40]\n\t"
  11641. "and r12, r12, r3\n\t"
  11642. "and lr, lr, r3\n\t"
  11643. "subs r12, r12, lr\n\t"
  11644. "it hi\n\t"
  11645. "movhi r2, r6\n\t"
  11646. "it lo\n\t"
  11647. "movlo r2, r3\n\t"
  11648. "it ne\n\t"
  11649. "movne r3, r5\n\t"
  11650. "ldr r12, [%[a], #36]\n\t"
  11651. "ldr lr, [%[b], #36]\n\t"
  11652. "and r12, r12, r3\n\t"
  11653. "and lr, lr, r3\n\t"
  11654. "subs r12, r12, lr\n\t"
  11655. "it hi\n\t"
  11656. "movhi r2, r6\n\t"
  11657. "it lo\n\t"
  11658. "movlo r2, r3\n\t"
  11659. "it ne\n\t"
  11660. "movne r3, r5\n\t"
  11661. "ldr r12, [%[a], #32]\n\t"
  11662. "ldr lr, [%[b], #32]\n\t"
  11663. "and r12, r12, r3\n\t"
  11664. "and lr, lr, r3\n\t"
  11665. "subs r12, r12, lr\n\t"
  11666. "it hi\n\t"
  11667. "movhi r2, r6\n\t"
  11668. "it lo\n\t"
  11669. "movlo r2, r3\n\t"
  11670. "it ne\n\t"
  11671. "movne r3, r5\n\t"
  11672. "ldr r12, [%[a], #28]\n\t"
  11673. "ldr lr, [%[b], #28]\n\t"
  11674. "and r12, r12, r3\n\t"
  11675. "and lr, lr, r3\n\t"
  11676. "subs r12, r12, lr\n\t"
  11677. "it hi\n\t"
  11678. "movhi r2, r6\n\t"
  11679. "it lo\n\t"
  11680. "movlo r2, r3\n\t"
  11681. "it ne\n\t"
  11682. "movne r3, r5\n\t"
  11683. "ldr r12, [%[a], #24]\n\t"
  11684. "ldr lr, [%[b], #24]\n\t"
  11685. "and r12, r12, r3\n\t"
  11686. "and lr, lr, r3\n\t"
  11687. "subs r12, r12, lr\n\t"
  11688. "it hi\n\t"
  11689. "movhi r2, r6\n\t"
  11690. "it lo\n\t"
  11691. "movlo r2, r3\n\t"
  11692. "it ne\n\t"
  11693. "movne r3, r5\n\t"
  11694. "ldr r12, [%[a], #20]\n\t"
  11695. "ldr lr, [%[b], #20]\n\t"
  11696. "and r12, r12, r3\n\t"
  11697. "and lr, lr, r3\n\t"
  11698. "subs r12, r12, lr\n\t"
  11699. "it hi\n\t"
  11700. "movhi r2, r6\n\t"
  11701. "it lo\n\t"
  11702. "movlo r2, r3\n\t"
  11703. "it ne\n\t"
  11704. "movne r3, r5\n\t"
  11705. "ldr r12, [%[a], #16]\n\t"
  11706. "ldr lr, [%[b], #16]\n\t"
  11707. "and r12, r12, r3\n\t"
  11708. "and lr, lr, r3\n\t"
  11709. "subs r12, r12, lr\n\t"
  11710. "it hi\n\t"
  11711. "movhi r2, r6\n\t"
  11712. "it lo\n\t"
  11713. "movlo r2, r3\n\t"
  11714. "it ne\n\t"
  11715. "movne r3, r5\n\t"
  11716. "ldr r12, [%[a], #12]\n\t"
  11717. "ldr lr, [%[b], #12]\n\t"
  11718. "and r12, r12, r3\n\t"
  11719. "and lr, lr, r3\n\t"
  11720. "subs r12, r12, lr\n\t"
  11721. "it hi\n\t"
  11722. "movhi r2, r6\n\t"
  11723. "it lo\n\t"
  11724. "movlo r2, r3\n\t"
  11725. "it ne\n\t"
  11726. "movne r3, r5\n\t"
  11727. "ldr r12, [%[a], #8]\n\t"
  11728. "ldr lr, [%[b], #8]\n\t"
  11729. "and r12, r12, r3\n\t"
  11730. "and lr, lr, r3\n\t"
  11731. "subs r12, r12, lr\n\t"
  11732. "it hi\n\t"
  11733. "movhi r2, r6\n\t"
  11734. "it lo\n\t"
  11735. "movlo r2, r3\n\t"
  11736. "it ne\n\t"
  11737. "movne r3, r5\n\t"
  11738. "ldr r12, [%[a], #4]\n\t"
  11739. "ldr lr, [%[b], #4]\n\t"
  11740. "and r12, r12, r3\n\t"
  11741. "and lr, lr, r3\n\t"
  11742. "subs r12, r12, lr\n\t"
  11743. "it hi\n\t"
  11744. "movhi r2, r6\n\t"
  11745. "it lo\n\t"
  11746. "movlo r2, r3\n\t"
  11747. "it ne\n\t"
  11748. "movne r3, r5\n\t"
  11749. "ldr r12, [%[a]]\n\t"
  11750. "ldr lr, [%[b]]\n\t"
  11751. "and r12, r12, r3\n\t"
  11752. "and lr, lr, r3\n\t"
  11753. "subs r12, r12, lr\n\t"
  11754. "it hi\n\t"
  11755. "movhi r2, r6\n\t"
  11756. "it lo\n\t"
  11757. "movlo r2, r3\n\t"
  11758. "it ne\n\t"
  11759. "movne r3, r5\n\t"
  11760. "eor r2, r2, r3\n\t"
  11761. #endif /*WOLFSSL_SP_SMALL */
  11762. "mov %[a], r2\n\t"
  11763. : [a] "+r" (a), [b] "+r" (b)
  11764. :
  11765. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6"
  11766. );
  11767. return (uint32_t)(size_t)a;
  11768. }
  11769. /* Divide d in a and put remainder into r (m*d + r = a)
  11770. * m is not calculated as it is not needed at this time.
  11771. *
  11772. * a Number to be divided.
  11773. * d Number to divide with.
  11774. * m Multiplier result.
  11775. * r Remainder from the division.
  11776. * returns MP_OKAY indicating success.
  11777. */
  11778. static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m,
  11779. sp_digit* r)
  11780. {
  11781. sp_digit t1[64], t2[33];
  11782. sp_digit div, r1;
  11783. int i;
  11784. (void)m;
  11785. div = d[31];
  11786. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  11787. r1 = sp_2048_cmp_32(&t1[32], d) >= 0;
  11788. sp_2048_cond_sub_32(&t1[32], &t1[32], d, (sp_digit)0 - r1);
  11789. for (i = 31; i >= 0; i--) {
  11790. volatile sp_digit mask = (sp_digit)0 - (t1[32 + i] == div);
  11791. sp_digit hi = t1[32 + i] + mask;
  11792. r1 = div_2048_word_32(hi, t1[32 + i - 1], div);
  11793. r1 |= mask;
  11794. sp_2048_mul_d_32(t2, d, r1);
  11795. t1[32 + i] += sp_2048_sub_in_place_32(&t1[i], t2);
  11796. t1[32 + i] -= t2[32];
  11797. sp_2048_mask_32(t2, d, t1[32 + i]);
  11798. t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
  11799. sp_2048_mask_32(t2, d, t1[32 + i]);
  11800. t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
  11801. }
  11802. r1 = sp_2048_cmp_32(t1, d) >= 0;
  11803. sp_2048_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  11804. return MP_OKAY;
  11805. }
  11806. /* Reduce a modulo m into r. (r = a mod m)
  11807. *
  11808. * r A single precision number that is the reduced result.
  11809. * a A single precision number that is to be reduced.
  11810. * m A single precision number that is the modulus to reduce with.
  11811. * returns MP_OKAY indicating success.
  11812. */
  11813. static WC_INLINE int sp_2048_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  11814. {
  11815. return sp_2048_div_32(a, m, NULL, r);
  11816. }
  11817. #ifdef WOLFSSL_SP_SMALL
  11818. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  11819. *
  11820. * r A single precision number that is the result of the operation.
  11821. * a A single precision number being exponentiated.
  11822. * e A single precision number that is the exponent.
  11823. * bits The number of bits in the exponent.
  11824. * m A single precision number that is the modulus.
  11825. * returns 0 on success.
  11826. * returns MEMORY_E on dynamic memory allocation failure.
  11827. * returns MP_VAL when base is even or exponent is 0.
  11828. */
  11829. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  11830. int bits, const sp_digit* m, int reduceA)
  11831. {
  11832. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  11833. sp_digit* td = NULL;
  11834. #else
  11835. sp_digit td[16 * 64];
  11836. #endif
  11837. sp_digit* t[16];
  11838. sp_digit* norm = NULL;
  11839. sp_digit mp = 1;
  11840. sp_digit n;
  11841. sp_digit mask;
  11842. int i;
  11843. int c;
  11844. byte y;
  11845. int err = MP_OKAY;
  11846. if (bits == 0) {
  11847. err = MP_VAL;
  11848. }
  11849. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  11850. if (err == MP_OKAY) {
  11851. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 64), NULL,
  11852. DYNAMIC_TYPE_TMP_BUFFER);
  11853. if (td == NULL)
  11854. err = MEMORY_E;
  11855. }
  11856. #endif
  11857. if (err == MP_OKAY) {
  11858. norm = td;
  11859. for (i=0; i<16; i++) {
  11860. t[i] = td + i * 64;
  11861. }
  11862. sp_2048_mont_setup(m, &mp);
  11863. sp_2048_mont_norm_32(norm, m);
  11864. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  11865. if (reduceA != 0) {
  11866. err = sp_2048_mod_32(t[1] + 32, a, m);
  11867. if (err == MP_OKAY) {
  11868. err = sp_2048_mod_32(t[1], t[1], m);
  11869. }
  11870. }
  11871. else {
  11872. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  11873. err = sp_2048_mod_32(t[1], t[1], m);
  11874. }
  11875. }
  11876. if (err == MP_OKAY) {
  11877. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  11878. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  11879. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  11880. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  11881. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  11882. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  11883. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  11884. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  11885. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  11886. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  11887. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  11888. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  11889. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  11890. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  11891. i = (bits - 1) / 32;
  11892. n = e[i--];
  11893. c = bits & 31;
  11894. if (c == 0) {
  11895. c = 32;
  11896. }
  11897. c -= bits % 4;
  11898. if (c == 32) {
  11899. c = 28;
  11900. }
  11901. if (c < 0) {
  11902. /* Number of bits in top word is less than number needed. */
  11903. c = -c;
  11904. y = (byte)(n << c);
  11905. n = e[i--];
  11906. y |= (byte)(n >> (64 - c));
  11907. n <<= c;
  11908. c = 64 - c;
  11909. }
  11910. else if (c == 0) {
  11911. /* All bits in top word used. */
  11912. y = (byte)n;
  11913. }
  11914. else {
  11915. y = (byte)(n >> c);
  11916. n <<= 32 - c;
  11917. }
  11918. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  11919. for (; i>=0 || c>=4; ) {
  11920. if (c == 0) {
  11921. n = e[i--];
  11922. y = (byte)(n >> 28);
  11923. n <<= 4;
  11924. c = 28;
  11925. }
  11926. else if (c < 4) {
  11927. y = (byte)(n >> 28);
  11928. n = e[i--];
  11929. c = 4 - c;
  11930. y |= (byte)(n >> (32 - c));
  11931. n <<= c;
  11932. c = 32 - c;
  11933. }
  11934. else {
  11935. y = (byte)((n >> 28) & 0xf);
  11936. n <<= 4;
  11937. c -= 4;
  11938. }
  11939. sp_2048_mont_sqr_32(r, r, m, mp);
  11940. sp_2048_mont_sqr_32(r, r, m, mp);
  11941. sp_2048_mont_sqr_32(r, r, m, mp);
  11942. sp_2048_mont_sqr_32(r, r, m, mp);
  11943. sp_2048_mont_mul_32(r, r, t[y], m, mp);
  11944. }
  11945. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  11946. sp_2048_mont_reduce_32(r, m, mp);
  11947. mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
  11948. sp_2048_cond_sub_32(r, r, m, mask);
  11949. }
  11950. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  11951. if (td != NULL)
  11952. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  11953. #endif
  11954. return err;
  11955. }
  11956. #else
  11957. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  11958. *
  11959. * r A single precision number that is the result of the operation.
  11960. * a A single precision number being exponentiated.
  11961. * e A single precision number that is the exponent.
  11962. * bits The number of bits in the exponent.
  11963. * m A single precision number that is the modulus.
  11964. * returns 0 on success.
  11965. * returns MEMORY_E on dynamic memory allocation failure.
  11966. * returns MP_VAL when base is even or exponent is 0.
  11967. */
  11968. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  11969. int bits, const sp_digit* m, int reduceA)
  11970. {
  11971. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  11972. sp_digit* td = NULL;
  11973. #else
  11974. sp_digit td[32 * 64];
  11975. #endif
  11976. sp_digit* t[32];
  11977. sp_digit* norm = NULL;
  11978. sp_digit mp = 1;
  11979. sp_digit n;
  11980. sp_digit mask;
  11981. int i;
  11982. int c;
  11983. byte y;
  11984. int err = MP_OKAY;
  11985. if (bits == 0) {
  11986. err = MP_VAL;
  11987. }
  11988. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  11989. if (err == MP_OKAY) {
  11990. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 64), NULL,
  11991. DYNAMIC_TYPE_TMP_BUFFER);
  11992. if (td == NULL)
  11993. err = MEMORY_E;
  11994. }
  11995. #endif
  11996. if (err == MP_OKAY) {
  11997. norm = td;
  11998. for (i=0; i<32; i++) {
  11999. t[i] = td + i * 64;
  12000. }
  12001. sp_2048_mont_setup(m, &mp);
  12002. sp_2048_mont_norm_32(norm, m);
  12003. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  12004. if (reduceA != 0) {
  12005. err = sp_2048_mod_32(t[1] + 32, a, m);
  12006. if (err == MP_OKAY) {
  12007. err = sp_2048_mod_32(t[1], t[1], m);
  12008. }
  12009. }
  12010. else {
  12011. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  12012. err = sp_2048_mod_32(t[1], t[1], m);
  12013. }
  12014. }
  12015. if (err == MP_OKAY) {
  12016. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  12017. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  12018. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  12019. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  12020. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  12021. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  12022. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  12023. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  12024. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  12025. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  12026. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  12027. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  12028. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  12029. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  12030. sp_2048_mont_sqr_32(t[16], t[ 8], m, mp);
  12031. sp_2048_mont_mul_32(t[17], t[ 9], t[ 8], m, mp);
  12032. sp_2048_mont_sqr_32(t[18], t[ 9], m, mp);
  12033. sp_2048_mont_mul_32(t[19], t[10], t[ 9], m, mp);
  12034. sp_2048_mont_sqr_32(t[20], t[10], m, mp);
  12035. sp_2048_mont_mul_32(t[21], t[11], t[10], m, mp);
  12036. sp_2048_mont_sqr_32(t[22], t[11], m, mp);
  12037. sp_2048_mont_mul_32(t[23], t[12], t[11], m, mp);
  12038. sp_2048_mont_sqr_32(t[24], t[12], m, mp);
  12039. sp_2048_mont_mul_32(t[25], t[13], t[12], m, mp);
  12040. sp_2048_mont_sqr_32(t[26], t[13], m, mp);
  12041. sp_2048_mont_mul_32(t[27], t[14], t[13], m, mp);
  12042. sp_2048_mont_sqr_32(t[28], t[14], m, mp);
  12043. sp_2048_mont_mul_32(t[29], t[15], t[14], m, mp);
  12044. sp_2048_mont_sqr_32(t[30], t[15], m, mp);
  12045. sp_2048_mont_mul_32(t[31], t[16], t[15], m, mp);
  12046. i = (bits - 1) / 32;
  12047. n = e[i--];
  12048. c = bits & 31;
  12049. if (c == 0) {
  12050. c = 32;
  12051. }
  12052. c -= bits % 5;
  12053. if (c == 32) {
  12054. c = 27;
  12055. }
  12056. if (c < 0) {
  12057. /* Number of bits in top word is less than number needed. */
  12058. c = -c;
  12059. y = (byte)(n << c);
  12060. n = e[i--];
  12061. y |= (byte)(n >> (64 - c));
  12062. n <<= c;
  12063. c = 64 - c;
  12064. }
  12065. else if (c == 0) {
  12066. /* All bits in top word used. */
  12067. y = (byte)n;
  12068. }
  12069. else {
  12070. y = (byte)(n >> c);
  12071. n <<= 32 - c;
  12072. }
  12073. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  12074. for (; i>=0 || c>=5; ) {
  12075. if (c == 0) {
  12076. n = e[i--];
  12077. y = (byte)(n >> 27);
  12078. n <<= 5;
  12079. c = 27;
  12080. }
  12081. else if (c < 5) {
  12082. y = (byte)(n >> 27);
  12083. n = e[i--];
  12084. c = 5 - c;
  12085. y |= (byte)(n >> (32 - c));
  12086. n <<= c;
  12087. c = 32 - c;
  12088. }
  12089. else {
  12090. y = (byte)((n >> 27) & 0x1f);
  12091. n <<= 5;
  12092. c -= 5;
  12093. }
  12094. sp_2048_mont_sqr_32(r, r, m, mp);
  12095. sp_2048_mont_sqr_32(r, r, m, mp);
  12096. sp_2048_mont_sqr_32(r, r, m, mp);
  12097. sp_2048_mont_sqr_32(r, r, m, mp);
  12098. sp_2048_mont_sqr_32(r, r, m, mp);
  12099. sp_2048_mont_mul_32(r, r, t[y], m, mp);
  12100. }
  12101. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  12102. sp_2048_mont_reduce_32(r, m, mp);
  12103. mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
  12104. sp_2048_cond_sub_32(r, r, m, mask);
  12105. }
  12106. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  12107. if (td != NULL)
  12108. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  12109. #endif
  12110. return err;
  12111. }
  12112. #endif /* WOLFSSL_SP_SMALL */
  12113. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  12114. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  12115. /* r = 2^n mod m where n is the number of bits to reduce by.
  12116. * Given m must be 2048 bits, just need to subtract.
  12117. *
  12118. * r A single precision number.
  12119. * m A single precision number.
  12120. */
  12121. static void sp_2048_mont_norm_64(sp_digit* r, const sp_digit* m)
  12122. {
  12123. XMEMSET(r, 0, sizeof(sp_digit) * 64);
  12124. /* r = 2^n mod m */
  12125. sp_2048_sub_in_place_64(r, m);
  12126. }
  12127. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  12128. #ifdef WOLFSSL_SP_SMALL
  12129. /* Conditionally subtract b from a using the mask m.
  12130. * m is -1 to subtract and 0 when not copying.
  12131. *
  12132. * r A single precision number representing condition subtract result.
  12133. * a A single precision number to subtract from.
  12134. * b A single precision number to subtract.
  12135. * m Mask value to apply.
  12136. */
  12137. static sp_digit sp_2048_cond_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  12138. {
  12139. register sp_digit* r asm ("r0") = r_p;
  12140. register const sp_digit* a asm ("r1") = a_p;
  12141. register const sp_digit* b asm ("r2") = b_p;
  12142. register sp_digit m asm ("r3") = m_p;
  12143. __asm__ __volatile__ (
  12144. "mov r6, #0\n\t"
  12145. "mov r12, #0\n\t"
  12146. "mov lr, #0\n\t"
  12147. "\n"
  12148. "L_sp_2048_cond_sub_64_words_%=: \n\t"
  12149. "subs r12, r6, r12\n\t"
  12150. "ldr r4, [%[a], lr]\n\t"
  12151. "ldr r5, [%[b], lr]\n\t"
  12152. "and r5, r5, %[m]\n\t"
  12153. "sbcs r4, r4, r5\n\t"
  12154. "sbc r12, r6, r6\n\t"
  12155. "str r4, [%[r], lr]\n\t"
  12156. "add lr, lr, #4\n\t"
  12157. "cmp lr, #0x100\n\t"
  12158. "blt L_sp_2048_cond_sub_64_words_%=\n\t"
  12159. "mov %[r], r12\n\t"
  12160. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  12161. :
  12162. : "memory", "r12", "lr", "r4", "r5", "r6"
  12163. );
  12164. return (uint32_t)(size_t)r;
  12165. }
  12166. #else
  12167. /* Conditionally subtract b from a using the mask m.
  12168. * m is -1 to subtract and 0 when not copying.
  12169. *
  12170. * r A single precision number representing condition subtract result.
  12171. * a A single precision number to subtract from.
  12172. * b A single precision number to subtract.
  12173. * m Mask value to apply.
  12174. */
  12175. static sp_digit sp_2048_cond_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  12176. {
  12177. register sp_digit* r asm ("r0") = r_p;
  12178. register const sp_digit* a asm ("r1") = a_p;
  12179. register const sp_digit* b asm ("r2") = b_p;
  12180. register sp_digit m asm ("r3") = m_p;
  12181. __asm__ __volatile__ (
  12182. "mov lr, #0\n\t"
  12183. "ldm %[a]!, {r4, r5}\n\t"
  12184. "ldm %[b]!, {r6, r7}\n\t"
  12185. "and r6, r6, %[m]\n\t"
  12186. "and r7, r7, %[m]\n\t"
  12187. "subs r4, r4, r6\n\t"
  12188. "sbcs r5, r5, r7\n\t"
  12189. "stm %[r]!, {r4, r5}\n\t"
  12190. "ldm %[a]!, {r4, r5}\n\t"
  12191. "ldm %[b]!, {r6, r7}\n\t"
  12192. "and r6, r6, %[m]\n\t"
  12193. "and r7, r7, %[m]\n\t"
  12194. "sbcs r4, r4, r6\n\t"
  12195. "sbcs r5, r5, r7\n\t"
  12196. "stm %[r]!, {r4, r5}\n\t"
  12197. "ldm %[a]!, {r4, r5}\n\t"
  12198. "ldm %[b]!, {r6, r7}\n\t"
  12199. "and r6, r6, %[m]\n\t"
  12200. "and r7, r7, %[m]\n\t"
  12201. "sbcs r4, r4, r6\n\t"
  12202. "sbcs r5, r5, r7\n\t"
  12203. "stm %[r]!, {r4, r5}\n\t"
  12204. "ldm %[a]!, {r4, r5}\n\t"
  12205. "ldm %[b]!, {r6, r7}\n\t"
  12206. "and r6, r6, %[m]\n\t"
  12207. "and r7, r7, %[m]\n\t"
  12208. "sbcs r4, r4, r6\n\t"
  12209. "sbcs r5, r5, r7\n\t"
  12210. "stm %[r]!, {r4, r5}\n\t"
  12211. "ldm %[a]!, {r4, r5}\n\t"
  12212. "ldm %[b]!, {r6, r7}\n\t"
  12213. "and r6, r6, %[m]\n\t"
  12214. "and r7, r7, %[m]\n\t"
  12215. "sbcs r4, r4, r6\n\t"
  12216. "sbcs r5, r5, r7\n\t"
  12217. "stm %[r]!, {r4, r5}\n\t"
  12218. "ldm %[a]!, {r4, r5}\n\t"
  12219. "ldm %[b]!, {r6, r7}\n\t"
  12220. "and r6, r6, %[m]\n\t"
  12221. "and r7, r7, %[m]\n\t"
  12222. "sbcs r4, r4, r6\n\t"
  12223. "sbcs r5, r5, r7\n\t"
  12224. "stm %[r]!, {r4, r5}\n\t"
  12225. "ldm %[a]!, {r4, r5}\n\t"
  12226. "ldm %[b]!, {r6, r7}\n\t"
  12227. "and r6, r6, %[m]\n\t"
  12228. "and r7, r7, %[m]\n\t"
  12229. "sbcs r4, r4, r6\n\t"
  12230. "sbcs r5, r5, r7\n\t"
  12231. "stm %[r]!, {r4, r5}\n\t"
  12232. "ldm %[a]!, {r4, r5}\n\t"
  12233. "ldm %[b]!, {r6, r7}\n\t"
  12234. "and r6, r6, %[m]\n\t"
  12235. "and r7, r7, %[m]\n\t"
  12236. "sbcs r4, r4, r6\n\t"
  12237. "sbcs r5, r5, r7\n\t"
  12238. "stm %[r]!, {r4, r5}\n\t"
  12239. "ldm %[a]!, {r4, r5}\n\t"
  12240. "ldm %[b]!, {r6, r7}\n\t"
  12241. "and r6, r6, %[m]\n\t"
  12242. "and r7, r7, %[m]\n\t"
  12243. "sbcs r4, r4, r6\n\t"
  12244. "sbcs r5, r5, r7\n\t"
  12245. "stm %[r]!, {r4, r5}\n\t"
  12246. "ldm %[a]!, {r4, r5}\n\t"
  12247. "ldm %[b]!, {r6, r7}\n\t"
  12248. "and r6, r6, %[m]\n\t"
  12249. "and r7, r7, %[m]\n\t"
  12250. "sbcs r4, r4, r6\n\t"
  12251. "sbcs r5, r5, r7\n\t"
  12252. "stm %[r]!, {r4, r5}\n\t"
  12253. "ldm %[a]!, {r4, r5}\n\t"
  12254. "ldm %[b]!, {r6, r7}\n\t"
  12255. "and r6, r6, %[m]\n\t"
  12256. "and r7, r7, %[m]\n\t"
  12257. "sbcs r4, r4, r6\n\t"
  12258. "sbcs r5, r5, r7\n\t"
  12259. "stm %[r]!, {r4, r5}\n\t"
  12260. "ldm %[a]!, {r4, r5}\n\t"
  12261. "ldm %[b]!, {r6, r7}\n\t"
  12262. "and r6, r6, %[m]\n\t"
  12263. "and r7, r7, %[m]\n\t"
  12264. "sbcs r4, r4, r6\n\t"
  12265. "sbcs r5, r5, r7\n\t"
  12266. "stm %[r]!, {r4, r5}\n\t"
  12267. "ldm %[a]!, {r4, r5}\n\t"
  12268. "ldm %[b]!, {r6, r7}\n\t"
  12269. "and r6, r6, %[m]\n\t"
  12270. "and r7, r7, %[m]\n\t"
  12271. "sbcs r4, r4, r6\n\t"
  12272. "sbcs r5, r5, r7\n\t"
  12273. "stm %[r]!, {r4, r5}\n\t"
  12274. "ldm %[a]!, {r4, r5}\n\t"
  12275. "ldm %[b]!, {r6, r7}\n\t"
  12276. "and r6, r6, %[m]\n\t"
  12277. "and r7, r7, %[m]\n\t"
  12278. "sbcs r4, r4, r6\n\t"
  12279. "sbcs r5, r5, r7\n\t"
  12280. "stm %[r]!, {r4, r5}\n\t"
  12281. "ldm %[a]!, {r4, r5}\n\t"
  12282. "ldm %[b]!, {r6, r7}\n\t"
  12283. "and r6, r6, %[m]\n\t"
  12284. "and r7, r7, %[m]\n\t"
  12285. "sbcs r4, r4, r6\n\t"
  12286. "sbcs r5, r5, r7\n\t"
  12287. "stm %[r]!, {r4, r5}\n\t"
  12288. "ldm %[a]!, {r4, r5}\n\t"
  12289. "ldm %[b]!, {r6, r7}\n\t"
  12290. "and r6, r6, %[m]\n\t"
  12291. "and r7, r7, %[m]\n\t"
  12292. "sbcs r4, r4, r6\n\t"
  12293. "sbcs r5, r5, r7\n\t"
  12294. "stm %[r]!, {r4, r5}\n\t"
  12295. "ldm %[a]!, {r4, r5}\n\t"
  12296. "ldm %[b]!, {r6, r7}\n\t"
  12297. "and r6, r6, %[m]\n\t"
  12298. "and r7, r7, %[m]\n\t"
  12299. "sbcs r4, r4, r6\n\t"
  12300. "sbcs r5, r5, r7\n\t"
  12301. "stm %[r]!, {r4, r5}\n\t"
  12302. "ldm %[a]!, {r4, r5}\n\t"
  12303. "ldm %[b]!, {r6, r7}\n\t"
  12304. "and r6, r6, %[m]\n\t"
  12305. "and r7, r7, %[m]\n\t"
  12306. "sbcs r4, r4, r6\n\t"
  12307. "sbcs r5, r5, r7\n\t"
  12308. "stm %[r]!, {r4, r5}\n\t"
  12309. "ldm %[a]!, {r4, r5}\n\t"
  12310. "ldm %[b]!, {r6, r7}\n\t"
  12311. "and r6, r6, %[m]\n\t"
  12312. "and r7, r7, %[m]\n\t"
  12313. "sbcs r4, r4, r6\n\t"
  12314. "sbcs r5, r5, r7\n\t"
  12315. "stm %[r]!, {r4, r5}\n\t"
  12316. "ldm %[a]!, {r4, r5}\n\t"
  12317. "ldm %[b]!, {r6, r7}\n\t"
  12318. "and r6, r6, %[m]\n\t"
  12319. "and r7, r7, %[m]\n\t"
  12320. "sbcs r4, r4, r6\n\t"
  12321. "sbcs r5, r5, r7\n\t"
  12322. "stm %[r]!, {r4, r5}\n\t"
  12323. "ldm %[a]!, {r4, r5}\n\t"
  12324. "ldm %[b]!, {r6, r7}\n\t"
  12325. "and r6, r6, %[m]\n\t"
  12326. "and r7, r7, %[m]\n\t"
  12327. "sbcs r4, r4, r6\n\t"
  12328. "sbcs r5, r5, r7\n\t"
  12329. "stm %[r]!, {r4, r5}\n\t"
  12330. "ldm %[a]!, {r4, r5}\n\t"
  12331. "ldm %[b]!, {r6, r7}\n\t"
  12332. "and r6, r6, %[m]\n\t"
  12333. "and r7, r7, %[m]\n\t"
  12334. "sbcs r4, r4, r6\n\t"
  12335. "sbcs r5, r5, r7\n\t"
  12336. "stm %[r]!, {r4, r5}\n\t"
  12337. "ldm %[a]!, {r4, r5}\n\t"
  12338. "ldm %[b]!, {r6, r7}\n\t"
  12339. "and r6, r6, %[m]\n\t"
  12340. "and r7, r7, %[m]\n\t"
  12341. "sbcs r4, r4, r6\n\t"
  12342. "sbcs r5, r5, r7\n\t"
  12343. "stm %[r]!, {r4, r5}\n\t"
  12344. "ldm %[a]!, {r4, r5}\n\t"
  12345. "ldm %[b]!, {r6, r7}\n\t"
  12346. "and r6, r6, %[m]\n\t"
  12347. "and r7, r7, %[m]\n\t"
  12348. "sbcs r4, r4, r6\n\t"
  12349. "sbcs r5, r5, r7\n\t"
  12350. "stm %[r]!, {r4, r5}\n\t"
  12351. "ldm %[a]!, {r4, r5}\n\t"
  12352. "ldm %[b]!, {r6, r7}\n\t"
  12353. "and r6, r6, %[m]\n\t"
  12354. "and r7, r7, %[m]\n\t"
  12355. "sbcs r4, r4, r6\n\t"
  12356. "sbcs r5, r5, r7\n\t"
  12357. "stm %[r]!, {r4, r5}\n\t"
  12358. "ldm %[a]!, {r4, r5}\n\t"
  12359. "ldm %[b]!, {r6, r7}\n\t"
  12360. "and r6, r6, %[m]\n\t"
  12361. "and r7, r7, %[m]\n\t"
  12362. "sbcs r4, r4, r6\n\t"
  12363. "sbcs r5, r5, r7\n\t"
  12364. "stm %[r]!, {r4, r5}\n\t"
  12365. "ldm %[a]!, {r4, r5}\n\t"
  12366. "ldm %[b]!, {r6, r7}\n\t"
  12367. "and r6, r6, %[m]\n\t"
  12368. "and r7, r7, %[m]\n\t"
  12369. "sbcs r4, r4, r6\n\t"
  12370. "sbcs r5, r5, r7\n\t"
  12371. "stm %[r]!, {r4, r5}\n\t"
  12372. "ldm %[a]!, {r4, r5}\n\t"
  12373. "ldm %[b]!, {r6, r7}\n\t"
  12374. "and r6, r6, %[m]\n\t"
  12375. "and r7, r7, %[m]\n\t"
  12376. "sbcs r4, r4, r6\n\t"
  12377. "sbcs r5, r5, r7\n\t"
  12378. "stm %[r]!, {r4, r5}\n\t"
  12379. "ldm %[a]!, {r4, r5}\n\t"
  12380. "ldm %[b]!, {r6, r7}\n\t"
  12381. "and r6, r6, %[m]\n\t"
  12382. "and r7, r7, %[m]\n\t"
  12383. "sbcs r4, r4, r6\n\t"
  12384. "sbcs r5, r5, r7\n\t"
  12385. "stm %[r]!, {r4, r5}\n\t"
  12386. "ldm %[a]!, {r4, r5}\n\t"
  12387. "ldm %[b]!, {r6, r7}\n\t"
  12388. "and r6, r6, %[m]\n\t"
  12389. "and r7, r7, %[m]\n\t"
  12390. "sbcs r4, r4, r6\n\t"
  12391. "sbcs r5, r5, r7\n\t"
  12392. "stm %[r]!, {r4, r5}\n\t"
  12393. "ldm %[a]!, {r4, r5}\n\t"
  12394. "ldm %[b]!, {r6, r7}\n\t"
  12395. "and r6, r6, %[m]\n\t"
  12396. "and r7, r7, %[m]\n\t"
  12397. "sbcs r4, r4, r6\n\t"
  12398. "sbcs r5, r5, r7\n\t"
  12399. "stm %[r]!, {r4, r5}\n\t"
  12400. "ldm %[a]!, {r4, r5}\n\t"
  12401. "ldm %[b]!, {r6, r7}\n\t"
  12402. "and r6, r6, %[m]\n\t"
  12403. "and r7, r7, %[m]\n\t"
  12404. "sbcs r4, r4, r6\n\t"
  12405. "sbcs r5, r5, r7\n\t"
  12406. "stm %[r]!, {r4, r5}\n\t"
  12407. "sbc %[r], lr, lr\n\t"
  12408. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  12409. :
  12410. : "memory", "r12", "lr", "r4", "r5", "r6", "r7"
  12411. );
  12412. return (uint32_t)(size_t)r;
  12413. }
  12414. #endif /* WOLFSSL_SP_SMALL */
  12415. /* Reduce the number back to 2048 bits using Montgomery reduction.
  12416. *
  12417. * a A single precision number to reduce in place.
  12418. * m The single precision number representing the modulus.
  12419. * mp The digit representing the negative inverse of m mod 2^n.
  12420. */
  12421. static SP_NOINLINE void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  12422. {
  12423. register sp_digit* a asm ("r0") = a_p;
  12424. register const sp_digit* m asm ("r1") = m_p;
  12425. register sp_digit mp asm ("r2") = mp_p;
  12426. __asm__ __volatile__ (
  12427. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  12428. "ldr r11, [%[m]]\n\t"
  12429. #endif
  12430. /* i = 0 */
  12431. "mov r9, #0\n\t"
  12432. "mov r3, #0\n\t"
  12433. "ldr r12, [%[a]]\n\t"
  12434. "ldr lr, [%[a], #4]\n\t"
  12435. "\n"
  12436. "L_sp_2048_mont_reduce_64_word_%=: \n\t"
  12437. /* mu = a[i] * mp */
  12438. "mul r8, %[mp], r12\n\t"
  12439. /* a[i+0] += m[0] * mu */
  12440. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12441. "ldr r11, [%[m]]\n\t"
  12442. #endif
  12443. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12444. "lsr r7, r11, #16\n\t"
  12445. "lsr r6, r8, #16\n\t"
  12446. "mul r5, r6, r7\n\t"
  12447. "lsl r7, r11, #16\n\t"
  12448. "lsr r7, r7, #16\n\t"
  12449. "mul r6, r7, r6\n\t"
  12450. "lsr r7, r6, #16\n\t"
  12451. "lsl r6, r6, #16\n\t"
  12452. "adds r12, r12, r6\n\t"
  12453. "adc r5, r5, r7\n\t"
  12454. "lsl r6, r8, #16\n\t"
  12455. "lsl r7, r11, #16\n\t"
  12456. "lsr r6, r6, #16\n\t"
  12457. "lsr r7, r7, #16\n\t"
  12458. "mul r7, r6, r7\n\t"
  12459. "adds r12, r12, r7\n\t"
  12460. "adc r5, r5, #0\n\t"
  12461. "lsr r7, r11, #16\n\t"
  12462. "mul r6, r7, r6\n\t"
  12463. "lsr r7, r6, #16\n\t"
  12464. "lsl r6, r6, #16\n\t"
  12465. "adds r12, r12, r6\n\t"
  12466. "adc r5, r5, r7\n\t"
  12467. #else
  12468. "umull r6, r7, r8, r11\n\t"
  12469. "adds r12, r12, r6\n\t"
  12470. "adc r5, r7, #0\n\t"
  12471. #endif
  12472. /* a[i+1] += m[1] * mu */
  12473. "ldr r7, [%[m], #4]\n\t"
  12474. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12475. "lsr r10, r7, #16\n\t"
  12476. "lsr r6, r8, #16\n\t"
  12477. "mul r4, r6, r10\n\t"
  12478. "lsl r10, r7, #16\n\t"
  12479. "lsr r10, r10, #16\n\t"
  12480. "mul r6, r10, r6\n\t"
  12481. "lsr r10, r6, #16\n\t"
  12482. "lsl r6, r6, #16\n\t"
  12483. "adds lr, lr, r6\n\t"
  12484. "adc r4, r4, r10\n\t"
  12485. "lsl r6, r8, #16\n\t"
  12486. "lsl r10, r7, #16\n\t"
  12487. "lsr r6, r6, #16\n\t"
  12488. "lsr r10, r10, #16\n\t"
  12489. "mul r10, r6, r10\n\t"
  12490. "adds lr, lr, r10\n\t"
  12491. "adc r4, r4, #0\n\t"
  12492. "lsr r10, r7, #16\n\t"
  12493. "mul r6, r10, r6\n\t"
  12494. "lsr r10, r6, #16\n\t"
  12495. "lsl r6, r6, #16\n\t"
  12496. "adds lr, lr, r6\n\t"
  12497. "adc r4, r4, r10\n\t"
  12498. #else
  12499. "umull r6, r10, r8, r7\n\t"
  12500. "adds lr, lr, r6\n\t"
  12501. "adc r4, r10, #0\n\t"
  12502. #endif
  12503. "mov r12, lr\n\t"
  12504. "adds r12, r12, r5\n\t"
  12505. "adc r4, r4, #0\n\t"
  12506. /* a[i+2] += m[2] * mu */
  12507. "ldr r7, [%[m], #8]\n\t"
  12508. "ldr lr, [%[a], #8]\n\t"
  12509. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12510. "lsr r10, r7, #16\n\t"
  12511. "lsr r6, r8, #16\n\t"
  12512. "mul r5, r6, r10\n\t"
  12513. "lsl r10, r7, #16\n\t"
  12514. "lsr r10, r10, #16\n\t"
  12515. "mul r6, r10, r6\n\t"
  12516. "lsr r10, r6, #16\n\t"
  12517. "lsl r6, r6, #16\n\t"
  12518. "adds lr, lr, r6\n\t"
  12519. "adc r5, r5, r10\n\t"
  12520. "lsl r6, r8, #16\n\t"
  12521. "lsl r10, r7, #16\n\t"
  12522. "lsr r6, r6, #16\n\t"
  12523. "lsr r10, r10, #16\n\t"
  12524. "mul r10, r6, r10\n\t"
  12525. "adds lr, lr, r10\n\t"
  12526. "adc r5, r5, #0\n\t"
  12527. "lsr r10, r7, #16\n\t"
  12528. "mul r6, r10, r6\n\t"
  12529. "lsr r10, r6, #16\n\t"
  12530. "lsl r6, r6, #16\n\t"
  12531. "adds lr, lr, r6\n\t"
  12532. "adc r5, r5, r10\n\t"
  12533. #else
  12534. "umull r6, r10, r8, r7\n\t"
  12535. "adds lr, lr, r6\n\t"
  12536. "adc r5, r10, #0\n\t"
  12537. #endif
  12538. "adds lr, lr, r4\n\t"
  12539. "adc r5, r5, #0\n\t"
  12540. /* a[i+3] += m[3] * mu */
  12541. "ldr r7, [%[m], #12]\n\t"
  12542. "ldr r10, [%[a], #12]\n\t"
  12543. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12544. "lsr r11, r7, #16\n\t"
  12545. "lsr r6, r8, #16\n\t"
  12546. "mul r4, r6, r11\n\t"
  12547. "lsl r11, r7, #16\n\t"
  12548. "lsr r11, r11, #16\n\t"
  12549. "mul r6, r11, r6\n\t"
  12550. "lsr r11, r6, #16\n\t"
  12551. "lsl r6, r6, #16\n\t"
  12552. "adds r10, r10, r6\n\t"
  12553. "adc r4, r4, r11\n\t"
  12554. "lsl r6, r8, #16\n\t"
  12555. "lsl r11, r7, #16\n\t"
  12556. "lsr r6, r6, #16\n\t"
  12557. "lsr r11, r11, #16\n\t"
  12558. "mul r11, r6, r11\n\t"
  12559. "adds r10, r10, r11\n\t"
  12560. "adc r4, r4, #0\n\t"
  12561. "lsr r11, r7, #16\n\t"
  12562. "mul r6, r11, r6\n\t"
  12563. "lsr r11, r6, #16\n\t"
  12564. "lsl r6, r6, #16\n\t"
  12565. "adds r10, r10, r6\n\t"
  12566. "adc r4, r4, r11\n\t"
  12567. #else
  12568. "umull r6, r7, r8, r7\n\t"
  12569. "adds r10, r10, r6\n\t"
  12570. "adc r4, r7, #0\n\t"
  12571. #endif
  12572. "adds r10, r10, r5\n\t"
  12573. "str r10, [%[a], #12]\n\t"
  12574. "adc r4, r4, #0\n\t"
  12575. /* a[i+4] += m[4] * mu */
  12576. "ldr r7, [%[m], #16]\n\t"
  12577. "ldr r10, [%[a], #16]\n\t"
  12578. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12579. "lsr r11, r7, #16\n\t"
  12580. "lsr r6, r8, #16\n\t"
  12581. "mul r5, r6, r11\n\t"
  12582. "lsl r11, r7, #16\n\t"
  12583. "lsr r11, r11, #16\n\t"
  12584. "mul r6, r11, r6\n\t"
  12585. "lsr r11, r6, #16\n\t"
  12586. "lsl r6, r6, #16\n\t"
  12587. "adds r10, r10, r6\n\t"
  12588. "adc r5, r5, r11\n\t"
  12589. "lsl r6, r8, #16\n\t"
  12590. "lsl r11, r7, #16\n\t"
  12591. "lsr r6, r6, #16\n\t"
  12592. "lsr r11, r11, #16\n\t"
  12593. "mul r11, r6, r11\n\t"
  12594. "adds r10, r10, r11\n\t"
  12595. "adc r5, r5, #0\n\t"
  12596. "lsr r11, r7, #16\n\t"
  12597. "mul r6, r11, r6\n\t"
  12598. "lsr r11, r6, #16\n\t"
  12599. "lsl r6, r6, #16\n\t"
  12600. "adds r10, r10, r6\n\t"
  12601. "adc r5, r5, r11\n\t"
  12602. #else
  12603. "umull r6, r7, r8, r7\n\t"
  12604. "adds r10, r10, r6\n\t"
  12605. "adc r5, r7, #0\n\t"
  12606. #endif
  12607. "adds r10, r10, r4\n\t"
  12608. "str r10, [%[a], #16]\n\t"
  12609. "adc r5, r5, #0\n\t"
  12610. /* a[i+5] += m[5] * mu */
  12611. "ldr r7, [%[m], #20]\n\t"
  12612. "ldr r10, [%[a], #20]\n\t"
  12613. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12614. "lsr r11, r7, #16\n\t"
  12615. "lsr r6, r8, #16\n\t"
  12616. "mul r4, r6, r11\n\t"
  12617. "lsl r11, r7, #16\n\t"
  12618. "lsr r11, r11, #16\n\t"
  12619. "mul r6, r11, r6\n\t"
  12620. "lsr r11, r6, #16\n\t"
  12621. "lsl r6, r6, #16\n\t"
  12622. "adds r10, r10, r6\n\t"
  12623. "adc r4, r4, r11\n\t"
  12624. "lsl r6, r8, #16\n\t"
  12625. "lsl r11, r7, #16\n\t"
  12626. "lsr r6, r6, #16\n\t"
  12627. "lsr r11, r11, #16\n\t"
  12628. "mul r11, r6, r11\n\t"
  12629. "adds r10, r10, r11\n\t"
  12630. "adc r4, r4, #0\n\t"
  12631. "lsr r11, r7, #16\n\t"
  12632. "mul r6, r11, r6\n\t"
  12633. "lsr r11, r6, #16\n\t"
  12634. "lsl r6, r6, #16\n\t"
  12635. "adds r10, r10, r6\n\t"
  12636. "adc r4, r4, r11\n\t"
  12637. #else
  12638. "umull r6, r7, r8, r7\n\t"
  12639. "adds r10, r10, r6\n\t"
  12640. "adc r4, r7, #0\n\t"
  12641. #endif
  12642. "adds r10, r10, r5\n\t"
  12643. "str r10, [%[a], #20]\n\t"
  12644. "adc r4, r4, #0\n\t"
  12645. /* a[i+6] += m[6] * mu */
  12646. "ldr r7, [%[m], #24]\n\t"
  12647. "ldr r10, [%[a], #24]\n\t"
  12648. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12649. "lsr r11, r7, #16\n\t"
  12650. "lsr r6, r8, #16\n\t"
  12651. "mul r5, r6, r11\n\t"
  12652. "lsl r11, r7, #16\n\t"
  12653. "lsr r11, r11, #16\n\t"
  12654. "mul r6, r11, r6\n\t"
  12655. "lsr r11, r6, #16\n\t"
  12656. "lsl r6, r6, #16\n\t"
  12657. "adds r10, r10, r6\n\t"
  12658. "adc r5, r5, r11\n\t"
  12659. "lsl r6, r8, #16\n\t"
  12660. "lsl r11, r7, #16\n\t"
  12661. "lsr r6, r6, #16\n\t"
  12662. "lsr r11, r11, #16\n\t"
  12663. "mul r11, r6, r11\n\t"
  12664. "adds r10, r10, r11\n\t"
  12665. "adc r5, r5, #0\n\t"
  12666. "lsr r11, r7, #16\n\t"
  12667. "mul r6, r11, r6\n\t"
  12668. "lsr r11, r6, #16\n\t"
  12669. "lsl r6, r6, #16\n\t"
  12670. "adds r10, r10, r6\n\t"
  12671. "adc r5, r5, r11\n\t"
  12672. #else
  12673. "umull r6, r7, r8, r7\n\t"
  12674. "adds r10, r10, r6\n\t"
  12675. "adc r5, r7, #0\n\t"
  12676. #endif
  12677. "adds r10, r10, r4\n\t"
  12678. "str r10, [%[a], #24]\n\t"
  12679. "adc r5, r5, #0\n\t"
  12680. /* a[i+7] += m[7] * mu */
  12681. "ldr r7, [%[m], #28]\n\t"
  12682. "ldr r10, [%[a], #28]\n\t"
  12683. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12684. "lsr r11, r7, #16\n\t"
  12685. "lsr r6, r8, #16\n\t"
  12686. "mul r4, r6, r11\n\t"
  12687. "lsl r11, r7, #16\n\t"
  12688. "lsr r11, r11, #16\n\t"
  12689. "mul r6, r11, r6\n\t"
  12690. "lsr r11, r6, #16\n\t"
  12691. "lsl r6, r6, #16\n\t"
  12692. "adds r10, r10, r6\n\t"
  12693. "adc r4, r4, r11\n\t"
  12694. "lsl r6, r8, #16\n\t"
  12695. "lsl r11, r7, #16\n\t"
  12696. "lsr r6, r6, #16\n\t"
  12697. "lsr r11, r11, #16\n\t"
  12698. "mul r11, r6, r11\n\t"
  12699. "adds r10, r10, r11\n\t"
  12700. "adc r4, r4, #0\n\t"
  12701. "lsr r11, r7, #16\n\t"
  12702. "mul r6, r11, r6\n\t"
  12703. "lsr r11, r6, #16\n\t"
  12704. "lsl r6, r6, #16\n\t"
  12705. "adds r10, r10, r6\n\t"
  12706. "adc r4, r4, r11\n\t"
  12707. #else
  12708. "umull r6, r7, r8, r7\n\t"
  12709. "adds r10, r10, r6\n\t"
  12710. "adc r4, r7, #0\n\t"
  12711. #endif
  12712. "adds r10, r10, r5\n\t"
  12713. "str r10, [%[a], #28]\n\t"
  12714. "adc r4, r4, #0\n\t"
  12715. /* a[i+8] += m[8] * mu */
  12716. "ldr r7, [%[m], #32]\n\t"
  12717. "ldr r10, [%[a], #32]\n\t"
  12718. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12719. "lsr r11, r7, #16\n\t"
  12720. "lsr r6, r8, #16\n\t"
  12721. "mul r5, r6, r11\n\t"
  12722. "lsl r11, r7, #16\n\t"
  12723. "lsr r11, r11, #16\n\t"
  12724. "mul r6, r11, r6\n\t"
  12725. "lsr r11, r6, #16\n\t"
  12726. "lsl r6, r6, #16\n\t"
  12727. "adds r10, r10, r6\n\t"
  12728. "adc r5, r5, r11\n\t"
  12729. "lsl r6, r8, #16\n\t"
  12730. "lsl r11, r7, #16\n\t"
  12731. "lsr r6, r6, #16\n\t"
  12732. "lsr r11, r11, #16\n\t"
  12733. "mul r11, r6, r11\n\t"
  12734. "adds r10, r10, r11\n\t"
  12735. "adc r5, r5, #0\n\t"
  12736. "lsr r11, r7, #16\n\t"
  12737. "mul r6, r11, r6\n\t"
  12738. "lsr r11, r6, #16\n\t"
  12739. "lsl r6, r6, #16\n\t"
  12740. "adds r10, r10, r6\n\t"
  12741. "adc r5, r5, r11\n\t"
  12742. #else
  12743. "umull r6, r7, r8, r7\n\t"
  12744. "adds r10, r10, r6\n\t"
  12745. "adc r5, r7, #0\n\t"
  12746. #endif
  12747. "adds r10, r10, r4\n\t"
  12748. "str r10, [%[a], #32]\n\t"
  12749. "adc r5, r5, #0\n\t"
  12750. /* a[i+9] += m[9] * mu */
  12751. "ldr r7, [%[m], #36]\n\t"
  12752. "ldr r10, [%[a], #36]\n\t"
  12753. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12754. "lsr r11, r7, #16\n\t"
  12755. "lsr r6, r8, #16\n\t"
  12756. "mul r4, r6, r11\n\t"
  12757. "lsl r11, r7, #16\n\t"
  12758. "lsr r11, r11, #16\n\t"
  12759. "mul r6, r11, r6\n\t"
  12760. "lsr r11, r6, #16\n\t"
  12761. "lsl r6, r6, #16\n\t"
  12762. "adds r10, r10, r6\n\t"
  12763. "adc r4, r4, r11\n\t"
  12764. "lsl r6, r8, #16\n\t"
  12765. "lsl r11, r7, #16\n\t"
  12766. "lsr r6, r6, #16\n\t"
  12767. "lsr r11, r11, #16\n\t"
  12768. "mul r11, r6, r11\n\t"
  12769. "adds r10, r10, r11\n\t"
  12770. "adc r4, r4, #0\n\t"
  12771. "lsr r11, r7, #16\n\t"
  12772. "mul r6, r11, r6\n\t"
  12773. "lsr r11, r6, #16\n\t"
  12774. "lsl r6, r6, #16\n\t"
  12775. "adds r10, r10, r6\n\t"
  12776. "adc r4, r4, r11\n\t"
  12777. #else
  12778. "umull r6, r7, r8, r7\n\t"
  12779. "adds r10, r10, r6\n\t"
  12780. "adc r4, r7, #0\n\t"
  12781. #endif
  12782. "adds r10, r10, r5\n\t"
  12783. "str r10, [%[a], #36]\n\t"
  12784. "adc r4, r4, #0\n\t"
  12785. /* a[i+10] += m[10] * mu */
  12786. "ldr r7, [%[m], #40]\n\t"
  12787. "ldr r10, [%[a], #40]\n\t"
  12788. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12789. "lsr r11, r7, #16\n\t"
  12790. "lsr r6, r8, #16\n\t"
  12791. "mul r5, r6, r11\n\t"
  12792. "lsl r11, r7, #16\n\t"
  12793. "lsr r11, r11, #16\n\t"
  12794. "mul r6, r11, r6\n\t"
  12795. "lsr r11, r6, #16\n\t"
  12796. "lsl r6, r6, #16\n\t"
  12797. "adds r10, r10, r6\n\t"
  12798. "adc r5, r5, r11\n\t"
  12799. "lsl r6, r8, #16\n\t"
  12800. "lsl r11, r7, #16\n\t"
  12801. "lsr r6, r6, #16\n\t"
  12802. "lsr r11, r11, #16\n\t"
  12803. "mul r11, r6, r11\n\t"
  12804. "adds r10, r10, r11\n\t"
  12805. "adc r5, r5, #0\n\t"
  12806. "lsr r11, r7, #16\n\t"
  12807. "mul r6, r11, r6\n\t"
  12808. "lsr r11, r6, #16\n\t"
  12809. "lsl r6, r6, #16\n\t"
  12810. "adds r10, r10, r6\n\t"
  12811. "adc r5, r5, r11\n\t"
  12812. #else
  12813. "umull r6, r7, r8, r7\n\t"
  12814. "adds r10, r10, r6\n\t"
  12815. "adc r5, r7, #0\n\t"
  12816. #endif
  12817. "adds r10, r10, r4\n\t"
  12818. "str r10, [%[a], #40]\n\t"
  12819. "adc r5, r5, #0\n\t"
  12820. /* a[i+11] += m[11] * mu */
  12821. "ldr r7, [%[m], #44]\n\t"
  12822. "ldr r10, [%[a], #44]\n\t"
  12823. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12824. "lsr r11, r7, #16\n\t"
  12825. "lsr r6, r8, #16\n\t"
  12826. "mul r4, r6, r11\n\t"
  12827. "lsl r11, r7, #16\n\t"
  12828. "lsr r11, r11, #16\n\t"
  12829. "mul r6, r11, r6\n\t"
  12830. "lsr r11, r6, #16\n\t"
  12831. "lsl r6, r6, #16\n\t"
  12832. "adds r10, r10, r6\n\t"
  12833. "adc r4, r4, r11\n\t"
  12834. "lsl r6, r8, #16\n\t"
  12835. "lsl r11, r7, #16\n\t"
  12836. "lsr r6, r6, #16\n\t"
  12837. "lsr r11, r11, #16\n\t"
  12838. "mul r11, r6, r11\n\t"
  12839. "adds r10, r10, r11\n\t"
  12840. "adc r4, r4, #0\n\t"
  12841. "lsr r11, r7, #16\n\t"
  12842. "mul r6, r11, r6\n\t"
  12843. "lsr r11, r6, #16\n\t"
  12844. "lsl r6, r6, #16\n\t"
  12845. "adds r10, r10, r6\n\t"
  12846. "adc r4, r4, r11\n\t"
  12847. #else
  12848. "umull r6, r7, r8, r7\n\t"
  12849. "adds r10, r10, r6\n\t"
  12850. "adc r4, r7, #0\n\t"
  12851. #endif
  12852. "adds r10, r10, r5\n\t"
  12853. "str r10, [%[a], #44]\n\t"
  12854. "adc r4, r4, #0\n\t"
  12855. /* a[i+12] += m[12] * mu */
  12856. "ldr r7, [%[m], #48]\n\t"
  12857. "ldr r10, [%[a], #48]\n\t"
  12858. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12859. "lsr r11, r7, #16\n\t"
  12860. "lsr r6, r8, #16\n\t"
  12861. "mul r5, r6, r11\n\t"
  12862. "lsl r11, r7, #16\n\t"
  12863. "lsr r11, r11, #16\n\t"
  12864. "mul r6, r11, r6\n\t"
  12865. "lsr r11, r6, #16\n\t"
  12866. "lsl r6, r6, #16\n\t"
  12867. "adds r10, r10, r6\n\t"
  12868. "adc r5, r5, r11\n\t"
  12869. "lsl r6, r8, #16\n\t"
  12870. "lsl r11, r7, #16\n\t"
  12871. "lsr r6, r6, #16\n\t"
  12872. "lsr r11, r11, #16\n\t"
  12873. "mul r11, r6, r11\n\t"
  12874. "adds r10, r10, r11\n\t"
  12875. "adc r5, r5, #0\n\t"
  12876. "lsr r11, r7, #16\n\t"
  12877. "mul r6, r11, r6\n\t"
  12878. "lsr r11, r6, #16\n\t"
  12879. "lsl r6, r6, #16\n\t"
  12880. "adds r10, r10, r6\n\t"
  12881. "adc r5, r5, r11\n\t"
  12882. #else
  12883. "umull r6, r7, r8, r7\n\t"
  12884. "adds r10, r10, r6\n\t"
  12885. "adc r5, r7, #0\n\t"
  12886. #endif
  12887. "adds r10, r10, r4\n\t"
  12888. "str r10, [%[a], #48]\n\t"
  12889. "adc r5, r5, #0\n\t"
  12890. /* a[i+13] += m[13] * mu */
  12891. "ldr r7, [%[m], #52]\n\t"
  12892. "ldr r10, [%[a], #52]\n\t"
  12893. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12894. "lsr r11, r7, #16\n\t"
  12895. "lsr r6, r8, #16\n\t"
  12896. "mul r4, r6, r11\n\t"
  12897. "lsl r11, r7, #16\n\t"
  12898. "lsr r11, r11, #16\n\t"
  12899. "mul r6, r11, r6\n\t"
  12900. "lsr r11, r6, #16\n\t"
  12901. "lsl r6, r6, #16\n\t"
  12902. "adds r10, r10, r6\n\t"
  12903. "adc r4, r4, r11\n\t"
  12904. "lsl r6, r8, #16\n\t"
  12905. "lsl r11, r7, #16\n\t"
  12906. "lsr r6, r6, #16\n\t"
  12907. "lsr r11, r11, #16\n\t"
  12908. "mul r11, r6, r11\n\t"
  12909. "adds r10, r10, r11\n\t"
  12910. "adc r4, r4, #0\n\t"
  12911. "lsr r11, r7, #16\n\t"
  12912. "mul r6, r11, r6\n\t"
  12913. "lsr r11, r6, #16\n\t"
  12914. "lsl r6, r6, #16\n\t"
  12915. "adds r10, r10, r6\n\t"
  12916. "adc r4, r4, r11\n\t"
  12917. #else
  12918. "umull r6, r7, r8, r7\n\t"
  12919. "adds r10, r10, r6\n\t"
  12920. "adc r4, r7, #0\n\t"
  12921. #endif
  12922. "adds r10, r10, r5\n\t"
  12923. "str r10, [%[a], #52]\n\t"
  12924. "adc r4, r4, #0\n\t"
  12925. /* a[i+14] += m[14] * mu */
  12926. "ldr r7, [%[m], #56]\n\t"
  12927. "ldr r10, [%[a], #56]\n\t"
  12928. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12929. "lsr r11, r7, #16\n\t"
  12930. "lsr r6, r8, #16\n\t"
  12931. "mul r5, r6, r11\n\t"
  12932. "lsl r11, r7, #16\n\t"
  12933. "lsr r11, r11, #16\n\t"
  12934. "mul r6, r11, r6\n\t"
  12935. "lsr r11, r6, #16\n\t"
  12936. "lsl r6, r6, #16\n\t"
  12937. "adds r10, r10, r6\n\t"
  12938. "adc r5, r5, r11\n\t"
  12939. "lsl r6, r8, #16\n\t"
  12940. "lsl r11, r7, #16\n\t"
  12941. "lsr r6, r6, #16\n\t"
  12942. "lsr r11, r11, #16\n\t"
  12943. "mul r11, r6, r11\n\t"
  12944. "adds r10, r10, r11\n\t"
  12945. "adc r5, r5, #0\n\t"
  12946. "lsr r11, r7, #16\n\t"
  12947. "mul r6, r11, r6\n\t"
  12948. "lsr r11, r6, #16\n\t"
  12949. "lsl r6, r6, #16\n\t"
  12950. "adds r10, r10, r6\n\t"
  12951. "adc r5, r5, r11\n\t"
  12952. #else
  12953. "umull r6, r7, r8, r7\n\t"
  12954. "adds r10, r10, r6\n\t"
  12955. "adc r5, r7, #0\n\t"
  12956. #endif
  12957. "adds r10, r10, r4\n\t"
  12958. "str r10, [%[a], #56]\n\t"
  12959. "adc r5, r5, #0\n\t"
  12960. /* a[i+15] += m[15] * mu */
  12961. "ldr r7, [%[m], #60]\n\t"
  12962. "ldr r10, [%[a], #60]\n\t"
  12963. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12964. "lsr r11, r7, #16\n\t"
  12965. "lsr r6, r8, #16\n\t"
  12966. "mul r4, r6, r11\n\t"
  12967. "lsl r11, r7, #16\n\t"
  12968. "lsr r11, r11, #16\n\t"
  12969. "mul r6, r11, r6\n\t"
  12970. "lsr r11, r6, #16\n\t"
  12971. "lsl r6, r6, #16\n\t"
  12972. "adds r10, r10, r6\n\t"
  12973. "adc r4, r4, r11\n\t"
  12974. "lsl r6, r8, #16\n\t"
  12975. "lsl r11, r7, #16\n\t"
  12976. "lsr r6, r6, #16\n\t"
  12977. "lsr r11, r11, #16\n\t"
  12978. "mul r11, r6, r11\n\t"
  12979. "adds r10, r10, r11\n\t"
  12980. "adc r4, r4, #0\n\t"
  12981. "lsr r11, r7, #16\n\t"
  12982. "mul r6, r11, r6\n\t"
  12983. "lsr r11, r6, #16\n\t"
  12984. "lsl r6, r6, #16\n\t"
  12985. "adds r10, r10, r6\n\t"
  12986. "adc r4, r4, r11\n\t"
  12987. #else
  12988. "umull r6, r7, r8, r7\n\t"
  12989. "adds r10, r10, r6\n\t"
  12990. "adc r4, r7, #0\n\t"
  12991. #endif
  12992. "adds r10, r10, r5\n\t"
  12993. "str r10, [%[a], #60]\n\t"
  12994. "adc r4, r4, #0\n\t"
  12995. /* a[i+16] += m[16] * mu */
  12996. "ldr r7, [%[m], #64]\n\t"
  12997. "ldr r10, [%[a], #64]\n\t"
  12998. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  12999. "lsr r11, r7, #16\n\t"
  13000. "lsr r6, r8, #16\n\t"
  13001. "mul r5, r6, r11\n\t"
  13002. "lsl r11, r7, #16\n\t"
  13003. "lsr r11, r11, #16\n\t"
  13004. "mul r6, r11, r6\n\t"
  13005. "lsr r11, r6, #16\n\t"
  13006. "lsl r6, r6, #16\n\t"
  13007. "adds r10, r10, r6\n\t"
  13008. "adc r5, r5, r11\n\t"
  13009. "lsl r6, r8, #16\n\t"
  13010. "lsl r11, r7, #16\n\t"
  13011. "lsr r6, r6, #16\n\t"
  13012. "lsr r11, r11, #16\n\t"
  13013. "mul r11, r6, r11\n\t"
  13014. "adds r10, r10, r11\n\t"
  13015. "adc r5, r5, #0\n\t"
  13016. "lsr r11, r7, #16\n\t"
  13017. "mul r6, r11, r6\n\t"
  13018. "lsr r11, r6, #16\n\t"
  13019. "lsl r6, r6, #16\n\t"
  13020. "adds r10, r10, r6\n\t"
  13021. "adc r5, r5, r11\n\t"
  13022. #else
  13023. "umull r6, r7, r8, r7\n\t"
  13024. "adds r10, r10, r6\n\t"
  13025. "adc r5, r7, #0\n\t"
  13026. #endif
  13027. "adds r10, r10, r4\n\t"
  13028. "str r10, [%[a], #64]\n\t"
  13029. "adc r5, r5, #0\n\t"
  13030. /* a[i+17] += m[17] * mu */
  13031. "ldr r7, [%[m], #68]\n\t"
  13032. "ldr r10, [%[a], #68]\n\t"
  13033. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13034. "lsr r11, r7, #16\n\t"
  13035. "lsr r6, r8, #16\n\t"
  13036. "mul r4, r6, r11\n\t"
  13037. "lsl r11, r7, #16\n\t"
  13038. "lsr r11, r11, #16\n\t"
  13039. "mul r6, r11, r6\n\t"
  13040. "lsr r11, r6, #16\n\t"
  13041. "lsl r6, r6, #16\n\t"
  13042. "adds r10, r10, r6\n\t"
  13043. "adc r4, r4, r11\n\t"
  13044. "lsl r6, r8, #16\n\t"
  13045. "lsl r11, r7, #16\n\t"
  13046. "lsr r6, r6, #16\n\t"
  13047. "lsr r11, r11, #16\n\t"
  13048. "mul r11, r6, r11\n\t"
  13049. "adds r10, r10, r11\n\t"
  13050. "adc r4, r4, #0\n\t"
  13051. "lsr r11, r7, #16\n\t"
  13052. "mul r6, r11, r6\n\t"
  13053. "lsr r11, r6, #16\n\t"
  13054. "lsl r6, r6, #16\n\t"
  13055. "adds r10, r10, r6\n\t"
  13056. "adc r4, r4, r11\n\t"
  13057. #else
  13058. "umull r6, r7, r8, r7\n\t"
  13059. "adds r10, r10, r6\n\t"
  13060. "adc r4, r7, #0\n\t"
  13061. #endif
  13062. "adds r10, r10, r5\n\t"
  13063. "str r10, [%[a], #68]\n\t"
  13064. "adc r4, r4, #0\n\t"
  13065. /* a[i+18] += m[18] * mu */
  13066. "ldr r7, [%[m], #72]\n\t"
  13067. "ldr r10, [%[a], #72]\n\t"
  13068. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13069. "lsr r11, r7, #16\n\t"
  13070. "lsr r6, r8, #16\n\t"
  13071. "mul r5, r6, r11\n\t"
  13072. "lsl r11, r7, #16\n\t"
  13073. "lsr r11, r11, #16\n\t"
  13074. "mul r6, r11, r6\n\t"
  13075. "lsr r11, r6, #16\n\t"
  13076. "lsl r6, r6, #16\n\t"
  13077. "adds r10, r10, r6\n\t"
  13078. "adc r5, r5, r11\n\t"
  13079. "lsl r6, r8, #16\n\t"
  13080. "lsl r11, r7, #16\n\t"
  13081. "lsr r6, r6, #16\n\t"
  13082. "lsr r11, r11, #16\n\t"
  13083. "mul r11, r6, r11\n\t"
  13084. "adds r10, r10, r11\n\t"
  13085. "adc r5, r5, #0\n\t"
  13086. "lsr r11, r7, #16\n\t"
  13087. "mul r6, r11, r6\n\t"
  13088. "lsr r11, r6, #16\n\t"
  13089. "lsl r6, r6, #16\n\t"
  13090. "adds r10, r10, r6\n\t"
  13091. "adc r5, r5, r11\n\t"
  13092. #else
  13093. "umull r6, r7, r8, r7\n\t"
  13094. "adds r10, r10, r6\n\t"
  13095. "adc r5, r7, #0\n\t"
  13096. #endif
  13097. "adds r10, r10, r4\n\t"
  13098. "str r10, [%[a], #72]\n\t"
  13099. "adc r5, r5, #0\n\t"
  13100. /* a[i+19] += m[19] * mu */
  13101. "ldr r7, [%[m], #76]\n\t"
  13102. "ldr r10, [%[a], #76]\n\t"
  13103. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13104. "lsr r11, r7, #16\n\t"
  13105. "lsr r6, r8, #16\n\t"
  13106. "mul r4, r6, r11\n\t"
  13107. "lsl r11, r7, #16\n\t"
  13108. "lsr r11, r11, #16\n\t"
  13109. "mul r6, r11, r6\n\t"
  13110. "lsr r11, r6, #16\n\t"
  13111. "lsl r6, r6, #16\n\t"
  13112. "adds r10, r10, r6\n\t"
  13113. "adc r4, r4, r11\n\t"
  13114. "lsl r6, r8, #16\n\t"
  13115. "lsl r11, r7, #16\n\t"
  13116. "lsr r6, r6, #16\n\t"
  13117. "lsr r11, r11, #16\n\t"
  13118. "mul r11, r6, r11\n\t"
  13119. "adds r10, r10, r11\n\t"
  13120. "adc r4, r4, #0\n\t"
  13121. "lsr r11, r7, #16\n\t"
  13122. "mul r6, r11, r6\n\t"
  13123. "lsr r11, r6, #16\n\t"
  13124. "lsl r6, r6, #16\n\t"
  13125. "adds r10, r10, r6\n\t"
  13126. "adc r4, r4, r11\n\t"
  13127. #else
  13128. "umull r6, r7, r8, r7\n\t"
  13129. "adds r10, r10, r6\n\t"
  13130. "adc r4, r7, #0\n\t"
  13131. #endif
  13132. "adds r10, r10, r5\n\t"
  13133. "str r10, [%[a], #76]\n\t"
  13134. "adc r4, r4, #0\n\t"
  13135. /* a[i+20] += m[20] * mu */
  13136. "ldr r7, [%[m], #80]\n\t"
  13137. "ldr r10, [%[a], #80]\n\t"
  13138. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13139. "lsr r11, r7, #16\n\t"
  13140. "lsr r6, r8, #16\n\t"
  13141. "mul r5, r6, r11\n\t"
  13142. "lsl r11, r7, #16\n\t"
  13143. "lsr r11, r11, #16\n\t"
  13144. "mul r6, r11, r6\n\t"
  13145. "lsr r11, r6, #16\n\t"
  13146. "lsl r6, r6, #16\n\t"
  13147. "adds r10, r10, r6\n\t"
  13148. "adc r5, r5, r11\n\t"
  13149. "lsl r6, r8, #16\n\t"
  13150. "lsl r11, r7, #16\n\t"
  13151. "lsr r6, r6, #16\n\t"
  13152. "lsr r11, r11, #16\n\t"
  13153. "mul r11, r6, r11\n\t"
  13154. "adds r10, r10, r11\n\t"
  13155. "adc r5, r5, #0\n\t"
  13156. "lsr r11, r7, #16\n\t"
  13157. "mul r6, r11, r6\n\t"
  13158. "lsr r11, r6, #16\n\t"
  13159. "lsl r6, r6, #16\n\t"
  13160. "adds r10, r10, r6\n\t"
  13161. "adc r5, r5, r11\n\t"
  13162. #else
  13163. "umull r6, r7, r8, r7\n\t"
  13164. "adds r10, r10, r6\n\t"
  13165. "adc r5, r7, #0\n\t"
  13166. #endif
  13167. "adds r10, r10, r4\n\t"
  13168. "str r10, [%[a], #80]\n\t"
  13169. "adc r5, r5, #0\n\t"
  13170. /* a[i+21] += m[21] * mu */
  13171. "ldr r7, [%[m], #84]\n\t"
  13172. "ldr r10, [%[a], #84]\n\t"
  13173. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13174. "lsr r11, r7, #16\n\t"
  13175. "lsr r6, r8, #16\n\t"
  13176. "mul r4, r6, r11\n\t"
  13177. "lsl r11, r7, #16\n\t"
  13178. "lsr r11, r11, #16\n\t"
  13179. "mul r6, r11, r6\n\t"
  13180. "lsr r11, r6, #16\n\t"
  13181. "lsl r6, r6, #16\n\t"
  13182. "adds r10, r10, r6\n\t"
  13183. "adc r4, r4, r11\n\t"
  13184. "lsl r6, r8, #16\n\t"
  13185. "lsl r11, r7, #16\n\t"
  13186. "lsr r6, r6, #16\n\t"
  13187. "lsr r11, r11, #16\n\t"
  13188. "mul r11, r6, r11\n\t"
  13189. "adds r10, r10, r11\n\t"
  13190. "adc r4, r4, #0\n\t"
  13191. "lsr r11, r7, #16\n\t"
  13192. "mul r6, r11, r6\n\t"
  13193. "lsr r11, r6, #16\n\t"
  13194. "lsl r6, r6, #16\n\t"
  13195. "adds r10, r10, r6\n\t"
  13196. "adc r4, r4, r11\n\t"
  13197. #else
  13198. "umull r6, r7, r8, r7\n\t"
  13199. "adds r10, r10, r6\n\t"
  13200. "adc r4, r7, #0\n\t"
  13201. #endif
  13202. "adds r10, r10, r5\n\t"
  13203. "str r10, [%[a], #84]\n\t"
  13204. "adc r4, r4, #0\n\t"
  13205. /* a[i+22] += m[22] * mu */
  13206. "ldr r7, [%[m], #88]\n\t"
  13207. "ldr r10, [%[a], #88]\n\t"
  13208. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13209. "lsr r11, r7, #16\n\t"
  13210. "lsr r6, r8, #16\n\t"
  13211. "mul r5, r6, r11\n\t"
  13212. "lsl r11, r7, #16\n\t"
  13213. "lsr r11, r11, #16\n\t"
  13214. "mul r6, r11, r6\n\t"
  13215. "lsr r11, r6, #16\n\t"
  13216. "lsl r6, r6, #16\n\t"
  13217. "adds r10, r10, r6\n\t"
  13218. "adc r5, r5, r11\n\t"
  13219. "lsl r6, r8, #16\n\t"
  13220. "lsl r11, r7, #16\n\t"
  13221. "lsr r6, r6, #16\n\t"
  13222. "lsr r11, r11, #16\n\t"
  13223. "mul r11, r6, r11\n\t"
  13224. "adds r10, r10, r11\n\t"
  13225. "adc r5, r5, #0\n\t"
  13226. "lsr r11, r7, #16\n\t"
  13227. "mul r6, r11, r6\n\t"
  13228. "lsr r11, r6, #16\n\t"
  13229. "lsl r6, r6, #16\n\t"
  13230. "adds r10, r10, r6\n\t"
  13231. "adc r5, r5, r11\n\t"
  13232. #else
  13233. "umull r6, r7, r8, r7\n\t"
  13234. "adds r10, r10, r6\n\t"
  13235. "adc r5, r7, #0\n\t"
  13236. #endif
  13237. "adds r10, r10, r4\n\t"
  13238. "str r10, [%[a], #88]\n\t"
  13239. "adc r5, r5, #0\n\t"
  13240. /* a[i+23] += m[23] * mu */
  13241. "ldr r7, [%[m], #92]\n\t"
  13242. "ldr r10, [%[a], #92]\n\t"
  13243. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13244. "lsr r11, r7, #16\n\t"
  13245. "lsr r6, r8, #16\n\t"
  13246. "mul r4, r6, r11\n\t"
  13247. "lsl r11, r7, #16\n\t"
  13248. "lsr r11, r11, #16\n\t"
  13249. "mul r6, r11, r6\n\t"
  13250. "lsr r11, r6, #16\n\t"
  13251. "lsl r6, r6, #16\n\t"
  13252. "adds r10, r10, r6\n\t"
  13253. "adc r4, r4, r11\n\t"
  13254. "lsl r6, r8, #16\n\t"
  13255. "lsl r11, r7, #16\n\t"
  13256. "lsr r6, r6, #16\n\t"
  13257. "lsr r11, r11, #16\n\t"
  13258. "mul r11, r6, r11\n\t"
  13259. "adds r10, r10, r11\n\t"
  13260. "adc r4, r4, #0\n\t"
  13261. "lsr r11, r7, #16\n\t"
  13262. "mul r6, r11, r6\n\t"
  13263. "lsr r11, r6, #16\n\t"
  13264. "lsl r6, r6, #16\n\t"
  13265. "adds r10, r10, r6\n\t"
  13266. "adc r4, r4, r11\n\t"
  13267. #else
  13268. "umull r6, r7, r8, r7\n\t"
  13269. "adds r10, r10, r6\n\t"
  13270. "adc r4, r7, #0\n\t"
  13271. #endif
  13272. "adds r10, r10, r5\n\t"
  13273. "str r10, [%[a], #92]\n\t"
  13274. "adc r4, r4, #0\n\t"
  13275. /* a[i+24] += m[24] * mu */
  13276. "ldr r7, [%[m], #96]\n\t"
  13277. "ldr r10, [%[a], #96]\n\t"
  13278. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13279. "lsr r11, r7, #16\n\t"
  13280. "lsr r6, r8, #16\n\t"
  13281. "mul r5, r6, r11\n\t"
  13282. "lsl r11, r7, #16\n\t"
  13283. "lsr r11, r11, #16\n\t"
  13284. "mul r6, r11, r6\n\t"
  13285. "lsr r11, r6, #16\n\t"
  13286. "lsl r6, r6, #16\n\t"
  13287. "adds r10, r10, r6\n\t"
  13288. "adc r5, r5, r11\n\t"
  13289. "lsl r6, r8, #16\n\t"
  13290. "lsl r11, r7, #16\n\t"
  13291. "lsr r6, r6, #16\n\t"
  13292. "lsr r11, r11, #16\n\t"
  13293. "mul r11, r6, r11\n\t"
  13294. "adds r10, r10, r11\n\t"
  13295. "adc r5, r5, #0\n\t"
  13296. "lsr r11, r7, #16\n\t"
  13297. "mul r6, r11, r6\n\t"
  13298. "lsr r11, r6, #16\n\t"
  13299. "lsl r6, r6, #16\n\t"
  13300. "adds r10, r10, r6\n\t"
  13301. "adc r5, r5, r11\n\t"
  13302. #else
  13303. "umull r6, r7, r8, r7\n\t"
  13304. "adds r10, r10, r6\n\t"
  13305. "adc r5, r7, #0\n\t"
  13306. #endif
  13307. "adds r10, r10, r4\n\t"
  13308. "str r10, [%[a], #96]\n\t"
  13309. "adc r5, r5, #0\n\t"
  13310. /* a[i+25] += m[25] * mu */
  13311. "ldr r7, [%[m], #100]\n\t"
  13312. "ldr r10, [%[a], #100]\n\t"
  13313. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13314. "lsr r11, r7, #16\n\t"
  13315. "lsr r6, r8, #16\n\t"
  13316. "mul r4, r6, r11\n\t"
  13317. "lsl r11, r7, #16\n\t"
  13318. "lsr r11, r11, #16\n\t"
  13319. "mul r6, r11, r6\n\t"
  13320. "lsr r11, r6, #16\n\t"
  13321. "lsl r6, r6, #16\n\t"
  13322. "adds r10, r10, r6\n\t"
  13323. "adc r4, r4, r11\n\t"
  13324. "lsl r6, r8, #16\n\t"
  13325. "lsl r11, r7, #16\n\t"
  13326. "lsr r6, r6, #16\n\t"
  13327. "lsr r11, r11, #16\n\t"
  13328. "mul r11, r6, r11\n\t"
  13329. "adds r10, r10, r11\n\t"
  13330. "adc r4, r4, #0\n\t"
  13331. "lsr r11, r7, #16\n\t"
  13332. "mul r6, r11, r6\n\t"
  13333. "lsr r11, r6, #16\n\t"
  13334. "lsl r6, r6, #16\n\t"
  13335. "adds r10, r10, r6\n\t"
  13336. "adc r4, r4, r11\n\t"
  13337. #else
  13338. "umull r6, r7, r8, r7\n\t"
  13339. "adds r10, r10, r6\n\t"
  13340. "adc r4, r7, #0\n\t"
  13341. #endif
  13342. "adds r10, r10, r5\n\t"
  13343. "str r10, [%[a], #100]\n\t"
  13344. "adc r4, r4, #0\n\t"
  13345. /* a[i+26] += m[26] * mu */
  13346. "ldr r7, [%[m], #104]\n\t"
  13347. "ldr r10, [%[a], #104]\n\t"
  13348. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13349. "lsr r11, r7, #16\n\t"
  13350. "lsr r6, r8, #16\n\t"
  13351. "mul r5, r6, r11\n\t"
  13352. "lsl r11, r7, #16\n\t"
  13353. "lsr r11, r11, #16\n\t"
  13354. "mul r6, r11, r6\n\t"
  13355. "lsr r11, r6, #16\n\t"
  13356. "lsl r6, r6, #16\n\t"
  13357. "adds r10, r10, r6\n\t"
  13358. "adc r5, r5, r11\n\t"
  13359. "lsl r6, r8, #16\n\t"
  13360. "lsl r11, r7, #16\n\t"
  13361. "lsr r6, r6, #16\n\t"
  13362. "lsr r11, r11, #16\n\t"
  13363. "mul r11, r6, r11\n\t"
  13364. "adds r10, r10, r11\n\t"
  13365. "adc r5, r5, #0\n\t"
  13366. "lsr r11, r7, #16\n\t"
  13367. "mul r6, r11, r6\n\t"
  13368. "lsr r11, r6, #16\n\t"
  13369. "lsl r6, r6, #16\n\t"
  13370. "adds r10, r10, r6\n\t"
  13371. "adc r5, r5, r11\n\t"
  13372. #else
  13373. "umull r6, r7, r8, r7\n\t"
  13374. "adds r10, r10, r6\n\t"
  13375. "adc r5, r7, #0\n\t"
  13376. #endif
  13377. "adds r10, r10, r4\n\t"
  13378. "str r10, [%[a], #104]\n\t"
  13379. "adc r5, r5, #0\n\t"
  13380. /* a[i+27] += m[27] * mu */
  13381. "ldr r7, [%[m], #108]\n\t"
  13382. "ldr r10, [%[a], #108]\n\t"
  13383. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13384. "lsr r11, r7, #16\n\t"
  13385. "lsr r6, r8, #16\n\t"
  13386. "mul r4, r6, r11\n\t"
  13387. "lsl r11, r7, #16\n\t"
  13388. "lsr r11, r11, #16\n\t"
  13389. "mul r6, r11, r6\n\t"
  13390. "lsr r11, r6, #16\n\t"
  13391. "lsl r6, r6, #16\n\t"
  13392. "adds r10, r10, r6\n\t"
  13393. "adc r4, r4, r11\n\t"
  13394. "lsl r6, r8, #16\n\t"
  13395. "lsl r11, r7, #16\n\t"
  13396. "lsr r6, r6, #16\n\t"
  13397. "lsr r11, r11, #16\n\t"
  13398. "mul r11, r6, r11\n\t"
  13399. "adds r10, r10, r11\n\t"
  13400. "adc r4, r4, #0\n\t"
  13401. "lsr r11, r7, #16\n\t"
  13402. "mul r6, r11, r6\n\t"
  13403. "lsr r11, r6, #16\n\t"
  13404. "lsl r6, r6, #16\n\t"
  13405. "adds r10, r10, r6\n\t"
  13406. "adc r4, r4, r11\n\t"
  13407. #else
  13408. "umull r6, r7, r8, r7\n\t"
  13409. "adds r10, r10, r6\n\t"
  13410. "adc r4, r7, #0\n\t"
  13411. #endif
  13412. "adds r10, r10, r5\n\t"
  13413. "str r10, [%[a], #108]\n\t"
  13414. "adc r4, r4, #0\n\t"
  13415. /* a[i+28] += m[28] * mu */
  13416. "ldr r7, [%[m], #112]\n\t"
  13417. "ldr r10, [%[a], #112]\n\t"
  13418. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13419. "lsr r11, r7, #16\n\t"
  13420. "lsr r6, r8, #16\n\t"
  13421. "mul r5, r6, r11\n\t"
  13422. "lsl r11, r7, #16\n\t"
  13423. "lsr r11, r11, #16\n\t"
  13424. "mul r6, r11, r6\n\t"
  13425. "lsr r11, r6, #16\n\t"
  13426. "lsl r6, r6, #16\n\t"
  13427. "adds r10, r10, r6\n\t"
  13428. "adc r5, r5, r11\n\t"
  13429. "lsl r6, r8, #16\n\t"
  13430. "lsl r11, r7, #16\n\t"
  13431. "lsr r6, r6, #16\n\t"
  13432. "lsr r11, r11, #16\n\t"
  13433. "mul r11, r6, r11\n\t"
  13434. "adds r10, r10, r11\n\t"
  13435. "adc r5, r5, #0\n\t"
  13436. "lsr r11, r7, #16\n\t"
  13437. "mul r6, r11, r6\n\t"
  13438. "lsr r11, r6, #16\n\t"
  13439. "lsl r6, r6, #16\n\t"
  13440. "adds r10, r10, r6\n\t"
  13441. "adc r5, r5, r11\n\t"
  13442. #else
  13443. "umull r6, r7, r8, r7\n\t"
  13444. "adds r10, r10, r6\n\t"
  13445. "adc r5, r7, #0\n\t"
  13446. #endif
  13447. "adds r10, r10, r4\n\t"
  13448. "str r10, [%[a], #112]\n\t"
  13449. "adc r5, r5, #0\n\t"
  13450. /* a[i+29] += m[29] * mu */
  13451. "ldr r7, [%[m], #116]\n\t"
  13452. "ldr r10, [%[a], #116]\n\t"
  13453. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13454. "lsr r11, r7, #16\n\t"
  13455. "lsr r6, r8, #16\n\t"
  13456. "mul r4, r6, r11\n\t"
  13457. "lsl r11, r7, #16\n\t"
  13458. "lsr r11, r11, #16\n\t"
  13459. "mul r6, r11, r6\n\t"
  13460. "lsr r11, r6, #16\n\t"
  13461. "lsl r6, r6, #16\n\t"
  13462. "adds r10, r10, r6\n\t"
  13463. "adc r4, r4, r11\n\t"
  13464. "lsl r6, r8, #16\n\t"
  13465. "lsl r11, r7, #16\n\t"
  13466. "lsr r6, r6, #16\n\t"
  13467. "lsr r11, r11, #16\n\t"
  13468. "mul r11, r6, r11\n\t"
  13469. "adds r10, r10, r11\n\t"
  13470. "adc r4, r4, #0\n\t"
  13471. "lsr r11, r7, #16\n\t"
  13472. "mul r6, r11, r6\n\t"
  13473. "lsr r11, r6, #16\n\t"
  13474. "lsl r6, r6, #16\n\t"
  13475. "adds r10, r10, r6\n\t"
  13476. "adc r4, r4, r11\n\t"
  13477. #else
  13478. "umull r6, r7, r8, r7\n\t"
  13479. "adds r10, r10, r6\n\t"
  13480. "adc r4, r7, #0\n\t"
  13481. #endif
  13482. "adds r10, r10, r5\n\t"
  13483. "str r10, [%[a], #116]\n\t"
  13484. "adc r4, r4, #0\n\t"
  13485. /* a[i+30] += m[30] * mu */
  13486. "ldr r7, [%[m], #120]\n\t"
  13487. "ldr r10, [%[a], #120]\n\t"
  13488. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13489. "lsr r11, r7, #16\n\t"
  13490. "lsr r6, r8, #16\n\t"
  13491. "mul r5, r6, r11\n\t"
  13492. "lsl r11, r7, #16\n\t"
  13493. "lsr r11, r11, #16\n\t"
  13494. "mul r6, r11, r6\n\t"
  13495. "lsr r11, r6, #16\n\t"
  13496. "lsl r6, r6, #16\n\t"
  13497. "adds r10, r10, r6\n\t"
  13498. "adc r5, r5, r11\n\t"
  13499. "lsl r6, r8, #16\n\t"
  13500. "lsl r11, r7, #16\n\t"
  13501. "lsr r6, r6, #16\n\t"
  13502. "lsr r11, r11, #16\n\t"
  13503. "mul r11, r6, r11\n\t"
  13504. "adds r10, r10, r11\n\t"
  13505. "adc r5, r5, #0\n\t"
  13506. "lsr r11, r7, #16\n\t"
  13507. "mul r6, r11, r6\n\t"
  13508. "lsr r11, r6, #16\n\t"
  13509. "lsl r6, r6, #16\n\t"
  13510. "adds r10, r10, r6\n\t"
  13511. "adc r5, r5, r11\n\t"
  13512. #else
  13513. "umull r6, r7, r8, r7\n\t"
  13514. "adds r10, r10, r6\n\t"
  13515. "adc r5, r7, #0\n\t"
  13516. #endif
  13517. "adds r10, r10, r4\n\t"
  13518. "str r10, [%[a], #120]\n\t"
  13519. "adc r5, r5, #0\n\t"
  13520. /* a[i+31] += m[31] * mu */
  13521. "ldr r7, [%[m], #124]\n\t"
  13522. "ldr r10, [%[a], #124]\n\t"
  13523. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13524. "lsr r11, r7, #16\n\t"
  13525. "lsr r6, r8, #16\n\t"
  13526. "mul r4, r6, r11\n\t"
  13527. "lsl r11, r7, #16\n\t"
  13528. "lsr r11, r11, #16\n\t"
  13529. "mul r6, r11, r6\n\t"
  13530. "lsr r11, r6, #16\n\t"
  13531. "lsl r6, r6, #16\n\t"
  13532. "adds r10, r10, r6\n\t"
  13533. "adc r4, r4, r11\n\t"
  13534. "lsl r6, r8, #16\n\t"
  13535. "lsl r11, r7, #16\n\t"
  13536. "lsr r6, r6, #16\n\t"
  13537. "lsr r11, r11, #16\n\t"
  13538. "mul r11, r6, r11\n\t"
  13539. "adds r10, r10, r11\n\t"
  13540. "adc r4, r4, #0\n\t"
  13541. "lsr r11, r7, #16\n\t"
  13542. "mul r6, r11, r6\n\t"
  13543. "lsr r11, r6, #16\n\t"
  13544. "lsl r6, r6, #16\n\t"
  13545. "adds r10, r10, r6\n\t"
  13546. "adc r4, r4, r11\n\t"
  13547. #else
  13548. "umull r6, r7, r8, r7\n\t"
  13549. "adds r10, r10, r6\n\t"
  13550. "adc r4, r7, #0\n\t"
  13551. #endif
  13552. "adds r10, r10, r5\n\t"
  13553. "str r10, [%[a], #124]\n\t"
  13554. "adc r4, r4, #0\n\t"
  13555. /* a[i+32] += m[32] * mu */
  13556. "ldr r7, [%[m], #128]\n\t"
  13557. "ldr r10, [%[a], #128]\n\t"
  13558. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13559. "lsr r11, r7, #16\n\t"
  13560. "lsr r6, r8, #16\n\t"
  13561. "mul r5, r6, r11\n\t"
  13562. "lsl r11, r7, #16\n\t"
  13563. "lsr r11, r11, #16\n\t"
  13564. "mul r6, r11, r6\n\t"
  13565. "lsr r11, r6, #16\n\t"
  13566. "lsl r6, r6, #16\n\t"
  13567. "adds r10, r10, r6\n\t"
  13568. "adc r5, r5, r11\n\t"
  13569. "lsl r6, r8, #16\n\t"
  13570. "lsl r11, r7, #16\n\t"
  13571. "lsr r6, r6, #16\n\t"
  13572. "lsr r11, r11, #16\n\t"
  13573. "mul r11, r6, r11\n\t"
  13574. "adds r10, r10, r11\n\t"
  13575. "adc r5, r5, #0\n\t"
  13576. "lsr r11, r7, #16\n\t"
  13577. "mul r6, r11, r6\n\t"
  13578. "lsr r11, r6, #16\n\t"
  13579. "lsl r6, r6, #16\n\t"
  13580. "adds r10, r10, r6\n\t"
  13581. "adc r5, r5, r11\n\t"
  13582. #else
  13583. "umull r6, r7, r8, r7\n\t"
  13584. "adds r10, r10, r6\n\t"
  13585. "adc r5, r7, #0\n\t"
  13586. #endif
  13587. "adds r10, r10, r4\n\t"
  13588. "str r10, [%[a], #128]\n\t"
  13589. "adc r5, r5, #0\n\t"
  13590. /* a[i+33] += m[33] * mu */
  13591. "ldr r7, [%[m], #132]\n\t"
  13592. "ldr r10, [%[a], #132]\n\t"
  13593. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13594. "lsr r11, r7, #16\n\t"
  13595. "lsr r6, r8, #16\n\t"
  13596. "mul r4, r6, r11\n\t"
  13597. "lsl r11, r7, #16\n\t"
  13598. "lsr r11, r11, #16\n\t"
  13599. "mul r6, r11, r6\n\t"
  13600. "lsr r11, r6, #16\n\t"
  13601. "lsl r6, r6, #16\n\t"
  13602. "adds r10, r10, r6\n\t"
  13603. "adc r4, r4, r11\n\t"
  13604. "lsl r6, r8, #16\n\t"
  13605. "lsl r11, r7, #16\n\t"
  13606. "lsr r6, r6, #16\n\t"
  13607. "lsr r11, r11, #16\n\t"
  13608. "mul r11, r6, r11\n\t"
  13609. "adds r10, r10, r11\n\t"
  13610. "adc r4, r4, #0\n\t"
  13611. "lsr r11, r7, #16\n\t"
  13612. "mul r6, r11, r6\n\t"
  13613. "lsr r11, r6, #16\n\t"
  13614. "lsl r6, r6, #16\n\t"
  13615. "adds r10, r10, r6\n\t"
  13616. "adc r4, r4, r11\n\t"
  13617. #else
  13618. "umull r6, r7, r8, r7\n\t"
  13619. "adds r10, r10, r6\n\t"
  13620. "adc r4, r7, #0\n\t"
  13621. #endif
  13622. "adds r10, r10, r5\n\t"
  13623. "str r10, [%[a], #132]\n\t"
  13624. "adc r4, r4, #0\n\t"
  13625. /* a[i+34] += m[34] * mu */
  13626. "ldr r7, [%[m], #136]\n\t"
  13627. "ldr r10, [%[a], #136]\n\t"
  13628. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13629. "lsr r11, r7, #16\n\t"
  13630. "lsr r6, r8, #16\n\t"
  13631. "mul r5, r6, r11\n\t"
  13632. "lsl r11, r7, #16\n\t"
  13633. "lsr r11, r11, #16\n\t"
  13634. "mul r6, r11, r6\n\t"
  13635. "lsr r11, r6, #16\n\t"
  13636. "lsl r6, r6, #16\n\t"
  13637. "adds r10, r10, r6\n\t"
  13638. "adc r5, r5, r11\n\t"
  13639. "lsl r6, r8, #16\n\t"
  13640. "lsl r11, r7, #16\n\t"
  13641. "lsr r6, r6, #16\n\t"
  13642. "lsr r11, r11, #16\n\t"
  13643. "mul r11, r6, r11\n\t"
  13644. "adds r10, r10, r11\n\t"
  13645. "adc r5, r5, #0\n\t"
  13646. "lsr r11, r7, #16\n\t"
  13647. "mul r6, r11, r6\n\t"
  13648. "lsr r11, r6, #16\n\t"
  13649. "lsl r6, r6, #16\n\t"
  13650. "adds r10, r10, r6\n\t"
  13651. "adc r5, r5, r11\n\t"
  13652. #else
  13653. "umull r6, r7, r8, r7\n\t"
  13654. "adds r10, r10, r6\n\t"
  13655. "adc r5, r7, #0\n\t"
  13656. #endif
  13657. "adds r10, r10, r4\n\t"
  13658. "str r10, [%[a], #136]\n\t"
  13659. "adc r5, r5, #0\n\t"
  13660. /* a[i+35] += m[35] * mu */
  13661. "ldr r7, [%[m], #140]\n\t"
  13662. "ldr r10, [%[a], #140]\n\t"
  13663. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13664. "lsr r11, r7, #16\n\t"
  13665. "lsr r6, r8, #16\n\t"
  13666. "mul r4, r6, r11\n\t"
  13667. "lsl r11, r7, #16\n\t"
  13668. "lsr r11, r11, #16\n\t"
  13669. "mul r6, r11, r6\n\t"
  13670. "lsr r11, r6, #16\n\t"
  13671. "lsl r6, r6, #16\n\t"
  13672. "adds r10, r10, r6\n\t"
  13673. "adc r4, r4, r11\n\t"
  13674. "lsl r6, r8, #16\n\t"
  13675. "lsl r11, r7, #16\n\t"
  13676. "lsr r6, r6, #16\n\t"
  13677. "lsr r11, r11, #16\n\t"
  13678. "mul r11, r6, r11\n\t"
  13679. "adds r10, r10, r11\n\t"
  13680. "adc r4, r4, #0\n\t"
  13681. "lsr r11, r7, #16\n\t"
  13682. "mul r6, r11, r6\n\t"
  13683. "lsr r11, r6, #16\n\t"
  13684. "lsl r6, r6, #16\n\t"
  13685. "adds r10, r10, r6\n\t"
  13686. "adc r4, r4, r11\n\t"
  13687. #else
  13688. "umull r6, r7, r8, r7\n\t"
  13689. "adds r10, r10, r6\n\t"
  13690. "adc r4, r7, #0\n\t"
  13691. #endif
  13692. "adds r10, r10, r5\n\t"
  13693. "str r10, [%[a], #140]\n\t"
  13694. "adc r4, r4, #0\n\t"
  13695. /* a[i+36] += m[36] * mu */
  13696. "ldr r7, [%[m], #144]\n\t"
  13697. "ldr r10, [%[a], #144]\n\t"
  13698. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13699. "lsr r11, r7, #16\n\t"
  13700. "lsr r6, r8, #16\n\t"
  13701. "mul r5, r6, r11\n\t"
  13702. "lsl r11, r7, #16\n\t"
  13703. "lsr r11, r11, #16\n\t"
  13704. "mul r6, r11, r6\n\t"
  13705. "lsr r11, r6, #16\n\t"
  13706. "lsl r6, r6, #16\n\t"
  13707. "adds r10, r10, r6\n\t"
  13708. "adc r5, r5, r11\n\t"
  13709. "lsl r6, r8, #16\n\t"
  13710. "lsl r11, r7, #16\n\t"
  13711. "lsr r6, r6, #16\n\t"
  13712. "lsr r11, r11, #16\n\t"
  13713. "mul r11, r6, r11\n\t"
  13714. "adds r10, r10, r11\n\t"
  13715. "adc r5, r5, #0\n\t"
  13716. "lsr r11, r7, #16\n\t"
  13717. "mul r6, r11, r6\n\t"
  13718. "lsr r11, r6, #16\n\t"
  13719. "lsl r6, r6, #16\n\t"
  13720. "adds r10, r10, r6\n\t"
  13721. "adc r5, r5, r11\n\t"
  13722. #else
  13723. "umull r6, r7, r8, r7\n\t"
  13724. "adds r10, r10, r6\n\t"
  13725. "adc r5, r7, #0\n\t"
  13726. #endif
  13727. "adds r10, r10, r4\n\t"
  13728. "str r10, [%[a], #144]\n\t"
  13729. "adc r5, r5, #0\n\t"
  13730. /* a[i+37] += m[37] * mu */
  13731. "ldr r7, [%[m], #148]\n\t"
  13732. "ldr r10, [%[a], #148]\n\t"
  13733. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13734. "lsr r11, r7, #16\n\t"
  13735. "lsr r6, r8, #16\n\t"
  13736. "mul r4, r6, r11\n\t"
  13737. "lsl r11, r7, #16\n\t"
  13738. "lsr r11, r11, #16\n\t"
  13739. "mul r6, r11, r6\n\t"
  13740. "lsr r11, r6, #16\n\t"
  13741. "lsl r6, r6, #16\n\t"
  13742. "adds r10, r10, r6\n\t"
  13743. "adc r4, r4, r11\n\t"
  13744. "lsl r6, r8, #16\n\t"
  13745. "lsl r11, r7, #16\n\t"
  13746. "lsr r6, r6, #16\n\t"
  13747. "lsr r11, r11, #16\n\t"
  13748. "mul r11, r6, r11\n\t"
  13749. "adds r10, r10, r11\n\t"
  13750. "adc r4, r4, #0\n\t"
  13751. "lsr r11, r7, #16\n\t"
  13752. "mul r6, r11, r6\n\t"
  13753. "lsr r11, r6, #16\n\t"
  13754. "lsl r6, r6, #16\n\t"
  13755. "adds r10, r10, r6\n\t"
  13756. "adc r4, r4, r11\n\t"
  13757. #else
  13758. "umull r6, r7, r8, r7\n\t"
  13759. "adds r10, r10, r6\n\t"
  13760. "adc r4, r7, #0\n\t"
  13761. #endif
  13762. "adds r10, r10, r5\n\t"
  13763. "str r10, [%[a], #148]\n\t"
  13764. "adc r4, r4, #0\n\t"
  13765. /* a[i+38] += m[38] * mu */
  13766. "ldr r7, [%[m], #152]\n\t"
  13767. "ldr r10, [%[a], #152]\n\t"
  13768. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13769. "lsr r11, r7, #16\n\t"
  13770. "lsr r6, r8, #16\n\t"
  13771. "mul r5, r6, r11\n\t"
  13772. "lsl r11, r7, #16\n\t"
  13773. "lsr r11, r11, #16\n\t"
  13774. "mul r6, r11, r6\n\t"
  13775. "lsr r11, r6, #16\n\t"
  13776. "lsl r6, r6, #16\n\t"
  13777. "adds r10, r10, r6\n\t"
  13778. "adc r5, r5, r11\n\t"
  13779. "lsl r6, r8, #16\n\t"
  13780. "lsl r11, r7, #16\n\t"
  13781. "lsr r6, r6, #16\n\t"
  13782. "lsr r11, r11, #16\n\t"
  13783. "mul r11, r6, r11\n\t"
  13784. "adds r10, r10, r11\n\t"
  13785. "adc r5, r5, #0\n\t"
  13786. "lsr r11, r7, #16\n\t"
  13787. "mul r6, r11, r6\n\t"
  13788. "lsr r11, r6, #16\n\t"
  13789. "lsl r6, r6, #16\n\t"
  13790. "adds r10, r10, r6\n\t"
  13791. "adc r5, r5, r11\n\t"
  13792. #else
  13793. "umull r6, r7, r8, r7\n\t"
  13794. "adds r10, r10, r6\n\t"
  13795. "adc r5, r7, #0\n\t"
  13796. #endif
  13797. "adds r10, r10, r4\n\t"
  13798. "str r10, [%[a], #152]\n\t"
  13799. "adc r5, r5, #0\n\t"
  13800. /* a[i+39] += m[39] * mu */
  13801. "ldr r7, [%[m], #156]\n\t"
  13802. "ldr r10, [%[a], #156]\n\t"
  13803. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13804. "lsr r11, r7, #16\n\t"
  13805. "lsr r6, r8, #16\n\t"
  13806. "mul r4, r6, r11\n\t"
  13807. "lsl r11, r7, #16\n\t"
  13808. "lsr r11, r11, #16\n\t"
  13809. "mul r6, r11, r6\n\t"
  13810. "lsr r11, r6, #16\n\t"
  13811. "lsl r6, r6, #16\n\t"
  13812. "adds r10, r10, r6\n\t"
  13813. "adc r4, r4, r11\n\t"
  13814. "lsl r6, r8, #16\n\t"
  13815. "lsl r11, r7, #16\n\t"
  13816. "lsr r6, r6, #16\n\t"
  13817. "lsr r11, r11, #16\n\t"
  13818. "mul r11, r6, r11\n\t"
  13819. "adds r10, r10, r11\n\t"
  13820. "adc r4, r4, #0\n\t"
  13821. "lsr r11, r7, #16\n\t"
  13822. "mul r6, r11, r6\n\t"
  13823. "lsr r11, r6, #16\n\t"
  13824. "lsl r6, r6, #16\n\t"
  13825. "adds r10, r10, r6\n\t"
  13826. "adc r4, r4, r11\n\t"
  13827. #else
  13828. "umull r6, r7, r8, r7\n\t"
  13829. "adds r10, r10, r6\n\t"
  13830. "adc r4, r7, #0\n\t"
  13831. #endif
  13832. "adds r10, r10, r5\n\t"
  13833. "str r10, [%[a], #156]\n\t"
  13834. "adc r4, r4, #0\n\t"
  13835. /* a[i+40] += m[40] * mu */
  13836. "ldr r7, [%[m], #160]\n\t"
  13837. "ldr r10, [%[a], #160]\n\t"
  13838. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13839. "lsr r11, r7, #16\n\t"
  13840. "lsr r6, r8, #16\n\t"
  13841. "mul r5, r6, r11\n\t"
  13842. "lsl r11, r7, #16\n\t"
  13843. "lsr r11, r11, #16\n\t"
  13844. "mul r6, r11, r6\n\t"
  13845. "lsr r11, r6, #16\n\t"
  13846. "lsl r6, r6, #16\n\t"
  13847. "adds r10, r10, r6\n\t"
  13848. "adc r5, r5, r11\n\t"
  13849. "lsl r6, r8, #16\n\t"
  13850. "lsl r11, r7, #16\n\t"
  13851. "lsr r6, r6, #16\n\t"
  13852. "lsr r11, r11, #16\n\t"
  13853. "mul r11, r6, r11\n\t"
  13854. "adds r10, r10, r11\n\t"
  13855. "adc r5, r5, #0\n\t"
  13856. "lsr r11, r7, #16\n\t"
  13857. "mul r6, r11, r6\n\t"
  13858. "lsr r11, r6, #16\n\t"
  13859. "lsl r6, r6, #16\n\t"
  13860. "adds r10, r10, r6\n\t"
  13861. "adc r5, r5, r11\n\t"
  13862. #else
  13863. "umull r6, r7, r8, r7\n\t"
  13864. "adds r10, r10, r6\n\t"
  13865. "adc r5, r7, #0\n\t"
  13866. #endif
  13867. "adds r10, r10, r4\n\t"
  13868. "str r10, [%[a], #160]\n\t"
  13869. "adc r5, r5, #0\n\t"
  13870. /* a[i+41] += m[41] * mu */
  13871. "ldr r7, [%[m], #164]\n\t"
  13872. "ldr r10, [%[a], #164]\n\t"
  13873. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13874. "lsr r11, r7, #16\n\t"
  13875. "lsr r6, r8, #16\n\t"
  13876. "mul r4, r6, r11\n\t"
  13877. "lsl r11, r7, #16\n\t"
  13878. "lsr r11, r11, #16\n\t"
  13879. "mul r6, r11, r6\n\t"
  13880. "lsr r11, r6, #16\n\t"
  13881. "lsl r6, r6, #16\n\t"
  13882. "adds r10, r10, r6\n\t"
  13883. "adc r4, r4, r11\n\t"
  13884. "lsl r6, r8, #16\n\t"
  13885. "lsl r11, r7, #16\n\t"
  13886. "lsr r6, r6, #16\n\t"
  13887. "lsr r11, r11, #16\n\t"
  13888. "mul r11, r6, r11\n\t"
  13889. "adds r10, r10, r11\n\t"
  13890. "adc r4, r4, #0\n\t"
  13891. "lsr r11, r7, #16\n\t"
  13892. "mul r6, r11, r6\n\t"
  13893. "lsr r11, r6, #16\n\t"
  13894. "lsl r6, r6, #16\n\t"
  13895. "adds r10, r10, r6\n\t"
  13896. "adc r4, r4, r11\n\t"
  13897. #else
  13898. "umull r6, r7, r8, r7\n\t"
  13899. "adds r10, r10, r6\n\t"
  13900. "adc r4, r7, #0\n\t"
  13901. #endif
  13902. "adds r10, r10, r5\n\t"
  13903. "str r10, [%[a], #164]\n\t"
  13904. "adc r4, r4, #0\n\t"
  13905. /* a[i+42] += m[42] * mu */
  13906. "ldr r7, [%[m], #168]\n\t"
  13907. "ldr r10, [%[a], #168]\n\t"
  13908. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13909. "lsr r11, r7, #16\n\t"
  13910. "lsr r6, r8, #16\n\t"
  13911. "mul r5, r6, r11\n\t"
  13912. "lsl r11, r7, #16\n\t"
  13913. "lsr r11, r11, #16\n\t"
  13914. "mul r6, r11, r6\n\t"
  13915. "lsr r11, r6, #16\n\t"
  13916. "lsl r6, r6, #16\n\t"
  13917. "adds r10, r10, r6\n\t"
  13918. "adc r5, r5, r11\n\t"
  13919. "lsl r6, r8, #16\n\t"
  13920. "lsl r11, r7, #16\n\t"
  13921. "lsr r6, r6, #16\n\t"
  13922. "lsr r11, r11, #16\n\t"
  13923. "mul r11, r6, r11\n\t"
  13924. "adds r10, r10, r11\n\t"
  13925. "adc r5, r5, #0\n\t"
  13926. "lsr r11, r7, #16\n\t"
  13927. "mul r6, r11, r6\n\t"
  13928. "lsr r11, r6, #16\n\t"
  13929. "lsl r6, r6, #16\n\t"
  13930. "adds r10, r10, r6\n\t"
  13931. "adc r5, r5, r11\n\t"
  13932. #else
  13933. "umull r6, r7, r8, r7\n\t"
  13934. "adds r10, r10, r6\n\t"
  13935. "adc r5, r7, #0\n\t"
  13936. #endif
  13937. "adds r10, r10, r4\n\t"
  13938. "str r10, [%[a], #168]\n\t"
  13939. "adc r5, r5, #0\n\t"
  13940. /* a[i+43] += m[43] * mu */
  13941. "ldr r7, [%[m], #172]\n\t"
  13942. "ldr r10, [%[a], #172]\n\t"
  13943. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13944. "lsr r11, r7, #16\n\t"
  13945. "lsr r6, r8, #16\n\t"
  13946. "mul r4, r6, r11\n\t"
  13947. "lsl r11, r7, #16\n\t"
  13948. "lsr r11, r11, #16\n\t"
  13949. "mul r6, r11, r6\n\t"
  13950. "lsr r11, r6, #16\n\t"
  13951. "lsl r6, r6, #16\n\t"
  13952. "adds r10, r10, r6\n\t"
  13953. "adc r4, r4, r11\n\t"
  13954. "lsl r6, r8, #16\n\t"
  13955. "lsl r11, r7, #16\n\t"
  13956. "lsr r6, r6, #16\n\t"
  13957. "lsr r11, r11, #16\n\t"
  13958. "mul r11, r6, r11\n\t"
  13959. "adds r10, r10, r11\n\t"
  13960. "adc r4, r4, #0\n\t"
  13961. "lsr r11, r7, #16\n\t"
  13962. "mul r6, r11, r6\n\t"
  13963. "lsr r11, r6, #16\n\t"
  13964. "lsl r6, r6, #16\n\t"
  13965. "adds r10, r10, r6\n\t"
  13966. "adc r4, r4, r11\n\t"
  13967. #else
  13968. "umull r6, r7, r8, r7\n\t"
  13969. "adds r10, r10, r6\n\t"
  13970. "adc r4, r7, #0\n\t"
  13971. #endif
  13972. "adds r10, r10, r5\n\t"
  13973. "str r10, [%[a], #172]\n\t"
  13974. "adc r4, r4, #0\n\t"
  13975. /* a[i+44] += m[44] * mu */
  13976. "ldr r7, [%[m], #176]\n\t"
  13977. "ldr r10, [%[a], #176]\n\t"
  13978. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  13979. "lsr r11, r7, #16\n\t"
  13980. "lsr r6, r8, #16\n\t"
  13981. "mul r5, r6, r11\n\t"
  13982. "lsl r11, r7, #16\n\t"
  13983. "lsr r11, r11, #16\n\t"
  13984. "mul r6, r11, r6\n\t"
  13985. "lsr r11, r6, #16\n\t"
  13986. "lsl r6, r6, #16\n\t"
  13987. "adds r10, r10, r6\n\t"
  13988. "adc r5, r5, r11\n\t"
  13989. "lsl r6, r8, #16\n\t"
  13990. "lsl r11, r7, #16\n\t"
  13991. "lsr r6, r6, #16\n\t"
  13992. "lsr r11, r11, #16\n\t"
  13993. "mul r11, r6, r11\n\t"
  13994. "adds r10, r10, r11\n\t"
  13995. "adc r5, r5, #0\n\t"
  13996. "lsr r11, r7, #16\n\t"
  13997. "mul r6, r11, r6\n\t"
  13998. "lsr r11, r6, #16\n\t"
  13999. "lsl r6, r6, #16\n\t"
  14000. "adds r10, r10, r6\n\t"
  14001. "adc r5, r5, r11\n\t"
  14002. #else
  14003. "umull r6, r7, r8, r7\n\t"
  14004. "adds r10, r10, r6\n\t"
  14005. "adc r5, r7, #0\n\t"
  14006. #endif
  14007. "adds r10, r10, r4\n\t"
  14008. "str r10, [%[a], #176]\n\t"
  14009. "adc r5, r5, #0\n\t"
  14010. /* a[i+45] += m[45] * mu */
  14011. "ldr r7, [%[m], #180]\n\t"
  14012. "ldr r10, [%[a], #180]\n\t"
  14013. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14014. "lsr r11, r7, #16\n\t"
  14015. "lsr r6, r8, #16\n\t"
  14016. "mul r4, r6, r11\n\t"
  14017. "lsl r11, r7, #16\n\t"
  14018. "lsr r11, r11, #16\n\t"
  14019. "mul r6, r11, r6\n\t"
  14020. "lsr r11, r6, #16\n\t"
  14021. "lsl r6, r6, #16\n\t"
  14022. "adds r10, r10, r6\n\t"
  14023. "adc r4, r4, r11\n\t"
  14024. "lsl r6, r8, #16\n\t"
  14025. "lsl r11, r7, #16\n\t"
  14026. "lsr r6, r6, #16\n\t"
  14027. "lsr r11, r11, #16\n\t"
  14028. "mul r11, r6, r11\n\t"
  14029. "adds r10, r10, r11\n\t"
  14030. "adc r4, r4, #0\n\t"
  14031. "lsr r11, r7, #16\n\t"
  14032. "mul r6, r11, r6\n\t"
  14033. "lsr r11, r6, #16\n\t"
  14034. "lsl r6, r6, #16\n\t"
  14035. "adds r10, r10, r6\n\t"
  14036. "adc r4, r4, r11\n\t"
  14037. #else
  14038. "umull r6, r7, r8, r7\n\t"
  14039. "adds r10, r10, r6\n\t"
  14040. "adc r4, r7, #0\n\t"
  14041. #endif
  14042. "adds r10, r10, r5\n\t"
  14043. "str r10, [%[a], #180]\n\t"
  14044. "adc r4, r4, #0\n\t"
  14045. /* a[i+46] += m[46] * mu */
  14046. "ldr r7, [%[m], #184]\n\t"
  14047. "ldr r10, [%[a], #184]\n\t"
  14048. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14049. "lsr r11, r7, #16\n\t"
  14050. "lsr r6, r8, #16\n\t"
  14051. "mul r5, r6, r11\n\t"
  14052. "lsl r11, r7, #16\n\t"
  14053. "lsr r11, r11, #16\n\t"
  14054. "mul r6, r11, r6\n\t"
  14055. "lsr r11, r6, #16\n\t"
  14056. "lsl r6, r6, #16\n\t"
  14057. "adds r10, r10, r6\n\t"
  14058. "adc r5, r5, r11\n\t"
  14059. "lsl r6, r8, #16\n\t"
  14060. "lsl r11, r7, #16\n\t"
  14061. "lsr r6, r6, #16\n\t"
  14062. "lsr r11, r11, #16\n\t"
  14063. "mul r11, r6, r11\n\t"
  14064. "adds r10, r10, r11\n\t"
  14065. "adc r5, r5, #0\n\t"
  14066. "lsr r11, r7, #16\n\t"
  14067. "mul r6, r11, r6\n\t"
  14068. "lsr r11, r6, #16\n\t"
  14069. "lsl r6, r6, #16\n\t"
  14070. "adds r10, r10, r6\n\t"
  14071. "adc r5, r5, r11\n\t"
  14072. #else
  14073. "umull r6, r7, r8, r7\n\t"
  14074. "adds r10, r10, r6\n\t"
  14075. "adc r5, r7, #0\n\t"
  14076. #endif
  14077. "adds r10, r10, r4\n\t"
  14078. "str r10, [%[a], #184]\n\t"
  14079. "adc r5, r5, #0\n\t"
  14080. /* a[i+47] += m[47] * mu */
  14081. "ldr r7, [%[m], #188]\n\t"
  14082. "ldr r10, [%[a], #188]\n\t"
  14083. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14084. "lsr r11, r7, #16\n\t"
  14085. "lsr r6, r8, #16\n\t"
  14086. "mul r4, r6, r11\n\t"
  14087. "lsl r11, r7, #16\n\t"
  14088. "lsr r11, r11, #16\n\t"
  14089. "mul r6, r11, r6\n\t"
  14090. "lsr r11, r6, #16\n\t"
  14091. "lsl r6, r6, #16\n\t"
  14092. "adds r10, r10, r6\n\t"
  14093. "adc r4, r4, r11\n\t"
  14094. "lsl r6, r8, #16\n\t"
  14095. "lsl r11, r7, #16\n\t"
  14096. "lsr r6, r6, #16\n\t"
  14097. "lsr r11, r11, #16\n\t"
  14098. "mul r11, r6, r11\n\t"
  14099. "adds r10, r10, r11\n\t"
  14100. "adc r4, r4, #0\n\t"
  14101. "lsr r11, r7, #16\n\t"
  14102. "mul r6, r11, r6\n\t"
  14103. "lsr r11, r6, #16\n\t"
  14104. "lsl r6, r6, #16\n\t"
  14105. "adds r10, r10, r6\n\t"
  14106. "adc r4, r4, r11\n\t"
  14107. #else
  14108. "umull r6, r7, r8, r7\n\t"
  14109. "adds r10, r10, r6\n\t"
  14110. "adc r4, r7, #0\n\t"
  14111. #endif
  14112. "adds r10, r10, r5\n\t"
  14113. "str r10, [%[a], #188]\n\t"
  14114. "adc r4, r4, #0\n\t"
  14115. /* a[i+48] += m[48] * mu */
  14116. "ldr r7, [%[m], #192]\n\t"
  14117. "ldr r10, [%[a], #192]\n\t"
  14118. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14119. "lsr r11, r7, #16\n\t"
  14120. "lsr r6, r8, #16\n\t"
  14121. "mul r5, r6, r11\n\t"
  14122. "lsl r11, r7, #16\n\t"
  14123. "lsr r11, r11, #16\n\t"
  14124. "mul r6, r11, r6\n\t"
  14125. "lsr r11, r6, #16\n\t"
  14126. "lsl r6, r6, #16\n\t"
  14127. "adds r10, r10, r6\n\t"
  14128. "adc r5, r5, r11\n\t"
  14129. "lsl r6, r8, #16\n\t"
  14130. "lsl r11, r7, #16\n\t"
  14131. "lsr r6, r6, #16\n\t"
  14132. "lsr r11, r11, #16\n\t"
  14133. "mul r11, r6, r11\n\t"
  14134. "adds r10, r10, r11\n\t"
  14135. "adc r5, r5, #0\n\t"
  14136. "lsr r11, r7, #16\n\t"
  14137. "mul r6, r11, r6\n\t"
  14138. "lsr r11, r6, #16\n\t"
  14139. "lsl r6, r6, #16\n\t"
  14140. "adds r10, r10, r6\n\t"
  14141. "adc r5, r5, r11\n\t"
  14142. #else
  14143. "umull r6, r7, r8, r7\n\t"
  14144. "adds r10, r10, r6\n\t"
  14145. "adc r5, r7, #0\n\t"
  14146. #endif
  14147. "adds r10, r10, r4\n\t"
  14148. "str r10, [%[a], #192]\n\t"
  14149. "adc r5, r5, #0\n\t"
  14150. /* a[i+49] += m[49] * mu */
  14151. "ldr r7, [%[m], #196]\n\t"
  14152. "ldr r10, [%[a], #196]\n\t"
  14153. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14154. "lsr r11, r7, #16\n\t"
  14155. "lsr r6, r8, #16\n\t"
  14156. "mul r4, r6, r11\n\t"
  14157. "lsl r11, r7, #16\n\t"
  14158. "lsr r11, r11, #16\n\t"
  14159. "mul r6, r11, r6\n\t"
  14160. "lsr r11, r6, #16\n\t"
  14161. "lsl r6, r6, #16\n\t"
  14162. "adds r10, r10, r6\n\t"
  14163. "adc r4, r4, r11\n\t"
  14164. "lsl r6, r8, #16\n\t"
  14165. "lsl r11, r7, #16\n\t"
  14166. "lsr r6, r6, #16\n\t"
  14167. "lsr r11, r11, #16\n\t"
  14168. "mul r11, r6, r11\n\t"
  14169. "adds r10, r10, r11\n\t"
  14170. "adc r4, r4, #0\n\t"
  14171. "lsr r11, r7, #16\n\t"
  14172. "mul r6, r11, r6\n\t"
  14173. "lsr r11, r6, #16\n\t"
  14174. "lsl r6, r6, #16\n\t"
  14175. "adds r10, r10, r6\n\t"
  14176. "adc r4, r4, r11\n\t"
  14177. #else
  14178. "umull r6, r7, r8, r7\n\t"
  14179. "adds r10, r10, r6\n\t"
  14180. "adc r4, r7, #0\n\t"
  14181. #endif
  14182. "adds r10, r10, r5\n\t"
  14183. "str r10, [%[a], #196]\n\t"
  14184. "adc r4, r4, #0\n\t"
  14185. /* a[i+50] += m[50] * mu */
  14186. "ldr r7, [%[m], #200]\n\t"
  14187. "ldr r10, [%[a], #200]\n\t"
  14188. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14189. "lsr r11, r7, #16\n\t"
  14190. "lsr r6, r8, #16\n\t"
  14191. "mul r5, r6, r11\n\t"
  14192. "lsl r11, r7, #16\n\t"
  14193. "lsr r11, r11, #16\n\t"
  14194. "mul r6, r11, r6\n\t"
  14195. "lsr r11, r6, #16\n\t"
  14196. "lsl r6, r6, #16\n\t"
  14197. "adds r10, r10, r6\n\t"
  14198. "adc r5, r5, r11\n\t"
  14199. "lsl r6, r8, #16\n\t"
  14200. "lsl r11, r7, #16\n\t"
  14201. "lsr r6, r6, #16\n\t"
  14202. "lsr r11, r11, #16\n\t"
  14203. "mul r11, r6, r11\n\t"
  14204. "adds r10, r10, r11\n\t"
  14205. "adc r5, r5, #0\n\t"
  14206. "lsr r11, r7, #16\n\t"
  14207. "mul r6, r11, r6\n\t"
  14208. "lsr r11, r6, #16\n\t"
  14209. "lsl r6, r6, #16\n\t"
  14210. "adds r10, r10, r6\n\t"
  14211. "adc r5, r5, r11\n\t"
  14212. #else
  14213. "umull r6, r7, r8, r7\n\t"
  14214. "adds r10, r10, r6\n\t"
  14215. "adc r5, r7, #0\n\t"
  14216. #endif
  14217. "adds r10, r10, r4\n\t"
  14218. "str r10, [%[a], #200]\n\t"
  14219. "adc r5, r5, #0\n\t"
  14220. /* a[i+51] += m[51] * mu */
  14221. "ldr r7, [%[m], #204]\n\t"
  14222. "ldr r10, [%[a], #204]\n\t"
  14223. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14224. "lsr r11, r7, #16\n\t"
  14225. "lsr r6, r8, #16\n\t"
  14226. "mul r4, r6, r11\n\t"
  14227. "lsl r11, r7, #16\n\t"
  14228. "lsr r11, r11, #16\n\t"
  14229. "mul r6, r11, r6\n\t"
  14230. "lsr r11, r6, #16\n\t"
  14231. "lsl r6, r6, #16\n\t"
  14232. "adds r10, r10, r6\n\t"
  14233. "adc r4, r4, r11\n\t"
  14234. "lsl r6, r8, #16\n\t"
  14235. "lsl r11, r7, #16\n\t"
  14236. "lsr r6, r6, #16\n\t"
  14237. "lsr r11, r11, #16\n\t"
  14238. "mul r11, r6, r11\n\t"
  14239. "adds r10, r10, r11\n\t"
  14240. "adc r4, r4, #0\n\t"
  14241. "lsr r11, r7, #16\n\t"
  14242. "mul r6, r11, r6\n\t"
  14243. "lsr r11, r6, #16\n\t"
  14244. "lsl r6, r6, #16\n\t"
  14245. "adds r10, r10, r6\n\t"
  14246. "adc r4, r4, r11\n\t"
  14247. #else
  14248. "umull r6, r7, r8, r7\n\t"
  14249. "adds r10, r10, r6\n\t"
  14250. "adc r4, r7, #0\n\t"
  14251. #endif
  14252. "adds r10, r10, r5\n\t"
  14253. "str r10, [%[a], #204]\n\t"
  14254. "adc r4, r4, #0\n\t"
  14255. /* a[i+52] += m[52] * mu */
  14256. "ldr r7, [%[m], #208]\n\t"
  14257. "ldr r10, [%[a], #208]\n\t"
  14258. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14259. "lsr r11, r7, #16\n\t"
  14260. "lsr r6, r8, #16\n\t"
  14261. "mul r5, r6, r11\n\t"
  14262. "lsl r11, r7, #16\n\t"
  14263. "lsr r11, r11, #16\n\t"
  14264. "mul r6, r11, r6\n\t"
  14265. "lsr r11, r6, #16\n\t"
  14266. "lsl r6, r6, #16\n\t"
  14267. "adds r10, r10, r6\n\t"
  14268. "adc r5, r5, r11\n\t"
  14269. "lsl r6, r8, #16\n\t"
  14270. "lsl r11, r7, #16\n\t"
  14271. "lsr r6, r6, #16\n\t"
  14272. "lsr r11, r11, #16\n\t"
  14273. "mul r11, r6, r11\n\t"
  14274. "adds r10, r10, r11\n\t"
  14275. "adc r5, r5, #0\n\t"
  14276. "lsr r11, r7, #16\n\t"
  14277. "mul r6, r11, r6\n\t"
  14278. "lsr r11, r6, #16\n\t"
  14279. "lsl r6, r6, #16\n\t"
  14280. "adds r10, r10, r6\n\t"
  14281. "adc r5, r5, r11\n\t"
  14282. #else
  14283. "umull r6, r7, r8, r7\n\t"
  14284. "adds r10, r10, r6\n\t"
  14285. "adc r5, r7, #0\n\t"
  14286. #endif
  14287. "adds r10, r10, r4\n\t"
  14288. "str r10, [%[a], #208]\n\t"
  14289. "adc r5, r5, #0\n\t"
  14290. /* a[i+53] += m[53] * mu */
  14291. "ldr r7, [%[m], #212]\n\t"
  14292. "ldr r10, [%[a], #212]\n\t"
  14293. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14294. "lsr r11, r7, #16\n\t"
  14295. "lsr r6, r8, #16\n\t"
  14296. "mul r4, r6, r11\n\t"
  14297. "lsl r11, r7, #16\n\t"
  14298. "lsr r11, r11, #16\n\t"
  14299. "mul r6, r11, r6\n\t"
  14300. "lsr r11, r6, #16\n\t"
  14301. "lsl r6, r6, #16\n\t"
  14302. "adds r10, r10, r6\n\t"
  14303. "adc r4, r4, r11\n\t"
  14304. "lsl r6, r8, #16\n\t"
  14305. "lsl r11, r7, #16\n\t"
  14306. "lsr r6, r6, #16\n\t"
  14307. "lsr r11, r11, #16\n\t"
  14308. "mul r11, r6, r11\n\t"
  14309. "adds r10, r10, r11\n\t"
  14310. "adc r4, r4, #0\n\t"
  14311. "lsr r11, r7, #16\n\t"
  14312. "mul r6, r11, r6\n\t"
  14313. "lsr r11, r6, #16\n\t"
  14314. "lsl r6, r6, #16\n\t"
  14315. "adds r10, r10, r6\n\t"
  14316. "adc r4, r4, r11\n\t"
  14317. #else
  14318. "umull r6, r7, r8, r7\n\t"
  14319. "adds r10, r10, r6\n\t"
  14320. "adc r4, r7, #0\n\t"
  14321. #endif
  14322. "adds r10, r10, r5\n\t"
  14323. "str r10, [%[a], #212]\n\t"
  14324. "adc r4, r4, #0\n\t"
  14325. /* a[i+54] += m[54] * mu */
  14326. "ldr r7, [%[m], #216]\n\t"
  14327. "ldr r10, [%[a], #216]\n\t"
  14328. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14329. "lsr r11, r7, #16\n\t"
  14330. "lsr r6, r8, #16\n\t"
  14331. "mul r5, r6, r11\n\t"
  14332. "lsl r11, r7, #16\n\t"
  14333. "lsr r11, r11, #16\n\t"
  14334. "mul r6, r11, r6\n\t"
  14335. "lsr r11, r6, #16\n\t"
  14336. "lsl r6, r6, #16\n\t"
  14337. "adds r10, r10, r6\n\t"
  14338. "adc r5, r5, r11\n\t"
  14339. "lsl r6, r8, #16\n\t"
  14340. "lsl r11, r7, #16\n\t"
  14341. "lsr r6, r6, #16\n\t"
  14342. "lsr r11, r11, #16\n\t"
  14343. "mul r11, r6, r11\n\t"
  14344. "adds r10, r10, r11\n\t"
  14345. "adc r5, r5, #0\n\t"
  14346. "lsr r11, r7, #16\n\t"
  14347. "mul r6, r11, r6\n\t"
  14348. "lsr r11, r6, #16\n\t"
  14349. "lsl r6, r6, #16\n\t"
  14350. "adds r10, r10, r6\n\t"
  14351. "adc r5, r5, r11\n\t"
  14352. #else
  14353. "umull r6, r7, r8, r7\n\t"
  14354. "adds r10, r10, r6\n\t"
  14355. "adc r5, r7, #0\n\t"
  14356. #endif
  14357. "adds r10, r10, r4\n\t"
  14358. "str r10, [%[a], #216]\n\t"
  14359. "adc r5, r5, #0\n\t"
  14360. /* a[i+55] += m[55] * mu */
  14361. "ldr r7, [%[m], #220]\n\t"
  14362. "ldr r10, [%[a], #220]\n\t"
  14363. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14364. "lsr r11, r7, #16\n\t"
  14365. "lsr r6, r8, #16\n\t"
  14366. "mul r4, r6, r11\n\t"
  14367. "lsl r11, r7, #16\n\t"
  14368. "lsr r11, r11, #16\n\t"
  14369. "mul r6, r11, r6\n\t"
  14370. "lsr r11, r6, #16\n\t"
  14371. "lsl r6, r6, #16\n\t"
  14372. "adds r10, r10, r6\n\t"
  14373. "adc r4, r4, r11\n\t"
  14374. "lsl r6, r8, #16\n\t"
  14375. "lsl r11, r7, #16\n\t"
  14376. "lsr r6, r6, #16\n\t"
  14377. "lsr r11, r11, #16\n\t"
  14378. "mul r11, r6, r11\n\t"
  14379. "adds r10, r10, r11\n\t"
  14380. "adc r4, r4, #0\n\t"
  14381. "lsr r11, r7, #16\n\t"
  14382. "mul r6, r11, r6\n\t"
  14383. "lsr r11, r6, #16\n\t"
  14384. "lsl r6, r6, #16\n\t"
  14385. "adds r10, r10, r6\n\t"
  14386. "adc r4, r4, r11\n\t"
  14387. #else
  14388. "umull r6, r7, r8, r7\n\t"
  14389. "adds r10, r10, r6\n\t"
  14390. "adc r4, r7, #0\n\t"
  14391. #endif
  14392. "adds r10, r10, r5\n\t"
  14393. "str r10, [%[a], #220]\n\t"
  14394. "adc r4, r4, #0\n\t"
  14395. /* a[i+56] += m[56] * mu */
  14396. "ldr r7, [%[m], #224]\n\t"
  14397. "ldr r10, [%[a], #224]\n\t"
  14398. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14399. "lsr r11, r7, #16\n\t"
  14400. "lsr r6, r8, #16\n\t"
  14401. "mul r5, r6, r11\n\t"
  14402. "lsl r11, r7, #16\n\t"
  14403. "lsr r11, r11, #16\n\t"
  14404. "mul r6, r11, r6\n\t"
  14405. "lsr r11, r6, #16\n\t"
  14406. "lsl r6, r6, #16\n\t"
  14407. "adds r10, r10, r6\n\t"
  14408. "adc r5, r5, r11\n\t"
  14409. "lsl r6, r8, #16\n\t"
  14410. "lsl r11, r7, #16\n\t"
  14411. "lsr r6, r6, #16\n\t"
  14412. "lsr r11, r11, #16\n\t"
  14413. "mul r11, r6, r11\n\t"
  14414. "adds r10, r10, r11\n\t"
  14415. "adc r5, r5, #0\n\t"
  14416. "lsr r11, r7, #16\n\t"
  14417. "mul r6, r11, r6\n\t"
  14418. "lsr r11, r6, #16\n\t"
  14419. "lsl r6, r6, #16\n\t"
  14420. "adds r10, r10, r6\n\t"
  14421. "adc r5, r5, r11\n\t"
  14422. #else
  14423. "umull r6, r7, r8, r7\n\t"
  14424. "adds r10, r10, r6\n\t"
  14425. "adc r5, r7, #0\n\t"
  14426. #endif
  14427. "adds r10, r10, r4\n\t"
  14428. "str r10, [%[a], #224]\n\t"
  14429. "adc r5, r5, #0\n\t"
  14430. /* a[i+57] += m[57] * mu */
  14431. "ldr r7, [%[m], #228]\n\t"
  14432. "ldr r10, [%[a], #228]\n\t"
  14433. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14434. "lsr r11, r7, #16\n\t"
  14435. "lsr r6, r8, #16\n\t"
  14436. "mul r4, r6, r11\n\t"
  14437. "lsl r11, r7, #16\n\t"
  14438. "lsr r11, r11, #16\n\t"
  14439. "mul r6, r11, r6\n\t"
  14440. "lsr r11, r6, #16\n\t"
  14441. "lsl r6, r6, #16\n\t"
  14442. "adds r10, r10, r6\n\t"
  14443. "adc r4, r4, r11\n\t"
  14444. "lsl r6, r8, #16\n\t"
  14445. "lsl r11, r7, #16\n\t"
  14446. "lsr r6, r6, #16\n\t"
  14447. "lsr r11, r11, #16\n\t"
  14448. "mul r11, r6, r11\n\t"
  14449. "adds r10, r10, r11\n\t"
  14450. "adc r4, r4, #0\n\t"
  14451. "lsr r11, r7, #16\n\t"
  14452. "mul r6, r11, r6\n\t"
  14453. "lsr r11, r6, #16\n\t"
  14454. "lsl r6, r6, #16\n\t"
  14455. "adds r10, r10, r6\n\t"
  14456. "adc r4, r4, r11\n\t"
  14457. #else
  14458. "umull r6, r7, r8, r7\n\t"
  14459. "adds r10, r10, r6\n\t"
  14460. "adc r4, r7, #0\n\t"
  14461. #endif
  14462. "adds r10, r10, r5\n\t"
  14463. "str r10, [%[a], #228]\n\t"
  14464. "adc r4, r4, #0\n\t"
  14465. /* a[i+58] += m[58] * mu */
  14466. "ldr r7, [%[m], #232]\n\t"
  14467. "ldr r10, [%[a], #232]\n\t"
  14468. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14469. "lsr r11, r7, #16\n\t"
  14470. "lsr r6, r8, #16\n\t"
  14471. "mul r5, r6, r11\n\t"
  14472. "lsl r11, r7, #16\n\t"
  14473. "lsr r11, r11, #16\n\t"
  14474. "mul r6, r11, r6\n\t"
  14475. "lsr r11, r6, #16\n\t"
  14476. "lsl r6, r6, #16\n\t"
  14477. "adds r10, r10, r6\n\t"
  14478. "adc r5, r5, r11\n\t"
  14479. "lsl r6, r8, #16\n\t"
  14480. "lsl r11, r7, #16\n\t"
  14481. "lsr r6, r6, #16\n\t"
  14482. "lsr r11, r11, #16\n\t"
  14483. "mul r11, r6, r11\n\t"
  14484. "adds r10, r10, r11\n\t"
  14485. "adc r5, r5, #0\n\t"
  14486. "lsr r11, r7, #16\n\t"
  14487. "mul r6, r11, r6\n\t"
  14488. "lsr r11, r6, #16\n\t"
  14489. "lsl r6, r6, #16\n\t"
  14490. "adds r10, r10, r6\n\t"
  14491. "adc r5, r5, r11\n\t"
  14492. #else
  14493. "umull r6, r7, r8, r7\n\t"
  14494. "adds r10, r10, r6\n\t"
  14495. "adc r5, r7, #0\n\t"
  14496. #endif
  14497. "adds r10, r10, r4\n\t"
  14498. "str r10, [%[a], #232]\n\t"
  14499. "adc r5, r5, #0\n\t"
  14500. /* a[i+59] += m[59] * mu */
  14501. "ldr r7, [%[m], #236]\n\t"
  14502. "ldr r10, [%[a], #236]\n\t"
  14503. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14504. "lsr r11, r7, #16\n\t"
  14505. "lsr r6, r8, #16\n\t"
  14506. "mul r4, r6, r11\n\t"
  14507. "lsl r11, r7, #16\n\t"
  14508. "lsr r11, r11, #16\n\t"
  14509. "mul r6, r11, r6\n\t"
  14510. "lsr r11, r6, #16\n\t"
  14511. "lsl r6, r6, #16\n\t"
  14512. "adds r10, r10, r6\n\t"
  14513. "adc r4, r4, r11\n\t"
  14514. "lsl r6, r8, #16\n\t"
  14515. "lsl r11, r7, #16\n\t"
  14516. "lsr r6, r6, #16\n\t"
  14517. "lsr r11, r11, #16\n\t"
  14518. "mul r11, r6, r11\n\t"
  14519. "adds r10, r10, r11\n\t"
  14520. "adc r4, r4, #0\n\t"
  14521. "lsr r11, r7, #16\n\t"
  14522. "mul r6, r11, r6\n\t"
  14523. "lsr r11, r6, #16\n\t"
  14524. "lsl r6, r6, #16\n\t"
  14525. "adds r10, r10, r6\n\t"
  14526. "adc r4, r4, r11\n\t"
  14527. #else
  14528. "umull r6, r7, r8, r7\n\t"
  14529. "adds r10, r10, r6\n\t"
  14530. "adc r4, r7, #0\n\t"
  14531. #endif
  14532. "adds r10, r10, r5\n\t"
  14533. "str r10, [%[a], #236]\n\t"
  14534. "adc r4, r4, #0\n\t"
  14535. /* a[i+60] += m[60] * mu */
  14536. "ldr r7, [%[m], #240]\n\t"
  14537. "ldr r10, [%[a], #240]\n\t"
  14538. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14539. "lsr r11, r7, #16\n\t"
  14540. "lsr r6, r8, #16\n\t"
  14541. "mul r5, r6, r11\n\t"
  14542. "lsl r11, r7, #16\n\t"
  14543. "lsr r11, r11, #16\n\t"
  14544. "mul r6, r11, r6\n\t"
  14545. "lsr r11, r6, #16\n\t"
  14546. "lsl r6, r6, #16\n\t"
  14547. "adds r10, r10, r6\n\t"
  14548. "adc r5, r5, r11\n\t"
  14549. "lsl r6, r8, #16\n\t"
  14550. "lsl r11, r7, #16\n\t"
  14551. "lsr r6, r6, #16\n\t"
  14552. "lsr r11, r11, #16\n\t"
  14553. "mul r11, r6, r11\n\t"
  14554. "adds r10, r10, r11\n\t"
  14555. "adc r5, r5, #0\n\t"
  14556. "lsr r11, r7, #16\n\t"
  14557. "mul r6, r11, r6\n\t"
  14558. "lsr r11, r6, #16\n\t"
  14559. "lsl r6, r6, #16\n\t"
  14560. "adds r10, r10, r6\n\t"
  14561. "adc r5, r5, r11\n\t"
  14562. #else
  14563. "umull r6, r7, r8, r7\n\t"
  14564. "adds r10, r10, r6\n\t"
  14565. "adc r5, r7, #0\n\t"
  14566. #endif
  14567. "adds r10, r10, r4\n\t"
  14568. "str r10, [%[a], #240]\n\t"
  14569. "adc r5, r5, #0\n\t"
  14570. /* a[i+61] += m[61] * mu */
  14571. "ldr r7, [%[m], #244]\n\t"
  14572. "ldr r10, [%[a], #244]\n\t"
  14573. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14574. "lsr r11, r7, #16\n\t"
  14575. "lsr r6, r8, #16\n\t"
  14576. "mul r4, r6, r11\n\t"
  14577. "lsl r11, r7, #16\n\t"
  14578. "lsr r11, r11, #16\n\t"
  14579. "mul r6, r11, r6\n\t"
  14580. "lsr r11, r6, #16\n\t"
  14581. "lsl r6, r6, #16\n\t"
  14582. "adds r10, r10, r6\n\t"
  14583. "adc r4, r4, r11\n\t"
  14584. "lsl r6, r8, #16\n\t"
  14585. "lsl r11, r7, #16\n\t"
  14586. "lsr r6, r6, #16\n\t"
  14587. "lsr r11, r11, #16\n\t"
  14588. "mul r11, r6, r11\n\t"
  14589. "adds r10, r10, r11\n\t"
  14590. "adc r4, r4, #0\n\t"
  14591. "lsr r11, r7, #16\n\t"
  14592. "mul r6, r11, r6\n\t"
  14593. "lsr r11, r6, #16\n\t"
  14594. "lsl r6, r6, #16\n\t"
  14595. "adds r10, r10, r6\n\t"
  14596. "adc r4, r4, r11\n\t"
  14597. #else
  14598. "umull r6, r7, r8, r7\n\t"
  14599. "adds r10, r10, r6\n\t"
  14600. "adc r4, r7, #0\n\t"
  14601. #endif
  14602. "adds r10, r10, r5\n\t"
  14603. "str r10, [%[a], #244]\n\t"
  14604. "adc r4, r4, #0\n\t"
  14605. /* a[i+62] += m[62] * mu */
  14606. "ldr r7, [%[m], #248]\n\t"
  14607. "ldr r10, [%[a], #248]\n\t"
  14608. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14609. "lsr r11, r7, #16\n\t"
  14610. "lsr r6, r8, #16\n\t"
  14611. "mul r5, r6, r11\n\t"
  14612. "lsl r11, r7, #16\n\t"
  14613. "lsr r11, r11, #16\n\t"
  14614. "mul r6, r11, r6\n\t"
  14615. "lsr r11, r6, #16\n\t"
  14616. "lsl r6, r6, #16\n\t"
  14617. "adds r10, r10, r6\n\t"
  14618. "adc r5, r5, r11\n\t"
  14619. "lsl r6, r8, #16\n\t"
  14620. "lsl r11, r7, #16\n\t"
  14621. "lsr r6, r6, #16\n\t"
  14622. "lsr r11, r11, #16\n\t"
  14623. "mul r11, r6, r11\n\t"
  14624. "adds r10, r10, r11\n\t"
  14625. "adc r5, r5, #0\n\t"
  14626. "lsr r11, r7, #16\n\t"
  14627. "mul r6, r11, r6\n\t"
  14628. "lsr r11, r6, #16\n\t"
  14629. "lsl r6, r6, #16\n\t"
  14630. "adds r10, r10, r6\n\t"
  14631. "adc r5, r5, r11\n\t"
  14632. #else
  14633. "umull r6, r7, r8, r7\n\t"
  14634. "adds r10, r10, r6\n\t"
  14635. "adc r5, r7, #0\n\t"
  14636. #endif
  14637. "adds r10, r10, r4\n\t"
  14638. "str r10, [%[a], #248]\n\t"
  14639. "adc r5, r5, #0\n\t"
  14640. /* a[i+63] += m[63] * mu */
  14641. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  14642. "ldr r7, [%[m], #252]\n\t"
  14643. #else
  14644. "ldr r11, [%[m], #252]\n\t"
  14645. #endif
  14646. "ldr r10, [%[a], #252]\n\t"
  14647. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  14648. "lsl r6, r8, #16\n\t"
  14649. "lsl r7, r11, #16\n\t"
  14650. "lsr r6, r6, #16\n\t"
  14651. "lsr r7, r7, #16\n\t"
  14652. "mul r7, r6, r7\n\t"
  14653. "adds r5, r5, r7\n\t"
  14654. "adcs r4, r3, #0\n\t"
  14655. "mov r3, #0\n\t"
  14656. "adc r3, r3, r3\n\t"
  14657. "lsr r7, r11, #16\n\t"
  14658. "mul r6, r7, r6\n\t"
  14659. "lsr r7, r6, #16\n\t"
  14660. "lsl r6, r6, #16\n\t"
  14661. "adds r5, r5, r6\n\t"
  14662. "adcs r4, r4, r7\n\t"
  14663. "adc r3, r3, #0\n\t"
  14664. "mov r6, r8\n\t"
  14665. "lsr r7, r11, #16\n\t"
  14666. "lsr r6, r6, #16\n\t"
  14667. "mul r7, r6, r7\n\t"
  14668. "adds r4, r4, r7\n\t"
  14669. "lsl r7, r11, #16\n\t"
  14670. "adc r3, r3, #0\n\t"
  14671. "lsr r7, r7, #16\n\t"
  14672. "mul r6, r7, r6\n\t"
  14673. "lsr r7, r6, #16\n\t"
  14674. "lsl r6, r6, #16\n\t"
  14675. "adds r5, r5, r6\n\t"
  14676. "adcs r4, r4, r7\n\t"
  14677. "adc r3, r3, #0\n\t"
  14678. #else
  14679. "umull r6, r7, r8, r7\n\t"
  14680. "adds r5, r5, r6\n\t"
  14681. "adcs r4, r7, r3\n\t"
  14682. "mov r3, #0\n\t"
  14683. "adc r3, r3, r3\n\t"
  14684. #endif
  14685. "adds r10, r10, r5\n\t"
  14686. "str r10, [%[a], #252]\n\t"
  14687. "ldr r10, [%[a], #256]\n\t"
  14688. "adcs r10, r10, r4\n\t"
  14689. "str r10, [%[a], #256]\n\t"
  14690. "adc r3, r3, #0\n\t"
  14691. /* i += 1 */
  14692. "add r9, r9, #4\n\t"
  14693. "add %[a], %[a], #4\n\t"
  14694. "cmp r9, #0x100\n\t"
  14695. "blt L_sp_2048_mont_reduce_64_word_%=\n\t"
  14696. "str r12, [%[a]]\n\t"
  14697. "str lr, [%[a], #4]\n\t"
  14698. "mov %[mp], r3\n\t"
  14699. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  14700. :
  14701. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  14702. );
  14703. sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp);
  14704. }
  14705. /* Multiply two Montgomery form numbers mod the modulus (prime).
  14706. * (r = a * b mod m)
  14707. *
  14708. * r Result of multiplication.
  14709. * a First number to multiply in Montgomery form.
  14710. * b Second number to multiply in Montgomery form.
  14711. * m Modulus (prime).
  14712. * mp Montgomery mulitplier.
  14713. */
  14714. SP_NOINLINE static void sp_2048_mont_mul_64(sp_digit* r, const sp_digit* a,
  14715. const sp_digit* b, const sp_digit* m, sp_digit mp)
  14716. {
  14717. sp_2048_mul_64(r, a, b);
  14718. sp_2048_mont_reduce_64(r, m, mp);
  14719. }
  14720. /* Square the Montgomery form number. (r = a * a mod m)
  14721. *
  14722. * r Result of squaring.
  14723. * a Number to square in Montgomery form.
  14724. * m Modulus (prime).
  14725. * mp Montgomery mulitplier.
  14726. */
  14727. SP_NOINLINE static void sp_2048_mont_sqr_64(sp_digit* r, const sp_digit* a,
  14728. const sp_digit* m, sp_digit mp)
  14729. {
  14730. sp_2048_sqr_64(r, a);
  14731. sp_2048_mont_reduce_64(r, m, mp);
  14732. }
  14733. #ifdef WOLFSSL_SP_SMALL
  14734. /* Sub b from a into r. (r = a - b)
  14735. *
  14736. * r A single precision integer.
  14737. * a A single precision integer.
  14738. * b A single precision integer.
  14739. */
  14740. static sp_digit sp_2048_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  14741. {
  14742. register sp_digit* r asm ("r0") = r_p;
  14743. register const sp_digit* a asm ("r1") = a_p;
  14744. register const sp_digit* b asm ("r2") = b_p;
  14745. __asm__ __volatile__ (
  14746. "mov r12, #0\n\t"
  14747. "add lr, %[a], #0x100\n\t"
  14748. "\n"
  14749. "L_sp_2048_sub_64_word_%=: \n\t"
  14750. "rsbs r12, r12, #0\n\t"
  14751. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14752. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14753. "sbcs r3, r3, r7\n\t"
  14754. "sbcs r4, r4, r8\n\t"
  14755. "sbcs r5, r5, r9\n\t"
  14756. "sbcs r6, r6, r10\n\t"
  14757. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14758. "sbc r12, r3, r3\n\t"
  14759. "cmp %[a], lr\n\t"
  14760. "bne L_sp_2048_sub_64_word_%=\n\t"
  14761. "mov %[r], r12\n\t"
  14762. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  14763. :
  14764. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr"
  14765. );
  14766. return (uint32_t)(size_t)r;
  14767. }
  14768. #else
  14769. /* Sub b from a into r. (r = a - b)
  14770. *
  14771. * r A single precision integer.
  14772. * a A single precision integer.
  14773. * b A single precision integer.
  14774. */
  14775. static sp_digit sp_2048_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  14776. {
  14777. register sp_digit* r asm ("r0") = r_p;
  14778. register const sp_digit* a asm ("r1") = a_p;
  14779. register const sp_digit* b asm ("r2") = b_p;
  14780. __asm__ __volatile__ (
  14781. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14782. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14783. "subs r3, r3, r7\n\t"
  14784. "sbcs r4, r4, r8\n\t"
  14785. "sbcs r5, r5, r9\n\t"
  14786. "sbcs r6, r6, r10\n\t"
  14787. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14788. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14789. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14790. "sbcs r3, r3, r7\n\t"
  14791. "sbcs r4, r4, r8\n\t"
  14792. "sbcs r5, r5, r9\n\t"
  14793. "sbcs r6, r6, r10\n\t"
  14794. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14795. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14796. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14797. "sbcs r3, r3, r7\n\t"
  14798. "sbcs r4, r4, r8\n\t"
  14799. "sbcs r5, r5, r9\n\t"
  14800. "sbcs r6, r6, r10\n\t"
  14801. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14802. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14803. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14804. "sbcs r3, r3, r7\n\t"
  14805. "sbcs r4, r4, r8\n\t"
  14806. "sbcs r5, r5, r9\n\t"
  14807. "sbcs r6, r6, r10\n\t"
  14808. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14809. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14810. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14811. "sbcs r3, r3, r7\n\t"
  14812. "sbcs r4, r4, r8\n\t"
  14813. "sbcs r5, r5, r9\n\t"
  14814. "sbcs r6, r6, r10\n\t"
  14815. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14816. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14817. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14818. "sbcs r3, r3, r7\n\t"
  14819. "sbcs r4, r4, r8\n\t"
  14820. "sbcs r5, r5, r9\n\t"
  14821. "sbcs r6, r6, r10\n\t"
  14822. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14823. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14824. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14825. "sbcs r3, r3, r7\n\t"
  14826. "sbcs r4, r4, r8\n\t"
  14827. "sbcs r5, r5, r9\n\t"
  14828. "sbcs r6, r6, r10\n\t"
  14829. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14830. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14831. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14832. "sbcs r3, r3, r7\n\t"
  14833. "sbcs r4, r4, r8\n\t"
  14834. "sbcs r5, r5, r9\n\t"
  14835. "sbcs r6, r6, r10\n\t"
  14836. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14837. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14838. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14839. "sbcs r3, r3, r7\n\t"
  14840. "sbcs r4, r4, r8\n\t"
  14841. "sbcs r5, r5, r9\n\t"
  14842. "sbcs r6, r6, r10\n\t"
  14843. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14844. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14845. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14846. "sbcs r3, r3, r7\n\t"
  14847. "sbcs r4, r4, r8\n\t"
  14848. "sbcs r5, r5, r9\n\t"
  14849. "sbcs r6, r6, r10\n\t"
  14850. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14851. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14852. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14853. "sbcs r3, r3, r7\n\t"
  14854. "sbcs r4, r4, r8\n\t"
  14855. "sbcs r5, r5, r9\n\t"
  14856. "sbcs r6, r6, r10\n\t"
  14857. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14858. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14859. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14860. "sbcs r3, r3, r7\n\t"
  14861. "sbcs r4, r4, r8\n\t"
  14862. "sbcs r5, r5, r9\n\t"
  14863. "sbcs r6, r6, r10\n\t"
  14864. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14865. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14866. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14867. "sbcs r3, r3, r7\n\t"
  14868. "sbcs r4, r4, r8\n\t"
  14869. "sbcs r5, r5, r9\n\t"
  14870. "sbcs r6, r6, r10\n\t"
  14871. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14872. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14873. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14874. "sbcs r3, r3, r7\n\t"
  14875. "sbcs r4, r4, r8\n\t"
  14876. "sbcs r5, r5, r9\n\t"
  14877. "sbcs r6, r6, r10\n\t"
  14878. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14879. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14880. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14881. "sbcs r3, r3, r7\n\t"
  14882. "sbcs r4, r4, r8\n\t"
  14883. "sbcs r5, r5, r9\n\t"
  14884. "sbcs r6, r6, r10\n\t"
  14885. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14886. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  14887. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  14888. "sbcs r3, r3, r7\n\t"
  14889. "sbcs r4, r4, r8\n\t"
  14890. "sbcs r5, r5, r9\n\t"
  14891. "sbcs r6, r6, r10\n\t"
  14892. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  14893. "sbc %[r], r6, r6\n\t"
  14894. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  14895. :
  14896. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  14897. );
  14898. return (uint32_t)(size_t)r;
  14899. }
  14900. #endif /* WOLFSSL_SP_SMALL */
  14901. #ifdef WOLFSSL_SP_USE_UDIV
  14902. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  14903. *
  14904. * d1 The high order half of the number to divide.
  14905. * d0 The low order half of the number to divide.
  14906. * div The divisor.
  14907. * returns the result of the division.
  14908. *
  14909. * Note that this is an approximate div. It may give an answer 1 larger.
  14910. */
  14911. static sp_digit div_2048_word_64(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  14912. {
  14913. register sp_digit d1 asm ("r0") = d1_p;
  14914. register sp_digit d0 asm ("r1") = d0_p;
  14915. register sp_digit div asm ("r2") = div_p;
  14916. __asm__ __volatile__ (
  14917. "lsr r6, %[div], #16\n\t"
  14918. "add lr, r6, #1\n\t"
  14919. "udiv r4, %[d1], lr\n\t"
  14920. "lsl r5, %[div], #16\n\t"
  14921. "lsl r4, r4, #16\n\t"
  14922. "umull r3, r12, %[div], r4\n\t"
  14923. "subs %[d0], %[d0], r3\n\t"
  14924. "sbc %[d1], %[d1], r12\n\t"
  14925. "subs r3, %[d1], lr\n\t"
  14926. "sbc r7, r7, r7\n\t"
  14927. "add r7, r7, #1\n\t"
  14928. "rsb r8, r7, #0\n\t"
  14929. "lsl r7, r7, #16\n\t"
  14930. "and r5, r5, r8\n\t"
  14931. "and r6, r6, r8\n\t"
  14932. "subs %[d0], %[d0], r5\n\t"
  14933. "add r4, r4, r7\n\t"
  14934. "sbc %[d1], %[d1], r6\n\t"
  14935. "lsl r12, %[d1], #16\n\t"
  14936. "lsr r3, %[d0], #16\n\t"
  14937. "orr r3, r3, r12\n\t"
  14938. "udiv r3, r3, lr\n\t"
  14939. "add r4, r4, r3\n\t"
  14940. "umull r3, r12, %[div], r3\n\t"
  14941. "subs %[d0], %[d0], r3\n\t"
  14942. "sbc %[d1], %[d1], r12\n\t"
  14943. "lsl r12, %[d1], #16\n\t"
  14944. "lsr r3, %[d0], #16\n\t"
  14945. "orr r3, r3, r12\n\t"
  14946. "udiv r3, r3, lr\n\t"
  14947. "add r4, r4, r3\n\t"
  14948. "mul r3, %[div], r3\n\t"
  14949. "sub %[d0], %[d0], r3\n\t"
  14950. "udiv r3, %[d0], %[div]\n\t"
  14951. "add %[d1], r4, r3\n\t"
  14952. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  14953. :
  14954. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  14955. );
  14956. return (uint32_t)(size_t)d1;
  14957. }
  14958. #else
  14959. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  14960. *
  14961. * d1 The high order half of the number to divide.
  14962. * d0 The low order half of the number to divide.
  14963. * div The divisor.
  14964. * returns the result of the division.
  14965. *
  14966. * Note that this is an approximate div. It may give an answer 1 larger.
  14967. */
  14968. static sp_digit div_2048_word_64(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  14969. {
  14970. register sp_digit d1 asm ("r0") = d1_p;
  14971. register sp_digit d0 asm ("r1") = d0_p;
  14972. register sp_digit div asm ("r2") = div_p;
  14973. __asm__ __volatile__ (
  14974. "lsr lr, %[div], #1\n\t"
  14975. "add lr, lr, #1\n\t"
  14976. "mov r4, %[d0]\n\t"
  14977. "mov r5, %[d1]\n\t"
  14978. /* Do top 32 */
  14979. "subs r6, lr, r5\n\t"
  14980. "sbc r6, r6, r6\n\t"
  14981. "mov r3, #0\n\t"
  14982. "sub r3, r3, r6\n\t"
  14983. "and r6, r6, lr\n\t"
  14984. "subs r5, r5, r6\n\t"
  14985. /* Next 30 bits */
  14986. "mov r12, #29\n\t"
  14987. "\n"
  14988. "L_div_2048_word_64_bit_%=: \n\t"
  14989. "lsls r4, r4, #1\n\t"
  14990. "adc r5, r5, r5\n\t"
  14991. "subs r6, lr, r5\n\t"
  14992. "sbc r6, r6, r6\n\t"
  14993. "add r3, r3, r3\n\t"
  14994. "sub r3, r3, r6\n\t"
  14995. "and r6, r6, lr\n\t"
  14996. "subs r5, r5, r6\n\t"
  14997. "subs r12, r12, #1\n\t"
  14998. "bpl L_div_2048_word_64_bit_%=\n\t"
  14999. "add r3, r3, r3\n\t"
  15000. "add r3, r3, #1\n\t"
  15001. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  15002. "lsl r7, r3, #16\n\t"
  15003. "lsl r4, %[div], #16\n\t"
  15004. "lsr r7, r7, #16\n\t"
  15005. "lsr r4, r4, #16\n\t"
  15006. "mul r4, r7, r4\n\t"
  15007. "lsr r8, %[div], #16\n\t"
  15008. "mul r7, r8, r7\n\t"
  15009. "lsr r5, r7, #16\n\t"
  15010. "lsl r7, r7, #16\n\t"
  15011. "adds r4, r4, r7\n\t"
  15012. "adc r5, r5, #0\n\t"
  15013. "lsr r7, r3, #16\n\t"
  15014. "mul r8, r7, r8\n\t"
  15015. "add r5, r5, r8\n\t"
  15016. "lsl r8, %[div], #16\n\t"
  15017. "lsr r8, r8, #16\n\t"
  15018. "mul r7, r8, r7\n\t"
  15019. "lsr r8, r7, #16\n\t"
  15020. "lsl r7, r7, #16\n\t"
  15021. "adds r4, r4, r7\n\t"
  15022. "adc r5, r5, r8\n\t"
  15023. #else
  15024. "umull r4, r5, r3, %[div]\n\t"
  15025. #endif
  15026. "subs r7, %[d0], r4\n\t"
  15027. "sbc r8, %[d1], r5\n\t"
  15028. "add r3, r3, r8\n\t"
  15029. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  15030. "lsl r7, r3, #16\n\t"
  15031. "lsl r4, %[div], #16\n\t"
  15032. "lsr r7, r7, #16\n\t"
  15033. "lsr r4, r4, #16\n\t"
  15034. "mul r4, r7, r4\n\t"
  15035. "lsr r8, %[div], #16\n\t"
  15036. "mul r7, r8, r7\n\t"
  15037. "lsr r5, r7, #16\n\t"
  15038. "lsl r7, r7, #16\n\t"
  15039. "adds r4, r4, r7\n\t"
  15040. "adc r5, r5, #0\n\t"
  15041. "lsr r7, r3, #16\n\t"
  15042. "mul r8, r7, r8\n\t"
  15043. "add r5, r5, r8\n\t"
  15044. "lsl r8, %[div], #16\n\t"
  15045. "lsr r8, r8, #16\n\t"
  15046. "mul r7, r8, r7\n\t"
  15047. "lsr r8, r7, #16\n\t"
  15048. "lsl r7, r7, #16\n\t"
  15049. "adds r4, r4, r7\n\t"
  15050. "adc r5, r5, r8\n\t"
  15051. #else
  15052. "umull r4, r5, r3, %[div]\n\t"
  15053. #endif
  15054. "subs r7, %[d0], r4\n\t"
  15055. "sbc r8, %[d1], r5\n\t"
  15056. "add r3, r3, r8\n\t"
  15057. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  15058. "lsl r7, r3, #16\n\t"
  15059. "lsl r4, %[div], #16\n\t"
  15060. "lsr r7, r7, #16\n\t"
  15061. "lsr r4, r4, #16\n\t"
  15062. "mul r4, r7, r4\n\t"
  15063. "lsr r8, %[div], #16\n\t"
  15064. "mul r7, r8, r7\n\t"
  15065. "lsr r5, r7, #16\n\t"
  15066. "lsl r7, r7, #16\n\t"
  15067. "adds r4, r4, r7\n\t"
  15068. "adc r5, r5, #0\n\t"
  15069. "lsr r7, r3, #16\n\t"
  15070. "mul r8, r7, r8\n\t"
  15071. "add r5, r5, r8\n\t"
  15072. "lsl r8, %[div], #16\n\t"
  15073. "lsr r8, r8, #16\n\t"
  15074. "mul r7, r8, r7\n\t"
  15075. "lsr r8, r7, #16\n\t"
  15076. "lsl r7, r7, #16\n\t"
  15077. "adds r4, r4, r7\n\t"
  15078. "adc r5, r5, r8\n\t"
  15079. #else
  15080. "umull r4, r5, r3, %[div]\n\t"
  15081. #endif
  15082. "subs r7, %[d0], r4\n\t"
  15083. "sbc r8, %[d1], r5\n\t"
  15084. "add r3, r3, r8\n\t"
  15085. "subs r6, %[div], r7\n\t"
  15086. "sbc r6, r6, r6\n\t"
  15087. "sub %[d1], r3, r6\n\t"
  15088. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  15089. :
  15090. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  15091. );
  15092. return (uint32_t)(size_t)d1;
  15093. }
  15094. #endif
  15095. /* Divide d in a and put remainder into r (m*d + r = a)
  15096. * m is not calculated as it is not needed at this time.
  15097. *
  15098. * a Number to be divided.
  15099. * d Number to divide with.
  15100. * m Multiplier result.
  15101. * r Remainder from the division.
  15102. * returns MP_OKAY indicating success.
  15103. */
  15104. static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
  15105. sp_digit* r)
  15106. {
  15107. sp_digit t1[128], t2[65];
  15108. sp_digit div, r1;
  15109. int i;
  15110. (void)m;
  15111. div = d[63];
  15112. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  15113. for (i = 63; i > 0; i--) {
  15114. if (t1[i + 64] != d[i])
  15115. break;
  15116. }
  15117. if (t1[i + 64] >= d[i]) {
  15118. sp_2048_sub_in_place_64(&t1[64], d);
  15119. }
  15120. for (i = 63; i >= 0; i--) {
  15121. if (t1[64 + i] == div) {
  15122. r1 = SP_DIGIT_MAX;
  15123. }
  15124. else {
  15125. r1 = div_2048_word_64(t1[64 + i], t1[64 + i - 1], div);
  15126. }
  15127. sp_2048_mul_d_64(t2, d, r1);
  15128. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  15129. t1[64 + i] -= t2[64];
  15130. if (t1[64 + i] != 0) {
  15131. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  15132. if (t1[64 + i] != 0)
  15133. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  15134. }
  15135. }
  15136. for (i = 63; i > 0; i--) {
  15137. if (t1[i] != d[i])
  15138. break;
  15139. }
  15140. if (t1[i] >= d[i]) {
  15141. sp_2048_sub_64(r, t1, d);
  15142. }
  15143. else {
  15144. XMEMCPY(r, t1, sizeof(*t1) * 64);
  15145. }
  15146. return MP_OKAY;
  15147. }
  15148. /* Reduce a modulo m into r. (r = a mod m)
  15149. *
  15150. * r A single precision number that is the reduced result.
  15151. * a A single precision number that is to be reduced.
  15152. * m A single precision number that is the modulus to reduce with.
  15153. * returns MP_OKAY indicating success.
  15154. */
  15155. static WC_INLINE int sp_2048_mod_64_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  15156. {
  15157. return sp_2048_div_64_cond(a, m, NULL, r);
  15158. }
  15159. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  15160. #if defined(WOLFSSL_HAVE_SP_DH) || !defined(WOLFSSL_RSA_PUBLIC_ONLY)
  15161. /* AND m into each word of a and store in r.
  15162. *
  15163. * r A single precision integer.
  15164. * a A single precision integer.
  15165. * m Mask to AND against each digit.
  15166. */
  15167. static void sp_2048_mask_64(sp_digit* r, const sp_digit* a, sp_digit m)
  15168. {
  15169. #ifdef WOLFSSL_SP_SMALL
  15170. int i;
  15171. for (i=0; i<64; i++) {
  15172. r[i] = a[i] & m;
  15173. }
  15174. #else
  15175. int i;
  15176. for (i = 0; i < 64; i += 8) {
  15177. r[i+0] = a[i+0] & m;
  15178. r[i+1] = a[i+1] & m;
  15179. r[i+2] = a[i+2] & m;
  15180. r[i+3] = a[i+3] & m;
  15181. r[i+4] = a[i+4] & m;
  15182. r[i+5] = a[i+5] & m;
  15183. r[i+6] = a[i+6] & m;
  15184. r[i+7] = a[i+7] & m;
  15185. }
  15186. #endif
  15187. }
  15188. /* Compare a with b in constant time.
  15189. *
  15190. * a A single precision integer.
  15191. * b A single precision integer.
  15192. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  15193. * respectively.
  15194. */
  15195. static sp_int32 sp_2048_cmp_64(const sp_digit* a_p, const sp_digit* b_p)
  15196. {
  15197. register const sp_digit* a asm ("r0") = a_p;
  15198. register const sp_digit* b asm ("r1") = b_p;
  15199. __asm__ __volatile__ (
  15200. "mov r2, #-1\n\t"
  15201. "mov r6, #1\n\t"
  15202. "mov r5, #0\n\t"
  15203. "mov r3, #-1\n\t"
  15204. #ifdef WOLFSSL_SP_SMALL
  15205. "mov r4, #0xfc\n\t"
  15206. "\n"
  15207. "L_sp_2048_cmp_64_words_%=: \n\t"
  15208. "ldr r12, [%[a], r4]\n\t"
  15209. "ldr lr, [%[b], r4]\n\t"
  15210. "and r12, r12, r3\n\t"
  15211. "and lr, lr, r3\n\t"
  15212. "subs r12, r12, lr\n\t"
  15213. "it hi\n\t"
  15214. "movhi r2, r6\n\t"
  15215. "it lo\n\t"
  15216. "movlo r2, r3\n\t"
  15217. "it ne\n\t"
  15218. "movne r3, r5\n\t"
  15219. "subs r4, r4, #4\n\t"
  15220. "bcs L_sp_2048_cmp_64_words_%=\n\t"
  15221. "eor r2, r2, r3\n\t"
  15222. #else
  15223. "ldr r12, [%[a], #252]\n\t"
  15224. "ldr lr, [%[b], #252]\n\t"
  15225. "and r12, r12, r3\n\t"
  15226. "and lr, lr, r3\n\t"
  15227. "subs r12, r12, lr\n\t"
  15228. "it hi\n\t"
  15229. "movhi r2, r6\n\t"
  15230. "it lo\n\t"
  15231. "movlo r2, r3\n\t"
  15232. "it ne\n\t"
  15233. "movne r3, r5\n\t"
  15234. "ldr r12, [%[a], #248]\n\t"
  15235. "ldr lr, [%[b], #248]\n\t"
  15236. "and r12, r12, r3\n\t"
  15237. "and lr, lr, r3\n\t"
  15238. "subs r12, r12, lr\n\t"
  15239. "it hi\n\t"
  15240. "movhi r2, r6\n\t"
  15241. "it lo\n\t"
  15242. "movlo r2, r3\n\t"
  15243. "it ne\n\t"
  15244. "movne r3, r5\n\t"
  15245. "ldr r12, [%[a], #244]\n\t"
  15246. "ldr lr, [%[b], #244]\n\t"
  15247. "and r12, r12, r3\n\t"
  15248. "and lr, lr, r3\n\t"
  15249. "subs r12, r12, lr\n\t"
  15250. "it hi\n\t"
  15251. "movhi r2, r6\n\t"
  15252. "it lo\n\t"
  15253. "movlo r2, r3\n\t"
  15254. "it ne\n\t"
  15255. "movne r3, r5\n\t"
  15256. "ldr r12, [%[a], #240]\n\t"
  15257. "ldr lr, [%[b], #240]\n\t"
  15258. "and r12, r12, r3\n\t"
  15259. "and lr, lr, r3\n\t"
  15260. "subs r12, r12, lr\n\t"
  15261. "it hi\n\t"
  15262. "movhi r2, r6\n\t"
  15263. "it lo\n\t"
  15264. "movlo r2, r3\n\t"
  15265. "it ne\n\t"
  15266. "movne r3, r5\n\t"
  15267. "ldr r12, [%[a], #236]\n\t"
  15268. "ldr lr, [%[b], #236]\n\t"
  15269. "and r12, r12, r3\n\t"
  15270. "and lr, lr, r3\n\t"
  15271. "subs r12, r12, lr\n\t"
  15272. "it hi\n\t"
  15273. "movhi r2, r6\n\t"
  15274. "it lo\n\t"
  15275. "movlo r2, r3\n\t"
  15276. "it ne\n\t"
  15277. "movne r3, r5\n\t"
  15278. "ldr r12, [%[a], #232]\n\t"
  15279. "ldr lr, [%[b], #232]\n\t"
  15280. "and r12, r12, r3\n\t"
  15281. "and lr, lr, r3\n\t"
  15282. "subs r12, r12, lr\n\t"
  15283. "it hi\n\t"
  15284. "movhi r2, r6\n\t"
  15285. "it lo\n\t"
  15286. "movlo r2, r3\n\t"
  15287. "it ne\n\t"
  15288. "movne r3, r5\n\t"
  15289. "ldr r12, [%[a], #228]\n\t"
  15290. "ldr lr, [%[b], #228]\n\t"
  15291. "and r12, r12, r3\n\t"
  15292. "and lr, lr, r3\n\t"
  15293. "subs r12, r12, lr\n\t"
  15294. "it hi\n\t"
  15295. "movhi r2, r6\n\t"
  15296. "it lo\n\t"
  15297. "movlo r2, r3\n\t"
  15298. "it ne\n\t"
  15299. "movne r3, r5\n\t"
  15300. "ldr r12, [%[a], #224]\n\t"
  15301. "ldr lr, [%[b], #224]\n\t"
  15302. "and r12, r12, r3\n\t"
  15303. "and lr, lr, r3\n\t"
  15304. "subs r12, r12, lr\n\t"
  15305. "it hi\n\t"
  15306. "movhi r2, r6\n\t"
  15307. "it lo\n\t"
  15308. "movlo r2, r3\n\t"
  15309. "it ne\n\t"
  15310. "movne r3, r5\n\t"
  15311. "ldr r12, [%[a], #220]\n\t"
  15312. "ldr lr, [%[b], #220]\n\t"
  15313. "and r12, r12, r3\n\t"
  15314. "and lr, lr, r3\n\t"
  15315. "subs r12, r12, lr\n\t"
  15316. "it hi\n\t"
  15317. "movhi r2, r6\n\t"
  15318. "it lo\n\t"
  15319. "movlo r2, r3\n\t"
  15320. "it ne\n\t"
  15321. "movne r3, r5\n\t"
  15322. "ldr r12, [%[a], #216]\n\t"
  15323. "ldr lr, [%[b], #216]\n\t"
  15324. "and r12, r12, r3\n\t"
  15325. "and lr, lr, r3\n\t"
  15326. "subs r12, r12, lr\n\t"
  15327. "it hi\n\t"
  15328. "movhi r2, r6\n\t"
  15329. "it lo\n\t"
  15330. "movlo r2, r3\n\t"
  15331. "it ne\n\t"
  15332. "movne r3, r5\n\t"
  15333. "ldr r12, [%[a], #212]\n\t"
  15334. "ldr lr, [%[b], #212]\n\t"
  15335. "and r12, r12, r3\n\t"
  15336. "and lr, lr, r3\n\t"
  15337. "subs r12, r12, lr\n\t"
  15338. "it hi\n\t"
  15339. "movhi r2, r6\n\t"
  15340. "it lo\n\t"
  15341. "movlo r2, r3\n\t"
  15342. "it ne\n\t"
  15343. "movne r3, r5\n\t"
  15344. "ldr r12, [%[a], #208]\n\t"
  15345. "ldr lr, [%[b], #208]\n\t"
  15346. "and r12, r12, r3\n\t"
  15347. "and lr, lr, r3\n\t"
  15348. "subs r12, r12, lr\n\t"
  15349. "it hi\n\t"
  15350. "movhi r2, r6\n\t"
  15351. "it lo\n\t"
  15352. "movlo r2, r3\n\t"
  15353. "it ne\n\t"
  15354. "movne r3, r5\n\t"
  15355. "ldr r12, [%[a], #204]\n\t"
  15356. "ldr lr, [%[b], #204]\n\t"
  15357. "and r12, r12, r3\n\t"
  15358. "and lr, lr, r3\n\t"
  15359. "subs r12, r12, lr\n\t"
  15360. "it hi\n\t"
  15361. "movhi r2, r6\n\t"
  15362. "it lo\n\t"
  15363. "movlo r2, r3\n\t"
  15364. "it ne\n\t"
  15365. "movne r3, r5\n\t"
  15366. "ldr r12, [%[a], #200]\n\t"
  15367. "ldr lr, [%[b], #200]\n\t"
  15368. "and r12, r12, r3\n\t"
  15369. "and lr, lr, r3\n\t"
  15370. "subs r12, r12, lr\n\t"
  15371. "it hi\n\t"
  15372. "movhi r2, r6\n\t"
  15373. "it lo\n\t"
  15374. "movlo r2, r3\n\t"
  15375. "it ne\n\t"
  15376. "movne r3, r5\n\t"
  15377. "ldr r12, [%[a], #196]\n\t"
  15378. "ldr lr, [%[b], #196]\n\t"
  15379. "and r12, r12, r3\n\t"
  15380. "and lr, lr, r3\n\t"
  15381. "subs r12, r12, lr\n\t"
  15382. "it hi\n\t"
  15383. "movhi r2, r6\n\t"
  15384. "it lo\n\t"
  15385. "movlo r2, r3\n\t"
  15386. "it ne\n\t"
  15387. "movne r3, r5\n\t"
  15388. "ldr r12, [%[a], #192]\n\t"
  15389. "ldr lr, [%[b], #192]\n\t"
  15390. "and r12, r12, r3\n\t"
  15391. "and lr, lr, r3\n\t"
  15392. "subs r12, r12, lr\n\t"
  15393. "it hi\n\t"
  15394. "movhi r2, r6\n\t"
  15395. "it lo\n\t"
  15396. "movlo r2, r3\n\t"
  15397. "it ne\n\t"
  15398. "movne r3, r5\n\t"
  15399. "ldr r12, [%[a], #188]\n\t"
  15400. "ldr lr, [%[b], #188]\n\t"
  15401. "and r12, r12, r3\n\t"
  15402. "and lr, lr, r3\n\t"
  15403. "subs r12, r12, lr\n\t"
  15404. "it hi\n\t"
  15405. "movhi r2, r6\n\t"
  15406. "it lo\n\t"
  15407. "movlo r2, r3\n\t"
  15408. "it ne\n\t"
  15409. "movne r3, r5\n\t"
  15410. "ldr r12, [%[a], #184]\n\t"
  15411. "ldr lr, [%[b], #184]\n\t"
  15412. "and r12, r12, r3\n\t"
  15413. "and lr, lr, r3\n\t"
  15414. "subs r12, r12, lr\n\t"
  15415. "it hi\n\t"
  15416. "movhi r2, r6\n\t"
  15417. "it lo\n\t"
  15418. "movlo r2, r3\n\t"
  15419. "it ne\n\t"
  15420. "movne r3, r5\n\t"
  15421. "ldr r12, [%[a], #180]\n\t"
  15422. "ldr lr, [%[b], #180]\n\t"
  15423. "and r12, r12, r3\n\t"
  15424. "and lr, lr, r3\n\t"
  15425. "subs r12, r12, lr\n\t"
  15426. "it hi\n\t"
  15427. "movhi r2, r6\n\t"
  15428. "it lo\n\t"
  15429. "movlo r2, r3\n\t"
  15430. "it ne\n\t"
  15431. "movne r3, r5\n\t"
  15432. "ldr r12, [%[a], #176]\n\t"
  15433. "ldr lr, [%[b], #176]\n\t"
  15434. "and r12, r12, r3\n\t"
  15435. "and lr, lr, r3\n\t"
  15436. "subs r12, r12, lr\n\t"
  15437. "it hi\n\t"
  15438. "movhi r2, r6\n\t"
  15439. "it lo\n\t"
  15440. "movlo r2, r3\n\t"
  15441. "it ne\n\t"
  15442. "movne r3, r5\n\t"
  15443. "ldr r12, [%[a], #172]\n\t"
  15444. "ldr lr, [%[b], #172]\n\t"
  15445. "and r12, r12, r3\n\t"
  15446. "and lr, lr, r3\n\t"
  15447. "subs r12, r12, lr\n\t"
  15448. "it hi\n\t"
  15449. "movhi r2, r6\n\t"
  15450. "it lo\n\t"
  15451. "movlo r2, r3\n\t"
  15452. "it ne\n\t"
  15453. "movne r3, r5\n\t"
  15454. "ldr r12, [%[a], #168]\n\t"
  15455. "ldr lr, [%[b], #168]\n\t"
  15456. "and r12, r12, r3\n\t"
  15457. "and lr, lr, r3\n\t"
  15458. "subs r12, r12, lr\n\t"
  15459. "it hi\n\t"
  15460. "movhi r2, r6\n\t"
  15461. "it lo\n\t"
  15462. "movlo r2, r3\n\t"
  15463. "it ne\n\t"
  15464. "movne r3, r5\n\t"
  15465. "ldr r12, [%[a], #164]\n\t"
  15466. "ldr lr, [%[b], #164]\n\t"
  15467. "and r12, r12, r3\n\t"
  15468. "and lr, lr, r3\n\t"
  15469. "subs r12, r12, lr\n\t"
  15470. "it hi\n\t"
  15471. "movhi r2, r6\n\t"
  15472. "it lo\n\t"
  15473. "movlo r2, r3\n\t"
  15474. "it ne\n\t"
  15475. "movne r3, r5\n\t"
  15476. "ldr r12, [%[a], #160]\n\t"
  15477. "ldr lr, [%[b], #160]\n\t"
  15478. "and r12, r12, r3\n\t"
  15479. "and lr, lr, r3\n\t"
  15480. "subs r12, r12, lr\n\t"
  15481. "it hi\n\t"
  15482. "movhi r2, r6\n\t"
  15483. "it lo\n\t"
  15484. "movlo r2, r3\n\t"
  15485. "it ne\n\t"
  15486. "movne r3, r5\n\t"
  15487. "ldr r12, [%[a], #156]\n\t"
  15488. "ldr lr, [%[b], #156]\n\t"
  15489. "and r12, r12, r3\n\t"
  15490. "and lr, lr, r3\n\t"
  15491. "subs r12, r12, lr\n\t"
  15492. "it hi\n\t"
  15493. "movhi r2, r6\n\t"
  15494. "it lo\n\t"
  15495. "movlo r2, r3\n\t"
  15496. "it ne\n\t"
  15497. "movne r3, r5\n\t"
  15498. "ldr r12, [%[a], #152]\n\t"
  15499. "ldr lr, [%[b], #152]\n\t"
  15500. "and r12, r12, r3\n\t"
  15501. "and lr, lr, r3\n\t"
  15502. "subs r12, r12, lr\n\t"
  15503. "it hi\n\t"
  15504. "movhi r2, r6\n\t"
  15505. "it lo\n\t"
  15506. "movlo r2, r3\n\t"
  15507. "it ne\n\t"
  15508. "movne r3, r5\n\t"
  15509. "ldr r12, [%[a], #148]\n\t"
  15510. "ldr lr, [%[b], #148]\n\t"
  15511. "and r12, r12, r3\n\t"
  15512. "and lr, lr, r3\n\t"
  15513. "subs r12, r12, lr\n\t"
  15514. "it hi\n\t"
  15515. "movhi r2, r6\n\t"
  15516. "it lo\n\t"
  15517. "movlo r2, r3\n\t"
  15518. "it ne\n\t"
  15519. "movne r3, r5\n\t"
  15520. "ldr r12, [%[a], #144]\n\t"
  15521. "ldr lr, [%[b], #144]\n\t"
  15522. "and r12, r12, r3\n\t"
  15523. "and lr, lr, r3\n\t"
  15524. "subs r12, r12, lr\n\t"
  15525. "it hi\n\t"
  15526. "movhi r2, r6\n\t"
  15527. "it lo\n\t"
  15528. "movlo r2, r3\n\t"
  15529. "it ne\n\t"
  15530. "movne r3, r5\n\t"
  15531. "ldr r12, [%[a], #140]\n\t"
  15532. "ldr lr, [%[b], #140]\n\t"
  15533. "and r12, r12, r3\n\t"
  15534. "and lr, lr, r3\n\t"
  15535. "subs r12, r12, lr\n\t"
  15536. "it hi\n\t"
  15537. "movhi r2, r6\n\t"
  15538. "it lo\n\t"
  15539. "movlo r2, r3\n\t"
  15540. "it ne\n\t"
  15541. "movne r3, r5\n\t"
  15542. "ldr r12, [%[a], #136]\n\t"
  15543. "ldr lr, [%[b], #136]\n\t"
  15544. "and r12, r12, r3\n\t"
  15545. "and lr, lr, r3\n\t"
  15546. "subs r12, r12, lr\n\t"
  15547. "it hi\n\t"
  15548. "movhi r2, r6\n\t"
  15549. "it lo\n\t"
  15550. "movlo r2, r3\n\t"
  15551. "it ne\n\t"
  15552. "movne r3, r5\n\t"
  15553. "ldr r12, [%[a], #132]\n\t"
  15554. "ldr lr, [%[b], #132]\n\t"
  15555. "and r12, r12, r3\n\t"
  15556. "and lr, lr, r3\n\t"
  15557. "subs r12, r12, lr\n\t"
  15558. "it hi\n\t"
  15559. "movhi r2, r6\n\t"
  15560. "it lo\n\t"
  15561. "movlo r2, r3\n\t"
  15562. "it ne\n\t"
  15563. "movne r3, r5\n\t"
  15564. "ldr r12, [%[a], #128]\n\t"
  15565. "ldr lr, [%[b], #128]\n\t"
  15566. "and r12, r12, r3\n\t"
  15567. "and lr, lr, r3\n\t"
  15568. "subs r12, r12, lr\n\t"
  15569. "it hi\n\t"
  15570. "movhi r2, r6\n\t"
  15571. "it lo\n\t"
  15572. "movlo r2, r3\n\t"
  15573. "it ne\n\t"
  15574. "movne r3, r5\n\t"
  15575. "ldr r12, [%[a], #124]\n\t"
  15576. "ldr lr, [%[b], #124]\n\t"
  15577. "and r12, r12, r3\n\t"
  15578. "and lr, lr, r3\n\t"
  15579. "subs r12, r12, lr\n\t"
  15580. "it hi\n\t"
  15581. "movhi r2, r6\n\t"
  15582. "it lo\n\t"
  15583. "movlo r2, r3\n\t"
  15584. "it ne\n\t"
  15585. "movne r3, r5\n\t"
  15586. "ldr r12, [%[a], #120]\n\t"
  15587. "ldr lr, [%[b], #120]\n\t"
  15588. "and r12, r12, r3\n\t"
  15589. "and lr, lr, r3\n\t"
  15590. "subs r12, r12, lr\n\t"
  15591. "it hi\n\t"
  15592. "movhi r2, r6\n\t"
  15593. "it lo\n\t"
  15594. "movlo r2, r3\n\t"
  15595. "it ne\n\t"
  15596. "movne r3, r5\n\t"
  15597. "ldr r12, [%[a], #116]\n\t"
  15598. "ldr lr, [%[b], #116]\n\t"
  15599. "and r12, r12, r3\n\t"
  15600. "and lr, lr, r3\n\t"
  15601. "subs r12, r12, lr\n\t"
  15602. "it hi\n\t"
  15603. "movhi r2, r6\n\t"
  15604. "it lo\n\t"
  15605. "movlo r2, r3\n\t"
  15606. "it ne\n\t"
  15607. "movne r3, r5\n\t"
  15608. "ldr r12, [%[a], #112]\n\t"
  15609. "ldr lr, [%[b], #112]\n\t"
  15610. "and r12, r12, r3\n\t"
  15611. "and lr, lr, r3\n\t"
  15612. "subs r12, r12, lr\n\t"
  15613. "it hi\n\t"
  15614. "movhi r2, r6\n\t"
  15615. "it lo\n\t"
  15616. "movlo r2, r3\n\t"
  15617. "it ne\n\t"
  15618. "movne r3, r5\n\t"
  15619. "ldr r12, [%[a], #108]\n\t"
  15620. "ldr lr, [%[b], #108]\n\t"
  15621. "and r12, r12, r3\n\t"
  15622. "and lr, lr, r3\n\t"
  15623. "subs r12, r12, lr\n\t"
  15624. "it hi\n\t"
  15625. "movhi r2, r6\n\t"
  15626. "it lo\n\t"
  15627. "movlo r2, r3\n\t"
  15628. "it ne\n\t"
  15629. "movne r3, r5\n\t"
  15630. "ldr r12, [%[a], #104]\n\t"
  15631. "ldr lr, [%[b], #104]\n\t"
  15632. "and r12, r12, r3\n\t"
  15633. "and lr, lr, r3\n\t"
  15634. "subs r12, r12, lr\n\t"
  15635. "it hi\n\t"
  15636. "movhi r2, r6\n\t"
  15637. "it lo\n\t"
  15638. "movlo r2, r3\n\t"
  15639. "it ne\n\t"
  15640. "movne r3, r5\n\t"
  15641. "ldr r12, [%[a], #100]\n\t"
  15642. "ldr lr, [%[b], #100]\n\t"
  15643. "and r12, r12, r3\n\t"
  15644. "and lr, lr, r3\n\t"
  15645. "subs r12, r12, lr\n\t"
  15646. "it hi\n\t"
  15647. "movhi r2, r6\n\t"
  15648. "it lo\n\t"
  15649. "movlo r2, r3\n\t"
  15650. "it ne\n\t"
  15651. "movne r3, r5\n\t"
  15652. "ldr r12, [%[a], #96]\n\t"
  15653. "ldr lr, [%[b], #96]\n\t"
  15654. "and r12, r12, r3\n\t"
  15655. "and lr, lr, r3\n\t"
  15656. "subs r12, r12, lr\n\t"
  15657. "it hi\n\t"
  15658. "movhi r2, r6\n\t"
  15659. "it lo\n\t"
  15660. "movlo r2, r3\n\t"
  15661. "it ne\n\t"
  15662. "movne r3, r5\n\t"
  15663. "ldr r12, [%[a], #92]\n\t"
  15664. "ldr lr, [%[b], #92]\n\t"
  15665. "and r12, r12, r3\n\t"
  15666. "and lr, lr, r3\n\t"
  15667. "subs r12, r12, lr\n\t"
  15668. "it hi\n\t"
  15669. "movhi r2, r6\n\t"
  15670. "it lo\n\t"
  15671. "movlo r2, r3\n\t"
  15672. "it ne\n\t"
  15673. "movne r3, r5\n\t"
  15674. "ldr r12, [%[a], #88]\n\t"
  15675. "ldr lr, [%[b], #88]\n\t"
  15676. "and r12, r12, r3\n\t"
  15677. "and lr, lr, r3\n\t"
  15678. "subs r12, r12, lr\n\t"
  15679. "it hi\n\t"
  15680. "movhi r2, r6\n\t"
  15681. "it lo\n\t"
  15682. "movlo r2, r3\n\t"
  15683. "it ne\n\t"
  15684. "movne r3, r5\n\t"
  15685. "ldr r12, [%[a], #84]\n\t"
  15686. "ldr lr, [%[b], #84]\n\t"
  15687. "and r12, r12, r3\n\t"
  15688. "and lr, lr, r3\n\t"
  15689. "subs r12, r12, lr\n\t"
  15690. "it hi\n\t"
  15691. "movhi r2, r6\n\t"
  15692. "it lo\n\t"
  15693. "movlo r2, r3\n\t"
  15694. "it ne\n\t"
  15695. "movne r3, r5\n\t"
  15696. "ldr r12, [%[a], #80]\n\t"
  15697. "ldr lr, [%[b], #80]\n\t"
  15698. "and r12, r12, r3\n\t"
  15699. "and lr, lr, r3\n\t"
  15700. "subs r12, r12, lr\n\t"
  15701. "it hi\n\t"
  15702. "movhi r2, r6\n\t"
  15703. "it lo\n\t"
  15704. "movlo r2, r3\n\t"
  15705. "it ne\n\t"
  15706. "movne r3, r5\n\t"
  15707. "ldr r12, [%[a], #76]\n\t"
  15708. "ldr lr, [%[b], #76]\n\t"
  15709. "and r12, r12, r3\n\t"
  15710. "and lr, lr, r3\n\t"
  15711. "subs r12, r12, lr\n\t"
  15712. "it hi\n\t"
  15713. "movhi r2, r6\n\t"
  15714. "it lo\n\t"
  15715. "movlo r2, r3\n\t"
  15716. "it ne\n\t"
  15717. "movne r3, r5\n\t"
  15718. "ldr r12, [%[a], #72]\n\t"
  15719. "ldr lr, [%[b], #72]\n\t"
  15720. "and r12, r12, r3\n\t"
  15721. "and lr, lr, r3\n\t"
  15722. "subs r12, r12, lr\n\t"
  15723. "it hi\n\t"
  15724. "movhi r2, r6\n\t"
  15725. "it lo\n\t"
  15726. "movlo r2, r3\n\t"
  15727. "it ne\n\t"
  15728. "movne r3, r5\n\t"
  15729. "ldr r12, [%[a], #68]\n\t"
  15730. "ldr lr, [%[b], #68]\n\t"
  15731. "and r12, r12, r3\n\t"
  15732. "and lr, lr, r3\n\t"
  15733. "subs r12, r12, lr\n\t"
  15734. "it hi\n\t"
  15735. "movhi r2, r6\n\t"
  15736. "it lo\n\t"
  15737. "movlo r2, r3\n\t"
  15738. "it ne\n\t"
  15739. "movne r3, r5\n\t"
  15740. "ldr r12, [%[a], #64]\n\t"
  15741. "ldr lr, [%[b], #64]\n\t"
  15742. "and r12, r12, r3\n\t"
  15743. "and lr, lr, r3\n\t"
  15744. "subs r12, r12, lr\n\t"
  15745. "it hi\n\t"
  15746. "movhi r2, r6\n\t"
  15747. "it lo\n\t"
  15748. "movlo r2, r3\n\t"
  15749. "it ne\n\t"
  15750. "movne r3, r5\n\t"
  15751. "ldr r12, [%[a], #60]\n\t"
  15752. "ldr lr, [%[b], #60]\n\t"
  15753. "and r12, r12, r3\n\t"
  15754. "and lr, lr, r3\n\t"
  15755. "subs r12, r12, lr\n\t"
  15756. "it hi\n\t"
  15757. "movhi r2, r6\n\t"
  15758. "it lo\n\t"
  15759. "movlo r2, r3\n\t"
  15760. "it ne\n\t"
  15761. "movne r3, r5\n\t"
  15762. "ldr r12, [%[a], #56]\n\t"
  15763. "ldr lr, [%[b], #56]\n\t"
  15764. "and r12, r12, r3\n\t"
  15765. "and lr, lr, r3\n\t"
  15766. "subs r12, r12, lr\n\t"
  15767. "it hi\n\t"
  15768. "movhi r2, r6\n\t"
  15769. "it lo\n\t"
  15770. "movlo r2, r3\n\t"
  15771. "it ne\n\t"
  15772. "movne r3, r5\n\t"
  15773. "ldr r12, [%[a], #52]\n\t"
  15774. "ldr lr, [%[b], #52]\n\t"
  15775. "and r12, r12, r3\n\t"
  15776. "and lr, lr, r3\n\t"
  15777. "subs r12, r12, lr\n\t"
  15778. "it hi\n\t"
  15779. "movhi r2, r6\n\t"
  15780. "it lo\n\t"
  15781. "movlo r2, r3\n\t"
  15782. "it ne\n\t"
  15783. "movne r3, r5\n\t"
  15784. "ldr r12, [%[a], #48]\n\t"
  15785. "ldr lr, [%[b], #48]\n\t"
  15786. "and r12, r12, r3\n\t"
  15787. "and lr, lr, r3\n\t"
  15788. "subs r12, r12, lr\n\t"
  15789. "it hi\n\t"
  15790. "movhi r2, r6\n\t"
  15791. "it lo\n\t"
  15792. "movlo r2, r3\n\t"
  15793. "it ne\n\t"
  15794. "movne r3, r5\n\t"
  15795. "ldr r12, [%[a], #44]\n\t"
  15796. "ldr lr, [%[b], #44]\n\t"
  15797. "and r12, r12, r3\n\t"
  15798. "and lr, lr, r3\n\t"
  15799. "subs r12, r12, lr\n\t"
  15800. "it hi\n\t"
  15801. "movhi r2, r6\n\t"
  15802. "it lo\n\t"
  15803. "movlo r2, r3\n\t"
  15804. "it ne\n\t"
  15805. "movne r3, r5\n\t"
  15806. "ldr r12, [%[a], #40]\n\t"
  15807. "ldr lr, [%[b], #40]\n\t"
  15808. "and r12, r12, r3\n\t"
  15809. "and lr, lr, r3\n\t"
  15810. "subs r12, r12, lr\n\t"
  15811. "it hi\n\t"
  15812. "movhi r2, r6\n\t"
  15813. "it lo\n\t"
  15814. "movlo r2, r3\n\t"
  15815. "it ne\n\t"
  15816. "movne r3, r5\n\t"
  15817. "ldr r12, [%[a], #36]\n\t"
  15818. "ldr lr, [%[b], #36]\n\t"
  15819. "and r12, r12, r3\n\t"
  15820. "and lr, lr, r3\n\t"
  15821. "subs r12, r12, lr\n\t"
  15822. "it hi\n\t"
  15823. "movhi r2, r6\n\t"
  15824. "it lo\n\t"
  15825. "movlo r2, r3\n\t"
  15826. "it ne\n\t"
  15827. "movne r3, r5\n\t"
  15828. "ldr r12, [%[a], #32]\n\t"
  15829. "ldr lr, [%[b], #32]\n\t"
  15830. "and r12, r12, r3\n\t"
  15831. "and lr, lr, r3\n\t"
  15832. "subs r12, r12, lr\n\t"
  15833. "it hi\n\t"
  15834. "movhi r2, r6\n\t"
  15835. "it lo\n\t"
  15836. "movlo r2, r3\n\t"
  15837. "it ne\n\t"
  15838. "movne r3, r5\n\t"
  15839. "ldr r12, [%[a], #28]\n\t"
  15840. "ldr lr, [%[b], #28]\n\t"
  15841. "and r12, r12, r3\n\t"
  15842. "and lr, lr, r3\n\t"
  15843. "subs r12, r12, lr\n\t"
  15844. "it hi\n\t"
  15845. "movhi r2, r6\n\t"
  15846. "it lo\n\t"
  15847. "movlo r2, r3\n\t"
  15848. "it ne\n\t"
  15849. "movne r3, r5\n\t"
  15850. "ldr r12, [%[a], #24]\n\t"
  15851. "ldr lr, [%[b], #24]\n\t"
  15852. "and r12, r12, r3\n\t"
  15853. "and lr, lr, r3\n\t"
  15854. "subs r12, r12, lr\n\t"
  15855. "it hi\n\t"
  15856. "movhi r2, r6\n\t"
  15857. "it lo\n\t"
  15858. "movlo r2, r3\n\t"
  15859. "it ne\n\t"
  15860. "movne r3, r5\n\t"
  15861. "ldr r12, [%[a], #20]\n\t"
  15862. "ldr lr, [%[b], #20]\n\t"
  15863. "and r12, r12, r3\n\t"
  15864. "and lr, lr, r3\n\t"
  15865. "subs r12, r12, lr\n\t"
  15866. "it hi\n\t"
  15867. "movhi r2, r6\n\t"
  15868. "it lo\n\t"
  15869. "movlo r2, r3\n\t"
  15870. "it ne\n\t"
  15871. "movne r3, r5\n\t"
  15872. "ldr r12, [%[a], #16]\n\t"
  15873. "ldr lr, [%[b], #16]\n\t"
  15874. "and r12, r12, r3\n\t"
  15875. "and lr, lr, r3\n\t"
  15876. "subs r12, r12, lr\n\t"
  15877. "it hi\n\t"
  15878. "movhi r2, r6\n\t"
  15879. "it lo\n\t"
  15880. "movlo r2, r3\n\t"
  15881. "it ne\n\t"
  15882. "movne r3, r5\n\t"
  15883. "ldr r12, [%[a], #12]\n\t"
  15884. "ldr lr, [%[b], #12]\n\t"
  15885. "and r12, r12, r3\n\t"
  15886. "and lr, lr, r3\n\t"
  15887. "subs r12, r12, lr\n\t"
  15888. "it hi\n\t"
  15889. "movhi r2, r6\n\t"
  15890. "it lo\n\t"
  15891. "movlo r2, r3\n\t"
  15892. "it ne\n\t"
  15893. "movne r3, r5\n\t"
  15894. "ldr r12, [%[a], #8]\n\t"
  15895. "ldr lr, [%[b], #8]\n\t"
  15896. "and r12, r12, r3\n\t"
  15897. "and lr, lr, r3\n\t"
  15898. "subs r12, r12, lr\n\t"
  15899. "it hi\n\t"
  15900. "movhi r2, r6\n\t"
  15901. "it lo\n\t"
  15902. "movlo r2, r3\n\t"
  15903. "it ne\n\t"
  15904. "movne r3, r5\n\t"
  15905. "ldr r12, [%[a], #4]\n\t"
  15906. "ldr lr, [%[b], #4]\n\t"
  15907. "and r12, r12, r3\n\t"
  15908. "and lr, lr, r3\n\t"
  15909. "subs r12, r12, lr\n\t"
  15910. "it hi\n\t"
  15911. "movhi r2, r6\n\t"
  15912. "it lo\n\t"
  15913. "movlo r2, r3\n\t"
  15914. "it ne\n\t"
  15915. "movne r3, r5\n\t"
  15916. "ldr r12, [%[a]]\n\t"
  15917. "ldr lr, [%[b]]\n\t"
  15918. "and r12, r12, r3\n\t"
  15919. "and lr, lr, r3\n\t"
  15920. "subs r12, r12, lr\n\t"
  15921. "it hi\n\t"
  15922. "movhi r2, r6\n\t"
  15923. "it lo\n\t"
  15924. "movlo r2, r3\n\t"
  15925. "it ne\n\t"
  15926. "movne r3, r5\n\t"
  15927. "eor r2, r2, r3\n\t"
  15928. #endif /*WOLFSSL_SP_SMALL */
  15929. "mov %[a], r2\n\t"
  15930. : [a] "+r" (a), [b] "+r" (b)
  15931. :
  15932. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6"
  15933. );
  15934. return (uint32_t)(size_t)a;
  15935. }
  15936. /* Divide d in a and put remainder into r (m*d + r = a)
  15937. * m is not calculated as it is not needed at this time.
  15938. *
  15939. * a Number to be divided.
  15940. * d Number to divide with.
  15941. * m Multiplier result.
  15942. * r Remainder from the division.
  15943. * returns MP_OKAY indicating success.
  15944. */
  15945. static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d, sp_digit* m,
  15946. sp_digit* r)
  15947. {
  15948. sp_digit t1[128], t2[65];
  15949. sp_digit div, r1;
  15950. int i;
  15951. (void)m;
  15952. div = d[63];
  15953. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  15954. r1 = sp_2048_cmp_64(&t1[64], d) >= 0;
  15955. sp_2048_cond_sub_64(&t1[64], &t1[64], d, (sp_digit)0 - r1);
  15956. for (i = 63; i >= 0; i--) {
  15957. volatile sp_digit mask = (sp_digit)0 - (t1[64 + i] == div);
  15958. sp_digit hi = t1[64 + i] + mask;
  15959. r1 = div_2048_word_64(hi, t1[64 + i - 1], div);
  15960. r1 |= mask;
  15961. sp_2048_mul_d_64(t2, d, r1);
  15962. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  15963. t1[64 + i] -= t2[64];
  15964. sp_2048_mask_64(t2, d, t1[64 + i]);
  15965. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  15966. sp_2048_mask_64(t2, d, t1[64 + i]);
  15967. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  15968. }
  15969. r1 = sp_2048_cmp_64(t1, d) >= 0;
  15970. sp_2048_cond_sub_64(r, t1, d, (sp_digit)0 - r1);
  15971. return MP_OKAY;
  15972. }
  15973. /* Reduce a modulo m into r. (r = a mod m)
  15974. *
  15975. * r A single precision number that is the reduced result.
  15976. * a A single precision number that is to be reduced.
  15977. * m A single precision number that is the modulus to reduce with.
  15978. * returns MP_OKAY indicating success.
  15979. */
  15980. static WC_INLINE int sp_2048_mod_64(sp_digit* r, const sp_digit* a, const sp_digit* m)
  15981. {
  15982. return sp_2048_div_64(a, m, NULL, r);
  15983. }
  15984. #endif /* WOLFSSL_HAVE_SP_DH || !WOLFSSL_RSA_PUBLIC_ONLY */
  15985. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  15986. defined(WOLFSSL_HAVE_SP_DH)
  15987. #ifdef WOLFSSL_SP_SMALL
  15988. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  15989. *
  15990. * r A single precision number that is the result of the operation.
  15991. * a A single precision number being exponentiated.
  15992. * e A single precision number that is the exponent.
  15993. * bits The number of bits in the exponent.
  15994. * m A single precision number that is the modulus.
  15995. * returns 0 on success.
  15996. * returns MEMORY_E on dynamic memory allocation failure.
  15997. * returns MP_VAL when base is even or exponent is 0.
  15998. */
  15999. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  16000. int bits, const sp_digit* m, int reduceA)
  16001. {
  16002. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16003. sp_digit* td = NULL;
  16004. #else
  16005. sp_digit td[8 * 128];
  16006. #endif
  16007. sp_digit* t[8];
  16008. sp_digit* norm = NULL;
  16009. sp_digit mp = 1;
  16010. sp_digit n;
  16011. sp_digit mask;
  16012. int i;
  16013. int c;
  16014. byte y;
  16015. int err = MP_OKAY;
  16016. if (bits == 0) {
  16017. err = MP_VAL;
  16018. }
  16019. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16020. if (err == MP_OKAY) {
  16021. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 128), NULL,
  16022. DYNAMIC_TYPE_TMP_BUFFER);
  16023. if (td == NULL)
  16024. err = MEMORY_E;
  16025. }
  16026. #endif
  16027. if (err == MP_OKAY) {
  16028. norm = td;
  16029. for (i=0; i<8; i++) {
  16030. t[i] = td + i * 128;
  16031. }
  16032. sp_2048_mont_setup(m, &mp);
  16033. sp_2048_mont_norm_64(norm, m);
  16034. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  16035. if (reduceA != 0) {
  16036. err = sp_2048_mod_64(t[1] + 64, a, m);
  16037. if (err == MP_OKAY) {
  16038. err = sp_2048_mod_64(t[1], t[1], m);
  16039. }
  16040. }
  16041. else {
  16042. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  16043. err = sp_2048_mod_64(t[1], t[1], m);
  16044. }
  16045. }
  16046. if (err == MP_OKAY) {
  16047. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  16048. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  16049. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  16050. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  16051. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  16052. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  16053. i = (bits - 1) / 32;
  16054. n = e[i--];
  16055. c = bits & 31;
  16056. if (c == 0) {
  16057. c = 32;
  16058. }
  16059. c -= bits % 3;
  16060. if (c == 32) {
  16061. c = 29;
  16062. }
  16063. if (c < 0) {
  16064. /* Number of bits in top word is less than number needed. */
  16065. c = -c;
  16066. y = (byte)(n << c);
  16067. n = e[i--];
  16068. y |= (byte)(n >> (64 - c));
  16069. n <<= c;
  16070. c = 64 - c;
  16071. }
  16072. else if (c == 0) {
  16073. /* All bits in top word used. */
  16074. y = (byte)n;
  16075. }
  16076. else {
  16077. y = (byte)(n >> c);
  16078. n <<= 32 - c;
  16079. }
  16080. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  16081. for (; i>=0 || c>=3; ) {
  16082. if (c == 0) {
  16083. n = e[i--];
  16084. y = (byte)(n >> 29);
  16085. n <<= 3;
  16086. c = 29;
  16087. }
  16088. else if (c < 3) {
  16089. y = (byte)(n >> 29);
  16090. n = e[i--];
  16091. c = 3 - c;
  16092. y |= (byte)(n >> (32 - c));
  16093. n <<= c;
  16094. c = 32 - c;
  16095. }
  16096. else {
  16097. y = (byte)((n >> 29) & 0x7);
  16098. n <<= 3;
  16099. c -= 3;
  16100. }
  16101. sp_2048_mont_sqr_64(r, r, m, mp);
  16102. sp_2048_mont_sqr_64(r, r, m, mp);
  16103. sp_2048_mont_sqr_64(r, r, m, mp);
  16104. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  16105. }
  16106. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  16107. sp_2048_mont_reduce_64(r, m, mp);
  16108. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  16109. sp_2048_cond_sub_64(r, r, m, mask);
  16110. }
  16111. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16112. if (td != NULL)
  16113. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16114. #endif
  16115. return err;
  16116. }
  16117. #else
  16118. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  16119. *
  16120. * r A single precision number that is the result of the operation.
  16121. * a A single precision number being exponentiated.
  16122. * e A single precision number that is the exponent.
  16123. * bits The number of bits in the exponent.
  16124. * m A single precision number that is the modulus.
  16125. * returns 0 on success.
  16126. * returns MEMORY_E on dynamic memory allocation failure.
  16127. * returns MP_VAL when base is even or exponent is 0.
  16128. */
  16129. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  16130. int bits, const sp_digit* m, int reduceA)
  16131. {
  16132. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16133. sp_digit* td = NULL;
  16134. #else
  16135. sp_digit td[16 * 128];
  16136. #endif
  16137. sp_digit* t[16];
  16138. sp_digit* norm = NULL;
  16139. sp_digit mp = 1;
  16140. sp_digit n;
  16141. sp_digit mask;
  16142. int i;
  16143. int c;
  16144. byte y;
  16145. int err = MP_OKAY;
  16146. if (bits == 0) {
  16147. err = MP_VAL;
  16148. }
  16149. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16150. if (err == MP_OKAY) {
  16151. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 128), NULL,
  16152. DYNAMIC_TYPE_TMP_BUFFER);
  16153. if (td == NULL)
  16154. err = MEMORY_E;
  16155. }
  16156. #endif
  16157. if (err == MP_OKAY) {
  16158. norm = td;
  16159. for (i=0; i<16; i++) {
  16160. t[i] = td + i * 128;
  16161. }
  16162. sp_2048_mont_setup(m, &mp);
  16163. sp_2048_mont_norm_64(norm, m);
  16164. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  16165. if (reduceA != 0) {
  16166. err = sp_2048_mod_64(t[1] + 64, a, m);
  16167. if (err == MP_OKAY) {
  16168. err = sp_2048_mod_64(t[1], t[1], m);
  16169. }
  16170. }
  16171. else {
  16172. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  16173. err = sp_2048_mod_64(t[1], t[1], m);
  16174. }
  16175. }
  16176. if (err == MP_OKAY) {
  16177. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  16178. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  16179. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  16180. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  16181. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  16182. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  16183. sp_2048_mont_sqr_64(t[ 8], t[ 4], m, mp);
  16184. sp_2048_mont_mul_64(t[ 9], t[ 5], t[ 4], m, mp);
  16185. sp_2048_mont_sqr_64(t[10], t[ 5], m, mp);
  16186. sp_2048_mont_mul_64(t[11], t[ 6], t[ 5], m, mp);
  16187. sp_2048_mont_sqr_64(t[12], t[ 6], m, mp);
  16188. sp_2048_mont_mul_64(t[13], t[ 7], t[ 6], m, mp);
  16189. sp_2048_mont_sqr_64(t[14], t[ 7], m, mp);
  16190. sp_2048_mont_mul_64(t[15], t[ 8], t[ 7], m, mp);
  16191. i = (bits - 1) / 32;
  16192. n = e[i--];
  16193. c = bits & 31;
  16194. if (c == 0) {
  16195. c = 32;
  16196. }
  16197. c -= bits % 4;
  16198. if (c == 32) {
  16199. c = 28;
  16200. }
  16201. if (c < 0) {
  16202. /* Number of bits in top word is less than number needed. */
  16203. c = -c;
  16204. y = (byte)(n << c);
  16205. n = e[i--];
  16206. y |= (byte)(n >> (64 - c));
  16207. n <<= c;
  16208. c = 64 - c;
  16209. }
  16210. else if (c == 0) {
  16211. /* All bits in top word used. */
  16212. y = (byte)n;
  16213. }
  16214. else {
  16215. y = (byte)(n >> c);
  16216. n <<= 32 - c;
  16217. }
  16218. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  16219. for (; i>=0 || c>=4; ) {
  16220. if (c == 0) {
  16221. n = e[i--];
  16222. y = (byte)(n >> 28);
  16223. n <<= 4;
  16224. c = 28;
  16225. }
  16226. else if (c < 4) {
  16227. y = (byte)(n >> 28);
  16228. n = e[i--];
  16229. c = 4 - c;
  16230. y |= (byte)(n >> (32 - c));
  16231. n <<= c;
  16232. c = 32 - c;
  16233. }
  16234. else {
  16235. y = (byte)((n >> 28) & 0xf);
  16236. n <<= 4;
  16237. c -= 4;
  16238. }
  16239. sp_2048_mont_sqr_64(r, r, m, mp);
  16240. sp_2048_mont_sqr_64(r, r, m, mp);
  16241. sp_2048_mont_sqr_64(r, r, m, mp);
  16242. sp_2048_mont_sqr_64(r, r, m, mp);
  16243. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  16244. }
  16245. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  16246. sp_2048_mont_reduce_64(r, m, mp);
  16247. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  16248. sp_2048_cond_sub_64(r, r, m, mask);
  16249. }
  16250. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16251. if (td != NULL)
  16252. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16253. #endif
  16254. return err;
  16255. }
  16256. #endif /* WOLFSSL_SP_SMALL */
  16257. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  16258. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  16259. #ifdef WOLFSSL_HAVE_SP_RSA
  16260. /* RSA public key operation.
  16261. *
  16262. * in Array of bytes representing the number to exponentiate, base.
  16263. * inLen Number of bytes in base.
  16264. * em Public exponent.
  16265. * mm Modulus.
  16266. * out Buffer to hold big-endian bytes of exponentiation result.
  16267. * Must be at least 256 bytes long.
  16268. * outLen Number of bytes in result.
  16269. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  16270. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  16271. */
  16272. int sp_RsaPublic_2048(const byte* in, word32 inLen, const mp_int* em,
  16273. const mp_int* mm, byte* out, word32* outLen)
  16274. {
  16275. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16276. sp_digit* a = NULL;
  16277. #else
  16278. sp_digit a[64 * 5];
  16279. #endif
  16280. sp_digit* m = NULL;
  16281. sp_digit* r = NULL;
  16282. sp_digit *ah = NULL;
  16283. sp_digit e[1] = {0};
  16284. int err = MP_OKAY;
  16285. if (*outLen < 256) {
  16286. err = MP_TO_E;
  16287. }
  16288. else if (mp_count_bits(em) > 32 || inLen > 256 ||
  16289. mp_count_bits(mm) != 2048) {
  16290. err = MP_READ_E;
  16291. }
  16292. else if (mp_iseven(mm)) {
  16293. err = MP_VAL;
  16294. }
  16295. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16296. if (err == MP_OKAY) {
  16297. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 5, NULL,
  16298. DYNAMIC_TYPE_RSA);
  16299. if (a == NULL)
  16300. err = MEMORY_E;
  16301. }
  16302. #endif
  16303. if (err == MP_OKAY) {
  16304. ah = a + 64;
  16305. r = a + 64 * 2;
  16306. m = r + 64 * 2;
  16307. sp_2048_from_bin(ah, 64, in, inLen);
  16308. #if DIGIT_BIT >= 32
  16309. e[0] = em->dp[0];
  16310. #else
  16311. e[0] = em->dp[0];
  16312. if (em->used > 1) {
  16313. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  16314. }
  16315. #endif
  16316. if (e[0] == 0) {
  16317. err = MP_EXPTMOD_E;
  16318. }
  16319. }
  16320. if (err == MP_OKAY) {
  16321. sp_2048_from_mp(m, 64, mm);
  16322. if (e[0] == 0x10001) {
  16323. int i;
  16324. sp_digit mp;
  16325. sp_2048_mont_setup(m, &mp);
  16326. /* Convert to Montgomery form. */
  16327. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  16328. err = sp_2048_mod_64_cond(r, a, m);
  16329. /* Montgomery form: r = a.R mod m */
  16330. if (err == MP_OKAY) {
  16331. /* r = a ^ 0x10000 => r = a squared 16 times */
  16332. for (i = 15; i >= 0; i--) {
  16333. sp_2048_mont_sqr_64(r, r, m, mp);
  16334. }
  16335. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  16336. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  16337. */
  16338. sp_2048_mont_mul_64(r, r, ah, m, mp);
  16339. for (i = 63; i > 0; i--) {
  16340. if (r[i] != m[i]) {
  16341. break;
  16342. }
  16343. }
  16344. if (r[i] >= m[i]) {
  16345. sp_2048_sub_in_place_64(r, m);
  16346. }
  16347. }
  16348. }
  16349. else if (e[0] == 0x3) {
  16350. if (err == MP_OKAY) {
  16351. sp_2048_sqr_64(r, ah);
  16352. err = sp_2048_mod_64_cond(r, r, m);
  16353. }
  16354. if (err == MP_OKAY) {
  16355. sp_2048_mul_64(r, ah, r);
  16356. err = sp_2048_mod_64_cond(r, r, m);
  16357. }
  16358. }
  16359. else {
  16360. int i;
  16361. sp_digit mp;
  16362. sp_2048_mont_setup(m, &mp);
  16363. /* Convert to Montgomery form. */
  16364. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  16365. err = sp_2048_mod_64_cond(a, a, m);
  16366. if (err == MP_OKAY) {
  16367. for (i = 31; i >= 0; i--) {
  16368. if (e[0] >> i) {
  16369. break;
  16370. }
  16371. }
  16372. XMEMCPY(r, a, sizeof(sp_digit) * 64);
  16373. for (i--; i >= 0; i--) {
  16374. sp_2048_mont_sqr_64(r, r, m, mp);
  16375. if (((e[0] >> i) & 1) == 1) {
  16376. sp_2048_mont_mul_64(r, r, a, m, mp);
  16377. }
  16378. }
  16379. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64);
  16380. sp_2048_mont_reduce_64(r, m, mp);
  16381. for (i = 63; i > 0; i--) {
  16382. if (r[i] != m[i]) {
  16383. break;
  16384. }
  16385. }
  16386. if (r[i] >= m[i]) {
  16387. sp_2048_sub_in_place_64(r, m);
  16388. }
  16389. }
  16390. }
  16391. }
  16392. if (err == MP_OKAY) {
  16393. sp_2048_to_bin_64(r, out);
  16394. *outLen = 256;
  16395. }
  16396. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16397. if (a != NULL)
  16398. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  16399. #endif
  16400. return err;
  16401. }
  16402. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  16403. #ifdef WOLFSSL_SP_SMALL
  16404. /* Conditionally add a and b using the mask m.
  16405. * m is -1 to add and 0 when not.
  16406. *
  16407. * r A single precision number representing conditional add result.
  16408. * a A single precision number to add with.
  16409. * b A single precision number to add.
  16410. * m Mask value to apply.
  16411. */
  16412. static sp_digit sp_2048_cond_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  16413. {
  16414. register sp_digit* r asm ("r0") = r_p;
  16415. register const sp_digit* a asm ("r1") = a_p;
  16416. register const sp_digit* b asm ("r2") = b_p;
  16417. register sp_digit m asm ("r3") = m_p;
  16418. __asm__ __volatile__ (
  16419. "mov lr, #0\n\t"
  16420. "mov r6, #0\n\t"
  16421. "mov r12, #0\n\t"
  16422. "\n"
  16423. "L_sp_2048_cond_add_32_words_%=: \n\t"
  16424. "adds lr, lr, #-1\n\t"
  16425. "ldr r4, [%[a], r12]\n\t"
  16426. "ldr r5, [%[b], r12]\n\t"
  16427. "and r5, r5, %[m]\n\t"
  16428. "adcs r4, r4, r5\n\t"
  16429. "adc lr, r6, r6\n\t"
  16430. "str r4, [%[r], r12]\n\t"
  16431. "add r12, r12, #4\n\t"
  16432. "cmp r12, #0x80\n\t"
  16433. "blt L_sp_2048_cond_add_32_words_%=\n\t"
  16434. "mov %[r], lr\n\t"
  16435. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  16436. :
  16437. : "memory", "r12", "lr", "r4", "r5", "r6"
  16438. );
  16439. return (uint32_t)(size_t)r;
  16440. }
  16441. #else
  16442. /* Conditionally add a and b using the mask m.
  16443. * m is -1 to add and 0 when not.
  16444. *
  16445. * r A single precision number representing conditional add result.
  16446. * a A single precision number to add with.
  16447. * b A single precision number to add.
  16448. * m Mask value to apply.
  16449. */
  16450. static sp_digit sp_2048_cond_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  16451. {
  16452. register sp_digit* r asm ("r0") = r_p;
  16453. register const sp_digit* a asm ("r1") = a_p;
  16454. register const sp_digit* b asm ("r2") = b_p;
  16455. register sp_digit m asm ("r3") = m_p;
  16456. __asm__ __volatile__ (
  16457. "mov r8, #0\n\t"
  16458. "ldm %[a]!, {r4, r5}\n\t"
  16459. "ldm %[b]!, {r6, r7}\n\t"
  16460. "and r6, r6, %[m]\n\t"
  16461. "and r7, r7, %[m]\n\t"
  16462. "adds r4, r4, r6\n\t"
  16463. "adcs r5, r5, r7\n\t"
  16464. "stm %[r]!, {r4, r5}\n\t"
  16465. "ldm %[a]!, {r4, r5}\n\t"
  16466. "ldm %[b]!, {r6, r7}\n\t"
  16467. "and r6, r6, %[m]\n\t"
  16468. "and r7, r7, %[m]\n\t"
  16469. "adcs r4, r4, r6\n\t"
  16470. "adcs r5, r5, r7\n\t"
  16471. "stm %[r]!, {r4, r5}\n\t"
  16472. "ldm %[a]!, {r4, r5}\n\t"
  16473. "ldm %[b]!, {r6, r7}\n\t"
  16474. "and r6, r6, %[m]\n\t"
  16475. "and r7, r7, %[m]\n\t"
  16476. "adcs r4, r4, r6\n\t"
  16477. "adcs r5, r5, r7\n\t"
  16478. "stm %[r]!, {r4, r5}\n\t"
  16479. "ldm %[a]!, {r4, r5}\n\t"
  16480. "ldm %[b]!, {r6, r7}\n\t"
  16481. "and r6, r6, %[m]\n\t"
  16482. "and r7, r7, %[m]\n\t"
  16483. "adcs r4, r4, r6\n\t"
  16484. "adcs r5, r5, r7\n\t"
  16485. "stm %[r]!, {r4, r5}\n\t"
  16486. "ldm %[a]!, {r4, r5}\n\t"
  16487. "ldm %[b]!, {r6, r7}\n\t"
  16488. "and r6, r6, %[m]\n\t"
  16489. "and r7, r7, %[m]\n\t"
  16490. "adcs r4, r4, r6\n\t"
  16491. "adcs r5, r5, r7\n\t"
  16492. "stm %[r]!, {r4, r5}\n\t"
  16493. "ldm %[a]!, {r4, r5}\n\t"
  16494. "ldm %[b]!, {r6, r7}\n\t"
  16495. "and r6, r6, %[m]\n\t"
  16496. "and r7, r7, %[m]\n\t"
  16497. "adcs r4, r4, r6\n\t"
  16498. "adcs r5, r5, r7\n\t"
  16499. "stm %[r]!, {r4, r5}\n\t"
  16500. "ldm %[a]!, {r4, r5}\n\t"
  16501. "ldm %[b]!, {r6, r7}\n\t"
  16502. "and r6, r6, %[m]\n\t"
  16503. "and r7, r7, %[m]\n\t"
  16504. "adcs r4, r4, r6\n\t"
  16505. "adcs r5, r5, r7\n\t"
  16506. "stm %[r]!, {r4, r5}\n\t"
  16507. "ldm %[a]!, {r4, r5}\n\t"
  16508. "ldm %[b]!, {r6, r7}\n\t"
  16509. "and r6, r6, %[m]\n\t"
  16510. "and r7, r7, %[m]\n\t"
  16511. "adcs r4, r4, r6\n\t"
  16512. "adcs r5, r5, r7\n\t"
  16513. "stm %[r]!, {r4, r5}\n\t"
  16514. "ldm %[a]!, {r4, r5}\n\t"
  16515. "ldm %[b]!, {r6, r7}\n\t"
  16516. "and r6, r6, %[m]\n\t"
  16517. "and r7, r7, %[m]\n\t"
  16518. "adcs r4, r4, r6\n\t"
  16519. "adcs r5, r5, r7\n\t"
  16520. "stm %[r]!, {r4, r5}\n\t"
  16521. "ldm %[a]!, {r4, r5}\n\t"
  16522. "ldm %[b]!, {r6, r7}\n\t"
  16523. "and r6, r6, %[m]\n\t"
  16524. "and r7, r7, %[m]\n\t"
  16525. "adcs r4, r4, r6\n\t"
  16526. "adcs r5, r5, r7\n\t"
  16527. "stm %[r]!, {r4, r5}\n\t"
  16528. "ldm %[a]!, {r4, r5}\n\t"
  16529. "ldm %[b]!, {r6, r7}\n\t"
  16530. "and r6, r6, %[m]\n\t"
  16531. "and r7, r7, %[m]\n\t"
  16532. "adcs r4, r4, r6\n\t"
  16533. "adcs r5, r5, r7\n\t"
  16534. "stm %[r]!, {r4, r5}\n\t"
  16535. "ldm %[a]!, {r4, r5}\n\t"
  16536. "ldm %[b]!, {r6, r7}\n\t"
  16537. "and r6, r6, %[m]\n\t"
  16538. "and r7, r7, %[m]\n\t"
  16539. "adcs r4, r4, r6\n\t"
  16540. "adcs r5, r5, r7\n\t"
  16541. "stm %[r]!, {r4, r5}\n\t"
  16542. "ldm %[a]!, {r4, r5}\n\t"
  16543. "ldm %[b]!, {r6, r7}\n\t"
  16544. "and r6, r6, %[m]\n\t"
  16545. "and r7, r7, %[m]\n\t"
  16546. "adcs r4, r4, r6\n\t"
  16547. "adcs r5, r5, r7\n\t"
  16548. "stm %[r]!, {r4, r5}\n\t"
  16549. "ldm %[a]!, {r4, r5}\n\t"
  16550. "ldm %[b]!, {r6, r7}\n\t"
  16551. "and r6, r6, %[m]\n\t"
  16552. "and r7, r7, %[m]\n\t"
  16553. "adcs r4, r4, r6\n\t"
  16554. "adcs r5, r5, r7\n\t"
  16555. "stm %[r]!, {r4, r5}\n\t"
  16556. "ldm %[a]!, {r4, r5}\n\t"
  16557. "ldm %[b]!, {r6, r7}\n\t"
  16558. "and r6, r6, %[m]\n\t"
  16559. "and r7, r7, %[m]\n\t"
  16560. "adcs r4, r4, r6\n\t"
  16561. "adcs r5, r5, r7\n\t"
  16562. "stm %[r]!, {r4, r5}\n\t"
  16563. "ldm %[a]!, {r4, r5}\n\t"
  16564. "ldm %[b]!, {r6, r7}\n\t"
  16565. "and r6, r6, %[m]\n\t"
  16566. "and r7, r7, %[m]\n\t"
  16567. "adcs r4, r4, r6\n\t"
  16568. "adcs r5, r5, r7\n\t"
  16569. "stm %[r]!, {r4, r5}\n\t"
  16570. "adc %[r], r8, r8\n\t"
  16571. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  16572. :
  16573. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  16574. );
  16575. return (uint32_t)(size_t)r;
  16576. }
  16577. #endif /* WOLFSSL_SP_SMALL */
  16578. /* RSA private key operation.
  16579. *
  16580. * in Array of bytes representing the number to exponentiate, base.
  16581. * inLen Number of bytes in base.
  16582. * dm Private exponent.
  16583. * pm First prime.
  16584. * qm Second prime.
  16585. * dpm First prime's CRT exponent.
  16586. * dqm Second prime's CRT exponent.
  16587. * qim Inverse of second prime mod p.
  16588. * mm Modulus.
  16589. * out Buffer to hold big-endian bytes of exponentiation result.
  16590. * Must be at least 256 bytes long.
  16591. * outLen Number of bytes in result.
  16592. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  16593. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  16594. */
  16595. int sp_RsaPrivate_2048(const byte* in, word32 inLen, const mp_int* dm,
  16596. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  16597. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  16598. {
  16599. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  16600. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16601. sp_digit* d = NULL;
  16602. #else
  16603. sp_digit d[64 * 4];
  16604. #endif
  16605. sp_digit* a = NULL;
  16606. sp_digit* m = NULL;
  16607. sp_digit* r = NULL;
  16608. int err = MP_OKAY;
  16609. (void)pm;
  16610. (void)qm;
  16611. (void)dpm;
  16612. (void)dqm;
  16613. (void)qim;
  16614. if (*outLen < 256U) {
  16615. err = MP_TO_E;
  16616. }
  16617. if (err == MP_OKAY) {
  16618. if (mp_count_bits(dm) > 2048) {
  16619. err = MP_READ_E;
  16620. }
  16621. else if (inLen > 256) {
  16622. err = MP_READ_E;
  16623. }
  16624. else if (mp_count_bits(mm) != 2048) {
  16625. err = MP_READ_E;
  16626. }
  16627. else if (mp_iseven(mm)) {
  16628. err = MP_VAL;
  16629. }
  16630. }
  16631. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16632. if (err == MP_OKAY) {
  16633. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL,
  16634. DYNAMIC_TYPE_RSA);
  16635. if (d == NULL)
  16636. err = MEMORY_E;
  16637. }
  16638. #endif
  16639. if (err == MP_OKAY) {
  16640. a = d + 64;
  16641. m = a + 128;
  16642. r = a;
  16643. sp_2048_from_bin(a, 64, in, inLen);
  16644. sp_2048_from_mp(d, 64, dm);
  16645. sp_2048_from_mp(m, 64, mm);
  16646. err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0);
  16647. }
  16648. if (err == MP_OKAY) {
  16649. sp_2048_to_bin_64(r, out);
  16650. *outLen = 256;
  16651. }
  16652. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16653. if (d != NULL)
  16654. #endif
  16655. {
  16656. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  16657. if (a != NULL)
  16658. ForceZero(a, sizeof(sp_digit) * 64);
  16659. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16660. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  16661. #endif
  16662. }
  16663. return err;
  16664. #else
  16665. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16666. sp_digit* a = NULL;
  16667. #else
  16668. sp_digit a[32 * 11];
  16669. #endif
  16670. sp_digit* p = NULL;
  16671. sp_digit* q = NULL;
  16672. sp_digit* dp = NULL;
  16673. sp_digit* tmpa = NULL;
  16674. sp_digit* tmpb = NULL;
  16675. sp_digit* r = NULL;
  16676. sp_digit* qi = NULL;
  16677. sp_digit* dq = NULL;
  16678. sp_digit c;
  16679. int err = MP_OKAY;
  16680. (void)dm;
  16681. (void)mm;
  16682. if (*outLen < 256) {
  16683. err = MP_TO_E;
  16684. }
  16685. else if (inLen > 256 || mp_count_bits(mm) != 2048) {
  16686. err = MP_READ_E;
  16687. }
  16688. else if (mp_iseven(mm)) {
  16689. err = MP_VAL;
  16690. }
  16691. else if (mp_iseven(pm)) {
  16692. err = MP_VAL;
  16693. }
  16694. else if (mp_iseven(qm)) {
  16695. err = MP_VAL;
  16696. }
  16697. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16698. if (err == MP_OKAY) {
  16699. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 11, NULL,
  16700. DYNAMIC_TYPE_RSA);
  16701. if (a == NULL)
  16702. err = MEMORY_E;
  16703. }
  16704. #endif
  16705. if (err == MP_OKAY) {
  16706. p = a + 64 * 2;
  16707. q = p + 32;
  16708. qi = dq = dp = q + 32;
  16709. tmpa = qi + 32;
  16710. tmpb = tmpa + 64;
  16711. r = a;
  16712. sp_2048_from_bin(a, 64, in, inLen);
  16713. sp_2048_from_mp(p, 32, pm);
  16714. sp_2048_from_mp(q, 32, qm);
  16715. sp_2048_from_mp(dp, 32, dpm);
  16716. err = sp_2048_mod_exp_32(tmpa, a, dp, 1024, p, 1);
  16717. }
  16718. if (err == MP_OKAY) {
  16719. sp_2048_from_mp(dq, 32, dqm);
  16720. err = sp_2048_mod_exp_32(tmpb, a, dq, 1024, q, 1);
  16721. }
  16722. if (err == MP_OKAY) {
  16723. c = sp_2048_sub_in_place_32(tmpa, tmpb);
  16724. c += sp_2048_cond_add_32(tmpa, tmpa, p, c);
  16725. sp_2048_cond_add_32(tmpa, tmpa, p, c);
  16726. sp_2048_from_mp(qi, 32, qim);
  16727. sp_2048_mul_32(tmpa, tmpa, qi);
  16728. err = sp_2048_mod_32(tmpa, tmpa, p);
  16729. }
  16730. if (err == MP_OKAY) {
  16731. sp_2048_mul_32(tmpa, q, tmpa);
  16732. XMEMSET(&tmpb[32], 0, sizeof(sp_digit) * 32);
  16733. sp_2048_add_64(r, tmpb, tmpa);
  16734. sp_2048_to_bin_64(r, out);
  16735. *outLen = 256;
  16736. }
  16737. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16738. if (a != NULL)
  16739. #endif
  16740. {
  16741. ForceZero(a, sizeof(sp_digit) * 32 * 11);
  16742. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  16743. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  16744. #endif
  16745. }
  16746. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  16747. return err;
  16748. }
  16749. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  16750. #endif /* WOLFSSL_HAVE_SP_RSA */
  16751. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  16752. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  16753. /* Convert an array of sp_digit to an mp_int.
  16754. *
  16755. * a A single precision integer.
  16756. * r A multi-precision integer.
  16757. */
  16758. static int sp_2048_to_mp(const sp_digit* a, mp_int* r)
  16759. {
  16760. int err;
  16761. err = mp_grow(r, (2048 + DIGIT_BIT - 1) / DIGIT_BIT);
  16762. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  16763. #if DIGIT_BIT == 32
  16764. XMEMCPY(r->dp, a, sizeof(sp_digit) * 64);
  16765. r->used = 64;
  16766. mp_clamp(r);
  16767. #elif DIGIT_BIT < 32
  16768. int i;
  16769. int j = 0;
  16770. int s = 0;
  16771. r->dp[0] = 0;
  16772. for (i = 0; i < 64; i++) {
  16773. r->dp[j] |= (mp_digit)(a[i] << s);
  16774. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  16775. s = DIGIT_BIT - s;
  16776. r->dp[++j] = (mp_digit)(a[i] >> s);
  16777. while (s + DIGIT_BIT <= 32) {
  16778. s += DIGIT_BIT;
  16779. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  16780. if (s == SP_WORD_SIZE) {
  16781. r->dp[j] = 0;
  16782. }
  16783. else {
  16784. r->dp[j] = (mp_digit)(a[i] >> s);
  16785. }
  16786. }
  16787. s = 32 - s;
  16788. }
  16789. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  16790. mp_clamp(r);
  16791. #else
  16792. int i;
  16793. int j = 0;
  16794. int s = 0;
  16795. r->dp[0] = 0;
  16796. for (i = 0; i < 64; i++) {
  16797. r->dp[j] |= ((mp_digit)a[i]) << s;
  16798. if (s + 32 >= DIGIT_BIT) {
  16799. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  16800. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  16801. #endif
  16802. s = DIGIT_BIT - s;
  16803. r->dp[++j] = a[i] >> s;
  16804. s = 32 - s;
  16805. }
  16806. else {
  16807. s += 32;
  16808. }
  16809. }
  16810. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  16811. mp_clamp(r);
  16812. #endif
  16813. }
  16814. return err;
  16815. }
  16816. /* Perform the modular exponentiation for Diffie-Hellman.
  16817. *
  16818. * base Base. MP integer.
  16819. * exp Exponent. MP integer.
  16820. * mod Modulus. MP integer.
  16821. * res Result. MP integer.
  16822. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  16823. * and MEMORY_E if memory allocation fails.
  16824. */
  16825. int sp_ModExp_2048(const mp_int* base, const mp_int* exp, const mp_int* mod,
  16826. mp_int* res)
  16827. {
  16828. int err = MP_OKAY;
  16829. sp_digit b[128];
  16830. sp_digit e[64];
  16831. sp_digit m[64];
  16832. sp_digit* r = b;
  16833. int expBits = mp_count_bits(exp);
  16834. if (mp_count_bits(base) > 2048) {
  16835. err = MP_READ_E;
  16836. }
  16837. else if (expBits > 2048) {
  16838. err = MP_READ_E;
  16839. }
  16840. else if (mp_count_bits(mod) != 2048) {
  16841. err = MP_READ_E;
  16842. }
  16843. else if (mp_iseven(mod)) {
  16844. err = MP_VAL;
  16845. }
  16846. if (err == MP_OKAY) {
  16847. sp_2048_from_mp(b, 64, base);
  16848. sp_2048_from_mp(e, 64, exp);
  16849. sp_2048_from_mp(m, 64, mod);
  16850. err = sp_2048_mod_exp_64(r, b, e, expBits, m, 0);
  16851. }
  16852. if (err == MP_OKAY) {
  16853. err = sp_2048_to_mp(r, res);
  16854. }
  16855. XMEMSET(e, 0, sizeof(e));
  16856. return err;
  16857. }
  16858. #ifdef WOLFSSL_HAVE_SP_DH
  16859. #ifdef HAVE_FFDHE_2048
  16860. static void sp_2048_lshift_64(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  16861. {
  16862. register sp_digit* r asm ("r0") = r_p;
  16863. register const sp_digit* a asm ("r1") = a_p;
  16864. register byte n asm ("r2") = n_p;
  16865. __asm__ __volatile__ (
  16866. "rsb r12, %[n], #31\n\t"
  16867. "ldr r5, [%[a], #252]\n\t"
  16868. "lsr r6, r5, #1\n\t"
  16869. "lsl r5, r5, %[n]\n\t"
  16870. "lsr r6, r6, r12\n\t"
  16871. "ldr r4, [%[a], #248]\n\t"
  16872. "str r6, [%[r], #256]\n\t"
  16873. "lsr r3, r4, #1\n\t"
  16874. "lsl r4, r4, %[n]\n\t"
  16875. "lsr r3, r3, r12\n\t"
  16876. "orr r5, r5, r3\n\t"
  16877. "ldr r6, [%[a], #244]\n\t"
  16878. "str r5, [%[r], #252]\n\t"
  16879. "lsr r3, r6, #1\n\t"
  16880. "lsl r6, r6, %[n]\n\t"
  16881. "lsr r3, r3, r12\n\t"
  16882. "orr r4, r4, r3\n\t"
  16883. "ldr r5, [%[a], #240]\n\t"
  16884. "str r4, [%[r], #248]\n\t"
  16885. "lsr r3, r5, #1\n\t"
  16886. "lsl r5, r5, %[n]\n\t"
  16887. "lsr r3, r3, r12\n\t"
  16888. "orr r6, r6, r3\n\t"
  16889. "ldr r4, [%[a], #236]\n\t"
  16890. "str r6, [%[r], #244]\n\t"
  16891. "lsr r3, r4, #1\n\t"
  16892. "lsl r4, r4, %[n]\n\t"
  16893. "lsr r3, r3, r12\n\t"
  16894. "orr r5, r5, r3\n\t"
  16895. "ldr r6, [%[a], #232]\n\t"
  16896. "str r5, [%[r], #240]\n\t"
  16897. "lsr r3, r6, #1\n\t"
  16898. "lsl r6, r6, %[n]\n\t"
  16899. "lsr r3, r3, r12\n\t"
  16900. "orr r4, r4, r3\n\t"
  16901. "ldr r5, [%[a], #228]\n\t"
  16902. "str r4, [%[r], #236]\n\t"
  16903. "lsr r3, r5, #1\n\t"
  16904. "lsl r5, r5, %[n]\n\t"
  16905. "lsr r3, r3, r12\n\t"
  16906. "orr r6, r6, r3\n\t"
  16907. "ldr r4, [%[a], #224]\n\t"
  16908. "str r6, [%[r], #232]\n\t"
  16909. "lsr r3, r4, #1\n\t"
  16910. "lsl r4, r4, %[n]\n\t"
  16911. "lsr r3, r3, r12\n\t"
  16912. "orr r5, r5, r3\n\t"
  16913. "ldr r6, [%[a], #220]\n\t"
  16914. "str r5, [%[r], #228]\n\t"
  16915. "lsr r3, r6, #1\n\t"
  16916. "lsl r6, r6, %[n]\n\t"
  16917. "lsr r3, r3, r12\n\t"
  16918. "orr r4, r4, r3\n\t"
  16919. "ldr r5, [%[a], #216]\n\t"
  16920. "str r4, [%[r], #224]\n\t"
  16921. "lsr r3, r5, #1\n\t"
  16922. "lsl r5, r5, %[n]\n\t"
  16923. "lsr r3, r3, r12\n\t"
  16924. "orr r6, r6, r3\n\t"
  16925. "ldr r4, [%[a], #212]\n\t"
  16926. "str r6, [%[r], #220]\n\t"
  16927. "lsr r3, r4, #1\n\t"
  16928. "lsl r4, r4, %[n]\n\t"
  16929. "lsr r3, r3, r12\n\t"
  16930. "orr r5, r5, r3\n\t"
  16931. "ldr r6, [%[a], #208]\n\t"
  16932. "str r5, [%[r], #216]\n\t"
  16933. "lsr r3, r6, #1\n\t"
  16934. "lsl r6, r6, %[n]\n\t"
  16935. "lsr r3, r3, r12\n\t"
  16936. "orr r4, r4, r3\n\t"
  16937. "ldr r5, [%[a], #204]\n\t"
  16938. "str r4, [%[r], #212]\n\t"
  16939. "lsr r3, r5, #1\n\t"
  16940. "lsl r5, r5, %[n]\n\t"
  16941. "lsr r3, r3, r12\n\t"
  16942. "orr r6, r6, r3\n\t"
  16943. "ldr r4, [%[a], #200]\n\t"
  16944. "str r6, [%[r], #208]\n\t"
  16945. "lsr r3, r4, #1\n\t"
  16946. "lsl r4, r4, %[n]\n\t"
  16947. "lsr r3, r3, r12\n\t"
  16948. "orr r5, r5, r3\n\t"
  16949. "ldr r6, [%[a], #196]\n\t"
  16950. "str r5, [%[r], #204]\n\t"
  16951. "lsr r3, r6, #1\n\t"
  16952. "lsl r6, r6, %[n]\n\t"
  16953. "lsr r3, r3, r12\n\t"
  16954. "orr r4, r4, r3\n\t"
  16955. "ldr r5, [%[a], #192]\n\t"
  16956. "str r4, [%[r], #200]\n\t"
  16957. "lsr r3, r5, #1\n\t"
  16958. "lsl r5, r5, %[n]\n\t"
  16959. "lsr r3, r3, r12\n\t"
  16960. "orr r6, r6, r3\n\t"
  16961. "ldr r4, [%[a], #188]\n\t"
  16962. "str r6, [%[r], #196]\n\t"
  16963. "lsr r3, r4, #1\n\t"
  16964. "lsl r4, r4, %[n]\n\t"
  16965. "lsr r3, r3, r12\n\t"
  16966. "orr r5, r5, r3\n\t"
  16967. "ldr r6, [%[a], #184]\n\t"
  16968. "str r5, [%[r], #192]\n\t"
  16969. "lsr r3, r6, #1\n\t"
  16970. "lsl r6, r6, %[n]\n\t"
  16971. "lsr r3, r3, r12\n\t"
  16972. "orr r4, r4, r3\n\t"
  16973. "ldr r5, [%[a], #180]\n\t"
  16974. "str r4, [%[r], #188]\n\t"
  16975. "lsr r3, r5, #1\n\t"
  16976. "lsl r5, r5, %[n]\n\t"
  16977. "lsr r3, r3, r12\n\t"
  16978. "orr r6, r6, r3\n\t"
  16979. "ldr r4, [%[a], #176]\n\t"
  16980. "str r6, [%[r], #184]\n\t"
  16981. "lsr r3, r4, #1\n\t"
  16982. "lsl r4, r4, %[n]\n\t"
  16983. "lsr r3, r3, r12\n\t"
  16984. "orr r5, r5, r3\n\t"
  16985. "ldr r6, [%[a], #172]\n\t"
  16986. "str r5, [%[r], #180]\n\t"
  16987. "lsr r3, r6, #1\n\t"
  16988. "lsl r6, r6, %[n]\n\t"
  16989. "lsr r3, r3, r12\n\t"
  16990. "orr r4, r4, r3\n\t"
  16991. "ldr r5, [%[a], #168]\n\t"
  16992. "str r4, [%[r], #176]\n\t"
  16993. "lsr r3, r5, #1\n\t"
  16994. "lsl r5, r5, %[n]\n\t"
  16995. "lsr r3, r3, r12\n\t"
  16996. "orr r6, r6, r3\n\t"
  16997. "ldr r4, [%[a], #164]\n\t"
  16998. "str r6, [%[r], #172]\n\t"
  16999. "lsr r3, r4, #1\n\t"
  17000. "lsl r4, r4, %[n]\n\t"
  17001. "lsr r3, r3, r12\n\t"
  17002. "orr r5, r5, r3\n\t"
  17003. "ldr r6, [%[a], #160]\n\t"
  17004. "str r5, [%[r], #168]\n\t"
  17005. "lsr r3, r6, #1\n\t"
  17006. "lsl r6, r6, %[n]\n\t"
  17007. "lsr r3, r3, r12\n\t"
  17008. "orr r4, r4, r3\n\t"
  17009. "ldr r5, [%[a], #156]\n\t"
  17010. "str r4, [%[r], #164]\n\t"
  17011. "lsr r3, r5, #1\n\t"
  17012. "lsl r5, r5, %[n]\n\t"
  17013. "lsr r3, r3, r12\n\t"
  17014. "orr r6, r6, r3\n\t"
  17015. "ldr r4, [%[a], #152]\n\t"
  17016. "str r6, [%[r], #160]\n\t"
  17017. "lsr r3, r4, #1\n\t"
  17018. "lsl r4, r4, %[n]\n\t"
  17019. "lsr r3, r3, r12\n\t"
  17020. "orr r5, r5, r3\n\t"
  17021. "ldr r6, [%[a], #148]\n\t"
  17022. "str r5, [%[r], #156]\n\t"
  17023. "lsr r3, r6, #1\n\t"
  17024. "lsl r6, r6, %[n]\n\t"
  17025. "lsr r3, r3, r12\n\t"
  17026. "orr r4, r4, r3\n\t"
  17027. "ldr r5, [%[a], #144]\n\t"
  17028. "str r4, [%[r], #152]\n\t"
  17029. "lsr r3, r5, #1\n\t"
  17030. "lsl r5, r5, %[n]\n\t"
  17031. "lsr r3, r3, r12\n\t"
  17032. "orr r6, r6, r3\n\t"
  17033. "ldr r4, [%[a], #140]\n\t"
  17034. "str r6, [%[r], #148]\n\t"
  17035. "lsr r3, r4, #1\n\t"
  17036. "lsl r4, r4, %[n]\n\t"
  17037. "lsr r3, r3, r12\n\t"
  17038. "orr r5, r5, r3\n\t"
  17039. "ldr r6, [%[a], #136]\n\t"
  17040. "str r5, [%[r], #144]\n\t"
  17041. "lsr r3, r6, #1\n\t"
  17042. "lsl r6, r6, %[n]\n\t"
  17043. "lsr r3, r3, r12\n\t"
  17044. "orr r4, r4, r3\n\t"
  17045. "ldr r5, [%[a], #132]\n\t"
  17046. "str r4, [%[r], #140]\n\t"
  17047. "lsr r3, r5, #1\n\t"
  17048. "lsl r5, r5, %[n]\n\t"
  17049. "lsr r3, r3, r12\n\t"
  17050. "orr r6, r6, r3\n\t"
  17051. "ldr r4, [%[a], #128]\n\t"
  17052. "str r6, [%[r], #136]\n\t"
  17053. "lsr r3, r4, #1\n\t"
  17054. "lsl r4, r4, %[n]\n\t"
  17055. "lsr r3, r3, r12\n\t"
  17056. "orr r5, r5, r3\n\t"
  17057. "ldr r6, [%[a], #124]\n\t"
  17058. "str r5, [%[r], #132]\n\t"
  17059. "lsr r3, r6, #1\n\t"
  17060. "lsl r6, r6, %[n]\n\t"
  17061. "lsr r3, r3, r12\n\t"
  17062. "orr r4, r4, r3\n\t"
  17063. "ldr r5, [%[a], #120]\n\t"
  17064. "str r4, [%[r], #128]\n\t"
  17065. "lsr r3, r5, #1\n\t"
  17066. "lsl r5, r5, %[n]\n\t"
  17067. "lsr r3, r3, r12\n\t"
  17068. "orr r6, r6, r3\n\t"
  17069. "ldr r4, [%[a], #116]\n\t"
  17070. "str r6, [%[r], #124]\n\t"
  17071. "lsr r3, r4, #1\n\t"
  17072. "lsl r4, r4, %[n]\n\t"
  17073. "lsr r3, r3, r12\n\t"
  17074. "orr r5, r5, r3\n\t"
  17075. "ldr r6, [%[a], #112]\n\t"
  17076. "str r5, [%[r], #120]\n\t"
  17077. "lsr r3, r6, #1\n\t"
  17078. "lsl r6, r6, %[n]\n\t"
  17079. "lsr r3, r3, r12\n\t"
  17080. "orr r4, r4, r3\n\t"
  17081. "ldr r5, [%[a], #108]\n\t"
  17082. "str r4, [%[r], #116]\n\t"
  17083. "lsr r3, r5, #1\n\t"
  17084. "lsl r5, r5, %[n]\n\t"
  17085. "lsr r3, r3, r12\n\t"
  17086. "orr r6, r6, r3\n\t"
  17087. "ldr r4, [%[a], #104]\n\t"
  17088. "str r6, [%[r], #112]\n\t"
  17089. "lsr r3, r4, #1\n\t"
  17090. "lsl r4, r4, %[n]\n\t"
  17091. "lsr r3, r3, r12\n\t"
  17092. "orr r5, r5, r3\n\t"
  17093. "ldr r6, [%[a], #100]\n\t"
  17094. "str r5, [%[r], #108]\n\t"
  17095. "lsr r3, r6, #1\n\t"
  17096. "lsl r6, r6, %[n]\n\t"
  17097. "lsr r3, r3, r12\n\t"
  17098. "orr r4, r4, r3\n\t"
  17099. "ldr r5, [%[a], #96]\n\t"
  17100. "str r4, [%[r], #104]\n\t"
  17101. "lsr r3, r5, #1\n\t"
  17102. "lsl r5, r5, %[n]\n\t"
  17103. "lsr r3, r3, r12\n\t"
  17104. "orr r6, r6, r3\n\t"
  17105. "ldr r4, [%[a], #92]\n\t"
  17106. "str r6, [%[r], #100]\n\t"
  17107. "lsr r3, r4, #1\n\t"
  17108. "lsl r4, r4, %[n]\n\t"
  17109. "lsr r3, r3, r12\n\t"
  17110. "orr r5, r5, r3\n\t"
  17111. "ldr r6, [%[a], #88]\n\t"
  17112. "str r5, [%[r], #96]\n\t"
  17113. "lsr r3, r6, #1\n\t"
  17114. "lsl r6, r6, %[n]\n\t"
  17115. "lsr r3, r3, r12\n\t"
  17116. "orr r4, r4, r3\n\t"
  17117. "ldr r5, [%[a], #84]\n\t"
  17118. "str r4, [%[r], #92]\n\t"
  17119. "lsr r3, r5, #1\n\t"
  17120. "lsl r5, r5, %[n]\n\t"
  17121. "lsr r3, r3, r12\n\t"
  17122. "orr r6, r6, r3\n\t"
  17123. "ldr r4, [%[a], #80]\n\t"
  17124. "str r6, [%[r], #88]\n\t"
  17125. "lsr r3, r4, #1\n\t"
  17126. "lsl r4, r4, %[n]\n\t"
  17127. "lsr r3, r3, r12\n\t"
  17128. "orr r5, r5, r3\n\t"
  17129. "ldr r6, [%[a], #76]\n\t"
  17130. "str r5, [%[r], #84]\n\t"
  17131. "lsr r3, r6, #1\n\t"
  17132. "lsl r6, r6, %[n]\n\t"
  17133. "lsr r3, r3, r12\n\t"
  17134. "orr r4, r4, r3\n\t"
  17135. "ldr r5, [%[a], #72]\n\t"
  17136. "str r4, [%[r], #80]\n\t"
  17137. "lsr r3, r5, #1\n\t"
  17138. "lsl r5, r5, %[n]\n\t"
  17139. "lsr r3, r3, r12\n\t"
  17140. "orr r6, r6, r3\n\t"
  17141. "ldr r4, [%[a], #68]\n\t"
  17142. "str r6, [%[r], #76]\n\t"
  17143. "lsr r3, r4, #1\n\t"
  17144. "lsl r4, r4, %[n]\n\t"
  17145. "lsr r3, r3, r12\n\t"
  17146. "orr r5, r5, r3\n\t"
  17147. "ldr r6, [%[a], #64]\n\t"
  17148. "str r5, [%[r], #72]\n\t"
  17149. "lsr r3, r6, #1\n\t"
  17150. "lsl r6, r6, %[n]\n\t"
  17151. "lsr r3, r3, r12\n\t"
  17152. "orr r4, r4, r3\n\t"
  17153. "ldr r5, [%[a], #60]\n\t"
  17154. "str r4, [%[r], #68]\n\t"
  17155. "lsr r3, r5, #1\n\t"
  17156. "lsl r5, r5, %[n]\n\t"
  17157. "lsr r3, r3, r12\n\t"
  17158. "orr r6, r6, r3\n\t"
  17159. "ldr r4, [%[a], #56]\n\t"
  17160. "str r6, [%[r], #64]\n\t"
  17161. "lsr r3, r4, #1\n\t"
  17162. "lsl r4, r4, %[n]\n\t"
  17163. "lsr r3, r3, r12\n\t"
  17164. "orr r5, r5, r3\n\t"
  17165. "ldr r6, [%[a], #52]\n\t"
  17166. "str r5, [%[r], #60]\n\t"
  17167. "lsr r3, r6, #1\n\t"
  17168. "lsl r6, r6, %[n]\n\t"
  17169. "lsr r3, r3, r12\n\t"
  17170. "orr r4, r4, r3\n\t"
  17171. "ldr r5, [%[a], #48]\n\t"
  17172. "str r4, [%[r], #56]\n\t"
  17173. "lsr r3, r5, #1\n\t"
  17174. "lsl r5, r5, %[n]\n\t"
  17175. "lsr r3, r3, r12\n\t"
  17176. "orr r6, r6, r3\n\t"
  17177. "ldr r4, [%[a], #44]\n\t"
  17178. "str r6, [%[r], #52]\n\t"
  17179. "lsr r3, r4, #1\n\t"
  17180. "lsl r4, r4, %[n]\n\t"
  17181. "lsr r3, r3, r12\n\t"
  17182. "orr r5, r5, r3\n\t"
  17183. "ldr r6, [%[a], #40]\n\t"
  17184. "str r5, [%[r], #48]\n\t"
  17185. "lsr r3, r6, #1\n\t"
  17186. "lsl r6, r6, %[n]\n\t"
  17187. "lsr r3, r3, r12\n\t"
  17188. "orr r4, r4, r3\n\t"
  17189. "ldr r5, [%[a], #36]\n\t"
  17190. "str r4, [%[r], #44]\n\t"
  17191. "lsr r3, r5, #1\n\t"
  17192. "lsl r5, r5, %[n]\n\t"
  17193. "lsr r3, r3, r12\n\t"
  17194. "orr r6, r6, r3\n\t"
  17195. "ldr r4, [%[a], #32]\n\t"
  17196. "str r6, [%[r], #40]\n\t"
  17197. "lsr r3, r4, #1\n\t"
  17198. "lsl r4, r4, %[n]\n\t"
  17199. "lsr r3, r3, r12\n\t"
  17200. "orr r5, r5, r3\n\t"
  17201. "ldr r6, [%[a], #28]\n\t"
  17202. "str r5, [%[r], #36]\n\t"
  17203. "lsr r3, r6, #1\n\t"
  17204. "lsl r6, r6, %[n]\n\t"
  17205. "lsr r3, r3, r12\n\t"
  17206. "orr r4, r4, r3\n\t"
  17207. "ldr r5, [%[a], #24]\n\t"
  17208. "str r4, [%[r], #32]\n\t"
  17209. "lsr r3, r5, #1\n\t"
  17210. "lsl r5, r5, %[n]\n\t"
  17211. "lsr r3, r3, r12\n\t"
  17212. "orr r6, r6, r3\n\t"
  17213. "ldr r4, [%[a], #20]\n\t"
  17214. "str r6, [%[r], #28]\n\t"
  17215. "lsr r3, r4, #1\n\t"
  17216. "lsl r4, r4, %[n]\n\t"
  17217. "lsr r3, r3, r12\n\t"
  17218. "orr r5, r5, r3\n\t"
  17219. "ldr r6, [%[a], #16]\n\t"
  17220. "str r5, [%[r], #24]\n\t"
  17221. "lsr r3, r6, #1\n\t"
  17222. "lsl r6, r6, %[n]\n\t"
  17223. "lsr r3, r3, r12\n\t"
  17224. "orr r4, r4, r3\n\t"
  17225. "ldr r5, [%[a], #12]\n\t"
  17226. "str r4, [%[r], #20]\n\t"
  17227. "lsr r3, r5, #1\n\t"
  17228. "lsl r5, r5, %[n]\n\t"
  17229. "lsr r3, r3, r12\n\t"
  17230. "orr r6, r6, r3\n\t"
  17231. "ldr r4, [%[a], #8]\n\t"
  17232. "str r6, [%[r], #16]\n\t"
  17233. "lsr r3, r4, #1\n\t"
  17234. "lsl r4, r4, %[n]\n\t"
  17235. "lsr r3, r3, r12\n\t"
  17236. "orr r5, r5, r3\n\t"
  17237. "ldr r6, [%[a], #4]\n\t"
  17238. "str r5, [%[r], #12]\n\t"
  17239. "lsr r3, r6, #1\n\t"
  17240. "lsl r6, r6, %[n]\n\t"
  17241. "lsr r3, r3, r12\n\t"
  17242. "orr r4, r4, r3\n\t"
  17243. "ldr r5, [%[a]]\n\t"
  17244. "str r4, [%[r], #8]\n\t"
  17245. "lsr r3, r5, #1\n\t"
  17246. "lsl r5, r5, %[n]\n\t"
  17247. "lsr r3, r3, r12\n\t"
  17248. "orr r6, r6, r3\n\t"
  17249. "str r5, [%[r]]\n\t"
  17250. "str r6, [%[r], #4]\n\t"
  17251. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  17252. :
  17253. : "memory", "r4", "r5", "r6", "r3", "r12"
  17254. );
  17255. }
  17256. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  17257. *
  17258. * r A single precision number that is the result of the operation.
  17259. * e A single precision number that is the exponent.
  17260. * bits The number of bits in the exponent.
  17261. * m A single precision number that is the modulus.
  17262. * returns 0 on success.
  17263. * returns MEMORY_E on dynamic memory allocation failure.
  17264. * returns MP_VAL when base is even.
  17265. */
  17266. static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits,
  17267. const sp_digit* m)
  17268. {
  17269. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  17270. sp_digit* td = NULL;
  17271. #else
  17272. sp_digit td[193];
  17273. #endif
  17274. sp_digit* norm = NULL;
  17275. sp_digit* tmp = NULL;
  17276. sp_digit mp = 1;
  17277. sp_digit n;
  17278. sp_digit o;
  17279. sp_digit mask;
  17280. int i;
  17281. int c;
  17282. byte y;
  17283. int err = MP_OKAY;
  17284. if (bits == 0) {
  17285. err = MP_VAL;
  17286. }
  17287. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  17288. if (err == MP_OKAY) {
  17289. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL,
  17290. DYNAMIC_TYPE_TMP_BUFFER);
  17291. if (td == NULL)
  17292. err = MEMORY_E;
  17293. }
  17294. #endif
  17295. if (err == MP_OKAY) {
  17296. norm = td;
  17297. tmp = td + 128;
  17298. sp_2048_mont_setup(m, &mp);
  17299. sp_2048_mont_norm_64(norm, m);
  17300. i = (bits - 1) / 32;
  17301. n = e[i--];
  17302. c = bits & 31;
  17303. if (c == 0) {
  17304. c = 32;
  17305. }
  17306. c -= bits % 5;
  17307. if (c == 32) {
  17308. c = 27;
  17309. }
  17310. if (c < 0) {
  17311. /* Number of bits in top word is less than number needed. */
  17312. c = -c;
  17313. y = (byte)(n << c);
  17314. n = e[i--];
  17315. y |= (byte)(n >> (64 - c));
  17316. n <<= c;
  17317. c = 64 - c;
  17318. }
  17319. else if (c == 0) {
  17320. /* All bits in top word used. */
  17321. y = (byte)n;
  17322. }
  17323. else {
  17324. y = (byte)(n >> c);
  17325. n <<= 32 - c;
  17326. }
  17327. sp_2048_lshift_64(r, norm, y);
  17328. for (; i>=0 || c>=5; ) {
  17329. if (c == 0) {
  17330. n = e[i--];
  17331. y = (byte)(n >> 27);
  17332. n <<= 5;
  17333. c = 27;
  17334. }
  17335. else if (c < 5) {
  17336. y = (byte)(n >> 27);
  17337. n = e[i--];
  17338. c = 5 - c;
  17339. y |= (byte)(n >> (32 - c));
  17340. n <<= c;
  17341. c = 32 - c;
  17342. }
  17343. else {
  17344. y = (byte)((n >> 27) & 0x1f);
  17345. n <<= 5;
  17346. c -= 5;
  17347. }
  17348. sp_2048_mont_sqr_64(r, r, m, mp);
  17349. sp_2048_mont_sqr_64(r, r, m, mp);
  17350. sp_2048_mont_sqr_64(r, r, m, mp);
  17351. sp_2048_mont_sqr_64(r, r, m, mp);
  17352. sp_2048_mont_sqr_64(r, r, m, mp);
  17353. sp_2048_lshift_64(r, r, y);
  17354. sp_2048_mul_d_64(tmp, norm, r[64]);
  17355. r[64] = 0;
  17356. o = sp_2048_add_64(r, r, tmp);
  17357. sp_2048_cond_sub_64(r, r, m, (sp_digit)0 - o);
  17358. }
  17359. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  17360. sp_2048_mont_reduce_64(r, m, mp);
  17361. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  17362. sp_2048_cond_sub_64(r, r, m, mask);
  17363. }
  17364. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  17365. if (td != NULL)
  17366. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17367. #endif
  17368. return err;
  17369. }
  17370. #endif /* HAVE_FFDHE_2048 */
  17371. /* Perform the modular exponentiation for Diffie-Hellman.
  17372. *
  17373. * base Base.
  17374. * exp Array of bytes that is the exponent.
  17375. * expLen Length of data, in bytes, in exponent.
  17376. * mod Modulus.
  17377. * out Buffer to hold big-endian bytes of exponentiation result.
  17378. * Must be at least 256 bytes long.
  17379. * outLen Length, in bytes, of exponentiation result.
  17380. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  17381. * and MEMORY_E if memory allocation fails.
  17382. */
  17383. int sp_DhExp_2048(const mp_int* base, const byte* exp, word32 expLen,
  17384. const mp_int* mod, byte* out, word32* outLen)
  17385. {
  17386. int err = MP_OKAY;
  17387. sp_digit b[128];
  17388. sp_digit e[64];
  17389. sp_digit m[64];
  17390. sp_digit* r = b;
  17391. word32 i;
  17392. if (mp_count_bits(base) > 2048) {
  17393. err = MP_READ_E;
  17394. }
  17395. else if (expLen > 256) {
  17396. err = MP_READ_E;
  17397. }
  17398. else if (mp_count_bits(mod) != 2048) {
  17399. err = MP_READ_E;
  17400. }
  17401. else if (mp_iseven(mod)) {
  17402. err = MP_VAL;
  17403. }
  17404. if (err == MP_OKAY) {
  17405. sp_2048_from_mp(b, 64, base);
  17406. sp_2048_from_bin(e, 64, exp, expLen);
  17407. sp_2048_from_mp(m, 64, mod);
  17408. #ifdef HAVE_FFDHE_2048
  17409. if (base->used == 1 && base->dp[0] == 2 && m[63] == (sp_digit)-1)
  17410. err = sp_2048_mod_exp_2_64(r, e, expLen * 8, m);
  17411. else
  17412. #endif
  17413. err = sp_2048_mod_exp_64(r, b, e, expLen * 8, m, 0);
  17414. }
  17415. if (err == MP_OKAY) {
  17416. sp_2048_to_bin_64(r, out);
  17417. *outLen = 256;
  17418. for (i=0; i<256 && out[i] == 0; i++) {
  17419. /* Search for first non-zero. */
  17420. }
  17421. *outLen -= i;
  17422. XMEMMOVE(out, out + i, *outLen);
  17423. }
  17424. XMEMSET(e, 0, sizeof(e));
  17425. return err;
  17426. }
  17427. #endif /* WOLFSSL_HAVE_SP_DH */
  17428. /* Perform the modular exponentiation for Diffie-Hellman.
  17429. *
  17430. * base Base. MP integer.
  17431. * exp Exponent. MP integer.
  17432. * mod Modulus. MP integer.
  17433. * res Result. MP integer.
  17434. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  17435. * and MEMORY_E if memory allocation fails.
  17436. */
  17437. int sp_ModExp_1024(const mp_int* base, const mp_int* exp, const mp_int* mod,
  17438. mp_int* res)
  17439. {
  17440. int err = MP_OKAY;
  17441. sp_digit b[64];
  17442. sp_digit e[32];
  17443. sp_digit m[32];
  17444. sp_digit* r = b;
  17445. int expBits = mp_count_bits(exp);
  17446. if (mp_count_bits(base) > 1024) {
  17447. err = MP_READ_E;
  17448. }
  17449. else if (expBits > 1024) {
  17450. err = MP_READ_E;
  17451. }
  17452. else if (mp_count_bits(mod) != 1024) {
  17453. err = MP_READ_E;
  17454. }
  17455. else if (mp_iseven(mod)) {
  17456. err = MP_VAL;
  17457. }
  17458. if (err == MP_OKAY) {
  17459. sp_2048_from_mp(b, 32, base);
  17460. sp_2048_from_mp(e, 32, exp);
  17461. sp_2048_from_mp(m, 32, mod);
  17462. err = sp_2048_mod_exp_32(r, b, e, expBits, m, 0);
  17463. }
  17464. if (err == MP_OKAY) {
  17465. XMEMSET(r + 32, 0, sizeof(*r) * 32U);
  17466. err = sp_2048_to_mp(r, res);
  17467. res->used = mod->used;
  17468. mp_clamp(res);
  17469. }
  17470. XMEMSET(e, 0, sizeof(e));
  17471. return err;
  17472. }
  17473. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  17474. #endif /* !WOLFSSL_SP_NO_2048 */
  17475. #ifndef WOLFSSL_SP_NO_3072
  17476. /* Read big endian unsigned byte array into r.
  17477. *
  17478. * r A single precision integer.
  17479. * size Maximum number of bytes to convert
  17480. * a Byte array.
  17481. * n Number of bytes in array to read.
  17482. */
  17483. static void sp_3072_from_bin(sp_digit* r, int size, const byte* a, int n)
  17484. {
  17485. int i;
  17486. int j;
  17487. byte* d;
  17488. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  17489. r[j] = ((sp_digit)a[i - 0] << 0) |
  17490. ((sp_digit)a[i - 1] << 8) |
  17491. ((sp_digit)a[i - 2] << 16) |
  17492. ((sp_digit)a[i - 3] << 24);
  17493. j++;
  17494. }
  17495. if (i >= 0) {
  17496. r[j] = 0;
  17497. d = (byte*)r;
  17498. switch (i) {
  17499. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  17500. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  17501. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  17502. }
  17503. j++;
  17504. }
  17505. for (; j < size; j++) {
  17506. r[j] = 0;
  17507. }
  17508. }
  17509. /* Convert an mp_int to an array of sp_digit.
  17510. *
  17511. * r A single precision integer.
  17512. * size Maximum number of bytes to convert
  17513. * a A multi-precision integer.
  17514. */
  17515. static void sp_3072_from_mp(sp_digit* r, int size, const mp_int* a)
  17516. {
  17517. #if DIGIT_BIT == 32
  17518. int i;
  17519. int j = 0;
  17520. for (i = 0; i < size; i++) {
  17521. sp_digit mask =
  17522. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  17523. r[i] = a->dp[j] & mask;
  17524. j += (int)(((sp_digit)1) -
  17525. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  17526. }
  17527. #elif DIGIT_BIT > 32
  17528. int i;
  17529. int j = 0;
  17530. word32 s = 0;
  17531. r[0] = 0;
  17532. for (i = 0; i < a->used && j < size; i++) {
  17533. r[j] |= ((sp_digit)a->dp[i] << s);
  17534. r[j] &= 0xffffffff;
  17535. s = 32U - s;
  17536. if (j + 1 >= size) {
  17537. break;
  17538. }
  17539. /* lint allow cast of mismatch word32 and mp_digit */
  17540. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  17541. while ((s + 32U) <= (word32)DIGIT_BIT) {
  17542. s += 32U;
  17543. r[j] &= 0xffffffff;
  17544. if (j + 1 >= size) {
  17545. break;
  17546. }
  17547. if (s < (word32)DIGIT_BIT) {
  17548. /* lint allow cast of mismatch word32 and mp_digit */
  17549. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  17550. }
  17551. else {
  17552. r[++j] = (sp_digit)0;
  17553. }
  17554. }
  17555. s = (word32)DIGIT_BIT - s;
  17556. }
  17557. for (j++; j < size; j++) {
  17558. r[j] = 0;
  17559. }
  17560. #else
  17561. int i;
  17562. int j = 0;
  17563. int s = 0;
  17564. r[0] = 0;
  17565. for (i = 0; i < a->used && j < size; i++) {
  17566. r[j] |= ((sp_digit)a->dp[i]) << s;
  17567. if (s + DIGIT_BIT >= 32) {
  17568. r[j] &= 0xffffffff;
  17569. if (j + 1 >= size) {
  17570. break;
  17571. }
  17572. s = 32 - s;
  17573. if (s == DIGIT_BIT) {
  17574. r[++j] = 0;
  17575. s = 0;
  17576. }
  17577. else {
  17578. r[++j] = a->dp[i] >> s;
  17579. s = DIGIT_BIT - s;
  17580. }
  17581. }
  17582. else {
  17583. s += DIGIT_BIT;
  17584. }
  17585. }
  17586. for (j++; j < size; j++) {
  17587. r[j] = 0;
  17588. }
  17589. #endif
  17590. }
  17591. /* Write r as big endian to byte array.
  17592. * Fixed length number of bytes written: 384
  17593. *
  17594. * r A single precision integer.
  17595. * a Byte array.
  17596. */
  17597. static void sp_3072_to_bin_96(sp_digit* r, byte* a)
  17598. {
  17599. int i;
  17600. int j = 0;
  17601. for (i = 95; i >= 0; i--) {
  17602. a[j++] = r[i] >> 24;
  17603. a[j++] = r[i] >> 16;
  17604. a[j++] = r[i] >> 8;
  17605. a[j++] = r[i] >> 0;
  17606. }
  17607. }
  17608. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  17609. /* Normalize the values in each word to 32.
  17610. *
  17611. * a Array of sp_digit to normalize.
  17612. */
  17613. #define sp_3072_norm_96(a)
  17614. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  17615. /* Normalize the values in each word to 32.
  17616. *
  17617. * a Array of sp_digit to normalize.
  17618. */
  17619. #define sp_3072_norm_96(a)
  17620. #ifndef WOLFSSL_SP_SMALL
  17621. /* Multiply a and b into r. (r = a * b)
  17622. *
  17623. * r A single precision integer.
  17624. * a A single precision integer.
  17625. * b A single precision integer.
  17626. */
  17627. static void sp_3072_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  17628. {
  17629. register sp_digit* r asm ("r0") = r_p;
  17630. register const sp_digit* a asm ("r1") = a_p;
  17631. register const sp_digit* b asm ("r2") = b_p;
  17632. __asm__ __volatile__ (
  17633. "sub sp, sp, #48\n\t"
  17634. "mov r10, #0\n\t"
  17635. /* A[0] * B[0] */
  17636. "ldr r11, [%[a]]\n\t"
  17637. "ldr r12, [%[b]]\n\t"
  17638. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  17639. "lsl r6, r11, #16\n\t"
  17640. "lsl r3, r12, #16\n\t"
  17641. "lsr r6, r6, #16\n\t"
  17642. "lsr r3, r3, #16\n\t"
  17643. "mul r3, r6, r3\n\t"
  17644. "lsr r7, r12, #16\n\t"
  17645. "mul r6, r7, r6\n\t"
  17646. "lsr r4, r6, #16\n\t"
  17647. "lsl r6, r6, #16\n\t"
  17648. "adds r3, r3, r6\n\t"
  17649. "adc r4, r4, #0\n\t"
  17650. "lsr r6, r11, #16\n\t"
  17651. "mul r7, r6, r7\n\t"
  17652. "add r4, r4, r7\n\t"
  17653. "lsl r7, r12, #16\n\t"
  17654. "lsr r7, r7, #16\n\t"
  17655. "mul r6, r7, r6\n\t"
  17656. "lsr r7, r6, #16\n\t"
  17657. "lsl r6, r6, #16\n\t"
  17658. "adds r3, r3, r6\n\t"
  17659. "adc r4, r4, r7\n\t"
  17660. "mov r5, #0\n\t"
  17661. #else
  17662. "umull r3, r4, r11, r12\n\t"
  17663. "mov r5, #0\n\t"
  17664. #endif
  17665. "str r3, [sp]\n\t"
  17666. /* A[0] * B[1] */
  17667. "ldr r9, [%[b], #4]\n\t"
  17668. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  17669. "lsl r6, r11, #16\n\t"
  17670. "lsl r7, r9, #16\n\t"
  17671. "lsr r6, r6, #16\n\t"
  17672. "lsr r7, r7, #16\n\t"
  17673. "mul r7, r6, r7\n\t"
  17674. "adds r4, r4, r7\n\t"
  17675. "adcs r5, r5, #0\n\t"
  17676. "mov r3, #0\n\t"
  17677. "adc r3, r3, #0\n\t"
  17678. "lsr r7, r9, #16\n\t"
  17679. "mul r6, r7, r6\n\t"
  17680. "lsr r7, r6, #16\n\t"
  17681. "lsl r6, r6, #16\n\t"
  17682. "adds r4, r4, r6\n\t"
  17683. "adcs r5, r5, r7\n\t"
  17684. "adc r3, r3, #0\n\t"
  17685. "lsr r6, r11, #16\n\t"
  17686. "lsr r7, r9, #16\n\t"
  17687. "mul r7, r6, r7\n\t"
  17688. "adds r5, r5, r7\n\t"
  17689. "adc r3, r3, #0\n\t"
  17690. "lsl r7, r9, #16\n\t"
  17691. "lsr r7, r7, #16\n\t"
  17692. "mul r6, r7, r6\n\t"
  17693. "lsr r7, r6, #16\n\t"
  17694. "lsl r6, r6, #16\n\t"
  17695. "adds r4, r4, r6\n\t"
  17696. "adcs r5, r5, r7\n\t"
  17697. "adc r3, r3, #0\n\t"
  17698. #else
  17699. "umull r6, r7, r11, r9\n\t"
  17700. "adds r4, r4, r6\n\t"
  17701. "adcs r5, r5, r7\n\t"
  17702. "mov r3, #0\n\t"
  17703. "adc r3, r3, #0\n\t"
  17704. #endif
  17705. /* A[1] * B[0] */
  17706. "ldr r8, [%[a], #4]\n\t"
  17707. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  17708. "lsl r6, r8, #16\n\t"
  17709. "lsl r7, r12, #16\n\t"
  17710. "lsr r6, r6, #16\n\t"
  17711. "lsr r7, r7, #16\n\t"
  17712. "mul r7, r6, r7\n\t"
  17713. "adds r4, r4, r7\n\t"
  17714. "adcs r5, r5, #0\n\t"
  17715. "adc r3, r3, #0\n\t"
  17716. "lsr r7, r12, #16\n\t"
  17717. "mul r6, r7, r6\n\t"
  17718. "lsr r7, r6, #16\n\t"
  17719. "lsl r6, r6, #16\n\t"
  17720. "adds r4, r4, r6\n\t"
  17721. "adcs r5, r5, r7\n\t"
  17722. "adc r3, r3, #0\n\t"
  17723. "lsr r6, r8, #16\n\t"
  17724. "lsr r7, r12, #16\n\t"
  17725. "mul r7, r6, r7\n\t"
  17726. "adds r5, r5, r7\n\t"
  17727. "adc r3, r3, #0\n\t"
  17728. "lsl r7, r12, #16\n\t"
  17729. "lsr r7, r7, #16\n\t"
  17730. "mul r6, r7, r6\n\t"
  17731. "lsr r7, r6, #16\n\t"
  17732. "lsl r6, r6, #16\n\t"
  17733. "adds r4, r4, r6\n\t"
  17734. "adcs r5, r5, r7\n\t"
  17735. "adc r3, r3, #0\n\t"
  17736. #else
  17737. "umull r6, r7, r8, r12\n\t"
  17738. "adds r4, r4, r6\n\t"
  17739. "adcs r5, r5, r7\n\t"
  17740. "adc r3, r3, #0\n\t"
  17741. #endif
  17742. "str r4, [sp, #4]\n\t"
  17743. /* A[2] * B[0] */
  17744. "ldr r8, [%[a], #8]\n\t"
  17745. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  17746. "lsl r6, r8, #16\n\t"
  17747. "lsl r7, r12, #16\n\t"
  17748. "lsr r6, r6, #16\n\t"
  17749. "lsr r7, r7, #16\n\t"
  17750. "mul r7, r6, r7\n\t"
  17751. "adds r5, r5, r7\n\t"
  17752. "adcs r3, r3, #0\n\t"
  17753. "mov r4, #0\n\t"
  17754. "adc r4, r4, #0\n\t"
  17755. "lsr r7, r12, #16\n\t"
  17756. "mul r6, r7, r6\n\t"
  17757. "lsr r7, r6, #16\n\t"
  17758. "lsl r6, r6, #16\n\t"
  17759. "adds r5, r5, r6\n\t"
  17760. "adcs r3, r3, r7\n\t"
  17761. "adc r4, r4, #0\n\t"
  17762. "lsr r6, r8, #16\n\t"
  17763. "lsr r7, r12, #16\n\t"
  17764. "mul r7, r6, r7\n\t"
  17765. "adds r3, r3, r7\n\t"
  17766. "adc r4, r4, #0\n\t"
  17767. "lsl r7, r12, #16\n\t"
  17768. "lsr r7, r7, #16\n\t"
  17769. "mul r6, r7, r6\n\t"
  17770. "lsr r7, r6, #16\n\t"
  17771. "lsl r6, r6, #16\n\t"
  17772. "adds r5, r5, r6\n\t"
  17773. "adcs r3, r3, r7\n\t"
  17774. "adc r4, r4, #0\n\t"
  17775. #else
  17776. "umull r6, r7, r8, r12\n\t"
  17777. "adds r5, r5, r6\n\t"
  17778. "adcs r3, r3, r7\n\t"
  17779. "mov r4, #0\n\t"
  17780. "adc r4, r4, #0\n\t"
  17781. #endif
  17782. /* A[1] * B[1] */
  17783. "ldr r11, [%[a], #4]\n\t"
  17784. "ldr r12, [%[b], #4]\n\t"
  17785. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  17786. "lsl r6, r11, #16\n\t"
  17787. "lsl r7, r12, #16\n\t"
  17788. "lsr r6, r6, #16\n\t"
  17789. "lsr r7, r7, #16\n\t"
  17790. "mul r7, r6, r7\n\t"
  17791. "adds r5, r5, r7\n\t"
  17792. "adcs r3, r3, #0\n\t"
  17793. "adc r4, r4, #0\n\t"
  17794. "lsr r7, r12, #16\n\t"
  17795. "mul r6, r7, r6\n\t"
  17796. "lsr r7, r6, #16\n\t"
  17797. "lsl r6, r6, #16\n\t"
  17798. "adds r5, r5, r6\n\t"
  17799. "adcs r3, r3, r7\n\t"
  17800. "adc r4, r4, #0\n\t"
  17801. "lsr r6, r11, #16\n\t"
  17802. "lsr r7, r12, #16\n\t"
  17803. "mul r7, r6, r7\n\t"
  17804. "adds r3, r3, r7\n\t"
  17805. "adc r4, r4, #0\n\t"
  17806. "lsl r7, r12, #16\n\t"
  17807. "lsr r7, r7, #16\n\t"
  17808. "mul r6, r7, r6\n\t"
  17809. "lsr r7, r6, #16\n\t"
  17810. "lsl r6, r6, #16\n\t"
  17811. "adds r5, r5, r6\n\t"
  17812. "adcs r3, r3, r7\n\t"
  17813. "adc r4, r4, #0\n\t"
  17814. #else
  17815. "umull r6, r7, r11, r12\n\t"
  17816. "adds r5, r5, r6\n\t"
  17817. "adcs r3, r3, r7\n\t"
  17818. "adc r4, r4, #0\n\t"
  17819. #endif
  17820. /* A[0] * B[2] */
  17821. "ldr r8, [%[a]]\n\t"
  17822. "ldr r9, [%[b], #8]\n\t"
  17823. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  17824. "lsl r6, r8, #16\n\t"
  17825. "lsl r7, r9, #16\n\t"
  17826. "lsr r6, r6, #16\n\t"
  17827. "lsr r7, r7, #16\n\t"
  17828. "mul r7, r6, r7\n\t"
  17829. "adds r5, r5, r7\n\t"
  17830. "adcs r3, r3, #0\n\t"
  17831. "adc r4, r4, #0\n\t"
  17832. "lsr r7, r9, #16\n\t"
  17833. "mul r6, r7, r6\n\t"
  17834. "lsr r7, r6, #16\n\t"
  17835. "lsl r6, r6, #16\n\t"
  17836. "adds r5, r5, r6\n\t"
  17837. "adcs r3, r3, r7\n\t"
  17838. "adc r4, r4, #0\n\t"
  17839. "lsr r6, r8, #16\n\t"
  17840. "lsr r7, r9, #16\n\t"
  17841. "mul r7, r6, r7\n\t"
  17842. "adds r3, r3, r7\n\t"
  17843. "adc r4, r4, #0\n\t"
  17844. "lsl r7, r9, #16\n\t"
  17845. "lsr r7, r7, #16\n\t"
  17846. "mul r6, r7, r6\n\t"
  17847. "lsr r7, r6, #16\n\t"
  17848. "lsl r6, r6, #16\n\t"
  17849. "adds r5, r5, r6\n\t"
  17850. "adcs r3, r3, r7\n\t"
  17851. "adc r4, r4, #0\n\t"
  17852. #else
  17853. "umull r6, r7, r8, r9\n\t"
  17854. "adds r5, r5, r6\n\t"
  17855. "adcs r3, r3, r7\n\t"
  17856. "adc r4, r4, #0\n\t"
  17857. #endif
  17858. "str r5, [sp, #8]\n\t"
  17859. /* A[0] * B[3] */
  17860. "ldr r9, [%[b], #12]\n\t"
  17861. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  17862. "lsl r6, r8, #16\n\t"
  17863. "lsl r7, r9, #16\n\t"
  17864. "lsr r6, r6, #16\n\t"
  17865. "lsr r7, r7, #16\n\t"
  17866. "mul r7, r6, r7\n\t"
  17867. "adds r3, r3, r7\n\t"
  17868. "adcs r4, r4, #0\n\t"
  17869. "mov r5, #0\n\t"
  17870. "adc r5, r5, #0\n\t"
  17871. "lsr r7, r9, #16\n\t"
  17872. "mul r6, r7, r6\n\t"
  17873. "lsr r7, r6, #16\n\t"
  17874. "lsl r6, r6, #16\n\t"
  17875. "adds r3, r3, r6\n\t"
  17876. "adcs r4, r4, r7\n\t"
  17877. "adc r5, r5, #0\n\t"
  17878. "lsr r6, r8, #16\n\t"
  17879. "lsr r7, r9, #16\n\t"
  17880. "mul r7, r6, r7\n\t"
  17881. "adds r4, r4, r7\n\t"
  17882. "adc r5, r5, #0\n\t"
  17883. "lsl r7, r9, #16\n\t"
  17884. "lsr r7, r7, #16\n\t"
  17885. "mul r6, r7, r6\n\t"
  17886. "lsr r7, r6, #16\n\t"
  17887. "lsl r6, r6, #16\n\t"
  17888. "adds r3, r3, r6\n\t"
  17889. "adcs r4, r4, r7\n\t"
  17890. "adc r5, r5, #0\n\t"
  17891. #else
  17892. "umull r6, r7, r8, r9\n\t"
  17893. "adds r3, r3, r6\n\t"
  17894. "adcs r4, r4, r7\n\t"
  17895. "mov r5, #0\n\t"
  17896. "adc r5, r5, #0\n\t"
  17897. #endif
  17898. /* A[1] * B[2] */
  17899. "ldr r9, [%[b], #8]\n\t"
  17900. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  17901. "lsl r6, r11, #16\n\t"
  17902. "lsl r7, r9, #16\n\t"
  17903. "lsr r6, r6, #16\n\t"
  17904. "lsr r7, r7, #16\n\t"
  17905. "mul r7, r6, r7\n\t"
  17906. "adds r3, r3, r7\n\t"
  17907. "adcs r4, r4, #0\n\t"
  17908. "adc r5, r5, #0\n\t"
  17909. "lsr r7, r9, #16\n\t"
  17910. "mul r6, r7, r6\n\t"
  17911. "lsr r7, r6, #16\n\t"
  17912. "lsl r6, r6, #16\n\t"
  17913. "adds r3, r3, r6\n\t"
  17914. "adcs r4, r4, r7\n\t"
  17915. "adc r5, r5, #0\n\t"
  17916. "lsr r6, r11, #16\n\t"
  17917. "lsr r7, r9, #16\n\t"
  17918. "mul r7, r6, r7\n\t"
  17919. "adds r4, r4, r7\n\t"
  17920. "adc r5, r5, #0\n\t"
  17921. "lsl r7, r9, #16\n\t"
  17922. "lsr r7, r7, #16\n\t"
  17923. "mul r6, r7, r6\n\t"
  17924. "lsr r7, r6, #16\n\t"
  17925. "lsl r6, r6, #16\n\t"
  17926. "adds r3, r3, r6\n\t"
  17927. "adcs r4, r4, r7\n\t"
  17928. "adc r5, r5, #0\n\t"
  17929. #else
  17930. "umull r6, r7, r11, r9\n\t"
  17931. "adds r3, r3, r6\n\t"
  17932. "adcs r4, r4, r7\n\t"
  17933. "adc r5, r5, #0\n\t"
  17934. #endif
  17935. /* A[2] * B[1] */
  17936. "ldr r8, [%[a], #8]\n\t"
  17937. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  17938. "lsl r6, r8, #16\n\t"
  17939. "lsl r7, r12, #16\n\t"
  17940. "lsr r6, r6, #16\n\t"
  17941. "lsr r7, r7, #16\n\t"
  17942. "mul r7, r6, r7\n\t"
  17943. "adds r3, r3, r7\n\t"
  17944. "adcs r4, r4, #0\n\t"
  17945. "adc r5, r5, #0\n\t"
  17946. "lsr r7, r12, #16\n\t"
  17947. "mul r6, r7, r6\n\t"
  17948. "lsr r7, r6, #16\n\t"
  17949. "lsl r6, r6, #16\n\t"
  17950. "adds r3, r3, r6\n\t"
  17951. "adcs r4, r4, r7\n\t"
  17952. "adc r5, r5, #0\n\t"
  17953. "lsr r6, r8, #16\n\t"
  17954. "lsr r7, r12, #16\n\t"
  17955. "mul r7, r6, r7\n\t"
  17956. "adds r4, r4, r7\n\t"
  17957. "adc r5, r5, #0\n\t"
  17958. "lsl r7, r12, #16\n\t"
  17959. "lsr r7, r7, #16\n\t"
  17960. "mul r6, r7, r6\n\t"
  17961. "lsr r7, r6, #16\n\t"
  17962. "lsl r6, r6, #16\n\t"
  17963. "adds r3, r3, r6\n\t"
  17964. "adcs r4, r4, r7\n\t"
  17965. "adc r5, r5, #0\n\t"
  17966. #else
  17967. "umull r6, r7, r8, r12\n\t"
  17968. "adds r3, r3, r6\n\t"
  17969. "adcs r4, r4, r7\n\t"
  17970. "adc r5, r5, #0\n\t"
  17971. #endif
  17972. /* A[3] * B[0] */
  17973. "ldr r8, [%[a], #12]\n\t"
  17974. "ldr r9, [%[b]]\n\t"
  17975. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  17976. "lsl r6, r8, #16\n\t"
  17977. "lsl r7, r9, #16\n\t"
  17978. "lsr r6, r6, #16\n\t"
  17979. "lsr r7, r7, #16\n\t"
  17980. "mul r7, r6, r7\n\t"
  17981. "adds r3, r3, r7\n\t"
  17982. "adcs r4, r4, #0\n\t"
  17983. "adc r5, r5, #0\n\t"
  17984. "lsr r7, r9, #16\n\t"
  17985. "mul r6, r7, r6\n\t"
  17986. "lsr r7, r6, #16\n\t"
  17987. "lsl r6, r6, #16\n\t"
  17988. "adds r3, r3, r6\n\t"
  17989. "adcs r4, r4, r7\n\t"
  17990. "adc r5, r5, #0\n\t"
  17991. "lsr r6, r8, #16\n\t"
  17992. "lsr r7, r9, #16\n\t"
  17993. "mul r7, r6, r7\n\t"
  17994. "adds r4, r4, r7\n\t"
  17995. "adc r5, r5, #0\n\t"
  17996. "lsl r7, r9, #16\n\t"
  17997. "lsr r7, r7, #16\n\t"
  17998. "mul r6, r7, r6\n\t"
  17999. "lsr r7, r6, #16\n\t"
  18000. "lsl r6, r6, #16\n\t"
  18001. "adds r3, r3, r6\n\t"
  18002. "adcs r4, r4, r7\n\t"
  18003. "adc r5, r5, #0\n\t"
  18004. #else
  18005. "umull r6, r7, r8, r9\n\t"
  18006. "adds r3, r3, r6\n\t"
  18007. "adcs r4, r4, r7\n\t"
  18008. "adc r5, r5, #0\n\t"
  18009. #endif
  18010. "str r3, [sp, #12]\n\t"
  18011. /* A[4] * B[0] */
  18012. "ldr r8, [%[a], #16]\n\t"
  18013. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18014. "lsl r6, r8, #16\n\t"
  18015. "lsl r7, r9, #16\n\t"
  18016. "lsr r6, r6, #16\n\t"
  18017. "lsr r7, r7, #16\n\t"
  18018. "mul r7, r6, r7\n\t"
  18019. "adds r4, r4, r7\n\t"
  18020. "adcs r5, r5, #0\n\t"
  18021. "mov r3, #0\n\t"
  18022. "adc r3, r3, #0\n\t"
  18023. "lsr r7, r9, #16\n\t"
  18024. "mul r6, r7, r6\n\t"
  18025. "lsr r7, r6, #16\n\t"
  18026. "lsl r6, r6, #16\n\t"
  18027. "adds r4, r4, r6\n\t"
  18028. "adcs r5, r5, r7\n\t"
  18029. "adc r3, r3, #0\n\t"
  18030. "lsr r6, r8, #16\n\t"
  18031. "lsr r7, r9, #16\n\t"
  18032. "mul r7, r6, r7\n\t"
  18033. "adds r5, r5, r7\n\t"
  18034. "adc r3, r3, #0\n\t"
  18035. "lsl r7, r9, #16\n\t"
  18036. "lsr r7, r7, #16\n\t"
  18037. "mul r6, r7, r6\n\t"
  18038. "lsr r7, r6, #16\n\t"
  18039. "lsl r6, r6, #16\n\t"
  18040. "adds r4, r4, r6\n\t"
  18041. "adcs r5, r5, r7\n\t"
  18042. "adc r3, r3, #0\n\t"
  18043. #else
  18044. "umull r6, r7, r8, r9\n\t"
  18045. "adds r4, r4, r6\n\t"
  18046. "adcs r5, r5, r7\n\t"
  18047. "mov r3, #0\n\t"
  18048. "adc r3, r3, #0\n\t"
  18049. #endif
  18050. /* A[3] * B[1] */
  18051. "ldr r8, [%[a], #12]\n\t"
  18052. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18053. "lsl r6, r8, #16\n\t"
  18054. "lsl r7, r12, #16\n\t"
  18055. "lsr r6, r6, #16\n\t"
  18056. "lsr r7, r7, #16\n\t"
  18057. "mul r7, r6, r7\n\t"
  18058. "adds r4, r4, r7\n\t"
  18059. "adcs r5, r5, #0\n\t"
  18060. "adc r3, r3, #0\n\t"
  18061. "lsr r7, r12, #16\n\t"
  18062. "mul r6, r7, r6\n\t"
  18063. "lsr r7, r6, #16\n\t"
  18064. "lsl r6, r6, #16\n\t"
  18065. "adds r4, r4, r6\n\t"
  18066. "adcs r5, r5, r7\n\t"
  18067. "adc r3, r3, #0\n\t"
  18068. "lsr r6, r8, #16\n\t"
  18069. "lsr r7, r12, #16\n\t"
  18070. "mul r7, r6, r7\n\t"
  18071. "adds r5, r5, r7\n\t"
  18072. "adc r3, r3, #0\n\t"
  18073. "lsl r7, r12, #16\n\t"
  18074. "lsr r7, r7, #16\n\t"
  18075. "mul r6, r7, r6\n\t"
  18076. "lsr r7, r6, #16\n\t"
  18077. "lsl r6, r6, #16\n\t"
  18078. "adds r4, r4, r6\n\t"
  18079. "adcs r5, r5, r7\n\t"
  18080. "adc r3, r3, #0\n\t"
  18081. #else
  18082. "umull r6, r7, r8, r12\n\t"
  18083. "adds r4, r4, r6\n\t"
  18084. "adcs r5, r5, r7\n\t"
  18085. "adc r3, r3, #0\n\t"
  18086. #endif
  18087. /* A[2] * B[2] */
  18088. "ldr r11, [%[a], #8]\n\t"
  18089. "ldr r12, [%[b], #8]\n\t"
  18090. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18091. "lsl r6, r11, #16\n\t"
  18092. "lsl r7, r12, #16\n\t"
  18093. "lsr r6, r6, #16\n\t"
  18094. "lsr r7, r7, #16\n\t"
  18095. "mul r7, r6, r7\n\t"
  18096. "adds r4, r4, r7\n\t"
  18097. "adcs r5, r5, #0\n\t"
  18098. "adc r3, r3, #0\n\t"
  18099. "lsr r7, r12, #16\n\t"
  18100. "mul r6, r7, r6\n\t"
  18101. "lsr r7, r6, #16\n\t"
  18102. "lsl r6, r6, #16\n\t"
  18103. "adds r4, r4, r6\n\t"
  18104. "adcs r5, r5, r7\n\t"
  18105. "adc r3, r3, #0\n\t"
  18106. "lsr r6, r11, #16\n\t"
  18107. "lsr r7, r12, #16\n\t"
  18108. "mul r7, r6, r7\n\t"
  18109. "adds r5, r5, r7\n\t"
  18110. "adc r3, r3, #0\n\t"
  18111. "lsl r7, r12, #16\n\t"
  18112. "lsr r7, r7, #16\n\t"
  18113. "mul r6, r7, r6\n\t"
  18114. "lsr r7, r6, #16\n\t"
  18115. "lsl r6, r6, #16\n\t"
  18116. "adds r4, r4, r6\n\t"
  18117. "adcs r5, r5, r7\n\t"
  18118. "adc r3, r3, #0\n\t"
  18119. #else
  18120. "umull r6, r7, r11, r12\n\t"
  18121. "adds r4, r4, r6\n\t"
  18122. "adcs r5, r5, r7\n\t"
  18123. "adc r3, r3, #0\n\t"
  18124. #endif
  18125. /* A[1] * B[3] */
  18126. "ldr r8, [%[a], #4]\n\t"
  18127. "ldr r9, [%[b], #12]\n\t"
  18128. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18129. "lsl r6, r8, #16\n\t"
  18130. "lsl r7, r9, #16\n\t"
  18131. "lsr r6, r6, #16\n\t"
  18132. "lsr r7, r7, #16\n\t"
  18133. "mul r7, r6, r7\n\t"
  18134. "adds r4, r4, r7\n\t"
  18135. "adcs r5, r5, #0\n\t"
  18136. "adc r3, r3, #0\n\t"
  18137. "lsr r7, r9, #16\n\t"
  18138. "mul r6, r7, r6\n\t"
  18139. "lsr r7, r6, #16\n\t"
  18140. "lsl r6, r6, #16\n\t"
  18141. "adds r4, r4, r6\n\t"
  18142. "adcs r5, r5, r7\n\t"
  18143. "adc r3, r3, #0\n\t"
  18144. "lsr r6, r8, #16\n\t"
  18145. "lsr r7, r9, #16\n\t"
  18146. "mul r7, r6, r7\n\t"
  18147. "adds r5, r5, r7\n\t"
  18148. "adc r3, r3, #0\n\t"
  18149. "lsl r7, r9, #16\n\t"
  18150. "lsr r7, r7, #16\n\t"
  18151. "mul r6, r7, r6\n\t"
  18152. "lsr r7, r6, #16\n\t"
  18153. "lsl r6, r6, #16\n\t"
  18154. "adds r4, r4, r6\n\t"
  18155. "adcs r5, r5, r7\n\t"
  18156. "adc r3, r3, #0\n\t"
  18157. #else
  18158. "umull r6, r7, r8, r9\n\t"
  18159. "adds r4, r4, r6\n\t"
  18160. "adcs r5, r5, r7\n\t"
  18161. "adc r3, r3, #0\n\t"
  18162. #endif
  18163. /* A[0] * B[4] */
  18164. "ldr r8, [%[a]]\n\t"
  18165. "ldr r9, [%[b], #16]\n\t"
  18166. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18167. "lsl r6, r8, #16\n\t"
  18168. "lsl r7, r9, #16\n\t"
  18169. "lsr r6, r6, #16\n\t"
  18170. "lsr r7, r7, #16\n\t"
  18171. "mul r7, r6, r7\n\t"
  18172. "adds r4, r4, r7\n\t"
  18173. "adcs r5, r5, #0\n\t"
  18174. "adc r3, r3, #0\n\t"
  18175. "lsr r7, r9, #16\n\t"
  18176. "mul r6, r7, r6\n\t"
  18177. "lsr r7, r6, #16\n\t"
  18178. "lsl r6, r6, #16\n\t"
  18179. "adds r4, r4, r6\n\t"
  18180. "adcs r5, r5, r7\n\t"
  18181. "adc r3, r3, #0\n\t"
  18182. "lsr r6, r8, #16\n\t"
  18183. "lsr r7, r9, #16\n\t"
  18184. "mul r7, r6, r7\n\t"
  18185. "adds r5, r5, r7\n\t"
  18186. "adc r3, r3, #0\n\t"
  18187. "lsl r7, r9, #16\n\t"
  18188. "lsr r7, r7, #16\n\t"
  18189. "mul r6, r7, r6\n\t"
  18190. "lsr r7, r6, #16\n\t"
  18191. "lsl r6, r6, #16\n\t"
  18192. "adds r4, r4, r6\n\t"
  18193. "adcs r5, r5, r7\n\t"
  18194. "adc r3, r3, #0\n\t"
  18195. #else
  18196. "umull r6, r7, r8, r9\n\t"
  18197. "adds r4, r4, r6\n\t"
  18198. "adcs r5, r5, r7\n\t"
  18199. "adc r3, r3, #0\n\t"
  18200. #endif
  18201. "str r4, [sp, #16]\n\t"
  18202. /* A[0] * B[5] */
  18203. "ldr r9, [%[b], #20]\n\t"
  18204. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18205. "lsl r6, r8, #16\n\t"
  18206. "lsl r7, r9, #16\n\t"
  18207. "lsr r6, r6, #16\n\t"
  18208. "lsr r7, r7, #16\n\t"
  18209. "mul r7, r6, r7\n\t"
  18210. "adds r5, r5, r7\n\t"
  18211. "adcs r3, r3, #0\n\t"
  18212. "mov r4, #0\n\t"
  18213. "adc r4, r4, #0\n\t"
  18214. "lsr r7, r9, #16\n\t"
  18215. "mul r6, r7, r6\n\t"
  18216. "lsr r7, r6, #16\n\t"
  18217. "lsl r6, r6, #16\n\t"
  18218. "adds r5, r5, r6\n\t"
  18219. "adcs r3, r3, r7\n\t"
  18220. "adc r4, r4, #0\n\t"
  18221. "lsr r6, r8, #16\n\t"
  18222. "lsr r7, r9, #16\n\t"
  18223. "mul r7, r6, r7\n\t"
  18224. "adds r3, r3, r7\n\t"
  18225. "adc r4, r4, #0\n\t"
  18226. "lsl r7, r9, #16\n\t"
  18227. "lsr r7, r7, #16\n\t"
  18228. "mul r6, r7, r6\n\t"
  18229. "lsr r7, r6, #16\n\t"
  18230. "lsl r6, r6, #16\n\t"
  18231. "adds r5, r5, r6\n\t"
  18232. "adcs r3, r3, r7\n\t"
  18233. "adc r4, r4, #0\n\t"
  18234. #else
  18235. "umull r6, r7, r8, r9\n\t"
  18236. "adds r5, r5, r6\n\t"
  18237. "adcs r3, r3, r7\n\t"
  18238. "mov r4, #0\n\t"
  18239. "adc r4, r4, #0\n\t"
  18240. #endif
  18241. /* A[1] * B[4] */
  18242. "ldr r8, [%[a], #4]\n\t"
  18243. "ldr r9, [%[b], #16]\n\t"
  18244. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18245. "lsl r6, r8, #16\n\t"
  18246. "lsl r7, r9, #16\n\t"
  18247. "lsr r6, r6, #16\n\t"
  18248. "lsr r7, r7, #16\n\t"
  18249. "mul r7, r6, r7\n\t"
  18250. "adds r5, r5, r7\n\t"
  18251. "adcs r3, r3, #0\n\t"
  18252. "adc r4, r4, #0\n\t"
  18253. "lsr r7, r9, #16\n\t"
  18254. "mul r6, r7, r6\n\t"
  18255. "lsr r7, r6, #16\n\t"
  18256. "lsl r6, r6, #16\n\t"
  18257. "adds r5, r5, r6\n\t"
  18258. "adcs r3, r3, r7\n\t"
  18259. "adc r4, r4, #0\n\t"
  18260. "lsr r6, r8, #16\n\t"
  18261. "lsr r7, r9, #16\n\t"
  18262. "mul r7, r6, r7\n\t"
  18263. "adds r3, r3, r7\n\t"
  18264. "adc r4, r4, #0\n\t"
  18265. "lsl r7, r9, #16\n\t"
  18266. "lsr r7, r7, #16\n\t"
  18267. "mul r6, r7, r6\n\t"
  18268. "lsr r7, r6, #16\n\t"
  18269. "lsl r6, r6, #16\n\t"
  18270. "adds r5, r5, r6\n\t"
  18271. "adcs r3, r3, r7\n\t"
  18272. "adc r4, r4, #0\n\t"
  18273. #else
  18274. "umull r6, r7, r8, r9\n\t"
  18275. "adds r5, r5, r6\n\t"
  18276. "adcs r3, r3, r7\n\t"
  18277. "adc r4, r4, #0\n\t"
  18278. #endif
  18279. /* A[2] * B[3] */
  18280. "ldr r9, [%[b], #12]\n\t"
  18281. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18282. "lsl r6, r11, #16\n\t"
  18283. "lsl r7, r9, #16\n\t"
  18284. "lsr r6, r6, #16\n\t"
  18285. "lsr r7, r7, #16\n\t"
  18286. "mul r7, r6, r7\n\t"
  18287. "adds r5, r5, r7\n\t"
  18288. "adcs r3, r3, #0\n\t"
  18289. "adc r4, r4, #0\n\t"
  18290. "lsr r7, r9, #16\n\t"
  18291. "mul r6, r7, r6\n\t"
  18292. "lsr r7, r6, #16\n\t"
  18293. "lsl r6, r6, #16\n\t"
  18294. "adds r5, r5, r6\n\t"
  18295. "adcs r3, r3, r7\n\t"
  18296. "adc r4, r4, #0\n\t"
  18297. "lsr r6, r11, #16\n\t"
  18298. "lsr r7, r9, #16\n\t"
  18299. "mul r7, r6, r7\n\t"
  18300. "adds r3, r3, r7\n\t"
  18301. "adc r4, r4, #0\n\t"
  18302. "lsl r7, r9, #16\n\t"
  18303. "lsr r7, r7, #16\n\t"
  18304. "mul r6, r7, r6\n\t"
  18305. "lsr r7, r6, #16\n\t"
  18306. "lsl r6, r6, #16\n\t"
  18307. "adds r5, r5, r6\n\t"
  18308. "adcs r3, r3, r7\n\t"
  18309. "adc r4, r4, #0\n\t"
  18310. #else
  18311. "umull r6, r7, r11, r9\n\t"
  18312. "adds r5, r5, r6\n\t"
  18313. "adcs r3, r3, r7\n\t"
  18314. "adc r4, r4, #0\n\t"
  18315. #endif
  18316. /* A[3] * B[2] */
  18317. "ldr r8, [%[a], #12]\n\t"
  18318. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18319. "lsl r6, r8, #16\n\t"
  18320. "lsl r7, r12, #16\n\t"
  18321. "lsr r6, r6, #16\n\t"
  18322. "lsr r7, r7, #16\n\t"
  18323. "mul r7, r6, r7\n\t"
  18324. "adds r5, r5, r7\n\t"
  18325. "adcs r3, r3, #0\n\t"
  18326. "adc r4, r4, #0\n\t"
  18327. "lsr r7, r12, #16\n\t"
  18328. "mul r6, r7, r6\n\t"
  18329. "lsr r7, r6, #16\n\t"
  18330. "lsl r6, r6, #16\n\t"
  18331. "adds r5, r5, r6\n\t"
  18332. "adcs r3, r3, r7\n\t"
  18333. "adc r4, r4, #0\n\t"
  18334. "lsr r6, r8, #16\n\t"
  18335. "lsr r7, r12, #16\n\t"
  18336. "mul r7, r6, r7\n\t"
  18337. "adds r3, r3, r7\n\t"
  18338. "adc r4, r4, #0\n\t"
  18339. "lsl r7, r12, #16\n\t"
  18340. "lsr r7, r7, #16\n\t"
  18341. "mul r6, r7, r6\n\t"
  18342. "lsr r7, r6, #16\n\t"
  18343. "lsl r6, r6, #16\n\t"
  18344. "adds r5, r5, r6\n\t"
  18345. "adcs r3, r3, r7\n\t"
  18346. "adc r4, r4, #0\n\t"
  18347. #else
  18348. "umull r6, r7, r8, r12\n\t"
  18349. "adds r5, r5, r6\n\t"
  18350. "adcs r3, r3, r7\n\t"
  18351. "adc r4, r4, #0\n\t"
  18352. #endif
  18353. /* A[4] * B[1] */
  18354. "ldr r8, [%[a], #16]\n\t"
  18355. "ldr r9, [%[b], #4]\n\t"
  18356. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18357. "lsl r6, r8, #16\n\t"
  18358. "lsl r7, r9, #16\n\t"
  18359. "lsr r6, r6, #16\n\t"
  18360. "lsr r7, r7, #16\n\t"
  18361. "mul r7, r6, r7\n\t"
  18362. "adds r5, r5, r7\n\t"
  18363. "adcs r3, r3, #0\n\t"
  18364. "adc r4, r4, #0\n\t"
  18365. "lsr r7, r9, #16\n\t"
  18366. "mul r6, r7, r6\n\t"
  18367. "lsr r7, r6, #16\n\t"
  18368. "lsl r6, r6, #16\n\t"
  18369. "adds r5, r5, r6\n\t"
  18370. "adcs r3, r3, r7\n\t"
  18371. "adc r4, r4, #0\n\t"
  18372. "lsr r6, r8, #16\n\t"
  18373. "lsr r7, r9, #16\n\t"
  18374. "mul r7, r6, r7\n\t"
  18375. "adds r3, r3, r7\n\t"
  18376. "adc r4, r4, #0\n\t"
  18377. "lsl r7, r9, #16\n\t"
  18378. "lsr r7, r7, #16\n\t"
  18379. "mul r6, r7, r6\n\t"
  18380. "lsr r7, r6, #16\n\t"
  18381. "lsl r6, r6, #16\n\t"
  18382. "adds r5, r5, r6\n\t"
  18383. "adcs r3, r3, r7\n\t"
  18384. "adc r4, r4, #0\n\t"
  18385. #else
  18386. "umull r6, r7, r8, r9\n\t"
  18387. "adds r5, r5, r6\n\t"
  18388. "adcs r3, r3, r7\n\t"
  18389. "adc r4, r4, #0\n\t"
  18390. #endif
  18391. /* A[5] * B[0] */
  18392. "ldr r8, [%[a], #20]\n\t"
  18393. "ldr r9, [%[b]]\n\t"
  18394. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18395. "lsl r6, r8, #16\n\t"
  18396. "lsl r7, r9, #16\n\t"
  18397. "lsr r6, r6, #16\n\t"
  18398. "lsr r7, r7, #16\n\t"
  18399. "mul r7, r6, r7\n\t"
  18400. "adds r5, r5, r7\n\t"
  18401. "adcs r3, r3, #0\n\t"
  18402. "adc r4, r4, #0\n\t"
  18403. "lsr r7, r9, #16\n\t"
  18404. "mul r6, r7, r6\n\t"
  18405. "lsr r7, r6, #16\n\t"
  18406. "lsl r6, r6, #16\n\t"
  18407. "adds r5, r5, r6\n\t"
  18408. "adcs r3, r3, r7\n\t"
  18409. "adc r4, r4, #0\n\t"
  18410. "lsr r6, r8, #16\n\t"
  18411. "lsr r7, r9, #16\n\t"
  18412. "mul r7, r6, r7\n\t"
  18413. "adds r3, r3, r7\n\t"
  18414. "adc r4, r4, #0\n\t"
  18415. "lsl r7, r9, #16\n\t"
  18416. "lsr r7, r7, #16\n\t"
  18417. "mul r6, r7, r6\n\t"
  18418. "lsr r7, r6, #16\n\t"
  18419. "lsl r6, r6, #16\n\t"
  18420. "adds r5, r5, r6\n\t"
  18421. "adcs r3, r3, r7\n\t"
  18422. "adc r4, r4, #0\n\t"
  18423. #else
  18424. "umull r6, r7, r8, r9\n\t"
  18425. "adds r5, r5, r6\n\t"
  18426. "adcs r3, r3, r7\n\t"
  18427. "adc r4, r4, #0\n\t"
  18428. #endif
  18429. "str r5, [sp, #20]\n\t"
  18430. /* A[6] * B[0] */
  18431. "ldr r8, [%[a], #24]\n\t"
  18432. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18433. "lsl r6, r8, #16\n\t"
  18434. "lsl r7, r9, #16\n\t"
  18435. "lsr r6, r6, #16\n\t"
  18436. "lsr r7, r7, #16\n\t"
  18437. "mul r7, r6, r7\n\t"
  18438. "adds r3, r3, r7\n\t"
  18439. "adcs r4, r4, #0\n\t"
  18440. "mov r5, #0\n\t"
  18441. "adc r5, r5, #0\n\t"
  18442. "lsr r7, r9, #16\n\t"
  18443. "mul r6, r7, r6\n\t"
  18444. "lsr r7, r6, #16\n\t"
  18445. "lsl r6, r6, #16\n\t"
  18446. "adds r3, r3, r6\n\t"
  18447. "adcs r4, r4, r7\n\t"
  18448. "adc r5, r5, #0\n\t"
  18449. "lsr r6, r8, #16\n\t"
  18450. "lsr r7, r9, #16\n\t"
  18451. "mul r7, r6, r7\n\t"
  18452. "adds r4, r4, r7\n\t"
  18453. "adc r5, r5, #0\n\t"
  18454. "lsl r7, r9, #16\n\t"
  18455. "lsr r7, r7, #16\n\t"
  18456. "mul r6, r7, r6\n\t"
  18457. "lsr r7, r6, #16\n\t"
  18458. "lsl r6, r6, #16\n\t"
  18459. "adds r3, r3, r6\n\t"
  18460. "adcs r4, r4, r7\n\t"
  18461. "adc r5, r5, #0\n\t"
  18462. #else
  18463. "umull r6, r7, r8, r9\n\t"
  18464. "adds r3, r3, r6\n\t"
  18465. "adcs r4, r4, r7\n\t"
  18466. "mov r5, #0\n\t"
  18467. "adc r5, r5, #0\n\t"
  18468. #endif
  18469. /* A[5] * B[1] */
  18470. "ldr r8, [%[a], #20]\n\t"
  18471. "ldr r9, [%[b], #4]\n\t"
  18472. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18473. "lsl r6, r8, #16\n\t"
  18474. "lsl r7, r9, #16\n\t"
  18475. "lsr r6, r6, #16\n\t"
  18476. "lsr r7, r7, #16\n\t"
  18477. "mul r7, r6, r7\n\t"
  18478. "adds r3, r3, r7\n\t"
  18479. "adcs r4, r4, #0\n\t"
  18480. "adc r5, r5, #0\n\t"
  18481. "lsr r7, r9, #16\n\t"
  18482. "mul r6, r7, r6\n\t"
  18483. "lsr r7, r6, #16\n\t"
  18484. "lsl r6, r6, #16\n\t"
  18485. "adds r3, r3, r6\n\t"
  18486. "adcs r4, r4, r7\n\t"
  18487. "adc r5, r5, #0\n\t"
  18488. "lsr r6, r8, #16\n\t"
  18489. "lsr r7, r9, #16\n\t"
  18490. "mul r7, r6, r7\n\t"
  18491. "adds r4, r4, r7\n\t"
  18492. "adc r5, r5, #0\n\t"
  18493. "lsl r7, r9, #16\n\t"
  18494. "lsr r7, r7, #16\n\t"
  18495. "mul r6, r7, r6\n\t"
  18496. "lsr r7, r6, #16\n\t"
  18497. "lsl r6, r6, #16\n\t"
  18498. "adds r3, r3, r6\n\t"
  18499. "adcs r4, r4, r7\n\t"
  18500. "adc r5, r5, #0\n\t"
  18501. #else
  18502. "umull r6, r7, r8, r9\n\t"
  18503. "adds r3, r3, r6\n\t"
  18504. "adcs r4, r4, r7\n\t"
  18505. "adc r5, r5, #0\n\t"
  18506. #endif
  18507. /* A[4] * B[2] */
  18508. "ldr r8, [%[a], #16]\n\t"
  18509. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18510. "lsl r6, r8, #16\n\t"
  18511. "lsl r7, r12, #16\n\t"
  18512. "lsr r6, r6, #16\n\t"
  18513. "lsr r7, r7, #16\n\t"
  18514. "mul r7, r6, r7\n\t"
  18515. "adds r3, r3, r7\n\t"
  18516. "adcs r4, r4, #0\n\t"
  18517. "adc r5, r5, #0\n\t"
  18518. "lsr r7, r12, #16\n\t"
  18519. "mul r6, r7, r6\n\t"
  18520. "lsr r7, r6, #16\n\t"
  18521. "lsl r6, r6, #16\n\t"
  18522. "adds r3, r3, r6\n\t"
  18523. "adcs r4, r4, r7\n\t"
  18524. "adc r5, r5, #0\n\t"
  18525. "lsr r6, r8, #16\n\t"
  18526. "lsr r7, r12, #16\n\t"
  18527. "mul r7, r6, r7\n\t"
  18528. "adds r4, r4, r7\n\t"
  18529. "adc r5, r5, #0\n\t"
  18530. "lsl r7, r12, #16\n\t"
  18531. "lsr r7, r7, #16\n\t"
  18532. "mul r6, r7, r6\n\t"
  18533. "lsr r7, r6, #16\n\t"
  18534. "lsl r6, r6, #16\n\t"
  18535. "adds r3, r3, r6\n\t"
  18536. "adcs r4, r4, r7\n\t"
  18537. "adc r5, r5, #0\n\t"
  18538. #else
  18539. "umull r6, r7, r8, r12\n\t"
  18540. "adds r3, r3, r6\n\t"
  18541. "adcs r4, r4, r7\n\t"
  18542. "adc r5, r5, #0\n\t"
  18543. #endif
  18544. /* A[3] * B[3] */
  18545. "ldr r11, [%[a], #12]\n\t"
  18546. "ldr r12, [%[b], #12]\n\t"
  18547. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18548. "lsl r6, r11, #16\n\t"
  18549. "lsl r7, r12, #16\n\t"
  18550. "lsr r6, r6, #16\n\t"
  18551. "lsr r7, r7, #16\n\t"
  18552. "mul r7, r6, r7\n\t"
  18553. "adds r3, r3, r7\n\t"
  18554. "adcs r4, r4, #0\n\t"
  18555. "adc r5, r5, #0\n\t"
  18556. "lsr r7, r12, #16\n\t"
  18557. "mul r6, r7, r6\n\t"
  18558. "lsr r7, r6, #16\n\t"
  18559. "lsl r6, r6, #16\n\t"
  18560. "adds r3, r3, r6\n\t"
  18561. "adcs r4, r4, r7\n\t"
  18562. "adc r5, r5, #0\n\t"
  18563. "lsr r6, r11, #16\n\t"
  18564. "lsr r7, r12, #16\n\t"
  18565. "mul r7, r6, r7\n\t"
  18566. "adds r4, r4, r7\n\t"
  18567. "adc r5, r5, #0\n\t"
  18568. "lsl r7, r12, #16\n\t"
  18569. "lsr r7, r7, #16\n\t"
  18570. "mul r6, r7, r6\n\t"
  18571. "lsr r7, r6, #16\n\t"
  18572. "lsl r6, r6, #16\n\t"
  18573. "adds r3, r3, r6\n\t"
  18574. "adcs r4, r4, r7\n\t"
  18575. "adc r5, r5, #0\n\t"
  18576. #else
  18577. "umull r6, r7, r11, r12\n\t"
  18578. "adds r3, r3, r6\n\t"
  18579. "adcs r4, r4, r7\n\t"
  18580. "adc r5, r5, #0\n\t"
  18581. #endif
  18582. /* A[2] * B[4] */
  18583. "ldr r8, [%[a], #8]\n\t"
  18584. "ldr r9, [%[b], #16]\n\t"
  18585. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18586. "lsl r6, r8, #16\n\t"
  18587. "lsl r7, r9, #16\n\t"
  18588. "lsr r6, r6, #16\n\t"
  18589. "lsr r7, r7, #16\n\t"
  18590. "mul r7, r6, r7\n\t"
  18591. "adds r3, r3, r7\n\t"
  18592. "adcs r4, r4, #0\n\t"
  18593. "adc r5, r5, #0\n\t"
  18594. "lsr r7, r9, #16\n\t"
  18595. "mul r6, r7, r6\n\t"
  18596. "lsr r7, r6, #16\n\t"
  18597. "lsl r6, r6, #16\n\t"
  18598. "adds r3, r3, r6\n\t"
  18599. "adcs r4, r4, r7\n\t"
  18600. "adc r5, r5, #0\n\t"
  18601. "lsr r6, r8, #16\n\t"
  18602. "lsr r7, r9, #16\n\t"
  18603. "mul r7, r6, r7\n\t"
  18604. "adds r4, r4, r7\n\t"
  18605. "adc r5, r5, #0\n\t"
  18606. "lsl r7, r9, #16\n\t"
  18607. "lsr r7, r7, #16\n\t"
  18608. "mul r6, r7, r6\n\t"
  18609. "lsr r7, r6, #16\n\t"
  18610. "lsl r6, r6, #16\n\t"
  18611. "adds r3, r3, r6\n\t"
  18612. "adcs r4, r4, r7\n\t"
  18613. "adc r5, r5, #0\n\t"
  18614. #else
  18615. "umull r6, r7, r8, r9\n\t"
  18616. "adds r3, r3, r6\n\t"
  18617. "adcs r4, r4, r7\n\t"
  18618. "adc r5, r5, #0\n\t"
  18619. #endif
  18620. /* A[1] * B[5] */
  18621. "ldr r8, [%[a], #4]\n\t"
  18622. "ldr r9, [%[b], #20]\n\t"
  18623. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18624. "lsl r6, r8, #16\n\t"
  18625. "lsl r7, r9, #16\n\t"
  18626. "lsr r6, r6, #16\n\t"
  18627. "lsr r7, r7, #16\n\t"
  18628. "mul r7, r6, r7\n\t"
  18629. "adds r3, r3, r7\n\t"
  18630. "adcs r4, r4, #0\n\t"
  18631. "adc r5, r5, #0\n\t"
  18632. "lsr r7, r9, #16\n\t"
  18633. "mul r6, r7, r6\n\t"
  18634. "lsr r7, r6, #16\n\t"
  18635. "lsl r6, r6, #16\n\t"
  18636. "adds r3, r3, r6\n\t"
  18637. "adcs r4, r4, r7\n\t"
  18638. "adc r5, r5, #0\n\t"
  18639. "lsr r6, r8, #16\n\t"
  18640. "lsr r7, r9, #16\n\t"
  18641. "mul r7, r6, r7\n\t"
  18642. "adds r4, r4, r7\n\t"
  18643. "adc r5, r5, #0\n\t"
  18644. "lsl r7, r9, #16\n\t"
  18645. "lsr r7, r7, #16\n\t"
  18646. "mul r6, r7, r6\n\t"
  18647. "lsr r7, r6, #16\n\t"
  18648. "lsl r6, r6, #16\n\t"
  18649. "adds r3, r3, r6\n\t"
  18650. "adcs r4, r4, r7\n\t"
  18651. "adc r5, r5, #0\n\t"
  18652. #else
  18653. "umull r6, r7, r8, r9\n\t"
  18654. "adds r3, r3, r6\n\t"
  18655. "adcs r4, r4, r7\n\t"
  18656. "adc r5, r5, #0\n\t"
  18657. #endif
  18658. /* A[0] * B[6] */
  18659. "ldr r8, [%[a]]\n\t"
  18660. "ldr r9, [%[b], #24]\n\t"
  18661. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18662. "lsl r6, r8, #16\n\t"
  18663. "lsl r7, r9, #16\n\t"
  18664. "lsr r6, r6, #16\n\t"
  18665. "lsr r7, r7, #16\n\t"
  18666. "mul r7, r6, r7\n\t"
  18667. "adds r3, r3, r7\n\t"
  18668. "adcs r4, r4, #0\n\t"
  18669. "adc r5, r5, #0\n\t"
  18670. "lsr r7, r9, #16\n\t"
  18671. "mul r6, r7, r6\n\t"
  18672. "lsr r7, r6, #16\n\t"
  18673. "lsl r6, r6, #16\n\t"
  18674. "adds r3, r3, r6\n\t"
  18675. "adcs r4, r4, r7\n\t"
  18676. "adc r5, r5, #0\n\t"
  18677. "lsr r6, r8, #16\n\t"
  18678. "lsr r7, r9, #16\n\t"
  18679. "mul r7, r6, r7\n\t"
  18680. "adds r4, r4, r7\n\t"
  18681. "adc r5, r5, #0\n\t"
  18682. "lsl r7, r9, #16\n\t"
  18683. "lsr r7, r7, #16\n\t"
  18684. "mul r6, r7, r6\n\t"
  18685. "lsr r7, r6, #16\n\t"
  18686. "lsl r6, r6, #16\n\t"
  18687. "adds r3, r3, r6\n\t"
  18688. "adcs r4, r4, r7\n\t"
  18689. "adc r5, r5, #0\n\t"
  18690. #else
  18691. "umull r6, r7, r8, r9\n\t"
  18692. "adds r3, r3, r6\n\t"
  18693. "adcs r4, r4, r7\n\t"
  18694. "adc r5, r5, #0\n\t"
  18695. #endif
  18696. "str r3, [sp, #24]\n\t"
  18697. /* A[0] * B[7] */
  18698. "ldr r9, [%[b], #28]\n\t"
  18699. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18700. "lsl r6, r8, #16\n\t"
  18701. "lsl r7, r9, #16\n\t"
  18702. "lsr r6, r6, #16\n\t"
  18703. "lsr r7, r7, #16\n\t"
  18704. "mul r7, r6, r7\n\t"
  18705. "adds r4, r4, r7\n\t"
  18706. "adcs r5, r5, #0\n\t"
  18707. "mov r3, #0\n\t"
  18708. "adc r3, r3, #0\n\t"
  18709. "lsr r7, r9, #16\n\t"
  18710. "mul r6, r7, r6\n\t"
  18711. "lsr r7, r6, #16\n\t"
  18712. "lsl r6, r6, #16\n\t"
  18713. "adds r4, r4, r6\n\t"
  18714. "adcs r5, r5, r7\n\t"
  18715. "adc r3, r3, #0\n\t"
  18716. "lsr r6, r8, #16\n\t"
  18717. "lsr r7, r9, #16\n\t"
  18718. "mul r7, r6, r7\n\t"
  18719. "adds r5, r5, r7\n\t"
  18720. "adc r3, r3, #0\n\t"
  18721. "lsl r7, r9, #16\n\t"
  18722. "lsr r7, r7, #16\n\t"
  18723. "mul r6, r7, r6\n\t"
  18724. "lsr r7, r6, #16\n\t"
  18725. "lsl r6, r6, #16\n\t"
  18726. "adds r4, r4, r6\n\t"
  18727. "adcs r5, r5, r7\n\t"
  18728. "adc r3, r3, #0\n\t"
  18729. #else
  18730. "umull r6, r7, r8, r9\n\t"
  18731. "adds r4, r4, r6\n\t"
  18732. "adcs r5, r5, r7\n\t"
  18733. "mov r3, #0\n\t"
  18734. "adc r3, r3, #0\n\t"
  18735. #endif
  18736. /* A[1] * B[6] */
  18737. "ldr r8, [%[a], #4]\n\t"
  18738. "ldr r9, [%[b], #24]\n\t"
  18739. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18740. "lsl r6, r8, #16\n\t"
  18741. "lsl r7, r9, #16\n\t"
  18742. "lsr r6, r6, #16\n\t"
  18743. "lsr r7, r7, #16\n\t"
  18744. "mul r7, r6, r7\n\t"
  18745. "adds r4, r4, r7\n\t"
  18746. "adcs r5, r5, #0\n\t"
  18747. "adc r3, r3, #0\n\t"
  18748. "lsr r7, r9, #16\n\t"
  18749. "mul r6, r7, r6\n\t"
  18750. "lsr r7, r6, #16\n\t"
  18751. "lsl r6, r6, #16\n\t"
  18752. "adds r4, r4, r6\n\t"
  18753. "adcs r5, r5, r7\n\t"
  18754. "adc r3, r3, #0\n\t"
  18755. "lsr r6, r8, #16\n\t"
  18756. "lsr r7, r9, #16\n\t"
  18757. "mul r7, r6, r7\n\t"
  18758. "adds r5, r5, r7\n\t"
  18759. "adc r3, r3, #0\n\t"
  18760. "lsl r7, r9, #16\n\t"
  18761. "lsr r7, r7, #16\n\t"
  18762. "mul r6, r7, r6\n\t"
  18763. "lsr r7, r6, #16\n\t"
  18764. "lsl r6, r6, #16\n\t"
  18765. "adds r4, r4, r6\n\t"
  18766. "adcs r5, r5, r7\n\t"
  18767. "adc r3, r3, #0\n\t"
  18768. #else
  18769. "umull r6, r7, r8, r9\n\t"
  18770. "adds r4, r4, r6\n\t"
  18771. "adcs r5, r5, r7\n\t"
  18772. "adc r3, r3, #0\n\t"
  18773. #endif
  18774. /* A[2] * B[5] */
  18775. "ldr r8, [%[a], #8]\n\t"
  18776. "ldr r9, [%[b], #20]\n\t"
  18777. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18778. "lsl r6, r8, #16\n\t"
  18779. "lsl r7, r9, #16\n\t"
  18780. "lsr r6, r6, #16\n\t"
  18781. "lsr r7, r7, #16\n\t"
  18782. "mul r7, r6, r7\n\t"
  18783. "adds r4, r4, r7\n\t"
  18784. "adcs r5, r5, #0\n\t"
  18785. "adc r3, r3, #0\n\t"
  18786. "lsr r7, r9, #16\n\t"
  18787. "mul r6, r7, r6\n\t"
  18788. "lsr r7, r6, #16\n\t"
  18789. "lsl r6, r6, #16\n\t"
  18790. "adds r4, r4, r6\n\t"
  18791. "adcs r5, r5, r7\n\t"
  18792. "adc r3, r3, #0\n\t"
  18793. "lsr r6, r8, #16\n\t"
  18794. "lsr r7, r9, #16\n\t"
  18795. "mul r7, r6, r7\n\t"
  18796. "adds r5, r5, r7\n\t"
  18797. "adc r3, r3, #0\n\t"
  18798. "lsl r7, r9, #16\n\t"
  18799. "lsr r7, r7, #16\n\t"
  18800. "mul r6, r7, r6\n\t"
  18801. "lsr r7, r6, #16\n\t"
  18802. "lsl r6, r6, #16\n\t"
  18803. "adds r4, r4, r6\n\t"
  18804. "adcs r5, r5, r7\n\t"
  18805. "adc r3, r3, #0\n\t"
  18806. #else
  18807. "umull r6, r7, r8, r9\n\t"
  18808. "adds r4, r4, r6\n\t"
  18809. "adcs r5, r5, r7\n\t"
  18810. "adc r3, r3, #0\n\t"
  18811. #endif
  18812. /* A[3] * B[4] */
  18813. "ldr r9, [%[b], #16]\n\t"
  18814. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18815. "lsl r6, r11, #16\n\t"
  18816. "lsl r7, r9, #16\n\t"
  18817. "lsr r6, r6, #16\n\t"
  18818. "lsr r7, r7, #16\n\t"
  18819. "mul r7, r6, r7\n\t"
  18820. "adds r4, r4, r7\n\t"
  18821. "adcs r5, r5, #0\n\t"
  18822. "adc r3, r3, #0\n\t"
  18823. "lsr r7, r9, #16\n\t"
  18824. "mul r6, r7, r6\n\t"
  18825. "lsr r7, r6, #16\n\t"
  18826. "lsl r6, r6, #16\n\t"
  18827. "adds r4, r4, r6\n\t"
  18828. "adcs r5, r5, r7\n\t"
  18829. "adc r3, r3, #0\n\t"
  18830. "lsr r6, r11, #16\n\t"
  18831. "lsr r7, r9, #16\n\t"
  18832. "mul r7, r6, r7\n\t"
  18833. "adds r5, r5, r7\n\t"
  18834. "adc r3, r3, #0\n\t"
  18835. "lsl r7, r9, #16\n\t"
  18836. "lsr r7, r7, #16\n\t"
  18837. "mul r6, r7, r6\n\t"
  18838. "lsr r7, r6, #16\n\t"
  18839. "lsl r6, r6, #16\n\t"
  18840. "adds r4, r4, r6\n\t"
  18841. "adcs r5, r5, r7\n\t"
  18842. "adc r3, r3, #0\n\t"
  18843. #else
  18844. "umull r6, r7, r11, r9\n\t"
  18845. "adds r4, r4, r6\n\t"
  18846. "adcs r5, r5, r7\n\t"
  18847. "adc r3, r3, #0\n\t"
  18848. #endif
  18849. /* A[4] * B[3] */
  18850. "ldr r8, [%[a], #16]\n\t"
  18851. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18852. "lsl r6, r8, #16\n\t"
  18853. "lsl r7, r12, #16\n\t"
  18854. "lsr r6, r6, #16\n\t"
  18855. "lsr r7, r7, #16\n\t"
  18856. "mul r7, r6, r7\n\t"
  18857. "adds r4, r4, r7\n\t"
  18858. "adcs r5, r5, #0\n\t"
  18859. "adc r3, r3, #0\n\t"
  18860. "lsr r7, r12, #16\n\t"
  18861. "mul r6, r7, r6\n\t"
  18862. "lsr r7, r6, #16\n\t"
  18863. "lsl r6, r6, #16\n\t"
  18864. "adds r4, r4, r6\n\t"
  18865. "adcs r5, r5, r7\n\t"
  18866. "adc r3, r3, #0\n\t"
  18867. "lsr r6, r8, #16\n\t"
  18868. "lsr r7, r12, #16\n\t"
  18869. "mul r7, r6, r7\n\t"
  18870. "adds r5, r5, r7\n\t"
  18871. "adc r3, r3, #0\n\t"
  18872. "lsl r7, r12, #16\n\t"
  18873. "lsr r7, r7, #16\n\t"
  18874. "mul r6, r7, r6\n\t"
  18875. "lsr r7, r6, #16\n\t"
  18876. "lsl r6, r6, #16\n\t"
  18877. "adds r4, r4, r6\n\t"
  18878. "adcs r5, r5, r7\n\t"
  18879. "adc r3, r3, #0\n\t"
  18880. #else
  18881. "umull r6, r7, r8, r12\n\t"
  18882. "adds r4, r4, r6\n\t"
  18883. "adcs r5, r5, r7\n\t"
  18884. "adc r3, r3, #0\n\t"
  18885. #endif
  18886. /* A[5] * B[2] */
  18887. "ldr r8, [%[a], #20]\n\t"
  18888. "ldr r9, [%[b], #8]\n\t"
  18889. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18890. "lsl r6, r8, #16\n\t"
  18891. "lsl r7, r9, #16\n\t"
  18892. "lsr r6, r6, #16\n\t"
  18893. "lsr r7, r7, #16\n\t"
  18894. "mul r7, r6, r7\n\t"
  18895. "adds r4, r4, r7\n\t"
  18896. "adcs r5, r5, #0\n\t"
  18897. "adc r3, r3, #0\n\t"
  18898. "lsr r7, r9, #16\n\t"
  18899. "mul r6, r7, r6\n\t"
  18900. "lsr r7, r6, #16\n\t"
  18901. "lsl r6, r6, #16\n\t"
  18902. "adds r4, r4, r6\n\t"
  18903. "adcs r5, r5, r7\n\t"
  18904. "adc r3, r3, #0\n\t"
  18905. "lsr r6, r8, #16\n\t"
  18906. "lsr r7, r9, #16\n\t"
  18907. "mul r7, r6, r7\n\t"
  18908. "adds r5, r5, r7\n\t"
  18909. "adc r3, r3, #0\n\t"
  18910. "lsl r7, r9, #16\n\t"
  18911. "lsr r7, r7, #16\n\t"
  18912. "mul r6, r7, r6\n\t"
  18913. "lsr r7, r6, #16\n\t"
  18914. "lsl r6, r6, #16\n\t"
  18915. "adds r4, r4, r6\n\t"
  18916. "adcs r5, r5, r7\n\t"
  18917. "adc r3, r3, #0\n\t"
  18918. #else
  18919. "umull r6, r7, r8, r9\n\t"
  18920. "adds r4, r4, r6\n\t"
  18921. "adcs r5, r5, r7\n\t"
  18922. "adc r3, r3, #0\n\t"
  18923. #endif
  18924. /* A[6] * B[1] */
  18925. "ldr r8, [%[a], #24]\n\t"
  18926. "ldr r9, [%[b], #4]\n\t"
  18927. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18928. "lsl r6, r8, #16\n\t"
  18929. "lsl r7, r9, #16\n\t"
  18930. "lsr r6, r6, #16\n\t"
  18931. "lsr r7, r7, #16\n\t"
  18932. "mul r7, r6, r7\n\t"
  18933. "adds r4, r4, r7\n\t"
  18934. "adcs r5, r5, #0\n\t"
  18935. "adc r3, r3, #0\n\t"
  18936. "lsr r7, r9, #16\n\t"
  18937. "mul r6, r7, r6\n\t"
  18938. "lsr r7, r6, #16\n\t"
  18939. "lsl r6, r6, #16\n\t"
  18940. "adds r4, r4, r6\n\t"
  18941. "adcs r5, r5, r7\n\t"
  18942. "adc r3, r3, #0\n\t"
  18943. "lsr r6, r8, #16\n\t"
  18944. "lsr r7, r9, #16\n\t"
  18945. "mul r7, r6, r7\n\t"
  18946. "adds r5, r5, r7\n\t"
  18947. "adc r3, r3, #0\n\t"
  18948. "lsl r7, r9, #16\n\t"
  18949. "lsr r7, r7, #16\n\t"
  18950. "mul r6, r7, r6\n\t"
  18951. "lsr r7, r6, #16\n\t"
  18952. "lsl r6, r6, #16\n\t"
  18953. "adds r4, r4, r6\n\t"
  18954. "adcs r5, r5, r7\n\t"
  18955. "adc r3, r3, #0\n\t"
  18956. #else
  18957. "umull r6, r7, r8, r9\n\t"
  18958. "adds r4, r4, r6\n\t"
  18959. "adcs r5, r5, r7\n\t"
  18960. "adc r3, r3, #0\n\t"
  18961. #endif
  18962. /* A[7] * B[0] */
  18963. "ldr r8, [%[a], #28]\n\t"
  18964. "ldr r9, [%[b]]\n\t"
  18965. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  18966. "lsl r6, r8, #16\n\t"
  18967. "lsl r7, r9, #16\n\t"
  18968. "lsr r6, r6, #16\n\t"
  18969. "lsr r7, r7, #16\n\t"
  18970. "mul r7, r6, r7\n\t"
  18971. "adds r4, r4, r7\n\t"
  18972. "adcs r5, r5, #0\n\t"
  18973. "adc r3, r3, #0\n\t"
  18974. "lsr r7, r9, #16\n\t"
  18975. "mul r6, r7, r6\n\t"
  18976. "lsr r7, r6, #16\n\t"
  18977. "lsl r6, r6, #16\n\t"
  18978. "adds r4, r4, r6\n\t"
  18979. "adcs r5, r5, r7\n\t"
  18980. "adc r3, r3, #0\n\t"
  18981. "lsr r6, r8, #16\n\t"
  18982. "lsr r7, r9, #16\n\t"
  18983. "mul r7, r6, r7\n\t"
  18984. "adds r5, r5, r7\n\t"
  18985. "adc r3, r3, #0\n\t"
  18986. "lsl r7, r9, #16\n\t"
  18987. "lsr r7, r7, #16\n\t"
  18988. "mul r6, r7, r6\n\t"
  18989. "lsr r7, r6, #16\n\t"
  18990. "lsl r6, r6, #16\n\t"
  18991. "adds r4, r4, r6\n\t"
  18992. "adcs r5, r5, r7\n\t"
  18993. "adc r3, r3, #0\n\t"
  18994. #else
  18995. "umull r6, r7, r8, r9\n\t"
  18996. "adds r4, r4, r6\n\t"
  18997. "adcs r5, r5, r7\n\t"
  18998. "adc r3, r3, #0\n\t"
  18999. #endif
  19000. "str r4, [sp, #28]\n\t"
  19001. /* A[8] * B[0] */
  19002. "ldr r8, [%[a], #32]\n\t"
  19003. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19004. "lsl r6, r8, #16\n\t"
  19005. "lsl r7, r9, #16\n\t"
  19006. "lsr r6, r6, #16\n\t"
  19007. "lsr r7, r7, #16\n\t"
  19008. "mul r7, r6, r7\n\t"
  19009. "adds r5, r5, r7\n\t"
  19010. "adcs r3, r3, #0\n\t"
  19011. "mov r4, #0\n\t"
  19012. "adc r4, r4, #0\n\t"
  19013. "lsr r7, r9, #16\n\t"
  19014. "mul r6, r7, r6\n\t"
  19015. "lsr r7, r6, #16\n\t"
  19016. "lsl r6, r6, #16\n\t"
  19017. "adds r5, r5, r6\n\t"
  19018. "adcs r3, r3, r7\n\t"
  19019. "adc r4, r4, #0\n\t"
  19020. "lsr r6, r8, #16\n\t"
  19021. "lsr r7, r9, #16\n\t"
  19022. "mul r7, r6, r7\n\t"
  19023. "adds r3, r3, r7\n\t"
  19024. "adc r4, r4, #0\n\t"
  19025. "lsl r7, r9, #16\n\t"
  19026. "lsr r7, r7, #16\n\t"
  19027. "mul r6, r7, r6\n\t"
  19028. "lsr r7, r6, #16\n\t"
  19029. "lsl r6, r6, #16\n\t"
  19030. "adds r5, r5, r6\n\t"
  19031. "adcs r3, r3, r7\n\t"
  19032. "adc r4, r4, #0\n\t"
  19033. #else
  19034. "umull r6, r7, r8, r9\n\t"
  19035. "adds r5, r5, r6\n\t"
  19036. "adcs r3, r3, r7\n\t"
  19037. "mov r4, #0\n\t"
  19038. "adc r4, r4, #0\n\t"
  19039. #endif
  19040. /* A[7] * B[1] */
  19041. "ldr r8, [%[a], #28]\n\t"
  19042. "ldr r9, [%[b], #4]\n\t"
  19043. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19044. "lsl r6, r8, #16\n\t"
  19045. "lsl r7, r9, #16\n\t"
  19046. "lsr r6, r6, #16\n\t"
  19047. "lsr r7, r7, #16\n\t"
  19048. "mul r7, r6, r7\n\t"
  19049. "adds r5, r5, r7\n\t"
  19050. "adcs r3, r3, #0\n\t"
  19051. "adc r4, r4, #0\n\t"
  19052. "lsr r7, r9, #16\n\t"
  19053. "mul r6, r7, r6\n\t"
  19054. "lsr r7, r6, #16\n\t"
  19055. "lsl r6, r6, #16\n\t"
  19056. "adds r5, r5, r6\n\t"
  19057. "adcs r3, r3, r7\n\t"
  19058. "adc r4, r4, #0\n\t"
  19059. "lsr r6, r8, #16\n\t"
  19060. "lsr r7, r9, #16\n\t"
  19061. "mul r7, r6, r7\n\t"
  19062. "adds r3, r3, r7\n\t"
  19063. "adc r4, r4, #0\n\t"
  19064. "lsl r7, r9, #16\n\t"
  19065. "lsr r7, r7, #16\n\t"
  19066. "mul r6, r7, r6\n\t"
  19067. "lsr r7, r6, #16\n\t"
  19068. "lsl r6, r6, #16\n\t"
  19069. "adds r5, r5, r6\n\t"
  19070. "adcs r3, r3, r7\n\t"
  19071. "adc r4, r4, #0\n\t"
  19072. #else
  19073. "umull r6, r7, r8, r9\n\t"
  19074. "adds r5, r5, r6\n\t"
  19075. "adcs r3, r3, r7\n\t"
  19076. "adc r4, r4, #0\n\t"
  19077. #endif
  19078. /* A[6] * B[2] */
  19079. "ldr r8, [%[a], #24]\n\t"
  19080. "ldr r9, [%[b], #8]\n\t"
  19081. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19082. "lsl r6, r8, #16\n\t"
  19083. "lsl r7, r9, #16\n\t"
  19084. "lsr r6, r6, #16\n\t"
  19085. "lsr r7, r7, #16\n\t"
  19086. "mul r7, r6, r7\n\t"
  19087. "adds r5, r5, r7\n\t"
  19088. "adcs r3, r3, #0\n\t"
  19089. "adc r4, r4, #0\n\t"
  19090. "lsr r7, r9, #16\n\t"
  19091. "mul r6, r7, r6\n\t"
  19092. "lsr r7, r6, #16\n\t"
  19093. "lsl r6, r6, #16\n\t"
  19094. "adds r5, r5, r6\n\t"
  19095. "adcs r3, r3, r7\n\t"
  19096. "adc r4, r4, #0\n\t"
  19097. "lsr r6, r8, #16\n\t"
  19098. "lsr r7, r9, #16\n\t"
  19099. "mul r7, r6, r7\n\t"
  19100. "adds r3, r3, r7\n\t"
  19101. "adc r4, r4, #0\n\t"
  19102. "lsl r7, r9, #16\n\t"
  19103. "lsr r7, r7, #16\n\t"
  19104. "mul r6, r7, r6\n\t"
  19105. "lsr r7, r6, #16\n\t"
  19106. "lsl r6, r6, #16\n\t"
  19107. "adds r5, r5, r6\n\t"
  19108. "adcs r3, r3, r7\n\t"
  19109. "adc r4, r4, #0\n\t"
  19110. #else
  19111. "umull r6, r7, r8, r9\n\t"
  19112. "adds r5, r5, r6\n\t"
  19113. "adcs r3, r3, r7\n\t"
  19114. "adc r4, r4, #0\n\t"
  19115. #endif
  19116. /* A[5] * B[3] */
  19117. "ldr r8, [%[a], #20]\n\t"
  19118. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19119. "lsl r6, r8, #16\n\t"
  19120. "lsl r7, r12, #16\n\t"
  19121. "lsr r6, r6, #16\n\t"
  19122. "lsr r7, r7, #16\n\t"
  19123. "mul r7, r6, r7\n\t"
  19124. "adds r5, r5, r7\n\t"
  19125. "adcs r3, r3, #0\n\t"
  19126. "adc r4, r4, #0\n\t"
  19127. "lsr r7, r12, #16\n\t"
  19128. "mul r6, r7, r6\n\t"
  19129. "lsr r7, r6, #16\n\t"
  19130. "lsl r6, r6, #16\n\t"
  19131. "adds r5, r5, r6\n\t"
  19132. "adcs r3, r3, r7\n\t"
  19133. "adc r4, r4, #0\n\t"
  19134. "lsr r6, r8, #16\n\t"
  19135. "lsr r7, r12, #16\n\t"
  19136. "mul r7, r6, r7\n\t"
  19137. "adds r3, r3, r7\n\t"
  19138. "adc r4, r4, #0\n\t"
  19139. "lsl r7, r12, #16\n\t"
  19140. "lsr r7, r7, #16\n\t"
  19141. "mul r6, r7, r6\n\t"
  19142. "lsr r7, r6, #16\n\t"
  19143. "lsl r6, r6, #16\n\t"
  19144. "adds r5, r5, r6\n\t"
  19145. "adcs r3, r3, r7\n\t"
  19146. "adc r4, r4, #0\n\t"
  19147. #else
  19148. "umull r6, r7, r8, r12\n\t"
  19149. "adds r5, r5, r6\n\t"
  19150. "adcs r3, r3, r7\n\t"
  19151. "adc r4, r4, #0\n\t"
  19152. #endif
  19153. /* A[4] * B[4] */
  19154. "ldr r11, [%[a], #16]\n\t"
  19155. "ldr r12, [%[b], #16]\n\t"
  19156. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19157. "lsl r6, r11, #16\n\t"
  19158. "lsl r7, r12, #16\n\t"
  19159. "lsr r6, r6, #16\n\t"
  19160. "lsr r7, r7, #16\n\t"
  19161. "mul r7, r6, r7\n\t"
  19162. "adds r5, r5, r7\n\t"
  19163. "adcs r3, r3, #0\n\t"
  19164. "adc r4, r4, #0\n\t"
  19165. "lsr r7, r12, #16\n\t"
  19166. "mul r6, r7, r6\n\t"
  19167. "lsr r7, r6, #16\n\t"
  19168. "lsl r6, r6, #16\n\t"
  19169. "adds r5, r5, r6\n\t"
  19170. "adcs r3, r3, r7\n\t"
  19171. "adc r4, r4, #0\n\t"
  19172. "lsr r6, r11, #16\n\t"
  19173. "lsr r7, r12, #16\n\t"
  19174. "mul r7, r6, r7\n\t"
  19175. "adds r3, r3, r7\n\t"
  19176. "adc r4, r4, #0\n\t"
  19177. "lsl r7, r12, #16\n\t"
  19178. "lsr r7, r7, #16\n\t"
  19179. "mul r6, r7, r6\n\t"
  19180. "lsr r7, r6, #16\n\t"
  19181. "lsl r6, r6, #16\n\t"
  19182. "adds r5, r5, r6\n\t"
  19183. "adcs r3, r3, r7\n\t"
  19184. "adc r4, r4, #0\n\t"
  19185. #else
  19186. "umull r6, r7, r11, r12\n\t"
  19187. "adds r5, r5, r6\n\t"
  19188. "adcs r3, r3, r7\n\t"
  19189. "adc r4, r4, #0\n\t"
  19190. #endif
  19191. /* A[3] * B[5] */
  19192. "ldr r8, [%[a], #12]\n\t"
  19193. "ldr r9, [%[b], #20]\n\t"
  19194. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19195. "lsl r6, r8, #16\n\t"
  19196. "lsl r7, r9, #16\n\t"
  19197. "lsr r6, r6, #16\n\t"
  19198. "lsr r7, r7, #16\n\t"
  19199. "mul r7, r6, r7\n\t"
  19200. "adds r5, r5, r7\n\t"
  19201. "adcs r3, r3, #0\n\t"
  19202. "adc r4, r4, #0\n\t"
  19203. "lsr r7, r9, #16\n\t"
  19204. "mul r6, r7, r6\n\t"
  19205. "lsr r7, r6, #16\n\t"
  19206. "lsl r6, r6, #16\n\t"
  19207. "adds r5, r5, r6\n\t"
  19208. "adcs r3, r3, r7\n\t"
  19209. "adc r4, r4, #0\n\t"
  19210. "lsr r6, r8, #16\n\t"
  19211. "lsr r7, r9, #16\n\t"
  19212. "mul r7, r6, r7\n\t"
  19213. "adds r3, r3, r7\n\t"
  19214. "adc r4, r4, #0\n\t"
  19215. "lsl r7, r9, #16\n\t"
  19216. "lsr r7, r7, #16\n\t"
  19217. "mul r6, r7, r6\n\t"
  19218. "lsr r7, r6, #16\n\t"
  19219. "lsl r6, r6, #16\n\t"
  19220. "adds r5, r5, r6\n\t"
  19221. "adcs r3, r3, r7\n\t"
  19222. "adc r4, r4, #0\n\t"
  19223. #else
  19224. "umull r6, r7, r8, r9\n\t"
  19225. "adds r5, r5, r6\n\t"
  19226. "adcs r3, r3, r7\n\t"
  19227. "adc r4, r4, #0\n\t"
  19228. #endif
  19229. /* A[2] * B[6] */
  19230. "ldr r8, [%[a], #8]\n\t"
  19231. "ldr r9, [%[b], #24]\n\t"
  19232. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19233. "lsl r6, r8, #16\n\t"
  19234. "lsl r7, r9, #16\n\t"
  19235. "lsr r6, r6, #16\n\t"
  19236. "lsr r7, r7, #16\n\t"
  19237. "mul r7, r6, r7\n\t"
  19238. "adds r5, r5, r7\n\t"
  19239. "adcs r3, r3, #0\n\t"
  19240. "adc r4, r4, #0\n\t"
  19241. "lsr r7, r9, #16\n\t"
  19242. "mul r6, r7, r6\n\t"
  19243. "lsr r7, r6, #16\n\t"
  19244. "lsl r6, r6, #16\n\t"
  19245. "adds r5, r5, r6\n\t"
  19246. "adcs r3, r3, r7\n\t"
  19247. "adc r4, r4, #0\n\t"
  19248. "lsr r6, r8, #16\n\t"
  19249. "lsr r7, r9, #16\n\t"
  19250. "mul r7, r6, r7\n\t"
  19251. "adds r3, r3, r7\n\t"
  19252. "adc r4, r4, #0\n\t"
  19253. "lsl r7, r9, #16\n\t"
  19254. "lsr r7, r7, #16\n\t"
  19255. "mul r6, r7, r6\n\t"
  19256. "lsr r7, r6, #16\n\t"
  19257. "lsl r6, r6, #16\n\t"
  19258. "adds r5, r5, r6\n\t"
  19259. "adcs r3, r3, r7\n\t"
  19260. "adc r4, r4, #0\n\t"
  19261. #else
  19262. "umull r6, r7, r8, r9\n\t"
  19263. "adds r5, r5, r6\n\t"
  19264. "adcs r3, r3, r7\n\t"
  19265. "adc r4, r4, #0\n\t"
  19266. #endif
  19267. /* A[1] * B[7] */
  19268. "ldr r8, [%[a], #4]\n\t"
  19269. "ldr r9, [%[b], #28]\n\t"
  19270. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19271. "lsl r6, r8, #16\n\t"
  19272. "lsl r7, r9, #16\n\t"
  19273. "lsr r6, r6, #16\n\t"
  19274. "lsr r7, r7, #16\n\t"
  19275. "mul r7, r6, r7\n\t"
  19276. "adds r5, r5, r7\n\t"
  19277. "adcs r3, r3, #0\n\t"
  19278. "adc r4, r4, #0\n\t"
  19279. "lsr r7, r9, #16\n\t"
  19280. "mul r6, r7, r6\n\t"
  19281. "lsr r7, r6, #16\n\t"
  19282. "lsl r6, r6, #16\n\t"
  19283. "adds r5, r5, r6\n\t"
  19284. "adcs r3, r3, r7\n\t"
  19285. "adc r4, r4, #0\n\t"
  19286. "lsr r6, r8, #16\n\t"
  19287. "lsr r7, r9, #16\n\t"
  19288. "mul r7, r6, r7\n\t"
  19289. "adds r3, r3, r7\n\t"
  19290. "adc r4, r4, #0\n\t"
  19291. "lsl r7, r9, #16\n\t"
  19292. "lsr r7, r7, #16\n\t"
  19293. "mul r6, r7, r6\n\t"
  19294. "lsr r7, r6, #16\n\t"
  19295. "lsl r6, r6, #16\n\t"
  19296. "adds r5, r5, r6\n\t"
  19297. "adcs r3, r3, r7\n\t"
  19298. "adc r4, r4, #0\n\t"
  19299. #else
  19300. "umull r6, r7, r8, r9\n\t"
  19301. "adds r5, r5, r6\n\t"
  19302. "adcs r3, r3, r7\n\t"
  19303. "adc r4, r4, #0\n\t"
  19304. #endif
  19305. /* A[0] * B[8] */
  19306. "ldr r8, [%[a]]\n\t"
  19307. "ldr r9, [%[b], #32]\n\t"
  19308. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19309. "lsl r6, r8, #16\n\t"
  19310. "lsl r7, r9, #16\n\t"
  19311. "lsr r6, r6, #16\n\t"
  19312. "lsr r7, r7, #16\n\t"
  19313. "mul r7, r6, r7\n\t"
  19314. "adds r5, r5, r7\n\t"
  19315. "adcs r3, r3, #0\n\t"
  19316. "adc r4, r4, #0\n\t"
  19317. "lsr r7, r9, #16\n\t"
  19318. "mul r6, r7, r6\n\t"
  19319. "lsr r7, r6, #16\n\t"
  19320. "lsl r6, r6, #16\n\t"
  19321. "adds r5, r5, r6\n\t"
  19322. "adcs r3, r3, r7\n\t"
  19323. "adc r4, r4, #0\n\t"
  19324. "lsr r6, r8, #16\n\t"
  19325. "lsr r7, r9, #16\n\t"
  19326. "mul r7, r6, r7\n\t"
  19327. "adds r3, r3, r7\n\t"
  19328. "adc r4, r4, #0\n\t"
  19329. "lsl r7, r9, #16\n\t"
  19330. "lsr r7, r7, #16\n\t"
  19331. "mul r6, r7, r6\n\t"
  19332. "lsr r7, r6, #16\n\t"
  19333. "lsl r6, r6, #16\n\t"
  19334. "adds r5, r5, r6\n\t"
  19335. "adcs r3, r3, r7\n\t"
  19336. "adc r4, r4, #0\n\t"
  19337. #else
  19338. "umull r6, r7, r8, r9\n\t"
  19339. "adds r5, r5, r6\n\t"
  19340. "adcs r3, r3, r7\n\t"
  19341. "adc r4, r4, #0\n\t"
  19342. #endif
  19343. "str r5, [sp, #32]\n\t"
  19344. /* A[0] * B[9] */
  19345. "ldr r9, [%[b], #36]\n\t"
  19346. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19347. "lsl r6, r8, #16\n\t"
  19348. "lsl r7, r9, #16\n\t"
  19349. "lsr r6, r6, #16\n\t"
  19350. "lsr r7, r7, #16\n\t"
  19351. "mul r7, r6, r7\n\t"
  19352. "adds r3, r3, r7\n\t"
  19353. "adcs r4, r4, #0\n\t"
  19354. "mov r5, #0\n\t"
  19355. "adc r5, r5, #0\n\t"
  19356. "lsr r7, r9, #16\n\t"
  19357. "mul r6, r7, r6\n\t"
  19358. "lsr r7, r6, #16\n\t"
  19359. "lsl r6, r6, #16\n\t"
  19360. "adds r3, r3, r6\n\t"
  19361. "adcs r4, r4, r7\n\t"
  19362. "adc r5, r5, #0\n\t"
  19363. "lsr r6, r8, #16\n\t"
  19364. "lsr r7, r9, #16\n\t"
  19365. "mul r7, r6, r7\n\t"
  19366. "adds r4, r4, r7\n\t"
  19367. "adc r5, r5, #0\n\t"
  19368. "lsl r7, r9, #16\n\t"
  19369. "lsr r7, r7, #16\n\t"
  19370. "mul r6, r7, r6\n\t"
  19371. "lsr r7, r6, #16\n\t"
  19372. "lsl r6, r6, #16\n\t"
  19373. "adds r3, r3, r6\n\t"
  19374. "adcs r4, r4, r7\n\t"
  19375. "adc r5, r5, #0\n\t"
  19376. #else
  19377. "umull r6, r7, r8, r9\n\t"
  19378. "adds r3, r3, r6\n\t"
  19379. "adcs r4, r4, r7\n\t"
  19380. "mov r5, #0\n\t"
  19381. "adc r5, r5, #0\n\t"
  19382. #endif
  19383. /* A[1] * B[8] */
  19384. "ldr r8, [%[a], #4]\n\t"
  19385. "ldr r9, [%[b], #32]\n\t"
  19386. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19387. "lsl r6, r8, #16\n\t"
  19388. "lsl r7, r9, #16\n\t"
  19389. "lsr r6, r6, #16\n\t"
  19390. "lsr r7, r7, #16\n\t"
  19391. "mul r7, r6, r7\n\t"
  19392. "adds r3, r3, r7\n\t"
  19393. "adcs r4, r4, #0\n\t"
  19394. "adc r5, r5, #0\n\t"
  19395. "lsr r7, r9, #16\n\t"
  19396. "mul r6, r7, r6\n\t"
  19397. "lsr r7, r6, #16\n\t"
  19398. "lsl r6, r6, #16\n\t"
  19399. "adds r3, r3, r6\n\t"
  19400. "adcs r4, r4, r7\n\t"
  19401. "adc r5, r5, #0\n\t"
  19402. "lsr r6, r8, #16\n\t"
  19403. "lsr r7, r9, #16\n\t"
  19404. "mul r7, r6, r7\n\t"
  19405. "adds r4, r4, r7\n\t"
  19406. "adc r5, r5, #0\n\t"
  19407. "lsl r7, r9, #16\n\t"
  19408. "lsr r7, r7, #16\n\t"
  19409. "mul r6, r7, r6\n\t"
  19410. "lsr r7, r6, #16\n\t"
  19411. "lsl r6, r6, #16\n\t"
  19412. "adds r3, r3, r6\n\t"
  19413. "adcs r4, r4, r7\n\t"
  19414. "adc r5, r5, #0\n\t"
  19415. #else
  19416. "umull r6, r7, r8, r9\n\t"
  19417. "adds r3, r3, r6\n\t"
  19418. "adcs r4, r4, r7\n\t"
  19419. "adc r5, r5, #0\n\t"
  19420. #endif
  19421. /* A[2] * B[7] */
  19422. "ldr r8, [%[a], #8]\n\t"
  19423. "ldr r9, [%[b], #28]\n\t"
  19424. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19425. "lsl r6, r8, #16\n\t"
  19426. "lsl r7, r9, #16\n\t"
  19427. "lsr r6, r6, #16\n\t"
  19428. "lsr r7, r7, #16\n\t"
  19429. "mul r7, r6, r7\n\t"
  19430. "adds r3, r3, r7\n\t"
  19431. "adcs r4, r4, #0\n\t"
  19432. "adc r5, r5, #0\n\t"
  19433. "lsr r7, r9, #16\n\t"
  19434. "mul r6, r7, r6\n\t"
  19435. "lsr r7, r6, #16\n\t"
  19436. "lsl r6, r6, #16\n\t"
  19437. "adds r3, r3, r6\n\t"
  19438. "adcs r4, r4, r7\n\t"
  19439. "adc r5, r5, #0\n\t"
  19440. "lsr r6, r8, #16\n\t"
  19441. "lsr r7, r9, #16\n\t"
  19442. "mul r7, r6, r7\n\t"
  19443. "adds r4, r4, r7\n\t"
  19444. "adc r5, r5, #0\n\t"
  19445. "lsl r7, r9, #16\n\t"
  19446. "lsr r7, r7, #16\n\t"
  19447. "mul r6, r7, r6\n\t"
  19448. "lsr r7, r6, #16\n\t"
  19449. "lsl r6, r6, #16\n\t"
  19450. "adds r3, r3, r6\n\t"
  19451. "adcs r4, r4, r7\n\t"
  19452. "adc r5, r5, #0\n\t"
  19453. #else
  19454. "umull r6, r7, r8, r9\n\t"
  19455. "adds r3, r3, r6\n\t"
  19456. "adcs r4, r4, r7\n\t"
  19457. "adc r5, r5, #0\n\t"
  19458. #endif
  19459. /* A[3] * B[6] */
  19460. "ldr r8, [%[a], #12]\n\t"
  19461. "ldr r9, [%[b], #24]\n\t"
  19462. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19463. "lsl r6, r8, #16\n\t"
  19464. "lsl r7, r9, #16\n\t"
  19465. "lsr r6, r6, #16\n\t"
  19466. "lsr r7, r7, #16\n\t"
  19467. "mul r7, r6, r7\n\t"
  19468. "adds r3, r3, r7\n\t"
  19469. "adcs r4, r4, #0\n\t"
  19470. "adc r5, r5, #0\n\t"
  19471. "lsr r7, r9, #16\n\t"
  19472. "mul r6, r7, r6\n\t"
  19473. "lsr r7, r6, #16\n\t"
  19474. "lsl r6, r6, #16\n\t"
  19475. "adds r3, r3, r6\n\t"
  19476. "adcs r4, r4, r7\n\t"
  19477. "adc r5, r5, #0\n\t"
  19478. "lsr r6, r8, #16\n\t"
  19479. "lsr r7, r9, #16\n\t"
  19480. "mul r7, r6, r7\n\t"
  19481. "adds r4, r4, r7\n\t"
  19482. "adc r5, r5, #0\n\t"
  19483. "lsl r7, r9, #16\n\t"
  19484. "lsr r7, r7, #16\n\t"
  19485. "mul r6, r7, r6\n\t"
  19486. "lsr r7, r6, #16\n\t"
  19487. "lsl r6, r6, #16\n\t"
  19488. "adds r3, r3, r6\n\t"
  19489. "adcs r4, r4, r7\n\t"
  19490. "adc r5, r5, #0\n\t"
  19491. #else
  19492. "umull r6, r7, r8, r9\n\t"
  19493. "adds r3, r3, r6\n\t"
  19494. "adcs r4, r4, r7\n\t"
  19495. "adc r5, r5, #0\n\t"
  19496. #endif
  19497. /* A[4] * B[5] */
  19498. "ldr r9, [%[b], #20]\n\t"
  19499. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19500. "lsl r6, r11, #16\n\t"
  19501. "lsl r7, r9, #16\n\t"
  19502. "lsr r6, r6, #16\n\t"
  19503. "lsr r7, r7, #16\n\t"
  19504. "mul r7, r6, r7\n\t"
  19505. "adds r3, r3, r7\n\t"
  19506. "adcs r4, r4, #0\n\t"
  19507. "adc r5, r5, #0\n\t"
  19508. "lsr r7, r9, #16\n\t"
  19509. "mul r6, r7, r6\n\t"
  19510. "lsr r7, r6, #16\n\t"
  19511. "lsl r6, r6, #16\n\t"
  19512. "adds r3, r3, r6\n\t"
  19513. "adcs r4, r4, r7\n\t"
  19514. "adc r5, r5, #0\n\t"
  19515. "lsr r6, r11, #16\n\t"
  19516. "lsr r7, r9, #16\n\t"
  19517. "mul r7, r6, r7\n\t"
  19518. "adds r4, r4, r7\n\t"
  19519. "adc r5, r5, #0\n\t"
  19520. "lsl r7, r9, #16\n\t"
  19521. "lsr r7, r7, #16\n\t"
  19522. "mul r6, r7, r6\n\t"
  19523. "lsr r7, r6, #16\n\t"
  19524. "lsl r6, r6, #16\n\t"
  19525. "adds r3, r3, r6\n\t"
  19526. "adcs r4, r4, r7\n\t"
  19527. "adc r5, r5, #0\n\t"
  19528. #else
  19529. "umull r6, r7, r11, r9\n\t"
  19530. "adds r3, r3, r6\n\t"
  19531. "adcs r4, r4, r7\n\t"
  19532. "adc r5, r5, #0\n\t"
  19533. #endif
  19534. /* A[5] * B[4] */
  19535. "ldr r8, [%[a], #20]\n\t"
  19536. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19537. "lsl r6, r8, #16\n\t"
  19538. "lsl r7, r12, #16\n\t"
  19539. "lsr r6, r6, #16\n\t"
  19540. "lsr r7, r7, #16\n\t"
  19541. "mul r7, r6, r7\n\t"
  19542. "adds r3, r3, r7\n\t"
  19543. "adcs r4, r4, #0\n\t"
  19544. "adc r5, r5, #0\n\t"
  19545. "lsr r7, r12, #16\n\t"
  19546. "mul r6, r7, r6\n\t"
  19547. "lsr r7, r6, #16\n\t"
  19548. "lsl r6, r6, #16\n\t"
  19549. "adds r3, r3, r6\n\t"
  19550. "adcs r4, r4, r7\n\t"
  19551. "adc r5, r5, #0\n\t"
  19552. "lsr r6, r8, #16\n\t"
  19553. "lsr r7, r12, #16\n\t"
  19554. "mul r7, r6, r7\n\t"
  19555. "adds r4, r4, r7\n\t"
  19556. "adc r5, r5, #0\n\t"
  19557. "lsl r7, r12, #16\n\t"
  19558. "lsr r7, r7, #16\n\t"
  19559. "mul r6, r7, r6\n\t"
  19560. "lsr r7, r6, #16\n\t"
  19561. "lsl r6, r6, #16\n\t"
  19562. "adds r3, r3, r6\n\t"
  19563. "adcs r4, r4, r7\n\t"
  19564. "adc r5, r5, #0\n\t"
  19565. #else
  19566. "umull r6, r7, r8, r12\n\t"
  19567. "adds r3, r3, r6\n\t"
  19568. "adcs r4, r4, r7\n\t"
  19569. "adc r5, r5, #0\n\t"
  19570. #endif
  19571. /* A[6] * B[3] */
  19572. "ldr r8, [%[a], #24]\n\t"
  19573. "ldr r9, [%[b], #12]\n\t"
  19574. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19575. "lsl r6, r8, #16\n\t"
  19576. "lsl r7, r9, #16\n\t"
  19577. "lsr r6, r6, #16\n\t"
  19578. "lsr r7, r7, #16\n\t"
  19579. "mul r7, r6, r7\n\t"
  19580. "adds r3, r3, r7\n\t"
  19581. "adcs r4, r4, #0\n\t"
  19582. "adc r5, r5, #0\n\t"
  19583. "lsr r7, r9, #16\n\t"
  19584. "mul r6, r7, r6\n\t"
  19585. "lsr r7, r6, #16\n\t"
  19586. "lsl r6, r6, #16\n\t"
  19587. "adds r3, r3, r6\n\t"
  19588. "adcs r4, r4, r7\n\t"
  19589. "adc r5, r5, #0\n\t"
  19590. "lsr r6, r8, #16\n\t"
  19591. "lsr r7, r9, #16\n\t"
  19592. "mul r7, r6, r7\n\t"
  19593. "adds r4, r4, r7\n\t"
  19594. "adc r5, r5, #0\n\t"
  19595. "lsl r7, r9, #16\n\t"
  19596. "lsr r7, r7, #16\n\t"
  19597. "mul r6, r7, r6\n\t"
  19598. "lsr r7, r6, #16\n\t"
  19599. "lsl r6, r6, #16\n\t"
  19600. "adds r3, r3, r6\n\t"
  19601. "adcs r4, r4, r7\n\t"
  19602. "adc r5, r5, #0\n\t"
  19603. #else
  19604. "umull r6, r7, r8, r9\n\t"
  19605. "adds r3, r3, r6\n\t"
  19606. "adcs r4, r4, r7\n\t"
  19607. "adc r5, r5, #0\n\t"
  19608. #endif
  19609. /* A[7] * B[2] */
  19610. "ldr r8, [%[a], #28]\n\t"
  19611. "ldr r9, [%[b], #8]\n\t"
  19612. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19613. "lsl r6, r8, #16\n\t"
  19614. "lsl r7, r9, #16\n\t"
  19615. "lsr r6, r6, #16\n\t"
  19616. "lsr r7, r7, #16\n\t"
  19617. "mul r7, r6, r7\n\t"
  19618. "adds r3, r3, r7\n\t"
  19619. "adcs r4, r4, #0\n\t"
  19620. "adc r5, r5, #0\n\t"
  19621. "lsr r7, r9, #16\n\t"
  19622. "mul r6, r7, r6\n\t"
  19623. "lsr r7, r6, #16\n\t"
  19624. "lsl r6, r6, #16\n\t"
  19625. "adds r3, r3, r6\n\t"
  19626. "adcs r4, r4, r7\n\t"
  19627. "adc r5, r5, #0\n\t"
  19628. "lsr r6, r8, #16\n\t"
  19629. "lsr r7, r9, #16\n\t"
  19630. "mul r7, r6, r7\n\t"
  19631. "adds r4, r4, r7\n\t"
  19632. "adc r5, r5, #0\n\t"
  19633. "lsl r7, r9, #16\n\t"
  19634. "lsr r7, r7, #16\n\t"
  19635. "mul r6, r7, r6\n\t"
  19636. "lsr r7, r6, #16\n\t"
  19637. "lsl r6, r6, #16\n\t"
  19638. "adds r3, r3, r6\n\t"
  19639. "adcs r4, r4, r7\n\t"
  19640. "adc r5, r5, #0\n\t"
  19641. #else
  19642. "umull r6, r7, r8, r9\n\t"
  19643. "adds r3, r3, r6\n\t"
  19644. "adcs r4, r4, r7\n\t"
  19645. "adc r5, r5, #0\n\t"
  19646. #endif
  19647. /* A[8] * B[1] */
  19648. "ldr r8, [%[a], #32]\n\t"
  19649. "ldr r9, [%[b], #4]\n\t"
  19650. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19651. "lsl r6, r8, #16\n\t"
  19652. "lsl r7, r9, #16\n\t"
  19653. "lsr r6, r6, #16\n\t"
  19654. "lsr r7, r7, #16\n\t"
  19655. "mul r7, r6, r7\n\t"
  19656. "adds r3, r3, r7\n\t"
  19657. "adcs r4, r4, #0\n\t"
  19658. "adc r5, r5, #0\n\t"
  19659. "lsr r7, r9, #16\n\t"
  19660. "mul r6, r7, r6\n\t"
  19661. "lsr r7, r6, #16\n\t"
  19662. "lsl r6, r6, #16\n\t"
  19663. "adds r3, r3, r6\n\t"
  19664. "adcs r4, r4, r7\n\t"
  19665. "adc r5, r5, #0\n\t"
  19666. "lsr r6, r8, #16\n\t"
  19667. "lsr r7, r9, #16\n\t"
  19668. "mul r7, r6, r7\n\t"
  19669. "adds r4, r4, r7\n\t"
  19670. "adc r5, r5, #0\n\t"
  19671. "lsl r7, r9, #16\n\t"
  19672. "lsr r7, r7, #16\n\t"
  19673. "mul r6, r7, r6\n\t"
  19674. "lsr r7, r6, #16\n\t"
  19675. "lsl r6, r6, #16\n\t"
  19676. "adds r3, r3, r6\n\t"
  19677. "adcs r4, r4, r7\n\t"
  19678. "adc r5, r5, #0\n\t"
  19679. #else
  19680. "umull r6, r7, r8, r9\n\t"
  19681. "adds r3, r3, r6\n\t"
  19682. "adcs r4, r4, r7\n\t"
  19683. "adc r5, r5, #0\n\t"
  19684. #endif
  19685. /* A[9] * B[0] */
  19686. "ldr r8, [%[a], #36]\n\t"
  19687. "ldr r9, [%[b]]\n\t"
  19688. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19689. "lsl r6, r8, #16\n\t"
  19690. "lsl r7, r9, #16\n\t"
  19691. "lsr r6, r6, #16\n\t"
  19692. "lsr r7, r7, #16\n\t"
  19693. "mul r7, r6, r7\n\t"
  19694. "adds r3, r3, r7\n\t"
  19695. "adcs r4, r4, #0\n\t"
  19696. "adc r5, r5, #0\n\t"
  19697. "lsr r7, r9, #16\n\t"
  19698. "mul r6, r7, r6\n\t"
  19699. "lsr r7, r6, #16\n\t"
  19700. "lsl r6, r6, #16\n\t"
  19701. "adds r3, r3, r6\n\t"
  19702. "adcs r4, r4, r7\n\t"
  19703. "adc r5, r5, #0\n\t"
  19704. "lsr r6, r8, #16\n\t"
  19705. "lsr r7, r9, #16\n\t"
  19706. "mul r7, r6, r7\n\t"
  19707. "adds r4, r4, r7\n\t"
  19708. "adc r5, r5, #0\n\t"
  19709. "lsl r7, r9, #16\n\t"
  19710. "lsr r7, r7, #16\n\t"
  19711. "mul r6, r7, r6\n\t"
  19712. "lsr r7, r6, #16\n\t"
  19713. "lsl r6, r6, #16\n\t"
  19714. "adds r3, r3, r6\n\t"
  19715. "adcs r4, r4, r7\n\t"
  19716. "adc r5, r5, #0\n\t"
  19717. #else
  19718. "umull r6, r7, r8, r9\n\t"
  19719. "adds r3, r3, r6\n\t"
  19720. "adcs r4, r4, r7\n\t"
  19721. "adc r5, r5, #0\n\t"
  19722. #endif
  19723. "str r3, [sp, #36]\n\t"
  19724. /* A[10] * B[0] */
  19725. "ldr r8, [%[a], #40]\n\t"
  19726. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19727. "lsl r6, r8, #16\n\t"
  19728. "lsl r7, r9, #16\n\t"
  19729. "lsr r6, r6, #16\n\t"
  19730. "lsr r7, r7, #16\n\t"
  19731. "mul r7, r6, r7\n\t"
  19732. "adds r4, r4, r7\n\t"
  19733. "adcs r5, r5, #0\n\t"
  19734. "mov r3, #0\n\t"
  19735. "adc r3, r3, #0\n\t"
  19736. "lsr r7, r9, #16\n\t"
  19737. "mul r6, r7, r6\n\t"
  19738. "lsr r7, r6, #16\n\t"
  19739. "lsl r6, r6, #16\n\t"
  19740. "adds r4, r4, r6\n\t"
  19741. "adcs r5, r5, r7\n\t"
  19742. "adc r3, r3, #0\n\t"
  19743. "lsr r6, r8, #16\n\t"
  19744. "lsr r7, r9, #16\n\t"
  19745. "mul r7, r6, r7\n\t"
  19746. "adds r5, r5, r7\n\t"
  19747. "adc r3, r3, #0\n\t"
  19748. "lsl r7, r9, #16\n\t"
  19749. "lsr r7, r7, #16\n\t"
  19750. "mul r6, r7, r6\n\t"
  19751. "lsr r7, r6, #16\n\t"
  19752. "lsl r6, r6, #16\n\t"
  19753. "adds r4, r4, r6\n\t"
  19754. "adcs r5, r5, r7\n\t"
  19755. "adc r3, r3, #0\n\t"
  19756. #else
  19757. "umull r6, r7, r8, r9\n\t"
  19758. "adds r4, r4, r6\n\t"
  19759. "adcs r5, r5, r7\n\t"
  19760. "mov r3, #0\n\t"
  19761. "adc r3, r3, #0\n\t"
  19762. #endif
  19763. /* A[9] * B[1] */
  19764. "ldr r8, [%[a], #36]\n\t"
  19765. "ldr r9, [%[b], #4]\n\t"
  19766. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19767. "lsl r6, r8, #16\n\t"
  19768. "lsl r7, r9, #16\n\t"
  19769. "lsr r6, r6, #16\n\t"
  19770. "lsr r7, r7, #16\n\t"
  19771. "mul r7, r6, r7\n\t"
  19772. "adds r4, r4, r7\n\t"
  19773. "adcs r5, r5, #0\n\t"
  19774. "adc r3, r3, #0\n\t"
  19775. "lsr r7, r9, #16\n\t"
  19776. "mul r6, r7, r6\n\t"
  19777. "lsr r7, r6, #16\n\t"
  19778. "lsl r6, r6, #16\n\t"
  19779. "adds r4, r4, r6\n\t"
  19780. "adcs r5, r5, r7\n\t"
  19781. "adc r3, r3, #0\n\t"
  19782. "lsr r6, r8, #16\n\t"
  19783. "lsr r7, r9, #16\n\t"
  19784. "mul r7, r6, r7\n\t"
  19785. "adds r5, r5, r7\n\t"
  19786. "adc r3, r3, #0\n\t"
  19787. "lsl r7, r9, #16\n\t"
  19788. "lsr r7, r7, #16\n\t"
  19789. "mul r6, r7, r6\n\t"
  19790. "lsr r7, r6, #16\n\t"
  19791. "lsl r6, r6, #16\n\t"
  19792. "adds r4, r4, r6\n\t"
  19793. "adcs r5, r5, r7\n\t"
  19794. "adc r3, r3, #0\n\t"
  19795. #else
  19796. "umull r6, r7, r8, r9\n\t"
  19797. "adds r4, r4, r6\n\t"
  19798. "adcs r5, r5, r7\n\t"
  19799. "adc r3, r3, #0\n\t"
  19800. #endif
  19801. /* A[8] * B[2] */
  19802. "ldr r8, [%[a], #32]\n\t"
  19803. "ldr r9, [%[b], #8]\n\t"
  19804. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19805. "lsl r6, r8, #16\n\t"
  19806. "lsl r7, r9, #16\n\t"
  19807. "lsr r6, r6, #16\n\t"
  19808. "lsr r7, r7, #16\n\t"
  19809. "mul r7, r6, r7\n\t"
  19810. "adds r4, r4, r7\n\t"
  19811. "adcs r5, r5, #0\n\t"
  19812. "adc r3, r3, #0\n\t"
  19813. "lsr r7, r9, #16\n\t"
  19814. "mul r6, r7, r6\n\t"
  19815. "lsr r7, r6, #16\n\t"
  19816. "lsl r6, r6, #16\n\t"
  19817. "adds r4, r4, r6\n\t"
  19818. "adcs r5, r5, r7\n\t"
  19819. "adc r3, r3, #0\n\t"
  19820. "lsr r6, r8, #16\n\t"
  19821. "lsr r7, r9, #16\n\t"
  19822. "mul r7, r6, r7\n\t"
  19823. "adds r5, r5, r7\n\t"
  19824. "adc r3, r3, #0\n\t"
  19825. "lsl r7, r9, #16\n\t"
  19826. "lsr r7, r7, #16\n\t"
  19827. "mul r6, r7, r6\n\t"
  19828. "lsr r7, r6, #16\n\t"
  19829. "lsl r6, r6, #16\n\t"
  19830. "adds r4, r4, r6\n\t"
  19831. "adcs r5, r5, r7\n\t"
  19832. "adc r3, r3, #0\n\t"
  19833. #else
  19834. "umull r6, r7, r8, r9\n\t"
  19835. "adds r4, r4, r6\n\t"
  19836. "adcs r5, r5, r7\n\t"
  19837. "adc r3, r3, #0\n\t"
  19838. #endif
  19839. /* A[7] * B[3] */
  19840. "ldr r8, [%[a], #28]\n\t"
  19841. "ldr r9, [%[b], #12]\n\t"
  19842. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19843. "lsl r6, r8, #16\n\t"
  19844. "lsl r7, r9, #16\n\t"
  19845. "lsr r6, r6, #16\n\t"
  19846. "lsr r7, r7, #16\n\t"
  19847. "mul r7, r6, r7\n\t"
  19848. "adds r4, r4, r7\n\t"
  19849. "adcs r5, r5, #0\n\t"
  19850. "adc r3, r3, #0\n\t"
  19851. "lsr r7, r9, #16\n\t"
  19852. "mul r6, r7, r6\n\t"
  19853. "lsr r7, r6, #16\n\t"
  19854. "lsl r6, r6, #16\n\t"
  19855. "adds r4, r4, r6\n\t"
  19856. "adcs r5, r5, r7\n\t"
  19857. "adc r3, r3, #0\n\t"
  19858. "lsr r6, r8, #16\n\t"
  19859. "lsr r7, r9, #16\n\t"
  19860. "mul r7, r6, r7\n\t"
  19861. "adds r5, r5, r7\n\t"
  19862. "adc r3, r3, #0\n\t"
  19863. "lsl r7, r9, #16\n\t"
  19864. "lsr r7, r7, #16\n\t"
  19865. "mul r6, r7, r6\n\t"
  19866. "lsr r7, r6, #16\n\t"
  19867. "lsl r6, r6, #16\n\t"
  19868. "adds r4, r4, r6\n\t"
  19869. "adcs r5, r5, r7\n\t"
  19870. "adc r3, r3, #0\n\t"
  19871. #else
  19872. "umull r6, r7, r8, r9\n\t"
  19873. "adds r4, r4, r6\n\t"
  19874. "adcs r5, r5, r7\n\t"
  19875. "adc r3, r3, #0\n\t"
  19876. #endif
  19877. /* A[6] * B[4] */
  19878. "ldr r8, [%[a], #24]\n\t"
  19879. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19880. "lsl r6, r8, #16\n\t"
  19881. "lsl r7, r12, #16\n\t"
  19882. "lsr r6, r6, #16\n\t"
  19883. "lsr r7, r7, #16\n\t"
  19884. "mul r7, r6, r7\n\t"
  19885. "adds r4, r4, r7\n\t"
  19886. "adcs r5, r5, #0\n\t"
  19887. "adc r3, r3, #0\n\t"
  19888. "lsr r7, r12, #16\n\t"
  19889. "mul r6, r7, r6\n\t"
  19890. "lsr r7, r6, #16\n\t"
  19891. "lsl r6, r6, #16\n\t"
  19892. "adds r4, r4, r6\n\t"
  19893. "adcs r5, r5, r7\n\t"
  19894. "adc r3, r3, #0\n\t"
  19895. "lsr r6, r8, #16\n\t"
  19896. "lsr r7, r12, #16\n\t"
  19897. "mul r7, r6, r7\n\t"
  19898. "adds r5, r5, r7\n\t"
  19899. "adc r3, r3, #0\n\t"
  19900. "lsl r7, r12, #16\n\t"
  19901. "lsr r7, r7, #16\n\t"
  19902. "mul r6, r7, r6\n\t"
  19903. "lsr r7, r6, #16\n\t"
  19904. "lsl r6, r6, #16\n\t"
  19905. "adds r4, r4, r6\n\t"
  19906. "adcs r5, r5, r7\n\t"
  19907. "adc r3, r3, #0\n\t"
  19908. #else
  19909. "umull r6, r7, r8, r12\n\t"
  19910. "adds r4, r4, r6\n\t"
  19911. "adcs r5, r5, r7\n\t"
  19912. "adc r3, r3, #0\n\t"
  19913. #endif
  19914. /* A[5] * B[5] */
  19915. "ldr r11, [%[a], #20]\n\t"
  19916. "ldr r12, [%[b], #20]\n\t"
  19917. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19918. "lsl r6, r11, #16\n\t"
  19919. "lsl r7, r12, #16\n\t"
  19920. "lsr r6, r6, #16\n\t"
  19921. "lsr r7, r7, #16\n\t"
  19922. "mul r7, r6, r7\n\t"
  19923. "adds r4, r4, r7\n\t"
  19924. "adcs r5, r5, #0\n\t"
  19925. "adc r3, r3, #0\n\t"
  19926. "lsr r7, r12, #16\n\t"
  19927. "mul r6, r7, r6\n\t"
  19928. "lsr r7, r6, #16\n\t"
  19929. "lsl r6, r6, #16\n\t"
  19930. "adds r4, r4, r6\n\t"
  19931. "adcs r5, r5, r7\n\t"
  19932. "adc r3, r3, #0\n\t"
  19933. "lsr r6, r11, #16\n\t"
  19934. "lsr r7, r12, #16\n\t"
  19935. "mul r7, r6, r7\n\t"
  19936. "adds r5, r5, r7\n\t"
  19937. "adc r3, r3, #0\n\t"
  19938. "lsl r7, r12, #16\n\t"
  19939. "lsr r7, r7, #16\n\t"
  19940. "mul r6, r7, r6\n\t"
  19941. "lsr r7, r6, #16\n\t"
  19942. "lsl r6, r6, #16\n\t"
  19943. "adds r4, r4, r6\n\t"
  19944. "adcs r5, r5, r7\n\t"
  19945. "adc r3, r3, #0\n\t"
  19946. #else
  19947. "umull r6, r7, r11, r12\n\t"
  19948. "adds r4, r4, r6\n\t"
  19949. "adcs r5, r5, r7\n\t"
  19950. "adc r3, r3, #0\n\t"
  19951. #endif
  19952. /* A[4] * B[6] */
  19953. "ldr r8, [%[a], #16]\n\t"
  19954. "ldr r9, [%[b], #24]\n\t"
  19955. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19956. "lsl r6, r8, #16\n\t"
  19957. "lsl r7, r9, #16\n\t"
  19958. "lsr r6, r6, #16\n\t"
  19959. "lsr r7, r7, #16\n\t"
  19960. "mul r7, r6, r7\n\t"
  19961. "adds r4, r4, r7\n\t"
  19962. "adcs r5, r5, #0\n\t"
  19963. "adc r3, r3, #0\n\t"
  19964. "lsr r7, r9, #16\n\t"
  19965. "mul r6, r7, r6\n\t"
  19966. "lsr r7, r6, #16\n\t"
  19967. "lsl r6, r6, #16\n\t"
  19968. "adds r4, r4, r6\n\t"
  19969. "adcs r5, r5, r7\n\t"
  19970. "adc r3, r3, #0\n\t"
  19971. "lsr r6, r8, #16\n\t"
  19972. "lsr r7, r9, #16\n\t"
  19973. "mul r7, r6, r7\n\t"
  19974. "adds r5, r5, r7\n\t"
  19975. "adc r3, r3, #0\n\t"
  19976. "lsl r7, r9, #16\n\t"
  19977. "lsr r7, r7, #16\n\t"
  19978. "mul r6, r7, r6\n\t"
  19979. "lsr r7, r6, #16\n\t"
  19980. "lsl r6, r6, #16\n\t"
  19981. "adds r4, r4, r6\n\t"
  19982. "adcs r5, r5, r7\n\t"
  19983. "adc r3, r3, #0\n\t"
  19984. #else
  19985. "umull r6, r7, r8, r9\n\t"
  19986. "adds r4, r4, r6\n\t"
  19987. "adcs r5, r5, r7\n\t"
  19988. "adc r3, r3, #0\n\t"
  19989. #endif
  19990. /* A[3] * B[7] */
  19991. "ldr r8, [%[a], #12]\n\t"
  19992. "ldr r9, [%[b], #28]\n\t"
  19993. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  19994. "lsl r6, r8, #16\n\t"
  19995. "lsl r7, r9, #16\n\t"
  19996. "lsr r6, r6, #16\n\t"
  19997. "lsr r7, r7, #16\n\t"
  19998. "mul r7, r6, r7\n\t"
  19999. "adds r4, r4, r7\n\t"
  20000. "adcs r5, r5, #0\n\t"
  20001. "adc r3, r3, #0\n\t"
  20002. "lsr r7, r9, #16\n\t"
  20003. "mul r6, r7, r6\n\t"
  20004. "lsr r7, r6, #16\n\t"
  20005. "lsl r6, r6, #16\n\t"
  20006. "adds r4, r4, r6\n\t"
  20007. "adcs r5, r5, r7\n\t"
  20008. "adc r3, r3, #0\n\t"
  20009. "lsr r6, r8, #16\n\t"
  20010. "lsr r7, r9, #16\n\t"
  20011. "mul r7, r6, r7\n\t"
  20012. "adds r5, r5, r7\n\t"
  20013. "adc r3, r3, #0\n\t"
  20014. "lsl r7, r9, #16\n\t"
  20015. "lsr r7, r7, #16\n\t"
  20016. "mul r6, r7, r6\n\t"
  20017. "lsr r7, r6, #16\n\t"
  20018. "lsl r6, r6, #16\n\t"
  20019. "adds r4, r4, r6\n\t"
  20020. "adcs r5, r5, r7\n\t"
  20021. "adc r3, r3, #0\n\t"
  20022. #else
  20023. "umull r6, r7, r8, r9\n\t"
  20024. "adds r4, r4, r6\n\t"
  20025. "adcs r5, r5, r7\n\t"
  20026. "adc r3, r3, #0\n\t"
  20027. #endif
  20028. /* A[2] * B[8] */
  20029. "ldr r8, [%[a], #8]\n\t"
  20030. "ldr r9, [%[b], #32]\n\t"
  20031. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20032. "lsl r6, r8, #16\n\t"
  20033. "lsl r7, r9, #16\n\t"
  20034. "lsr r6, r6, #16\n\t"
  20035. "lsr r7, r7, #16\n\t"
  20036. "mul r7, r6, r7\n\t"
  20037. "adds r4, r4, r7\n\t"
  20038. "adcs r5, r5, #0\n\t"
  20039. "adc r3, r3, #0\n\t"
  20040. "lsr r7, r9, #16\n\t"
  20041. "mul r6, r7, r6\n\t"
  20042. "lsr r7, r6, #16\n\t"
  20043. "lsl r6, r6, #16\n\t"
  20044. "adds r4, r4, r6\n\t"
  20045. "adcs r5, r5, r7\n\t"
  20046. "adc r3, r3, #0\n\t"
  20047. "lsr r6, r8, #16\n\t"
  20048. "lsr r7, r9, #16\n\t"
  20049. "mul r7, r6, r7\n\t"
  20050. "adds r5, r5, r7\n\t"
  20051. "adc r3, r3, #0\n\t"
  20052. "lsl r7, r9, #16\n\t"
  20053. "lsr r7, r7, #16\n\t"
  20054. "mul r6, r7, r6\n\t"
  20055. "lsr r7, r6, #16\n\t"
  20056. "lsl r6, r6, #16\n\t"
  20057. "adds r4, r4, r6\n\t"
  20058. "adcs r5, r5, r7\n\t"
  20059. "adc r3, r3, #0\n\t"
  20060. #else
  20061. "umull r6, r7, r8, r9\n\t"
  20062. "adds r4, r4, r6\n\t"
  20063. "adcs r5, r5, r7\n\t"
  20064. "adc r3, r3, #0\n\t"
  20065. #endif
  20066. /* A[1] * B[9] */
  20067. "ldr r8, [%[a], #4]\n\t"
  20068. "ldr r9, [%[b], #36]\n\t"
  20069. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20070. "lsl r6, r8, #16\n\t"
  20071. "lsl r7, r9, #16\n\t"
  20072. "lsr r6, r6, #16\n\t"
  20073. "lsr r7, r7, #16\n\t"
  20074. "mul r7, r6, r7\n\t"
  20075. "adds r4, r4, r7\n\t"
  20076. "adcs r5, r5, #0\n\t"
  20077. "adc r3, r3, #0\n\t"
  20078. "lsr r7, r9, #16\n\t"
  20079. "mul r6, r7, r6\n\t"
  20080. "lsr r7, r6, #16\n\t"
  20081. "lsl r6, r6, #16\n\t"
  20082. "adds r4, r4, r6\n\t"
  20083. "adcs r5, r5, r7\n\t"
  20084. "adc r3, r3, #0\n\t"
  20085. "lsr r6, r8, #16\n\t"
  20086. "lsr r7, r9, #16\n\t"
  20087. "mul r7, r6, r7\n\t"
  20088. "adds r5, r5, r7\n\t"
  20089. "adc r3, r3, #0\n\t"
  20090. "lsl r7, r9, #16\n\t"
  20091. "lsr r7, r7, #16\n\t"
  20092. "mul r6, r7, r6\n\t"
  20093. "lsr r7, r6, #16\n\t"
  20094. "lsl r6, r6, #16\n\t"
  20095. "adds r4, r4, r6\n\t"
  20096. "adcs r5, r5, r7\n\t"
  20097. "adc r3, r3, #0\n\t"
  20098. #else
  20099. "umull r6, r7, r8, r9\n\t"
  20100. "adds r4, r4, r6\n\t"
  20101. "adcs r5, r5, r7\n\t"
  20102. "adc r3, r3, #0\n\t"
  20103. #endif
  20104. /* A[0] * B[10] */
  20105. "ldr r8, [%[a]]\n\t"
  20106. "ldr r9, [%[b], #40]\n\t"
  20107. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20108. "lsl r6, r8, #16\n\t"
  20109. "lsl r7, r9, #16\n\t"
  20110. "lsr r6, r6, #16\n\t"
  20111. "lsr r7, r7, #16\n\t"
  20112. "mul r7, r6, r7\n\t"
  20113. "adds r4, r4, r7\n\t"
  20114. "adcs r5, r5, #0\n\t"
  20115. "adc r3, r3, #0\n\t"
  20116. "lsr r7, r9, #16\n\t"
  20117. "mul r6, r7, r6\n\t"
  20118. "lsr r7, r6, #16\n\t"
  20119. "lsl r6, r6, #16\n\t"
  20120. "adds r4, r4, r6\n\t"
  20121. "adcs r5, r5, r7\n\t"
  20122. "adc r3, r3, #0\n\t"
  20123. "lsr r6, r8, #16\n\t"
  20124. "lsr r7, r9, #16\n\t"
  20125. "mul r7, r6, r7\n\t"
  20126. "adds r5, r5, r7\n\t"
  20127. "adc r3, r3, #0\n\t"
  20128. "lsl r7, r9, #16\n\t"
  20129. "lsr r7, r7, #16\n\t"
  20130. "mul r6, r7, r6\n\t"
  20131. "lsr r7, r6, #16\n\t"
  20132. "lsl r6, r6, #16\n\t"
  20133. "adds r4, r4, r6\n\t"
  20134. "adcs r5, r5, r7\n\t"
  20135. "adc r3, r3, #0\n\t"
  20136. #else
  20137. "umull r6, r7, r8, r9\n\t"
  20138. "adds r4, r4, r6\n\t"
  20139. "adcs r5, r5, r7\n\t"
  20140. "adc r3, r3, #0\n\t"
  20141. #endif
  20142. "str r4, [sp, #40]\n\t"
  20143. /* A[0] * B[11] */
  20144. "ldr r9, [%[b], #44]\n\t"
  20145. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20146. "lsl r6, r8, #16\n\t"
  20147. "lsl r7, r9, #16\n\t"
  20148. "lsr r6, r6, #16\n\t"
  20149. "lsr r7, r7, #16\n\t"
  20150. "mul r7, r6, r7\n\t"
  20151. "adds r5, r5, r7\n\t"
  20152. "adcs r3, r3, #0\n\t"
  20153. "mov r4, #0\n\t"
  20154. "adc r4, r4, #0\n\t"
  20155. "lsr r7, r9, #16\n\t"
  20156. "mul r6, r7, r6\n\t"
  20157. "lsr r7, r6, #16\n\t"
  20158. "lsl r6, r6, #16\n\t"
  20159. "adds r5, r5, r6\n\t"
  20160. "adcs r3, r3, r7\n\t"
  20161. "adc r4, r4, #0\n\t"
  20162. "lsr r6, r8, #16\n\t"
  20163. "lsr r7, r9, #16\n\t"
  20164. "mul r7, r6, r7\n\t"
  20165. "adds r3, r3, r7\n\t"
  20166. "adc r4, r4, #0\n\t"
  20167. "lsl r7, r9, #16\n\t"
  20168. "lsr r7, r7, #16\n\t"
  20169. "mul r6, r7, r6\n\t"
  20170. "lsr r7, r6, #16\n\t"
  20171. "lsl r6, r6, #16\n\t"
  20172. "adds r5, r5, r6\n\t"
  20173. "adcs r3, r3, r7\n\t"
  20174. "adc r4, r4, #0\n\t"
  20175. #else
  20176. "umull r6, r7, r8, r9\n\t"
  20177. "adds r5, r5, r6\n\t"
  20178. "adcs r3, r3, r7\n\t"
  20179. "mov r4, #0\n\t"
  20180. "adc r4, r4, #0\n\t"
  20181. #endif
  20182. /* A[1] * B[10] */
  20183. "ldr r8, [%[a], #4]\n\t"
  20184. "ldr r9, [%[b], #40]\n\t"
  20185. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20186. "lsl r6, r8, #16\n\t"
  20187. "lsl r7, r9, #16\n\t"
  20188. "lsr r6, r6, #16\n\t"
  20189. "lsr r7, r7, #16\n\t"
  20190. "mul r7, r6, r7\n\t"
  20191. "adds r5, r5, r7\n\t"
  20192. "adcs r3, r3, #0\n\t"
  20193. "adc r4, r4, #0\n\t"
  20194. "lsr r7, r9, #16\n\t"
  20195. "mul r6, r7, r6\n\t"
  20196. "lsr r7, r6, #16\n\t"
  20197. "lsl r6, r6, #16\n\t"
  20198. "adds r5, r5, r6\n\t"
  20199. "adcs r3, r3, r7\n\t"
  20200. "adc r4, r4, #0\n\t"
  20201. "lsr r6, r8, #16\n\t"
  20202. "lsr r7, r9, #16\n\t"
  20203. "mul r7, r6, r7\n\t"
  20204. "adds r3, r3, r7\n\t"
  20205. "adc r4, r4, #0\n\t"
  20206. "lsl r7, r9, #16\n\t"
  20207. "lsr r7, r7, #16\n\t"
  20208. "mul r6, r7, r6\n\t"
  20209. "lsr r7, r6, #16\n\t"
  20210. "lsl r6, r6, #16\n\t"
  20211. "adds r5, r5, r6\n\t"
  20212. "adcs r3, r3, r7\n\t"
  20213. "adc r4, r4, #0\n\t"
  20214. #else
  20215. "umull r6, r7, r8, r9\n\t"
  20216. "adds r5, r5, r6\n\t"
  20217. "adcs r3, r3, r7\n\t"
  20218. "adc r4, r4, #0\n\t"
  20219. #endif
  20220. /* A[2] * B[9] */
  20221. "ldr r8, [%[a], #8]\n\t"
  20222. "ldr r9, [%[b], #36]\n\t"
  20223. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20224. "lsl r6, r8, #16\n\t"
  20225. "lsl r7, r9, #16\n\t"
  20226. "lsr r6, r6, #16\n\t"
  20227. "lsr r7, r7, #16\n\t"
  20228. "mul r7, r6, r7\n\t"
  20229. "adds r5, r5, r7\n\t"
  20230. "adcs r3, r3, #0\n\t"
  20231. "adc r4, r4, #0\n\t"
  20232. "lsr r7, r9, #16\n\t"
  20233. "mul r6, r7, r6\n\t"
  20234. "lsr r7, r6, #16\n\t"
  20235. "lsl r6, r6, #16\n\t"
  20236. "adds r5, r5, r6\n\t"
  20237. "adcs r3, r3, r7\n\t"
  20238. "adc r4, r4, #0\n\t"
  20239. "lsr r6, r8, #16\n\t"
  20240. "lsr r7, r9, #16\n\t"
  20241. "mul r7, r6, r7\n\t"
  20242. "adds r3, r3, r7\n\t"
  20243. "adc r4, r4, #0\n\t"
  20244. "lsl r7, r9, #16\n\t"
  20245. "lsr r7, r7, #16\n\t"
  20246. "mul r6, r7, r6\n\t"
  20247. "lsr r7, r6, #16\n\t"
  20248. "lsl r6, r6, #16\n\t"
  20249. "adds r5, r5, r6\n\t"
  20250. "adcs r3, r3, r7\n\t"
  20251. "adc r4, r4, #0\n\t"
  20252. #else
  20253. "umull r6, r7, r8, r9\n\t"
  20254. "adds r5, r5, r6\n\t"
  20255. "adcs r3, r3, r7\n\t"
  20256. "adc r4, r4, #0\n\t"
  20257. #endif
  20258. /* A[3] * B[8] */
  20259. "ldr r8, [%[a], #12]\n\t"
  20260. "ldr r9, [%[b], #32]\n\t"
  20261. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20262. "lsl r6, r8, #16\n\t"
  20263. "lsl r7, r9, #16\n\t"
  20264. "lsr r6, r6, #16\n\t"
  20265. "lsr r7, r7, #16\n\t"
  20266. "mul r7, r6, r7\n\t"
  20267. "adds r5, r5, r7\n\t"
  20268. "adcs r3, r3, #0\n\t"
  20269. "adc r4, r4, #0\n\t"
  20270. "lsr r7, r9, #16\n\t"
  20271. "mul r6, r7, r6\n\t"
  20272. "lsr r7, r6, #16\n\t"
  20273. "lsl r6, r6, #16\n\t"
  20274. "adds r5, r5, r6\n\t"
  20275. "adcs r3, r3, r7\n\t"
  20276. "adc r4, r4, #0\n\t"
  20277. "lsr r6, r8, #16\n\t"
  20278. "lsr r7, r9, #16\n\t"
  20279. "mul r7, r6, r7\n\t"
  20280. "adds r3, r3, r7\n\t"
  20281. "adc r4, r4, #0\n\t"
  20282. "lsl r7, r9, #16\n\t"
  20283. "lsr r7, r7, #16\n\t"
  20284. "mul r6, r7, r6\n\t"
  20285. "lsr r7, r6, #16\n\t"
  20286. "lsl r6, r6, #16\n\t"
  20287. "adds r5, r5, r6\n\t"
  20288. "adcs r3, r3, r7\n\t"
  20289. "adc r4, r4, #0\n\t"
  20290. #else
  20291. "umull r6, r7, r8, r9\n\t"
  20292. "adds r5, r5, r6\n\t"
  20293. "adcs r3, r3, r7\n\t"
  20294. "adc r4, r4, #0\n\t"
  20295. #endif
  20296. /* A[4] * B[7] */
  20297. "ldr r8, [%[a], #16]\n\t"
  20298. "ldr r9, [%[b], #28]\n\t"
  20299. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20300. "lsl r6, r8, #16\n\t"
  20301. "lsl r7, r9, #16\n\t"
  20302. "lsr r6, r6, #16\n\t"
  20303. "lsr r7, r7, #16\n\t"
  20304. "mul r7, r6, r7\n\t"
  20305. "adds r5, r5, r7\n\t"
  20306. "adcs r3, r3, #0\n\t"
  20307. "adc r4, r4, #0\n\t"
  20308. "lsr r7, r9, #16\n\t"
  20309. "mul r6, r7, r6\n\t"
  20310. "lsr r7, r6, #16\n\t"
  20311. "lsl r6, r6, #16\n\t"
  20312. "adds r5, r5, r6\n\t"
  20313. "adcs r3, r3, r7\n\t"
  20314. "adc r4, r4, #0\n\t"
  20315. "lsr r6, r8, #16\n\t"
  20316. "lsr r7, r9, #16\n\t"
  20317. "mul r7, r6, r7\n\t"
  20318. "adds r3, r3, r7\n\t"
  20319. "adc r4, r4, #0\n\t"
  20320. "lsl r7, r9, #16\n\t"
  20321. "lsr r7, r7, #16\n\t"
  20322. "mul r6, r7, r6\n\t"
  20323. "lsr r7, r6, #16\n\t"
  20324. "lsl r6, r6, #16\n\t"
  20325. "adds r5, r5, r6\n\t"
  20326. "adcs r3, r3, r7\n\t"
  20327. "adc r4, r4, #0\n\t"
  20328. #else
  20329. "umull r6, r7, r8, r9\n\t"
  20330. "adds r5, r5, r6\n\t"
  20331. "adcs r3, r3, r7\n\t"
  20332. "adc r4, r4, #0\n\t"
  20333. #endif
  20334. /* A[5] * B[6] */
  20335. "ldr r9, [%[b], #24]\n\t"
  20336. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20337. "lsl r6, r11, #16\n\t"
  20338. "lsl r7, r9, #16\n\t"
  20339. "lsr r6, r6, #16\n\t"
  20340. "lsr r7, r7, #16\n\t"
  20341. "mul r7, r6, r7\n\t"
  20342. "adds r5, r5, r7\n\t"
  20343. "adcs r3, r3, #0\n\t"
  20344. "adc r4, r4, #0\n\t"
  20345. "lsr r7, r9, #16\n\t"
  20346. "mul r6, r7, r6\n\t"
  20347. "lsr r7, r6, #16\n\t"
  20348. "lsl r6, r6, #16\n\t"
  20349. "adds r5, r5, r6\n\t"
  20350. "adcs r3, r3, r7\n\t"
  20351. "adc r4, r4, #0\n\t"
  20352. "lsr r6, r11, #16\n\t"
  20353. "lsr r7, r9, #16\n\t"
  20354. "mul r7, r6, r7\n\t"
  20355. "adds r3, r3, r7\n\t"
  20356. "adc r4, r4, #0\n\t"
  20357. "lsl r7, r9, #16\n\t"
  20358. "lsr r7, r7, #16\n\t"
  20359. "mul r6, r7, r6\n\t"
  20360. "lsr r7, r6, #16\n\t"
  20361. "lsl r6, r6, #16\n\t"
  20362. "adds r5, r5, r6\n\t"
  20363. "adcs r3, r3, r7\n\t"
  20364. "adc r4, r4, #0\n\t"
  20365. #else
  20366. "umull r6, r7, r11, r9\n\t"
  20367. "adds r5, r5, r6\n\t"
  20368. "adcs r3, r3, r7\n\t"
  20369. "adc r4, r4, #0\n\t"
  20370. #endif
  20371. /* A[6] * B[5] */
  20372. "ldr r8, [%[a], #24]\n\t"
  20373. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20374. "lsl r6, r8, #16\n\t"
  20375. "lsl r7, r12, #16\n\t"
  20376. "lsr r6, r6, #16\n\t"
  20377. "lsr r7, r7, #16\n\t"
  20378. "mul r7, r6, r7\n\t"
  20379. "adds r5, r5, r7\n\t"
  20380. "adcs r3, r3, #0\n\t"
  20381. "adc r4, r4, #0\n\t"
  20382. "lsr r7, r12, #16\n\t"
  20383. "mul r6, r7, r6\n\t"
  20384. "lsr r7, r6, #16\n\t"
  20385. "lsl r6, r6, #16\n\t"
  20386. "adds r5, r5, r6\n\t"
  20387. "adcs r3, r3, r7\n\t"
  20388. "adc r4, r4, #0\n\t"
  20389. "lsr r6, r8, #16\n\t"
  20390. "lsr r7, r12, #16\n\t"
  20391. "mul r7, r6, r7\n\t"
  20392. "adds r3, r3, r7\n\t"
  20393. "adc r4, r4, #0\n\t"
  20394. "lsl r7, r12, #16\n\t"
  20395. "lsr r7, r7, #16\n\t"
  20396. "mul r6, r7, r6\n\t"
  20397. "lsr r7, r6, #16\n\t"
  20398. "lsl r6, r6, #16\n\t"
  20399. "adds r5, r5, r6\n\t"
  20400. "adcs r3, r3, r7\n\t"
  20401. "adc r4, r4, #0\n\t"
  20402. #else
  20403. "umull r6, r7, r8, r12\n\t"
  20404. "adds r5, r5, r6\n\t"
  20405. "adcs r3, r3, r7\n\t"
  20406. "adc r4, r4, #0\n\t"
  20407. #endif
  20408. /* A[7] * B[4] */
  20409. "ldr r8, [%[a], #28]\n\t"
  20410. "ldr r9, [%[b], #16]\n\t"
  20411. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20412. "lsl r6, r8, #16\n\t"
  20413. "lsl r7, r9, #16\n\t"
  20414. "lsr r6, r6, #16\n\t"
  20415. "lsr r7, r7, #16\n\t"
  20416. "mul r7, r6, r7\n\t"
  20417. "adds r5, r5, r7\n\t"
  20418. "adcs r3, r3, #0\n\t"
  20419. "adc r4, r4, #0\n\t"
  20420. "lsr r7, r9, #16\n\t"
  20421. "mul r6, r7, r6\n\t"
  20422. "lsr r7, r6, #16\n\t"
  20423. "lsl r6, r6, #16\n\t"
  20424. "adds r5, r5, r6\n\t"
  20425. "adcs r3, r3, r7\n\t"
  20426. "adc r4, r4, #0\n\t"
  20427. "lsr r6, r8, #16\n\t"
  20428. "lsr r7, r9, #16\n\t"
  20429. "mul r7, r6, r7\n\t"
  20430. "adds r3, r3, r7\n\t"
  20431. "adc r4, r4, #0\n\t"
  20432. "lsl r7, r9, #16\n\t"
  20433. "lsr r7, r7, #16\n\t"
  20434. "mul r6, r7, r6\n\t"
  20435. "lsr r7, r6, #16\n\t"
  20436. "lsl r6, r6, #16\n\t"
  20437. "adds r5, r5, r6\n\t"
  20438. "adcs r3, r3, r7\n\t"
  20439. "adc r4, r4, #0\n\t"
  20440. #else
  20441. "umull r6, r7, r8, r9\n\t"
  20442. "adds r5, r5, r6\n\t"
  20443. "adcs r3, r3, r7\n\t"
  20444. "adc r4, r4, #0\n\t"
  20445. #endif
  20446. /* A[8] * B[3] */
  20447. "ldr r8, [%[a], #32]\n\t"
  20448. "ldr r9, [%[b], #12]\n\t"
  20449. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20450. "lsl r6, r8, #16\n\t"
  20451. "lsl r7, r9, #16\n\t"
  20452. "lsr r6, r6, #16\n\t"
  20453. "lsr r7, r7, #16\n\t"
  20454. "mul r7, r6, r7\n\t"
  20455. "adds r5, r5, r7\n\t"
  20456. "adcs r3, r3, #0\n\t"
  20457. "adc r4, r4, #0\n\t"
  20458. "lsr r7, r9, #16\n\t"
  20459. "mul r6, r7, r6\n\t"
  20460. "lsr r7, r6, #16\n\t"
  20461. "lsl r6, r6, #16\n\t"
  20462. "adds r5, r5, r6\n\t"
  20463. "adcs r3, r3, r7\n\t"
  20464. "adc r4, r4, #0\n\t"
  20465. "lsr r6, r8, #16\n\t"
  20466. "lsr r7, r9, #16\n\t"
  20467. "mul r7, r6, r7\n\t"
  20468. "adds r3, r3, r7\n\t"
  20469. "adc r4, r4, #0\n\t"
  20470. "lsl r7, r9, #16\n\t"
  20471. "lsr r7, r7, #16\n\t"
  20472. "mul r6, r7, r6\n\t"
  20473. "lsr r7, r6, #16\n\t"
  20474. "lsl r6, r6, #16\n\t"
  20475. "adds r5, r5, r6\n\t"
  20476. "adcs r3, r3, r7\n\t"
  20477. "adc r4, r4, #0\n\t"
  20478. #else
  20479. "umull r6, r7, r8, r9\n\t"
  20480. "adds r5, r5, r6\n\t"
  20481. "adcs r3, r3, r7\n\t"
  20482. "adc r4, r4, #0\n\t"
  20483. #endif
  20484. /* A[9] * B[2] */
  20485. "ldr r8, [%[a], #36]\n\t"
  20486. "ldr r9, [%[b], #8]\n\t"
  20487. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20488. "lsl r6, r8, #16\n\t"
  20489. "lsl r7, r9, #16\n\t"
  20490. "lsr r6, r6, #16\n\t"
  20491. "lsr r7, r7, #16\n\t"
  20492. "mul r7, r6, r7\n\t"
  20493. "adds r5, r5, r7\n\t"
  20494. "adcs r3, r3, #0\n\t"
  20495. "adc r4, r4, #0\n\t"
  20496. "lsr r7, r9, #16\n\t"
  20497. "mul r6, r7, r6\n\t"
  20498. "lsr r7, r6, #16\n\t"
  20499. "lsl r6, r6, #16\n\t"
  20500. "adds r5, r5, r6\n\t"
  20501. "adcs r3, r3, r7\n\t"
  20502. "adc r4, r4, #0\n\t"
  20503. "lsr r6, r8, #16\n\t"
  20504. "lsr r7, r9, #16\n\t"
  20505. "mul r7, r6, r7\n\t"
  20506. "adds r3, r3, r7\n\t"
  20507. "adc r4, r4, #0\n\t"
  20508. "lsl r7, r9, #16\n\t"
  20509. "lsr r7, r7, #16\n\t"
  20510. "mul r6, r7, r6\n\t"
  20511. "lsr r7, r6, #16\n\t"
  20512. "lsl r6, r6, #16\n\t"
  20513. "adds r5, r5, r6\n\t"
  20514. "adcs r3, r3, r7\n\t"
  20515. "adc r4, r4, #0\n\t"
  20516. #else
  20517. "umull r6, r7, r8, r9\n\t"
  20518. "adds r5, r5, r6\n\t"
  20519. "adcs r3, r3, r7\n\t"
  20520. "adc r4, r4, #0\n\t"
  20521. #endif
  20522. /* A[10] * B[1] */
  20523. "ldr r8, [%[a], #40]\n\t"
  20524. "ldr r9, [%[b], #4]\n\t"
  20525. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20526. "lsl r6, r8, #16\n\t"
  20527. "lsl r7, r9, #16\n\t"
  20528. "lsr r6, r6, #16\n\t"
  20529. "lsr r7, r7, #16\n\t"
  20530. "mul r7, r6, r7\n\t"
  20531. "adds r5, r5, r7\n\t"
  20532. "adcs r3, r3, #0\n\t"
  20533. "adc r4, r4, #0\n\t"
  20534. "lsr r7, r9, #16\n\t"
  20535. "mul r6, r7, r6\n\t"
  20536. "lsr r7, r6, #16\n\t"
  20537. "lsl r6, r6, #16\n\t"
  20538. "adds r5, r5, r6\n\t"
  20539. "adcs r3, r3, r7\n\t"
  20540. "adc r4, r4, #0\n\t"
  20541. "lsr r6, r8, #16\n\t"
  20542. "lsr r7, r9, #16\n\t"
  20543. "mul r7, r6, r7\n\t"
  20544. "adds r3, r3, r7\n\t"
  20545. "adc r4, r4, #0\n\t"
  20546. "lsl r7, r9, #16\n\t"
  20547. "lsr r7, r7, #16\n\t"
  20548. "mul r6, r7, r6\n\t"
  20549. "lsr r7, r6, #16\n\t"
  20550. "lsl r6, r6, #16\n\t"
  20551. "adds r5, r5, r6\n\t"
  20552. "adcs r3, r3, r7\n\t"
  20553. "adc r4, r4, #0\n\t"
  20554. #else
  20555. "umull r6, r7, r8, r9\n\t"
  20556. "adds r5, r5, r6\n\t"
  20557. "adcs r3, r3, r7\n\t"
  20558. "adc r4, r4, #0\n\t"
  20559. #endif
  20560. /* A[11] * B[0] */
  20561. "ldr r8, [%[a], #44]\n\t"
  20562. "ldr r9, [%[b]]\n\t"
  20563. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20564. "lsl r6, r8, #16\n\t"
  20565. "lsl r7, r9, #16\n\t"
  20566. "lsr r6, r6, #16\n\t"
  20567. "lsr r7, r7, #16\n\t"
  20568. "mul r7, r6, r7\n\t"
  20569. "adds r5, r5, r7\n\t"
  20570. "adcs r3, r3, #0\n\t"
  20571. "adc r4, r4, #0\n\t"
  20572. "lsr r7, r9, #16\n\t"
  20573. "mul r6, r7, r6\n\t"
  20574. "lsr r7, r6, #16\n\t"
  20575. "lsl r6, r6, #16\n\t"
  20576. "adds r5, r5, r6\n\t"
  20577. "adcs r3, r3, r7\n\t"
  20578. "adc r4, r4, #0\n\t"
  20579. "lsr r6, r8, #16\n\t"
  20580. "lsr r7, r9, #16\n\t"
  20581. "mul r7, r6, r7\n\t"
  20582. "adds r3, r3, r7\n\t"
  20583. "adc r4, r4, #0\n\t"
  20584. "lsl r7, r9, #16\n\t"
  20585. "lsr r7, r7, #16\n\t"
  20586. "mul r6, r7, r6\n\t"
  20587. "lsr r7, r6, #16\n\t"
  20588. "lsl r6, r6, #16\n\t"
  20589. "adds r5, r5, r6\n\t"
  20590. "adcs r3, r3, r7\n\t"
  20591. "adc r4, r4, #0\n\t"
  20592. #else
  20593. "umull r6, r7, r8, r9\n\t"
  20594. "adds r5, r5, r6\n\t"
  20595. "adcs r3, r3, r7\n\t"
  20596. "adc r4, r4, #0\n\t"
  20597. #endif
  20598. "str r5, [sp, #44]\n\t"
  20599. /* A[11] * B[1] */
  20600. "ldr r9, [%[b], #4]\n\t"
  20601. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20602. "lsl r6, r8, #16\n\t"
  20603. "lsl r7, r9, #16\n\t"
  20604. "lsr r6, r6, #16\n\t"
  20605. "lsr r7, r7, #16\n\t"
  20606. "mul r7, r6, r7\n\t"
  20607. "adds r3, r3, r7\n\t"
  20608. "adcs r4, r4, #0\n\t"
  20609. "mov r5, #0\n\t"
  20610. "adc r5, r5, #0\n\t"
  20611. "lsr r7, r9, #16\n\t"
  20612. "mul r6, r7, r6\n\t"
  20613. "lsr r7, r6, #16\n\t"
  20614. "lsl r6, r6, #16\n\t"
  20615. "adds r3, r3, r6\n\t"
  20616. "adcs r4, r4, r7\n\t"
  20617. "adc r5, r5, #0\n\t"
  20618. "lsr r6, r8, #16\n\t"
  20619. "lsr r7, r9, #16\n\t"
  20620. "mul r7, r6, r7\n\t"
  20621. "adds r4, r4, r7\n\t"
  20622. "adc r5, r5, #0\n\t"
  20623. "lsl r7, r9, #16\n\t"
  20624. "lsr r7, r7, #16\n\t"
  20625. "mul r6, r7, r6\n\t"
  20626. "lsr r7, r6, #16\n\t"
  20627. "lsl r6, r6, #16\n\t"
  20628. "adds r3, r3, r6\n\t"
  20629. "adcs r4, r4, r7\n\t"
  20630. "adc r5, r5, #0\n\t"
  20631. #else
  20632. "umull r6, r7, r8, r9\n\t"
  20633. "adds r3, r3, r6\n\t"
  20634. "adcs r4, r4, r7\n\t"
  20635. "mov r5, #0\n\t"
  20636. "adc r5, r5, #0\n\t"
  20637. #endif
  20638. /* A[10] * B[2] */
  20639. "ldr r8, [%[a], #40]\n\t"
  20640. "ldr r9, [%[b], #8]\n\t"
  20641. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20642. "lsl r6, r8, #16\n\t"
  20643. "lsl r7, r9, #16\n\t"
  20644. "lsr r6, r6, #16\n\t"
  20645. "lsr r7, r7, #16\n\t"
  20646. "mul r7, r6, r7\n\t"
  20647. "adds r3, r3, r7\n\t"
  20648. "adcs r4, r4, #0\n\t"
  20649. "adc r5, r5, #0\n\t"
  20650. "lsr r7, r9, #16\n\t"
  20651. "mul r6, r7, r6\n\t"
  20652. "lsr r7, r6, #16\n\t"
  20653. "lsl r6, r6, #16\n\t"
  20654. "adds r3, r3, r6\n\t"
  20655. "adcs r4, r4, r7\n\t"
  20656. "adc r5, r5, #0\n\t"
  20657. "lsr r6, r8, #16\n\t"
  20658. "lsr r7, r9, #16\n\t"
  20659. "mul r7, r6, r7\n\t"
  20660. "adds r4, r4, r7\n\t"
  20661. "adc r5, r5, #0\n\t"
  20662. "lsl r7, r9, #16\n\t"
  20663. "lsr r7, r7, #16\n\t"
  20664. "mul r6, r7, r6\n\t"
  20665. "lsr r7, r6, #16\n\t"
  20666. "lsl r6, r6, #16\n\t"
  20667. "adds r3, r3, r6\n\t"
  20668. "adcs r4, r4, r7\n\t"
  20669. "adc r5, r5, #0\n\t"
  20670. #else
  20671. "umull r6, r7, r8, r9\n\t"
  20672. "adds r3, r3, r6\n\t"
  20673. "adcs r4, r4, r7\n\t"
  20674. "adc r5, r5, #0\n\t"
  20675. #endif
  20676. /* A[9] * B[3] */
  20677. "ldr r8, [%[a], #36]\n\t"
  20678. "ldr r9, [%[b], #12]\n\t"
  20679. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20680. "lsl r6, r8, #16\n\t"
  20681. "lsl r7, r9, #16\n\t"
  20682. "lsr r6, r6, #16\n\t"
  20683. "lsr r7, r7, #16\n\t"
  20684. "mul r7, r6, r7\n\t"
  20685. "adds r3, r3, r7\n\t"
  20686. "adcs r4, r4, #0\n\t"
  20687. "adc r5, r5, #0\n\t"
  20688. "lsr r7, r9, #16\n\t"
  20689. "mul r6, r7, r6\n\t"
  20690. "lsr r7, r6, #16\n\t"
  20691. "lsl r6, r6, #16\n\t"
  20692. "adds r3, r3, r6\n\t"
  20693. "adcs r4, r4, r7\n\t"
  20694. "adc r5, r5, #0\n\t"
  20695. "lsr r6, r8, #16\n\t"
  20696. "lsr r7, r9, #16\n\t"
  20697. "mul r7, r6, r7\n\t"
  20698. "adds r4, r4, r7\n\t"
  20699. "adc r5, r5, #0\n\t"
  20700. "lsl r7, r9, #16\n\t"
  20701. "lsr r7, r7, #16\n\t"
  20702. "mul r6, r7, r6\n\t"
  20703. "lsr r7, r6, #16\n\t"
  20704. "lsl r6, r6, #16\n\t"
  20705. "adds r3, r3, r6\n\t"
  20706. "adcs r4, r4, r7\n\t"
  20707. "adc r5, r5, #0\n\t"
  20708. #else
  20709. "umull r6, r7, r8, r9\n\t"
  20710. "adds r3, r3, r6\n\t"
  20711. "adcs r4, r4, r7\n\t"
  20712. "adc r5, r5, #0\n\t"
  20713. #endif
  20714. /* A[8] * B[4] */
  20715. "ldr r8, [%[a], #32]\n\t"
  20716. "ldr r9, [%[b], #16]\n\t"
  20717. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20718. "lsl r6, r8, #16\n\t"
  20719. "lsl r7, r9, #16\n\t"
  20720. "lsr r6, r6, #16\n\t"
  20721. "lsr r7, r7, #16\n\t"
  20722. "mul r7, r6, r7\n\t"
  20723. "adds r3, r3, r7\n\t"
  20724. "adcs r4, r4, #0\n\t"
  20725. "adc r5, r5, #0\n\t"
  20726. "lsr r7, r9, #16\n\t"
  20727. "mul r6, r7, r6\n\t"
  20728. "lsr r7, r6, #16\n\t"
  20729. "lsl r6, r6, #16\n\t"
  20730. "adds r3, r3, r6\n\t"
  20731. "adcs r4, r4, r7\n\t"
  20732. "adc r5, r5, #0\n\t"
  20733. "lsr r6, r8, #16\n\t"
  20734. "lsr r7, r9, #16\n\t"
  20735. "mul r7, r6, r7\n\t"
  20736. "adds r4, r4, r7\n\t"
  20737. "adc r5, r5, #0\n\t"
  20738. "lsl r7, r9, #16\n\t"
  20739. "lsr r7, r7, #16\n\t"
  20740. "mul r6, r7, r6\n\t"
  20741. "lsr r7, r6, #16\n\t"
  20742. "lsl r6, r6, #16\n\t"
  20743. "adds r3, r3, r6\n\t"
  20744. "adcs r4, r4, r7\n\t"
  20745. "adc r5, r5, #0\n\t"
  20746. #else
  20747. "umull r6, r7, r8, r9\n\t"
  20748. "adds r3, r3, r6\n\t"
  20749. "adcs r4, r4, r7\n\t"
  20750. "adc r5, r5, #0\n\t"
  20751. #endif
  20752. /* A[7] * B[5] */
  20753. "ldr r8, [%[a], #28]\n\t"
  20754. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20755. "lsl r6, r8, #16\n\t"
  20756. "lsl r7, r12, #16\n\t"
  20757. "lsr r6, r6, #16\n\t"
  20758. "lsr r7, r7, #16\n\t"
  20759. "mul r7, r6, r7\n\t"
  20760. "adds r3, r3, r7\n\t"
  20761. "adcs r4, r4, #0\n\t"
  20762. "adc r5, r5, #0\n\t"
  20763. "lsr r7, r12, #16\n\t"
  20764. "mul r6, r7, r6\n\t"
  20765. "lsr r7, r6, #16\n\t"
  20766. "lsl r6, r6, #16\n\t"
  20767. "adds r3, r3, r6\n\t"
  20768. "adcs r4, r4, r7\n\t"
  20769. "adc r5, r5, #0\n\t"
  20770. "lsr r6, r8, #16\n\t"
  20771. "lsr r7, r12, #16\n\t"
  20772. "mul r7, r6, r7\n\t"
  20773. "adds r4, r4, r7\n\t"
  20774. "adc r5, r5, #0\n\t"
  20775. "lsl r7, r12, #16\n\t"
  20776. "lsr r7, r7, #16\n\t"
  20777. "mul r6, r7, r6\n\t"
  20778. "lsr r7, r6, #16\n\t"
  20779. "lsl r6, r6, #16\n\t"
  20780. "adds r3, r3, r6\n\t"
  20781. "adcs r4, r4, r7\n\t"
  20782. "adc r5, r5, #0\n\t"
  20783. #else
  20784. "umull r6, r7, r8, r12\n\t"
  20785. "adds r3, r3, r6\n\t"
  20786. "adcs r4, r4, r7\n\t"
  20787. "adc r5, r5, #0\n\t"
  20788. #endif
  20789. /* A[6] * B[6] */
  20790. "ldr r11, [%[a], #24]\n\t"
  20791. "ldr r12, [%[b], #24]\n\t"
  20792. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20793. "lsl r6, r11, #16\n\t"
  20794. "lsl r7, r12, #16\n\t"
  20795. "lsr r6, r6, #16\n\t"
  20796. "lsr r7, r7, #16\n\t"
  20797. "mul r7, r6, r7\n\t"
  20798. "adds r3, r3, r7\n\t"
  20799. "adcs r4, r4, #0\n\t"
  20800. "adc r5, r5, #0\n\t"
  20801. "lsr r7, r12, #16\n\t"
  20802. "mul r6, r7, r6\n\t"
  20803. "lsr r7, r6, #16\n\t"
  20804. "lsl r6, r6, #16\n\t"
  20805. "adds r3, r3, r6\n\t"
  20806. "adcs r4, r4, r7\n\t"
  20807. "adc r5, r5, #0\n\t"
  20808. "lsr r6, r11, #16\n\t"
  20809. "lsr r7, r12, #16\n\t"
  20810. "mul r7, r6, r7\n\t"
  20811. "adds r4, r4, r7\n\t"
  20812. "adc r5, r5, #0\n\t"
  20813. "lsl r7, r12, #16\n\t"
  20814. "lsr r7, r7, #16\n\t"
  20815. "mul r6, r7, r6\n\t"
  20816. "lsr r7, r6, #16\n\t"
  20817. "lsl r6, r6, #16\n\t"
  20818. "adds r3, r3, r6\n\t"
  20819. "adcs r4, r4, r7\n\t"
  20820. "adc r5, r5, #0\n\t"
  20821. #else
  20822. "umull r6, r7, r11, r12\n\t"
  20823. "adds r3, r3, r6\n\t"
  20824. "adcs r4, r4, r7\n\t"
  20825. "adc r5, r5, #0\n\t"
  20826. #endif
  20827. /* A[5] * B[7] */
  20828. "ldr r8, [%[a], #20]\n\t"
  20829. "ldr r9, [%[b], #28]\n\t"
  20830. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20831. "lsl r6, r8, #16\n\t"
  20832. "lsl r7, r9, #16\n\t"
  20833. "lsr r6, r6, #16\n\t"
  20834. "lsr r7, r7, #16\n\t"
  20835. "mul r7, r6, r7\n\t"
  20836. "adds r3, r3, r7\n\t"
  20837. "adcs r4, r4, #0\n\t"
  20838. "adc r5, r5, #0\n\t"
  20839. "lsr r7, r9, #16\n\t"
  20840. "mul r6, r7, r6\n\t"
  20841. "lsr r7, r6, #16\n\t"
  20842. "lsl r6, r6, #16\n\t"
  20843. "adds r3, r3, r6\n\t"
  20844. "adcs r4, r4, r7\n\t"
  20845. "adc r5, r5, #0\n\t"
  20846. "lsr r6, r8, #16\n\t"
  20847. "lsr r7, r9, #16\n\t"
  20848. "mul r7, r6, r7\n\t"
  20849. "adds r4, r4, r7\n\t"
  20850. "adc r5, r5, #0\n\t"
  20851. "lsl r7, r9, #16\n\t"
  20852. "lsr r7, r7, #16\n\t"
  20853. "mul r6, r7, r6\n\t"
  20854. "lsr r7, r6, #16\n\t"
  20855. "lsl r6, r6, #16\n\t"
  20856. "adds r3, r3, r6\n\t"
  20857. "adcs r4, r4, r7\n\t"
  20858. "adc r5, r5, #0\n\t"
  20859. #else
  20860. "umull r6, r7, r8, r9\n\t"
  20861. "adds r3, r3, r6\n\t"
  20862. "adcs r4, r4, r7\n\t"
  20863. "adc r5, r5, #0\n\t"
  20864. #endif
  20865. /* A[4] * B[8] */
  20866. "ldr r8, [%[a], #16]\n\t"
  20867. "ldr r9, [%[b], #32]\n\t"
  20868. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20869. "lsl r6, r8, #16\n\t"
  20870. "lsl r7, r9, #16\n\t"
  20871. "lsr r6, r6, #16\n\t"
  20872. "lsr r7, r7, #16\n\t"
  20873. "mul r7, r6, r7\n\t"
  20874. "adds r3, r3, r7\n\t"
  20875. "adcs r4, r4, #0\n\t"
  20876. "adc r5, r5, #0\n\t"
  20877. "lsr r7, r9, #16\n\t"
  20878. "mul r6, r7, r6\n\t"
  20879. "lsr r7, r6, #16\n\t"
  20880. "lsl r6, r6, #16\n\t"
  20881. "adds r3, r3, r6\n\t"
  20882. "adcs r4, r4, r7\n\t"
  20883. "adc r5, r5, #0\n\t"
  20884. "lsr r6, r8, #16\n\t"
  20885. "lsr r7, r9, #16\n\t"
  20886. "mul r7, r6, r7\n\t"
  20887. "adds r4, r4, r7\n\t"
  20888. "adc r5, r5, #0\n\t"
  20889. "lsl r7, r9, #16\n\t"
  20890. "lsr r7, r7, #16\n\t"
  20891. "mul r6, r7, r6\n\t"
  20892. "lsr r7, r6, #16\n\t"
  20893. "lsl r6, r6, #16\n\t"
  20894. "adds r3, r3, r6\n\t"
  20895. "adcs r4, r4, r7\n\t"
  20896. "adc r5, r5, #0\n\t"
  20897. #else
  20898. "umull r6, r7, r8, r9\n\t"
  20899. "adds r3, r3, r6\n\t"
  20900. "adcs r4, r4, r7\n\t"
  20901. "adc r5, r5, #0\n\t"
  20902. #endif
  20903. /* A[3] * B[9] */
  20904. "ldr r8, [%[a], #12]\n\t"
  20905. "ldr r9, [%[b], #36]\n\t"
  20906. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20907. "lsl r6, r8, #16\n\t"
  20908. "lsl r7, r9, #16\n\t"
  20909. "lsr r6, r6, #16\n\t"
  20910. "lsr r7, r7, #16\n\t"
  20911. "mul r7, r6, r7\n\t"
  20912. "adds r3, r3, r7\n\t"
  20913. "adcs r4, r4, #0\n\t"
  20914. "adc r5, r5, #0\n\t"
  20915. "lsr r7, r9, #16\n\t"
  20916. "mul r6, r7, r6\n\t"
  20917. "lsr r7, r6, #16\n\t"
  20918. "lsl r6, r6, #16\n\t"
  20919. "adds r3, r3, r6\n\t"
  20920. "adcs r4, r4, r7\n\t"
  20921. "adc r5, r5, #0\n\t"
  20922. "lsr r6, r8, #16\n\t"
  20923. "lsr r7, r9, #16\n\t"
  20924. "mul r7, r6, r7\n\t"
  20925. "adds r4, r4, r7\n\t"
  20926. "adc r5, r5, #0\n\t"
  20927. "lsl r7, r9, #16\n\t"
  20928. "lsr r7, r7, #16\n\t"
  20929. "mul r6, r7, r6\n\t"
  20930. "lsr r7, r6, #16\n\t"
  20931. "lsl r6, r6, #16\n\t"
  20932. "adds r3, r3, r6\n\t"
  20933. "adcs r4, r4, r7\n\t"
  20934. "adc r5, r5, #0\n\t"
  20935. #else
  20936. "umull r6, r7, r8, r9\n\t"
  20937. "adds r3, r3, r6\n\t"
  20938. "adcs r4, r4, r7\n\t"
  20939. "adc r5, r5, #0\n\t"
  20940. #endif
  20941. /* A[2] * B[10] */
  20942. "ldr r8, [%[a], #8]\n\t"
  20943. "ldr r9, [%[b], #40]\n\t"
  20944. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20945. "lsl r6, r8, #16\n\t"
  20946. "lsl r7, r9, #16\n\t"
  20947. "lsr r6, r6, #16\n\t"
  20948. "lsr r7, r7, #16\n\t"
  20949. "mul r7, r6, r7\n\t"
  20950. "adds r3, r3, r7\n\t"
  20951. "adcs r4, r4, #0\n\t"
  20952. "adc r5, r5, #0\n\t"
  20953. "lsr r7, r9, #16\n\t"
  20954. "mul r6, r7, r6\n\t"
  20955. "lsr r7, r6, #16\n\t"
  20956. "lsl r6, r6, #16\n\t"
  20957. "adds r3, r3, r6\n\t"
  20958. "adcs r4, r4, r7\n\t"
  20959. "adc r5, r5, #0\n\t"
  20960. "lsr r6, r8, #16\n\t"
  20961. "lsr r7, r9, #16\n\t"
  20962. "mul r7, r6, r7\n\t"
  20963. "adds r4, r4, r7\n\t"
  20964. "adc r5, r5, #0\n\t"
  20965. "lsl r7, r9, #16\n\t"
  20966. "lsr r7, r7, #16\n\t"
  20967. "mul r6, r7, r6\n\t"
  20968. "lsr r7, r6, #16\n\t"
  20969. "lsl r6, r6, #16\n\t"
  20970. "adds r3, r3, r6\n\t"
  20971. "adcs r4, r4, r7\n\t"
  20972. "adc r5, r5, #0\n\t"
  20973. #else
  20974. "umull r6, r7, r8, r9\n\t"
  20975. "adds r3, r3, r6\n\t"
  20976. "adcs r4, r4, r7\n\t"
  20977. "adc r5, r5, #0\n\t"
  20978. #endif
  20979. /* A[1] * B[11] */
  20980. "ldr r8, [%[a], #4]\n\t"
  20981. "ldr r9, [%[b], #44]\n\t"
  20982. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  20983. "lsl r6, r8, #16\n\t"
  20984. "lsl r7, r9, #16\n\t"
  20985. "lsr r6, r6, #16\n\t"
  20986. "lsr r7, r7, #16\n\t"
  20987. "mul r7, r6, r7\n\t"
  20988. "adds r3, r3, r7\n\t"
  20989. "adcs r4, r4, #0\n\t"
  20990. "adc r5, r5, #0\n\t"
  20991. "lsr r7, r9, #16\n\t"
  20992. "mul r6, r7, r6\n\t"
  20993. "lsr r7, r6, #16\n\t"
  20994. "lsl r6, r6, #16\n\t"
  20995. "adds r3, r3, r6\n\t"
  20996. "adcs r4, r4, r7\n\t"
  20997. "adc r5, r5, #0\n\t"
  20998. "lsr r6, r8, #16\n\t"
  20999. "lsr r7, r9, #16\n\t"
  21000. "mul r7, r6, r7\n\t"
  21001. "adds r4, r4, r7\n\t"
  21002. "adc r5, r5, #0\n\t"
  21003. "lsl r7, r9, #16\n\t"
  21004. "lsr r7, r7, #16\n\t"
  21005. "mul r6, r7, r6\n\t"
  21006. "lsr r7, r6, #16\n\t"
  21007. "lsl r6, r6, #16\n\t"
  21008. "adds r3, r3, r6\n\t"
  21009. "adcs r4, r4, r7\n\t"
  21010. "adc r5, r5, #0\n\t"
  21011. #else
  21012. "umull r6, r7, r8, r9\n\t"
  21013. "adds r3, r3, r6\n\t"
  21014. "adcs r4, r4, r7\n\t"
  21015. "adc r5, r5, #0\n\t"
  21016. #endif
  21017. "str r3, [%[r], #48]\n\t"
  21018. /* A[2] * B[11] */
  21019. "ldr r8, [%[a], #8]\n\t"
  21020. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21021. "lsl r6, r8, #16\n\t"
  21022. "lsl r7, r9, #16\n\t"
  21023. "lsr r6, r6, #16\n\t"
  21024. "lsr r7, r7, #16\n\t"
  21025. "mul r7, r6, r7\n\t"
  21026. "adds r4, r4, r7\n\t"
  21027. "adcs r5, r5, #0\n\t"
  21028. "mov r3, #0\n\t"
  21029. "adc r3, r3, #0\n\t"
  21030. "lsr r7, r9, #16\n\t"
  21031. "mul r6, r7, r6\n\t"
  21032. "lsr r7, r6, #16\n\t"
  21033. "lsl r6, r6, #16\n\t"
  21034. "adds r4, r4, r6\n\t"
  21035. "adcs r5, r5, r7\n\t"
  21036. "adc r3, r3, #0\n\t"
  21037. "lsr r6, r8, #16\n\t"
  21038. "lsr r7, r9, #16\n\t"
  21039. "mul r7, r6, r7\n\t"
  21040. "adds r5, r5, r7\n\t"
  21041. "adc r3, r3, #0\n\t"
  21042. "lsl r7, r9, #16\n\t"
  21043. "lsr r7, r7, #16\n\t"
  21044. "mul r6, r7, r6\n\t"
  21045. "lsr r7, r6, #16\n\t"
  21046. "lsl r6, r6, #16\n\t"
  21047. "adds r4, r4, r6\n\t"
  21048. "adcs r5, r5, r7\n\t"
  21049. "adc r3, r3, #0\n\t"
  21050. #else
  21051. "umull r6, r7, r8, r9\n\t"
  21052. "adds r4, r4, r6\n\t"
  21053. "adcs r5, r5, r7\n\t"
  21054. "mov r3, #0\n\t"
  21055. "adc r3, r3, #0\n\t"
  21056. #endif
  21057. /* A[3] * B[10] */
  21058. "ldr r8, [%[a], #12]\n\t"
  21059. "ldr r9, [%[b], #40]\n\t"
  21060. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21061. "lsl r6, r8, #16\n\t"
  21062. "lsl r7, r9, #16\n\t"
  21063. "lsr r6, r6, #16\n\t"
  21064. "lsr r7, r7, #16\n\t"
  21065. "mul r7, r6, r7\n\t"
  21066. "adds r4, r4, r7\n\t"
  21067. "adcs r5, r5, #0\n\t"
  21068. "adc r3, r3, #0\n\t"
  21069. "lsr r7, r9, #16\n\t"
  21070. "mul r6, r7, r6\n\t"
  21071. "lsr r7, r6, #16\n\t"
  21072. "lsl r6, r6, #16\n\t"
  21073. "adds r4, r4, r6\n\t"
  21074. "adcs r5, r5, r7\n\t"
  21075. "adc r3, r3, #0\n\t"
  21076. "lsr r6, r8, #16\n\t"
  21077. "lsr r7, r9, #16\n\t"
  21078. "mul r7, r6, r7\n\t"
  21079. "adds r5, r5, r7\n\t"
  21080. "adc r3, r3, #0\n\t"
  21081. "lsl r7, r9, #16\n\t"
  21082. "lsr r7, r7, #16\n\t"
  21083. "mul r6, r7, r6\n\t"
  21084. "lsr r7, r6, #16\n\t"
  21085. "lsl r6, r6, #16\n\t"
  21086. "adds r4, r4, r6\n\t"
  21087. "adcs r5, r5, r7\n\t"
  21088. "adc r3, r3, #0\n\t"
  21089. #else
  21090. "umull r6, r7, r8, r9\n\t"
  21091. "adds r4, r4, r6\n\t"
  21092. "adcs r5, r5, r7\n\t"
  21093. "adc r3, r3, #0\n\t"
  21094. #endif
  21095. /* A[4] * B[9] */
  21096. "ldr r8, [%[a], #16]\n\t"
  21097. "ldr r9, [%[b], #36]\n\t"
  21098. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21099. "lsl r6, r8, #16\n\t"
  21100. "lsl r7, r9, #16\n\t"
  21101. "lsr r6, r6, #16\n\t"
  21102. "lsr r7, r7, #16\n\t"
  21103. "mul r7, r6, r7\n\t"
  21104. "adds r4, r4, r7\n\t"
  21105. "adcs r5, r5, #0\n\t"
  21106. "adc r3, r3, #0\n\t"
  21107. "lsr r7, r9, #16\n\t"
  21108. "mul r6, r7, r6\n\t"
  21109. "lsr r7, r6, #16\n\t"
  21110. "lsl r6, r6, #16\n\t"
  21111. "adds r4, r4, r6\n\t"
  21112. "adcs r5, r5, r7\n\t"
  21113. "adc r3, r3, #0\n\t"
  21114. "lsr r6, r8, #16\n\t"
  21115. "lsr r7, r9, #16\n\t"
  21116. "mul r7, r6, r7\n\t"
  21117. "adds r5, r5, r7\n\t"
  21118. "adc r3, r3, #0\n\t"
  21119. "lsl r7, r9, #16\n\t"
  21120. "lsr r7, r7, #16\n\t"
  21121. "mul r6, r7, r6\n\t"
  21122. "lsr r7, r6, #16\n\t"
  21123. "lsl r6, r6, #16\n\t"
  21124. "adds r4, r4, r6\n\t"
  21125. "adcs r5, r5, r7\n\t"
  21126. "adc r3, r3, #0\n\t"
  21127. #else
  21128. "umull r6, r7, r8, r9\n\t"
  21129. "adds r4, r4, r6\n\t"
  21130. "adcs r5, r5, r7\n\t"
  21131. "adc r3, r3, #0\n\t"
  21132. #endif
  21133. /* A[5] * B[8] */
  21134. "ldr r8, [%[a], #20]\n\t"
  21135. "ldr r9, [%[b], #32]\n\t"
  21136. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21137. "lsl r6, r8, #16\n\t"
  21138. "lsl r7, r9, #16\n\t"
  21139. "lsr r6, r6, #16\n\t"
  21140. "lsr r7, r7, #16\n\t"
  21141. "mul r7, r6, r7\n\t"
  21142. "adds r4, r4, r7\n\t"
  21143. "adcs r5, r5, #0\n\t"
  21144. "adc r3, r3, #0\n\t"
  21145. "lsr r7, r9, #16\n\t"
  21146. "mul r6, r7, r6\n\t"
  21147. "lsr r7, r6, #16\n\t"
  21148. "lsl r6, r6, #16\n\t"
  21149. "adds r4, r4, r6\n\t"
  21150. "adcs r5, r5, r7\n\t"
  21151. "adc r3, r3, #0\n\t"
  21152. "lsr r6, r8, #16\n\t"
  21153. "lsr r7, r9, #16\n\t"
  21154. "mul r7, r6, r7\n\t"
  21155. "adds r5, r5, r7\n\t"
  21156. "adc r3, r3, #0\n\t"
  21157. "lsl r7, r9, #16\n\t"
  21158. "lsr r7, r7, #16\n\t"
  21159. "mul r6, r7, r6\n\t"
  21160. "lsr r7, r6, #16\n\t"
  21161. "lsl r6, r6, #16\n\t"
  21162. "adds r4, r4, r6\n\t"
  21163. "adcs r5, r5, r7\n\t"
  21164. "adc r3, r3, #0\n\t"
  21165. #else
  21166. "umull r6, r7, r8, r9\n\t"
  21167. "adds r4, r4, r6\n\t"
  21168. "adcs r5, r5, r7\n\t"
  21169. "adc r3, r3, #0\n\t"
  21170. #endif
  21171. /* A[6] * B[7] */
  21172. "ldr r9, [%[b], #28]\n\t"
  21173. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21174. "lsl r6, r11, #16\n\t"
  21175. "lsl r7, r9, #16\n\t"
  21176. "lsr r6, r6, #16\n\t"
  21177. "lsr r7, r7, #16\n\t"
  21178. "mul r7, r6, r7\n\t"
  21179. "adds r4, r4, r7\n\t"
  21180. "adcs r5, r5, #0\n\t"
  21181. "adc r3, r3, #0\n\t"
  21182. "lsr r7, r9, #16\n\t"
  21183. "mul r6, r7, r6\n\t"
  21184. "lsr r7, r6, #16\n\t"
  21185. "lsl r6, r6, #16\n\t"
  21186. "adds r4, r4, r6\n\t"
  21187. "adcs r5, r5, r7\n\t"
  21188. "adc r3, r3, #0\n\t"
  21189. "lsr r6, r11, #16\n\t"
  21190. "lsr r7, r9, #16\n\t"
  21191. "mul r7, r6, r7\n\t"
  21192. "adds r5, r5, r7\n\t"
  21193. "adc r3, r3, #0\n\t"
  21194. "lsl r7, r9, #16\n\t"
  21195. "lsr r7, r7, #16\n\t"
  21196. "mul r6, r7, r6\n\t"
  21197. "lsr r7, r6, #16\n\t"
  21198. "lsl r6, r6, #16\n\t"
  21199. "adds r4, r4, r6\n\t"
  21200. "adcs r5, r5, r7\n\t"
  21201. "adc r3, r3, #0\n\t"
  21202. #else
  21203. "umull r6, r7, r11, r9\n\t"
  21204. "adds r4, r4, r6\n\t"
  21205. "adcs r5, r5, r7\n\t"
  21206. "adc r3, r3, #0\n\t"
  21207. #endif
  21208. /* A[7] * B[6] */
  21209. "ldr r8, [%[a], #28]\n\t"
  21210. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21211. "lsl r6, r8, #16\n\t"
  21212. "lsl r7, r12, #16\n\t"
  21213. "lsr r6, r6, #16\n\t"
  21214. "lsr r7, r7, #16\n\t"
  21215. "mul r7, r6, r7\n\t"
  21216. "adds r4, r4, r7\n\t"
  21217. "adcs r5, r5, #0\n\t"
  21218. "adc r3, r3, #0\n\t"
  21219. "lsr r7, r12, #16\n\t"
  21220. "mul r6, r7, r6\n\t"
  21221. "lsr r7, r6, #16\n\t"
  21222. "lsl r6, r6, #16\n\t"
  21223. "adds r4, r4, r6\n\t"
  21224. "adcs r5, r5, r7\n\t"
  21225. "adc r3, r3, #0\n\t"
  21226. "lsr r6, r8, #16\n\t"
  21227. "lsr r7, r12, #16\n\t"
  21228. "mul r7, r6, r7\n\t"
  21229. "adds r5, r5, r7\n\t"
  21230. "adc r3, r3, #0\n\t"
  21231. "lsl r7, r12, #16\n\t"
  21232. "lsr r7, r7, #16\n\t"
  21233. "mul r6, r7, r6\n\t"
  21234. "lsr r7, r6, #16\n\t"
  21235. "lsl r6, r6, #16\n\t"
  21236. "adds r4, r4, r6\n\t"
  21237. "adcs r5, r5, r7\n\t"
  21238. "adc r3, r3, #0\n\t"
  21239. #else
  21240. "umull r6, r7, r8, r12\n\t"
  21241. "adds r4, r4, r6\n\t"
  21242. "adcs r5, r5, r7\n\t"
  21243. "adc r3, r3, #0\n\t"
  21244. #endif
  21245. /* A[8] * B[5] */
  21246. "ldr r8, [%[a], #32]\n\t"
  21247. "ldr r9, [%[b], #20]\n\t"
  21248. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21249. "lsl r6, r8, #16\n\t"
  21250. "lsl r7, r9, #16\n\t"
  21251. "lsr r6, r6, #16\n\t"
  21252. "lsr r7, r7, #16\n\t"
  21253. "mul r7, r6, r7\n\t"
  21254. "adds r4, r4, r7\n\t"
  21255. "adcs r5, r5, #0\n\t"
  21256. "adc r3, r3, #0\n\t"
  21257. "lsr r7, r9, #16\n\t"
  21258. "mul r6, r7, r6\n\t"
  21259. "lsr r7, r6, #16\n\t"
  21260. "lsl r6, r6, #16\n\t"
  21261. "adds r4, r4, r6\n\t"
  21262. "adcs r5, r5, r7\n\t"
  21263. "adc r3, r3, #0\n\t"
  21264. "lsr r6, r8, #16\n\t"
  21265. "lsr r7, r9, #16\n\t"
  21266. "mul r7, r6, r7\n\t"
  21267. "adds r5, r5, r7\n\t"
  21268. "adc r3, r3, #0\n\t"
  21269. "lsl r7, r9, #16\n\t"
  21270. "lsr r7, r7, #16\n\t"
  21271. "mul r6, r7, r6\n\t"
  21272. "lsr r7, r6, #16\n\t"
  21273. "lsl r6, r6, #16\n\t"
  21274. "adds r4, r4, r6\n\t"
  21275. "adcs r5, r5, r7\n\t"
  21276. "adc r3, r3, #0\n\t"
  21277. #else
  21278. "umull r6, r7, r8, r9\n\t"
  21279. "adds r4, r4, r6\n\t"
  21280. "adcs r5, r5, r7\n\t"
  21281. "adc r3, r3, #0\n\t"
  21282. #endif
  21283. /* A[9] * B[4] */
  21284. "ldr r8, [%[a], #36]\n\t"
  21285. "ldr r9, [%[b], #16]\n\t"
  21286. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21287. "lsl r6, r8, #16\n\t"
  21288. "lsl r7, r9, #16\n\t"
  21289. "lsr r6, r6, #16\n\t"
  21290. "lsr r7, r7, #16\n\t"
  21291. "mul r7, r6, r7\n\t"
  21292. "adds r4, r4, r7\n\t"
  21293. "adcs r5, r5, #0\n\t"
  21294. "adc r3, r3, #0\n\t"
  21295. "lsr r7, r9, #16\n\t"
  21296. "mul r6, r7, r6\n\t"
  21297. "lsr r7, r6, #16\n\t"
  21298. "lsl r6, r6, #16\n\t"
  21299. "adds r4, r4, r6\n\t"
  21300. "adcs r5, r5, r7\n\t"
  21301. "adc r3, r3, #0\n\t"
  21302. "lsr r6, r8, #16\n\t"
  21303. "lsr r7, r9, #16\n\t"
  21304. "mul r7, r6, r7\n\t"
  21305. "adds r5, r5, r7\n\t"
  21306. "adc r3, r3, #0\n\t"
  21307. "lsl r7, r9, #16\n\t"
  21308. "lsr r7, r7, #16\n\t"
  21309. "mul r6, r7, r6\n\t"
  21310. "lsr r7, r6, #16\n\t"
  21311. "lsl r6, r6, #16\n\t"
  21312. "adds r4, r4, r6\n\t"
  21313. "adcs r5, r5, r7\n\t"
  21314. "adc r3, r3, #0\n\t"
  21315. #else
  21316. "umull r6, r7, r8, r9\n\t"
  21317. "adds r4, r4, r6\n\t"
  21318. "adcs r5, r5, r7\n\t"
  21319. "adc r3, r3, #0\n\t"
  21320. #endif
  21321. /* A[10] * B[3] */
  21322. "ldr r8, [%[a], #40]\n\t"
  21323. "ldr r9, [%[b], #12]\n\t"
  21324. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21325. "lsl r6, r8, #16\n\t"
  21326. "lsl r7, r9, #16\n\t"
  21327. "lsr r6, r6, #16\n\t"
  21328. "lsr r7, r7, #16\n\t"
  21329. "mul r7, r6, r7\n\t"
  21330. "adds r4, r4, r7\n\t"
  21331. "adcs r5, r5, #0\n\t"
  21332. "adc r3, r3, #0\n\t"
  21333. "lsr r7, r9, #16\n\t"
  21334. "mul r6, r7, r6\n\t"
  21335. "lsr r7, r6, #16\n\t"
  21336. "lsl r6, r6, #16\n\t"
  21337. "adds r4, r4, r6\n\t"
  21338. "adcs r5, r5, r7\n\t"
  21339. "adc r3, r3, #0\n\t"
  21340. "lsr r6, r8, #16\n\t"
  21341. "lsr r7, r9, #16\n\t"
  21342. "mul r7, r6, r7\n\t"
  21343. "adds r5, r5, r7\n\t"
  21344. "adc r3, r3, #0\n\t"
  21345. "lsl r7, r9, #16\n\t"
  21346. "lsr r7, r7, #16\n\t"
  21347. "mul r6, r7, r6\n\t"
  21348. "lsr r7, r6, #16\n\t"
  21349. "lsl r6, r6, #16\n\t"
  21350. "adds r4, r4, r6\n\t"
  21351. "adcs r5, r5, r7\n\t"
  21352. "adc r3, r3, #0\n\t"
  21353. #else
  21354. "umull r6, r7, r8, r9\n\t"
  21355. "adds r4, r4, r6\n\t"
  21356. "adcs r5, r5, r7\n\t"
  21357. "adc r3, r3, #0\n\t"
  21358. #endif
  21359. /* A[11] * B[2] */
  21360. "ldr r8, [%[a], #44]\n\t"
  21361. "ldr r9, [%[b], #8]\n\t"
  21362. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21363. "lsl r6, r8, #16\n\t"
  21364. "lsl r7, r9, #16\n\t"
  21365. "lsr r6, r6, #16\n\t"
  21366. "lsr r7, r7, #16\n\t"
  21367. "mul r7, r6, r7\n\t"
  21368. "adds r4, r4, r7\n\t"
  21369. "adcs r5, r5, #0\n\t"
  21370. "adc r3, r3, #0\n\t"
  21371. "lsr r7, r9, #16\n\t"
  21372. "mul r6, r7, r6\n\t"
  21373. "lsr r7, r6, #16\n\t"
  21374. "lsl r6, r6, #16\n\t"
  21375. "adds r4, r4, r6\n\t"
  21376. "adcs r5, r5, r7\n\t"
  21377. "adc r3, r3, #0\n\t"
  21378. "lsr r6, r8, #16\n\t"
  21379. "lsr r7, r9, #16\n\t"
  21380. "mul r7, r6, r7\n\t"
  21381. "adds r5, r5, r7\n\t"
  21382. "adc r3, r3, #0\n\t"
  21383. "lsl r7, r9, #16\n\t"
  21384. "lsr r7, r7, #16\n\t"
  21385. "mul r6, r7, r6\n\t"
  21386. "lsr r7, r6, #16\n\t"
  21387. "lsl r6, r6, #16\n\t"
  21388. "adds r4, r4, r6\n\t"
  21389. "adcs r5, r5, r7\n\t"
  21390. "adc r3, r3, #0\n\t"
  21391. #else
  21392. "umull r6, r7, r8, r9\n\t"
  21393. "adds r4, r4, r6\n\t"
  21394. "adcs r5, r5, r7\n\t"
  21395. "adc r3, r3, #0\n\t"
  21396. #endif
  21397. "str r4, [%[r], #52]\n\t"
  21398. /* A[11] * B[3] */
  21399. "ldr r9, [%[b], #12]\n\t"
  21400. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21401. "lsl r6, r8, #16\n\t"
  21402. "lsl r7, r9, #16\n\t"
  21403. "lsr r6, r6, #16\n\t"
  21404. "lsr r7, r7, #16\n\t"
  21405. "mul r7, r6, r7\n\t"
  21406. "adds r5, r5, r7\n\t"
  21407. "adcs r3, r3, #0\n\t"
  21408. "mov r4, #0\n\t"
  21409. "adc r4, r4, #0\n\t"
  21410. "lsr r7, r9, #16\n\t"
  21411. "mul r6, r7, r6\n\t"
  21412. "lsr r7, r6, #16\n\t"
  21413. "lsl r6, r6, #16\n\t"
  21414. "adds r5, r5, r6\n\t"
  21415. "adcs r3, r3, r7\n\t"
  21416. "adc r4, r4, #0\n\t"
  21417. "lsr r6, r8, #16\n\t"
  21418. "lsr r7, r9, #16\n\t"
  21419. "mul r7, r6, r7\n\t"
  21420. "adds r3, r3, r7\n\t"
  21421. "adc r4, r4, #0\n\t"
  21422. "lsl r7, r9, #16\n\t"
  21423. "lsr r7, r7, #16\n\t"
  21424. "mul r6, r7, r6\n\t"
  21425. "lsr r7, r6, #16\n\t"
  21426. "lsl r6, r6, #16\n\t"
  21427. "adds r5, r5, r6\n\t"
  21428. "adcs r3, r3, r7\n\t"
  21429. "adc r4, r4, #0\n\t"
  21430. #else
  21431. "umull r6, r7, r8, r9\n\t"
  21432. "adds r5, r5, r6\n\t"
  21433. "adcs r3, r3, r7\n\t"
  21434. "mov r4, #0\n\t"
  21435. "adc r4, r4, #0\n\t"
  21436. #endif
  21437. /* A[10] * B[4] */
  21438. "ldr r8, [%[a], #40]\n\t"
  21439. "ldr r9, [%[b], #16]\n\t"
  21440. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21441. "lsl r6, r8, #16\n\t"
  21442. "lsl r7, r9, #16\n\t"
  21443. "lsr r6, r6, #16\n\t"
  21444. "lsr r7, r7, #16\n\t"
  21445. "mul r7, r6, r7\n\t"
  21446. "adds r5, r5, r7\n\t"
  21447. "adcs r3, r3, #0\n\t"
  21448. "adc r4, r4, #0\n\t"
  21449. "lsr r7, r9, #16\n\t"
  21450. "mul r6, r7, r6\n\t"
  21451. "lsr r7, r6, #16\n\t"
  21452. "lsl r6, r6, #16\n\t"
  21453. "adds r5, r5, r6\n\t"
  21454. "adcs r3, r3, r7\n\t"
  21455. "adc r4, r4, #0\n\t"
  21456. "lsr r6, r8, #16\n\t"
  21457. "lsr r7, r9, #16\n\t"
  21458. "mul r7, r6, r7\n\t"
  21459. "adds r3, r3, r7\n\t"
  21460. "adc r4, r4, #0\n\t"
  21461. "lsl r7, r9, #16\n\t"
  21462. "lsr r7, r7, #16\n\t"
  21463. "mul r6, r7, r6\n\t"
  21464. "lsr r7, r6, #16\n\t"
  21465. "lsl r6, r6, #16\n\t"
  21466. "adds r5, r5, r6\n\t"
  21467. "adcs r3, r3, r7\n\t"
  21468. "adc r4, r4, #0\n\t"
  21469. #else
  21470. "umull r6, r7, r8, r9\n\t"
  21471. "adds r5, r5, r6\n\t"
  21472. "adcs r3, r3, r7\n\t"
  21473. "adc r4, r4, #0\n\t"
  21474. #endif
  21475. /* A[9] * B[5] */
  21476. "ldr r8, [%[a], #36]\n\t"
  21477. "ldr r9, [%[b], #20]\n\t"
  21478. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21479. "lsl r6, r8, #16\n\t"
  21480. "lsl r7, r9, #16\n\t"
  21481. "lsr r6, r6, #16\n\t"
  21482. "lsr r7, r7, #16\n\t"
  21483. "mul r7, r6, r7\n\t"
  21484. "adds r5, r5, r7\n\t"
  21485. "adcs r3, r3, #0\n\t"
  21486. "adc r4, r4, #0\n\t"
  21487. "lsr r7, r9, #16\n\t"
  21488. "mul r6, r7, r6\n\t"
  21489. "lsr r7, r6, #16\n\t"
  21490. "lsl r6, r6, #16\n\t"
  21491. "adds r5, r5, r6\n\t"
  21492. "adcs r3, r3, r7\n\t"
  21493. "adc r4, r4, #0\n\t"
  21494. "lsr r6, r8, #16\n\t"
  21495. "lsr r7, r9, #16\n\t"
  21496. "mul r7, r6, r7\n\t"
  21497. "adds r3, r3, r7\n\t"
  21498. "adc r4, r4, #0\n\t"
  21499. "lsl r7, r9, #16\n\t"
  21500. "lsr r7, r7, #16\n\t"
  21501. "mul r6, r7, r6\n\t"
  21502. "lsr r7, r6, #16\n\t"
  21503. "lsl r6, r6, #16\n\t"
  21504. "adds r5, r5, r6\n\t"
  21505. "adcs r3, r3, r7\n\t"
  21506. "adc r4, r4, #0\n\t"
  21507. #else
  21508. "umull r6, r7, r8, r9\n\t"
  21509. "adds r5, r5, r6\n\t"
  21510. "adcs r3, r3, r7\n\t"
  21511. "adc r4, r4, #0\n\t"
  21512. #endif
  21513. /* A[8] * B[6] */
  21514. "ldr r8, [%[a], #32]\n\t"
  21515. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21516. "lsl r6, r8, #16\n\t"
  21517. "lsl r7, r12, #16\n\t"
  21518. "lsr r6, r6, #16\n\t"
  21519. "lsr r7, r7, #16\n\t"
  21520. "mul r7, r6, r7\n\t"
  21521. "adds r5, r5, r7\n\t"
  21522. "adcs r3, r3, #0\n\t"
  21523. "adc r4, r4, #0\n\t"
  21524. "lsr r7, r12, #16\n\t"
  21525. "mul r6, r7, r6\n\t"
  21526. "lsr r7, r6, #16\n\t"
  21527. "lsl r6, r6, #16\n\t"
  21528. "adds r5, r5, r6\n\t"
  21529. "adcs r3, r3, r7\n\t"
  21530. "adc r4, r4, #0\n\t"
  21531. "lsr r6, r8, #16\n\t"
  21532. "lsr r7, r12, #16\n\t"
  21533. "mul r7, r6, r7\n\t"
  21534. "adds r3, r3, r7\n\t"
  21535. "adc r4, r4, #0\n\t"
  21536. "lsl r7, r12, #16\n\t"
  21537. "lsr r7, r7, #16\n\t"
  21538. "mul r6, r7, r6\n\t"
  21539. "lsr r7, r6, #16\n\t"
  21540. "lsl r6, r6, #16\n\t"
  21541. "adds r5, r5, r6\n\t"
  21542. "adcs r3, r3, r7\n\t"
  21543. "adc r4, r4, #0\n\t"
  21544. #else
  21545. "umull r6, r7, r8, r12\n\t"
  21546. "adds r5, r5, r6\n\t"
  21547. "adcs r3, r3, r7\n\t"
  21548. "adc r4, r4, #0\n\t"
  21549. #endif
  21550. /* A[7] * B[7] */
  21551. "ldr r11, [%[a], #28]\n\t"
  21552. "ldr r12, [%[b], #28]\n\t"
  21553. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21554. "lsl r6, r11, #16\n\t"
  21555. "lsl r7, r12, #16\n\t"
  21556. "lsr r6, r6, #16\n\t"
  21557. "lsr r7, r7, #16\n\t"
  21558. "mul r7, r6, r7\n\t"
  21559. "adds r5, r5, r7\n\t"
  21560. "adcs r3, r3, #0\n\t"
  21561. "adc r4, r4, #0\n\t"
  21562. "lsr r7, r12, #16\n\t"
  21563. "mul r6, r7, r6\n\t"
  21564. "lsr r7, r6, #16\n\t"
  21565. "lsl r6, r6, #16\n\t"
  21566. "adds r5, r5, r6\n\t"
  21567. "adcs r3, r3, r7\n\t"
  21568. "adc r4, r4, #0\n\t"
  21569. "lsr r6, r11, #16\n\t"
  21570. "lsr r7, r12, #16\n\t"
  21571. "mul r7, r6, r7\n\t"
  21572. "adds r3, r3, r7\n\t"
  21573. "adc r4, r4, #0\n\t"
  21574. "lsl r7, r12, #16\n\t"
  21575. "lsr r7, r7, #16\n\t"
  21576. "mul r6, r7, r6\n\t"
  21577. "lsr r7, r6, #16\n\t"
  21578. "lsl r6, r6, #16\n\t"
  21579. "adds r5, r5, r6\n\t"
  21580. "adcs r3, r3, r7\n\t"
  21581. "adc r4, r4, #0\n\t"
  21582. #else
  21583. "umull r6, r7, r11, r12\n\t"
  21584. "adds r5, r5, r6\n\t"
  21585. "adcs r3, r3, r7\n\t"
  21586. "adc r4, r4, #0\n\t"
  21587. #endif
  21588. /* A[6] * B[8] */
  21589. "ldr r8, [%[a], #24]\n\t"
  21590. "ldr r9, [%[b], #32]\n\t"
  21591. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21592. "lsl r6, r8, #16\n\t"
  21593. "lsl r7, r9, #16\n\t"
  21594. "lsr r6, r6, #16\n\t"
  21595. "lsr r7, r7, #16\n\t"
  21596. "mul r7, r6, r7\n\t"
  21597. "adds r5, r5, r7\n\t"
  21598. "adcs r3, r3, #0\n\t"
  21599. "adc r4, r4, #0\n\t"
  21600. "lsr r7, r9, #16\n\t"
  21601. "mul r6, r7, r6\n\t"
  21602. "lsr r7, r6, #16\n\t"
  21603. "lsl r6, r6, #16\n\t"
  21604. "adds r5, r5, r6\n\t"
  21605. "adcs r3, r3, r7\n\t"
  21606. "adc r4, r4, #0\n\t"
  21607. "lsr r6, r8, #16\n\t"
  21608. "lsr r7, r9, #16\n\t"
  21609. "mul r7, r6, r7\n\t"
  21610. "adds r3, r3, r7\n\t"
  21611. "adc r4, r4, #0\n\t"
  21612. "lsl r7, r9, #16\n\t"
  21613. "lsr r7, r7, #16\n\t"
  21614. "mul r6, r7, r6\n\t"
  21615. "lsr r7, r6, #16\n\t"
  21616. "lsl r6, r6, #16\n\t"
  21617. "adds r5, r5, r6\n\t"
  21618. "adcs r3, r3, r7\n\t"
  21619. "adc r4, r4, #0\n\t"
  21620. #else
  21621. "umull r6, r7, r8, r9\n\t"
  21622. "adds r5, r5, r6\n\t"
  21623. "adcs r3, r3, r7\n\t"
  21624. "adc r4, r4, #0\n\t"
  21625. #endif
  21626. /* A[5] * B[9] */
  21627. "ldr r8, [%[a], #20]\n\t"
  21628. "ldr r9, [%[b], #36]\n\t"
  21629. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21630. "lsl r6, r8, #16\n\t"
  21631. "lsl r7, r9, #16\n\t"
  21632. "lsr r6, r6, #16\n\t"
  21633. "lsr r7, r7, #16\n\t"
  21634. "mul r7, r6, r7\n\t"
  21635. "adds r5, r5, r7\n\t"
  21636. "adcs r3, r3, #0\n\t"
  21637. "adc r4, r4, #0\n\t"
  21638. "lsr r7, r9, #16\n\t"
  21639. "mul r6, r7, r6\n\t"
  21640. "lsr r7, r6, #16\n\t"
  21641. "lsl r6, r6, #16\n\t"
  21642. "adds r5, r5, r6\n\t"
  21643. "adcs r3, r3, r7\n\t"
  21644. "adc r4, r4, #0\n\t"
  21645. "lsr r6, r8, #16\n\t"
  21646. "lsr r7, r9, #16\n\t"
  21647. "mul r7, r6, r7\n\t"
  21648. "adds r3, r3, r7\n\t"
  21649. "adc r4, r4, #0\n\t"
  21650. "lsl r7, r9, #16\n\t"
  21651. "lsr r7, r7, #16\n\t"
  21652. "mul r6, r7, r6\n\t"
  21653. "lsr r7, r6, #16\n\t"
  21654. "lsl r6, r6, #16\n\t"
  21655. "adds r5, r5, r6\n\t"
  21656. "adcs r3, r3, r7\n\t"
  21657. "adc r4, r4, #0\n\t"
  21658. #else
  21659. "umull r6, r7, r8, r9\n\t"
  21660. "adds r5, r5, r6\n\t"
  21661. "adcs r3, r3, r7\n\t"
  21662. "adc r4, r4, #0\n\t"
  21663. #endif
  21664. /* A[4] * B[10] */
  21665. "ldr r8, [%[a], #16]\n\t"
  21666. "ldr r9, [%[b], #40]\n\t"
  21667. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21668. "lsl r6, r8, #16\n\t"
  21669. "lsl r7, r9, #16\n\t"
  21670. "lsr r6, r6, #16\n\t"
  21671. "lsr r7, r7, #16\n\t"
  21672. "mul r7, r6, r7\n\t"
  21673. "adds r5, r5, r7\n\t"
  21674. "adcs r3, r3, #0\n\t"
  21675. "adc r4, r4, #0\n\t"
  21676. "lsr r7, r9, #16\n\t"
  21677. "mul r6, r7, r6\n\t"
  21678. "lsr r7, r6, #16\n\t"
  21679. "lsl r6, r6, #16\n\t"
  21680. "adds r5, r5, r6\n\t"
  21681. "adcs r3, r3, r7\n\t"
  21682. "adc r4, r4, #0\n\t"
  21683. "lsr r6, r8, #16\n\t"
  21684. "lsr r7, r9, #16\n\t"
  21685. "mul r7, r6, r7\n\t"
  21686. "adds r3, r3, r7\n\t"
  21687. "adc r4, r4, #0\n\t"
  21688. "lsl r7, r9, #16\n\t"
  21689. "lsr r7, r7, #16\n\t"
  21690. "mul r6, r7, r6\n\t"
  21691. "lsr r7, r6, #16\n\t"
  21692. "lsl r6, r6, #16\n\t"
  21693. "adds r5, r5, r6\n\t"
  21694. "adcs r3, r3, r7\n\t"
  21695. "adc r4, r4, #0\n\t"
  21696. #else
  21697. "umull r6, r7, r8, r9\n\t"
  21698. "adds r5, r5, r6\n\t"
  21699. "adcs r3, r3, r7\n\t"
  21700. "adc r4, r4, #0\n\t"
  21701. #endif
  21702. /* A[3] * B[11] */
  21703. "ldr r8, [%[a], #12]\n\t"
  21704. "ldr r9, [%[b], #44]\n\t"
  21705. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21706. "lsl r6, r8, #16\n\t"
  21707. "lsl r7, r9, #16\n\t"
  21708. "lsr r6, r6, #16\n\t"
  21709. "lsr r7, r7, #16\n\t"
  21710. "mul r7, r6, r7\n\t"
  21711. "adds r5, r5, r7\n\t"
  21712. "adcs r3, r3, #0\n\t"
  21713. "adc r4, r4, #0\n\t"
  21714. "lsr r7, r9, #16\n\t"
  21715. "mul r6, r7, r6\n\t"
  21716. "lsr r7, r6, #16\n\t"
  21717. "lsl r6, r6, #16\n\t"
  21718. "adds r5, r5, r6\n\t"
  21719. "adcs r3, r3, r7\n\t"
  21720. "adc r4, r4, #0\n\t"
  21721. "lsr r6, r8, #16\n\t"
  21722. "lsr r7, r9, #16\n\t"
  21723. "mul r7, r6, r7\n\t"
  21724. "adds r3, r3, r7\n\t"
  21725. "adc r4, r4, #0\n\t"
  21726. "lsl r7, r9, #16\n\t"
  21727. "lsr r7, r7, #16\n\t"
  21728. "mul r6, r7, r6\n\t"
  21729. "lsr r7, r6, #16\n\t"
  21730. "lsl r6, r6, #16\n\t"
  21731. "adds r5, r5, r6\n\t"
  21732. "adcs r3, r3, r7\n\t"
  21733. "adc r4, r4, #0\n\t"
  21734. #else
  21735. "umull r6, r7, r8, r9\n\t"
  21736. "adds r5, r5, r6\n\t"
  21737. "adcs r3, r3, r7\n\t"
  21738. "adc r4, r4, #0\n\t"
  21739. #endif
  21740. "str r5, [%[r], #56]\n\t"
  21741. /* A[4] * B[11] */
  21742. "ldr r8, [%[a], #16]\n\t"
  21743. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21744. "lsl r6, r8, #16\n\t"
  21745. "lsl r7, r9, #16\n\t"
  21746. "lsr r6, r6, #16\n\t"
  21747. "lsr r7, r7, #16\n\t"
  21748. "mul r7, r6, r7\n\t"
  21749. "adds r3, r3, r7\n\t"
  21750. "adcs r4, r4, #0\n\t"
  21751. "mov r5, #0\n\t"
  21752. "adc r5, r5, #0\n\t"
  21753. "lsr r7, r9, #16\n\t"
  21754. "mul r6, r7, r6\n\t"
  21755. "lsr r7, r6, #16\n\t"
  21756. "lsl r6, r6, #16\n\t"
  21757. "adds r3, r3, r6\n\t"
  21758. "adcs r4, r4, r7\n\t"
  21759. "adc r5, r5, #0\n\t"
  21760. "lsr r6, r8, #16\n\t"
  21761. "lsr r7, r9, #16\n\t"
  21762. "mul r7, r6, r7\n\t"
  21763. "adds r4, r4, r7\n\t"
  21764. "adc r5, r5, #0\n\t"
  21765. "lsl r7, r9, #16\n\t"
  21766. "lsr r7, r7, #16\n\t"
  21767. "mul r6, r7, r6\n\t"
  21768. "lsr r7, r6, #16\n\t"
  21769. "lsl r6, r6, #16\n\t"
  21770. "adds r3, r3, r6\n\t"
  21771. "adcs r4, r4, r7\n\t"
  21772. "adc r5, r5, #0\n\t"
  21773. #else
  21774. "umull r6, r7, r8, r9\n\t"
  21775. "adds r3, r3, r6\n\t"
  21776. "adcs r4, r4, r7\n\t"
  21777. "mov r5, #0\n\t"
  21778. "adc r5, r5, #0\n\t"
  21779. #endif
  21780. /* A[5] * B[10] */
  21781. "ldr r8, [%[a], #20]\n\t"
  21782. "ldr r9, [%[b], #40]\n\t"
  21783. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21784. "lsl r6, r8, #16\n\t"
  21785. "lsl r7, r9, #16\n\t"
  21786. "lsr r6, r6, #16\n\t"
  21787. "lsr r7, r7, #16\n\t"
  21788. "mul r7, r6, r7\n\t"
  21789. "adds r3, r3, r7\n\t"
  21790. "adcs r4, r4, #0\n\t"
  21791. "adc r5, r5, #0\n\t"
  21792. "lsr r7, r9, #16\n\t"
  21793. "mul r6, r7, r6\n\t"
  21794. "lsr r7, r6, #16\n\t"
  21795. "lsl r6, r6, #16\n\t"
  21796. "adds r3, r3, r6\n\t"
  21797. "adcs r4, r4, r7\n\t"
  21798. "adc r5, r5, #0\n\t"
  21799. "lsr r6, r8, #16\n\t"
  21800. "lsr r7, r9, #16\n\t"
  21801. "mul r7, r6, r7\n\t"
  21802. "adds r4, r4, r7\n\t"
  21803. "adc r5, r5, #0\n\t"
  21804. "lsl r7, r9, #16\n\t"
  21805. "lsr r7, r7, #16\n\t"
  21806. "mul r6, r7, r6\n\t"
  21807. "lsr r7, r6, #16\n\t"
  21808. "lsl r6, r6, #16\n\t"
  21809. "adds r3, r3, r6\n\t"
  21810. "adcs r4, r4, r7\n\t"
  21811. "adc r5, r5, #0\n\t"
  21812. #else
  21813. "umull r6, r7, r8, r9\n\t"
  21814. "adds r3, r3, r6\n\t"
  21815. "adcs r4, r4, r7\n\t"
  21816. "adc r5, r5, #0\n\t"
  21817. #endif
  21818. /* A[6] * B[9] */
  21819. "ldr r8, [%[a], #24]\n\t"
  21820. "ldr r9, [%[b], #36]\n\t"
  21821. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21822. "lsl r6, r8, #16\n\t"
  21823. "lsl r7, r9, #16\n\t"
  21824. "lsr r6, r6, #16\n\t"
  21825. "lsr r7, r7, #16\n\t"
  21826. "mul r7, r6, r7\n\t"
  21827. "adds r3, r3, r7\n\t"
  21828. "adcs r4, r4, #0\n\t"
  21829. "adc r5, r5, #0\n\t"
  21830. "lsr r7, r9, #16\n\t"
  21831. "mul r6, r7, r6\n\t"
  21832. "lsr r7, r6, #16\n\t"
  21833. "lsl r6, r6, #16\n\t"
  21834. "adds r3, r3, r6\n\t"
  21835. "adcs r4, r4, r7\n\t"
  21836. "adc r5, r5, #0\n\t"
  21837. "lsr r6, r8, #16\n\t"
  21838. "lsr r7, r9, #16\n\t"
  21839. "mul r7, r6, r7\n\t"
  21840. "adds r4, r4, r7\n\t"
  21841. "adc r5, r5, #0\n\t"
  21842. "lsl r7, r9, #16\n\t"
  21843. "lsr r7, r7, #16\n\t"
  21844. "mul r6, r7, r6\n\t"
  21845. "lsr r7, r6, #16\n\t"
  21846. "lsl r6, r6, #16\n\t"
  21847. "adds r3, r3, r6\n\t"
  21848. "adcs r4, r4, r7\n\t"
  21849. "adc r5, r5, #0\n\t"
  21850. #else
  21851. "umull r6, r7, r8, r9\n\t"
  21852. "adds r3, r3, r6\n\t"
  21853. "adcs r4, r4, r7\n\t"
  21854. "adc r5, r5, #0\n\t"
  21855. #endif
  21856. /* A[7] * B[8] */
  21857. "ldr r9, [%[b], #32]\n\t"
  21858. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21859. "lsl r6, r11, #16\n\t"
  21860. "lsl r7, r9, #16\n\t"
  21861. "lsr r6, r6, #16\n\t"
  21862. "lsr r7, r7, #16\n\t"
  21863. "mul r7, r6, r7\n\t"
  21864. "adds r3, r3, r7\n\t"
  21865. "adcs r4, r4, #0\n\t"
  21866. "adc r5, r5, #0\n\t"
  21867. "lsr r7, r9, #16\n\t"
  21868. "mul r6, r7, r6\n\t"
  21869. "lsr r7, r6, #16\n\t"
  21870. "lsl r6, r6, #16\n\t"
  21871. "adds r3, r3, r6\n\t"
  21872. "adcs r4, r4, r7\n\t"
  21873. "adc r5, r5, #0\n\t"
  21874. "lsr r6, r11, #16\n\t"
  21875. "lsr r7, r9, #16\n\t"
  21876. "mul r7, r6, r7\n\t"
  21877. "adds r4, r4, r7\n\t"
  21878. "adc r5, r5, #0\n\t"
  21879. "lsl r7, r9, #16\n\t"
  21880. "lsr r7, r7, #16\n\t"
  21881. "mul r6, r7, r6\n\t"
  21882. "lsr r7, r6, #16\n\t"
  21883. "lsl r6, r6, #16\n\t"
  21884. "adds r3, r3, r6\n\t"
  21885. "adcs r4, r4, r7\n\t"
  21886. "adc r5, r5, #0\n\t"
  21887. #else
  21888. "umull r6, r7, r11, r9\n\t"
  21889. "adds r3, r3, r6\n\t"
  21890. "adcs r4, r4, r7\n\t"
  21891. "adc r5, r5, #0\n\t"
  21892. #endif
  21893. /* A[8] * B[7] */
  21894. "ldr r8, [%[a], #32]\n\t"
  21895. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21896. "lsl r6, r8, #16\n\t"
  21897. "lsl r7, r12, #16\n\t"
  21898. "lsr r6, r6, #16\n\t"
  21899. "lsr r7, r7, #16\n\t"
  21900. "mul r7, r6, r7\n\t"
  21901. "adds r3, r3, r7\n\t"
  21902. "adcs r4, r4, #0\n\t"
  21903. "adc r5, r5, #0\n\t"
  21904. "lsr r7, r12, #16\n\t"
  21905. "mul r6, r7, r6\n\t"
  21906. "lsr r7, r6, #16\n\t"
  21907. "lsl r6, r6, #16\n\t"
  21908. "adds r3, r3, r6\n\t"
  21909. "adcs r4, r4, r7\n\t"
  21910. "adc r5, r5, #0\n\t"
  21911. "lsr r6, r8, #16\n\t"
  21912. "lsr r7, r12, #16\n\t"
  21913. "mul r7, r6, r7\n\t"
  21914. "adds r4, r4, r7\n\t"
  21915. "adc r5, r5, #0\n\t"
  21916. "lsl r7, r12, #16\n\t"
  21917. "lsr r7, r7, #16\n\t"
  21918. "mul r6, r7, r6\n\t"
  21919. "lsr r7, r6, #16\n\t"
  21920. "lsl r6, r6, #16\n\t"
  21921. "adds r3, r3, r6\n\t"
  21922. "adcs r4, r4, r7\n\t"
  21923. "adc r5, r5, #0\n\t"
  21924. #else
  21925. "umull r6, r7, r8, r12\n\t"
  21926. "adds r3, r3, r6\n\t"
  21927. "adcs r4, r4, r7\n\t"
  21928. "adc r5, r5, #0\n\t"
  21929. #endif
  21930. /* A[9] * B[6] */
  21931. "ldr r8, [%[a], #36]\n\t"
  21932. "ldr r9, [%[b], #24]\n\t"
  21933. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21934. "lsl r6, r8, #16\n\t"
  21935. "lsl r7, r9, #16\n\t"
  21936. "lsr r6, r6, #16\n\t"
  21937. "lsr r7, r7, #16\n\t"
  21938. "mul r7, r6, r7\n\t"
  21939. "adds r3, r3, r7\n\t"
  21940. "adcs r4, r4, #0\n\t"
  21941. "adc r5, r5, #0\n\t"
  21942. "lsr r7, r9, #16\n\t"
  21943. "mul r6, r7, r6\n\t"
  21944. "lsr r7, r6, #16\n\t"
  21945. "lsl r6, r6, #16\n\t"
  21946. "adds r3, r3, r6\n\t"
  21947. "adcs r4, r4, r7\n\t"
  21948. "adc r5, r5, #0\n\t"
  21949. "lsr r6, r8, #16\n\t"
  21950. "lsr r7, r9, #16\n\t"
  21951. "mul r7, r6, r7\n\t"
  21952. "adds r4, r4, r7\n\t"
  21953. "adc r5, r5, #0\n\t"
  21954. "lsl r7, r9, #16\n\t"
  21955. "lsr r7, r7, #16\n\t"
  21956. "mul r6, r7, r6\n\t"
  21957. "lsr r7, r6, #16\n\t"
  21958. "lsl r6, r6, #16\n\t"
  21959. "adds r3, r3, r6\n\t"
  21960. "adcs r4, r4, r7\n\t"
  21961. "adc r5, r5, #0\n\t"
  21962. #else
  21963. "umull r6, r7, r8, r9\n\t"
  21964. "adds r3, r3, r6\n\t"
  21965. "adcs r4, r4, r7\n\t"
  21966. "adc r5, r5, #0\n\t"
  21967. #endif
  21968. /* A[10] * B[5] */
  21969. "ldr r8, [%[a], #40]\n\t"
  21970. "ldr r9, [%[b], #20]\n\t"
  21971. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  21972. "lsl r6, r8, #16\n\t"
  21973. "lsl r7, r9, #16\n\t"
  21974. "lsr r6, r6, #16\n\t"
  21975. "lsr r7, r7, #16\n\t"
  21976. "mul r7, r6, r7\n\t"
  21977. "adds r3, r3, r7\n\t"
  21978. "adcs r4, r4, #0\n\t"
  21979. "adc r5, r5, #0\n\t"
  21980. "lsr r7, r9, #16\n\t"
  21981. "mul r6, r7, r6\n\t"
  21982. "lsr r7, r6, #16\n\t"
  21983. "lsl r6, r6, #16\n\t"
  21984. "adds r3, r3, r6\n\t"
  21985. "adcs r4, r4, r7\n\t"
  21986. "adc r5, r5, #0\n\t"
  21987. "lsr r6, r8, #16\n\t"
  21988. "lsr r7, r9, #16\n\t"
  21989. "mul r7, r6, r7\n\t"
  21990. "adds r4, r4, r7\n\t"
  21991. "adc r5, r5, #0\n\t"
  21992. "lsl r7, r9, #16\n\t"
  21993. "lsr r7, r7, #16\n\t"
  21994. "mul r6, r7, r6\n\t"
  21995. "lsr r7, r6, #16\n\t"
  21996. "lsl r6, r6, #16\n\t"
  21997. "adds r3, r3, r6\n\t"
  21998. "adcs r4, r4, r7\n\t"
  21999. "adc r5, r5, #0\n\t"
  22000. #else
  22001. "umull r6, r7, r8, r9\n\t"
  22002. "adds r3, r3, r6\n\t"
  22003. "adcs r4, r4, r7\n\t"
  22004. "adc r5, r5, #0\n\t"
  22005. #endif
  22006. /* A[11] * B[4] */
  22007. "ldr r8, [%[a], #44]\n\t"
  22008. "ldr r9, [%[b], #16]\n\t"
  22009. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22010. "lsl r6, r8, #16\n\t"
  22011. "lsl r7, r9, #16\n\t"
  22012. "lsr r6, r6, #16\n\t"
  22013. "lsr r7, r7, #16\n\t"
  22014. "mul r7, r6, r7\n\t"
  22015. "adds r3, r3, r7\n\t"
  22016. "adcs r4, r4, #0\n\t"
  22017. "adc r5, r5, #0\n\t"
  22018. "lsr r7, r9, #16\n\t"
  22019. "mul r6, r7, r6\n\t"
  22020. "lsr r7, r6, #16\n\t"
  22021. "lsl r6, r6, #16\n\t"
  22022. "adds r3, r3, r6\n\t"
  22023. "adcs r4, r4, r7\n\t"
  22024. "adc r5, r5, #0\n\t"
  22025. "lsr r6, r8, #16\n\t"
  22026. "lsr r7, r9, #16\n\t"
  22027. "mul r7, r6, r7\n\t"
  22028. "adds r4, r4, r7\n\t"
  22029. "adc r5, r5, #0\n\t"
  22030. "lsl r7, r9, #16\n\t"
  22031. "lsr r7, r7, #16\n\t"
  22032. "mul r6, r7, r6\n\t"
  22033. "lsr r7, r6, #16\n\t"
  22034. "lsl r6, r6, #16\n\t"
  22035. "adds r3, r3, r6\n\t"
  22036. "adcs r4, r4, r7\n\t"
  22037. "adc r5, r5, #0\n\t"
  22038. #else
  22039. "umull r6, r7, r8, r9\n\t"
  22040. "adds r3, r3, r6\n\t"
  22041. "adcs r4, r4, r7\n\t"
  22042. "adc r5, r5, #0\n\t"
  22043. #endif
  22044. "str r3, [%[r], #60]\n\t"
  22045. /* A[11] * B[5] */
  22046. "ldr r9, [%[b], #20]\n\t"
  22047. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22048. "lsl r6, r8, #16\n\t"
  22049. "lsl r7, r9, #16\n\t"
  22050. "lsr r6, r6, #16\n\t"
  22051. "lsr r7, r7, #16\n\t"
  22052. "mul r7, r6, r7\n\t"
  22053. "adds r4, r4, r7\n\t"
  22054. "adcs r5, r5, #0\n\t"
  22055. "mov r3, #0\n\t"
  22056. "adc r3, r3, #0\n\t"
  22057. "lsr r7, r9, #16\n\t"
  22058. "mul r6, r7, r6\n\t"
  22059. "lsr r7, r6, #16\n\t"
  22060. "lsl r6, r6, #16\n\t"
  22061. "adds r4, r4, r6\n\t"
  22062. "adcs r5, r5, r7\n\t"
  22063. "adc r3, r3, #0\n\t"
  22064. "lsr r6, r8, #16\n\t"
  22065. "lsr r7, r9, #16\n\t"
  22066. "mul r7, r6, r7\n\t"
  22067. "adds r5, r5, r7\n\t"
  22068. "adc r3, r3, #0\n\t"
  22069. "lsl r7, r9, #16\n\t"
  22070. "lsr r7, r7, #16\n\t"
  22071. "mul r6, r7, r6\n\t"
  22072. "lsr r7, r6, #16\n\t"
  22073. "lsl r6, r6, #16\n\t"
  22074. "adds r4, r4, r6\n\t"
  22075. "adcs r5, r5, r7\n\t"
  22076. "adc r3, r3, #0\n\t"
  22077. #else
  22078. "umull r6, r7, r8, r9\n\t"
  22079. "adds r4, r4, r6\n\t"
  22080. "adcs r5, r5, r7\n\t"
  22081. "mov r3, #0\n\t"
  22082. "adc r3, r3, #0\n\t"
  22083. #endif
  22084. /* A[10] * B[6] */
  22085. "ldr r8, [%[a], #40]\n\t"
  22086. "ldr r9, [%[b], #24]\n\t"
  22087. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22088. "lsl r6, r8, #16\n\t"
  22089. "lsl r7, r9, #16\n\t"
  22090. "lsr r6, r6, #16\n\t"
  22091. "lsr r7, r7, #16\n\t"
  22092. "mul r7, r6, r7\n\t"
  22093. "adds r4, r4, r7\n\t"
  22094. "adcs r5, r5, #0\n\t"
  22095. "adc r3, r3, #0\n\t"
  22096. "lsr r7, r9, #16\n\t"
  22097. "mul r6, r7, r6\n\t"
  22098. "lsr r7, r6, #16\n\t"
  22099. "lsl r6, r6, #16\n\t"
  22100. "adds r4, r4, r6\n\t"
  22101. "adcs r5, r5, r7\n\t"
  22102. "adc r3, r3, #0\n\t"
  22103. "lsr r6, r8, #16\n\t"
  22104. "lsr r7, r9, #16\n\t"
  22105. "mul r7, r6, r7\n\t"
  22106. "adds r5, r5, r7\n\t"
  22107. "adc r3, r3, #0\n\t"
  22108. "lsl r7, r9, #16\n\t"
  22109. "lsr r7, r7, #16\n\t"
  22110. "mul r6, r7, r6\n\t"
  22111. "lsr r7, r6, #16\n\t"
  22112. "lsl r6, r6, #16\n\t"
  22113. "adds r4, r4, r6\n\t"
  22114. "adcs r5, r5, r7\n\t"
  22115. "adc r3, r3, #0\n\t"
  22116. #else
  22117. "umull r6, r7, r8, r9\n\t"
  22118. "adds r4, r4, r6\n\t"
  22119. "adcs r5, r5, r7\n\t"
  22120. "adc r3, r3, #0\n\t"
  22121. #endif
  22122. /* A[9] * B[7] */
  22123. "ldr r8, [%[a], #36]\n\t"
  22124. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22125. "lsl r6, r8, #16\n\t"
  22126. "lsl r7, r12, #16\n\t"
  22127. "lsr r6, r6, #16\n\t"
  22128. "lsr r7, r7, #16\n\t"
  22129. "mul r7, r6, r7\n\t"
  22130. "adds r4, r4, r7\n\t"
  22131. "adcs r5, r5, #0\n\t"
  22132. "adc r3, r3, #0\n\t"
  22133. "lsr r7, r12, #16\n\t"
  22134. "mul r6, r7, r6\n\t"
  22135. "lsr r7, r6, #16\n\t"
  22136. "lsl r6, r6, #16\n\t"
  22137. "adds r4, r4, r6\n\t"
  22138. "adcs r5, r5, r7\n\t"
  22139. "adc r3, r3, #0\n\t"
  22140. "lsr r6, r8, #16\n\t"
  22141. "lsr r7, r12, #16\n\t"
  22142. "mul r7, r6, r7\n\t"
  22143. "adds r5, r5, r7\n\t"
  22144. "adc r3, r3, #0\n\t"
  22145. "lsl r7, r12, #16\n\t"
  22146. "lsr r7, r7, #16\n\t"
  22147. "mul r6, r7, r6\n\t"
  22148. "lsr r7, r6, #16\n\t"
  22149. "lsl r6, r6, #16\n\t"
  22150. "adds r4, r4, r6\n\t"
  22151. "adcs r5, r5, r7\n\t"
  22152. "adc r3, r3, #0\n\t"
  22153. #else
  22154. "umull r6, r7, r8, r12\n\t"
  22155. "adds r4, r4, r6\n\t"
  22156. "adcs r5, r5, r7\n\t"
  22157. "adc r3, r3, #0\n\t"
  22158. #endif
  22159. /* A[8] * B[8] */
  22160. "ldr r11, [%[a], #32]\n\t"
  22161. "ldr r12, [%[b], #32]\n\t"
  22162. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22163. "lsl r6, r11, #16\n\t"
  22164. "lsl r7, r12, #16\n\t"
  22165. "lsr r6, r6, #16\n\t"
  22166. "lsr r7, r7, #16\n\t"
  22167. "mul r7, r6, r7\n\t"
  22168. "adds r4, r4, r7\n\t"
  22169. "adcs r5, r5, #0\n\t"
  22170. "adc r3, r3, #0\n\t"
  22171. "lsr r7, r12, #16\n\t"
  22172. "mul r6, r7, r6\n\t"
  22173. "lsr r7, r6, #16\n\t"
  22174. "lsl r6, r6, #16\n\t"
  22175. "adds r4, r4, r6\n\t"
  22176. "adcs r5, r5, r7\n\t"
  22177. "adc r3, r3, #0\n\t"
  22178. "lsr r6, r11, #16\n\t"
  22179. "lsr r7, r12, #16\n\t"
  22180. "mul r7, r6, r7\n\t"
  22181. "adds r5, r5, r7\n\t"
  22182. "adc r3, r3, #0\n\t"
  22183. "lsl r7, r12, #16\n\t"
  22184. "lsr r7, r7, #16\n\t"
  22185. "mul r6, r7, r6\n\t"
  22186. "lsr r7, r6, #16\n\t"
  22187. "lsl r6, r6, #16\n\t"
  22188. "adds r4, r4, r6\n\t"
  22189. "adcs r5, r5, r7\n\t"
  22190. "adc r3, r3, #0\n\t"
  22191. #else
  22192. "umull r6, r7, r11, r12\n\t"
  22193. "adds r4, r4, r6\n\t"
  22194. "adcs r5, r5, r7\n\t"
  22195. "adc r3, r3, #0\n\t"
  22196. #endif
  22197. /* A[7] * B[9] */
  22198. "ldr r8, [%[a], #28]\n\t"
  22199. "ldr r9, [%[b], #36]\n\t"
  22200. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22201. "lsl r6, r8, #16\n\t"
  22202. "lsl r7, r9, #16\n\t"
  22203. "lsr r6, r6, #16\n\t"
  22204. "lsr r7, r7, #16\n\t"
  22205. "mul r7, r6, r7\n\t"
  22206. "adds r4, r4, r7\n\t"
  22207. "adcs r5, r5, #0\n\t"
  22208. "adc r3, r3, #0\n\t"
  22209. "lsr r7, r9, #16\n\t"
  22210. "mul r6, r7, r6\n\t"
  22211. "lsr r7, r6, #16\n\t"
  22212. "lsl r6, r6, #16\n\t"
  22213. "adds r4, r4, r6\n\t"
  22214. "adcs r5, r5, r7\n\t"
  22215. "adc r3, r3, #0\n\t"
  22216. "lsr r6, r8, #16\n\t"
  22217. "lsr r7, r9, #16\n\t"
  22218. "mul r7, r6, r7\n\t"
  22219. "adds r5, r5, r7\n\t"
  22220. "adc r3, r3, #0\n\t"
  22221. "lsl r7, r9, #16\n\t"
  22222. "lsr r7, r7, #16\n\t"
  22223. "mul r6, r7, r6\n\t"
  22224. "lsr r7, r6, #16\n\t"
  22225. "lsl r6, r6, #16\n\t"
  22226. "adds r4, r4, r6\n\t"
  22227. "adcs r5, r5, r7\n\t"
  22228. "adc r3, r3, #0\n\t"
  22229. #else
  22230. "umull r6, r7, r8, r9\n\t"
  22231. "adds r4, r4, r6\n\t"
  22232. "adcs r5, r5, r7\n\t"
  22233. "adc r3, r3, #0\n\t"
  22234. #endif
  22235. /* A[6] * B[10] */
  22236. "ldr r8, [%[a], #24]\n\t"
  22237. "ldr r9, [%[b], #40]\n\t"
  22238. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22239. "lsl r6, r8, #16\n\t"
  22240. "lsl r7, r9, #16\n\t"
  22241. "lsr r6, r6, #16\n\t"
  22242. "lsr r7, r7, #16\n\t"
  22243. "mul r7, r6, r7\n\t"
  22244. "adds r4, r4, r7\n\t"
  22245. "adcs r5, r5, #0\n\t"
  22246. "adc r3, r3, #0\n\t"
  22247. "lsr r7, r9, #16\n\t"
  22248. "mul r6, r7, r6\n\t"
  22249. "lsr r7, r6, #16\n\t"
  22250. "lsl r6, r6, #16\n\t"
  22251. "adds r4, r4, r6\n\t"
  22252. "adcs r5, r5, r7\n\t"
  22253. "adc r3, r3, #0\n\t"
  22254. "lsr r6, r8, #16\n\t"
  22255. "lsr r7, r9, #16\n\t"
  22256. "mul r7, r6, r7\n\t"
  22257. "adds r5, r5, r7\n\t"
  22258. "adc r3, r3, #0\n\t"
  22259. "lsl r7, r9, #16\n\t"
  22260. "lsr r7, r7, #16\n\t"
  22261. "mul r6, r7, r6\n\t"
  22262. "lsr r7, r6, #16\n\t"
  22263. "lsl r6, r6, #16\n\t"
  22264. "adds r4, r4, r6\n\t"
  22265. "adcs r5, r5, r7\n\t"
  22266. "adc r3, r3, #0\n\t"
  22267. #else
  22268. "umull r6, r7, r8, r9\n\t"
  22269. "adds r4, r4, r6\n\t"
  22270. "adcs r5, r5, r7\n\t"
  22271. "adc r3, r3, #0\n\t"
  22272. #endif
  22273. /* A[5] * B[11] */
  22274. "ldr r8, [%[a], #20]\n\t"
  22275. "ldr r9, [%[b], #44]\n\t"
  22276. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22277. "lsl r6, r8, #16\n\t"
  22278. "lsl r7, r9, #16\n\t"
  22279. "lsr r6, r6, #16\n\t"
  22280. "lsr r7, r7, #16\n\t"
  22281. "mul r7, r6, r7\n\t"
  22282. "adds r4, r4, r7\n\t"
  22283. "adcs r5, r5, #0\n\t"
  22284. "adc r3, r3, #0\n\t"
  22285. "lsr r7, r9, #16\n\t"
  22286. "mul r6, r7, r6\n\t"
  22287. "lsr r7, r6, #16\n\t"
  22288. "lsl r6, r6, #16\n\t"
  22289. "adds r4, r4, r6\n\t"
  22290. "adcs r5, r5, r7\n\t"
  22291. "adc r3, r3, #0\n\t"
  22292. "lsr r6, r8, #16\n\t"
  22293. "lsr r7, r9, #16\n\t"
  22294. "mul r7, r6, r7\n\t"
  22295. "adds r5, r5, r7\n\t"
  22296. "adc r3, r3, #0\n\t"
  22297. "lsl r7, r9, #16\n\t"
  22298. "lsr r7, r7, #16\n\t"
  22299. "mul r6, r7, r6\n\t"
  22300. "lsr r7, r6, #16\n\t"
  22301. "lsl r6, r6, #16\n\t"
  22302. "adds r4, r4, r6\n\t"
  22303. "adcs r5, r5, r7\n\t"
  22304. "adc r3, r3, #0\n\t"
  22305. #else
  22306. "umull r6, r7, r8, r9\n\t"
  22307. "adds r4, r4, r6\n\t"
  22308. "adcs r5, r5, r7\n\t"
  22309. "adc r3, r3, #0\n\t"
  22310. #endif
  22311. "str r4, [%[r], #64]\n\t"
  22312. /* A[6] * B[11] */
  22313. "ldr r8, [%[a], #24]\n\t"
  22314. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22315. "lsl r6, r8, #16\n\t"
  22316. "lsl r7, r9, #16\n\t"
  22317. "lsr r6, r6, #16\n\t"
  22318. "lsr r7, r7, #16\n\t"
  22319. "mul r7, r6, r7\n\t"
  22320. "adds r5, r5, r7\n\t"
  22321. "adcs r3, r3, #0\n\t"
  22322. "mov r4, #0\n\t"
  22323. "adc r4, r4, #0\n\t"
  22324. "lsr r7, r9, #16\n\t"
  22325. "mul r6, r7, r6\n\t"
  22326. "lsr r7, r6, #16\n\t"
  22327. "lsl r6, r6, #16\n\t"
  22328. "adds r5, r5, r6\n\t"
  22329. "adcs r3, r3, r7\n\t"
  22330. "adc r4, r4, #0\n\t"
  22331. "lsr r6, r8, #16\n\t"
  22332. "lsr r7, r9, #16\n\t"
  22333. "mul r7, r6, r7\n\t"
  22334. "adds r3, r3, r7\n\t"
  22335. "adc r4, r4, #0\n\t"
  22336. "lsl r7, r9, #16\n\t"
  22337. "lsr r7, r7, #16\n\t"
  22338. "mul r6, r7, r6\n\t"
  22339. "lsr r7, r6, #16\n\t"
  22340. "lsl r6, r6, #16\n\t"
  22341. "adds r5, r5, r6\n\t"
  22342. "adcs r3, r3, r7\n\t"
  22343. "adc r4, r4, #0\n\t"
  22344. #else
  22345. "umull r6, r7, r8, r9\n\t"
  22346. "adds r5, r5, r6\n\t"
  22347. "adcs r3, r3, r7\n\t"
  22348. "mov r4, #0\n\t"
  22349. "adc r4, r4, #0\n\t"
  22350. #endif
  22351. /* A[7] * B[10] */
  22352. "ldr r8, [%[a], #28]\n\t"
  22353. "ldr r9, [%[b], #40]\n\t"
  22354. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22355. "lsl r6, r8, #16\n\t"
  22356. "lsl r7, r9, #16\n\t"
  22357. "lsr r6, r6, #16\n\t"
  22358. "lsr r7, r7, #16\n\t"
  22359. "mul r7, r6, r7\n\t"
  22360. "adds r5, r5, r7\n\t"
  22361. "adcs r3, r3, #0\n\t"
  22362. "adc r4, r4, #0\n\t"
  22363. "lsr r7, r9, #16\n\t"
  22364. "mul r6, r7, r6\n\t"
  22365. "lsr r7, r6, #16\n\t"
  22366. "lsl r6, r6, #16\n\t"
  22367. "adds r5, r5, r6\n\t"
  22368. "adcs r3, r3, r7\n\t"
  22369. "adc r4, r4, #0\n\t"
  22370. "lsr r6, r8, #16\n\t"
  22371. "lsr r7, r9, #16\n\t"
  22372. "mul r7, r6, r7\n\t"
  22373. "adds r3, r3, r7\n\t"
  22374. "adc r4, r4, #0\n\t"
  22375. "lsl r7, r9, #16\n\t"
  22376. "lsr r7, r7, #16\n\t"
  22377. "mul r6, r7, r6\n\t"
  22378. "lsr r7, r6, #16\n\t"
  22379. "lsl r6, r6, #16\n\t"
  22380. "adds r5, r5, r6\n\t"
  22381. "adcs r3, r3, r7\n\t"
  22382. "adc r4, r4, #0\n\t"
  22383. #else
  22384. "umull r6, r7, r8, r9\n\t"
  22385. "adds r5, r5, r6\n\t"
  22386. "adcs r3, r3, r7\n\t"
  22387. "adc r4, r4, #0\n\t"
  22388. #endif
  22389. /* A[8] * B[9] */
  22390. "ldr r9, [%[b], #36]\n\t"
  22391. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22392. "lsl r6, r11, #16\n\t"
  22393. "lsl r7, r9, #16\n\t"
  22394. "lsr r6, r6, #16\n\t"
  22395. "lsr r7, r7, #16\n\t"
  22396. "mul r7, r6, r7\n\t"
  22397. "adds r5, r5, r7\n\t"
  22398. "adcs r3, r3, #0\n\t"
  22399. "adc r4, r4, #0\n\t"
  22400. "lsr r7, r9, #16\n\t"
  22401. "mul r6, r7, r6\n\t"
  22402. "lsr r7, r6, #16\n\t"
  22403. "lsl r6, r6, #16\n\t"
  22404. "adds r5, r5, r6\n\t"
  22405. "adcs r3, r3, r7\n\t"
  22406. "adc r4, r4, #0\n\t"
  22407. "lsr r6, r11, #16\n\t"
  22408. "lsr r7, r9, #16\n\t"
  22409. "mul r7, r6, r7\n\t"
  22410. "adds r3, r3, r7\n\t"
  22411. "adc r4, r4, #0\n\t"
  22412. "lsl r7, r9, #16\n\t"
  22413. "lsr r7, r7, #16\n\t"
  22414. "mul r6, r7, r6\n\t"
  22415. "lsr r7, r6, #16\n\t"
  22416. "lsl r6, r6, #16\n\t"
  22417. "adds r5, r5, r6\n\t"
  22418. "adcs r3, r3, r7\n\t"
  22419. "adc r4, r4, #0\n\t"
  22420. #else
  22421. "umull r6, r7, r11, r9\n\t"
  22422. "adds r5, r5, r6\n\t"
  22423. "adcs r3, r3, r7\n\t"
  22424. "adc r4, r4, #0\n\t"
  22425. #endif
  22426. /* A[9] * B[8] */
  22427. "ldr r8, [%[a], #36]\n\t"
  22428. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22429. "lsl r6, r8, #16\n\t"
  22430. "lsl r7, r12, #16\n\t"
  22431. "lsr r6, r6, #16\n\t"
  22432. "lsr r7, r7, #16\n\t"
  22433. "mul r7, r6, r7\n\t"
  22434. "adds r5, r5, r7\n\t"
  22435. "adcs r3, r3, #0\n\t"
  22436. "adc r4, r4, #0\n\t"
  22437. "lsr r7, r12, #16\n\t"
  22438. "mul r6, r7, r6\n\t"
  22439. "lsr r7, r6, #16\n\t"
  22440. "lsl r6, r6, #16\n\t"
  22441. "adds r5, r5, r6\n\t"
  22442. "adcs r3, r3, r7\n\t"
  22443. "adc r4, r4, #0\n\t"
  22444. "lsr r6, r8, #16\n\t"
  22445. "lsr r7, r12, #16\n\t"
  22446. "mul r7, r6, r7\n\t"
  22447. "adds r3, r3, r7\n\t"
  22448. "adc r4, r4, #0\n\t"
  22449. "lsl r7, r12, #16\n\t"
  22450. "lsr r7, r7, #16\n\t"
  22451. "mul r6, r7, r6\n\t"
  22452. "lsr r7, r6, #16\n\t"
  22453. "lsl r6, r6, #16\n\t"
  22454. "adds r5, r5, r6\n\t"
  22455. "adcs r3, r3, r7\n\t"
  22456. "adc r4, r4, #0\n\t"
  22457. #else
  22458. "umull r6, r7, r8, r12\n\t"
  22459. "adds r5, r5, r6\n\t"
  22460. "adcs r3, r3, r7\n\t"
  22461. "adc r4, r4, #0\n\t"
  22462. #endif
  22463. /* A[10] * B[7] */
  22464. "ldr r8, [%[a], #40]\n\t"
  22465. "ldr r9, [%[b], #28]\n\t"
  22466. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22467. "lsl r6, r8, #16\n\t"
  22468. "lsl r7, r9, #16\n\t"
  22469. "lsr r6, r6, #16\n\t"
  22470. "lsr r7, r7, #16\n\t"
  22471. "mul r7, r6, r7\n\t"
  22472. "adds r5, r5, r7\n\t"
  22473. "adcs r3, r3, #0\n\t"
  22474. "adc r4, r4, #0\n\t"
  22475. "lsr r7, r9, #16\n\t"
  22476. "mul r6, r7, r6\n\t"
  22477. "lsr r7, r6, #16\n\t"
  22478. "lsl r6, r6, #16\n\t"
  22479. "adds r5, r5, r6\n\t"
  22480. "adcs r3, r3, r7\n\t"
  22481. "adc r4, r4, #0\n\t"
  22482. "lsr r6, r8, #16\n\t"
  22483. "lsr r7, r9, #16\n\t"
  22484. "mul r7, r6, r7\n\t"
  22485. "adds r3, r3, r7\n\t"
  22486. "adc r4, r4, #0\n\t"
  22487. "lsl r7, r9, #16\n\t"
  22488. "lsr r7, r7, #16\n\t"
  22489. "mul r6, r7, r6\n\t"
  22490. "lsr r7, r6, #16\n\t"
  22491. "lsl r6, r6, #16\n\t"
  22492. "adds r5, r5, r6\n\t"
  22493. "adcs r3, r3, r7\n\t"
  22494. "adc r4, r4, #0\n\t"
  22495. #else
  22496. "umull r6, r7, r8, r9\n\t"
  22497. "adds r5, r5, r6\n\t"
  22498. "adcs r3, r3, r7\n\t"
  22499. "adc r4, r4, #0\n\t"
  22500. #endif
  22501. /* A[11] * B[6] */
  22502. "ldr r8, [%[a], #44]\n\t"
  22503. "ldr r9, [%[b], #24]\n\t"
  22504. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22505. "lsl r6, r8, #16\n\t"
  22506. "lsl r7, r9, #16\n\t"
  22507. "lsr r6, r6, #16\n\t"
  22508. "lsr r7, r7, #16\n\t"
  22509. "mul r7, r6, r7\n\t"
  22510. "adds r5, r5, r7\n\t"
  22511. "adcs r3, r3, #0\n\t"
  22512. "adc r4, r4, #0\n\t"
  22513. "lsr r7, r9, #16\n\t"
  22514. "mul r6, r7, r6\n\t"
  22515. "lsr r7, r6, #16\n\t"
  22516. "lsl r6, r6, #16\n\t"
  22517. "adds r5, r5, r6\n\t"
  22518. "adcs r3, r3, r7\n\t"
  22519. "adc r4, r4, #0\n\t"
  22520. "lsr r6, r8, #16\n\t"
  22521. "lsr r7, r9, #16\n\t"
  22522. "mul r7, r6, r7\n\t"
  22523. "adds r3, r3, r7\n\t"
  22524. "adc r4, r4, #0\n\t"
  22525. "lsl r7, r9, #16\n\t"
  22526. "lsr r7, r7, #16\n\t"
  22527. "mul r6, r7, r6\n\t"
  22528. "lsr r7, r6, #16\n\t"
  22529. "lsl r6, r6, #16\n\t"
  22530. "adds r5, r5, r6\n\t"
  22531. "adcs r3, r3, r7\n\t"
  22532. "adc r4, r4, #0\n\t"
  22533. #else
  22534. "umull r6, r7, r8, r9\n\t"
  22535. "adds r5, r5, r6\n\t"
  22536. "adcs r3, r3, r7\n\t"
  22537. "adc r4, r4, #0\n\t"
  22538. #endif
  22539. "str r5, [%[r], #68]\n\t"
  22540. /* A[11] * B[7] */
  22541. "ldr r9, [%[b], #28]\n\t"
  22542. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22543. "lsl r6, r8, #16\n\t"
  22544. "lsl r7, r9, #16\n\t"
  22545. "lsr r6, r6, #16\n\t"
  22546. "lsr r7, r7, #16\n\t"
  22547. "mul r7, r6, r7\n\t"
  22548. "adds r3, r3, r7\n\t"
  22549. "adcs r4, r4, #0\n\t"
  22550. "mov r5, #0\n\t"
  22551. "adc r5, r5, #0\n\t"
  22552. "lsr r7, r9, #16\n\t"
  22553. "mul r6, r7, r6\n\t"
  22554. "lsr r7, r6, #16\n\t"
  22555. "lsl r6, r6, #16\n\t"
  22556. "adds r3, r3, r6\n\t"
  22557. "adcs r4, r4, r7\n\t"
  22558. "adc r5, r5, #0\n\t"
  22559. "lsr r6, r8, #16\n\t"
  22560. "lsr r7, r9, #16\n\t"
  22561. "mul r7, r6, r7\n\t"
  22562. "adds r4, r4, r7\n\t"
  22563. "adc r5, r5, #0\n\t"
  22564. "lsl r7, r9, #16\n\t"
  22565. "lsr r7, r7, #16\n\t"
  22566. "mul r6, r7, r6\n\t"
  22567. "lsr r7, r6, #16\n\t"
  22568. "lsl r6, r6, #16\n\t"
  22569. "adds r3, r3, r6\n\t"
  22570. "adcs r4, r4, r7\n\t"
  22571. "adc r5, r5, #0\n\t"
  22572. #else
  22573. "umull r6, r7, r8, r9\n\t"
  22574. "adds r3, r3, r6\n\t"
  22575. "adcs r4, r4, r7\n\t"
  22576. "mov r5, #0\n\t"
  22577. "adc r5, r5, #0\n\t"
  22578. #endif
  22579. /* A[10] * B[8] */
  22580. "ldr r8, [%[a], #40]\n\t"
  22581. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22582. "lsl r6, r8, #16\n\t"
  22583. "lsl r7, r12, #16\n\t"
  22584. "lsr r6, r6, #16\n\t"
  22585. "lsr r7, r7, #16\n\t"
  22586. "mul r7, r6, r7\n\t"
  22587. "adds r3, r3, r7\n\t"
  22588. "adcs r4, r4, #0\n\t"
  22589. "adc r5, r5, #0\n\t"
  22590. "lsr r7, r12, #16\n\t"
  22591. "mul r6, r7, r6\n\t"
  22592. "lsr r7, r6, #16\n\t"
  22593. "lsl r6, r6, #16\n\t"
  22594. "adds r3, r3, r6\n\t"
  22595. "adcs r4, r4, r7\n\t"
  22596. "adc r5, r5, #0\n\t"
  22597. "lsr r6, r8, #16\n\t"
  22598. "lsr r7, r12, #16\n\t"
  22599. "mul r7, r6, r7\n\t"
  22600. "adds r4, r4, r7\n\t"
  22601. "adc r5, r5, #0\n\t"
  22602. "lsl r7, r12, #16\n\t"
  22603. "lsr r7, r7, #16\n\t"
  22604. "mul r6, r7, r6\n\t"
  22605. "lsr r7, r6, #16\n\t"
  22606. "lsl r6, r6, #16\n\t"
  22607. "adds r3, r3, r6\n\t"
  22608. "adcs r4, r4, r7\n\t"
  22609. "adc r5, r5, #0\n\t"
  22610. #else
  22611. "umull r6, r7, r8, r12\n\t"
  22612. "adds r3, r3, r6\n\t"
  22613. "adcs r4, r4, r7\n\t"
  22614. "adc r5, r5, #0\n\t"
  22615. #endif
  22616. /* A[9] * B[9] */
  22617. "ldr r11, [%[a], #36]\n\t"
  22618. "ldr r12, [%[b], #36]\n\t"
  22619. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22620. "lsl r6, r11, #16\n\t"
  22621. "lsl r7, r12, #16\n\t"
  22622. "lsr r6, r6, #16\n\t"
  22623. "lsr r7, r7, #16\n\t"
  22624. "mul r7, r6, r7\n\t"
  22625. "adds r3, r3, r7\n\t"
  22626. "adcs r4, r4, #0\n\t"
  22627. "adc r5, r5, #0\n\t"
  22628. "lsr r7, r12, #16\n\t"
  22629. "mul r6, r7, r6\n\t"
  22630. "lsr r7, r6, #16\n\t"
  22631. "lsl r6, r6, #16\n\t"
  22632. "adds r3, r3, r6\n\t"
  22633. "adcs r4, r4, r7\n\t"
  22634. "adc r5, r5, #0\n\t"
  22635. "lsr r6, r11, #16\n\t"
  22636. "lsr r7, r12, #16\n\t"
  22637. "mul r7, r6, r7\n\t"
  22638. "adds r4, r4, r7\n\t"
  22639. "adc r5, r5, #0\n\t"
  22640. "lsl r7, r12, #16\n\t"
  22641. "lsr r7, r7, #16\n\t"
  22642. "mul r6, r7, r6\n\t"
  22643. "lsr r7, r6, #16\n\t"
  22644. "lsl r6, r6, #16\n\t"
  22645. "adds r3, r3, r6\n\t"
  22646. "adcs r4, r4, r7\n\t"
  22647. "adc r5, r5, #0\n\t"
  22648. #else
  22649. "umull r6, r7, r11, r12\n\t"
  22650. "adds r3, r3, r6\n\t"
  22651. "adcs r4, r4, r7\n\t"
  22652. "adc r5, r5, #0\n\t"
  22653. #endif
  22654. /* A[8] * B[10] */
  22655. "ldr r8, [%[a], #32]\n\t"
  22656. "ldr r9, [%[b], #40]\n\t"
  22657. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22658. "lsl r6, r8, #16\n\t"
  22659. "lsl r7, r9, #16\n\t"
  22660. "lsr r6, r6, #16\n\t"
  22661. "lsr r7, r7, #16\n\t"
  22662. "mul r7, r6, r7\n\t"
  22663. "adds r3, r3, r7\n\t"
  22664. "adcs r4, r4, #0\n\t"
  22665. "adc r5, r5, #0\n\t"
  22666. "lsr r7, r9, #16\n\t"
  22667. "mul r6, r7, r6\n\t"
  22668. "lsr r7, r6, #16\n\t"
  22669. "lsl r6, r6, #16\n\t"
  22670. "adds r3, r3, r6\n\t"
  22671. "adcs r4, r4, r7\n\t"
  22672. "adc r5, r5, #0\n\t"
  22673. "lsr r6, r8, #16\n\t"
  22674. "lsr r7, r9, #16\n\t"
  22675. "mul r7, r6, r7\n\t"
  22676. "adds r4, r4, r7\n\t"
  22677. "adc r5, r5, #0\n\t"
  22678. "lsl r7, r9, #16\n\t"
  22679. "lsr r7, r7, #16\n\t"
  22680. "mul r6, r7, r6\n\t"
  22681. "lsr r7, r6, #16\n\t"
  22682. "lsl r6, r6, #16\n\t"
  22683. "adds r3, r3, r6\n\t"
  22684. "adcs r4, r4, r7\n\t"
  22685. "adc r5, r5, #0\n\t"
  22686. #else
  22687. "umull r6, r7, r8, r9\n\t"
  22688. "adds r3, r3, r6\n\t"
  22689. "adcs r4, r4, r7\n\t"
  22690. "adc r5, r5, #0\n\t"
  22691. #endif
  22692. /* A[7] * B[11] */
  22693. "ldr r8, [%[a], #28]\n\t"
  22694. "ldr r9, [%[b], #44]\n\t"
  22695. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22696. "lsl r6, r8, #16\n\t"
  22697. "lsl r7, r9, #16\n\t"
  22698. "lsr r6, r6, #16\n\t"
  22699. "lsr r7, r7, #16\n\t"
  22700. "mul r7, r6, r7\n\t"
  22701. "adds r3, r3, r7\n\t"
  22702. "adcs r4, r4, #0\n\t"
  22703. "adc r5, r5, #0\n\t"
  22704. "lsr r7, r9, #16\n\t"
  22705. "mul r6, r7, r6\n\t"
  22706. "lsr r7, r6, #16\n\t"
  22707. "lsl r6, r6, #16\n\t"
  22708. "adds r3, r3, r6\n\t"
  22709. "adcs r4, r4, r7\n\t"
  22710. "adc r5, r5, #0\n\t"
  22711. "lsr r6, r8, #16\n\t"
  22712. "lsr r7, r9, #16\n\t"
  22713. "mul r7, r6, r7\n\t"
  22714. "adds r4, r4, r7\n\t"
  22715. "adc r5, r5, #0\n\t"
  22716. "lsl r7, r9, #16\n\t"
  22717. "lsr r7, r7, #16\n\t"
  22718. "mul r6, r7, r6\n\t"
  22719. "lsr r7, r6, #16\n\t"
  22720. "lsl r6, r6, #16\n\t"
  22721. "adds r3, r3, r6\n\t"
  22722. "adcs r4, r4, r7\n\t"
  22723. "adc r5, r5, #0\n\t"
  22724. #else
  22725. "umull r6, r7, r8, r9\n\t"
  22726. "adds r3, r3, r6\n\t"
  22727. "adcs r4, r4, r7\n\t"
  22728. "adc r5, r5, #0\n\t"
  22729. #endif
  22730. "str r3, [%[r], #72]\n\t"
  22731. /* A[8] * B[11] */
  22732. "ldr r8, [%[a], #32]\n\t"
  22733. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22734. "lsl r6, r8, #16\n\t"
  22735. "lsl r7, r9, #16\n\t"
  22736. "lsr r6, r6, #16\n\t"
  22737. "lsr r7, r7, #16\n\t"
  22738. "mul r7, r6, r7\n\t"
  22739. "adds r4, r4, r7\n\t"
  22740. "adcs r5, r5, #0\n\t"
  22741. "mov r3, #0\n\t"
  22742. "adc r3, r3, #0\n\t"
  22743. "lsr r7, r9, #16\n\t"
  22744. "mul r6, r7, r6\n\t"
  22745. "lsr r7, r6, #16\n\t"
  22746. "lsl r6, r6, #16\n\t"
  22747. "adds r4, r4, r6\n\t"
  22748. "adcs r5, r5, r7\n\t"
  22749. "adc r3, r3, #0\n\t"
  22750. "lsr r6, r8, #16\n\t"
  22751. "lsr r7, r9, #16\n\t"
  22752. "mul r7, r6, r7\n\t"
  22753. "adds r5, r5, r7\n\t"
  22754. "adc r3, r3, #0\n\t"
  22755. "lsl r7, r9, #16\n\t"
  22756. "lsr r7, r7, #16\n\t"
  22757. "mul r6, r7, r6\n\t"
  22758. "lsr r7, r6, #16\n\t"
  22759. "lsl r6, r6, #16\n\t"
  22760. "adds r4, r4, r6\n\t"
  22761. "adcs r5, r5, r7\n\t"
  22762. "adc r3, r3, #0\n\t"
  22763. #else
  22764. "umull r6, r7, r8, r9\n\t"
  22765. "adds r4, r4, r6\n\t"
  22766. "adcs r5, r5, r7\n\t"
  22767. "mov r3, #0\n\t"
  22768. "adc r3, r3, #0\n\t"
  22769. #endif
  22770. /* A[9] * B[10] */
  22771. "ldr r9, [%[b], #40]\n\t"
  22772. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22773. "lsl r6, r11, #16\n\t"
  22774. "lsl r7, r9, #16\n\t"
  22775. "lsr r6, r6, #16\n\t"
  22776. "lsr r7, r7, #16\n\t"
  22777. "mul r7, r6, r7\n\t"
  22778. "adds r4, r4, r7\n\t"
  22779. "adcs r5, r5, #0\n\t"
  22780. "adc r3, r3, #0\n\t"
  22781. "lsr r7, r9, #16\n\t"
  22782. "mul r6, r7, r6\n\t"
  22783. "lsr r7, r6, #16\n\t"
  22784. "lsl r6, r6, #16\n\t"
  22785. "adds r4, r4, r6\n\t"
  22786. "adcs r5, r5, r7\n\t"
  22787. "adc r3, r3, #0\n\t"
  22788. "lsr r6, r11, #16\n\t"
  22789. "lsr r7, r9, #16\n\t"
  22790. "mul r7, r6, r7\n\t"
  22791. "adds r5, r5, r7\n\t"
  22792. "adc r3, r3, #0\n\t"
  22793. "lsl r7, r9, #16\n\t"
  22794. "lsr r7, r7, #16\n\t"
  22795. "mul r6, r7, r6\n\t"
  22796. "lsr r7, r6, #16\n\t"
  22797. "lsl r6, r6, #16\n\t"
  22798. "adds r4, r4, r6\n\t"
  22799. "adcs r5, r5, r7\n\t"
  22800. "adc r3, r3, #0\n\t"
  22801. #else
  22802. "umull r6, r7, r11, r9\n\t"
  22803. "adds r4, r4, r6\n\t"
  22804. "adcs r5, r5, r7\n\t"
  22805. "adc r3, r3, #0\n\t"
  22806. #endif
  22807. /* A[10] * B[9] */
  22808. "ldr r8, [%[a], #40]\n\t"
  22809. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22810. "lsl r6, r8, #16\n\t"
  22811. "lsl r7, r12, #16\n\t"
  22812. "lsr r6, r6, #16\n\t"
  22813. "lsr r7, r7, #16\n\t"
  22814. "mul r7, r6, r7\n\t"
  22815. "adds r4, r4, r7\n\t"
  22816. "adcs r5, r5, #0\n\t"
  22817. "adc r3, r3, #0\n\t"
  22818. "lsr r7, r12, #16\n\t"
  22819. "mul r6, r7, r6\n\t"
  22820. "lsr r7, r6, #16\n\t"
  22821. "lsl r6, r6, #16\n\t"
  22822. "adds r4, r4, r6\n\t"
  22823. "adcs r5, r5, r7\n\t"
  22824. "adc r3, r3, #0\n\t"
  22825. "lsr r6, r8, #16\n\t"
  22826. "lsr r7, r12, #16\n\t"
  22827. "mul r7, r6, r7\n\t"
  22828. "adds r5, r5, r7\n\t"
  22829. "adc r3, r3, #0\n\t"
  22830. "lsl r7, r12, #16\n\t"
  22831. "lsr r7, r7, #16\n\t"
  22832. "mul r6, r7, r6\n\t"
  22833. "lsr r7, r6, #16\n\t"
  22834. "lsl r6, r6, #16\n\t"
  22835. "adds r4, r4, r6\n\t"
  22836. "adcs r5, r5, r7\n\t"
  22837. "adc r3, r3, #0\n\t"
  22838. #else
  22839. "umull r6, r7, r8, r12\n\t"
  22840. "adds r4, r4, r6\n\t"
  22841. "adcs r5, r5, r7\n\t"
  22842. "adc r3, r3, #0\n\t"
  22843. #endif
  22844. /* A[11] * B[8] */
  22845. "ldr r8, [%[a], #44]\n\t"
  22846. "ldr r9, [%[b], #32]\n\t"
  22847. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22848. "lsl r6, r8, #16\n\t"
  22849. "lsl r7, r9, #16\n\t"
  22850. "lsr r6, r6, #16\n\t"
  22851. "lsr r7, r7, #16\n\t"
  22852. "mul r7, r6, r7\n\t"
  22853. "adds r4, r4, r7\n\t"
  22854. "adcs r5, r5, #0\n\t"
  22855. "adc r3, r3, #0\n\t"
  22856. "lsr r7, r9, #16\n\t"
  22857. "mul r6, r7, r6\n\t"
  22858. "lsr r7, r6, #16\n\t"
  22859. "lsl r6, r6, #16\n\t"
  22860. "adds r4, r4, r6\n\t"
  22861. "adcs r5, r5, r7\n\t"
  22862. "adc r3, r3, #0\n\t"
  22863. "lsr r6, r8, #16\n\t"
  22864. "lsr r7, r9, #16\n\t"
  22865. "mul r7, r6, r7\n\t"
  22866. "adds r5, r5, r7\n\t"
  22867. "adc r3, r3, #0\n\t"
  22868. "lsl r7, r9, #16\n\t"
  22869. "lsr r7, r7, #16\n\t"
  22870. "mul r6, r7, r6\n\t"
  22871. "lsr r7, r6, #16\n\t"
  22872. "lsl r6, r6, #16\n\t"
  22873. "adds r4, r4, r6\n\t"
  22874. "adcs r5, r5, r7\n\t"
  22875. "adc r3, r3, #0\n\t"
  22876. #else
  22877. "umull r6, r7, r8, r9\n\t"
  22878. "adds r4, r4, r6\n\t"
  22879. "adcs r5, r5, r7\n\t"
  22880. "adc r3, r3, #0\n\t"
  22881. #endif
  22882. "str r4, [%[r], #76]\n\t"
  22883. /* A[11] * B[9] */
  22884. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22885. "lsl r6, r8, #16\n\t"
  22886. "lsl r7, r12, #16\n\t"
  22887. "lsr r6, r6, #16\n\t"
  22888. "lsr r7, r7, #16\n\t"
  22889. "mul r7, r6, r7\n\t"
  22890. "adds r5, r5, r7\n\t"
  22891. "adcs r3, r3, #0\n\t"
  22892. "mov r4, #0\n\t"
  22893. "adc r4, r4, #0\n\t"
  22894. "lsr r7, r12, #16\n\t"
  22895. "mul r6, r7, r6\n\t"
  22896. "lsr r7, r6, #16\n\t"
  22897. "lsl r6, r6, #16\n\t"
  22898. "adds r5, r5, r6\n\t"
  22899. "adcs r3, r3, r7\n\t"
  22900. "adc r4, r4, #0\n\t"
  22901. "lsr r6, r8, #16\n\t"
  22902. "lsr r7, r12, #16\n\t"
  22903. "mul r7, r6, r7\n\t"
  22904. "adds r3, r3, r7\n\t"
  22905. "adc r4, r4, #0\n\t"
  22906. "lsl r7, r12, #16\n\t"
  22907. "lsr r7, r7, #16\n\t"
  22908. "mul r6, r7, r6\n\t"
  22909. "lsr r7, r6, #16\n\t"
  22910. "lsl r6, r6, #16\n\t"
  22911. "adds r5, r5, r6\n\t"
  22912. "adcs r3, r3, r7\n\t"
  22913. "adc r4, r4, #0\n\t"
  22914. #else
  22915. "umull r6, r7, r8, r12\n\t"
  22916. "adds r5, r5, r6\n\t"
  22917. "adcs r3, r3, r7\n\t"
  22918. "mov r4, #0\n\t"
  22919. "adc r4, r4, #0\n\t"
  22920. #endif
  22921. /* A[10] * B[10] */
  22922. "ldr r11, [%[a], #40]\n\t"
  22923. "ldr r12, [%[b], #40]\n\t"
  22924. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22925. "lsl r6, r11, #16\n\t"
  22926. "lsl r7, r12, #16\n\t"
  22927. "lsr r6, r6, #16\n\t"
  22928. "lsr r7, r7, #16\n\t"
  22929. "mul r7, r6, r7\n\t"
  22930. "adds r5, r5, r7\n\t"
  22931. "adcs r3, r3, #0\n\t"
  22932. "adc r4, r4, #0\n\t"
  22933. "lsr r7, r12, #16\n\t"
  22934. "mul r6, r7, r6\n\t"
  22935. "lsr r7, r6, #16\n\t"
  22936. "lsl r6, r6, #16\n\t"
  22937. "adds r5, r5, r6\n\t"
  22938. "adcs r3, r3, r7\n\t"
  22939. "adc r4, r4, #0\n\t"
  22940. "lsr r6, r11, #16\n\t"
  22941. "lsr r7, r12, #16\n\t"
  22942. "mul r7, r6, r7\n\t"
  22943. "adds r3, r3, r7\n\t"
  22944. "adc r4, r4, #0\n\t"
  22945. "lsl r7, r12, #16\n\t"
  22946. "lsr r7, r7, #16\n\t"
  22947. "mul r6, r7, r6\n\t"
  22948. "lsr r7, r6, #16\n\t"
  22949. "lsl r6, r6, #16\n\t"
  22950. "adds r5, r5, r6\n\t"
  22951. "adcs r3, r3, r7\n\t"
  22952. "adc r4, r4, #0\n\t"
  22953. #else
  22954. "umull r6, r7, r11, r12\n\t"
  22955. "adds r5, r5, r6\n\t"
  22956. "adcs r3, r3, r7\n\t"
  22957. "adc r4, r4, #0\n\t"
  22958. #endif
  22959. /* A[9] * B[11] */
  22960. "ldr r8, [%[a], #36]\n\t"
  22961. "ldr r9, [%[b], #44]\n\t"
  22962. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  22963. "lsl r6, r8, #16\n\t"
  22964. "lsl r7, r9, #16\n\t"
  22965. "lsr r6, r6, #16\n\t"
  22966. "lsr r7, r7, #16\n\t"
  22967. "mul r7, r6, r7\n\t"
  22968. "adds r5, r5, r7\n\t"
  22969. "adcs r3, r3, #0\n\t"
  22970. "adc r4, r4, #0\n\t"
  22971. "lsr r7, r9, #16\n\t"
  22972. "mul r6, r7, r6\n\t"
  22973. "lsr r7, r6, #16\n\t"
  22974. "lsl r6, r6, #16\n\t"
  22975. "adds r5, r5, r6\n\t"
  22976. "adcs r3, r3, r7\n\t"
  22977. "adc r4, r4, #0\n\t"
  22978. "lsr r6, r8, #16\n\t"
  22979. "lsr r7, r9, #16\n\t"
  22980. "mul r7, r6, r7\n\t"
  22981. "adds r3, r3, r7\n\t"
  22982. "adc r4, r4, #0\n\t"
  22983. "lsl r7, r9, #16\n\t"
  22984. "lsr r7, r7, #16\n\t"
  22985. "mul r6, r7, r6\n\t"
  22986. "lsr r7, r6, #16\n\t"
  22987. "lsl r6, r6, #16\n\t"
  22988. "adds r5, r5, r6\n\t"
  22989. "adcs r3, r3, r7\n\t"
  22990. "adc r4, r4, #0\n\t"
  22991. #else
  22992. "umull r6, r7, r8, r9\n\t"
  22993. "adds r5, r5, r6\n\t"
  22994. "adcs r3, r3, r7\n\t"
  22995. "adc r4, r4, #0\n\t"
  22996. #endif
  22997. "str r5, [%[r], #80]\n\t"
  22998. /* A[10] * B[11] */
  22999. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  23000. "lsl r6, r11, #16\n\t"
  23001. "lsl r7, r9, #16\n\t"
  23002. "lsr r6, r6, #16\n\t"
  23003. "lsr r7, r7, #16\n\t"
  23004. "mul r7, r6, r7\n\t"
  23005. "adds r3, r3, r7\n\t"
  23006. "adcs r4, r4, #0\n\t"
  23007. "mov r5, #0\n\t"
  23008. "adc r5, r5, #0\n\t"
  23009. "lsr r7, r9, #16\n\t"
  23010. "mul r6, r7, r6\n\t"
  23011. "lsr r7, r6, #16\n\t"
  23012. "lsl r6, r6, #16\n\t"
  23013. "adds r3, r3, r6\n\t"
  23014. "adcs r4, r4, r7\n\t"
  23015. "adc r5, r5, #0\n\t"
  23016. "lsr r6, r11, #16\n\t"
  23017. "lsr r7, r9, #16\n\t"
  23018. "mul r7, r6, r7\n\t"
  23019. "adds r4, r4, r7\n\t"
  23020. "adc r5, r5, #0\n\t"
  23021. "lsl r7, r9, #16\n\t"
  23022. "lsr r7, r7, #16\n\t"
  23023. "mul r6, r7, r6\n\t"
  23024. "lsr r7, r6, #16\n\t"
  23025. "lsl r6, r6, #16\n\t"
  23026. "adds r3, r3, r6\n\t"
  23027. "adcs r4, r4, r7\n\t"
  23028. "adc r5, r5, #0\n\t"
  23029. #else
  23030. "umull r6, r7, r11, r9\n\t"
  23031. "adds r3, r3, r6\n\t"
  23032. "adcs r4, r4, r7\n\t"
  23033. "mov r5, #0\n\t"
  23034. "adc r5, r5, #0\n\t"
  23035. #endif
  23036. /* A[11] * B[10] */
  23037. "ldr r8, [%[a], #44]\n\t"
  23038. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  23039. "lsl r6, r8, #16\n\t"
  23040. "lsl r7, r12, #16\n\t"
  23041. "lsr r6, r6, #16\n\t"
  23042. "lsr r7, r7, #16\n\t"
  23043. "mul r7, r6, r7\n\t"
  23044. "adds r3, r3, r7\n\t"
  23045. "adcs r4, r4, #0\n\t"
  23046. "adc r5, r5, #0\n\t"
  23047. "lsr r7, r12, #16\n\t"
  23048. "mul r6, r7, r6\n\t"
  23049. "lsr r7, r6, #16\n\t"
  23050. "lsl r6, r6, #16\n\t"
  23051. "adds r3, r3, r6\n\t"
  23052. "adcs r4, r4, r7\n\t"
  23053. "adc r5, r5, #0\n\t"
  23054. "lsr r6, r8, #16\n\t"
  23055. "lsr r7, r12, #16\n\t"
  23056. "mul r7, r6, r7\n\t"
  23057. "adds r4, r4, r7\n\t"
  23058. "adc r5, r5, #0\n\t"
  23059. "lsl r7, r12, #16\n\t"
  23060. "lsr r7, r7, #16\n\t"
  23061. "mul r6, r7, r6\n\t"
  23062. "lsr r7, r6, #16\n\t"
  23063. "lsl r6, r6, #16\n\t"
  23064. "adds r3, r3, r6\n\t"
  23065. "adcs r4, r4, r7\n\t"
  23066. "adc r5, r5, #0\n\t"
  23067. #else
  23068. "umull r6, r7, r8, r12\n\t"
  23069. "adds r3, r3, r6\n\t"
  23070. "adcs r4, r4, r7\n\t"
  23071. "adc r5, r5, #0\n\t"
  23072. #endif
  23073. "str r3, [%[r], #84]\n\t"
  23074. /* A[11] * B[11] */
  23075. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  23076. "lsl r6, r8, #16\n\t"
  23077. "lsl r7, r9, #16\n\t"
  23078. "lsr r6, r6, #16\n\t"
  23079. "lsr r7, r7, #16\n\t"
  23080. "mul r7, r6, r7\n\t"
  23081. "adds r4, r4, r7\n\t"
  23082. "adc r5, r5, #0\n\t"
  23083. "lsr r7, r9, #16\n\t"
  23084. "mul r6, r7, r6\n\t"
  23085. "lsr r7, r6, #16\n\t"
  23086. "lsl r6, r6, #16\n\t"
  23087. "adds r4, r4, r6\n\t"
  23088. "adc r5, r5, r7\n\t"
  23089. "lsr r6, r8, #16\n\t"
  23090. "lsr r7, r9, #16\n\t"
  23091. "mul r7, r6, r7\n\t"
  23092. "add r5, r5, r7\n\t"
  23093. "lsl r7, r9, #16\n\t"
  23094. "lsr r7, r7, #16\n\t"
  23095. "mul r6, r7, r6\n\t"
  23096. "lsr r7, r6, #16\n\t"
  23097. "lsl r6, r6, #16\n\t"
  23098. "adds r4, r4, r6\n\t"
  23099. "adc r5, r5, r7\n\t"
  23100. #else
  23101. "umull r6, r7, r8, r9\n\t"
  23102. "adds r4, r4, r6\n\t"
  23103. "adc r5, r5, r7\n\t"
  23104. #endif
  23105. "str r4, [%[r], #88]\n\t"
  23106. "str r5, [%[r], #92]\n\t"
  23107. "ldm sp!, {r3, r4, r5, r6}\n\t"
  23108. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23109. "ldm sp!, {r3, r4, r5, r6}\n\t"
  23110. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23111. "ldm sp!, {r3, r4, r5, r6}\n\t"
  23112. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23113. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23114. :
  23115. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  23116. );
  23117. }
  23118. /* Add b to a into r. (r = a + b)
  23119. *
  23120. * r A single precision integer.
  23121. * a A single precision integer.
  23122. * b A single precision integer.
  23123. */
  23124. static sp_digit sp_3072_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  23125. {
  23126. register sp_digit* r asm ("r0") = r_p;
  23127. register const sp_digit* a asm ("r1") = a_p;
  23128. register const sp_digit* b asm ("r2") = b_p;
  23129. __asm__ __volatile__ (
  23130. "mov r12, #0\n\t"
  23131. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23132. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23133. "adds r3, r3, r7\n\t"
  23134. "adcs r4, r4, r8\n\t"
  23135. "adcs r5, r5, r9\n\t"
  23136. "adcs r6, r6, r10\n\t"
  23137. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23138. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23139. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23140. "adcs r3, r3, r7\n\t"
  23141. "adcs r4, r4, r8\n\t"
  23142. "adcs r5, r5, r9\n\t"
  23143. "adcs r6, r6, r10\n\t"
  23144. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23145. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23146. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23147. "adcs r3, r3, r7\n\t"
  23148. "adcs r4, r4, r8\n\t"
  23149. "adcs r5, r5, r9\n\t"
  23150. "adcs r6, r6, r10\n\t"
  23151. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23152. "adc %[r], r12, r12\n\t"
  23153. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23154. :
  23155. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  23156. );
  23157. return (uint32_t)(size_t)r;
  23158. }
  23159. /* Sub b from a into a. (a -= b)
  23160. *
  23161. * a A single precision integer and result.
  23162. * b A single precision integer.
  23163. */
  23164. static sp_digit sp_3072_sub_in_place_24(sp_digit* a_p, const sp_digit* b_p)
  23165. {
  23166. register sp_digit* a asm ("r0") = a_p;
  23167. register const sp_digit* b asm ("r1") = b_p;
  23168. __asm__ __volatile__ (
  23169. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23170. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23171. "subs r2, r2, r6\n\t"
  23172. "sbcs r3, r3, r7\n\t"
  23173. "sbcs r4, r4, r8\n\t"
  23174. "sbcs r5, r5, r9\n\t"
  23175. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23176. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23177. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23178. "sbcs r2, r2, r6\n\t"
  23179. "sbcs r3, r3, r7\n\t"
  23180. "sbcs r4, r4, r8\n\t"
  23181. "sbcs r5, r5, r9\n\t"
  23182. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23183. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23184. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23185. "sbcs r2, r2, r6\n\t"
  23186. "sbcs r3, r3, r7\n\t"
  23187. "sbcs r4, r4, r8\n\t"
  23188. "sbcs r5, r5, r9\n\t"
  23189. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23190. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23191. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23192. "sbcs r2, r2, r6\n\t"
  23193. "sbcs r3, r3, r7\n\t"
  23194. "sbcs r4, r4, r8\n\t"
  23195. "sbcs r5, r5, r9\n\t"
  23196. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23197. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23198. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23199. "sbcs r2, r2, r6\n\t"
  23200. "sbcs r3, r3, r7\n\t"
  23201. "sbcs r4, r4, r8\n\t"
  23202. "sbcs r5, r5, r9\n\t"
  23203. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23204. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23205. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23206. "sbcs r2, r2, r6\n\t"
  23207. "sbcs r3, r3, r7\n\t"
  23208. "sbcs r4, r4, r8\n\t"
  23209. "sbcs r5, r5, r9\n\t"
  23210. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23211. "sbc %[a], r9, r9\n\t"
  23212. : [a] "+r" (a), [b] "+r" (b)
  23213. :
  23214. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  23215. );
  23216. return (uint32_t)(size_t)a;
  23217. }
  23218. /* Add b to a into r. (r = a + b)
  23219. *
  23220. * r A single precision integer.
  23221. * a A single precision integer.
  23222. * b A single precision integer.
  23223. */
  23224. static sp_digit sp_3072_add_24(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  23225. {
  23226. register sp_digit* r asm ("r0") = r_p;
  23227. register const sp_digit* a asm ("r1") = a_p;
  23228. register const sp_digit* b asm ("r2") = b_p;
  23229. __asm__ __volatile__ (
  23230. "mov r12, #0\n\t"
  23231. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23232. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23233. "adds r3, r3, r7\n\t"
  23234. "adcs r4, r4, r8\n\t"
  23235. "adcs r5, r5, r9\n\t"
  23236. "adcs r6, r6, r10\n\t"
  23237. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23238. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23239. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23240. "adcs r3, r3, r7\n\t"
  23241. "adcs r4, r4, r8\n\t"
  23242. "adcs r5, r5, r9\n\t"
  23243. "adcs r6, r6, r10\n\t"
  23244. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23245. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23246. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23247. "adcs r3, r3, r7\n\t"
  23248. "adcs r4, r4, r8\n\t"
  23249. "adcs r5, r5, r9\n\t"
  23250. "adcs r6, r6, r10\n\t"
  23251. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23252. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23253. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23254. "adcs r3, r3, r7\n\t"
  23255. "adcs r4, r4, r8\n\t"
  23256. "adcs r5, r5, r9\n\t"
  23257. "adcs r6, r6, r10\n\t"
  23258. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23259. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23260. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23261. "adcs r3, r3, r7\n\t"
  23262. "adcs r4, r4, r8\n\t"
  23263. "adcs r5, r5, r9\n\t"
  23264. "adcs r6, r6, r10\n\t"
  23265. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23266. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23267. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23268. "adcs r3, r3, r7\n\t"
  23269. "adcs r4, r4, r8\n\t"
  23270. "adcs r5, r5, r9\n\t"
  23271. "adcs r6, r6, r10\n\t"
  23272. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23273. "adc %[r], r12, r12\n\t"
  23274. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23275. :
  23276. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  23277. );
  23278. return (uint32_t)(size_t)r;
  23279. }
  23280. /* AND m into each word of a and store in r.
  23281. *
  23282. * r A single precision integer.
  23283. * a A single precision integer.
  23284. * m Mask to AND against each digit.
  23285. */
  23286. static void sp_3072_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  23287. {
  23288. #ifdef WOLFSSL_SP_SMALL
  23289. int i;
  23290. for (i=0; i<12; i++) {
  23291. r[i] = a[i] & m;
  23292. }
  23293. #else
  23294. r[0] = a[0] & m;
  23295. r[1] = a[1] & m;
  23296. r[2] = a[2] & m;
  23297. r[3] = a[3] & m;
  23298. r[4] = a[4] & m;
  23299. r[5] = a[5] & m;
  23300. r[6] = a[6] & m;
  23301. r[7] = a[7] & m;
  23302. r[8] = a[8] & m;
  23303. r[9] = a[9] & m;
  23304. r[10] = a[10] & m;
  23305. r[11] = a[11] & m;
  23306. #endif
  23307. }
  23308. /* Multiply a and b into r. (r = a * b)
  23309. *
  23310. * r A single precision integer.
  23311. * a A single precision integer.
  23312. * b A single precision integer.
  23313. */
  23314. SP_NOINLINE static void sp_3072_mul_24(sp_digit* r, const sp_digit* a,
  23315. const sp_digit* b)
  23316. {
  23317. sp_digit* z0 = r;
  23318. sp_digit z1[24];
  23319. sp_digit a1[12];
  23320. sp_digit b1[12];
  23321. sp_digit* z2 = r + 24;
  23322. sp_digit u;
  23323. sp_digit ca;
  23324. sp_digit cb;
  23325. ca = sp_3072_add_12(a1, a, &a[12]);
  23326. cb = sp_3072_add_12(b1, b, &b[12]);
  23327. u = ca & cb;
  23328. sp_3072_mul_12(z2, &a[12], &b[12]);
  23329. sp_3072_mul_12(z0, a, b);
  23330. sp_3072_mul_12(z1, a1, b1);
  23331. u += sp_3072_sub_in_place_24(z1, z0);
  23332. u += sp_3072_sub_in_place_24(z1, z2);
  23333. sp_3072_mask_12(a1, a1, 0 - cb);
  23334. u += sp_3072_add_12(z1 + 12, z1 + 12, a1);
  23335. sp_3072_mask_12(b1, b1, 0 - ca);
  23336. u += sp_3072_add_12(z1 + 12, z1 + 12, b1);
  23337. u += sp_3072_add_24(r + 12, r + 12, z1);
  23338. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (12 - 1));
  23339. a1[0] = u;
  23340. (void)sp_3072_add_12(r + 36, r + 36, a1);
  23341. }
  23342. /* Sub b from a into a. (a -= b)
  23343. *
  23344. * a A single precision integer and result.
  23345. * b A single precision integer.
  23346. */
  23347. static sp_digit sp_3072_sub_in_place_48(sp_digit* a_p, const sp_digit* b_p)
  23348. {
  23349. register sp_digit* a asm ("r0") = a_p;
  23350. register const sp_digit* b asm ("r1") = b_p;
  23351. __asm__ __volatile__ (
  23352. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23353. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23354. "subs r2, r2, r6\n\t"
  23355. "sbcs r3, r3, r7\n\t"
  23356. "sbcs r4, r4, r8\n\t"
  23357. "sbcs r5, r5, r9\n\t"
  23358. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23359. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23360. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23361. "sbcs r2, r2, r6\n\t"
  23362. "sbcs r3, r3, r7\n\t"
  23363. "sbcs r4, r4, r8\n\t"
  23364. "sbcs r5, r5, r9\n\t"
  23365. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23366. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23367. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23368. "sbcs r2, r2, r6\n\t"
  23369. "sbcs r3, r3, r7\n\t"
  23370. "sbcs r4, r4, r8\n\t"
  23371. "sbcs r5, r5, r9\n\t"
  23372. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23373. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23374. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23375. "sbcs r2, r2, r6\n\t"
  23376. "sbcs r3, r3, r7\n\t"
  23377. "sbcs r4, r4, r8\n\t"
  23378. "sbcs r5, r5, r9\n\t"
  23379. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23380. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23381. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23382. "sbcs r2, r2, r6\n\t"
  23383. "sbcs r3, r3, r7\n\t"
  23384. "sbcs r4, r4, r8\n\t"
  23385. "sbcs r5, r5, r9\n\t"
  23386. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23387. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23388. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23389. "sbcs r2, r2, r6\n\t"
  23390. "sbcs r3, r3, r7\n\t"
  23391. "sbcs r4, r4, r8\n\t"
  23392. "sbcs r5, r5, r9\n\t"
  23393. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23394. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23395. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23396. "sbcs r2, r2, r6\n\t"
  23397. "sbcs r3, r3, r7\n\t"
  23398. "sbcs r4, r4, r8\n\t"
  23399. "sbcs r5, r5, r9\n\t"
  23400. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23401. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23402. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23403. "sbcs r2, r2, r6\n\t"
  23404. "sbcs r3, r3, r7\n\t"
  23405. "sbcs r4, r4, r8\n\t"
  23406. "sbcs r5, r5, r9\n\t"
  23407. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23408. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23409. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23410. "sbcs r2, r2, r6\n\t"
  23411. "sbcs r3, r3, r7\n\t"
  23412. "sbcs r4, r4, r8\n\t"
  23413. "sbcs r5, r5, r9\n\t"
  23414. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23415. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23416. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23417. "sbcs r2, r2, r6\n\t"
  23418. "sbcs r3, r3, r7\n\t"
  23419. "sbcs r4, r4, r8\n\t"
  23420. "sbcs r5, r5, r9\n\t"
  23421. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23422. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23423. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23424. "sbcs r2, r2, r6\n\t"
  23425. "sbcs r3, r3, r7\n\t"
  23426. "sbcs r4, r4, r8\n\t"
  23427. "sbcs r5, r5, r9\n\t"
  23428. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23429. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23430. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23431. "sbcs r2, r2, r6\n\t"
  23432. "sbcs r3, r3, r7\n\t"
  23433. "sbcs r4, r4, r8\n\t"
  23434. "sbcs r5, r5, r9\n\t"
  23435. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23436. "sbc %[a], r9, r9\n\t"
  23437. : [a] "+r" (a), [b] "+r" (b)
  23438. :
  23439. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  23440. );
  23441. return (uint32_t)(size_t)a;
  23442. }
  23443. /* Add b to a into r. (r = a + b)
  23444. *
  23445. * r A single precision integer.
  23446. * a A single precision integer.
  23447. * b A single precision integer.
  23448. */
  23449. static sp_digit sp_3072_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  23450. {
  23451. register sp_digit* r asm ("r0") = r_p;
  23452. register const sp_digit* a asm ("r1") = a_p;
  23453. register const sp_digit* b asm ("r2") = b_p;
  23454. __asm__ __volatile__ (
  23455. "mov r12, #0\n\t"
  23456. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23457. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23458. "adds r3, r3, r7\n\t"
  23459. "adcs r4, r4, r8\n\t"
  23460. "adcs r5, r5, r9\n\t"
  23461. "adcs r6, r6, r10\n\t"
  23462. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23463. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23464. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23465. "adcs r3, r3, r7\n\t"
  23466. "adcs r4, r4, r8\n\t"
  23467. "adcs r5, r5, r9\n\t"
  23468. "adcs r6, r6, r10\n\t"
  23469. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23470. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23471. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23472. "adcs r3, r3, r7\n\t"
  23473. "adcs r4, r4, r8\n\t"
  23474. "adcs r5, r5, r9\n\t"
  23475. "adcs r6, r6, r10\n\t"
  23476. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23477. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23478. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23479. "adcs r3, r3, r7\n\t"
  23480. "adcs r4, r4, r8\n\t"
  23481. "adcs r5, r5, r9\n\t"
  23482. "adcs r6, r6, r10\n\t"
  23483. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23484. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23485. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23486. "adcs r3, r3, r7\n\t"
  23487. "adcs r4, r4, r8\n\t"
  23488. "adcs r5, r5, r9\n\t"
  23489. "adcs r6, r6, r10\n\t"
  23490. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23491. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23492. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23493. "adcs r3, r3, r7\n\t"
  23494. "adcs r4, r4, r8\n\t"
  23495. "adcs r5, r5, r9\n\t"
  23496. "adcs r6, r6, r10\n\t"
  23497. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23498. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23499. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23500. "adcs r3, r3, r7\n\t"
  23501. "adcs r4, r4, r8\n\t"
  23502. "adcs r5, r5, r9\n\t"
  23503. "adcs r6, r6, r10\n\t"
  23504. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23505. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23506. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23507. "adcs r3, r3, r7\n\t"
  23508. "adcs r4, r4, r8\n\t"
  23509. "adcs r5, r5, r9\n\t"
  23510. "adcs r6, r6, r10\n\t"
  23511. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23512. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23513. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23514. "adcs r3, r3, r7\n\t"
  23515. "adcs r4, r4, r8\n\t"
  23516. "adcs r5, r5, r9\n\t"
  23517. "adcs r6, r6, r10\n\t"
  23518. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23519. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23520. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23521. "adcs r3, r3, r7\n\t"
  23522. "adcs r4, r4, r8\n\t"
  23523. "adcs r5, r5, r9\n\t"
  23524. "adcs r6, r6, r10\n\t"
  23525. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23526. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23527. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23528. "adcs r3, r3, r7\n\t"
  23529. "adcs r4, r4, r8\n\t"
  23530. "adcs r5, r5, r9\n\t"
  23531. "adcs r6, r6, r10\n\t"
  23532. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23533. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23534. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23535. "adcs r3, r3, r7\n\t"
  23536. "adcs r4, r4, r8\n\t"
  23537. "adcs r5, r5, r9\n\t"
  23538. "adcs r6, r6, r10\n\t"
  23539. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23540. "adc %[r], r12, r12\n\t"
  23541. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23542. :
  23543. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  23544. );
  23545. return (uint32_t)(size_t)r;
  23546. }
  23547. /* AND m into each word of a and store in r.
  23548. *
  23549. * r A single precision integer.
  23550. * a A single precision integer.
  23551. * m Mask to AND against each digit.
  23552. */
  23553. static void sp_3072_mask_24(sp_digit* r, const sp_digit* a, sp_digit m)
  23554. {
  23555. #ifdef WOLFSSL_SP_SMALL
  23556. int i;
  23557. for (i=0; i<24; i++) {
  23558. r[i] = a[i] & m;
  23559. }
  23560. #else
  23561. int i;
  23562. for (i = 0; i < 24; i += 8) {
  23563. r[i+0] = a[i+0] & m;
  23564. r[i+1] = a[i+1] & m;
  23565. r[i+2] = a[i+2] & m;
  23566. r[i+3] = a[i+3] & m;
  23567. r[i+4] = a[i+4] & m;
  23568. r[i+5] = a[i+5] & m;
  23569. r[i+6] = a[i+6] & m;
  23570. r[i+7] = a[i+7] & m;
  23571. }
  23572. #endif
  23573. }
  23574. /* Multiply a and b into r. (r = a * b)
  23575. *
  23576. * r A single precision integer.
  23577. * a A single precision integer.
  23578. * b A single precision integer.
  23579. */
  23580. SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
  23581. const sp_digit* b)
  23582. {
  23583. sp_digit* z0 = r;
  23584. sp_digit z1[48];
  23585. sp_digit a1[24];
  23586. sp_digit b1[24];
  23587. sp_digit* z2 = r + 48;
  23588. sp_digit u;
  23589. sp_digit ca;
  23590. sp_digit cb;
  23591. ca = sp_3072_add_24(a1, a, &a[24]);
  23592. cb = sp_3072_add_24(b1, b, &b[24]);
  23593. u = ca & cb;
  23594. sp_3072_mul_24(z2, &a[24], &b[24]);
  23595. sp_3072_mul_24(z0, a, b);
  23596. sp_3072_mul_24(z1, a1, b1);
  23597. u += sp_3072_sub_in_place_48(z1, z0);
  23598. u += sp_3072_sub_in_place_48(z1, z2);
  23599. sp_3072_mask_24(a1, a1, 0 - cb);
  23600. u += sp_3072_add_24(z1 + 24, z1 + 24, a1);
  23601. sp_3072_mask_24(b1, b1, 0 - ca);
  23602. u += sp_3072_add_24(z1 + 24, z1 + 24, b1);
  23603. u += sp_3072_add_48(r + 24, r + 24, z1);
  23604. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (24 - 1));
  23605. a1[0] = u;
  23606. (void)sp_3072_add_24(r + 72, r + 72, a1);
  23607. }
  23608. /* Sub b from a into a. (a -= b)
  23609. *
  23610. * a A single precision integer and result.
  23611. * b A single precision integer.
  23612. */
  23613. static sp_digit sp_3072_sub_in_place_96(sp_digit* a_p, const sp_digit* b_p)
  23614. {
  23615. register sp_digit* a asm ("r0") = a_p;
  23616. register const sp_digit* b asm ("r1") = b_p;
  23617. __asm__ __volatile__ (
  23618. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23619. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23620. "subs r2, r2, r6\n\t"
  23621. "sbcs r3, r3, r7\n\t"
  23622. "sbcs r4, r4, r8\n\t"
  23623. "sbcs r5, r5, r9\n\t"
  23624. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23625. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23626. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23627. "sbcs r2, r2, r6\n\t"
  23628. "sbcs r3, r3, r7\n\t"
  23629. "sbcs r4, r4, r8\n\t"
  23630. "sbcs r5, r5, r9\n\t"
  23631. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23632. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23633. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23634. "sbcs r2, r2, r6\n\t"
  23635. "sbcs r3, r3, r7\n\t"
  23636. "sbcs r4, r4, r8\n\t"
  23637. "sbcs r5, r5, r9\n\t"
  23638. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23639. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23640. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23641. "sbcs r2, r2, r6\n\t"
  23642. "sbcs r3, r3, r7\n\t"
  23643. "sbcs r4, r4, r8\n\t"
  23644. "sbcs r5, r5, r9\n\t"
  23645. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23646. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23647. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23648. "sbcs r2, r2, r6\n\t"
  23649. "sbcs r3, r3, r7\n\t"
  23650. "sbcs r4, r4, r8\n\t"
  23651. "sbcs r5, r5, r9\n\t"
  23652. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23653. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23654. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23655. "sbcs r2, r2, r6\n\t"
  23656. "sbcs r3, r3, r7\n\t"
  23657. "sbcs r4, r4, r8\n\t"
  23658. "sbcs r5, r5, r9\n\t"
  23659. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23660. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23661. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23662. "sbcs r2, r2, r6\n\t"
  23663. "sbcs r3, r3, r7\n\t"
  23664. "sbcs r4, r4, r8\n\t"
  23665. "sbcs r5, r5, r9\n\t"
  23666. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23667. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23668. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23669. "sbcs r2, r2, r6\n\t"
  23670. "sbcs r3, r3, r7\n\t"
  23671. "sbcs r4, r4, r8\n\t"
  23672. "sbcs r5, r5, r9\n\t"
  23673. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23674. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23675. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23676. "sbcs r2, r2, r6\n\t"
  23677. "sbcs r3, r3, r7\n\t"
  23678. "sbcs r4, r4, r8\n\t"
  23679. "sbcs r5, r5, r9\n\t"
  23680. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23681. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23682. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23683. "sbcs r2, r2, r6\n\t"
  23684. "sbcs r3, r3, r7\n\t"
  23685. "sbcs r4, r4, r8\n\t"
  23686. "sbcs r5, r5, r9\n\t"
  23687. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23688. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23689. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23690. "sbcs r2, r2, r6\n\t"
  23691. "sbcs r3, r3, r7\n\t"
  23692. "sbcs r4, r4, r8\n\t"
  23693. "sbcs r5, r5, r9\n\t"
  23694. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23695. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23696. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23697. "sbcs r2, r2, r6\n\t"
  23698. "sbcs r3, r3, r7\n\t"
  23699. "sbcs r4, r4, r8\n\t"
  23700. "sbcs r5, r5, r9\n\t"
  23701. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23702. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23703. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23704. "sbcs r2, r2, r6\n\t"
  23705. "sbcs r3, r3, r7\n\t"
  23706. "sbcs r4, r4, r8\n\t"
  23707. "sbcs r5, r5, r9\n\t"
  23708. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23709. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23710. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23711. "sbcs r2, r2, r6\n\t"
  23712. "sbcs r3, r3, r7\n\t"
  23713. "sbcs r4, r4, r8\n\t"
  23714. "sbcs r5, r5, r9\n\t"
  23715. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23716. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23717. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23718. "sbcs r2, r2, r6\n\t"
  23719. "sbcs r3, r3, r7\n\t"
  23720. "sbcs r4, r4, r8\n\t"
  23721. "sbcs r5, r5, r9\n\t"
  23722. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23723. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23724. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23725. "sbcs r2, r2, r6\n\t"
  23726. "sbcs r3, r3, r7\n\t"
  23727. "sbcs r4, r4, r8\n\t"
  23728. "sbcs r5, r5, r9\n\t"
  23729. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23730. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23731. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23732. "sbcs r2, r2, r6\n\t"
  23733. "sbcs r3, r3, r7\n\t"
  23734. "sbcs r4, r4, r8\n\t"
  23735. "sbcs r5, r5, r9\n\t"
  23736. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23737. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23738. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23739. "sbcs r2, r2, r6\n\t"
  23740. "sbcs r3, r3, r7\n\t"
  23741. "sbcs r4, r4, r8\n\t"
  23742. "sbcs r5, r5, r9\n\t"
  23743. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23744. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23745. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23746. "sbcs r2, r2, r6\n\t"
  23747. "sbcs r3, r3, r7\n\t"
  23748. "sbcs r4, r4, r8\n\t"
  23749. "sbcs r5, r5, r9\n\t"
  23750. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23751. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23752. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23753. "sbcs r2, r2, r6\n\t"
  23754. "sbcs r3, r3, r7\n\t"
  23755. "sbcs r4, r4, r8\n\t"
  23756. "sbcs r5, r5, r9\n\t"
  23757. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23758. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23759. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23760. "sbcs r2, r2, r6\n\t"
  23761. "sbcs r3, r3, r7\n\t"
  23762. "sbcs r4, r4, r8\n\t"
  23763. "sbcs r5, r5, r9\n\t"
  23764. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23765. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23766. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23767. "sbcs r2, r2, r6\n\t"
  23768. "sbcs r3, r3, r7\n\t"
  23769. "sbcs r4, r4, r8\n\t"
  23770. "sbcs r5, r5, r9\n\t"
  23771. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23772. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23773. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23774. "sbcs r2, r2, r6\n\t"
  23775. "sbcs r3, r3, r7\n\t"
  23776. "sbcs r4, r4, r8\n\t"
  23777. "sbcs r5, r5, r9\n\t"
  23778. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23779. "ldm %[a], {r2, r3, r4, r5}\n\t"
  23780. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  23781. "sbcs r2, r2, r6\n\t"
  23782. "sbcs r3, r3, r7\n\t"
  23783. "sbcs r4, r4, r8\n\t"
  23784. "sbcs r5, r5, r9\n\t"
  23785. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  23786. "sbc %[a], r9, r9\n\t"
  23787. : [a] "+r" (a), [b] "+r" (b)
  23788. :
  23789. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  23790. );
  23791. return (uint32_t)(size_t)a;
  23792. }
  23793. /* Add b to a into r. (r = a + b)
  23794. *
  23795. * r A single precision integer.
  23796. * a A single precision integer.
  23797. * b A single precision integer.
  23798. */
  23799. static sp_digit sp_3072_add_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  23800. {
  23801. register sp_digit* r asm ("r0") = r_p;
  23802. register const sp_digit* a asm ("r1") = a_p;
  23803. register const sp_digit* b asm ("r2") = b_p;
  23804. __asm__ __volatile__ (
  23805. "mov r12, #0\n\t"
  23806. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23807. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23808. "adds r3, r3, r7\n\t"
  23809. "adcs r4, r4, r8\n\t"
  23810. "adcs r5, r5, r9\n\t"
  23811. "adcs r6, r6, r10\n\t"
  23812. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23813. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23814. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23815. "adcs r3, r3, r7\n\t"
  23816. "adcs r4, r4, r8\n\t"
  23817. "adcs r5, r5, r9\n\t"
  23818. "adcs r6, r6, r10\n\t"
  23819. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23820. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23821. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23822. "adcs r3, r3, r7\n\t"
  23823. "adcs r4, r4, r8\n\t"
  23824. "adcs r5, r5, r9\n\t"
  23825. "adcs r6, r6, r10\n\t"
  23826. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23827. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23828. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23829. "adcs r3, r3, r7\n\t"
  23830. "adcs r4, r4, r8\n\t"
  23831. "adcs r5, r5, r9\n\t"
  23832. "adcs r6, r6, r10\n\t"
  23833. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23834. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23835. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23836. "adcs r3, r3, r7\n\t"
  23837. "adcs r4, r4, r8\n\t"
  23838. "adcs r5, r5, r9\n\t"
  23839. "adcs r6, r6, r10\n\t"
  23840. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23841. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23842. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23843. "adcs r3, r3, r7\n\t"
  23844. "adcs r4, r4, r8\n\t"
  23845. "adcs r5, r5, r9\n\t"
  23846. "adcs r6, r6, r10\n\t"
  23847. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23848. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23849. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23850. "adcs r3, r3, r7\n\t"
  23851. "adcs r4, r4, r8\n\t"
  23852. "adcs r5, r5, r9\n\t"
  23853. "adcs r6, r6, r10\n\t"
  23854. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23855. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23856. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23857. "adcs r3, r3, r7\n\t"
  23858. "adcs r4, r4, r8\n\t"
  23859. "adcs r5, r5, r9\n\t"
  23860. "adcs r6, r6, r10\n\t"
  23861. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23862. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23863. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23864. "adcs r3, r3, r7\n\t"
  23865. "adcs r4, r4, r8\n\t"
  23866. "adcs r5, r5, r9\n\t"
  23867. "adcs r6, r6, r10\n\t"
  23868. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23869. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23870. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23871. "adcs r3, r3, r7\n\t"
  23872. "adcs r4, r4, r8\n\t"
  23873. "adcs r5, r5, r9\n\t"
  23874. "adcs r6, r6, r10\n\t"
  23875. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23876. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23877. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23878. "adcs r3, r3, r7\n\t"
  23879. "adcs r4, r4, r8\n\t"
  23880. "adcs r5, r5, r9\n\t"
  23881. "adcs r6, r6, r10\n\t"
  23882. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23883. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23884. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23885. "adcs r3, r3, r7\n\t"
  23886. "adcs r4, r4, r8\n\t"
  23887. "adcs r5, r5, r9\n\t"
  23888. "adcs r6, r6, r10\n\t"
  23889. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23890. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23891. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23892. "adcs r3, r3, r7\n\t"
  23893. "adcs r4, r4, r8\n\t"
  23894. "adcs r5, r5, r9\n\t"
  23895. "adcs r6, r6, r10\n\t"
  23896. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23897. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23898. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23899. "adcs r3, r3, r7\n\t"
  23900. "adcs r4, r4, r8\n\t"
  23901. "adcs r5, r5, r9\n\t"
  23902. "adcs r6, r6, r10\n\t"
  23903. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23904. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23905. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23906. "adcs r3, r3, r7\n\t"
  23907. "adcs r4, r4, r8\n\t"
  23908. "adcs r5, r5, r9\n\t"
  23909. "adcs r6, r6, r10\n\t"
  23910. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23911. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23912. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23913. "adcs r3, r3, r7\n\t"
  23914. "adcs r4, r4, r8\n\t"
  23915. "adcs r5, r5, r9\n\t"
  23916. "adcs r6, r6, r10\n\t"
  23917. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23918. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23919. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23920. "adcs r3, r3, r7\n\t"
  23921. "adcs r4, r4, r8\n\t"
  23922. "adcs r5, r5, r9\n\t"
  23923. "adcs r6, r6, r10\n\t"
  23924. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23925. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23926. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23927. "adcs r3, r3, r7\n\t"
  23928. "adcs r4, r4, r8\n\t"
  23929. "adcs r5, r5, r9\n\t"
  23930. "adcs r6, r6, r10\n\t"
  23931. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23932. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23933. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23934. "adcs r3, r3, r7\n\t"
  23935. "adcs r4, r4, r8\n\t"
  23936. "adcs r5, r5, r9\n\t"
  23937. "adcs r6, r6, r10\n\t"
  23938. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23939. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23940. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23941. "adcs r3, r3, r7\n\t"
  23942. "adcs r4, r4, r8\n\t"
  23943. "adcs r5, r5, r9\n\t"
  23944. "adcs r6, r6, r10\n\t"
  23945. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23946. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23947. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23948. "adcs r3, r3, r7\n\t"
  23949. "adcs r4, r4, r8\n\t"
  23950. "adcs r5, r5, r9\n\t"
  23951. "adcs r6, r6, r10\n\t"
  23952. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23953. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23954. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23955. "adcs r3, r3, r7\n\t"
  23956. "adcs r4, r4, r8\n\t"
  23957. "adcs r5, r5, r9\n\t"
  23958. "adcs r6, r6, r10\n\t"
  23959. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23960. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23961. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23962. "adcs r3, r3, r7\n\t"
  23963. "adcs r4, r4, r8\n\t"
  23964. "adcs r5, r5, r9\n\t"
  23965. "adcs r6, r6, r10\n\t"
  23966. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23967. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  23968. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  23969. "adcs r3, r3, r7\n\t"
  23970. "adcs r4, r4, r8\n\t"
  23971. "adcs r5, r5, r9\n\t"
  23972. "adcs r6, r6, r10\n\t"
  23973. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  23974. "adc %[r], r12, r12\n\t"
  23975. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  23976. :
  23977. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  23978. );
  23979. return (uint32_t)(size_t)r;
  23980. }
  23981. /* AND m into each word of a and store in r.
  23982. *
  23983. * r A single precision integer.
  23984. * a A single precision integer.
  23985. * m Mask to AND against each digit.
  23986. */
  23987. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  23988. {
  23989. #ifdef WOLFSSL_SP_SMALL
  23990. int i;
  23991. for (i=0; i<48; i++) {
  23992. r[i] = a[i] & m;
  23993. }
  23994. #else
  23995. int i;
  23996. for (i = 0; i < 48; i += 8) {
  23997. r[i+0] = a[i+0] & m;
  23998. r[i+1] = a[i+1] & m;
  23999. r[i+2] = a[i+2] & m;
  24000. r[i+3] = a[i+3] & m;
  24001. r[i+4] = a[i+4] & m;
  24002. r[i+5] = a[i+5] & m;
  24003. r[i+6] = a[i+6] & m;
  24004. r[i+7] = a[i+7] & m;
  24005. }
  24006. #endif
  24007. }
  24008. /* Multiply a and b into r. (r = a * b)
  24009. *
  24010. * r A single precision integer.
  24011. * a A single precision integer.
  24012. * b A single precision integer.
  24013. */
  24014. SP_NOINLINE static void sp_3072_mul_96(sp_digit* r, const sp_digit* a,
  24015. const sp_digit* b)
  24016. {
  24017. sp_digit* z0 = r;
  24018. sp_digit z1[96];
  24019. sp_digit a1[48];
  24020. sp_digit b1[48];
  24021. sp_digit* z2 = r + 96;
  24022. sp_digit u;
  24023. sp_digit ca;
  24024. sp_digit cb;
  24025. ca = sp_3072_add_48(a1, a, &a[48]);
  24026. cb = sp_3072_add_48(b1, b, &b[48]);
  24027. u = ca & cb;
  24028. sp_3072_mul_48(z2, &a[48], &b[48]);
  24029. sp_3072_mul_48(z0, a, b);
  24030. sp_3072_mul_48(z1, a1, b1);
  24031. u += sp_3072_sub_in_place_96(z1, z0);
  24032. u += sp_3072_sub_in_place_96(z1, z2);
  24033. sp_3072_mask_48(a1, a1, 0 - cb);
  24034. u += sp_3072_add_48(z1 + 48, z1 + 48, a1);
  24035. sp_3072_mask_48(b1, b1, 0 - ca);
  24036. u += sp_3072_add_48(z1 + 48, z1 + 48, b1);
  24037. u += sp_3072_add_96(r + 48, r + 48, z1);
  24038. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (48 - 1));
  24039. a1[0] = u;
  24040. (void)sp_3072_add_48(r + 144, r + 144, a1);
  24041. }
  24042. /* Square a and put result in r. (r = a * a)
  24043. *
  24044. * r A single precision integer.
  24045. * a A single precision integer.
  24046. */
  24047. static void sp_3072_sqr_12(sp_digit* r_p, const sp_digit* a_p)
  24048. {
  24049. register sp_digit* r asm ("r0") = r_p;
  24050. register const sp_digit* a asm ("r1") = a_p;
  24051. __asm__ __volatile__ (
  24052. "sub sp, sp, #48\n\t"
  24053. /* A[0] * A[0] */
  24054. "ldr r10, [%[a]]\n\t"
  24055. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24056. "lsr r9, r10, #16\n\t"
  24057. "lsl r2, r10, #16\n\t"
  24058. "lsr r2, r2, #16\n\t"
  24059. "mul r8, r2, r2\n\t"
  24060. "mul r3, r9, r9\n\t"
  24061. "mul r2, r9, r2\n\t"
  24062. "lsr r9, r2, #15\n\t"
  24063. "lsl r2, r2, #17\n\t"
  24064. "adds r8, r8, r2\n\t"
  24065. "adc r3, r3, r9\n\t"
  24066. #else
  24067. "umull r8, r3, r10, r10\n\t"
  24068. #endif
  24069. "mov r4, #0\n\t"
  24070. "str r8, [sp]\n\t"
  24071. /* A[0] * A[1] */
  24072. "ldr r10, [%[a], #4]\n\t"
  24073. "ldr r12, [%[a]]\n\t"
  24074. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24075. "lsl r8, r10, #16\n\t"
  24076. "lsl r9, r12, #16\n\t"
  24077. "lsr r8, r8, #16\n\t"
  24078. "lsr r9, r9, #16\n\t"
  24079. "mul r9, r8, r9\n\t"
  24080. "adds r3, r3, r9\n\t"
  24081. "adcs r4, r4, #0\n\t"
  24082. "mov r2, #0\n\t"
  24083. "adc r2, r2, #0\n\t"
  24084. "adds r3, r3, r9\n\t"
  24085. "adcs r4, r4, #0\n\t"
  24086. "adc r2, r2, #0\n\t"
  24087. "lsr r9, r12, #16\n\t"
  24088. "mul r8, r9, r8\n\t"
  24089. "lsr r9, r8, #16\n\t"
  24090. "lsl r8, r8, #16\n\t"
  24091. "adds r3, r3, r8\n\t"
  24092. "adcs r4, r4, r9\n\t"
  24093. "adc r2, r2, #0\n\t"
  24094. "adds r3, r3, r8\n\t"
  24095. "adcs r4, r4, r9\n\t"
  24096. "adc r2, r2, #0\n\t"
  24097. "lsr r8, r10, #16\n\t"
  24098. "lsr r9, r12, #16\n\t"
  24099. "mul r9, r8, r9\n\t"
  24100. "adds r4, r4, r9\n\t"
  24101. "adc r2, r2, #0\n\t"
  24102. "adds r4, r4, r9\n\t"
  24103. "adc r2, r2, #0\n\t"
  24104. "lsl r9, r12, #16\n\t"
  24105. "lsr r9, r9, #16\n\t"
  24106. "mul r8, r9, r8\n\t"
  24107. "lsr r9, r8, #16\n\t"
  24108. "lsl r8, r8, #16\n\t"
  24109. "adds r3, r3, r8\n\t"
  24110. "adcs r4, r4, r9\n\t"
  24111. "adc r2, r2, #0\n\t"
  24112. "adds r3, r3, r8\n\t"
  24113. "adcs r4, r4, r9\n\t"
  24114. "adc r2, r2, #0\n\t"
  24115. #else
  24116. "umull r8, r9, r10, r12\n\t"
  24117. "adds r3, r3, r8\n\t"
  24118. "adcs r4, r4, r9\n\t"
  24119. "mov r2, #0\n\t"
  24120. "adc r2, r2, #0\n\t"
  24121. "adds r3, r3, r8\n\t"
  24122. "adcs r4, r4, r9\n\t"
  24123. "mov r2, #0\n\t"
  24124. "adc r2, r2, #0\n\t"
  24125. #endif
  24126. "str r3, [sp, #4]\n\t"
  24127. /* A[0] * A[2] */
  24128. "ldr r10, [%[a], #8]\n\t"
  24129. "ldr r12, [%[a]]\n\t"
  24130. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24131. "lsl r8, r10, #16\n\t"
  24132. "lsl r9, r12, #16\n\t"
  24133. "lsr r8, r8, #16\n\t"
  24134. "lsr r9, r9, #16\n\t"
  24135. "mul r9, r8, r9\n\t"
  24136. "adds r4, r4, r9\n\t"
  24137. "adcs r2, r2, #0\n\t"
  24138. "mov r3, #0\n\t"
  24139. "adc r3, r3, #0\n\t"
  24140. "adds r4, r4, r9\n\t"
  24141. "adcs r2, r2, #0\n\t"
  24142. "adc r3, r3, #0\n\t"
  24143. "lsr r9, r12, #16\n\t"
  24144. "mul r8, r9, r8\n\t"
  24145. "lsr r9, r8, #16\n\t"
  24146. "lsl r8, r8, #16\n\t"
  24147. "adds r4, r4, r8\n\t"
  24148. "adcs r2, r2, r9\n\t"
  24149. "adc r3, r3, #0\n\t"
  24150. "adds r4, r4, r8\n\t"
  24151. "adcs r2, r2, r9\n\t"
  24152. "adc r3, r3, #0\n\t"
  24153. "lsr r8, r10, #16\n\t"
  24154. "lsr r9, r12, #16\n\t"
  24155. "mul r9, r8, r9\n\t"
  24156. "adds r2, r2, r9\n\t"
  24157. "adc r3, r3, #0\n\t"
  24158. "adds r2, r2, r9\n\t"
  24159. "adc r3, r3, #0\n\t"
  24160. "lsl r9, r12, #16\n\t"
  24161. "lsr r9, r9, #16\n\t"
  24162. "mul r8, r9, r8\n\t"
  24163. "lsr r9, r8, #16\n\t"
  24164. "lsl r8, r8, #16\n\t"
  24165. "adds r4, r4, r8\n\t"
  24166. "adcs r2, r2, r9\n\t"
  24167. "adc r3, r3, #0\n\t"
  24168. "adds r4, r4, r8\n\t"
  24169. "adcs r2, r2, r9\n\t"
  24170. "adc r3, r3, #0\n\t"
  24171. #else
  24172. "umull r8, r9, r10, r12\n\t"
  24173. "adds r4, r4, r8\n\t"
  24174. "adcs r2, r2, r9\n\t"
  24175. "mov r3, #0\n\t"
  24176. "adc r3, r3, #0\n\t"
  24177. "adds r4, r4, r8\n\t"
  24178. "adcs r2, r2, r9\n\t"
  24179. "mov r3, #0\n\t"
  24180. "adc r3, r3, #0\n\t"
  24181. #endif
  24182. /* A[1] * A[1] */
  24183. "ldr r10, [%[a], #4]\n\t"
  24184. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24185. "lsl r8, r10, #16\n\t"
  24186. "lsr r9, r10, #16\n\t"
  24187. "lsr r8, r8, #16\n\t"
  24188. "mov r12, r8\n\t"
  24189. "mul r8, r12, r8\n\t"
  24190. "mov r12, r9\n\t"
  24191. "mul r9, r12, r9\n\t"
  24192. "adds r4, r4, r8\n\t"
  24193. "adcs r2, r2, r9\n\t"
  24194. "adc r3, r3, #0\n\t"
  24195. "lsr r9, r10, #16\n\t"
  24196. "lsl r8, r10, #16\n\t"
  24197. "lsr r8, r8, #16\n\t"
  24198. "mul r8, r9, r8\n\t"
  24199. "lsr r9, r8, #15\n\t"
  24200. "lsl r8, r8, #17\n\t"
  24201. "adds r4, r4, r8\n\t"
  24202. "adcs r2, r2, r9\n\t"
  24203. "adc r3, r3, #0\n\t"
  24204. #else
  24205. "umull r8, r9, r10, r10\n\t"
  24206. "adds r4, r4, r8\n\t"
  24207. "adcs r2, r2, r9\n\t"
  24208. "adc r3, r3, #0\n\t"
  24209. #endif
  24210. "str r4, [sp, #8]\n\t"
  24211. /* A[0] * A[3] */
  24212. "ldr r10, [%[a], #12]\n\t"
  24213. "ldr r12, [%[a]]\n\t"
  24214. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24215. "lsl r8, r10, #16\n\t"
  24216. "lsl r9, r12, #16\n\t"
  24217. "lsr r8, r8, #16\n\t"
  24218. "lsr r9, r9, #16\n\t"
  24219. "mul r9, r8, r9\n\t"
  24220. "adds r2, r2, r9\n\t"
  24221. "adcs r3, r3, #0\n\t"
  24222. "mov r4, #0\n\t"
  24223. "adc r4, r4, #0\n\t"
  24224. "adds r2, r2, r9\n\t"
  24225. "adcs r3, r3, #0\n\t"
  24226. "adc r4, r4, #0\n\t"
  24227. "lsr r9, r12, #16\n\t"
  24228. "mul r8, r9, r8\n\t"
  24229. "lsr r9, r8, #16\n\t"
  24230. "lsl r8, r8, #16\n\t"
  24231. "adds r2, r2, r8\n\t"
  24232. "adcs r3, r3, r9\n\t"
  24233. "adc r4, r4, #0\n\t"
  24234. "adds r2, r2, r8\n\t"
  24235. "adcs r3, r3, r9\n\t"
  24236. "adc r4, r4, #0\n\t"
  24237. "lsr r8, r10, #16\n\t"
  24238. "lsr r9, r12, #16\n\t"
  24239. "mul r9, r8, r9\n\t"
  24240. "adds r3, r3, r9\n\t"
  24241. "adc r4, r4, #0\n\t"
  24242. "adds r3, r3, r9\n\t"
  24243. "adc r4, r4, #0\n\t"
  24244. "lsl r9, r12, #16\n\t"
  24245. "lsr r9, r9, #16\n\t"
  24246. "mul r8, r9, r8\n\t"
  24247. "lsr r9, r8, #16\n\t"
  24248. "lsl r8, r8, #16\n\t"
  24249. "adds r2, r2, r8\n\t"
  24250. "adcs r3, r3, r9\n\t"
  24251. "adc r4, r4, #0\n\t"
  24252. "adds r2, r2, r8\n\t"
  24253. "adcs r3, r3, r9\n\t"
  24254. "adc r4, r4, #0\n\t"
  24255. #else
  24256. "umull r8, r9, r10, r12\n\t"
  24257. "adds r2, r2, r8\n\t"
  24258. "adcs r3, r3, r9\n\t"
  24259. "mov r4, #0\n\t"
  24260. "adc r4, r4, #0\n\t"
  24261. "adds r2, r2, r8\n\t"
  24262. "adcs r3, r3, r9\n\t"
  24263. "mov r4, #0\n\t"
  24264. "adc r4, r4, #0\n\t"
  24265. #endif
  24266. /* A[1] * A[2] */
  24267. "ldr r10, [%[a], #8]\n\t"
  24268. "ldr r12, [%[a], #4]\n\t"
  24269. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24270. "lsl r8, r10, #16\n\t"
  24271. "lsl r9, r12, #16\n\t"
  24272. "lsr r8, r8, #16\n\t"
  24273. "lsr r9, r9, #16\n\t"
  24274. "mul r9, r8, r9\n\t"
  24275. "adds r2, r2, r9\n\t"
  24276. "adcs r3, r3, #0\n\t"
  24277. "adc r4, r4, #0\n\t"
  24278. "adds r2, r2, r9\n\t"
  24279. "adcs r3, r3, #0\n\t"
  24280. "adc r4, r4, #0\n\t"
  24281. "lsr r9, r12, #16\n\t"
  24282. "mul r8, r9, r8\n\t"
  24283. "lsr r9, r8, #16\n\t"
  24284. "lsl r8, r8, #16\n\t"
  24285. "adds r2, r2, r8\n\t"
  24286. "adcs r3, r3, r9\n\t"
  24287. "adc r4, r4, #0\n\t"
  24288. "adds r2, r2, r8\n\t"
  24289. "adcs r3, r3, r9\n\t"
  24290. "adc r4, r4, #0\n\t"
  24291. "lsr r8, r10, #16\n\t"
  24292. "lsr r9, r12, #16\n\t"
  24293. "mul r9, r8, r9\n\t"
  24294. "adds r3, r3, r9\n\t"
  24295. "adc r4, r4, #0\n\t"
  24296. "adds r3, r3, r9\n\t"
  24297. "adc r4, r4, #0\n\t"
  24298. "lsl r9, r12, #16\n\t"
  24299. "lsr r9, r9, #16\n\t"
  24300. "mul r8, r9, r8\n\t"
  24301. "lsr r9, r8, #16\n\t"
  24302. "lsl r8, r8, #16\n\t"
  24303. "adds r2, r2, r8\n\t"
  24304. "adcs r3, r3, r9\n\t"
  24305. "adc r4, r4, #0\n\t"
  24306. "adds r2, r2, r8\n\t"
  24307. "adcs r3, r3, r9\n\t"
  24308. "adc r4, r4, #0\n\t"
  24309. #else
  24310. "umull r8, r9, r10, r12\n\t"
  24311. "adds r2, r2, r8\n\t"
  24312. "adcs r3, r3, r9\n\t"
  24313. "adc r4, r4, #0\n\t"
  24314. "adds r2, r2, r8\n\t"
  24315. "adcs r3, r3, r9\n\t"
  24316. "adc r4, r4, #0\n\t"
  24317. #endif
  24318. "str r2, [sp, #12]\n\t"
  24319. /* A[0] * A[4] */
  24320. "ldr r10, [%[a], #16]\n\t"
  24321. "ldr r12, [%[a]]\n\t"
  24322. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24323. "lsl r8, r10, #16\n\t"
  24324. "lsl r9, r12, #16\n\t"
  24325. "lsr r8, r8, #16\n\t"
  24326. "lsr r9, r9, #16\n\t"
  24327. "mul r9, r8, r9\n\t"
  24328. "adds r3, r3, r9\n\t"
  24329. "adcs r4, r4, #0\n\t"
  24330. "mov r2, #0\n\t"
  24331. "adc r2, r2, #0\n\t"
  24332. "adds r3, r3, r9\n\t"
  24333. "adcs r4, r4, #0\n\t"
  24334. "adc r2, r2, #0\n\t"
  24335. "lsr r9, r12, #16\n\t"
  24336. "mul r8, r9, r8\n\t"
  24337. "lsr r9, r8, #16\n\t"
  24338. "lsl r8, r8, #16\n\t"
  24339. "adds r3, r3, r8\n\t"
  24340. "adcs r4, r4, r9\n\t"
  24341. "adc r2, r2, #0\n\t"
  24342. "adds r3, r3, r8\n\t"
  24343. "adcs r4, r4, r9\n\t"
  24344. "adc r2, r2, #0\n\t"
  24345. "lsr r8, r10, #16\n\t"
  24346. "lsr r9, r12, #16\n\t"
  24347. "mul r9, r8, r9\n\t"
  24348. "adds r4, r4, r9\n\t"
  24349. "adc r2, r2, #0\n\t"
  24350. "adds r4, r4, r9\n\t"
  24351. "adc r2, r2, #0\n\t"
  24352. "lsl r9, r12, #16\n\t"
  24353. "lsr r9, r9, #16\n\t"
  24354. "mul r8, r9, r8\n\t"
  24355. "lsr r9, r8, #16\n\t"
  24356. "lsl r8, r8, #16\n\t"
  24357. "adds r3, r3, r8\n\t"
  24358. "adcs r4, r4, r9\n\t"
  24359. "adc r2, r2, #0\n\t"
  24360. "adds r3, r3, r8\n\t"
  24361. "adcs r4, r4, r9\n\t"
  24362. "adc r2, r2, #0\n\t"
  24363. #else
  24364. "umull r8, r9, r10, r12\n\t"
  24365. "adds r3, r3, r8\n\t"
  24366. "adcs r4, r4, r9\n\t"
  24367. "mov r2, #0\n\t"
  24368. "adc r2, r2, #0\n\t"
  24369. "adds r3, r3, r8\n\t"
  24370. "adcs r4, r4, r9\n\t"
  24371. "mov r2, #0\n\t"
  24372. "adc r2, r2, #0\n\t"
  24373. #endif
  24374. /* A[1] * A[3] */
  24375. "ldr r10, [%[a], #12]\n\t"
  24376. "ldr r12, [%[a], #4]\n\t"
  24377. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24378. "lsl r8, r10, #16\n\t"
  24379. "lsl r9, r12, #16\n\t"
  24380. "lsr r8, r8, #16\n\t"
  24381. "lsr r9, r9, #16\n\t"
  24382. "mul r9, r8, r9\n\t"
  24383. "adds r3, r3, r9\n\t"
  24384. "adcs r4, r4, #0\n\t"
  24385. "adc r2, r2, #0\n\t"
  24386. "adds r3, r3, r9\n\t"
  24387. "adcs r4, r4, #0\n\t"
  24388. "adc r2, r2, #0\n\t"
  24389. "lsr r9, r12, #16\n\t"
  24390. "mul r8, r9, r8\n\t"
  24391. "lsr r9, r8, #16\n\t"
  24392. "lsl r8, r8, #16\n\t"
  24393. "adds r3, r3, r8\n\t"
  24394. "adcs r4, r4, r9\n\t"
  24395. "adc r2, r2, #0\n\t"
  24396. "adds r3, r3, r8\n\t"
  24397. "adcs r4, r4, r9\n\t"
  24398. "adc r2, r2, #0\n\t"
  24399. "lsr r8, r10, #16\n\t"
  24400. "lsr r9, r12, #16\n\t"
  24401. "mul r9, r8, r9\n\t"
  24402. "adds r4, r4, r9\n\t"
  24403. "adc r2, r2, #0\n\t"
  24404. "adds r4, r4, r9\n\t"
  24405. "adc r2, r2, #0\n\t"
  24406. "lsl r9, r12, #16\n\t"
  24407. "lsr r9, r9, #16\n\t"
  24408. "mul r8, r9, r8\n\t"
  24409. "lsr r9, r8, #16\n\t"
  24410. "lsl r8, r8, #16\n\t"
  24411. "adds r3, r3, r8\n\t"
  24412. "adcs r4, r4, r9\n\t"
  24413. "adc r2, r2, #0\n\t"
  24414. "adds r3, r3, r8\n\t"
  24415. "adcs r4, r4, r9\n\t"
  24416. "adc r2, r2, #0\n\t"
  24417. #else
  24418. "umull r8, r9, r10, r12\n\t"
  24419. "adds r3, r3, r8\n\t"
  24420. "adcs r4, r4, r9\n\t"
  24421. "adc r2, r2, #0\n\t"
  24422. "adds r3, r3, r8\n\t"
  24423. "adcs r4, r4, r9\n\t"
  24424. "adc r2, r2, #0\n\t"
  24425. #endif
  24426. /* A[2] * A[2] */
  24427. "ldr r10, [%[a], #8]\n\t"
  24428. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24429. "lsl r8, r10, #16\n\t"
  24430. "lsr r9, r10, #16\n\t"
  24431. "lsr r8, r8, #16\n\t"
  24432. "mov r12, r8\n\t"
  24433. "mul r8, r12, r8\n\t"
  24434. "mov r12, r9\n\t"
  24435. "mul r9, r12, r9\n\t"
  24436. "adds r3, r3, r8\n\t"
  24437. "adcs r4, r4, r9\n\t"
  24438. "adc r2, r2, #0\n\t"
  24439. "lsr r9, r10, #16\n\t"
  24440. "lsl r8, r10, #16\n\t"
  24441. "lsr r8, r8, #16\n\t"
  24442. "mul r8, r9, r8\n\t"
  24443. "lsr r9, r8, #15\n\t"
  24444. "lsl r8, r8, #17\n\t"
  24445. "adds r3, r3, r8\n\t"
  24446. "adcs r4, r4, r9\n\t"
  24447. "adc r2, r2, #0\n\t"
  24448. #else
  24449. "umull r8, r9, r10, r10\n\t"
  24450. "adds r3, r3, r8\n\t"
  24451. "adcs r4, r4, r9\n\t"
  24452. "adc r2, r2, #0\n\t"
  24453. #endif
  24454. "str r3, [sp, #16]\n\t"
  24455. /* A[0] * A[5] */
  24456. "ldr r10, [%[a], #20]\n\t"
  24457. "ldr r12, [%[a]]\n\t"
  24458. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24459. "lsl r8, r10, #16\n\t"
  24460. "lsl r5, r12, #16\n\t"
  24461. "lsr r8, r8, #16\n\t"
  24462. "lsr r5, r5, #16\n\t"
  24463. "mul r5, r8, r5\n\t"
  24464. "lsr r9, r12, #16\n\t"
  24465. "mul r8, r9, r8\n\t"
  24466. "lsr r6, r8, #16\n\t"
  24467. "lsl r8, r8, #16\n\t"
  24468. "adds r5, r5, r8\n\t"
  24469. "adc r6, r6, #0\n\t"
  24470. "lsr r8, r10, #16\n\t"
  24471. "mul r9, r8, r9\n\t"
  24472. "add r6, r6, r9\n\t"
  24473. "lsl r9, r12, #16\n\t"
  24474. "lsr r9, r9, #16\n\t"
  24475. "mul r8, r9, r8\n\t"
  24476. "lsr r9, r8, #16\n\t"
  24477. "lsl r8, r8, #16\n\t"
  24478. "adds r5, r5, r8\n\t"
  24479. "adc r6, r6, r9\n\t"
  24480. #else
  24481. "umull r5, r6, r10, r12\n\t"
  24482. #endif
  24483. "mov r3, #0\n\t"
  24484. "mov r7, #0\n\t"
  24485. /* A[1] * A[4] */
  24486. "ldr r10, [%[a], #16]\n\t"
  24487. "ldr r12, [%[a], #4]\n\t"
  24488. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24489. "lsl r8, r10, #16\n\t"
  24490. "lsl r9, r12, #16\n\t"
  24491. "lsr r8, r8, #16\n\t"
  24492. "lsr r9, r9, #16\n\t"
  24493. "mul r9, r8, r9\n\t"
  24494. "adds r5, r5, r9\n\t"
  24495. "adcs r6, r6, #0\n\t"
  24496. "adc r7, r7, #0\n\t"
  24497. "lsr r9, r12, #16\n\t"
  24498. "mul r8, r9, r8\n\t"
  24499. "lsr r9, r8, #16\n\t"
  24500. "lsl r8, r8, #16\n\t"
  24501. "adds r5, r5, r8\n\t"
  24502. "adcs r6, r6, r9\n\t"
  24503. "adc r7, r7, #0\n\t"
  24504. "lsr r8, r10, #16\n\t"
  24505. "lsr r9, r12, #16\n\t"
  24506. "mul r9, r8, r9\n\t"
  24507. "adds r6, r6, r9\n\t"
  24508. "adc r7, r7, #0\n\t"
  24509. "lsl r9, r12, #16\n\t"
  24510. "lsr r9, r9, #16\n\t"
  24511. "mul r8, r9, r8\n\t"
  24512. "lsr r9, r8, #16\n\t"
  24513. "lsl r8, r8, #16\n\t"
  24514. "adds r5, r5, r8\n\t"
  24515. "adcs r6, r6, r9\n\t"
  24516. "adc r7, r7, #0\n\t"
  24517. #else
  24518. "umull r8, r9, r10, r12\n\t"
  24519. "adds r5, r5, r8\n\t"
  24520. "adcs r6, r6, r9\n\t"
  24521. "adc r7, r7, #0\n\t"
  24522. #endif
  24523. /* A[2] * A[3] */
  24524. "ldr r10, [%[a], #12]\n\t"
  24525. "ldr r12, [%[a], #8]\n\t"
  24526. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24527. "lsl r8, r10, #16\n\t"
  24528. "lsl r9, r12, #16\n\t"
  24529. "lsr r8, r8, #16\n\t"
  24530. "lsr r9, r9, #16\n\t"
  24531. "mul r9, r8, r9\n\t"
  24532. "adds r5, r5, r9\n\t"
  24533. "adcs r6, r6, #0\n\t"
  24534. "adc r7, r7, #0\n\t"
  24535. "lsr r9, r12, #16\n\t"
  24536. "mul r8, r9, r8\n\t"
  24537. "lsr r9, r8, #16\n\t"
  24538. "lsl r8, r8, #16\n\t"
  24539. "adds r5, r5, r8\n\t"
  24540. "adcs r6, r6, r9\n\t"
  24541. "adc r7, r7, #0\n\t"
  24542. "lsr r8, r10, #16\n\t"
  24543. "lsr r9, r12, #16\n\t"
  24544. "mul r9, r8, r9\n\t"
  24545. "adds r6, r6, r9\n\t"
  24546. "adc r7, r7, #0\n\t"
  24547. "lsl r9, r12, #16\n\t"
  24548. "lsr r9, r9, #16\n\t"
  24549. "mul r8, r9, r8\n\t"
  24550. "lsr r9, r8, #16\n\t"
  24551. "lsl r8, r8, #16\n\t"
  24552. "adds r5, r5, r8\n\t"
  24553. "adcs r6, r6, r9\n\t"
  24554. "adc r7, r7, #0\n\t"
  24555. #else
  24556. "umull r8, r9, r10, r12\n\t"
  24557. "adds r5, r5, r8\n\t"
  24558. "adcs r6, r6, r9\n\t"
  24559. "adc r7, r7, #0\n\t"
  24560. #endif
  24561. "adds r5, r5, r5\n\t"
  24562. "adcs r6, r6, r6\n\t"
  24563. "adc r7, r7, r7\n\t"
  24564. "adds r4, r4, r5\n\t"
  24565. "adcs r2, r2, r6\n\t"
  24566. "adc r3, r3, r7\n\t"
  24567. "str r4, [sp, #20]\n\t"
  24568. /* A[0] * A[6] */
  24569. "ldr r10, [%[a], #24]\n\t"
  24570. "ldr r12, [%[a]]\n\t"
  24571. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24572. "lsl r8, r10, #16\n\t"
  24573. "lsl r5, r12, #16\n\t"
  24574. "lsr r8, r8, #16\n\t"
  24575. "lsr r5, r5, #16\n\t"
  24576. "mul r5, r8, r5\n\t"
  24577. "lsr r9, r12, #16\n\t"
  24578. "mul r8, r9, r8\n\t"
  24579. "lsr r6, r8, #16\n\t"
  24580. "lsl r8, r8, #16\n\t"
  24581. "adds r5, r5, r8\n\t"
  24582. "adc r6, r6, #0\n\t"
  24583. "lsr r8, r10, #16\n\t"
  24584. "mul r9, r8, r9\n\t"
  24585. "add r6, r6, r9\n\t"
  24586. "lsl r9, r12, #16\n\t"
  24587. "lsr r9, r9, #16\n\t"
  24588. "mul r8, r9, r8\n\t"
  24589. "lsr r9, r8, #16\n\t"
  24590. "lsl r8, r8, #16\n\t"
  24591. "adds r5, r5, r8\n\t"
  24592. "adc r6, r6, r9\n\t"
  24593. #else
  24594. "umull r5, r6, r10, r12\n\t"
  24595. #endif
  24596. "mov r4, #0\n\t"
  24597. "mov r7, #0\n\t"
  24598. /* A[1] * A[5] */
  24599. "ldr r10, [%[a], #20]\n\t"
  24600. "ldr r12, [%[a], #4]\n\t"
  24601. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24602. "lsl r8, r10, #16\n\t"
  24603. "lsl r9, r12, #16\n\t"
  24604. "lsr r8, r8, #16\n\t"
  24605. "lsr r9, r9, #16\n\t"
  24606. "mul r9, r8, r9\n\t"
  24607. "adds r5, r5, r9\n\t"
  24608. "adcs r6, r6, #0\n\t"
  24609. "adc r7, r7, #0\n\t"
  24610. "lsr r9, r12, #16\n\t"
  24611. "mul r8, r9, r8\n\t"
  24612. "lsr r9, r8, #16\n\t"
  24613. "lsl r8, r8, #16\n\t"
  24614. "adds r5, r5, r8\n\t"
  24615. "adcs r6, r6, r9\n\t"
  24616. "adc r7, r7, #0\n\t"
  24617. "lsr r8, r10, #16\n\t"
  24618. "lsr r9, r12, #16\n\t"
  24619. "mul r9, r8, r9\n\t"
  24620. "adds r6, r6, r9\n\t"
  24621. "adc r7, r7, #0\n\t"
  24622. "lsl r9, r12, #16\n\t"
  24623. "lsr r9, r9, #16\n\t"
  24624. "mul r8, r9, r8\n\t"
  24625. "lsr r9, r8, #16\n\t"
  24626. "lsl r8, r8, #16\n\t"
  24627. "adds r5, r5, r8\n\t"
  24628. "adcs r6, r6, r9\n\t"
  24629. "adc r7, r7, #0\n\t"
  24630. #else
  24631. "umull r8, r9, r10, r12\n\t"
  24632. "adds r5, r5, r8\n\t"
  24633. "adcs r6, r6, r9\n\t"
  24634. "adc r7, r7, #0\n\t"
  24635. #endif
  24636. /* A[2] * A[4] */
  24637. "ldr r10, [%[a], #16]\n\t"
  24638. "ldr r12, [%[a], #8]\n\t"
  24639. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24640. "lsl r8, r10, #16\n\t"
  24641. "lsl r9, r12, #16\n\t"
  24642. "lsr r8, r8, #16\n\t"
  24643. "lsr r9, r9, #16\n\t"
  24644. "mul r9, r8, r9\n\t"
  24645. "adds r5, r5, r9\n\t"
  24646. "adcs r6, r6, #0\n\t"
  24647. "adc r7, r7, #0\n\t"
  24648. "lsr r9, r12, #16\n\t"
  24649. "mul r8, r9, r8\n\t"
  24650. "lsr r9, r8, #16\n\t"
  24651. "lsl r8, r8, #16\n\t"
  24652. "adds r5, r5, r8\n\t"
  24653. "adcs r6, r6, r9\n\t"
  24654. "adc r7, r7, #0\n\t"
  24655. "lsr r8, r10, #16\n\t"
  24656. "lsr r9, r12, #16\n\t"
  24657. "mul r9, r8, r9\n\t"
  24658. "adds r6, r6, r9\n\t"
  24659. "adc r7, r7, #0\n\t"
  24660. "lsl r9, r12, #16\n\t"
  24661. "lsr r9, r9, #16\n\t"
  24662. "mul r8, r9, r8\n\t"
  24663. "lsr r9, r8, #16\n\t"
  24664. "lsl r8, r8, #16\n\t"
  24665. "adds r5, r5, r8\n\t"
  24666. "adcs r6, r6, r9\n\t"
  24667. "adc r7, r7, #0\n\t"
  24668. #else
  24669. "umull r8, r9, r10, r12\n\t"
  24670. "adds r5, r5, r8\n\t"
  24671. "adcs r6, r6, r9\n\t"
  24672. "adc r7, r7, #0\n\t"
  24673. #endif
  24674. /* A[3] * A[3] */
  24675. "ldr r10, [%[a], #12]\n\t"
  24676. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24677. "lsl r8, r10, #16\n\t"
  24678. "lsr r9, r10, #16\n\t"
  24679. "lsr r8, r8, #16\n\t"
  24680. "mov r12, r8\n\t"
  24681. "mul r8, r12, r8\n\t"
  24682. "mov r12, r9\n\t"
  24683. "mul r9, r12, r9\n\t"
  24684. "adds r2, r2, r8\n\t"
  24685. "adcs r3, r3, r9\n\t"
  24686. "adc r4, r4, #0\n\t"
  24687. "lsr r9, r10, #16\n\t"
  24688. "lsl r8, r10, #16\n\t"
  24689. "lsr r8, r8, #16\n\t"
  24690. "mul r8, r9, r8\n\t"
  24691. "lsr r9, r8, #15\n\t"
  24692. "lsl r8, r8, #17\n\t"
  24693. "adds r2, r2, r8\n\t"
  24694. "adcs r3, r3, r9\n\t"
  24695. "adc r4, r4, #0\n\t"
  24696. "adds r5, r5, r5\n\t"
  24697. "adcs r6, r6, r6\n\t"
  24698. "adc r7, r7, r7\n\t"
  24699. #else
  24700. "umull r8, r9, r10, r10\n\t"
  24701. "adds r5, r5, r5\n\t"
  24702. "adcs r6, r6, r6\n\t"
  24703. "adc r7, r7, r7\n\t"
  24704. "adds r2, r2, r8\n\t"
  24705. "adcs r3, r3, r9\n\t"
  24706. "adc r4, r4, #0\n\t"
  24707. #endif
  24708. "adds r2, r2, r5\n\t"
  24709. "adcs r3, r3, r6\n\t"
  24710. "adc r4, r4, r7\n\t"
  24711. "str r2, [sp, #24]\n\t"
  24712. /* A[0] * A[7] */
  24713. "ldr r10, [%[a], #28]\n\t"
  24714. "ldr r12, [%[a]]\n\t"
  24715. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24716. "lsl r8, r10, #16\n\t"
  24717. "lsl r5, r12, #16\n\t"
  24718. "lsr r8, r8, #16\n\t"
  24719. "lsr r5, r5, #16\n\t"
  24720. "mul r5, r8, r5\n\t"
  24721. "lsr r9, r12, #16\n\t"
  24722. "mul r8, r9, r8\n\t"
  24723. "lsr r6, r8, #16\n\t"
  24724. "lsl r8, r8, #16\n\t"
  24725. "adds r5, r5, r8\n\t"
  24726. "adc r6, r6, #0\n\t"
  24727. "lsr r8, r10, #16\n\t"
  24728. "mul r9, r8, r9\n\t"
  24729. "add r6, r6, r9\n\t"
  24730. "lsl r9, r12, #16\n\t"
  24731. "lsr r9, r9, #16\n\t"
  24732. "mul r8, r9, r8\n\t"
  24733. "lsr r9, r8, #16\n\t"
  24734. "lsl r8, r8, #16\n\t"
  24735. "adds r5, r5, r8\n\t"
  24736. "adc r6, r6, r9\n\t"
  24737. #else
  24738. "umull r5, r6, r10, r12\n\t"
  24739. #endif
  24740. "mov r2, #0\n\t"
  24741. "mov r7, #0\n\t"
  24742. /* A[1] * A[6] */
  24743. "ldr r10, [%[a], #24]\n\t"
  24744. "ldr r12, [%[a], #4]\n\t"
  24745. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24746. "lsl r8, r10, #16\n\t"
  24747. "lsl r9, r12, #16\n\t"
  24748. "lsr r8, r8, #16\n\t"
  24749. "lsr r9, r9, #16\n\t"
  24750. "mul r9, r8, r9\n\t"
  24751. "adds r5, r5, r9\n\t"
  24752. "adcs r6, r6, #0\n\t"
  24753. "adc r7, r7, #0\n\t"
  24754. "lsr r9, r12, #16\n\t"
  24755. "mul r8, r9, r8\n\t"
  24756. "lsr r9, r8, #16\n\t"
  24757. "lsl r8, r8, #16\n\t"
  24758. "adds r5, r5, r8\n\t"
  24759. "adcs r6, r6, r9\n\t"
  24760. "adc r7, r7, #0\n\t"
  24761. "lsr r8, r10, #16\n\t"
  24762. "lsr r9, r12, #16\n\t"
  24763. "mul r9, r8, r9\n\t"
  24764. "adds r6, r6, r9\n\t"
  24765. "adc r7, r7, #0\n\t"
  24766. "lsl r9, r12, #16\n\t"
  24767. "lsr r9, r9, #16\n\t"
  24768. "mul r8, r9, r8\n\t"
  24769. "lsr r9, r8, #16\n\t"
  24770. "lsl r8, r8, #16\n\t"
  24771. "adds r5, r5, r8\n\t"
  24772. "adcs r6, r6, r9\n\t"
  24773. "adc r7, r7, #0\n\t"
  24774. #else
  24775. "umull r8, r9, r10, r12\n\t"
  24776. "adds r5, r5, r8\n\t"
  24777. "adcs r6, r6, r9\n\t"
  24778. "adc r7, r7, #0\n\t"
  24779. #endif
  24780. /* A[2] * A[5] */
  24781. "ldr r10, [%[a], #20]\n\t"
  24782. "ldr r12, [%[a], #8]\n\t"
  24783. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24784. "lsl r8, r10, #16\n\t"
  24785. "lsl r9, r12, #16\n\t"
  24786. "lsr r8, r8, #16\n\t"
  24787. "lsr r9, r9, #16\n\t"
  24788. "mul r9, r8, r9\n\t"
  24789. "adds r5, r5, r9\n\t"
  24790. "adcs r6, r6, #0\n\t"
  24791. "adc r7, r7, #0\n\t"
  24792. "lsr r9, r12, #16\n\t"
  24793. "mul r8, r9, r8\n\t"
  24794. "lsr r9, r8, #16\n\t"
  24795. "lsl r8, r8, #16\n\t"
  24796. "adds r5, r5, r8\n\t"
  24797. "adcs r6, r6, r9\n\t"
  24798. "adc r7, r7, #0\n\t"
  24799. "lsr r8, r10, #16\n\t"
  24800. "lsr r9, r12, #16\n\t"
  24801. "mul r9, r8, r9\n\t"
  24802. "adds r6, r6, r9\n\t"
  24803. "adc r7, r7, #0\n\t"
  24804. "lsl r9, r12, #16\n\t"
  24805. "lsr r9, r9, #16\n\t"
  24806. "mul r8, r9, r8\n\t"
  24807. "lsr r9, r8, #16\n\t"
  24808. "lsl r8, r8, #16\n\t"
  24809. "adds r5, r5, r8\n\t"
  24810. "adcs r6, r6, r9\n\t"
  24811. "adc r7, r7, #0\n\t"
  24812. #else
  24813. "umull r8, r9, r10, r12\n\t"
  24814. "adds r5, r5, r8\n\t"
  24815. "adcs r6, r6, r9\n\t"
  24816. "adc r7, r7, #0\n\t"
  24817. #endif
  24818. /* A[3] * A[4] */
  24819. "ldr r10, [%[a], #16]\n\t"
  24820. "ldr r12, [%[a], #12]\n\t"
  24821. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24822. "lsl r8, r10, #16\n\t"
  24823. "lsl r9, r12, #16\n\t"
  24824. "lsr r8, r8, #16\n\t"
  24825. "lsr r9, r9, #16\n\t"
  24826. "mul r9, r8, r9\n\t"
  24827. "adds r5, r5, r9\n\t"
  24828. "adcs r6, r6, #0\n\t"
  24829. "adc r7, r7, #0\n\t"
  24830. "lsr r9, r12, #16\n\t"
  24831. "mul r8, r9, r8\n\t"
  24832. "lsr r9, r8, #16\n\t"
  24833. "lsl r8, r8, #16\n\t"
  24834. "adds r5, r5, r8\n\t"
  24835. "adcs r6, r6, r9\n\t"
  24836. "adc r7, r7, #0\n\t"
  24837. "lsr r8, r10, #16\n\t"
  24838. "lsr r9, r12, #16\n\t"
  24839. "mul r9, r8, r9\n\t"
  24840. "adds r6, r6, r9\n\t"
  24841. "adc r7, r7, #0\n\t"
  24842. "lsl r9, r12, #16\n\t"
  24843. "lsr r9, r9, #16\n\t"
  24844. "mul r8, r9, r8\n\t"
  24845. "lsr r9, r8, #16\n\t"
  24846. "lsl r8, r8, #16\n\t"
  24847. "adds r5, r5, r8\n\t"
  24848. "adcs r6, r6, r9\n\t"
  24849. "adc r7, r7, #0\n\t"
  24850. #else
  24851. "umull r8, r9, r10, r12\n\t"
  24852. "adds r5, r5, r8\n\t"
  24853. "adcs r6, r6, r9\n\t"
  24854. "adc r7, r7, #0\n\t"
  24855. #endif
  24856. "adds r5, r5, r5\n\t"
  24857. "adcs r6, r6, r6\n\t"
  24858. "adc r7, r7, r7\n\t"
  24859. "adds r3, r3, r5\n\t"
  24860. "adcs r4, r4, r6\n\t"
  24861. "adc r2, r2, r7\n\t"
  24862. "str r3, [sp, #28]\n\t"
  24863. /* A[0] * A[8] */
  24864. "ldr r10, [%[a], #32]\n\t"
  24865. "ldr r12, [%[a]]\n\t"
  24866. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24867. "lsl r8, r10, #16\n\t"
  24868. "lsl r5, r12, #16\n\t"
  24869. "lsr r8, r8, #16\n\t"
  24870. "lsr r5, r5, #16\n\t"
  24871. "mul r5, r8, r5\n\t"
  24872. "lsr r9, r12, #16\n\t"
  24873. "mul r8, r9, r8\n\t"
  24874. "lsr r6, r8, #16\n\t"
  24875. "lsl r8, r8, #16\n\t"
  24876. "adds r5, r5, r8\n\t"
  24877. "adc r6, r6, #0\n\t"
  24878. "lsr r8, r10, #16\n\t"
  24879. "mul r9, r8, r9\n\t"
  24880. "add r6, r6, r9\n\t"
  24881. "lsl r9, r12, #16\n\t"
  24882. "lsr r9, r9, #16\n\t"
  24883. "mul r8, r9, r8\n\t"
  24884. "lsr r9, r8, #16\n\t"
  24885. "lsl r8, r8, #16\n\t"
  24886. "adds r5, r5, r8\n\t"
  24887. "adc r6, r6, r9\n\t"
  24888. #else
  24889. "umull r5, r6, r10, r12\n\t"
  24890. #endif
  24891. "mov r3, #0\n\t"
  24892. "mov r7, #0\n\t"
  24893. /* A[1] * A[7] */
  24894. "ldr r10, [%[a], #28]\n\t"
  24895. "ldr r12, [%[a], #4]\n\t"
  24896. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24897. "lsl r8, r10, #16\n\t"
  24898. "lsl r9, r12, #16\n\t"
  24899. "lsr r8, r8, #16\n\t"
  24900. "lsr r9, r9, #16\n\t"
  24901. "mul r9, r8, r9\n\t"
  24902. "adds r5, r5, r9\n\t"
  24903. "adcs r6, r6, #0\n\t"
  24904. "adc r7, r7, #0\n\t"
  24905. "lsr r9, r12, #16\n\t"
  24906. "mul r8, r9, r8\n\t"
  24907. "lsr r9, r8, #16\n\t"
  24908. "lsl r8, r8, #16\n\t"
  24909. "adds r5, r5, r8\n\t"
  24910. "adcs r6, r6, r9\n\t"
  24911. "adc r7, r7, #0\n\t"
  24912. "lsr r8, r10, #16\n\t"
  24913. "lsr r9, r12, #16\n\t"
  24914. "mul r9, r8, r9\n\t"
  24915. "adds r6, r6, r9\n\t"
  24916. "adc r7, r7, #0\n\t"
  24917. "lsl r9, r12, #16\n\t"
  24918. "lsr r9, r9, #16\n\t"
  24919. "mul r8, r9, r8\n\t"
  24920. "lsr r9, r8, #16\n\t"
  24921. "lsl r8, r8, #16\n\t"
  24922. "adds r5, r5, r8\n\t"
  24923. "adcs r6, r6, r9\n\t"
  24924. "adc r7, r7, #0\n\t"
  24925. #else
  24926. "umull r8, r9, r10, r12\n\t"
  24927. "adds r5, r5, r8\n\t"
  24928. "adcs r6, r6, r9\n\t"
  24929. "adc r7, r7, #0\n\t"
  24930. #endif
  24931. /* A[2] * A[6] */
  24932. "ldr r10, [%[a], #24]\n\t"
  24933. "ldr r12, [%[a], #8]\n\t"
  24934. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24935. "lsl r8, r10, #16\n\t"
  24936. "lsl r9, r12, #16\n\t"
  24937. "lsr r8, r8, #16\n\t"
  24938. "lsr r9, r9, #16\n\t"
  24939. "mul r9, r8, r9\n\t"
  24940. "adds r5, r5, r9\n\t"
  24941. "adcs r6, r6, #0\n\t"
  24942. "adc r7, r7, #0\n\t"
  24943. "lsr r9, r12, #16\n\t"
  24944. "mul r8, r9, r8\n\t"
  24945. "lsr r9, r8, #16\n\t"
  24946. "lsl r8, r8, #16\n\t"
  24947. "adds r5, r5, r8\n\t"
  24948. "adcs r6, r6, r9\n\t"
  24949. "adc r7, r7, #0\n\t"
  24950. "lsr r8, r10, #16\n\t"
  24951. "lsr r9, r12, #16\n\t"
  24952. "mul r9, r8, r9\n\t"
  24953. "adds r6, r6, r9\n\t"
  24954. "adc r7, r7, #0\n\t"
  24955. "lsl r9, r12, #16\n\t"
  24956. "lsr r9, r9, #16\n\t"
  24957. "mul r8, r9, r8\n\t"
  24958. "lsr r9, r8, #16\n\t"
  24959. "lsl r8, r8, #16\n\t"
  24960. "adds r5, r5, r8\n\t"
  24961. "adcs r6, r6, r9\n\t"
  24962. "adc r7, r7, #0\n\t"
  24963. #else
  24964. "umull r8, r9, r10, r12\n\t"
  24965. "adds r5, r5, r8\n\t"
  24966. "adcs r6, r6, r9\n\t"
  24967. "adc r7, r7, #0\n\t"
  24968. #endif
  24969. /* A[3] * A[5] */
  24970. "ldr r10, [%[a], #20]\n\t"
  24971. "ldr r12, [%[a], #12]\n\t"
  24972. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  24973. "lsl r8, r10, #16\n\t"
  24974. "lsl r9, r12, #16\n\t"
  24975. "lsr r8, r8, #16\n\t"
  24976. "lsr r9, r9, #16\n\t"
  24977. "mul r9, r8, r9\n\t"
  24978. "adds r5, r5, r9\n\t"
  24979. "adcs r6, r6, #0\n\t"
  24980. "adc r7, r7, #0\n\t"
  24981. "lsr r9, r12, #16\n\t"
  24982. "mul r8, r9, r8\n\t"
  24983. "lsr r9, r8, #16\n\t"
  24984. "lsl r8, r8, #16\n\t"
  24985. "adds r5, r5, r8\n\t"
  24986. "adcs r6, r6, r9\n\t"
  24987. "adc r7, r7, #0\n\t"
  24988. "lsr r8, r10, #16\n\t"
  24989. "lsr r9, r12, #16\n\t"
  24990. "mul r9, r8, r9\n\t"
  24991. "adds r6, r6, r9\n\t"
  24992. "adc r7, r7, #0\n\t"
  24993. "lsl r9, r12, #16\n\t"
  24994. "lsr r9, r9, #16\n\t"
  24995. "mul r8, r9, r8\n\t"
  24996. "lsr r9, r8, #16\n\t"
  24997. "lsl r8, r8, #16\n\t"
  24998. "adds r5, r5, r8\n\t"
  24999. "adcs r6, r6, r9\n\t"
  25000. "adc r7, r7, #0\n\t"
  25001. #else
  25002. "umull r8, r9, r10, r12\n\t"
  25003. "adds r5, r5, r8\n\t"
  25004. "adcs r6, r6, r9\n\t"
  25005. "adc r7, r7, #0\n\t"
  25006. #endif
  25007. /* A[4] * A[4] */
  25008. "ldr r10, [%[a], #16]\n\t"
  25009. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25010. "lsl r8, r10, #16\n\t"
  25011. "lsr r9, r10, #16\n\t"
  25012. "lsr r8, r8, #16\n\t"
  25013. "mov r12, r8\n\t"
  25014. "mul r8, r12, r8\n\t"
  25015. "mov r12, r9\n\t"
  25016. "mul r9, r12, r9\n\t"
  25017. "adds r4, r4, r8\n\t"
  25018. "adcs r2, r2, r9\n\t"
  25019. "adc r3, r3, #0\n\t"
  25020. "lsr r9, r10, #16\n\t"
  25021. "lsl r8, r10, #16\n\t"
  25022. "lsr r8, r8, #16\n\t"
  25023. "mul r8, r9, r8\n\t"
  25024. "lsr r9, r8, #15\n\t"
  25025. "lsl r8, r8, #17\n\t"
  25026. "adds r4, r4, r8\n\t"
  25027. "adcs r2, r2, r9\n\t"
  25028. "adc r3, r3, #0\n\t"
  25029. "adds r5, r5, r5\n\t"
  25030. "adcs r6, r6, r6\n\t"
  25031. "adc r7, r7, r7\n\t"
  25032. #else
  25033. "umull r8, r9, r10, r10\n\t"
  25034. "adds r5, r5, r5\n\t"
  25035. "adcs r6, r6, r6\n\t"
  25036. "adc r7, r7, r7\n\t"
  25037. "adds r4, r4, r8\n\t"
  25038. "adcs r2, r2, r9\n\t"
  25039. "adc r3, r3, #0\n\t"
  25040. #endif
  25041. "adds r4, r4, r5\n\t"
  25042. "adcs r2, r2, r6\n\t"
  25043. "adc r3, r3, r7\n\t"
  25044. "str r4, [sp, #32]\n\t"
  25045. /* A[0] * A[9] */
  25046. "ldr r10, [%[a], #36]\n\t"
  25047. "ldr r12, [%[a]]\n\t"
  25048. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25049. "lsl r8, r10, #16\n\t"
  25050. "lsl r5, r12, #16\n\t"
  25051. "lsr r8, r8, #16\n\t"
  25052. "lsr r5, r5, #16\n\t"
  25053. "mul r5, r8, r5\n\t"
  25054. "lsr r9, r12, #16\n\t"
  25055. "mul r8, r9, r8\n\t"
  25056. "lsr r6, r8, #16\n\t"
  25057. "lsl r8, r8, #16\n\t"
  25058. "adds r5, r5, r8\n\t"
  25059. "adc r6, r6, #0\n\t"
  25060. "lsr r8, r10, #16\n\t"
  25061. "mul r9, r8, r9\n\t"
  25062. "add r6, r6, r9\n\t"
  25063. "lsl r9, r12, #16\n\t"
  25064. "lsr r9, r9, #16\n\t"
  25065. "mul r8, r9, r8\n\t"
  25066. "lsr r9, r8, #16\n\t"
  25067. "lsl r8, r8, #16\n\t"
  25068. "adds r5, r5, r8\n\t"
  25069. "adc r6, r6, r9\n\t"
  25070. #else
  25071. "umull r5, r6, r10, r12\n\t"
  25072. #endif
  25073. "mov r4, #0\n\t"
  25074. "mov r7, #0\n\t"
  25075. /* A[1] * A[8] */
  25076. "ldr r10, [%[a], #32]\n\t"
  25077. "ldr r12, [%[a], #4]\n\t"
  25078. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25079. "lsl r8, r10, #16\n\t"
  25080. "lsl r9, r12, #16\n\t"
  25081. "lsr r8, r8, #16\n\t"
  25082. "lsr r9, r9, #16\n\t"
  25083. "mul r9, r8, r9\n\t"
  25084. "adds r5, r5, r9\n\t"
  25085. "adcs r6, r6, #0\n\t"
  25086. "adc r7, r7, #0\n\t"
  25087. "lsr r9, r12, #16\n\t"
  25088. "mul r8, r9, r8\n\t"
  25089. "lsr r9, r8, #16\n\t"
  25090. "lsl r8, r8, #16\n\t"
  25091. "adds r5, r5, r8\n\t"
  25092. "adcs r6, r6, r9\n\t"
  25093. "adc r7, r7, #0\n\t"
  25094. "lsr r8, r10, #16\n\t"
  25095. "lsr r9, r12, #16\n\t"
  25096. "mul r9, r8, r9\n\t"
  25097. "adds r6, r6, r9\n\t"
  25098. "adc r7, r7, #0\n\t"
  25099. "lsl r9, r12, #16\n\t"
  25100. "lsr r9, r9, #16\n\t"
  25101. "mul r8, r9, r8\n\t"
  25102. "lsr r9, r8, #16\n\t"
  25103. "lsl r8, r8, #16\n\t"
  25104. "adds r5, r5, r8\n\t"
  25105. "adcs r6, r6, r9\n\t"
  25106. "adc r7, r7, #0\n\t"
  25107. #else
  25108. "umull r8, r9, r10, r12\n\t"
  25109. "adds r5, r5, r8\n\t"
  25110. "adcs r6, r6, r9\n\t"
  25111. "adc r7, r7, #0\n\t"
  25112. #endif
  25113. /* A[2] * A[7] */
  25114. "ldr r10, [%[a], #28]\n\t"
  25115. "ldr r12, [%[a], #8]\n\t"
  25116. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25117. "lsl r8, r10, #16\n\t"
  25118. "lsl r9, r12, #16\n\t"
  25119. "lsr r8, r8, #16\n\t"
  25120. "lsr r9, r9, #16\n\t"
  25121. "mul r9, r8, r9\n\t"
  25122. "adds r5, r5, r9\n\t"
  25123. "adcs r6, r6, #0\n\t"
  25124. "adc r7, r7, #0\n\t"
  25125. "lsr r9, r12, #16\n\t"
  25126. "mul r8, r9, r8\n\t"
  25127. "lsr r9, r8, #16\n\t"
  25128. "lsl r8, r8, #16\n\t"
  25129. "adds r5, r5, r8\n\t"
  25130. "adcs r6, r6, r9\n\t"
  25131. "adc r7, r7, #0\n\t"
  25132. "lsr r8, r10, #16\n\t"
  25133. "lsr r9, r12, #16\n\t"
  25134. "mul r9, r8, r9\n\t"
  25135. "adds r6, r6, r9\n\t"
  25136. "adc r7, r7, #0\n\t"
  25137. "lsl r9, r12, #16\n\t"
  25138. "lsr r9, r9, #16\n\t"
  25139. "mul r8, r9, r8\n\t"
  25140. "lsr r9, r8, #16\n\t"
  25141. "lsl r8, r8, #16\n\t"
  25142. "adds r5, r5, r8\n\t"
  25143. "adcs r6, r6, r9\n\t"
  25144. "adc r7, r7, #0\n\t"
  25145. #else
  25146. "umull r8, r9, r10, r12\n\t"
  25147. "adds r5, r5, r8\n\t"
  25148. "adcs r6, r6, r9\n\t"
  25149. "adc r7, r7, #0\n\t"
  25150. #endif
  25151. /* A[3] * A[6] */
  25152. "ldr r10, [%[a], #24]\n\t"
  25153. "ldr r12, [%[a], #12]\n\t"
  25154. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25155. "lsl r8, r10, #16\n\t"
  25156. "lsl r9, r12, #16\n\t"
  25157. "lsr r8, r8, #16\n\t"
  25158. "lsr r9, r9, #16\n\t"
  25159. "mul r9, r8, r9\n\t"
  25160. "adds r5, r5, r9\n\t"
  25161. "adcs r6, r6, #0\n\t"
  25162. "adc r7, r7, #0\n\t"
  25163. "lsr r9, r12, #16\n\t"
  25164. "mul r8, r9, r8\n\t"
  25165. "lsr r9, r8, #16\n\t"
  25166. "lsl r8, r8, #16\n\t"
  25167. "adds r5, r5, r8\n\t"
  25168. "adcs r6, r6, r9\n\t"
  25169. "adc r7, r7, #0\n\t"
  25170. "lsr r8, r10, #16\n\t"
  25171. "lsr r9, r12, #16\n\t"
  25172. "mul r9, r8, r9\n\t"
  25173. "adds r6, r6, r9\n\t"
  25174. "adc r7, r7, #0\n\t"
  25175. "lsl r9, r12, #16\n\t"
  25176. "lsr r9, r9, #16\n\t"
  25177. "mul r8, r9, r8\n\t"
  25178. "lsr r9, r8, #16\n\t"
  25179. "lsl r8, r8, #16\n\t"
  25180. "adds r5, r5, r8\n\t"
  25181. "adcs r6, r6, r9\n\t"
  25182. "adc r7, r7, #0\n\t"
  25183. #else
  25184. "umull r8, r9, r10, r12\n\t"
  25185. "adds r5, r5, r8\n\t"
  25186. "adcs r6, r6, r9\n\t"
  25187. "adc r7, r7, #0\n\t"
  25188. #endif
  25189. /* A[4] * A[5] */
  25190. "ldr r10, [%[a], #20]\n\t"
  25191. "ldr r12, [%[a], #16]\n\t"
  25192. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25193. "lsl r8, r10, #16\n\t"
  25194. "lsl r9, r12, #16\n\t"
  25195. "lsr r8, r8, #16\n\t"
  25196. "lsr r9, r9, #16\n\t"
  25197. "mul r9, r8, r9\n\t"
  25198. "adds r5, r5, r9\n\t"
  25199. "adcs r6, r6, #0\n\t"
  25200. "adc r7, r7, #0\n\t"
  25201. "lsr r9, r12, #16\n\t"
  25202. "mul r8, r9, r8\n\t"
  25203. "lsr r9, r8, #16\n\t"
  25204. "lsl r8, r8, #16\n\t"
  25205. "adds r5, r5, r8\n\t"
  25206. "adcs r6, r6, r9\n\t"
  25207. "adc r7, r7, #0\n\t"
  25208. "lsr r8, r10, #16\n\t"
  25209. "lsr r9, r12, #16\n\t"
  25210. "mul r9, r8, r9\n\t"
  25211. "adds r6, r6, r9\n\t"
  25212. "adc r7, r7, #0\n\t"
  25213. "lsl r9, r12, #16\n\t"
  25214. "lsr r9, r9, #16\n\t"
  25215. "mul r8, r9, r8\n\t"
  25216. "lsr r9, r8, #16\n\t"
  25217. "lsl r8, r8, #16\n\t"
  25218. "adds r5, r5, r8\n\t"
  25219. "adcs r6, r6, r9\n\t"
  25220. "adc r7, r7, #0\n\t"
  25221. #else
  25222. "umull r8, r9, r10, r12\n\t"
  25223. "adds r5, r5, r8\n\t"
  25224. "adcs r6, r6, r9\n\t"
  25225. "adc r7, r7, #0\n\t"
  25226. #endif
  25227. "adds r5, r5, r5\n\t"
  25228. "adcs r6, r6, r6\n\t"
  25229. "adc r7, r7, r7\n\t"
  25230. "adds r2, r2, r5\n\t"
  25231. "adcs r3, r3, r6\n\t"
  25232. "adc r4, r4, r7\n\t"
  25233. "str r2, [sp, #36]\n\t"
  25234. /* A[0] * A[10] */
  25235. "ldr r10, [%[a], #40]\n\t"
  25236. "ldr r12, [%[a]]\n\t"
  25237. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25238. "lsl r8, r10, #16\n\t"
  25239. "lsl r5, r12, #16\n\t"
  25240. "lsr r8, r8, #16\n\t"
  25241. "lsr r5, r5, #16\n\t"
  25242. "mul r5, r8, r5\n\t"
  25243. "lsr r9, r12, #16\n\t"
  25244. "mul r8, r9, r8\n\t"
  25245. "lsr r6, r8, #16\n\t"
  25246. "lsl r8, r8, #16\n\t"
  25247. "adds r5, r5, r8\n\t"
  25248. "adc r6, r6, #0\n\t"
  25249. "lsr r8, r10, #16\n\t"
  25250. "mul r9, r8, r9\n\t"
  25251. "add r6, r6, r9\n\t"
  25252. "lsl r9, r12, #16\n\t"
  25253. "lsr r9, r9, #16\n\t"
  25254. "mul r8, r9, r8\n\t"
  25255. "lsr r9, r8, #16\n\t"
  25256. "lsl r8, r8, #16\n\t"
  25257. "adds r5, r5, r8\n\t"
  25258. "adc r6, r6, r9\n\t"
  25259. #else
  25260. "umull r5, r6, r10, r12\n\t"
  25261. #endif
  25262. "mov r2, #0\n\t"
  25263. "mov r7, #0\n\t"
  25264. /* A[1] * A[9] */
  25265. "ldr r10, [%[a], #36]\n\t"
  25266. "ldr r12, [%[a], #4]\n\t"
  25267. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25268. "lsl r8, r10, #16\n\t"
  25269. "lsl r9, r12, #16\n\t"
  25270. "lsr r8, r8, #16\n\t"
  25271. "lsr r9, r9, #16\n\t"
  25272. "mul r9, r8, r9\n\t"
  25273. "adds r5, r5, r9\n\t"
  25274. "adcs r6, r6, #0\n\t"
  25275. "adc r7, r7, #0\n\t"
  25276. "lsr r9, r12, #16\n\t"
  25277. "mul r8, r9, r8\n\t"
  25278. "lsr r9, r8, #16\n\t"
  25279. "lsl r8, r8, #16\n\t"
  25280. "adds r5, r5, r8\n\t"
  25281. "adcs r6, r6, r9\n\t"
  25282. "adc r7, r7, #0\n\t"
  25283. "lsr r8, r10, #16\n\t"
  25284. "lsr r9, r12, #16\n\t"
  25285. "mul r9, r8, r9\n\t"
  25286. "adds r6, r6, r9\n\t"
  25287. "adc r7, r7, #0\n\t"
  25288. "lsl r9, r12, #16\n\t"
  25289. "lsr r9, r9, #16\n\t"
  25290. "mul r8, r9, r8\n\t"
  25291. "lsr r9, r8, #16\n\t"
  25292. "lsl r8, r8, #16\n\t"
  25293. "adds r5, r5, r8\n\t"
  25294. "adcs r6, r6, r9\n\t"
  25295. "adc r7, r7, #0\n\t"
  25296. #else
  25297. "umull r8, r9, r10, r12\n\t"
  25298. "adds r5, r5, r8\n\t"
  25299. "adcs r6, r6, r9\n\t"
  25300. "adc r7, r7, #0\n\t"
  25301. #endif
  25302. /* A[2] * A[8] */
  25303. "ldr r10, [%[a], #32]\n\t"
  25304. "ldr r12, [%[a], #8]\n\t"
  25305. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25306. "lsl r8, r10, #16\n\t"
  25307. "lsl r9, r12, #16\n\t"
  25308. "lsr r8, r8, #16\n\t"
  25309. "lsr r9, r9, #16\n\t"
  25310. "mul r9, r8, r9\n\t"
  25311. "adds r5, r5, r9\n\t"
  25312. "adcs r6, r6, #0\n\t"
  25313. "adc r7, r7, #0\n\t"
  25314. "lsr r9, r12, #16\n\t"
  25315. "mul r8, r9, r8\n\t"
  25316. "lsr r9, r8, #16\n\t"
  25317. "lsl r8, r8, #16\n\t"
  25318. "adds r5, r5, r8\n\t"
  25319. "adcs r6, r6, r9\n\t"
  25320. "adc r7, r7, #0\n\t"
  25321. "lsr r8, r10, #16\n\t"
  25322. "lsr r9, r12, #16\n\t"
  25323. "mul r9, r8, r9\n\t"
  25324. "adds r6, r6, r9\n\t"
  25325. "adc r7, r7, #0\n\t"
  25326. "lsl r9, r12, #16\n\t"
  25327. "lsr r9, r9, #16\n\t"
  25328. "mul r8, r9, r8\n\t"
  25329. "lsr r9, r8, #16\n\t"
  25330. "lsl r8, r8, #16\n\t"
  25331. "adds r5, r5, r8\n\t"
  25332. "adcs r6, r6, r9\n\t"
  25333. "adc r7, r7, #0\n\t"
  25334. #else
  25335. "umull r8, r9, r10, r12\n\t"
  25336. "adds r5, r5, r8\n\t"
  25337. "adcs r6, r6, r9\n\t"
  25338. "adc r7, r7, #0\n\t"
  25339. #endif
  25340. /* A[3] * A[7] */
  25341. "ldr r10, [%[a], #28]\n\t"
  25342. "ldr r12, [%[a], #12]\n\t"
  25343. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25344. "lsl r8, r10, #16\n\t"
  25345. "lsl r9, r12, #16\n\t"
  25346. "lsr r8, r8, #16\n\t"
  25347. "lsr r9, r9, #16\n\t"
  25348. "mul r9, r8, r9\n\t"
  25349. "adds r5, r5, r9\n\t"
  25350. "adcs r6, r6, #0\n\t"
  25351. "adc r7, r7, #0\n\t"
  25352. "lsr r9, r12, #16\n\t"
  25353. "mul r8, r9, r8\n\t"
  25354. "lsr r9, r8, #16\n\t"
  25355. "lsl r8, r8, #16\n\t"
  25356. "adds r5, r5, r8\n\t"
  25357. "adcs r6, r6, r9\n\t"
  25358. "adc r7, r7, #0\n\t"
  25359. "lsr r8, r10, #16\n\t"
  25360. "lsr r9, r12, #16\n\t"
  25361. "mul r9, r8, r9\n\t"
  25362. "adds r6, r6, r9\n\t"
  25363. "adc r7, r7, #0\n\t"
  25364. "lsl r9, r12, #16\n\t"
  25365. "lsr r9, r9, #16\n\t"
  25366. "mul r8, r9, r8\n\t"
  25367. "lsr r9, r8, #16\n\t"
  25368. "lsl r8, r8, #16\n\t"
  25369. "adds r5, r5, r8\n\t"
  25370. "adcs r6, r6, r9\n\t"
  25371. "adc r7, r7, #0\n\t"
  25372. #else
  25373. "umull r8, r9, r10, r12\n\t"
  25374. "adds r5, r5, r8\n\t"
  25375. "adcs r6, r6, r9\n\t"
  25376. "adc r7, r7, #0\n\t"
  25377. #endif
  25378. /* A[4] * A[6] */
  25379. "ldr r10, [%[a], #24]\n\t"
  25380. "ldr r12, [%[a], #16]\n\t"
  25381. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25382. "lsl r8, r10, #16\n\t"
  25383. "lsl r9, r12, #16\n\t"
  25384. "lsr r8, r8, #16\n\t"
  25385. "lsr r9, r9, #16\n\t"
  25386. "mul r9, r8, r9\n\t"
  25387. "adds r5, r5, r9\n\t"
  25388. "adcs r6, r6, #0\n\t"
  25389. "adc r7, r7, #0\n\t"
  25390. "lsr r9, r12, #16\n\t"
  25391. "mul r8, r9, r8\n\t"
  25392. "lsr r9, r8, #16\n\t"
  25393. "lsl r8, r8, #16\n\t"
  25394. "adds r5, r5, r8\n\t"
  25395. "adcs r6, r6, r9\n\t"
  25396. "adc r7, r7, #0\n\t"
  25397. "lsr r8, r10, #16\n\t"
  25398. "lsr r9, r12, #16\n\t"
  25399. "mul r9, r8, r9\n\t"
  25400. "adds r6, r6, r9\n\t"
  25401. "adc r7, r7, #0\n\t"
  25402. "lsl r9, r12, #16\n\t"
  25403. "lsr r9, r9, #16\n\t"
  25404. "mul r8, r9, r8\n\t"
  25405. "lsr r9, r8, #16\n\t"
  25406. "lsl r8, r8, #16\n\t"
  25407. "adds r5, r5, r8\n\t"
  25408. "adcs r6, r6, r9\n\t"
  25409. "adc r7, r7, #0\n\t"
  25410. #else
  25411. "umull r8, r9, r10, r12\n\t"
  25412. "adds r5, r5, r8\n\t"
  25413. "adcs r6, r6, r9\n\t"
  25414. "adc r7, r7, #0\n\t"
  25415. #endif
  25416. /* A[5] * A[5] */
  25417. "ldr r10, [%[a], #20]\n\t"
  25418. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25419. "lsl r8, r10, #16\n\t"
  25420. "lsr r9, r10, #16\n\t"
  25421. "lsr r8, r8, #16\n\t"
  25422. "mov r12, r8\n\t"
  25423. "mul r8, r12, r8\n\t"
  25424. "mov r12, r9\n\t"
  25425. "mul r9, r12, r9\n\t"
  25426. "adds r3, r3, r8\n\t"
  25427. "adcs r4, r4, r9\n\t"
  25428. "adc r2, r2, #0\n\t"
  25429. "lsr r9, r10, #16\n\t"
  25430. "lsl r8, r10, #16\n\t"
  25431. "lsr r8, r8, #16\n\t"
  25432. "mul r8, r9, r8\n\t"
  25433. "lsr r9, r8, #15\n\t"
  25434. "lsl r8, r8, #17\n\t"
  25435. "adds r3, r3, r8\n\t"
  25436. "adcs r4, r4, r9\n\t"
  25437. "adc r2, r2, #0\n\t"
  25438. "adds r5, r5, r5\n\t"
  25439. "adcs r6, r6, r6\n\t"
  25440. "adc r7, r7, r7\n\t"
  25441. #else
  25442. "umull r8, r9, r10, r10\n\t"
  25443. "adds r5, r5, r5\n\t"
  25444. "adcs r6, r6, r6\n\t"
  25445. "adc r7, r7, r7\n\t"
  25446. "adds r3, r3, r8\n\t"
  25447. "adcs r4, r4, r9\n\t"
  25448. "adc r2, r2, #0\n\t"
  25449. #endif
  25450. "adds r3, r3, r5\n\t"
  25451. "adcs r4, r4, r6\n\t"
  25452. "adc r2, r2, r7\n\t"
  25453. "str r3, [sp, #40]\n\t"
  25454. /* A[0] * A[11] */
  25455. "ldr r10, [%[a], #44]\n\t"
  25456. "ldr r12, [%[a]]\n\t"
  25457. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25458. "lsl r8, r10, #16\n\t"
  25459. "lsl r5, r12, #16\n\t"
  25460. "lsr r8, r8, #16\n\t"
  25461. "lsr r5, r5, #16\n\t"
  25462. "mul r5, r8, r5\n\t"
  25463. "lsr r9, r12, #16\n\t"
  25464. "mul r8, r9, r8\n\t"
  25465. "lsr r6, r8, #16\n\t"
  25466. "lsl r8, r8, #16\n\t"
  25467. "adds r5, r5, r8\n\t"
  25468. "adc r6, r6, #0\n\t"
  25469. "lsr r8, r10, #16\n\t"
  25470. "mul r9, r8, r9\n\t"
  25471. "add r6, r6, r9\n\t"
  25472. "lsl r9, r12, #16\n\t"
  25473. "lsr r9, r9, #16\n\t"
  25474. "mul r8, r9, r8\n\t"
  25475. "lsr r9, r8, #16\n\t"
  25476. "lsl r8, r8, #16\n\t"
  25477. "adds r5, r5, r8\n\t"
  25478. "adc r6, r6, r9\n\t"
  25479. #else
  25480. "umull r5, r6, r10, r12\n\t"
  25481. #endif
  25482. "mov r3, #0\n\t"
  25483. "mov r7, #0\n\t"
  25484. /* A[1] * A[10] */
  25485. "ldr r10, [%[a], #40]\n\t"
  25486. "ldr r12, [%[a], #4]\n\t"
  25487. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25488. "lsl r8, r10, #16\n\t"
  25489. "lsl r9, r12, #16\n\t"
  25490. "lsr r8, r8, #16\n\t"
  25491. "lsr r9, r9, #16\n\t"
  25492. "mul r9, r8, r9\n\t"
  25493. "adds r5, r5, r9\n\t"
  25494. "adcs r6, r6, #0\n\t"
  25495. "adc r7, r7, #0\n\t"
  25496. "lsr r9, r12, #16\n\t"
  25497. "mul r8, r9, r8\n\t"
  25498. "lsr r9, r8, #16\n\t"
  25499. "lsl r8, r8, #16\n\t"
  25500. "adds r5, r5, r8\n\t"
  25501. "adcs r6, r6, r9\n\t"
  25502. "adc r7, r7, #0\n\t"
  25503. "lsr r8, r10, #16\n\t"
  25504. "lsr r9, r12, #16\n\t"
  25505. "mul r9, r8, r9\n\t"
  25506. "adds r6, r6, r9\n\t"
  25507. "adc r7, r7, #0\n\t"
  25508. "lsl r9, r12, #16\n\t"
  25509. "lsr r9, r9, #16\n\t"
  25510. "mul r8, r9, r8\n\t"
  25511. "lsr r9, r8, #16\n\t"
  25512. "lsl r8, r8, #16\n\t"
  25513. "adds r5, r5, r8\n\t"
  25514. "adcs r6, r6, r9\n\t"
  25515. "adc r7, r7, #0\n\t"
  25516. #else
  25517. "umull r8, r9, r10, r12\n\t"
  25518. "adds r5, r5, r8\n\t"
  25519. "adcs r6, r6, r9\n\t"
  25520. "adc r7, r7, #0\n\t"
  25521. #endif
  25522. /* A[2] * A[9] */
  25523. "ldr r10, [%[a], #36]\n\t"
  25524. "ldr r12, [%[a], #8]\n\t"
  25525. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25526. "lsl r8, r10, #16\n\t"
  25527. "lsl r9, r12, #16\n\t"
  25528. "lsr r8, r8, #16\n\t"
  25529. "lsr r9, r9, #16\n\t"
  25530. "mul r9, r8, r9\n\t"
  25531. "adds r5, r5, r9\n\t"
  25532. "adcs r6, r6, #0\n\t"
  25533. "adc r7, r7, #0\n\t"
  25534. "lsr r9, r12, #16\n\t"
  25535. "mul r8, r9, r8\n\t"
  25536. "lsr r9, r8, #16\n\t"
  25537. "lsl r8, r8, #16\n\t"
  25538. "adds r5, r5, r8\n\t"
  25539. "adcs r6, r6, r9\n\t"
  25540. "adc r7, r7, #0\n\t"
  25541. "lsr r8, r10, #16\n\t"
  25542. "lsr r9, r12, #16\n\t"
  25543. "mul r9, r8, r9\n\t"
  25544. "adds r6, r6, r9\n\t"
  25545. "adc r7, r7, #0\n\t"
  25546. "lsl r9, r12, #16\n\t"
  25547. "lsr r9, r9, #16\n\t"
  25548. "mul r8, r9, r8\n\t"
  25549. "lsr r9, r8, #16\n\t"
  25550. "lsl r8, r8, #16\n\t"
  25551. "adds r5, r5, r8\n\t"
  25552. "adcs r6, r6, r9\n\t"
  25553. "adc r7, r7, #0\n\t"
  25554. #else
  25555. "umull r8, r9, r10, r12\n\t"
  25556. "adds r5, r5, r8\n\t"
  25557. "adcs r6, r6, r9\n\t"
  25558. "adc r7, r7, #0\n\t"
  25559. #endif
  25560. /* A[3] * A[8] */
  25561. "ldr r10, [%[a], #32]\n\t"
  25562. "ldr r12, [%[a], #12]\n\t"
  25563. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25564. "lsl r8, r10, #16\n\t"
  25565. "lsl r9, r12, #16\n\t"
  25566. "lsr r8, r8, #16\n\t"
  25567. "lsr r9, r9, #16\n\t"
  25568. "mul r9, r8, r9\n\t"
  25569. "adds r5, r5, r9\n\t"
  25570. "adcs r6, r6, #0\n\t"
  25571. "adc r7, r7, #0\n\t"
  25572. "lsr r9, r12, #16\n\t"
  25573. "mul r8, r9, r8\n\t"
  25574. "lsr r9, r8, #16\n\t"
  25575. "lsl r8, r8, #16\n\t"
  25576. "adds r5, r5, r8\n\t"
  25577. "adcs r6, r6, r9\n\t"
  25578. "adc r7, r7, #0\n\t"
  25579. "lsr r8, r10, #16\n\t"
  25580. "lsr r9, r12, #16\n\t"
  25581. "mul r9, r8, r9\n\t"
  25582. "adds r6, r6, r9\n\t"
  25583. "adc r7, r7, #0\n\t"
  25584. "lsl r9, r12, #16\n\t"
  25585. "lsr r9, r9, #16\n\t"
  25586. "mul r8, r9, r8\n\t"
  25587. "lsr r9, r8, #16\n\t"
  25588. "lsl r8, r8, #16\n\t"
  25589. "adds r5, r5, r8\n\t"
  25590. "adcs r6, r6, r9\n\t"
  25591. "adc r7, r7, #0\n\t"
  25592. #else
  25593. "umull r8, r9, r10, r12\n\t"
  25594. "adds r5, r5, r8\n\t"
  25595. "adcs r6, r6, r9\n\t"
  25596. "adc r7, r7, #0\n\t"
  25597. #endif
  25598. /* A[4] * A[7] */
  25599. "ldr r10, [%[a], #28]\n\t"
  25600. "ldr r12, [%[a], #16]\n\t"
  25601. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25602. "lsl r8, r10, #16\n\t"
  25603. "lsl r9, r12, #16\n\t"
  25604. "lsr r8, r8, #16\n\t"
  25605. "lsr r9, r9, #16\n\t"
  25606. "mul r9, r8, r9\n\t"
  25607. "adds r5, r5, r9\n\t"
  25608. "adcs r6, r6, #0\n\t"
  25609. "adc r7, r7, #0\n\t"
  25610. "lsr r9, r12, #16\n\t"
  25611. "mul r8, r9, r8\n\t"
  25612. "lsr r9, r8, #16\n\t"
  25613. "lsl r8, r8, #16\n\t"
  25614. "adds r5, r5, r8\n\t"
  25615. "adcs r6, r6, r9\n\t"
  25616. "adc r7, r7, #0\n\t"
  25617. "lsr r8, r10, #16\n\t"
  25618. "lsr r9, r12, #16\n\t"
  25619. "mul r9, r8, r9\n\t"
  25620. "adds r6, r6, r9\n\t"
  25621. "adc r7, r7, #0\n\t"
  25622. "lsl r9, r12, #16\n\t"
  25623. "lsr r9, r9, #16\n\t"
  25624. "mul r8, r9, r8\n\t"
  25625. "lsr r9, r8, #16\n\t"
  25626. "lsl r8, r8, #16\n\t"
  25627. "adds r5, r5, r8\n\t"
  25628. "adcs r6, r6, r9\n\t"
  25629. "adc r7, r7, #0\n\t"
  25630. #else
  25631. "umull r8, r9, r10, r12\n\t"
  25632. "adds r5, r5, r8\n\t"
  25633. "adcs r6, r6, r9\n\t"
  25634. "adc r7, r7, #0\n\t"
  25635. #endif
  25636. /* A[5] * A[6] */
  25637. "ldr r10, [%[a], #24]\n\t"
  25638. "ldr r12, [%[a], #20]\n\t"
  25639. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25640. "lsl r8, r10, #16\n\t"
  25641. "lsl r9, r12, #16\n\t"
  25642. "lsr r8, r8, #16\n\t"
  25643. "lsr r9, r9, #16\n\t"
  25644. "mul r9, r8, r9\n\t"
  25645. "adds r5, r5, r9\n\t"
  25646. "adcs r6, r6, #0\n\t"
  25647. "adc r7, r7, #0\n\t"
  25648. "lsr r9, r12, #16\n\t"
  25649. "mul r8, r9, r8\n\t"
  25650. "lsr r9, r8, #16\n\t"
  25651. "lsl r8, r8, #16\n\t"
  25652. "adds r5, r5, r8\n\t"
  25653. "adcs r6, r6, r9\n\t"
  25654. "adc r7, r7, #0\n\t"
  25655. "lsr r8, r10, #16\n\t"
  25656. "lsr r9, r12, #16\n\t"
  25657. "mul r9, r8, r9\n\t"
  25658. "adds r6, r6, r9\n\t"
  25659. "adc r7, r7, #0\n\t"
  25660. "lsl r9, r12, #16\n\t"
  25661. "lsr r9, r9, #16\n\t"
  25662. "mul r8, r9, r8\n\t"
  25663. "lsr r9, r8, #16\n\t"
  25664. "lsl r8, r8, #16\n\t"
  25665. "adds r5, r5, r8\n\t"
  25666. "adcs r6, r6, r9\n\t"
  25667. "adc r7, r7, #0\n\t"
  25668. #else
  25669. "umull r8, r9, r10, r12\n\t"
  25670. "adds r5, r5, r8\n\t"
  25671. "adcs r6, r6, r9\n\t"
  25672. "adc r7, r7, #0\n\t"
  25673. #endif
  25674. "adds r5, r5, r5\n\t"
  25675. "adcs r6, r6, r6\n\t"
  25676. "adc r7, r7, r7\n\t"
  25677. "adds r4, r4, r5\n\t"
  25678. "adcs r2, r2, r6\n\t"
  25679. "adc r3, r3, r7\n\t"
  25680. "str r4, [sp, #44]\n\t"
  25681. /* A[1] * A[11] */
  25682. "ldr r10, [%[a], #44]\n\t"
  25683. "ldr r12, [%[a], #4]\n\t"
  25684. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25685. "lsl r8, r10, #16\n\t"
  25686. "lsl r5, r12, #16\n\t"
  25687. "lsr r8, r8, #16\n\t"
  25688. "lsr r5, r5, #16\n\t"
  25689. "mul r5, r8, r5\n\t"
  25690. "lsr r9, r12, #16\n\t"
  25691. "mul r8, r9, r8\n\t"
  25692. "lsr r6, r8, #16\n\t"
  25693. "lsl r8, r8, #16\n\t"
  25694. "adds r5, r5, r8\n\t"
  25695. "adc r6, r6, #0\n\t"
  25696. "lsr r8, r10, #16\n\t"
  25697. "mul r9, r8, r9\n\t"
  25698. "add r6, r6, r9\n\t"
  25699. "lsl r9, r12, #16\n\t"
  25700. "lsr r9, r9, #16\n\t"
  25701. "mul r8, r9, r8\n\t"
  25702. "lsr r9, r8, #16\n\t"
  25703. "lsl r8, r8, #16\n\t"
  25704. "adds r5, r5, r8\n\t"
  25705. "adc r6, r6, r9\n\t"
  25706. #else
  25707. "umull r5, r6, r10, r12\n\t"
  25708. #endif
  25709. "mov r4, #0\n\t"
  25710. "mov r7, #0\n\t"
  25711. /* A[2] * A[10] */
  25712. "ldr r10, [%[a], #40]\n\t"
  25713. "ldr r12, [%[a], #8]\n\t"
  25714. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25715. "lsl r8, r10, #16\n\t"
  25716. "lsl r9, r12, #16\n\t"
  25717. "lsr r8, r8, #16\n\t"
  25718. "lsr r9, r9, #16\n\t"
  25719. "mul r9, r8, r9\n\t"
  25720. "adds r5, r5, r9\n\t"
  25721. "adcs r6, r6, #0\n\t"
  25722. "adc r7, r7, #0\n\t"
  25723. "lsr r9, r12, #16\n\t"
  25724. "mul r8, r9, r8\n\t"
  25725. "lsr r9, r8, #16\n\t"
  25726. "lsl r8, r8, #16\n\t"
  25727. "adds r5, r5, r8\n\t"
  25728. "adcs r6, r6, r9\n\t"
  25729. "adc r7, r7, #0\n\t"
  25730. "lsr r8, r10, #16\n\t"
  25731. "lsr r9, r12, #16\n\t"
  25732. "mul r9, r8, r9\n\t"
  25733. "adds r6, r6, r9\n\t"
  25734. "adc r7, r7, #0\n\t"
  25735. "lsl r9, r12, #16\n\t"
  25736. "lsr r9, r9, #16\n\t"
  25737. "mul r8, r9, r8\n\t"
  25738. "lsr r9, r8, #16\n\t"
  25739. "lsl r8, r8, #16\n\t"
  25740. "adds r5, r5, r8\n\t"
  25741. "adcs r6, r6, r9\n\t"
  25742. "adc r7, r7, #0\n\t"
  25743. #else
  25744. "umull r8, r9, r10, r12\n\t"
  25745. "adds r5, r5, r8\n\t"
  25746. "adcs r6, r6, r9\n\t"
  25747. "adc r7, r7, #0\n\t"
  25748. #endif
  25749. /* A[3] * A[9] */
  25750. "ldr r10, [%[a], #36]\n\t"
  25751. "ldr r12, [%[a], #12]\n\t"
  25752. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25753. "lsl r8, r10, #16\n\t"
  25754. "lsl r9, r12, #16\n\t"
  25755. "lsr r8, r8, #16\n\t"
  25756. "lsr r9, r9, #16\n\t"
  25757. "mul r9, r8, r9\n\t"
  25758. "adds r5, r5, r9\n\t"
  25759. "adcs r6, r6, #0\n\t"
  25760. "adc r7, r7, #0\n\t"
  25761. "lsr r9, r12, #16\n\t"
  25762. "mul r8, r9, r8\n\t"
  25763. "lsr r9, r8, #16\n\t"
  25764. "lsl r8, r8, #16\n\t"
  25765. "adds r5, r5, r8\n\t"
  25766. "adcs r6, r6, r9\n\t"
  25767. "adc r7, r7, #0\n\t"
  25768. "lsr r8, r10, #16\n\t"
  25769. "lsr r9, r12, #16\n\t"
  25770. "mul r9, r8, r9\n\t"
  25771. "adds r6, r6, r9\n\t"
  25772. "adc r7, r7, #0\n\t"
  25773. "lsl r9, r12, #16\n\t"
  25774. "lsr r9, r9, #16\n\t"
  25775. "mul r8, r9, r8\n\t"
  25776. "lsr r9, r8, #16\n\t"
  25777. "lsl r8, r8, #16\n\t"
  25778. "adds r5, r5, r8\n\t"
  25779. "adcs r6, r6, r9\n\t"
  25780. "adc r7, r7, #0\n\t"
  25781. #else
  25782. "umull r8, r9, r10, r12\n\t"
  25783. "adds r5, r5, r8\n\t"
  25784. "adcs r6, r6, r9\n\t"
  25785. "adc r7, r7, #0\n\t"
  25786. #endif
  25787. /* A[4] * A[8] */
  25788. "ldr r10, [%[a], #32]\n\t"
  25789. "ldr r12, [%[a], #16]\n\t"
  25790. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25791. "lsl r8, r10, #16\n\t"
  25792. "lsl r9, r12, #16\n\t"
  25793. "lsr r8, r8, #16\n\t"
  25794. "lsr r9, r9, #16\n\t"
  25795. "mul r9, r8, r9\n\t"
  25796. "adds r5, r5, r9\n\t"
  25797. "adcs r6, r6, #0\n\t"
  25798. "adc r7, r7, #0\n\t"
  25799. "lsr r9, r12, #16\n\t"
  25800. "mul r8, r9, r8\n\t"
  25801. "lsr r9, r8, #16\n\t"
  25802. "lsl r8, r8, #16\n\t"
  25803. "adds r5, r5, r8\n\t"
  25804. "adcs r6, r6, r9\n\t"
  25805. "adc r7, r7, #0\n\t"
  25806. "lsr r8, r10, #16\n\t"
  25807. "lsr r9, r12, #16\n\t"
  25808. "mul r9, r8, r9\n\t"
  25809. "adds r6, r6, r9\n\t"
  25810. "adc r7, r7, #0\n\t"
  25811. "lsl r9, r12, #16\n\t"
  25812. "lsr r9, r9, #16\n\t"
  25813. "mul r8, r9, r8\n\t"
  25814. "lsr r9, r8, #16\n\t"
  25815. "lsl r8, r8, #16\n\t"
  25816. "adds r5, r5, r8\n\t"
  25817. "adcs r6, r6, r9\n\t"
  25818. "adc r7, r7, #0\n\t"
  25819. #else
  25820. "umull r8, r9, r10, r12\n\t"
  25821. "adds r5, r5, r8\n\t"
  25822. "adcs r6, r6, r9\n\t"
  25823. "adc r7, r7, #0\n\t"
  25824. #endif
  25825. /* A[5] * A[7] */
  25826. "ldr r10, [%[a], #28]\n\t"
  25827. "ldr r12, [%[a], #20]\n\t"
  25828. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25829. "lsl r8, r10, #16\n\t"
  25830. "lsl r9, r12, #16\n\t"
  25831. "lsr r8, r8, #16\n\t"
  25832. "lsr r9, r9, #16\n\t"
  25833. "mul r9, r8, r9\n\t"
  25834. "adds r5, r5, r9\n\t"
  25835. "adcs r6, r6, #0\n\t"
  25836. "adc r7, r7, #0\n\t"
  25837. "lsr r9, r12, #16\n\t"
  25838. "mul r8, r9, r8\n\t"
  25839. "lsr r9, r8, #16\n\t"
  25840. "lsl r8, r8, #16\n\t"
  25841. "adds r5, r5, r8\n\t"
  25842. "adcs r6, r6, r9\n\t"
  25843. "adc r7, r7, #0\n\t"
  25844. "lsr r8, r10, #16\n\t"
  25845. "lsr r9, r12, #16\n\t"
  25846. "mul r9, r8, r9\n\t"
  25847. "adds r6, r6, r9\n\t"
  25848. "adc r7, r7, #0\n\t"
  25849. "lsl r9, r12, #16\n\t"
  25850. "lsr r9, r9, #16\n\t"
  25851. "mul r8, r9, r8\n\t"
  25852. "lsr r9, r8, #16\n\t"
  25853. "lsl r8, r8, #16\n\t"
  25854. "adds r5, r5, r8\n\t"
  25855. "adcs r6, r6, r9\n\t"
  25856. "adc r7, r7, #0\n\t"
  25857. #else
  25858. "umull r8, r9, r10, r12\n\t"
  25859. "adds r5, r5, r8\n\t"
  25860. "adcs r6, r6, r9\n\t"
  25861. "adc r7, r7, #0\n\t"
  25862. #endif
  25863. /* A[6] * A[6] */
  25864. "ldr r10, [%[a], #24]\n\t"
  25865. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25866. "lsl r8, r10, #16\n\t"
  25867. "lsr r9, r10, #16\n\t"
  25868. "lsr r8, r8, #16\n\t"
  25869. "mov r12, r8\n\t"
  25870. "mul r8, r12, r8\n\t"
  25871. "mov r12, r9\n\t"
  25872. "mul r9, r12, r9\n\t"
  25873. "adds r2, r2, r8\n\t"
  25874. "adcs r3, r3, r9\n\t"
  25875. "adc r4, r4, #0\n\t"
  25876. "lsr r9, r10, #16\n\t"
  25877. "lsl r8, r10, #16\n\t"
  25878. "lsr r8, r8, #16\n\t"
  25879. "mul r8, r9, r8\n\t"
  25880. "lsr r9, r8, #15\n\t"
  25881. "lsl r8, r8, #17\n\t"
  25882. "adds r2, r2, r8\n\t"
  25883. "adcs r3, r3, r9\n\t"
  25884. "adc r4, r4, #0\n\t"
  25885. "adds r5, r5, r5\n\t"
  25886. "adcs r6, r6, r6\n\t"
  25887. "adc r7, r7, r7\n\t"
  25888. #else
  25889. "umull r8, r9, r10, r10\n\t"
  25890. "adds r5, r5, r5\n\t"
  25891. "adcs r6, r6, r6\n\t"
  25892. "adc r7, r7, r7\n\t"
  25893. "adds r2, r2, r8\n\t"
  25894. "adcs r3, r3, r9\n\t"
  25895. "adc r4, r4, #0\n\t"
  25896. #endif
  25897. "adds r2, r2, r5\n\t"
  25898. "adcs r3, r3, r6\n\t"
  25899. "adc r4, r4, r7\n\t"
  25900. "str r2, [%[r], #48]\n\t"
  25901. /* A[2] * A[11] */
  25902. "ldr r10, [%[a], #44]\n\t"
  25903. "ldr r12, [%[a], #8]\n\t"
  25904. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25905. "lsl r8, r10, #16\n\t"
  25906. "lsl r5, r12, #16\n\t"
  25907. "lsr r8, r8, #16\n\t"
  25908. "lsr r5, r5, #16\n\t"
  25909. "mul r5, r8, r5\n\t"
  25910. "lsr r9, r12, #16\n\t"
  25911. "mul r8, r9, r8\n\t"
  25912. "lsr r6, r8, #16\n\t"
  25913. "lsl r8, r8, #16\n\t"
  25914. "adds r5, r5, r8\n\t"
  25915. "adc r6, r6, #0\n\t"
  25916. "lsr r8, r10, #16\n\t"
  25917. "mul r9, r8, r9\n\t"
  25918. "add r6, r6, r9\n\t"
  25919. "lsl r9, r12, #16\n\t"
  25920. "lsr r9, r9, #16\n\t"
  25921. "mul r8, r9, r8\n\t"
  25922. "lsr r9, r8, #16\n\t"
  25923. "lsl r8, r8, #16\n\t"
  25924. "adds r5, r5, r8\n\t"
  25925. "adc r6, r6, r9\n\t"
  25926. #else
  25927. "umull r5, r6, r10, r12\n\t"
  25928. #endif
  25929. "mov r2, #0\n\t"
  25930. "mov r7, #0\n\t"
  25931. /* A[3] * A[10] */
  25932. "ldr r10, [%[a], #40]\n\t"
  25933. "ldr r12, [%[a], #12]\n\t"
  25934. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25935. "lsl r8, r10, #16\n\t"
  25936. "lsl r9, r12, #16\n\t"
  25937. "lsr r8, r8, #16\n\t"
  25938. "lsr r9, r9, #16\n\t"
  25939. "mul r9, r8, r9\n\t"
  25940. "adds r5, r5, r9\n\t"
  25941. "adcs r6, r6, #0\n\t"
  25942. "adc r7, r7, #0\n\t"
  25943. "lsr r9, r12, #16\n\t"
  25944. "mul r8, r9, r8\n\t"
  25945. "lsr r9, r8, #16\n\t"
  25946. "lsl r8, r8, #16\n\t"
  25947. "adds r5, r5, r8\n\t"
  25948. "adcs r6, r6, r9\n\t"
  25949. "adc r7, r7, #0\n\t"
  25950. "lsr r8, r10, #16\n\t"
  25951. "lsr r9, r12, #16\n\t"
  25952. "mul r9, r8, r9\n\t"
  25953. "adds r6, r6, r9\n\t"
  25954. "adc r7, r7, #0\n\t"
  25955. "lsl r9, r12, #16\n\t"
  25956. "lsr r9, r9, #16\n\t"
  25957. "mul r8, r9, r8\n\t"
  25958. "lsr r9, r8, #16\n\t"
  25959. "lsl r8, r8, #16\n\t"
  25960. "adds r5, r5, r8\n\t"
  25961. "adcs r6, r6, r9\n\t"
  25962. "adc r7, r7, #0\n\t"
  25963. #else
  25964. "umull r8, r9, r10, r12\n\t"
  25965. "adds r5, r5, r8\n\t"
  25966. "adcs r6, r6, r9\n\t"
  25967. "adc r7, r7, #0\n\t"
  25968. #endif
  25969. /* A[4] * A[9] */
  25970. "ldr r10, [%[a], #36]\n\t"
  25971. "ldr r12, [%[a], #16]\n\t"
  25972. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  25973. "lsl r8, r10, #16\n\t"
  25974. "lsl r9, r12, #16\n\t"
  25975. "lsr r8, r8, #16\n\t"
  25976. "lsr r9, r9, #16\n\t"
  25977. "mul r9, r8, r9\n\t"
  25978. "adds r5, r5, r9\n\t"
  25979. "adcs r6, r6, #0\n\t"
  25980. "adc r7, r7, #0\n\t"
  25981. "lsr r9, r12, #16\n\t"
  25982. "mul r8, r9, r8\n\t"
  25983. "lsr r9, r8, #16\n\t"
  25984. "lsl r8, r8, #16\n\t"
  25985. "adds r5, r5, r8\n\t"
  25986. "adcs r6, r6, r9\n\t"
  25987. "adc r7, r7, #0\n\t"
  25988. "lsr r8, r10, #16\n\t"
  25989. "lsr r9, r12, #16\n\t"
  25990. "mul r9, r8, r9\n\t"
  25991. "adds r6, r6, r9\n\t"
  25992. "adc r7, r7, #0\n\t"
  25993. "lsl r9, r12, #16\n\t"
  25994. "lsr r9, r9, #16\n\t"
  25995. "mul r8, r9, r8\n\t"
  25996. "lsr r9, r8, #16\n\t"
  25997. "lsl r8, r8, #16\n\t"
  25998. "adds r5, r5, r8\n\t"
  25999. "adcs r6, r6, r9\n\t"
  26000. "adc r7, r7, #0\n\t"
  26001. #else
  26002. "umull r8, r9, r10, r12\n\t"
  26003. "adds r5, r5, r8\n\t"
  26004. "adcs r6, r6, r9\n\t"
  26005. "adc r7, r7, #0\n\t"
  26006. #endif
  26007. /* A[5] * A[8] */
  26008. "ldr r10, [%[a], #32]\n\t"
  26009. "ldr r12, [%[a], #20]\n\t"
  26010. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26011. "lsl r8, r10, #16\n\t"
  26012. "lsl r9, r12, #16\n\t"
  26013. "lsr r8, r8, #16\n\t"
  26014. "lsr r9, r9, #16\n\t"
  26015. "mul r9, r8, r9\n\t"
  26016. "adds r5, r5, r9\n\t"
  26017. "adcs r6, r6, #0\n\t"
  26018. "adc r7, r7, #0\n\t"
  26019. "lsr r9, r12, #16\n\t"
  26020. "mul r8, r9, r8\n\t"
  26021. "lsr r9, r8, #16\n\t"
  26022. "lsl r8, r8, #16\n\t"
  26023. "adds r5, r5, r8\n\t"
  26024. "adcs r6, r6, r9\n\t"
  26025. "adc r7, r7, #0\n\t"
  26026. "lsr r8, r10, #16\n\t"
  26027. "lsr r9, r12, #16\n\t"
  26028. "mul r9, r8, r9\n\t"
  26029. "adds r6, r6, r9\n\t"
  26030. "adc r7, r7, #0\n\t"
  26031. "lsl r9, r12, #16\n\t"
  26032. "lsr r9, r9, #16\n\t"
  26033. "mul r8, r9, r8\n\t"
  26034. "lsr r9, r8, #16\n\t"
  26035. "lsl r8, r8, #16\n\t"
  26036. "adds r5, r5, r8\n\t"
  26037. "adcs r6, r6, r9\n\t"
  26038. "adc r7, r7, #0\n\t"
  26039. #else
  26040. "umull r8, r9, r10, r12\n\t"
  26041. "adds r5, r5, r8\n\t"
  26042. "adcs r6, r6, r9\n\t"
  26043. "adc r7, r7, #0\n\t"
  26044. #endif
  26045. /* A[6] * A[7] */
  26046. "ldr r10, [%[a], #28]\n\t"
  26047. "ldr r12, [%[a], #24]\n\t"
  26048. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26049. "lsl r8, r10, #16\n\t"
  26050. "lsl r9, r12, #16\n\t"
  26051. "lsr r8, r8, #16\n\t"
  26052. "lsr r9, r9, #16\n\t"
  26053. "mul r9, r8, r9\n\t"
  26054. "adds r5, r5, r9\n\t"
  26055. "adcs r6, r6, #0\n\t"
  26056. "adc r7, r7, #0\n\t"
  26057. "lsr r9, r12, #16\n\t"
  26058. "mul r8, r9, r8\n\t"
  26059. "lsr r9, r8, #16\n\t"
  26060. "lsl r8, r8, #16\n\t"
  26061. "adds r5, r5, r8\n\t"
  26062. "adcs r6, r6, r9\n\t"
  26063. "adc r7, r7, #0\n\t"
  26064. "lsr r8, r10, #16\n\t"
  26065. "lsr r9, r12, #16\n\t"
  26066. "mul r9, r8, r9\n\t"
  26067. "adds r6, r6, r9\n\t"
  26068. "adc r7, r7, #0\n\t"
  26069. "lsl r9, r12, #16\n\t"
  26070. "lsr r9, r9, #16\n\t"
  26071. "mul r8, r9, r8\n\t"
  26072. "lsr r9, r8, #16\n\t"
  26073. "lsl r8, r8, #16\n\t"
  26074. "adds r5, r5, r8\n\t"
  26075. "adcs r6, r6, r9\n\t"
  26076. "adc r7, r7, #0\n\t"
  26077. #else
  26078. "umull r8, r9, r10, r12\n\t"
  26079. "adds r5, r5, r8\n\t"
  26080. "adcs r6, r6, r9\n\t"
  26081. "adc r7, r7, #0\n\t"
  26082. #endif
  26083. "adds r5, r5, r5\n\t"
  26084. "adcs r6, r6, r6\n\t"
  26085. "adc r7, r7, r7\n\t"
  26086. "adds r3, r3, r5\n\t"
  26087. "adcs r4, r4, r6\n\t"
  26088. "adc r2, r2, r7\n\t"
  26089. "str r3, [%[r], #52]\n\t"
  26090. /* A[3] * A[11] */
  26091. "ldr r10, [%[a], #44]\n\t"
  26092. "ldr r12, [%[a], #12]\n\t"
  26093. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26094. "lsl r8, r10, #16\n\t"
  26095. "lsl r5, r12, #16\n\t"
  26096. "lsr r8, r8, #16\n\t"
  26097. "lsr r5, r5, #16\n\t"
  26098. "mul r5, r8, r5\n\t"
  26099. "lsr r9, r12, #16\n\t"
  26100. "mul r8, r9, r8\n\t"
  26101. "lsr r6, r8, #16\n\t"
  26102. "lsl r8, r8, #16\n\t"
  26103. "adds r5, r5, r8\n\t"
  26104. "adc r6, r6, #0\n\t"
  26105. "lsr r8, r10, #16\n\t"
  26106. "mul r9, r8, r9\n\t"
  26107. "add r6, r6, r9\n\t"
  26108. "lsl r9, r12, #16\n\t"
  26109. "lsr r9, r9, #16\n\t"
  26110. "mul r8, r9, r8\n\t"
  26111. "lsr r9, r8, #16\n\t"
  26112. "lsl r8, r8, #16\n\t"
  26113. "adds r5, r5, r8\n\t"
  26114. "adc r6, r6, r9\n\t"
  26115. #else
  26116. "umull r5, r6, r10, r12\n\t"
  26117. #endif
  26118. "mov r3, #0\n\t"
  26119. "mov r7, #0\n\t"
  26120. /* A[4] * A[10] */
  26121. "ldr r10, [%[a], #40]\n\t"
  26122. "ldr r12, [%[a], #16]\n\t"
  26123. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26124. "lsl r8, r10, #16\n\t"
  26125. "lsl r9, r12, #16\n\t"
  26126. "lsr r8, r8, #16\n\t"
  26127. "lsr r9, r9, #16\n\t"
  26128. "mul r9, r8, r9\n\t"
  26129. "adds r5, r5, r9\n\t"
  26130. "adcs r6, r6, #0\n\t"
  26131. "adc r7, r7, #0\n\t"
  26132. "lsr r9, r12, #16\n\t"
  26133. "mul r8, r9, r8\n\t"
  26134. "lsr r9, r8, #16\n\t"
  26135. "lsl r8, r8, #16\n\t"
  26136. "adds r5, r5, r8\n\t"
  26137. "adcs r6, r6, r9\n\t"
  26138. "adc r7, r7, #0\n\t"
  26139. "lsr r8, r10, #16\n\t"
  26140. "lsr r9, r12, #16\n\t"
  26141. "mul r9, r8, r9\n\t"
  26142. "adds r6, r6, r9\n\t"
  26143. "adc r7, r7, #0\n\t"
  26144. "lsl r9, r12, #16\n\t"
  26145. "lsr r9, r9, #16\n\t"
  26146. "mul r8, r9, r8\n\t"
  26147. "lsr r9, r8, #16\n\t"
  26148. "lsl r8, r8, #16\n\t"
  26149. "adds r5, r5, r8\n\t"
  26150. "adcs r6, r6, r9\n\t"
  26151. "adc r7, r7, #0\n\t"
  26152. #else
  26153. "umull r8, r9, r10, r12\n\t"
  26154. "adds r5, r5, r8\n\t"
  26155. "adcs r6, r6, r9\n\t"
  26156. "adc r7, r7, #0\n\t"
  26157. #endif
  26158. /* A[5] * A[9] */
  26159. "ldr r10, [%[a], #36]\n\t"
  26160. "ldr r12, [%[a], #20]\n\t"
  26161. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26162. "lsl r8, r10, #16\n\t"
  26163. "lsl r9, r12, #16\n\t"
  26164. "lsr r8, r8, #16\n\t"
  26165. "lsr r9, r9, #16\n\t"
  26166. "mul r9, r8, r9\n\t"
  26167. "adds r5, r5, r9\n\t"
  26168. "adcs r6, r6, #0\n\t"
  26169. "adc r7, r7, #0\n\t"
  26170. "lsr r9, r12, #16\n\t"
  26171. "mul r8, r9, r8\n\t"
  26172. "lsr r9, r8, #16\n\t"
  26173. "lsl r8, r8, #16\n\t"
  26174. "adds r5, r5, r8\n\t"
  26175. "adcs r6, r6, r9\n\t"
  26176. "adc r7, r7, #0\n\t"
  26177. "lsr r8, r10, #16\n\t"
  26178. "lsr r9, r12, #16\n\t"
  26179. "mul r9, r8, r9\n\t"
  26180. "adds r6, r6, r9\n\t"
  26181. "adc r7, r7, #0\n\t"
  26182. "lsl r9, r12, #16\n\t"
  26183. "lsr r9, r9, #16\n\t"
  26184. "mul r8, r9, r8\n\t"
  26185. "lsr r9, r8, #16\n\t"
  26186. "lsl r8, r8, #16\n\t"
  26187. "adds r5, r5, r8\n\t"
  26188. "adcs r6, r6, r9\n\t"
  26189. "adc r7, r7, #0\n\t"
  26190. #else
  26191. "umull r8, r9, r10, r12\n\t"
  26192. "adds r5, r5, r8\n\t"
  26193. "adcs r6, r6, r9\n\t"
  26194. "adc r7, r7, #0\n\t"
  26195. #endif
  26196. /* A[6] * A[8] */
  26197. "ldr r10, [%[a], #32]\n\t"
  26198. "ldr r12, [%[a], #24]\n\t"
  26199. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26200. "lsl r8, r10, #16\n\t"
  26201. "lsl r9, r12, #16\n\t"
  26202. "lsr r8, r8, #16\n\t"
  26203. "lsr r9, r9, #16\n\t"
  26204. "mul r9, r8, r9\n\t"
  26205. "adds r5, r5, r9\n\t"
  26206. "adcs r6, r6, #0\n\t"
  26207. "adc r7, r7, #0\n\t"
  26208. "lsr r9, r12, #16\n\t"
  26209. "mul r8, r9, r8\n\t"
  26210. "lsr r9, r8, #16\n\t"
  26211. "lsl r8, r8, #16\n\t"
  26212. "adds r5, r5, r8\n\t"
  26213. "adcs r6, r6, r9\n\t"
  26214. "adc r7, r7, #0\n\t"
  26215. "lsr r8, r10, #16\n\t"
  26216. "lsr r9, r12, #16\n\t"
  26217. "mul r9, r8, r9\n\t"
  26218. "adds r6, r6, r9\n\t"
  26219. "adc r7, r7, #0\n\t"
  26220. "lsl r9, r12, #16\n\t"
  26221. "lsr r9, r9, #16\n\t"
  26222. "mul r8, r9, r8\n\t"
  26223. "lsr r9, r8, #16\n\t"
  26224. "lsl r8, r8, #16\n\t"
  26225. "adds r5, r5, r8\n\t"
  26226. "adcs r6, r6, r9\n\t"
  26227. "adc r7, r7, #0\n\t"
  26228. #else
  26229. "umull r8, r9, r10, r12\n\t"
  26230. "adds r5, r5, r8\n\t"
  26231. "adcs r6, r6, r9\n\t"
  26232. "adc r7, r7, #0\n\t"
  26233. #endif
  26234. /* A[7] * A[7] */
  26235. "ldr r10, [%[a], #28]\n\t"
  26236. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26237. "lsl r8, r10, #16\n\t"
  26238. "lsr r9, r10, #16\n\t"
  26239. "lsr r8, r8, #16\n\t"
  26240. "mov r12, r8\n\t"
  26241. "mul r8, r12, r8\n\t"
  26242. "mov r12, r9\n\t"
  26243. "mul r9, r12, r9\n\t"
  26244. "adds r4, r4, r8\n\t"
  26245. "adcs r2, r2, r9\n\t"
  26246. "adc r3, r3, #0\n\t"
  26247. "lsr r9, r10, #16\n\t"
  26248. "lsl r8, r10, #16\n\t"
  26249. "lsr r8, r8, #16\n\t"
  26250. "mul r8, r9, r8\n\t"
  26251. "lsr r9, r8, #15\n\t"
  26252. "lsl r8, r8, #17\n\t"
  26253. "adds r4, r4, r8\n\t"
  26254. "adcs r2, r2, r9\n\t"
  26255. "adc r3, r3, #0\n\t"
  26256. "adds r5, r5, r5\n\t"
  26257. "adcs r6, r6, r6\n\t"
  26258. "adc r7, r7, r7\n\t"
  26259. #else
  26260. "umull r8, r9, r10, r10\n\t"
  26261. "adds r5, r5, r5\n\t"
  26262. "adcs r6, r6, r6\n\t"
  26263. "adc r7, r7, r7\n\t"
  26264. "adds r4, r4, r8\n\t"
  26265. "adcs r2, r2, r9\n\t"
  26266. "adc r3, r3, #0\n\t"
  26267. #endif
  26268. "adds r4, r4, r5\n\t"
  26269. "adcs r2, r2, r6\n\t"
  26270. "adc r3, r3, r7\n\t"
  26271. "str r4, [%[r], #56]\n\t"
  26272. /* A[4] * A[11] */
  26273. "ldr r10, [%[a], #44]\n\t"
  26274. "ldr r12, [%[a], #16]\n\t"
  26275. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26276. "lsl r8, r10, #16\n\t"
  26277. "lsl r5, r12, #16\n\t"
  26278. "lsr r8, r8, #16\n\t"
  26279. "lsr r5, r5, #16\n\t"
  26280. "mul r5, r8, r5\n\t"
  26281. "lsr r9, r12, #16\n\t"
  26282. "mul r8, r9, r8\n\t"
  26283. "lsr r6, r8, #16\n\t"
  26284. "lsl r8, r8, #16\n\t"
  26285. "adds r5, r5, r8\n\t"
  26286. "adc r6, r6, #0\n\t"
  26287. "lsr r8, r10, #16\n\t"
  26288. "mul r9, r8, r9\n\t"
  26289. "add r6, r6, r9\n\t"
  26290. "lsl r9, r12, #16\n\t"
  26291. "lsr r9, r9, #16\n\t"
  26292. "mul r8, r9, r8\n\t"
  26293. "lsr r9, r8, #16\n\t"
  26294. "lsl r8, r8, #16\n\t"
  26295. "adds r5, r5, r8\n\t"
  26296. "adc r6, r6, r9\n\t"
  26297. #else
  26298. "umull r5, r6, r10, r12\n\t"
  26299. #endif
  26300. "mov r4, #0\n\t"
  26301. "mov r7, #0\n\t"
  26302. /* A[5] * A[10] */
  26303. "ldr r10, [%[a], #40]\n\t"
  26304. "ldr r12, [%[a], #20]\n\t"
  26305. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26306. "lsl r8, r10, #16\n\t"
  26307. "lsl r9, r12, #16\n\t"
  26308. "lsr r8, r8, #16\n\t"
  26309. "lsr r9, r9, #16\n\t"
  26310. "mul r9, r8, r9\n\t"
  26311. "adds r5, r5, r9\n\t"
  26312. "adcs r6, r6, #0\n\t"
  26313. "adc r7, r7, #0\n\t"
  26314. "lsr r9, r12, #16\n\t"
  26315. "mul r8, r9, r8\n\t"
  26316. "lsr r9, r8, #16\n\t"
  26317. "lsl r8, r8, #16\n\t"
  26318. "adds r5, r5, r8\n\t"
  26319. "adcs r6, r6, r9\n\t"
  26320. "adc r7, r7, #0\n\t"
  26321. "lsr r8, r10, #16\n\t"
  26322. "lsr r9, r12, #16\n\t"
  26323. "mul r9, r8, r9\n\t"
  26324. "adds r6, r6, r9\n\t"
  26325. "adc r7, r7, #0\n\t"
  26326. "lsl r9, r12, #16\n\t"
  26327. "lsr r9, r9, #16\n\t"
  26328. "mul r8, r9, r8\n\t"
  26329. "lsr r9, r8, #16\n\t"
  26330. "lsl r8, r8, #16\n\t"
  26331. "adds r5, r5, r8\n\t"
  26332. "adcs r6, r6, r9\n\t"
  26333. "adc r7, r7, #0\n\t"
  26334. #else
  26335. "umull r8, r9, r10, r12\n\t"
  26336. "adds r5, r5, r8\n\t"
  26337. "adcs r6, r6, r9\n\t"
  26338. "adc r7, r7, #0\n\t"
  26339. #endif
  26340. /* A[6] * A[9] */
  26341. "ldr r10, [%[a], #36]\n\t"
  26342. "ldr r12, [%[a], #24]\n\t"
  26343. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26344. "lsl r8, r10, #16\n\t"
  26345. "lsl r9, r12, #16\n\t"
  26346. "lsr r8, r8, #16\n\t"
  26347. "lsr r9, r9, #16\n\t"
  26348. "mul r9, r8, r9\n\t"
  26349. "adds r5, r5, r9\n\t"
  26350. "adcs r6, r6, #0\n\t"
  26351. "adc r7, r7, #0\n\t"
  26352. "lsr r9, r12, #16\n\t"
  26353. "mul r8, r9, r8\n\t"
  26354. "lsr r9, r8, #16\n\t"
  26355. "lsl r8, r8, #16\n\t"
  26356. "adds r5, r5, r8\n\t"
  26357. "adcs r6, r6, r9\n\t"
  26358. "adc r7, r7, #0\n\t"
  26359. "lsr r8, r10, #16\n\t"
  26360. "lsr r9, r12, #16\n\t"
  26361. "mul r9, r8, r9\n\t"
  26362. "adds r6, r6, r9\n\t"
  26363. "adc r7, r7, #0\n\t"
  26364. "lsl r9, r12, #16\n\t"
  26365. "lsr r9, r9, #16\n\t"
  26366. "mul r8, r9, r8\n\t"
  26367. "lsr r9, r8, #16\n\t"
  26368. "lsl r8, r8, #16\n\t"
  26369. "adds r5, r5, r8\n\t"
  26370. "adcs r6, r6, r9\n\t"
  26371. "adc r7, r7, #0\n\t"
  26372. #else
  26373. "umull r8, r9, r10, r12\n\t"
  26374. "adds r5, r5, r8\n\t"
  26375. "adcs r6, r6, r9\n\t"
  26376. "adc r7, r7, #0\n\t"
  26377. #endif
  26378. /* A[7] * A[8] */
  26379. "ldr r10, [%[a], #32]\n\t"
  26380. "ldr r12, [%[a], #28]\n\t"
  26381. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26382. "lsl r8, r10, #16\n\t"
  26383. "lsl r9, r12, #16\n\t"
  26384. "lsr r8, r8, #16\n\t"
  26385. "lsr r9, r9, #16\n\t"
  26386. "mul r9, r8, r9\n\t"
  26387. "adds r5, r5, r9\n\t"
  26388. "adcs r6, r6, #0\n\t"
  26389. "adc r7, r7, #0\n\t"
  26390. "lsr r9, r12, #16\n\t"
  26391. "mul r8, r9, r8\n\t"
  26392. "lsr r9, r8, #16\n\t"
  26393. "lsl r8, r8, #16\n\t"
  26394. "adds r5, r5, r8\n\t"
  26395. "adcs r6, r6, r9\n\t"
  26396. "adc r7, r7, #0\n\t"
  26397. "lsr r8, r10, #16\n\t"
  26398. "lsr r9, r12, #16\n\t"
  26399. "mul r9, r8, r9\n\t"
  26400. "adds r6, r6, r9\n\t"
  26401. "adc r7, r7, #0\n\t"
  26402. "lsl r9, r12, #16\n\t"
  26403. "lsr r9, r9, #16\n\t"
  26404. "mul r8, r9, r8\n\t"
  26405. "lsr r9, r8, #16\n\t"
  26406. "lsl r8, r8, #16\n\t"
  26407. "adds r5, r5, r8\n\t"
  26408. "adcs r6, r6, r9\n\t"
  26409. "adc r7, r7, #0\n\t"
  26410. #else
  26411. "umull r8, r9, r10, r12\n\t"
  26412. "adds r5, r5, r8\n\t"
  26413. "adcs r6, r6, r9\n\t"
  26414. "adc r7, r7, #0\n\t"
  26415. #endif
  26416. "adds r5, r5, r5\n\t"
  26417. "adcs r6, r6, r6\n\t"
  26418. "adc r7, r7, r7\n\t"
  26419. "adds r2, r2, r5\n\t"
  26420. "adcs r3, r3, r6\n\t"
  26421. "adc r4, r4, r7\n\t"
  26422. "str r2, [%[r], #60]\n\t"
  26423. /* A[5] * A[11] */
  26424. "ldr r10, [%[a], #44]\n\t"
  26425. "ldr r12, [%[a], #20]\n\t"
  26426. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26427. "lsl r8, r10, #16\n\t"
  26428. "lsl r5, r12, #16\n\t"
  26429. "lsr r8, r8, #16\n\t"
  26430. "lsr r5, r5, #16\n\t"
  26431. "mul r5, r8, r5\n\t"
  26432. "lsr r9, r12, #16\n\t"
  26433. "mul r8, r9, r8\n\t"
  26434. "lsr r6, r8, #16\n\t"
  26435. "lsl r8, r8, #16\n\t"
  26436. "adds r5, r5, r8\n\t"
  26437. "adc r6, r6, #0\n\t"
  26438. "lsr r8, r10, #16\n\t"
  26439. "mul r9, r8, r9\n\t"
  26440. "add r6, r6, r9\n\t"
  26441. "lsl r9, r12, #16\n\t"
  26442. "lsr r9, r9, #16\n\t"
  26443. "mul r8, r9, r8\n\t"
  26444. "lsr r9, r8, #16\n\t"
  26445. "lsl r8, r8, #16\n\t"
  26446. "adds r5, r5, r8\n\t"
  26447. "adc r6, r6, r9\n\t"
  26448. #else
  26449. "umull r5, r6, r10, r12\n\t"
  26450. #endif
  26451. "mov r2, #0\n\t"
  26452. "mov r7, #0\n\t"
  26453. /* A[6] * A[10] */
  26454. "ldr r10, [%[a], #40]\n\t"
  26455. "ldr r12, [%[a], #24]\n\t"
  26456. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26457. "lsl r8, r10, #16\n\t"
  26458. "lsl r9, r12, #16\n\t"
  26459. "lsr r8, r8, #16\n\t"
  26460. "lsr r9, r9, #16\n\t"
  26461. "mul r9, r8, r9\n\t"
  26462. "adds r5, r5, r9\n\t"
  26463. "adcs r6, r6, #0\n\t"
  26464. "adc r7, r7, #0\n\t"
  26465. "lsr r9, r12, #16\n\t"
  26466. "mul r8, r9, r8\n\t"
  26467. "lsr r9, r8, #16\n\t"
  26468. "lsl r8, r8, #16\n\t"
  26469. "adds r5, r5, r8\n\t"
  26470. "adcs r6, r6, r9\n\t"
  26471. "adc r7, r7, #0\n\t"
  26472. "lsr r8, r10, #16\n\t"
  26473. "lsr r9, r12, #16\n\t"
  26474. "mul r9, r8, r9\n\t"
  26475. "adds r6, r6, r9\n\t"
  26476. "adc r7, r7, #0\n\t"
  26477. "lsl r9, r12, #16\n\t"
  26478. "lsr r9, r9, #16\n\t"
  26479. "mul r8, r9, r8\n\t"
  26480. "lsr r9, r8, #16\n\t"
  26481. "lsl r8, r8, #16\n\t"
  26482. "adds r5, r5, r8\n\t"
  26483. "adcs r6, r6, r9\n\t"
  26484. "adc r7, r7, #0\n\t"
  26485. #else
  26486. "umull r8, r9, r10, r12\n\t"
  26487. "adds r5, r5, r8\n\t"
  26488. "adcs r6, r6, r9\n\t"
  26489. "adc r7, r7, #0\n\t"
  26490. #endif
  26491. /* A[7] * A[9] */
  26492. "ldr r10, [%[a], #36]\n\t"
  26493. "ldr r12, [%[a], #28]\n\t"
  26494. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26495. "lsl r8, r10, #16\n\t"
  26496. "lsl r9, r12, #16\n\t"
  26497. "lsr r8, r8, #16\n\t"
  26498. "lsr r9, r9, #16\n\t"
  26499. "mul r9, r8, r9\n\t"
  26500. "adds r5, r5, r9\n\t"
  26501. "adcs r6, r6, #0\n\t"
  26502. "adc r7, r7, #0\n\t"
  26503. "lsr r9, r12, #16\n\t"
  26504. "mul r8, r9, r8\n\t"
  26505. "lsr r9, r8, #16\n\t"
  26506. "lsl r8, r8, #16\n\t"
  26507. "adds r5, r5, r8\n\t"
  26508. "adcs r6, r6, r9\n\t"
  26509. "adc r7, r7, #0\n\t"
  26510. "lsr r8, r10, #16\n\t"
  26511. "lsr r9, r12, #16\n\t"
  26512. "mul r9, r8, r9\n\t"
  26513. "adds r6, r6, r9\n\t"
  26514. "adc r7, r7, #0\n\t"
  26515. "lsl r9, r12, #16\n\t"
  26516. "lsr r9, r9, #16\n\t"
  26517. "mul r8, r9, r8\n\t"
  26518. "lsr r9, r8, #16\n\t"
  26519. "lsl r8, r8, #16\n\t"
  26520. "adds r5, r5, r8\n\t"
  26521. "adcs r6, r6, r9\n\t"
  26522. "adc r7, r7, #0\n\t"
  26523. #else
  26524. "umull r8, r9, r10, r12\n\t"
  26525. "adds r5, r5, r8\n\t"
  26526. "adcs r6, r6, r9\n\t"
  26527. "adc r7, r7, #0\n\t"
  26528. #endif
  26529. /* A[8] * A[8] */
  26530. "ldr r10, [%[a], #32]\n\t"
  26531. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26532. "lsl r8, r10, #16\n\t"
  26533. "lsr r9, r10, #16\n\t"
  26534. "lsr r8, r8, #16\n\t"
  26535. "mov r12, r8\n\t"
  26536. "mul r8, r12, r8\n\t"
  26537. "mov r12, r9\n\t"
  26538. "mul r9, r12, r9\n\t"
  26539. "adds r3, r3, r8\n\t"
  26540. "adcs r4, r4, r9\n\t"
  26541. "adc r2, r2, #0\n\t"
  26542. "lsr r9, r10, #16\n\t"
  26543. "lsl r8, r10, #16\n\t"
  26544. "lsr r8, r8, #16\n\t"
  26545. "mul r8, r9, r8\n\t"
  26546. "lsr r9, r8, #15\n\t"
  26547. "lsl r8, r8, #17\n\t"
  26548. "adds r3, r3, r8\n\t"
  26549. "adcs r4, r4, r9\n\t"
  26550. "adc r2, r2, #0\n\t"
  26551. "adds r5, r5, r5\n\t"
  26552. "adcs r6, r6, r6\n\t"
  26553. "adc r7, r7, r7\n\t"
  26554. #else
  26555. "umull r8, r9, r10, r10\n\t"
  26556. "adds r5, r5, r5\n\t"
  26557. "adcs r6, r6, r6\n\t"
  26558. "adc r7, r7, r7\n\t"
  26559. "adds r3, r3, r8\n\t"
  26560. "adcs r4, r4, r9\n\t"
  26561. "adc r2, r2, #0\n\t"
  26562. #endif
  26563. "adds r3, r3, r5\n\t"
  26564. "adcs r4, r4, r6\n\t"
  26565. "adc r2, r2, r7\n\t"
  26566. "str r3, [%[r], #64]\n\t"
  26567. /* A[6] * A[11] */
  26568. "ldr r10, [%[a], #44]\n\t"
  26569. "ldr r12, [%[a], #24]\n\t"
  26570. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26571. "lsl r8, r10, #16\n\t"
  26572. "lsl r5, r12, #16\n\t"
  26573. "lsr r8, r8, #16\n\t"
  26574. "lsr r5, r5, #16\n\t"
  26575. "mul r5, r8, r5\n\t"
  26576. "lsr r9, r12, #16\n\t"
  26577. "mul r8, r9, r8\n\t"
  26578. "lsr r6, r8, #16\n\t"
  26579. "lsl r8, r8, #16\n\t"
  26580. "adds r5, r5, r8\n\t"
  26581. "adc r6, r6, #0\n\t"
  26582. "lsr r8, r10, #16\n\t"
  26583. "mul r9, r8, r9\n\t"
  26584. "add r6, r6, r9\n\t"
  26585. "lsl r9, r12, #16\n\t"
  26586. "lsr r9, r9, #16\n\t"
  26587. "mul r8, r9, r8\n\t"
  26588. "lsr r9, r8, #16\n\t"
  26589. "lsl r8, r8, #16\n\t"
  26590. "adds r5, r5, r8\n\t"
  26591. "adc r6, r6, r9\n\t"
  26592. #else
  26593. "umull r5, r6, r10, r12\n\t"
  26594. #endif
  26595. "mov r3, #0\n\t"
  26596. "mov r7, #0\n\t"
  26597. /* A[7] * A[10] */
  26598. "ldr r10, [%[a], #40]\n\t"
  26599. "ldr r12, [%[a], #28]\n\t"
  26600. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26601. "lsl r8, r10, #16\n\t"
  26602. "lsl r9, r12, #16\n\t"
  26603. "lsr r8, r8, #16\n\t"
  26604. "lsr r9, r9, #16\n\t"
  26605. "mul r9, r8, r9\n\t"
  26606. "adds r5, r5, r9\n\t"
  26607. "adcs r6, r6, #0\n\t"
  26608. "adc r7, r7, #0\n\t"
  26609. "lsr r9, r12, #16\n\t"
  26610. "mul r8, r9, r8\n\t"
  26611. "lsr r9, r8, #16\n\t"
  26612. "lsl r8, r8, #16\n\t"
  26613. "adds r5, r5, r8\n\t"
  26614. "adcs r6, r6, r9\n\t"
  26615. "adc r7, r7, #0\n\t"
  26616. "lsr r8, r10, #16\n\t"
  26617. "lsr r9, r12, #16\n\t"
  26618. "mul r9, r8, r9\n\t"
  26619. "adds r6, r6, r9\n\t"
  26620. "adc r7, r7, #0\n\t"
  26621. "lsl r9, r12, #16\n\t"
  26622. "lsr r9, r9, #16\n\t"
  26623. "mul r8, r9, r8\n\t"
  26624. "lsr r9, r8, #16\n\t"
  26625. "lsl r8, r8, #16\n\t"
  26626. "adds r5, r5, r8\n\t"
  26627. "adcs r6, r6, r9\n\t"
  26628. "adc r7, r7, #0\n\t"
  26629. #else
  26630. "umull r8, r9, r10, r12\n\t"
  26631. "adds r5, r5, r8\n\t"
  26632. "adcs r6, r6, r9\n\t"
  26633. "adc r7, r7, #0\n\t"
  26634. #endif
  26635. /* A[8] * A[9] */
  26636. "ldr r10, [%[a], #36]\n\t"
  26637. "ldr r12, [%[a], #32]\n\t"
  26638. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26639. "lsl r8, r10, #16\n\t"
  26640. "lsl r9, r12, #16\n\t"
  26641. "lsr r8, r8, #16\n\t"
  26642. "lsr r9, r9, #16\n\t"
  26643. "mul r9, r8, r9\n\t"
  26644. "adds r5, r5, r9\n\t"
  26645. "adcs r6, r6, #0\n\t"
  26646. "adc r7, r7, #0\n\t"
  26647. "lsr r9, r12, #16\n\t"
  26648. "mul r8, r9, r8\n\t"
  26649. "lsr r9, r8, #16\n\t"
  26650. "lsl r8, r8, #16\n\t"
  26651. "adds r5, r5, r8\n\t"
  26652. "adcs r6, r6, r9\n\t"
  26653. "adc r7, r7, #0\n\t"
  26654. "lsr r8, r10, #16\n\t"
  26655. "lsr r9, r12, #16\n\t"
  26656. "mul r9, r8, r9\n\t"
  26657. "adds r6, r6, r9\n\t"
  26658. "adc r7, r7, #0\n\t"
  26659. "lsl r9, r12, #16\n\t"
  26660. "lsr r9, r9, #16\n\t"
  26661. "mul r8, r9, r8\n\t"
  26662. "lsr r9, r8, #16\n\t"
  26663. "lsl r8, r8, #16\n\t"
  26664. "adds r5, r5, r8\n\t"
  26665. "adcs r6, r6, r9\n\t"
  26666. "adc r7, r7, #0\n\t"
  26667. #else
  26668. "umull r8, r9, r10, r12\n\t"
  26669. "adds r5, r5, r8\n\t"
  26670. "adcs r6, r6, r9\n\t"
  26671. "adc r7, r7, #0\n\t"
  26672. #endif
  26673. "adds r5, r5, r5\n\t"
  26674. "adcs r6, r6, r6\n\t"
  26675. "adc r7, r7, r7\n\t"
  26676. "adds r4, r4, r5\n\t"
  26677. "adcs r2, r2, r6\n\t"
  26678. "adc r3, r3, r7\n\t"
  26679. "str r4, [%[r], #68]\n\t"
  26680. /* A[7] * A[11] */
  26681. "ldr r10, [%[a], #44]\n\t"
  26682. "ldr r12, [%[a], #28]\n\t"
  26683. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26684. "lsl r8, r10, #16\n\t"
  26685. "lsl r9, r12, #16\n\t"
  26686. "lsr r8, r8, #16\n\t"
  26687. "lsr r9, r9, #16\n\t"
  26688. "mul r9, r8, r9\n\t"
  26689. "adds r2, r2, r9\n\t"
  26690. "adcs r3, r3, #0\n\t"
  26691. "mov r4, #0\n\t"
  26692. "adc r4, r4, #0\n\t"
  26693. "adds r2, r2, r9\n\t"
  26694. "adcs r3, r3, #0\n\t"
  26695. "adc r4, r4, #0\n\t"
  26696. "lsr r9, r12, #16\n\t"
  26697. "mul r8, r9, r8\n\t"
  26698. "lsr r9, r8, #16\n\t"
  26699. "lsl r8, r8, #16\n\t"
  26700. "adds r2, r2, r8\n\t"
  26701. "adcs r3, r3, r9\n\t"
  26702. "adc r4, r4, #0\n\t"
  26703. "adds r2, r2, r8\n\t"
  26704. "adcs r3, r3, r9\n\t"
  26705. "adc r4, r4, #0\n\t"
  26706. "lsr r8, r10, #16\n\t"
  26707. "lsr r9, r12, #16\n\t"
  26708. "mul r9, r8, r9\n\t"
  26709. "adds r3, r3, r9\n\t"
  26710. "adc r4, r4, #0\n\t"
  26711. "adds r3, r3, r9\n\t"
  26712. "adc r4, r4, #0\n\t"
  26713. "lsl r9, r12, #16\n\t"
  26714. "lsr r9, r9, #16\n\t"
  26715. "mul r8, r9, r8\n\t"
  26716. "lsr r9, r8, #16\n\t"
  26717. "lsl r8, r8, #16\n\t"
  26718. "adds r2, r2, r8\n\t"
  26719. "adcs r3, r3, r9\n\t"
  26720. "adc r4, r4, #0\n\t"
  26721. "adds r2, r2, r8\n\t"
  26722. "adcs r3, r3, r9\n\t"
  26723. "adc r4, r4, #0\n\t"
  26724. #else
  26725. "umull r8, r9, r10, r12\n\t"
  26726. "adds r2, r2, r8\n\t"
  26727. "adcs r3, r3, r9\n\t"
  26728. "mov r4, #0\n\t"
  26729. "adc r4, r4, #0\n\t"
  26730. "adds r2, r2, r8\n\t"
  26731. "adcs r3, r3, r9\n\t"
  26732. "mov r4, #0\n\t"
  26733. "adc r4, r4, #0\n\t"
  26734. #endif
  26735. /* A[8] * A[10] */
  26736. "ldr r10, [%[a], #40]\n\t"
  26737. "ldr r12, [%[a], #32]\n\t"
  26738. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26739. "lsl r8, r10, #16\n\t"
  26740. "lsl r9, r12, #16\n\t"
  26741. "lsr r8, r8, #16\n\t"
  26742. "lsr r9, r9, #16\n\t"
  26743. "mul r9, r8, r9\n\t"
  26744. "adds r2, r2, r9\n\t"
  26745. "adcs r3, r3, #0\n\t"
  26746. "adc r4, r4, #0\n\t"
  26747. "adds r2, r2, r9\n\t"
  26748. "adcs r3, r3, #0\n\t"
  26749. "adc r4, r4, #0\n\t"
  26750. "lsr r9, r12, #16\n\t"
  26751. "mul r8, r9, r8\n\t"
  26752. "lsr r9, r8, #16\n\t"
  26753. "lsl r8, r8, #16\n\t"
  26754. "adds r2, r2, r8\n\t"
  26755. "adcs r3, r3, r9\n\t"
  26756. "adc r4, r4, #0\n\t"
  26757. "adds r2, r2, r8\n\t"
  26758. "adcs r3, r3, r9\n\t"
  26759. "adc r4, r4, #0\n\t"
  26760. "lsr r8, r10, #16\n\t"
  26761. "lsr r9, r12, #16\n\t"
  26762. "mul r9, r8, r9\n\t"
  26763. "adds r3, r3, r9\n\t"
  26764. "adc r4, r4, #0\n\t"
  26765. "adds r3, r3, r9\n\t"
  26766. "adc r4, r4, #0\n\t"
  26767. "lsl r9, r12, #16\n\t"
  26768. "lsr r9, r9, #16\n\t"
  26769. "mul r8, r9, r8\n\t"
  26770. "lsr r9, r8, #16\n\t"
  26771. "lsl r8, r8, #16\n\t"
  26772. "adds r2, r2, r8\n\t"
  26773. "adcs r3, r3, r9\n\t"
  26774. "adc r4, r4, #0\n\t"
  26775. "adds r2, r2, r8\n\t"
  26776. "adcs r3, r3, r9\n\t"
  26777. "adc r4, r4, #0\n\t"
  26778. #else
  26779. "umull r8, r9, r10, r12\n\t"
  26780. "adds r2, r2, r8\n\t"
  26781. "adcs r3, r3, r9\n\t"
  26782. "adc r4, r4, #0\n\t"
  26783. "adds r2, r2, r8\n\t"
  26784. "adcs r3, r3, r9\n\t"
  26785. "adc r4, r4, #0\n\t"
  26786. #endif
  26787. /* A[9] * A[9] */
  26788. "ldr r10, [%[a], #36]\n\t"
  26789. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26790. "lsl r8, r10, #16\n\t"
  26791. "lsr r9, r10, #16\n\t"
  26792. "lsr r8, r8, #16\n\t"
  26793. "mov r12, r8\n\t"
  26794. "mul r8, r12, r8\n\t"
  26795. "mov r12, r9\n\t"
  26796. "mul r9, r12, r9\n\t"
  26797. "adds r2, r2, r8\n\t"
  26798. "adcs r3, r3, r9\n\t"
  26799. "adc r4, r4, #0\n\t"
  26800. "lsr r9, r10, #16\n\t"
  26801. "lsl r8, r10, #16\n\t"
  26802. "lsr r8, r8, #16\n\t"
  26803. "mul r8, r9, r8\n\t"
  26804. "lsr r9, r8, #15\n\t"
  26805. "lsl r8, r8, #17\n\t"
  26806. "adds r2, r2, r8\n\t"
  26807. "adcs r3, r3, r9\n\t"
  26808. "adc r4, r4, #0\n\t"
  26809. #else
  26810. "umull r8, r9, r10, r10\n\t"
  26811. "adds r2, r2, r8\n\t"
  26812. "adcs r3, r3, r9\n\t"
  26813. "adc r4, r4, #0\n\t"
  26814. #endif
  26815. "str r2, [%[r], #72]\n\t"
  26816. /* A[8] * A[11] */
  26817. "ldr r10, [%[a], #44]\n\t"
  26818. "ldr r12, [%[a], #32]\n\t"
  26819. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26820. "lsl r8, r10, #16\n\t"
  26821. "lsl r9, r12, #16\n\t"
  26822. "lsr r8, r8, #16\n\t"
  26823. "lsr r9, r9, #16\n\t"
  26824. "mul r9, r8, r9\n\t"
  26825. "adds r3, r3, r9\n\t"
  26826. "adcs r4, r4, #0\n\t"
  26827. "mov r2, #0\n\t"
  26828. "adc r2, r2, #0\n\t"
  26829. "adds r3, r3, r9\n\t"
  26830. "adcs r4, r4, #0\n\t"
  26831. "adc r2, r2, #0\n\t"
  26832. "lsr r9, r12, #16\n\t"
  26833. "mul r8, r9, r8\n\t"
  26834. "lsr r9, r8, #16\n\t"
  26835. "lsl r8, r8, #16\n\t"
  26836. "adds r3, r3, r8\n\t"
  26837. "adcs r4, r4, r9\n\t"
  26838. "adc r2, r2, #0\n\t"
  26839. "adds r3, r3, r8\n\t"
  26840. "adcs r4, r4, r9\n\t"
  26841. "adc r2, r2, #0\n\t"
  26842. "lsr r8, r10, #16\n\t"
  26843. "lsr r9, r12, #16\n\t"
  26844. "mul r9, r8, r9\n\t"
  26845. "adds r4, r4, r9\n\t"
  26846. "adc r2, r2, #0\n\t"
  26847. "adds r4, r4, r9\n\t"
  26848. "adc r2, r2, #0\n\t"
  26849. "lsl r9, r12, #16\n\t"
  26850. "lsr r9, r9, #16\n\t"
  26851. "mul r8, r9, r8\n\t"
  26852. "lsr r9, r8, #16\n\t"
  26853. "lsl r8, r8, #16\n\t"
  26854. "adds r3, r3, r8\n\t"
  26855. "adcs r4, r4, r9\n\t"
  26856. "adc r2, r2, #0\n\t"
  26857. "adds r3, r3, r8\n\t"
  26858. "adcs r4, r4, r9\n\t"
  26859. "adc r2, r2, #0\n\t"
  26860. #else
  26861. "umull r8, r9, r10, r12\n\t"
  26862. "adds r3, r3, r8\n\t"
  26863. "adcs r4, r4, r9\n\t"
  26864. "mov r2, #0\n\t"
  26865. "adc r2, r2, #0\n\t"
  26866. "adds r3, r3, r8\n\t"
  26867. "adcs r4, r4, r9\n\t"
  26868. "mov r2, #0\n\t"
  26869. "adc r2, r2, #0\n\t"
  26870. #endif
  26871. /* A[9] * A[10] */
  26872. "ldr r10, [%[a], #40]\n\t"
  26873. "ldr r12, [%[a], #36]\n\t"
  26874. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26875. "lsl r8, r10, #16\n\t"
  26876. "lsl r9, r12, #16\n\t"
  26877. "lsr r8, r8, #16\n\t"
  26878. "lsr r9, r9, #16\n\t"
  26879. "mul r9, r8, r9\n\t"
  26880. "adds r3, r3, r9\n\t"
  26881. "adcs r4, r4, #0\n\t"
  26882. "adc r2, r2, #0\n\t"
  26883. "adds r3, r3, r9\n\t"
  26884. "adcs r4, r4, #0\n\t"
  26885. "adc r2, r2, #0\n\t"
  26886. "lsr r9, r12, #16\n\t"
  26887. "mul r8, r9, r8\n\t"
  26888. "lsr r9, r8, #16\n\t"
  26889. "lsl r8, r8, #16\n\t"
  26890. "adds r3, r3, r8\n\t"
  26891. "adcs r4, r4, r9\n\t"
  26892. "adc r2, r2, #0\n\t"
  26893. "adds r3, r3, r8\n\t"
  26894. "adcs r4, r4, r9\n\t"
  26895. "adc r2, r2, #0\n\t"
  26896. "lsr r8, r10, #16\n\t"
  26897. "lsr r9, r12, #16\n\t"
  26898. "mul r9, r8, r9\n\t"
  26899. "adds r4, r4, r9\n\t"
  26900. "adc r2, r2, #0\n\t"
  26901. "adds r4, r4, r9\n\t"
  26902. "adc r2, r2, #0\n\t"
  26903. "lsl r9, r12, #16\n\t"
  26904. "lsr r9, r9, #16\n\t"
  26905. "mul r8, r9, r8\n\t"
  26906. "lsr r9, r8, #16\n\t"
  26907. "lsl r8, r8, #16\n\t"
  26908. "adds r3, r3, r8\n\t"
  26909. "adcs r4, r4, r9\n\t"
  26910. "adc r2, r2, #0\n\t"
  26911. "adds r3, r3, r8\n\t"
  26912. "adcs r4, r4, r9\n\t"
  26913. "adc r2, r2, #0\n\t"
  26914. #else
  26915. "umull r8, r9, r10, r12\n\t"
  26916. "adds r3, r3, r8\n\t"
  26917. "adcs r4, r4, r9\n\t"
  26918. "adc r2, r2, #0\n\t"
  26919. "adds r3, r3, r8\n\t"
  26920. "adcs r4, r4, r9\n\t"
  26921. "adc r2, r2, #0\n\t"
  26922. #endif
  26923. "str r3, [%[r], #76]\n\t"
  26924. /* A[9] * A[11] */
  26925. "ldr r10, [%[a], #44]\n\t"
  26926. "ldr r12, [%[a], #36]\n\t"
  26927. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26928. "lsl r8, r10, #16\n\t"
  26929. "lsl r9, r12, #16\n\t"
  26930. "lsr r8, r8, #16\n\t"
  26931. "lsr r9, r9, #16\n\t"
  26932. "mul r9, r8, r9\n\t"
  26933. "adds r4, r4, r9\n\t"
  26934. "adcs r2, r2, #0\n\t"
  26935. "mov r3, #0\n\t"
  26936. "adc r3, r3, #0\n\t"
  26937. "adds r4, r4, r9\n\t"
  26938. "adcs r2, r2, #0\n\t"
  26939. "adc r3, r3, #0\n\t"
  26940. "lsr r9, r12, #16\n\t"
  26941. "mul r8, r9, r8\n\t"
  26942. "lsr r9, r8, #16\n\t"
  26943. "lsl r8, r8, #16\n\t"
  26944. "adds r4, r4, r8\n\t"
  26945. "adcs r2, r2, r9\n\t"
  26946. "adc r3, r3, #0\n\t"
  26947. "adds r4, r4, r8\n\t"
  26948. "adcs r2, r2, r9\n\t"
  26949. "adc r3, r3, #0\n\t"
  26950. "lsr r8, r10, #16\n\t"
  26951. "lsr r9, r12, #16\n\t"
  26952. "mul r9, r8, r9\n\t"
  26953. "adds r2, r2, r9\n\t"
  26954. "adc r3, r3, #0\n\t"
  26955. "adds r2, r2, r9\n\t"
  26956. "adc r3, r3, #0\n\t"
  26957. "lsl r9, r12, #16\n\t"
  26958. "lsr r9, r9, #16\n\t"
  26959. "mul r8, r9, r8\n\t"
  26960. "lsr r9, r8, #16\n\t"
  26961. "lsl r8, r8, #16\n\t"
  26962. "adds r4, r4, r8\n\t"
  26963. "adcs r2, r2, r9\n\t"
  26964. "adc r3, r3, #0\n\t"
  26965. "adds r4, r4, r8\n\t"
  26966. "adcs r2, r2, r9\n\t"
  26967. "adc r3, r3, #0\n\t"
  26968. #else
  26969. "umull r8, r9, r10, r12\n\t"
  26970. "adds r4, r4, r8\n\t"
  26971. "adcs r2, r2, r9\n\t"
  26972. "mov r3, #0\n\t"
  26973. "adc r3, r3, #0\n\t"
  26974. "adds r4, r4, r8\n\t"
  26975. "adcs r2, r2, r9\n\t"
  26976. "mov r3, #0\n\t"
  26977. "adc r3, r3, #0\n\t"
  26978. #endif
  26979. /* A[10] * A[10] */
  26980. "ldr r10, [%[a], #40]\n\t"
  26981. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  26982. "lsl r8, r10, #16\n\t"
  26983. "lsr r9, r10, #16\n\t"
  26984. "lsr r8, r8, #16\n\t"
  26985. "mov r12, r8\n\t"
  26986. "mul r8, r12, r8\n\t"
  26987. "mov r12, r9\n\t"
  26988. "mul r9, r12, r9\n\t"
  26989. "adds r4, r4, r8\n\t"
  26990. "adcs r2, r2, r9\n\t"
  26991. "adc r3, r3, #0\n\t"
  26992. "lsr r9, r10, #16\n\t"
  26993. "lsl r8, r10, #16\n\t"
  26994. "lsr r8, r8, #16\n\t"
  26995. "mul r8, r9, r8\n\t"
  26996. "lsr r9, r8, #15\n\t"
  26997. "lsl r8, r8, #17\n\t"
  26998. "adds r4, r4, r8\n\t"
  26999. "adcs r2, r2, r9\n\t"
  27000. "adc r3, r3, #0\n\t"
  27001. #else
  27002. "umull r8, r9, r10, r10\n\t"
  27003. "adds r4, r4, r8\n\t"
  27004. "adcs r2, r2, r9\n\t"
  27005. "adc r3, r3, #0\n\t"
  27006. #endif
  27007. "str r4, [%[r], #80]\n\t"
  27008. /* A[10] * A[11] */
  27009. "ldr r10, [%[a], #44]\n\t"
  27010. "ldr r12, [%[a], #40]\n\t"
  27011. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  27012. "lsl r8, r10, #16\n\t"
  27013. "lsl r9, r12, #16\n\t"
  27014. "lsr r8, r8, #16\n\t"
  27015. "lsr r9, r9, #16\n\t"
  27016. "mul r9, r8, r9\n\t"
  27017. "adds r2, r2, r9\n\t"
  27018. "adcs r3, r3, #0\n\t"
  27019. "mov r4, #0\n\t"
  27020. "adc r4, r4, #0\n\t"
  27021. "adds r2, r2, r9\n\t"
  27022. "adcs r3, r3, #0\n\t"
  27023. "adc r4, r4, #0\n\t"
  27024. "lsr r9, r12, #16\n\t"
  27025. "mul r8, r9, r8\n\t"
  27026. "lsr r9, r8, #16\n\t"
  27027. "lsl r8, r8, #16\n\t"
  27028. "adds r2, r2, r8\n\t"
  27029. "adcs r3, r3, r9\n\t"
  27030. "adc r4, r4, #0\n\t"
  27031. "adds r2, r2, r8\n\t"
  27032. "adcs r3, r3, r9\n\t"
  27033. "adc r4, r4, #0\n\t"
  27034. "lsr r8, r10, #16\n\t"
  27035. "lsr r9, r12, #16\n\t"
  27036. "mul r9, r8, r9\n\t"
  27037. "adds r3, r3, r9\n\t"
  27038. "adc r4, r4, #0\n\t"
  27039. "adds r3, r3, r9\n\t"
  27040. "adc r4, r4, #0\n\t"
  27041. "lsl r9, r12, #16\n\t"
  27042. "lsr r9, r9, #16\n\t"
  27043. "mul r8, r9, r8\n\t"
  27044. "lsr r9, r8, #16\n\t"
  27045. "lsl r8, r8, #16\n\t"
  27046. "adds r2, r2, r8\n\t"
  27047. "adcs r3, r3, r9\n\t"
  27048. "adc r4, r4, #0\n\t"
  27049. "adds r2, r2, r8\n\t"
  27050. "adcs r3, r3, r9\n\t"
  27051. "adc r4, r4, #0\n\t"
  27052. #else
  27053. "umull r8, r9, r10, r12\n\t"
  27054. "adds r2, r2, r8\n\t"
  27055. "adcs r3, r3, r9\n\t"
  27056. "mov r4, #0\n\t"
  27057. "adc r4, r4, #0\n\t"
  27058. "adds r2, r2, r8\n\t"
  27059. "adcs r3, r3, r9\n\t"
  27060. "mov r4, #0\n\t"
  27061. "adc r4, r4, #0\n\t"
  27062. #endif
  27063. "str r2, [%[r], #84]\n\t"
  27064. /* A[11] * A[11] */
  27065. "ldr r10, [%[a], #44]\n\t"
  27066. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  27067. "lsl r8, r10, #16\n\t"
  27068. "lsr r9, r10, #16\n\t"
  27069. "lsr r8, r8, #16\n\t"
  27070. "mov r12, r8\n\t"
  27071. "mul r8, r12, r8\n\t"
  27072. "mov r12, r9\n\t"
  27073. "mul r9, r12, r9\n\t"
  27074. "adds r3, r3, r8\n\t"
  27075. "adc r4, r4, r9\n\t"
  27076. "lsr r9, r10, #16\n\t"
  27077. "lsl r8, r10, #16\n\t"
  27078. "lsr r8, r8, #16\n\t"
  27079. "mul r8, r9, r8\n\t"
  27080. "lsr r9, r8, #15\n\t"
  27081. "lsl r8, r8, #17\n\t"
  27082. "adds r3, r3, r8\n\t"
  27083. "adc r4, r4, r9\n\t"
  27084. #else
  27085. "umull r8, r9, r10, r10\n\t"
  27086. "adds r3, r3, r8\n\t"
  27087. "adc r4, r4, r9\n\t"
  27088. #endif
  27089. "str r3, [%[r], #88]\n\t"
  27090. "str r4, [%[r], #92]\n\t"
  27091. "ldm sp!, {r2, r3, r4, r8}\n\t"
  27092. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  27093. "ldm sp!, {r2, r3, r4, r8}\n\t"
  27094. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  27095. "ldm sp!, {r2, r3, r4, r8}\n\t"
  27096. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  27097. : [r] "+r" (r), [a] "+r" (a)
  27098. :
  27099. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  27100. );
  27101. }
  27102. /* Sub b from a into r. (r = a - b)
  27103. *
  27104. * r A single precision integer.
  27105. * a A single precision integer.
  27106. * b A single precision integer.
  27107. */
  27108. static sp_digit sp_3072_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27109. {
  27110. register sp_digit* r asm ("r0") = r_p;
  27111. register const sp_digit* a asm ("r1") = a_p;
  27112. register const sp_digit* b asm ("r2") = b_p;
  27113. __asm__ __volatile__ (
  27114. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27115. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27116. "subs r3, r3, r7\n\t"
  27117. "sbcs r4, r4, r8\n\t"
  27118. "sbcs r5, r5, r9\n\t"
  27119. "sbcs r6, r6, r10\n\t"
  27120. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27121. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27122. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27123. "sbcs r3, r3, r7\n\t"
  27124. "sbcs r4, r4, r8\n\t"
  27125. "sbcs r5, r5, r9\n\t"
  27126. "sbcs r6, r6, r10\n\t"
  27127. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27128. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27129. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27130. "sbcs r3, r3, r7\n\t"
  27131. "sbcs r4, r4, r8\n\t"
  27132. "sbcs r5, r5, r9\n\t"
  27133. "sbcs r6, r6, r10\n\t"
  27134. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27135. "sbc %[r], r6, r6\n\t"
  27136. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27137. :
  27138. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  27139. );
  27140. return (uint32_t)(size_t)r;
  27141. }
  27142. /* Square a and put result in r. (r = a * a)
  27143. *
  27144. * r A single precision integer.
  27145. * a A single precision integer.
  27146. */
  27147. SP_NOINLINE static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a)
  27148. {
  27149. sp_digit* z0 = r;
  27150. sp_digit* z2 = r + 24;
  27151. sp_digit z1[24];
  27152. sp_digit* a1 = z1;
  27153. sp_digit zero[12];
  27154. sp_digit u;
  27155. sp_digit mask;
  27156. sp_digit* p1;
  27157. sp_digit* p2;
  27158. XMEMSET(zero, 0, sizeof(sp_digit) * 12);
  27159. mask = sp_3072_sub_12(a1, a, &a[12]);
  27160. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  27161. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  27162. (void)sp_3072_sub_12(a1, p1, p2);
  27163. sp_3072_sqr_12(z2, &a[12]);
  27164. sp_3072_sqr_12(z0, a);
  27165. sp_3072_sqr_12(z1, a1);
  27166. u = 0;
  27167. u -= sp_3072_sub_in_place_24(z1, z2);
  27168. u -= sp_3072_sub_in_place_24(z1, z0);
  27169. u += sp_3072_sub_in_place_24(r + 12, z1);
  27170. zero[0] = u;
  27171. (void)sp_3072_add_12(r + 36, r + 36, zero);
  27172. }
  27173. /* Sub b from a into r. (r = a - b)
  27174. *
  27175. * r A single precision integer.
  27176. * a A single precision integer.
  27177. * b A single precision integer.
  27178. */
  27179. static sp_digit sp_3072_sub_24(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27180. {
  27181. register sp_digit* r asm ("r0") = r_p;
  27182. register const sp_digit* a asm ("r1") = a_p;
  27183. register const sp_digit* b asm ("r2") = b_p;
  27184. __asm__ __volatile__ (
  27185. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27186. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27187. "subs r3, r3, r7\n\t"
  27188. "sbcs r4, r4, r8\n\t"
  27189. "sbcs r5, r5, r9\n\t"
  27190. "sbcs r6, r6, r10\n\t"
  27191. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27192. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27193. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27194. "sbcs r3, r3, r7\n\t"
  27195. "sbcs r4, r4, r8\n\t"
  27196. "sbcs r5, r5, r9\n\t"
  27197. "sbcs r6, r6, r10\n\t"
  27198. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27199. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27200. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27201. "sbcs r3, r3, r7\n\t"
  27202. "sbcs r4, r4, r8\n\t"
  27203. "sbcs r5, r5, r9\n\t"
  27204. "sbcs r6, r6, r10\n\t"
  27205. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27206. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27207. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27208. "sbcs r3, r3, r7\n\t"
  27209. "sbcs r4, r4, r8\n\t"
  27210. "sbcs r5, r5, r9\n\t"
  27211. "sbcs r6, r6, r10\n\t"
  27212. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27213. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27214. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27215. "sbcs r3, r3, r7\n\t"
  27216. "sbcs r4, r4, r8\n\t"
  27217. "sbcs r5, r5, r9\n\t"
  27218. "sbcs r6, r6, r10\n\t"
  27219. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27220. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27221. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27222. "sbcs r3, r3, r7\n\t"
  27223. "sbcs r4, r4, r8\n\t"
  27224. "sbcs r5, r5, r9\n\t"
  27225. "sbcs r6, r6, r10\n\t"
  27226. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27227. "sbc %[r], r6, r6\n\t"
  27228. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27229. :
  27230. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  27231. );
  27232. return (uint32_t)(size_t)r;
  27233. }
  27234. /* Square a and put result in r. (r = a * a)
  27235. *
  27236. * r A single precision integer.
  27237. * a A single precision integer.
  27238. */
  27239. SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
  27240. {
  27241. sp_digit* z0 = r;
  27242. sp_digit* z2 = r + 48;
  27243. sp_digit z1[48];
  27244. sp_digit* a1 = z1;
  27245. sp_digit zero[24];
  27246. sp_digit u;
  27247. sp_digit mask;
  27248. sp_digit* p1;
  27249. sp_digit* p2;
  27250. XMEMSET(zero, 0, sizeof(sp_digit) * 24);
  27251. mask = sp_3072_sub_24(a1, a, &a[24]);
  27252. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  27253. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  27254. (void)sp_3072_sub_24(a1, p1, p2);
  27255. sp_3072_sqr_24(z2, &a[24]);
  27256. sp_3072_sqr_24(z0, a);
  27257. sp_3072_sqr_24(z1, a1);
  27258. u = 0;
  27259. u -= sp_3072_sub_in_place_48(z1, z2);
  27260. u -= sp_3072_sub_in_place_48(z1, z0);
  27261. u += sp_3072_sub_in_place_48(r + 24, z1);
  27262. zero[0] = u;
  27263. (void)sp_3072_add_24(r + 72, r + 72, zero);
  27264. }
  27265. /* Sub b from a into r. (r = a - b)
  27266. *
  27267. * r A single precision integer.
  27268. * a A single precision integer.
  27269. * b A single precision integer.
  27270. */
  27271. static sp_digit sp_3072_sub_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27272. {
  27273. register sp_digit* r asm ("r0") = r_p;
  27274. register const sp_digit* a asm ("r1") = a_p;
  27275. register const sp_digit* b asm ("r2") = b_p;
  27276. __asm__ __volatile__ (
  27277. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27278. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27279. "subs r3, r3, r7\n\t"
  27280. "sbcs r4, r4, r8\n\t"
  27281. "sbcs r5, r5, r9\n\t"
  27282. "sbcs r6, r6, r10\n\t"
  27283. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27284. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27285. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27286. "sbcs r3, r3, r7\n\t"
  27287. "sbcs r4, r4, r8\n\t"
  27288. "sbcs r5, r5, r9\n\t"
  27289. "sbcs r6, r6, r10\n\t"
  27290. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27291. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27292. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27293. "sbcs r3, r3, r7\n\t"
  27294. "sbcs r4, r4, r8\n\t"
  27295. "sbcs r5, r5, r9\n\t"
  27296. "sbcs r6, r6, r10\n\t"
  27297. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27298. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27299. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27300. "sbcs r3, r3, r7\n\t"
  27301. "sbcs r4, r4, r8\n\t"
  27302. "sbcs r5, r5, r9\n\t"
  27303. "sbcs r6, r6, r10\n\t"
  27304. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27305. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27306. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27307. "sbcs r3, r3, r7\n\t"
  27308. "sbcs r4, r4, r8\n\t"
  27309. "sbcs r5, r5, r9\n\t"
  27310. "sbcs r6, r6, r10\n\t"
  27311. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27312. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27313. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27314. "sbcs r3, r3, r7\n\t"
  27315. "sbcs r4, r4, r8\n\t"
  27316. "sbcs r5, r5, r9\n\t"
  27317. "sbcs r6, r6, r10\n\t"
  27318. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27319. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27320. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27321. "sbcs r3, r3, r7\n\t"
  27322. "sbcs r4, r4, r8\n\t"
  27323. "sbcs r5, r5, r9\n\t"
  27324. "sbcs r6, r6, r10\n\t"
  27325. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27326. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27327. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27328. "sbcs r3, r3, r7\n\t"
  27329. "sbcs r4, r4, r8\n\t"
  27330. "sbcs r5, r5, r9\n\t"
  27331. "sbcs r6, r6, r10\n\t"
  27332. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27333. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27334. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27335. "sbcs r3, r3, r7\n\t"
  27336. "sbcs r4, r4, r8\n\t"
  27337. "sbcs r5, r5, r9\n\t"
  27338. "sbcs r6, r6, r10\n\t"
  27339. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27340. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27341. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27342. "sbcs r3, r3, r7\n\t"
  27343. "sbcs r4, r4, r8\n\t"
  27344. "sbcs r5, r5, r9\n\t"
  27345. "sbcs r6, r6, r10\n\t"
  27346. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27347. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27348. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27349. "sbcs r3, r3, r7\n\t"
  27350. "sbcs r4, r4, r8\n\t"
  27351. "sbcs r5, r5, r9\n\t"
  27352. "sbcs r6, r6, r10\n\t"
  27353. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27354. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  27355. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  27356. "sbcs r3, r3, r7\n\t"
  27357. "sbcs r4, r4, r8\n\t"
  27358. "sbcs r5, r5, r9\n\t"
  27359. "sbcs r6, r6, r10\n\t"
  27360. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  27361. "sbc %[r], r6, r6\n\t"
  27362. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27363. :
  27364. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  27365. );
  27366. return (uint32_t)(size_t)r;
  27367. }
  27368. /* Square a and put result in r. (r = a * a)
  27369. *
  27370. * r A single precision integer.
  27371. * a A single precision integer.
  27372. */
  27373. SP_NOINLINE static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a)
  27374. {
  27375. sp_digit* z0 = r;
  27376. sp_digit* z2 = r + 96;
  27377. sp_digit z1[96];
  27378. sp_digit* a1 = z1;
  27379. sp_digit zero[48];
  27380. sp_digit u;
  27381. sp_digit mask;
  27382. sp_digit* p1;
  27383. sp_digit* p2;
  27384. XMEMSET(zero, 0, sizeof(sp_digit) * 48);
  27385. mask = sp_3072_sub_48(a1, a, &a[48]);
  27386. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  27387. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  27388. (void)sp_3072_sub_48(a1, p1, p2);
  27389. sp_3072_sqr_48(z2, &a[48]);
  27390. sp_3072_sqr_48(z0, a);
  27391. sp_3072_sqr_48(z1, a1);
  27392. u = 0;
  27393. u -= sp_3072_sub_in_place_96(z1, z2);
  27394. u -= sp_3072_sub_in_place_96(z1, z0);
  27395. u += sp_3072_sub_in_place_96(r + 48, z1);
  27396. zero[0] = u;
  27397. (void)sp_3072_add_48(r + 144, r + 144, zero);
  27398. }
  27399. #endif /* !WOLFSSL_SP_SMALL */
  27400. #ifdef WOLFSSL_SP_SMALL
  27401. /* Add b to a into r. (r = a + b)
  27402. *
  27403. * r A single precision integer.
  27404. * a A single precision integer.
  27405. * b A single precision integer.
  27406. */
  27407. static sp_digit sp_3072_add_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27408. {
  27409. register sp_digit* r asm ("r0") = r_p;
  27410. register const sp_digit* a asm ("r1") = a_p;
  27411. register const sp_digit* b asm ("r2") = b_p;
  27412. __asm__ __volatile__ (
  27413. "mov r3, #0\n\t"
  27414. "add r12, %[a], #0x180\n\t"
  27415. "\n"
  27416. "L_sp_3072_add_96_word_%=: \n\t"
  27417. "adds r3, r3, #-1\n\t"
  27418. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  27419. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  27420. "adcs r4, r4, r8\n\t"
  27421. "adcs r5, r5, r9\n\t"
  27422. "adcs r6, r6, r10\n\t"
  27423. "adcs r7, r7, r11\n\t"
  27424. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  27425. "mov r4, #0\n\t"
  27426. "adc r3, r4, #0\n\t"
  27427. "cmp %[a], r12\n\t"
  27428. "bne L_sp_3072_add_96_word_%=\n\t"
  27429. "mov %[r], r3\n\t"
  27430. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27431. :
  27432. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  27433. );
  27434. return (uint32_t)(size_t)r;
  27435. }
  27436. #endif /* WOLFSSL_SP_SMALL */
  27437. #ifdef WOLFSSL_SP_SMALL
  27438. /* Sub b from a into a. (a -= b)
  27439. *
  27440. * a A single precision integer.
  27441. * b A single precision integer.
  27442. */
  27443. static sp_digit sp_3072_sub_in_place_96(sp_digit* a_p, const sp_digit* b_p)
  27444. {
  27445. register sp_digit* a asm ("r0") = a_p;
  27446. register const sp_digit* b asm ("r1") = b_p;
  27447. __asm__ __volatile__ (
  27448. "mov r10, #0\n\t"
  27449. "mov r12, #0\n\t"
  27450. "add lr, %[a], #0x180\n\t"
  27451. "\n"
  27452. "L_sp_3072_sub_in_pkace_96_word_%=: \n\t"
  27453. "subs r12, r10, r12\n\t"
  27454. "ldm %[a], {r2, r3, r4, r5}\n\t"
  27455. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  27456. "sbcs r2, r2, r6\n\t"
  27457. "sbcs r3, r3, r7\n\t"
  27458. "sbcs r4, r4, r8\n\t"
  27459. "sbcs r5, r5, r9\n\t"
  27460. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  27461. "sbc r12, r10, r10\n\t"
  27462. "cmp %[a], lr\n\t"
  27463. "bne L_sp_3072_sub_in_pkace_96_word_%=\n\t"
  27464. "mov %[a], r12\n\t"
  27465. : [a] "+r" (a), [b] "+r" (b)
  27466. :
  27467. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10"
  27468. );
  27469. return (uint32_t)(size_t)a;
  27470. }
  27471. #endif /* WOLFSSL_SP_SMALL */
  27472. #ifdef WOLFSSL_SP_SMALL
  27473. /* Multiply a and b into r. (r = a * b)
  27474. *
  27475. * r A single precision integer.
  27476. * a A single precision integer.
  27477. * b A single precision integer.
  27478. */
  27479. static void sp_3072_mul_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27480. {
  27481. register sp_digit* r asm ("r0") = r_p;
  27482. register const sp_digit* a asm ("r1") = a_p;
  27483. register const sp_digit* b asm ("r2") = b_p;
  27484. __asm__ __volatile__ (
  27485. "sub sp, sp, #0x300\n\t"
  27486. "mov r5, #0\n\t"
  27487. "mov r6, #0\n\t"
  27488. "mov r7, #0\n\t"
  27489. "mov r8, #0\n\t"
  27490. "\n"
  27491. "L_sp_3072_mul_96_outer_%=: \n\t"
  27492. "subs r3, r5, #0x17c\n\t"
  27493. "it cc\n\t"
  27494. "movcc r3, #0\n\t"
  27495. "sub r4, r5, r3\n\t"
  27496. "\n"
  27497. "L_sp_3072_mul_96_inner_%=: \n\t"
  27498. "ldr lr, [%[a], r3]\n\t"
  27499. "ldr r11, [%[b], r4]\n\t"
  27500. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  27501. "lsl r9, lr, #16\n\t"
  27502. "lsl r10, r11, #16\n\t"
  27503. "lsr r9, r9, #16\n\t"
  27504. "lsr r10, r10, #16\n\t"
  27505. "mul r10, r9, r10\n\t"
  27506. "adds r6, r6, r10\n\t"
  27507. "adcs r7, r7, #0\n\t"
  27508. "adc r8, r8, #0\n\t"
  27509. "lsr r10, r11, #16\n\t"
  27510. "mul r9, r10, r9\n\t"
  27511. "lsr r10, r9, #16\n\t"
  27512. "lsl r9, r9, #16\n\t"
  27513. "adds r6, r6, r9\n\t"
  27514. "adcs r7, r7, r10\n\t"
  27515. "adc r8, r8, #0\n\t"
  27516. "lsr r9, lr, #16\n\t"
  27517. "lsr r10, r11, #16\n\t"
  27518. "mul r10, r9, r10\n\t"
  27519. "adds r7, r7, r10\n\t"
  27520. "adc r8, r8, #0\n\t"
  27521. "lsl r10, r11, #16\n\t"
  27522. "lsr r10, r10, #16\n\t"
  27523. "mul r9, r10, r9\n\t"
  27524. "lsr r10, r9, #16\n\t"
  27525. "lsl r9, r9, #16\n\t"
  27526. "adds r6, r6, r9\n\t"
  27527. "adcs r7, r7, r10\n\t"
  27528. "adc r8, r8, #0\n\t"
  27529. #else
  27530. "umull r9, r10, lr, r11\n\t"
  27531. "adds r6, r6, r9\n\t"
  27532. "adcs r7, r7, r10\n\t"
  27533. "adc r8, r8, #0\n\t"
  27534. #endif
  27535. "add r3, r3, #4\n\t"
  27536. "sub r4, r4, #4\n\t"
  27537. "cmp r3, #0x180\n\t"
  27538. "beq L_sp_3072_mul_96_inner_done_%=\n\t"
  27539. "cmp r3, r5\n\t"
  27540. "ble L_sp_3072_mul_96_inner_%=\n\t"
  27541. "\n"
  27542. "L_sp_3072_mul_96_inner_done_%=: \n\t"
  27543. "str r6, [sp, r5]\n\t"
  27544. "mov r6, r7\n\t"
  27545. "mov r7, r8\n\t"
  27546. "mov r8, #0\n\t"
  27547. "add r5, r5, #4\n\t"
  27548. "cmp r5, #0x2f8\n\t"
  27549. "ble L_sp_3072_mul_96_outer_%=\n\t"
  27550. "str r6, [sp, r5]\n\t"
  27551. "\n"
  27552. "L_sp_3072_mul_96_store_%=: \n\t"
  27553. "ldm sp!, {r6, r7, r8, r9}\n\t"
  27554. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  27555. "subs r5, r5, #16\n\t"
  27556. "bgt L_sp_3072_mul_96_store_%=\n\t"
  27557. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27558. :
  27559. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11"
  27560. );
  27561. }
  27562. /* Square a and put result in r. (r = a * a)
  27563. *
  27564. * r A single precision integer.
  27565. * a A single precision integer.
  27566. */
  27567. static void sp_3072_sqr_96(sp_digit* r_p, const sp_digit* a_p)
  27568. {
  27569. register sp_digit* r asm ("r0") = r_p;
  27570. register const sp_digit* a asm ("r1") = a_p;
  27571. __asm__ __volatile__ (
  27572. "sub sp, sp, #0x300\n\t"
  27573. "mov r12, #0\n\t"
  27574. "mov r6, #0\n\t"
  27575. "mov r7, #0\n\t"
  27576. "mov r8, #0\n\t"
  27577. "mov r5, #0\n\t"
  27578. "\n"
  27579. "L_sp_3072_sqr_96_outer_%=: \n\t"
  27580. "subs r3, r5, #0x17c\n\t"
  27581. "it cc\n\t"
  27582. "movcc r3, r12\n\t"
  27583. "sub r4, r5, r3\n\t"
  27584. "\n"
  27585. "L_sp_3072_sqr_96_inner_%=: \n\t"
  27586. "cmp r4, r3\n\t"
  27587. "beq L_sp_3072_sqr_96_op_sqr_%=\n\t"
  27588. "ldr lr, [%[a], r3]\n\t"
  27589. "ldr r11, [%[a], r4]\n\t"
  27590. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  27591. "lsl r9, lr, #16\n\t"
  27592. "lsl r10, r11, #16\n\t"
  27593. "lsr r9, r9, #16\n\t"
  27594. "lsr r10, r10, #16\n\t"
  27595. "mul r10, r9, r10\n\t"
  27596. "adds r6, r6, r10\n\t"
  27597. "adcs r7, r7, #0\n\t"
  27598. "adc r8, r8, #0\n\t"
  27599. "adds r6, r6, r10\n\t"
  27600. "adcs r7, r7, #0\n\t"
  27601. "adc r8, r8, #0\n\t"
  27602. "lsr r10, r11, #16\n\t"
  27603. "mul r9, r10, r9\n\t"
  27604. "lsr r10, r9, #16\n\t"
  27605. "lsl r9, r9, #16\n\t"
  27606. "adds r6, r6, r9\n\t"
  27607. "adcs r7, r7, r10\n\t"
  27608. "adc r8, r8, #0\n\t"
  27609. "adds r6, r6, r9\n\t"
  27610. "adcs r7, r7, r10\n\t"
  27611. "adc r8, r8, #0\n\t"
  27612. "lsr r9, lr, #16\n\t"
  27613. "lsr r10, r11, #16\n\t"
  27614. "mul r10, r9, r10\n\t"
  27615. "adds r7, r7, r10\n\t"
  27616. "adc r8, r8, #0\n\t"
  27617. "adds r7, r7, r10\n\t"
  27618. "adc r8, r8, #0\n\t"
  27619. "lsl r10, r11, #16\n\t"
  27620. "lsr r10, r10, #16\n\t"
  27621. "mul r9, r10, r9\n\t"
  27622. "lsr r10, r9, #16\n\t"
  27623. "lsl r9, r9, #16\n\t"
  27624. "adds r6, r6, r9\n\t"
  27625. "adcs r7, r7, r10\n\t"
  27626. "adc r8, r8, #0\n\t"
  27627. "adds r6, r6, r9\n\t"
  27628. "adcs r7, r7, r10\n\t"
  27629. "adc r8, r8, #0\n\t"
  27630. #else
  27631. "umull r9, r10, lr, r11\n\t"
  27632. "adds r6, r6, r9\n\t"
  27633. "adcs r7, r7, r10\n\t"
  27634. "adc r8, r8, #0\n\t"
  27635. "adds r6, r6, r9\n\t"
  27636. "adcs r7, r7, r10\n\t"
  27637. "adc r8, r8, #0\n\t"
  27638. #endif
  27639. "bal L_sp_3072_sqr_96_op_done_%=\n\t"
  27640. "\n"
  27641. "L_sp_3072_sqr_96_op_sqr_%=: \n\t"
  27642. "ldr lr, [%[a], r3]\n\t"
  27643. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  27644. "lsl r9, lr, #16\n\t"
  27645. "lsr r10, lr, #16\n\t"
  27646. "lsr r9, r9, #16\n\t"
  27647. "mov r11, r9\n\t"
  27648. "mul r9, r11, r9\n\t"
  27649. "mov r11, r10\n\t"
  27650. "mul r10, r11, r10\n\t"
  27651. "adds r6, r6, r9\n\t"
  27652. "adcs r7, r7, r10\n\t"
  27653. "adc r8, r8, #0\n\t"
  27654. "lsr r10, lr, #16\n\t"
  27655. "lsl r9, lr, #16\n\t"
  27656. "lsr r9, r9, #16\n\t"
  27657. "mul r9, r10, r9\n\t"
  27658. "lsr r10, r9, #15\n\t"
  27659. "lsl r9, r9, #17\n\t"
  27660. "adds r6, r6, r9\n\t"
  27661. "adcs r7, r7, r10\n\t"
  27662. "adc r8, r8, #0\n\t"
  27663. #else
  27664. "umull r9, r10, lr, lr\n\t"
  27665. "adds r6, r6, r9\n\t"
  27666. "adcs r7, r7, r10\n\t"
  27667. "adc r8, r8, #0\n\t"
  27668. #endif
  27669. "\n"
  27670. "L_sp_3072_sqr_96_op_done_%=: \n\t"
  27671. "add r3, r3, #4\n\t"
  27672. "sub r4, r4, #4\n\t"
  27673. "cmp r3, #0x180\n\t"
  27674. "beq L_sp_3072_sqr_96_inner_done_%=\n\t"
  27675. "cmp r3, r4\n\t"
  27676. "bgt L_sp_3072_sqr_96_inner_done_%=\n\t"
  27677. "cmp r3, r5\n\t"
  27678. "ble L_sp_3072_sqr_96_inner_%=\n\t"
  27679. "\n"
  27680. "L_sp_3072_sqr_96_inner_done_%=: \n\t"
  27681. "str r6, [sp, r5]\n\t"
  27682. "mov r6, r7\n\t"
  27683. "mov r7, r8\n\t"
  27684. "mov r8, #0\n\t"
  27685. "add r5, r5, #4\n\t"
  27686. "cmp r5, #0x2f8\n\t"
  27687. "ble L_sp_3072_sqr_96_outer_%=\n\t"
  27688. "str r6, [sp, r5]\n\t"
  27689. "\n"
  27690. "L_sp_3072_sqr_96_store_%=: \n\t"
  27691. "ldm sp!, {r6, r7, r8, r9}\n\t"
  27692. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  27693. "subs r5, r5, #16\n\t"
  27694. "bgt L_sp_3072_sqr_96_store_%=\n\t"
  27695. : [r] "+r" (r), [a] "+r" (a)
  27696. :
  27697. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12"
  27698. );
  27699. }
  27700. #endif /* WOLFSSL_SP_SMALL */
  27701. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  27702. #ifdef WOLFSSL_SP_SMALL
  27703. /* AND m into each word of a and store in r.
  27704. *
  27705. * r A single precision integer.
  27706. * a A single precision integer.
  27707. * m Mask to AND against each digit.
  27708. */
  27709. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  27710. {
  27711. int i;
  27712. for (i=0; i<48; i++) {
  27713. r[i] = a[i] & m;
  27714. }
  27715. }
  27716. #endif /* WOLFSSL_SP_SMALL */
  27717. #ifdef WOLFSSL_SP_SMALL
  27718. /* Add b to a into r. (r = a + b)
  27719. *
  27720. * r A single precision integer.
  27721. * a A single precision integer.
  27722. * b A single precision integer.
  27723. */
  27724. static sp_digit sp_3072_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27725. {
  27726. register sp_digit* r asm ("r0") = r_p;
  27727. register const sp_digit* a asm ("r1") = a_p;
  27728. register const sp_digit* b asm ("r2") = b_p;
  27729. __asm__ __volatile__ (
  27730. "mov r3, #0\n\t"
  27731. "add r12, %[a], #0xc0\n\t"
  27732. "\n"
  27733. "L_sp_3072_add_48_word_%=: \n\t"
  27734. "adds r3, r3, #-1\n\t"
  27735. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  27736. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  27737. "adcs r4, r4, r8\n\t"
  27738. "adcs r5, r5, r9\n\t"
  27739. "adcs r6, r6, r10\n\t"
  27740. "adcs r7, r7, r11\n\t"
  27741. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  27742. "mov r4, #0\n\t"
  27743. "adc r3, r4, #0\n\t"
  27744. "cmp %[a], r12\n\t"
  27745. "bne L_sp_3072_add_48_word_%=\n\t"
  27746. "mov %[r], r3\n\t"
  27747. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27748. :
  27749. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  27750. );
  27751. return (uint32_t)(size_t)r;
  27752. }
  27753. #endif /* WOLFSSL_SP_SMALL */
  27754. #ifdef WOLFSSL_SP_SMALL
  27755. /* Sub b from a into a. (a -= b)
  27756. *
  27757. * a A single precision integer.
  27758. * b A single precision integer.
  27759. */
  27760. static sp_digit sp_3072_sub_in_place_48(sp_digit* a_p, const sp_digit* b_p)
  27761. {
  27762. register sp_digit* a asm ("r0") = a_p;
  27763. register const sp_digit* b asm ("r1") = b_p;
  27764. __asm__ __volatile__ (
  27765. "mov r10, #0\n\t"
  27766. "mov r12, #0\n\t"
  27767. "add lr, %[a], #0xc0\n\t"
  27768. "\n"
  27769. "L_sp_3072_sub_in_pkace_48_word_%=: \n\t"
  27770. "subs r12, r10, r12\n\t"
  27771. "ldm %[a], {r2, r3, r4, r5}\n\t"
  27772. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  27773. "sbcs r2, r2, r6\n\t"
  27774. "sbcs r3, r3, r7\n\t"
  27775. "sbcs r4, r4, r8\n\t"
  27776. "sbcs r5, r5, r9\n\t"
  27777. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  27778. "sbc r12, r10, r10\n\t"
  27779. "cmp %[a], lr\n\t"
  27780. "bne L_sp_3072_sub_in_pkace_48_word_%=\n\t"
  27781. "mov %[a], r12\n\t"
  27782. : [a] "+r" (a), [b] "+r" (b)
  27783. :
  27784. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10"
  27785. );
  27786. return (uint32_t)(size_t)a;
  27787. }
  27788. #endif /* WOLFSSL_SP_SMALL */
  27789. #ifdef WOLFSSL_SP_SMALL
  27790. /* Multiply a and b into r. (r = a * b)
  27791. *
  27792. * r A single precision integer.
  27793. * a A single precision integer.
  27794. * b A single precision integer.
  27795. */
  27796. static void sp_3072_mul_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  27797. {
  27798. register sp_digit* r asm ("r0") = r_p;
  27799. register const sp_digit* a asm ("r1") = a_p;
  27800. register const sp_digit* b asm ("r2") = b_p;
  27801. __asm__ __volatile__ (
  27802. "sub sp, sp, #0x180\n\t"
  27803. "mov r5, #0\n\t"
  27804. "mov r6, #0\n\t"
  27805. "mov r7, #0\n\t"
  27806. "mov r8, #0\n\t"
  27807. "\n"
  27808. "L_sp_3072_mul_48_outer_%=: \n\t"
  27809. "subs r3, r5, #0xbc\n\t"
  27810. "it cc\n\t"
  27811. "movcc r3, #0\n\t"
  27812. "sub r4, r5, r3\n\t"
  27813. "\n"
  27814. "L_sp_3072_mul_48_inner_%=: \n\t"
  27815. "ldr lr, [%[a], r3]\n\t"
  27816. "ldr r11, [%[b], r4]\n\t"
  27817. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  27818. "lsl r9, lr, #16\n\t"
  27819. "lsl r10, r11, #16\n\t"
  27820. "lsr r9, r9, #16\n\t"
  27821. "lsr r10, r10, #16\n\t"
  27822. "mul r10, r9, r10\n\t"
  27823. "adds r6, r6, r10\n\t"
  27824. "adcs r7, r7, #0\n\t"
  27825. "adc r8, r8, #0\n\t"
  27826. "lsr r10, r11, #16\n\t"
  27827. "mul r9, r10, r9\n\t"
  27828. "lsr r10, r9, #16\n\t"
  27829. "lsl r9, r9, #16\n\t"
  27830. "adds r6, r6, r9\n\t"
  27831. "adcs r7, r7, r10\n\t"
  27832. "adc r8, r8, #0\n\t"
  27833. "lsr r9, lr, #16\n\t"
  27834. "lsr r10, r11, #16\n\t"
  27835. "mul r10, r9, r10\n\t"
  27836. "adds r7, r7, r10\n\t"
  27837. "adc r8, r8, #0\n\t"
  27838. "lsl r10, r11, #16\n\t"
  27839. "lsr r10, r10, #16\n\t"
  27840. "mul r9, r10, r9\n\t"
  27841. "lsr r10, r9, #16\n\t"
  27842. "lsl r9, r9, #16\n\t"
  27843. "adds r6, r6, r9\n\t"
  27844. "adcs r7, r7, r10\n\t"
  27845. "adc r8, r8, #0\n\t"
  27846. #else
  27847. "umull r9, r10, lr, r11\n\t"
  27848. "adds r6, r6, r9\n\t"
  27849. "adcs r7, r7, r10\n\t"
  27850. "adc r8, r8, #0\n\t"
  27851. #endif
  27852. "add r3, r3, #4\n\t"
  27853. "sub r4, r4, #4\n\t"
  27854. "cmp r3, #0xc0\n\t"
  27855. "beq L_sp_3072_mul_48_inner_done_%=\n\t"
  27856. "cmp r3, r5\n\t"
  27857. "ble L_sp_3072_mul_48_inner_%=\n\t"
  27858. "\n"
  27859. "L_sp_3072_mul_48_inner_done_%=: \n\t"
  27860. "str r6, [sp, r5]\n\t"
  27861. "mov r6, r7\n\t"
  27862. "mov r7, r8\n\t"
  27863. "mov r8, #0\n\t"
  27864. "add r5, r5, #4\n\t"
  27865. "cmp r5, #0x178\n\t"
  27866. "ble L_sp_3072_mul_48_outer_%=\n\t"
  27867. "str r6, [sp, r5]\n\t"
  27868. "\n"
  27869. "L_sp_3072_mul_48_store_%=: \n\t"
  27870. "ldm sp!, {r6, r7, r8, r9}\n\t"
  27871. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  27872. "subs r5, r5, #16\n\t"
  27873. "bgt L_sp_3072_mul_48_store_%=\n\t"
  27874. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  27875. :
  27876. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11"
  27877. );
  27878. }
  27879. /* Square a and put result in r. (r = a * a)
  27880. *
  27881. * r A single precision integer.
  27882. * a A single precision integer.
  27883. */
  27884. static void sp_3072_sqr_48(sp_digit* r_p, const sp_digit* a_p)
  27885. {
  27886. register sp_digit* r asm ("r0") = r_p;
  27887. register const sp_digit* a asm ("r1") = a_p;
  27888. __asm__ __volatile__ (
  27889. "sub sp, sp, #0x180\n\t"
  27890. "mov r12, #0\n\t"
  27891. "mov r6, #0\n\t"
  27892. "mov r7, #0\n\t"
  27893. "mov r8, #0\n\t"
  27894. "mov r5, #0\n\t"
  27895. "\n"
  27896. "L_sp_3072_sqr_48_outer_%=: \n\t"
  27897. "subs r3, r5, #0xbc\n\t"
  27898. "it cc\n\t"
  27899. "movcc r3, r12\n\t"
  27900. "sub r4, r5, r3\n\t"
  27901. "\n"
  27902. "L_sp_3072_sqr_48_inner_%=: \n\t"
  27903. "cmp r4, r3\n\t"
  27904. "beq L_sp_3072_sqr_48_op_sqr_%=\n\t"
  27905. "ldr lr, [%[a], r3]\n\t"
  27906. "ldr r11, [%[a], r4]\n\t"
  27907. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  27908. "lsl r9, lr, #16\n\t"
  27909. "lsl r10, r11, #16\n\t"
  27910. "lsr r9, r9, #16\n\t"
  27911. "lsr r10, r10, #16\n\t"
  27912. "mul r10, r9, r10\n\t"
  27913. "adds r6, r6, r10\n\t"
  27914. "adcs r7, r7, #0\n\t"
  27915. "adc r8, r8, #0\n\t"
  27916. "adds r6, r6, r10\n\t"
  27917. "adcs r7, r7, #0\n\t"
  27918. "adc r8, r8, #0\n\t"
  27919. "lsr r10, r11, #16\n\t"
  27920. "mul r9, r10, r9\n\t"
  27921. "lsr r10, r9, #16\n\t"
  27922. "lsl r9, r9, #16\n\t"
  27923. "adds r6, r6, r9\n\t"
  27924. "adcs r7, r7, r10\n\t"
  27925. "adc r8, r8, #0\n\t"
  27926. "adds r6, r6, r9\n\t"
  27927. "adcs r7, r7, r10\n\t"
  27928. "adc r8, r8, #0\n\t"
  27929. "lsr r9, lr, #16\n\t"
  27930. "lsr r10, r11, #16\n\t"
  27931. "mul r10, r9, r10\n\t"
  27932. "adds r7, r7, r10\n\t"
  27933. "adc r8, r8, #0\n\t"
  27934. "adds r7, r7, r10\n\t"
  27935. "adc r8, r8, #0\n\t"
  27936. "lsl r10, r11, #16\n\t"
  27937. "lsr r10, r10, #16\n\t"
  27938. "mul r9, r10, r9\n\t"
  27939. "lsr r10, r9, #16\n\t"
  27940. "lsl r9, r9, #16\n\t"
  27941. "adds r6, r6, r9\n\t"
  27942. "adcs r7, r7, r10\n\t"
  27943. "adc r8, r8, #0\n\t"
  27944. "adds r6, r6, r9\n\t"
  27945. "adcs r7, r7, r10\n\t"
  27946. "adc r8, r8, #0\n\t"
  27947. #else
  27948. "umull r9, r10, lr, r11\n\t"
  27949. "adds r6, r6, r9\n\t"
  27950. "adcs r7, r7, r10\n\t"
  27951. "adc r8, r8, #0\n\t"
  27952. "adds r6, r6, r9\n\t"
  27953. "adcs r7, r7, r10\n\t"
  27954. "adc r8, r8, #0\n\t"
  27955. #endif
  27956. "bal L_sp_3072_sqr_48_op_done_%=\n\t"
  27957. "\n"
  27958. "L_sp_3072_sqr_48_op_sqr_%=: \n\t"
  27959. "ldr lr, [%[a], r3]\n\t"
  27960. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  27961. "lsl r9, lr, #16\n\t"
  27962. "lsr r10, lr, #16\n\t"
  27963. "lsr r9, r9, #16\n\t"
  27964. "mov r11, r9\n\t"
  27965. "mul r9, r11, r9\n\t"
  27966. "mov r11, r10\n\t"
  27967. "mul r10, r11, r10\n\t"
  27968. "adds r6, r6, r9\n\t"
  27969. "adcs r7, r7, r10\n\t"
  27970. "adc r8, r8, #0\n\t"
  27971. "lsr r10, lr, #16\n\t"
  27972. "lsl r9, lr, #16\n\t"
  27973. "lsr r9, r9, #16\n\t"
  27974. "mul r9, r10, r9\n\t"
  27975. "lsr r10, r9, #15\n\t"
  27976. "lsl r9, r9, #17\n\t"
  27977. "adds r6, r6, r9\n\t"
  27978. "adcs r7, r7, r10\n\t"
  27979. "adc r8, r8, #0\n\t"
  27980. #else
  27981. "umull r9, r10, lr, lr\n\t"
  27982. "adds r6, r6, r9\n\t"
  27983. "adcs r7, r7, r10\n\t"
  27984. "adc r8, r8, #0\n\t"
  27985. #endif
  27986. "\n"
  27987. "L_sp_3072_sqr_48_op_done_%=: \n\t"
  27988. "add r3, r3, #4\n\t"
  27989. "sub r4, r4, #4\n\t"
  27990. "cmp r3, #0xc0\n\t"
  27991. "beq L_sp_3072_sqr_48_inner_done_%=\n\t"
  27992. "cmp r3, r4\n\t"
  27993. "bgt L_sp_3072_sqr_48_inner_done_%=\n\t"
  27994. "cmp r3, r5\n\t"
  27995. "ble L_sp_3072_sqr_48_inner_%=\n\t"
  27996. "\n"
  27997. "L_sp_3072_sqr_48_inner_done_%=: \n\t"
  27998. "str r6, [sp, r5]\n\t"
  27999. "mov r6, r7\n\t"
  28000. "mov r7, r8\n\t"
  28001. "mov r8, #0\n\t"
  28002. "add r5, r5, #4\n\t"
  28003. "cmp r5, #0x178\n\t"
  28004. "ble L_sp_3072_sqr_48_outer_%=\n\t"
  28005. "str r6, [sp, r5]\n\t"
  28006. "\n"
  28007. "L_sp_3072_sqr_48_store_%=: \n\t"
  28008. "ldm sp!, {r6, r7, r8, r9}\n\t"
  28009. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  28010. "subs r5, r5, #16\n\t"
  28011. "bgt L_sp_3072_sqr_48_store_%=\n\t"
  28012. : [r] "+r" (r), [a] "+r" (a)
  28013. :
  28014. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12"
  28015. );
  28016. }
  28017. #endif /* WOLFSSL_SP_SMALL */
  28018. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  28019. /* Caclulate the bottom digit of -1/a mod 2^n.
  28020. *
  28021. * a A single precision number.
  28022. * rho Bottom word of inverse.
  28023. */
  28024. static void sp_3072_mont_setup(const sp_digit* a, sp_digit* rho)
  28025. {
  28026. sp_digit x;
  28027. sp_digit b;
  28028. b = a[0];
  28029. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  28030. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  28031. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  28032. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  28033. /* rho = -1/m mod b */
  28034. *rho = (sp_digit)0 - x;
  28035. }
  28036. #ifdef WOLFSSL_SP_SMALL
  28037. /* Mul a by digit b into r. (r = a * b)
  28038. *
  28039. * r A single precision integer.
  28040. * a A single precision integer.
  28041. * b A single precision digit.
  28042. */
  28043. static void sp_3072_mul_d_96(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  28044. {
  28045. register sp_digit* r asm ("r0") = r_p;
  28046. register const sp_digit* a asm ("r1") = a_p;
  28047. register sp_digit b asm ("r2") = b_p;
  28048. __asm__ __volatile__ (
  28049. "mov r10, #0\n\t"
  28050. /* A[0] * B */
  28051. "ldr r8, [%[a]]\n\t"
  28052. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28053. "lsl r6, %[b], #16\n\t"
  28054. "lsl r5, r8, #16\n\t"
  28055. "lsr r6, r6, #16\n\t"
  28056. "lsr r5, r5, #16\n\t"
  28057. "mul r5, r6, r5\n\t"
  28058. "lsr r7, r8, #16\n\t"
  28059. "mul r6, r7, r6\n\t"
  28060. "lsr r3, r6, #16\n\t"
  28061. "lsl r6, r6, #16\n\t"
  28062. "adds r5, r5, r6\n\t"
  28063. "adc r3, r3, #0\n\t"
  28064. "lsr r6, %[b], #16\n\t"
  28065. "mul r7, r6, r7\n\t"
  28066. "add r3, r3, r7\n\t"
  28067. "lsl r7, r8, #16\n\t"
  28068. "lsr r7, r7, #16\n\t"
  28069. "mul r6, r7, r6\n\t"
  28070. "lsr r7, r6, #16\n\t"
  28071. "lsl r6, r6, #16\n\t"
  28072. "adds r5, r5, r6\n\t"
  28073. "adc r3, r3, r7\n\t"
  28074. #else
  28075. "umull r5, r3, %[b], r8\n\t"
  28076. #endif
  28077. "mov r4, #0\n\t"
  28078. "str r5, [%[r]]\n\t"
  28079. "mov r5, #0\n\t"
  28080. "mov r9, #4\n\t"
  28081. "\n"
  28082. "L_sp_3072_mul_d_96_word_%=: \n\t"
  28083. /* A[i] * B */
  28084. "ldr r8, [%[a], r9]\n\t"
  28085. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28086. "lsl r6, %[b], #16\n\t"
  28087. "lsl r7, r8, #16\n\t"
  28088. "lsr r6, r6, #16\n\t"
  28089. "lsr r7, r7, #16\n\t"
  28090. "mul r7, r6, r7\n\t"
  28091. "adds r3, r3, r7\n\t"
  28092. "adcs r4, r4, #0\n\t"
  28093. "adc r5, r5, #0\n\t"
  28094. "lsr r7, r8, #16\n\t"
  28095. "mul r6, r7, r6\n\t"
  28096. "lsr r7, r6, #16\n\t"
  28097. "lsl r6, r6, #16\n\t"
  28098. "adds r3, r3, r6\n\t"
  28099. "adcs r4, r4, r7\n\t"
  28100. "adc r5, r5, #0\n\t"
  28101. "lsr r6, %[b], #16\n\t"
  28102. "lsr r7, r8, #16\n\t"
  28103. "mul r7, r6, r7\n\t"
  28104. "adds r4, r4, r7\n\t"
  28105. "adc r5, r5, #0\n\t"
  28106. "lsl r7, r8, #16\n\t"
  28107. "lsr r7, r7, #16\n\t"
  28108. "mul r6, r7, r6\n\t"
  28109. "lsr r7, r6, #16\n\t"
  28110. "lsl r6, r6, #16\n\t"
  28111. "adds r3, r3, r6\n\t"
  28112. "adcs r4, r4, r7\n\t"
  28113. "adc r5, r5, #0\n\t"
  28114. #else
  28115. "umull r6, r7, %[b], r8\n\t"
  28116. "adds r3, r3, r6\n\t"
  28117. "adcs r4, r4, r7\n\t"
  28118. "adc r5, r5, #0\n\t"
  28119. #endif
  28120. "str r3, [%[r], r9]\n\t"
  28121. "mov r3, r4\n\t"
  28122. "mov r4, r5\n\t"
  28123. "mov r5, #0\n\t"
  28124. "add r9, r9, #4\n\t"
  28125. "cmp r9, #0x180\n\t"
  28126. "blt L_sp_3072_mul_d_96_word_%=\n\t"
  28127. "str r3, [%[r], #384]\n\t"
  28128. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  28129. :
  28130. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  28131. );
  28132. }
  28133. #else
  28134. /* Mul a by digit b into r. (r = a * b)
  28135. *
  28136. * r A single precision integer.
  28137. * a A single precision integer.
  28138. * b A single precision digit.
  28139. */
  28140. static void sp_3072_mul_d_96(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  28141. {
  28142. register sp_digit* r asm ("r0") = r_p;
  28143. register const sp_digit* a asm ("r1") = a_p;
  28144. register sp_digit b asm ("r2") = b_p;
  28145. __asm__ __volatile__ (
  28146. "mov r10, #0\n\t"
  28147. /* A[0] * B */
  28148. "ldr r8, [%[a]], #4\n\t"
  28149. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28150. "lsl r6, %[b], #16\n\t"
  28151. "lsl r3, r8, #16\n\t"
  28152. "lsr r6, r6, #16\n\t"
  28153. "lsr r3, r3, #16\n\t"
  28154. "mul r3, r6, r3\n\t"
  28155. "lsr r7, r8, #16\n\t"
  28156. "mul r6, r7, r6\n\t"
  28157. "lsr r4, r6, #16\n\t"
  28158. "lsl r6, r6, #16\n\t"
  28159. "adds r3, r3, r6\n\t"
  28160. "adc r4, r4, #0\n\t"
  28161. "lsr r6, %[b], #16\n\t"
  28162. "mul r7, r6, r7\n\t"
  28163. "add r4, r4, r7\n\t"
  28164. "lsl r7, r8, #16\n\t"
  28165. "lsr r7, r7, #16\n\t"
  28166. "mul r6, r7, r6\n\t"
  28167. "lsr r7, r6, #16\n\t"
  28168. "lsl r6, r6, #16\n\t"
  28169. "adds r3, r3, r6\n\t"
  28170. "adc r4, r4, r7\n\t"
  28171. #else
  28172. "umull r3, r4, %[b], r8\n\t"
  28173. #endif
  28174. "mov r5, #0\n\t"
  28175. "str r3, [%[r]], #4\n\t"
  28176. /* A[1] * B */
  28177. "ldr r8, [%[a]], #4\n\t"
  28178. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28179. "lsl r6, %[b], #16\n\t"
  28180. "lsl r7, r8, #16\n\t"
  28181. "lsr r6, r6, #16\n\t"
  28182. "lsr r7, r7, #16\n\t"
  28183. "mul r7, r6, r7\n\t"
  28184. "adds r4, r4, r7\n\t"
  28185. "adcs r5, r5, #0\n\t"
  28186. "mov r3, #0\n\t"
  28187. "adc r3, r3, #0\n\t"
  28188. "lsr r7, r8, #16\n\t"
  28189. "mul r6, r7, r6\n\t"
  28190. "lsr r7, r6, #16\n\t"
  28191. "lsl r6, r6, #16\n\t"
  28192. "adds r4, r4, r6\n\t"
  28193. "adcs r5, r5, r7\n\t"
  28194. "adc r3, r3, #0\n\t"
  28195. "lsr r6, %[b], #16\n\t"
  28196. "lsr r7, r8, #16\n\t"
  28197. "mul r7, r6, r7\n\t"
  28198. "adds r5, r5, r7\n\t"
  28199. "adc r3, r3, #0\n\t"
  28200. "lsl r7, r8, #16\n\t"
  28201. "lsr r7, r7, #16\n\t"
  28202. "mul r6, r7, r6\n\t"
  28203. "lsr r7, r6, #16\n\t"
  28204. "lsl r6, r6, #16\n\t"
  28205. "adds r4, r4, r6\n\t"
  28206. "adcs r5, r5, r7\n\t"
  28207. "adc r3, r3, #0\n\t"
  28208. #else
  28209. "umull r6, r7, %[b], r8\n\t"
  28210. "adds r4, r4, r6\n\t"
  28211. "adcs r5, r5, r7\n\t"
  28212. "mov r3, #0\n\t"
  28213. "adc r3, r3, #0\n\t"
  28214. #endif
  28215. "str r4, [%[r]], #4\n\t"
  28216. /* A[2] * B */
  28217. "ldr r8, [%[a]], #4\n\t"
  28218. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28219. "lsl r6, %[b], #16\n\t"
  28220. "lsl r7, r8, #16\n\t"
  28221. "lsr r6, r6, #16\n\t"
  28222. "lsr r7, r7, #16\n\t"
  28223. "mul r7, r6, r7\n\t"
  28224. "adds r5, r5, r7\n\t"
  28225. "adcs r3, r3, #0\n\t"
  28226. "mov r4, #0\n\t"
  28227. "adc r4, r4, #0\n\t"
  28228. "lsr r7, r8, #16\n\t"
  28229. "mul r6, r7, r6\n\t"
  28230. "lsr r7, r6, #16\n\t"
  28231. "lsl r6, r6, #16\n\t"
  28232. "adds r5, r5, r6\n\t"
  28233. "adcs r3, r3, r7\n\t"
  28234. "adc r4, r4, #0\n\t"
  28235. "lsr r6, %[b], #16\n\t"
  28236. "lsr r7, r8, #16\n\t"
  28237. "mul r7, r6, r7\n\t"
  28238. "adds r3, r3, r7\n\t"
  28239. "adc r4, r4, #0\n\t"
  28240. "lsl r7, r8, #16\n\t"
  28241. "lsr r7, r7, #16\n\t"
  28242. "mul r6, r7, r6\n\t"
  28243. "lsr r7, r6, #16\n\t"
  28244. "lsl r6, r6, #16\n\t"
  28245. "adds r5, r5, r6\n\t"
  28246. "adcs r3, r3, r7\n\t"
  28247. "adc r4, r4, #0\n\t"
  28248. #else
  28249. "umull r6, r7, %[b], r8\n\t"
  28250. "adds r5, r5, r6\n\t"
  28251. "adcs r3, r3, r7\n\t"
  28252. "mov r4, #0\n\t"
  28253. "adc r4, r4, #0\n\t"
  28254. #endif
  28255. "str r5, [%[r]], #4\n\t"
  28256. /* A[3] * B */
  28257. "ldr r8, [%[a]], #4\n\t"
  28258. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28259. "lsl r6, %[b], #16\n\t"
  28260. "lsl r7, r8, #16\n\t"
  28261. "lsr r6, r6, #16\n\t"
  28262. "lsr r7, r7, #16\n\t"
  28263. "mul r7, r6, r7\n\t"
  28264. "adds r3, r3, r7\n\t"
  28265. "adcs r4, r4, #0\n\t"
  28266. "mov r5, #0\n\t"
  28267. "adc r5, r5, #0\n\t"
  28268. "lsr r7, r8, #16\n\t"
  28269. "mul r6, r7, r6\n\t"
  28270. "lsr r7, r6, #16\n\t"
  28271. "lsl r6, r6, #16\n\t"
  28272. "adds r3, r3, r6\n\t"
  28273. "adcs r4, r4, r7\n\t"
  28274. "adc r5, r5, #0\n\t"
  28275. "lsr r6, %[b], #16\n\t"
  28276. "lsr r7, r8, #16\n\t"
  28277. "mul r7, r6, r7\n\t"
  28278. "adds r4, r4, r7\n\t"
  28279. "adc r5, r5, #0\n\t"
  28280. "lsl r7, r8, #16\n\t"
  28281. "lsr r7, r7, #16\n\t"
  28282. "mul r6, r7, r6\n\t"
  28283. "lsr r7, r6, #16\n\t"
  28284. "lsl r6, r6, #16\n\t"
  28285. "adds r3, r3, r6\n\t"
  28286. "adcs r4, r4, r7\n\t"
  28287. "adc r5, r5, #0\n\t"
  28288. #else
  28289. "umull r6, r7, %[b], r8\n\t"
  28290. "adds r3, r3, r6\n\t"
  28291. "adcs r4, r4, r7\n\t"
  28292. "mov r5, #0\n\t"
  28293. "adc r5, r5, #0\n\t"
  28294. #endif
  28295. "str r3, [%[r]], #4\n\t"
  28296. /* A[4] * B */
  28297. "ldr r8, [%[a]], #4\n\t"
  28298. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28299. "lsl r6, %[b], #16\n\t"
  28300. "lsl r7, r8, #16\n\t"
  28301. "lsr r6, r6, #16\n\t"
  28302. "lsr r7, r7, #16\n\t"
  28303. "mul r7, r6, r7\n\t"
  28304. "adds r4, r4, r7\n\t"
  28305. "adcs r5, r5, #0\n\t"
  28306. "mov r3, #0\n\t"
  28307. "adc r3, r3, #0\n\t"
  28308. "lsr r7, r8, #16\n\t"
  28309. "mul r6, r7, r6\n\t"
  28310. "lsr r7, r6, #16\n\t"
  28311. "lsl r6, r6, #16\n\t"
  28312. "adds r4, r4, r6\n\t"
  28313. "adcs r5, r5, r7\n\t"
  28314. "adc r3, r3, #0\n\t"
  28315. "lsr r6, %[b], #16\n\t"
  28316. "lsr r7, r8, #16\n\t"
  28317. "mul r7, r6, r7\n\t"
  28318. "adds r5, r5, r7\n\t"
  28319. "adc r3, r3, #0\n\t"
  28320. "lsl r7, r8, #16\n\t"
  28321. "lsr r7, r7, #16\n\t"
  28322. "mul r6, r7, r6\n\t"
  28323. "lsr r7, r6, #16\n\t"
  28324. "lsl r6, r6, #16\n\t"
  28325. "adds r4, r4, r6\n\t"
  28326. "adcs r5, r5, r7\n\t"
  28327. "adc r3, r3, #0\n\t"
  28328. #else
  28329. "umull r6, r7, %[b], r8\n\t"
  28330. "adds r4, r4, r6\n\t"
  28331. "adcs r5, r5, r7\n\t"
  28332. "mov r3, #0\n\t"
  28333. "adc r3, r3, #0\n\t"
  28334. #endif
  28335. "str r4, [%[r]], #4\n\t"
  28336. /* A[5] * B */
  28337. "ldr r8, [%[a]], #4\n\t"
  28338. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28339. "lsl r6, %[b], #16\n\t"
  28340. "lsl r7, r8, #16\n\t"
  28341. "lsr r6, r6, #16\n\t"
  28342. "lsr r7, r7, #16\n\t"
  28343. "mul r7, r6, r7\n\t"
  28344. "adds r5, r5, r7\n\t"
  28345. "adcs r3, r3, #0\n\t"
  28346. "mov r4, #0\n\t"
  28347. "adc r4, r4, #0\n\t"
  28348. "lsr r7, r8, #16\n\t"
  28349. "mul r6, r7, r6\n\t"
  28350. "lsr r7, r6, #16\n\t"
  28351. "lsl r6, r6, #16\n\t"
  28352. "adds r5, r5, r6\n\t"
  28353. "adcs r3, r3, r7\n\t"
  28354. "adc r4, r4, #0\n\t"
  28355. "lsr r6, %[b], #16\n\t"
  28356. "lsr r7, r8, #16\n\t"
  28357. "mul r7, r6, r7\n\t"
  28358. "adds r3, r3, r7\n\t"
  28359. "adc r4, r4, #0\n\t"
  28360. "lsl r7, r8, #16\n\t"
  28361. "lsr r7, r7, #16\n\t"
  28362. "mul r6, r7, r6\n\t"
  28363. "lsr r7, r6, #16\n\t"
  28364. "lsl r6, r6, #16\n\t"
  28365. "adds r5, r5, r6\n\t"
  28366. "adcs r3, r3, r7\n\t"
  28367. "adc r4, r4, #0\n\t"
  28368. #else
  28369. "umull r6, r7, %[b], r8\n\t"
  28370. "adds r5, r5, r6\n\t"
  28371. "adcs r3, r3, r7\n\t"
  28372. "mov r4, #0\n\t"
  28373. "adc r4, r4, #0\n\t"
  28374. #endif
  28375. "str r5, [%[r]], #4\n\t"
  28376. /* A[6] * B */
  28377. "ldr r8, [%[a]], #4\n\t"
  28378. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28379. "lsl r6, %[b], #16\n\t"
  28380. "lsl r7, r8, #16\n\t"
  28381. "lsr r6, r6, #16\n\t"
  28382. "lsr r7, r7, #16\n\t"
  28383. "mul r7, r6, r7\n\t"
  28384. "adds r3, r3, r7\n\t"
  28385. "adcs r4, r4, #0\n\t"
  28386. "mov r5, #0\n\t"
  28387. "adc r5, r5, #0\n\t"
  28388. "lsr r7, r8, #16\n\t"
  28389. "mul r6, r7, r6\n\t"
  28390. "lsr r7, r6, #16\n\t"
  28391. "lsl r6, r6, #16\n\t"
  28392. "adds r3, r3, r6\n\t"
  28393. "adcs r4, r4, r7\n\t"
  28394. "adc r5, r5, #0\n\t"
  28395. "lsr r6, %[b], #16\n\t"
  28396. "lsr r7, r8, #16\n\t"
  28397. "mul r7, r6, r7\n\t"
  28398. "adds r4, r4, r7\n\t"
  28399. "adc r5, r5, #0\n\t"
  28400. "lsl r7, r8, #16\n\t"
  28401. "lsr r7, r7, #16\n\t"
  28402. "mul r6, r7, r6\n\t"
  28403. "lsr r7, r6, #16\n\t"
  28404. "lsl r6, r6, #16\n\t"
  28405. "adds r3, r3, r6\n\t"
  28406. "adcs r4, r4, r7\n\t"
  28407. "adc r5, r5, #0\n\t"
  28408. #else
  28409. "umull r6, r7, %[b], r8\n\t"
  28410. "adds r3, r3, r6\n\t"
  28411. "adcs r4, r4, r7\n\t"
  28412. "mov r5, #0\n\t"
  28413. "adc r5, r5, #0\n\t"
  28414. #endif
  28415. "str r3, [%[r]], #4\n\t"
  28416. /* A[7] * B */
  28417. "ldr r8, [%[a]], #4\n\t"
  28418. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28419. "lsl r6, %[b], #16\n\t"
  28420. "lsl r7, r8, #16\n\t"
  28421. "lsr r6, r6, #16\n\t"
  28422. "lsr r7, r7, #16\n\t"
  28423. "mul r7, r6, r7\n\t"
  28424. "adds r4, r4, r7\n\t"
  28425. "adcs r5, r5, #0\n\t"
  28426. "mov r3, #0\n\t"
  28427. "adc r3, r3, #0\n\t"
  28428. "lsr r7, r8, #16\n\t"
  28429. "mul r6, r7, r6\n\t"
  28430. "lsr r7, r6, #16\n\t"
  28431. "lsl r6, r6, #16\n\t"
  28432. "adds r4, r4, r6\n\t"
  28433. "adcs r5, r5, r7\n\t"
  28434. "adc r3, r3, #0\n\t"
  28435. "lsr r6, %[b], #16\n\t"
  28436. "lsr r7, r8, #16\n\t"
  28437. "mul r7, r6, r7\n\t"
  28438. "adds r5, r5, r7\n\t"
  28439. "adc r3, r3, #0\n\t"
  28440. "lsl r7, r8, #16\n\t"
  28441. "lsr r7, r7, #16\n\t"
  28442. "mul r6, r7, r6\n\t"
  28443. "lsr r7, r6, #16\n\t"
  28444. "lsl r6, r6, #16\n\t"
  28445. "adds r4, r4, r6\n\t"
  28446. "adcs r5, r5, r7\n\t"
  28447. "adc r3, r3, #0\n\t"
  28448. #else
  28449. "umull r6, r7, %[b], r8\n\t"
  28450. "adds r4, r4, r6\n\t"
  28451. "adcs r5, r5, r7\n\t"
  28452. "mov r3, #0\n\t"
  28453. "adc r3, r3, #0\n\t"
  28454. #endif
  28455. "str r4, [%[r]], #4\n\t"
  28456. /* A[8] * B */
  28457. "ldr r8, [%[a]], #4\n\t"
  28458. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28459. "lsl r6, %[b], #16\n\t"
  28460. "lsl r7, r8, #16\n\t"
  28461. "lsr r6, r6, #16\n\t"
  28462. "lsr r7, r7, #16\n\t"
  28463. "mul r7, r6, r7\n\t"
  28464. "adds r5, r5, r7\n\t"
  28465. "adcs r3, r3, #0\n\t"
  28466. "mov r4, #0\n\t"
  28467. "adc r4, r4, #0\n\t"
  28468. "lsr r7, r8, #16\n\t"
  28469. "mul r6, r7, r6\n\t"
  28470. "lsr r7, r6, #16\n\t"
  28471. "lsl r6, r6, #16\n\t"
  28472. "adds r5, r5, r6\n\t"
  28473. "adcs r3, r3, r7\n\t"
  28474. "adc r4, r4, #0\n\t"
  28475. "lsr r6, %[b], #16\n\t"
  28476. "lsr r7, r8, #16\n\t"
  28477. "mul r7, r6, r7\n\t"
  28478. "adds r3, r3, r7\n\t"
  28479. "adc r4, r4, #0\n\t"
  28480. "lsl r7, r8, #16\n\t"
  28481. "lsr r7, r7, #16\n\t"
  28482. "mul r6, r7, r6\n\t"
  28483. "lsr r7, r6, #16\n\t"
  28484. "lsl r6, r6, #16\n\t"
  28485. "adds r5, r5, r6\n\t"
  28486. "adcs r3, r3, r7\n\t"
  28487. "adc r4, r4, #0\n\t"
  28488. #else
  28489. "umull r6, r7, %[b], r8\n\t"
  28490. "adds r5, r5, r6\n\t"
  28491. "adcs r3, r3, r7\n\t"
  28492. "mov r4, #0\n\t"
  28493. "adc r4, r4, #0\n\t"
  28494. #endif
  28495. "str r5, [%[r]], #4\n\t"
  28496. /* A[9] * B */
  28497. "ldr r8, [%[a]], #4\n\t"
  28498. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28499. "lsl r6, %[b], #16\n\t"
  28500. "lsl r7, r8, #16\n\t"
  28501. "lsr r6, r6, #16\n\t"
  28502. "lsr r7, r7, #16\n\t"
  28503. "mul r7, r6, r7\n\t"
  28504. "adds r3, r3, r7\n\t"
  28505. "adcs r4, r4, #0\n\t"
  28506. "mov r5, #0\n\t"
  28507. "adc r5, r5, #0\n\t"
  28508. "lsr r7, r8, #16\n\t"
  28509. "mul r6, r7, r6\n\t"
  28510. "lsr r7, r6, #16\n\t"
  28511. "lsl r6, r6, #16\n\t"
  28512. "adds r3, r3, r6\n\t"
  28513. "adcs r4, r4, r7\n\t"
  28514. "adc r5, r5, #0\n\t"
  28515. "lsr r6, %[b], #16\n\t"
  28516. "lsr r7, r8, #16\n\t"
  28517. "mul r7, r6, r7\n\t"
  28518. "adds r4, r4, r7\n\t"
  28519. "adc r5, r5, #0\n\t"
  28520. "lsl r7, r8, #16\n\t"
  28521. "lsr r7, r7, #16\n\t"
  28522. "mul r6, r7, r6\n\t"
  28523. "lsr r7, r6, #16\n\t"
  28524. "lsl r6, r6, #16\n\t"
  28525. "adds r3, r3, r6\n\t"
  28526. "adcs r4, r4, r7\n\t"
  28527. "adc r5, r5, #0\n\t"
  28528. #else
  28529. "umull r6, r7, %[b], r8\n\t"
  28530. "adds r3, r3, r6\n\t"
  28531. "adcs r4, r4, r7\n\t"
  28532. "mov r5, #0\n\t"
  28533. "adc r5, r5, #0\n\t"
  28534. #endif
  28535. "str r3, [%[r]], #4\n\t"
  28536. /* A[10] * B */
  28537. "ldr r8, [%[a]], #4\n\t"
  28538. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28539. "lsl r6, %[b], #16\n\t"
  28540. "lsl r7, r8, #16\n\t"
  28541. "lsr r6, r6, #16\n\t"
  28542. "lsr r7, r7, #16\n\t"
  28543. "mul r7, r6, r7\n\t"
  28544. "adds r4, r4, r7\n\t"
  28545. "adcs r5, r5, #0\n\t"
  28546. "mov r3, #0\n\t"
  28547. "adc r3, r3, #0\n\t"
  28548. "lsr r7, r8, #16\n\t"
  28549. "mul r6, r7, r6\n\t"
  28550. "lsr r7, r6, #16\n\t"
  28551. "lsl r6, r6, #16\n\t"
  28552. "adds r4, r4, r6\n\t"
  28553. "adcs r5, r5, r7\n\t"
  28554. "adc r3, r3, #0\n\t"
  28555. "lsr r6, %[b], #16\n\t"
  28556. "lsr r7, r8, #16\n\t"
  28557. "mul r7, r6, r7\n\t"
  28558. "adds r5, r5, r7\n\t"
  28559. "adc r3, r3, #0\n\t"
  28560. "lsl r7, r8, #16\n\t"
  28561. "lsr r7, r7, #16\n\t"
  28562. "mul r6, r7, r6\n\t"
  28563. "lsr r7, r6, #16\n\t"
  28564. "lsl r6, r6, #16\n\t"
  28565. "adds r4, r4, r6\n\t"
  28566. "adcs r5, r5, r7\n\t"
  28567. "adc r3, r3, #0\n\t"
  28568. #else
  28569. "umull r6, r7, %[b], r8\n\t"
  28570. "adds r4, r4, r6\n\t"
  28571. "adcs r5, r5, r7\n\t"
  28572. "mov r3, #0\n\t"
  28573. "adc r3, r3, #0\n\t"
  28574. #endif
  28575. "str r4, [%[r]], #4\n\t"
  28576. /* A[11] * B */
  28577. "ldr r8, [%[a]], #4\n\t"
  28578. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28579. "lsl r6, %[b], #16\n\t"
  28580. "lsl r7, r8, #16\n\t"
  28581. "lsr r6, r6, #16\n\t"
  28582. "lsr r7, r7, #16\n\t"
  28583. "mul r7, r6, r7\n\t"
  28584. "adds r5, r5, r7\n\t"
  28585. "adcs r3, r3, #0\n\t"
  28586. "mov r4, #0\n\t"
  28587. "adc r4, r4, #0\n\t"
  28588. "lsr r7, r8, #16\n\t"
  28589. "mul r6, r7, r6\n\t"
  28590. "lsr r7, r6, #16\n\t"
  28591. "lsl r6, r6, #16\n\t"
  28592. "adds r5, r5, r6\n\t"
  28593. "adcs r3, r3, r7\n\t"
  28594. "adc r4, r4, #0\n\t"
  28595. "lsr r6, %[b], #16\n\t"
  28596. "lsr r7, r8, #16\n\t"
  28597. "mul r7, r6, r7\n\t"
  28598. "adds r3, r3, r7\n\t"
  28599. "adc r4, r4, #0\n\t"
  28600. "lsl r7, r8, #16\n\t"
  28601. "lsr r7, r7, #16\n\t"
  28602. "mul r6, r7, r6\n\t"
  28603. "lsr r7, r6, #16\n\t"
  28604. "lsl r6, r6, #16\n\t"
  28605. "adds r5, r5, r6\n\t"
  28606. "adcs r3, r3, r7\n\t"
  28607. "adc r4, r4, #0\n\t"
  28608. #else
  28609. "umull r6, r7, %[b], r8\n\t"
  28610. "adds r5, r5, r6\n\t"
  28611. "adcs r3, r3, r7\n\t"
  28612. "mov r4, #0\n\t"
  28613. "adc r4, r4, #0\n\t"
  28614. #endif
  28615. "str r5, [%[r]], #4\n\t"
  28616. /* A[12] * B */
  28617. "ldr r8, [%[a]], #4\n\t"
  28618. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28619. "lsl r6, %[b], #16\n\t"
  28620. "lsl r7, r8, #16\n\t"
  28621. "lsr r6, r6, #16\n\t"
  28622. "lsr r7, r7, #16\n\t"
  28623. "mul r7, r6, r7\n\t"
  28624. "adds r3, r3, r7\n\t"
  28625. "adcs r4, r4, #0\n\t"
  28626. "mov r5, #0\n\t"
  28627. "adc r5, r5, #0\n\t"
  28628. "lsr r7, r8, #16\n\t"
  28629. "mul r6, r7, r6\n\t"
  28630. "lsr r7, r6, #16\n\t"
  28631. "lsl r6, r6, #16\n\t"
  28632. "adds r3, r3, r6\n\t"
  28633. "adcs r4, r4, r7\n\t"
  28634. "adc r5, r5, #0\n\t"
  28635. "lsr r6, %[b], #16\n\t"
  28636. "lsr r7, r8, #16\n\t"
  28637. "mul r7, r6, r7\n\t"
  28638. "adds r4, r4, r7\n\t"
  28639. "adc r5, r5, #0\n\t"
  28640. "lsl r7, r8, #16\n\t"
  28641. "lsr r7, r7, #16\n\t"
  28642. "mul r6, r7, r6\n\t"
  28643. "lsr r7, r6, #16\n\t"
  28644. "lsl r6, r6, #16\n\t"
  28645. "adds r3, r3, r6\n\t"
  28646. "adcs r4, r4, r7\n\t"
  28647. "adc r5, r5, #0\n\t"
  28648. #else
  28649. "umull r6, r7, %[b], r8\n\t"
  28650. "adds r3, r3, r6\n\t"
  28651. "adcs r4, r4, r7\n\t"
  28652. "mov r5, #0\n\t"
  28653. "adc r5, r5, #0\n\t"
  28654. #endif
  28655. "str r3, [%[r]], #4\n\t"
  28656. /* A[13] * B */
  28657. "ldr r8, [%[a]], #4\n\t"
  28658. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28659. "lsl r6, %[b], #16\n\t"
  28660. "lsl r7, r8, #16\n\t"
  28661. "lsr r6, r6, #16\n\t"
  28662. "lsr r7, r7, #16\n\t"
  28663. "mul r7, r6, r7\n\t"
  28664. "adds r4, r4, r7\n\t"
  28665. "adcs r5, r5, #0\n\t"
  28666. "mov r3, #0\n\t"
  28667. "adc r3, r3, #0\n\t"
  28668. "lsr r7, r8, #16\n\t"
  28669. "mul r6, r7, r6\n\t"
  28670. "lsr r7, r6, #16\n\t"
  28671. "lsl r6, r6, #16\n\t"
  28672. "adds r4, r4, r6\n\t"
  28673. "adcs r5, r5, r7\n\t"
  28674. "adc r3, r3, #0\n\t"
  28675. "lsr r6, %[b], #16\n\t"
  28676. "lsr r7, r8, #16\n\t"
  28677. "mul r7, r6, r7\n\t"
  28678. "adds r5, r5, r7\n\t"
  28679. "adc r3, r3, #0\n\t"
  28680. "lsl r7, r8, #16\n\t"
  28681. "lsr r7, r7, #16\n\t"
  28682. "mul r6, r7, r6\n\t"
  28683. "lsr r7, r6, #16\n\t"
  28684. "lsl r6, r6, #16\n\t"
  28685. "adds r4, r4, r6\n\t"
  28686. "adcs r5, r5, r7\n\t"
  28687. "adc r3, r3, #0\n\t"
  28688. #else
  28689. "umull r6, r7, %[b], r8\n\t"
  28690. "adds r4, r4, r6\n\t"
  28691. "adcs r5, r5, r7\n\t"
  28692. "mov r3, #0\n\t"
  28693. "adc r3, r3, #0\n\t"
  28694. #endif
  28695. "str r4, [%[r]], #4\n\t"
  28696. /* A[14] * B */
  28697. "ldr r8, [%[a]], #4\n\t"
  28698. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28699. "lsl r6, %[b], #16\n\t"
  28700. "lsl r7, r8, #16\n\t"
  28701. "lsr r6, r6, #16\n\t"
  28702. "lsr r7, r7, #16\n\t"
  28703. "mul r7, r6, r7\n\t"
  28704. "adds r5, r5, r7\n\t"
  28705. "adcs r3, r3, #0\n\t"
  28706. "mov r4, #0\n\t"
  28707. "adc r4, r4, #0\n\t"
  28708. "lsr r7, r8, #16\n\t"
  28709. "mul r6, r7, r6\n\t"
  28710. "lsr r7, r6, #16\n\t"
  28711. "lsl r6, r6, #16\n\t"
  28712. "adds r5, r5, r6\n\t"
  28713. "adcs r3, r3, r7\n\t"
  28714. "adc r4, r4, #0\n\t"
  28715. "lsr r6, %[b], #16\n\t"
  28716. "lsr r7, r8, #16\n\t"
  28717. "mul r7, r6, r7\n\t"
  28718. "adds r3, r3, r7\n\t"
  28719. "adc r4, r4, #0\n\t"
  28720. "lsl r7, r8, #16\n\t"
  28721. "lsr r7, r7, #16\n\t"
  28722. "mul r6, r7, r6\n\t"
  28723. "lsr r7, r6, #16\n\t"
  28724. "lsl r6, r6, #16\n\t"
  28725. "adds r5, r5, r6\n\t"
  28726. "adcs r3, r3, r7\n\t"
  28727. "adc r4, r4, #0\n\t"
  28728. #else
  28729. "umull r6, r7, %[b], r8\n\t"
  28730. "adds r5, r5, r6\n\t"
  28731. "adcs r3, r3, r7\n\t"
  28732. "mov r4, #0\n\t"
  28733. "adc r4, r4, #0\n\t"
  28734. #endif
  28735. "str r5, [%[r]], #4\n\t"
  28736. /* A[15] * B */
  28737. "ldr r8, [%[a]], #4\n\t"
  28738. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28739. "lsl r6, %[b], #16\n\t"
  28740. "lsl r7, r8, #16\n\t"
  28741. "lsr r6, r6, #16\n\t"
  28742. "lsr r7, r7, #16\n\t"
  28743. "mul r7, r6, r7\n\t"
  28744. "adds r3, r3, r7\n\t"
  28745. "adcs r4, r4, #0\n\t"
  28746. "mov r5, #0\n\t"
  28747. "adc r5, r5, #0\n\t"
  28748. "lsr r7, r8, #16\n\t"
  28749. "mul r6, r7, r6\n\t"
  28750. "lsr r7, r6, #16\n\t"
  28751. "lsl r6, r6, #16\n\t"
  28752. "adds r3, r3, r6\n\t"
  28753. "adcs r4, r4, r7\n\t"
  28754. "adc r5, r5, #0\n\t"
  28755. "lsr r6, %[b], #16\n\t"
  28756. "lsr r7, r8, #16\n\t"
  28757. "mul r7, r6, r7\n\t"
  28758. "adds r4, r4, r7\n\t"
  28759. "adc r5, r5, #0\n\t"
  28760. "lsl r7, r8, #16\n\t"
  28761. "lsr r7, r7, #16\n\t"
  28762. "mul r6, r7, r6\n\t"
  28763. "lsr r7, r6, #16\n\t"
  28764. "lsl r6, r6, #16\n\t"
  28765. "adds r3, r3, r6\n\t"
  28766. "adcs r4, r4, r7\n\t"
  28767. "adc r5, r5, #0\n\t"
  28768. #else
  28769. "umull r6, r7, %[b], r8\n\t"
  28770. "adds r3, r3, r6\n\t"
  28771. "adcs r4, r4, r7\n\t"
  28772. "mov r5, #0\n\t"
  28773. "adc r5, r5, #0\n\t"
  28774. #endif
  28775. "str r3, [%[r]], #4\n\t"
  28776. /* A[16] * B */
  28777. "ldr r8, [%[a]], #4\n\t"
  28778. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28779. "lsl r6, %[b], #16\n\t"
  28780. "lsl r7, r8, #16\n\t"
  28781. "lsr r6, r6, #16\n\t"
  28782. "lsr r7, r7, #16\n\t"
  28783. "mul r7, r6, r7\n\t"
  28784. "adds r4, r4, r7\n\t"
  28785. "adcs r5, r5, #0\n\t"
  28786. "mov r3, #0\n\t"
  28787. "adc r3, r3, #0\n\t"
  28788. "lsr r7, r8, #16\n\t"
  28789. "mul r6, r7, r6\n\t"
  28790. "lsr r7, r6, #16\n\t"
  28791. "lsl r6, r6, #16\n\t"
  28792. "adds r4, r4, r6\n\t"
  28793. "adcs r5, r5, r7\n\t"
  28794. "adc r3, r3, #0\n\t"
  28795. "lsr r6, %[b], #16\n\t"
  28796. "lsr r7, r8, #16\n\t"
  28797. "mul r7, r6, r7\n\t"
  28798. "adds r5, r5, r7\n\t"
  28799. "adc r3, r3, #0\n\t"
  28800. "lsl r7, r8, #16\n\t"
  28801. "lsr r7, r7, #16\n\t"
  28802. "mul r6, r7, r6\n\t"
  28803. "lsr r7, r6, #16\n\t"
  28804. "lsl r6, r6, #16\n\t"
  28805. "adds r4, r4, r6\n\t"
  28806. "adcs r5, r5, r7\n\t"
  28807. "adc r3, r3, #0\n\t"
  28808. #else
  28809. "umull r6, r7, %[b], r8\n\t"
  28810. "adds r4, r4, r6\n\t"
  28811. "adcs r5, r5, r7\n\t"
  28812. "mov r3, #0\n\t"
  28813. "adc r3, r3, #0\n\t"
  28814. #endif
  28815. "str r4, [%[r]], #4\n\t"
  28816. /* A[17] * B */
  28817. "ldr r8, [%[a]], #4\n\t"
  28818. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28819. "lsl r6, %[b], #16\n\t"
  28820. "lsl r7, r8, #16\n\t"
  28821. "lsr r6, r6, #16\n\t"
  28822. "lsr r7, r7, #16\n\t"
  28823. "mul r7, r6, r7\n\t"
  28824. "adds r5, r5, r7\n\t"
  28825. "adcs r3, r3, #0\n\t"
  28826. "mov r4, #0\n\t"
  28827. "adc r4, r4, #0\n\t"
  28828. "lsr r7, r8, #16\n\t"
  28829. "mul r6, r7, r6\n\t"
  28830. "lsr r7, r6, #16\n\t"
  28831. "lsl r6, r6, #16\n\t"
  28832. "adds r5, r5, r6\n\t"
  28833. "adcs r3, r3, r7\n\t"
  28834. "adc r4, r4, #0\n\t"
  28835. "lsr r6, %[b], #16\n\t"
  28836. "lsr r7, r8, #16\n\t"
  28837. "mul r7, r6, r7\n\t"
  28838. "adds r3, r3, r7\n\t"
  28839. "adc r4, r4, #0\n\t"
  28840. "lsl r7, r8, #16\n\t"
  28841. "lsr r7, r7, #16\n\t"
  28842. "mul r6, r7, r6\n\t"
  28843. "lsr r7, r6, #16\n\t"
  28844. "lsl r6, r6, #16\n\t"
  28845. "adds r5, r5, r6\n\t"
  28846. "adcs r3, r3, r7\n\t"
  28847. "adc r4, r4, #0\n\t"
  28848. #else
  28849. "umull r6, r7, %[b], r8\n\t"
  28850. "adds r5, r5, r6\n\t"
  28851. "adcs r3, r3, r7\n\t"
  28852. "mov r4, #0\n\t"
  28853. "adc r4, r4, #0\n\t"
  28854. #endif
  28855. "str r5, [%[r]], #4\n\t"
  28856. /* A[18] * B */
  28857. "ldr r8, [%[a]], #4\n\t"
  28858. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28859. "lsl r6, %[b], #16\n\t"
  28860. "lsl r7, r8, #16\n\t"
  28861. "lsr r6, r6, #16\n\t"
  28862. "lsr r7, r7, #16\n\t"
  28863. "mul r7, r6, r7\n\t"
  28864. "adds r3, r3, r7\n\t"
  28865. "adcs r4, r4, #0\n\t"
  28866. "mov r5, #0\n\t"
  28867. "adc r5, r5, #0\n\t"
  28868. "lsr r7, r8, #16\n\t"
  28869. "mul r6, r7, r6\n\t"
  28870. "lsr r7, r6, #16\n\t"
  28871. "lsl r6, r6, #16\n\t"
  28872. "adds r3, r3, r6\n\t"
  28873. "adcs r4, r4, r7\n\t"
  28874. "adc r5, r5, #0\n\t"
  28875. "lsr r6, %[b], #16\n\t"
  28876. "lsr r7, r8, #16\n\t"
  28877. "mul r7, r6, r7\n\t"
  28878. "adds r4, r4, r7\n\t"
  28879. "adc r5, r5, #0\n\t"
  28880. "lsl r7, r8, #16\n\t"
  28881. "lsr r7, r7, #16\n\t"
  28882. "mul r6, r7, r6\n\t"
  28883. "lsr r7, r6, #16\n\t"
  28884. "lsl r6, r6, #16\n\t"
  28885. "adds r3, r3, r6\n\t"
  28886. "adcs r4, r4, r7\n\t"
  28887. "adc r5, r5, #0\n\t"
  28888. #else
  28889. "umull r6, r7, %[b], r8\n\t"
  28890. "adds r3, r3, r6\n\t"
  28891. "adcs r4, r4, r7\n\t"
  28892. "mov r5, #0\n\t"
  28893. "adc r5, r5, #0\n\t"
  28894. #endif
  28895. "str r3, [%[r]], #4\n\t"
  28896. /* A[19] * B */
  28897. "ldr r8, [%[a]], #4\n\t"
  28898. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28899. "lsl r6, %[b], #16\n\t"
  28900. "lsl r7, r8, #16\n\t"
  28901. "lsr r6, r6, #16\n\t"
  28902. "lsr r7, r7, #16\n\t"
  28903. "mul r7, r6, r7\n\t"
  28904. "adds r4, r4, r7\n\t"
  28905. "adcs r5, r5, #0\n\t"
  28906. "mov r3, #0\n\t"
  28907. "adc r3, r3, #0\n\t"
  28908. "lsr r7, r8, #16\n\t"
  28909. "mul r6, r7, r6\n\t"
  28910. "lsr r7, r6, #16\n\t"
  28911. "lsl r6, r6, #16\n\t"
  28912. "adds r4, r4, r6\n\t"
  28913. "adcs r5, r5, r7\n\t"
  28914. "adc r3, r3, #0\n\t"
  28915. "lsr r6, %[b], #16\n\t"
  28916. "lsr r7, r8, #16\n\t"
  28917. "mul r7, r6, r7\n\t"
  28918. "adds r5, r5, r7\n\t"
  28919. "adc r3, r3, #0\n\t"
  28920. "lsl r7, r8, #16\n\t"
  28921. "lsr r7, r7, #16\n\t"
  28922. "mul r6, r7, r6\n\t"
  28923. "lsr r7, r6, #16\n\t"
  28924. "lsl r6, r6, #16\n\t"
  28925. "adds r4, r4, r6\n\t"
  28926. "adcs r5, r5, r7\n\t"
  28927. "adc r3, r3, #0\n\t"
  28928. #else
  28929. "umull r6, r7, %[b], r8\n\t"
  28930. "adds r4, r4, r6\n\t"
  28931. "adcs r5, r5, r7\n\t"
  28932. "mov r3, #0\n\t"
  28933. "adc r3, r3, #0\n\t"
  28934. #endif
  28935. "str r4, [%[r]], #4\n\t"
  28936. /* A[20] * B */
  28937. "ldr r8, [%[a]], #4\n\t"
  28938. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28939. "lsl r6, %[b], #16\n\t"
  28940. "lsl r7, r8, #16\n\t"
  28941. "lsr r6, r6, #16\n\t"
  28942. "lsr r7, r7, #16\n\t"
  28943. "mul r7, r6, r7\n\t"
  28944. "adds r5, r5, r7\n\t"
  28945. "adcs r3, r3, #0\n\t"
  28946. "mov r4, #0\n\t"
  28947. "adc r4, r4, #0\n\t"
  28948. "lsr r7, r8, #16\n\t"
  28949. "mul r6, r7, r6\n\t"
  28950. "lsr r7, r6, #16\n\t"
  28951. "lsl r6, r6, #16\n\t"
  28952. "adds r5, r5, r6\n\t"
  28953. "adcs r3, r3, r7\n\t"
  28954. "adc r4, r4, #0\n\t"
  28955. "lsr r6, %[b], #16\n\t"
  28956. "lsr r7, r8, #16\n\t"
  28957. "mul r7, r6, r7\n\t"
  28958. "adds r3, r3, r7\n\t"
  28959. "adc r4, r4, #0\n\t"
  28960. "lsl r7, r8, #16\n\t"
  28961. "lsr r7, r7, #16\n\t"
  28962. "mul r6, r7, r6\n\t"
  28963. "lsr r7, r6, #16\n\t"
  28964. "lsl r6, r6, #16\n\t"
  28965. "adds r5, r5, r6\n\t"
  28966. "adcs r3, r3, r7\n\t"
  28967. "adc r4, r4, #0\n\t"
  28968. #else
  28969. "umull r6, r7, %[b], r8\n\t"
  28970. "adds r5, r5, r6\n\t"
  28971. "adcs r3, r3, r7\n\t"
  28972. "mov r4, #0\n\t"
  28973. "adc r4, r4, #0\n\t"
  28974. #endif
  28975. "str r5, [%[r]], #4\n\t"
  28976. /* A[21] * B */
  28977. "ldr r8, [%[a]], #4\n\t"
  28978. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  28979. "lsl r6, %[b], #16\n\t"
  28980. "lsl r7, r8, #16\n\t"
  28981. "lsr r6, r6, #16\n\t"
  28982. "lsr r7, r7, #16\n\t"
  28983. "mul r7, r6, r7\n\t"
  28984. "adds r3, r3, r7\n\t"
  28985. "adcs r4, r4, #0\n\t"
  28986. "mov r5, #0\n\t"
  28987. "adc r5, r5, #0\n\t"
  28988. "lsr r7, r8, #16\n\t"
  28989. "mul r6, r7, r6\n\t"
  28990. "lsr r7, r6, #16\n\t"
  28991. "lsl r6, r6, #16\n\t"
  28992. "adds r3, r3, r6\n\t"
  28993. "adcs r4, r4, r7\n\t"
  28994. "adc r5, r5, #0\n\t"
  28995. "lsr r6, %[b], #16\n\t"
  28996. "lsr r7, r8, #16\n\t"
  28997. "mul r7, r6, r7\n\t"
  28998. "adds r4, r4, r7\n\t"
  28999. "adc r5, r5, #0\n\t"
  29000. "lsl r7, r8, #16\n\t"
  29001. "lsr r7, r7, #16\n\t"
  29002. "mul r6, r7, r6\n\t"
  29003. "lsr r7, r6, #16\n\t"
  29004. "lsl r6, r6, #16\n\t"
  29005. "adds r3, r3, r6\n\t"
  29006. "adcs r4, r4, r7\n\t"
  29007. "adc r5, r5, #0\n\t"
  29008. #else
  29009. "umull r6, r7, %[b], r8\n\t"
  29010. "adds r3, r3, r6\n\t"
  29011. "adcs r4, r4, r7\n\t"
  29012. "mov r5, #0\n\t"
  29013. "adc r5, r5, #0\n\t"
  29014. #endif
  29015. "str r3, [%[r]], #4\n\t"
  29016. /* A[22] * B */
  29017. "ldr r8, [%[a]], #4\n\t"
  29018. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29019. "lsl r6, %[b], #16\n\t"
  29020. "lsl r7, r8, #16\n\t"
  29021. "lsr r6, r6, #16\n\t"
  29022. "lsr r7, r7, #16\n\t"
  29023. "mul r7, r6, r7\n\t"
  29024. "adds r4, r4, r7\n\t"
  29025. "adcs r5, r5, #0\n\t"
  29026. "mov r3, #0\n\t"
  29027. "adc r3, r3, #0\n\t"
  29028. "lsr r7, r8, #16\n\t"
  29029. "mul r6, r7, r6\n\t"
  29030. "lsr r7, r6, #16\n\t"
  29031. "lsl r6, r6, #16\n\t"
  29032. "adds r4, r4, r6\n\t"
  29033. "adcs r5, r5, r7\n\t"
  29034. "adc r3, r3, #0\n\t"
  29035. "lsr r6, %[b], #16\n\t"
  29036. "lsr r7, r8, #16\n\t"
  29037. "mul r7, r6, r7\n\t"
  29038. "adds r5, r5, r7\n\t"
  29039. "adc r3, r3, #0\n\t"
  29040. "lsl r7, r8, #16\n\t"
  29041. "lsr r7, r7, #16\n\t"
  29042. "mul r6, r7, r6\n\t"
  29043. "lsr r7, r6, #16\n\t"
  29044. "lsl r6, r6, #16\n\t"
  29045. "adds r4, r4, r6\n\t"
  29046. "adcs r5, r5, r7\n\t"
  29047. "adc r3, r3, #0\n\t"
  29048. #else
  29049. "umull r6, r7, %[b], r8\n\t"
  29050. "adds r4, r4, r6\n\t"
  29051. "adcs r5, r5, r7\n\t"
  29052. "mov r3, #0\n\t"
  29053. "adc r3, r3, #0\n\t"
  29054. #endif
  29055. "str r4, [%[r]], #4\n\t"
  29056. /* A[23] * B */
  29057. "ldr r8, [%[a]], #4\n\t"
  29058. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29059. "lsl r6, %[b], #16\n\t"
  29060. "lsl r7, r8, #16\n\t"
  29061. "lsr r6, r6, #16\n\t"
  29062. "lsr r7, r7, #16\n\t"
  29063. "mul r7, r6, r7\n\t"
  29064. "adds r5, r5, r7\n\t"
  29065. "adcs r3, r3, #0\n\t"
  29066. "mov r4, #0\n\t"
  29067. "adc r4, r4, #0\n\t"
  29068. "lsr r7, r8, #16\n\t"
  29069. "mul r6, r7, r6\n\t"
  29070. "lsr r7, r6, #16\n\t"
  29071. "lsl r6, r6, #16\n\t"
  29072. "adds r5, r5, r6\n\t"
  29073. "adcs r3, r3, r7\n\t"
  29074. "adc r4, r4, #0\n\t"
  29075. "lsr r6, %[b], #16\n\t"
  29076. "lsr r7, r8, #16\n\t"
  29077. "mul r7, r6, r7\n\t"
  29078. "adds r3, r3, r7\n\t"
  29079. "adc r4, r4, #0\n\t"
  29080. "lsl r7, r8, #16\n\t"
  29081. "lsr r7, r7, #16\n\t"
  29082. "mul r6, r7, r6\n\t"
  29083. "lsr r7, r6, #16\n\t"
  29084. "lsl r6, r6, #16\n\t"
  29085. "adds r5, r5, r6\n\t"
  29086. "adcs r3, r3, r7\n\t"
  29087. "adc r4, r4, #0\n\t"
  29088. #else
  29089. "umull r6, r7, %[b], r8\n\t"
  29090. "adds r5, r5, r6\n\t"
  29091. "adcs r3, r3, r7\n\t"
  29092. "mov r4, #0\n\t"
  29093. "adc r4, r4, #0\n\t"
  29094. #endif
  29095. "str r5, [%[r]], #4\n\t"
  29096. /* A[24] * B */
  29097. "ldr r8, [%[a]], #4\n\t"
  29098. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29099. "lsl r6, %[b], #16\n\t"
  29100. "lsl r7, r8, #16\n\t"
  29101. "lsr r6, r6, #16\n\t"
  29102. "lsr r7, r7, #16\n\t"
  29103. "mul r7, r6, r7\n\t"
  29104. "adds r3, r3, r7\n\t"
  29105. "adcs r4, r4, #0\n\t"
  29106. "mov r5, #0\n\t"
  29107. "adc r5, r5, #0\n\t"
  29108. "lsr r7, r8, #16\n\t"
  29109. "mul r6, r7, r6\n\t"
  29110. "lsr r7, r6, #16\n\t"
  29111. "lsl r6, r6, #16\n\t"
  29112. "adds r3, r3, r6\n\t"
  29113. "adcs r4, r4, r7\n\t"
  29114. "adc r5, r5, #0\n\t"
  29115. "lsr r6, %[b], #16\n\t"
  29116. "lsr r7, r8, #16\n\t"
  29117. "mul r7, r6, r7\n\t"
  29118. "adds r4, r4, r7\n\t"
  29119. "adc r5, r5, #0\n\t"
  29120. "lsl r7, r8, #16\n\t"
  29121. "lsr r7, r7, #16\n\t"
  29122. "mul r6, r7, r6\n\t"
  29123. "lsr r7, r6, #16\n\t"
  29124. "lsl r6, r6, #16\n\t"
  29125. "adds r3, r3, r6\n\t"
  29126. "adcs r4, r4, r7\n\t"
  29127. "adc r5, r5, #0\n\t"
  29128. #else
  29129. "umull r6, r7, %[b], r8\n\t"
  29130. "adds r3, r3, r6\n\t"
  29131. "adcs r4, r4, r7\n\t"
  29132. "mov r5, #0\n\t"
  29133. "adc r5, r5, #0\n\t"
  29134. #endif
  29135. "str r3, [%[r]], #4\n\t"
  29136. /* A[25] * B */
  29137. "ldr r8, [%[a]], #4\n\t"
  29138. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29139. "lsl r6, %[b], #16\n\t"
  29140. "lsl r7, r8, #16\n\t"
  29141. "lsr r6, r6, #16\n\t"
  29142. "lsr r7, r7, #16\n\t"
  29143. "mul r7, r6, r7\n\t"
  29144. "adds r4, r4, r7\n\t"
  29145. "adcs r5, r5, #0\n\t"
  29146. "mov r3, #0\n\t"
  29147. "adc r3, r3, #0\n\t"
  29148. "lsr r7, r8, #16\n\t"
  29149. "mul r6, r7, r6\n\t"
  29150. "lsr r7, r6, #16\n\t"
  29151. "lsl r6, r6, #16\n\t"
  29152. "adds r4, r4, r6\n\t"
  29153. "adcs r5, r5, r7\n\t"
  29154. "adc r3, r3, #0\n\t"
  29155. "lsr r6, %[b], #16\n\t"
  29156. "lsr r7, r8, #16\n\t"
  29157. "mul r7, r6, r7\n\t"
  29158. "adds r5, r5, r7\n\t"
  29159. "adc r3, r3, #0\n\t"
  29160. "lsl r7, r8, #16\n\t"
  29161. "lsr r7, r7, #16\n\t"
  29162. "mul r6, r7, r6\n\t"
  29163. "lsr r7, r6, #16\n\t"
  29164. "lsl r6, r6, #16\n\t"
  29165. "adds r4, r4, r6\n\t"
  29166. "adcs r5, r5, r7\n\t"
  29167. "adc r3, r3, #0\n\t"
  29168. #else
  29169. "umull r6, r7, %[b], r8\n\t"
  29170. "adds r4, r4, r6\n\t"
  29171. "adcs r5, r5, r7\n\t"
  29172. "mov r3, #0\n\t"
  29173. "adc r3, r3, #0\n\t"
  29174. #endif
  29175. "str r4, [%[r]], #4\n\t"
  29176. /* A[26] * B */
  29177. "ldr r8, [%[a]], #4\n\t"
  29178. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29179. "lsl r6, %[b], #16\n\t"
  29180. "lsl r7, r8, #16\n\t"
  29181. "lsr r6, r6, #16\n\t"
  29182. "lsr r7, r7, #16\n\t"
  29183. "mul r7, r6, r7\n\t"
  29184. "adds r5, r5, r7\n\t"
  29185. "adcs r3, r3, #0\n\t"
  29186. "mov r4, #0\n\t"
  29187. "adc r4, r4, #0\n\t"
  29188. "lsr r7, r8, #16\n\t"
  29189. "mul r6, r7, r6\n\t"
  29190. "lsr r7, r6, #16\n\t"
  29191. "lsl r6, r6, #16\n\t"
  29192. "adds r5, r5, r6\n\t"
  29193. "adcs r3, r3, r7\n\t"
  29194. "adc r4, r4, #0\n\t"
  29195. "lsr r6, %[b], #16\n\t"
  29196. "lsr r7, r8, #16\n\t"
  29197. "mul r7, r6, r7\n\t"
  29198. "adds r3, r3, r7\n\t"
  29199. "adc r4, r4, #0\n\t"
  29200. "lsl r7, r8, #16\n\t"
  29201. "lsr r7, r7, #16\n\t"
  29202. "mul r6, r7, r6\n\t"
  29203. "lsr r7, r6, #16\n\t"
  29204. "lsl r6, r6, #16\n\t"
  29205. "adds r5, r5, r6\n\t"
  29206. "adcs r3, r3, r7\n\t"
  29207. "adc r4, r4, #0\n\t"
  29208. #else
  29209. "umull r6, r7, %[b], r8\n\t"
  29210. "adds r5, r5, r6\n\t"
  29211. "adcs r3, r3, r7\n\t"
  29212. "mov r4, #0\n\t"
  29213. "adc r4, r4, #0\n\t"
  29214. #endif
  29215. "str r5, [%[r]], #4\n\t"
  29216. /* A[27] * B */
  29217. "ldr r8, [%[a]], #4\n\t"
  29218. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29219. "lsl r6, %[b], #16\n\t"
  29220. "lsl r7, r8, #16\n\t"
  29221. "lsr r6, r6, #16\n\t"
  29222. "lsr r7, r7, #16\n\t"
  29223. "mul r7, r6, r7\n\t"
  29224. "adds r3, r3, r7\n\t"
  29225. "adcs r4, r4, #0\n\t"
  29226. "mov r5, #0\n\t"
  29227. "adc r5, r5, #0\n\t"
  29228. "lsr r7, r8, #16\n\t"
  29229. "mul r6, r7, r6\n\t"
  29230. "lsr r7, r6, #16\n\t"
  29231. "lsl r6, r6, #16\n\t"
  29232. "adds r3, r3, r6\n\t"
  29233. "adcs r4, r4, r7\n\t"
  29234. "adc r5, r5, #0\n\t"
  29235. "lsr r6, %[b], #16\n\t"
  29236. "lsr r7, r8, #16\n\t"
  29237. "mul r7, r6, r7\n\t"
  29238. "adds r4, r4, r7\n\t"
  29239. "adc r5, r5, #0\n\t"
  29240. "lsl r7, r8, #16\n\t"
  29241. "lsr r7, r7, #16\n\t"
  29242. "mul r6, r7, r6\n\t"
  29243. "lsr r7, r6, #16\n\t"
  29244. "lsl r6, r6, #16\n\t"
  29245. "adds r3, r3, r6\n\t"
  29246. "adcs r4, r4, r7\n\t"
  29247. "adc r5, r5, #0\n\t"
  29248. #else
  29249. "umull r6, r7, %[b], r8\n\t"
  29250. "adds r3, r3, r6\n\t"
  29251. "adcs r4, r4, r7\n\t"
  29252. "mov r5, #0\n\t"
  29253. "adc r5, r5, #0\n\t"
  29254. #endif
  29255. "str r3, [%[r]], #4\n\t"
  29256. /* A[28] * B */
  29257. "ldr r8, [%[a]], #4\n\t"
  29258. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29259. "lsl r6, %[b], #16\n\t"
  29260. "lsl r7, r8, #16\n\t"
  29261. "lsr r6, r6, #16\n\t"
  29262. "lsr r7, r7, #16\n\t"
  29263. "mul r7, r6, r7\n\t"
  29264. "adds r4, r4, r7\n\t"
  29265. "adcs r5, r5, #0\n\t"
  29266. "mov r3, #0\n\t"
  29267. "adc r3, r3, #0\n\t"
  29268. "lsr r7, r8, #16\n\t"
  29269. "mul r6, r7, r6\n\t"
  29270. "lsr r7, r6, #16\n\t"
  29271. "lsl r6, r6, #16\n\t"
  29272. "adds r4, r4, r6\n\t"
  29273. "adcs r5, r5, r7\n\t"
  29274. "adc r3, r3, #0\n\t"
  29275. "lsr r6, %[b], #16\n\t"
  29276. "lsr r7, r8, #16\n\t"
  29277. "mul r7, r6, r7\n\t"
  29278. "adds r5, r5, r7\n\t"
  29279. "adc r3, r3, #0\n\t"
  29280. "lsl r7, r8, #16\n\t"
  29281. "lsr r7, r7, #16\n\t"
  29282. "mul r6, r7, r6\n\t"
  29283. "lsr r7, r6, #16\n\t"
  29284. "lsl r6, r6, #16\n\t"
  29285. "adds r4, r4, r6\n\t"
  29286. "adcs r5, r5, r7\n\t"
  29287. "adc r3, r3, #0\n\t"
  29288. #else
  29289. "umull r6, r7, %[b], r8\n\t"
  29290. "adds r4, r4, r6\n\t"
  29291. "adcs r5, r5, r7\n\t"
  29292. "mov r3, #0\n\t"
  29293. "adc r3, r3, #0\n\t"
  29294. #endif
  29295. "str r4, [%[r]], #4\n\t"
  29296. /* A[29] * B */
  29297. "ldr r8, [%[a]], #4\n\t"
  29298. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29299. "lsl r6, %[b], #16\n\t"
  29300. "lsl r7, r8, #16\n\t"
  29301. "lsr r6, r6, #16\n\t"
  29302. "lsr r7, r7, #16\n\t"
  29303. "mul r7, r6, r7\n\t"
  29304. "adds r5, r5, r7\n\t"
  29305. "adcs r3, r3, #0\n\t"
  29306. "mov r4, #0\n\t"
  29307. "adc r4, r4, #0\n\t"
  29308. "lsr r7, r8, #16\n\t"
  29309. "mul r6, r7, r6\n\t"
  29310. "lsr r7, r6, #16\n\t"
  29311. "lsl r6, r6, #16\n\t"
  29312. "adds r5, r5, r6\n\t"
  29313. "adcs r3, r3, r7\n\t"
  29314. "adc r4, r4, #0\n\t"
  29315. "lsr r6, %[b], #16\n\t"
  29316. "lsr r7, r8, #16\n\t"
  29317. "mul r7, r6, r7\n\t"
  29318. "adds r3, r3, r7\n\t"
  29319. "adc r4, r4, #0\n\t"
  29320. "lsl r7, r8, #16\n\t"
  29321. "lsr r7, r7, #16\n\t"
  29322. "mul r6, r7, r6\n\t"
  29323. "lsr r7, r6, #16\n\t"
  29324. "lsl r6, r6, #16\n\t"
  29325. "adds r5, r5, r6\n\t"
  29326. "adcs r3, r3, r7\n\t"
  29327. "adc r4, r4, #0\n\t"
  29328. #else
  29329. "umull r6, r7, %[b], r8\n\t"
  29330. "adds r5, r5, r6\n\t"
  29331. "adcs r3, r3, r7\n\t"
  29332. "mov r4, #0\n\t"
  29333. "adc r4, r4, #0\n\t"
  29334. #endif
  29335. "str r5, [%[r]], #4\n\t"
  29336. /* A[30] * B */
  29337. "ldr r8, [%[a]], #4\n\t"
  29338. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29339. "lsl r6, %[b], #16\n\t"
  29340. "lsl r7, r8, #16\n\t"
  29341. "lsr r6, r6, #16\n\t"
  29342. "lsr r7, r7, #16\n\t"
  29343. "mul r7, r6, r7\n\t"
  29344. "adds r3, r3, r7\n\t"
  29345. "adcs r4, r4, #0\n\t"
  29346. "mov r5, #0\n\t"
  29347. "adc r5, r5, #0\n\t"
  29348. "lsr r7, r8, #16\n\t"
  29349. "mul r6, r7, r6\n\t"
  29350. "lsr r7, r6, #16\n\t"
  29351. "lsl r6, r6, #16\n\t"
  29352. "adds r3, r3, r6\n\t"
  29353. "adcs r4, r4, r7\n\t"
  29354. "adc r5, r5, #0\n\t"
  29355. "lsr r6, %[b], #16\n\t"
  29356. "lsr r7, r8, #16\n\t"
  29357. "mul r7, r6, r7\n\t"
  29358. "adds r4, r4, r7\n\t"
  29359. "adc r5, r5, #0\n\t"
  29360. "lsl r7, r8, #16\n\t"
  29361. "lsr r7, r7, #16\n\t"
  29362. "mul r6, r7, r6\n\t"
  29363. "lsr r7, r6, #16\n\t"
  29364. "lsl r6, r6, #16\n\t"
  29365. "adds r3, r3, r6\n\t"
  29366. "adcs r4, r4, r7\n\t"
  29367. "adc r5, r5, #0\n\t"
  29368. #else
  29369. "umull r6, r7, %[b], r8\n\t"
  29370. "adds r3, r3, r6\n\t"
  29371. "adcs r4, r4, r7\n\t"
  29372. "mov r5, #0\n\t"
  29373. "adc r5, r5, #0\n\t"
  29374. #endif
  29375. "str r3, [%[r]], #4\n\t"
  29376. /* A[31] * B */
  29377. "ldr r8, [%[a]], #4\n\t"
  29378. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29379. "lsl r6, %[b], #16\n\t"
  29380. "lsl r7, r8, #16\n\t"
  29381. "lsr r6, r6, #16\n\t"
  29382. "lsr r7, r7, #16\n\t"
  29383. "mul r7, r6, r7\n\t"
  29384. "adds r4, r4, r7\n\t"
  29385. "adcs r5, r5, #0\n\t"
  29386. "mov r3, #0\n\t"
  29387. "adc r3, r3, #0\n\t"
  29388. "lsr r7, r8, #16\n\t"
  29389. "mul r6, r7, r6\n\t"
  29390. "lsr r7, r6, #16\n\t"
  29391. "lsl r6, r6, #16\n\t"
  29392. "adds r4, r4, r6\n\t"
  29393. "adcs r5, r5, r7\n\t"
  29394. "adc r3, r3, #0\n\t"
  29395. "lsr r6, %[b], #16\n\t"
  29396. "lsr r7, r8, #16\n\t"
  29397. "mul r7, r6, r7\n\t"
  29398. "adds r5, r5, r7\n\t"
  29399. "adc r3, r3, #0\n\t"
  29400. "lsl r7, r8, #16\n\t"
  29401. "lsr r7, r7, #16\n\t"
  29402. "mul r6, r7, r6\n\t"
  29403. "lsr r7, r6, #16\n\t"
  29404. "lsl r6, r6, #16\n\t"
  29405. "adds r4, r4, r6\n\t"
  29406. "adcs r5, r5, r7\n\t"
  29407. "adc r3, r3, #0\n\t"
  29408. #else
  29409. "umull r6, r7, %[b], r8\n\t"
  29410. "adds r4, r4, r6\n\t"
  29411. "adcs r5, r5, r7\n\t"
  29412. "mov r3, #0\n\t"
  29413. "adc r3, r3, #0\n\t"
  29414. #endif
  29415. "str r4, [%[r]], #4\n\t"
  29416. /* A[32] * B */
  29417. "ldr r8, [%[a]], #4\n\t"
  29418. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29419. "lsl r6, %[b], #16\n\t"
  29420. "lsl r7, r8, #16\n\t"
  29421. "lsr r6, r6, #16\n\t"
  29422. "lsr r7, r7, #16\n\t"
  29423. "mul r7, r6, r7\n\t"
  29424. "adds r5, r5, r7\n\t"
  29425. "adcs r3, r3, #0\n\t"
  29426. "mov r4, #0\n\t"
  29427. "adc r4, r4, #0\n\t"
  29428. "lsr r7, r8, #16\n\t"
  29429. "mul r6, r7, r6\n\t"
  29430. "lsr r7, r6, #16\n\t"
  29431. "lsl r6, r6, #16\n\t"
  29432. "adds r5, r5, r6\n\t"
  29433. "adcs r3, r3, r7\n\t"
  29434. "adc r4, r4, #0\n\t"
  29435. "lsr r6, %[b], #16\n\t"
  29436. "lsr r7, r8, #16\n\t"
  29437. "mul r7, r6, r7\n\t"
  29438. "adds r3, r3, r7\n\t"
  29439. "adc r4, r4, #0\n\t"
  29440. "lsl r7, r8, #16\n\t"
  29441. "lsr r7, r7, #16\n\t"
  29442. "mul r6, r7, r6\n\t"
  29443. "lsr r7, r6, #16\n\t"
  29444. "lsl r6, r6, #16\n\t"
  29445. "adds r5, r5, r6\n\t"
  29446. "adcs r3, r3, r7\n\t"
  29447. "adc r4, r4, #0\n\t"
  29448. #else
  29449. "umull r6, r7, %[b], r8\n\t"
  29450. "adds r5, r5, r6\n\t"
  29451. "adcs r3, r3, r7\n\t"
  29452. "mov r4, #0\n\t"
  29453. "adc r4, r4, #0\n\t"
  29454. #endif
  29455. "str r5, [%[r]], #4\n\t"
  29456. /* A[33] * B */
  29457. "ldr r8, [%[a]], #4\n\t"
  29458. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29459. "lsl r6, %[b], #16\n\t"
  29460. "lsl r7, r8, #16\n\t"
  29461. "lsr r6, r6, #16\n\t"
  29462. "lsr r7, r7, #16\n\t"
  29463. "mul r7, r6, r7\n\t"
  29464. "adds r3, r3, r7\n\t"
  29465. "adcs r4, r4, #0\n\t"
  29466. "mov r5, #0\n\t"
  29467. "adc r5, r5, #0\n\t"
  29468. "lsr r7, r8, #16\n\t"
  29469. "mul r6, r7, r6\n\t"
  29470. "lsr r7, r6, #16\n\t"
  29471. "lsl r6, r6, #16\n\t"
  29472. "adds r3, r3, r6\n\t"
  29473. "adcs r4, r4, r7\n\t"
  29474. "adc r5, r5, #0\n\t"
  29475. "lsr r6, %[b], #16\n\t"
  29476. "lsr r7, r8, #16\n\t"
  29477. "mul r7, r6, r7\n\t"
  29478. "adds r4, r4, r7\n\t"
  29479. "adc r5, r5, #0\n\t"
  29480. "lsl r7, r8, #16\n\t"
  29481. "lsr r7, r7, #16\n\t"
  29482. "mul r6, r7, r6\n\t"
  29483. "lsr r7, r6, #16\n\t"
  29484. "lsl r6, r6, #16\n\t"
  29485. "adds r3, r3, r6\n\t"
  29486. "adcs r4, r4, r7\n\t"
  29487. "adc r5, r5, #0\n\t"
  29488. #else
  29489. "umull r6, r7, %[b], r8\n\t"
  29490. "adds r3, r3, r6\n\t"
  29491. "adcs r4, r4, r7\n\t"
  29492. "mov r5, #0\n\t"
  29493. "adc r5, r5, #0\n\t"
  29494. #endif
  29495. "str r3, [%[r]], #4\n\t"
  29496. /* A[34] * B */
  29497. "ldr r8, [%[a]], #4\n\t"
  29498. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29499. "lsl r6, %[b], #16\n\t"
  29500. "lsl r7, r8, #16\n\t"
  29501. "lsr r6, r6, #16\n\t"
  29502. "lsr r7, r7, #16\n\t"
  29503. "mul r7, r6, r7\n\t"
  29504. "adds r4, r4, r7\n\t"
  29505. "adcs r5, r5, #0\n\t"
  29506. "mov r3, #0\n\t"
  29507. "adc r3, r3, #0\n\t"
  29508. "lsr r7, r8, #16\n\t"
  29509. "mul r6, r7, r6\n\t"
  29510. "lsr r7, r6, #16\n\t"
  29511. "lsl r6, r6, #16\n\t"
  29512. "adds r4, r4, r6\n\t"
  29513. "adcs r5, r5, r7\n\t"
  29514. "adc r3, r3, #0\n\t"
  29515. "lsr r6, %[b], #16\n\t"
  29516. "lsr r7, r8, #16\n\t"
  29517. "mul r7, r6, r7\n\t"
  29518. "adds r5, r5, r7\n\t"
  29519. "adc r3, r3, #0\n\t"
  29520. "lsl r7, r8, #16\n\t"
  29521. "lsr r7, r7, #16\n\t"
  29522. "mul r6, r7, r6\n\t"
  29523. "lsr r7, r6, #16\n\t"
  29524. "lsl r6, r6, #16\n\t"
  29525. "adds r4, r4, r6\n\t"
  29526. "adcs r5, r5, r7\n\t"
  29527. "adc r3, r3, #0\n\t"
  29528. #else
  29529. "umull r6, r7, %[b], r8\n\t"
  29530. "adds r4, r4, r6\n\t"
  29531. "adcs r5, r5, r7\n\t"
  29532. "mov r3, #0\n\t"
  29533. "adc r3, r3, #0\n\t"
  29534. #endif
  29535. "str r4, [%[r]], #4\n\t"
  29536. /* A[35] * B */
  29537. "ldr r8, [%[a]], #4\n\t"
  29538. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29539. "lsl r6, %[b], #16\n\t"
  29540. "lsl r7, r8, #16\n\t"
  29541. "lsr r6, r6, #16\n\t"
  29542. "lsr r7, r7, #16\n\t"
  29543. "mul r7, r6, r7\n\t"
  29544. "adds r5, r5, r7\n\t"
  29545. "adcs r3, r3, #0\n\t"
  29546. "mov r4, #0\n\t"
  29547. "adc r4, r4, #0\n\t"
  29548. "lsr r7, r8, #16\n\t"
  29549. "mul r6, r7, r6\n\t"
  29550. "lsr r7, r6, #16\n\t"
  29551. "lsl r6, r6, #16\n\t"
  29552. "adds r5, r5, r6\n\t"
  29553. "adcs r3, r3, r7\n\t"
  29554. "adc r4, r4, #0\n\t"
  29555. "lsr r6, %[b], #16\n\t"
  29556. "lsr r7, r8, #16\n\t"
  29557. "mul r7, r6, r7\n\t"
  29558. "adds r3, r3, r7\n\t"
  29559. "adc r4, r4, #0\n\t"
  29560. "lsl r7, r8, #16\n\t"
  29561. "lsr r7, r7, #16\n\t"
  29562. "mul r6, r7, r6\n\t"
  29563. "lsr r7, r6, #16\n\t"
  29564. "lsl r6, r6, #16\n\t"
  29565. "adds r5, r5, r6\n\t"
  29566. "adcs r3, r3, r7\n\t"
  29567. "adc r4, r4, #0\n\t"
  29568. #else
  29569. "umull r6, r7, %[b], r8\n\t"
  29570. "adds r5, r5, r6\n\t"
  29571. "adcs r3, r3, r7\n\t"
  29572. "mov r4, #0\n\t"
  29573. "adc r4, r4, #0\n\t"
  29574. #endif
  29575. "str r5, [%[r]], #4\n\t"
  29576. /* A[36] * B */
  29577. "ldr r8, [%[a]], #4\n\t"
  29578. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29579. "lsl r6, %[b], #16\n\t"
  29580. "lsl r7, r8, #16\n\t"
  29581. "lsr r6, r6, #16\n\t"
  29582. "lsr r7, r7, #16\n\t"
  29583. "mul r7, r6, r7\n\t"
  29584. "adds r3, r3, r7\n\t"
  29585. "adcs r4, r4, #0\n\t"
  29586. "mov r5, #0\n\t"
  29587. "adc r5, r5, #0\n\t"
  29588. "lsr r7, r8, #16\n\t"
  29589. "mul r6, r7, r6\n\t"
  29590. "lsr r7, r6, #16\n\t"
  29591. "lsl r6, r6, #16\n\t"
  29592. "adds r3, r3, r6\n\t"
  29593. "adcs r4, r4, r7\n\t"
  29594. "adc r5, r5, #0\n\t"
  29595. "lsr r6, %[b], #16\n\t"
  29596. "lsr r7, r8, #16\n\t"
  29597. "mul r7, r6, r7\n\t"
  29598. "adds r4, r4, r7\n\t"
  29599. "adc r5, r5, #0\n\t"
  29600. "lsl r7, r8, #16\n\t"
  29601. "lsr r7, r7, #16\n\t"
  29602. "mul r6, r7, r6\n\t"
  29603. "lsr r7, r6, #16\n\t"
  29604. "lsl r6, r6, #16\n\t"
  29605. "adds r3, r3, r6\n\t"
  29606. "adcs r4, r4, r7\n\t"
  29607. "adc r5, r5, #0\n\t"
  29608. #else
  29609. "umull r6, r7, %[b], r8\n\t"
  29610. "adds r3, r3, r6\n\t"
  29611. "adcs r4, r4, r7\n\t"
  29612. "mov r5, #0\n\t"
  29613. "adc r5, r5, #0\n\t"
  29614. #endif
  29615. "str r3, [%[r]], #4\n\t"
  29616. /* A[37] * B */
  29617. "ldr r8, [%[a]], #4\n\t"
  29618. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29619. "lsl r6, %[b], #16\n\t"
  29620. "lsl r7, r8, #16\n\t"
  29621. "lsr r6, r6, #16\n\t"
  29622. "lsr r7, r7, #16\n\t"
  29623. "mul r7, r6, r7\n\t"
  29624. "adds r4, r4, r7\n\t"
  29625. "adcs r5, r5, #0\n\t"
  29626. "mov r3, #0\n\t"
  29627. "adc r3, r3, #0\n\t"
  29628. "lsr r7, r8, #16\n\t"
  29629. "mul r6, r7, r6\n\t"
  29630. "lsr r7, r6, #16\n\t"
  29631. "lsl r6, r6, #16\n\t"
  29632. "adds r4, r4, r6\n\t"
  29633. "adcs r5, r5, r7\n\t"
  29634. "adc r3, r3, #0\n\t"
  29635. "lsr r6, %[b], #16\n\t"
  29636. "lsr r7, r8, #16\n\t"
  29637. "mul r7, r6, r7\n\t"
  29638. "adds r5, r5, r7\n\t"
  29639. "adc r3, r3, #0\n\t"
  29640. "lsl r7, r8, #16\n\t"
  29641. "lsr r7, r7, #16\n\t"
  29642. "mul r6, r7, r6\n\t"
  29643. "lsr r7, r6, #16\n\t"
  29644. "lsl r6, r6, #16\n\t"
  29645. "adds r4, r4, r6\n\t"
  29646. "adcs r5, r5, r7\n\t"
  29647. "adc r3, r3, #0\n\t"
  29648. #else
  29649. "umull r6, r7, %[b], r8\n\t"
  29650. "adds r4, r4, r6\n\t"
  29651. "adcs r5, r5, r7\n\t"
  29652. "mov r3, #0\n\t"
  29653. "adc r3, r3, #0\n\t"
  29654. #endif
  29655. "str r4, [%[r]], #4\n\t"
  29656. /* A[38] * B */
  29657. "ldr r8, [%[a]], #4\n\t"
  29658. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29659. "lsl r6, %[b], #16\n\t"
  29660. "lsl r7, r8, #16\n\t"
  29661. "lsr r6, r6, #16\n\t"
  29662. "lsr r7, r7, #16\n\t"
  29663. "mul r7, r6, r7\n\t"
  29664. "adds r5, r5, r7\n\t"
  29665. "adcs r3, r3, #0\n\t"
  29666. "mov r4, #0\n\t"
  29667. "adc r4, r4, #0\n\t"
  29668. "lsr r7, r8, #16\n\t"
  29669. "mul r6, r7, r6\n\t"
  29670. "lsr r7, r6, #16\n\t"
  29671. "lsl r6, r6, #16\n\t"
  29672. "adds r5, r5, r6\n\t"
  29673. "adcs r3, r3, r7\n\t"
  29674. "adc r4, r4, #0\n\t"
  29675. "lsr r6, %[b], #16\n\t"
  29676. "lsr r7, r8, #16\n\t"
  29677. "mul r7, r6, r7\n\t"
  29678. "adds r3, r3, r7\n\t"
  29679. "adc r4, r4, #0\n\t"
  29680. "lsl r7, r8, #16\n\t"
  29681. "lsr r7, r7, #16\n\t"
  29682. "mul r6, r7, r6\n\t"
  29683. "lsr r7, r6, #16\n\t"
  29684. "lsl r6, r6, #16\n\t"
  29685. "adds r5, r5, r6\n\t"
  29686. "adcs r3, r3, r7\n\t"
  29687. "adc r4, r4, #0\n\t"
  29688. #else
  29689. "umull r6, r7, %[b], r8\n\t"
  29690. "adds r5, r5, r6\n\t"
  29691. "adcs r3, r3, r7\n\t"
  29692. "mov r4, #0\n\t"
  29693. "adc r4, r4, #0\n\t"
  29694. #endif
  29695. "str r5, [%[r]], #4\n\t"
  29696. /* A[39] * B */
  29697. "ldr r8, [%[a]], #4\n\t"
  29698. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29699. "lsl r6, %[b], #16\n\t"
  29700. "lsl r7, r8, #16\n\t"
  29701. "lsr r6, r6, #16\n\t"
  29702. "lsr r7, r7, #16\n\t"
  29703. "mul r7, r6, r7\n\t"
  29704. "adds r3, r3, r7\n\t"
  29705. "adcs r4, r4, #0\n\t"
  29706. "mov r5, #0\n\t"
  29707. "adc r5, r5, #0\n\t"
  29708. "lsr r7, r8, #16\n\t"
  29709. "mul r6, r7, r6\n\t"
  29710. "lsr r7, r6, #16\n\t"
  29711. "lsl r6, r6, #16\n\t"
  29712. "adds r3, r3, r6\n\t"
  29713. "adcs r4, r4, r7\n\t"
  29714. "adc r5, r5, #0\n\t"
  29715. "lsr r6, %[b], #16\n\t"
  29716. "lsr r7, r8, #16\n\t"
  29717. "mul r7, r6, r7\n\t"
  29718. "adds r4, r4, r7\n\t"
  29719. "adc r5, r5, #0\n\t"
  29720. "lsl r7, r8, #16\n\t"
  29721. "lsr r7, r7, #16\n\t"
  29722. "mul r6, r7, r6\n\t"
  29723. "lsr r7, r6, #16\n\t"
  29724. "lsl r6, r6, #16\n\t"
  29725. "adds r3, r3, r6\n\t"
  29726. "adcs r4, r4, r7\n\t"
  29727. "adc r5, r5, #0\n\t"
  29728. #else
  29729. "umull r6, r7, %[b], r8\n\t"
  29730. "adds r3, r3, r6\n\t"
  29731. "adcs r4, r4, r7\n\t"
  29732. "mov r5, #0\n\t"
  29733. "adc r5, r5, #0\n\t"
  29734. #endif
  29735. "str r3, [%[r]], #4\n\t"
  29736. /* A[40] * B */
  29737. "ldr r8, [%[a]], #4\n\t"
  29738. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29739. "lsl r6, %[b], #16\n\t"
  29740. "lsl r7, r8, #16\n\t"
  29741. "lsr r6, r6, #16\n\t"
  29742. "lsr r7, r7, #16\n\t"
  29743. "mul r7, r6, r7\n\t"
  29744. "adds r4, r4, r7\n\t"
  29745. "adcs r5, r5, #0\n\t"
  29746. "mov r3, #0\n\t"
  29747. "adc r3, r3, #0\n\t"
  29748. "lsr r7, r8, #16\n\t"
  29749. "mul r6, r7, r6\n\t"
  29750. "lsr r7, r6, #16\n\t"
  29751. "lsl r6, r6, #16\n\t"
  29752. "adds r4, r4, r6\n\t"
  29753. "adcs r5, r5, r7\n\t"
  29754. "adc r3, r3, #0\n\t"
  29755. "lsr r6, %[b], #16\n\t"
  29756. "lsr r7, r8, #16\n\t"
  29757. "mul r7, r6, r7\n\t"
  29758. "adds r5, r5, r7\n\t"
  29759. "adc r3, r3, #0\n\t"
  29760. "lsl r7, r8, #16\n\t"
  29761. "lsr r7, r7, #16\n\t"
  29762. "mul r6, r7, r6\n\t"
  29763. "lsr r7, r6, #16\n\t"
  29764. "lsl r6, r6, #16\n\t"
  29765. "adds r4, r4, r6\n\t"
  29766. "adcs r5, r5, r7\n\t"
  29767. "adc r3, r3, #0\n\t"
  29768. #else
  29769. "umull r6, r7, %[b], r8\n\t"
  29770. "adds r4, r4, r6\n\t"
  29771. "adcs r5, r5, r7\n\t"
  29772. "mov r3, #0\n\t"
  29773. "adc r3, r3, #0\n\t"
  29774. #endif
  29775. "str r4, [%[r]], #4\n\t"
  29776. /* A[41] * B */
  29777. "ldr r8, [%[a]], #4\n\t"
  29778. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29779. "lsl r6, %[b], #16\n\t"
  29780. "lsl r7, r8, #16\n\t"
  29781. "lsr r6, r6, #16\n\t"
  29782. "lsr r7, r7, #16\n\t"
  29783. "mul r7, r6, r7\n\t"
  29784. "adds r5, r5, r7\n\t"
  29785. "adcs r3, r3, #0\n\t"
  29786. "mov r4, #0\n\t"
  29787. "adc r4, r4, #0\n\t"
  29788. "lsr r7, r8, #16\n\t"
  29789. "mul r6, r7, r6\n\t"
  29790. "lsr r7, r6, #16\n\t"
  29791. "lsl r6, r6, #16\n\t"
  29792. "adds r5, r5, r6\n\t"
  29793. "adcs r3, r3, r7\n\t"
  29794. "adc r4, r4, #0\n\t"
  29795. "lsr r6, %[b], #16\n\t"
  29796. "lsr r7, r8, #16\n\t"
  29797. "mul r7, r6, r7\n\t"
  29798. "adds r3, r3, r7\n\t"
  29799. "adc r4, r4, #0\n\t"
  29800. "lsl r7, r8, #16\n\t"
  29801. "lsr r7, r7, #16\n\t"
  29802. "mul r6, r7, r6\n\t"
  29803. "lsr r7, r6, #16\n\t"
  29804. "lsl r6, r6, #16\n\t"
  29805. "adds r5, r5, r6\n\t"
  29806. "adcs r3, r3, r7\n\t"
  29807. "adc r4, r4, #0\n\t"
  29808. #else
  29809. "umull r6, r7, %[b], r8\n\t"
  29810. "adds r5, r5, r6\n\t"
  29811. "adcs r3, r3, r7\n\t"
  29812. "mov r4, #0\n\t"
  29813. "adc r4, r4, #0\n\t"
  29814. #endif
  29815. "str r5, [%[r]], #4\n\t"
  29816. /* A[42] * B */
  29817. "ldr r8, [%[a]], #4\n\t"
  29818. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29819. "lsl r6, %[b], #16\n\t"
  29820. "lsl r7, r8, #16\n\t"
  29821. "lsr r6, r6, #16\n\t"
  29822. "lsr r7, r7, #16\n\t"
  29823. "mul r7, r6, r7\n\t"
  29824. "adds r3, r3, r7\n\t"
  29825. "adcs r4, r4, #0\n\t"
  29826. "mov r5, #0\n\t"
  29827. "adc r5, r5, #0\n\t"
  29828. "lsr r7, r8, #16\n\t"
  29829. "mul r6, r7, r6\n\t"
  29830. "lsr r7, r6, #16\n\t"
  29831. "lsl r6, r6, #16\n\t"
  29832. "adds r3, r3, r6\n\t"
  29833. "adcs r4, r4, r7\n\t"
  29834. "adc r5, r5, #0\n\t"
  29835. "lsr r6, %[b], #16\n\t"
  29836. "lsr r7, r8, #16\n\t"
  29837. "mul r7, r6, r7\n\t"
  29838. "adds r4, r4, r7\n\t"
  29839. "adc r5, r5, #0\n\t"
  29840. "lsl r7, r8, #16\n\t"
  29841. "lsr r7, r7, #16\n\t"
  29842. "mul r6, r7, r6\n\t"
  29843. "lsr r7, r6, #16\n\t"
  29844. "lsl r6, r6, #16\n\t"
  29845. "adds r3, r3, r6\n\t"
  29846. "adcs r4, r4, r7\n\t"
  29847. "adc r5, r5, #0\n\t"
  29848. #else
  29849. "umull r6, r7, %[b], r8\n\t"
  29850. "adds r3, r3, r6\n\t"
  29851. "adcs r4, r4, r7\n\t"
  29852. "mov r5, #0\n\t"
  29853. "adc r5, r5, #0\n\t"
  29854. #endif
  29855. "str r3, [%[r]], #4\n\t"
  29856. /* A[43] * B */
  29857. "ldr r8, [%[a]], #4\n\t"
  29858. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29859. "lsl r6, %[b], #16\n\t"
  29860. "lsl r7, r8, #16\n\t"
  29861. "lsr r6, r6, #16\n\t"
  29862. "lsr r7, r7, #16\n\t"
  29863. "mul r7, r6, r7\n\t"
  29864. "adds r4, r4, r7\n\t"
  29865. "adcs r5, r5, #0\n\t"
  29866. "mov r3, #0\n\t"
  29867. "adc r3, r3, #0\n\t"
  29868. "lsr r7, r8, #16\n\t"
  29869. "mul r6, r7, r6\n\t"
  29870. "lsr r7, r6, #16\n\t"
  29871. "lsl r6, r6, #16\n\t"
  29872. "adds r4, r4, r6\n\t"
  29873. "adcs r5, r5, r7\n\t"
  29874. "adc r3, r3, #0\n\t"
  29875. "lsr r6, %[b], #16\n\t"
  29876. "lsr r7, r8, #16\n\t"
  29877. "mul r7, r6, r7\n\t"
  29878. "adds r5, r5, r7\n\t"
  29879. "adc r3, r3, #0\n\t"
  29880. "lsl r7, r8, #16\n\t"
  29881. "lsr r7, r7, #16\n\t"
  29882. "mul r6, r7, r6\n\t"
  29883. "lsr r7, r6, #16\n\t"
  29884. "lsl r6, r6, #16\n\t"
  29885. "adds r4, r4, r6\n\t"
  29886. "adcs r5, r5, r7\n\t"
  29887. "adc r3, r3, #0\n\t"
  29888. #else
  29889. "umull r6, r7, %[b], r8\n\t"
  29890. "adds r4, r4, r6\n\t"
  29891. "adcs r5, r5, r7\n\t"
  29892. "mov r3, #0\n\t"
  29893. "adc r3, r3, #0\n\t"
  29894. #endif
  29895. "str r4, [%[r]], #4\n\t"
  29896. /* A[44] * B */
  29897. "ldr r8, [%[a]], #4\n\t"
  29898. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29899. "lsl r6, %[b], #16\n\t"
  29900. "lsl r7, r8, #16\n\t"
  29901. "lsr r6, r6, #16\n\t"
  29902. "lsr r7, r7, #16\n\t"
  29903. "mul r7, r6, r7\n\t"
  29904. "adds r5, r5, r7\n\t"
  29905. "adcs r3, r3, #0\n\t"
  29906. "mov r4, #0\n\t"
  29907. "adc r4, r4, #0\n\t"
  29908. "lsr r7, r8, #16\n\t"
  29909. "mul r6, r7, r6\n\t"
  29910. "lsr r7, r6, #16\n\t"
  29911. "lsl r6, r6, #16\n\t"
  29912. "adds r5, r5, r6\n\t"
  29913. "adcs r3, r3, r7\n\t"
  29914. "adc r4, r4, #0\n\t"
  29915. "lsr r6, %[b], #16\n\t"
  29916. "lsr r7, r8, #16\n\t"
  29917. "mul r7, r6, r7\n\t"
  29918. "adds r3, r3, r7\n\t"
  29919. "adc r4, r4, #0\n\t"
  29920. "lsl r7, r8, #16\n\t"
  29921. "lsr r7, r7, #16\n\t"
  29922. "mul r6, r7, r6\n\t"
  29923. "lsr r7, r6, #16\n\t"
  29924. "lsl r6, r6, #16\n\t"
  29925. "adds r5, r5, r6\n\t"
  29926. "adcs r3, r3, r7\n\t"
  29927. "adc r4, r4, #0\n\t"
  29928. #else
  29929. "umull r6, r7, %[b], r8\n\t"
  29930. "adds r5, r5, r6\n\t"
  29931. "adcs r3, r3, r7\n\t"
  29932. "mov r4, #0\n\t"
  29933. "adc r4, r4, #0\n\t"
  29934. #endif
  29935. "str r5, [%[r]], #4\n\t"
  29936. /* A[45] * B */
  29937. "ldr r8, [%[a]], #4\n\t"
  29938. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29939. "lsl r6, %[b], #16\n\t"
  29940. "lsl r7, r8, #16\n\t"
  29941. "lsr r6, r6, #16\n\t"
  29942. "lsr r7, r7, #16\n\t"
  29943. "mul r7, r6, r7\n\t"
  29944. "adds r3, r3, r7\n\t"
  29945. "adcs r4, r4, #0\n\t"
  29946. "mov r5, #0\n\t"
  29947. "adc r5, r5, #0\n\t"
  29948. "lsr r7, r8, #16\n\t"
  29949. "mul r6, r7, r6\n\t"
  29950. "lsr r7, r6, #16\n\t"
  29951. "lsl r6, r6, #16\n\t"
  29952. "adds r3, r3, r6\n\t"
  29953. "adcs r4, r4, r7\n\t"
  29954. "adc r5, r5, #0\n\t"
  29955. "lsr r6, %[b], #16\n\t"
  29956. "lsr r7, r8, #16\n\t"
  29957. "mul r7, r6, r7\n\t"
  29958. "adds r4, r4, r7\n\t"
  29959. "adc r5, r5, #0\n\t"
  29960. "lsl r7, r8, #16\n\t"
  29961. "lsr r7, r7, #16\n\t"
  29962. "mul r6, r7, r6\n\t"
  29963. "lsr r7, r6, #16\n\t"
  29964. "lsl r6, r6, #16\n\t"
  29965. "adds r3, r3, r6\n\t"
  29966. "adcs r4, r4, r7\n\t"
  29967. "adc r5, r5, #0\n\t"
  29968. #else
  29969. "umull r6, r7, %[b], r8\n\t"
  29970. "adds r3, r3, r6\n\t"
  29971. "adcs r4, r4, r7\n\t"
  29972. "mov r5, #0\n\t"
  29973. "adc r5, r5, #0\n\t"
  29974. #endif
  29975. "str r3, [%[r]], #4\n\t"
  29976. /* A[46] * B */
  29977. "ldr r8, [%[a]], #4\n\t"
  29978. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  29979. "lsl r6, %[b], #16\n\t"
  29980. "lsl r7, r8, #16\n\t"
  29981. "lsr r6, r6, #16\n\t"
  29982. "lsr r7, r7, #16\n\t"
  29983. "mul r7, r6, r7\n\t"
  29984. "adds r4, r4, r7\n\t"
  29985. "adcs r5, r5, #0\n\t"
  29986. "mov r3, #0\n\t"
  29987. "adc r3, r3, #0\n\t"
  29988. "lsr r7, r8, #16\n\t"
  29989. "mul r6, r7, r6\n\t"
  29990. "lsr r7, r6, #16\n\t"
  29991. "lsl r6, r6, #16\n\t"
  29992. "adds r4, r4, r6\n\t"
  29993. "adcs r5, r5, r7\n\t"
  29994. "adc r3, r3, #0\n\t"
  29995. "lsr r6, %[b], #16\n\t"
  29996. "lsr r7, r8, #16\n\t"
  29997. "mul r7, r6, r7\n\t"
  29998. "adds r5, r5, r7\n\t"
  29999. "adc r3, r3, #0\n\t"
  30000. "lsl r7, r8, #16\n\t"
  30001. "lsr r7, r7, #16\n\t"
  30002. "mul r6, r7, r6\n\t"
  30003. "lsr r7, r6, #16\n\t"
  30004. "lsl r6, r6, #16\n\t"
  30005. "adds r4, r4, r6\n\t"
  30006. "adcs r5, r5, r7\n\t"
  30007. "adc r3, r3, #0\n\t"
  30008. #else
  30009. "umull r6, r7, %[b], r8\n\t"
  30010. "adds r4, r4, r6\n\t"
  30011. "adcs r5, r5, r7\n\t"
  30012. "mov r3, #0\n\t"
  30013. "adc r3, r3, #0\n\t"
  30014. #endif
  30015. "str r4, [%[r]], #4\n\t"
  30016. /* A[47] * B */
  30017. "ldr r8, [%[a]], #4\n\t"
  30018. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30019. "lsl r6, %[b], #16\n\t"
  30020. "lsl r7, r8, #16\n\t"
  30021. "lsr r6, r6, #16\n\t"
  30022. "lsr r7, r7, #16\n\t"
  30023. "mul r7, r6, r7\n\t"
  30024. "adds r5, r5, r7\n\t"
  30025. "adcs r3, r3, #0\n\t"
  30026. "mov r4, #0\n\t"
  30027. "adc r4, r4, #0\n\t"
  30028. "lsr r7, r8, #16\n\t"
  30029. "mul r6, r7, r6\n\t"
  30030. "lsr r7, r6, #16\n\t"
  30031. "lsl r6, r6, #16\n\t"
  30032. "adds r5, r5, r6\n\t"
  30033. "adcs r3, r3, r7\n\t"
  30034. "adc r4, r4, #0\n\t"
  30035. "lsr r6, %[b], #16\n\t"
  30036. "lsr r7, r8, #16\n\t"
  30037. "mul r7, r6, r7\n\t"
  30038. "adds r3, r3, r7\n\t"
  30039. "adc r4, r4, #0\n\t"
  30040. "lsl r7, r8, #16\n\t"
  30041. "lsr r7, r7, #16\n\t"
  30042. "mul r6, r7, r6\n\t"
  30043. "lsr r7, r6, #16\n\t"
  30044. "lsl r6, r6, #16\n\t"
  30045. "adds r5, r5, r6\n\t"
  30046. "adcs r3, r3, r7\n\t"
  30047. "adc r4, r4, #0\n\t"
  30048. #else
  30049. "umull r6, r7, %[b], r8\n\t"
  30050. "adds r5, r5, r6\n\t"
  30051. "adcs r3, r3, r7\n\t"
  30052. "mov r4, #0\n\t"
  30053. "adc r4, r4, #0\n\t"
  30054. #endif
  30055. "str r5, [%[r]], #4\n\t"
  30056. /* A[48] * B */
  30057. "ldr r8, [%[a]], #4\n\t"
  30058. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30059. "lsl r6, %[b], #16\n\t"
  30060. "lsl r7, r8, #16\n\t"
  30061. "lsr r6, r6, #16\n\t"
  30062. "lsr r7, r7, #16\n\t"
  30063. "mul r7, r6, r7\n\t"
  30064. "adds r3, r3, r7\n\t"
  30065. "adcs r4, r4, #0\n\t"
  30066. "mov r5, #0\n\t"
  30067. "adc r5, r5, #0\n\t"
  30068. "lsr r7, r8, #16\n\t"
  30069. "mul r6, r7, r6\n\t"
  30070. "lsr r7, r6, #16\n\t"
  30071. "lsl r6, r6, #16\n\t"
  30072. "adds r3, r3, r6\n\t"
  30073. "adcs r4, r4, r7\n\t"
  30074. "adc r5, r5, #0\n\t"
  30075. "lsr r6, %[b], #16\n\t"
  30076. "lsr r7, r8, #16\n\t"
  30077. "mul r7, r6, r7\n\t"
  30078. "adds r4, r4, r7\n\t"
  30079. "adc r5, r5, #0\n\t"
  30080. "lsl r7, r8, #16\n\t"
  30081. "lsr r7, r7, #16\n\t"
  30082. "mul r6, r7, r6\n\t"
  30083. "lsr r7, r6, #16\n\t"
  30084. "lsl r6, r6, #16\n\t"
  30085. "adds r3, r3, r6\n\t"
  30086. "adcs r4, r4, r7\n\t"
  30087. "adc r5, r5, #0\n\t"
  30088. #else
  30089. "umull r6, r7, %[b], r8\n\t"
  30090. "adds r3, r3, r6\n\t"
  30091. "adcs r4, r4, r7\n\t"
  30092. "mov r5, #0\n\t"
  30093. "adc r5, r5, #0\n\t"
  30094. #endif
  30095. "str r3, [%[r]], #4\n\t"
  30096. /* A[49] * B */
  30097. "ldr r8, [%[a]], #4\n\t"
  30098. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30099. "lsl r6, %[b], #16\n\t"
  30100. "lsl r7, r8, #16\n\t"
  30101. "lsr r6, r6, #16\n\t"
  30102. "lsr r7, r7, #16\n\t"
  30103. "mul r7, r6, r7\n\t"
  30104. "adds r4, r4, r7\n\t"
  30105. "adcs r5, r5, #0\n\t"
  30106. "mov r3, #0\n\t"
  30107. "adc r3, r3, #0\n\t"
  30108. "lsr r7, r8, #16\n\t"
  30109. "mul r6, r7, r6\n\t"
  30110. "lsr r7, r6, #16\n\t"
  30111. "lsl r6, r6, #16\n\t"
  30112. "adds r4, r4, r6\n\t"
  30113. "adcs r5, r5, r7\n\t"
  30114. "adc r3, r3, #0\n\t"
  30115. "lsr r6, %[b], #16\n\t"
  30116. "lsr r7, r8, #16\n\t"
  30117. "mul r7, r6, r7\n\t"
  30118. "adds r5, r5, r7\n\t"
  30119. "adc r3, r3, #0\n\t"
  30120. "lsl r7, r8, #16\n\t"
  30121. "lsr r7, r7, #16\n\t"
  30122. "mul r6, r7, r6\n\t"
  30123. "lsr r7, r6, #16\n\t"
  30124. "lsl r6, r6, #16\n\t"
  30125. "adds r4, r4, r6\n\t"
  30126. "adcs r5, r5, r7\n\t"
  30127. "adc r3, r3, #0\n\t"
  30128. #else
  30129. "umull r6, r7, %[b], r8\n\t"
  30130. "adds r4, r4, r6\n\t"
  30131. "adcs r5, r5, r7\n\t"
  30132. "mov r3, #0\n\t"
  30133. "adc r3, r3, #0\n\t"
  30134. #endif
  30135. "str r4, [%[r]], #4\n\t"
  30136. /* A[50] * B */
  30137. "ldr r8, [%[a]], #4\n\t"
  30138. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30139. "lsl r6, %[b], #16\n\t"
  30140. "lsl r7, r8, #16\n\t"
  30141. "lsr r6, r6, #16\n\t"
  30142. "lsr r7, r7, #16\n\t"
  30143. "mul r7, r6, r7\n\t"
  30144. "adds r5, r5, r7\n\t"
  30145. "adcs r3, r3, #0\n\t"
  30146. "mov r4, #0\n\t"
  30147. "adc r4, r4, #0\n\t"
  30148. "lsr r7, r8, #16\n\t"
  30149. "mul r6, r7, r6\n\t"
  30150. "lsr r7, r6, #16\n\t"
  30151. "lsl r6, r6, #16\n\t"
  30152. "adds r5, r5, r6\n\t"
  30153. "adcs r3, r3, r7\n\t"
  30154. "adc r4, r4, #0\n\t"
  30155. "lsr r6, %[b], #16\n\t"
  30156. "lsr r7, r8, #16\n\t"
  30157. "mul r7, r6, r7\n\t"
  30158. "adds r3, r3, r7\n\t"
  30159. "adc r4, r4, #0\n\t"
  30160. "lsl r7, r8, #16\n\t"
  30161. "lsr r7, r7, #16\n\t"
  30162. "mul r6, r7, r6\n\t"
  30163. "lsr r7, r6, #16\n\t"
  30164. "lsl r6, r6, #16\n\t"
  30165. "adds r5, r5, r6\n\t"
  30166. "adcs r3, r3, r7\n\t"
  30167. "adc r4, r4, #0\n\t"
  30168. #else
  30169. "umull r6, r7, %[b], r8\n\t"
  30170. "adds r5, r5, r6\n\t"
  30171. "adcs r3, r3, r7\n\t"
  30172. "mov r4, #0\n\t"
  30173. "adc r4, r4, #0\n\t"
  30174. #endif
  30175. "str r5, [%[r]], #4\n\t"
  30176. /* A[51] * B */
  30177. "ldr r8, [%[a]], #4\n\t"
  30178. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30179. "lsl r6, %[b], #16\n\t"
  30180. "lsl r7, r8, #16\n\t"
  30181. "lsr r6, r6, #16\n\t"
  30182. "lsr r7, r7, #16\n\t"
  30183. "mul r7, r6, r7\n\t"
  30184. "adds r3, r3, r7\n\t"
  30185. "adcs r4, r4, #0\n\t"
  30186. "mov r5, #0\n\t"
  30187. "adc r5, r5, #0\n\t"
  30188. "lsr r7, r8, #16\n\t"
  30189. "mul r6, r7, r6\n\t"
  30190. "lsr r7, r6, #16\n\t"
  30191. "lsl r6, r6, #16\n\t"
  30192. "adds r3, r3, r6\n\t"
  30193. "adcs r4, r4, r7\n\t"
  30194. "adc r5, r5, #0\n\t"
  30195. "lsr r6, %[b], #16\n\t"
  30196. "lsr r7, r8, #16\n\t"
  30197. "mul r7, r6, r7\n\t"
  30198. "adds r4, r4, r7\n\t"
  30199. "adc r5, r5, #0\n\t"
  30200. "lsl r7, r8, #16\n\t"
  30201. "lsr r7, r7, #16\n\t"
  30202. "mul r6, r7, r6\n\t"
  30203. "lsr r7, r6, #16\n\t"
  30204. "lsl r6, r6, #16\n\t"
  30205. "adds r3, r3, r6\n\t"
  30206. "adcs r4, r4, r7\n\t"
  30207. "adc r5, r5, #0\n\t"
  30208. #else
  30209. "umull r6, r7, %[b], r8\n\t"
  30210. "adds r3, r3, r6\n\t"
  30211. "adcs r4, r4, r7\n\t"
  30212. "mov r5, #0\n\t"
  30213. "adc r5, r5, #0\n\t"
  30214. #endif
  30215. "str r3, [%[r]], #4\n\t"
  30216. /* A[52] * B */
  30217. "ldr r8, [%[a]], #4\n\t"
  30218. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30219. "lsl r6, %[b], #16\n\t"
  30220. "lsl r7, r8, #16\n\t"
  30221. "lsr r6, r6, #16\n\t"
  30222. "lsr r7, r7, #16\n\t"
  30223. "mul r7, r6, r7\n\t"
  30224. "adds r4, r4, r7\n\t"
  30225. "adcs r5, r5, #0\n\t"
  30226. "mov r3, #0\n\t"
  30227. "adc r3, r3, #0\n\t"
  30228. "lsr r7, r8, #16\n\t"
  30229. "mul r6, r7, r6\n\t"
  30230. "lsr r7, r6, #16\n\t"
  30231. "lsl r6, r6, #16\n\t"
  30232. "adds r4, r4, r6\n\t"
  30233. "adcs r5, r5, r7\n\t"
  30234. "adc r3, r3, #0\n\t"
  30235. "lsr r6, %[b], #16\n\t"
  30236. "lsr r7, r8, #16\n\t"
  30237. "mul r7, r6, r7\n\t"
  30238. "adds r5, r5, r7\n\t"
  30239. "adc r3, r3, #0\n\t"
  30240. "lsl r7, r8, #16\n\t"
  30241. "lsr r7, r7, #16\n\t"
  30242. "mul r6, r7, r6\n\t"
  30243. "lsr r7, r6, #16\n\t"
  30244. "lsl r6, r6, #16\n\t"
  30245. "adds r4, r4, r6\n\t"
  30246. "adcs r5, r5, r7\n\t"
  30247. "adc r3, r3, #0\n\t"
  30248. #else
  30249. "umull r6, r7, %[b], r8\n\t"
  30250. "adds r4, r4, r6\n\t"
  30251. "adcs r5, r5, r7\n\t"
  30252. "mov r3, #0\n\t"
  30253. "adc r3, r3, #0\n\t"
  30254. #endif
  30255. "str r4, [%[r]], #4\n\t"
  30256. /* A[53] * B */
  30257. "ldr r8, [%[a]], #4\n\t"
  30258. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30259. "lsl r6, %[b], #16\n\t"
  30260. "lsl r7, r8, #16\n\t"
  30261. "lsr r6, r6, #16\n\t"
  30262. "lsr r7, r7, #16\n\t"
  30263. "mul r7, r6, r7\n\t"
  30264. "adds r5, r5, r7\n\t"
  30265. "adcs r3, r3, #0\n\t"
  30266. "mov r4, #0\n\t"
  30267. "adc r4, r4, #0\n\t"
  30268. "lsr r7, r8, #16\n\t"
  30269. "mul r6, r7, r6\n\t"
  30270. "lsr r7, r6, #16\n\t"
  30271. "lsl r6, r6, #16\n\t"
  30272. "adds r5, r5, r6\n\t"
  30273. "adcs r3, r3, r7\n\t"
  30274. "adc r4, r4, #0\n\t"
  30275. "lsr r6, %[b], #16\n\t"
  30276. "lsr r7, r8, #16\n\t"
  30277. "mul r7, r6, r7\n\t"
  30278. "adds r3, r3, r7\n\t"
  30279. "adc r4, r4, #0\n\t"
  30280. "lsl r7, r8, #16\n\t"
  30281. "lsr r7, r7, #16\n\t"
  30282. "mul r6, r7, r6\n\t"
  30283. "lsr r7, r6, #16\n\t"
  30284. "lsl r6, r6, #16\n\t"
  30285. "adds r5, r5, r6\n\t"
  30286. "adcs r3, r3, r7\n\t"
  30287. "adc r4, r4, #0\n\t"
  30288. #else
  30289. "umull r6, r7, %[b], r8\n\t"
  30290. "adds r5, r5, r6\n\t"
  30291. "adcs r3, r3, r7\n\t"
  30292. "mov r4, #0\n\t"
  30293. "adc r4, r4, #0\n\t"
  30294. #endif
  30295. "str r5, [%[r]], #4\n\t"
  30296. /* A[54] * B */
  30297. "ldr r8, [%[a]], #4\n\t"
  30298. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30299. "lsl r6, %[b], #16\n\t"
  30300. "lsl r7, r8, #16\n\t"
  30301. "lsr r6, r6, #16\n\t"
  30302. "lsr r7, r7, #16\n\t"
  30303. "mul r7, r6, r7\n\t"
  30304. "adds r3, r3, r7\n\t"
  30305. "adcs r4, r4, #0\n\t"
  30306. "mov r5, #0\n\t"
  30307. "adc r5, r5, #0\n\t"
  30308. "lsr r7, r8, #16\n\t"
  30309. "mul r6, r7, r6\n\t"
  30310. "lsr r7, r6, #16\n\t"
  30311. "lsl r6, r6, #16\n\t"
  30312. "adds r3, r3, r6\n\t"
  30313. "adcs r4, r4, r7\n\t"
  30314. "adc r5, r5, #0\n\t"
  30315. "lsr r6, %[b], #16\n\t"
  30316. "lsr r7, r8, #16\n\t"
  30317. "mul r7, r6, r7\n\t"
  30318. "adds r4, r4, r7\n\t"
  30319. "adc r5, r5, #0\n\t"
  30320. "lsl r7, r8, #16\n\t"
  30321. "lsr r7, r7, #16\n\t"
  30322. "mul r6, r7, r6\n\t"
  30323. "lsr r7, r6, #16\n\t"
  30324. "lsl r6, r6, #16\n\t"
  30325. "adds r3, r3, r6\n\t"
  30326. "adcs r4, r4, r7\n\t"
  30327. "adc r5, r5, #0\n\t"
  30328. #else
  30329. "umull r6, r7, %[b], r8\n\t"
  30330. "adds r3, r3, r6\n\t"
  30331. "adcs r4, r4, r7\n\t"
  30332. "mov r5, #0\n\t"
  30333. "adc r5, r5, #0\n\t"
  30334. #endif
  30335. "str r3, [%[r]], #4\n\t"
  30336. /* A[55] * B */
  30337. "ldr r8, [%[a]], #4\n\t"
  30338. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30339. "lsl r6, %[b], #16\n\t"
  30340. "lsl r7, r8, #16\n\t"
  30341. "lsr r6, r6, #16\n\t"
  30342. "lsr r7, r7, #16\n\t"
  30343. "mul r7, r6, r7\n\t"
  30344. "adds r4, r4, r7\n\t"
  30345. "adcs r5, r5, #0\n\t"
  30346. "mov r3, #0\n\t"
  30347. "adc r3, r3, #0\n\t"
  30348. "lsr r7, r8, #16\n\t"
  30349. "mul r6, r7, r6\n\t"
  30350. "lsr r7, r6, #16\n\t"
  30351. "lsl r6, r6, #16\n\t"
  30352. "adds r4, r4, r6\n\t"
  30353. "adcs r5, r5, r7\n\t"
  30354. "adc r3, r3, #0\n\t"
  30355. "lsr r6, %[b], #16\n\t"
  30356. "lsr r7, r8, #16\n\t"
  30357. "mul r7, r6, r7\n\t"
  30358. "adds r5, r5, r7\n\t"
  30359. "adc r3, r3, #0\n\t"
  30360. "lsl r7, r8, #16\n\t"
  30361. "lsr r7, r7, #16\n\t"
  30362. "mul r6, r7, r6\n\t"
  30363. "lsr r7, r6, #16\n\t"
  30364. "lsl r6, r6, #16\n\t"
  30365. "adds r4, r4, r6\n\t"
  30366. "adcs r5, r5, r7\n\t"
  30367. "adc r3, r3, #0\n\t"
  30368. #else
  30369. "umull r6, r7, %[b], r8\n\t"
  30370. "adds r4, r4, r6\n\t"
  30371. "adcs r5, r5, r7\n\t"
  30372. "mov r3, #0\n\t"
  30373. "adc r3, r3, #0\n\t"
  30374. #endif
  30375. "str r4, [%[r]], #4\n\t"
  30376. /* A[56] * B */
  30377. "ldr r8, [%[a]], #4\n\t"
  30378. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30379. "lsl r6, %[b], #16\n\t"
  30380. "lsl r7, r8, #16\n\t"
  30381. "lsr r6, r6, #16\n\t"
  30382. "lsr r7, r7, #16\n\t"
  30383. "mul r7, r6, r7\n\t"
  30384. "adds r5, r5, r7\n\t"
  30385. "adcs r3, r3, #0\n\t"
  30386. "mov r4, #0\n\t"
  30387. "adc r4, r4, #0\n\t"
  30388. "lsr r7, r8, #16\n\t"
  30389. "mul r6, r7, r6\n\t"
  30390. "lsr r7, r6, #16\n\t"
  30391. "lsl r6, r6, #16\n\t"
  30392. "adds r5, r5, r6\n\t"
  30393. "adcs r3, r3, r7\n\t"
  30394. "adc r4, r4, #0\n\t"
  30395. "lsr r6, %[b], #16\n\t"
  30396. "lsr r7, r8, #16\n\t"
  30397. "mul r7, r6, r7\n\t"
  30398. "adds r3, r3, r7\n\t"
  30399. "adc r4, r4, #0\n\t"
  30400. "lsl r7, r8, #16\n\t"
  30401. "lsr r7, r7, #16\n\t"
  30402. "mul r6, r7, r6\n\t"
  30403. "lsr r7, r6, #16\n\t"
  30404. "lsl r6, r6, #16\n\t"
  30405. "adds r5, r5, r6\n\t"
  30406. "adcs r3, r3, r7\n\t"
  30407. "adc r4, r4, #0\n\t"
  30408. #else
  30409. "umull r6, r7, %[b], r8\n\t"
  30410. "adds r5, r5, r6\n\t"
  30411. "adcs r3, r3, r7\n\t"
  30412. "mov r4, #0\n\t"
  30413. "adc r4, r4, #0\n\t"
  30414. #endif
  30415. "str r5, [%[r]], #4\n\t"
  30416. /* A[57] * B */
  30417. "ldr r8, [%[a]], #4\n\t"
  30418. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30419. "lsl r6, %[b], #16\n\t"
  30420. "lsl r7, r8, #16\n\t"
  30421. "lsr r6, r6, #16\n\t"
  30422. "lsr r7, r7, #16\n\t"
  30423. "mul r7, r6, r7\n\t"
  30424. "adds r3, r3, r7\n\t"
  30425. "adcs r4, r4, #0\n\t"
  30426. "mov r5, #0\n\t"
  30427. "adc r5, r5, #0\n\t"
  30428. "lsr r7, r8, #16\n\t"
  30429. "mul r6, r7, r6\n\t"
  30430. "lsr r7, r6, #16\n\t"
  30431. "lsl r6, r6, #16\n\t"
  30432. "adds r3, r3, r6\n\t"
  30433. "adcs r4, r4, r7\n\t"
  30434. "adc r5, r5, #0\n\t"
  30435. "lsr r6, %[b], #16\n\t"
  30436. "lsr r7, r8, #16\n\t"
  30437. "mul r7, r6, r7\n\t"
  30438. "adds r4, r4, r7\n\t"
  30439. "adc r5, r5, #0\n\t"
  30440. "lsl r7, r8, #16\n\t"
  30441. "lsr r7, r7, #16\n\t"
  30442. "mul r6, r7, r6\n\t"
  30443. "lsr r7, r6, #16\n\t"
  30444. "lsl r6, r6, #16\n\t"
  30445. "adds r3, r3, r6\n\t"
  30446. "adcs r4, r4, r7\n\t"
  30447. "adc r5, r5, #0\n\t"
  30448. #else
  30449. "umull r6, r7, %[b], r8\n\t"
  30450. "adds r3, r3, r6\n\t"
  30451. "adcs r4, r4, r7\n\t"
  30452. "mov r5, #0\n\t"
  30453. "adc r5, r5, #0\n\t"
  30454. #endif
  30455. "str r3, [%[r]], #4\n\t"
  30456. /* A[58] * B */
  30457. "ldr r8, [%[a]], #4\n\t"
  30458. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30459. "lsl r6, %[b], #16\n\t"
  30460. "lsl r7, r8, #16\n\t"
  30461. "lsr r6, r6, #16\n\t"
  30462. "lsr r7, r7, #16\n\t"
  30463. "mul r7, r6, r7\n\t"
  30464. "adds r4, r4, r7\n\t"
  30465. "adcs r5, r5, #0\n\t"
  30466. "mov r3, #0\n\t"
  30467. "adc r3, r3, #0\n\t"
  30468. "lsr r7, r8, #16\n\t"
  30469. "mul r6, r7, r6\n\t"
  30470. "lsr r7, r6, #16\n\t"
  30471. "lsl r6, r6, #16\n\t"
  30472. "adds r4, r4, r6\n\t"
  30473. "adcs r5, r5, r7\n\t"
  30474. "adc r3, r3, #0\n\t"
  30475. "lsr r6, %[b], #16\n\t"
  30476. "lsr r7, r8, #16\n\t"
  30477. "mul r7, r6, r7\n\t"
  30478. "adds r5, r5, r7\n\t"
  30479. "adc r3, r3, #0\n\t"
  30480. "lsl r7, r8, #16\n\t"
  30481. "lsr r7, r7, #16\n\t"
  30482. "mul r6, r7, r6\n\t"
  30483. "lsr r7, r6, #16\n\t"
  30484. "lsl r6, r6, #16\n\t"
  30485. "adds r4, r4, r6\n\t"
  30486. "adcs r5, r5, r7\n\t"
  30487. "adc r3, r3, #0\n\t"
  30488. #else
  30489. "umull r6, r7, %[b], r8\n\t"
  30490. "adds r4, r4, r6\n\t"
  30491. "adcs r5, r5, r7\n\t"
  30492. "mov r3, #0\n\t"
  30493. "adc r3, r3, #0\n\t"
  30494. #endif
  30495. "str r4, [%[r]], #4\n\t"
  30496. /* A[59] * B */
  30497. "ldr r8, [%[a]], #4\n\t"
  30498. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30499. "lsl r6, %[b], #16\n\t"
  30500. "lsl r7, r8, #16\n\t"
  30501. "lsr r6, r6, #16\n\t"
  30502. "lsr r7, r7, #16\n\t"
  30503. "mul r7, r6, r7\n\t"
  30504. "adds r5, r5, r7\n\t"
  30505. "adcs r3, r3, #0\n\t"
  30506. "mov r4, #0\n\t"
  30507. "adc r4, r4, #0\n\t"
  30508. "lsr r7, r8, #16\n\t"
  30509. "mul r6, r7, r6\n\t"
  30510. "lsr r7, r6, #16\n\t"
  30511. "lsl r6, r6, #16\n\t"
  30512. "adds r5, r5, r6\n\t"
  30513. "adcs r3, r3, r7\n\t"
  30514. "adc r4, r4, #0\n\t"
  30515. "lsr r6, %[b], #16\n\t"
  30516. "lsr r7, r8, #16\n\t"
  30517. "mul r7, r6, r7\n\t"
  30518. "adds r3, r3, r7\n\t"
  30519. "adc r4, r4, #0\n\t"
  30520. "lsl r7, r8, #16\n\t"
  30521. "lsr r7, r7, #16\n\t"
  30522. "mul r6, r7, r6\n\t"
  30523. "lsr r7, r6, #16\n\t"
  30524. "lsl r6, r6, #16\n\t"
  30525. "adds r5, r5, r6\n\t"
  30526. "adcs r3, r3, r7\n\t"
  30527. "adc r4, r4, #0\n\t"
  30528. #else
  30529. "umull r6, r7, %[b], r8\n\t"
  30530. "adds r5, r5, r6\n\t"
  30531. "adcs r3, r3, r7\n\t"
  30532. "mov r4, #0\n\t"
  30533. "adc r4, r4, #0\n\t"
  30534. #endif
  30535. "str r5, [%[r]], #4\n\t"
  30536. /* A[60] * B */
  30537. "ldr r8, [%[a]], #4\n\t"
  30538. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30539. "lsl r6, %[b], #16\n\t"
  30540. "lsl r7, r8, #16\n\t"
  30541. "lsr r6, r6, #16\n\t"
  30542. "lsr r7, r7, #16\n\t"
  30543. "mul r7, r6, r7\n\t"
  30544. "adds r3, r3, r7\n\t"
  30545. "adcs r4, r4, #0\n\t"
  30546. "mov r5, #0\n\t"
  30547. "adc r5, r5, #0\n\t"
  30548. "lsr r7, r8, #16\n\t"
  30549. "mul r6, r7, r6\n\t"
  30550. "lsr r7, r6, #16\n\t"
  30551. "lsl r6, r6, #16\n\t"
  30552. "adds r3, r3, r6\n\t"
  30553. "adcs r4, r4, r7\n\t"
  30554. "adc r5, r5, #0\n\t"
  30555. "lsr r6, %[b], #16\n\t"
  30556. "lsr r7, r8, #16\n\t"
  30557. "mul r7, r6, r7\n\t"
  30558. "adds r4, r4, r7\n\t"
  30559. "adc r5, r5, #0\n\t"
  30560. "lsl r7, r8, #16\n\t"
  30561. "lsr r7, r7, #16\n\t"
  30562. "mul r6, r7, r6\n\t"
  30563. "lsr r7, r6, #16\n\t"
  30564. "lsl r6, r6, #16\n\t"
  30565. "adds r3, r3, r6\n\t"
  30566. "adcs r4, r4, r7\n\t"
  30567. "adc r5, r5, #0\n\t"
  30568. #else
  30569. "umull r6, r7, %[b], r8\n\t"
  30570. "adds r3, r3, r6\n\t"
  30571. "adcs r4, r4, r7\n\t"
  30572. "mov r5, #0\n\t"
  30573. "adc r5, r5, #0\n\t"
  30574. #endif
  30575. "str r3, [%[r]], #4\n\t"
  30576. /* A[61] * B */
  30577. "ldr r8, [%[a]], #4\n\t"
  30578. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30579. "lsl r6, %[b], #16\n\t"
  30580. "lsl r7, r8, #16\n\t"
  30581. "lsr r6, r6, #16\n\t"
  30582. "lsr r7, r7, #16\n\t"
  30583. "mul r7, r6, r7\n\t"
  30584. "adds r4, r4, r7\n\t"
  30585. "adcs r5, r5, #0\n\t"
  30586. "mov r3, #0\n\t"
  30587. "adc r3, r3, #0\n\t"
  30588. "lsr r7, r8, #16\n\t"
  30589. "mul r6, r7, r6\n\t"
  30590. "lsr r7, r6, #16\n\t"
  30591. "lsl r6, r6, #16\n\t"
  30592. "adds r4, r4, r6\n\t"
  30593. "adcs r5, r5, r7\n\t"
  30594. "adc r3, r3, #0\n\t"
  30595. "lsr r6, %[b], #16\n\t"
  30596. "lsr r7, r8, #16\n\t"
  30597. "mul r7, r6, r7\n\t"
  30598. "adds r5, r5, r7\n\t"
  30599. "adc r3, r3, #0\n\t"
  30600. "lsl r7, r8, #16\n\t"
  30601. "lsr r7, r7, #16\n\t"
  30602. "mul r6, r7, r6\n\t"
  30603. "lsr r7, r6, #16\n\t"
  30604. "lsl r6, r6, #16\n\t"
  30605. "adds r4, r4, r6\n\t"
  30606. "adcs r5, r5, r7\n\t"
  30607. "adc r3, r3, #0\n\t"
  30608. #else
  30609. "umull r6, r7, %[b], r8\n\t"
  30610. "adds r4, r4, r6\n\t"
  30611. "adcs r5, r5, r7\n\t"
  30612. "mov r3, #0\n\t"
  30613. "adc r3, r3, #0\n\t"
  30614. #endif
  30615. "str r4, [%[r]], #4\n\t"
  30616. /* A[62] * B */
  30617. "ldr r8, [%[a]], #4\n\t"
  30618. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30619. "lsl r6, %[b], #16\n\t"
  30620. "lsl r7, r8, #16\n\t"
  30621. "lsr r6, r6, #16\n\t"
  30622. "lsr r7, r7, #16\n\t"
  30623. "mul r7, r6, r7\n\t"
  30624. "adds r5, r5, r7\n\t"
  30625. "adcs r3, r3, #0\n\t"
  30626. "mov r4, #0\n\t"
  30627. "adc r4, r4, #0\n\t"
  30628. "lsr r7, r8, #16\n\t"
  30629. "mul r6, r7, r6\n\t"
  30630. "lsr r7, r6, #16\n\t"
  30631. "lsl r6, r6, #16\n\t"
  30632. "adds r5, r5, r6\n\t"
  30633. "adcs r3, r3, r7\n\t"
  30634. "adc r4, r4, #0\n\t"
  30635. "lsr r6, %[b], #16\n\t"
  30636. "lsr r7, r8, #16\n\t"
  30637. "mul r7, r6, r7\n\t"
  30638. "adds r3, r3, r7\n\t"
  30639. "adc r4, r4, #0\n\t"
  30640. "lsl r7, r8, #16\n\t"
  30641. "lsr r7, r7, #16\n\t"
  30642. "mul r6, r7, r6\n\t"
  30643. "lsr r7, r6, #16\n\t"
  30644. "lsl r6, r6, #16\n\t"
  30645. "adds r5, r5, r6\n\t"
  30646. "adcs r3, r3, r7\n\t"
  30647. "adc r4, r4, #0\n\t"
  30648. #else
  30649. "umull r6, r7, %[b], r8\n\t"
  30650. "adds r5, r5, r6\n\t"
  30651. "adcs r3, r3, r7\n\t"
  30652. "mov r4, #0\n\t"
  30653. "adc r4, r4, #0\n\t"
  30654. #endif
  30655. "str r5, [%[r]], #4\n\t"
  30656. /* A[63] * B */
  30657. "ldr r8, [%[a]], #4\n\t"
  30658. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30659. "lsl r6, %[b], #16\n\t"
  30660. "lsl r7, r8, #16\n\t"
  30661. "lsr r6, r6, #16\n\t"
  30662. "lsr r7, r7, #16\n\t"
  30663. "mul r7, r6, r7\n\t"
  30664. "adds r3, r3, r7\n\t"
  30665. "adcs r4, r4, #0\n\t"
  30666. "mov r5, #0\n\t"
  30667. "adc r5, r5, #0\n\t"
  30668. "lsr r7, r8, #16\n\t"
  30669. "mul r6, r7, r6\n\t"
  30670. "lsr r7, r6, #16\n\t"
  30671. "lsl r6, r6, #16\n\t"
  30672. "adds r3, r3, r6\n\t"
  30673. "adcs r4, r4, r7\n\t"
  30674. "adc r5, r5, #0\n\t"
  30675. "lsr r6, %[b], #16\n\t"
  30676. "lsr r7, r8, #16\n\t"
  30677. "mul r7, r6, r7\n\t"
  30678. "adds r4, r4, r7\n\t"
  30679. "adc r5, r5, #0\n\t"
  30680. "lsl r7, r8, #16\n\t"
  30681. "lsr r7, r7, #16\n\t"
  30682. "mul r6, r7, r6\n\t"
  30683. "lsr r7, r6, #16\n\t"
  30684. "lsl r6, r6, #16\n\t"
  30685. "adds r3, r3, r6\n\t"
  30686. "adcs r4, r4, r7\n\t"
  30687. "adc r5, r5, #0\n\t"
  30688. #else
  30689. "umull r6, r7, %[b], r8\n\t"
  30690. "adds r3, r3, r6\n\t"
  30691. "adcs r4, r4, r7\n\t"
  30692. "mov r5, #0\n\t"
  30693. "adc r5, r5, #0\n\t"
  30694. #endif
  30695. "str r3, [%[r]], #4\n\t"
  30696. /* A[64] * B */
  30697. "ldr r8, [%[a]], #4\n\t"
  30698. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30699. "lsl r6, %[b], #16\n\t"
  30700. "lsl r7, r8, #16\n\t"
  30701. "lsr r6, r6, #16\n\t"
  30702. "lsr r7, r7, #16\n\t"
  30703. "mul r7, r6, r7\n\t"
  30704. "adds r4, r4, r7\n\t"
  30705. "adcs r5, r5, #0\n\t"
  30706. "mov r3, #0\n\t"
  30707. "adc r3, r3, #0\n\t"
  30708. "lsr r7, r8, #16\n\t"
  30709. "mul r6, r7, r6\n\t"
  30710. "lsr r7, r6, #16\n\t"
  30711. "lsl r6, r6, #16\n\t"
  30712. "adds r4, r4, r6\n\t"
  30713. "adcs r5, r5, r7\n\t"
  30714. "adc r3, r3, #0\n\t"
  30715. "lsr r6, %[b], #16\n\t"
  30716. "lsr r7, r8, #16\n\t"
  30717. "mul r7, r6, r7\n\t"
  30718. "adds r5, r5, r7\n\t"
  30719. "adc r3, r3, #0\n\t"
  30720. "lsl r7, r8, #16\n\t"
  30721. "lsr r7, r7, #16\n\t"
  30722. "mul r6, r7, r6\n\t"
  30723. "lsr r7, r6, #16\n\t"
  30724. "lsl r6, r6, #16\n\t"
  30725. "adds r4, r4, r6\n\t"
  30726. "adcs r5, r5, r7\n\t"
  30727. "adc r3, r3, #0\n\t"
  30728. #else
  30729. "umull r6, r7, %[b], r8\n\t"
  30730. "adds r4, r4, r6\n\t"
  30731. "adcs r5, r5, r7\n\t"
  30732. "mov r3, #0\n\t"
  30733. "adc r3, r3, #0\n\t"
  30734. #endif
  30735. "str r4, [%[r]], #4\n\t"
  30736. /* A[65] * B */
  30737. "ldr r8, [%[a]], #4\n\t"
  30738. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30739. "lsl r6, %[b], #16\n\t"
  30740. "lsl r7, r8, #16\n\t"
  30741. "lsr r6, r6, #16\n\t"
  30742. "lsr r7, r7, #16\n\t"
  30743. "mul r7, r6, r7\n\t"
  30744. "adds r5, r5, r7\n\t"
  30745. "adcs r3, r3, #0\n\t"
  30746. "mov r4, #0\n\t"
  30747. "adc r4, r4, #0\n\t"
  30748. "lsr r7, r8, #16\n\t"
  30749. "mul r6, r7, r6\n\t"
  30750. "lsr r7, r6, #16\n\t"
  30751. "lsl r6, r6, #16\n\t"
  30752. "adds r5, r5, r6\n\t"
  30753. "adcs r3, r3, r7\n\t"
  30754. "adc r4, r4, #0\n\t"
  30755. "lsr r6, %[b], #16\n\t"
  30756. "lsr r7, r8, #16\n\t"
  30757. "mul r7, r6, r7\n\t"
  30758. "adds r3, r3, r7\n\t"
  30759. "adc r4, r4, #0\n\t"
  30760. "lsl r7, r8, #16\n\t"
  30761. "lsr r7, r7, #16\n\t"
  30762. "mul r6, r7, r6\n\t"
  30763. "lsr r7, r6, #16\n\t"
  30764. "lsl r6, r6, #16\n\t"
  30765. "adds r5, r5, r6\n\t"
  30766. "adcs r3, r3, r7\n\t"
  30767. "adc r4, r4, #0\n\t"
  30768. #else
  30769. "umull r6, r7, %[b], r8\n\t"
  30770. "adds r5, r5, r6\n\t"
  30771. "adcs r3, r3, r7\n\t"
  30772. "mov r4, #0\n\t"
  30773. "adc r4, r4, #0\n\t"
  30774. #endif
  30775. "str r5, [%[r]], #4\n\t"
  30776. /* A[66] * B */
  30777. "ldr r8, [%[a]], #4\n\t"
  30778. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30779. "lsl r6, %[b], #16\n\t"
  30780. "lsl r7, r8, #16\n\t"
  30781. "lsr r6, r6, #16\n\t"
  30782. "lsr r7, r7, #16\n\t"
  30783. "mul r7, r6, r7\n\t"
  30784. "adds r3, r3, r7\n\t"
  30785. "adcs r4, r4, #0\n\t"
  30786. "mov r5, #0\n\t"
  30787. "adc r5, r5, #0\n\t"
  30788. "lsr r7, r8, #16\n\t"
  30789. "mul r6, r7, r6\n\t"
  30790. "lsr r7, r6, #16\n\t"
  30791. "lsl r6, r6, #16\n\t"
  30792. "adds r3, r3, r6\n\t"
  30793. "adcs r4, r4, r7\n\t"
  30794. "adc r5, r5, #0\n\t"
  30795. "lsr r6, %[b], #16\n\t"
  30796. "lsr r7, r8, #16\n\t"
  30797. "mul r7, r6, r7\n\t"
  30798. "adds r4, r4, r7\n\t"
  30799. "adc r5, r5, #0\n\t"
  30800. "lsl r7, r8, #16\n\t"
  30801. "lsr r7, r7, #16\n\t"
  30802. "mul r6, r7, r6\n\t"
  30803. "lsr r7, r6, #16\n\t"
  30804. "lsl r6, r6, #16\n\t"
  30805. "adds r3, r3, r6\n\t"
  30806. "adcs r4, r4, r7\n\t"
  30807. "adc r5, r5, #0\n\t"
  30808. #else
  30809. "umull r6, r7, %[b], r8\n\t"
  30810. "adds r3, r3, r6\n\t"
  30811. "adcs r4, r4, r7\n\t"
  30812. "mov r5, #0\n\t"
  30813. "adc r5, r5, #0\n\t"
  30814. #endif
  30815. "str r3, [%[r]], #4\n\t"
  30816. /* A[67] * B */
  30817. "ldr r8, [%[a]], #4\n\t"
  30818. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30819. "lsl r6, %[b], #16\n\t"
  30820. "lsl r7, r8, #16\n\t"
  30821. "lsr r6, r6, #16\n\t"
  30822. "lsr r7, r7, #16\n\t"
  30823. "mul r7, r6, r7\n\t"
  30824. "adds r4, r4, r7\n\t"
  30825. "adcs r5, r5, #0\n\t"
  30826. "mov r3, #0\n\t"
  30827. "adc r3, r3, #0\n\t"
  30828. "lsr r7, r8, #16\n\t"
  30829. "mul r6, r7, r6\n\t"
  30830. "lsr r7, r6, #16\n\t"
  30831. "lsl r6, r6, #16\n\t"
  30832. "adds r4, r4, r6\n\t"
  30833. "adcs r5, r5, r7\n\t"
  30834. "adc r3, r3, #0\n\t"
  30835. "lsr r6, %[b], #16\n\t"
  30836. "lsr r7, r8, #16\n\t"
  30837. "mul r7, r6, r7\n\t"
  30838. "adds r5, r5, r7\n\t"
  30839. "adc r3, r3, #0\n\t"
  30840. "lsl r7, r8, #16\n\t"
  30841. "lsr r7, r7, #16\n\t"
  30842. "mul r6, r7, r6\n\t"
  30843. "lsr r7, r6, #16\n\t"
  30844. "lsl r6, r6, #16\n\t"
  30845. "adds r4, r4, r6\n\t"
  30846. "adcs r5, r5, r7\n\t"
  30847. "adc r3, r3, #0\n\t"
  30848. #else
  30849. "umull r6, r7, %[b], r8\n\t"
  30850. "adds r4, r4, r6\n\t"
  30851. "adcs r5, r5, r7\n\t"
  30852. "mov r3, #0\n\t"
  30853. "adc r3, r3, #0\n\t"
  30854. #endif
  30855. "str r4, [%[r]], #4\n\t"
  30856. /* A[68] * B */
  30857. "ldr r8, [%[a]], #4\n\t"
  30858. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30859. "lsl r6, %[b], #16\n\t"
  30860. "lsl r7, r8, #16\n\t"
  30861. "lsr r6, r6, #16\n\t"
  30862. "lsr r7, r7, #16\n\t"
  30863. "mul r7, r6, r7\n\t"
  30864. "adds r5, r5, r7\n\t"
  30865. "adcs r3, r3, #0\n\t"
  30866. "mov r4, #0\n\t"
  30867. "adc r4, r4, #0\n\t"
  30868. "lsr r7, r8, #16\n\t"
  30869. "mul r6, r7, r6\n\t"
  30870. "lsr r7, r6, #16\n\t"
  30871. "lsl r6, r6, #16\n\t"
  30872. "adds r5, r5, r6\n\t"
  30873. "adcs r3, r3, r7\n\t"
  30874. "adc r4, r4, #0\n\t"
  30875. "lsr r6, %[b], #16\n\t"
  30876. "lsr r7, r8, #16\n\t"
  30877. "mul r7, r6, r7\n\t"
  30878. "adds r3, r3, r7\n\t"
  30879. "adc r4, r4, #0\n\t"
  30880. "lsl r7, r8, #16\n\t"
  30881. "lsr r7, r7, #16\n\t"
  30882. "mul r6, r7, r6\n\t"
  30883. "lsr r7, r6, #16\n\t"
  30884. "lsl r6, r6, #16\n\t"
  30885. "adds r5, r5, r6\n\t"
  30886. "adcs r3, r3, r7\n\t"
  30887. "adc r4, r4, #0\n\t"
  30888. #else
  30889. "umull r6, r7, %[b], r8\n\t"
  30890. "adds r5, r5, r6\n\t"
  30891. "adcs r3, r3, r7\n\t"
  30892. "mov r4, #0\n\t"
  30893. "adc r4, r4, #0\n\t"
  30894. #endif
  30895. "str r5, [%[r]], #4\n\t"
  30896. /* A[69] * B */
  30897. "ldr r8, [%[a]], #4\n\t"
  30898. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30899. "lsl r6, %[b], #16\n\t"
  30900. "lsl r7, r8, #16\n\t"
  30901. "lsr r6, r6, #16\n\t"
  30902. "lsr r7, r7, #16\n\t"
  30903. "mul r7, r6, r7\n\t"
  30904. "adds r3, r3, r7\n\t"
  30905. "adcs r4, r4, #0\n\t"
  30906. "mov r5, #0\n\t"
  30907. "adc r5, r5, #0\n\t"
  30908. "lsr r7, r8, #16\n\t"
  30909. "mul r6, r7, r6\n\t"
  30910. "lsr r7, r6, #16\n\t"
  30911. "lsl r6, r6, #16\n\t"
  30912. "adds r3, r3, r6\n\t"
  30913. "adcs r4, r4, r7\n\t"
  30914. "adc r5, r5, #0\n\t"
  30915. "lsr r6, %[b], #16\n\t"
  30916. "lsr r7, r8, #16\n\t"
  30917. "mul r7, r6, r7\n\t"
  30918. "adds r4, r4, r7\n\t"
  30919. "adc r5, r5, #0\n\t"
  30920. "lsl r7, r8, #16\n\t"
  30921. "lsr r7, r7, #16\n\t"
  30922. "mul r6, r7, r6\n\t"
  30923. "lsr r7, r6, #16\n\t"
  30924. "lsl r6, r6, #16\n\t"
  30925. "adds r3, r3, r6\n\t"
  30926. "adcs r4, r4, r7\n\t"
  30927. "adc r5, r5, #0\n\t"
  30928. #else
  30929. "umull r6, r7, %[b], r8\n\t"
  30930. "adds r3, r3, r6\n\t"
  30931. "adcs r4, r4, r7\n\t"
  30932. "mov r5, #0\n\t"
  30933. "adc r5, r5, #0\n\t"
  30934. #endif
  30935. "str r3, [%[r]], #4\n\t"
  30936. /* A[70] * B */
  30937. "ldr r8, [%[a]], #4\n\t"
  30938. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30939. "lsl r6, %[b], #16\n\t"
  30940. "lsl r7, r8, #16\n\t"
  30941. "lsr r6, r6, #16\n\t"
  30942. "lsr r7, r7, #16\n\t"
  30943. "mul r7, r6, r7\n\t"
  30944. "adds r4, r4, r7\n\t"
  30945. "adcs r5, r5, #0\n\t"
  30946. "mov r3, #0\n\t"
  30947. "adc r3, r3, #0\n\t"
  30948. "lsr r7, r8, #16\n\t"
  30949. "mul r6, r7, r6\n\t"
  30950. "lsr r7, r6, #16\n\t"
  30951. "lsl r6, r6, #16\n\t"
  30952. "adds r4, r4, r6\n\t"
  30953. "adcs r5, r5, r7\n\t"
  30954. "adc r3, r3, #0\n\t"
  30955. "lsr r6, %[b], #16\n\t"
  30956. "lsr r7, r8, #16\n\t"
  30957. "mul r7, r6, r7\n\t"
  30958. "adds r5, r5, r7\n\t"
  30959. "adc r3, r3, #0\n\t"
  30960. "lsl r7, r8, #16\n\t"
  30961. "lsr r7, r7, #16\n\t"
  30962. "mul r6, r7, r6\n\t"
  30963. "lsr r7, r6, #16\n\t"
  30964. "lsl r6, r6, #16\n\t"
  30965. "adds r4, r4, r6\n\t"
  30966. "adcs r5, r5, r7\n\t"
  30967. "adc r3, r3, #0\n\t"
  30968. #else
  30969. "umull r6, r7, %[b], r8\n\t"
  30970. "adds r4, r4, r6\n\t"
  30971. "adcs r5, r5, r7\n\t"
  30972. "mov r3, #0\n\t"
  30973. "adc r3, r3, #0\n\t"
  30974. #endif
  30975. "str r4, [%[r]], #4\n\t"
  30976. /* A[71] * B */
  30977. "ldr r8, [%[a]], #4\n\t"
  30978. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  30979. "lsl r6, %[b], #16\n\t"
  30980. "lsl r7, r8, #16\n\t"
  30981. "lsr r6, r6, #16\n\t"
  30982. "lsr r7, r7, #16\n\t"
  30983. "mul r7, r6, r7\n\t"
  30984. "adds r5, r5, r7\n\t"
  30985. "adcs r3, r3, #0\n\t"
  30986. "mov r4, #0\n\t"
  30987. "adc r4, r4, #0\n\t"
  30988. "lsr r7, r8, #16\n\t"
  30989. "mul r6, r7, r6\n\t"
  30990. "lsr r7, r6, #16\n\t"
  30991. "lsl r6, r6, #16\n\t"
  30992. "adds r5, r5, r6\n\t"
  30993. "adcs r3, r3, r7\n\t"
  30994. "adc r4, r4, #0\n\t"
  30995. "lsr r6, %[b], #16\n\t"
  30996. "lsr r7, r8, #16\n\t"
  30997. "mul r7, r6, r7\n\t"
  30998. "adds r3, r3, r7\n\t"
  30999. "adc r4, r4, #0\n\t"
  31000. "lsl r7, r8, #16\n\t"
  31001. "lsr r7, r7, #16\n\t"
  31002. "mul r6, r7, r6\n\t"
  31003. "lsr r7, r6, #16\n\t"
  31004. "lsl r6, r6, #16\n\t"
  31005. "adds r5, r5, r6\n\t"
  31006. "adcs r3, r3, r7\n\t"
  31007. "adc r4, r4, #0\n\t"
  31008. #else
  31009. "umull r6, r7, %[b], r8\n\t"
  31010. "adds r5, r5, r6\n\t"
  31011. "adcs r3, r3, r7\n\t"
  31012. "mov r4, #0\n\t"
  31013. "adc r4, r4, #0\n\t"
  31014. #endif
  31015. "str r5, [%[r]], #4\n\t"
  31016. /* A[72] * B */
  31017. "ldr r8, [%[a]], #4\n\t"
  31018. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31019. "lsl r6, %[b], #16\n\t"
  31020. "lsl r7, r8, #16\n\t"
  31021. "lsr r6, r6, #16\n\t"
  31022. "lsr r7, r7, #16\n\t"
  31023. "mul r7, r6, r7\n\t"
  31024. "adds r3, r3, r7\n\t"
  31025. "adcs r4, r4, #0\n\t"
  31026. "mov r5, #0\n\t"
  31027. "adc r5, r5, #0\n\t"
  31028. "lsr r7, r8, #16\n\t"
  31029. "mul r6, r7, r6\n\t"
  31030. "lsr r7, r6, #16\n\t"
  31031. "lsl r6, r6, #16\n\t"
  31032. "adds r3, r3, r6\n\t"
  31033. "adcs r4, r4, r7\n\t"
  31034. "adc r5, r5, #0\n\t"
  31035. "lsr r6, %[b], #16\n\t"
  31036. "lsr r7, r8, #16\n\t"
  31037. "mul r7, r6, r7\n\t"
  31038. "adds r4, r4, r7\n\t"
  31039. "adc r5, r5, #0\n\t"
  31040. "lsl r7, r8, #16\n\t"
  31041. "lsr r7, r7, #16\n\t"
  31042. "mul r6, r7, r6\n\t"
  31043. "lsr r7, r6, #16\n\t"
  31044. "lsl r6, r6, #16\n\t"
  31045. "adds r3, r3, r6\n\t"
  31046. "adcs r4, r4, r7\n\t"
  31047. "adc r5, r5, #0\n\t"
  31048. #else
  31049. "umull r6, r7, %[b], r8\n\t"
  31050. "adds r3, r3, r6\n\t"
  31051. "adcs r4, r4, r7\n\t"
  31052. "mov r5, #0\n\t"
  31053. "adc r5, r5, #0\n\t"
  31054. #endif
  31055. "str r3, [%[r]], #4\n\t"
  31056. /* A[73] * B */
  31057. "ldr r8, [%[a]], #4\n\t"
  31058. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31059. "lsl r6, %[b], #16\n\t"
  31060. "lsl r7, r8, #16\n\t"
  31061. "lsr r6, r6, #16\n\t"
  31062. "lsr r7, r7, #16\n\t"
  31063. "mul r7, r6, r7\n\t"
  31064. "adds r4, r4, r7\n\t"
  31065. "adcs r5, r5, #0\n\t"
  31066. "mov r3, #0\n\t"
  31067. "adc r3, r3, #0\n\t"
  31068. "lsr r7, r8, #16\n\t"
  31069. "mul r6, r7, r6\n\t"
  31070. "lsr r7, r6, #16\n\t"
  31071. "lsl r6, r6, #16\n\t"
  31072. "adds r4, r4, r6\n\t"
  31073. "adcs r5, r5, r7\n\t"
  31074. "adc r3, r3, #0\n\t"
  31075. "lsr r6, %[b], #16\n\t"
  31076. "lsr r7, r8, #16\n\t"
  31077. "mul r7, r6, r7\n\t"
  31078. "adds r5, r5, r7\n\t"
  31079. "adc r3, r3, #0\n\t"
  31080. "lsl r7, r8, #16\n\t"
  31081. "lsr r7, r7, #16\n\t"
  31082. "mul r6, r7, r6\n\t"
  31083. "lsr r7, r6, #16\n\t"
  31084. "lsl r6, r6, #16\n\t"
  31085. "adds r4, r4, r6\n\t"
  31086. "adcs r5, r5, r7\n\t"
  31087. "adc r3, r3, #0\n\t"
  31088. #else
  31089. "umull r6, r7, %[b], r8\n\t"
  31090. "adds r4, r4, r6\n\t"
  31091. "adcs r5, r5, r7\n\t"
  31092. "mov r3, #0\n\t"
  31093. "adc r3, r3, #0\n\t"
  31094. #endif
  31095. "str r4, [%[r]], #4\n\t"
  31096. /* A[74] * B */
  31097. "ldr r8, [%[a]], #4\n\t"
  31098. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31099. "lsl r6, %[b], #16\n\t"
  31100. "lsl r7, r8, #16\n\t"
  31101. "lsr r6, r6, #16\n\t"
  31102. "lsr r7, r7, #16\n\t"
  31103. "mul r7, r6, r7\n\t"
  31104. "adds r5, r5, r7\n\t"
  31105. "adcs r3, r3, #0\n\t"
  31106. "mov r4, #0\n\t"
  31107. "adc r4, r4, #0\n\t"
  31108. "lsr r7, r8, #16\n\t"
  31109. "mul r6, r7, r6\n\t"
  31110. "lsr r7, r6, #16\n\t"
  31111. "lsl r6, r6, #16\n\t"
  31112. "adds r5, r5, r6\n\t"
  31113. "adcs r3, r3, r7\n\t"
  31114. "adc r4, r4, #0\n\t"
  31115. "lsr r6, %[b], #16\n\t"
  31116. "lsr r7, r8, #16\n\t"
  31117. "mul r7, r6, r7\n\t"
  31118. "adds r3, r3, r7\n\t"
  31119. "adc r4, r4, #0\n\t"
  31120. "lsl r7, r8, #16\n\t"
  31121. "lsr r7, r7, #16\n\t"
  31122. "mul r6, r7, r6\n\t"
  31123. "lsr r7, r6, #16\n\t"
  31124. "lsl r6, r6, #16\n\t"
  31125. "adds r5, r5, r6\n\t"
  31126. "adcs r3, r3, r7\n\t"
  31127. "adc r4, r4, #0\n\t"
  31128. #else
  31129. "umull r6, r7, %[b], r8\n\t"
  31130. "adds r5, r5, r6\n\t"
  31131. "adcs r3, r3, r7\n\t"
  31132. "mov r4, #0\n\t"
  31133. "adc r4, r4, #0\n\t"
  31134. #endif
  31135. "str r5, [%[r]], #4\n\t"
  31136. /* A[75] * B */
  31137. "ldr r8, [%[a]], #4\n\t"
  31138. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31139. "lsl r6, %[b], #16\n\t"
  31140. "lsl r7, r8, #16\n\t"
  31141. "lsr r6, r6, #16\n\t"
  31142. "lsr r7, r7, #16\n\t"
  31143. "mul r7, r6, r7\n\t"
  31144. "adds r3, r3, r7\n\t"
  31145. "adcs r4, r4, #0\n\t"
  31146. "mov r5, #0\n\t"
  31147. "adc r5, r5, #0\n\t"
  31148. "lsr r7, r8, #16\n\t"
  31149. "mul r6, r7, r6\n\t"
  31150. "lsr r7, r6, #16\n\t"
  31151. "lsl r6, r6, #16\n\t"
  31152. "adds r3, r3, r6\n\t"
  31153. "adcs r4, r4, r7\n\t"
  31154. "adc r5, r5, #0\n\t"
  31155. "lsr r6, %[b], #16\n\t"
  31156. "lsr r7, r8, #16\n\t"
  31157. "mul r7, r6, r7\n\t"
  31158. "adds r4, r4, r7\n\t"
  31159. "adc r5, r5, #0\n\t"
  31160. "lsl r7, r8, #16\n\t"
  31161. "lsr r7, r7, #16\n\t"
  31162. "mul r6, r7, r6\n\t"
  31163. "lsr r7, r6, #16\n\t"
  31164. "lsl r6, r6, #16\n\t"
  31165. "adds r3, r3, r6\n\t"
  31166. "adcs r4, r4, r7\n\t"
  31167. "adc r5, r5, #0\n\t"
  31168. #else
  31169. "umull r6, r7, %[b], r8\n\t"
  31170. "adds r3, r3, r6\n\t"
  31171. "adcs r4, r4, r7\n\t"
  31172. "mov r5, #0\n\t"
  31173. "adc r5, r5, #0\n\t"
  31174. #endif
  31175. "str r3, [%[r]], #4\n\t"
  31176. /* A[76] * B */
  31177. "ldr r8, [%[a]], #4\n\t"
  31178. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31179. "lsl r6, %[b], #16\n\t"
  31180. "lsl r7, r8, #16\n\t"
  31181. "lsr r6, r6, #16\n\t"
  31182. "lsr r7, r7, #16\n\t"
  31183. "mul r7, r6, r7\n\t"
  31184. "adds r4, r4, r7\n\t"
  31185. "adcs r5, r5, #0\n\t"
  31186. "mov r3, #0\n\t"
  31187. "adc r3, r3, #0\n\t"
  31188. "lsr r7, r8, #16\n\t"
  31189. "mul r6, r7, r6\n\t"
  31190. "lsr r7, r6, #16\n\t"
  31191. "lsl r6, r6, #16\n\t"
  31192. "adds r4, r4, r6\n\t"
  31193. "adcs r5, r5, r7\n\t"
  31194. "adc r3, r3, #0\n\t"
  31195. "lsr r6, %[b], #16\n\t"
  31196. "lsr r7, r8, #16\n\t"
  31197. "mul r7, r6, r7\n\t"
  31198. "adds r5, r5, r7\n\t"
  31199. "adc r3, r3, #0\n\t"
  31200. "lsl r7, r8, #16\n\t"
  31201. "lsr r7, r7, #16\n\t"
  31202. "mul r6, r7, r6\n\t"
  31203. "lsr r7, r6, #16\n\t"
  31204. "lsl r6, r6, #16\n\t"
  31205. "adds r4, r4, r6\n\t"
  31206. "adcs r5, r5, r7\n\t"
  31207. "adc r3, r3, #0\n\t"
  31208. #else
  31209. "umull r6, r7, %[b], r8\n\t"
  31210. "adds r4, r4, r6\n\t"
  31211. "adcs r5, r5, r7\n\t"
  31212. "mov r3, #0\n\t"
  31213. "adc r3, r3, #0\n\t"
  31214. #endif
  31215. "str r4, [%[r]], #4\n\t"
  31216. /* A[77] * B */
  31217. "ldr r8, [%[a]], #4\n\t"
  31218. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31219. "lsl r6, %[b], #16\n\t"
  31220. "lsl r7, r8, #16\n\t"
  31221. "lsr r6, r6, #16\n\t"
  31222. "lsr r7, r7, #16\n\t"
  31223. "mul r7, r6, r7\n\t"
  31224. "adds r5, r5, r7\n\t"
  31225. "adcs r3, r3, #0\n\t"
  31226. "mov r4, #0\n\t"
  31227. "adc r4, r4, #0\n\t"
  31228. "lsr r7, r8, #16\n\t"
  31229. "mul r6, r7, r6\n\t"
  31230. "lsr r7, r6, #16\n\t"
  31231. "lsl r6, r6, #16\n\t"
  31232. "adds r5, r5, r6\n\t"
  31233. "adcs r3, r3, r7\n\t"
  31234. "adc r4, r4, #0\n\t"
  31235. "lsr r6, %[b], #16\n\t"
  31236. "lsr r7, r8, #16\n\t"
  31237. "mul r7, r6, r7\n\t"
  31238. "adds r3, r3, r7\n\t"
  31239. "adc r4, r4, #0\n\t"
  31240. "lsl r7, r8, #16\n\t"
  31241. "lsr r7, r7, #16\n\t"
  31242. "mul r6, r7, r6\n\t"
  31243. "lsr r7, r6, #16\n\t"
  31244. "lsl r6, r6, #16\n\t"
  31245. "adds r5, r5, r6\n\t"
  31246. "adcs r3, r3, r7\n\t"
  31247. "adc r4, r4, #0\n\t"
  31248. #else
  31249. "umull r6, r7, %[b], r8\n\t"
  31250. "adds r5, r5, r6\n\t"
  31251. "adcs r3, r3, r7\n\t"
  31252. "mov r4, #0\n\t"
  31253. "adc r4, r4, #0\n\t"
  31254. #endif
  31255. "str r5, [%[r]], #4\n\t"
  31256. /* A[78] * B */
  31257. "ldr r8, [%[a]], #4\n\t"
  31258. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31259. "lsl r6, %[b], #16\n\t"
  31260. "lsl r7, r8, #16\n\t"
  31261. "lsr r6, r6, #16\n\t"
  31262. "lsr r7, r7, #16\n\t"
  31263. "mul r7, r6, r7\n\t"
  31264. "adds r3, r3, r7\n\t"
  31265. "adcs r4, r4, #0\n\t"
  31266. "mov r5, #0\n\t"
  31267. "adc r5, r5, #0\n\t"
  31268. "lsr r7, r8, #16\n\t"
  31269. "mul r6, r7, r6\n\t"
  31270. "lsr r7, r6, #16\n\t"
  31271. "lsl r6, r6, #16\n\t"
  31272. "adds r3, r3, r6\n\t"
  31273. "adcs r4, r4, r7\n\t"
  31274. "adc r5, r5, #0\n\t"
  31275. "lsr r6, %[b], #16\n\t"
  31276. "lsr r7, r8, #16\n\t"
  31277. "mul r7, r6, r7\n\t"
  31278. "adds r4, r4, r7\n\t"
  31279. "adc r5, r5, #0\n\t"
  31280. "lsl r7, r8, #16\n\t"
  31281. "lsr r7, r7, #16\n\t"
  31282. "mul r6, r7, r6\n\t"
  31283. "lsr r7, r6, #16\n\t"
  31284. "lsl r6, r6, #16\n\t"
  31285. "adds r3, r3, r6\n\t"
  31286. "adcs r4, r4, r7\n\t"
  31287. "adc r5, r5, #0\n\t"
  31288. #else
  31289. "umull r6, r7, %[b], r8\n\t"
  31290. "adds r3, r3, r6\n\t"
  31291. "adcs r4, r4, r7\n\t"
  31292. "mov r5, #0\n\t"
  31293. "adc r5, r5, #0\n\t"
  31294. #endif
  31295. "str r3, [%[r]], #4\n\t"
  31296. /* A[79] * B */
  31297. "ldr r8, [%[a]], #4\n\t"
  31298. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31299. "lsl r6, %[b], #16\n\t"
  31300. "lsl r7, r8, #16\n\t"
  31301. "lsr r6, r6, #16\n\t"
  31302. "lsr r7, r7, #16\n\t"
  31303. "mul r7, r6, r7\n\t"
  31304. "adds r4, r4, r7\n\t"
  31305. "adcs r5, r5, #0\n\t"
  31306. "mov r3, #0\n\t"
  31307. "adc r3, r3, #0\n\t"
  31308. "lsr r7, r8, #16\n\t"
  31309. "mul r6, r7, r6\n\t"
  31310. "lsr r7, r6, #16\n\t"
  31311. "lsl r6, r6, #16\n\t"
  31312. "adds r4, r4, r6\n\t"
  31313. "adcs r5, r5, r7\n\t"
  31314. "adc r3, r3, #0\n\t"
  31315. "lsr r6, %[b], #16\n\t"
  31316. "lsr r7, r8, #16\n\t"
  31317. "mul r7, r6, r7\n\t"
  31318. "adds r5, r5, r7\n\t"
  31319. "adc r3, r3, #0\n\t"
  31320. "lsl r7, r8, #16\n\t"
  31321. "lsr r7, r7, #16\n\t"
  31322. "mul r6, r7, r6\n\t"
  31323. "lsr r7, r6, #16\n\t"
  31324. "lsl r6, r6, #16\n\t"
  31325. "adds r4, r4, r6\n\t"
  31326. "adcs r5, r5, r7\n\t"
  31327. "adc r3, r3, #0\n\t"
  31328. #else
  31329. "umull r6, r7, %[b], r8\n\t"
  31330. "adds r4, r4, r6\n\t"
  31331. "adcs r5, r5, r7\n\t"
  31332. "mov r3, #0\n\t"
  31333. "adc r3, r3, #0\n\t"
  31334. #endif
  31335. "str r4, [%[r]], #4\n\t"
  31336. /* A[80] * B */
  31337. "ldr r8, [%[a]], #4\n\t"
  31338. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31339. "lsl r6, %[b], #16\n\t"
  31340. "lsl r7, r8, #16\n\t"
  31341. "lsr r6, r6, #16\n\t"
  31342. "lsr r7, r7, #16\n\t"
  31343. "mul r7, r6, r7\n\t"
  31344. "adds r5, r5, r7\n\t"
  31345. "adcs r3, r3, #0\n\t"
  31346. "mov r4, #0\n\t"
  31347. "adc r4, r4, #0\n\t"
  31348. "lsr r7, r8, #16\n\t"
  31349. "mul r6, r7, r6\n\t"
  31350. "lsr r7, r6, #16\n\t"
  31351. "lsl r6, r6, #16\n\t"
  31352. "adds r5, r5, r6\n\t"
  31353. "adcs r3, r3, r7\n\t"
  31354. "adc r4, r4, #0\n\t"
  31355. "lsr r6, %[b], #16\n\t"
  31356. "lsr r7, r8, #16\n\t"
  31357. "mul r7, r6, r7\n\t"
  31358. "adds r3, r3, r7\n\t"
  31359. "adc r4, r4, #0\n\t"
  31360. "lsl r7, r8, #16\n\t"
  31361. "lsr r7, r7, #16\n\t"
  31362. "mul r6, r7, r6\n\t"
  31363. "lsr r7, r6, #16\n\t"
  31364. "lsl r6, r6, #16\n\t"
  31365. "adds r5, r5, r6\n\t"
  31366. "adcs r3, r3, r7\n\t"
  31367. "adc r4, r4, #0\n\t"
  31368. #else
  31369. "umull r6, r7, %[b], r8\n\t"
  31370. "adds r5, r5, r6\n\t"
  31371. "adcs r3, r3, r7\n\t"
  31372. "mov r4, #0\n\t"
  31373. "adc r4, r4, #0\n\t"
  31374. #endif
  31375. "str r5, [%[r]], #4\n\t"
  31376. /* A[81] * B */
  31377. "ldr r8, [%[a]], #4\n\t"
  31378. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31379. "lsl r6, %[b], #16\n\t"
  31380. "lsl r7, r8, #16\n\t"
  31381. "lsr r6, r6, #16\n\t"
  31382. "lsr r7, r7, #16\n\t"
  31383. "mul r7, r6, r7\n\t"
  31384. "adds r3, r3, r7\n\t"
  31385. "adcs r4, r4, #0\n\t"
  31386. "mov r5, #0\n\t"
  31387. "adc r5, r5, #0\n\t"
  31388. "lsr r7, r8, #16\n\t"
  31389. "mul r6, r7, r6\n\t"
  31390. "lsr r7, r6, #16\n\t"
  31391. "lsl r6, r6, #16\n\t"
  31392. "adds r3, r3, r6\n\t"
  31393. "adcs r4, r4, r7\n\t"
  31394. "adc r5, r5, #0\n\t"
  31395. "lsr r6, %[b], #16\n\t"
  31396. "lsr r7, r8, #16\n\t"
  31397. "mul r7, r6, r7\n\t"
  31398. "adds r4, r4, r7\n\t"
  31399. "adc r5, r5, #0\n\t"
  31400. "lsl r7, r8, #16\n\t"
  31401. "lsr r7, r7, #16\n\t"
  31402. "mul r6, r7, r6\n\t"
  31403. "lsr r7, r6, #16\n\t"
  31404. "lsl r6, r6, #16\n\t"
  31405. "adds r3, r3, r6\n\t"
  31406. "adcs r4, r4, r7\n\t"
  31407. "adc r5, r5, #0\n\t"
  31408. #else
  31409. "umull r6, r7, %[b], r8\n\t"
  31410. "adds r3, r3, r6\n\t"
  31411. "adcs r4, r4, r7\n\t"
  31412. "mov r5, #0\n\t"
  31413. "adc r5, r5, #0\n\t"
  31414. #endif
  31415. "str r3, [%[r]], #4\n\t"
  31416. /* A[82] * B */
  31417. "ldr r8, [%[a]], #4\n\t"
  31418. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31419. "lsl r6, %[b], #16\n\t"
  31420. "lsl r7, r8, #16\n\t"
  31421. "lsr r6, r6, #16\n\t"
  31422. "lsr r7, r7, #16\n\t"
  31423. "mul r7, r6, r7\n\t"
  31424. "adds r4, r4, r7\n\t"
  31425. "adcs r5, r5, #0\n\t"
  31426. "mov r3, #0\n\t"
  31427. "adc r3, r3, #0\n\t"
  31428. "lsr r7, r8, #16\n\t"
  31429. "mul r6, r7, r6\n\t"
  31430. "lsr r7, r6, #16\n\t"
  31431. "lsl r6, r6, #16\n\t"
  31432. "adds r4, r4, r6\n\t"
  31433. "adcs r5, r5, r7\n\t"
  31434. "adc r3, r3, #0\n\t"
  31435. "lsr r6, %[b], #16\n\t"
  31436. "lsr r7, r8, #16\n\t"
  31437. "mul r7, r6, r7\n\t"
  31438. "adds r5, r5, r7\n\t"
  31439. "adc r3, r3, #0\n\t"
  31440. "lsl r7, r8, #16\n\t"
  31441. "lsr r7, r7, #16\n\t"
  31442. "mul r6, r7, r6\n\t"
  31443. "lsr r7, r6, #16\n\t"
  31444. "lsl r6, r6, #16\n\t"
  31445. "adds r4, r4, r6\n\t"
  31446. "adcs r5, r5, r7\n\t"
  31447. "adc r3, r3, #0\n\t"
  31448. #else
  31449. "umull r6, r7, %[b], r8\n\t"
  31450. "adds r4, r4, r6\n\t"
  31451. "adcs r5, r5, r7\n\t"
  31452. "mov r3, #0\n\t"
  31453. "adc r3, r3, #0\n\t"
  31454. #endif
  31455. "str r4, [%[r]], #4\n\t"
  31456. /* A[83] * B */
  31457. "ldr r8, [%[a]], #4\n\t"
  31458. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31459. "lsl r6, %[b], #16\n\t"
  31460. "lsl r7, r8, #16\n\t"
  31461. "lsr r6, r6, #16\n\t"
  31462. "lsr r7, r7, #16\n\t"
  31463. "mul r7, r6, r7\n\t"
  31464. "adds r5, r5, r7\n\t"
  31465. "adcs r3, r3, #0\n\t"
  31466. "mov r4, #0\n\t"
  31467. "adc r4, r4, #0\n\t"
  31468. "lsr r7, r8, #16\n\t"
  31469. "mul r6, r7, r6\n\t"
  31470. "lsr r7, r6, #16\n\t"
  31471. "lsl r6, r6, #16\n\t"
  31472. "adds r5, r5, r6\n\t"
  31473. "adcs r3, r3, r7\n\t"
  31474. "adc r4, r4, #0\n\t"
  31475. "lsr r6, %[b], #16\n\t"
  31476. "lsr r7, r8, #16\n\t"
  31477. "mul r7, r6, r7\n\t"
  31478. "adds r3, r3, r7\n\t"
  31479. "adc r4, r4, #0\n\t"
  31480. "lsl r7, r8, #16\n\t"
  31481. "lsr r7, r7, #16\n\t"
  31482. "mul r6, r7, r6\n\t"
  31483. "lsr r7, r6, #16\n\t"
  31484. "lsl r6, r6, #16\n\t"
  31485. "adds r5, r5, r6\n\t"
  31486. "adcs r3, r3, r7\n\t"
  31487. "adc r4, r4, #0\n\t"
  31488. #else
  31489. "umull r6, r7, %[b], r8\n\t"
  31490. "adds r5, r5, r6\n\t"
  31491. "adcs r3, r3, r7\n\t"
  31492. "mov r4, #0\n\t"
  31493. "adc r4, r4, #0\n\t"
  31494. #endif
  31495. "str r5, [%[r]], #4\n\t"
  31496. /* A[84] * B */
  31497. "ldr r8, [%[a]], #4\n\t"
  31498. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31499. "lsl r6, %[b], #16\n\t"
  31500. "lsl r7, r8, #16\n\t"
  31501. "lsr r6, r6, #16\n\t"
  31502. "lsr r7, r7, #16\n\t"
  31503. "mul r7, r6, r7\n\t"
  31504. "adds r3, r3, r7\n\t"
  31505. "adcs r4, r4, #0\n\t"
  31506. "mov r5, #0\n\t"
  31507. "adc r5, r5, #0\n\t"
  31508. "lsr r7, r8, #16\n\t"
  31509. "mul r6, r7, r6\n\t"
  31510. "lsr r7, r6, #16\n\t"
  31511. "lsl r6, r6, #16\n\t"
  31512. "adds r3, r3, r6\n\t"
  31513. "adcs r4, r4, r7\n\t"
  31514. "adc r5, r5, #0\n\t"
  31515. "lsr r6, %[b], #16\n\t"
  31516. "lsr r7, r8, #16\n\t"
  31517. "mul r7, r6, r7\n\t"
  31518. "adds r4, r4, r7\n\t"
  31519. "adc r5, r5, #0\n\t"
  31520. "lsl r7, r8, #16\n\t"
  31521. "lsr r7, r7, #16\n\t"
  31522. "mul r6, r7, r6\n\t"
  31523. "lsr r7, r6, #16\n\t"
  31524. "lsl r6, r6, #16\n\t"
  31525. "adds r3, r3, r6\n\t"
  31526. "adcs r4, r4, r7\n\t"
  31527. "adc r5, r5, #0\n\t"
  31528. #else
  31529. "umull r6, r7, %[b], r8\n\t"
  31530. "adds r3, r3, r6\n\t"
  31531. "adcs r4, r4, r7\n\t"
  31532. "mov r5, #0\n\t"
  31533. "adc r5, r5, #0\n\t"
  31534. #endif
  31535. "str r3, [%[r]], #4\n\t"
  31536. /* A[85] * B */
  31537. "ldr r8, [%[a]], #4\n\t"
  31538. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31539. "lsl r6, %[b], #16\n\t"
  31540. "lsl r7, r8, #16\n\t"
  31541. "lsr r6, r6, #16\n\t"
  31542. "lsr r7, r7, #16\n\t"
  31543. "mul r7, r6, r7\n\t"
  31544. "adds r4, r4, r7\n\t"
  31545. "adcs r5, r5, #0\n\t"
  31546. "mov r3, #0\n\t"
  31547. "adc r3, r3, #0\n\t"
  31548. "lsr r7, r8, #16\n\t"
  31549. "mul r6, r7, r6\n\t"
  31550. "lsr r7, r6, #16\n\t"
  31551. "lsl r6, r6, #16\n\t"
  31552. "adds r4, r4, r6\n\t"
  31553. "adcs r5, r5, r7\n\t"
  31554. "adc r3, r3, #0\n\t"
  31555. "lsr r6, %[b], #16\n\t"
  31556. "lsr r7, r8, #16\n\t"
  31557. "mul r7, r6, r7\n\t"
  31558. "adds r5, r5, r7\n\t"
  31559. "adc r3, r3, #0\n\t"
  31560. "lsl r7, r8, #16\n\t"
  31561. "lsr r7, r7, #16\n\t"
  31562. "mul r6, r7, r6\n\t"
  31563. "lsr r7, r6, #16\n\t"
  31564. "lsl r6, r6, #16\n\t"
  31565. "adds r4, r4, r6\n\t"
  31566. "adcs r5, r5, r7\n\t"
  31567. "adc r3, r3, #0\n\t"
  31568. #else
  31569. "umull r6, r7, %[b], r8\n\t"
  31570. "adds r4, r4, r6\n\t"
  31571. "adcs r5, r5, r7\n\t"
  31572. "mov r3, #0\n\t"
  31573. "adc r3, r3, #0\n\t"
  31574. #endif
  31575. "str r4, [%[r]], #4\n\t"
  31576. /* A[86] * B */
  31577. "ldr r8, [%[a]], #4\n\t"
  31578. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31579. "lsl r6, %[b], #16\n\t"
  31580. "lsl r7, r8, #16\n\t"
  31581. "lsr r6, r6, #16\n\t"
  31582. "lsr r7, r7, #16\n\t"
  31583. "mul r7, r6, r7\n\t"
  31584. "adds r5, r5, r7\n\t"
  31585. "adcs r3, r3, #0\n\t"
  31586. "mov r4, #0\n\t"
  31587. "adc r4, r4, #0\n\t"
  31588. "lsr r7, r8, #16\n\t"
  31589. "mul r6, r7, r6\n\t"
  31590. "lsr r7, r6, #16\n\t"
  31591. "lsl r6, r6, #16\n\t"
  31592. "adds r5, r5, r6\n\t"
  31593. "adcs r3, r3, r7\n\t"
  31594. "adc r4, r4, #0\n\t"
  31595. "lsr r6, %[b], #16\n\t"
  31596. "lsr r7, r8, #16\n\t"
  31597. "mul r7, r6, r7\n\t"
  31598. "adds r3, r3, r7\n\t"
  31599. "adc r4, r4, #0\n\t"
  31600. "lsl r7, r8, #16\n\t"
  31601. "lsr r7, r7, #16\n\t"
  31602. "mul r6, r7, r6\n\t"
  31603. "lsr r7, r6, #16\n\t"
  31604. "lsl r6, r6, #16\n\t"
  31605. "adds r5, r5, r6\n\t"
  31606. "adcs r3, r3, r7\n\t"
  31607. "adc r4, r4, #0\n\t"
  31608. #else
  31609. "umull r6, r7, %[b], r8\n\t"
  31610. "adds r5, r5, r6\n\t"
  31611. "adcs r3, r3, r7\n\t"
  31612. "mov r4, #0\n\t"
  31613. "adc r4, r4, #0\n\t"
  31614. #endif
  31615. "str r5, [%[r]], #4\n\t"
  31616. /* A[87] * B */
  31617. "ldr r8, [%[a]], #4\n\t"
  31618. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31619. "lsl r6, %[b], #16\n\t"
  31620. "lsl r7, r8, #16\n\t"
  31621. "lsr r6, r6, #16\n\t"
  31622. "lsr r7, r7, #16\n\t"
  31623. "mul r7, r6, r7\n\t"
  31624. "adds r3, r3, r7\n\t"
  31625. "adcs r4, r4, #0\n\t"
  31626. "mov r5, #0\n\t"
  31627. "adc r5, r5, #0\n\t"
  31628. "lsr r7, r8, #16\n\t"
  31629. "mul r6, r7, r6\n\t"
  31630. "lsr r7, r6, #16\n\t"
  31631. "lsl r6, r6, #16\n\t"
  31632. "adds r3, r3, r6\n\t"
  31633. "adcs r4, r4, r7\n\t"
  31634. "adc r5, r5, #0\n\t"
  31635. "lsr r6, %[b], #16\n\t"
  31636. "lsr r7, r8, #16\n\t"
  31637. "mul r7, r6, r7\n\t"
  31638. "adds r4, r4, r7\n\t"
  31639. "adc r5, r5, #0\n\t"
  31640. "lsl r7, r8, #16\n\t"
  31641. "lsr r7, r7, #16\n\t"
  31642. "mul r6, r7, r6\n\t"
  31643. "lsr r7, r6, #16\n\t"
  31644. "lsl r6, r6, #16\n\t"
  31645. "adds r3, r3, r6\n\t"
  31646. "adcs r4, r4, r7\n\t"
  31647. "adc r5, r5, #0\n\t"
  31648. #else
  31649. "umull r6, r7, %[b], r8\n\t"
  31650. "adds r3, r3, r6\n\t"
  31651. "adcs r4, r4, r7\n\t"
  31652. "mov r5, #0\n\t"
  31653. "adc r5, r5, #0\n\t"
  31654. #endif
  31655. "str r3, [%[r]], #4\n\t"
  31656. /* A[88] * B */
  31657. "ldr r8, [%[a]], #4\n\t"
  31658. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31659. "lsl r6, %[b], #16\n\t"
  31660. "lsl r7, r8, #16\n\t"
  31661. "lsr r6, r6, #16\n\t"
  31662. "lsr r7, r7, #16\n\t"
  31663. "mul r7, r6, r7\n\t"
  31664. "adds r4, r4, r7\n\t"
  31665. "adcs r5, r5, #0\n\t"
  31666. "mov r3, #0\n\t"
  31667. "adc r3, r3, #0\n\t"
  31668. "lsr r7, r8, #16\n\t"
  31669. "mul r6, r7, r6\n\t"
  31670. "lsr r7, r6, #16\n\t"
  31671. "lsl r6, r6, #16\n\t"
  31672. "adds r4, r4, r6\n\t"
  31673. "adcs r5, r5, r7\n\t"
  31674. "adc r3, r3, #0\n\t"
  31675. "lsr r6, %[b], #16\n\t"
  31676. "lsr r7, r8, #16\n\t"
  31677. "mul r7, r6, r7\n\t"
  31678. "adds r5, r5, r7\n\t"
  31679. "adc r3, r3, #0\n\t"
  31680. "lsl r7, r8, #16\n\t"
  31681. "lsr r7, r7, #16\n\t"
  31682. "mul r6, r7, r6\n\t"
  31683. "lsr r7, r6, #16\n\t"
  31684. "lsl r6, r6, #16\n\t"
  31685. "adds r4, r4, r6\n\t"
  31686. "adcs r5, r5, r7\n\t"
  31687. "adc r3, r3, #0\n\t"
  31688. #else
  31689. "umull r6, r7, %[b], r8\n\t"
  31690. "adds r4, r4, r6\n\t"
  31691. "adcs r5, r5, r7\n\t"
  31692. "mov r3, #0\n\t"
  31693. "adc r3, r3, #0\n\t"
  31694. #endif
  31695. "str r4, [%[r]], #4\n\t"
  31696. /* A[89] * B */
  31697. "ldr r8, [%[a]], #4\n\t"
  31698. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31699. "lsl r6, %[b], #16\n\t"
  31700. "lsl r7, r8, #16\n\t"
  31701. "lsr r6, r6, #16\n\t"
  31702. "lsr r7, r7, #16\n\t"
  31703. "mul r7, r6, r7\n\t"
  31704. "adds r5, r5, r7\n\t"
  31705. "adcs r3, r3, #0\n\t"
  31706. "mov r4, #0\n\t"
  31707. "adc r4, r4, #0\n\t"
  31708. "lsr r7, r8, #16\n\t"
  31709. "mul r6, r7, r6\n\t"
  31710. "lsr r7, r6, #16\n\t"
  31711. "lsl r6, r6, #16\n\t"
  31712. "adds r5, r5, r6\n\t"
  31713. "adcs r3, r3, r7\n\t"
  31714. "adc r4, r4, #0\n\t"
  31715. "lsr r6, %[b], #16\n\t"
  31716. "lsr r7, r8, #16\n\t"
  31717. "mul r7, r6, r7\n\t"
  31718. "adds r3, r3, r7\n\t"
  31719. "adc r4, r4, #0\n\t"
  31720. "lsl r7, r8, #16\n\t"
  31721. "lsr r7, r7, #16\n\t"
  31722. "mul r6, r7, r6\n\t"
  31723. "lsr r7, r6, #16\n\t"
  31724. "lsl r6, r6, #16\n\t"
  31725. "adds r5, r5, r6\n\t"
  31726. "adcs r3, r3, r7\n\t"
  31727. "adc r4, r4, #0\n\t"
  31728. #else
  31729. "umull r6, r7, %[b], r8\n\t"
  31730. "adds r5, r5, r6\n\t"
  31731. "adcs r3, r3, r7\n\t"
  31732. "mov r4, #0\n\t"
  31733. "adc r4, r4, #0\n\t"
  31734. #endif
  31735. "str r5, [%[r]], #4\n\t"
  31736. /* A[90] * B */
  31737. "ldr r8, [%[a]], #4\n\t"
  31738. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31739. "lsl r6, %[b], #16\n\t"
  31740. "lsl r7, r8, #16\n\t"
  31741. "lsr r6, r6, #16\n\t"
  31742. "lsr r7, r7, #16\n\t"
  31743. "mul r7, r6, r7\n\t"
  31744. "adds r3, r3, r7\n\t"
  31745. "adcs r4, r4, #0\n\t"
  31746. "mov r5, #0\n\t"
  31747. "adc r5, r5, #0\n\t"
  31748. "lsr r7, r8, #16\n\t"
  31749. "mul r6, r7, r6\n\t"
  31750. "lsr r7, r6, #16\n\t"
  31751. "lsl r6, r6, #16\n\t"
  31752. "adds r3, r3, r6\n\t"
  31753. "adcs r4, r4, r7\n\t"
  31754. "adc r5, r5, #0\n\t"
  31755. "lsr r6, %[b], #16\n\t"
  31756. "lsr r7, r8, #16\n\t"
  31757. "mul r7, r6, r7\n\t"
  31758. "adds r4, r4, r7\n\t"
  31759. "adc r5, r5, #0\n\t"
  31760. "lsl r7, r8, #16\n\t"
  31761. "lsr r7, r7, #16\n\t"
  31762. "mul r6, r7, r6\n\t"
  31763. "lsr r7, r6, #16\n\t"
  31764. "lsl r6, r6, #16\n\t"
  31765. "adds r3, r3, r6\n\t"
  31766. "adcs r4, r4, r7\n\t"
  31767. "adc r5, r5, #0\n\t"
  31768. #else
  31769. "umull r6, r7, %[b], r8\n\t"
  31770. "adds r3, r3, r6\n\t"
  31771. "adcs r4, r4, r7\n\t"
  31772. "mov r5, #0\n\t"
  31773. "adc r5, r5, #0\n\t"
  31774. #endif
  31775. "str r3, [%[r]], #4\n\t"
  31776. /* A[91] * B */
  31777. "ldr r8, [%[a]], #4\n\t"
  31778. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31779. "lsl r6, %[b], #16\n\t"
  31780. "lsl r7, r8, #16\n\t"
  31781. "lsr r6, r6, #16\n\t"
  31782. "lsr r7, r7, #16\n\t"
  31783. "mul r7, r6, r7\n\t"
  31784. "adds r4, r4, r7\n\t"
  31785. "adcs r5, r5, #0\n\t"
  31786. "mov r3, #0\n\t"
  31787. "adc r3, r3, #0\n\t"
  31788. "lsr r7, r8, #16\n\t"
  31789. "mul r6, r7, r6\n\t"
  31790. "lsr r7, r6, #16\n\t"
  31791. "lsl r6, r6, #16\n\t"
  31792. "adds r4, r4, r6\n\t"
  31793. "adcs r5, r5, r7\n\t"
  31794. "adc r3, r3, #0\n\t"
  31795. "lsr r6, %[b], #16\n\t"
  31796. "lsr r7, r8, #16\n\t"
  31797. "mul r7, r6, r7\n\t"
  31798. "adds r5, r5, r7\n\t"
  31799. "adc r3, r3, #0\n\t"
  31800. "lsl r7, r8, #16\n\t"
  31801. "lsr r7, r7, #16\n\t"
  31802. "mul r6, r7, r6\n\t"
  31803. "lsr r7, r6, #16\n\t"
  31804. "lsl r6, r6, #16\n\t"
  31805. "adds r4, r4, r6\n\t"
  31806. "adcs r5, r5, r7\n\t"
  31807. "adc r3, r3, #0\n\t"
  31808. #else
  31809. "umull r6, r7, %[b], r8\n\t"
  31810. "adds r4, r4, r6\n\t"
  31811. "adcs r5, r5, r7\n\t"
  31812. "mov r3, #0\n\t"
  31813. "adc r3, r3, #0\n\t"
  31814. #endif
  31815. "str r4, [%[r]], #4\n\t"
  31816. /* A[92] * B */
  31817. "ldr r8, [%[a]], #4\n\t"
  31818. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31819. "lsl r6, %[b], #16\n\t"
  31820. "lsl r7, r8, #16\n\t"
  31821. "lsr r6, r6, #16\n\t"
  31822. "lsr r7, r7, #16\n\t"
  31823. "mul r7, r6, r7\n\t"
  31824. "adds r5, r5, r7\n\t"
  31825. "adcs r3, r3, #0\n\t"
  31826. "mov r4, #0\n\t"
  31827. "adc r4, r4, #0\n\t"
  31828. "lsr r7, r8, #16\n\t"
  31829. "mul r6, r7, r6\n\t"
  31830. "lsr r7, r6, #16\n\t"
  31831. "lsl r6, r6, #16\n\t"
  31832. "adds r5, r5, r6\n\t"
  31833. "adcs r3, r3, r7\n\t"
  31834. "adc r4, r4, #0\n\t"
  31835. "lsr r6, %[b], #16\n\t"
  31836. "lsr r7, r8, #16\n\t"
  31837. "mul r7, r6, r7\n\t"
  31838. "adds r3, r3, r7\n\t"
  31839. "adc r4, r4, #0\n\t"
  31840. "lsl r7, r8, #16\n\t"
  31841. "lsr r7, r7, #16\n\t"
  31842. "mul r6, r7, r6\n\t"
  31843. "lsr r7, r6, #16\n\t"
  31844. "lsl r6, r6, #16\n\t"
  31845. "adds r5, r5, r6\n\t"
  31846. "adcs r3, r3, r7\n\t"
  31847. "adc r4, r4, #0\n\t"
  31848. #else
  31849. "umull r6, r7, %[b], r8\n\t"
  31850. "adds r5, r5, r6\n\t"
  31851. "adcs r3, r3, r7\n\t"
  31852. "mov r4, #0\n\t"
  31853. "adc r4, r4, #0\n\t"
  31854. #endif
  31855. "str r5, [%[r]], #4\n\t"
  31856. /* A[93] * B */
  31857. "ldr r8, [%[a]], #4\n\t"
  31858. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31859. "lsl r6, %[b], #16\n\t"
  31860. "lsl r7, r8, #16\n\t"
  31861. "lsr r6, r6, #16\n\t"
  31862. "lsr r7, r7, #16\n\t"
  31863. "mul r7, r6, r7\n\t"
  31864. "adds r3, r3, r7\n\t"
  31865. "adcs r4, r4, #0\n\t"
  31866. "mov r5, #0\n\t"
  31867. "adc r5, r5, #0\n\t"
  31868. "lsr r7, r8, #16\n\t"
  31869. "mul r6, r7, r6\n\t"
  31870. "lsr r7, r6, #16\n\t"
  31871. "lsl r6, r6, #16\n\t"
  31872. "adds r3, r3, r6\n\t"
  31873. "adcs r4, r4, r7\n\t"
  31874. "adc r5, r5, #0\n\t"
  31875. "lsr r6, %[b], #16\n\t"
  31876. "lsr r7, r8, #16\n\t"
  31877. "mul r7, r6, r7\n\t"
  31878. "adds r4, r4, r7\n\t"
  31879. "adc r5, r5, #0\n\t"
  31880. "lsl r7, r8, #16\n\t"
  31881. "lsr r7, r7, #16\n\t"
  31882. "mul r6, r7, r6\n\t"
  31883. "lsr r7, r6, #16\n\t"
  31884. "lsl r6, r6, #16\n\t"
  31885. "adds r3, r3, r6\n\t"
  31886. "adcs r4, r4, r7\n\t"
  31887. "adc r5, r5, #0\n\t"
  31888. #else
  31889. "umull r6, r7, %[b], r8\n\t"
  31890. "adds r3, r3, r6\n\t"
  31891. "adcs r4, r4, r7\n\t"
  31892. "mov r5, #0\n\t"
  31893. "adc r5, r5, #0\n\t"
  31894. #endif
  31895. "str r3, [%[r]], #4\n\t"
  31896. /* A[94] * B */
  31897. "ldr r8, [%[a]], #4\n\t"
  31898. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31899. "lsl r6, %[b], #16\n\t"
  31900. "lsl r7, r8, #16\n\t"
  31901. "lsr r6, r6, #16\n\t"
  31902. "lsr r7, r7, #16\n\t"
  31903. "mul r7, r6, r7\n\t"
  31904. "adds r4, r4, r7\n\t"
  31905. "adcs r5, r5, #0\n\t"
  31906. "mov r3, #0\n\t"
  31907. "adc r3, r3, #0\n\t"
  31908. "lsr r7, r8, #16\n\t"
  31909. "mul r6, r7, r6\n\t"
  31910. "lsr r7, r6, #16\n\t"
  31911. "lsl r6, r6, #16\n\t"
  31912. "adds r4, r4, r6\n\t"
  31913. "adcs r5, r5, r7\n\t"
  31914. "adc r3, r3, #0\n\t"
  31915. "lsr r6, %[b], #16\n\t"
  31916. "lsr r7, r8, #16\n\t"
  31917. "mul r7, r6, r7\n\t"
  31918. "adds r5, r5, r7\n\t"
  31919. "adc r3, r3, #0\n\t"
  31920. "lsl r7, r8, #16\n\t"
  31921. "lsr r7, r7, #16\n\t"
  31922. "mul r6, r7, r6\n\t"
  31923. "lsr r7, r6, #16\n\t"
  31924. "lsl r6, r6, #16\n\t"
  31925. "adds r4, r4, r6\n\t"
  31926. "adcs r5, r5, r7\n\t"
  31927. "adc r3, r3, #0\n\t"
  31928. #else
  31929. "umull r6, r7, %[b], r8\n\t"
  31930. "adds r4, r4, r6\n\t"
  31931. "adcs r5, r5, r7\n\t"
  31932. "mov r3, #0\n\t"
  31933. "adc r3, r3, #0\n\t"
  31934. #endif
  31935. "str r4, [%[r]], #4\n\t"
  31936. /* A[95] * B */
  31937. "ldr r8, [%[a]], #4\n\t"
  31938. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  31939. "lsl r6, %[b], #16\n\t"
  31940. "lsl r7, r8, #16\n\t"
  31941. "lsr r6, r6, #16\n\t"
  31942. "lsr r7, r7, #16\n\t"
  31943. "mul r7, r6, r7\n\t"
  31944. "adds r5, r5, r7\n\t"
  31945. "adc r3, r3, #0\n\t"
  31946. "lsr r7, r8, #16\n\t"
  31947. "mul r6, r7, r6\n\t"
  31948. "lsr r7, r6, #16\n\t"
  31949. "lsl r6, r6, #16\n\t"
  31950. "adds r5, r5, r6\n\t"
  31951. "adc r3, r3, r7\n\t"
  31952. "lsr r6, %[b], #16\n\t"
  31953. "lsr r7, r8, #16\n\t"
  31954. "mul r7, r6, r7\n\t"
  31955. "add r3, r3, r7\n\t"
  31956. "lsl r7, r8, #16\n\t"
  31957. "lsr r7, r7, #16\n\t"
  31958. "mul r6, r7, r6\n\t"
  31959. "lsr r7, r6, #16\n\t"
  31960. "lsl r6, r6, #16\n\t"
  31961. "adds r5, r5, r6\n\t"
  31962. "adc r3, r3, r7\n\t"
  31963. #else
  31964. "umull r6, r7, %[b], r8\n\t"
  31965. "adds r5, r5, r6\n\t"
  31966. "adc r3, r3, r7\n\t"
  31967. #endif
  31968. "str r5, [%[r]], #4\n\t"
  31969. "str r3, [%[r]]\n\t"
  31970. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  31971. :
  31972. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10"
  31973. );
  31974. }
  31975. #endif /* WOLFSSL_SP_SMALL */
  31976. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  31977. /* r = 2^n mod m where n is the number of bits to reduce by.
  31978. * Given m must be 3072 bits, just need to subtract.
  31979. *
  31980. * r A single precision number.
  31981. * m A single precision number.
  31982. */
  31983. static void sp_3072_mont_norm_48(sp_digit* r, const sp_digit* m)
  31984. {
  31985. XMEMSET(r, 0, sizeof(sp_digit) * 48);
  31986. /* r = 2^n mod m */
  31987. sp_3072_sub_in_place_48(r, m);
  31988. }
  31989. #ifdef WOLFSSL_SP_SMALL
  31990. /* Conditionally subtract b from a using the mask m.
  31991. * m is -1 to subtract and 0 when not copying.
  31992. *
  31993. * r A single precision number representing condition subtract result.
  31994. * a A single precision number to subtract from.
  31995. * b A single precision number to subtract.
  31996. * m Mask value to apply.
  31997. */
  31998. static sp_digit sp_3072_cond_sub_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  31999. {
  32000. register sp_digit* r asm ("r0") = r_p;
  32001. register const sp_digit* a asm ("r1") = a_p;
  32002. register const sp_digit* b asm ("r2") = b_p;
  32003. register sp_digit m asm ("r3") = m_p;
  32004. __asm__ __volatile__ (
  32005. "mov r6, #0\n\t"
  32006. "mov r12, #0\n\t"
  32007. "mov lr, #0\n\t"
  32008. "\n"
  32009. "L_sp_3072_cond_sub_48_words_%=: \n\t"
  32010. "subs r12, r6, r12\n\t"
  32011. "ldr r4, [%[a], lr]\n\t"
  32012. "ldr r5, [%[b], lr]\n\t"
  32013. "and r5, r5, %[m]\n\t"
  32014. "sbcs r4, r4, r5\n\t"
  32015. "sbc r12, r6, r6\n\t"
  32016. "str r4, [%[r], lr]\n\t"
  32017. "add lr, lr, #4\n\t"
  32018. "cmp lr, #0xc0\n\t"
  32019. "blt L_sp_3072_cond_sub_48_words_%=\n\t"
  32020. "mov %[r], r12\n\t"
  32021. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  32022. :
  32023. : "memory", "r12", "lr", "r4", "r5", "r6"
  32024. );
  32025. return (uint32_t)(size_t)r;
  32026. }
  32027. #else
  32028. /* Conditionally subtract b from a using the mask m.
  32029. * m is -1 to subtract and 0 when not copying.
  32030. *
  32031. * r A single precision number representing condition subtract result.
  32032. * a A single precision number to subtract from.
  32033. * b A single precision number to subtract.
  32034. * m Mask value to apply.
  32035. */
  32036. static sp_digit sp_3072_cond_sub_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  32037. {
  32038. register sp_digit* r asm ("r0") = r_p;
  32039. register const sp_digit* a asm ("r1") = a_p;
  32040. register const sp_digit* b asm ("r2") = b_p;
  32041. register sp_digit m asm ("r3") = m_p;
  32042. __asm__ __volatile__ (
  32043. "mov lr, #0\n\t"
  32044. "ldm %[a]!, {r4, r5}\n\t"
  32045. "ldm %[b]!, {r6, r7}\n\t"
  32046. "and r6, r6, %[m]\n\t"
  32047. "and r7, r7, %[m]\n\t"
  32048. "subs r4, r4, r6\n\t"
  32049. "sbcs r5, r5, r7\n\t"
  32050. "stm %[r]!, {r4, r5}\n\t"
  32051. "ldm %[a]!, {r4, r5}\n\t"
  32052. "ldm %[b]!, {r6, r7}\n\t"
  32053. "and r6, r6, %[m]\n\t"
  32054. "and r7, r7, %[m]\n\t"
  32055. "sbcs r4, r4, r6\n\t"
  32056. "sbcs r5, r5, r7\n\t"
  32057. "stm %[r]!, {r4, r5}\n\t"
  32058. "ldm %[a]!, {r4, r5}\n\t"
  32059. "ldm %[b]!, {r6, r7}\n\t"
  32060. "and r6, r6, %[m]\n\t"
  32061. "and r7, r7, %[m]\n\t"
  32062. "sbcs r4, r4, r6\n\t"
  32063. "sbcs r5, r5, r7\n\t"
  32064. "stm %[r]!, {r4, r5}\n\t"
  32065. "ldm %[a]!, {r4, r5}\n\t"
  32066. "ldm %[b]!, {r6, r7}\n\t"
  32067. "and r6, r6, %[m]\n\t"
  32068. "and r7, r7, %[m]\n\t"
  32069. "sbcs r4, r4, r6\n\t"
  32070. "sbcs r5, r5, r7\n\t"
  32071. "stm %[r]!, {r4, r5}\n\t"
  32072. "ldm %[a]!, {r4, r5}\n\t"
  32073. "ldm %[b]!, {r6, r7}\n\t"
  32074. "and r6, r6, %[m]\n\t"
  32075. "and r7, r7, %[m]\n\t"
  32076. "sbcs r4, r4, r6\n\t"
  32077. "sbcs r5, r5, r7\n\t"
  32078. "stm %[r]!, {r4, r5}\n\t"
  32079. "ldm %[a]!, {r4, r5}\n\t"
  32080. "ldm %[b]!, {r6, r7}\n\t"
  32081. "and r6, r6, %[m]\n\t"
  32082. "and r7, r7, %[m]\n\t"
  32083. "sbcs r4, r4, r6\n\t"
  32084. "sbcs r5, r5, r7\n\t"
  32085. "stm %[r]!, {r4, r5}\n\t"
  32086. "ldm %[a]!, {r4, r5}\n\t"
  32087. "ldm %[b]!, {r6, r7}\n\t"
  32088. "and r6, r6, %[m]\n\t"
  32089. "and r7, r7, %[m]\n\t"
  32090. "sbcs r4, r4, r6\n\t"
  32091. "sbcs r5, r5, r7\n\t"
  32092. "stm %[r]!, {r4, r5}\n\t"
  32093. "ldm %[a]!, {r4, r5}\n\t"
  32094. "ldm %[b]!, {r6, r7}\n\t"
  32095. "and r6, r6, %[m]\n\t"
  32096. "and r7, r7, %[m]\n\t"
  32097. "sbcs r4, r4, r6\n\t"
  32098. "sbcs r5, r5, r7\n\t"
  32099. "stm %[r]!, {r4, r5}\n\t"
  32100. "ldm %[a]!, {r4, r5}\n\t"
  32101. "ldm %[b]!, {r6, r7}\n\t"
  32102. "and r6, r6, %[m]\n\t"
  32103. "and r7, r7, %[m]\n\t"
  32104. "sbcs r4, r4, r6\n\t"
  32105. "sbcs r5, r5, r7\n\t"
  32106. "stm %[r]!, {r4, r5}\n\t"
  32107. "ldm %[a]!, {r4, r5}\n\t"
  32108. "ldm %[b]!, {r6, r7}\n\t"
  32109. "and r6, r6, %[m]\n\t"
  32110. "and r7, r7, %[m]\n\t"
  32111. "sbcs r4, r4, r6\n\t"
  32112. "sbcs r5, r5, r7\n\t"
  32113. "stm %[r]!, {r4, r5}\n\t"
  32114. "ldm %[a]!, {r4, r5}\n\t"
  32115. "ldm %[b]!, {r6, r7}\n\t"
  32116. "and r6, r6, %[m]\n\t"
  32117. "and r7, r7, %[m]\n\t"
  32118. "sbcs r4, r4, r6\n\t"
  32119. "sbcs r5, r5, r7\n\t"
  32120. "stm %[r]!, {r4, r5}\n\t"
  32121. "ldm %[a]!, {r4, r5}\n\t"
  32122. "ldm %[b]!, {r6, r7}\n\t"
  32123. "and r6, r6, %[m]\n\t"
  32124. "and r7, r7, %[m]\n\t"
  32125. "sbcs r4, r4, r6\n\t"
  32126. "sbcs r5, r5, r7\n\t"
  32127. "stm %[r]!, {r4, r5}\n\t"
  32128. "ldm %[a]!, {r4, r5}\n\t"
  32129. "ldm %[b]!, {r6, r7}\n\t"
  32130. "and r6, r6, %[m]\n\t"
  32131. "and r7, r7, %[m]\n\t"
  32132. "sbcs r4, r4, r6\n\t"
  32133. "sbcs r5, r5, r7\n\t"
  32134. "stm %[r]!, {r4, r5}\n\t"
  32135. "ldm %[a]!, {r4, r5}\n\t"
  32136. "ldm %[b]!, {r6, r7}\n\t"
  32137. "and r6, r6, %[m]\n\t"
  32138. "and r7, r7, %[m]\n\t"
  32139. "sbcs r4, r4, r6\n\t"
  32140. "sbcs r5, r5, r7\n\t"
  32141. "stm %[r]!, {r4, r5}\n\t"
  32142. "ldm %[a]!, {r4, r5}\n\t"
  32143. "ldm %[b]!, {r6, r7}\n\t"
  32144. "and r6, r6, %[m]\n\t"
  32145. "and r7, r7, %[m]\n\t"
  32146. "sbcs r4, r4, r6\n\t"
  32147. "sbcs r5, r5, r7\n\t"
  32148. "stm %[r]!, {r4, r5}\n\t"
  32149. "ldm %[a]!, {r4, r5}\n\t"
  32150. "ldm %[b]!, {r6, r7}\n\t"
  32151. "and r6, r6, %[m]\n\t"
  32152. "and r7, r7, %[m]\n\t"
  32153. "sbcs r4, r4, r6\n\t"
  32154. "sbcs r5, r5, r7\n\t"
  32155. "stm %[r]!, {r4, r5}\n\t"
  32156. "ldm %[a]!, {r4, r5}\n\t"
  32157. "ldm %[b]!, {r6, r7}\n\t"
  32158. "and r6, r6, %[m]\n\t"
  32159. "and r7, r7, %[m]\n\t"
  32160. "sbcs r4, r4, r6\n\t"
  32161. "sbcs r5, r5, r7\n\t"
  32162. "stm %[r]!, {r4, r5}\n\t"
  32163. "ldm %[a]!, {r4, r5}\n\t"
  32164. "ldm %[b]!, {r6, r7}\n\t"
  32165. "and r6, r6, %[m]\n\t"
  32166. "and r7, r7, %[m]\n\t"
  32167. "sbcs r4, r4, r6\n\t"
  32168. "sbcs r5, r5, r7\n\t"
  32169. "stm %[r]!, {r4, r5}\n\t"
  32170. "ldm %[a]!, {r4, r5}\n\t"
  32171. "ldm %[b]!, {r6, r7}\n\t"
  32172. "and r6, r6, %[m]\n\t"
  32173. "and r7, r7, %[m]\n\t"
  32174. "sbcs r4, r4, r6\n\t"
  32175. "sbcs r5, r5, r7\n\t"
  32176. "stm %[r]!, {r4, r5}\n\t"
  32177. "ldm %[a]!, {r4, r5}\n\t"
  32178. "ldm %[b]!, {r6, r7}\n\t"
  32179. "and r6, r6, %[m]\n\t"
  32180. "and r7, r7, %[m]\n\t"
  32181. "sbcs r4, r4, r6\n\t"
  32182. "sbcs r5, r5, r7\n\t"
  32183. "stm %[r]!, {r4, r5}\n\t"
  32184. "ldm %[a]!, {r4, r5}\n\t"
  32185. "ldm %[b]!, {r6, r7}\n\t"
  32186. "and r6, r6, %[m]\n\t"
  32187. "and r7, r7, %[m]\n\t"
  32188. "sbcs r4, r4, r6\n\t"
  32189. "sbcs r5, r5, r7\n\t"
  32190. "stm %[r]!, {r4, r5}\n\t"
  32191. "ldm %[a]!, {r4, r5}\n\t"
  32192. "ldm %[b]!, {r6, r7}\n\t"
  32193. "and r6, r6, %[m]\n\t"
  32194. "and r7, r7, %[m]\n\t"
  32195. "sbcs r4, r4, r6\n\t"
  32196. "sbcs r5, r5, r7\n\t"
  32197. "stm %[r]!, {r4, r5}\n\t"
  32198. "ldm %[a]!, {r4, r5}\n\t"
  32199. "ldm %[b]!, {r6, r7}\n\t"
  32200. "and r6, r6, %[m]\n\t"
  32201. "and r7, r7, %[m]\n\t"
  32202. "sbcs r4, r4, r6\n\t"
  32203. "sbcs r5, r5, r7\n\t"
  32204. "stm %[r]!, {r4, r5}\n\t"
  32205. "ldm %[a]!, {r4, r5}\n\t"
  32206. "ldm %[b]!, {r6, r7}\n\t"
  32207. "and r6, r6, %[m]\n\t"
  32208. "and r7, r7, %[m]\n\t"
  32209. "sbcs r4, r4, r6\n\t"
  32210. "sbcs r5, r5, r7\n\t"
  32211. "stm %[r]!, {r4, r5}\n\t"
  32212. "sbc %[r], lr, lr\n\t"
  32213. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  32214. :
  32215. : "memory", "r12", "lr", "r4", "r5", "r6", "r7"
  32216. );
  32217. return (uint32_t)(size_t)r;
  32218. }
  32219. #endif /* WOLFSSL_SP_SMALL */
  32220. /* Reduce the number back to 3072 bits using Montgomery reduction.
  32221. *
  32222. * a A single precision number to reduce in place.
  32223. * m The single precision number representing the modulus.
  32224. * mp The digit representing the negative inverse of m mod 2^n.
  32225. */
  32226. static SP_NOINLINE void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  32227. {
  32228. register sp_digit* a asm ("r0") = a_p;
  32229. register const sp_digit* m asm ("r1") = m_p;
  32230. register sp_digit mp asm ("r2") = mp_p;
  32231. __asm__ __volatile__ (
  32232. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  32233. "ldr r11, [%[m]]\n\t"
  32234. #endif
  32235. /* i = 0 */
  32236. "mov r9, #0\n\t"
  32237. "mov r3, #0\n\t"
  32238. "ldr r12, [%[a]]\n\t"
  32239. "ldr lr, [%[a], #4]\n\t"
  32240. "\n"
  32241. "L_sp_3072_mont_reduce_48_word_%=: \n\t"
  32242. /* mu = a[i] * mp */
  32243. "mul r8, %[mp], r12\n\t"
  32244. /* a[i+0] += m[0] * mu */
  32245. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32246. "ldr r11, [%[m]]\n\t"
  32247. #endif
  32248. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32249. "lsr r7, r11, #16\n\t"
  32250. "lsr r6, r8, #16\n\t"
  32251. "mul r5, r6, r7\n\t"
  32252. "lsl r7, r11, #16\n\t"
  32253. "lsr r7, r7, #16\n\t"
  32254. "mul r6, r7, r6\n\t"
  32255. "lsr r7, r6, #16\n\t"
  32256. "lsl r6, r6, #16\n\t"
  32257. "adds r12, r12, r6\n\t"
  32258. "adc r5, r5, r7\n\t"
  32259. "lsl r6, r8, #16\n\t"
  32260. "lsl r7, r11, #16\n\t"
  32261. "lsr r6, r6, #16\n\t"
  32262. "lsr r7, r7, #16\n\t"
  32263. "mul r7, r6, r7\n\t"
  32264. "adds r12, r12, r7\n\t"
  32265. "adc r5, r5, #0\n\t"
  32266. "lsr r7, r11, #16\n\t"
  32267. "mul r6, r7, r6\n\t"
  32268. "lsr r7, r6, #16\n\t"
  32269. "lsl r6, r6, #16\n\t"
  32270. "adds r12, r12, r6\n\t"
  32271. "adc r5, r5, r7\n\t"
  32272. #else
  32273. "umull r6, r7, r8, r11\n\t"
  32274. "adds r12, r12, r6\n\t"
  32275. "adc r5, r7, #0\n\t"
  32276. #endif
  32277. /* a[i+1] += m[1] * mu */
  32278. "ldr r7, [%[m], #4]\n\t"
  32279. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32280. "lsr r10, r7, #16\n\t"
  32281. "lsr r6, r8, #16\n\t"
  32282. "mul r4, r6, r10\n\t"
  32283. "lsl r10, r7, #16\n\t"
  32284. "lsr r10, r10, #16\n\t"
  32285. "mul r6, r10, r6\n\t"
  32286. "lsr r10, r6, #16\n\t"
  32287. "lsl r6, r6, #16\n\t"
  32288. "adds lr, lr, r6\n\t"
  32289. "adc r4, r4, r10\n\t"
  32290. "lsl r6, r8, #16\n\t"
  32291. "lsl r10, r7, #16\n\t"
  32292. "lsr r6, r6, #16\n\t"
  32293. "lsr r10, r10, #16\n\t"
  32294. "mul r10, r6, r10\n\t"
  32295. "adds lr, lr, r10\n\t"
  32296. "adc r4, r4, #0\n\t"
  32297. "lsr r10, r7, #16\n\t"
  32298. "mul r6, r10, r6\n\t"
  32299. "lsr r10, r6, #16\n\t"
  32300. "lsl r6, r6, #16\n\t"
  32301. "adds lr, lr, r6\n\t"
  32302. "adc r4, r4, r10\n\t"
  32303. #else
  32304. "umull r6, r10, r8, r7\n\t"
  32305. "adds lr, lr, r6\n\t"
  32306. "adc r4, r10, #0\n\t"
  32307. #endif
  32308. "mov r12, lr\n\t"
  32309. "adds r12, r12, r5\n\t"
  32310. "adc r4, r4, #0\n\t"
  32311. /* a[i+2] += m[2] * mu */
  32312. "ldr r7, [%[m], #8]\n\t"
  32313. "ldr lr, [%[a], #8]\n\t"
  32314. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32315. "lsr r10, r7, #16\n\t"
  32316. "lsr r6, r8, #16\n\t"
  32317. "mul r5, r6, r10\n\t"
  32318. "lsl r10, r7, #16\n\t"
  32319. "lsr r10, r10, #16\n\t"
  32320. "mul r6, r10, r6\n\t"
  32321. "lsr r10, r6, #16\n\t"
  32322. "lsl r6, r6, #16\n\t"
  32323. "adds lr, lr, r6\n\t"
  32324. "adc r5, r5, r10\n\t"
  32325. "lsl r6, r8, #16\n\t"
  32326. "lsl r10, r7, #16\n\t"
  32327. "lsr r6, r6, #16\n\t"
  32328. "lsr r10, r10, #16\n\t"
  32329. "mul r10, r6, r10\n\t"
  32330. "adds lr, lr, r10\n\t"
  32331. "adc r5, r5, #0\n\t"
  32332. "lsr r10, r7, #16\n\t"
  32333. "mul r6, r10, r6\n\t"
  32334. "lsr r10, r6, #16\n\t"
  32335. "lsl r6, r6, #16\n\t"
  32336. "adds lr, lr, r6\n\t"
  32337. "adc r5, r5, r10\n\t"
  32338. #else
  32339. "umull r6, r10, r8, r7\n\t"
  32340. "adds lr, lr, r6\n\t"
  32341. "adc r5, r10, #0\n\t"
  32342. #endif
  32343. "adds lr, lr, r4\n\t"
  32344. "adc r5, r5, #0\n\t"
  32345. /* a[i+3] += m[3] * mu */
  32346. "ldr r7, [%[m], #12]\n\t"
  32347. "ldr r10, [%[a], #12]\n\t"
  32348. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32349. "lsr r11, r7, #16\n\t"
  32350. "lsr r6, r8, #16\n\t"
  32351. "mul r4, r6, r11\n\t"
  32352. "lsl r11, r7, #16\n\t"
  32353. "lsr r11, r11, #16\n\t"
  32354. "mul r6, r11, r6\n\t"
  32355. "lsr r11, r6, #16\n\t"
  32356. "lsl r6, r6, #16\n\t"
  32357. "adds r10, r10, r6\n\t"
  32358. "adc r4, r4, r11\n\t"
  32359. "lsl r6, r8, #16\n\t"
  32360. "lsl r11, r7, #16\n\t"
  32361. "lsr r6, r6, #16\n\t"
  32362. "lsr r11, r11, #16\n\t"
  32363. "mul r11, r6, r11\n\t"
  32364. "adds r10, r10, r11\n\t"
  32365. "adc r4, r4, #0\n\t"
  32366. "lsr r11, r7, #16\n\t"
  32367. "mul r6, r11, r6\n\t"
  32368. "lsr r11, r6, #16\n\t"
  32369. "lsl r6, r6, #16\n\t"
  32370. "adds r10, r10, r6\n\t"
  32371. "adc r4, r4, r11\n\t"
  32372. #else
  32373. "umull r6, r7, r8, r7\n\t"
  32374. "adds r10, r10, r6\n\t"
  32375. "adc r4, r7, #0\n\t"
  32376. #endif
  32377. "adds r10, r10, r5\n\t"
  32378. "str r10, [%[a], #12]\n\t"
  32379. "adc r4, r4, #0\n\t"
  32380. /* a[i+4] += m[4] * mu */
  32381. "ldr r7, [%[m], #16]\n\t"
  32382. "ldr r10, [%[a], #16]\n\t"
  32383. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32384. "lsr r11, r7, #16\n\t"
  32385. "lsr r6, r8, #16\n\t"
  32386. "mul r5, r6, r11\n\t"
  32387. "lsl r11, r7, #16\n\t"
  32388. "lsr r11, r11, #16\n\t"
  32389. "mul r6, r11, r6\n\t"
  32390. "lsr r11, r6, #16\n\t"
  32391. "lsl r6, r6, #16\n\t"
  32392. "adds r10, r10, r6\n\t"
  32393. "adc r5, r5, r11\n\t"
  32394. "lsl r6, r8, #16\n\t"
  32395. "lsl r11, r7, #16\n\t"
  32396. "lsr r6, r6, #16\n\t"
  32397. "lsr r11, r11, #16\n\t"
  32398. "mul r11, r6, r11\n\t"
  32399. "adds r10, r10, r11\n\t"
  32400. "adc r5, r5, #0\n\t"
  32401. "lsr r11, r7, #16\n\t"
  32402. "mul r6, r11, r6\n\t"
  32403. "lsr r11, r6, #16\n\t"
  32404. "lsl r6, r6, #16\n\t"
  32405. "adds r10, r10, r6\n\t"
  32406. "adc r5, r5, r11\n\t"
  32407. #else
  32408. "umull r6, r7, r8, r7\n\t"
  32409. "adds r10, r10, r6\n\t"
  32410. "adc r5, r7, #0\n\t"
  32411. #endif
  32412. "adds r10, r10, r4\n\t"
  32413. "str r10, [%[a], #16]\n\t"
  32414. "adc r5, r5, #0\n\t"
  32415. /* a[i+5] += m[5] * mu */
  32416. "ldr r7, [%[m], #20]\n\t"
  32417. "ldr r10, [%[a], #20]\n\t"
  32418. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32419. "lsr r11, r7, #16\n\t"
  32420. "lsr r6, r8, #16\n\t"
  32421. "mul r4, r6, r11\n\t"
  32422. "lsl r11, r7, #16\n\t"
  32423. "lsr r11, r11, #16\n\t"
  32424. "mul r6, r11, r6\n\t"
  32425. "lsr r11, r6, #16\n\t"
  32426. "lsl r6, r6, #16\n\t"
  32427. "adds r10, r10, r6\n\t"
  32428. "adc r4, r4, r11\n\t"
  32429. "lsl r6, r8, #16\n\t"
  32430. "lsl r11, r7, #16\n\t"
  32431. "lsr r6, r6, #16\n\t"
  32432. "lsr r11, r11, #16\n\t"
  32433. "mul r11, r6, r11\n\t"
  32434. "adds r10, r10, r11\n\t"
  32435. "adc r4, r4, #0\n\t"
  32436. "lsr r11, r7, #16\n\t"
  32437. "mul r6, r11, r6\n\t"
  32438. "lsr r11, r6, #16\n\t"
  32439. "lsl r6, r6, #16\n\t"
  32440. "adds r10, r10, r6\n\t"
  32441. "adc r4, r4, r11\n\t"
  32442. #else
  32443. "umull r6, r7, r8, r7\n\t"
  32444. "adds r10, r10, r6\n\t"
  32445. "adc r4, r7, #0\n\t"
  32446. #endif
  32447. "adds r10, r10, r5\n\t"
  32448. "str r10, [%[a], #20]\n\t"
  32449. "adc r4, r4, #0\n\t"
  32450. /* a[i+6] += m[6] * mu */
  32451. "ldr r7, [%[m], #24]\n\t"
  32452. "ldr r10, [%[a], #24]\n\t"
  32453. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32454. "lsr r11, r7, #16\n\t"
  32455. "lsr r6, r8, #16\n\t"
  32456. "mul r5, r6, r11\n\t"
  32457. "lsl r11, r7, #16\n\t"
  32458. "lsr r11, r11, #16\n\t"
  32459. "mul r6, r11, r6\n\t"
  32460. "lsr r11, r6, #16\n\t"
  32461. "lsl r6, r6, #16\n\t"
  32462. "adds r10, r10, r6\n\t"
  32463. "adc r5, r5, r11\n\t"
  32464. "lsl r6, r8, #16\n\t"
  32465. "lsl r11, r7, #16\n\t"
  32466. "lsr r6, r6, #16\n\t"
  32467. "lsr r11, r11, #16\n\t"
  32468. "mul r11, r6, r11\n\t"
  32469. "adds r10, r10, r11\n\t"
  32470. "adc r5, r5, #0\n\t"
  32471. "lsr r11, r7, #16\n\t"
  32472. "mul r6, r11, r6\n\t"
  32473. "lsr r11, r6, #16\n\t"
  32474. "lsl r6, r6, #16\n\t"
  32475. "adds r10, r10, r6\n\t"
  32476. "adc r5, r5, r11\n\t"
  32477. #else
  32478. "umull r6, r7, r8, r7\n\t"
  32479. "adds r10, r10, r6\n\t"
  32480. "adc r5, r7, #0\n\t"
  32481. #endif
  32482. "adds r10, r10, r4\n\t"
  32483. "str r10, [%[a], #24]\n\t"
  32484. "adc r5, r5, #0\n\t"
  32485. /* a[i+7] += m[7] * mu */
  32486. "ldr r7, [%[m], #28]\n\t"
  32487. "ldr r10, [%[a], #28]\n\t"
  32488. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32489. "lsr r11, r7, #16\n\t"
  32490. "lsr r6, r8, #16\n\t"
  32491. "mul r4, r6, r11\n\t"
  32492. "lsl r11, r7, #16\n\t"
  32493. "lsr r11, r11, #16\n\t"
  32494. "mul r6, r11, r6\n\t"
  32495. "lsr r11, r6, #16\n\t"
  32496. "lsl r6, r6, #16\n\t"
  32497. "adds r10, r10, r6\n\t"
  32498. "adc r4, r4, r11\n\t"
  32499. "lsl r6, r8, #16\n\t"
  32500. "lsl r11, r7, #16\n\t"
  32501. "lsr r6, r6, #16\n\t"
  32502. "lsr r11, r11, #16\n\t"
  32503. "mul r11, r6, r11\n\t"
  32504. "adds r10, r10, r11\n\t"
  32505. "adc r4, r4, #0\n\t"
  32506. "lsr r11, r7, #16\n\t"
  32507. "mul r6, r11, r6\n\t"
  32508. "lsr r11, r6, #16\n\t"
  32509. "lsl r6, r6, #16\n\t"
  32510. "adds r10, r10, r6\n\t"
  32511. "adc r4, r4, r11\n\t"
  32512. #else
  32513. "umull r6, r7, r8, r7\n\t"
  32514. "adds r10, r10, r6\n\t"
  32515. "adc r4, r7, #0\n\t"
  32516. #endif
  32517. "adds r10, r10, r5\n\t"
  32518. "str r10, [%[a], #28]\n\t"
  32519. "adc r4, r4, #0\n\t"
  32520. /* a[i+8] += m[8] * mu */
  32521. "ldr r7, [%[m], #32]\n\t"
  32522. "ldr r10, [%[a], #32]\n\t"
  32523. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32524. "lsr r11, r7, #16\n\t"
  32525. "lsr r6, r8, #16\n\t"
  32526. "mul r5, r6, r11\n\t"
  32527. "lsl r11, r7, #16\n\t"
  32528. "lsr r11, r11, #16\n\t"
  32529. "mul r6, r11, r6\n\t"
  32530. "lsr r11, r6, #16\n\t"
  32531. "lsl r6, r6, #16\n\t"
  32532. "adds r10, r10, r6\n\t"
  32533. "adc r5, r5, r11\n\t"
  32534. "lsl r6, r8, #16\n\t"
  32535. "lsl r11, r7, #16\n\t"
  32536. "lsr r6, r6, #16\n\t"
  32537. "lsr r11, r11, #16\n\t"
  32538. "mul r11, r6, r11\n\t"
  32539. "adds r10, r10, r11\n\t"
  32540. "adc r5, r5, #0\n\t"
  32541. "lsr r11, r7, #16\n\t"
  32542. "mul r6, r11, r6\n\t"
  32543. "lsr r11, r6, #16\n\t"
  32544. "lsl r6, r6, #16\n\t"
  32545. "adds r10, r10, r6\n\t"
  32546. "adc r5, r5, r11\n\t"
  32547. #else
  32548. "umull r6, r7, r8, r7\n\t"
  32549. "adds r10, r10, r6\n\t"
  32550. "adc r5, r7, #0\n\t"
  32551. #endif
  32552. "adds r10, r10, r4\n\t"
  32553. "str r10, [%[a], #32]\n\t"
  32554. "adc r5, r5, #0\n\t"
  32555. /* a[i+9] += m[9] * mu */
  32556. "ldr r7, [%[m], #36]\n\t"
  32557. "ldr r10, [%[a], #36]\n\t"
  32558. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32559. "lsr r11, r7, #16\n\t"
  32560. "lsr r6, r8, #16\n\t"
  32561. "mul r4, r6, r11\n\t"
  32562. "lsl r11, r7, #16\n\t"
  32563. "lsr r11, r11, #16\n\t"
  32564. "mul r6, r11, r6\n\t"
  32565. "lsr r11, r6, #16\n\t"
  32566. "lsl r6, r6, #16\n\t"
  32567. "adds r10, r10, r6\n\t"
  32568. "adc r4, r4, r11\n\t"
  32569. "lsl r6, r8, #16\n\t"
  32570. "lsl r11, r7, #16\n\t"
  32571. "lsr r6, r6, #16\n\t"
  32572. "lsr r11, r11, #16\n\t"
  32573. "mul r11, r6, r11\n\t"
  32574. "adds r10, r10, r11\n\t"
  32575. "adc r4, r4, #0\n\t"
  32576. "lsr r11, r7, #16\n\t"
  32577. "mul r6, r11, r6\n\t"
  32578. "lsr r11, r6, #16\n\t"
  32579. "lsl r6, r6, #16\n\t"
  32580. "adds r10, r10, r6\n\t"
  32581. "adc r4, r4, r11\n\t"
  32582. #else
  32583. "umull r6, r7, r8, r7\n\t"
  32584. "adds r10, r10, r6\n\t"
  32585. "adc r4, r7, #0\n\t"
  32586. #endif
  32587. "adds r10, r10, r5\n\t"
  32588. "str r10, [%[a], #36]\n\t"
  32589. "adc r4, r4, #0\n\t"
  32590. /* a[i+10] += m[10] * mu */
  32591. "ldr r7, [%[m], #40]\n\t"
  32592. "ldr r10, [%[a], #40]\n\t"
  32593. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32594. "lsr r11, r7, #16\n\t"
  32595. "lsr r6, r8, #16\n\t"
  32596. "mul r5, r6, r11\n\t"
  32597. "lsl r11, r7, #16\n\t"
  32598. "lsr r11, r11, #16\n\t"
  32599. "mul r6, r11, r6\n\t"
  32600. "lsr r11, r6, #16\n\t"
  32601. "lsl r6, r6, #16\n\t"
  32602. "adds r10, r10, r6\n\t"
  32603. "adc r5, r5, r11\n\t"
  32604. "lsl r6, r8, #16\n\t"
  32605. "lsl r11, r7, #16\n\t"
  32606. "lsr r6, r6, #16\n\t"
  32607. "lsr r11, r11, #16\n\t"
  32608. "mul r11, r6, r11\n\t"
  32609. "adds r10, r10, r11\n\t"
  32610. "adc r5, r5, #0\n\t"
  32611. "lsr r11, r7, #16\n\t"
  32612. "mul r6, r11, r6\n\t"
  32613. "lsr r11, r6, #16\n\t"
  32614. "lsl r6, r6, #16\n\t"
  32615. "adds r10, r10, r6\n\t"
  32616. "adc r5, r5, r11\n\t"
  32617. #else
  32618. "umull r6, r7, r8, r7\n\t"
  32619. "adds r10, r10, r6\n\t"
  32620. "adc r5, r7, #0\n\t"
  32621. #endif
  32622. "adds r10, r10, r4\n\t"
  32623. "str r10, [%[a], #40]\n\t"
  32624. "adc r5, r5, #0\n\t"
  32625. /* a[i+11] += m[11] * mu */
  32626. "ldr r7, [%[m], #44]\n\t"
  32627. "ldr r10, [%[a], #44]\n\t"
  32628. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32629. "lsr r11, r7, #16\n\t"
  32630. "lsr r6, r8, #16\n\t"
  32631. "mul r4, r6, r11\n\t"
  32632. "lsl r11, r7, #16\n\t"
  32633. "lsr r11, r11, #16\n\t"
  32634. "mul r6, r11, r6\n\t"
  32635. "lsr r11, r6, #16\n\t"
  32636. "lsl r6, r6, #16\n\t"
  32637. "adds r10, r10, r6\n\t"
  32638. "adc r4, r4, r11\n\t"
  32639. "lsl r6, r8, #16\n\t"
  32640. "lsl r11, r7, #16\n\t"
  32641. "lsr r6, r6, #16\n\t"
  32642. "lsr r11, r11, #16\n\t"
  32643. "mul r11, r6, r11\n\t"
  32644. "adds r10, r10, r11\n\t"
  32645. "adc r4, r4, #0\n\t"
  32646. "lsr r11, r7, #16\n\t"
  32647. "mul r6, r11, r6\n\t"
  32648. "lsr r11, r6, #16\n\t"
  32649. "lsl r6, r6, #16\n\t"
  32650. "adds r10, r10, r6\n\t"
  32651. "adc r4, r4, r11\n\t"
  32652. #else
  32653. "umull r6, r7, r8, r7\n\t"
  32654. "adds r10, r10, r6\n\t"
  32655. "adc r4, r7, #0\n\t"
  32656. #endif
  32657. "adds r10, r10, r5\n\t"
  32658. "str r10, [%[a], #44]\n\t"
  32659. "adc r4, r4, #0\n\t"
  32660. /* a[i+12] += m[12] * mu */
  32661. "ldr r7, [%[m], #48]\n\t"
  32662. "ldr r10, [%[a], #48]\n\t"
  32663. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32664. "lsr r11, r7, #16\n\t"
  32665. "lsr r6, r8, #16\n\t"
  32666. "mul r5, r6, r11\n\t"
  32667. "lsl r11, r7, #16\n\t"
  32668. "lsr r11, r11, #16\n\t"
  32669. "mul r6, r11, r6\n\t"
  32670. "lsr r11, r6, #16\n\t"
  32671. "lsl r6, r6, #16\n\t"
  32672. "adds r10, r10, r6\n\t"
  32673. "adc r5, r5, r11\n\t"
  32674. "lsl r6, r8, #16\n\t"
  32675. "lsl r11, r7, #16\n\t"
  32676. "lsr r6, r6, #16\n\t"
  32677. "lsr r11, r11, #16\n\t"
  32678. "mul r11, r6, r11\n\t"
  32679. "adds r10, r10, r11\n\t"
  32680. "adc r5, r5, #0\n\t"
  32681. "lsr r11, r7, #16\n\t"
  32682. "mul r6, r11, r6\n\t"
  32683. "lsr r11, r6, #16\n\t"
  32684. "lsl r6, r6, #16\n\t"
  32685. "adds r10, r10, r6\n\t"
  32686. "adc r5, r5, r11\n\t"
  32687. #else
  32688. "umull r6, r7, r8, r7\n\t"
  32689. "adds r10, r10, r6\n\t"
  32690. "adc r5, r7, #0\n\t"
  32691. #endif
  32692. "adds r10, r10, r4\n\t"
  32693. "str r10, [%[a], #48]\n\t"
  32694. "adc r5, r5, #0\n\t"
  32695. /* a[i+13] += m[13] * mu */
  32696. "ldr r7, [%[m], #52]\n\t"
  32697. "ldr r10, [%[a], #52]\n\t"
  32698. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32699. "lsr r11, r7, #16\n\t"
  32700. "lsr r6, r8, #16\n\t"
  32701. "mul r4, r6, r11\n\t"
  32702. "lsl r11, r7, #16\n\t"
  32703. "lsr r11, r11, #16\n\t"
  32704. "mul r6, r11, r6\n\t"
  32705. "lsr r11, r6, #16\n\t"
  32706. "lsl r6, r6, #16\n\t"
  32707. "adds r10, r10, r6\n\t"
  32708. "adc r4, r4, r11\n\t"
  32709. "lsl r6, r8, #16\n\t"
  32710. "lsl r11, r7, #16\n\t"
  32711. "lsr r6, r6, #16\n\t"
  32712. "lsr r11, r11, #16\n\t"
  32713. "mul r11, r6, r11\n\t"
  32714. "adds r10, r10, r11\n\t"
  32715. "adc r4, r4, #0\n\t"
  32716. "lsr r11, r7, #16\n\t"
  32717. "mul r6, r11, r6\n\t"
  32718. "lsr r11, r6, #16\n\t"
  32719. "lsl r6, r6, #16\n\t"
  32720. "adds r10, r10, r6\n\t"
  32721. "adc r4, r4, r11\n\t"
  32722. #else
  32723. "umull r6, r7, r8, r7\n\t"
  32724. "adds r10, r10, r6\n\t"
  32725. "adc r4, r7, #0\n\t"
  32726. #endif
  32727. "adds r10, r10, r5\n\t"
  32728. "str r10, [%[a], #52]\n\t"
  32729. "adc r4, r4, #0\n\t"
  32730. /* a[i+14] += m[14] * mu */
  32731. "ldr r7, [%[m], #56]\n\t"
  32732. "ldr r10, [%[a], #56]\n\t"
  32733. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32734. "lsr r11, r7, #16\n\t"
  32735. "lsr r6, r8, #16\n\t"
  32736. "mul r5, r6, r11\n\t"
  32737. "lsl r11, r7, #16\n\t"
  32738. "lsr r11, r11, #16\n\t"
  32739. "mul r6, r11, r6\n\t"
  32740. "lsr r11, r6, #16\n\t"
  32741. "lsl r6, r6, #16\n\t"
  32742. "adds r10, r10, r6\n\t"
  32743. "adc r5, r5, r11\n\t"
  32744. "lsl r6, r8, #16\n\t"
  32745. "lsl r11, r7, #16\n\t"
  32746. "lsr r6, r6, #16\n\t"
  32747. "lsr r11, r11, #16\n\t"
  32748. "mul r11, r6, r11\n\t"
  32749. "adds r10, r10, r11\n\t"
  32750. "adc r5, r5, #0\n\t"
  32751. "lsr r11, r7, #16\n\t"
  32752. "mul r6, r11, r6\n\t"
  32753. "lsr r11, r6, #16\n\t"
  32754. "lsl r6, r6, #16\n\t"
  32755. "adds r10, r10, r6\n\t"
  32756. "adc r5, r5, r11\n\t"
  32757. #else
  32758. "umull r6, r7, r8, r7\n\t"
  32759. "adds r10, r10, r6\n\t"
  32760. "adc r5, r7, #0\n\t"
  32761. #endif
  32762. "adds r10, r10, r4\n\t"
  32763. "str r10, [%[a], #56]\n\t"
  32764. "adc r5, r5, #0\n\t"
  32765. /* a[i+15] += m[15] * mu */
  32766. "ldr r7, [%[m], #60]\n\t"
  32767. "ldr r10, [%[a], #60]\n\t"
  32768. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32769. "lsr r11, r7, #16\n\t"
  32770. "lsr r6, r8, #16\n\t"
  32771. "mul r4, r6, r11\n\t"
  32772. "lsl r11, r7, #16\n\t"
  32773. "lsr r11, r11, #16\n\t"
  32774. "mul r6, r11, r6\n\t"
  32775. "lsr r11, r6, #16\n\t"
  32776. "lsl r6, r6, #16\n\t"
  32777. "adds r10, r10, r6\n\t"
  32778. "adc r4, r4, r11\n\t"
  32779. "lsl r6, r8, #16\n\t"
  32780. "lsl r11, r7, #16\n\t"
  32781. "lsr r6, r6, #16\n\t"
  32782. "lsr r11, r11, #16\n\t"
  32783. "mul r11, r6, r11\n\t"
  32784. "adds r10, r10, r11\n\t"
  32785. "adc r4, r4, #0\n\t"
  32786. "lsr r11, r7, #16\n\t"
  32787. "mul r6, r11, r6\n\t"
  32788. "lsr r11, r6, #16\n\t"
  32789. "lsl r6, r6, #16\n\t"
  32790. "adds r10, r10, r6\n\t"
  32791. "adc r4, r4, r11\n\t"
  32792. #else
  32793. "umull r6, r7, r8, r7\n\t"
  32794. "adds r10, r10, r6\n\t"
  32795. "adc r4, r7, #0\n\t"
  32796. #endif
  32797. "adds r10, r10, r5\n\t"
  32798. "str r10, [%[a], #60]\n\t"
  32799. "adc r4, r4, #0\n\t"
  32800. /* a[i+16] += m[16] * mu */
  32801. "ldr r7, [%[m], #64]\n\t"
  32802. "ldr r10, [%[a], #64]\n\t"
  32803. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32804. "lsr r11, r7, #16\n\t"
  32805. "lsr r6, r8, #16\n\t"
  32806. "mul r5, r6, r11\n\t"
  32807. "lsl r11, r7, #16\n\t"
  32808. "lsr r11, r11, #16\n\t"
  32809. "mul r6, r11, r6\n\t"
  32810. "lsr r11, r6, #16\n\t"
  32811. "lsl r6, r6, #16\n\t"
  32812. "adds r10, r10, r6\n\t"
  32813. "adc r5, r5, r11\n\t"
  32814. "lsl r6, r8, #16\n\t"
  32815. "lsl r11, r7, #16\n\t"
  32816. "lsr r6, r6, #16\n\t"
  32817. "lsr r11, r11, #16\n\t"
  32818. "mul r11, r6, r11\n\t"
  32819. "adds r10, r10, r11\n\t"
  32820. "adc r5, r5, #0\n\t"
  32821. "lsr r11, r7, #16\n\t"
  32822. "mul r6, r11, r6\n\t"
  32823. "lsr r11, r6, #16\n\t"
  32824. "lsl r6, r6, #16\n\t"
  32825. "adds r10, r10, r6\n\t"
  32826. "adc r5, r5, r11\n\t"
  32827. #else
  32828. "umull r6, r7, r8, r7\n\t"
  32829. "adds r10, r10, r6\n\t"
  32830. "adc r5, r7, #0\n\t"
  32831. #endif
  32832. "adds r10, r10, r4\n\t"
  32833. "str r10, [%[a], #64]\n\t"
  32834. "adc r5, r5, #0\n\t"
  32835. /* a[i+17] += m[17] * mu */
  32836. "ldr r7, [%[m], #68]\n\t"
  32837. "ldr r10, [%[a], #68]\n\t"
  32838. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32839. "lsr r11, r7, #16\n\t"
  32840. "lsr r6, r8, #16\n\t"
  32841. "mul r4, r6, r11\n\t"
  32842. "lsl r11, r7, #16\n\t"
  32843. "lsr r11, r11, #16\n\t"
  32844. "mul r6, r11, r6\n\t"
  32845. "lsr r11, r6, #16\n\t"
  32846. "lsl r6, r6, #16\n\t"
  32847. "adds r10, r10, r6\n\t"
  32848. "adc r4, r4, r11\n\t"
  32849. "lsl r6, r8, #16\n\t"
  32850. "lsl r11, r7, #16\n\t"
  32851. "lsr r6, r6, #16\n\t"
  32852. "lsr r11, r11, #16\n\t"
  32853. "mul r11, r6, r11\n\t"
  32854. "adds r10, r10, r11\n\t"
  32855. "adc r4, r4, #0\n\t"
  32856. "lsr r11, r7, #16\n\t"
  32857. "mul r6, r11, r6\n\t"
  32858. "lsr r11, r6, #16\n\t"
  32859. "lsl r6, r6, #16\n\t"
  32860. "adds r10, r10, r6\n\t"
  32861. "adc r4, r4, r11\n\t"
  32862. #else
  32863. "umull r6, r7, r8, r7\n\t"
  32864. "adds r10, r10, r6\n\t"
  32865. "adc r4, r7, #0\n\t"
  32866. #endif
  32867. "adds r10, r10, r5\n\t"
  32868. "str r10, [%[a], #68]\n\t"
  32869. "adc r4, r4, #0\n\t"
  32870. /* a[i+18] += m[18] * mu */
  32871. "ldr r7, [%[m], #72]\n\t"
  32872. "ldr r10, [%[a], #72]\n\t"
  32873. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32874. "lsr r11, r7, #16\n\t"
  32875. "lsr r6, r8, #16\n\t"
  32876. "mul r5, r6, r11\n\t"
  32877. "lsl r11, r7, #16\n\t"
  32878. "lsr r11, r11, #16\n\t"
  32879. "mul r6, r11, r6\n\t"
  32880. "lsr r11, r6, #16\n\t"
  32881. "lsl r6, r6, #16\n\t"
  32882. "adds r10, r10, r6\n\t"
  32883. "adc r5, r5, r11\n\t"
  32884. "lsl r6, r8, #16\n\t"
  32885. "lsl r11, r7, #16\n\t"
  32886. "lsr r6, r6, #16\n\t"
  32887. "lsr r11, r11, #16\n\t"
  32888. "mul r11, r6, r11\n\t"
  32889. "adds r10, r10, r11\n\t"
  32890. "adc r5, r5, #0\n\t"
  32891. "lsr r11, r7, #16\n\t"
  32892. "mul r6, r11, r6\n\t"
  32893. "lsr r11, r6, #16\n\t"
  32894. "lsl r6, r6, #16\n\t"
  32895. "adds r10, r10, r6\n\t"
  32896. "adc r5, r5, r11\n\t"
  32897. #else
  32898. "umull r6, r7, r8, r7\n\t"
  32899. "adds r10, r10, r6\n\t"
  32900. "adc r5, r7, #0\n\t"
  32901. #endif
  32902. "adds r10, r10, r4\n\t"
  32903. "str r10, [%[a], #72]\n\t"
  32904. "adc r5, r5, #0\n\t"
  32905. /* a[i+19] += m[19] * mu */
  32906. "ldr r7, [%[m], #76]\n\t"
  32907. "ldr r10, [%[a], #76]\n\t"
  32908. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32909. "lsr r11, r7, #16\n\t"
  32910. "lsr r6, r8, #16\n\t"
  32911. "mul r4, r6, r11\n\t"
  32912. "lsl r11, r7, #16\n\t"
  32913. "lsr r11, r11, #16\n\t"
  32914. "mul r6, r11, r6\n\t"
  32915. "lsr r11, r6, #16\n\t"
  32916. "lsl r6, r6, #16\n\t"
  32917. "adds r10, r10, r6\n\t"
  32918. "adc r4, r4, r11\n\t"
  32919. "lsl r6, r8, #16\n\t"
  32920. "lsl r11, r7, #16\n\t"
  32921. "lsr r6, r6, #16\n\t"
  32922. "lsr r11, r11, #16\n\t"
  32923. "mul r11, r6, r11\n\t"
  32924. "adds r10, r10, r11\n\t"
  32925. "adc r4, r4, #0\n\t"
  32926. "lsr r11, r7, #16\n\t"
  32927. "mul r6, r11, r6\n\t"
  32928. "lsr r11, r6, #16\n\t"
  32929. "lsl r6, r6, #16\n\t"
  32930. "adds r10, r10, r6\n\t"
  32931. "adc r4, r4, r11\n\t"
  32932. #else
  32933. "umull r6, r7, r8, r7\n\t"
  32934. "adds r10, r10, r6\n\t"
  32935. "adc r4, r7, #0\n\t"
  32936. #endif
  32937. "adds r10, r10, r5\n\t"
  32938. "str r10, [%[a], #76]\n\t"
  32939. "adc r4, r4, #0\n\t"
  32940. /* a[i+20] += m[20] * mu */
  32941. "ldr r7, [%[m], #80]\n\t"
  32942. "ldr r10, [%[a], #80]\n\t"
  32943. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32944. "lsr r11, r7, #16\n\t"
  32945. "lsr r6, r8, #16\n\t"
  32946. "mul r5, r6, r11\n\t"
  32947. "lsl r11, r7, #16\n\t"
  32948. "lsr r11, r11, #16\n\t"
  32949. "mul r6, r11, r6\n\t"
  32950. "lsr r11, r6, #16\n\t"
  32951. "lsl r6, r6, #16\n\t"
  32952. "adds r10, r10, r6\n\t"
  32953. "adc r5, r5, r11\n\t"
  32954. "lsl r6, r8, #16\n\t"
  32955. "lsl r11, r7, #16\n\t"
  32956. "lsr r6, r6, #16\n\t"
  32957. "lsr r11, r11, #16\n\t"
  32958. "mul r11, r6, r11\n\t"
  32959. "adds r10, r10, r11\n\t"
  32960. "adc r5, r5, #0\n\t"
  32961. "lsr r11, r7, #16\n\t"
  32962. "mul r6, r11, r6\n\t"
  32963. "lsr r11, r6, #16\n\t"
  32964. "lsl r6, r6, #16\n\t"
  32965. "adds r10, r10, r6\n\t"
  32966. "adc r5, r5, r11\n\t"
  32967. #else
  32968. "umull r6, r7, r8, r7\n\t"
  32969. "adds r10, r10, r6\n\t"
  32970. "adc r5, r7, #0\n\t"
  32971. #endif
  32972. "adds r10, r10, r4\n\t"
  32973. "str r10, [%[a], #80]\n\t"
  32974. "adc r5, r5, #0\n\t"
  32975. /* a[i+21] += m[21] * mu */
  32976. "ldr r7, [%[m], #84]\n\t"
  32977. "ldr r10, [%[a], #84]\n\t"
  32978. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  32979. "lsr r11, r7, #16\n\t"
  32980. "lsr r6, r8, #16\n\t"
  32981. "mul r4, r6, r11\n\t"
  32982. "lsl r11, r7, #16\n\t"
  32983. "lsr r11, r11, #16\n\t"
  32984. "mul r6, r11, r6\n\t"
  32985. "lsr r11, r6, #16\n\t"
  32986. "lsl r6, r6, #16\n\t"
  32987. "adds r10, r10, r6\n\t"
  32988. "adc r4, r4, r11\n\t"
  32989. "lsl r6, r8, #16\n\t"
  32990. "lsl r11, r7, #16\n\t"
  32991. "lsr r6, r6, #16\n\t"
  32992. "lsr r11, r11, #16\n\t"
  32993. "mul r11, r6, r11\n\t"
  32994. "adds r10, r10, r11\n\t"
  32995. "adc r4, r4, #0\n\t"
  32996. "lsr r11, r7, #16\n\t"
  32997. "mul r6, r11, r6\n\t"
  32998. "lsr r11, r6, #16\n\t"
  32999. "lsl r6, r6, #16\n\t"
  33000. "adds r10, r10, r6\n\t"
  33001. "adc r4, r4, r11\n\t"
  33002. #else
  33003. "umull r6, r7, r8, r7\n\t"
  33004. "adds r10, r10, r6\n\t"
  33005. "adc r4, r7, #0\n\t"
  33006. #endif
  33007. "adds r10, r10, r5\n\t"
  33008. "str r10, [%[a], #84]\n\t"
  33009. "adc r4, r4, #0\n\t"
  33010. /* a[i+22] += m[22] * mu */
  33011. "ldr r7, [%[m], #88]\n\t"
  33012. "ldr r10, [%[a], #88]\n\t"
  33013. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33014. "lsr r11, r7, #16\n\t"
  33015. "lsr r6, r8, #16\n\t"
  33016. "mul r5, r6, r11\n\t"
  33017. "lsl r11, r7, #16\n\t"
  33018. "lsr r11, r11, #16\n\t"
  33019. "mul r6, r11, r6\n\t"
  33020. "lsr r11, r6, #16\n\t"
  33021. "lsl r6, r6, #16\n\t"
  33022. "adds r10, r10, r6\n\t"
  33023. "adc r5, r5, r11\n\t"
  33024. "lsl r6, r8, #16\n\t"
  33025. "lsl r11, r7, #16\n\t"
  33026. "lsr r6, r6, #16\n\t"
  33027. "lsr r11, r11, #16\n\t"
  33028. "mul r11, r6, r11\n\t"
  33029. "adds r10, r10, r11\n\t"
  33030. "adc r5, r5, #0\n\t"
  33031. "lsr r11, r7, #16\n\t"
  33032. "mul r6, r11, r6\n\t"
  33033. "lsr r11, r6, #16\n\t"
  33034. "lsl r6, r6, #16\n\t"
  33035. "adds r10, r10, r6\n\t"
  33036. "adc r5, r5, r11\n\t"
  33037. #else
  33038. "umull r6, r7, r8, r7\n\t"
  33039. "adds r10, r10, r6\n\t"
  33040. "adc r5, r7, #0\n\t"
  33041. #endif
  33042. "adds r10, r10, r4\n\t"
  33043. "str r10, [%[a], #88]\n\t"
  33044. "adc r5, r5, #0\n\t"
  33045. /* a[i+23] += m[23] * mu */
  33046. "ldr r7, [%[m], #92]\n\t"
  33047. "ldr r10, [%[a], #92]\n\t"
  33048. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33049. "lsr r11, r7, #16\n\t"
  33050. "lsr r6, r8, #16\n\t"
  33051. "mul r4, r6, r11\n\t"
  33052. "lsl r11, r7, #16\n\t"
  33053. "lsr r11, r11, #16\n\t"
  33054. "mul r6, r11, r6\n\t"
  33055. "lsr r11, r6, #16\n\t"
  33056. "lsl r6, r6, #16\n\t"
  33057. "adds r10, r10, r6\n\t"
  33058. "adc r4, r4, r11\n\t"
  33059. "lsl r6, r8, #16\n\t"
  33060. "lsl r11, r7, #16\n\t"
  33061. "lsr r6, r6, #16\n\t"
  33062. "lsr r11, r11, #16\n\t"
  33063. "mul r11, r6, r11\n\t"
  33064. "adds r10, r10, r11\n\t"
  33065. "adc r4, r4, #0\n\t"
  33066. "lsr r11, r7, #16\n\t"
  33067. "mul r6, r11, r6\n\t"
  33068. "lsr r11, r6, #16\n\t"
  33069. "lsl r6, r6, #16\n\t"
  33070. "adds r10, r10, r6\n\t"
  33071. "adc r4, r4, r11\n\t"
  33072. #else
  33073. "umull r6, r7, r8, r7\n\t"
  33074. "adds r10, r10, r6\n\t"
  33075. "adc r4, r7, #0\n\t"
  33076. #endif
  33077. "adds r10, r10, r5\n\t"
  33078. "str r10, [%[a], #92]\n\t"
  33079. "adc r4, r4, #0\n\t"
  33080. /* a[i+24] += m[24] * mu */
  33081. "ldr r7, [%[m], #96]\n\t"
  33082. "ldr r10, [%[a], #96]\n\t"
  33083. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33084. "lsr r11, r7, #16\n\t"
  33085. "lsr r6, r8, #16\n\t"
  33086. "mul r5, r6, r11\n\t"
  33087. "lsl r11, r7, #16\n\t"
  33088. "lsr r11, r11, #16\n\t"
  33089. "mul r6, r11, r6\n\t"
  33090. "lsr r11, r6, #16\n\t"
  33091. "lsl r6, r6, #16\n\t"
  33092. "adds r10, r10, r6\n\t"
  33093. "adc r5, r5, r11\n\t"
  33094. "lsl r6, r8, #16\n\t"
  33095. "lsl r11, r7, #16\n\t"
  33096. "lsr r6, r6, #16\n\t"
  33097. "lsr r11, r11, #16\n\t"
  33098. "mul r11, r6, r11\n\t"
  33099. "adds r10, r10, r11\n\t"
  33100. "adc r5, r5, #0\n\t"
  33101. "lsr r11, r7, #16\n\t"
  33102. "mul r6, r11, r6\n\t"
  33103. "lsr r11, r6, #16\n\t"
  33104. "lsl r6, r6, #16\n\t"
  33105. "adds r10, r10, r6\n\t"
  33106. "adc r5, r5, r11\n\t"
  33107. #else
  33108. "umull r6, r7, r8, r7\n\t"
  33109. "adds r10, r10, r6\n\t"
  33110. "adc r5, r7, #0\n\t"
  33111. #endif
  33112. "adds r10, r10, r4\n\t"
  33113. "str r10, [%[a], #96]\n\t"
  33114. "adc r5, r5, #0\n\t"
  33115. /* a[i+25] += m[25] * mu */
  33116. "ldr r7, [%[m], #100]\n\t"
  33117. "ldr r10, [%[a], #100]\n\t"
  33118. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33119. "lsr r11, r7, #16\n\t"
  33120. "lsr r6, r8, #16\n\t"
  33121. "mul r4, r6, r11\n\t"
  33122. "lsl r11, r7, #16\n\t"
  33123. "lsr r11, r11, #16\n\t"
  33124. "mul r6, r11, r6\n\t"
  33125. "lsr r11, r6, #16\n\t"
  33126. "lsl r6, r6, #16\n\t"
  33127. "adds r10, r10, r6\n\t"
  33128. "adc r4, r4, r11\n\t"
  33129. "lsl r6, r8, #16\n\t"
  33130. "lsl r11, r7, #16\n\t"
  33131. "lsr r6, r6, #16\n\t"
  33132. "lsr r11, r11, #16\n\t"
  33133. "mul r11, r6, r11\n\t"
  33134. "adds r10, r10, r11\n\t"
  33135. "adc r4, r4, #0\n\t"
  33136. "lsr r11, r7, #16\n\t"
  33137. "mul r6, r11, r6\n\t"
  33138. "lsr r11, r6, #16\n\t"
  33139. "lsl r6, r6, #16\n\t"
  33140. "adds r10, r10, r6\n\t"
  33141. "adc r4, r4, r11\n\t"
  33142. #else
  33143. "umull r6, r7, r8, r7\n\t"
  33144. "adds r10, r10, r6\n\t"
  33145. "adc r4, r7, #0\n\t"
  33146. #endif
  33147. "adds r10, r10, r5\n\t"
  33148. "str r10, [%[a], #100]\n\t"
  33149. "adc r4, r4, #0\n\t"
  33150. /* a[i+26] += m[26] * mu */
  33151. "ldr r7, [%[m], #104]\n\t"
  33152. "ldr r10, [%[a], #104]\n\t"
  33153. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33154. "lsr r11, r7, #16\n\t"
  33155. "lsr r6, r8, #16\n\t"
  33156. "mul r5, r6, r11\n\t"
  33157. "lsl r11, r7, #16\n\t"
  33158. "lsr r11, r11, #16\n\t"
  33159. "mul r6, r11, r6\n\t"
  33160. "lsr r11, r6, #16\n\t"
  33161. "lsl r6, r6, #16\n\t"
  33162. "adds r10, r10, r6\n\t"
  33163. "adc r5, r5, r11\n\t"
  33164. "lsl r6, r8, #16\n\t"
  33165. "lsl r11, r7, #16\n\t"
  33166. "lsr r6, r6, #16\n\t"
  33167. "lsr r11, r11, #16\n\t"
  33168. "mul r11, r6, r11\n\t"
  33169. "adds r10, r10, r11\n\t"
  33170. "adc r5, r5, #0\n\t"
  33171. "lsr r11, r7, #16\n\t"
  33172. "mul r6, r11, r6\n\t"
  33173. "lsr r11, r6, #16\n\t"
  33174. "lsl r6, r6, #16\n\t"
  33175. "adds r10, r10, r6\n\t"
  33176. "adc r5, r5, r11\n\t"
  33177. #else
  33178. "umull r6, r7, r8, r7\n\t"
  33179. "adds r10, r10, r6\n\t"
  33180. "adc r5, r7, #0\n\t"
  33181. #endif
  33182. "adds r10, r10, r4\n\t"
  33183. "str r10, [%[a], #104]\n\t"
  33184. "adc r5, r5, #0\n\t"
  33185. /* a[i+27] += m[27] * mu */
  33186. "ldr r7, [%[m], #108]\n\t"
  33187. "ldr r10, [%[a], #108]\n\t"
  33188. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33189. "lsr r11, r7, #16\n\t"
  33190. "lsr r6, r8, #16\n\t"
  33191. "mul r4, r6, r11\n\t"
  33192. "lsl r11, r7, #16\n\t"
  33193. "lsr r11, r11, #16\n\t"
  33194. "mul r6, r11, r6\n\t"
  33195. "lsr r11, r6, #16\n\t"
  33196. "lsl r6, r6, #16\n\t"
  33197. "adds r10, r10, r6\n\t"
  33198. "adc r4, r4, r11\n\t"
  33199. "lsl r6, r8, #16\n\t"
  33200. "lsl r11, r7, #16\n\t"
  33201. "lsr r6, r6, #16\n\t"
  33202. "lsr r11, r11, #16\n\t"
  33203. "mul r11, r6, r11\n\t"
  33204. "adds r10, r10, r11\n\t"
  33205. "adc r4, r4, #0\n\t"
  33206. "lsr r11, r7, #16\n\t"
  33207. "mul r6, r11, r6\n\t"
  33208. "lsr r11, r6, #16\n\t"
  33209. "lsl r6, r6, #16\n\t"
  33210. "adds r10, r10, r6\n\t"
  33211. "adc r4, r4, r11\n\t"
  33212. #else
  33213. "umull r6, r7, r8, r7\n\t"
  33214. "adds r10, r10, r6\n\t"
  33215. "adc r4, r7, #0\n\t"
  33216. #endif
  33217. "adds r10, r10, r5\n\t"
  33218. "str r10, [%[a], #108]\n\t"
  33219. "adc r4, r4, #0\n\t"
  33220. /* a[i+28] += m[28] * mu */
  33221. "ldr r7, [%[m], #112]\n\t"
  33222. "ldr r10, [%[a], #112]\n\t"
  33223. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33224. "lsr r11, r7, #16\n\t"
  33225. "lsr r6, r8, #16\n\t"
  33226. "mul r5, r6, r11\n\t"
  33227. "lsl r11, r7, #16\n\t"
  33228. "lsr r11, r11, #16\n\t"
  33229. "mul r6, r11, r6\n\t"
  33230. "lsr r11, r6, #16\n\t"
  33231. "lsl r6, r6, #16\n\t"
  33232. "adds r10, r10, r6\n\t"
  33233. "adc r5, r5, r11\n\t"
  33234. "lsl r6, r8, #16\n\t"
  33235. "lsl r11, r7, #16\n\t"
  33236. "lsr r6, r6, #16\n\t"
  33237. "lsr r11, r11, #16\n\t"
  33238. "mul r11, r6, r11\n\t"
  33239. "adds r10, r10, r11\n\t"
  33240. "adc r5, r5, #0\n\t"
  33241. "lsr r11, r7, #16\n\t"
  33242. "mul r6, r11, r6\n\t"
  33243. "lsr r11, r6, #16\n\t"
  33244. "lsl r6, r6, #16\n\t"
  33245. "adds r10, r10, r6\n\t"
  33246. "adc r5, r5, r11\n\t"
  33247. #else
  33248. "umull r6, r7, r8, r7\n\t"
  33249. "adds r10, r10, r6\n\t"
  33250. "adc r5, r7, #0\n\t"
  33251. #endif
  33252. "adds r10, r10, r4\n\t"
  33253. "str r10, [%[a], #112]\n\t"
  33254. "adc r5, r5, #0\n\t"
  33255. /* a[i+29] += m[29] * mu */
  33256. "ldr r7, [%[m], #116]\n\t"
  33257. "ldr r10, [%[a], #116]\n\t"
  33258. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33259. "lsr r11, r7, #16\n\t"
  33260. "lsr r6, r8, #16\n\t"
  33261. "mul r4, r6, r11\n\t"
  33262. "lsl r11, r7, #16\n\t"
  33263. "lsr r11, r11, #16\n\t"
  33264. "mul r6, r11, r6\n\t"
  33265. "lsr r11, r6, #16\n\t"
  33266. "lsl r6, r6, #16\n\t"
  33267. "adds r10, r10, r6\n\t"
  33268. "adc r4, r4, r11\n\t"
  33269. "lsl r6, r8, #16\n\t"
  33270. "lsl r11, r7, #16\n\t"
  33271. "lsr r6, r6, #16\n\t"
  33272. "lsr r11, r11, #16\n\t"
  33273. "mul r11, r6, r11\n\t"
  33274. "adds r10, r10, r11\n\t"
  33275. "adc r4, r4, #0\n\t"
  33276. "lsr r11, r7, #16\n\t"
  33277. "mul r6, r11, r6\n\t"
  33278. "lsr r11, r6, #16\n\t"
  33279. "lsl r6, r6, #16\n\t"
  33280. "adds r10, r10, r6\n\t"
  33281. "adc r4, r4, r11\n\t"
  33282. #else
  33283. "umull r6, r7, r8, r7\n\t"
  33284. "adds r10, r10, r6\n\t"
  33285. "adc r4, r7, #0\n\t"
  33286. #endif
  33287. "adds r10, r10, r5\n\t"
  33288. "str r10, [%[a], #116]\n\t"
  33289. "adc r4, r4, #0\n\t"
  33290. /* a[i+30] += m[30] * mu */
  33291. "ldr r7, [%[m], #120]\n\t"
  33292. "ldr r10, [%[a], #120]\n\t"
  33293. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33294. "lsr r11, r7, #16\n\t"
  33295. "lsr r6, r8, #16\n\t"
  33296. "mul r5, r6, r11\n\t"
  33297. "lsl r11, r7, #16\n\t"
  33298. "lsr r11, r11, #16\n\t"
  33299. "mul r6, r11, r6\n\t"
  33300. "lsr r11, r6, #16\n\t"
  33301. "lsl r6, r6, #16\n\t"
  33302. "adds r10, r10, r6\n\t"
  33303. "adc r5, r5, r11\n\t"
  33304. "lsl r6, r8, #16\n\t"
  33305. "lsl r11, r7, #16\n\t"
  33306. "lsr r6, r6, #16\n\t"
  33307. "lsr r11, r11, #16\n\t"
  33308. "mul r11, r6, r11\n\t"
  33309. "adds r10, r10, r11\n\t"
  33310. "adc r5, r5, #0\n\t"
  33311. "lsr r11, r7, #16\n\t"
  33312. "mul r6, r11, r6\n\t"
  33313. "lsr r11, r6, #16\n\t"
  33314. "lsl r6, r6, #16\n\t"
  33315. "adds r10, r10, r6\n\t"
  33316. "adc r5, r5, r11\n\t"
  33317. #else
  33318. "umull r6, r7, r8, r7\n\t"
  33319. "adds r10, r10, r6\n\t"
  33320. "adc r5, r7, #0\n\t"
  33321. #endif
  33322. "adds r10, r10, r4\n\t"
  33323. "str r10, [%[a], #120]\n\t"
  33324. "adc r5, r5, #0\n\t"
  33325. /* a[i+31] += m[31] * mu */
  33326. "ldr r7, [%[m], #124]\n\t"
  33327. "ldr r10, [%[a], #124]\n\t"
  33328. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33329. "lsr r11, r7, #16\n\t"
  33330. "lsr r6, r8, #16\n\t"
  33331. "mul r4, r6, r11\n\t"
  33332. "lsl r11, r7, #16\n\t"
  33333. "lsr r11, r11, #16\n\t"
  33334. "mul r6, r11, r6\n\t"
  33335. "lsr r11, r6, #16\n\t"
  33336. "lsl r6, r6, #16\n\t"
  33337. "adds r10, r10, r6\n\t"
  33338. "adc r4, r4, r11\n\t"
  33339. "lsl r6, r8, #16\n\t"
  33340. "lsl r11, r7, #16\n\t"
  33341. "lsr r6, r6, #16\n\t"
  33342. "lsr r11, r11, #16\n\t"
  33343. "mul r11, r6, r11\n\t"
  33344. "adds r10, r10, r11\n\t"
  33345. "adc r4, r4, #0\n\t"
  33346. "lsr r11, r7, #16\n\t"
  33347. "mul r6, r11, r6\n\t"
  33348. "lsr r11, r6, #16\n\t"
  33349. "lsl r6, r6, #16\n\t"
  33350. "adds r10, r10, r6\n\t"
  33351. "adc r4, r4, r11\n\t"
  33352. #else
  33353. "umull r6, r7, r8, r7\n\t"
  33354. "adds r10, r10, r6\n\t"
  33355. "adc r4, r7, #0\n\t"
  33356. #endif
  33357. "adds r10, r10, r5\n\t"
  33358. "str r10, [%[a], #124]\n\t"
  33359. "adc r4, r4, #0\n\t"
  33360. /* a[i+32] += m[32] * mu */
  33361. "ldr r7, [%[m], #128]\n\t"
  33362. "ldr r10, [%[a], #128]\n\t"
  33363. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33364. "lsr r11, r7, #16\n\t"
  33365. "lsr r6, r8, #16\n\t"
  33366. "mul r5, r6, r11\n\t"
  33367. "lsl r11, r7, #16\n\t"
  33368. "lsr r11, r11, #16\n\t"
  33369. "mul r6, r11, r6\n\t"
  33370. "lsr r11, r6, #16\n\t"
  33371. "lsl r6, r6, #16\n\t"
  33372. "adds r10, r10, r6\n\t"
  33373. "adc r5, r5, r11\n\t"
  33374. "lsl r6, r8, #16\n\t"
  33375. "lsl r11, r7, #16\n\t"
  33376. "lsr r6, r6, #16\n\t"
  33377. "lsr r11, r11, #16\n\t"
  33378. "mul r11, r6, r11\n\t"
  33379. "adds r10, r10, r11\n\t"
  33380. "adc r5, r5, #0\n\t"
  33381. "lsr r11, r7, #16\n\t"
  33382. "mul r6, r11, r6\n\t"
  33383. "lsr r11, r6, #16\n\t"
  33384. "lsl r6, r6, #16\n\t"
  33385. "adds r10, r10, r6\n\t"
  33386. "adc r5, r5, r11\n\t"
  33387. #else
  33388. "umull r6, r7, r8, r7\n\t"
  33389. "adds r10, r10, r6\n\t"
  33390. "adc r5, r7, #0\n\t"
  33391. #endif
  33392. "adds r10, r10, r4\n\t"
  33393. "str r10, [%[a], #128]\n\t"
  33394. "adc r5, r5, #0\n\t"
  33395. /* a[i+33] += m[33] * mu */
  33396. "ldr r7, [%[m], #132]\n\t"
  33397. "ldr r10, [%[a], #132]\n\t"
  33398. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33399. "lsr r11, r7, #16\n\t"
  33400. "lsr r6, r8, #16\n\t"
  33401. "mul r4, r6, r11\n\t"
  33402. "lsl r11, r7, #16\n\t"
  33403. "lsr r11, r11, #16\n\t"
  33404. "mul r6, r11, r6\n\t"
  33405. "lsr r11, r6, #16\n\t"
  33406. "lsl r6, r6, #16\n\t"
  33407. "adds r10, r10, r6\n\t"
  33408. "adc r4, r4, r11\n\t"
  33409. "lsl r6, r8, #16\n\t"
  33410. "lsl r11, r7, #16\n\t"
  33411. "lsr r6, r6, #16\n\t"
  33412. "lsr r11, r11, #16\n\t"
  33413. "mul r11, r6, r11\n\t"
  33414. "adds r10, r10, r11\n\t"
  33415. "adc r4, r4, #0\n\t"
  33416. "lsr r11, r7, #16\n\t"
  33417. "mul r6, r11, r6\n\t"
  33418. "lsr r11, r6, #16\n\t"
  33419. "lsl r6, r6, #16\n\t"
  33420. "adds r10, r10, r6\n\t"
  33421. "adc r4, r4, r11\n\t"
  33422. #else
  33423. "umull r6, r7, r8, r7\n\t"
  33424. "adds r10, r10, r6\n\t"
  33425. "adc r4, r7, #0\n\t"
  33426. #endif
  33427. "adds r10, r10, r5\n\t"
  33428. "str r10, [%[a], #132]\n\t"
  33429. "adc r4, r4, #0\n\t"
  33430. /* a[i+34] += m[34] * mu */
  33431. "ldr r7, [%[m], #136]\n\t"
  33432. "ldr r10, [%[a], #136]\n\t"
  33433. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33434. "lsr r11, r7, #16\n\t"
  33435. "lsr r6, r8, #16\n\t"
  33436. "mul r5, r6, r11\n\t"
  33437. "lsl r11, r7, #16\n\t"
  33438. "lsr r11, r11, #16\n\t"
  33439. "mul r6, r11, r6\n\t"
  33440. "lsr r11, r6, #16\n\t"
  33441. "lsl r6, r6, #16\n\t"
  33442. "adds r10, r10, r6\n\t"
  33443. "adc r5, r5, r11\n\t"
  33444. "lsl r6, r8, #16\n\t"
  33445. "lsl r11, r7, #16\n\t"
  33446. "lsr r6, r6, #16\n\t"
  33447. "lsr r11, r11, #16\n\t"
  33448. "mul r11, r6, r11\n\t"
  33449. "adds r10, r10, r11\n\t"
  33450. "adc r5, r5, #0\n\t"
  33451. "lsr r11, r7, #16\n\t"
  33452. "mul r6, r11, r6\n\t"
  33453. "lsr r11, r6, #16\n\t"
  33454. "lsl r6, r6, #16\n\t"
  33455. "adds r10, r10, r6\n\t"
  33456. "adc r5, r5, r11\n\t"
  33457. #else
  33458. "umull r6, r7, r8, r7\n\t"
  33459. "adds r10, r10, r6\n\t"
  33460. "adc r5, r7, #0\n\t"
  33461. #endif
  33462. "adds r10, r10, r4\n\t"
  33463. "str r10, [%[a], #136]\n\t"
  33464. "adc r5, r5, #0\n\t"
  33465. /* a[i+35] += m[35] * mu */
  33466. "ldr r7, [%[m], #140]\n\t"
  33467. "ldr r10, [%[a], #140]\n\t"
  33468. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33469. "lsr r11, r7, #16\n\t"
  33470. "lsr r6, r8, #16\n\t"
  33471. "mul r4, r6, r11\n\t"
  33472. "lsl r11, r7, #16\n\t"
  33473. "lsr r11, r11, #16\n\t"
  33474. "mul r6, r11, r6\n\t"
  33475. "lsr r11, r6, #16\n\t"
  33476. "lsl r6, r6, #16\n\t"
  33477. "adds r10, r10, r6\n\t"
  33478. "adc r4, r4, r11\n\t"
  33479. "lsl r6, r8, #16\n\t"
  33480. "lsl r11, r7, #16\n\t"
  33481. "lsr r6, r6, #16\n\t"
  33482. "lsr r11, r11, #16\n\t"
  33483. "mul r11, r6, r11\n\t"
  33484. "adds r10, r10, r11\n\t"
  33485. "adc r4, r4, #0\n\t"
  33486. "lsr r11, r7, #16\n\t"
  33487. "mul r6, r11, r6\n\t"
  33488. "lsr r11, r6, #16\n\t"
  33489. "lsl r6, r6, #16\n\t"
  33490. "adds r10, r10, r6\n\t"
  33491. "adc r4, r4, r11\n\t"
  33492. #else
  33493. "umull r6, r7, r8, r7\n\t"
  33494. "adds r10, r10, r6\n\t"
  33495. "adc r4, r7, #0\n\t"
  33496. #endif
  33497. "adds r10, r10, r5\n\t"
  33498. "str r10, [%[a], #140]\n\t"
  33499. "adc r4, r4, #0\n\t"
  33500. /* a[i+36] += m[36] * mu */
  33501. "ldr r7, [%[m], #144]\n\t"
  33502. "ldr r10, [%[a], #144]\n\t"
  33503. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33504. "lsr r11, r7, #16\n\t"
  33505. "lsr r6, r8, #16\n\t"
  33506. "mul r5, r6, r11\n\t"
  33507. "lsl r11, r7, #16\n\t"
  33508. "lsr r11, r11, #16\n\t"
  33509. "mul r6, r11, r6\n\t"
  33510. "lsr r11, r6, #16\n\t"
  33511. "lsl r6, r6, #16\n\t"
  33512. "adds r10, r10, r6\n\t"
  33513. "adc r5, r5, r11\n\t"
  33514. "lsl r6, r8, #16\n\t"
  33515. "lsl r11, r7, #16\n\t"
  33516. "lsr r6, r6, #16\n\t"
  33517. "lsr r11, r11, #16\n\t"
  33518. "mul r11, r6, r11\n\t"
  33519. "adds r10, r10, r11\n\t"
  33520. "adc r5, r5, #0\n\t"
  33521. "lsr r11, r7, #16\n\t"
  33522. "mul r6, r11, r6\n\t"
  33523. "lsr r11, r6, #16\n\t"
  33524. "lsl r6, r6, #16\n\t"
  33525. "adds r10, r10, r6\n\t"
  33526. "adc r5, r5, r11\n\t"
  33527. #else
  33528. "umull r6, r7, r8, r7\n\t"
  33529. "adds r10, r10, r6\n\t"
  33530. "adc r5, r7, #0\n\t"
  33531. #endif
  33532. "adds r10, r10, r4\n\t"
  33533. "str r10, [%[a], #144]\n\t"
  33534. "adc r5, r5, #0\n\t"
  33535. /* a[i+37] += m[37] * mu */
  33536. "ldr r7, [%[m], #148]\n\t"
  33537. "ldr r10, [%[a], #148]\n\t"
  33538. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33539. "lsr r11, r7, #16\n\t"
  33540. "lsr r6, r8, #16\n\t"
  33541. "mul r4, r6, r11\n\t"
  33542. "lsl r11, r7, #16\n\t"
  33543. "lsr r11, r11, #16\n\t"
  33544. "mul r6, r11, r6\n\t"
  33545. "lsr r11, r6, #16\n\t"
  33546. "lsl r6, r6, #16\n\t"
  33547. "adds r10, r10, r6\n\t"
  33548. "adc r4, r4, r11\n\t"
  33549. "lsl r6, r8, #16\n\t"
  33550. "lsl r11, r7, #16\n\t"
  33551. "lsr r6, r6, #16\n\t"
  33552. "lsr r11, r11, #16\n\t"
  33553. "mul r11, r6, r11\n\t"
  33554. "adds r10, r10, r11\n\t"
  33555. "adc r4, r4, #0\n\t"
  33556. "lsr r11, r7, #16\n\t"
  33557. "mul r6, r11, r6\n\t"
  33558. "lsr r11, r6, #16\n\t"
  33559. "lsl r6, r6, #16\n\t"
  33560. "adds r10, r10, r6\n\t"
  33561. "adc r4, r4, r11\n\t"
  33562. #else
  33563. "umull r6, r7, r8, r7\n\t"
  33564. "adds r10, r10, r6\n\t"
  33565. "adc r4, r7, #0\n\t"
  33566. #endif
  33567. "adds r10, r10, r5\n\t"
  33568. "str r10, [%[a], #148]\n\t"
  33569. "adc r4, r4, #0\n\t"
  33570. /* a[i+38] += m[38] * mu */
  33571. "ldr r7, [%[m], #152]\n\t"
  33572. "ldr r10, [%[a], #152]\n\t"
  33573. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33574. "lsr r11, r7, #16\n\t"
  33575. "lsr r6, r8, #16\n\t"
  33576. "mul r5, r6, r11\n\t"
  33577. "lsl r11, r7, #16\n\t"
  33578. "lsr r11, r11, #16\n\t"
  33579. "mul r6, r11, r6\n\t"
  33580. "lsr r11, r6, #16\n\t"
  33581. "lsl r6, r6, #16\n\t"
  33582. "adds r10, r10, r6\n\t"
  33583. "adc r5, r5, r11\n\t"
  33584. "lsl r6, r8, #16\n\t"
  33585. "lsl r11, r7, #16\n\t"
  33586. "lsr r6, r6, #16\n\t"
  33587. "lsr r11, r11, #16\n\t"
  33588. "mul r11, r6, r11\n\t"
  33589. "adds r10, r10, r11\n\t"
  33590. "adc r5, r5, #0\n\t"
  33591. "lsr r11, r7, #16\n\t"
  33592. "mul r6, r11, r6\n\t"
  33593. "lsr r11, r6, #16\n\t"
  33594. "lsl r6, r6, #16\n\t"
  33595. "adds r10, r10, r6\n\t"
  33596. "adc r5, r5, r11\n\t"
  33597. #else
  33598. "umull r6, r7, r8, r7\n\t"
  33599. "adds r10, r10, r6\n\t"
  33600. "adc r5, r7, #0\n\t"
  33601. #endif
  33602. "adds r10, r10, r4\n\t"
  33603. "str r10, [%[a], #152]\n\t"
  33604. "adc r5, r5, #0\n\t"
  33605. /* a[i+39] += m[39] * mu */
  33606. "ldr r7, [%[m], #156]\n\t"
  33607. "ldr r10, [%[a], #156]\n\t"
  33608. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33609. "lsr r11, r7, #16\n\t"
  33610. "lsr r6, r8, #16\n\t"
  33611. "mul r4, r6, r11\n\t"
  33612. "lsl r11, r7, #16\n\t"
  33613. "lsr r11, r11, #16\n\t"
  33614. "mul r6, r11, r6\n\t"
  33615. "lsr r11, r6, #16\n\t"
  33616. "lsl r6, r6, #16\n\t"
  33617. "adds r10, r10, r6\n\t"
  33618. "adc r4, r4, r11\n\t"
  33619. "lsl r6, r8, #16\n\t"
  33620. "lsl r11, r7, #16\n\t"
  33621. "lsr r6, r6, #16\n\t"
  33622. "lsr r11, r11, #16\n\t"
  33623. "mul r11, r6, r11\n\t"
  33624. "adds r10, r10, r11\n\t"
  33625. "adc r4, r4, #0\n\t"
  33626. "lsr r11, r7, #16\n\t"
  33627. "mul r6, r11, r6\n\t"
  33628. "lsr r11, r6, #16\n\t"
  33629. "lsl r6, r6, #16\n\t"
  33630. "adds r10, r10, r6\n\t"
  33631. "adc r4, r4, r11\n\t"
  33632. #else
  33633. "umull r6, r7, r8, r7\n\t"
  33634. "adds r10, r10, r6\n\t"
  33635. "adc r4, r7, #0\n\t"
  33636. #endif
  33637. "adds r10, r10, r5\n\t"
  33638. "str r10, [%[a], #156]\n\t"
  33639. "adc r4, r4, #0\n\t"
  33640. /* a[i+40] += m[40] * mu */
  33641. "ldr r7, [%[m], #160]\n\t"
  33642. "ldr r10, [%[a], #160]\n\t"
  33643. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33644. "lsr r11, r7, #16\n\t"
  33645. "lsr r6, r8, #16\n\t"
  33646. "mul r5, r6, r11\n\t"
  33647. "lsl r11, r7, #16\n\t"
  33648. "lsr r11, r11, #16\n\t"
  33649. "mul r6, r11, r6\n\t"
  33650. "lsr r11, r6, #16\n\t"
  33651. "lsl r6, r6, #16\n\t"
  33652. "adds r10, r10, r6\n\t"
  33653. "adc r5, r5, r11\n\t"
  33654. "lsl r6, r8, #16\n\t"
  33655. "lsl r11, r7, #16\n\t"
  33656. "lsr r6, r6, #16\n\t"
  33657. "lsr r11, r11, #16\n\t"
  33658. "mul r11, r6, r11\n\t"
  33659. "adds r10, r10, r11\n\t"
  33660. "adc r5, r5, #0\n\t"
  33661. "lsr r11, r7, #16\n\t"
  33662. "mul r6, r11, r6\n\t"
  33663. "lsr r11, r6, #16\n\t"
  33664. "lsl r6, r6, #16\n\t"
  33665. "adds r10, r10, r6\n\t"
  33666. "adc r5, r5, r11\n\t"
  33667. #else
  33668. "umull r6, r7, r8, r7\n\t"
  33669. "adds r10, r10, r6\n\t"
  33670. "adc r5, r7, #0\n\t"
  33671. #endif
  33672. "adds r10, r10, r4\n\t"
  33673. "str r10, [%[a], #160]\n\t"
  33674. "adc r5, r5, #0\n\t"
  33675. /* a[i+41] += m[41] * mu */
  33676. "ldr r7, [%[m], #164]\n\t"
  33677. "ldr r10, [%[a], #164]\n\t"
  33678. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33679. "lsr r11, r7, #16\n\t"
  33680. "lsr r6, r8, #16\n\t"
  33681. "mul r4, r6, r11\n\t"
  33682. "lsl r11, r7, #16\n\t"
  33683. "lsr r11, r11, #16\n\t"
  33684. "mul r6, r11, r6\n\t"
  33685. "lsr r11, r6, #16\n\t"
  33686. "lsl r6, r6, #16\n\t"
  33687. "adds r10, r10, r6\n\t"
  33688. "adc r4, r4, r11\n\t"
  33689. "lsl r6, r8, #16\n\t"
  33690. "lsl r11, r7, #16\n\t"
  33691. "lsr r6, r6, #16\n\t"
  33692. "lsr r11, r11, #16\n\t"
  33693. "mul r11, r6, r11\n\t"
  33694. "adds r10, r10, r11\n\t"
  33695. "adc r4, r4, #0\n\t"
  33696. "lsr r11, r7, #16\n\t"
  33697. "mul r6, r11, r6\n\t"
  33698. "lsr r11, r6, #16\n\t"
  33699. "lsl r6, r6, #16\n\t"
  33700. "adds r10, r10, r6\n\t"
  33701. "adc r4, r4, r11\n\t"
  33702. #else
  33703. "umull r6, r7, r8, r7\n\t"
  33704. "adds r10, r10, r6\n\t"
  33705. "adc r4, r7, #0\n\t"
  33706. #endif
  33707. "adds r10, r10, r5\n\t"
  33708. "str r10, [%[a], #164]\n\t"
  33709. "adc r4, r4, #0\n\t"
  33710. /* a[i+42] += m[42] * mu */
  33711. "ldr r7, [%[m], #168]\n\t"
  33712. "ldr r10, [%[a], #168]\n\t"
  33713. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33714. "lsr r11, r7, #16\n\t"
  33715. "lsr r6, r8, #16\n\t"
  33716. "mul r5, r6, r11\n\t"
  33717. "lsl r11, r7, #16\n\t"
  33718. "lsr r11, r11, #16\n\t"
  33719. "mul r6, r11, r6\n\t"
  33720. "lsr r11, r6, #16\n\t"
  33721. "lsl r6, r6, #16\n\t"
  33722. "adds r10, r10, r6\n\t"
  33723. "adc r5, r5, r11\n\t"
  33724. "lsl r6, r8, #16\n\t"
  33725. "lsl r11, r7, #16\n\t"
  33726. "lsr r6, r6, #16\n\t"
  33727. "lsr r11, r11, #16\n\t"
  33728. "mul r11, r6, r11\n\t"
  33729. "adds r10, r10, r11\n\t"
  33730. "adc r5, r5, #0\n\t"
  33731. "lsr r11, r7, #16\n\t"
  33732. "mul r6, r11, r6\n\t"
  33733. "lsr r11, r6, #16\n\t"
  33734. "lsl r6, r6, #16\n\t"
  33735. "adds r10, r10, r6\n\t"
  33736. "adc r5, r5, r11\n\t"
  33737. #else
  33738. "umull r6, r7, r8, r7\n\t"
  33739. "adds r10, r10, r6\n\t"
  33740. "adc r5, r7, #0\n\t"
  33741. #endif
  33742. "adds r10, r10, r4\n\t"
  33743. "str r10, [%[a], #168]\n\t"
  33744. "adc r5, r5, #0\n\t"
  33745. /* a[i+43] += m[43] * mu */
  33746. "ldr r7, [%[m], #172]\n\t"
  33747. "ldr r10, [%[a], #172]\n\t"
  33748. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33749. "lsr r11, r7, #16\n\t"
  33750. "lsr r6, r8, #16\n\t"
  33751. "mul r4, r6, r11\n\t"
  33752. "lsl r11, r7, #16\n\t"
  33753. "lsr r11, r11, #16\n\t"
  33754. "mul r6, r11, r6\n\t"
  33755. "lsr r11, r6, #16\n\t"
  33756. "lsl r6, r6, #16\n\t"
  33757. "adds r10, r10, r6\n\t"
  33758. "adc r4, r4, r11\n\t"
  33759. "lsl r6, r8, #16\n\t"
  33760. "lsl r11, r7, #16\n\t"
  33761. "lsr r6, r6, #16\n\t"
  33762. "lsr r11, r11, #16\n\t"
  33763. "mul r11, r6, r11\n\t"
  33764. "adds r10, r10, r11\n\t"
  33765. "adc r4, r4, #0\n\t"
  33766. "lsr r11, r7, #16\n\t"
  33767. "mul r6, r11, r6\n\t"
  33768. "lsr r11, r6, #16\n\t"
  33769. "lsl r6, r6, #16\n\t"
  33770. "adds r10, r10, r6\n\t"
  33771. "adc r4, r4, r11\n\t"
  33772. #else
  33773. "umull r6, r7, r8, r7\n\t"
  33774. "adds r10, r10, r6\n\t"
  33775. "adc r4, r7, #0\n\t"
  33776. #endif
  33777. "adds r10, r10, r5\n\t"
  33778. "str r10, [%[a], #172]\n\t"
  33779. "adc r4, r4, #0\n\t"
  33780. /* a[i+44] += m[44] * mu */
  33781. "ldr r7, [%[m], #176]\n\t"
  33782. "ldr r10, [%[a], #176]\n\t"
  33783. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33784. "lsr r11, r7, #16\n\t"
  33785. "lsr r6, r8, #16\n\t"
  33786. "mul r5, r6, r11\n\t"
  33787. "lsl r11, r7, #16\n\t"
  33788. "lsr r11, r11, #16\n\t"
  33789. "mul r6, r11, r6\n\t"
  33790. "lsr r11, r6, #16\n\t"
  33791. "lsl r6, r6, #16\n\t"
  33792. "adds r10, r10, r6\n\t"
  33793. "adc r5, r5, r11\n\t"
  33794. "lsl r6, r8, #16\n\t"
  33795. "lsl r11, r7, #16\n\t"
  33796. "lsr r6, r6, #16\n\t"
  33797. "lsr r11, r11, #16\n\t"
  33798. "mul r11, r6, r11\n\t"
  33799. "adds r10, r10, r11\n\t"
  33800. "adc r5, r5, #0\n\t"
  33801. "lsr r11, r7, #16\n\t"
  33802. "mul r6, r11, r6\n\t"
  33803. "lsr r11, r6, #16\n\t"
  33804. "lsl r6, r6, #16\n\t"
  33805. "adds r10, r10, r6\n\t"
  33806. "adc r5, r5, r11\n\t"
  33807. #else
  33808. "umull r6, r7, r8, r7\n\t"
  33809. "adds r10, r10, r6\n\t"
  33810. "adc r5, r7, #0\n\t"
  33811. #endif
  33812. "adds r10, r10, r4\n\t"
  33813. "str r10, [%[a], #176]\n\t"
  33814. "adc r5, r5, #0\n\t"
  33815. /* a[i+45] += m[45] * mu */
  33816. "ldr r7, [%[m], #180]\n\t"
  33817. "ldr r10, [%[a], #180]\n\t"
  33818. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33819. "lsr r11, r7, #16\n\t"
  33820. "lsr r6, r8, #16\n\t"
  33821. "mul r4, r6, r11\n\t"
  33822. "lsl r11, r7, #16\n\t"
  33823. "lsr r11, r11, #16\n\t"
  33824. "mul r6, r11, r6\n\t"
  33825. "lsr r11, r6, #16\n\t"
  33826. "lsl r6, r6, #16\n\t"
  33827. "adds r10, r10, r6\n\t"
  33828. "adc r4, r4, r11\n\t"
  33829. "lsl r6, r8, #16\n\t"
  33830. "lsl r11, r7, #16\n\t"
  33831. "lsr r6, r6, #16\n\t"
  33832. "lsr r11, r11, #16\n\t"
  33833. "mul r11, r6, r11\n\t"
  33834. "adds r10, r10, r11\n\t"
  33835. "adc r4, r4, #0\n\t"
  33836. "lsr r11, r7, #16\n\t"
  33837. "mul r6, r11, r6\n\t"
  33838. "lsr r11, r6, #16\n\t"
  33839. "lsl r6, r6, #16\n\t"
  33840. "adds r10, r10, r6\n\t"
  33841. "adc r4, r4, r11\n\t"
  33842. #else
  33843. "umull r6, r7, r8, r7\n\t"
  33844. "adds r10, r10, r6\n\t"
  33845. "adc r4, r7, #0\n\t"
  33846. #endif
  33847. "adds r10, r10, r5\n\t"
  33848. "str r10, [%[a], #180]\n\t"
  33849. "adc r4, r4, #0\n\t"
  33850. /* a[i+46] += m[46] * mu */
  33851. "ldr r7, [%[m], #184]\n\t"
  33852. "ldr r10, [%[a], #184]\n\t"
  33853. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33854. "lsr r11, r7, #16\n\t"
  33855. "lsr r6, r8, #16\n\t"
  33856. "mul r5, r6, r11\n\t"
  33857. "lsl r11, r7, #16\n\t"
  33858. "lsr r11, r11, #16\n\t"
  33859. "mul r6, r11, r6\n\t"
  33860. "lsr r11, r6, #16\n\t"
  33861. "lsl r6, r6, #16\n\t"
  33862. "adds r10, r10, r6\n\t"
  33863. "adc r5, r5, r11\n\t"
  33864. "lsl r6, r8, #16\n\t"
  33865. "lsl r11, r7, #16\n\t"
  33866. "lsr r6, r6, #16\n\t"
  33867. "lsr r11, r11, #16\n\t"
  33868. "mul r11, r6, r11\n\t"
  33869. "adds r10, r10, r11\n\t"
  33870. "adc r5, r5, #0\n\t"
  33871. "lsr r11, r7, #16\n\t"
  33872. "mul r6, r11, r6\n\t"
  33873. "lsr r11, r6, #16\n\t"
  33874. "lsl r6, r6, #16\n\t"
  33875. "adds r10, r10, r6\n\t"
  33876. "adc r5, r5, r11\n\t"
  33877. #else
  33878. "umull r6, r7, r8, r7\n\t"
  33879. "adds r10, r10, r6\n\t"
  33880. "adc r5, r7, #0\n\t"
  33881. #endif
  33882. "adds r10, r10, r4\n\t"
  33883. "str r10, [%[a], #184]\n\t"
  33884. "adc r5, r5, #0\n\t"
  33885. /* a[i+47] += m[47] * mu */
  33886. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  33887. "ldr r7, [%[m], #188]\n\t"
  33888. #else
  33889. "ldr r11, [%[m], #188]\n\t"
  33890. #endif
  33891. "ldr r10, [%[a], #188]\n\t"
  33892. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33893. "lsl r6, r8, #16\n\t"
  33894. "lsl r7, r11, #16\n\t"
  33895. "lsr r6, r6, #16\n\t"
  33896. "lsr r7, r7, #16\n\t"
  33897. "mul r7, r6, r7\n\t"
  33898. "adds r5, r5, r7\n\t"
  33899. "adcs r4, r3, #0\n\t"
  33900. "mov r3, #0\n\t"
  33901. "adc r3, r3, r3\n\t"
  33902. "lsr r7, r11, #16\n\t"
  33903. "mul r6, r7, r6\n\t"
  33904. "lsr r7, r6, #16\n\t"
  33905. "lsl r6, r6, #16\n\t"
  33906. "adds r5, r5, r6\n\t"
  33907. "adcs r4, r4, r7\n\t"
  33908. "adc r3, r3, #0\n\t"
  33909. "mov r6, r8\n\t"
  33910. "lsr r7, r11, #16\n\t"
  33911. "lsr r6, r6, #16\n\t"
  33912. "mul r7, r6, r7\n\t"
  33913. "adds r4, r4, r7\n\t"
  33914. "lsl r7, r11, #16\n\t"
  33915. "adc r3, r3, #0\n\t"
  33916. "lsr r7, r7, #16\n\t"
  33917. "mul r6, r7, r6\n\t"
  33918. "lsr r7, r6, #16\n\t"
  33919. "lsl r6, r6, #16\n\t"
  33920. "adds r5, r5, r6\n\t"
  33921. "adcs r4, r4, r7\n\t"
  33922. "adc r3, r3, #0\n\t"
  33923. #else
  33924. "umull r6, r7, r8, r7\n\t"
  33925. "adds r5, r5, r6\n\t"
  33926. "adcs r4, r7, r3\n\t"
  33927. "mov r3, #0\n\t"
  33928. "adc r3, r3, r3\n\t"
  33929. #endif
  33930. "adds r10, r10, r5\n\t"
  33931. "str r10, [%[a], #188]\n\t"
  33932. "ldr r10, [%[a], #192]\n\t"
  33933. "adcs r10, r10, r4\n\t"
  33934. "str r10, [%[a], #192]\n\t"
  33935. "adc r3, r3, #0\n\t"
  33936. /* i += 1 */
  33937. "add r9, r9, #4\n\t"
  33938. "add %[a], %[a], #4\n\t"
  33939. "cmp r9, #0xc0\n\t"
  33940. "blt L_sp_3072_mont_reduce_48_word_%=\n\t"
  33941. "str r12, [%[a]]\n\t"
  33942. "str lr, [%[a], #4]\n\t"
  33943. "mov %[mp], r3\n\t"
  33944. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  33945. :
  33946. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  33947. );
  33948. sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp);
  33949. }
  33950. /* Multiply two Montgomery form numbers mod the modulus (prime).
  33951. * (r = a * b mod m)
  33952. *
  33953. * r Result of multiplication.
  33954. * a First number to multiply in Montgomery form.
  33955. * b Second number to multiply in Montgomery form.
  33956. * m Modulus (prime).
  33957. * mp Montgomery mulitplier.
  33958. */
  33959. SP_NOINLINE static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a,
  33960. const sp_digit* b, const sp_digit* m, sp_digit mp)
  33961. {
  33962. sp_3072_mul_48(r, a, b);
  33963. sp_3072_mont_reduce_48(r, m, mp);
  33964. }
  33965. /* Square the Montgomery form number. (r = a * a mod m)
  33966. *
  33967. * r Result of squaring.
  33968. * a Number to square in Montgomery form.
  33969. * m Modulus (prime).
  33970. * mp Montgomery mulitplier.
  33971. */
  33972. SP_NOINLINE static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a,
  33973. const sp_digit* m, sp_digit mp)
  33974. {
  33975. sp_3072_sqr_48(r, a);
  33976. sp_3072_mont_reduce_48(r, m, mp);
  33977. }
  33978. #ifdef WOLFSSL_SP_SMALL
  33979. /* Mul a by digit b into r. (r = a * b)
  33980. *
  33981. * r A single precision integer.
  33982. * a A single precision integer.
  33983. * b A single precision digit.
  33984. */
  33985. static void sp_3072_mul_d_48(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  33986. {
  33987. register sp_digit* r asm ("r0") = r_p;
  33988. register const sp_digit* a asm ("r1") = a_p;
  33989. register sp_digit b asm ("r2") = b_p;
  33990. __asm__ __volatile__ (
  33991. "mov r10, #0\n\t"
  33992. /* A[0] * B */
  33993. "ldr r8, [%[a]]\n\t"
  33994. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  33995. "lsl r6, %[b], #16\n\t"
  33996. "lsl r5, r8, #16\n\t"
  33997. "lsr r6, r6, #16\n\t"
  33998. "lsr r5, r5, #16\n\t"
  33999. "mul r5, r6, r5\n\t"
  34000. "lsr r7, r8, #16\n\t"
  34001. "mul r6, r7, r6\n\t"
  34002. "lsr r3, r6, #16\n\t"
  34003. "lsl r6, r6, #16\n\t"
  34004. "adds r5, r5, r6\n\t"
  34005. "adc r3, r3, #0\n\t"
  34006. "lsr r6, %[b], #16\n\t"
  34007. "mul r7, r6, r7\n\t"
  34008. "add r3, r3, r7\n\t"
  34009. "lsl r7, r8, #16\n\t"
  34010. "lsr r7, r7, #16\n\t"
  34011. "mul r6, r7, r6\n\t"
  34012. "lsr r7, r6, #16\n\t"
  34013. "lsl r6, r6, #16\n\t"
  34014. "adds r5, r5, r6\n\t"
  34015. "adc r3, r3, r7\n\t"
  34016. #else
  34017. "umull r5, r3, %[b], r8\n\t"
  34018. #endif
  34019. "mov r4, #0\n\t"
  34020. "str r5, [%[r]]\n\t"
  34021. "mov r5, #0\n\t"
  34022. "mov r9, #4\n\t"
  34023. "\n"
  34024. "L_sp_3072_mul_d_48_word_%=: \n\t"
  34025. /* A[i] * B */
  34026. "ldr r8, [%[a], r9]\n\t"
  34027. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34028. "lsl r6, %[b], #16\n\t"
  34029. "lsl r7, r8, #16\n\t"
  34030. "lsr r6, r6, #16\n\t"
  34031. "lsr r7, r7, #16\n\t"
  34032. "mul r7, r6, r7\n\t"
  34033. "adds r3, r3, r7\n\t"
  34034. "adcs r4, r4, #0\n\t"
  34035. "adc r5, r5, #0\n\t"
  34036. "lsr r7, r8, #16\n\t"
  34037. "mul r6, r7, r6\n\t"
  34038. "lsr r7, r6, #16\n\t"
  34039. "lsl r6, r6, #16\n\t"
  34040. "adds r3, r3, r6\n\t"
  34041. "adcs r4, r4, r7\n\t"
  34042. "adc r5, r5, #0\n\t"
  34043. "lsr r6, %[b], #16\n\t"
  34044. "lsr r7, r8, #16\n\t"
  34045. "mul r7, r6, r7\n\t"
  34046. "adds r4, r4, r7\n\t"
  34047. "adc r5, r5, #0\n\t"
  34048. "lsl r7, r8, #16\n\t"
  34049. "lsr r7, r7, #16\n\t"
  34050. "mul r6, r7, r6\n\t"
  34051. "lsr r7, r6, #16\n\t"
  34052. "lsl r6, r6, #16\n\t"
  34053. "adds r3, r3, r6\n\t"
  34054. "adcs r4, r4, r7\n\t"
  34055. "adc r5, r5, #0\n\t"
  34056. #else
  34057. "umull r6, r7, %[b], r8\n\t"
  34058. "adds r3, r3, r6\n\t"
  34059. "adcs r4, r4, r7\n\t"
  34060. "adc r5, r5, #0\n\t"
  34061. #endif
  34062. "str r3, [%[r], r9]\n\t"
  34063. "mov r3, r4\n\t"
  34064. "mov r4, r5\n\t"
  34065. "mov r5, #0\n\t"
  34066. "add r9, r9, #4\n\t"
  34067. "cmp r9, #0xc0\n\t"
  34068. "blt L_sp_3072_mul_d_48_word_%=\n\t"
  34069. "str r3, [%[r], #192]\n\t"
  34070. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  34071. :
  34072. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  34073. );
  34074. }
  34075. #else
  34076. /* Mul a by digit b into r. (r = a * b)
  34077. *
  34078. * r A single precision integer.
  34079. * a A single precision integer.
  34080. * b A single precision digit.
  34081. */
  34082. static void sp_3072_mul_d_48(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  34083. {
  34084. register sp_digit* r asm ("r0") = r_p;
  34085. register const sp_digit* a asm ("r1") = a_p;
  34086. register sp_digit b asm ("r2") = b_p;
  34087. __asm__ __volatile__ (
  34088. "mov r10, #0\n\t"
  34089. /* A[0] * B */
  34090. "ldr r8, [%[a]], #4\n\t"
  34091. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34092. "lsl r6, %[b], #16\n\t"
  34093. "lsl r3, r8, #16\n\t"
  34094. "lsr r6, r6, #16\n\t"
  34095. "lsr r3, r3, #16\n\t"
  34096. "mul r3, r6, r3\n\t"
  34097. "lsr r7, r8, #16\n\t"
  34098. "mul r6, r7, r6\n\t"
  34099. "lsr r4, r6, #16\n\t"
  34100. "lsl r6, r6, #16\n\t"
  34101. "adds r3, r3, r6\n\t"
  34102. "adc r4, r4, #0\n\t"
  34103. "lsr r6, %[b], #16\n\t"
  34104. "mul r7, r6, r7\n\t"
  34105. "add r4, r4, r7\n\t"
  34106. "lsl r7, r8, #16\n\t"
  34107. "lsr r7, r7, #16\n\t"
  34108. "mul r6, r7, r6\n\t"
  34109. "lsr r7, r6, #16\n\t"
  34110. "lsl r6, r6, #16\n\t"
  34111. "adds r3, r3, r6\n\t"
  34112. "adc r4, r4, r7\n\t"
  34113. #else
  34114. "umull r3, r4, %[b], r8\n\t"
  34115. #endif
  34116. "mov r5, #0\n\t"
  34117. "str r3, [%[r]], #4\n\t"
  34118. /* A[1] * B */
  34119. "ldr r8, [%[a]], #4\n\t"
  34120. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34121. "lsl r6, %[b], #16\n\t"
  34122. "lsl r7, r8, #16\n\t"
  34123. "lsr r6, r6, #16\n\t"
  34124. "lsr r7, r7, #16\n\t"
  34125. "mul r7, r6, r7\n\t"
  34126. "adds r4, r4, r7\n\t"
  34127. "adcs r5, r5, #0\n\t"
  34128. "mov r3, #0\n\t"
  34129. "adc r3, r3, #0\n\t"
  34130. "lsr r7, r8, #16\n\t"
  34131. "mul r6, r7, r6\n\t"
  34132. "lsr r7, r6, #16\n\t"
  34133. "lsl r6, r6, #16\n\t"
  34134. "adds r4, r4, r6\n\t"
  34135. "adcs r5, r5, r7\n\t"
  34136. "adc r3, r3, #0\n\t"
  34137. "lsr r6, %[b], #16\n\t"
  34138. "lsr r7, r8, #16\n\t"
  34139. "mul r7, r6, r7\n\t"
  34140. "adds r5, r5, r7\n\t"
  34141. "adc r3, r3, #0\n\t"
  34142. "lsl r7, r8, #16\n\t"
  34143. "lsr r7, r7, #16\n\t"
  34144. "mul r6, r7, r6\n\t"
  34145. "lsr r7, r6, #16\n\t"
  34146. "lsl r6, r6, #16\n\t"
  34147. "adds r4, r4, r6\n\t"
  34148. "adcs r5, r5, r7\n\t"
  34149. "adc r3, r3, #0\n\t"
  34150. #else
  34151. "umull r6, r7, %[b], r8\n\t"
  34152. "adds r4, r4, r6\n\t"
  34153. "adcs r5, r5, r7\n\t"
  34154. "mov r3, #0\n\t"
  34155. "adc r3, r3, #0\n\t"
  34156. #endif
  34157. "str r4, [%[r]], #4\n\t"
  34158. /* A[2] * B */
  34159. "ldr r8, [%[a]], #4\n\t"
  34160. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34161. "lsl r6, %[b], #16\n\t"
  34162. "lsl r7, r8, #16\n\t"
  34163. "lsr r6, r6, #16\n\t"
  34164. "lsr r7, r7, #16\n\t"
  34165. "mul r7, r6, r7\n\t"
  34166. "adds r5, r5, r7\n\t"
  34167. "adcs r3, r3, #0\n\t"
  34168. "mov r4, #0\n\t"
  34169. "adc r4, r4, #0\n\t"
  34170. "lsr r7, r8, #16\n\t"
  34171. "mul r6, r7, r6\n\t"
  34172. "lsr r7, r6, #16\n\t"
  34173. "lsl r6, r6, #16\n\t"
  34174. "adds r5, r5, r6\n\t"
  34175. "adcs r3, r3, r7\n\t"
  34176. "adc r4, r4, #0\n\t"
  34177. "lsr r6, %[b], #16\n\t"
  34178. "lsr r7, r8, #16\n\t"
  34179. "mul r7, r6, r7\n\t"
  34180. "adds r3, r3, r7\n\t"
  34181. "adc r4, r4, #0\n\t"
  34182. "lsl r7, r8, #16\n\t"
  34183. "lsr r7, r7, #16\n\t"
  34184. "mul r6, r7, r6\n\t"
  34185. "lsr r7, r6, #16\n\t"
  34186. "lsl r6, r6, #16\n\t"
  34187. "adds r5, r5, r6\n\t"
  34188. "adcs r3, r3, r7\n\t"
  34189. "adc r4, r4, #0\n\t"
  34190. #else
  34191. "umull r6, r7, %[b], r8\n\t"
  34192. "adds r5, r5, r6\n\t"
  34193. "adcs r3, r3, r7\n\t"
  34194. "mov r4, #0\n\t"
  34195. "adc r4, r4, #0\n\t"
  34196. #endif
  34197. "str r5, [%[r]], #4\n\t"
  34198. /* A[3] * B */
  34199. "ldr r8, [%[a]], #4\n\t"
  34200. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34201. "lsl r6, %[b], #16\n\t"
  34202. "lsl r7, r8, #16\n\t"
  34203. "lsr r6, r6, #16\n\t"
  34204. "lsr r7, r7, #16\n\t"
  34205. "mul r7, r6, r7\n\t"
  34206. "adds r3, r3, r7\n\t"
  34207. "adcs r4, r4, #0\n\t"
  34208. "mov r5, #0\n\t"
  34209. "adc r5, r5, #0\n\t"
  34210. "lsr r7, r8, #16\n\t"
  34211. "mul r6, r7, r6\n\t"
  34212. "lsr r7, r6, #16\n\t"
  34213. "lsl r6, r6, #16\n\t"
  34214. "adds r3, r3, r6\n\t"
  34215. "adcs r4, r4, r7\n\t"
  34216. "adc r5, r5, #0\n\t"
  34217. "lsr r6, %[b], #16\n\t"
  34218. "lsr r7, r8, #16\n\t"
  34219. "mul r7, r6, r7\n\t"
  34220. "adds r4, r4, r7\n\t"
  34221. "adc r5, r5, #0\n\t"
  34222. "lsl r7, r8, #16\n\t"
  34223. "lsr r7, r7, #16\n\t"
  34224. "mul r6, r7, r6\n\t"
  34225. "lsr r7, r6, #16\n\t"
  34226. "lsl r6, r6, #16\n\t"
  34227. "adds r3, r3, r6\n\t"
  34228. "adcs r4, r4, r7\n\t"
  34229. "adc r5, r5, #0\n\t"
  34230. #else
  34231. "umull r6, r7, %[b], r8\n\t"
  34232. "adds r3, r3, r6\n\t"
  34233. "adcs r4, r4, r7\n\t"
  34234. "mov r5, #0\n\t"
  34235. "adc r5, r5, #0\n\t"
  34236. #endif
  34237. "str r3, [%[r]], #4\n\t"
  34238. /* A[4] * B */
  34239. "ldr r8, [%[a]], #4\n\t"
  34240. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34241. "lsl r6, %[b], #16\n\t"
  34242. "lsl r7, r8, #16\n\t"
  34243. "lsr r6, r6, #16\n\t"
  34244. "lsr r7, r7, #16\n\t"
  34245. "mul r7, r6, r7\n\t"
  34246. "adds r4, r4, r7\n\t"
  34247. "adcs r5, r5, #0\n\t"
  34248. "mov r3, #0\n\t"
  34249. "adc r3, r3, #0\n\t"
  34250. "lsr r7, r8, #16\n\t"
  34251. "mul r6, r7, r6\n\t"
  34252. "lsr r7, r6, #16\n\t"
  34253. "lsl r6, r6, #16\n\t"
  34254. "adds r4, r4, r6\n\t"
  34255. "adcs r5, r5, r7\n\t"
  34256. "adc r3, r3, #0\n\t"
  34257. "lsr r6, %[b], #16\n\t"
  34258. "lsr r7, r8, #16\n\t"
  34259. "mul r7, r6, r7\n\t"
  34260. "adds r5, r5, r7\n\t"
  34261. "adc r3, r3, #0\n\t"
  34262. "lsl r7, r8, #16\n\t"
  34263. "lsr r7, r7, #16\n\t"
  34264. "mul r6, r7, r6\n\t"
  34265. "lsr r7, r6, #16\n\t"
  34266. "lsl r6, r6, #16\n\t"
  34267. "adds r4, r4, r6\n\t"
  34268. "adcs r5, r5, r7\n\t"
  34269. "adc r3, r3, #0\n\t"
  34270. #else
  34271. "umull r6, r7, %[b], r8\n\t"
  34272. "adds r4, r4, r6\n\t"
  34273. "adcs r5, r5, r7\n\t"
  34274. "mov r3, #0\n\t"
  34275. "adc r3, r3, #0\n\t"
  34276. #endif
  34277. "str r4, [%[r]], #4\n\t"
  34278. /* A[5] * B */
  34279. "ldr r8, [%[a]], #4\n\t"
  34280. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34281. "lsl r6, %[b], #16\n\t"
  34282. "lsl r7, r8, #16\n\t"
  34283. "lsr r6, r6, #16\n\t"
  34284. "lsr r7, r7, #16\n\t"
  34285. "mul r7, r6, r7\n\t"
  34286. "adds r5, r5, r7\n\t"
  34287. "adcs r3, r3, #0\n\t"
  34288. "mov r4, #0\n\t"
  34289. "adc r4, r4, #0\n\t"
  34290. "lsr r7, r8, #16\n\t"
  34291. "mul r6, r7, r6\n\t"
  34292. "lsr r7, r6, #16\n\t"
  34293. "lsl r6, r6, #16\n\t"
  34294. "adds r5, r5, r6\n\t"
  34295. "adcs r3, r3, r7\n\t"
  34296. "adc r4, r4, #0\n\t"
  34297. "lsr r6, %[b], #16\n\t"
  34298. "lsr r7, r8, #16\n\t"
  34299. "mul r7, r6, r7\n\t"
  34300. "adds r3, r3, r7\n\t"
  34301. "adc r4, r4, #0\n\t"
  34302. "lsl r7, r8, #16\n\t"
  34303. "lsr r7, r7, #16\n\t"
  34304. "mul r6, r7, r6\n\t"
  34305. "lsr r7, r6, #16\n\t"
  34306. "lsl r6, r6, #16\n\t"
  34307. "adds r5, r5, r6\n\t"
  34308. "adcs r3, r3, r7\n\t"
  34309. "adc r4, r4, #0\n\t"
  34310. #else
  34311. "umull r6, r7, %[b], r8\n\t"
  34312. "adds r5, r5, r6\n\t"
  34313. "adcs r3, r3, r7\n\t"
  34314. "mov r4, #0\n\t"
  34315. "adc r4, r4, #0\n\t"
  34316. #endif
  34317. "str r5, [%[r]], #4\n\t"
  34318. /* A[6] * B */
  34319. "ldr r8, [%[a]], #4\n\t"
  34320. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34321. "lsl r6, %[b], #16\n\t"
  34322. "lsl r7, r8, #16\n\t"
  34323. "lsr r6, r6, #16\n\t"
  34324. "lsr r7, r7, #16\n\t"
  34325. "mul r7, r6, r7\n\t"
  34326. "adds r3, r3, r7\n\t"
  34327. "adcs r4, r4, #0\n\t"
  34328. "mov r5, #0\n\t"
  34329. "adc r5, r5, #0\n\t"
  34330. "lsr r7, r8, #16\n\t"
  34331. "mul r6, r7, r6\n\t"
  34332. "lsr r7, r6, #16\n\t"
  34333. "lsl r6, r6, #16\n\t"
  34334. "adds r3, r3, r6\n\t"
  34335. "adcs r4, r4, r7\n\t"
  34336. "adc r5, r5, #0\n\t"
  34337. "lsr r6, %[b], #16\n\t"
  34338. "lsr r7, r8, #16\n\t"
  34339. "mul r7, r6, r7\n\t"
  34340. "adds r4, r4, r7\n\t"
  34341. "adc r5, r5, #0\n\t"
  34342. "lsl r7, r8, #16\n\t"
  34343. "lsr r7, r7, #16\n\t"
  34344. "mul r6, r7, r6\n\t"
  34345. "lsr r7, r6, #16\n\t"
  34346. "lsl r6, r6, #16\n\t"
  34347. "adds r3, r3, r6\n\t"
  34348. "adcs r4, r4, r7\n\t"
  34349. "adc r5, r5, #0\n\t"
  34350. #else
  34351. "umull r6, r7, %[b], r8\n\t"
  34352. "adds r3, r3, r6\n\t"
  34353. "adcs r4, r4, r7\n\t"
  34354. "mov r5, #0\n\t"
  34355. "adc r5, r5, #0\n\t"
  34356. #endif
  34357. "str r3, [%[r]], #4\n\t"
  34358. /* A[7] * B */
  34359. "ldr r8, [%[a]], #4\n\t"
  34360. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34361. "lsl r6, %[b], #16\n\t"
  34362. "lsl r7, r8, #16\n\t"
  34363. "lsr r6, r6, #16\n\t"
  34364. "lsr r7, r7, #16\n\t"
  34365. "mul r7, r6, r7\n\t"
  34366. "adds r4, r4, r7\n\t"
  34367. "adcs r5, r5, #0\n\t"
  34368. "mov r3, #0\n\t"
  34369. "adc r3, r3, #0\n\t"
  34370. "lsr r7, r8, #16\n\t"
  34371. "mul r6, r7, r6\n\t"
  34372. "lsr r7, r6, #16\n\t"
  34373. "lsl r6, r6, #16\n\t"
  34374. "adds r4, r4, r6\n\t"
  34375. "adcs r5, r5, r7\n\t"
  34376. "adc r3, r3, #0\n\t"
  34377. "lsr r6, %[b], #16\n\t"
  34378. "lsr r7, r8, #16\n\t"
  34379. "mul r7, r6, r7\n\t"
  34380. "adds r5, r5, r7\n\t"
  34381. "adc r3, r3, #0\n\t"
  34382. "lsl r7, r8, #16\n\t"
  34383. "lsr r7, r7, #16\n\t"
  34384. "mul r6, r7, r6\n\t"
  34385. "lsr r7, r6, #16\n\t"
  34386. "lsl r6, r6, #16\n\t"
  34387. "adds r4, r4, r6\n\t"
  34388. "adcs r5, r5, r7\n\t"
  34389. "adc r3, r3, #0\n\t"
  34390. #else
  34391. "umull r6, r7, %[b], r8\n\t"
  34392. "adds r4, r4, r6\n\t"
  34393. "adcs r5, r5, r7\n\t"
  34394. "mov r3, #0\n\t"
  34395. "adc r3, r3, #0\n\t"
  34396. #endif
  34397. "str r4, [%[r]], #4\n\t"
  34398. /* A[8] * B */
  34399. "ldr r8, [%[a]], #4\n\t"
  34400. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34401. "lsl r6, %[b], #16\n\t"
  34402. "lsl r7, r8, #16\n\t"
  34403. "lsr r6, r6, #16\n\t"
  34404. "lsr r7, r7, #16\n\t"
  34405. "mul r7, r6, r7\n\t"
  34406. "adds r5, r5, r7\n\t"
  34407. "adcs r3, r3, #0\n\t"
  34408. "mov r4, #0\n\t"
  34409. "adc r4, r4, #0\n\t"
  34410. "lsr r7, r8, #16\n\t"
  34411. "mul r6, r7, r6\n\t"
  34412. "lsr r7, r6, #16\n\t"
  34413. "lsl r6, r6, #16\n\t"
  34414. "adds r5, r5, r6\n\t"
  34415. "adcs r3, r3, r7\n\t"
  34416. "adc r4, r4, #0\n\t"
  34417. "lsr r6, %[b], #16\n\t"
  34418. "lsr r7, r8, #16\n\t"
  34419. "mul r7, r6, r7\n\t"
  34420. "adds r3, r3, r7\n\t"
  34421. "adc r4, r4, #0\n\t"
  34422. "lsl r7, r8, #16\n\t"
  34423. "lsr r7, r7, #16\n\t"
  34424. "mul r6, r7, r6\n\t"
  34425. "lsr r7, r6, #16\n\t"
  34426. "lsl r6, r6, #16\n\t"
  34427. "adds r5, r5, r6\n\t"
  34428. "adcs r3, r3, r7\n\t"
  34429. "adc r4, r4, #0\n\t"
  34430. #else
  34431. "umull r6, r7, %[b], r8\n\t"
  34432. "adds r5, r5, r6\n\t"
  34433. "adcs r3, r3, r7\n\t"
  34434. "mov r4, #0\n\t"
  34435. "adc r4, r4, #0\n\t"
  34436. #endif
  34437. "str r5, [%[r]], #4\n\t"
  34438. /* A[9] * B */
  34439. "ldr r8, [%[a]], #4\n\t"
  34440. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34441. "lsl r6, %[b], #16\n\t"
  34442. "lsl r7, r8, #16\n\t"
  34443. "lsr r6, r6, #16\n\t"
  34444. "lsr r7, r7, #16\n\t"
  34445. "mul r7, r6, r7\n\t"
  34446. "adds r3, r3, r7\n\t"
  34447. "adcs r4, r4, #0\n\t"
  34448. "mov r5, #0\n\t"
  34449. "adc r5, r5, #0\n\t"
  34450. "lsr r7, r8, #16\n\t"
  34451. "mul r6, r7, r6\n\t"
  34452. "lsr r7, r6, #16\n\t"
  34453. "lsl r6, r6, #16\n\t"
  34454. "adds r3, r3, r6\n\t"
  34455. "adcs r4, r4, r7\n\t"
  34456. "adc r5, r5, #0\n\t"
  34457. "lsr r6, %[b], #16\n\t"
  34458. "lsr r7, r8, #16\n\t"
  34459. "mul r7, r6, r7\n\t"
  34460. "adds r4, r4, r7\n\t"
  34461. "adc r5, r5, #0\n\t"
  34462. "lsl r7, r8, #16\n\t"
  34463. "lsr r7, r7, #16\n\t"
  34464. "mul r6, r7, r6\n\t"
  34465. "lsr r7, r6, #16\n\t"
  34466. "lsl r6, r6, #16\n\t"
  34467. "adds r3, r3, r6\n\t"
  34468. "adcs r4, r4, r7\n\t"
  34469. "adc r5, r5, #0\n\t"
  34470. #else
  34471. "umull r6, r7, %[b], r8\n\t"
  34472. "adds r3, r3, r6\n\t"
  34473. "adcs r4, r4, r7\n\t"
  34474. "mov r5, #0\n\t"
  34475. "adc r5, r5, #0\n\t"
  34476. #endif
  34477. "str r3, [%[r]], #4\n\t"
  34478. /* A[10] * B */
  34479. "ldr r8, [%[a]], #4\n\t"
  34480. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34481. "lsl r6, %[b], #16\n\t"
  34482. "lsl r7, r8, #16\n\t"
  34483. "lsr r6, r6, #16\n\t"
  34484. "lsr r7, r7, #16\n\t"
  34485. "mul r7, r6, r7\n\t"
  34486. "adds r4, r4, r7\n\t"
  34487. "adcs r5, r5, #0\n\t"
  34488. "mov r3, #0\n\t"
  34489. "adc r3, r3, #0\n\t"
  34490. "lsr r7, r8, #16\n\t"
  34491. "mul r6, r7, r6\n\t"
  34492. "lsr r7, r6, #16\n\t"
  34493. "lsl r6, r6, #16\n\t"
  34494. "adds r4, r4, r6\n\t"
  34495. "adcs r5, r5, r7\n\t"
  34496. "adc r3, r3, #0\n\t"
  34497. "lsr r6, %[b], #16\n\t"
  34498. "lsr r7, r8, #16\n\t"
  34499. "mul r7, r6, r7\n\t"
  34500. "adds r5, r5, r7\n\t"
  34501. "adc r3, r3, #0\n\t"
  34502. "lsl r7, r8, #16\n\t"
  34503. "lsr r7, r7, #16\n\t"
  34504. "mul r6, r7, r6\n\t"
  34505. "lsr r7, r6, #16\n\t"
  34506. "lsl r6, r6, #16\n\t"
  34507. "adds r4, r4, r6\n\t"
  34508. "adcs r5, r5, r7\n\t"
  34509. "adc r3, r3, #0\n\t"
  34510. #else
  34511. "umull r6, r7, %[b], r8\n\t"
  34512. "adds r4, r4, r6\n\t"
  34513. "adcs r5, r5, r7\n\t"
  34514. "mov r3, #0\n\t"
  34515. "adc r3, r3, #0\n\t"
  34516. #endif
  34517. "str r4, [%[r]], #4\n\t"
  34518. /* A[11] * B */
  34519. "ldr r8, [%[a]], #4\n\t"
  34520. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34521. "lsl r6, %[b], #16\n\t"
  34522. "lsl r7, r8, #16\n\t"
  34523. "lsr r6, r6, #16\n\t"
  34524. "lsr r7, r7, #16\n\t"
  34525. "mul r7, r6, r7\n\t"
  34526. "adds r5, r5, r7\n\t"
  34527. "adcs r3, r3, #0\n\t"
  34528. "mov r4, #0\n\t"
  34529. "adc r4, r4, #0\n\t"
  34530. "lsr r7, r8, #16\n\t"
  34531. "mul r6, r7, r6\n\t"
  34532. "lsr r7, r6, #16\n\t"
  34533. "lsl r6, r6, #16\n\t"
  34534. "adds r5, r5, r6\n\t"
  34535. "adcs r3, r3, r7\n\t"
  34536. "adc r4, r4, #0\n\t"
  34537. "lsr r6, %[b], #16\n\t"
  34538. "lsr r7, r8, #16\n\t"
  34539. "mul r7, r6, r7\n\t"
  34540. "adds r3, r3, r7\n\t"
  34541. "adc r4, r4, #0\n\t"
  34542. "lsl r7, r8, #16\n\t"
  34543. "lsr r7, r7, #16\n\t"
  34544. "mul r6, r7, r6\n\t"
  34545. "lsr r7, r6, #16\n\t"
  34546. "lsl r6, r6, #16\n\t"
  34547. "adds r5, r5, r6\n\t"
  34548. "adcs r3, r3, r7\n\t"
  34549. "adc r4, r4, #0\n\t"
  34550. #else
  34551. "umull r6, r7, %[b], r8\n\t"
  34552. "adds r5, r5, r6\n\t"
  34553. "adcs r3, r3, r7\n\t"
  34554. "mov r4, #0\n\t"
  34555. "adc r4, r4, #0\n\t"
  34556. #endif
  34557. "str r5, [%[r]], #4\n\t"
  34558. /* A[12] * B */
  34559. "ldr r8, [%[a]], #4\n\t"
  34560. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34561. "lsl r6, %[b], #16\n\t"
  34562. "lsl r7, r8, #16\n\t"
  34563. "lsr r6, r6, #16\n\t"
  34564. "lsr r7, r7, #16\n\t"
  34565. "mul r7, r6, r7\n\t"
  34566. "adds r3, r3, r7\n\t"
  34567. "adcs r4, r4, #0\n\t"
  34568. "mov r5, #0\n\t"
  34569. "adc r5, r5, #0\n\t"
  34570. "lsr r7, r8, #16\n\t"
  34571. "mul r6, r7, r6\n\t"
  34572. "lsr r7, r6, #16\n\t"
  34573. "lsl r6, r6, #16\n\t"
  34574. "adds r3, r3, r6\n\t"
  34575. "adcs r4, r4, r7\n\t"
  34576. "adc r5, r5, #0\n\t"
  34577. "lsr r6, %[b], #16\n\t"
  34578. "lsr r7, r8, #16\n\t"
  34579. "mul r7, r6, r7\n\t"
  34580. "adds r4, r4, r7\n\t"
  34581. "adc r5, r5, #0\n\t"
  34582. "lsl r7, r8, #16\n\t"
  34583. "lsr r7, r7, #16\n\t"
  34584. "mul r6, r7, r6\n\t"
  34585. "lsr r7, r6, #16\n\t"
  34586. "lsl r6, r6, #16\n\t"
  34587. "adds r3, r3, r6\n\t"
  34588. "adcs r4, r4, r7\n\t"
  34589. "adc r5, r5, #0\n\t"
  34590. #else
  34591. "umull r6, r7, %[b], r8\n\t"
  34592. "adds r3, r3, r6\n\t"
  34593. "adcs r4, r4, r7\n\t"
  34594. "mov r5, #0\n\t"
  34595. "adc r5, r5, #0\n\t"
  34596. #endif
  34597. "str r3, [%[r]], #4\n\t"
  34598. /* A[13] * B */
  34599. "ldr r8, [%[a]], #4\n\t"
  34600. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34601. "lsl r6, %[b], #16\n\t"
  34602. "lsl r7, r8, #16\n\t"
  34603. "lsr r6, r6, #16\n\t"
  34604. "lsr r7, r7, #16\n\t"
  34605. "mul r7, r6, r7\n\t"
  34606. "adds r4, r4, r7\n\t"
  34607. "adcs r5, r5, #0\n\t"
  34608. "mov r3, #0\n\t"
  34609. "adc r3, r3, #0\n\t"
  34610. "lsr r7, r8, #16\n\t"
  34611. "mul r6, r7, r6\n\t"
  34612. "lsr r7, r6, #16\n\t"
  34613. "lsl r6, r6, #16\n\t"
  34614. "adds r4, r4, r6\n\t"
  34615. "adcs r5, r5, r7\n\t"
  34616. "adc r3, r3, #0\n\t"
  34617. "lsr r6, %[b], #16\n\t"
  34618. "lsr r7, r8, #16\n\t"
  34619. "mul r7, r6, r7\n\t"
  34620. "adds r5, r5, r7\n\t"
  34621. "adc r3, r3, #0\n\t"
  34622. "lsl r7, r8, #16\n\t"
  34623. "lsr r7, r7, #16\n\t"
  34624. "mul r6, r7, r6\n\t"
  34625. "lsr r7, r6, #16\n\t"
  34626. "lsl r6, r6, #16\n\t"
  34627. "adds r4, r4, r6\n\t"
  34628. "adcs r5, r5, r7\n\t"
  34629. "adc r3, r3, #0\n\t"
  34630. #else
  34631. "umull r6, r7, %[b], r8\n\t"
  34632. "adds r4, r4, r6\n\t"
  34633. "adcs r5, r5, r7\n\t"
  34634. "mov r3, #0\n\t"
  34635. "adc r3, r3, #0\n\t"
  34636. #endif
  34637. "str r4, [%[r]], #4\n\t"
  34638. /* A[14] * B */
  34639. "ldr r8, [%[a]], #4\n\t"
  34640. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34641. "lsl r6, %[b], #16\n\t"
  34642. "lsl r7, r8, #16\n\t"
  34643. "lsr r6, r6, #16\n\t"
  34644. "lsr r7, r7, #16\n\t"
  34645. "mul r7, r6, r7\n\t"
  34646. "adds r5, r5, r7\n\t"
  34647. "adcs r3, r3, #0\n\t"
  34648. "mov r4, #0\n\t"
  34649. "adc r4, r4, #0\n\t"
  34650. "lsr r7, r8, #16\n\t"
  34651. "mul r6, r7, r6\n\t"
  34652. "lsr r7, r6, #16\n\t"
  34653. "lsl r6, r6, #16\n\t"
  34654. "adds r5, r5, r6\n\t"
  34655. "adcs r3, r3, r7\n\t"
  34656. "adc r4, r4, #0\n\t"
  34657. "lsr r6, %[b], #16\n\t"
  34658. "lsr r7, r8, #16\n\t"
  34659. "mul r7, r6, r7\n\t"
  34660. "adds r3, r3, r7\n\t"
  34661. "adc r4, r4, #0\n\t"
  34662. "lsl r7, r8, #16\n\t"
  34663. "lsr r7, r7, #16\n\t"
  34664. "mul r6, r7, r6\n\t"
  34665. "lsr r7, r6, #16\n\t"
  34666. "lsl r6, r6, #16\n\t"
  34667. "adds r5, r5, r6\n\t"
  34668. "adcs r3, r3, r7\n\t"
  34669. "adc r4, r4, #0\n\t"
  34670. #else
  34671. "umull r6, r7, %[b], r8\n\t"
  34672. "adds r5, r5, r6\n\t"
  34673. "adcs r3, r3, r7\n\t"
  34674. "mov r4, #0\n\t"
  34675. "adc r4, r4, #0\n\t"
  34676. #endif
  34677. "str r5, [%[r]], #4\n\t"
  34678. /* A[15] * B */
  34679. "ldr r8, [%[a]], #4\n\t"
  34680. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34681. "lsl r6, %[b], #16\n\t"
  34682. "lsl r7, r8, #16\n\t"
  34683. "lsr r6, r6, #16\n\t"
  34684. "lsr r7, r7, #16\n\t"
  34685. "mul r7, r6, r7\n\t"
  34686. "adds r3, r3, r7\n\t"
  34687. "adcs r4, r4, #0\n\t"
  34688. "mov r5, #0\n\t"
  34689. "adc r5, r5, #0\n\t"
  34690. "lsr r7, r8, #16\n\t"
  34691. "mul r6, r7, r6\n\t"
  34692. "lsr r7, r6, #16\n\t"
  34693. "lsl r6, r6, #16\n\t"
  34694. "adds r3, r3, r6\n\t"
  34695. "adcs r4, r4, r7\n\t"
  34696. "adc r5, r5, #0\n\t"
  34697. "lsr r6, %[b], #16\n\t"
  34698. "lsr r7, r8, #16\n\t"
  34699. "mul r7, r6, r7\n\t"
  34700. "adds r4, r4, r7\n\t"
  34701. "adc r5, r5, #0\n\t"
  34702. "lsl r7, r8, #16\n\t"
  34703. "lsr r7, r7, #16\n\t"
  34704. "mul r6, r7, r6\n\t"
  34705. "lsr r7, r6, #16\n\t"
  34706. "lsl r6, r6, #16\n\t"
  34707. "adds r3, r3, r6\n\t"
  34708. "adcs r4, r4, r7\n\t"
  34709. "adc r5, r5, #0\n\t"
  34710. #else
  34711. "umull r6, r7, %[b], r8\n\t"
  34712. "adds r3, r3, r6\n\t"
  34713. "adcs r4, r4, r7\n\t"
  34714. "mov r5, #0\n\t"
  34715. "adc r5, r5, #0\n\t"
  34716. #endif
  34717. "str r3, [%[r]], #4\n\t"
  34718. /* A[16] * B */
  34719. "ldr r8, [%[a]], #4\n\t"
  34720. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34721. "lsl r6, %[b], #16\n\t"
  34722. "lsl r7, r8, #16\n\t"
  34723. "lsr r6, r6, #16\n\t"
  34724. "lsr r7, r7, #16\n\t"
  34725. "mul r7, r6, r7\n\t"
  34726. "adds r4, r4, r7\n\t"
  34727. "adcs r5, r5, #0\n\t"
  34728. "mov r3, #0\n\t"
  34729. "adc r3, r3, #0\n\t"
  34730. "lsr r7, r8, #16\n\t"
  34731. "mul r6, r7, r6\n\t"
  34732. "lsr r7, r6, #16\n\t"
  34733. "lsl r6, r6, #16\n\t"
  34734. "adds r4, r4, r6\n\t"
  34735. "adcs r5, r5, r7\n\t"
  34736. "adc r3, r3, #0\n\t"
  34737. "lsr r6, %[b], #16\n\t"
  34738. "lsr r7, r8, #16\n\t"
  34739. "mul r7, r6, r7\n\t"
  34740. "adds r5, r5, r7\n\t"
  34741. "adc r3, r3, #0\n\t"
  34742. "lsl r7, r8, #16\n\t"
  34743. "lsr r7, r7, #16\n\t"
  34744. "mul r6, r7, r6\n\t"
  34745. "lsr r7, r6, #16\n\t"
  34746. "lsl r6, r6, #16\n\t"
  34747. "adds r4, r4, r6\n\t"
  34748. "adcs r5, r5, r7\n\t"
  34749. "adc r3, r3, #0\n\t"
  34750. #else
  34751. "umull r6, r7, %[b], r8\n\t"
  34752. "adds r4, r4, r6\n\t"
  34753. "adcs r5, r5, r7\n\t"
  34754. "mov r3, #0\n\t"
  34755. "adc r3, r3, #0\n\t"
  34756. #endif
  34757. "str r4, [%[r]], #4\n\t"
  34758. /* A[17] * B */
  34759. "ldr r8, [%[a]], #4\n\t"
  34760. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34761. "lsl r6, %[b], #16\n\t"
  34762. "lsl r7, r8, #16\n\t"
  34763. "lsr r6, r6, #16\n\t"
  34764. "lsr r7, r7, #16\n\t"
  34765. "mul r7, r6, r7\n\t"
  34766. "adds r5, r5, r7\n\t"
  34767. "adcs r3, r3, #0\n\t"
  34768. "mov r4, #0\n\t"
  34769. "adc r4, r4, #0\n\t"
  34770. "lsr r7, r8, #16\n\t"
  34771. "mul r6, r7, r6\n\t"
  34772. "lsr r7, r6, #16\n\t"
  34773. "lsl r6, r6, #16\n\t"
  34774. "adds r5, r5, r6\n\t"
  34775. "adcs r3, r3, r7\n\t"
  34776. "adc r4, r4, #0\n\t"
  34777. "lsr r6, %[b], #16\n\t"
  34778. "lsr r7, r8, #16\n\t"
  34779. "mul r7, r6, r7\n\t"
  34780. "adds r3, r3, r7\n\t"
  34781. "adc r4, r4, #0\n\t"
  34782. "lsl r7, r8, #16\n\t"
  34783. "lsr r7, r7, #16\n\t"
  34784. "mul r6, r7, r6\n\t"
  34785. "lsr r7, r6, #16\n\t"
  34786. "lsl r6, r6, #16\n\t"
  34787. "adds r5, r5, r6\n\t"
  34788. "adcs r3, r3, r7\n\t"
  34789. "adc r4, r4, #0\n\t"
  34790. #else
  34791. "umull r6, r7, %[b], r8\n\t"
  34792. "adds r5, r5, r6\n\t"
  34793. "adcs r3, r3, r7\n\t"
  34794. "mov r4, #0\n\t"
  34795. "adc r4, r4, #0\n\t"
  34796. #endif
  34797. "str r5, [%[r]], #4\n\t"
  34798. /* A[18] * B */
  34799. "ldr r8, [%[a]], #4\n\t"
  34800. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34801. "lsl r6, %[b], #16\n\t"
  34802. "lsl r7, r8, #16\n\t"
  34803. "lsr r6, r6, #16\n\t"
  34804. "lsr r7, r7, #16\n\t"
  34805. "mul r7, r6, r7\n\t"
  34806. "adds r3, r3, r7\n\t"
  34807. "adcs r4, r4, #0\n\t"
  34808. "mov r5, #0\n\t"
  34809. "adc r5, r5, #0\n\t"
  34810. "lsr r7, r8, #16\n\t"
  34811. "mul r6, r7, r6\n\t"
  34812. "lsr r7, r6, #16\n\t"
  34813. "lsl r6, r6, #16\n\t"
  34814. "adds r3, r3, r6\n\t"
  34815. "adcs r4, r4, r7\n\t"
  34816. "adc r5, r5, #0\n\t"
  34817. "lsr r6, %[b], #16\n\t"
  34818. "lsr r7, r8, #16\n\t"
  34819. "mul r7, r6, r7\n\t"
  34820. "adds r4, r4, r7\n\t"
  34821. "adc r5, r5, #0\n\t"
  34822. "lsl r7, r8, #16\n\t"
  34823. "lsr r7, r7, #16\n\t"
  34824. "mul r6, r7, r6\n\t"
  34825. "lsr r7, r6, #16\n\t"
  34826. "lsl r6, r6, #16\n\t"
  34827. "adds r3, r3, r6\n\t"
  34828. "adcs r4, r4, r7\n\t"
  34829. "adc r5, r5, #0\n\t"
  34830. #else
  34831. "umull r6, r7, %[b], r8\n\t"
  34832. "adds r3, r3, r6\n\t"
  34833. "adcs r4, r4, r7\n\t"
  34834. "mov r5, #0\n\t"
  34835. "adc r5, r5, #0\n\t"
  34836. #endif
  34837. "str r3, [%[r]], #4\n\t"
  34838. /* A[19] * B */
  34839. "ldr r8, [%[a]], #4\n\t"
  34840. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34841. "lsl r6, %[b], #16\n\t"
  34842. "lsl r7, r8, #16\n\t"
  34843. "lsr r6, r6, #16\n\t"
  34844. "lsr r7, r7, #16\n\t"
  34845. "mul r7, r6, r7\n\t"
  34846. "adds r4, r4, r7\n\t"
  34847. "adcs r5, r5, #0\n\t"
  34848. "mov r3, #0\n\t"
  34849. "adc r3, r3, #0\n\t"
  34850. "lsr r7, r8, #16\n\t"
  34851. "mul r6, r7, r6\n\t"
  34852. "lsr r7, r6, #16\n\t"
  34853. "lsl r6, r6, #16\n\t"
  34854. "adds r4, r4, r6\n\t"
  34855. "adcs r5, r5, r7\n\t"
  34856. "adc r3, r3, #0\n\t"
  34857. "lsr r6, %[b], #16\n\t"
  34858. "lsr r7, r8, #16\n\t"
  34859. "mul r7, r6, r7\n\t"
  34860. "adds r5, r5, r7\n\t"
  34861. "adc r3, r3, #0\n\t"
  34862. "lsl r7, r8, #16\n\t"
  34863. "lsr r7, r7, #16\n\t"
  34864. "mul r6, r7, r6\n\t"
  34865. "lsr r7, r6, #16\n\t"
  34866. "lsl r6, r6, #16\n\t"
  34867. "adds r4, r4, r6\n\t"
  34868. "adcs r5, r5, r7\n\t"
  34869. "adc r3, r3, #0\n\t"
  34870. #else
  34871. "umull r6, r7, %[b], r8\n\t"
  34872. "adds r4, r4, r6\n\t"
  34873. "adcs r5, r5, r7\n\t"
  34874. "mov r3, #0\n\t"
  34875. "adc r3, r3, #0\n\t"
  34876. #endif
  34877. "str r4, [%[r]], #4\n\t"
  34878. /* A[20] * B */
  34879. "ldr r8, [%[a]], #4\n\t"
  34880. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34881. "lsl r6, %[b], #16\n\t"
  34882. "lsl r7, r8, #16\n\t"
  34883. "lsr r6, r6, #16\n\t"
  34884. "lsr r7, r7, #16\n\t"
  34885. "mul r7, r6, r7\n\t"
  34886. "adds r5, r5, r7\n\t"
  34887. "adcs r3, r3, #0\n\t"
  34888. "mov r4, #0\n\t"
  34889. "adc r4, r4, #0\n\t"
  34890. "lsr r7, r8, #16\n\t"
  34891. "mul r6, r7, r6\n\t"
  34892. "lsr r7, r6, #16\n\t"
  34893. "lsl r6, r6, #16\n\t"
  34894. "adds r5, r5, r6\n\t"
  34895. "adcs r3, r3, r7\n\t"
  34896. "adc r4, r4, #0\n\t"
  34897. "lsr r6, %[b], #16\n\t"
  34898. "lsr r7, r8, #16\n\t"
  34899. "mul r7, r6, r7\n\t"
  34900. "adds r3, r3, r7\n\t"
  34901. "adc r4, r4, #0\n\t"
  34902. "lsl r7, r8, #16\n\t"
  34903. "lsr r7, r7, #16\n\t"
  34904. "mul r6, r7, r6\n\t"
  34905. "lsr r7, r6, #16\n\t"
  34906. "lsl r6, r6, #16\n\t"
  34907. "adds r5, r5, r6\n\t"
  34908. "adcs r3, r3, r7\n\t"
  34909. "adc r4, r4, #0\n\t"
  34910. #else
  34911. "umull r6, r7, %[b], r8\n\t"
  34912. "adds r5, r5, r6\n\t"
  34913. "adcs r3, r3, r7\n\t"
  34914. "mov r4, #0\n\t"
  34915. "adc r4, r4, #0\n\t"
  34916. #endif
  34917. "str r5, [%[r]], #4\n\t"
  34918. /* A[21] * B */
  34919. "ldr r8, [%[a]], #4\n\t"
  34920. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34921. "lsl r6, %[b], #16\n\t"
  34922. "lsl r7, r8, #16\n\t"
  34923. "lsr r6, r6, #16\n\t"
  34924. "lsr r7, r7, #16\n\t"
  34925. "mul r7, r6, r7\n\t"
  34926. "adds r3, r3, r7\n\t"
  34927. "adcs r4, r4, #0\n\t"
  34928. "mov r5, #0\n\t"
  34929. "adc r5, r5, #0\n\t"
  34930. "lsr r7, r8, #16\n\t"
  34931. "mul r6, r7, r6\n\t"
  34932. "lsr r7, r6, #16\n\t"
  34933. "lsl r6, r6, #16\n\t"
  34934. "adds r3, r3, r6\n\t"
  34935. "adcs r4, r4, r7\n\t"
  34936. "adc r5, r5, #0\n\t"
  34937. "lsr r6, %[b], #16\n\t"
  34938. "lsr r7, r8, #16\n\t"
  34939. "mul r7, r6, r7\n\t"
  34940. "adds r4, r4, r7\n\t"
  34941. "adc r5, r5, #0\n\t"
  34942. "lsl r7, r8, #16\n\t"
  34943. "lsr r7, r7, #16\n\t"
  34944. "mul r6, r7, r6\n\t"
  34945. "lsr r7, r6, #16\n\t"
  34946. "lsl r6, r6, #16\n\t"
  34947. "adds r3, r3, r6\n\t"
  34948. "adcs r4, r4, r7\n\t"
  34949. "adc r5, r5, #0\n\t"
  34950. #else
  34951. "umull r6, r7, %[b], r8\n\t"
  34952. "adds r3, r3, r6\n\t"
  34953. "adcs r4, r4, r7\n\t"
  34954. "mov r5, #0\n\t"
  34955. "adc r5, r5, #0\n\t"
  34956. #endif
  34957. "str r3, [%[r]], #4\n\t"
  34958. /* A[22] * B */
  34959. "ldr r8, [%[a]], #4\n\t"
  34960. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  34961. "lsl r6, %[b], #16\n\t"
  34962. "lsl r7, r8, #16\n\t"
  34963. "lsr r6, r6, #16\n\t"
  34964. "lsr r7, r7, #16\n\t"
  34965. "mul r7, r6, r7\n\t"
  34966. "adds r4, r4, r7\n\t"
  34967. "adcs r5, r5, #0\n\t"
  34968. "mov r3, #0\n\t"
  34969. "adc r3, r3, #0\n\t"
  34970. "lsr r7, r8, #16\n\t"
  34971. "mul r6, r7, r6\n\t"
  34972. "lsr r7, r6, #16\n\t"
  34973. "lsl r6, r6, #16\n\t"
  34974. "adds r4, r4, r6\n\t"
  34975. "adcs r5, r5, r7\n\t"
  34976. "adc r3, r3, #0\n\t"
  34977. "lsr r6, %[b], #16\n\t"
  34978. "lsr r7, r8, #16\n\t"
  34979. "mul r7, r6, r7\n\t"
  34980. "adds r5, r5, r7\n\t"
  34981. "adc r3, r3, #0\n\t"
  34982. "lsl r7, r8, #16\n\t"
  34983. "lsr r7, r7, #16\n\t"
  34984. "mul r6, r7, r6\n\t"
  34985. "lsr r7, r6, #16\n\t"
  34986. "lsl r6, r6, #16\n\t"
  34987. "adds r4, r4, r6\n\t"
  34988. "adcs r5, r5, r7\n\t"
  34989. "adc r3, r3, #0\n\t"
  34990. #else
  34991. "umull r6, r7, %[b], r8\n\t"
  34992. "adds r4, r4, r6\n\t"
  34993. "adcs r5, r5, r7\n\t"
  34994. "mov r3, #0\n\t"
  34995. "adc r3, r3, #0\n\t"
  34996. #endif
  34997. "str r4, [%[r]], #4\n\t"
  34998. /* A[23] * B */
  34999. "ldr r8, [%[a]], #4\n\t"
  35000. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35001. "lsl r6, %[b], #16\n\t"
  35002. "lsl r7, r8, #16\n\t"
  35003. "lsr r6, r6, #16\n\t"
  35004. "lsr r7, r7, #16\n\t"
  35005. "mul r7, r6, r7\n\t"
  35006. "adds r5, r5, r7\n\t"
  35007. "adcs r3, r3, #0\n\t"
  35008. "mov r4, #0\n\t"
  35009. "adc r4, r4, #0\n\t"
  35010. "lsr r7, r8, #16\n\t"
  35011. "mul r6, r7, r6\n\t"
  35012. "lsr r7, r6, #16\n\t"
  35013. "lsl r6, r6, #16\n\t"
  35014. "adds r5, r5, r6\n\t"
  35015. "adcs r3, r3, r7\n\t"
  35016. "adc r4, r4, #0\n\t"
  35017. "lsr r6, %[b], #16\n\t"
  35018. "lsr r7, r8, #16\n\t"
  35019. "mul r7, r6, r7\n\t"
  35020. "adds r3, r3, r7\n\t"
  35021. "adc r4, r4, #0\n\t"
  35022. "lsl r7, r8, #16\n\t"
  35023. "lsr r7, r7, #16\n\t"
  35024. "mul r6, r7, r6\n\t"
  35025. "lsr r7, r6, #16\n\t"
  35026. "lsl r6, r6, #16\n\t"
  35027. "adds r5, r5, r6\n\t"
  35028. "adcs r3, r3, r7\n\t"
  35029. "adc r4, r4, #0\n\t"
  35030. #else
  35031. "umull r6, r7, %[b], r8\n\t"
  35032. "adds r5, r5, r6\n\t"
  35033. "adcs r3, r3, r7\n\t"
  35034. "mov r4, #0\n\t"
  35035. "adc r4, r4, #0\n\t"
  35036. #endif
  35037. "str r5, [%[r]], #4\n\t"
  35038. /* A[24] * B */
  35039. "ldr r8, [%[a]], #4\n\t"
  35040. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35041. "lsl r6, %[b], #16\n\t"
  35042. "lsl r7, r8, #16\n\t"
  35043. "lsr r6, r6, #16\n\t"
  35044. "lsr r7, r7, #16\n\t"
  35045. "mul r7, r6, r7\n\t"
  35046. "adds r3, r3, r7\n\t"
  35047. "adcs r4, r4, #0\n\t"
  35048. "mov r5, #0\n\t"
  35049. "adc r5, r5, #0\n\t"
  35050. "lsr r7, r8, #16\n\t"
  35051. "mul r6, r7, r6\n\t"
  35052. "lsr r7, r6, #16\n\t"
  35053. "lsl r6, r6, #16\n\t"
  35054. "adds r3, r3, r6\n\t"
  35055. "adcs r4, r4, r7\n\t"
  35056. "adc r5, r5, #0\n\t"
  35057. "lsr r6, %[b], #16\n\t"
  35058. "lsr r7, r8, #16\n\t"
  35059. "mul r7, r6, r7\n\t"
  35060. "adds r4, r4, r7\n\t"
  35061. "adc r5, r5, #0\n\t"
  35062. "lsl r7, r8, #16\n\t"
  35063. "lsr r7, r7, #16\n\t"
  35064. "mul r6, r7, r6\n\t"
  35065. "lsr r7, r6, #16\n\t"
  35066. "lsl r6, r6, #16\n\t"
  35067. "adds r3, r3, r6\n\t"
  35068. "adcs r4, r4, r7\n\t"
  35069. "adc r5, r5, #0\n\t"
  35070. #else
  35071. "umull r6, r7, %[b], r8\n\t"
  35072. "adds r3, r3, r6\n\t"
  35073. "adcs r4, r4, r7\n\t"
  35074. "mov r5, #0\n\t"
  35075. "adc r5, r5, #0\n\t"
  35076. #endif
  35077. "str r3, [%[r]], #4\n\t"
  35078. /* A[25] * B */
  35079. "ldr r8, [%[a]], #4\n\t"
  35080. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35081. "lsl r6, %[b], #16\n\t"
  35082. "lsl r7, r8, #16\n\t"
  35083. "lsr r6, r6, #16\n\t"
  35084. "lsr r7, r7, #16\n\t"
  35085. "mul r7, r6, r7\n\t"
  35086. "adds r4, r4, r7\n\t"
  35087. "adcs r5, r5, #0\n\t"
  35088. "mov r3, #0\n\t"
  35089. "adc r3, r3, #0\n\t"
  35090. "lsr r7, r8, #16\n\t"
  35091. "mul r6, r7, r6\n\t"
  35092. "lsr r7, r6, #16\n\t"
  35093. "lsl r6, r6, #16\n\t"
  35094. "adds r4, r4, r6\n\t"
  35095. "adcs r5, r5, r7\n\t"
  35096. "adc r3, r3, #0\n\t"
  35097. "lsr r6, %[b], #16\n\t"
  35098. "lsr r7, r8, #16\n\t"
  35099. "mul r7, r6, r7\n\t"
  35100. "adds r5, r5, r7\n\t"
  35101. "adc r3, r3, #0\n\t"
  35102. "lsl r7, r8, #16\n\t"
  35103. "lsr r7, r7, #16\n\t"
  35104. "mul r6, r7, r6\n\t"
  35105. "lsr r7, r6, #16\n\t"
  35106. "lsl r6, r6, #16\n\t"
  35107. "adds r4, r4, r6\n\t"
  35108. "adcs r5, r5, r7\n\t"
  35109. "adc r3, r3, #0\n\t"
  35110. #else
  35111. "umull r6, r7, %[b], r8\n\t"
  35112. "adds r4, r4, r6\n\t"
  35113. "adcs r5, r5, r7\n\t"
  35114. "mov r3, #0\n\t"
  35115. "adc r3, r3, #0\n\t"
  35116. #endif
  35117. "str r4, [%[r]], #4\n\t"
  35118. /* A[26] * B */
  35119. "ldr r8, [%[a]], #4\n\t"
  35120. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35121. "lsl r6, %[b], #16\n\t"
  35122. "lsl r7, r8, #16\n\t"
  35123. "lsr r6, r6, #16\n\t"
  35124. "lsr r7, r7, #16\n\t"
  35125. "mul r7, r6, r7\n\t"
  35126. "adds r5, r5, r7\n\t"
  35127. "adcs r3, r3, #0\n\t"
  35128. "mov r4, #0\n\t"
  35129. "adc r4, r4, #0\n\t"
  35130. "lsr r7, r8, #16\n\t"
  35131. "mul r6, r7, r6\n\t"
  35132. "lsr r7, r6, #16\n\t"
  35133. "lsl r6, r6, #16\n\t"
  35134. "adds r5, r5, r6\n\t"
  35135. "adcs r3, r3, r7\n\t"
  35136. "adc r4, r4, #0\n\t"
  35137. "lsr r6, %[b], #16\n\t"
  35138. "lsr r7, r8, #16\n\t"
  35139. "mul r7, r6, r7\n\t"
  35140. "adds r3, r3, r7\n\t"
  35141. "adc r4, r4, #0\n\t"
  35142. "lsl r7, r8, #16\n\t"
  35143. "lsr r7, r7, #16\n\t"
  35144. "mul r6, r7, r6\n\t"
  35145. "lsr r7, r6, #16\n\t"
  35146. "lsl r6, r6, #16\n\t"
  35147. "adds r5, r5, r6\n\t"
  35148. "adcs r3, r3, r7\n\t"
  35149. "adc r4, r4, #0\n\t"
  35150. #else
  35151. "umull r6, r7, %[b], r8\n\t"
  35152. "adds r5, r5, r6\n\t"
  35153. "adcs r3, r3, r7\n\t"
  35154. "mov r4, #0\n\t"
  35155. "adc r4, r4, #0\n\t"
  35156. #endif
  35157. "str r5, [%[r]], #4\n\t"
  35158. /* A[27] * B */
  35159. "ldr r8, [%[a]], #4\n\t"
  35160. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35161. "lsl r6, %[b], #16\n\t"
  35162. "lsl r7, r8, #16\n\t"
  35163. "lsr r6, r6, #16\n\t"
  35164. "lsr r7, r7, #16\n\t"
  35165. "mul r7, r6, r7\n\t"
  35166. "adds r3, r3, r7\n\t"
  35167. "adcs r4, r4, #0\n\t"
  35168. "mov r5, #0\n\t"
  35169. "adc r5, r5, #0\n\t"
  35170. "lsr r7, r8, #16\n\t"
  35171. "mul r6, r7, r6\n\t"
  35172. "lsr r7, r6, #16\n\t"
  35173. "lsl r6, r6, #16\n\t"
  35174. "adds r3, r3, r6\n\t"
  35175. "adcs r4, r4, r7\n\t"
  35176. "adc r5, r5, #0\n\t"
  35177. "lsr r6, %[b], #16\n\t"
  35178. "lsr r7, r8, #16\n\t"
  35179. "mul r7, r6, r7\n\t"
  35180. "adds r4, r4, r7\n\t"
  35181. "adc r5, r5, #0\n\t"
  35182. "lsl r7, r8, #16\n\t"
  35183. "lsr r7, r7, #16\n\t"
  35184. "mul r6, r7, r6\n\t"
  35185. "lsr r7, r6, #16\n\t"
  35186. "lsl r6, r6, #16\n\t"
  35187. "adds r3, r3, r6\n\t"
  35188. "adcs r4, r4, r7\n\t"
  35189. "adc r5, r5, #0\n\t"
  35190. #else
  35191. "umull r6, r7, %[b], r8\n\t"
  35192. "adds r3, r3, r6\n\t"
  35193. "adcs r4, r4, r7\n\t"
  35194. "mov r5, #0\n\t"
  35195. "adc r5, r5, #0\n\t"
  35196. #endif
  35197. "str r3, [%[r]], #4\n\t"
  35198. /* A[28] * B */
  35199. "ldr r8, [%[a]], #4\n\t"
  35200. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35201. "lsl r6, %[b], #16\n\t"
  35202. "lsl r7, r8, #16\n\t"
  35203. "lsr r6, r6, #16\n\t"
  35204. "lsr r7, r7, #16\n\t"
  35205. "mul r7, r6, r7\n\t"
  35206. "adds r4, r4, r7\n\t"
  35207. "adcs r5, r5, #0\n\t"
  35208. "mov r3, #0\n\t"
  35209. "adc r3, r3, #0\n\t"
  35210. "lsr r7, r8, #16\n\t"
  35211. "mul r6, r7, r6\n\t"
  35212. "lsr r7, r6, #16\n\t"
  35213. "lsl r6, r6, #16\n\t"
  35214. "adds r4, r4, r6\n\t"
  35215. "adcs r5, r5, r7\n\t"
  35216. "adc r3, r3, #0\n\t"
  35217. "lsr r6, %[b], #16\n\t"
  35218. "lsr r7, r8, #16\n\t"
  35219. "mul r7, r6, r7\n\t"
  35220. "adds r5, r5, r7\n\t"
  35221. "adc r3, r3, #0\n\t"
  35222. "lsl r7, r8, #16\n\t"
  35223. "lsr r7, r7, #16\n\t"
  35224. "mul r6, r7, r6\n\t"
  35225. "lsr r7, r6, #16\n\t"
  35226. "lsl r6, r6, #16\n\t"
  35227. "adds r4, r4, r6\n\t"
  35228. "adcs r5, r5, r7\n\t"
  35229. "adc r3, r3, #0\n\t"
  35230. #else
  35231. "umull r6, r7, %[b], r8\n\t"
  35232. "adds r4, r4, r6\n\t"
  35233. "adcs r5, r5, r7\n\t"
  35234. "mov r3, #0\n\t"
  35235. "adc r3, r3, #0\n\t"
  35236. #endif
  35237. "str r4, [%[r]], #4\n\t"
  35238. /* A[29] * B */
  35239. "ldr r8, [%[a]], #4\n\t"
  35240. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35241. "lsl r6, %[b], #16\n\t"
  35242. "lsl r7, r8, #16\n\t"
  35243. "lsr r6, r6, #16\n\t"
  35244. "lsr r7, r7, #16\n\t"
  35245. "mul r7, r6, r7\n\t"
  35246. "adds r5, r5, r7\n\t"
  35247. "adcs r3, r3, #0\n\t"
  35248. "mov r4, #0\n\t"
  35249. "adc r4, r4, #0\n\t"
  35250. "lsr r7, r8, #16\n\t"
  35251. "mul r6, r7, r6\n\t"
  35252. "lsr r7, r6, #16\n\t"
  35253. "lsl r6, r6, #16\n\t"
  35254. "adds r5, r5, r6\n\t"
  35255. "adcs r3, r3, r7\n\t"
  35256. "adc r4, r4, #0\n\t"
  35257. "lsr r6, %[b], #16\n\t"
  35258. "lsr r7, r8, #16\n\t"
  35259. "mul r7, r6, r7\n\t"
  35260. "adds r3, r3, r7\n\t"
  35261. "adc r4, r4, #0\n\t"
  35262. "lsl r7, r8, #16\n\t"
  35263. "lsr r7, r7, #16\n\t"
  35264. "mul r6, r7, r6\n\t"
  35265. "lsr r7, r6, #16\n\t"
  35266. "lsl r6, r6, #16\n\t"
  35267. "adds r5, r5, r6\n\t"
  35268. "adcs r3, r3, r7\n\t"
  35269. "adc r4, r4, #0\n\t"
  35270. #else
  35271. "umull r6, r7, %[b], r8\n\t"
  35272. "adds r5, r5, r6\n\t"
  35273. "adcs r3, r3, r7\n\t"
  35274. "mov r4, #0\n\t"
  35275. "adc r4, r4, #0\n\t"
  35276. #endif
  35277. "str r5, [%[r]], #4\n\t"
  35278. /* A[30] * B */
  35279. "ldr r8, [%[a]], #4\n\t"
  35280. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35281. "lsl r6, %[b], #16\n\t"
  35282. "lsl r7, r8, #16\n\t"
  35283. "lsr r6, r6, #16\n\t"
  35284. "lsr r7, r7, #16\n\t"
  35285. "mul r7, r6, r7\n\t"
  35286. "adds r3, r3, r7\n\t"
  35287. "adcs r4, r4, #0\n\t"
  35288. "mov r5, #0\n\t"
  35289. "adc r5, r5, #0\n\t"
  35290. "lsr r7, r8, #16\n\t"
  35291. "mul r6, r7, r6\n\t"
  35292. "lsr r7, r6, #16\n\t"
  35293. "lsl r6, r6, #16\n\t"
  35294. "adds r3, r3, r6\n\t"
  35295. "adcs r4, r4, r7\n\t"
  35296. "adc r5, r5, #0\n\t"
  35297. "lsr r6, %[b], #16\n\t"
  35298. "lsr r7, r8, #16\n\t"
  35299. "mul r7, r6, r7\n\t"
  35300. "adds r4, r4, r7\n\t"
  35301. "adc r5, r5, #0\n\t"
  35302. "lsl r7, r8, #16\n\t"
  35303. "lsr r7, r7, #16\n\t"
  35304. "mul r6, r7, r6\n\t"
  35305. "lsr r7, r6, #16\n\t"
  35306. "lsl r6, r6, #16\n\t"
  35307. "adds r3, r3, r6\n\t"
  35308. "adcs r4, r4, r7\n\t"
  35309. "adc r5, r5, #0\n\t"
  35310. #else
  35311. "umull r6, r7, %[b], r8\n\t"
  35312. "adds r3, r3, r6\n\t"
  35313. "adcs r4, r4, r7\n\t"
  35314. "mov r5, #0\n\t"
  35315. "adc r5, r5, #0\n\t"
  35316. #endif
  35317. "str r3, [%[r]], #4\n\t"
  35318. /* A[31] * B */
  35319. "ldr r8, [%[a]], #4\n\t"
  35320. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35321. "lsl r6, %[b], #16\n\t"
  35322. "lsl r7, r8, #16\n\t"
  35323. "lsr r6, r6, #16\n\t"
  35324. "lsr r7, r7, #16\n\t"
  35325. "mul r7, r6, r7\n\t"
  35326. "adds r4, r4, r7\n\t"
  35327. "adcs r5, r5, #0\n\t"
  35328. "mov r3, #0\n\t"
  35329. "adc r3, r3, #0\n\t"
  35330. "lsr r7, r8, #16\n\t"
  35331. "mul r6, r7, r6\n\t"
  35332. "lsr r7, r6, #16\n\t"
  35333. "lsl r6, r6, #16\n\t"
  35334. "adds r4, r4, r6\n\t"
  35335. "adcs r5, r5, r7\n\t"
  35336. "adc r3, r3, #0\n\t"
  35337. "lsr r6, %[b], #16\n\t"
  35338. "lsr r7, r8, #16\n\t"
  35339. "mul r7, r6, r7\n\t"
  35340. "adds r5, r5, r7\n\t"
  35341. "adc r3, r3, #0\n\t"
  35342. "lsl r7, r8, #16\n\t"
  35343. "lsr r7, r7, #16\n\t"
  35344. "mul r6, r7, r6\n\t"
  35345. "lsr r7, r6, #16\n\t"
  35346. "lsl r6, r6, #16\n\t"
  35347. "adds r4, r4, r6\n\t"
  35348. "adcs r5, r5, r7\n\t"
  35349. "adc r3, r3, #0\n\t"
  35350. #else
  35351. "umull r6, r7, %[b], r8\n\t"
  35352. "adds r4, r4, r6\n\t"
  35353. "adcs r5, r5, r7\n\t"
  35354. "mov r3, #0\n\t"
  35355. "adc r3, r3, #0\n\t"
  35356. #endif
  35357. "str r4, [%[r]], #4\n\t"
  35358. /* A[32] * B */
  35359. "ldr r8, [%[a]], #4\n\t"
  35360. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35361. "lsl r6, %[b], #16\n\t"
  35362. "lsl r7, r8, #16\n\t"
  35363. "lsr r6, r6, #16\n\t"
  35364. "lsr r7, r7, #16\n\t"
  35365. "mul r7, r6, r7\n\t"
  35366. "adds r5, r5, r7\n\t"
  35367. "adcs r3, r3, #0\n\t"
  35368. "mov r4, #0\n\t"
  35369. "adc r4, r4, #0\n\t"
  35370. "lsr r7, r8, #16\n\t"
  35371. "mul r6, r7, r6\n\t"
  35372. "lsr r7, r6, #16\n\t"
  35373. "lsl r6, r6, #16\n\t"
  35374. "adds r5, r5, r6\n\t"
  35375. "adcs r3, r3, r7\n\t"
  35376. "adc r4, r4, #0\n\t"
  35377. "lsr r6, %[b], #16\n\t"
  35378. "lsr r7, r8, #16\n\t"
  35379. "mul r7, r6, r7\n\t"
  35380. "adds r3, r3, r7\n\t"
  35381. "adc r4, r4, #0\n\t"
  35382. "lsl r7, r8, #16\n\t"
  35383. "lsr r7, r7, #16\n\t"
  35384. "mul r6, r7, r6\n\t"
  35385. "lsr r7, r6, #16\n\t"
  35386. "lsl r6, r6, #16\n\t"
  35387. "adds r5, r5, r6\n\t"
  35388. "adcs r3, r3, r7\n\t"
  35389. "adc r4, r4, #0\n\t"
  35390. #else
  35391. "umull r6, r7, %[b], r8\n\t"
  35392. "adds r5, r5, r6\n\t"
  35393. "adcs r3, r3, r7\n\t"
  35394. "mov r4, #0\n\t"
  35395. "adc r4, r4, #0\n\t"
  35396. #endif
  35397. "str r5, [%[r]], #4\n\t"
  35398. /* A[33] * B */
  35399. "ldr r8, [%[a]], #4\n\t"
  35400. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35401. "lsl r6, %[b], #16\n\t"
  35402. "lsl r7, r8, #16\n\t"
  35403. "lsr r6, r6, #16\n\t"
  35404. "lsr r7, r7, #16\n\t"
  35405. "mul r7, r6, r7\n\t"
  35406. "adds r3, r3, r7\n\t"
  35407. "adcs r4, r4, #0\n\t"
  35408. "mov r5, #0\n\t"
  35409. "adc r5, r5, #0\n\t"
  35410. "lsr r7, r8, #16\n\t"
  35411. "mul r6, r7, r6\n\t"
  35412. "lsr r7, r6, #16\n\t"
  35413. "lsl r6, r6, #16\n\t"
  35414. "adds r3, r3, r6\n\t"
  35415. "adcs r4, r4, r7\n\t"
  35416. "adc r5, r5, #0\n\t"
  35417. "lsr r6, %[b], #16\n\t"
  35418. "lsr r7, r8, #16\n\t"
  35419. "mul r7, r6, r7\n\t"
  35420. "adds r4, r4, r7\n\t"
  35421. "adc r5, r5, #0\n\t"
  35422. "lsl r7, r8, #16\n\t"
  35423. "lsr r7, r7, #16\n\t"
  35424. "mul r6, r7, r6\n\t"
  35425. "lsr r7, r6, #16\n\t"
  35426. "lsl r6, r6, #16\n\t"
  35427. "adds r3, r3, r6\n\t"
  35428. "adcs r4, r4, r7\n\t"
  35429. "adc r5, r5, #0\n\t"
  35430. #else
  35431. "umull r6, r7, %[b], r8\n\t"
  35432. "adds r3, r3, r6\n\t"
  35433. "adcs r4, r4, r7\n\t"
  35434. "mov r5, #0\n\t"
  35435. "adc r5, r5, #0\n\t"
  35436. #endif
  35437. "str r3, [%[r]], #4\n\t"
  35438. /* A[34] * B */
  35439. "ldr r8, [%[a]], #4\n\t"
  35440. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35441. "lsl r6, %[b], #16\n\t"
  35442. "lsl r7, r8, #16\n\t"
  35443. "lsr r6, r6, #16\n\t"
  35444. "lsr r7, r7, #16\n\t"
  35445. "mul r7, r6, r7\n\t"
  35446. "adds r4, r4, r7\n\t"
  35447. "adcs r5, r5, #0\n\t"
  35448. "mov r3, #0\n\t"
  35449. "adc r3, r3, #0\n\t"
  35450. "lsr r7, r8, #16\n\t"
  35451. "mul r6, r7, r6\n\t"
  35452. "lsr r7, r6, #16\n\t"
  35453. "lsl r6, r6, #16\n\t"
  35454. "adds r4, r4, r6\n\t"
  35455. "adcs r5, r5, r7\n\t"
  35456. "adc r3, r3, #0\n\t"
  35457. "lsr r6, %[b], #16\n\t"
  35458. "lsr r7, r8, #16\n\t"
  35459. "mul r7, r6, r7\n\t"
  35460. "adds r5, r5, r7\n\t"
  35461. "adc r3, r3, #0\n\t"
  35462. "lsl r7, r8, #16\n\t"
  35463. "lsr r7, r7, #16\n\t"
  35464. "mul r6, r7, r6\n\t"
  35465. "lsr r7, r6, #16\n\t"
  35466. "lsl r6, r6, #16\n\t"
  35467. "adds r4, r4, r6\n\t"
  35468. "adcs r5, r5, r7\n\t"
  35469. "adc r3, r3, #0\n\t"
  35470. #else
  35471. "umull r6, r7, %[b], r8\n\t"
  35472. "adds r4, r4, r6\n\t"
  35473. "adcs r5, r5, r7\n\t"
  35474. "mov r3, #0\n\t"
  35475. "adc r3, r3, #0\n\t"
  35476. #endif
  35477. "str r4, [%[r]], #4\n\t"
  35478. /* A[35] * B */
  35479. "ldr r8, [%[a]], #4\n\t"
  35480. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35481. "lsl r6, %[b], #16\n\t"
  35482. "lsl r7, r8, #16\n\t"
  35483. "lsr r6, r6, #16\n\t"
  35484. "lsr r7, r7, #16\n\t"
  35485. "mul r7, r6, r7\n\t"
  35486. "adds r5, r5, r7\n\t"
  35487. "adcs r3, r3, #0\n\t"
  35488. "mov r4, #0\n\t"
  35489. "adc r4, r4, #0\n\t"
  35490. "lsr r7, r8, #16\n\t"
  35491. "mul r6, r7, r6\n\t"
  35492. "lsr r7, r6, #16\n\t"
  35493. "lsl r6, r6, #16\n\t"
  35494. "adds r5, r5, r6\n\t"
  35495. "adcs r3, r3, r7\n\t"
  35496. "adc r4, r4, #0\n\t"
  35497. "lsr r6, %[b], #16\n\t"
  35498. "lsr r7, r8, #16\n\t"
  35499. "mul r7, r6, r7\n\t"
  35500. "adds r3, r3, r7\n\t"
  35501. "adc r4, r4, #0\n\t"
  35502. "lsl r7, r8, #16\n\t"
  35503. "lsr r7, r7, #16\n\t"
  35504. "mul r6, r7, r6\n\t"
  35505. "lsr r7, r6, #16\n\t"
  35506. "lsl r6, r6, #16\n\t"
  35507. "adds r5, r5, r6\n\t"
  35508. "adcs r3, r3, r7\n\t"
  35509. "adc r4, r4, #0\n\t"
  35510. #else
  35511. "umull r6, r7, %[b], r8\n\t"
  35512. "adds r5, r5, r6\n\t"
  35513. "adcs r3, r3, r7\n\t"
  35514. "mov r4, #0\n\t"
  35515. "adc r4, r4, #0\n\t"
  35516. #endif
  35517. "str r5, [%[r]], #4\n\t"
  35518. /* A[36] * B */
  35519. "ldr r8, [%[a]], #4\n\t"
  35520. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35521. "lsl r6, %[b], #16\n\t"
  35522. "lsl r7, r8, #16\n\t"
  35523. "lsr r6, r6, #16\n\t"
  35524. "lsr r7, r7, #16\n\t"
  35525. "mul r7, r6, r7\n\t"
  35526. "adds r3, r3, r7\n\t"
  35527. "adcs r4, r4, #0\n\t"
  35528. "mov r5, #0\n\t"
  35529. "adc r5, r5, #0\n\t"
  35530. "lsr r7, r8, #16\n\t"
  35531. "mul r6, r7, r6\n\t"
  35532. "lsr r7, r6, #16\n\t"
  35533. "lsl r6, r6, #16\n\t"
  35534. "adds r3, r3, r6\n\t"
  35535. "adcs r4, r4, r7\n\t"
  35536. "adc r5, r5, #0\n\t"
  35537. "lsr r6, %[b], #16\n\t"
  35538. "lsr r7, r8, #16\n\t"
  35539. "mul r7, r6, r7\n\t"
  35540. "adds r4, r4, r7\n\t"
  35541. "adc r5, r5, #0\n\t"
  35542. "lsl r7, r8, #16\n\t"
  35543. "lsr r7, r7, #16\n\t"
  35544. "mul r6, r7, r6\n\t"
  35545. "lsr r7, r6, #16\n\t"
  35546. "lsl r6, r6, #16\n\t"
  35547. "adds r3, r3, r6\n\t"
  35548. "adcs r4, r4, r7\n\t"
  35549. "adc r5, r5, #0\n\t"
  35550. #else
  35551. "umull r6, r7, %[b], r8\n\t"
  35552. "adds r3, r3, r6\n\t"
  35553. "adcs r4, r4, r7\n\t"
  35554. "mov r5, #0\n\t"
  35555. "adc r5, r5, #0\n\t"
  35556. #endif
  35557. "str r3, [%[r]], #4\n\t"
  35558. /* A[37] * B */
  35559. "ldr r8, [%[a]], #4\n\t"
  35560. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35561. "lsl r6, %[b], #16\n\t"
  35562. "lsl r7, r8, #16\n\t"
  35563. "lsr r6, r6, #16\n\t"
  35564. "lsr r7, r7, #16\n\t"
  35565. "mul r7, r6, r7\n\t"
  35566. "adds r4, r4, r7\n\t"
  35567. "adcs r5, r5, #0\n\t"
  35568. "mov r3, #0\n\t"
  35569. "adc r3, r3, #0\n\t"
  35570. "lsr r7, r8, #16\n\t"
  35571. "mul r6, r7, r6\n\t"
  35572. "lsr r7, r6, #16\n\t"
  35573. "lsl r6, r6, #16\n\t"
  35574. "adds r4, r4, r6\n\t"
  35575. "adcs r5, r5, r7\n\t"
  35576. "adc r3, r3, #0\n\t"
  35577. "lsr r6, %[b], #16\n\t"
  35578. "lsr r7, r8, #16\n\t"
  35579. "mul r7, r6, r7\n\t"
  35580. "adds r5, r5, r7\n\t"
  35581. "adc r3, r3, #0\n\t"
  35582. "lsl r7, r8, #16\n\t"
  35583. "lsr r7, r7, #16\n\t"
  35584. "mul r6, r7, r6\n\t"
  35585. "lsr r7, r6, #16\n\t"
  35586. "lsl r6, r6, #16\n\t"
  35587. "adds r4, r4, r6\n\t"
  35588. "adcs r5, r5, r7\n\t"
  35589. "adc r3, r3, #0\n\t"
  35590. #else
  35591. "umull r6, r7, %[b], r8\n\t"
  35592. "adds r4, r4, r6\n\t"
  35593. "adcs r5, r5, r7\n\t"
  35594. "mov r3, #0\n\t"
  35595. "adc r3, r3, #0\n\t"
  35596. #endif
  35597. "str r4, [%[r]], #4\n\t"
  35598. /* A[38] * B */
  35599. "ldr r8, [%[a]], #4\n\t"
  35600. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35601. "lsl r6, %[b], #16\n\t"
  35602. "lsl r7, r8, #16\n\t"
  35603. "lsr r6, r6, #16\n\t"
  35604. "lsr r7, r7, #16\n\t"
  35605. "mul r7, r6, r7\n\t"
  35606. "adds r5, r5, r7\n\t"
  35607. "adcs r3, r3, #0\n\t"
  35608. "mov r4, #0\n\t"
  35609. "adc r4, r4, #0\n\t"
  35610. "lsr r7, r8, #16\n\t"
  35611. "mul r6, r7, r6\n\t"
  35612. "lsr r7, r6, #16\n\t"
  35613. "lsl r6, r6, #16\n\t"
  35614. "adds r5, r5, r6\n\t"
  35615. "adcs r3, r3, r7\n\t"
  35616. "adc r4, r4, #0\n\t"
  35617. "lsr r6, %[b], #16\n\t"
  35618. "lsr r7, r8, #16\n\t"
  35619. "mul r7, r6, r7\n\t"
  35620. "adds r3, r3, r7\n\t"
  35621. "adc r4, r4, #0\n\t"
  35622. "lsl r7, r8, #16\n\t"
  35623. "lsr r7, r7, #16\n\t"
  35624. "mul r6, r7, r6\n\t"
  35625. "lsr r7, r6, #16\n\t"
  35626. "lsl r6, r6, #16\n\t"
  35627. "adds r5, r5, r6\n\t"
  35628. "adcs r3, r3, r7\n\t"
  35629. "adc r4, r4, #0\n\t"
  35630. #else
  35631. "umull r6, r7, %[b], r8\n\t"
  35632. "adds r5, r5, r6\n\t"
  35633. "adcs r3, r3, r7\n\t"
  35634. "mov r4, #0\n\t"
  35635. "adc r4, r4, #0\n\t"
  35636. #endif
  35637. "str r5, [%[r]], #4\n\t"
  35638. /* A[39] * B */
  35639. "ldr r8, [%[a]], #4\n\t"
  35640. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35641. "lsl r6, %[b], #16\n\t"
  35642. "lsl r7, r8, #16\n\t"
  35643. "lsr r6, r6, #16\n\t"
  35644. "lsr r7, r7, #16\n\t"
  35645. "mul r7, r6, r7\n\t"
  35646. "adds r3, r3, r7\n\t"
  35647. "adcs r4, r4, #0\n\t"
  35648. "mov r5, #0\n\t"
  35649. "adc r5, r5, #0\n\t"
  35650. "lsr r7, r8, #16\n\t"
  35651. "mul r6, r7, r6\n\t"
  35652. "lsr r7, r6, #16\n\t"
  35653. "lsl r6, r6, #16\n\t"
  35654. "adds r3, r3, r6\n\t"
  35655. "adcs r4, r4, r7\n\t"
  35656. "adc r5, r5, #0\n\t"
  35657. "lsr r6, %[b], #16\n\t"
  35658. "lsr r7, r8, #16\n\t"
  35659. "mul r7, r6, r7\n\t"
  35660. "adds r4, r4, r7\n\t"
  35661. "adc r5, r5, #0\n\t"
  35662. "lsl r7, r8, #16\n\t"
  35663. "lsr r7, r7, #16\n\t"
  35664. "mul r6, r7, r6\n\t"
  35665. "lsr r7, r6, #16\n\t"
  35666. "lsl r6, r6, #16\n\t"
  35667. "adds r3, r3, r6\n\t"
  35668. "adcs r4, r4, r7\n\t"
  35669. "adc r5, r5, #0\n\t"
  35670. #else
  35671. "umull r6, r7, %[b], r8\n\t"
  35672. "adds r3, r3, r6\n\t"
  35673. "adcs r4, r4, r7\n\t"
  35674. "mov r5, #0\n\t"
  35675. "adc r5, r5, #0\n\t"
  35676. #endif
  35677. "str r3, [%[r]], #4\n\t"
  35678. /* A[40] * B */
  35679. "ldr r8, [%[a]], #4\n\t"
  35680. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35681. "lsl r6, %[b], #16\n\t"
  35682. "lsl r7, r8, #16\n\t"
  35683. "lsr r6, r6, #16\n\t"
  35684. "lsr r7, r7, #16\n\t"
  35685. "mul r7, r6, r7\n\t"
  35686. "adds r4, r4, r7\n\t"
  35687. "adcs r5, r5, #0\n\t"
  35688. "mov r3, #0\n\t"
  35689. "adc r3, r3, #0\n\t"
  35690. "lsr r7, r8, #16\n\t"
  35691. "mul r6, r7, r6\n\t"
  35692. "lsr r7, r6, #16\n\t"
  35693. "lsl r6, r6, #16\n\t"
  35694. "adds r4, r4, r6\n\t"
  35695. "adcs r5, r5, r7\n\t"
  35696. "adc r3, r3, #0\n\t"
  35697. "lsr r6, %[b], #16\n\t"
  35698. "lsr r7, r8, #16\n\t"
  35699. "mul r7, r6, r7\n\t"
  35700. "adds r5, r5, r7\n\t"
  35701. "adc r3, r3, #0\n\t"
  35702. "lsl r7, r8, #16\n\t"
  35703. "lsr r7, r7, #16\n\t"
  35704. "mul r6, r7, r6\n\t"
  35705. "lsr r7, r6, #16\n\t"
  35706. "lsl r6, r6, #16\n\t"
  35707. "adds r4, r4, r6\n\t"
  35708. "adcs r5, r5, r7\n\t"
  35709. "adc r3, r3, #0\n\t"
  35710. #else
  35711. "umull r6, r7, %[b], r8\n\t"
  35712. "adds r4, r4, r6\n\t"
  35713. "adcs r5, r5, r7\n\t"
  35714. "mov r3, #0\n\t"
  35715. "adc r3, r3, #0\n\t"
  35716. #endif
  35717. "str r4, [%[r]], #4\n\t"
  35718. /* A[41] * B */
  35719. "ldr r8, [%[a]], #4\n\t"
  35720. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35721. "lsl r6, %[b], #16\n\t"
  35722. "lsl r7, r8, #16\n\t"
  35723. "lsr r6, r6, #16\n\t"
  35724. "lsr r7, r7, #16\n\t"
  35725. "mul r7, r6, r7\n\t"
  35726. "adds r5, r5, r7\n\t"
  35727. "adcs r3, r3, #0\n\t"
  35728. "mov r4, #0\n\t"
  35729. "adc r4, r4, #0\n\t"
  35730. "lsr r7, r8, #16\n\t"
  35731. "mul r6, r7, r6\n\t"
  35732. "lsr r7, r6, #16\n\t"
  35733. "lsl r6, r6, #16\n\t"
  35734. "adds r5, r5, r6\n\t"
  35735. "adcs r3, r3, r7\n\t"
  35736. "adc r4, r4, #0\n\t"
  35737. "lsr r6, %[b], #16\n\t"
  35738. "lsr r7, r8, #16\n\t"
  35739. "mul r7, r6, r7\n\t"
  35740. "adds r3, r3, r7\n\t"
  35741. "adc r4, r4, #0\n\t"
  35742. "lsl r7, r8, #16\n\t"
  35743. "lsr r7, r7, #16\n\t"
  35744. "mul r6, r7, r6\n\t"
  35745. "lsr r7, r6, #16\n\t"
  35746. "lsl r6, r6, #16\n\t"
  35747. "adds r5, r5, r6\n\t"
  35748. "adcs r3, r3, r7\n\t"
  35749. "adc r4, r4, #0\n\t"
  35750. #else
  35751. "umull r6, r7, %[b], r8\n\t"
  35752. "adds r5, r5, r6\n\t"
  35753. "adcs r3, r3, r7\n\t"
  35754. "mov r4, #0\n\t"
  35755. "adc r4, r4, #0\n\t"
  35756. #endif
  35757. "str r5, [%[r]], #4\n\t"
  35758. /* A[42] * B */
  35759. "ldr r8, [%[a]], #4\n\t"
  35760. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35761. "lsl r6, %[b], #16\n\t"
  35762. "lsl r7, r8, #16\n\t"
  35763. "lsr r6, r6, #16\n\t"
  35764. "lsr r7, r7, #16\n\t"
  35765. "mul r7, r6, r7\n\t"
  35766. "adds r3, r3, r7\n\t"
  35767. "adcs r4, r4, #0\n\t"
  35768. "mov r5, #0\n\t"
  35769. "adc r5, r5, #0\n\t"
  35770. "lsr r7, r8, #16\n\t"
  35771. "mul r6, r7, r6\n\t"
  35772. "lsr r7, r6, #16\n\t"
  35773. "lsl r6, r6, #16\n\t"
  35774. "adds r3, r3, r6\n\t"
  35775. "adcs r4, r4, r7\n\t"
  35776. "adc r5, r5, #0\n\t"
  35777. "lsr r6, %[b], #16\n\t"
  35778. "lsr r7, r8, #16\n\t"
  35779. "mul r7, r6, r7\n\t"
  35780. "adds r4, r4, r7\n\t"
  35781. "adc r5, r5, #0\n\t"
  35782. "lsl r7, r8, #16\n\t"
  35783. "lsr r7, r7, #16\n\t"
  35784. "mul r6, r7, r6\n\t"
  35785. "lsr r7, r6, #16\n\t"
  35786. "lsl r6, r6, #16\n\t"
  35787. "adds r3, r3, r6\n\t"
  35788. "adcs r4, r4, r7\n\t"
  35789. "adc r5, r5, #0\n\t"
  35790. #else
  35791. "umull r6, r7, %[b], r8\n\t"
  35792. "adds r3, r3, r6\n\t"
  35793. "adcs r4, r4, r7\n\t"
  35794. "mov r5, #0\n\t"
  35795. "adc r5, r5, #0\n\t"
  35796. #endif
  35797. "str r3, [%[r]], #4\n\t"
  35798. /* A[43] * B */
  35799. "ldr r8, [%[a]], #4\n\t"
  35800. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35801. "lsl r6, %[b], #16\n\t"
  35802. "lsl r7, r8, #16\n\t"
  35803. "lsr r6, r6, #16\n\t"
  35804. "lsr r7, r7, #16\n\t"
  35805. "mul r7, r6, r7\n\t"
  35806. "adds r4, r4, r7\n\t"
  35807. "adcs r5, r5, #0\n\t"
  35808. "mov r3, #0\n\t"
  35809. "adc r3, r3, #0\n\t"
  35810. "lsr r7, r8, #16\n\t"
  35811. "mul r6, r7, r6\n\t"
  35812. "lsr r7, r6, #16\n\t"
  35813. "lsl r6, r6, #16\n\t"
  35814. "adds r4, r4, r6\n\t"
  35815. "adcs r5, r5, r7\n\t"
  35816. "adc r3, r3, #0\n\t"
  35817. "lsr r6, %[b], #16\n\t"
  35818. "lsr r7, r8, #16\n\t"
  35819. "mul r7, r6, r7\n\t"
  35820. "adds r5, r5, r7\n\t"
  35821. "adc r3, r3, #0\n\t"
  35822. "lsl r7, r8, #16\n\t"
  35823. "lsr r7, r7, #16\n\t"
  35824. "mul r6, r7, r6\n\t"
  35825. "lsr r7, r6, #16\n\t"
  35826. "lsl r6, r6, #16\n\t"
  35827. "adds r4, r4, r6\n\t"
  35828. "adcs r5, r5, r7\n\t"
  35829. "adc r3, r3, #0\n\t"
  35830. #else
  35831. "umull r6, r7, %[b], r8\n\t"
  35832. "adds r4, r4, r6\n\t"
  35833. "adcs r5, r5, r7\n\t"
  35834. "mov r3, #0\n\t"
  35835. "adc r3, r3, #0\n\t"
  35836. #endif
  35837. "str r4, [%[r]], #4\n\t"
  35838. /* A[44] * B */
  35839. "ldr r8, [%[a]], #4\n\t"
  35840. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35841. "lsl r6, %[b], #16\n\t"
  35842. "lsl r7, r8, #16\n\t"
  35843. "lsr r6, r6, #16\n\t"
  35844. "lsr r7, r7, #16\n\t"
  35845. "mul r7, r6, r7\n\t"
  35846. "adds r5, r5, r7\n\t"
  35847. "adcs r3, r3, #0\n\t"
  35848. "mov r4, #0\n\t"
  35849. "adc r4, r4, #0\n\t"
  35850. "lsr r7, r8, #16\n\t"
  35851. "mul r6, r7, r6\n\t"
  35852. "lsr r7, r6, #16\n\t"
  35853. "lsl r6, r6, #16\n\t"
  35854. "adds r5, r5, r6\n\t"
  35855. "adcs r3, r3, r7\n\t"
  35856. "adc r4, r4, #0\n\t"
  35857. "lsr r6, %[b], #16\n\t"
  35858. "lsr r7, r8, #16\n\t"
  35859. "mul r7, r6, r7\n\t"
  35860. "adds r3, r3, r7\n\t"
  35861. "adc r4, r4, #0\n\t"
  35862. "lsl r7, r8, #16\n\t"
  35863. "lsr r7, r7, #16\n\t"
  35864. "mul r6, r7, r6\n\t"
  35865. "lsr r7, r6, #16\n\t"
  35866. "lsl r6, r6, #16\n\t"
  35867. "adds r5, r5, r6\n\t"
  35868. "adcs r3, r3, r7\n\t"
  35869. "adc r4, r4, #0\n\t"
  35870. #else
  35871. "umull r6, r7, %[b], r8\n\t"
  35872. "adds r5, r5, r6\n\t"
  35873. "adcs r3, r3, r7\n\t"
  35874. "mov r4, #0\n\t"
  35875. "adc r4, r4, #0\n\t"
  35876. #endif
  35877. "str r5, [%[r]], #4\n\t"
  35878. /* A[45] * B */
  35879. "ldr r8, [%[a]], #4\n\t"
  35880. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35881. "lsl r6, %[b], #16\n\t"
  35882. "lsl r7, r8, #16\n\t"
  35883. "lsr r6, r6, #16\n\t"
  35884. "lsr r7, r7, #16\n\t"
  35885. "mul r7, r6, r7\n\t"
  35886. "adds r3, r3, r7\n\t"
  35887. "adcs r4, r4, #0\n\t"
  35888. "mov r5, #0\n\t"
  35889. "adc r5, r5, #0\n\t"
  35890. "lsr r7, r8, #16\n\t"
  35891. "mul r6, r7, r6\n\t"
  35892. "lsr r7, r6, #16\n\t"
  35893. "lsl r6, r6, #16\n\t"
  35894. "adds r3, r3, r6\n\t"
  35895. "adcs r4, r4, r7\n\t"
  35896. "adc r5, r5, #0\n\t"
  35897. "lsr r6, %[b], #16\n\t"
  35898. "lsr r7, r8, #16\n\t"
  35899. "mul r7, r6, r7\n\t"
  35900. "adds r4, r4, r7\n\t"
  35901. "adc r5, r5, #0\n\t"
  35902. "lsl r7, r8, #16\n\t"
  35903. "lsr r7, r7, #16\n\t"
  35904. "mul r6, r7, r6\n\t"
  35905. "lsr r7, r6, #16\n\t"
  35906. "lsl r6, r6, #16\n\t"
  35907. "adds r3, r3, r6\n\t"
  35908. "adcs r4, r4, r7\n\t"
  35909. "adc r5, r5, #0\n\t"
  35910. #else
  35911. "umull r6, r7, %[b], r8\n\t"
  35912. "adds r3, r3, r6\n\t"
  35913. "adcs r4, r4, r7\n\t"
  35914. "mov r5, #0\n\t"
  35915. "adc r5, r5, #0\n\t"
  35916. #endif
  35917. "str r3, [%[r]], #4\n\t"
  35918. /* A[46] * B */
  35919. "ldr r8, [%[a]], #4\n\t"
  35920. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35921. "lsl r6, %[b], #16\n\t"
  35922. "lsl r7, r8, #16\n\t"
  35923. "lsr r6, r6, #16\n\t"
  35924. "lsr r7, r7, #16\n\t"
  35925. "mul r7, r6, r7\n\t"
  35926. "adds r4, r4, r7\n\t"
  35927. "adcs r5, r5, #0\n\t"
  35928. "mov r3, #0\n\t"
  35929. "adc r3, r3, #0\n\t"
  35930. "lsr r7, r8, #16\n\t"
  35931. "mul r6, r7, r6\n\t"
  35932. "lsr r7, r6, #16\n\t"
  35933. "lsl r6, r6, #16\n\t"
  35934. "adds r4, r4, r6\n\t"
  35935. "adcs r5, r5, r7\n\t"
  35936. "adc r3, r3, #0\n\t"
  35937. "lsr r6, %[b], #16\n\t"
  35938. "lsr r7, r8, #16\n\t"
  35939. "mul r7, r6, r7\n\t"
  35940. "adds r5, r5, r7\n\t"
  35941. "adc r3, r3, #0\n\t"
  35942. "lsl r7, r8, #16\n\t"
  35943. "lsr r7, r7, #16\n\t"
  35944. "mul r6, r7, r6\n\t"
  35945. "lsr r7, r6, #16\n\t"
  35946. "lsl r6, r6, #16\n\t"
  35947. "adds r4, r4, r6\n\t"
  35948. "adcs r5, r5, r7\n\t"
  35949. "adc r3, r3, #0\n\t"
  35950. #else
  35951. "umull r6, r7, %[b], r8\n\t"
  35952. "adds r4, r4, r6\n\t"
  35953. "adcs r5, r5, r7\n\t"
  35954. "mov r3, #0\n\t"
  35955. "adc r3, r3, #0\n\t"
  35956. #endif
  35957. "str r4, [%[r]], #4\n\t"
  35958. /* A[47] * B */
  35959. "ldr r8, [%[a]], #4\n\t"
  35960. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  35961. "lsl r6, %[b], #16\n\t"
  35962. "lsl r7, r8, #16\n\t"
  35963. "lsr r6, r6, #16\n\t"
  35964. "lsr r7, r7, #16\n\t"
  35965. "mul r7, r6, r7\n\t"
  35966. "adds r5, r5, r7\n\t"
  35967. "adc r3, r3, #0\n\t"
  35968. "lsr r7, r8, #16\n\t"
  35969. "mul r6, r7, r6\n\t"
  35970. "lsr r7, r6, #16\n\t"
  35971. "lsl r6, r6, #16\n\t"
  35972. "adds r5, r5, r6\n\t"
  35973. "adc r3, r3, r7\n\t"
  35974. "lsr r6, %[b], #16\n\t"
  35975. "lsr r7, r8, #16\n\t"
  35976. "mul r7, r6, r7\n\t"
  35977. "add r3, r3, r7\n\t"
  35978. "lsl r7, r8, #16\n\t"
  35979. "lsr r7, r7, #16\n\t"
  35980. "mul r6, r7, r6\n\t"
  35981. "lsr r7, r6, #16\n\t"
  35982. "lsl r6, r6, #16\n\t"
  35983. "adds r5, r5, r6\n\t"
  35984. "adc r3, r3, r7\n\t"
  35985. #else
  35986. "umull r6, r7, %[b], r8\n\t"
  35987. "adds r5, r5, r6\n\t"
  35988. "adc r3, r3, r7\n\t"
  35989. #endif
  35990. "str r5, [%[r]], #4\n\t"
  35991. "str r3, [%[r]]\n\t"
  35992. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  35993. :
  35994. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10"
  35995. );
  35996. }
  35997. #endif /* WOLFSSL_SP_SMALL */
  35998. #ifdef WOLFSSL_SP_USE_UDIV
  35999. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  36000. *
  36001. * d1 The high order half of the number to divide.
  36002. * d0 The low order half of the number to divide.
  36003. * div The divisor.
  36004. * returns the result of the division.
  36005. *
  36006. * Note that this is an approximate div. It may give an answer 1 larger.
  36007. */
  36008. static sp_digit div_3072_word_48(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  36009. {
  36010. register sp_digit d1 asm ("r0") = d1_p;
  36011. register sp_digit d0 asm ("r1") = d0_p;
  36012. register sp_digit div asm ("r2") = div_p;
  36013. __asm__ __volatile__ (
  36014. "lsr r6, %[div], #16\n\t"
  36015. "add lr, r6, #1\n\t"
  36016. "udiv r4, %[d1], lr\n\t"
  36017. "lsl r5, %[div], #16\n\t"
  36018. "lsl r4, r4, #16\n\t"
  36019. "umull r3, r12, %[div], r4\n\t"
  36020. "subs %[d0], %[d0], r3\n\t"
  36021. "sbc %[d1], %[d1], r12\n\t"
  36022. "subs r3, %[d1], lr\n\t"
  36023. "sbc r7, r7, r7\n\t"
  36024. "add r7, r7, #1\n\t"
  36025. "rsb r8, r7, #0\n\t"
  36026. "lsl r7, r7, #16\n\t"
  36027. "and r5, r5, r8\n\t"
  36028. "and r6, r6, r8\n\t"
  36029. "subs %[d0], %[d0], r5\n\t"
  36030. "add r4, r4, r7\n\t"
  36031. "sbc %[d1], %[d1], r6\n\t"
  36032. "lsl r12, %[d1], #16\n\t"
  36033. "lsr r3, %[d0], #16\n\t"
  36034. "orr r3, r3, r12\n\t"
  36035. "udiv r3, r3, lr\n\t"
  36036. "add r4, r4, r3\n\t"
  36037. "umull r3, r12, %[div], r3\n\t"
  36038. "subs %[d0], %[d0], r3\n\t"
  36039. "sbc %[d1], %[d1], r12\n\t"
  36040. "lsl r12, %[d1], #16\n\t"
  36041. "lsr r3, %[d0], #16\n\t"
  36042. "orr r3, r3, r12\n\t"
  36043. "udiv r3, r3, lr\n\t"
  36044. "add r4, r4, r3\n\t"
  36045. "mul r3, %[div], r3\n\t"
  36046. "sub %[d0], %[d0], r3\n\t"
  36047. "udiv r3, %[d0], %[div]\n\t"
  36048. "add %[d1], r4, r3\n\t"
  36049. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  36050. :
  36051. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  36052. );
  36053. return (uint32_t)(size_t)d1;
  36054. }
  36055. #else
  36056. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  36057. *
  36058. * d1 The high order half of the number to divide.
  36059. * d0 The low order half of the number to divide.
  36060. * div The divisor.
  36061. * returns the result of the division.
  36062. *
  36063. * Note that this is an approximate div. It may give an answer 1 larger.
  36064. */
  36065. static sp_digit div_3072_word_48(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  36066. {
  36067. register sp_digit d1 asm ("r0") = d1_p;
  36068. register sp_digit d0 asm ("r1") = d0_p;
  36069. register sp_digit div asm ("r2") = div_p;
  36070. __asm__ __volatile__ (
  36071. "lsr lr, %[div], #1\n\t"
  36072. "add lr, lr, #1\n\t"
  36073. "mov r4, %[d0]\n\t"
  36074. "mov r5, %[d1]\n\t"
  36075. /* Do top 32 */
  36076. "subs r6, lr, r5\n\t"
  36077. "sbc r6, r6, r6\n\t"
  36078. "mov r3, #0\n\t"
  36079. "sub r3, r3, r6\n\t"
  36080. "and r6, r6, lr\n\t"
  36081. "subs r5, r5, r6\n\t"
  36082. /* Next 30 bits */
  36083. "mov r12, #29\n\t"
  36084. "\n"
  36085. "L_div_3072_word_48_bit_%=: \n\t"
  36086. "lsls r4, r4, #1\n\t"
  36087. "adc r5, r5, r5\n\t"
  36088. "subs r6, lr, r5\n\t"
  36089. "sbc r6, r6, r6\n\t"
  36090. "add r3, r3, r3\n\t"
  36091. "sub r3, r3, r6\n\t"
  36092. "and r6, r6, lr\n\t"
  36093. "subs r5, r5, r6\n\t"
  36094. "subs r12, r12, #1\n\t"
  36095. "bpl L_div_3072_word_48_bit_%=\n\t"
  36096. "add r3, r3, r3\n\t"
  36097. "add r3, r3, #1\n\t"
  36098. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  36099. "lsl r7, r3, #16\n\t"
  36100. "lsl r4, %[div], #16\n\t"
  36101. "lsr r7, r7, #16\n\t"
  36102. "lsr r4, r4, #16\n\t"
  36103. "mul r4, r7, r4\n\t"
  36104. "lsr r8, %[div], #16\n\t"
  36105. "mul r7, r8, r7\n\t"
  36106. "lsr r5, r7, #16\n\t"
  36107. "lsl r7, r7, #16\n\t"
  36108. "adds r4, r4, r7\n\t"
  36109. "adc r5, r5, #0\n\t"
  36110. "lsr r7, r3, #16\n\t"
  36111. "mul r8, r7, r8\n\t"
  36112. "add r5, r5, r8\n\t"
  36113. "lsl r8, %[div], #16\n\t"
  36114. "lsr r8, r8, #16\n\t"
  36115. "mul r7, r8, r7\n\t"
  36116. "lsr r8, r7, #16\n\t"
  36117. "lsl r7, r7, #16\n\t"
  36118. "adds r4, r4, r7\n\t"
  36119. "adc r5, r5, r8\n\t"
  36120. #else
  36121. "umull r4, r5, r3, %[div]\n\t"
  36122. #endif
  36123. "subs r7, %[d0], r4\n\t"
  36124. "sbc r8, %[d1], r5\n\t"
  36125. "add r3, r3, r8\n\t"
  36126. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  36127. "lsl r7, r3, #16\n\t"
  36128. "lsl r4, %[div], #16\n\t"
  36129. "lsr r7, r7, #16\n\t"
  36130. "lsr r4, r4, #16\n\t"
  36131. "mul r4, r7, r4\n\t"
  36132. "lsr r8, %[div], #16\n\t"
  36133. "mul r7, r8, r7\n\t"
  36134. "lsr r5, r7, #16\n\t"
  36135. "lsl r7, r7, #16\n\t"
  36136. "adds r4, r4, r7\n\t"
  36137. "adc r5, r5, #0\n\t"
  36138. "lsr r7, r3, #16\n\t"
  36139. "mul r8, r7, r8\n\t"
  36140. "add r5, r5, r8\n\t"
  36141. "lsl r8, %[div], #16\n\t"
  36142. "lsr r8, r8, #16\n\t"
  36143. "mul r7, r8, r7\n\t"
  36144. "lsr r8, r7, #16\n\t"
  36145. "lsl r7, r7, #16\n\t"
  36146. "adds r4, r4, r7\n\t"
  36147. "adc r5, r5, r8\n\t"
  36148. #else
  36149. "umull r4, r5, r3, %[div]\n\t"
  36150. #endif
  36151. "subs r7, %[d0], r4\n\t"
  36152. "sbc r8, %[d1], r5\n\t"
  36153. "add r3, r3, r8\n\t"
  36154. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  36155. "lsl r7, r3, #16\n\t"
  36156. "lsl r4, %[div], #16\n\t"
  36157. "lsr r7, r7, #16\n\t"
  36158. "lsr r4, r4, #16\n\t"
  36159. "mul r4, r7, r4\n\t"
  36160. "lsr r8, %[div], #16\n\t"
  36161. "mul r7, r8, r7\n\t"
  36162. "lsr r5, r7, #16\n\t"
  36163. "lsl r7, r7, #16\n\t"
  36164. "adds r4, r4, r7\n\t"
  36165. "adc r5, r5, #0\n\t"
  36166. "lsr r7, r3, #16\n\t"
  36167. "mul r8, r7, r8\n\t"
  36168. "add r5, r5, r8\n\t"
  36169. "lsl r8, %[div], #16\n\t"
  36170. "lsr r8, r8, #16\n\t"
  36171. "mul r7, r8, r7\n\t"
  36172. "lsr r8, r7, #16\n\t"
  36173. "lsl r7, r7, #16\n\t"
  36174. "adds r4, r4, r7\n\t"
  36175. "adc r5, r5, r8\n\t"
  36176. #else
  36177. "umull r4, r5, r3, %[div]\n\t"
  36178. #endif
  36179. "subs r7, %[d0], r4\n\t"
  36180. "sbc r8, %[d1], r5\n\t"
  36181. "add r3, r3, r8\n\t"
  36182. "subs r6, %[div], r7\n\t"
  36183. "sbc r6, r6, r6\n\t"
  36184. "sub %[d1], r3, r6\n\t"
  36185. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  36186. :
  36187. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  36188. );
  36189. return (uint32_t)(size_t)d1;
  36190. }
  36191. #endif
  36192. /* Compare a with b in constant time.
  36193. *
  36194. * a A single precision integer.
  36195. * b A single precision integer.
  36196. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  36197. * respectively.
  36198. */
  36199. static sp_int32 sp_3072_cmp_48(const sp_digit* a_p, const sp_digit* b_p)
  36200. {
  36201. register const sp_digit* a asm ("r0") = a_p;
  36202. register const sp_digit* b asm ("r1") = b_p;
  36203. __asm__ __volatile__ (
  36204. "mov r2, #-1\n\t"
  36205. "mov r6, #1\n\t"
  36206. "mov r5, #0\n\t"
  36207. "mov r3, #-1\n\t"
  36208. #ifdef WOLFSSL_SP_SMALL
  36209. "mov r4, #0xbc\n\t"
  36210. "\n"
  36211. "L_sp_3072_cmp_48_words_%=: \n\t"
  36212. "ldr r12, [%[a], r4]\n\t"
  36213. "ldr lr, [%[b], r4]\n\t"
  36214. "and r12, r12, r3\n\t"
  36215. "and lr, lr, r3\n\t"
  36216. "subs r12, r12, lr\n\t"
  36217. "it hi\n\t"
  36218. "movhi r2, r6\n\t"
  36219. "it lo\n\t"
  36220. "movlo r2, r3\n\t"
  36221. "it ne\n\t"
  36222. "movne r3, r5\n\t"
  36223. "subs r4, r4, #4\n\t"
  36224. "bcs L_sp_3072_cmp_48_words_%=\n\t"
  36225. "eor r2, r2, r3\n\t"
  36226. #else
  36227. "ldr r12, [%[a], #188]\n\t"
  36228. "ldr lr, [%[b], #188]\n\t"
  36229. "and r12, r12, r3\n\t"
  36230. "and lr, lr, r3\n\t"
  36231. "subs r12, r12, lr\n\t"
  36232. "it hi\n\t"
  36233. "movhi r2, r6\n\t"
  36234. "it lo\n\t"
  36235. "movlo r2, r3\n\t"
  36236. "it ne\n\t"
  36237. "movne r3, r5\n\t"
  36238. "ldr r12, [%[a], #184]\n\t"
  36239. "ldr lr, [%[b], #184]\n\t"
  36240. "and r12, r12, r3\n\t"
  36241. "and lr, lr, r3\n\t"
  36242. "subs r12, r12, lr\n\t"
  36243. "it hi\n\t"
  36244. "movhi r2, r6\n\t"
  36245. "it lo\n\t"
  36246. "movlo r2, r3\n\t"
  36247. "it ne\n\t"
  36248. "movne r3, r5\n\t"
  36249. "ldr r12, [%[a], #180]\n\t"
  36250. "ldr lr, [%[b], #180]\n\t"
  36251. "and r12, r12, r3\n\t"
  36252. "and lr, lr, r3\n\t"
  36253. "subs r12, r12, lr\n\t"
  36254. "it hi\n\t"
  36255. "movhi r2, r6\n\t"
  36256. "it lo\n\t"
  36257. "movlo r2, r3\n\t"
  36258. "it ne\n\t"
  36259. "movne r3, r5\n\t"
  36260. "ldr r12, [%[a], #176]\n\t"
  36261. "ldr lr, [%[b], #176]\n\t"
  36262. "and r12, r12, r3\n\t"
  36263. "and lr, lr, r3\n\t"
  36264. "subs r12, r12, lr\n\t"
  36265. "it hi\n\t"
  36266. "movhi r2, r6\n\t"
  36267. "it lo\n\t"
  36268. "movlo r2, r3\n\t"
  36269. "it ne\n\t"
  36270. "movne r3, r5\n\t"
  36271. "ldr r12, [%[a], #172]\n\t"
  36272. "ldr lr, [%[b], #172]\n\t"
  36273. "and r12, r12, r3\n\t"
  36274. "and lr, lr, r3\n\t"
  36275. "subs r12, r12, lr\n\t"
  36276. "it hi\n\t"
  36277. "movhi r2, r6\n\t"
  36278. "it lo\n\t"
  36279. "movlo r2, r3\n\t"
  36280. "it ne\n\t"
  36281. "movne r3, r5\n\t"
  36282. "ldr r12, [%[a], #168]\n\t"
  36283. "ldr lr, [%[b], #168]\n\t"
  36284. "and r12, r12, r3\n\t"
  36285. "and lr, lr, r3\n\t"
  36286. "subs r12, r12, lr\n\t"
  36287. "it hi\n\t"
  36288. "movhi r2, r6\n\t"
  36289. "it lo\n\t"
  36290. "movlo r2, r3\n\t"
  36291. "it ne\n\t"
  36292. "movne r3, r5\n\t"
  36293. "ldr r12, [%[a], #164]\n\t"
  36294. "ldr lr, [%[b], #164]\n\t"
  36295. "and r12, r12, r3\n\t"
  36296. "and lr, lr, r3\n\t"
  36297. "subs r12, r12, lr\n\t"
  36298. "it hi\n\t"
  36299. "movhi r2, r6\n\t"
  36300. "it lo\n\t"
  36301. "movlo r2, r3\n\t"
  36302. "it ne\n\t"
  36303. "movne r3, r5\n\t"
  36304. "ldr r12, [%[a], #160]\n\t"
  36305. "ldr lr, [%[b], #160]\n\t"
  36306. "and r12, r12, r3\n\t"
  36307. "and lr, lr, r3\n\t"
  36308. "subs r12, r12, lr\n\t"
  36309. "it hi\n\t"
  36310. "movhi r2, r6\n\t"
  36311. "it lo\n\t"
  36312. "movlo r2, r3\n\t"
  36313. "it ne\n\t"
  36314. "movne r3, r5\n\t"
  36315. "ldr r12, [%[a], #156]\n\t"
  36316. "ldr lr, [%[b], #156]\n\t"
  36317. "and r12, r12, r3\n\t"
  36318. "and lr, lr, r3\n\t"
  36319. "subs r12, r12, lr\n\t"
  36320. "it hi\n\t"
  36321. "movhi r2, r6\n\t"
  36322. "it lo\n\t"
  36323. "movlo r2, r3\n\t"
  36324. "it ne\n\t"
  36325. "movne r3, r5\n\t"
  36326. "ldr r12, [%[a], #152]\n\t"
  36327. "ldr lr, [%[b], #152]\n\t"
  36328. "and r12, r12, r3\n\t"
  36329. "and lr, lr, r3\n\t"
  36330. "subs r12, r12, lr\n\t"
  36331. "it hi\n\t"
  36332. "movhi r2, r6\n\t"
  36333. "it lo\n\t"
  36334. "movlo r2, r3\n\t"
  36335. "it ne\n\t"
  36336. "movne r3, r5\n\t"
  36337. "ldr r12, [%[a], #148]\n\t"
  36338. "ldr lr, [%[b], #148]\n\t"
  36339. "and r12, r12, r3\n\t"
  36340. "and lr, lr, r3\n\t"
  36341. "subs r12, r12, lr\n\t"
  36342. "it hi\n\t"
  36343. "movhi r2, r6\n\t"
  36344. "it lo\n\t"
  36345. "movlo r2, r3\n\t"
  36346. "it ne\n\t"
  36347. "movne r3, r5\n\t"
  36348. "ldr r12, [%[a], #144]\n\t"
  36349. "ldr lr, [%[b], #144]\n\t"
  36350. "and r12, r12, r3\n\t"
  36351. "and lr, lr, r3\n\t"
  36352. "subs r12, r12, lr\n\t"
  36353. "it hi\n\t"
  36354. "movhi r2, r6\n\t"
  36355. "it lo\n\t"
  36356. "movlo r2, r3\n\t"
  36357. "it ne\n\t"
  36358. "movne r3, r5\n\t"
  36359. "ldr r12, [%[a], #140]\n\t"
  36360. "ldr lr, [%[b], #140]\n\t"
  36361. "and r12, r12, r3\n\t"
  36362. "and lr, lr, r3\n\t"
  36363. "subs r12, r12, lr\n\t"
  36364. "it hi\n\t"
  36365. "movhi r2, r6\n\t"
  36366. "it lo\n\t"
  36367. "movlo r2, r3\n\t"
  36368. "it ne\n\t"
  36369. "movne r3, r5\n\t"
  36370. "ldr r12, [%[a], #136]\n\t"
  36371. "ldr lr, [%[b], #136]\n\t"
  36372. "and r12, r12, r3\n\t"
  36373. "and lr, lr, r3\n\t"
  36374. "subs r12, r12, lr\n\t"
  36375. "it hi\n\t"
  36376. "movhi r2, r6\n\t"
  36377. "it lo\n\t"
  36378. "movlo r2, r3\n\t"
  36379. "it ne\n\t"
  36380. "movne r3, r5\n\t"
  36381. "ldr r12, [%[a], #132]\n\t"
  36382. "ldr lr, [%[b], #132]\n\t"
  36383. "and r12, r12, r3\n\t"
  36384. "and lr, lr, r3\n\t"
  36385. "subs r12, r12, lr\n\t"
  36386. "it hi\n\t"
  36387. "movhi r2, r6\n\t"
  36388. "it lo\n\t"
  36389. "movlo r2, r3\n\t"
  36390. "it ne\n\t"
  36391. "movne r3, r5\n\t"
  36392. "ldr r12, [%[a], #128]\n\t"
  36393. "ldr lr, [%[b], #128]\n\t"
  36394. "and r12, r12, r3\n\t"
  36395. "and lr, lr, r3\n\t"
  36396. "subs r12, r12, lr\n\t"
  36397. "it hi\n\t"
  36398. "movhi r2, r6\n\t"
  36399. "it lo\n\t"
  36400. "movlo r2, r3\n\t"
  36401. "it ne\n\t"
  36402. "movne r3, r5\n\t"
  36403. "ldr r12, [%[a], #124]\n\t"
  36404. "ldr lr, [%[b], #124]\n\t"
  36405. "and r12, r12, r3\n\t"
  36406. "and lr, lr, r3\n\t"
  36407. "subs r12, r12, lr\n\t"
  36408. "it hi\n\t"
  36409. "movhi r2, r6\n\t"
  36410. "it lo\n\t"
  36411. "movlo r2, r3\n\t"
  36412. "it ne\n\t"
  36413. "movne r3, r5\n\t"
  36414. "ldr r12, [%[a], #120]\n\t"
  36415. "ldr lr, [%[b], #120]\n\t"
  36416. "and r12, r12, r3\n\t"
  36417. "and lr, lr, r3\n\t"
  36418. "subs r12, r12, lr\n\t"
  36419. "it hi\n\t"
  36420. "movhi r2, r6\n\t"
  36421. "it lo\n\t"
  36422. "movlo r2, r3\n\t"
  36423. "it ne\n\t"
  36424. "movne r3, r5\n\t"
  36425. "ldr r12, [%[a], #116]\n\t"
  36426. "ldr lr, [%[b], #116]\n\t"
  36427. "and r12, r12, r3\n\t"
  36428. "and lr, lr, r3\n\t"
  36429. "subs r12, r12, lr\n\t"
  36430. "it hi\n\t"
  36431. "movhi r2, r6\n\t"
  36432. "it lo\n\t"
  36433. "movlo r2, r3\n\t"
  36434. "it ne\n\t"
  36435. "movne r3, r5\n\t"
  36436. "ldr r12, [%[a], #112]\n\t"
  36437. "ldr lr, [%[b], #112]\n\t"
  36438. "and r12, r12, r3\n\t"
  36439. "and lr, lr, r3\n\t"
  36440. "subs r12, r12, lr\n\t"
  36441. "it hi\n\t"
  36442. "movhi r2, r6\n\t"
  36443. "it lo\n\t"
  36444. "movlo r2, r3\n\t"
  36445. "it ne\n\t"
  36446. "movne r3, r5\n\t"
  36447. "ldr r12, [%[a], #108]\n\t"
  36448. "ldr lr, [%[b], #108]\n\t"
  36449. "and r12, r12, r3\n\t"
  36450. "and lr, lr, r3\n\t"
  36451. "subs r12, r12, lr\n\t"
  36452. "it hi\n\t"
  36453. "movhi r2, r6\n\t"
  36454. "it lo\n\t"
  36455. "movlo r2, r3\n\t"
  36456. "it ne\n\t"
  36457. "movne r3, r5\n\t"
  36458. "ldr r12, [%[a], #104]\n\t"
  36459. "ldr lr, [%[b], #104]\n\t"
  36460. "and r12, r12, r3\n\t"
  36461. "and lr, lr, r3\n\t"
  36462. "subs r12, r12, lr\n\t"
  36463. "it hi\n\t"
  36464. "movhi r2, r6\n\t"
  36465. "it lo\n\t"
  36466. "movlo r2, r3\n\t"
  36467. "it ne\n\t"
  36468. "movne r3, r5\n\t"
  36469. "ldr r12, [%[a], #100]\n\t"
  36470. "ldr lr, [%[b], #100]\n\t"
  36471. "and r12, r12, r3\n\t"
  36472. "and lr, lr, r3\n\t"
  36473. "subs r12, r12, lr\n\t"
  36474. "it hi\n\t"
  36475. "movhi r2, r6\n\t"
  36476. "it lo\n\t"
  36477. "movlo r2, r3\n\t"
  36478. "it ne\n\t"
  36479. "movne r3, r5\n\t"
  36480. "ldr r12, [%[a], #96]\n\t"
  36481. "ldr lr, [%[b], #96]\n\t"
  36482. "and r12, r12, r3\n\t"
  36483. "and lr, lr, r3\n\t"
  36484. "subs r12, r12, lr\n\t"
  36485. "it hi\n\t"
  36486. "movhi r2, r6\n\t"
  36487. "it lo\n\t"
  36488. "movlo r2, r3\n\t"
  36489. "it ne\n\t"
  36490. "movne r3, r5\n\t"
  36491. "ldr r12, [%[a], #92]\n\t"
  36492. "ldr lr, [%[b], #92]\n\t"
  36493. "and r12, r12, r3\n\t"
  36494. "and lr, lr, r3\n\t"
  36495. "subs r12, r12, lr\n\t"
  36496. "it hi\n\t"
  36497. "movhi r2, r6\n\t"
  36498. "it lo\n\t"
  36499. "movlo r2, r3\n\t"
  36500. "it ne\n\t"
  36501. "movne r3, r5\n\t"
  36502. "ldr r12, [%[a], #88]\n\t"
  36503. "ldr lr, [%[b], #88]\n\t"
  36504. "and r12, r12, r3\n\t"
  36505. "and lr, lr, r3\n\t"
  36506. "subs r12, r12, lr\n\t"
  36507. "it hi\n\t"
  36508. "movhi r2, r6\n\t"
  36509. "it lo\n\t"
  36510. "movlo r2, r3\n\t"
  36511. "it ne\n\t"
  36512. "movne r3, r5\n\t"
  36513. "ldr r12, [%[a], #84]\n\t"
  36514. "ldr lr, [%[b], #84]\n\t"
  36515. "and r12, r12, r3\n\t"
  36516. "and lr, lr, r3\n\t"
  36517. "subs r12, r12, lr\n\t"
  36518. "it hi\n\t"
  36519. "movhi r2, r6\n\t"
  36520. "it lo\n\t"
  36521. "movlo r2, r3\n\t"
  36522. "it ne\n\t"
  36523. "movne r3, r5\n\t"
  36524. "ldr r12, [%[a], #80]\n\t"
  36525. "ldr lr, [%[b], #80]\n\t"
  36526. "and r12, r12, r3\n\t"
  36527. "and lr, lr, r3\n\t"
  36528. "subs r12, r12, lr\n\t"
  36529. "it hi\n\t"
  36530. "movhi r2, r6\n\t"
  36531. "it lo\n\t"
  36532. "movlo r2, r3\n\t"
  36533. "it ne\n\t"
  36534. "movne r3, r5\n\t"
  36535. "ldr r12, [%[a], #76]\n\t"
  36536. "ldr lr, [%[b], #76]\n\t"
  36537. "and r12, r12, r3\n\t"
  36538. "and lr, lr, r3\n\t"
  36539. "subs r12, r12, lr\n\t"
  36540. "it hi\n\t"
  36541. "movhi r2, r6\n\t"
  36542. "it lo\n\t"
  36543. "movlo r2, r3\n\t"
  36544. "it ne\n\t"
  36545. "movne r3, r5\n\t"
  36546. "ldr r12, [%[a], #72]\n\t"
  36547. "ldr lr, [%[b], #72]\n\t"
  36548. "and r12, r12, r3\n\t"
  36549. "and lr, lr, r3\n\t"
  36550. "subs r12, r12, lr\n\t"
  36551. "it hi\n\t"
  36552. "movhi r2, r6\n\t"
  36553. "it lo\n\t"
  36554. "movlo r2, r3\n\t"
  36555. "it ne\n\t"
  36556. "movne r3, r5\n\t"
  36557. "ldr r12, [%[a], #68]\n\t"
  36558. "ldr lr, [%[b], #68]\n\t"
  36559. "and r12, r12, r3\n\t"
  36560. "and lr, lr, r3\n\t"
  36561. "subs r12, r12, lr\n\t"
  36562. "it hi\n\t"
  36563. "movhi r2, r6\n\t"
  36564. "it lo\n\t"
  36565. "movlo r2, r3\n\t"
  36566. "it ne\n\t"
  36567. "movne r3, r5\n\t"
  36568. "ldr r12, [%[a], #64]\n\t"
  36569. "ldr lr, [%[b], #64]\n\t"
  36570. "and r12, r12, r3\n\t"
  36571. "and lr, lr, r3\n\t"
  36572. "subs r12, r12, lr\n\t"
  36573. "it hi\n\t"
  36574. "movhi r2, r6\n\t"
  36575. "it lo\n\t"
  36576. "movlo r2, r3\n\t"
  36577. "it ne\n\t"
  36578. "movne r3, r5\n\t"
  36579. "ldr r12, [%[a], #60]\n\t"
  36580. "ldr lr, [%[b], #60]\n\t"
  36581. "and r12, r12, r3\n\t"
  36582. "and lr, lr, r3\n\t"
  36583. "subs r12, r12, lr\n\t"
  36584. "it hi\n\t"
  36585. "movhi r2, r6\n\t"
  36586. "it lo\n\t"
  36587. "movlo r2, r3\n\t"
  36588. "it ne\n\t"
  36589. "movne r3, r5\n\t"
  36590. "ldr r12, [%[a], #56]\n\t"
  36591. "ldr lr, [%[b], #56]\n\t"
  36592. "and r12, r12, r3\n\t"
  36593. "and lr, lr, r3\n\t"
  36594. "subs r12, r12, lr\n\t"
  36595. "it hi\n\t"
  36596. "movhi r2, r6\n\t"
  36597. "it lo\n\t"
  36598. "movlo r2, r3\n\t"
  36599. "it ne\n\t"
  36600. "movne r3, r5\n\t"
  36601. "ldr r12, [%[a], #52]\n\t"
  36602. "ldr lr, [%[b], #52]\n\t"
  36603. "and r12, r12, r3\n\t"
  36604. "and lr, lr, r3\n\t"
  36605. "subs r12, r12, lr\n\t"
  36606. "it hi\n\t"
  36607. "movhi r2, r6\n\t"
  36608. "it lo\n\t"
  36609. "movlo r2, r3\n\t"
  36610. "it ne\n\t"
  36611. "movne r3, r5\n\t"
  36612. "ldr r12, [%[a], #48]\n\t"
  36613. "ldr lr, [%[b], #48]\n\t"
  36614. "and r12, r12, r3\n\t"
  36615. "and lr, lr, r3\n\t"
  36616. "subs r12, r12, lr\n\t"
  36617. "it hi\n\t"
  36618. "movhi r2, r6\n\t"
  36619. "it lo\n\t"
  36620. "movlo r2, r3\n\t"
  36621. "it ne\n\t"
  36622. "movne r3, r5\n\t"
  36623. "ldr r12, [%[a], #44]\n\t"
  36624. "ldr lr, [%[b], #44]\n\t"
  36625. "and r12, r12, r3\n\t"
  36626. "and lr, lr, r3\n\t"
  36627. "subs r12, r12, lr\n\t"
  36628. "it hi\n\t"
  36629. "movhi r2, r6\n\t"
  36630. "it lo\n\t"
  36631. "movlo r2, r3\n\t"
  36632. "it ne\n\t"
  36633. "movne r3, r5\n\t"
  36634. "ldr r12, [%[a], #40]\n\t"
  36635. "ldr lr, [%[b], #40]\n\t"
  36636. "and r12, r12, r3\n\t"
  36637. "and lr, lr, r3\n\t"
  36638. "subs r12, r12, lr\n\t"
  36639. "it hi\n\t"
  36640. "movhi r2, r6\n\t"
  36641. "it lo\n\t"
  36642. "movlo r2, r3\n\t"
  36643. "it ne\n\t"
  36644. "movne r3, r5\n\t"
  36645. "ldr r12, [%[a], #36]\n\t"
  36646. "ldr lr, [%[b], #36]\n\t"
  36647. "and r12, r12, r3\n\t"
  36648. "and lr, lr, r3\n\t"
  36649. "subs r12, r12, lr\n\t"
  36650. "it hi\n\t"
  36651. "movhi r2, r6\n\t"
  36652. "it lo\n\t"
  36653. "movlo r2, r3\n\t"
  36654. "it ne\n\t"
  36655. "movne r3, r5\n\t"
  36656. "ldr r12, [%[a], #32]\n\t"
  36657. "ldr lr, [%[b], #32]\n\t"
  36658. "and r12, r12, r3\n\t"
  36659. "and lr, lr, r3\n\t"
  36660. "subs r12, r12, lr\n\t"
  36661. "it hi\n\t"
  36662. "movhi r2, r6\n\t"
  36663. "it lo\n\t"
  36664. "movlo r2, r3\n\t"
  36665. "it ne\n\t"
  36666. "movne r3, r5\n\t"
  36667. "ldr r12, [%[a], #28]\n\t"
  36668. "ldr lr, [%[b], #28]\n\t"
  36669. "and r12, r12, r3\n\t"
  36670. "and lr, lr, r3\n\t"
  36671. "subs r12, r12, lr\n\t"
  36672. "it hi\n\t"
  36673. "movhi r2, r6\n\t"
  36674. "it lo\n\t"
  36675. "movlo r2, r3\n\t"
  36676. "it ne\n\t"
  36677. "movne r3, r5\n\t"
  36678. "ldr r12, [%[a], #24]\n\t"
  36679. "ldr lr, [%[b], #24]\n\t"
  36680. "and r12, r12, r3\n\t"
  36681. "and lr, lr, r3\n\t"
  36682. "subs r12, r12, lr\n\t"
  36683. "it hi\n\t"
  36684. "movhi r2, r6\n\t"
  36685. "it lo\n\t"
  36686. "movlo r2, r3\n\t"
  36687. "it ne\n\t"
  36688. "movne r3, r5\n\t"
  36689. "ldr r12, [%[a], #20]\n\t"
  36690. "ldr lr, [%[b], #20]\n\t"
  36691. "and r12, r12, r3\n\t"
  36692. "and lr, lr, r3\n\t"
  36693. "subs r12, r12, lr\n\t"
  36694. "it hi\n\t"
  36695. "movhi r2, r6\n\t"
  36696. "it lo\n\t"
  36697. "movlo r2, r3\n\t"
  36698. "it ne\n\t"
  36699. "movne r3, r5\n\t"
  36700. "ldr r12, [%[a], #16]\n\t"
  36701. "ldr lr, [%[b], #16]\n\t"
  36702. "and r12, r12, r3\n\t"
  36703. "and lr, lr, r3\n\t"
  36704. "subs r12, r12, lr\n\t"
  36705. "it hi\n\t"
  36706. "movhi r2, r6\n\t"
  36707. "it lo\n\t"
  36708. "movlo r2, r3\n\t"
  36709. "it ne\n\t"
  36710. "movne r3, r5\n\t"
  36711. "ldr r12, [%[a], #12]\n\t"
  36712. "ldr lr, [%[b], #12]\n\t"
  36713. "and r12, r12, r3\n\t"
  36714. "and lr, lr, r3\n\t"
  36715. "subs r12, r12, lr\n\t"
  36716. "it hi\n\t"
  36717. "movhi r2, r6\n\t"
  36718. "it lo\n\t"
  36719. "movlo r2, r3\n\t"
  36720. "it ne\n\t"
  36721. "movne r3, r5\n\t"
  36722. "ldr r12, [%[a], #8]\n\t"
  36723. "ldr lr, [%[b], #8]\n\t"
  36724. "and r12, r12, r3\n\t"
  36725. "and lr, lr, r3\n\t"
  36726. "subs r12, r12, lr\n\t"
  36727. "it hi\n\t"
  36728. "movhi r2, r6\n\t"
  36729. "it lo\n\t"
  36730. "movlo r2, r3\n\t"
  36731. "it ne\n\t"
  36732. "movne r3, r5\n\t"
  36733. "ldr r12, [%[a], #4]\n\t"
  36734. "ldr lr, [%[b], #4]\n\t"
  36735. "and r12, r12, r3\n\t"
  36736. "and lr, lr, r3\n\t"
  36737. "subs r12, r12, lr\n\t"
  36738. "it hi\n\t"
  36739. "movhi r2, r6\n\t"
  36740. "it lo\n\t"
  36741. "movlo r2, r3\n\t"
  36742. "it ne\n\t"
  36743. "movne r3, r5\n\t"
  36744. "ldr r12, [%[a]]\n\t"
  36745. "ldr lr, [%[b]]\n\t"
  36746. "and r12, r12, r3\n\t"
  36747. "and lr, lr, r3\n\t"
  36748. "subs r12, r12, lr\n\t"
  36749. "it hi\n\t"
  36750. "movhi r2, r6\n\t"
  36751. "it lo\n\t"
  36752. "movlo r2, r3\n\t"
  36753. "it ne\n\t"
  36754. "movne r3, r5\n\t"
  36755. "eor r2, r2, r3\n\t"
  36756. #endif /*WOLFSSL_SP_SMALL */
  36757. "mov %[a], r2\n\t"
  36758. : [a] "+r" (a), [b] "+r" (b)
  36759. :
  36760. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6"
  36761. );
  36762. return (uint32_t)(size_t)a;
  36763. }
  36764. /* Divide d in a and put remainder into r (m*d + r = a)
  36765. * m is not calculated as it is not needed at this time.
  36766. *
  36767. * a Number to be divided.
  36768. * d Number to divide with.
  36769. * m Multiplier result.
  36770. * r Remainder from the division.
  36771. * returns MP_OKAY indicating success.
  36772. */
  36773. static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, sp_digit* m,
  36774. sp_digit* r)
  36775. {
  36776. sp_digit t1[96], t2[49];
  36777. sp_digit div, r1;
  36778. int i;
  36779. (void)m;
  36780. div = d[47];
  36781. XMEMCPY(t1, a, sizeof(*t1) * 2 * 48);
  36782. r1 = sp_3072_cmp_48(&t1[48], d) >= 0;
  36783. sp_3072_cond_sub_48(&t1[48], &t1[48], d, (sp_digit)0 - r1);
  36784. for (i = 47; i >= 0; i--) {
  36785. volatile sp_digit mask = (sp_digit)0 - (t1[48 + i] == div);
  36786. sp_digit hi = t1[48 + i] + mask;
  36787. r1 = div_3072_word_48(hi, t1[48 + i - 1], div);
  36788. r1 |= mask;
  36789. sp_3072_mul_d_48(t2, d, r1);
  36790. t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2);
  36791. t1[48 + i] -= t2[48];
  36792. sp_3072_mask_48(t2, d, t1[48 + i]);
  36793. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  36794. sp_3072_mask_48(t2, d, t1[48 + i]);
  36795. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  36796. }
  36797. r1 = sp_3072_cmp_48(t1, d) >= 0;
  36798. sp_3072_cond_sub_48(r, t1, d, (sp_digit)0 - r1);
  36799. return MP_OKAY;
  36800. }
  36801. /* Reduce a modulo m into r. (r = a mod m)
  36802. *
  36803. * r A single precision number that is the reduced result.
  36804. * a A single precision number that is to be reduced.
  36805. * m A single precision number that is the modulus to reduce with.
  36806. * returns MP_OKAY indicating success.
  36807. */
  36808. static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a, const sp_digit* m)
  36809. {
  36810. return sp_3072_div_48(a, m, NULL, r);
  36811. }
  36812. #ifdef WOLFSSL_SP_SMALL
  36813. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  36814. *
  36815. * r A single precision number that is the result of the operation.
  36816. * a A single precision number being exponentiated.
  36817. * e A single precision number that is the exponent.
  36818. * bits The number of bits in the exponent.
  36819. * m A single precision number that is the modulus.
  36820. * returns 0 on success.
  36821. * returns MEMORY_E on dynamic memory allocation failure.
  36822. * returns MP_VAL when base is even or exponent is 0.
  36823. */
  36824. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  36825. int bits, const sp_digit* m, int reduceA)
  36826. {
  36827. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  36828. sp_digit* td = NULL;
  36829. #else
  36830. sp_digit td[16 * 96];
  36831. #endif
  36832. sp_digit* t[16];
  36833. sp_digit* norm = NULL;
  36834. sp_digit mp = 1;
  36835. sp_digit n;
  36836. sp_digit mask;
  36837. int i;
  36838. int c;
  36839. byte y;
  36840. int err = MP_OKAY;
  36841. if (bits == 0) {
  36842. err = MP_VAL;
  36843. }
  36844. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  36845. if (err == MP_OKAY) {
  36846. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 96), NULL,
  36847. DYNAMIC_TYPE_TMP_BUFFER);
  36848. if (td == NULL)
  36849. err = MEMORY_E;
  36850. }
  36851. #endif
  36852. if (err == MP_OKAY) {
  36853. norm = td;
  36854. for (i=0; i<16; i++) {
  36855. t[i] = td + i * 96;
  36856. }
  36857. sp_3072_mont_setup(m, &mp);
  36858. sp_3072_mont_norm_48(norm, m);
  36859. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  36860. if (reduceA != 0) {
  36861. err = sp_3072_mod_48(t[1] + 48, a, m);
  36862. if (err == MP_OKAY) {
  36863. err = sp_3072_mod_48(t[1], t[1], m);
  36864. }
  36865. }
  36866. else {
  36867. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  36868. err = sp_3072_mod_48(t[1], t[1], m);
  36869. }
  36870. }
  36871. if (err == MP_OKAY) {
  36872. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  36873. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  36874. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  36875. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  36876. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  36877. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  36878. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  36879. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  36880. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  36881. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  36882. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  36883. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  36884. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  36885. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  36886. i = (bits - 1) / 32;
  36887. n = e[i--];
  36888. c = bits & 31;
  36889. if (c == 0) {
  36890. c = 32;
  36891. }
  36892. c -= bits % 4;
  36893. if (c == 32) {
  36894. c = 28;
  36895. }
  36896. if (c < 0) {
  36897. /* Number of bits in top word is less than number needed. */
  36898. c = -c;
  36899. y = (byte)(n << c);
  36900. n = e[i--];
  36901. y |= (byte)(n >> (64 - c));
  36902. n <<= c;
  36903. c = 64 - c;
  36904. }
  36905. else if (c == 0) {
  36906. /* All bits in top word used. */
  36907. y = (byte)n;
  36908. }
  36909. else {
  36910. y = (byte)(n >> c);
  36911. n <<= 32 - c;
  36912. }
  36913. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  36914. for (; i>=0 || c>=4; ) {
  36915. if (c == 0) {
  36916. n = e[i--];
  36917. y = (byte)(n >> 28);
  36918. n <<= 4;
  36919. c = 28;
  36920. }
  36921. else if (c < 4) {
  36922. y = (byte)(n >> 28);
  36923. n = e[i--];
  36924. c = 4 - c;
  36925. y |= (byte)(n >> (32 - c));
  36926. n <<= c;
  36927. c = 32 - c;
  36928. }
  36929. else {
  36930. y = (byte)((n >> 28) & 0xf);
  36931. n <<= 4;
  36932. c -= 4;
  36933. }
  36934. sp_3072_mont_sqr_48(r, r, m, mp);
  36935. sp_3072_mont_sqr_48(r, r, m, mp);
  36936. sp_3072_mont_sqr_48(r, r, m, mp);
  36937. sp_3072_mont_sqr_48(r, r, m, mp);
  36938. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  36939. }
  36940. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  36941. sp_3072_mont_reduce_48(r, m, mp);
  36942. mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
  36943. sp_3072_cond_sub_48(r, r, m, mask);
  36944. }
  36945. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  36946. if (td != NULL)
  36947. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  36948. #endif
  36949. return err;
  36950. }
  36951. #else
  36952. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  36953. *
  36954. * r A single precision number that is the result of the operation.
  36955. * a A single precision number being exponentiated.
  36956. * e A single precision number that is the exponent.
  36957. * bits The number of bits in the exponent.
  36958. * m A single precision number that is the modulus.
  36959. * returns 0 on success.
  36960. * returns MEMORY_E on dynamic memory allocation failure.
  36961. * returns MP_VAL when base is even or exponent is 0.
  36962. */
  36963. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  36964. int bits, const sp_digit* m, int reduceA)
  36965. {
  36966. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  36967. sp_digit* td = NULL;
  36968. #else
  36969. sp_digit td[32 * 96];
  36970. #endif
  36971. sp_digit* t[32];
  36972. sp_digit* norm = NULL;
  36973. sp_digit mp = 1;
  36974. sp_digit n;
  36975. sp_digit mask;
  36976. int i;
  36977. int c;
  36978. byte y;
  36979. int err = MP_OKAY;
  36980. if (bits == 0) {
  36981. err = MP_VAL;
  36982. }
  36983. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  36984. if (err == MP_OKAY) {
  36985. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 96), NULL,
  36986. DYNAMIC_TYPE_TMP_BUFFER);
  36987. if (td == NULL)
  36988. err = MEMORY_E;
  36989. }
  36990. #endif
  36991. if (err == MP_OKAY) {
  36992. norm = td;
  36993. for (i=0; i<32; i++) {
  36994. t[i] = td + i * 96;
  36995. }
  36996. sp_3072_mont_setup(m, &mp);
  36997. sp_3072_mont_norm_48(norm, m);
  36998. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  36999. if (reduceA != 0) {
  37000. err = sp_3072_mod_48(t[1] + 48, a, m);
  37001. if (err == MP_OKAY) {
  37002. err = sp_3072_mod_48(t[1], t[1], m);
  37003. }
  37004. }
  37005. else {
  37006. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  37007. err = sp_3072_mod_48(t[1], t[1], m);
  37008. }
  37009. }
  37010. if (err == MP_OKAY) {
  37011. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  37012. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  37013. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  37014. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  37015. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  37016. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  37017. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  37018. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  37019. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  37020. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  37021. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  37022. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  37023. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  37024. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  37025. sp_3072_mont_sqr_48(t[16], t[ 8], m, mp);
  37026. sp_3072_mont_mul_48(t[17], t[ 9], t[ 8], m, mp);
  37027. sp_3072_mont_sqr_48(t[18], t[ 9], m, mp);
  37028. sp_3072_mont_mul_48(t[19], t[10], t[ 9], m, mp);
  37029. sp_3072_mont_sqr_48(t[20], t[10], m, mp);
  37030. sp_3072_mont_mul_48(t[21], t[11], t[10], m, mp);
  37031. sp_3072_mont_sqr_48(t[22], t[11], m, mp);
  37032. sp_3072_mont_mul_48(t[23], t[12], t[11], m, mp);
  37033. sp_3072_mont_sqr_48(t[24], t[12], m, mp);
  37034. sp_3072_mont_mul_48(t[25], t[13], t[12], m, mp);
  37035. sp_3072_mont_sqr_48(t[26], t[13], m, mp);
  37036. sp_3072_mont_mul_48(t[27], t[14], t[13], m, mp);
  37037. sp_3072_mont_sqr_48(t[28], t[14], m, mp);
  37038. sp_3072_mont_mul_48(t[29], t[15], t[14], m, mp);
  37039. sp_3072_mont_sqr_48(t[30], t[15], m, mp);
  37040. sp_3072_mont_mul_48(t[31], t[16], t[15], m, mp);
  37041. i = (bits - 1) / 32;
  37042. n = e[i--];
  37043. c = bits & 31;
  37044. if (c == 0) {
  37045. c = 32;
  37046. }
  37047. c -= bits % 5;
  37048. if (c == 32) {
  37049. c = 27;
  37050. }
  37051. if (c < 0) {
  37052. /* Number of bits in top word is less than number needed. */
  37053. c = -c;
  37054. y = (byte)(n << c);
  37055. n = e[i--];
  37056. y |= (byte)(n >> (64 - c));
  37057. n <<= c;
  37058. c = 64 - c;
  37059. }
  37060. else if (c == 0) {
  37061. /* All bits in top word used. */
  37062. y = (byte)n;
  37063. }
  37064. else {
  37065. y = (byte)(n >> c);
  37066. n <<= 32 - c;
  37067. }
  37068. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  37069. for (; i>=0 || c>=5; ) {
  37070. if (c == 0) {
  37071. n = e[i--];
  37072. y = (byte)(n >> 27);
  37073. n <<= 5;
  37074. c = 27;
  37075. }
  37076. else if (c < 5) {
  37077. y = (byte)(n >> 27);
  37078. n = e[i--];
  37079. c = 5 - c;
  37080. y |= (byte)(n >> (32 - c));
  37081. n <<= c;
  37082. c = 32 - c;
  37083. }
  37084. else {
  37085. y = (byte)((n >> 27) & 0x1f);
  37086. n <<= 5;
  37087. c -= 5;
  37088. }
  37089. sp_3072_mont_sqr_48(r, r, m, mp);
  37090. sp_3072_mont_sqr_48(r, r, m, mp);
  37091. sp_3072_mont_sqr_48(r, r, m, mp);
  37092. sp_3072_mont_sqr_48(r, r, m, mp);
  37093. sp_3072_mont_sqr_48(r, r, m, mp);
  37094. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  37095. }
  37096. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  37097. sp_3072_mont_reduce_48(r, m, mp);
  37098. mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
  37099. sp_3072_cond_sub_48(r, r, m, mask);
  37100. }
  37101. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  37102. if (td != NULL)
  37103. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37104. #endif
  37105. return err;
  37106. }
  37107. #endif /* WOLFSSL_SP_SMALL */
  37108. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  37109. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  37110. /* r = 2^n mod m where n is the number of bits to reduce by.
  37111. * Given m must be 3072 bits, just need to subtract.
  37112. *
  37113. * r A single precision number.
  37114. * m A single precision number.
  37115. */
  37116. static void sp_3072_mont_norm_96(sp_digit* r, const sp_digit* m)
  37117. {
  37118. XMEMSET(r, 0, sizeof(sp_digit) * 96);
  37119. /* r = 2^n mod m */
  37120. sp_3072_sub_in_place_96(r, m);
  37121. }
  37122. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  37123. #ifdef WOLFSSL_SP_SMALL
  37124. /* Conditionally subtract b from a using the mask m.
  37125. * m is -1 to subtract and 0 when not copying.
  37126. *
  37127. * r A single precision number representing condition subtract result.
  37128. * a A single precision number to subtract from.
  37129. * b A single precision number to subtract.
  37130. * m Mask value to apply.
  37131. */
  37132. static sp_digit sp_3072_cond_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  37133. {
  37134. register sp_digit* r asm ("r0") = r_p;
  37135. register const sp_digit* a asm ("r1") = a_p;
  37136. register const sp_digit* b asm ("r2") = b_p;
  37137. register sp_digit m asm ("r3") = m_p;
  37138. __asm__ __volatile__ (
  37139. "mov r6, #0\n\t"
  37140. "mov r12, #0\n\t"
  37141. "mov lr, #0\n\t"
  37142. "\n"
  37143. "L_sp_3072_cond_sub_96_words_%=: \n\t"
  37144. "subs r12, r6, r12\n\t"
  37145. "ldr r4, [%[a], lr]\n\t"
  37146. "ldr r5, [%[b], lr]\n\t"
  37147. "and r5, r5, %[m]\n\t"
  37148. "sbcs r4, r4, r5\n\t"
  37149. "sbc r12, r6, r6\n\t"
  37150. "str r4, [%[r], lr]\n\t"
  37151. "add lr, lr, #4\n\t"
  37152. "cmp lr, #0x180\n\t"
  37153. "blt L_sp_3072_cond_sub_96_words_%=\n\t"
  37154. "mov %[r], r12\n\t"
  37155. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  37156. :
  37157. : "memory", "r12", "lr", "r4", "r5", "r6"
  37158. );
  37159. return (uint32_t)(size_t)r;
  37160. }
  37161. #else
  37162. /* Conditionally subtract b from a using the mask m.
  37163. * m is -1 to subtract and 0 when not copying.
  37164. *
  37165. * r A single precision number representing condition subtract result.
  37166. * a A single precision number to subtract from.
  37167. * b A single precision number to subtract.
  37168. * m Mask value to apply.
  37169. */
  37170. static sp_digit sp_3072_cond_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  37171. {
  37172. register sp_digit* r asm ("r0") = r_p;
  37173. register const sp_digit* a asm ("r1") = a_p;
  37174. register const sp_digit* b asm ("r2") = b_p;
  37175. register sp_digit m asm ("r3") = m_p;
  37176. __asm__ __volatile__ (
  37177. "mov lr, #0\n\t"
  37178. "ldm %[a]!, {r4, r5}\n\t"
  37179. "ldm %[b]!, {r6, r7}\n\t"
  37180. "and r6, r6, %[m]\n\t"
  37181. "and r7, r7, %[m]\n\t"
  37182. "subs r4, r4, r6\n\t"
  37183. "sbcs r5, r5, r7\n\t"
  37184. "stm %[r]!, {r4, r5}\n\t"
  37185. "ldm %[a]!, {r4, r5}\n\t"
  37186. "ldm %[b]!, {r6, r7}\n\t"
  37187. "and r6, r6, %[m]\n\t"
  37188. "and r7, r7, %[m]\n\t"
  37189. "sbcs r4, r4, r6\n\t"
  37190. "sbcs r5, r5, r7\n\t"
  37191. "stm %[r]!, {r4, r5}\n\t"
  37192. "ldm %[a]!, {r4, r5}\n\t"
  37193. "ldm %[b]!, {r6, r7}\n\t"
  37194. "and r6, r6, %[m]\n\t"
  37195. "and r7, r7, %[m]\n\t"
  37196. "sbcs r4, r4, r6\n\t"
  37197. "sbcs r5, r5, r7\n\t"
  37198. "stm %[r]!, {r4, r5}\n\t"
  37199. "ldm %[a]!, {r4, r5}\n\t"
  37200. "ldm %[b]!, {r6, r7}\n\t"
  37201. "and r6, r6, %[m]\n\t"
  37202. "and r7, r7, %[m]\n\t"
  37203. "sbcs r4, r4, r6\n\t"
  37204. "sbcs r5, r5, r7\n\t"
  37205. "stm %[r]!, {r4, r5}\n\t"
  37206. "ldm %[a]!, {r4, r5}\n\t"
  37207. "ldm %[b]!, {r6, r7}\n\t"
  37208. "and r6, r6, %[m]\n\t"
  37209. "and r7, r7, %[m]\n\t"
  37210. "sbcs r4, r4, r6\n\t"
  37211. "sbcs r5, r5, r7\n\t"
  37212. "stm %[r]!, {r4, r5}\n\t"
  37213. "ldm %[a]!, {r4, r5}\n\t"
  37214. "ldm %[b]!, {r6, r7}\n\t"
  37215. "and r6, r6, %[m]\n\t"
  37216. "and r7, r7, %[m]\n\t"
  37217. "sbcs r4, r4, r6\n\t"
  37218. "sbcs r5, r5, r7\n\t"
  37219. "stm %[r]!, {r4, r5}\n\t"
  37220. "ldm %[a]!, {r4, r5}\n\t"
  37221. "ldm %[b]!, {r6, r7}\n\t"
  37222. "and r6, r6, %[m]\n\t"
  37223. "and r7, r7, %[m]\n\t"
  37224. "sbcs r4, r4, r6\n\t"
  37225. "sbcs r5, r5, r7\n\t"
  37226. "stm %[r]!, {r4, r5}\n\t"
  37227. "ldm %[a]!, {r4, r5}\n\t"
  37228. "ldm %[b]!, {r6, r7}\n\t"
  37229. "and r6, r6, %[m]\n\t"
  37230. "and r7, r7, %[m]\n\t"
  37231. "sbcs r4, r4, r6\n\t"
  37232. "sbcs r5, r5, r7\n\t"
  37233. "stm %[r]!, {r4, r5}\n\t"
  37234. "ldm %[a]!, {r4, r5}\n\t"
  37235. "ldm %[b]!, {r6, r7}\n\t"
  37236. "and r6, r6, %[m]\n\t"
  37237. "and r7, r7, %[m]\n\t"
  37238. "sbcs r4, r4, r6\n\t"
  37239. "sbcs r5, r5, r7\n\t"
  37240. "stm %[r]!, {r4, r5}\n\t"
  37241. "ldm %[a]!, {r4, r5}\n\t"
  37242. "ldm %[b]!, {r6, r7}\n\t"
  37243. "and r6, r6, %[m]\n\t"
  37244. "and r7, r7, %[m]\n\t"
  37245. "sbcs r4, r4, r6\n\t"
  37246. "sbcs r5, r5, r7\n\t"
  37247. "stm %[r]!, {r4, r5}\n\t"
  37248. "ldm %[a]!, {r4, r5}\n\t"
  37249. "ldm %[b]!, {r6, r7}\n\t"
  37250. "and r6, r6, %[m]\n\t"
  37251. "and r7, r7, %[m]\n\t"
  37252. "sbcs r4, r4, r6\n\t"
  37253. "sbcs r5, r5, r7\n\t"
  37254. "stm %[r]!, {r4, r5}\n\t"
  37255. "ldm %[a]!, {r4, r5}\n\t"
  37256. "ldm %[b]!, {r6, r7}\n\t"
  37257. "and r6, r6, %[m]\n\t"
  37258. "and r7, r7, %[m]\n\t"
  37259. "sbcs r4, r4, r6\n\t"
  37260. "sbcs r5, r5, r7\n\t"
  37261. "stm %[r]!, {r4, r5}\n\t"
  37262. "ldm %[a]!, {r4, r5}\n\t"
  37263. "ldm %[b]!, {r6, r7}\n\t"
  37264. "and r6, r6, %[m]\n\t"
  37265. "and r7, r7, %[m]\n\t"
  37266. "sbcs r4, r4, r6\n\t"
  37267. "sbcs r5, r5, r7\n\t"
  37268. "stm %[r]!, {r4, r5}\n\t"
  37269. "ldm %[a]!, {r4, r5}\n\t"
  37270. "ldm %[b]!, {r6, r7}\n\t"
  37271. "and r6, r6, %[m]\n\t"
  37272. "and r7, r7, %[m]\n\t"
  37273. "sbcs r4, r4, r6\n\t"
  37274. "sbcs r5, r5, r7\n\t"
  37275. "stm %[r]!, {r4, r5}\n\t"
  37276. "ldm %[a]!, {r4, r5}\n\t"
  37277. "ldm %[b]!, {r6, r7}\n\t"
  37278. "and r6, r6, %[m]\n\t"
  37279. "and r7, r7, %[m]\n\t"
  37280. "sbcs r4, r4, r6\n\t"
  37281. "sbcs r5, r5, r7\n\t"
  37282. "stm %[r]!, {r4, r5}\n\t"
  37283. "ldm %[a]!, {r4, r5}\n\t"
  37284. "ldm %[b]!, {r6, r7}\n\t"
  37285. "and r6, r6, %[m]\n\t"
  37286. "and r7, r7, %[m]\n\t"
  37287. "sbcs r4, r4, r6\n\t"
  37288. "sbcs r5, r5, r7\n\t"
  37289. "stm %[r]!, {r4, r5}\n\t"
  37290. "ldm %[a]!, {r4, r5}\n\t"
  37291. "ldm %[b]!, {r6, r7}\n\t"
  37292. "and r6, r6, %[m]\n\t"
  37293. "and r7, r7, %[m]\n\t"
  37294. "sbcs r4, r4, r6\n\t"
  37295. "sbcs r5, r5, r7\n\t"
  37296. "stm %[r]!, {r4, r5}\n\t"
  37297. "ldm %[a]!, {r4, r5}\n\t"
  37298. "ldm %[b]!, {r6, r7}\n\t"
  37299. "and r6, r6, %[m]\n\t"
  37300. "and r7, r7, %[m]\n\t"
  37301. "sbcs r4, r4, r6\n\t"
  37302. "sbcs r5, r5, r7\n\t"
  37303. "stm %[r]!, {r4, r5}\n\t"
  37304. "ldm %[a]!, {r4, r5}\n\t"
  37305. "ldm %[b]!, {r6, r7}\n\t"
  37306. "and r6, r6, %[m]\n\t"
  37307. "and r7, r7, %[m]\n\t"
  37308. "sbcs r4, r4, r6\n\t"
  37309. "sbcs r5, r5, r7\n\t"
  37310. "stm %[r]!, {r4, r5}\n\t"
  37311. "ldm %[a]!, {r4, r5}\n\t"
  37312. "ldm %[b]!, {r6, r7}\n\t"
  37313. "and r6, r6, %[m]\n\t"
  37314. "and r7, r7, %[m]\n\t"
  37315. "sbcs r4, r4, r6\n\t"
  37316. "sbcs r5, r5, r7\n\t"
  37317. "stm %[r]!, {r4, r5}\n\t"
  37318. "ldm %[a]!, {r4, r5}\n\t"
  37319. "ldm %[b]!, {r6, r7}\n\t"
  37320. "and r6, r6, %[m]\n\t"
  37321. "and r7, r7, %[m]\n\t"
  37322. "sbcs r4, r4, r6\n\t"
  37323. "sbcs r5, r5, r7\n\t"
  37324. "stm %[r]!, {r4, r5}\n\t"
  37325. "ldm %[a]!, {r4, r5}\n\t"
  37326. "ldm %[b]!, {r6, r7}\n\t"
  37327. "and r6, r6, %[m]\n\t"
  37328. "and r7, r7, %[m]\n\t"
  37329. "sbcs r4, r4, r6\n\t"
  37330. "sbcs r5, r5, r7\n\t"
  37331. "stm %[r]!, {r4, r5}\n\t"
  37332. "ldm %[a]!, {r4, r5}\n\t"
  37333. "ldm %[b]!, {r6, r7}\n\t"
  37334. "and r6, r6, %[m]\n\t"
  37335. "and r7, r7, %[m]\n\t"
  37336. "sbcs r4, r4, r6\n\t"
  37337. "sbcs r5, r5, r7\n\t"
  37338. "stm %[r]!, {r4, r5}\n\t"
  37339. "ldm %[a]!, {r4, r5}\n\t"
  37340. "ldm %[b]!, {r6, r7}\n\t"
  37341. "and r6, r6, %[m]\n\t"
  37342. "and r7, r7, %[m]\n\t"
  37343. "sbcs r4, r4, r6\n\t"
  37344. "sbcs r5, r5, r7\n\t"
  37345. "stm %[r]!, {r4, r5}\n\t"
  37346. "ldm %[a]!, {r4, r5}\n\t"
  37347. "ldm %[b]!, {r6, r7}\n\t"
  37348. "and r6, r6, %[m]\n\t"
  37349. "and r7, r7, %[m]\n\t"
  37350. "sbcs r4, r4, r6\n\t"
  37351. "sbcs r5, r5, r7\n\t"
  37352. "stm %[r]!, {r4, r5}\n\t"
  37353. "ldm %[a]!, {r4, r5}\n\t"
  37354. "ldm %[b]!, {r6, r7}\n\t"
  37355. "and r6, r6, %[m]\n\t"
  37356. "and r7, r7, %[m]\n\t"
  37357. "sbcs r4, r4, r6\n\t"
  37358. "sbcs r5, r5, r7\n\t"
  37359. "stm %[r]!, {r4, r5}\n\t"
  37360. "ldm %[a]!, {r4, r5}\n\t"
  37361. "ldm %[b]!, {r6, r7}\n\t"
  37362. "and r6, r6, %[m]\n\t"
  37363. "and r7, r7, %[m]\n\t"
  37364. "sbcs r4, r4, r6\n\t"
  37365. "sbcs r5, r5, r7\n\t"
  37366. "stm %[r]!, {r4, r5}\n\t"
  37367. "ldm %[a]!, {r4, r5}\n\t"
  37368. "ldm %[b]!, {r6, r7}\n\t"
  37369. "and r6, r6, %[m]\n\t"
  37370. "and r7, r7, %[m]\n\t"
  37371. "sbcs r4, r4, r6\n\t"
  37372. "sbcs r5, r5, r7\n\t"
  37373. "stm %[r]!, {r4, r5}\n\t"
  37374. "ldm %[a]!, {r4, r5}\n\t"
  37375. "ldm %[b]!, {r6, r7}\n\t"
  37376. "and r6, r6, %[m]\n\t"
  37377. "and r7, r7, %[m]\n\t"
  37378. "sbcs r4, r4, r6\n\t"
  37379. "sbcs r5, r5, r7\n\t"
  37380. "stm %[r]!, {r4, r5}\n\t"
  37381. "ldm %[a]!, {r4, r5}\n\t"
  37382. "ldm %[b]!, {r6, r7}\n\t"
  37383. "and r6, r6, %[m]\n\t"
  37384. "and r7, r7, %[m]\n\t"
  37385. "sbcs r4, r4, r6\n\t"
  37386. "sbcs r5, r5, r7\n\t"
  37387. "stm %[r]!, {r4, r5}\n\t"
  37388. "ldm %[a]!, {r4, r5}\n\t"
  37389. "ldm %[b]!, {r6, r7}\n\t"
  37390. "and r6, r6, %[m]\n\t"
  37391. "and r7, r7, %[m]\n\t"
  37392. "sbcs r4, r4, r6\n\t"
  37393. "sbcs r5, r5, r7\n\t"
  37394. "stm %[r]!, {r4, r5}\n\t"
  37395. "ldm %[a]!, {r4, r5}\n\t"
  37396. "ldm %[b]!, {r6, r7}\n\t"
  37397. "and r6, r6, %[m]\n\t"
  37398. "and r7, r7, %[m]\n\t"
  37399. "sbcs r4, r4, r6\n\t"
  37400. "sbcs r5, r5, r7\n\t"
  37401. "stm %[r]!, {r4, r5}\n\t"
  37402. "ldm %[a]!, {r4, r5}\n\t"
  37403. "ldm %[b]!, {r6, r7}\n\t"
  37404. "and r6, r6, %[m]\n\t"
  37405. "and r7, r7, %[m]\n\t"
  37406. "sbcs r4, r4, r6\n\t"
  37407. "sbcs r5, r5, r7\n\t"
  37408. "stm %[r]!, {r4, r5}\n\t"
  37409. "ldm %[a]!, {r4, r5}\n\t"
  37410. "ldm %[b]!, {r6, r7}\n\t"
  37411. "and r6, r6, %[m]\n\t"
  37412. "and r7, r7, %[m]\n\t"
  37413. "sbcs r4, r4, r6\n\t"
  37414. "sbcs r5, r5, r7\n\t"
  37415. "stm %[r]!, {r4, r5}\n\t"
  37416. "ldm %[a]!, {r4, r5}\n\t"
  37417. "ldm %[b]!, {r6, r7}\n\t"
  37418. "and r6, r6, %[m]\n\t"
  37419. "and r7, r7, %[m]\n\t"
  37420. "sbcs r4, r4, r6\n\t"
  37421. "sbcs r5, r5, r7\n\t"
  37422. "stm %[r]!, {r4, r5}\n\t"
  37423. "ldm %[a]!, {r4, r5}\n\t"
  37424. "ldm %[b]!, {r6, r7}\n\t"
  37425. "and r6, r6, %[m]\n\t"
  37426. "and r7, r7, %[m]\n\t"
  37427. "sbcs r4, r4, r6\n\t"
  37428. "sbcs r5, r5, r7\n\t"
  37429. "stm %[r]!, {r4, r5}\n\t"
  37430. "ldm %[a]!, {r4, r5}\n\t"
  37431. "ldm %[b]!, {r6, r7}\n\t"
  37432. "and r6, r6, %[m]\n\t"
  37433. "and r7, r7, %[m]\n\t"
  37434. "sbcs r4, r4, r6\n\t"
  37435. "sbcs r5, r5, r7\n\t"
  37436. "stm %[r]!, {r4, r5}\n\t"
  37437. "ldm %[a]!, {r4, r5}\n\t"
  37438. "ldm %[b]!, {r6, r7}\n\t"
  37439. "and r6, r6, %[m]\n\t"
  37440. "and r7, r7, %[m]\n\t"
  37441. "sbcs r4, r4, r6\n\t"
  37442. "sbcs r5, r5, r7\n\t"
  37443. "stm %[r]!, {r4, r5}\n\t"
  37444. "ldm %[a]!, {r4, r5}\n\t"
  37445. "ldm %[b]!, {r6, r7}\n\t"
  37446. "and r6, r6, %[m]\n\t"
  37447. "and r7, r7, %[m]\n\t"
  37448. "sbcs r4, r4, r6\n\t"
  37449. "sbcs r5, r5, r7\n\t"
  37450. "stm %[r]!, {r4, r5}\n\t"
  37451. "ldm %[a]!, {r4, r5}\n\t"
  37452. "ldm %[b]!, {r6, r7}\n\t"
  37453. "and r6, r6, %[m]\n\t"
  37454. "and r7, r7, %[m]\n\t"
  37455. "sbcs r4, r4, r6\n\t"
  37456. "sbcs r5, r5, r7\n\t"
  37457. "stm %[r]!, {r4, r5}\n\t"
  37458. "ldm %[a]!, {r4, r5}\n\t"
  37459. "ldm %[b]!, {r6, r7}\n\t"
  37460. "and r6, r6, %[m]\n\t"
  37461. "and r7, r7, %[m]\n\t"
  37462. "sbcs r4, r4, r6\n\t"
  37463. "sbcs r5, r5, r7\n\t"
  37464. "stm %[r]!, {r4, r5}\n\t"
  37465. "ldm %[a]!, {r4, r5}\n\t"
  37466. "ldm %[b]!, {r6, r7}\n\t"
  37467. "and r6, r6, %[m]\n\t"
  37468. "and r7, r7, %[m]\n\t"
  37469. "sbcs r4, r4, r6\n\t"
  37470. "sbcs r5, r5, r7\n\t"
  37471. "stm %[r]!, {r4, r5}\n\t"
  37472. "ldm %[a]!, {r4, r5}\n\t"
  37473. "ldm %[b]!, {r6, r7}\n\t"
  37474. "and r6, r6, %[m]\n\t"
  37475. "and r7, r7, %[m]\n\t"
  37476. "sbcs r4, r4, r6\n\t"
  37477. "sbcs r5, r5, r7\n\t"
  37478. "stm %[r]!, {r4, r5}\n\t"
  37479. "ldm %[a]!, {r4, r5}\n\t"
  37480. "ldm %[b]!, {r6, r7}\n\t"
  37481. "and r6, r6, %[m]\n\t"
  37482. "and r7, r7, %[m]\n\t"
  37483. "sbcs r4, r4, r6\n\t"
  37484. "sbcs r5, r5, r7\n\t"
  37485. "stm %[r]!, {r4, r5}\n\t"
  37486. "ldm %[a]!, {r4, r5}\n\t"
  37487. "ldm %[b]!, {r6, r7}\n\t"
  37488. "and r6, r6, %[m]\n\t"
  37489. "and r7, r7, %[m]\n\t"
  37490. "sbcs r4, r4, r6\n\t"
  37491. "sbcs r5, r5, r7\n\t"
  37492. "stm %[r]!, {r4, r5}\n\t"
  37493. "ldm %[a]!, {r4, r5}\n\t"
  37494. "ldm %[b]!, {r6, r7}\n\t"
  37495. "and r6, r6, %[m]\n\t"
  37496. "and r7, r7, %[m]\n\t"
  37497. "sbcs r4, r4, r6\n\t"
  37498. "sbcs r5, r5, r7\n\t"
  37499. "stm %[r]!, {r4, r5}\n\t"
  37500. "ldm %[a]!, {r4, r5}\n\t"
  37501. "ldm %[b]!, {r6, r7}\n\t"
  37502. "and r6, r6, %[m]\n\t"
  37503. "and r7, r7, %[m]\n\t"
  37504. "sbcs r4, r4, r6\n\t"
  37505. "sbcs r5, r5, r7\n\t"
  37506. "stm %[r]!, {r4, r5}\n\t"
  37507. "ldm %[a]!, {r4, r5}\n\t"
  37508. "ldm %[b]!, {r6, r7}\n\t"
  37509. "and r6, r6, %[m]\n\t"
  37510. "and r7, r7, %[m]\n\t"
  37511. "sbcs r4, r4, r6\n\t"
  37512. "sbcs r5, r5, r7\n\t"
  37513. "stm %[r]!, {r4, r5}\n\t"
  37514. "sbc %[r], lr, lr\n\t"
  37515. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  37516. :
  37517. : "memory", "r12", "lr", "r4", "r5", "r6", "r7"
  37518. );
  37519. return (uint32_t)(size_t)r;
  37520. }
  37521. #endif /* WOLFSSL_SP_SMALL */
  37522. /* Reduce the number back to 3072 bits using Montgomery reduction.
  37523. *
  37524. * a A single precision number to reduce in place.
  37525. * m The single precision number representing the modulus.
  37526. * mp The digit representing the negative inverse of m mod 2^n.
  37527. */
  37528. static SP_NOINLINE void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  37529. {
  37530. register sp_digit* a asm ("r0") = a_p;
  37531. register const sp_digit* m asm ("r1") = m_p;
  37532. register sp_digit mp asm ("r2") = mp_p;
  37533. __asm__ __volatile__ (
  37534. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  37535. "ldr r11, [%[m]]\n\t"
  37536. #endif
  37537. /* i = 0 */
  37538. "mov r9, #0\n\t"
  37539. "mov r3, #0\n\t"
  37540. "ldr r12, [%[a]]\n\t"
  37541. "ldr lr, [%[a], #4]\n\t"
  37542. "\n"
  37543. "L_sp_3072_mont_reduce_96_word_%=: \n\t"
  37544. /* mu = a[i] * mp */
  37545. "mul r8, %[mp], r12\n\t"
  37546. /* a[i+0] += m[0] * mu */
  37547. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37548. "ldr r11, [%[m]]\n\t"
  37549. #endif
  37550. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37551. "lsr r7, r11, #16\n\t"
  37552. "lsr r6, r8, #16\n\t"
  37553. "mul r5, r6, r7\n\t"
  37554. "lsl r7, r11, #16\n\t"
  37555. "lsr r7, r7, #16\n\t"
  37556. "mul r6, r7, r6\n\t"
  37557. "lsr r7, r6, #16\n\t"
  37558. "lsl r6, r6, #16\n\t"
  37559. "adds r12, r12, r6\n\t"
  37560. "adc r5, r5, r7\n\t"
  37561. "lsl r6, r8, #16\n\t"
  37562. "lsl r7, r11, #16\n\t"
  37563. "lsr r6, r6, #16\n\t"
  37564. "lsr r7, r7, #16\n\t"
  37565. "mul r7, r6, r7\n\t"
  37566. "adds r12, r12, r7\n\t"
  37567. "adc r5, r5, #0\n\t"
  37568. "lsr r7, r11, #16\n\t"
  37569. "mul r6, r7, r6\n\t"
  37570. "lsr r7, r6, #16\n\t"
  37571. "lsl r6, r6, #16\n\t"
  37572. "adds r12, r12, r6\n\t"
  37573. "adc r5, r5, r7\n\t"
  37574. #else
  37575. "umull r6, r7, r8, r11\n\t"
  37576. "adds r12, r12, r6\n\t"
  37577. "adc r5, r7, #0\n\t"
  37578. #endif
  37579. /* a[i+1] += m[1] * mu */
  37580. "ldr r7, [%[m], #4]\n\t"
  37581. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37582. "lsr r10, r7, #16\n\t"
  37583. "lsr r6, r8, #16\n\t"
  37584. "mul r4, r6, r10\n\t"
  37585. "lsl r10, r7, #16\n\t"
  37586. "lsr r10, r10, #16\n\t"
  37587. "mul r6, r10, r6\n\t"
  37588. "lsr r10, r6, #16\n\t"
  37589. "lsl r6, r6, #16\n\t"
  37590. "adds lr, lr, r6\n\t"
  37591. "adc r4, r4, r10\n\t"
  37592. "lsl r6, r8, #16\n\t"
  37593. "lsl r10, r7, #16\n\t"
  37594. "lsr r6, r6, #16\n\t"
  37595. "lsr r10, r10, #16\n\t"
  37596. "mul r10, r6, r10\n\t"
  37597. "adds lr, lr, r10\n\t"
  37598. "adc r4, r4, #0\n\t"
  37599. "lsr r10, r7, #16\n\t"
  37600. "mul r6, r10, r6\n\t"
  37601. "lsr r10, r6, #16\n\t"
  37602. "lsl r6, r6, #16\n\t"
  37603. "adds lr, lr, r6\n\t"
  37604. "adc r4, r4, r10\n\t"
  37605. #else
  37606. "umull r6, r10, r8, r7\n\t"
  37607. "adds lr, lr, r6\n\t"
  37608. "adc r4, r10, #0\n\t"
  37609. #endif
  37610. "mov r12, lr\n\t"
  37611. "adds r12, r12, r5\n\t"
  37612. "adc r4, r4, #0\n\t"
  37613. /* a[i+2] += m[2] * mu */
  37614. "ldr r7, [%[m], #8]\n\t"
  37615. "ldr lr, [%[a], #8]\n\t"
  37616. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37617. "lsr r10, r7, #16\n\t"
  37618. "lsr r6, r8, #16\n\t"
  37619. "mul r5, r6, r10\n\t"
  37620. "lsl r10, r7, #16\n\t"
  37621. "lsr r10, r10, #16\n\t"
  37622. "mul r6, r10, r6\n\t"
  37623. "lsr r10, r6, #16\n\t"
  37624. "lsl r6, r6, #16\n\t"
  37625. "adds lr, lr, r6\n\t"
  37626. "adc r5, r5, r10\n\t"
  37627. "lsl r6, r8, #16\n\t"
  37628. "lsl r10, r7, #16\n\t"
  37629. "lsr r6, r6, #16\n\t"
  37630. "lsr r10, r10, #16\n\t"
  37631. "mul r10, r6, r10\n\t"
  37632. "adds lr, lr, r10\n\t"
  37633. "adc r5, r5, #0\n\t"
  37634. "lsr r10, r7, #16\n\t"
  37635. "mul r6, r10, r6\n\t"
  37636. "lsr r10, r6, #16\n\t"
  37637. "lsl r6, r6, #16\n\t"
  37638. "adds lr, lr, r6\n\t"
  37639. "adc r5, r5, r10\n\t"
  37640. #else
  37641. "umull r6, r10, r8, r7\n\t"
  37642. "adds lr, lr, r6\n\t"
  37643. "adc r5, r10, #0\n\t"
  37644. #endif
  37645. "adds lr, lr, r4\n\t"
  37646. "adc r5, r5, #0\n\t"
  37647. /* a[i+3] += m[3] * mu */
  37648. "ldr r7, [%[m], #12]\n\t"
  37649. "ldr r10, [%[a], #12]\n\t"
  37650. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37651. "lsr r11, r7, #16\n\t"
  37652. "lsr r6, r8, #16\n\t"
  37653. "mul r4, r6, r11\n\t"
  37654. "lsl r11, r7, #16\n\t"
  37655. "lsr r11, r11, #16\n\t"
  37656. "mul r6, r11, r6\n\t"
  37657. "lsr r11, r6, #16\n\t"
  37658. "lsl r6, r6, #16\n\t"
  37659. "adds r10, r10, r6\n\t"
  37660. "adc r4, r4, r11\n\t"
  37661. "lsl r6, r8, #16\n\t"
  37662. "lsl r11, r7, #16\n\t"
  37663. "lsr r6, r6, #16\n\t"
  37664. "lsr r11, r11, #16\n\t"
  37665. "mul r11, r6, r11\n\t"
  37666. "adds r10, r10, r11\n\t"
  37667. "adc r4, r4, #0\n\t"
  37668. "lsr r11, r7, #16\n\t"
  37669. "mul r6, r11, r6\n\t"
  37670. "lsr r11, r6, #16\n\t"
  37671. "lsl r6, r6, #16\n\t"
  37672. "adds r10, r10, r6\n\t"
  37673. "adc r4, r4, r11\n\t"
  37674. #else
  37675. "umull r6, r7, r8, r7\n\t"
  37676. "adds r10, r10, r6\n\t"
  37677. "adc r4, r7, #0\n\t"
  37678. #endif
  37679. "adds r10, r10, r5\n\t"
  37680. "str r10, [%[a], #12]\n\t"
  37681. "adc r4, r4, #0\n\t"
  37682. /* a[i+4] += m[4] * mu */
  37683. "ldr r7, [%[m], #16]\n\t"
  37684. "ldr r10, [%[a], #16]\n\t"
  37685. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37686. "lsr r11, r7, #16\n\t"
  37687. "lsr r6, r8, #16\n\t"
  37688. "mul r5, r6, r11\n\t"
  37689. "lsl r11, r7, #16\n\t"
  37690. "lsr r11, r11, #16\n\t"
  37691. "mul r6, r11, r6\n\t"
  37692. "lsr r11, r6, #16\n\t"
  37693. "lsl r6, r6, #16\n\t"
  37694. "adds r10, r10, r6\n\t"
  37695. "adc r5, r5, r11\n\t"
  37696. "lsl r6, r8, #16\n\t"
  37697. "lsl r11, r7, #16\n\t"
  37698. "lsr r6, r6, #16\n\t"
  37699. "lsr r11, r11, #16\n\t"
  37700. "mul r11, r6, r11\n\t"
  37701. "adds r10, r10, r11\n\t"
  37702. "adc r5, r5, #0\n\t"
  37703. "lsr r11, r7, #16\n\t"
  37704. "mul r6, r11, r6\n\t"
  37705. "lsr r11, r6, #16\n\t"
  37706. "lsl r6, r6, #16\n\t"
  37707. "adds r10, r10, r6\n\t"
  37708. "adc r5, r5, r11\n\t"
  37709. #else
  37710. "umull r6, r7, r8, r7\n\t"
  37711. "adds r10, r10, r6\n\t"
  37712. "adc r5, r7, #0\n\t"
  37713. #endif
  37714. "adds r10, r10, r4\n\t"
  37715. "str r10, [%[a], #16]\n\t"
  37716. "adc r5, r5, #0\n\t"
  37717. /* a[i+5] += m[5] * mu */
  37718. "ldr r7, [%[m], #20]\n\t"
  37719. "ldr r10, [%[a], #20]\n\t"
  37720. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37721. "lsr r11, r7, #16\n\t"
  37722. "lsr r6, r8, #16\n\t"
  37723. "mul r4, r6, r11\n\t"
  37724. "lsl r11, r7, #16\n\t"
  37725. "lsr r11, r11, #16\n\t"
  37726. "mul r6, r11, r6\n\t"
  37727. "lsr r11, r6, #16\n\t"
  37728. "lsl r6, r6, #16\n\t"
  37729. "adds r10, r10, r6\n\t"
  37730. "adc r4, r4, r11\n\t"
  37731. "lsl r6, r8, #16\n\t"
  37732. "lsl r11, r7, #16\n\t"
  37733. "lsr r6, r6, #16\n\t"
  37734. "lsr r11, r11, #16\n\t"
  37735. "mul r11, r6, r11\n\t"
  37736. "adds r10, r10, r11\n\t"
  37737. "adc r4, r4, #0\n\t"
  37738. "lsr r11, r7, #16\n\t"
  37739. "mul r6, r11, r6\n\t"
  37740. "lsr r11, r6, #16\n\t"
  37741. "lsl r6, r6, #16\n\t"
  37742. "adds r10, r10, r6\n\t"
  37743. "adc r4, r4, r11\n\t"
  37744. #else
  37745. "umull r6, r7, r8, r7\n\t"
  37746. "adds r10, r10, r6\n\t"
  37747. "adc r4, r7, #0\n\t"
  37748. #endif
  37749. "adds r10, r10, r5\n\t"
  37750. "str r10, [%[a], #20]\n\t"
  37751. "adc r4, r4, #0\n\t"
  37752. /* a[i+6] += m[6] * mu */
  37753. "ldr r7, [%[m], #24]\n\t"
  37754. "ldr r10, [%[a], #24]\n\t"
  37755. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37756. "lsr r11, r7, #16\n\t"
  37757. "lsr r6, r8, #16\n\t"
  37758. "mul r5, r6, r11\n\t"
  37759. "lsl r11, r7, #16\n\t"
  37760. "lsr r11, r11, #16\n\t"
  37761. "mul r6, r11, r6\n\t"
  37762. "lsr r11, r6, #16\n\t"
  37763. "lsl r6, r6, #16\n\t"
  37764. "adds r10, r10, r6\n\t"
  37765. "adc r5, r5, r11\n\t"
  37766. "lsl r6, r8, #16\n\t"
  37767. "lsl r11, r7, #16\n\t"
  37768. "lsr r6, r6, #16\n\t"
  37769. "lsr r11, r11, #16\n\t"
  37770. "mul r11, r6, r11\n\t"
  37771. "adds r10, r10, r11\n\t"
  37772. "adc r5, r5, #0\n\t"
  37773. "lsr r11, r7, #16\n\t"
  37774. "mul r6, r11, r6\n\t"
  37775. "lsr r11, r6, #16\n\t"
  37776. "lsl r6, r6, #16\n\t"
  37777. "adds r10, r10, r6\n\t"
  37778. "adc r5, r5, r11\n\t"
  37779. #else
  37780. "umull r6, r7, r8, r7\n\t"
  37781. "adds r10, r10, r6\n\t"
  37782. "adc r5, r7, #0\n\t"
  37783. #endif
  37784. "adds r10, r10, r4\n\t"
  37785. "str r10, [%[a], #24]\n\t"
  37786. "adc r5, r5, #0\n\t"
  37787. /* a[i+7] += m[7] * mu */
  37788. "ldr r7, [%[m], #28]\n\t"
  37789. "ldr r10, [%[a], #28]\n\t"
  37790. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37791. "lsr r11, r7, #16\n\t"
  37792. "lsr r6, r8, #16\n\t"
  37793. "mul r4, r6, r11\n\t"
  37794. "lsl r11, r7, #16\n\t"
  37795. "lsr r11, r11, #16\n\t"
  37796. "mul r6, r11, r6\n\t"
  37797. "lsr r11, r6, #16\n\t"
  37798. "lsl r6, r6, #16\n\t"
  37799. "adds r10, r10, r6\n\t"
  37800. "adc r4, r4, r11\n\t"
  37801. "lsl r6, r8, #16\n\t"
  37802. "lsl r11, r7, #16\n\t"
  37803. "lsr r6, r6, #16\n\t"
  37804. "lsr r11, r11, #16\n\t"
  37805. "mul r11, r6, r11\n\t"
  37806. "adds r10, r10, r11\n\t"
  37807. "adc r4, r4, #0\n\t"
  37808. "lsr r11, r7, #16\n\t"
  37809. "mul r6, r11, r6\n\t"
  37810. "lsr r11, r6, #16\n\t"
  37811. "lsl r6, r6, #16\n\t"
  37812. "adds r10, r10, r6\n\t"
  37813. "adc r4, r4, r11\n\t"
  37814. #else
  37815. "umull r6, r7, r8, r7\n\t"
  37816. "adds r10, r10, r6\n\t"
  37817. "adc r4, r7, #0\n\t"
  37818. #endif
  37819. "adds r10, r10, r5\n\t"
  37820. "str r10, [%[a], #28]\n\t"
  37821. "adc r4, r4, #0\n\t"
  37822. /* a[i+8] += m[8] * mu */
  37823. "ldr r7, [%[m], #32]\n\t"
  37824. "ldr r10, [%[a], #32]\n\t"
  37825. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37826. "lsr r11, r7, #16\n\t"
  37827. "lsr r6, r8, #16\n\t"
  37828. "mul r5, r6, r11\n\t"
  37829. "lsl r11, r7, #16\n\t"
  37830. "lsr r11, r11, #16\n\t"
  37831. "mul r6, r11, r6\n\t"
  37832. "lsr r11, r6, #16\n\t"
  37833. "lsl r6, r6, #16\n\t"
  37834. "adds r10, r10, r6\n\t"
  37835. "adc r5, r5, r11\n\t"
  37836. "lsl r6, r8, #16\n\t"
  37837. "lsl r11, r7, #16\n\t"
  37838. "lsr r6, r6, #16\n\t"
  37839. "lsr r11, r11, #16\n\t"
  37840. "mul r11, r6, r11\n\t"
  37841. "adds r10, r10, r11\n\t"
  37842. "adc r5, r5, #0\n\t"
  37843. "lsr r11, r7, #16\n\t"
  37844. "mul r6, r11, r6\n\t"
  37845. "lsr r11, r6, #16\n\t"
  37846. "lsl r6, r6, #16\n\t"
  37847. "adds r10, r10, r6\n\t"
  37848. "adc r5, r5, r11\n\t"
  37849. #else
  37850. "umull r6, r7, r8, r7\n\t"
  37851. "adds r10, r10, r6\n\t"
  37852. "adc r5, r7, #0\n\t"
  37853. #endif
  37854. "adds r10, r10, r4\n\t"
  37855. "str r10, [%[a], #32]\n\t"
  37856. "adc r5, r5, #0\n\t"
  37857. /* a[i+9] += m[9] * mu */
  37858. "ldr r7, [%[m], #36]\n\t"
  37859. "ldr r10, [%[a], #36]\n\t"
  37860. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37861. "lsr r11, r7, #16\n\t"
  37862. "lsr r6, r8, #16\n\t"
  37863. "mul r4, r6, r11\n\t"
  37864. "lsl r11, r7, #16\n\t"
  37865. "lsr r11, r11, #16\n\t"
  37866. "mul r6, r11, r6\n\t"
  37867. "lsr r11, r6, #16\n\t"
  37868. "lsl r6, r6, #16\n\t"
  37869. "adds r10, r10, r6\n\t"
  37870. "adc r4, r4, r11\n\t"
  37871. "lsl r6, r8, #16\n\t"
  37872. "lsl r11, r7, #16\n\t"
  37873. "lsr r6, r6, #16\n\t"
  37874. "lsr r11, r11, #16\n\t"
  37875. "mul r11, r6, r11\n\t"
  37876. "adds r10, r10, r11\n\t"
  37877. "adc r4, r4, #0\n\t"
  37878. "lsr r11, r7, #16\n\t"
  37879. "mul r6, r11, r6\n\t"
  37880. "lsr r11, r6, #16\n\t"
  37881. "lsl r6, r6, #16\n\t"
  37882. "adds r10, r10, r6\n\t"
  37883. "adc r4, r4, r11\n\t"
  37884. #else
  37885. "umull r6, r7, r8, r7\n\t"
  37886. "adds r10, r10, r6\n\t"
  37887. "adc r4, r7, #0\n\t"
  37888. #endif
  37889. "adds r10, r10, r5\n\t"
  37890. "str r10, [%[a], #36]\n\t"
  37891. "adc r4, r4, #0\n\t"
  37892. /* a[i+10] += m[10] * mu */
  37893. "ldr r7, [%[m], #40]\n\t"
  37894. "ldr r10, [%[a], #40]\n\t"
  37895. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37896. "lsr r11, r7, #16\n\t"
  37897. "lsr r6, r8, #16\n\t"
  37898. "mul r5, r6, r11\n\t"
  37899. "lsl r11, r7, #16\n\t"
  37900. "lsr r11, r11, #16\n\t"
  37901. "mul r6, r11, r6\n\t"
  37902. "lsr r11, r6, #16\n\t"
  37903. "lsl r6, r6, #16\n\t"
  37904. "adds r10, r10, r6\n\t"
  37905. "adc r5, r5, r11\n\t"
  37906. "lsl r6, r8, #16\n\t"
  37907. "lsl r11, r7, #16\n\t"
  37908. "lsr r6, r6, #16\n\t"
  37909. "lsr r11, r11, #16\n\t"
  37910. "mul r11, r6, r11\n\t"
  37911. "adds r10, r10, r11\n\t"
  37912. "adc r5, r5, #0\n\t"
  37913. "lsr r11, r7, #16\n\t"
  37914. "mul r6, r11, r6\n\t"
  37915. "lsr r11, r6, #16\n\t"
  37916. "lsl r6, r6, #16\n\t"
  37917. "adds r10, r10, r6\n\t"
  37918. "adc r5, r5, r11\n\t"
  37919. #else
  37920. "umull r6, r7, r8, r7\n\t"
  37921. "adds r10, r10, r6\n\t"
  37922. "adc r5, r7, #0\n\t"
  37923. #endif
  37924. "adds r10, r10, r4\n\t"
  37925. "str r10, [%[a], #40]\n\t"
  37926. "adc r5, r5, #0\n\t"
  37927. /* a[i+11] += m[11] * mu */
  37928. "ldr r7, [%[m], #44]\n\t"
  37929. "ldr r10, [%[a], #44]\n\t"
  37930. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37931. "lsr r11, r7, #16\n\t"
  37932. "lsr r6, r8, #16\n\t"
  37933. "mul r4, r6, r11\n\t"
  37934. "lsl r11, r7, #16\n\t"
  37935. "lsr r11, r11, #16\n\t"
  37936. "mul r6, r11, r6\n\t"
  37937. "lsr r11, r6, #16\n\t"
  37938. "lsl r6, r6, #16\n\t"
  37939. "adds r10, r10, r6\n\t"
  37940. "adc r4, r4, r11\n\t"
  37941. "lsl r6, r8, #16\n\t"
  37942. "lsl r11, r7, #16\n\t"
  37943. "lsr r6, r6, #16\n\t"
  37944. "lsr r11, r11, #16\n\t"
  37945. "mul r11, r6, r11\n\t"
  37946. "adds r10, r10, r11\n\t"
  37947. "adc r4, r4, #0\n\t"
  37948. "lsr r11, r7, #16\n\t"
  37949. "mul r6, r11, r6\n\t"
  37950. "lsr r11, r6, #16\n\t"
  37951. "lsl r6, r6, #16\n\t"
  37952. "adds r10, r10, r6\n\t"
  37953. "adc r4, r4, r11\n\t"
  37954. #else
  37955. "umull r6, r7, r8, r7\n\t"
  37956. "adds r10, r10, r6\n\t"
  37957. "adc r4, r7, #0\n\t"
  37958. #endif
  37959. "adds r10, r10, r5\n\t"
  37960. "str r10, [%[a], #44]\n\t"
  37961. "adc r4, r4, #0\n\t"
  37962. /* a[i+12] += m[12] * mu */
  37963. "ldr r7, [%[m], #48]\n\t"
  37964. "ldr r10, [%[a], #48]\n\t"
  37965. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  37966. "lsr r11, r7, #16\n\t"
  37967. "lsr r6, r8, #16\n\t"
  37968. "mul r5, r6, r11\n\t"
  37969. "lsl r11, r7, #16\n\t"
  37970. "lsr r11, r11, #16\n\t"
  37971. "mul r6, r11, r6\n\t"
  37972. "lsr r11, r6, #16\n\t"
  37973. "lsl r6, r6, #16\n\t"
  37974. "adds r10, r10, r6\n\t"
  37975. "adc r5, r5, r11\n\t"
  37976. "lsl r6, r8, #16\n\t"
  37977. "lsl r11, r7, #16\n\t"
  37978. "lsr r6, r6, #16\n\t"
  37979. "lsr r11, r11, #16\n\t"
  37980. "mul r11, r6, r11\n\t"
  37981. "adds r10, r10, r11\n\t"
  37982. "adc r5, r5, #0\n\t"
  37983. "lsr r11, r7, #16\n\t"
  37984. "mul r6, r11, r6\n\t"
  37985. "lsr r11, r6, #16\n\t"
  37986. "lsl r6, r6, #16\n\t"
  37987. "adds r10, r10, r6\n\t"
  37988. "adc r5, r5, r11\n\t"
  37989. #else
  37990. "umull r6, r7, r8, r7\n\t"
  37991. "adds r10, r10, r6\n\t"
  37992. "adc r5, r7, #0\n\t"
  37993. #endif
  37994. "adds r10, r10, r4\n\t"
  37995. "str r10, [%[a], #48]\n\t"
  37996. "adc r5, r5, #0\n\t"
  37997. /* a[i+13] += m[13] * mu */
  37998. "ldr r7, [%[m], #52]\n\t"
  37999. "ldr r10, [%[a], #52]\n\t"
  38000. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38001. "lsr r11, r7, #16\n\t"
  38002. "lsr r6, r8, #16\n\t"
  38003. "mul r4, r6, r11\n\t"
  38004. "lsl r11, r7, #16\n\t"
  38005. "lsr r11, r11, #16\n\t"
  38006. "mul r6, r11, r6\n\t"
  38007. "lsr r11, r6, #16\n\t"
  38008. "lsl r6, r6, #16\n\t"
  38009. "adds r10, r10, r6\n\t"
  38010. "adc r4, r4, r11\n\t"
  38011. "lsl r6, r8, #16\n\t"
  38012. "lsl r11, r7, #16\n\t"
  38013. "lsr r6, r6, #16\n\t"
  38014. "lsr r11, r11, #16\n\t"
  38015. "mul r11, r6, r11\n\t"
  38016. "adds r10, r10, r11\n\t"
  38017. "adc r4, r4, #0\n\t"
  38018. "lsr r11, r7, #16\n\t"
  38019. "mul r6, r11, r6\n\t"
  38020. "lsr r11, r6, #16\n\t"
  38021. "lsl r6, r6, #16\n\t"
  38022. "adds r10, r10, r6\n\t"
  38023. "adc r4, r4, r11\n\t"
  38024. #else
  38025. "umull r6, r7, r8, r7\n\t"
  38026. "adds r10, r10, r6\n\t"
  38027. "adc r4, r7, #0\n\t"
  38028. #endif
  38029. "adds r10, r10, r5\n\t"
  38030. "str r10, [%[a], #52]\n\t"
  38031. "adc r4, r4, #0\n\t"
  38032. /* a[i+14] += m[14] * mu */
  38033. "ldr r7, [%[m], #56]\n\t"
  38034. "ldr r10, [%[a], #56]\n\t"
  38035. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38036. "lsr r11, r7, #16\n\t"
  38037. "lsr r6, r8, #16\n\t"
  38038. "mul r5, r6, r11\n\t"
  38039. "lsl r11, r7, #16\n\t"
  38040. "lsr r11, r11, #16\n\t"
  38041. "mul r6, r11, r6\n\t"
  38042. "lsr r11, r6, #16\n\t"
  38043. "lsl r6, r6, #16\n\t"
  38044. "adds r10, r10, r6\n\t"
  38045. "adc r5, r5, r11\n\t"
  38046. "lsl r6, r8, #16\n\t"
  38047. "lsl r11, r7, #16\n\t"
  38048. "lsr r6, r6, #16\n\t"
  38049. "lsr r11, r11, #16\n\t"
  38050. "mul r11, r6, r11\n\t"
  38051. "adds r10, r10, r11\n\t"
  38052. "adc r5, r5, #0\n\t"
  38053. "lsr r11, r7, #16\n\t"
  38054. "mul r6, r11, r6\n\t"
  38055. "lsr r11, r6, #16\n\t"
  38056. "lsl r6, r6, #16\n\t"
  38057. "adds r10, r10, r6\n\t"
  38058. "adc r5, r5, r11\n\t"
  38059. #else
  38060. "umull r6, r7, r8, r7\n\t"
  38061. "adds r10, r10, r6\n\t"
  38062. "adc r5, r7, #0\n\t"
  38063. #endif
  38064. "adds r10, r10, r4\n\t"
  38065. "str r10, [%[a], #56]\n\t"
  38066. "adc r5, r5, #0\n\t"
  38067. /* a[i+15] += m[15] * mu */
  38068. "ldr r7, [%[m], #60]\n\t"
  38069. "ldr r10, [%[a], #60]\n\t"
  38070. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38071. "lsr r11, r7, #16\n\t"
  38072. "lsr r6, r8, #16\n\t"
  38073. "mul r4, r6, r11\n\t"
  38074. "lsl r11, r7, #16\n\t"
  38075. "lsr r11, r11, #16\n\t"
  38076. "mul r6, r11, r6\n\t"
  38077. "lsr r11, r6, #16\n\t"
  38078. "lsl r6, r6, #16\n\t"
  38079. "adds r10, r10, r6\n\t"
  38080. "adc r4, r4, r11\n\t"
  38081. "lsl r6, r8, #16\n\t"
  38082. "lsl r11, r7, #16\n\t"
  38083. "lsr r6, r6, #16\n\t"
  38084. "lsr r11, r11, #16\n\t"
  38085. "mul r11, r6, r11\n\t"
  38086. "adds r10, r10, r11\n\t"
  38087. "adc r4, r4, #0\n\t"
  38088. "lsr r11, r7, #16\n\t"
  38089. "mul r6, r11, r6\n\t"
  38090. "lsr r11, r6, #16\n\t"
  38091. "lsl r6, r6, #16\n\t"
  38092. "adds r10, r10, r6\n\t"
  38093. "adc r4, r4, r11\n\t"
  38094. #else
  38095. "umull r6, r7, r8, r7\n\t"
  38096. "adds r10, r10, r6\n\t"
  38097. "adc r4, r7, #0\n\t"
  38098. #endif
  38099. "adds r10, r10, r5\n\t"
  38100. "str r10, [%[a], #60]\n\t"
  38101. "adc r4, r4, #0\n\t"
  38102. /* a[i+16] += m[16] * mu */
  38103. "ldr r7, [%[m], #64]\n\t"
  38104. "ldr r10, [%[a], #64]\n\t"
  38105. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38106. "lsr r11, r7, #16\n\t"
  38107. "lsr r6, r8, #16\n\t"
  38108. "mul r5, r6, r11\n\t"
  38109. "lsl r11, r7, #16\n\t"
  38110. "lsr r11, r11, #16\n\t"
  38111. "mul r6, r11, r6\n\t"
  38112. "lsr r11, r6, #16\n\t"
  38113. "lsl r6, r6, #16\n\t"
  38114. "adds r10, r10, r6\n\t"
  38115. "adc r5, r5, r11\n\t"
  38116. "lsl r6, r8, #16\n\t"
  38117. "lsl r11, r7, #16\n\t"
  38118. "lsr r6, r6, #16\n\t"
  38119. "lsr r11, r11, #16\n\t"
  38120. "mul r11, r6, r11\n\t"
  38121. "adds r10, r10, r11\n\t"
  38122. "adc r5, r5, #0\n\t"
  38123. "lsr r11, r7, #16\n\t"
  38124. "mul r6, r11, r6\n\t"
  38125. "lsr r11, r6, #16\n\t"
  38126. "lsl r6, r6, #16\n\t"
  38127. "adds r10, r10, r6\n\t"
  38128. "adc r5, r5, r11\n\t"
  38129. #else
  38130. "umull r6, r7, r8, r7\n\t"
  38131. "adds r10, r10, r6\n\t"
  38132. "adc r5, r7, #0\n\t"
  38133. #endif
  38134. "adds r10, r10, r4\n\t"
  38135. "str r10, [%[a], #64]\n\t"
  38136. "adc r5, r5, #0\n\t"
  38137. /* a[i+17] += m[17] * mu */
  38138. "ldr r7, [%[m], #68]\n\t"
  38139. "ldr r10, [%[a], #68]\n\t"
  38140. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38141. "lsr r11, r7, #16\n\t"
  38142. "lsr r6, r8, #16\n\t"
  38143. "mul r4, r6, r11\n\t"
  38144. "lsl r11, r7, #16\n\t"
  38145. "lsr r11, r11, #16\n\t"
  38146. "mul r6, r11, r6\n\t"
  38147. "lsr r11, r6, #16\n\t"
  38148. "lsl r6, r6, #16\n\t"
  38149. "adds r10, r10, r6\n\t"
  38150. "adc r4, r4, r11\n\t"
  38151. "lsl r6, r8, #16\n\t"
  38152. "lsl r11, r7, #16\n\t"
  38153. "lsr r6, r6, #16\n\t"
  38154. "lsr r11, r11, #16\n\t"
  38155. "mul r11, r6, r11\n\t"
  38156. "adds r10, r10, r11\n\t"
  38157. "adc r4, r4, #0\n\t"
  38158. "lsr r11, r7, #16\n\t"
  38159. "mul r6, r11, r6\n\t"
  38160. "lsr r11, r6, #16\n\t"
  38161. "lsl r6, r6, #16\n\t"
  38162. "adds r10, r10, r6\n\t"
  38163. "adc r4, r4, r11\n\t"
  38164. #else
  38165. "umull r6, r7, r8, r7\n\t"
  38166. "adds r10, r10, r6\n\t"
  38167. "adc r4, r7, #0\n\t"
  38168. #endif
  38169. "adds r10, r10, r5\n\t"
  38170. "str r10, [%[a], #68]\n\t"
  38171. "adc r4, r4, #0\n\t"
  38172. /* a[i+18] += m[18] * mu */
  38173. "ldr r7, [%[m], #72]\n\t"
  38174. "ldr r10, [%[a], #72]\n\t"
  38175. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38176. "lsr r11, r7, #16\n\t"
  38177. "lsr r6, r8, #16\n\t"
  38178. "mul r5, r6, r11\n\t"
  38179. "lsl r11, r7, #16\n\t"
  38180. "lsr r11, r11, #16\n\t"
  38181. "mul r6, r11, r6\n\t"
  38182. "lsr r11, r6, #16\n\t"
  38183. "lsl r6, r6, #16\n\t"
  38184. "adds r10, r10, r6\n\t"
  38185. "adc r5, r5, r11\n\t"
  38186. "lsl r6, r8, #16\n\t"
  38187. "lsl r11, r7, #16\n\t"
  38188. "lsr r6, r6, #16\n\t"
  38189. "lsr r11, r11, #16\n\t"
  38190. "mul r11, r6, r11\n\t"
  38191. "adds r10, r10, r11\n\t"
  38192. "adc r5, r5, #0\n\t"
  38193. "lsr r11, r7, #16\n\t"
  38194. "mul r6, r11, r6\n\t"
  38195. "lsr r11, r6, #16\n\t"
  38196. "lsl r6, r6, #16\n\t"
  38197. "adds r10, r10, r6\n\t"
  38198. "adc r5, r5, r11\n\t"
  38199. #else
  38200. "umull r6, r7, r8, r7\n\t"
  38201. "adds r10, r10, r6\n\t"
  38202. "adc r5, r7, #0\n\t"
  38203. #endif
  38204. "adds r10, r10, r4\n\t"
  38205. "str r10, [%[a], #72]\n\t"
  38206. "adc r5, r5, #0\n\t"
  38207. /* a[i+19] += m[19] * mu */
  38208. "ldr r7, [%[m], #76]\n\t"
  38209. "ldr r10, [%[a], #76]\n\t"
  38210. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38211. "lsr r11, r7, #16\n\t"
  38212. "lsr r6, r8, #16\n\t"
  38213. "mul r4, r6, r11\n\t"
  38214. "lsl r11, r7, #16\n\t"
  38215. "lsr r11, r11, #16\n\t"
  38216. "mul r6, r11, r6\n\t"
  38217. "lsr r11, r6, #16\n\t"
  38218. "lsl r6, r6, #16\n\t"
  38219. "adds r10, r10, r6\n\t"
  38220. "adc r4, r4, r11\n\t"
  38221. "lsl r6, r8, #16\n\t"
  38222. "lsl r11, r7, #16\n\t"
  38223. "lsr r6, r6, #16\n\t"
  38224. "lsr r11, r11, #16\n\t"
  38225. "mul r11, r6, r11\n\t"
  38226. "adds r10, r10, r11\n\t"
  38227. "adc r4, r4, #0\n\t"
  38228. "lsr r11, r7, #16\n\t"
  38229. "mul r6, r11, r6\n\t"
  38230. "lsr r11, r6, #16\n\t"
  38231. "lsl r6, r6, #16\n\t"
  38232. "adds r10, r10, r6\n\t"
  38233. "adc r4, r4, r11\n\t"
  38234. #else
  38235. "umull r6, r7, r8, r7\n\t"
  38236. "adds r10, r10, r6\n\t"
  38237. "adc r4, r7, #0\n\t"
  38238. #endif
  38239. "adds r10, r10, r5\n\t"
  38240. "str r10, [%[a], #76]\n\t"
  38241. "adc r4, r4, #0\n\t"
  38242. /* a[i+20] += m[20] * mu */
  38243. "ldr r7, [%[m], #80]\n\t"
  38244. "ldr r10, [%[a], #80]\n\t"
  38245. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38246. "lsr r11, r7, #16\n\t"
  38247. "lsr r6, r8, #16\n\t"
  38248. "mul r5, r6, r11\n\t"
  38249. "lsl r11, r7, #16\n\t"
  38250. "lsr r11, r11, #16\n\t"
  38251. "mul r6, r11, r6\n\t"
  38252. "lsr r11, r6, #16\n\t"
  38253. "lsl r6, r6, #16\n\t"
  38254. "adds r10, r10, r6\n\t"
  38255. "adc r5, r5, r11\n\t"
  38256. "lsl r6, r8, #16\n\t"
  38257. "lsl r11, r7, #16\n\t"
  38258. "lsr r6, r6, #16\n\t"
  38259. "lsr r11, r11, #16\n\t"
  38260. "mul r11, r6, r11\n\t"
  38261. "adds r10, r10, r11\n\t"
  38262. "adc r5, r5, #0\n\t"
  38263. "lsr r11, r7, #16\n\t"
  38264. "mul r6, r11, r6\n\t"
  38265. "lsr r11, r6, #16\n\t"
  38266. "lsl r6, r6, #16\n\t"
  38267. "adds r10, r10, r6\n\t"
  38268. "adc r5, r5, r11\n\t"
  38269. #else
  38270. "umull r6, r7, r8, r7\n\t"
  38271. "adds r10, r10, r6\n\t"
  38272. "adc r5, r7, #0\n\t"
  38273. #endif
  38274. "adds r10, r10, r4\n\t"
  38275. "str r10, [%[a], #80]\n\t"
  38276. "adc r5, r5, #0\n\t"
  38277. /* a[i+21] += m[21] * mu */
  38278. "ldr r7, [%[m], #84]\n\t"
  38279. "ldr r10, [%[a], #84]\n\t"
  38280. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38281. "lsr r11, r7, #16\n\t"
  38282. "lsr r6, r8, #16\n\t"
  38283. "mul r4, r6, r11\n\t"
  38284. "lsl r11, r7, #16\n\t"
  38285. "lsr r11, r11, #16\n\t"
  38286. "mul r6, r11, r6\n\t"
  38287. "lsr r11, r6, #16\n\t"
  38288. "lsl r6, r6, #16\n\t"
  38289. "adds r10, r10, r6\n\t"
  38290. "adc r4, r4, r11\n\t"
  38291. "lsl r6, r8, #16\n\t"
  38292. "lsl r11, r7, #16\n\t"
  38293. "lsr r6, r6, #16\n\t"
  38294. "lsr r11, r11, #16\n\t"
  38295. "mul r11, r6, r11\n\t"
  38296. "adds r10, r10, r11\n\t"
  38297. "adc r4, r4, #0\n\t"
  38298. "lsr r11, r7, #16\n\t"
  38299. "mul r6, r11, r6\n\t"
  38300. "lsr r11, r6, #16\n\t"
  38301. "lsl r6, r6, #16\n\t"
  38302. "adds r10, r10, r6\n\t"
  38303. "adc r4, r4, r11\n\t"
  38304. #else
  38305. "umull r6, r7, r8, r7\n\t"
  38306. "adds r10, r10, r6\n\t"
  38307. "adc r4, r7, #0\n\t"
  38308. #endif
  38309. "adds r10, r10, r5\n\t"
  38310. "str r10, [%[a], #84]\n\t"
  38311. "adc r4, r4, #0\n\t"
  38312. /* a[i+22] += m[22] * mu */
  38313. "ldr r7, [%[m], #88]\n\t"
  38314. "ldr r10, [%[a], #88]\n\t"
  38315. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38316. "lsr r11, r7, #16\n\t"
  38317. "lsr r6, r8, #16\n\t"
  38318. "mul r5, r6, r11\n\t"
  38319. "lsl r11, r7, #16\n\t"
  38320. "lsr r11, r11, #16\n\t"
  38321. "mul r6, r11, r6\n\t"
  38322. "lsr r11, r6, #16\n\t"
  38323. "lsl r6, r6, #16\n\t"
  38324. "adds r10, r10, r6\n\t"
  38325. "adc r5, r5, r11\n\t"
  38326. "lsl r6, r8, #16\n\t"
  38327. "lsl r11, r7, #16\n\t"
  38328. "lsr r6, r6, #16\n\t"
  38329. "lsr r11, r11, #16\n\t"
  38330. "mul r11, r6, r11\n\t"
  38331. "adds r10, r10, r11\n\t"
  38332. "adc r5, r5, #0\n\t"
  38333. "lsr r11, r7, #16\n\t"
  38334. "mul r6, r11, r6\n\t"
  38335. "lsr r11, r6, #16\n\t"
  38336. "lsl r6, r6, #16\n\t"
  38337. "adds r10, r10, r6\n\t"
  38338. "adc r5, r5, r11\n\t"
  38339. #else
  38340. "umull r6, r7, r8, r7\n\t"
  38341. "adds r10, r10, r6\n\t"
  38342. "adc r5, r7, #0\n\t"
  38343. #endif
  38344. "adds r10, r10, r4\n\t"
  38345. "str r10, [%[a], #88]\n\t"
  38346. "adc r5, r5, #0\n\t"
  38347. /* a[i+23] += m[23] * mu */
  38348. "ldr r7, [%[m], #92]\n\t"
  38349. "ldr r10, [%[a], #92]\n\t"
  38350. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38351. "lsr r11, r7, #16\n\t"
  38352. "lsr r6, r8, #16\n\t"
  38353. "mul r4, r6, r11\n\t"
  38354. "lsl r11, r7, #16\n\t"
  38355. "lsr r11, r11, #16\n\t"
  38356. "mul r6, r11, r6\n\t"
  38357. "lsr r11, r6, #16\n\t"
  38358. "lsl r6, r6, #16\n\t"
  38359. "adds r10, r10, r6\n\t"
  38360. "adc r4, r4, r11\n\t"
  38361. "lsl r6, r8, #16\n\t"
  38362. "lsl r11, r7, #16\n\t"
  38363. "lsr r6, r6, #16\n\t"
  38364. "lsr r11, r11, #16\n\t"
  38365. "mul r11, r6, r11\n\t"
  38366. "adds r10, r10, r11\n\t"
  38367. "adc r4, r4, #0\n\t"
  38368. "lsr r11, r7, #16\n\t"
  38369. "mul r6, r11, r6\n\t"
  38370. "lsr r11, r6, #16\n\t"
  38371. "lsl r6, r6, #16\n\t"
  38372. "adds r10, r10, r6\n\t"
  38373. "adc r4, r4, r11\n\t"
  38374. #else
  38375. "umull r6, r7, r8, r7\n\t"
  38376. "adds r10, r10, r6\n\t"
  38377. "adc r4, r7, #0\n\t"
  38378. #endif
  38379. "adds r10, r10, r5\n\t"
  38380. "str r10, [%[a], #92]\n\t"
  38381. "adc r4, r4, #0\n\t"
  38382. /* a[i+24] += m[24] * mu */
  38383. "ldr r7, [%[m], #96]\n\t"
  38384. "ldr r10, [%[a], #96]\n\t"
  38385. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38386. "lsr r11, r7, #16\n\t"
  38387. "lsr r6, r8, #16\n\t"
  38388. "mul r5, r6, r11\n\t"
  38389. "lsl r11, r7, #16\n\t"
  38390. "lsr r11, r11, #16\n\t"
  38391. "mul r6, r11, r6\n\t"
  38392. "lsr r11, r6, #16\n\t"
  38393. "lsl r6, r6, #16\n\t"
  38394. "adds r10, r10, r6\n\t"
  38395. "adc r5, r5, r11\n\t"
  38396. "lsl r6, r8, #16\n\t"
  38397. "lsl r11, r7, #16\n\t"
  38398. "lsr r6, r6, #16\n\t"
  38399. "lsr r11, r11, #16\n\t"
  38400. "mul r11, r6, r11\n\t"
  38401. "adds r10, r10, r11\n\t"
  38402. "adc r5, r5, #0\n\t"
  38403. "lsr r11, r7, #16\n\t"
  38404. "mul r6, r11, r6\n\t"
  38405. "lsr r11, r6, #16\n\t"
  38406. "lsl r6, r6, #16\n\t"
  38407. "adds r10, r10, r6\n\t"
  38408. "adc r5, r5, r11\n\t"
  38409. #else
  38410. "umull r6, r7, r8, r7\n\t"
  38411. "adds r10, r10, r6\n\t"
  38412. "adc r5, r7, #0\n\t"
  38413. #endif
  38414. "adds r10, r10, r4\n\t"
  38415. "str r10, [%[a], #96]\n\t"
  38416. "adc r5, r5, #0\n\t"
  38417. /* a[i+25] += m[25] * mu */
  38418. "ldr r7, [%[m], #100]\n\t"
  38419. "ldr r10, [%[a], #100]\n\t"
  38420. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38421. "lsr r11, r7, #16\n\t"
  38422. "lsr r6, r8, #16\n\t"
  38423. "mul r4, r6, r11\n\t"
  38424. "lsl r11, r7, #16\n\t"
  38425. "lsr r11, r11, #16\n\t"
  38426. "mul r6, r11, r6\n\t"
  38427. "lsr r11, r6, #16\n\t"
  38428. "lsl r6, r6, #16\n\t"
  38429. "adds r10, r10, r6\n\t"
  38430. "adc r4, r4, r11\n\t"
  38431. "lsl r6, r8, #16\n\t"
  38432. "lsl r11, r7, #16\n\t"
  38433. "lsr r6, r6, #16\n\t"
  38434. "lsr r11, r11, #16\n\t"
  38435. "mul r11, r6, r11\n\t"
  38436. "adds r10, r10, r11\n\t"
  38437. "adc r4, r4, #0\n\t"
  38438. "lsr r11, r7, #16\n\t"
  38439. "mul r6, r11, r6\n\t"
  38440. "lsr r11, r6, #16\n\t"
  38441. "lsl r6, r6, #16\n\t"
  38442. "adds r10, r10, r6\n\t"
  38443. "adc r4, r4, r11\n\t"
  38444. #else
  38445. "umull r6, r7, r8, r7\n\t"
  38446. "adds r10, r10, r6\n\t"
  38447. "adc r4, r7, #0\n\t"
  38448. #endif
  38449. "adds r10, r10, r5\n\t"
  38450. "str r10, [%[a], #100]\n\t"
  38451. "adc r4, r4, #0\n\t"
  38452. /* a[i+26] += m[26] * mu */
  38453. "ldr r7, [%[m], #104]\n\t"
  38454. "ldr r10, [%[a], #104]\n\t"
  38455. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38456. "lsr r11, r7, #16\n\t"
  38457. "lsr r6, r8, #16\n\t"
  38458. "mul r5, r6, r11\n\t"
  38459. "lsl r11, r7, #16\n\t"
  38460. "lsr r11, r11, #16\n\t"
  38461. "mul r6, r11, r6\n\t"
  38462. "lsr r11, r6, #16\n\t"
  38463. "lsl r6, r6, #16\n\t"
  38464. "adds r10, r10, r6\n\t"
  38465. "adc r5, r5, r11\n\t"
  38466. "lsl r6, r8, #16\n\t"
  38467. "lsl r11, r7, #16\n\t"
  38468. "lsr r6, r6, #16\n\t"
  38469. "lsr r11, r11, #16\n\t"
  38470. "mul r11, r6, r11\n\t"
  38471. "adds r10, r10, r11\n\t"
  38472. "adc r5, r5, #0\n\t"
  38473. "lsr r11, r7, #16\n\t"
  38474. "mul r6, r11, r6\n\t"
  38475. "lsr r11, r6, #16\n\t"
  38476. "lsl r6, r6, #16\n\t"
  38477. "adds r10, r10, r6\n\t"
  38478. "adc r5, r5, r11\n\t"
  38479. #else
  38480. "umull r6, r7, r8, r7\n\t"
  38481. "adds r10, r10, r6\n\t"
  38482. "adc r5, r7, #0\n\t"
  38483. #endif
  38484. "adds r10, r10, r4\n\t"
  38485. "str r10, [%[a], #104]\n\t"
  38486. "adc r5, r5, #0\n\t"
  38487. /* a[i+27] += m[27] * mu */
  38488. "ldr r7, [%[m], #108]\n\t"
  38489. "ldr r10, [%[a], #108]\n\t"
  38490. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38491. "lsr r11, r7, #16\n\t"
  38492. "lsr r6, r8, #16\n\t"
  38493. "mul r4, r6, r11\n\t"
  38494. "lsl r11, r7, #16\n\t"
  38495. "lsr r11, r11, #16\n\t"
  38496. "mul r6, r11, r6\n\t"
  38497. "lsr r11, r6, #16\n\t"
  38498. "lsl r6, r6, #16\n\t"
  38499. "adds r10, r10, r6\n\t"
  38500. "adc r4, r4, r11\n\t"
  38501. "lsl r6, r8, #16\n\t"
  38502. "lsl r11, r7, #16\n\t"
  38503. "lsr r6, r6, #16\n\t"
  38504. "lsr r11, r11, #16\n\t"
  38505. "mul r11, r6, r11\n\t"
  38506. "adds r10, r10, r11\n\t"
  38507. "adc r4, r4, #0\n\t"
  38508. "lsr r11, r7, #16\n\t"
  38509. "mul r6, r11, r6\n\t"
  38510. "lsr r11, r6, #16\n\t"
  38511. "lsl r6, r6, #16\n\t"
  38512. "adds r10, r10, r6\n\t"
  38513. "adc r4, r4, r11\n\t"
  38514. #else
  38515. "umull r6, r7, r8, r7\n\t"
  38516. "adds r10, r10, r6\n\t"
  38517. "adc r4, r7, #0\n\t"
  38518. #endif
  38519. "adds r10, r10, r5\n\t"
  38520. "str r10, [%[a], #108]\n\t"
  38521. "adc r4, r4, #0\n\t"
  38522. /* a[i+28] += m[28] * mu */
  38523. "ldr r7, [%[m], #112]\n\t"
  38524. "ldr r10, [%[a], #112]\n\t"
  38525. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38526. "lsr r11, r7, #16\n\t"
  38527. "lsr r6, r8, #16\n\t"
  38528. "mul r5, r6, r11\n\t"
  38529. "lsl r11, r7, #16\n\t"
  38530. "lsr r11, r11, #16\n\t"
  38531. "mul r6, r11, r6\n\t"
  38532. "lsr r11, r6, #16\n\t"
  38533. "lsl r6, r6, #16\n\t"
  38534. "adds r10, r10, r6\n\t"
  38535. "adc r5, r5, r11\n\t"
  38536. "lsl r6, r8, #16\n\t"
  38537. "lsl r11, r7, #16\n\t"
  38538. "lsr r6, r6, #16\n\t"
  38539. "lsr r11, r11, #16\n\t"
  38540. "mul r11, r6, r11\n\t"
  38541. "adds r10, r10, r11\n\t"
  38542. "adc r5, r5, #0\n\t"
  38543. "lsr r11, r7, #16\n\t"
  38544. "mul r6, r11, r6\n\t"
  38545. "lsr r11, r6, #16\n\t"
  38546. "lsl r6, r6, #16\n\t"
  38547. "adds r10, r10, r6\n\t"
  38548. "adc r5, r5, r11\n\t"
  38549. #else
  38550. "umull r6, r7, r8, r7\n\t"
  38551. "adds r10, r10, r6\n\t"
  38552. "adc r5, r7, #0\n\t"
  38553. #endif
  38554. "adds r10, r10, r4\n\t"
  38555. "str r10, [%[a], #112]\n\t"
  38556. "adc r5, r5, #0\n\t"
  38557. /* a[i+29] += m[29] * mu */
  38558. "ldr r7, [%[m], #116]\n\t"
  38559. "ldr r10, [%[a], #116]\n\t"
  38560. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38561. "lsr r11, r7, #16\n\t"
  38562. "lsr r6, r8, #16\n\t"
  38563. "mul r4, r6, r11\n\t"
  38564. "lsl r11, r7, #16\n\t"
  38565. "lsr r11, r11, #16\n\t"
  38566. "mul r6, r11, r6\n\t"
  38567. "lsr r11, r6, #16\n\t"
  38568. "lsl r6, r6, #16\n\t"
  38569. "adds r10, r10, r6\n\t"
  38570. "adc r4, r4, r11\n\t"
  38571. "lsl r6, r8, #16\n\t"
  38572. "lsl r11, r7, #16\n\t"
  38573. "lsr r6, r6, #16\n\t"
  38574. "lsr r11, r11, #16\n\t"
  38575. "mul r11, r6, r11\n\t"
  38576. "adds r10, r10, r11\n\t"
  38577. "adc r4, r4, #0\n\t"
  38578. "lsr r11, r7, #16\n\t"
  38579. "mul r6, r11, r6\n\t"
  38580. "lsr r11, r6, #16\n\t"
  38581. "lsl r6, r6, #16\n\t"
  38582. "adds r10, r10, r6\n\t"
  38583. "adc r4, r4, r11\n\t"
  38584. #else
  38585. "umull r6, r7, r8, r7\n\t"
  38586. "adds r10, r10, r6\n\t"
  38587. "adc r4, r7, #0\n\t"
  38588. #endif
  38589. "adds r10, r10, r5\n\t"
  38590. "str r10, [%[a], #116]\n\t"
  38591. "adc r4, r4, #0\n\t"
  38592. /* a[i+30] += m[30] * mu */
  38593. "ldr r7, [%[m], #120]\n\t"
  38594. "ldr r10, [%[a], #120]\n\t"
  38595. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38596. "lsr r11, r7, #16\n\t"
  38597. "lsr r6, r8, #16\n\t"
  38598. "mul r5, r6, r11\n\t"
  38599. "lsl r11, r7, #16\n\t"
  38600. "lsr r11, r11, #16\n\t"
  38601. "mul r6, r11, r6\n\t"
  38602. "lsr r11, r6, #16\n\t"
  38603. "lsl r6, r6, #16\n\t"
  38604. "adds r10, r10, r6\n\t"
  38605. "adc r5, r5, r11\n\t"
  38606. "lsl r6, r8, #16\n\t"
  38607. "lsl r11, r7, #16\n\t"
  38608. "lsr r6, r6, #16\n\t"
  38609. "lsr r11, r11, #16\n\t"
  38610. "mul r11, r6, r11\n\t"
  38611. "adds r10, r10, r11\n\t"
  38612. "adc r5, r5, #0\n\t"
  38613. "lsr r11, r7, #16\n\t"
  38614. "mul r6, r11, r6\n\t"
  38615. "lsr r11, r6, #16\n\t"
  38616. "lsl r6, r6, #16\n\t"
  38617. "adds r10, r10, r6\n\t"
  38618. "adc r5, r5, r11\n\t"
  38619. #else
  38620. "umull r6, r7, r8, r7\n\t"
  38621. "adds r10, r10, r6\n\t"
  38622. "adc r5, r7, #0\n\t"
  38623. #endif
  38624. "adds r10, r10, r4\n\t"
  38625. "str r10, [%[a], #120]\n\t"
  38626. "adc r5, r5, #0\n\t"
  38627. /* a[i+31] += m[31] * mu */
  38628. "ldr r7, [%[m], #124]\n\t"
  38629. "ldr r10, [%[a], #124]\n\t"
  38630. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38631. "lsr r11, r7, #16\n\t"
  38632. "lsr r6, r8, #16\n\t"
  38633. "mul r4, r6, r11\n\t"
  38634. "lsl r11, r7, #16\n\t"
  38635. "lsr r11, r11, #16\n\t"
  38636. "mul r6, r11, r6\n\t"
  38637. "lsr r11, r6, #16\n\t"
  38638. "lsl r6, r6, #16\n\t"
  38639. "adds r10, r10, r6\n\t"
  38640. "adc r4, r4, r11\n\t"
  38641. "lsl r6, r8, #16\n\t"
  38642. "lsl r11, r7, #16\n\t"
  38643. "lsr r6, r6, #16\n\t"
  38644. "lsr r11, r11, #16\n\t"
  38645. "mul r11, r6, r11\n\t"
  38646. "adds r10, r10, r11\n\t"
  38647. "adc r4, r4, #0\n\t"
  38648. "lsr r11, r7, #16\n\t"
  38649. "mul r6, r11, r6\n\t"
  38650. "lsr r11, r6, #16\n\t"
  38651. "lsl r6, r6, #16\n\t"
  38652. "adds r10, r10, r6\n\t"
  38653. "adc r4, r4, r11\n\t"
  38654. #else
  38655. "umull r6, r7, r8, r7\n\t"
  38656. "adds r10, r10, r6\n\t"
  38657. "adc r4, r7, #0\n\t"
  38658. #endif
  38659. "adds r10, r10, r5\n\t"
  38660. "str r10, [%[a], #124]\n\t"
  38661. "adc r4, r4, #0\n\t"
  38662. /* a[i+32] += m[32] * mu */
  38663. "ldr r7, [%[m], #128]\n\t"
  38664. "ldr r10, [%[a], #128]\n\t"
  38665. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38666. "lsr r11, r7, #16\n\t"
  38667. "lsr r6, r8, #16\n\t"
  38668. "mul r5, r6, r11\n\t"
  38669. "lsl r11, r7, #16\n\t"
  38670. "lsr r11, r11, #16\n\t"
  38671. "mul r6, r11, r6\n\t"
  38672. "lsr r11, r6, #16\n\t"
  38673. "lsl r6, r6, #16\n\t"
  38674. "adds r10, r10, r6\n\t"
  38675. "adc r5, r5, r11\n\t"
  38676. "lsl r6, r8, #16\n\t"
  38677. "lsl r11, r7, #16\n\t"
  38678. "lsr r6, r6, #16\n\t"
  38679. "lsr r11, r11, #16\n\t"
  38680. "mul r11, r6, r11\n\t"
  38681. "adds r10, r10, r11\n\t"
  38682. "adc r5, r5, #0\n\t"
  38683. "lsr r11, r7, #16\n\t"
  38684. "mul r6, r11, r6\n\t"
  38685. "lsr r11, r6, #16\n\t"
  38686. "lsl r6, r6, #16\n\t"
  38687. "adds r10, r10, r6\n\t"
  38688. "adc r5, r5, r11\n\t"
  38689. #else
  38690. "umull r6, r7, r8, r7\n\t"
  38691. "adds r10, r10, r6\n\t"
  38692. "adc r5, r7, #0\n\t"
  38693. #endif
  38694. "adds r10, r10, r4\n\t"
  38695. "str r10, [%[a], #128]\n\t"
  38696. "adc r5, r5, #0\n\t"
  38697. /* a[i+33] += m[33] * mu */
  38698. "ldr r7, [%[m], #132]\n\t"
  38699. "ldr r10, [%[a], #132]\n\t"
  38700. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38701. "lsr r11, r7, #16\n\t"
  38702. "lsr r6, r8, #16\n\t"
  38703. "mul r4, r6, r11\n\t"
  38704. "lsl r11, r7, #16\n\t"
  38705. "lsr r11, r11, #16\n\t"
  38706. "mul r6, r11, r6\n\t"
  38707. "lsr r11, r6, #16\n\t"
  38708. "lsl r6, r6, #16\n\t"
  38709. "adds r10, r10, r6\n\t"
  38710. "adc r4, r4, r11\n\t"
  38711. "lsl r6, r8, #16\n\t"
  38712. "lsl r11, r7, #16\n\t"
  38713. "lsr r6, r6, #16\n\t"
  38714. "lsr r11, r11, #16\n\t"
  38715. "mul r11, r6, r11\n\t"
  38716. "adds r10, r10, r11\n\t"
  38717. "adc r4, r4, #0\n\t"
  38718. "lsr r11, r7, #16\n\t"
  38719. "mul r6, r11, r6\n\t"
  38720. "lsr r11, r6, #16\n\t"
  38721. "lsl r6, r6, #16\n\t"
  38722. "adds r10, r10, r6\n\t"
  38723. "adc r4, r4, r11\n\t"
  38724. #else
  38725. "umull r6, r7, r8, r7\n\t"
  38726. "adds r10, r10, r6\n\t"
  38727. "adc r4, r7, #0\n\t"
  38728. #endif
  38729. "adds r10, r10, r5\n\t"
  38730. "str r10, [%[a], #132]\n\t"
  38731. "adc r4, r4, #0\n\t"
  38732. /* a[i+34] += m[34] * mu */
  38733. "ldr r7, [%[m], #136]\n\t"
  38734. "ldr r10, [%[a], #136]\n\t"
  38735. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38736. "lsr r11, r7, #16\n\t"
  38737. "lsr r6, r8, #16\n\t"
  38738. "mul r5, r6, r11\n\t"
  38739. "lsl r11, r7, #16\n\t"
  38740. "lsr r11, r11, #16\n\t"
  38741. "mul r6, r11, r6\n\t"
  38742. "lsr r11, r6, #16\n\t"
  38743. "lsl r6, r6, #16\n\t"
  38744. "adds r10, r10, r6\n\t"
  38745. "adc r5, r5, r11\n\t"
  38746. "lsl r6, r8, #16\n\t"
  38747. "lsl r11, r7, #16\n\t"
  38748. "lsr r6, r6, #16\n\t"
  38749. "lsr r11, r11, #16\n\t"
  38750. "mul r11, r6, r11\n\t"
  38751. "adds r10, r10, r11\n\t"
  38752. "adc r5, r5, #0\n\t"
  38753. "lsr r11, r7, #16\n\t"
  38754. "mul r6, r11, r6\n\t"
  38755. "lsr r11, r6, #16\n\t"
  38756. "lsl r6, r6, #16\n\t"
  38757. "adds r10, r10, r6\n\t"
  38758. "adc r5, r5, r11\n\t"
  38759. #else
  38760. "umull r6, r7, r8, r7\n\t"
  38761. "adds r10, r10, r6\n\t"
  38762. "adc r5, r7, #0\n\t"
  38763. #endif
  38764. "adds r10, r10, r4\n\t"
  38765. "str r10, [%[a], #136]\n\t"
  38766. "adc r5, r5, #0\n\t"
  38767. /* a[i+35] += m[35] * mu */
  38768. "ldr r7, [%[m], #140]\n\t"
  38769. "ldr r10, [%[a], #140]\n\t"
  38770. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38771. "lsr r11, r7, #16\n\t"
  38772. "lsr r6, r8, #16\n\t"
  38773. "mul r4, r6, r11\n\t"
  38774. "lsl r11, r7, #16\n\t"
  38775. "lsr r11, r11, #16\n\t"
  38776. "mul r6, r11, r6\n\t"
  38777. "lsr r11, r6, #16\n\t"
  38778. "lsl r6, r6, #16\n\t"
  38779. "adds r10, r10, r6\n\t"
  38780. "adc r4, r4, r11\n\t"
  38781. "lsl r6, r8, #16\n\t"
  38782. "lsl r11, r7, #16\n\t"
  38783. "lsr r6, r6, #16\n\t"
  38784. "lsr r11, r11, #16\n\t"
  38785. "mul r11, r6, r11\n\t"
  38786. "adds r10, r10, r11\n\t"
  38787. "adc r4, r4, #0\n\t"
  38788. "lsr r11, r7, #16\n\t"
  38789. "mul r6, r11, r6\n\t"
  38790. "lsr r11, r6, #16\n\t"
  38791. "lsl r6, r6, #16\n\t"
  38792. "adds r10, r10, r6\n\t"
  38793. "adc r4, r4, r11\n\t"
  38794. #else
  38795. "umull r6, r7, r8, r7\n\t"
  38796. "adds r10, r10, r6\n\t"
  38797. "adc r4, r7, #0\n\t"
  38798. #endif
  38799. "adds r10, r10, r5\n\t"
  38800. "str r10, [%[a], #140]\n\t"
  38801. "adc r4, r4, #0\n\t"
  38802. /* a[i+36] += m[36] * mu */
  38803. "ldr r7, [%[m], #144]\n\t"
  38804. "ldr r10, [%[a], #144]\n\t"
  38805. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38806. "lsr r11, r7, #16\n\t"
  38807. "lsr r6, r8, #16\n\t"
  38808. "mul r5, r6, r11\n\t"
  38809. "lsl r11, r7, #16\n\t"
  38810. "lsr r11, r11, #16\n\t"
  38811. "mul r6, r11, r6\n\t"
  38812. "lsr r11, r6, #16\n\t"
  38813. "lsl r6, r6, #16\n\t"
  38814. "adds r10, r10, r6\n\t"
  38815. "adc r5, r5, r11\n\t"
  38816. "lsl r6, r8, #16\n\t"
  38817. "lsl r11, r7, #16\n\t"
  38818. "lsr r6, r6, #16\n\t"
  38819. "lsr r11, r11, #16\n\t"
  38820. "mul r11, r6, r11\n\t"
  38821. "adds r10, r10, r11\n\t"
  38822. "adc r5, r5, #0\n\t"
  38823. "lsr r11, r7, #16\n\t"
  38824. "mul r6, r11, r6\n\t"
  38825. "lsr r11, r6, #16\n\t"
  38826. "lsl r6, r6, #16\n\t"
  38827. "adds r10, r10, r6\n\t"
  38828. "adc r5, r5, r11\n\t"
  38829. #else
  38830. "umull r6, r7, r8, r7\n\t"
  38831. "adds r10, r10, r6\n\t"
  38832. "adc r5, r7, #0\n\t"
  38833. #endif
  38834. "adds r10, r10, r4\n\t"
  38835. "str r10, [%[a], #144]\n\t"
  38836. "adc r5, r5, #0\n\t"
  38837. /* a[i+37] += m[37] * mu */
  38838. "ldr r7, [%[m], #148]\n\t"
  38839. "ldr r10, [%[a], #148]\n\t"
  38840. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38841. "lsr r11, r7, #16\n\t"
  38842. "lsr r6, r8, #16\n\t"
  38843. "mul r4, r6, r11\n\t"
  38844. "lsl r11, r7, #16\n\t"
  38845. "lsr r11, r11, #16\n\t"
  38846. "mul r6, r11, r6\n\t"
  38847. "lsr r11, r6, #16\n\t"
  38848. "lsl r6, r6, #16\n\t"
  38849. "adds r10, r10, r6\n\t"
  38850. "adc r4, r4, r11\n\t"
  38851. "lsl r6, r8, #16\n\t"
  38852. "lsl r11, r7, #16\n\t"
  38853. "lsr r6, r6, #16\n\t"
  38854. "lsr r11, r11, #16\n\t"
  38855. "mul r11, r6, r11\n\t"
  38856. "adds r10, r10, r11\n\t"
  38857. "adc r4, r4, #0\n\t"
  38858. "lsr r11, r7, #16\n\t"
  38859. "mul r6, r11, r6\n\t"
  38860. "lsr r11, r6, #16\n\t"
  38861. "lsl r6, r6, #16\n\t"
  38862. "adds r10, r10, r6\n\t"
  38863. "adc r4, r4, r11\n\t"
  38864. #else
  38865. "umull r6, r7, r8, r7\n\t"
  38866. "adds r10, r10, r6\n\t"
  38867. "adc r4, r7, #0\n\t"
  38868. #endif
  38869. "adds r10, r10, r5\n\t"
  38870. "str r10, [%[a], #148]\n\t"
  38871. "adc r4, r4, #0\n\t"
  38872. /* a[i+38] += m[38] * mu */
  38873. "ldr r7, [%[m], #152]\n\t"
  38874. "ldr r10, [%[a], #152]\n\t"
  38875. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38876. "lsr r11, r7, #16\n\t"
  38877. "lsr r6, r8, #16\n\t"
  38878. "mul r5, r6, r11\n\t"
  38879. "lsl r11, r7, #16\n\t"
  38880. "lsr r11, r11, #16\n\t"
  38881. "mul r6, r11, r6\n\t"
  38882. "lsr r11, r6, #16\n\t"
  38883. "lsl r6, r6, #16\n\t"
  38884. "adds r10, r10, r6\n\t"
  38885. "adc r5, r5, r11\n\t"
  38886. "lsl r6, r8, #16\n\t"
  38887. "lsl r11, r7, #16\n\t"
  38888. "lsr r6, r6, #16\n\t"
  38889. "lsr r11, r11, #16\n\t"
  38890. "mul r11, r6, r11\n\t"
  38891. "adds r10, r10, r11\n\t"
  38892. "adc r5, r5, #0\n\t"
  38893. "lsr r11, r7, #16\n\t"
  38894. "mul r6, r11, r6\n\t"
  38895. "lsr r11, r6, #16\n\t"
  38896. "lsl r6, r6, #16\n\t"
  38897. "adds r10, r10, r6\n\t"
  38898. "adc r5, r5, r11\n\t"
  38899. #else
  38900. "umull r6, r7, r8, r7\n\t"
  38901. "adds r10, r10, r6\n\t"
  38902. "adc r5, r7, #0\n\t"
  38903. #endif
  38904. "adds r10, r10, r4\n\t"
  38905. "str r10, [%[a], #152]\n\t"
  38906. "adc r5, r5, #0\n\t"
  38907. /* a[i+39] += m[39] * mu */
  38908. "ldr r7, [%[m], #156]\n\t"
  38909. "ldr r10, [%[a], #156]\n\t"
  38910. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38911. "lsr r11, r7, #16\n\t"
  38912. "lsr r6, r8, #16\n\t"
  38913. "mul r4, r6, r11\n\t"
  38914. "lsl r11, r7, #16\n\t"
  38915. "lsr r11, r11, #16\n\t"
  38916. "mul r6, r11, r6\n\t"
  38917. "lsr r11, r6, #16\n\t"
  38918. "lsl r6, r6, #16\n\t"
  38919. "adds r10, r10, r6\n\t"
  38920. "adc r4, r4, r11\n\t"
  38921. "lsl r6, r8, #16\n\t"
  38922. "lsl r11, r7, #16\n\t"
  38923. "lsr r6, r6, #16\n\t"
  38924. "lsr r11, r11, #16\n\t"
  38925. "mul r11, r6, r11\n\t"
  38926. "adds r10, r10, r11\n\t"
  38927. "adc r4, r4, #0\n\t"
  38928. "lsr r11, r7, #16\n\t"
  38929. "mul r6, r11, r6\n\t"
  38930. "lsr r11, r6, #16\n\t"
  38931. "lsl r6, r6, #16\n\t"
  38932. "adds r10, r10, r6\n\t"
  38933. "adc r4, r4, r11\n\t"
  38934. #else
  38935. "umull r6, r7, r8, r7\n\t"
  38936. "adds r10, r10, r6\n\t"
  38937. "adc r4, r7, #0\n\t"
  38938. #endif
  38939. "adds r10, r10, r5\n\t"
  38940. "str r10, [%[a], #156]\n\t"
  38941. "adc r4, r4, #0\n\t"
  38942. /* a[i+40] += m[40] * mu */
  38943. "ldr r7, [%[m], #160]\n\t"
  38944. "ldr r10, [%[a], #160]\n\t"
  38945. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38946. "lsr r11, r7, #16\n\t"
  38947. "lsr r6, r8, #16\n\t"
  38948. "mul r5, r6, r11\n\t"
  38949. "lsl r11, r7, #16\n\t"
  38950. "lsr r11, r11, #16\n\t"
  38951. "mul r6, r11, r6\n\t"
  38952. "lsr r11, r6, #16\n\t"
  38953. "lsl r6, r6, #16\n\t"
  38954. "adds r10, r10, r6\n\t"
  38955. "adc r5, r5, r11\n\t"
  38956. "lsl r6, r8, #16\n\t"
  38957. "lsl r11, r7, #16\n\t"
  38958. "lsr r6, r6, #16\n\t"
  38959. "lsr r11, r11, #16\n\t"
  38960. "mul r11, r6, r11\n\t"
  38961. "adds r10, r10, r11\n\t"
  38962. "adc r5, r5, #0\n\t"
  38963. "lsr r11, r7, #16\n\t"
  38964. "mul r6, r11, r6\n\t"
  38965. "lsr r11, r6, #16\n\t"
  38966. "lsl r6, r6, #16\n\t"
  38967. "adds r10, r10, r6\n\t"
  38968. "adc r5, r5, r11\n\t"
  38969. #else
  38970. "umull r6, r7, r8, r7\n\t"
  38971. "adds r10, r10, r6\n\t"
  38972. "adc r5, r7, #0\n\t"
  38973. #endif
  38974. "adds r10, r10, r4\n\t"
  38975. "str r10, [%[a], #160]\n\t"
  38976. "adc r5, r5, #0\n\t"
  38977. /* a[i+41] += m[41] * mu */
  38978. "ldr r7, [%[m], #164]\n\t"
  38979. "ldr r10, [%[a], #164]\n\t"
  38980. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  38981. "lsr r11, r7, #16\n\t"
  38982. "lsr r6, r8, #16\n\t"
  38983. "mul r4, r6, r11\n\t"
  38984. "lsl r11, r7, #16\n\t"
  38985. "lsr r11, r11, #16\n\t"
  38986. "mul r6, r11, r6\n\t"
  38987. "lsr r11, r6, #16\n\t"
  38988. "lsl r6, r6, #16\n\t"
  38989. "adds r10, r10, r6\n\t"
  38990. "adc r4, r4, r11\n\t"
  38991. "lsl r6, r8, #16\n\t"
  38992. "lsl r11, r7, #16\n\t"
  38993. "lsr r6, r6, #16\n\t"
  38994. "lsr r11, r11, #16\n\t"
  38995. "mul r11, r6, r11\n\t"
  38996. "adds r10, r10, r11\n\t"
  38997. "adc r4, r4, #0\n\t"
  38998. "lsr r11, r7, #16\n\t"
  38999. "mul r6, r11, r6\n\t"
  39000. "lsr r11, r6, #16\n\t"
  39001. "lsl r6, r6, #16\n\t"
  39002. "adds r10, r10, r6\n\t"
  39003. "adc r4, r4, r11\n\t"
  39004. #else
  39005. "umull r6, r7, r8, r7\n\t"
  39006. "adds r10, r10, r6\n\t"
  39007. "adc r4, r7, #0\n\t"
  39008. #endif
  39009. "adds r10, r10, r5\n\t"
  39010. "str r10, [%[a], #164]\n\t"
  39011. "adc r4, r4, #0\n\t"
  39012. /* a[i+42] += m[42] * mu */
  39013. "ldr r7, [%[m], #168]\n\t"
  39014. "ldr r10, [%[a], #168]\n\t"
  39015. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39016. "lsr r11, r7, #16\n\t"
  39017. "lsr r6, r8, #16\n\t"
  39018. "mul r5, r6, r11\n\t"
  39019. "lsl r11, r7, #16\n\t"
  39020. "lsr r11, r11, #16\n\t"
  39021. "mul r6, r11, r6\n\t"
  39022. "lsr r11, r6, #16\n\t"
  39023. "lsl r6, r6, #16\n\t"
  39024. "adds r10, r10, r6\n\t"
  39025. "adc r5, r5, r11\n\t"
  39026. "lsl r6, r8, #16\n\t"
  39027. "lsl r11, r7, #16\n\t"
  39028. "lsr r6, r6, #16\n\t"
  39029. "lsr r11, r11, #16\n\t"
  39030. "mul r11, r6, r11\n\t"
  39031. "adds r10, r10, r11\n\t"
  39032. "adc r5, r5, #0\n\t"
  39033. "lsr r11, r7, #16\n\t"
  39034. "mul r6, r11, r6\n\t"
  39035. "lsr r11, r6, #16\n\t"
  39036. "lsl r6, r6, #16\n\t"
  39037. "adds r10, r10, r6\n\t"
  39038. "adc r5, r5, r11\n\t"
  39039. #else
  39040. "umull r6, r7, r8, r7\n\t"
  39041. "adds r10, r10, r6\n\t"
  39042. "adc r5, r7, #0\n\t"
  39043. #endif
  39044. "adds r10, r10, r4\n\t"
  39045. "str r10, [%[a], #168]\n\t"
  39046. "adc r5, r5, #0\n\t"
  39047. /* a[i+43] += m[43] * mu */
  39048. "ldr r7, [%[m], #172]\n\t"
  39049. "ldr r10, [%[a], #172]\n\t"
  39050. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39051. "lsr r11, r7, #16\n\t"
  39052. "lsr r6, r8, #16\n\t"
  39053. "mul r4, r6, r11\n\t"
  39054. "lsl r11, r7, #16\n\t"
  39055. "lsr r11, r11, #16\n\t"
  39056. "mul r6, r11, r6\n\t"
  39057. "lsr r11, r6, #16\n\t"
  39058. "lsl r6, r6, #16\n\t"
  39059. "adds r10, r10, r6\n\t"
  39060. "adc r4, r4, r11\n\t"
  39061. "lsl r6, r8, #16\n\t"
  39062. "lsl r11, r7, #16\n\t"
  39063. "lsr r6, r6, #16\n\t"
  39064. "lsr r11, r11, #16\n\t"
  39065. "mul r11, r6, r11\n\t"
  39066. "adds r10, r10, r11\n\t"
  39067. "adc r4, r4, #0\n\t"
  39068. "lsr r11, r7, #16\n\t"
  39069. "mul r6, r11, r6\n\t"
  39070. "lsr r11, r6, #16\n\t"
  39071. "lsl r6, r6, #16\n\t"
  39072. "adds r10, r10, r6\n\t"
  39073. "adc r4, r4, r11\n\t"
  39074. #else
  39075. "umull r6, r7, r8, r7\n\t"
  39076. "adds r10, r10, r6\n\t"
  39077. "adc r4, r7, #0\n\t"
  39078. #endif
  39079. "adds r10, r10, r5\n\t"
  39080. "str r10, [%[a], #172]\n\t"
  39081. "adc r4, r4, #0\n\t"
  39082. /* a[i+44] += m[44] * mu */
  39083. "ldr r7, [%[m], #176]\n\t"
  39084. "ldr r10, [%[a], #176]\n\t"
  39085. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39086. "lsr r11, r7, #16\n\t"
  39087. "lsr r6, r8, #16\n\t"
  39088. "mul r5, r6, r11\n\t"
  39089. "lsl r11, r7, #16\n\t"
  39090. "lsr r11, r11, #16\n\t"
  39091. "mul r6, r11, r6\n\t"
  39092. "lsr r11, r6, #16\n\t"
  39093. "lsl r6, r6, #16\n\t"
  39094. "adds r10, r10, r6\n\t"
  39095. "adc r5, r5, r11\n\t"
  39096. "lsl r6, r8, #16\n\t"
  39097. "lsl r11, r7, #16\n\t"
  39098. "lsr r6, r6, #16\n\t"
  39099. "lsr r11, r11, #16\n\t"
  39100. "mul r11, r6, r11\n\t"
  39101. "adds r10, r10, r11\n\t"
  39102. "adc r5, r5, #0\n\t"
  39103. "lsr r11, r7, #16\n\t"
  39104. "mul r6, r11, r6\n\t"
  39105. "lsr r11, r6, #16\n\t"
  39106. "lsl r6, r6, #16\n\t"
  39107. "adds r10, r10, r6\n\t"
  39108. "adc r5, r5, r11\n\t"
  39109. #else
  39110. "umull r6, r7, r8, r7\n\t"
  39111. "adds r10, r10, r6\n\t"
  39112. "adc r5, r7, #0\n\t"
  39113. #endif
  39114. "adds r10, r10, r4\n\t"
  39115. "str r10, [%[a], #176]\n\t"
  39116. "adc r5, r5, #0\n\t"
  39117. /* a[i+45] += m[45] * mu */
  39118. "ldr r7, [%[m], #180]\n\t"
  39119. "ldr r10, [%[a], #180]\n\t"
  39120. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39121. "lsr r11, r7, #16\n\t"
  39122. "lsr r6, r8, #16\n\t"
  39123. "mul r4, r6, r11\n\t"
  39124. "lsl r11, r7, #16\n\t"
  39125. "lsr r11, r11, #16\n\t"
  39126. "mul r6, r11, r6\n\t"
  39127. "lsr r11, r6, #16\n\t"
  39128. "lsl r6, r6, #16\n\t"
  39129. "adds r10, r10, r6\n\t"
  39130. "adc r4, r4, r11\n\t"
  39131. "lsl r6, r8, #16\n\t"
  39132. "lsl r11, r7, #16\n\t"
  39133. "lsr r6, r6, #16\n\t"
  39134. "lsr r11, r11, #16\n\t"
  39135. "mul r11, r6, r11\n\t"
  39136. "adds r10, r10, r11\n\t"
  39137. "adc r4, r4, #0\n\t"
  39138. "lsr r11, r7, #16\n\t"
  39139. "mul r6, r11, r6\n\t"
  39140. "lsr r11, r6, #16\n\t"
  39141. "lsl r6, r6, #16\n\t"
  39142. "adds r10, r10, r6\n\t"
  39143. "adc r4, r4, r11\n\t"
  39144. #else
  39145. "umull r6, r7, r8, r7\n\t"
  39146. "adds r10, r10, r6\n\t"
  39147. "adc r4, r7, #0\n\t"
  39148. #endif
  39149. "adds r10, r10, r5\n\t"
  39150. "str r10, [%[a], #180]\n\t"
  39151. "adc r4, r4, #0\n\t"
  39152. /* a[i+46] += m[46] * mu */
  39153. "ldr r7, [%[m], #184]\n\t"
  39154. "ldr r10, [%[a], #184]\n\t"
  39155. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39156. "lsr r11, r7, #16\n\t"
  39157. "lsr r6, r8, #16\n\t"
  39158. "mul r5, r6, r11\n\t"
  39159. "lsl r11, r7, #16\n\t"
  39160. "lsr r11, r11, #16\n\t"
  39161. "mul r6, r11, r6\n\t"
  39162. "lsr r11, r6, #16\n\t"
  39163. "lsl r6, r6, #16\n\t"
  39164. "adds r10, r10, r6\n\t"
  39165. "adc r5, r5, r11\n\t"
  39166. "lsl r6, r8, #16\n\t"
  39167. "lsl r11, r7, #16\n\t"
  39168. "lsr r6, r6, #16\n\t"
  39169. "lsr r11, r11, #16\n\t"
  39170. "mul r11, r6, r11\n\t"
  39171. "adds r10, r10, r11\n\t"
  39172. "adc r5, r5, #0\n\t"
  39173. "lsr r11, r7, #16\n\t"
  39174. "mul r6, r11, r6\n\t"
  39175. "lsr r11, r6, #16\n\t"
  39176. "lsl r6, r6, #16\n\t"
  39177. "adds r10, r10, r6\n\t"
  39178. "adc r5, r5, r11\n\t"
  39179. #else
  39180. "umull r6, r7, r8, r7\n\t"
  39181. "adds r10, r10, r6\n\t"
  39182. "adc r5, r7, #0\n\t"
  39183. #endif
  39184. "adds r10, r10, r4\n\t"
  39185. "str r10, [%[a], #184]\n\t"
  39186. "adc r5, r5, #0\n\t"
  39187. /* a[i+47] += m[47] * mu */
  39188. "ldr r7, [%[m], #188]\n\t"
  39189. "ldr r10, [%[a], #188]\n\t"
  39190. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39191. "lsr r11, r7, #16\n\t"
  39192. "lsr r6, r8, #16\n\t"
  39193. "mul r4, r6, r11\n\t"
  39194. "lsl r11, r7, #16\n\t"
  39195. "lsr r11, r11, #16\n\t"
  39196. "mul r6, r11, r6\n\t"
  39197. "lsr r11, r6, #16\n\t"
  39198. "lsl r6, r6, #16\n\t"
  39199. "adds r10, r10, r6\n\t"
  39200. "adc r4, r4, r11\n\t"
  39201. "lsl r6, r8, #16\n\t"
  39202. "lsl r11, r7, #16\n\t"
  39203. "lsr r6, r6, #16\n\t"
  39204. "lsr r11, r11, #16\n\t"
  39205. "mul r11, r6, r11\n\t"
  39206. "adds r10, r10, r11\n\t"
  39207. "adc r4, r4, #0\n\t"
  39208. "lsr r11, r7, #16\n\t"
  39209. "mul r6, r11, r6\n\t"
  39210. "lsr r11, r6, #16\n\t"
  39211. "lsl r6, r6, #16\n\t"
  39212. "adds r10, r10, r6\n\t"
  39213. "adc r4, r4, r11\n\t"
  39214. #else
  39215. "umull r6, r7, r8, r7\n\t"
  39216. "adds r10, r10, r6\n\t"
  39217. "adc r4, r7, #0\n\t"
  39218. #endif
  39219. "adds r10, r10, r5\n\t"
  39220. "str r10, [%[a], #188]\n\t"
  39221. "adc r4, r4, #0\n\t"
  39222. /* a[i+48] += m[48] * mu */
  39223. "ldr r7, [%[m], #192]\n\t"
  39224. "ldr r10, [%[a], #192]\n\t"
  39225. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39226. "lsr r11, r7, #16\n\t"
  39227. "lsr r6, r8, #16\n\t"
  39228. "mul r5, r6, r11\n\t"
  39229. "lsl r11, r7, #16\n\t"
  39230. "lsr r11, r11, #16\n\t"
  39231. "mul r6, r11, r6\n\t"
  39232. "lsr r11, r6, #16\n\t"
  39233. "lsl r6, r6, #16\n\t"
  39234. "adds r10, r10, r6\n\t"
  39235. "adc r5, r5, r11\n\t"
  39236. "lsl r6, r8, #16\n\t"
  39237. "lsl r11, r7, #16\n\t"
  39238. "lsr r6, r6, #16\n\t"
  39239. "lsr r11, r11, #16\n\t"
  39240. "mul r11, r6, r11\n\t"
  39241. "adds r10, r10, r11\n\t"
  39242. "adc r5, r5, #0\n\t"
  39243. "lsr r11, r7, #16\n\t"
  39244. "mul r6, r11, r6\n\t"
  39245. "lsr r11, r6, #16\n\t"
  39246. "lsl r6, r6, #16\n\t"
  39247. "adds r10, r10, r6\n\t"
  39248. "adc r5, r5, r11\n\t"
  39249. #else
  39250. "umull r6, r7, r8, r7\n\t"
  39251. "adds r10, r10, r6\n\t"
  39252. "adc r5, r7, #0\n\t"
  39253. #endif
  39254. "adds r10, r10, r4\n\t"
  39255. "str r10, [%[a], #192]\n\t"
  39256. "adc r5, r5, #0\n\t"
  39257. /* a[i+49] += m[49] * mu */
  39258. "ldr r7, [%[m], #196]\n\t"
  39259. "ldr r10, [%[a], #196]\n\t"
  39260. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39261. "lsr r11, r7, #16\n\t"
  39262. "lsr r6, r8, #16\n\t"
  39263. "mul r4, r6, r11\n\t"
  39264. "lsl r11, r7, #16\n\t"
  39265. "lsr r11, r11, #16\n\t"
  39266. "mul r6, r11, r6\n\t"
  39267. "lsr r11, r6, #16\n\t"
  39268. "lsl r6, r6, #16\n\t"
  39269. "adds r10, r10, r6\n\t"
  39270. "adc r4, r4, r11\n\t"
  39271. "lsl r6, r8, #16\n\t"
  39272. "lsl r11, r7, #16\n\t"
  39273. "lsr r6, r6, #16\n\t"
  39274. "lsr r11, r11, #16\n\t"
  39275. "mul r11, r6, r11\n\t"
  39276. "adds r10, r10, r11\n\t"
  39277. "adc r4, r4, #0\n\t"
  39278. "lsr r11, r7, #16\n\t"
  39279. "mul r6, r11, r6\n\t"
  39280. "lsr r11, r6, #16\n\t"
  39281. "lsl r6, r6, #16\n\t"
  39282. "adds r10, r10, r6\n\t"
  39283. "adc r4, r4, r11\n\t"
  39284. #else
  39285. "umull r6, r7, r8, r7\n\t"
  39286. "adds r10, r10, r6\n\t"
  39287. "adc r4, r7, #0\n\t"
  39288. #endif
  39289. "adds r10, r10, r5\n\t"
  39290. "str r10, [%[a], #196]\n\t"
  39291. "adc r4, r4, #0\n\t"
  39292. /* a[i+50] += m[50] * mu */
  39293. "ldr r7, [%[m], #200]\n\t"
  39294. "ldr r10, [%[a], #200]\n\t"
  39295. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39296. "lsr r11, r7, #16\n\t"
  39297. "lsr r6, r8, #16\n\t"
  39298. "mul r5, r6, r11\n\t"
  39299. "lsl r11, r7, #16\n\t"
  39300. "lsr r11, r11, #16\n\t"
  39301. "mul r6, r11, r6\n\t"
  39302. "lsr r11, r6, #16\n\t"
  39303. "lsl r6, r6, #16\n\t"
  39304. "adds r10, r10, r6\n\t"
  39305. "adc r5, r5, r11\n\t"
  39306. "lsl r6, r8, #16\n\t"
  39307. "lsl r11, r7, #16\n\t"
  39308. "lsr r6, r6, #16\n\t"
  39309. "lsr r11, r11, #16\n\t"
  39310. "mul r11, r6, r11\n\t"
  39311. "adds r10, r10, r11\n\t"
  39312. "adc r5, r5, #0\n\t"
  39313. "lsr r11, r7, #16\n\t"
  39314. "mul r6, r11, r6\n\t"
  39315. "lsr r11, r6, #16\n\t"
  39316. "lsl r6, r6, #16\n\t"
  39317. "adds r10, r10, r6\n\t"
  39318. "adc r5, r5, r11\n\t"
  39319. #else
  39320. "umull r6, r7, r8, r7\n\t"
  39321. "adds r10, r10, r6\n\t"
  39322. "adc r5, r7, #0\n\t"
  39323. #endif
  39324. "adds r10, r10, r4\n\t"
  39325. "str r10, [%[a], #200]\n\t"
  39326. "adc r5, r5, #0\n\t"
  39327. /* a[i+51] += m[51] * mu */
  39328. "ldr r7, [%[m], #204]\n\t"
  39329. "ldr r10, [%[a], #204]\n\t"
  39330. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39331. "lsr r11, r7, #16\n\t"
  39332. "lsr r6, r8, #16\n\t"
  39333. "mul r4, r6, r11\n\t"
  39334. "lsl r11, r7, #16\n\t"
  39335. "lsr r11, r11, #16\n\t"
  39336. "mul r6, r11, r6\n\t"
  39337. "lsr r11, r6, #16\n\t"
  39338. "lsl r6, r6, #16\n\t"
  39339. "adds r10, r10, r6\n\t"
  39340. "adc r4, r4, r11\n\t"
  39341. "lsl r6, r8, #16\n\t"
  39342. "lsl r11, r7, #16\n\t"
  39343. "lsr r6, r6, #16\n\t"
  39344. "lsr r11, r11, #16\n\t"
  39345. "mul r11, r6, r11\n\t"
  39346. "adds r10, r10, r11\n\t"
  39347. "adc r4, r4, #0\n\t"
  39348. "lsr r11, r7, #16\n\t"
  39349. "mul r6, r11, r6\n\t"
  39350. "lsr r11, r6, #16\n\t"
  39351. "lsl r6, r6, #16\n\t"
  39352. "adds r10, r10, r6\n\t"
  39353. "adc r4, r4, r11\n\t"
  39354. #else
  39355. "umull r6, r7, r8, r7\n\t"
  39356. "adds r10, r10, r6\n\t"
  39357. "adc r4, r7, #0\n\t"
  39358. #endif
  39359. "adds r10, r10, r5\n\t"
  39360. "str r10, [%[a], #204]\n\t"
  39361. "adc r4, r4, #0\n\t"
  39362. /* a[i+52] += m[52] * mu */
  39363. "ldr r7, [%[m], #208]\n\t"
  39364. "ldr r10, [%[a], #208]\n\t"
  39365. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39366. "lsr r11, r7, #16\n\t"
  39367. "lsr r6, r8, #16\n\t"
  39368. "mul r5, r6, r11\n\t"
  39369. "lsl r11, r7, #16\n\t"
  39370. "lsr r11, r11, #16\n\t"
  39371. "mul r6, r11, r6\n\t"
  39372. "lsr r11, r6, #16\n\t"
  39373. "lsl r6, r6, #16\n\t"
  39374. "adds r10, r10, r6\n\t"
  39375. "adc r5, r5, r11\n\t"
  39376. "lsl r6, r8, #16\n\t"
  39377. "lsl r11, r7, #16\n\t"
  39378. "lsr r6, r6, #16\n\t"
  39379. "lsr r11, r11, #16\n\t"
  39380. "mul r11, r6, r11\n\t"
  39381. "adds r10, r10, r11\n\t"
  39382. "adc r5, r5, #0\n\t"
  39383. "lsr r11, r7, #16\n\t"
  39384. "mul r6, r11, r6\n\t"
  39385. "lsr r11, r6, #16\n\t"
  39386. "lsl r6, r6, #16\n\t"
  39387. "adds r10, r10, r6\n\t"
  39388. "adc r5, r5, r11\n\t"
  39389. #else
  39390. "umull r6, r7, r8, r7\n\t"
  39391. "adds r10, r10, r6\n\t"
  39392. "adc r5, r7, #0\n\t"
  39393. #endif
  39394. "adds r10, r10, r4\n\t"
  39395. "str r10, [%[a], #208]\n\t"
  39396. "adc r5, r5, #0\n\t"
  39397. /* a[i+53] += m[53] * mu */
  39398. "ldr r7, [%[m], #212]\n\t"
  39399. "ldr r10, [%[a], #212]\n\t"
  39400. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39401. "lsr r11, r7, #16\n\t"
  39402. "lsr r6, r8, #16\n\t"
  39403. "mul r4, r6, r11\n\t"
  39404. "lsl r11, r7, #16\n\t"
  39405. "lsr r11, r11, #16\n\t"
  39406. "mul r6, r11, r6\n\t"
  39407. "lsr r11, r6, #16\n\t"
  39408. "lsl r6, r6, #16\n\t"
  39409. "adds r10, r10, r6\n\t"
  39410. "adc r4, r4, r11\n\t"
  39411. "lsl r6, r8, #16\n\t"
  39412. "lsl r11, r7, #16\n\t"
  39413. "lsr r6, r6, #16\n\t"
  39414. "lsr r11, r11, #16\n\t"
  39415. "mul r11, r6, r11\n\t"
  39416. "adds r10, r10, r11\n\t"
  39417. "adc r4, r4, #0\n\t"
  39418. "lsr r11, r7, #16\n\t"
  39419. "mul r6, r11, r6\n\t"
  39420. "lsr r11, r6, #16\n\t"
  39421. "lsl r6, r6, #16\n\t"
  39422. "adds r10, r10, r6\n\t"
  39423. "adc r4, r4, r11\n\t"
  39424. #else
  39425. "umull r6, r7, r8, r7\n\t"
  39426. "adds r10, r10, r6\n\t"
  39427. "adc r4, r7, #0\n\t"
  39428. #endif
  39429. "adds r10, r10, r5\n\t"
  39430. "str r10, [%[a], #212]\n\t"
  39431. "adc r4, r4, #0\n\t"
  39432. /* a[i+54] += m[54] * mu */
  39433. "ldr r7, [%[m], #216]\n\t"
  39434. "ldr r10, [%[a], #216]\n\t"
  39435. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39436. "lsr r11, r7, #16\n\t"
  39437. "lsr r6, r8, #16\n\t"
  39438. "mul r5, r6, r11\n\t"
  39439. "lsl r11, r7, #16\n\t"
  39440. "lsr r11, r11, #16\n\t"
  39441. "mul r6, r11, r6\n\t"
  39442. "lsr r11, r6, #16\n\t"
  39443. "lsl r6, r6, #16\n\t"
  39444. "adds r10, r10, r6\n\t"
  39445. "adc r5, r5, r11\n\t"
  39446. "lsl r6, r8, #16\n\t"
  39447. "lsl r11, r7, #16\n\t"
  39448. "lsr r6, r6, #16\n\t"
  39449. "lsr r11, r11, #16\n\t"
  39450. "mul r11, r6, r11\n\t"
  39451. "adds r10, r10, r11\n\t"
  39452. "adc r5, r5, #0\n\t"
  39453. "lsr r11, r7, #16\n\t"
  39454. "mul r6, r11, r6\n\t"
  39455. "lsr r11, r6, #16\n\t"
  39456. "lsl r6, r6, #16\n\t"
  39457. "adds r10, r10, r6\n\t"
  39458. "adc r5, r5, r11\n\t"
  39459. #else
  39460. "umull r6, r7, r8, r7\n\t"
  39461. "adds r10, r10, r6\n\t"
  39462. "adc r5, r7, #0\n\t"
  39463. #endif
  39464. "adds r10, r10, r4\n\t"
  39465. "str r10, [%[a], #216]\n\t"
  39466. "adc r5, r5, #0\n\t"
  39467. /* a[i+55] += m[55] * mu */
  39468. "ldr r7, [%[m], #220]\n\t"
  39469. "ldr r10, [%[a], #220]\n\t"
  39470. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39471. "lsr r11, r7, #16\n\t"
  39472. "lsr r6, r8, #16\n\t"
  39473. "mul r4, r6, r11\n\t"
  39474. "lsl r11, r7, #16\n\t"
  39475. "lsr r11, r11, #16\n\t"
  39476. "mul r6, r11, r6\n\t"
  39477. "lsr r11, r6, #16\n\t"
  39478. "lsl r6, r6, #16\n\t"
  39479. "adds r10, r10, r6\n\t"
  39480. "adc r4, r4, r11\n\t"
  39481. "lsl r6, r8, #16\n\t"
  39482. "lsl r11, r7, #16\n\t"
  39483. "lsr r6, r6, #16\n\t"
  39484. "lsr r11, r11, #16\n\t"
  39485. "mul r11, r6, r11\n\t"
  39486. "adds r10, r10, r11\n\t"
  39487. "adc r4, r4, #0\n\t"
  39488. "lsr r11, r7, #16\n\t"
  39489. "mul r6, r11, r6\n\t"
  39490. "lsr r11, r6, #16\n\t"
  39491. "lsl r6, r6, #16\n\t"
  39492. "adds r10, r10, r6\n\t"
  39493. "adc r4, r4, r11\n\t"
  39494. #else
  39495. "umull r6, r7, r8, r7\n\t"
  39496. "adds r10, r10, r6\n\t"
  39497. "adc r4, r7, #0\n\t"
  39498. #endif
  39499. "adds r10, r10, r5\n\t"
  39500. "str r10, [%[a], #220]\n\t"
  39501. "adc r4, r4, #0\n\t"
  39502. /* a[i+56] += m[56] * mu */
  39503. "ldr r7, [%[m], #224]\n\t"
  39504. "ldr r10, [%[a], #224]\n\t"
  39505. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39506. "lsr r11, r7, #16\n\t"
  39507. "lsr r6, r8, #16\n\t"
  39508. "mul r5, r6, r11\n\t"
  39509. "lsl r11, r7, #16\n\t"
  39510. "lsr r11, r11, #16\n\t"
  39511. "mul r6, r11, r6\n\t"
  39512. "lsr r11, r6, #16\n\t"
  39513. "lsl r6, r6, #16\n\t"
  39514. "adds r10, r10, r6\n\t"
  39515. "adc r5, r5, r11\n\t"
  39516. "lsl r6, r8, #16\n\t"
  39517. "lsl r11, r7, #16\n\t"
  39518. "lsr r6, r6, #16\n\t"
  39519. "lsr r11, r11, #16\n\t"
  39520. "mul r11, r6, r11\n\t"
  39521. "adds r10, r10, r11\n\t"
  39522. "adc r5, r5, #0\n\t"
  39523. "lsr r11, r7, #16\n\t"
  39524. "mul r6, r11, r6\n\t"
  39525. "lsr r11, r6, #16\n\t"
  39526. "lsl r6, r6, #16\n\t"
  39527. "adds r10, r10, r6\n\t"
  39528. "adc r5, r5, r11\n\t"
  39529. #else
  39530. "umull r6, r7, r8, r7\n\t"
  39531. "adds r10, r10, r6\n\t"
  39532. "adc r5, r7, #0\n\t"
  39533. #endif
  39534. "adds r10, r10, r4\n\t"
  39535. "str r10, [%[a], #224]\n\t"
  39536. "adc r5, r5, #0\n\t"
  39537. /* a[i+57] += m[57] * mu */
  39538. "ldr r7, [%[m], #228]\n\t"
  39539. "ldr r10, [%[a], #228]\n\t"
  39540. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39541. "lsr r11, r7, #16\n\t"
  39542. "lsr r6, r8, #16\n\t"
  39543. "mul r4, r6, r11\n\t"
  39544. "lsl r11, r7, #16\n\t"
  39545. "lsr r11, r11, #16\n\t"
  39546. "mul r6, r11, r6\n\t"
  39547. "lsr r11, r6, #16\n\t"
  39548. "lsl r6, r6, #16\n\t"
  39549. "adds r10, r10, r6\n\t"
  39550. "adc r4, r4, r11\n\t"
  39551. "lsl r6, r8, #16\n\t"
  39552. "lsl r11, r7, #16\n\t"
  39553. "lsr r6, r6, #16\n\t"
  39554. "lsr r11, r11, #16\n\t"
  39555. "mul r11, r6, r11\n\t"
  39556. "adds r10, r10, r11\n\t"
  39557. "adc r4, r4, #0\n\t"
  39558. "lsr r11, r7, #16\n\t"
  39559. "mul r6, r11, r6\n\t"
  39560. "lsr r11, r6, #16\n\t"
  39561. "lsl r6, r6, #16\n\t"
  39562. "adds r10, r10, r6\n\t"
  39563. "adc r4, r4, r11\n\t"
  39564. #else
  39565. "umull r6, r7, r8, r7\n\t"
  39566. "adds r10, r10, r6\n\t"
  39567. "adc r4, r7, #0\n\t"
  39568. #endif
  39569. "adds r10, r10, r5\n\t"
  39570. "str r10, [%[a], #228]\n\t"
  39571. "adc r4, r4, #0\n\t"
  39572. /* a[i+58] += m[58] * mu */
  39573. "ldr r7, [%[m], #232]\n\t"
  39574. "ldr r10, [%[a], #232]\n\t"
  39575. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39576. "lsr r11, r7, #16\n\t"
  39577. "lsr r6, r8, #16\n\t"
  39578. "mul r5, r6, r11\n\t"
  39579. "lsl r11, r7, #16\n\t"
  39580. "lsr r11, r11, #16\n\t"
  39581. "mul r6, r11, r6\n\t"
  39582. "lsr r11, r6, #16\n\t"
  39583. "lsl r6, r6, #16\n\t"
  39584. "adds r10, r10, r6\n\t"
  39585. "adc r5, r5, r11\n\t"
  39586. "lsl r6, r8, #16\n\t"
  39587. "lsl r11, r7, #16\n\t"
  39588. "lsr r6, r6, #16\n\t"
  39589. "lsr r11, r11, #16\n\t"
  39590. "mul r11, r6, r11\n\t"
  39591. "adds r10, r10, r11\n\t"
  39592. "adc r5, r5, #0\n\t"
  39593. "lsr r11, r7, #16\n\t"
  39594. "mul r6, r11, r6\n\t"
  39595. "lsr r11, r6, #16\n\t"
  39596. "lsl r6, r6, #16\n\t"
  39597. "adds r10, r10, r6\n\t"
  39598. "adc r5, r5, r11\n\t"
  39599. #else
  39600. "umull r6, r7, r8, r7\n\t"
  39601. "adds r10, r10, r6\n\t"
  39602. "adc r5, r7, #0\n\t"
  39603. #endif
  39604. "adds r10, r10, r4\n\t"
  39605. "str r10, [%[a], #232]\n\t"
  39606. "adc r5, r5, #0\n\t"
  39607. /* a[i+59] += m[59] * mu */
  39608. "ldr r7, [%[m], #236]\n\t"
  39609. "ldr r10, [%[a], #236]\n\t"
  39610. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39611. "lsr r11, r7, #16\n\t"
  39612. "lsr r6, r8, #16\n\t"
  39613. "mul r4, r6, r11\n\t"
  39614. "lsl r11, r7, #16\n\t"
  39615. "lsr r11, r11, #16\n\t"
  39616. "mul r6, r11, r6\n\t"
  39617. "lsr r11, r6, #16\n\t"
  39618. "lsl r6, r6, #16\n\t"
  39619. "adds r10, r10, r6\n\t"
  39620. "adc r4, r4, r11\n\t"
  39621. "lsl r6, r8, #16\n\t"
  39622. "lsl r11, r7, #16\n\t"
  39623. "lsr r6, r6, #16\n\t"
  39624. "lsr r11, r11, #16\n\t"
  39625. "mul r11, r6, r11\n\t"
  39626. "adds r10, r10, r11\n\t"
  39627. "adc r4, r4, #0\n\t"
  39628. "lsr r11, r7, #16\n\t"
  39629. "mul r6, r11, r6\n\t"
  39630. "lsr r11, r6, #16\n\t"
  39631. "lsl r6, r6, #16\n\t"
  39632. "adds r10, r10, r6\n\t"
  39633. "adc r4, r4, r11\n\t"
  39634. #else
  39635. "umull r6, r7, r8, r7\n\t"
  39636. "adds r10, r10, r6\n\t"
  39637. "adc r4, r7, #0\n\t"
  39638. #endif
  39639. "adds r10, r10, r5\n\t"
  39640. "str r10, [%[a], #236]\n\t"
  39641. "adc r4, r4, #0\n\t"
  39642. /* a[i+60] += m[60] * mu */
  39643. "ldr r7, [%[m], #240]\n\t"
  39644. "ldr r10, [%[a], #240]\n\t"
  39645. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39646. "lsr r11, r7, #16\n\t"
  39647. "lsr r6, r8, #16\n\t"
  39648. "mul r5, r6, r11\n\t"
  39649. "lsl r11, r7, #16\n\t"
  39650. "lsr r11, r11, #16\n\t"
  39651. "mul r6, r11, r6\n\t"
  39652. "lsr r11, r6, #16\n\t"
  39653. "lsl r6, r6, #16\n\t"
  39654. "adds r10, r10, r6\n\t"
  39655. "adc r5, r5, r11\n\t"
  39656. "lsl r6, r8, #16\n\t"
  39657. "lsl r11, r7, #16\n\t"
  39658. "lsr r6, r6, #16\n\t"
  39659. "lsr r11, r11, #16\n\t"
  39660. "mul r11, r6, r11\n\t"
  39661. "adds r10, r10, r11\n\t"
  39662. "adc r5, r5, #0\n\t"
  39663. "lsr r11, r7, #16\n\t"
  39664. "mul r6, r11, r6\n\t"
  39665. "lsr r11, r6, #16\n\t"
  39666. "lsl r6, r6, #16\n\t"
  39667. "adds r10, r10, r6\n\t"
  39668. "adc r5, r5, r11\n\t"
  39669. #else
  39670. "umull r6, r7, r8, r7\n\t"
  39671. "adds r10, r10, r6\n\t"
  39672. "adc r5, r7, #0\n\t"
  39673. #endif
  39674. "adds r10, r10, r4\n\t"
  39675. "str r10, [%[a], #240]\n\t"
  39676. "adc r5, r5, #0\n\t"
  39677. /* a[i+61] += m[61] * mu */
  39678. "ldr r7, [%[m], #244]\n\t"
  39679. "ldr r10, [%[a], #244]\n\t"
  39680. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39681. "lsr r11, r7, #16\n\t"
  39682. "lsr r6, r8, #16\n\t"
  39683. "mul r4, r6, r11\n\t"
  39684. "lsl r11, r7, #16\n\t"
  39685. "lsr r11, r11, #16\n\t"
  39686. "mul r6, r11, r6\n\t"
  39687. "lsr r11, r6, #16\n\t"
  39688. "lsl r6, r6, #16\n\t"
  39689. "adds r10, r10, r6\n\t"
  39690. "adc r4, r4, r11\n\t"
  39691. "lsl r6, r8, #16\n\t"
  39692. "lsl r11, r7, #16\n\t"
  39693. "lsr r6, r6, #16\n\t"
  39694. "lsr r11, r11, #16\n\t"
  39695. "mul r11, r6, r11\n\t"
  39696. "adds r10, r10, r11\n\t"
  39697. "adc r4, r4, #0\n\t"
  39698. "lsr r11, r7, #16\n\t"
  39699. "mul r6, r11, r6\n\t"
  39700. "lsr r11, r6, #16\n\t"
  39701. "lsl r6, r6, #16\n\t"
  39702. "adds r10, r10, r6\n\t"
  39703. "adc r4, r4, r11\n\t"
  39704. #else
  39705. "umull r6, r7, r8, r7\n\t"
  39706. "adds r10, r10, r6\n\t"
  39707. "adc r4, r7, #0\n\t"
  39708. #endif
  39709. "adds r10, r10, r5\n\t"
  39710. "str r10, [%[a], #244]\n\t"
  39711. "adc r4, r4, #0\n\t"
  39712. /* a[i+62] += m[62] * mu */
  39713. "ldr r7, [%[m], #248]\n\t"
  39714. "ldr r10, [%[a], #248]\n\t"
  39715. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39716. "lsr r11, r7, #16\n\t"
  39717. "lsr r6, r8, #16\n\t"
  39718. "mul r5, r6, r11\n\t"
  39719. "lsl r11, r7, #16\n\t"
  39720. "lsr r11, r11, #16\n\t"
  39721. "mul r6, r11, r6\n\t"
  39722. "lsr r11, r6, #16\n\t"
  39723. "lsl r6, r6, #16\n\t"
  39724. "adds r10, r10, r6\n\t"
  39725. "adc r5, r5, r11\n\t"
  39726. "lsl r6, r8, #16\n\t"
  39727. "lsl r11, r7, #16\n\t"
  39728. "lsr r6, r6, #16\n\t"
  39729. "lsr r11, r11, #16\n\t"
  39730. "mul r11, r6, r11\n\t"
  39731. "adds r10, r10, r11\n\t"
  39732. "adc r5, r5, #0\n\t"
  39733. "lsr r11, r7, #16\n\t"
  39734. "mul r6, r11, r6\n\t"
  39735. "lsr r11, r6, #16\n\t"
  39736. "lsl r6, r6, #16\n\t"
  39737. "adds r10, r10, r6\n\t"
  39738. "adc r5, r5, r11\n\t"
  39739. #else
  39740. "umull r6, r7, r8, r7\n\t"
  39741. "adds r10, r10, r6\n\t"
  39742. "adc r5, r7, #0\n\t"
  39743. #endif
  39744. "adds r10, r10, r4\n\t"
  39745. "str r10, [%[a], #248]\n\t"
  39746. "adc r5, r5, #0\n\t"
  39747. /* a[i+63] += m[63] * mu */
  39748. "ldr r7, [%[m], #252]\n\t"
  39749. "ldr r10, [%[a], #252]\n\t"
  39750. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39751. "lsr r11, r7, #16\n\t"
  39752. "lsr r6, r8, #16\n\t"
  39753. "mul r4, r6, r11\n\t"
  39754. "lsl r11, r7, #16\n\t"
  39755. "lsr r11, r11, #16\n\t"
  39756. "mul r6, r11, r6\n\t"
  39757. "lsr r11, r6, #16\n\t"
  39758. "lsl r6, r6, #16\n\t"
  39759. "adds r10, r10, r6\n\t"
  39760. "adc r4, r4, r11\n\t"
  39761. "lsl r6, r8, #16\n\t"
  39762. "lsl r11, r7, #16\n\t"
  39763. "lsr r6, r6, #16\n\t"
  39764. "lsr r11, r11, #16\n\t"
  39765. "mul r11, r6, r11\n\t"
  39766. "adds r10, r10, r11\n\t"
  39767. "adc r4, r4, #0\n\t"
  39768. "lsr r11, r7, #16\n\t"
  39769. "mul r6, r11, r6\n\t"
  39770. "lsr r11, r6, #16\n\t"
  39771. "lsl r6, r6, #16\n\t"
  39772. "adds r10, r10, r6\n\t"
  39773. "adc r4, r4, r11\n\t"
  39774. #else
  39775. "umull r6, r7, r8, r7\n\t"
  39776. "adds r10, r10, r6\n\t"
  39777. "adc r4, r7, #0\n\t"
  39778. #endif
  39779. "adds r10, r10, r5\n\t"
  39780. "str r10, [%[a], #252]\n\t"
  39781. "adc r4, r4, #0\n\t"
  39782. /* a[i+64] += m[64] * mu */
  39783. "ldr r7, [%[m], #256]\n\t"
  39784. "ldr r10, [%[a], #256]\n\t"
  39785. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39786. "lsr r11, r7, #16\n\t"
  39787. "lsr r6, r8, #16\n\t"
  39788. "mul r5, r6, r11\n\t"
  39789. "lsl r11, r7, #16\n\t"
  39790. "lsr r11, r11, #16\n\t"
  39791. "mul r6, r11, r6\n\t"
  39792. "lsr r11, r6, #16\n\t"
  39793. "lsl r6, r6, #16\n\t"
  39794. "adds r10, r10, r6\n\t"
  39795. "adc r5, r5, r11\n\t"
  39796. "lsl r6, r8, #16\n\t"
  39797. "lsl r11, r7, #16\n\t"
  39798. "lsr r6, r6, #16\n\t"
  39799. "lsr r11, r11, #16\n\t"
  39800. "mul r11, r6, r11\n\t"
  39801. "adds r10, r10, r11\n\t"
  39802. "adc r5, r5, #0\n\t"
  39803. "lsr r11, r7, #16\n\t"
  39804. "mul r6, r11, r6\n\t"
  39805. "lsr r11, r6, #16\n\t"
  39806. "lsl r6, r6, #16\n\t"
  39807. "adds r10, r10, r6\n\t"
  39808. "adc r5, r5, r11\n\t"
  39809. #else
  39810. "umull r6, r7, r8, r7\n\t"
  39811. "adds r10, r10, r6\n\t"
  39812. "adc r5, r7, #0\n\t"
  39813. #endif
  39814. "adds r10, r10, r4\n\t"
  39815. "str r10, [%[a], #256]\n\t"
  39816. "adc r5, r5, #0\n\t"
  39817. /* a[i+65] += m[65] * mu */
  39818. "ldr r7, [%[m], #260]\n\t"
  39819. "ldr r10, [%[a], #260]\n\t"
  39820. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39821. "lsr r11, r7, #16\n\t"
  39822. "lsr r6, r8, #16\n\t"
  39823. "mul r4, r6, r11\n\t"
  39824. "lsl r11, r7, #16\n\t"
  39825. "lsr r11, r11, #16\n\t"
  39826. "mul r6, r11, r6\n\t"
  39827. "lsr r11, r6, #16\n\t"
  39828. "lsl r6, r6, #16\n\t"
  39829. "adds r10, r10, r6\n\t"
  39830. "adc r4, r4, r11\n\t"
  39831. "lsl r6, r8, #16\n\t"
  39832. "lsl r11, r7, #16\n\t"
  39833. "lsr r6, r6, #16\n\t"
  39834. "lsr r11, r11, #16\n\t"
  39835. "mul r11, r6, r11\n\t"
  39836. "adds r10, r10, r11\n\t"
  39837. "adc r4, r4, #0\n\t"
  39838. "lsr r11, r7, #16\n\t"
  39839. "mul r6, r11, r6\n\t"
  39840. "lsr r11, r6, #16\n\t"
  39841. "lsl r6, r6, #16\n\t"
  39842. "adds r10, r10, r6\n\t"
  39843. "adc r4, r4, r11\n\t"
  39844. #else
  39845. "umull r6, r7, r8, r7\n\t"
  39846. "adds r10, r10, r6\n\t"
  39847. "adc r4, r7, #0\n\t"
  39848. #endif
  39849. "adds r10, r10, r5\n\t"
  39850. "str r10, [%[a], #260]\n\t"
  39851. "adc r4, r4, #0\n\t"
  39852. /* a[i+66] += m[66] * mu */
  39853. "ldr r7, [%[m], #264]\n\t"
  39854. "ldr r10, [%[a], #264]\n\t"
  39855. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39856. "lsr r11, r7, #16\n\t"
  39857. "lsr r6, r8, #16\n\t"
  39858. "mul r5, r6, r11\n\t"
  39859. "lsl r11, r7, #16\n\t"
  39860. "lsr r11, r11, #16\n\t"
  39861. "mul r6, r11, r6\n\t"
  39862. "lsr r11, r6, #16\n\t"
  39863. "lsl r6, r6, #16\n\t"
  39864. "adds r10, r10, r6\n\t"
  39865. "adc r5, r5, r11\n\t"
  39866. "lsl r6, r8, #16\n\t"
  39867. "lsl r11, r7, #16\n\t"
  39868. "lsr r6, r6, #16\n\t"
  39869. "lsr r11, r11, #16\n\t"
  39870. "mul r11, r6, r11\n\t"
  39871. "adds r10, r10, r11\n\t"
  39872. "adc r5, r5, #0\n\t"
  39873. "lsr r11, r7, #16\n\t"
  39874. "mul r6, r11, r6\n\t"
  39875. "lsr r11, r6, #16\n\t"
  39876. "lsl r6, r6, #16\n\t"
  39877. "adds r10, r10, r6\n\t"
  39878. "adc r5, r5, r11\n\t"
  39879. #else
  39880. "umull r6, r7, r8, r7\n\t"
  39881. "adds r10, r10, r6\n\t"
  39882. "adc r5, r7, #0\n\t"
  39883. #endif
  39884. "adds r10, r10, r4\n\t"
  39885. "str r10, [%[a], #264]\n\t"
  39886. "adc r5, r5, #0\n\t"
  39887. /* a[i+67] += m[67] * mu */
  39888. "ldr r7, [%[m], #268]\n\t"
  39889. "ldr r10, [%[a], #268]\n\t"
  39890. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39891. "lsr r11, r7, #16\n\t"
  39892. "lsr r6, r8, #16\n\t"
  39893. "mul r4, r6, r11\n\t"
  39894. "lsl r11, r7, #16\n\t"
  39895. "lsr r11, r11, #16\n\t"
  39896. "mul r6, r11, r6\n\t"
  39897. "lsr r11, r6, #16\n\t"
  39898. "lsl r6, r6, #16\n\t"
  39899. "adds r10, r10, r6\n\t"
  39900. "adc r4, r4, r11\n\t"
  39901. "lsl r6, r8, #16\n\t"
  39902. "lsl r11, r7, #16\n\t"
  39903. "lsr r6, r6, #16\n\t"
  39904. "lsr r11, r11, #16\n\t"
  39905. "mul r11, r6, r11\n\t"
  39906. "adds r10, r10, r11\n\t"
  39907. "adc r4, r4, #0\n\t"
  39908. "lsr r11, r7, #16\n\t"
  39909. "mul r6, r11, r6\n\t"
  39910. "lsr r11, r6, #16\n\t"
  39911. "lsl r6, r6, #16\n\t"
  39912. "adds r10, r10, r6\n\t"
  39913. "adc r4, r4, r11\n\t"
  39914. #else
  39915. "umull r6, r7, r8, r7\n\t"
  39916. "adds r10, r10, r6\n\t"
  39917. "adc r4, r7, #0\n\t"
  39918. #endif
  39919. "adds r10, r10, r5\n\t"
  39920. "str r10, [%[a], #268]\n\t"
  39921. "adc r4, r4, #0\n\t"
  39922. /* a[i+68] += m[68] * mu */
  39923. "ldr r7, [%[m], #272]\n\t"
  39924. "ldr r10, [%[a], #272]\n\t"
  39925. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39926. "lsr r11, r7, #16\n\t"
  39927. "lsr r6, r8, #16\n\t"
  39928. "mul r5, r6, r11\n\t"
  39929. "lsl r11, r7, #16\n\t"
  39930. "lsr r11, r11, #16\n\t"
  39931. "mul r6, r11, r6\n\t"
  39932. "lsr r11, r6, #16\n\t"
  39933. "lsl r6, r6, #16\n\t"
  39934. "adds r10, r10, r6\n\t"
  39935. "adc r5, r5, r11\n\t"
  39936. "lsl r6, r8, #16\n\t"
  39937. "lsl r11, r7, #16\n\t"
  39938. "lsr r6, r6, #16\n\t"
  39939. "lsr r11, r11, #16\n\t"
  39940. "mul r11, r6, r11\n\t"
  39941. "adds r10, r10, r11\n\t"
  39942. "adc r5, r5, #0\n\t"
  39943. "lsr r11, r7, #16\n\t"
  39944. "mul r6, r11, r6\n\t"
  39945. "lsr r11, r6, #16\n\t"
  39946. "lsl r6, r6, #16\n\t"
  39947. "adds r10, r10, r6\n\t"
  39948. "adc r5, r5, r11\n\t"
  39949. #else
  39950. "umull r6, r7, r8, r7\n\t"
  39951. "adds r10, r10, r6\n\t"
  39952. "adc r5, r7, #0\n\t"
  39953. #endif
  39954. "adds r10, r10, r4\n\t"
  39955. "str r10, [%[a], #272]\n\t"
  39956. "adc r5, r5, #0\n\t"
  39957. /* a[i+69] += m[69] * mu */
  39958. "ldr r7, [%[m], #276]\n\t"
  39959. "ldr r10, [%[a], #276]\n\t"
  39960. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39961. "lsr r11, r7, #16\n\t"
  39962. "lsr r6, r8, #16\n\t"
  39963. "mul r4, r6, r11\n\t"
  39964. "lsl r11, r7, #16\n\t"
  39965. "lsr r11, r11, #16\n\t"
  39966. "mul r6, r11, r6\n\t"
  39967. "lsr r11, r6, #16\n\t"
  39968. "lsl r6, r6, #16\n\t"
  39969. "adds r10, r10, r6\n\t"
  39970. "adc r4, r4, r11\n\t"
  39971. "lsl r6, r8, #16\n\t"
  39972. "lsl r11, r7, #16\n\t"
  39973. "lsr r6, r6, #16\n\t"
  39974. "lsr r11, r11, #16\n\t"
  39975. "mul r11, r6, r11\n\t"
  39976. "adds r10, r10, r11\n\t"
  39977. "adc r4, r4, #0\n\t"
  39978. "lsr r11, r7, #16\n\t"
  39979. "mul r6, r11, r6\n\t"
  39980. "lsr r11, r6, #16\n\t"
  39981. "lsl r6, r6, #16\n\t"
  39982. "adds r10, r10, r6\n\t"
  39983. "adc r4, r4, r11\n\t"
  39984. #else
  39985. "umull r6, r7, r8, r7\n\t"
  39986. "adds r10, r10, r6\n\t"
  39987. "adc r4, r7, #0\n\t"
  39988. #endif
  39989. "adds r10, r10, r5\n\t"
  39990. "str r10, [%[a], #276]\n\t"
  39991. "adc r4, r4, #0\n\t"
  39992. /* a[i+70] += m[70] * mu */
  39993. "ldr r7, [%[m], #280]\n\t"
  39994. "ldr r10, [%[a], #280]\n\t"
  39995. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  39996. "lsr r11, r7, #16\n\t"
  39997. "lsr r6, r8, #16\n\t"
  39998. "mul r5, r6, r11\n\t"
  39999. "lsl r11, r7, #16\n\t"
  40000. "lsr r11, r11, #16\n\t"
  40001. "mul r6, r11, r6\n\t"
  40002. "lsr r11, r6, #16\n\t"
  40003. "lsl r6, r6, #16\n\t"
  40004. "adds r10, r10, r6\n\t"
  40005. "adc r5, r5, r11\n\t"
  40006. "lsl r6, r8, #16\n\t"
  40007. "lsl r11, r7, #16\n\t"
  40008. "lsr r6, r6, #16\n\t"
  40009. "lsr r11, r11, #16\n\t"
  40010. "mul r11, r6, r11\n\t"
  40011. "adds r10, r10, r11\n\t"
  40012. "adc r5, r5, #0\n\t"
  40013. "lsr r11, r7, #16\n\t"
  40014. "mul r6, r11, r6\n\t"
  40015. "lsr r11, r6, #16\n\t"
  40016. "lsl r6, r6, #16\n\t"
  40017. "adds r10, r10, r6\n\t"
  40018. "adc r5, r5, r11\n\t"
  40019. #else
  40020. "umull r6, r7, r8, r7\n\t"
  40021. "adds r10, r10, r6\n\t"
  40022. "adc r5, r7, #0\n\t"
  40023. #endif
  40024. "adds r10, r10, r4\n\t"
  40025. "str r10, [%[a], #280]\n\t"
  40026. "adc r5, r5, #0\n\t"
  40027. /* a[i+71] += m[71] * mu */
  40028. "ldr r7, [%[m], #284]\n\t"
  40029. "ldr r10, [%[a], #284]\n\t"
  40030. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40031. "lsr r11, r7, #16\n\t"
  40032. "lsr r6, r8, #16\n\t"
  40033. "mul r4, r6, r11\n\t"
  40034. "lsl r11, r7, #16\n\t"
  40035. "lsr r11, r11, #16\n\t"
  40036. "mul r6, r11, r6\n\t"
  40037. "lsr r11, r6, #16\n\t"
  40038. "lsl r6, r6, #16\n\t"
  40039. "adds r10, r10, r6\n\t"
  40040. "adc r4, r4, r11\n\t"
  40041. "lsl r6, r8, #16\n\t"
  40042. "lsl r11, r7, #16\n\t"
  40043. "lsr r6, r6, #16\n\t"
  40044. "lsr r11, r11, #16\n\t"
  40045. "mul r11, r6, r11\n\t"
  40046. "adds r10, r10, r11\n\t"
  40047. "adc r4, r4, #0\n\t"
  40048. "lsr r11, r7, #16\n\t"
  40049. "mul r6, r11, r6\n\t"
  40050. "lsr r11, r6, #16\n\t"
  40051. "lsl r6, r6, #16\n\t"
  40052. "adds r10, r10, r6\n\t"
  40053. "adc r4, r4, r11\n\t"
  40054. #else
  40055. "umull r6, r7, r8, r7\n\t"
  40056. "adds r10, r10, r6\n\t"
  40057. "adc r4, r7, #0\n\t"
  40058. #endif
  40059. "adds r10, r10, r5\n\t"
  40060. "str r10, [%[a], #284]\n\t"
  40061. "adc r4, r4, #0\n\t"
  40062. /* a[i+72] += m[72] * mu */
  40063. "ldr r7, [%[m], #288]\n\t"
  40064. "ldr r10, [%[a], #288]\n\t"
  40065. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40066. "lsr r11, r7, #16\n\t"
  40067. "lsr r6, r8, #16\n\t"
  40068. "mul r5, r6, r11\n\t"
  40069. "lsl r11, r7, #16\n\t"
  40070. "lsr r11, r11, #16\n\t"
  40071. "mul r6, r11, r6\n\t"
  40072. "lsr r11, r6, #16\n\t"
  40073. "lsl r6, r6, #16\n\t"
  40074. "adds r10, r10, r6\n\t"
  40075. "adc r5, r5, r11\n\t"
  40076. "lsl r6, r8, #16\n\t"
  40077. "lsl r11, r7, #16\n\t"
  40078. "lsr r6, r6, #16\n\t"
  40079. "lsr r11, r11, #16\n\t"
  40080. "mul r11, r6, r11\n\t"
  40081. "adds r10, r10, r11\n\t"
  40082. "adc r5, r5, #0\n\t"
  40083. "lsr r11, r7, #16\n\t"
  40084. "mul r6, r11, r6\n\t"
  40085. "lsr r11, r6, #16\n\t"
  40086. "lsl r6, r6, #16\n\t"
  40087. "adds r10, r10, r6\n\t"
  40088. "adc r5, r5, r11\n\t"
  40089. #else
  40090. "umull r6, r7, r8, r7\n\t"
  40091. "adds r10, r10, r6\n\t"
  40092. "adc r5, r7, #0\n\t"
  40093. #endif
  40094. "adds r10, r10, r4\n\t"
  40095. "str r10, [%[a], #288]\n\t"
  40096. "adc r5, r5, #0\n\t"
  40097. /* a[i+73] += m[73] * mu */
  40098. "ldr r7, [%[m], #292]\n\t"
  40099. "ldr r10, [%[a], #292]\n\t"
  40100. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40101. "lsr r11, r7, #16\n\t"
  40102. "lsr r6, r8, #16\n\t"
  40103. "mul r4, r6, r11\n\t"
  40104. "lsl r11, r7, #16\n\t"
  40105. "lsr r11, r11, #16\n\t"
  40106. "mul r6, r11, r6\n\t"
  40107. "lsr r11, r6, #16\n\t"
  40108. "lsl r6, r6, #16\n\t"
  40109. "adds r10, r10, r6\n\t"
  40110. "adc r4, r4, r11\n\t"
  40111. "lsl r6, r8, #16\n\t"
  40112. "lsl r11, r7, #16\n\t"
  40113. "lsr r6, r6, #16\n\t"
  40114. "lsr r11, r11, #16\n\t"
  40115. "mul r11, r6, r11\n\t"
  40116. "adds r10, r10, r11\n\t"
  40117. "adc r4, r4, #0\n\t"
  40118. "lsr r11, r7, #16\n\t"
  40119. "mul r6, r11, r6\n\t"
  40120. "lsr r11, r6, #16\n\t"
  40121. "lsl r6, r6, #16\n\t"
  40122. "adds r10, r10, r6\n\t"
  40123. "adc r4, r4, r11\n\t"
  40124. #else
  40125. "umull r6, r7, r8, r7\n\t"
  40126. "adds r10, r10, r6\n\t"
  40127. "adc r4, r7, #0\n\t"
  40128. #endif
  40129. "adds r10, r10, r5\n\t"
  40130. "str r10, [%[a], #292]\n\t"
  40131. "adc r4, r4, #0\n\t"
  40132. /* a[i+74] += m[74] * mu */
  40133. "ldr r7, [%[m], #296]\n\t"
  40134. "ldr r10, [%[a], #296]\n\t"
  40135. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40136. "lsr r11, r7, #16\n\t"
  40137. "lsr r6, r8, #16\n\t"
  40138. "mul r5, r6, r11\n\t"
  40139. "lsl r11, r7, #16\n\t"
  40140. "lsr r11, r11, #16\n\t"
  40141. "mul r6, r11, r6\n\t"
  40142. "lsr r11, r6, #16\n\t"
  40143. "lsl r6, r6, #16\n\t"
  40144. "adds r10, r10, r6\n\t"
  40145. "adc r5, r5, r11\n\t"
  40146. "lsl r6, r8, #16\n\t"
  40147. "lsl r11, r7, #16\n\t"
  40148. "lsr r6, r6, #16\n\t"
  40149. "lsr r11, r11, #16\n\t"
  40150. "mul r11, r6, r11\n\t"
  40151. "adds r10, r10, r11\n\t"
  40152. "adc r5, r5, #0\n\t"
  40153. "lsr r11, r7, #16\n\t"
  40154. "mul r6, r11, r6\n\t"
  40155. "lsr r11, r6, #16\n\t"
  40156. "lsl r6, r6, #16\n\t"
  40157. "adds r10, r10, r6\n\t"
  40158. "adc r5, r5, r11\n\t"
  40159. #else
  40160. "umull r6, r7, r8, r7\n\t"
  40161. "adds r10, r10, r6\n\t"
  40162. "adc r5, r7, #0\n\t"
  40163. #endif
  40164. "adds r10, r10, r4\n\t"
  40165. "str r10, [%[a], #296]\n\t"
  40166. "adc r5, r5, #0\n\t"
  40167. /* a[i+75] += m[75] * mu */
  40168. "ldr r7, [%[m], #300]\n\t"
  40169. "ldr r10, [%[a], #300]\n\t"
  40170. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40171. "lsr r11, r7, #16\n\t"
  40172. "lsr r6, r8, #16\n\t"
  40173. "mul r4, r6, r11\n\t"
  40174. "lsl r11, r7, #16\n\t"
  40175. "lsr r11, r11, #16\n\t"
  40176. "mul r6, r11, r6\n\t"
  40177. "lsr r11, r6, #16\n\t"
  40178. "lsl r6, r6, #16\n\t"
  40179. "adds r10, r10, r6\n\t"
  40180. "adc r4, r4, r11\n\t"
  40181. "lsl r6, r8, #16\n\t"
  40182. "lsl r11, r7, #16\n\t"
  40183. "lsr r6, r6, #16\n\t"
  40184. "lsr r11, r11, #16\n\t"
  40185. "mul r11, r6, r11\n\t"
  40186. "adds r10, r10, r11\n\t"
  40187. "adc r4, r4, #0\n\t"
  40188. "lsr r11, r7, #16\n\t"
  40189. "mul r6, r11, r6\n\t"
  40190. "lsr r11, r6, #16\n\t"
  40191. "lsl r6, r6, #16\n\t"
  40192. "adds r10, r10, r6\n\t"
  40193. "adc r4, r4, r11\n\t"
  40194. #else
  40195. "umull r6, r7, r8, r7\n\t"
  40196. "adds r10, r10, r6\n\t"
  40197. "adc r4, r7, #0\n\t"
  40198. #endif
  40199. "adds r10, r10, r5\n\t"
  40200. "str r10, [%[a], #300]\n\t"
  40201. "adc r4, r4, #0\n\t"
  40202. /* a[i+76] += m[76] * mu */
  40203. "ldr r7, [%[m], #304]\n\t"
  40204. "ldr r10, [%[a], #304]\n\t"
  40205. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40206. "lsr r11, r7, #16\n\t"
  40207. "lsr r6, r8, #16\n\t"
  40208. "mul r5, r6, r11\n\t"
  40209. "lsl r11, r7, #16\n\t"
  40210. "lsr r11, r11, #16\n\t"
  40211. "mul r6, r11, r6\n\t"
  40212. "lsr r11, r6, #16\n\t"
  40213. "lsl r6, r6, #16\n\t"
  40214. "adds r10, r10, r6\n\t"
  40215. "adc r5, r5, r11\n\t"
  40216. "lsl r6, r8, #16\n\t"
  40217. "lsl r11, r7, #16\n\t"
  40218. "lsr r6, r6, #16\n\t"
  40219. "lsr r11, r11, #16\n\t"
  40220. "mul r11, r6, r11\n\t"
  40221. "adds r10, r10, r11\n\t"
  40222. "adc r5, r5, #0\n\t"
  40223. "lsr r11, r7, #16\n\t"
  40224. "mul r6, r11, r6\n\t"
  40225. "lsr r11, r6, #16\n\t"
  40226. "lsl r6, r6, #16\n\t"
  40227. "adds r10, r10, r6\n\t"
  40228. "adc r5, r5, r11\n\t"
  40229. #else
  40230. "umull r6, r7, r8, r7\n\t"
  40231. "adds r10, r10, r6\n\t"
  40232. "adc r5, r7, #0\n\t"
  40233. #endif
  40234. "adds r10, r10, r4\n\t"
  40235. "str r10, [%[a], #304]\n\t"
  40236. "adc r5, r5, #0\n\t"
  40237. /* a[i+77] += m[77] * mu */
  40238. "ldr r7, [%[m], #308]\n\t"
  40239. "ldr r10, [%[a], #308]\n\t"
  40240. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40241. "lsr r11, r7, #16\n\t"
  40242. "lsr r6, r8, #16\n\t"
  40243. "mul r4, r6, r11\n\t"
  40244. "lsl r11, r7, #16\n\t"
  40245. "lsr r11, r11, #16\n\t"
  40246. "mul r6, r11, r6\n\t"
  40247. "lsr r11, r6, #16\n\t"
  40248. "lsl r6, r6, #16\n\t"
  40249. "adds r10, r10, r6\n\t"
  40250. "adc r4, r4, r11\n\t"
  40251. "lsl r6, r8, #16\n\t"
  40252. "lsl r11, r7, #16\n\t"
  40253. "lsr r6, r6, #16\n\t"
  40254. "lsr r11, r11, #16\n\t"
  40255. "mul r11, r6, r11\n\t"
  40256. "adds r10, r10, r11\n\t"
  40257. "adc r4, r4, #0\n\t"
  40258. "lsr r11, r7, #16\n\t"
  40259. "mul r6, r11, r6\n\t"
  40260. "lsr r11, r6, #16\n\t"
  40261. "lsl r6, r6, #16\n\t"
  40262. "adds r10, r10, r6\n\t"
  40263. "adc r4, r4, r11\n\t"
  40264. #else
  40265. "umull r6, r7, r8, r7\n\t"
  40266. "adds r10, r10, r6\n\t"
  40267. "adc r4, r7, #0\n\t"
  40268. #endif
  40269. "adds r10, r10, r5\n\t"
  40270. "str r10, [%[a], #308]\n\t"
  40271. "adc r4, r4, #0\n\t"
  40272. /* a[i+78] += m[78] * mu */
  40273. "ldr r7, [%[m], #312]\n\t"
  40274. "ldr r10, [%[a], #312]\n\t"
  40275. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40276. "lsr r11, r7, #16\n\t"
  40277. "lsr r6, r8, #16\n\t"
  40278. "mul r5, r6, r11\n\t"
  40279. "lsl r11, r7, #16\n\t"
  40280. "lsr r11, r11, #16\n\t"
  40281. "mul r6, r11, r6\n\t"
  40282. "lsr r11, r6, #16\n\t"
  40283. "lsl r6, r6, #16\n\t"
  40284. "adds r10, r10, r6\n\t"
  40285. "adc r5, r5, r11\n\t"
  40286. "lsl r6, r8, #16\n\t"
  40287. "lsl r11, r7, #16\n\t"
  40288. "lsr r6, r6, #16\n\t"
  40289. "lsr r11, r11, #16\n\t"
  40290. "mul r11, r6, r11\n\t"
  40291. "adds r10, r10, r11\n\t"
  40292. "adc r5, r5, #0\n\t"
  40293. "lsr r11, r7, #16\n\t"
  40294. "mul r6, r11, r6\n\t"
  40295. "lsr r11, r6, #16\n\t"
  40296. "lsl r6, r6, #16\n\t"
  40297. "adds r10, r10, r6\n\t"
  40298. "adc r5, r5, r11\n\t"
  40299. #else
  40300. "umull r6, r7, r8, r7\n\t"
  40301. "adds r10, r10, r6\n\t"
  40302. "adc r5, r7, #0\n\t"
  40303. #endif
  40304. "adds r10, r10, r4\n\t"
  40305. "str r10, [%[a], #312]\n\t"
  40306. "adc r5, r5, #0\n\t"
  40307. /* a[i+79] += m[79] * mu */
  40308. "ldr r7, [%[m], #316]\n\t"
  40309. "ldr r10, [%[a], #316]\n\t"
  40310. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40311. "lsr r11, r7, #16\n\t"
  40312. "lsr r6, r8, #16\n\t"
  40313. "mul r4, r6, r11\n\t"
  40314. "lsl r11, r7, #16\n\t"
  40315. "lsr r11, r11, #16\n\t"
  40316. "mul r6, r11, r6\n\t"
  40317. "lsr r11, r6, #16\n\t"
  40318. "lsl r6, r6, #16\n\t"
  40319. "adds r10, r10, r6\n\t"
  40320. "adc r4, r4, r11\n\t"
  40321. "lsl r6, r8, #16\n\t"
  40322. "lsl r11, r7, #16\n\t"
  40323. "lsr r6, r6, #16\n\t"
  40324. "lsr r11, r11, #16\n\t"
  40325. "mul r11, r6, r11\n\t"
  40326. "adds r10, r10, r11\n\t"
  40327. "adc r4, r4, #0\n\t"
  40328. "lsr r11, r7, #16\n\t"
  40329. "mul r6, r11, r6\n\t"
  40330. "lsr r11, r6, #16\n\t"
  40331. "lsl r6, r6, #16\n\t"
  40332. "adds r10, r10, r6\n\t"
  40333. "adc r4, r4, r11\n\t"
  40334. #else
  40335. "umull r6, r7, r8, r7\n\t"
  40336. "adds r10, r10, r6\n\t"
  40337. "adc r4, r7, #0\n\t"
  40338. #endif
  40339. "adds r10, r10, r5\n\t"
  40340. "str r10, [%[a], #316]\n\t"
  40341. "adc r4, r4, #0\n\t"
  40342. /* a[i+80] += m[80] * mu */
  40343. "ldr r7, [%[m], #320]\n\t"
  40344. "ldr r10, [%[a], #320]\n\t"
  40345. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40346. "lsr r11, r7, #16\n\t"
  40347. "lsr r6, r8, #16\n\t"
  40348. "mul r5, r6, r11\n\t"
  40349. "lsl r11, r7, #16\n\t"
  40350. "lsr r11, r11, #16\n\t"
  40351. "mul r6, r11, r6\n\t"
  40352. "lsr r11, r6, #16\n\t"
  40353. "lsl r6, r6, #16\n\t"
  40354. "adds r10, r10, r6\n\t"
  40355. "adc r5, r5, r11\n\t"
  40356. "lsl r6, r8, #16\n\t"
  40357. "lsl r11, r7, #16\n\t"
  40358. "lsr r6, r6, #16\n\t"
  40359. "lsr r11, r11, #16\n\t"
  40360. "mul r11, r6, r11\n\t"
  40361. "adds r10, r10, r11\n\t"
  40362. "adc r5, r5, #0\n\t"
  40363. "lsr r11, r7, #16\n\t"
  40364. "mul r6, r11, r6\n\t"
  40365. "lsr r11, r6, #16\n\t"
  40366. "lsl r6, r6, #16\n\t"
  40367. "adds r10, r10, r6\n\t"
  40368. "adc r5, r5, r11\n\t"
  40369. #else
  40370. "umull r6, r7, r8, r7\n\t"
  40371. "adds r10, r10, r6\n\t"
  40372. "adc r5, r7, #0\n\t"
  40373. #endif
  40374. "adds r10, r10, r4\n\t"
  40375. "str r10, [%[a], #320]\n\t"
  40376. "adc r5, r5, #0\n\t"
  40377. /* a[i+81] += m[81] * mu */
  40378. "ldr r7, [%[m], #324]\n\t"
  40379. "ldr r10, [%[a], #324]\n\t"
  40380. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40381. "lsr r11, r7, #16\n\t"
  40382. "lsr r6, r8, #16\n\t"
  40383. "mul r4, r6, r11\n\t"
  40384. "lsl r11, r7, #16\n\t"
  40385. "lsr r11, r11, #16\n\t"
  40386. "mul r6, r11, r6\n\t"
  40387. "lsr r11, r6, #16\n\t"
  40388. "lsl r6, r6, #16\n\t"
  40389. "adds r10, r10, r6\n\t"
  40390. "adc r4, r4, r11\n\t"
  40391. "lsl r6, r8, #16\n\t"
  40392. "lsl r11, r7, #16\n\t"
  40393. "lsr r6, r6, #16\n\t"
  40394. "lsr r11, r11, #16\n\t"
  40395. "mul r11, r6, r11\n\t"
  40396. "adds r10, r10, r11\n\t"
  40397. "adc r4, r4, #0\n\t"
  40398. "lsr r11, r7, #16\n\t"
  40399. "mul r6, r11, r6\n\t"
  40400. "lsr r11, r6, #16\n\t"
  40401. "lsl r6, r6, #16\n\t"
  40402. "adds r10, r10, r6\n\t"
  40403. "adc r4, r4, r11\n\t"
  40404. #else
  40405. "umull r6, r7, r8, r7\n\t"
  40406. "adds r10, r10, r6\n\t"
  40407. "adc r4, r7, #0\n\t"
  40408. #endif
  40409. "adds r10, r10, r5\n\t"
  40410. "str r10, [%[a], #324]\n\t"
  40411. "adc r4, r4, #0\n\t"
  40412. /* a[i+82] += m[82] * mu */
  40413. "ldr r7, [%[m], #328]\n\t"
  40414. "ldr r10, [%[a], #328]\n\t"
  40415. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40416. "lsr r11, r7, #16\n\t"
  40417. "lsr r6, r8, #16\n\t"
  40418. "mul r5, r6, r11\n\t"
  40419. "lsl r11, r7, #16\n\t"
  40420. "lsr r11, r11, #16\n\t"
  40421. "mul r6, r11, r6\n\t"
  40422. "lsr r11, r6, #16\n\t"
  40423. "lsl r6, r6, #16\n\t"
  40424. "adds r10, r10, r6\n\t"
  40425. "adc r5, r5, r11\n\t"
  40426. "lsl r6, r8, #16\n\t"
  40427. "lsl r11, r7, #16\n\t"
  40428. "lsr r6, r6, #16\n\t"
  40429. "lsr r11, r11, #16\n\t"
  40430. "mul r11, r6, r11\n\t"
  40431. "adds r10, r10, r11\n\t"
  40432. "adc r5, r5, #0\n\t"
  40433. "lsr r11, r7, #16\n\t"
  40434. "mul r6, r11, r6\n\t"
  40435. "lsr r11, r6, #16\n\t"
  40436. "lsl r6, r6, #16\n\t"
  40437. "adds r10, r10, r6\n\t"
  40438. "adc r5, r5, r11\n\t"
  40439. #else
  40440. "umull r6, r7, r8, r7\n\t"
  40441. "adds r10, r10, r6\n\t"
  40442. "adc r5, r7, #0\n\t"
  40443. #endif
  40444. "adds r10, r10, r4\n\t"
  40445. "str r10, [%[a], #328]\n\t"
  40446. "adc r5, r5, #0\n\t"
  40447. /* a[i+83] += m[83] * mu */
  40448. "ldr r7, [%[m], #332]\n\t"
  40449. "ldr r10, [%[a], #332]\n\t"
  40450. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40451. "lsr r11, r7, #16\n\t"
  40452. "lsr r6, r8, #16\n\t"
  40453. "mul r4, r6, r11\n\t"
  40454. "lsl r11, r7, #16\n\t"
  40455. "lsr r11, r11, #16\n\t"
  40456. "mul r6, r11, r6\n\t"
  40457. "lsr r11, r6, #16\n\t"
  40458. "lsl r6, r6, #16\n\t"
  40459. "adds r10, r10, r6\n\t"
  40460. "adc r4, r4, r11\n\t"
  40461. "lsl r6, r8, #16\n\t"
  40462. "lsl r11, r7, #16\n\t"
  40463. "lsr r6, r6, #16\n\t"
  40464. "lsr r11, r11, #16\n\t"
  40465. "mul r11, r6, r11\n\t"
  40466. "adds r10, r10, r11\n\t"
  40467. "adc r4, r4, #0\n\t"
  40468. "lsr r11, r7, #16\n\t"
  40469. "mul r6, r11, r6\n\t"
  40470. "lsr r11, r6, #16\n\t"
  40471. "lsl r6, r6, #16\n\t"
  40472. "adds r10, r10, r6\n\t"
  40473. "adc r4, r4, r11\n\t"
  40474. #else
  40475. "umull r6, r7, r8, r7\n\t"
  40476. "adds r10, r10, r6\n\t"
  40477. "adc r4, r7, #0\n\t"
  40478. #endif
  40479. "adds r10, r10, r5\n\t"
  40480. "str r10, [%[a], #332]\n\t"
  40481. "adc r4, r4, #0\n\t"
  40482. /* a[i+84] += m[84] * mu */
  40483. "ldr r7, [%[m], #336]\n\t"
  40484. "ldr r10, [%[a], #336]\n\t"
  40485. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40486. "lsr r11, r7, #16\n\t"
  40487. "lsr r6, r8, #16\n\t"
  40488. "mul r5, r6, r11\n\t"
  40489. "lsl r11, r7, #16\n\t"
  40490. "lsr r11, r11, #16\n\t"
  40491. "mul r6, r11, r6\n\t"
  40492. "lsr r11, r6, #16\n\t"
  40493. "lsl r6, r6, #16\n\t"
  40494. "adds r10, r10, r6\n\t"
  40495. "adc r5, r5, r11\n\t"
  40496. "lsl r6, r8, #16\n\t"
  40497. "lsl r11, r7, #16\n\t"
  40498. "lsr r6, r6, #16\n\t"
  40499. "lsr r11, r11, #16\n\t"
  40500. "mul r11, r6, r11\n\t"
  40501. "adds r10, r10, r11\n\t"
  40502. "adc r5, r5, #0\n\t"
  40503. "lsr r11, r7, #16\n\t"
  40504. "mul r6, r11, r6\n\t"
  40505. "lsr r11, r6, #16\n\t"
  40506. "lsl r6, r6, #16\n\t"
  40507. "adds r10, r10, r6\n\t"
  40508. "adc r5, r5, r11\n\t"
  40509. #else
  40510. "umull r6, r7, r8, r7\n\t"
  40511. "adds r10, r10, r6\n\t"
  40512. "adc r5, r7, #0\n\t"
  40513. #endif
  40514. "adds r10, r10, r4\n\t"
  40515. "str r10, [%[a], #336]\n\t"
  40516. "adc r5, r5, #0\n\t"
  40517. /* a[i+85] += m[85] * mu */
  40518. "ldr r7, [%[m], #340]\n\t"
  40519. "ldr r10, [%[a], #340]\n\t"
  40520. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40521. "lsr r11, r7, #16\n\t"
  40522. "lsr r6, r8, #16\n\t"
  40523. "mul r4, r6, r11\n\t"
  40524. "lsl r11, r7, #16\n\t"
  40525. "lsr r11, r11, #16\n\t"
  40526. "mul r6, r11, r6\n\t"
  40527. "lsr r11, r6, #16\n\t"
  40528. "lsl r6, r6, #16\n\t"
  40529. "adds r10, r10, r6\n\t"
  40530. "adc r4, r4, r11\n\t"
  40531. "lsl r6, r8, #16\n\t"
  40532. "lsl r11, r7, #16\n\t"
  40533. "lsr r6, r6, #16\n\t"
  40534. "lsr r11, r11, #16\n\t"
  40535. "mul r11, r6, r11\n\t"
  40536. "adds r10, r10, r11\n\t"
  40537. "adc r4, r4, #0\n\t"
  40538. "lsr r11, r7, #16\n\t"
  40539. "mul r6, r11, r6\n\t"
  40540. "lsr r11, r6, #16\n\t"
  40541. "lsl r6, r6, #16\n\t"
  40542. "adds r10, r10, r6\n\t"
  40543. "adc r4, r4, r11\n\t"
  40544. #else
  40545. "umull r6, r7, r8, r7\n\t"
  40546. "adds r10, r10, r6\n\t"
  40547. "adc r4, r7, #0\n\t"
  40548. #endif
  40549. "adds r10, r10, r5\n\t"
  40550. "str r10, [%[a], #340]\n\t"
  40551. "adc r4, r4, #0\n\t"
  40552. /* a[i+86] += m[86] * mu */
  40553. "ldr r7, [%[m], #344]\n\t"
  40554. "ldr r10, [%[a], #344]\n\t"
  40555. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40556. "lsr r11, r7, #16\n\t"
  40557. "lsr r6, r8, #16\n\t"
  40558. "mul r5, r6, r11\n\t"
  40559. "lsl r11, r7, #16\n\t"
  40560. "lsr r11, r11, #16\n\t"
  40561. "mul r6, r11, r6\n\t"
  40562. "lsr r11, r6, #16\n\t"
  40563. "lsl r6, r6, #16\n\t"
  40564. "adds r10, r10, r6\n\t"
  40565. "adc r5, r5, r11\n\t"
  40566. "lsl r6, r8, #16\n\t"
  40567. "lsl r11, r7, #16\n\t"
  40568. "lsr r6, r6, #16\n\t"
  40569. "lsr r11, r11, #16\n\t"
  40570. "mul r11, r6, r11\n\t"
  40571. "adds r10, r10, r11\n\t"
  40572. "adc r5, r5, #0\n\t"
  40573. "lsr r11, r7, #16\n\t"
  40574. "mul r6, r11, r6\n\t"
  40575. "lsr r11, r6, #16\n\t"
  40576. "lsl r6, r6, #16\n\t"
  40577. "adds r10, r10, r6\n\t"
  40578. "adc r5, r5, r11\n\t"
  40579. #else
  40580. "umull r6, r7, r8, r7\n\t"
  40581. "adds r10, r10, r6\n\t"
  40582. "adc r5, r7, #0\n\t"
  40583. #endif
  40584. "adds r10, r10, r4\n\t"
  40585. "str r10, [%[a], #344]\n\t"
  40586. "adc r5, r5, #0\n\t"
  40587. /* a[i+87] += m[87] * mu */
  40588. "ldr r7, [%[m], #348]\n\t"
  40589. "ldr r10, [%[a], #348]\n\t"
  40590. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40591. "lsr r11, r7, #16\n\t"
  40592. "lsr r6, r8, #16\n\t"
  40593. "mul r4, r6, r11\n\t"
  40594. "lsl r11, r7, #16\n\t"
  40595. "lsr r11, r11, #16\n\t"
  40596. "mul r6, r11, r6\n\t"
  40597. "lsr r11, r6, #16\n\t"
  40598. "lsl r6, r6, #16\n\t"
  40599. "adds r10, r10, r6\n\t"
  40600. "adc r4, r4, r11\n\t"
  40601. "lsl r6, r8, #16\n\t"
  40602. "lsl r11, r7, #16\n\t"
  40603. "lsr r6, r6, #16\n\t"
  40604. "lsr r11, r11, #16\n\t"
  40605. "mul r11, r6, r11\n\t"
  40606. "adds r10, r10, r11\n\t"
  40607. "adc r4, r4, #0\n\t"
  40608. "lsr r11, r7, #16\n\t"
  40609. "mul r6, r11, r6\n\t"
  40610. "lsr r11, r6, #16\n\t"
  40611. "lsl r6, r6, #16\n\t"
  40612. "adds r10, r10, r6\n\t"
  40613. "adc r4, r4, r11\n\t"
  40614. #else
  40615. "umull r6, r7, r8, r7\n\t"
  40616. "adds r10, r10, r6\n\t"
  40617. "adc r4, r7, #0\n\t"
  40618. #endif
  40619. "adds r10, r10, r5\n\t"
  40620. "str r10, [%[a], #348]\n\t"
  40621. "adc r4, r4, #0\n\t"
  40622. /* a[i+88] += m[88] * mu */
  40623. "ldr r7, [%[m], #352]\n\t"
  40624. "ldr r10, [%[a], #352]\n\t"
  40625. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40626. "lsr r11, r7, #16\n\t"
  40627. "lsr r6, r8, #16\n\t"
  40628. "mul r5, r6, r11\n\t"
  40629. "lsl r11, r7, #16\n\t"
  40630. "lsr r11, r11, #16\n\t"
  40631. "mul r6, r11, r6\n\t"
  40632. "lsr r11, r6, #16\n\t"
  40633. "lsl r6, r6, #16\n\t"
  40634. "adds r10, r10, r6\n\t"
  40635. "adc r5, r5, r11\n\t"
  40636. "lsl r6, r8, #16\n\t"
  40637. "lsl r11, r7, #16\n\t"
  40638. "lsr r6, r6, #16\n\t"
  40639. "lsr r11, r11, #16\n\t"
  40640. "mul r11, r6, r11\n\t"
  40641. "adds r10, r10, r11\n\t"
  40642. "adc r5, r5, #0\n\t"
  40643. "lsr r11, r7, #16\n\t"
  40644. "mul r6, r11, r6\n\t"
  40645. "lsr r11, r6, #16\n\t"
  40646. "lsl r6, r6, #16\n\t"
  40647. "adds r10, r10, r6\n\t"
  40648. "adc r5, r5, r11\n\t"
  40649. #else
  40650. "umull r6, r7, r8, r7\n\t"
  40651. "adds r10, r10, r6\n\t"
  40652. "adc r5, r7, #0\n\t"
  40653. #endif
  40654. "adds r10, r10, r4\n\t"
  40655. "str r10, [%[a], #352]\n\t"
  40656. "adc r5, r5, #0\n\t"
  40657. /* a[i+89] += m[89] * mu */
  40658. "ldr r7, [%[m], #356]\n\t"
  40659. "ldr r10, [%[a], #356]\n\t"
  40660. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40661. "lsr r11, r7, #16\n\t"
  40662. "lsr r6, r8, #16\n\t"
  40663. "mul r4, r6, r11\n\t"
  40664. "lsl r11, r7, #16\n\t"
  40665. "lsr r11, r11, #16\n\t"
  40666. "mul r6, r11, r6\n\t"
  40667. "lsr r11, r6, #16\n\t"
  40668. "lsl r6, r6, #16\n\t"
  40669. "adds r10, r10, r6\n\t"
  40670. "adc r4, r4, r11\n\t"
  40671. "lsl r6, r8, #16\n\t"
  40672. "lsl r11, r7, #16\n\t"
  40673. "lsr r6, r6, #16\n\t"
  40674. "lsr r11, r11, #16\n\t"
  40675. "mul r11, r6, r11\n\t"
  40676. "adds r10, r10, r11\n\t"
  40677. "adc r4, r4, #0\n\t"
  40678. "lsr r11, r7, #16\n\t"
  40679. "mul r6, r11, r6\n\t"
  40680. "lsr r11, r6, #16\n\t"
  40681. "lsl r6, r6, #16\n\t"
  40682. "adds r10, r10, r6\n\t"
  40683. "adc r4, r4, r11\n\t"
  40684. #else
  40685. "umull r6, r7, r8, r7\n\t"
  40686. "adds r10, r10, r6\n\t"
  40687. "adc r4, r7, #0\n\t"
  40688. #endif
  40689. "adds r10, r10, r5\n\t"
  40690. "str r10, [%[a], #356]\n\t"
  40691. "adc r4, r4, #0\n\t"
  40692. /* a[i+90] += m[90] * mu */
  40693. "ldr r7, [%[m], #360]\n\t"
  40694. "ldr r10, [%[a], #360]\n\t"
  40695. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40696. "lsr r11, r7, #16\n\t"
  40697. "lsr r6, r8, #16\n\t"
  40698. "mul r5, r6, r11\n\t"
  40699. "lsl r11, r7, #16\n\t"
  40700. "lsr r11, r11, #16\n\t"
  40701. "mul r6, r11, r6\n\t"
  40702. "lsr r11, r6, #16\n\t"
  40703. "lsl r6, r6, #16\n\t"
  40704. "adds r10, r10, r6\n\t"
  40705. "adc r5, r5, r11\n\t"
  40706. "lsl r6, r8, #16\n\t"
  40707. "lsl r11, r7, #16\n\t"
  40708. "lsr r6, r6, #16\n\t"
  40709. "lsr r11, r11, #16\n\t"
  40710. "mul r11, r6, r11\n\t"
  40711. "adds r10, r10, r11\n\t"
  40712. "adc r5, r5, #0\n\t"
  40713. "lsr r11, r7, #16\n\t"
  40714. "mul r6, r11, r6\n\t"
  40715. "lsr r11, r6, #16\n\t"
  40716. "lsl r6, r6, #16\n\t"
  40717. "adds r10, r10, r6\n\t"
  40718. "adc r5, r5, r11\n\t"
  40719. #else
  40720. "umull r6, r7, r8, r7\n\t"
  40721. "adds r10, r10, r6\n\t"
  40722. "adc r5, r7, #0\n\t"
  40723. #endif
  40724. "adds r10, r10, r4\n\t"
  40725. "str r10, [%[a], #360]\n\t"
  40726. "adc r5, r5, #0\n\t"
  40727. /* a[i+91] += m[91] * mu */
  40728. "ldr r7, [%[m], #364]\n\t"
  40729. "ldr r10, [%[a], #364]\n\t"
  40730. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40731. "lsr r11, r7, #16\n\t"
  40732. "lsr r6, r8, #16\n\t"
  40733. "mul r4, r6, r11\n\t"
  40734. "lsl r11, r7, #16\n\t"
  40735. "lsr r11, r11, #16\n\t"
  40736. "mul r6, r11, r6\n\t"
  40737. "lsr r11, r6, #16\n\t"
  40738. "lsl r6, r6, #16\n\t"
  40739. "adds r10, r10, r6\n\t"
  40740. "adc r4, r4, r11\n\t"
  40741. "lsl r6, r8, #16\n\t"
  40742. "lsl r11, r7, #16\n\t"
  40743. "lsr r6, r6, #16\n\t"
  40744. "lsr r11, r11, #16\n\t"
  40745. "mul r11, r6, r11\n\t"
  40746. "adds r10, r10, r11\n\t"
  40747. "adc r4, r4, #0\n\t"
  40748. "lsr r11, r7, #16\n\t"
  40749. "mul r6, r11, r6\n\t"
  40750. "lsr r11, r6, #16\n\t"
  40751. "lsl r6, r6, #16\n\t"
  40752. "adds r10, r10, r6\n\t"
  40753. "adc r4, r4, r11\n\t"
  40754. #else
  40755. "umull r6, r7, r8, r7\n\t"
  40756. "adds r10, r10, r6\n\t"
  40757. "adc r4, r7, #0\n\t"
  40758. #endif
  40759. "adds r10, r10, r5\n\t"
  40760. "str r10, [%[a], #364]\n\t"
  40761. "adc r4, r4, #0\n\t"
  40762. /* a[i+92] += m[92] * mu */
  40763. "ldr r7, [%[m], #368]\n\t"
  40764. "ldr r10, [%[a], #368]\n\t"
  40765. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40766. "lsr r11, r7, #16\n\t"
  40767. "lsr r6, r8, #16\n\t"
  40768. "mul r5, r6, r11\n\t"
  40769. "lsl r11, r7, #16\n\t"
  40770. "lsr r11, r11, #16\n\t"
  40771. "mul r6, r11, r6\n\t"
  40772. "lsr r11, r6, #16\n\t"
  40773. "lsl r6, r6, #16\n\t"
  40774. "adds r10, r10, r6\n\t"
  40775. "adc r5, r5, r11\n\t"
  40776. "lsl r6, r8, #16\n\t"
  40777. "lsl r11, r7, #16\n\t"
  40778. "lsr r6, r6, #16\n\t"
  40779. "lsr r11, r11, #16\n\t"
  40780. "mul r11, r6, r11\n\t"
  40781. "adds r10, r10, r11\n\t"
  40782. "adc r5, r5, #0\n\t"
  40783. "lsr r11, r7, #16\n\t"
  40784. "mul r6, r11, r6\n\t"
  40785. "lsr r11, r6, #16\n\t"
  40786. "lsl r6, r6, #16\n\t"
  40787. "adds r10, r10, r6\n\t"
  40788. "adc r5, r5, r11\n\t"
  40789. #else
  40790. "umull r6, r7, r8, r7\n\t"
  40791. "adds r10, r10, r6\n\t"
  40792. "adc r5, r7, #0\n\t"
  40793. #endif
  40794. "adds r10, r10, r4\n\t"
  40795. "str r10, [%[a], #368]\n\t"
  40796. "adc r5, r5, #0\n\t"
  40797. /* a[i+93] += m[93] * mu */
  40798. "ldr r7, [%[m], #372]\n\t"
  40799. "ldr r10, [%[a], #372]\n\t"
  40800. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40801. "lsr r11, r7, #16\n\t"
  40802. "lsr r6, r8, #16\n\t"
  40803. "mul r4, r6, r11\n\t"
  40804. "lsl r11, r7, #16\n\t"
  40805. "lsr r11, r11, #16\n\t"
  40806. "mul r6, r11, r6\n\t"
  40807. "lsr r11, r6, #16\n\t"
  40808. "lsl r6, r6, #16\n\t"
  40809. "adds r10, r10, r6\n\t"
  40810. "adc r4, r4, r11\n\t"
  40811. "lsl r6, r8, #16\n\t"
  40812. "lsl r11, r7, #16\n\t"
  40813. "lsr r6, r6, #16\n\t"
  40814. "lsr r11, r11, #16\n\t"
  40815. "mul r11, r6, r11\n\t"
  40816. "adds r10, r10, r11\n\t"
  40817. "adc r4, r4, #0\n\t"
  40818. "lsr r11, r7, #16\n\t"
  40819. "mul r6, r11, r6\n\t"
  40820. "lsr r11, r6, #16\n\t"
  40821. "lsl r6, r6, #16\n\t"
  40822. "adds r10, r10, r6\n\t"
  40823. "adc r4, r4, r11\n\t"
  40824. #else
  40825. "umull r6, r7, r8, r7\n\t"
  40826. "adds r10, r10, r6\n\t"
  40827. "adc r4, r7, #0\n\t"
  40828. #endif
  40829. "adds r10, r10, r5\n\t"
  40830. "str r10, [%[a], #372]\n\t"
  40831. "adc r4, r4, #0\n\t"
  40832. /* a[i+94] += m[94] * mu */
  40833. "ldr r7, [%[m], #376]\n\t"
  40834. "ldr r10, [%[a], #376]\n\t"
  40835. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40836. "lsr r11, r7, #16\n\t"
  40837. "lsr r6, r8, #16\n\t"
  40838. "mul r5, r6, r11\n\t"
  40839. "lsl r11, r7, #16\n\t"
  40840. "lsr r11, r11, #16\n\t"
  40841. "mul r6, r11, r6\n\t"
  40842. "lsr r11, r6, #16\n\t"
  40843. "lsl r6, r6, #16\n\t"
  40844. "adds r10, r10, r6\n\t"
  40845. "adc r5, r5, r11\n\t"
  40846. "lsl r6, r8, #16\n\t"
  40847. "lsl r11, r7, #16\n\t"
  40848. "lsr r6, r6, #16\n\t"
  40849. "lsr r11, r11, #16\n\t"
  40850. "mul r11, r6, r11\n\t"
  40851. "adds r10, r10, r11\n\t"
  40852. "adc r5, r5, #0\n\t"
  40853. "lsr r11, r7, #16\n\t"
  40854. "mul r6, r11, r6\n\t"
  40855. "lsr r11, r6, #16\n\t"
  40856. "lsl r6, r6, #16\n\t"
  40857. "adds r10, r10, r6\n\t"
  40858. "adc r5, r5, r11\n\t"
  40859. #else
  40860. "umull r6, r7, r8, r7\n\t"
  40861. "adds r10, r10, r6\n\t"
  40862. "adc r5, r7, #0\n\t"
  40863. #endif
  40864. "adds r10, r10, r4\n\t"
  40865. "str r10, [%[a], #376]\n\t"
  40866. "adc r5, r5, #0\n\t"
  40867. /* a[i+95] += m[95] * mu */
  40868. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  40869. "ldr r7, [%[m], #380]\n\t"
  40870. #else
  40871. "ldr r11, [%[m], #380]\n\t"
  40872. #endif
  40873. "ldr r10, [%[a], #380]\n\t"
  40874. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  40875. "lsl r6, r8, #16\n\t"
  40876. "lsl r7, r11, #16\n\t"
  40877. "lsr r6, r6, #16\n\t"
  40878. "lsr r7, r7, #16\n\t"
  40879. "mul r7, r6, r7\n\t"
  40880. "adds r5, r5, r7\n\t"
  40881. "adcs r4, r3, #0\n\t"
  40882. "mov r3, #0\n\t"
  40883. "adc r3, r3, r3\n\t"
  40884. "lsr r7, r11, #16\n\t"
  40885. "mul r6, r7, r6\n\t"
  40886. "lsr r7, r6, #16\n\t"
  40887. "lsl r6, r6, #16\n\t"
  40888. "adds r5, r5, r6\n\t"
  40889. "adcs r4, r4, r7\n\t"
  40890. "adc r3, r3, #0\n\t"
  40891. "mov r6, r8\n\t"
  40892. "lsr r7, r11, #16\n\t"
  40893. "lsr r6, r6, #16\n\t"
  40894. "mul r7, r6, r7\n\t"
  40895. "adds r4, r4, r7\n\t"
  40896. "lsl r7, r11, #16\n\t"
  40897. "adc r3, r3, #0\n\t"
  40898. "lsr r7, r7, #16\n\t"
  40899. "mul r6, r7, r6\n\t"
  40900. "lsr r7, r6, #16\n\t"
  40901. "lsl r6, r6, #16\n\t"
  40902. "adds r5, r5, r6\n\t"
  40903. "adcs r4, r4, r7\n\t"
  40904. "adc r3, r3, #0\n\t"
  40905. #else
  40906. "umull r6, r7, r8, r7\n\t"
  40907. "adds r5, r5, r6\n\t"
  40908. "adcs r4, r7, r3\n\t"
  40909. "mov r3, #0\n\t"
  40910. "adc r3, r3, r3\n\t"
  40911. #endif
  40912. "adds r10, r10, r5\n\t"
  40913. "str r10, [%[a], #380]\n\t"
  40914. "ldr r10, [%[a], #384]\n\t"
  40915. "adcs r10, r10, r4\n\t"
  40916. "str r10, [%[a], #384]\n\t"
  40917. "adc r3, r3, #0\n\t"
  40918. /* i += 1 */
  40919. "add r9, r9, #4\n\t"
  40920. "add %[a], %[a], #4\n\t"
  40921. "cmp r9, #0x180\n\t"
  40922. "blt L_sp_3072_mont_reduce_96_word_%=\n\t"
  40923. "str r12, [%[a]]\n\t"
  40924. "str lr, [%[a], #4]\n\t"
  40925. "mov %[mp], r3\n\t"
  40926. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  40927. :
  40928. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  40929. );
  40930. sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp);
  40931. }
  40932. /* Multiply two Montgomery form numbers mod the modulus (prime).
  40933. * (r = a * b mod m)
  40934. *
  40935. * r Result of multiplication.
  40936. * a First number to multiply in Montgomery form.
  40937. * b Second number to multiply in Montgomery form.
  40938. * m Modulus (prime).
  40939. * mp Montgomery mulitplier.
  40940. */
  40941. SP_NOINLINE static void sp_3072_mont_mul_96(sp_digit* r, const sp_digit* a,
  40942. const sp_digit* b, const sp_digit* m, sp_digit mp)
  40943. {
  40944. sp_3072_mul_96(r, a, b);
  40945. sp_3072_mont_reduce_96(r, m, mp);
  40946. }
  40947. /* Square the Montgomery form number. (r = a * a mod m)
  40948. *
  40949. * r Result of squaring.
  40950. * a Number to square in Montgomery form.
  40951. * m Modulus (prime).
  40952. * mp Montgomery mulitplier.
  40953. */
  40954. SP_NOINLINE static void sp_3072_mont_sqr_96(sp_digit* r, const sp_digit* a,
  40955. const sp_digit* m, sp_digit mp)
  40956. {
  40957. sp_3072_sqr_96(r, a);
  40958. sp_3072_mont_reduce_96(r, m, mp);
  40959. }
  40960. #ifdef WOLFSSL_SP_SMALL
  40961. /* Sub b from a into r. (r = a - b)
  40962. *
  40963. * r A single precision integer.
  40964. * a A single precision integer.
  40965. * b A single precision integer.
  40966. */
  40967. static sp_digit sp_3072_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  40968. {
  40969. register sp_digit* r asm ("r0") = r_p;
  40970. register const sp_digit* a asm ("r1") = a_p;
  40971. register const sp_digit* b asm ("r2") = b_p;
  40972. __asm__ __volatile__ (
  40973. "mov r12, #0\n\t"
  40974. "add lr, %[a], #0x180\n\t"
  40975. "\n"
  40976. "L_sp_3072_sub_96_word_%=: \n\t"
  40977. "rsbs r12, r12, #0\n\t"
  40978. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  40979. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  40980. "sbcs r3, r3, r7\n\t"
  40981. "sbcs r4, r4, r8\n\t"
  40982. "sbcs r5, r5, r9\n\t"
  40983. "sbcs r6, r6, r10\n\t"
  40984. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  40985. "sbc r12, r3, r3\n\t"
  40986. "cmp %[a], lr\n\t"
  40987. "bne L_sp_3072_sub_96_word_%=\n\t"
  40988. "mov %[r], r12\n\t"
  40989. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  40990. :
  40991. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr"
  40992. );
  40993. return (uint32_t)(size_t)r;
  40994. }
  40995. #else
  40996. /* Sub b from a into r. (r = a - b)
  40997. *
  40998. * r A single precision integer.
  40999. * a A single precision integer.
  41000. * b A single precision integer.
  41001. */
  41002. static sp_digit sp_3072_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  41003. {
  41004. register sp_digit* r asm ("r0") = r_p;
  41005. register const sp_digit* a asm ("r1") = a_p;
  41006. register const sp_digit* b asm ("r2") = b_p;
  41007. __asm__ __volatile__ (
  41008. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41009. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41010. "subs r3, r3, r7\n\t"
  41011. "sbcs r4, r4, r8\n\t"
  41012. "sbcs r5, r5, r9\n\t"
  41013. "sbcs r6, r6, r10\n\t"
  41014. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41015. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41016. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41017. "sbcs r3, r3, r7\n\t"
  41018. "sbcs r4, r4, r8\n\t"
  41019. "sbcs r5, r5, r9\n\t"
  41020. "sbcs r6, r6, r10\n\t"
  41021. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41022. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41023. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41024. "sbcs r3, r3, r7\n\t"
  41025. "sbcs r4, r4, r8\n\t"
  41026. "sbcs r5, r5, r9\n\t"
  41027. "sbcs r6, r6, r10\n\t"
  41028. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41029. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41030. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41031. "sbcs r3, r3, r7\n\t"
  41032. "sbcs r4, r4, r8\n\t"
  41033. "sbcs r5, r5, r9\n\t"
  41034. "sbcs r6, r6, r10\n\t"
  41035. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41036. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41037. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41038. "sbcs r3, r3, r7\n\t"
  41039. "sbcs r4, r4, r8\n\t"
  41040. "sbcs r5, r5, r9\n\t"
  41041. "sbcs r6, r6, r10\n\t"
  41042. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41043. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41044. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41045. "sbcs r3, r3, r7\n\t"
  41046. "sbcs r4, r4, r8\n\t"
  41047. "sbcs r5, r5, r9\n\t"
  41048. "sbcs r6, r6, r10\n\t"
  41049. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41050. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41051. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41052. "sbcs r3, r3, r7\n\t"
  41053. "sbcs r4, r4, r8\n\t"
  41054. "sbcs r5, r5, r9\n\t"
  41055. "sbcs r6, r6, r10\n\t"
  41056. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41057. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41058. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41059. "sbcs r3, r3, r7\n\t"
  41060. "sbcs r4, r4, r8\n\t"
  41061. "sbcs r5, r5, r9\n\t"
  41062. "sbcs r6, r6, r10\n\t"
  41063. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41064. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41065. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41066. "sbcs r3, r3, r7\n\t"
  41067. "sbcs r4, r4, r8\n\t"
  41068. "sbcs r5, r5, r9\n\t"
  41069. "sbcs r6, r6, r10\n\t"
  41070. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41071. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41072. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41073. "sbcs r3, r3, r7\n\t"
  41074. "sbcs r4, r4, r8\n\t"
  41075. "sbcs r5, r5, r9\n\t"
  41076. "sbcs r6, r6, r10\n\t"
  41077. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41078. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41079. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41080. "sbcs r3, r3, r7\n\t"
  41081. "sbcs r4, r4, r8\n\t"
  41082. "sbcs r5, r5, r9\n\t"
  41083. "sbcs r6, r6, r10\n\t"
  41084. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41085. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41086. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41087. "sbcs r3, r3, r7\n\t"
  41088. "sbcs r4, r4, r8\n\t"
  41089. "sbcs r5, r5, r9\n\t"
  41090. "sbcs r6, r6, r10\n\t"
  41091. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41092. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41093. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41094. "sbcs r3, r3, r7\n\t"
  41095. "sbcs r4, r4, r8\n\t"
  41096. "sbcs r5, r5, r9\n\t"
  41097. "sbcs r6, r6, r10\n\t"
  41098. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41099. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41100. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41101. "sbcs r3, r3, r7\n\t"
  41102. "sbcs r4, r4, r8\n\t"
  41103. "sbcs r5, r5, r9\n\t"
  41104. "sbcs r6, r6, r10\n\t"
  41105. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41106. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41107. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41108. "sbcs r3, r3, r7\n\t"
  41109. "sbcs r4, r4, r8\n\t"
  41110. "sbcs r5, r5, r9\n\t"
  41111. "sbcs r6, r6, r10\n\t"
  41112. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41113. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41114. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41115. "sbcs r3, r3, r7\n\t"
  41116. "sbcs r4, r4, r8\n\t"
  41117. "sbcs r5, r5, r9\n\t"
  41118. "sbcs r6, r6, r10\n\t"
  41119. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41120. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41121. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41122. "sbcs r3, r3, r7\n\t"
  41123. "sbcs r4, r4, r8\n\t"
  41124. "sbcs r5, r5, r9\n\t"
  41125. "sbcs r6, r6, r10\n\t"
  41126. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41127. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41128. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41129. "sbcs r3, r3, r7\n\t"
  41130. "sbcs r4, r4, r8\n\t"
  41131. "sbcs r5, r5, r9\n\t"
  41132. "sbcs r6, r6, r10\n\t"
  41133. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41134. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41135. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41136. "sbcs r3, r3, r7\n\t"
  41137. "sbcs r4, r4, r8\n\t"
  41138. "sbcs r5, r5, r9\n\t"
  41139. "sbcs r6, r6, r10\n\t"
  41140. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41141. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41142. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41143. "sbcs r3, r3, r7\n\t"
  41144. "sbcs r4, r4, r8\n\t"
  41145. "sbcs r5, r5, r9\n\t"
  41146. "sbcs r6, r6, r10\n\t"
  41147. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41148. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41149. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41150. "sbcs r3, r3, r7\n\t"
  41151. "sbcs r4, r4, r8\n\t"
  41152. "sbcs r5, r5, r9\n\t"
  41153. "sbcs r6, r6, r10\n\t"
  41154. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41155. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41156. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41157. "sbcs r3, r3, r7\n\t"
  41158. "sbcs r4, r4, r8\n\t"
  41159. "sbcs r5, r5, r9\n\t"
  41160. "sbcs r6, r6, r10\n\t"
  41161. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41162. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41163. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41164. "sbcs r3, r3, r7\n\t"
  41165. "sbcs r4, r4, r8\n\t"
  41166. "sbcs r5, r5, r9\n\t"
  41167. "sbcs r6, r6, r10\n\t"
  41168. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41169. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  41170. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  41171. "sbcs r3, r3, r7\n\t"
  41172. "sbcs r4, r4, r8\n\t"
  41173. "sbcs r5, r5, r9\n\t"
  41174. "sbcs r6, r6, r10\n\t"
  41175. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  41176. "sbc %[r], r6, r6\n\t"
  41177. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  41178. :
  41179. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  41180. );
  41181. return (uint32_t)(size_t)r;
  41182. }
  41183. #endif /* WOLFSSL_SP_SMALL */
  41184. #ifdef WOLFSSL_SP_USE_UDIV
  41185. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  41186. *
  41187. * d1 The high order half of the number to divide.
  41188. * d0 The low order half of the number to divide.
  41189. * div The divisor.
  41190. * returns the result of the division.
  41191. *
  41192. * Note that this is an approximate div. It may give an answer 1 larger.
  41193. */
  41194. static sp_digit div_3072_word_96(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  41195. {
  41196. register sp_digit d1 asm ("r0") = d1_p;
  41197. register sp_digit d0 asm ("r1") = d0_p;
  41198. register sp_digit div asm ("r2") = div_p;
  41199. __asm__ __volatile__ (
  41200. "lsr r6, %[div], #16\n\t"
  41201. "add lr, r6, #1\n\t"
  41202. "udiv r4, %[d1], lr\n\t"
  41203. "lsl r5, %[div], #16\n\t"
  41204. "lsl r4, r4, #16\n\t"
  41205. "umull r3, r12, %[div], r4\n\t"
  41206. "subs %[d0], %[d0], r3\n\t"
  41207. "sbc %[d1], %[d1], r12\n\t"
  41208. "subs r3, %[d1], lr\n\t"
  41209. "sbc r7, r7, r7\n\t"
  41210. "add r7, r7, #1\n\t"
  41211. "rsb r8, r7, #0\n\t"
  41212. "lsl r7, r7, #16\n\t"
  41213. "and r5, r5, r8\n\t"
  41214. "and r6, r6, r8\n\t"
  41215. "subs %[d0], %[d0], r5\n\t"
  41216. "add r4, r4, r7\n\t"
  41217. "sbc %[d1], %[d1], r6\n\t"
  41218. "lsl r12, %[d1], #16\n\t"
  41219. "lsr r3, %[d0], #16\n\t"
  41220. "orr r3, r3, r12\n\t"
  41221. "udiv r3, r3, lr\n\t"
  41222. "add r4, r4, r3\n\t"
  41223. "umull r3, r12, %[div], r3\n\t"
  41224. "subs %[d0], %[d0], r3\n\t"
  41225. "sbc %[d1], %[d1], r12\n\t"
  41226. "lsl r12, %[d1], #16\n\t"
  41227. "lsr r3, %[d0], #16\n\t"
  41228. "orr r3, r3, r12\n\t"
  41229. "udiv r3, r3, lr\n\t"
  41230. "add r4, r4, r3\n\t"
  41231. "mul r3, %[div], r3\n\t"
  41232. "sub %[d0], %[d0], r3\n\t"
  41233. "udiv r3, %[d0], %[div]\n\t"
  41234. "add %[d1], r4, r3\n\t"
  41235. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  41236. :
  41237. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  41238. );
  41239. return (uint32_t)(size_t)d1;
  41240. }
  41241. #else
  41242. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  41243. *
  41244. * d1 The high order half of the number to divide.
  41245. * d0 The low order half of the number to divide.
  41246. * div The divisor.
  41247. * returns the result of the division.
  41248. *
  41249. * Note that this is an approximate div. It may give an answer 1 larger.
  41250. */
  41251. static sp_digit div_3072_word_96(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  41252. {
  41253. register sp_digit d1 asm ("r0") = d1_p;
  41254. register sp_digit d0 asm ("r1") = d0_p;
  41255. register sp_digit div asm ("r2") = div_p;
  41256. __asm__ __volatile__ (
  41257. "lsr lr, %[div], #1\n\t"
  41258. "add lr, lr, #1\n\t"
  41259. "mov r4, %[d0]\n\t"
  41260. "mov r5, %[d1]\n\t"
  41261. /* Do top 32 */
  41262. "subs r6, lr, r5\n\t"
  41263. "sbc r6, r6, r6\n\t"
  41264. "mov r3, #0\n\t"
  41265. "sub r3, r3, r6\n\t"
  41266. "and r6, r6, lr\n\t"
  41267. "subs r5, r5, r6\n\t"
  41268. /* Next 30 bits */
  41269. "mov r12, #29\n\t"
  41270. "\n"
  41271. "L_div_3072_word_96_bit_%=: \n\t"
  41272. "lsls r4, r4, #1\n\t"
  41273. "adc r5, r5, r5\n\t"
  41274. "subs r6, lr, r5\n\t"
  41275. "sbc r6, r6, r6\n\t"
  41276. "add r3, r3, r3\n\t"
  41277. "sub r3, r3, r6\n\t"
  41278. "and r6, r6, lr\n\t"
  41279. "subs r5, r5, r6\n\t"
  41280. "subs r12, r12, #1\n\t"
  41281. "bpl L_div_3072_word_96_bit_%=\n\t"
  41282. "add r3, r3, r3\n\t"
  41283. "add r3, r3, #1\n\t"
  41284. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  41285. "lsl r7, r3, #16\n\t"
  41286. "lsl r4, %[div], #16\n\t"
  41287. "lsr r7, r7, #16\n\t"
  41288. "lsr r4, r4, #16\n\t"
  41289. "mul r4, r7, r4\n\t"
  41290. "lsr r8, %[div], #16\n\t"
  41291. "mul r7, r8, r7\n\t"
  41292. "lsr r5, r7, #16\n\t"
  41293. "lsl r7, r7, #16\n\t"
  41294. "adds r4, r4, r7\n\t"
  41295. "adc r5, r5, #0\n\t"
  41296. "lsr r7, r3, #16\n\t"
  41297. "mul r8, r7, r8\n\t"
  41298. "add r5, r5, r8\n\t"
  41299. "lsl r8, %[div], #16\n\t"
  41300. "lsr r8, r8, #16\n\t"
  41301. "mul r7, r8, r7\n\t"
  41302. "lsr r8, r7, #16\n\t"
  41303. "lsl r7, r7, #16\n\t"
  41304. "adds r4, r4, r7\n\t"
  41305. "adc r5, r5, r8\n\t"
  41306. #else
  41307. "umull r4, r5, r3, %[div]\n\t"
  41308. #endif
  41309. "subs r7, %[d0], r4\n\t"
  41310. "sbc r8, %[d1], r5\n\t"
  41311. "add r3, r3, r8\n\t"
  41312. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  41313. "lsl r7, r3, #16\n\t"
  41314. "lsl r4, %[div], #16\n\t"
  41315. "lsr r7, r7, #16\n\t"
  41316. "lsr r4, r4, #16\n\t"
  41317. "mul r4, r7, r4\n\t"
  41318. "lsr r8, %[div], #16\n\t"
  41319. "mul r7, r8, r7\n\t"
  41320. "lsr r5, r7, #16\n\t"
  41321. "lsl r7, r7, #16\n\t"
  41322. "adds r4, r4, r7\n\t"
  41323. "adc r5, r5, #0\n\t"
  41324. "lsr r7, r3, #16\n\t"
  41325. "mul r8, r7, r8\n\t"
  41326. "add r5, r5, r8\n\t"
  41327. "lsl r8, %[div], #16\n\t"
  41328. "lsr r8, r8, #16\n\t"
  41329. "mul r7, r8, r7\n\t"
  41330. "lsr r8, r7, #16\n\t"
  41331. "lsl r7, r7, #16\n\t"
  41332. "adds r4, r4, r7\n\t"
  41333. "adc r5, r5, r8\n\t"
  41334. #else
  41335. "umull r4, r5, r3, %[div]\n\t"
  41336. #endif
  41337. "subs r7, %[d0], r4\n\t"
  41338. "sbc r8, %[d1], r5\n\t"
  41339. "add r3, r3, r8\n\t"
  41340. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  41341. "lsl r7, r3, #16\n\t"
  41342. "lsl r4, %[div], #16\n\t"
  41343. "lsr r7, r7, #16\n\t"
  41344. "lsr r4, r4, #16\n\t"
  41345. "mul r4, r7, r4\n\t"
  41346. "lsr r8, %[div], #16\n\t"
  41347. "mul r7, r8, r7\n\t"
  41348. "lsr r5, r7, #16\n\t"
  41349. "lsl r7, r7, #16\n\t"
  41350. "adds r4, r4, r7\n\t"
  41351. "adc r5, r5, #0\n\t"
  41352. "lsr r7, r3, #16\n\t"
  41353. "mul r8, r7, r8\n\t"
  41354. "add r5, r5, r8\n\t"
  41355. "lsl r8, %[div], #16\n\t"
  41356. "lsr r8, r8, #16\n\t"
  41357. "mul r7, r8, r7\n\t"
  41358. "lsr r8, r7, #16\n\t"
  41359. "lsl r7, r7, #16\n\t"
  41360. "adds r4, r4, r7\n\t"
  41361. "adc r5, r5, r8\n\t"
  41362. #else
  41363. "umull r4, r5, r3, %[div]\n\t"
  41364. #endif
  41365. "subs r7, %[d0], r4\n\t"
  41366. "sbc r8, %[d1], r5\n\t"
  41367. "add r3, r3, r8\n\t"
  41368. "subs r6, %[div], r7\n\t"
  41369. "sbc r6, r6, r6\n\t"
  41370. "sub %[d1], r3, r6\n\t"
  41371. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  41372. :
  41373. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  41374. );
  41375. return (uint32_t)(size_t)d1;
  41376. }
  41377. #endif
  41378. /* Divide d in a and put remainder into r (m*d + r = a)
  41379. * m is not calculated as it is not needed at this time.
  41380. *
  41381. * a Number to be divided.
  41382. * d Number to divide with.
  41383. * m Multiplier result.
  41384. * r Remainder from the division.
  41385. * returns MP_OKAY indicating success.
  41386. */
  41387. static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
  41388. sp_digit* r)
  41389. {
  41390. sp_digit t1[192], t2[97];
  41391. sp_digit div, r1;
  41392. int i;
  41393. (void)m;
  41394. div = d[95];
  41395. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  41396. for (i = 95; i > 0; i--) {
  41397. if (t1[i + 96] != d[i])
  41398. break;
  41399. }
  41400. if (t1[i + 96] >= d[i]) {
  41401. sp_3072_sub_in_place_96(&t1[96], d);
  41402. }
  41403. for (i = 95; i >= 0; i--) {
  41404. if (t1[96 + i] == div) {
  41405. r1 = SP_DIGIT_MAX;
  41406. }
  41407. else {
  41408. r1 = div_3072_word_96(t1[96 + i], t1[96 + i - 1], div);
  41409. }
  41410. sp_3072_mul_d_96(t2, d, r1);
  41411. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  41412. t1[96 + i] -= t2[96];
  41413. if (t1[96 + i] != 0) {
  41414. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  41415. if (t1[96 + i] != 0)
  41416. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  41417. }
  41418. }
  41419. for (i = 95; i > 0; i--) {
  41420. if (t1[i] != d[i])
  41421. break;
  41422. }
  41423. if (t1[i] >= d[i]) {
  41424. sp_3072_sub_96(r, t1, d);
  41425. }
  41426. else {
  41427. XMEMCPY(r, t1, sizeof(*t1) * 96);
  41428. }
  41429. return MP_OKAY;
  41430. }
  41431. /* Reduce a modulo m into r. (r = a mod m)
  41432. *
  41433. * r A single precision number that is the reduced result.
  41434. * a A single precision number that is to be reduced.
  41435. * m A single precision number that is the modulus to reduce with.
  41436. * returns MP_OKAY indicating success.
  41437. */
  41438. static WC_INLINE int sp_3072_mod_96_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  41439. {
  41440. return sp_3072_div_96_cond(a, m, NULL, r);
  41441. }
  41442. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  41443. #if defined(WOLFSSL_HAVE_SP_DH) || !defined(WOLFSSL_RSA_PUBLIC_ONLY)
  41444. /* AND m into each word of a and store in r.
  41445. *
  41446. * r A single precision integer.
  41447. * a A single precision integer.
  41448. * m Mask to AND against each digit.
  41449. */
  41450. static void sp_3072_mask_96(sp_digit* r, const sp_digit* a, sp_digit m)
  41451. {
  41452. #ifdef WOLFSSL_SP_SMALL
  41453. int i;
  41454. for (i=0; i<96; i++) {
  41455. r[i] = a[i] & m;
  41456. }
  41457. #else
  41458. int i;
  41459. for (i = 0; i < 96; i += 8) {
  41460. r[i+0] = a[i+0] & m;
  41461. r[i+1] = a[i+1] & m;
  41462. r[i+2] = a[i+2] & m;
  41463. r[i+3] = a[i+3] & m;
  41464. r[i+4] = a[i+4] & m;
  41465. r[i+5] = a[i+5] & m;
  41466. r[i+6] = a[i+6] & m;
  41467. r[i+7] = a[i+7] & m;
  41468. }
  41469. #endif
  41470. }
  41471. /* Compare a with b in constant time.
  41472. *
  41473. * a A single precision integer.
  41474. * b A single precision integer.
  41475. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  41476. * respectively.
  41477. */
  41478. static sp_int32 sp_3072_cmp_96(const sp_digit* a_p, const sp_digit* b_p)
  41479. {
  41480. register const sp_digit* a asm ("r0") = a_p;
  41481. register const sp_digit* b asm ("r1") = b_p;
  41482. __asm__ __volatile__ (
  41483. "mov r2, #-1\n\t"
  41484. "mov r6, #1\n\t"
  41485. "mov r5, #0\n\t"
  41486. "mov r3, #-1\n\t"
  41487. #ifdef WOLFSSL_SP_SMALL
  41488. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  41489. "mov r4, #0x1\n\t"
  41490. "lsl r4, r4, #8\n\t"
  41491. "add r4, r4, #0x7c\n\t"
  41492. #else
  41493. "mov r4, #0x17c\n\t"
  41494. #endif
  41495. "\n"
  41496. "L_sp_3072_cmp_96_words_%=: \n\t"
  41497. "ldr r12, [%[a], r4]\n\t"
  41498. "ldr lr, [%[b], r4]\n\t"
  41499. "and r12, r12, r3\n\t"
  41500. "and lr, lr, r3\n\t"
  41501. "subs r12, r12, lr\n\t"
  41502. "it hi\n\t"
  41503. "movhi r2, r6\n\t"
  41504. "it lo\n\t"
  41505. "movlo r2, r3\n\t"
  41506. "it ne\n\t"
  41507. "movne r3, r5\n\t"
  41508. "subs r4, r4, #4\n\t"
  41509. "bcs L_sp_3072_cmp_96_words_%=\n\t"
  41510. "eor r2, r2, r3\n\t"
  41511. #else
  41512. "ldr r12, [%[a], #380]\n\t"
  41513. "ldr lr, [%[b], #380]\n\t"
  41514. "and r12, r12, r3\n\t"
  41515. "and lr, lr, r3\n\t"
  41516. "subs r12, r12, lr\n\t"
  41517. "it hi\n\t"
  41518. "movhi r2, r6\n\t"
  41519. "it lo\n\t"
  41520. "movlo r2, r3\n\t"
  41521. "it ne\n\t"
  41522. "movne r3, r5\n\t"
  41523. "ldr r12, [%[a], #376]\n\t"
  41524. "ldr lr, [%[b], #376]\n\t"
  41525. "and r12, r12, r3\n\t"
  41526. "and lr, lr, r3\n\t"
  41527. "subs r12, r12, lr\n\t"
  41528. "it hi\n\t"
  41529. "movhi r2, r6\n\t"
  41530. "it lo\n\t"
  41531. "movlo r2, r3\n\t"
  41532. "it ne\n\t"
  41533. "movne r3, r5\n\t"
  41534. "ldr r12, [%[a], #372]\n\t"
  41535. "ldr lr, [%[b], #372]\n\t"
  41536. "and r12, r12, r3\n\t"
  41537. "and lr, lr, r3\n\t"
  41538. "subs r12, r12, lr\n\t"
  41539. "it hi\n\t"
  41540. "movhi r2, r6\n\t"
  41541. "it lo\n\t"
  41542. "movlo r2, r3\n\t"
  41543. "it ne\n\t"
  41544. "movne r3, r5\n\t"
  41545. "ldr r12, [%[a], #368]\n\t"
  41546. "ldr lr, [%[b], #368]\n\t"
  41547. "and r12, r12, r3\n\t"
  41548. "and lr, lr, r3\n\t"
  41549. "subs r12, r12, lr\n\t"
  41550. "it hi\n\t"
  41551. "movhi r2, r6\n\t"
  41552. "it lo\n\t"
  41553. "movlo r2, r3\n\t"
  41554. "it ne\n\t"
  41555. "movne r3, r5\n\t"
  41556. "ldr r12, [%[a], #364]\n\t"
  41557. "ldr lr, [%[b], #364]\n\t"
  41558. "and r12, r12, r3\n\t"
  41559. "and lr, lr, r3\n\t"
  41560. "subs r12, r12, lr\n\t"
  41561. "it hi\n\t"
  41562. "movhi r2, r6\n\t"
  41563. "it lo\n\t"
  41564. "movlo r2, r3\n\t"
  41565. "it ne\n\t"
  41566. "movne r3, r5\n\t"
  41567. "ldr r12, [%[a], #360]\n\t"
  41568. "ldr lr, [%[b], #360]\n\t"
  41569. "and r12, r12, r3\n\t"
  41570. "and lr, lr, r3\n\t"
  41571. "subs r12, r12, lr\n\t"
  41572. "it hi\n\t"
  41573. "movhi r2, r6\n\t"
  41574. "it lo\n\t"
  41575. "movlo r2, r3\n\t"
  41576. "it ne\n\t"
  41577. "movne r3, r5\n\t"
  41578. "ldr r12, [%[a], #356]\n\t"
  41579. "ldr lr, [%[b], #356]\n\t"
  41580. "and r12, r12, r3\n\t"
  41581. "and lr, lr, r3\n\t"
  41582. "subs r12, r12, lr\n\t"
  41583. "it hi\n\t"
  41584. "movhi r2, r6\n\t"
  41585. "it lo\n\t"
  41586. "movlo r2, r3\n\t"
  41587. "it ne\n\t"
  41588. "movne r3, r5\n\t"
  41589. "ldr r12, [%[a], #352]\n\t"
  41590. "ldr lr, [%[b], #352]\n\t"
  41591. "and r12, r12, r3\n\t"
  41592. "and lr, lr, r3\n\t"
  41593. "subs r12, r12, lr\n\t"
  41594. "it hi\n\t"
  41595. "movhi r2, r6\n\t"
  41596. "it lo\n\t"
  41597. "movlo r2, r3\n\t"
  41598. "it ne\n\t"
  41599. "movne r3, r5\n\t"
  41600. "ldr r12, [%[a], #348]\n\t"
  41601. "ldr lr, [%[b], #348]\n\t"
  41602. "and r12, r12, r3\n\t"
  41603. "and lr, lr, r3\n\t"
  41604. "subs r12, r12, lr\n\t"
  41605. "it hi\n\t"
  41606. "movhi r2, r6\n\t"
  41607. "it lo\n\t"
  41608. "movlo r2, r3\n\t"
  41609. "it ne\n\t"
  41610. "movne r3, r5\n\t"
  41611. "ldr r12, [%[a], #344]\n\t"
  41612. "ldr lr, [%[b], #344]\n\t"
  41613. "and r12, r12, r3\n\t"
  41614. "and lr, lr, r3\n\t"
  41615. "subs r12, r12, lr\n\t"
  41616. "it hi\n\t"
  41617. "movhi r2, r6\n\t"
  41618. "it lo\n\t"
  41619. "movlo r2, r3\n\t"
  41620. "it ne\n\t"
  41621. "movne r3, r5\n\t"
  41622. "ldr r12, [%[a], #340]\n\t"
  41623. "ldr lr, [%[b], #340]\n\t"
  41624. "and r12, r12, r3\n\t"
  41625. "and lr, lr, r3\n\t"
  41626. "subs r12, r12, lr\n\t"
  41627. "it hi\n\t"
  41628. "movhi r2, r6\n\t"
  41629. "it lo\n\t"
  41630. "movlo r2, r3\n\t"
  41631. "it ne\n\t"
  41632. "movne r3, r5\n\t"
  41633. "ldr r12, [%[a], #336]\n\t"
  41634. "ldr lr, [%[b], #336]\n\t"
  41635. "and r12, r12, r3\n\t"
  41636. "and lr, lr, r3\n\t"
  41637. "subs r12, r12, lr\n\t"
  41638. "it hi\n\t"
  41639. "movhi r2, r6\n\t"
  41640. "it lo\n\t"
  41641. "movlo r2, r3\n\t"
  41642. "it ne\n\t"
  41643. "movne r3, r5\n\t"
  41644. "ldr r12, [%[a], #332]\n\t"
  41645. "ldr lr, [%[b], #332]\n\t"
  41646. "and r12, r12, r3\n\t"
  41647. "and lr, lr, r3\n\t"
  41648. "subs r12, r12, lr\n\t"
  41649. "it hi\n\t"
  41650. "movhi r2, r6\n\t"
  41651. "it lo\n\t"
  41652. "movlo r2, r3\n\t"
  41653. "it ne\n\t"
  41654. "movne r3, r5\n\t"
  41655. "ldr r12, [%[a], #328]\n\t"
  41656. "ldr lr, [%[b], #328]\n\t"
  41657. "and r12, r12, r3\n\t"
  41658. "and lr, lr, r3\n\t"
  41659. "subs r12, r12, lr\n\t"
  41660. "it hi\n\t"
  41661. "movhi r2, r6\n\t"
  41662. "it lo\n\t"
  41663. "movlo r2, r3\n\t"
  41664. "it ne\n\t"
  41665. "movne r3, r5\n\t"
  41666. "ldr r12, [%[a], #324]\n\t"
  41667. "ldr lr, [%[b], #324]\n\t"
  41668. "and r12, r12, r3\n\t"
  41669. "and lr, lr, r3\n\t"
  41670. "subs r12, r12, lr\n\t"
  41671. "it hi\n\t"
  41672. "movhi r2, r6\n\t"
  41673. "it lo\n\t"
  41674. "movlo r2, r3\n\t"
  41675. "it ne\n\t"
  41676. "movne r3, r5\n\t"
  41677. "ldr r12, [%[a], #320]\n\t"
  41678. "ldr lr, [%[b], #320]\n\t"
  41679. "and r12, r12, r3\n\t"
  41680. "and lr, lr, r3\n\t"
  41681. "subs r12, r12, lr\n\t"
  41682. "it hi\n\t"
  41683. "movhi r2, r6\n\t"
  41684. "it lo\n\t"
  41685. "movlo r2, r3\n\t"
  41686. "it ne\n\t"
  41687. "movne r3, r5\n\t"
  41688. "ldr r12, [%[a], #316]\n\t"
  41689. "ldr lr, [%[b], #316]\n\t"
  41690. "and r12, r12, r3\n\t"
  41691. "and lr, lr, r3\n\t"
  41692. "subs r12, r12, lr\n\t"
  41693. "it hi\n\t"
  41694. "movhi r2, r6\n\t"
  41695. "it lo\n\t"
  41696. "movlo r2, r3\n\t"
  41697. "it ne\n\t"
  41698. "movne r3, r5\n\t"
  41699. "ldr r12, [%[a], #312]\n\t"
  41700. "ldr lr, [%[b], #312]\n\t"
  41701. "and r12, r12, r3\n\t"
  41702. "and lr, lr, r3\n\t"
  41703. "subs r12, r12, lr\n\t"
  41704. "it hi\n\t"
  41705. "movhi r2, r6\n\t"
  41706. "it lo\n\t"
  41707. "movlo r2, r3\n\t"
  41708. "it ne\n\t"
  41709. "movne r3, r5\n\t"
  41710. "ldr r12, [%[a], #308]\n\t"
  41711. "ldr lr, [%[b], #308]\n\t"
  41712. "and r12, r12, r3\n\t"
  41713. "and lr, lr, r3\n\t"
  41714. "subs r12, r12, lr\n\t"
  41715. "it hi\n\t"
  41716. "movhi r2, r6\n\t"
  41717. "it lo\n\t"
  41718. "movlo r2, r3\n\t"
  41719. "it ne\n\t"
  41720. "movne r3, r5\n\t"
  41721. "ldr r12, [%[a], #304]\n\t"
  41722. "ldr lr, [%[b], #304]\n\t"
  41723. "and r12, r12, r3\n\t"
  41724. "and lr, lr, r3\n\t"
  41725. "subs r12, r12, lr\n\t"
  41726. "it hi\n\t"
  41727. "movhi r2, r6\n\t"
  41728. "it lo\n\t"
  41729. "movlo r2, r3\n\t"
  41730. "it ne\n\t"
  41731. "movne r3, r5\n\t"
  41732. "ldr r12, [%[a], #300]\n\t"
  41733. "ldr lr, [%[b], #300]\n\t"
  41734. "and r12, r12, r3\n\t"
  41735. "and lr, lr, r3\n\t"
  41736. "subs r12, r12, lr\n\t"
  41737. "it hi\n\t"
  41738. "movhi r2, r6\n\t"
  41739. "it lo\n\t"
  41740. "movlo r2, r3\n\t"
  41741. "it ne\n\t"
  41742. "movne r3, r5\n\t"
  41743. "ldr r12, [%[a], #296]\n\t"
  41744. "ldr lr, [%[b], #296]\n\t"
  41745. "and r12, r12, r3\n\t"
  41746. "and lr, lr, r3\n\t"
  41747. "subs r12, r12, lr\n\t"
  41748. "it hi\n\t"
  41749. "movhi r2, r6\n\t"
  41750. "it lo\n\t"
  41751. "movlo r2, r3\n\t"
  41752. "it ne\n\t"
  41753. "movne r3, r5\n\t"
  41754. "ldr r12, [%[a], #292]\n\t"
  41755. "ldr lr, [%[b], #292]\n\t"
  41756. "and r12, r12, r3\n\t"
  41757. "and lr, lr, r3\n\t"
  41758. "subs r12, r12, lr\n\t"
  41759. "it hi\n\t"
  41760. "movhi r2, r6\n\t"
  41761. "it lo\n\t"
  41762. "movlo r2, r3\n\t"
  41763. "it ne\n\t"
  41764. "movne r3, r5\n\t"
  41765. "ldr r12, [%[a], #288]\n\t"
  41766. "ldr lr, [%[b], #288]\n\t"
  41767. "and r12, r12, r3\n\t"
  41768. "and lr, lr, r3\n\t"
  41769. "subs r12, r12, lr\n\t"
  41770. "it hi\n\t"
  41771. "movhi r2, r6\n\t"
  41772. "it lo\n\t"
  41773. "movlo r2, r3\n\t"
  41774. "it ne\n\t"
  41775. "movne r3, r5\n\t"
  41776. "ldr r12, [%[a], #284]\n\t"
  41777. "ldr lr, [%[b], #284]\n\t"
  41778. "and r12, r12, r3\n\t"
  41779. "and lr, lr, r3\n\t"
  41780. "subs r12, r12, lr\n\t"
  41781. "it hi\n\t"
  41782. "movhi r2, r6\n\t"
  41783. "it lo\n\t"
  41784. "movlo r2, r3\n\t"
  41785. "it ne\n\t"
  41786. "movne r3, r5\n\t"
  41787. "ldr r12, [%[a], #280]\n\t"
  41788. "ldr lr, [%[b], #280]\n\t"
  41789. "and r12, r12, r3\n\t"
  41790. "and lr, lr, r3\n\t"
  41791. "subs r12, r12, lr\n\t"
  41792. "it hi\n\t"
  41793. "movhi r2, r6\n\t"
  41794. "it lo\n\t"
  41795. "movlo r2, r3\n\t"
  41796. "it ne\n\t"
  41797. "movne r3, r5\n\t"
  41798. "ldr r12, [%[a], #276]\n\t"
  41799. "ldr lr, [%[b], #276]\n\t"
  41800. "and r12, r12, r3\n\t"
  41801. "and lr, lr, r3\n\t"
  41802. "subs r12, r12, lr\n\t"
  41803. "it hi\n\t"
  41804. "movhi r2, r6\n\t"
  41805. "it lo\n\t"
  41806. "movlo r2, r3\n\t"
  41807. "it ne\n\t"
  41808. "movne r3, r5\n\t"
  41809. "ldr r12, [%[a], #272]\n\t"
  41810. "ldr lr, [%[b], #272]\n\t"
  41811. "and r12, r12, r3\n\t"
  41812. "and lr, lr, r3\n\t"
  41813. "subs r12, r12, lr\n\t"
  41814. "it hi\n\t"
  41815. "movhi r2, r6\n\t"
  41816. "it lo\n\t"
  41817. "movlo r2, r3\n\t"
  41818. "it ne\n\t"
  41819. "movne r3, r5\n\t"
  41820. "ldr r12, [%[a], #268]\n\t"
  41821. "ldr lr, [%[b], #268]\n\t"
  41822. "and r12, r12, r3\n\t"
  41823. "and lr, lr, r3\n\t"
  41824. "subs r12, r12, lr\n\t"
  41825. "it hi\n\t"
  41826. "movhi r2, r6\n\t"
  41827. "it lo\n\t"
  41828. "movlo r2, r3\n\t"
  41829. "it ne\n\t"
  41830. "movne r3, r5\n\t"
  41831. "ldr r12, [%[a], #264]\n\t"
  41832. "ldr lr, [%[b], #264]\n\t"
  41833. "and r12, r12, r3\n\t"
  41834. "and lr, lr, r3\n\t"
  41835. "subs r12, r12, lr\n\t"
  41836. "it hi\n\t"
  41837. "movhi r2, r6\n\t"
  41838. "it lo\n\t"
  41839. "movlo r2, r3\n\t"
  41840. "it ne\n\t"
  41841. "movne r3, r5\n\t"
  41842. "ldr r12, [%[a], #260]\n\t"
  41843. "ldr lr, [%[b], #260]\n\t"
  41844. "and r12, r12, r3\n\t"
  41845. "and lr, lr, r3\n\t"
  41846. "subs r12, r12, lr\n\t"
  41847. "it hi\n\t"
  41848. "movhi r2, r6\n\t"
  41849. "it lo\n\t"
  41850. "movlo r2, r3\n\t"
  41851. "it ne\n\t"
  41852. "movne r3, r5\n\t"
  41853. "ldr r12, [%[a], #256]\n\t"
  41854. "ldr lr, [%[b], #256]\n\t"
  41855. "and r12, r12, r3\n\t"
  41856. "and lr, lr, r3\n\t"
  41857. "subs r12, r12, lr\n\t"
  41858. "it hi\n\t"
  41859. "movhi r2, r6\n\t"
  41860. "it lo\n\t"
  41861. "movlo r2, r3\n\t"
  41862. "it ne\n\t"
  41863. "movne r3, r5\n\t"
  41864. "ldr r12, [%[a], #252]\n\t"
  41865. "ldr lr, [%[b], #252]\n\t"
  41866. "and r12, r12, r3\n\t"
  41867. "and lr, lr, r3\n\t"
  41868. "subs r12, r12, lr\n\t"
  41869. "it hi\n\t"
  41870. "movhi r2, r6\n\t"
  41871. "it lo\n\t"
  41872. "movlo r2, r3\n\t"
  41873. "it ne\n\t"
  41874. "movne r3, r5\n\t"
  41875. "ldr r12, [%[a], #248]\n\t"
  41876. "ldr lr, [%[b], #248]\n\t"
  41877. "and r12, r12, r3\n\t"
  41878. "and lr, lr, r3\n\t"
  41879. "subs r12, r12, lr\n\t"
  41880. "it hi\n\t"
  41881. "movhi r2, r6\n\t"
  41882. "it lo\n\t"
  41883. "movlo r2, r3\n\t"
  41884. "it ne\n\t"
  41885. "movne r3, r5\n\t"
  41886. "ldr r12, [%[a], #244]\n\t"
  41887. "ldr lr, [%[b], #244]\n\t"
  41888. "and r12, r12, r3\n\t"
  41889. "and lr, lr, r3\n\t"
  41890. "subs r12, r12, lr\n\t"
  41891. "it hi\n\t"
  41892. "movhi r2, r6\n\t"
  41893. "it lo\n\t"
  41894. "movlo r2, r3\n\t"
  41895. "it ne\n\t"
  41896. "movne r3, r5\n\t"
  41897. "ldr r12, [%[a], #240]\n\t"
  41898. "ldr lr, [%[b], #240]\n\t"
  41899. "and r12, r12, r3\n\t"
  41900. "and lr, lr, r3\n\t"
  41901. "subs r12, r12, lr\n\t"
  41902. "it hi\n\t"
  41903. "movhi r2, r6\n\t"
  41904. "it lo\n\t"
  41905. "movlo r2, r3\n\t"
  41906. "it ne\n\t"
  41907. "movne r3, r5\n\t"
  41908. "ldr r12, [%[a], #236]\n\t"
  41909. "ldr lr, [%[b], #236]\n\t"
  41910. "and r12, r12, r3\n\t"
  41911. "and lr, lr, r3\n\t"
  41912. "subs r12, r12, lr\n\t"
  41913. "it hi\n\t"
  41914. "movhi r2, r6\n\t"
  41915. "it lo\n\t"
  41916. "movlo r2, r3\n\t"
  41917. "it ne\n\t"
  41918. "movne r3, r5\n\t"
  41919. "ldr r12, [%[a], #232]\n\t"
  41920. "ldr lr, [%[b], #232]\n\t"
  41921. "and r12, r12, r3\n\t"
  41922. "and lr, lr, r3\n\t"
  41923. "subs r12, r12, lr\n\t"
  41924. "it hi\n\t"
  41925. "movhi r2, r6\n\t"
  41926. "it lo\n\t"
  41927. "movlo r2, r3\n\t"
  41928. "it ne\n\t"
  41929. "movne r3, r5\n\t"
  41930. "ldr r12, [%[a], #228]\n\t"
  41931. "ldr lr, [%[b], #228]\n\t"
  41932. "and r12, r12, r3\n\t"
  41933. "and lr, lr, r3\n\t"
  41934. "subs r12, r12, lr\n\t"
  41935. "it hi\n\t"
  41936. "movhi r2, r6\n\t"
  41937. "it lo\n\t"
  41938. "movlo r2, r3\n\t"
  41939. "it ne\n\t"
  41940. "movne r3, r5\n\t"
  41941. "ldr r12, [%[a], #224]\n\t"
  41942. "ldr lr, [%[b], #224]\n\t"
  41943. "and r12, r12, r3\n\t"
  41944. "and lr, lr, r3\n\t"
  41945. "subs r12, r12, lr\n\t"
  41946. "it hi\n\t"
  41947. "movhi r2, r6\n\t"
  41948. "it lo\n\t"
  41949. "movlo r2, r3\n\t"
  41950. "it ne\n\t"
  41951. "movne r3, r5\n\t"
  41952. "ldr r12, [%[a], #220]\n\t"
  41953. "ldr lr, [%[b], #220]\n\t"
  41954. "and r12, r12, r3\n\t"
  41955. "and lr, lr, r3\n\t"
  41956. "subs r12, r12, lr\n\t"
  41957. "it hi\n\t"
  41958. "movhi r2, r6\n\t"
  41959. "it lo\n\t"
  41960. "movlo r2, r3\n\t"
  41961. "it ne\n\t"
  41962. "movne r3, r5\n\t"
  41963. "ldr r12, [%[a], #216]\n\t"
  41964. "ldr lr, [%[b], #216]\n\t"
  41965. "and r12, r12, r3\n\t"
  41966. "and lr, lr, r3\n\t"
  41967. "subs r12, r12, lr\n\t"
  41968. "it hi\n\t"
  41969. "movhi r2, r6\n\t"
  41970. "it lo\n\t"
  41971. "movlo r2, r3\n\t"
  41972. "it ne\n\t"
  41973. "movne r3, r5\n\t"
  41974. "ldr r12, [%[a], #212]\n\t"
  41975. "ldr lr, [%[b], #212]\n\t"
  41976. "and r12, r12, r3\n\t"
  41977. "and lr, lr, r3\n\t"
  41978. "subs r12, r12, lr\n\t"
  41979. "it hi\n\t"
  41980. "movhi r2, r6\n\t"
  41981. "it lo\n\t"
  41982. "movlo r2, r3\n\t"
  41983. "it ne\n\t"
  41984. "movne r3, r5\n\t"
  41985. "ldr r12, [%[a], #208]\n\t"
  41986. "ldr lr, [%[b], #208]\n\t"
  41987. "and r12, r12, r3\n\t"
  41988. "and lr, lr, r3\n\t"
  41989. "subs r12, r12, lr\n\t"
  41990. "it hi\n\t"
  41991. "movhi r2, r6\n\t"
  41992. "it lo\n\t"
  41993. "movlo r2, r3\n\t"
  41994. "it ne\n\t"
  41995. "movne r3, r5\n\t"
  41996. "ldr r12, [%[a], #204]\n\t"
  41997. "ldr lr, [%[b], #204]\n\t"
  41998. "and r12, r12, r3\n\t"
  41999. "and lr, lr, r3\n\t"
  42000. "subs r12, r12, lr\n\t"
  42001. "it hi\n\t"
  42002. "movhi r2, r6\n\t"
  42003. "it lo\n\t"
  42004. "movlo r2, r3\n\t"
  42005. "it ne\n\t"
  42006. "movne r3, r5\n\t"
  42007. "ldr r12, [%[a], #200]\n\t"
  42008. "ldr lr, [%[b], #200]\n\t"
  42009. "and r12, r12, r3\n\t"
  42010. "and lr, lr, r3\n\t"
  42011. "subs r12, r12, lr\n\t"
  42012. "it hi\n\t"
  42013. "movhi r2, r6\n\t"
  42014. "it lo\n\t"
  42015. "movlo r2, r3\n\t"
  42016. "it ne\n\t"
  42017. "movne r3, r5\n\t"
  42018. "ldr r12, [%[a], #196]\n\t"
  42019. "ldr lr, [%[b], #196]\n\t"
  42020. "and r12, r12, r3\n\t"
  42021. "and lr, lr, r3\n\t"
  42022. "subs r12, r12, lr\n\t"
  42023. "it hi\n\t"
  42024. "movhi r2, r6\n\t"
  42025. "it lo\n\t"
  42026. "movlo r2, r3\n\t"
  42027. "it ne\n\t"
  42028. "movne r3, r5\n\t"
  42029. "ldr r12, [%[a], #192]\n\t"
  42030. "ldr lr, [%[b], #192]\n\t"
  42031. "and r12, r12, r3\n\t"
  42032. "and lr, lr, r3\n\t"
  42033. "subs r12, r12, lr\n\t"
  42034. "it hi\n\t"
  42035. "movhi r2, r6\n\t"
  42036. "it lo\n\t"
  42037. "movlo r2, r3\n\t"
  42038. "it ne\n\t"
  42039. "movne r3, r5\n\t"
  42040. "ldr r12, [%[a], #188]\n\t"
  42041. "ldr lr, [%[b], #188]\n\t"
  42042. "and r12, r12, r3\n\t"
  42043. "and lr, lr, r3\n\t"
  42044. "subs r12, r12, lr\n\t"
  42045. "it hi\n\t"
  42046. "movhi r2, r6\n\t"
  42047. "it lo\n\t"
  42048. "movlo r2, r3\n\t"
  42049. "it ne\n\t"
  42050. "movne r3, r5\n\t"
  42051. "ldr r12, [%[a], #184]\n\t"
  42052. "ldr lr, [%[b], #184]\n\t"
  42053. "and r12, r12, r3\n\t"
  42054. "and lr, lr, r3\n\t"
  42055. "subs r12, r12, lr\n\t"
  42056. "it hi\n\t"
  42057. "movhi r2, r6\n\t"
  42058. "it lo\n\t"
  42059. "movlo r2, r3\n\t"
  42060. "it ne\n\t"
  42061. "movne r3, r5\n\t"
  42062. "ldr r12, [%[a], #180]\n\t"
  42063. "ldr lr, [%[b], #180]\n\t"
  42064. "and r12, r12, r3\n\t"
  42065. "and lr, lr, r3\n\t"
  42066. "subs r12, r12, lr\n\t"
  42067. "it hi\n\t"
  42068. "movhi r2, r6\n\t"
  42069. "it lo\n\t"
  42070. "movlo r2, r3\n\t"
  42071. "it ne\n\t"
  42072. "movne r3, r5\n\t"
  42073. "ldr r12, [%[a], #176]\n\t"
  42074. "ldr lr, [%[b], #176]\n\t"
  42075. "and r12, r12, r3\n\t"
  42076. "and lr, lr, r3\n\t"
  42077. "subs r12, r12, lr\n\t"
  42078. "it hi\n\t"
  42079. "movhi r2, r6\n\t"
  42080. "it lo\n\t"
  42081. "movlo r2, r3\n\t"
  42082. "it ne\n\t"
  42083. "movne r3, r5\n\t"
  42084. "ldr r12, [%[a], #172]\n\t"
  42085. "ldr lr, [%[b], #172]\n\t"
  42086. "and r12, r12, r3\n\t"
  42087. "and lr, lr, r3\n\t"
  42088. "subs r12, r12, lr\n\t"
  42089. "it hi\n\t"
  42090. "movhi r2, r6\n\t"
  42091. "it lo\n\t"
  42092. "movlo r2, r3\n\t"
  42093. "it ne\n\t"
  42094. "movne r3, r5\n\t"
  42095. "ldr r12, [%[a], #168]\n\t"
  42096. "ldr lr, [%[b], #168]\n\t"
  42097. "and r12, r12, r3\n\t"
  42098. "and lr, lr, r3\n\t"
  42099. "subs r12, r12, lr\n\t"
  42100. "it hi\n\t"
  42101. "movhi r2, r6\n\t"
  42102. "it lo\n\t"
  42103. "movlo r2, r3\n\t"
  42104. "it ne\n\t"
  42105. "movne r3, r5\n\t"
  42106. "ldr r12, [%[a], #164]\n\t"
  42107. "ldr lr, [%[b], #164]\n\t"
  42108. "and r12, r12, r3\n\t"
  42109. "and lr, lr, r3\n\t"
  42110. "subs r12, r12, lr\n\t"
  42111. "it hi\n\t"
  42112. "movhi r2, r6\n\t"
  42113. "it lo\n\t"
  42114. "movlo r2, r3\n\t"
  42115. "it ne\n\t"
  42116. "movne r3, r5\n\t"
  42117. "ldr r12, [%[a], #160]\n\t"
  42118. "ldr lr, [%[b], #160]\n\t"
  42119. "and r12, r12, r3\n\t"
  42120. "and lr, lr, r3\n\t"
  42121. "subs r12, r12, lr\n\t"
  42122. "it hi\n\t"
  42123. "movhi r2, r6\n\t"
  42124. "it lo\n\t"
  42125. "movlo r2, r3\n\t"
  42126. "it ne\n\t"
  42127. "movne r3, r5\n\t"
  42128. "ldr r12, [%[a], #156]\n\t"
  42129. "ldr lr, [%[b], #156]\n\t"
  42130. "and r12, r12, r3\n\t"
  42131. "and lr, lr, r3\n\t"
  42132. "subs r12, r12, lr\n\t"
  42133. "it hi\n\t"
  42134. "movhi r2, r6\n\t"
  42135. "it lo\n\t"
  42136. "movlo r2, r3\n\t"
  42137. "it ne\n\t"
  42138. "movne r3, r5\n\t"
  42139. "ldr r12, [%[a], #152]\n\t"
  42140. "ldr lr, [%[b], #152]\n\t"
  42141. "and r12, r12, r3\n\t"
  42142. "and lr, lr, r3\n\t"
  42143. "subs r12, r12, lr\n\t"
  42144. "it hi\n\t"
  42145. "movhi r2, r6\n\t"
  42146. "it lo\n\t"
  42147. "movlo r2, r3\n\t"
  42148. "it ne\n\t"
  42149. "movne r3, r5\n\t"
  42150. "ldr r12, [%[a], #148]\n\t"
  42151. "ldr lr, [%[b], #148]\n\t"
  42152. "and r12, r12, r3\n\t"
  42153. "and lr, lr, r3\n\t"
  42154. "subs r12, r12, lr\n\t"
  42155. "it hi\n\t"
  42156. "movhi r2, r6\n\t"
  42157. "it lo\n\t"
  42158. "movlo r2, r3\n\t"
  42159. "it ne\n\t"
  42160. "movne r3, r5\n\t"
  42161. "ldr r12, [%[a], #144]\n\t"
  42162. "ldr lr, [%[b], #144]\n\t"
  42163. "and r12, r12, r3\n\t"
  42164. "and lr, lr, r3\n\t"
  42165. "subs r12, r12, lr\n\t"
  42166. "it hi\n\t"
  42167. "movhi r2, r6\n\t"
  42168. "it lo\n\t"
  42169. "movlo r2, r3\n\t"
  42170. "it ne\n\t"
  42171. "movne r3, r5\n\t"
  42172. "ldr r12, [%[a], #140]\n\t"
  42173. "ldr lr, [%[b], #140]\n\t"
  42174. "and r12, r12, r3\n\t"
  42175. "and lr, lr, r3\n\t"
  42176. "subs r12, r12, lr\n\t"
  42177. "it hi\n\t"
  42178. "movhi r2, r6\n\t"
  42179. "it lo\n\t"
  42180. "movlo r2, r3\n\t"
  42181. "it ne\n\t"
  42182. "movne r3, r5\n\t"
  42183. "ldr r12, [%[a], #136]\n\t"
  42184. "ldr lr, [%[b], #136]\n\t"
  42185. "and r12, r12, r3\n\t"
  42186. "and lr, lr, r3\n\t"
  42187. "subs r12, r12, lr\n\t"
  42188. "it hi\n\t"
  42189. "movhi r2, r6\n\t"
  42190. "it lo\n\t"
  42191. "movlo r2, r3\n\t"
  42192. "it ne\n\t"
  42193. "movne r3, r5\n\t"
  42194. "ldr r12, [%[a], #132]\n\t"
  42195. "ldr lr, [%[b], #132]\n\t"
  42196. "and r12, r12, r3\n\t"
  42197. "and lr, lr, r3\n\t"
  42198. "subs r12, r12, lr\n\t"
  42199. "it hi\n\t"
  42200. "movhi r2, r6\n\t"
  42201. "it lo\n\t"
  42202. "movlo r2, r3\n\t"
  42203. "it ne\n\t"
  42204. "movne r3, r5\n\t"
  42205. "ldr r12, [%[a], #128]\n\t"
  42206. "ldr lr, [%[b], #128]\n\t"
  42207. "and r12, r12, r3\n\t"
  42208. "and lr, lr, r3\n\t"
  42209. "subs r12, r12, lr\n\t"
  42210. "it hi\n\t"
  42211. "movhi r2, r6\n\t"
  42212. "it lo\n\t"
  42213. "movlo r2, r3\n\t"
  42214. "it ne\n\t"
  42215. "movne r3, r5\n\t"
  42216. "ldr r12, [%[a], #124]\n\t"
  42217. "ldr lr, [%[b], #124]\n\t"
  42218. "and r12, r12, r3\n\t"
  42219. "and lr, lr, r3\n\t"
  42220. "subs r12, r12, lr\n\t"
  42221. "it hi\n\t"
  42222. "movhi r2, r6\n\t"
  42223. "it lo\n\t"
  42224. "movlo r2, r3\n\t"
  42225. "it ne\n\t"
  42226. "movne r3, r5\n\t"
  42227. "ldr r12, [%[a], #120]\n\t"
  42228. "ldr lr, [%[b], #120]\n\t"
  42229. "and r12, r12, r3\n\t"
  42230. "and lr, lr, r3\n\t"
  42231. "subs r12, r12, lr\n\t"
  42232. "it hi\n\t"
  42233. "movhi r2, r6\n\t"
  42234. "it lo\n\t"
  42235. "movlo r2, r3\n\t"
  42236. "it ne\n\t"
  42237. "movne r3, r5\n\t"
  42238. "ldr r12, [%[a], #116]\n\t"
  42239. "ldr lr, [%[b], #116]\n\t"
  42240. "and r12, r12, r3\n\t"
  42241. "and lr, lr, r3\n\t"
  42242. "subs r12, r12, lr\n\t"
  42243. "it hi\n\t"
  42244. "movhi r2, r6\n\t"
  42245. "it lo\n\t"
  42246. "movlo r2, r3\n\t"
  42247. "it ne\n\t"
  42248. "movne r3, r5\n\t"
  42249. "ldr r12, [%[a], #112]\n\t"
  42250. "ldr lr, [%[b], #112]\n\t"
  42251. "and r12, r12, r3\n\t"
  42252. "and lr, lr, r3\n\t"
  42253. "subs r12, r12, lr\n\t"
  42254. "it hi\n\t"
  42255. "movhi r2, r6\n\t"
  42256. "it lo\n\t"
  42257. "movlo r2, r3\n\t"
  42258. "it ne\n\t"
  42259. "movne r3, r5\n\t"
  42260. "ldr r12, [%[a], #108]\n\t"
  42261. "ldr lr, [%[b], #108]\n\t"
  42262. "and r12, r12, r3\n\t"
  42263. "and lr, lr, r3\n\t"
  42264. "subs r12, r12, lr\n\t"
  42265. "it hi\n\t"
  42266. "movhi r2, r6\n\t"
  42267. "it lo\n\t"
  42268. "movlo r2, r3\n\t"
  42269. "it ne\n\t"
  42270. "movne r3, r5\n\t"
  42271. "ldr r12, [%[a], #104]\n\t"
  42272. "ldr lr, [%[b], #104]\n\t"
  42273. "and r12, r12, r3\n\t"
  42274. "and lr, lr, r3\n\t"
  42275. "subs r12, r12, lr\n\t"
  42276. "it hi\n\t"
  42277. "movhi r2, r6\n\t"
  42278. "it lo\n\t"
  42279. "movlo r2, r3\n\t"
  42280. "it ne\n\t"
  42281. "movne r3, r5\n\t"
  42282. "ldr r12, [%[a], #100]\n\t"
  42283. "ldr lr, [%[b], #100]\n\t"
  42284. "and r12, r12, r3\n\t"
  42285. "and lr, lr, r3\n\t"
  42286. "subs r12, r12, lr\n\t"
  42287. "it hi\n\t"
  42288. "movhi r2, r6\n\t"
  42289. "it lo\n\t"
  42290. "movlo r2, r3\n\t"
  42291. "it ne\n\t"
  42292. "movne r3, r5\n\t"
  42293. "ldr r12, [%[a], #96]\n\t"
  42294. "ldr lr, [%[b], #96]\n\t"
  42295. "and r12, r12, r3\n\t"
  42296. "and lr, lr, r3\n\t"
  42297. "subs r12, r12, lr\n\t"
  42298. "it hi\n\t"
  42299. "movhi r2, r6\n\t"
  42300. "it lo\n\t"
  42301. "movlo r2, r3\n\t"
  42302. "it ne\n\t"
  42303. "movne r3, r5\n\t"
  42304. "ldr r12, [%[a], #92]\n\t"
  42305. "ldr lr, [%[b], #92]\n\t"
  42306. "and r12, r12, r3\n\t"
  42307. "and lr, lr, r3\n\t"
  42308. "subs r12, r12, lr\n\t"
  42309. "it hi\n\t"
  42310. "movhi r2, r6\n\t"
  42311. "it lo\n\t"
  42312. "movlo r2, r3\n\t"
  42313. "it ne\n\t"
  42314. "movne r3, r5\n\t"
  42315. "ldr r12, [%[a], #88]\n\t"
  42316. "ldr lr, [%[b], #88]\n\t"
  42317. "and r12, r12, r3\n\t"
  42318. "and lr, lr, r3\n\t"
  42319. "subs r12, r12, lr\n\t"
  42320. "it hi\n\t"
  42321. "movhi r2, r6\n\t"
  42322. "it lo\n\t"
  42323. "movlo r2, r3\n\t"
  42324. "it ne\n\t"
  42325. "movne r3, r5\n\t"
  42326. "ldr r12, [%[a], #84]\n\t"
  42327. "ldr lr, [%[b], #84]\n\t"
  42328. "and r12, r12, r3\n\t"
  42329. "and lr, lr, r3\n\t"
  42330. "subs r12, r12, lr\n\t"
  42331. "it hi\n\t"
  42332. "movhi r2, r6\n\t"
  42333. "it lo\n\t"
  42334. "movlo r2, r3\n\t"
  42335. "it ne\n\t"
  42336. "movne r3, r5\n\t"
  42337. "ldr r12, [%[a], #80]\n\t"
  42338. "ldr lr, [%[b], #80]\n\t"
  42339. "and r12, r12, r3\n\t"
  42340. "and lr, lr, r3\n\t"
  42341. "subs r12, r12, lr\n\t"
  42342. "it hi\n\t"
  42343. "movhi r2, r6\n\t"
  42344. "it lo\n\t"
  42345. "movlo r2, r3\n\t"
  42346. "it ne\n\t"
  42347. "movne r3, r5\n\t"
  42348. "ldr r12, [%[a], #76]\n\t"
  42349. "ldr lr, [%[b], #76]\n\t"
  42350. "and r12, r12, r3\n\t"
  42351. "and lr, lr, r3\n\t"
  42352. "subs r12, r12, lr\n\t"
  42353. "it hi\n\t"
  42354. "movhi r2, r6\n\t"
  42355. "it lo\n\t"
  42356. "movlo r2, r3\n\t"
  42357. "it ne\n\t"
  42358. "movne r3, r5\n\t"
  42359. "ldr r12, [%[a], #72]\n\t"
  42360. "ldr lr, [%[b], #72]\n\t"
  42361. "and r12, r12, r3\n\t"
  42362. "and lr, lr, r3\n\t"
  42363. "subs r12, r12, lr\n\t"
  42364. "it hi\n\t"
  42365. "movhi r2, r6\n\t"
  42366. "it lo\n\t"
  42367. "movlo r2, r3\n\t"
  42368. "it ne\n\t"
  42369. "movne r3, r5\n\t"
  42370. "ldr r12, [%[a], #68]\n\t"
  42371. "ldr lr, [%[b], #68]\n\t"
  42372. "and r12, r12, r3\n\t"
  42373. "and lr, lr, r3\n\t"
  42374. "subs r12, r12, lr\n\t"
  42375. "it hi\n\t"
  42376. "movhi r2, r6\n\t"
  42377. "it lo\n\t"
  42378. "movlo r2, r3\n\t"
  42379. "it ne\n\t"
  42380. "movne r3, r5\n\t"
  42381. "ldr r12, [%[a], #64]\n\t"
  42382. "ldr lr, [%[b], #64]\n\t"
  42383. "and r12, r12, r3\n\t"
  42384. "and lr, lr, r3\n\t"
  42385. "subs r12, r12, lr\n\t"
  42386. "it hi\n\t"
  42387. "movhi r2, r6\n\t"
  42388. "it lo\n\t"
  42389. "movlo r2, r3\n\t"
  42390. "it ne\n\t"
  42391. "movne r3, r5\n\t"
  42392. "ldr r12, [%[a], #60]\n\t"
  42393. "ldr lr, [%[b], #60]\n\t"
  42394. "and r12, r12, r3\n\t"
  42395. "and lr, lr, r3\n\t"
  42396. "subs r12, r12, lr\n\t"
  42397. "it hi\n\t"
  42398. "movhi r2, r6\n\t"
  42399. "it lo\n\t"
  42400. "movlo r2, r3\n\t"
  42401. "it ne\n\t"
  42402. "movne r3, r5\n\t"
  42403. "ldr r12, [%[a], #56]\n\t"
  42404. "ldr lr, [%[b], #56]\n\t"
  42405. "and r12, r12, r3\n\t"
  42406. "and lr, lr, r3\n\t"
  42407. "subs r12, r12, lr\n\t"
  42408. "it hi\n\t"
  42409. "movhi r2, r6\n\t"
  42410. "it lo\n\t"
  42411. "movlo r2, r3\n\t"
  42412. "it ne\n\t"
  42413. "movne r3, r5\n\t"
  42414. "ldr r12, [%[a], #52]\n\t"
  42415. "ldr lr, [%[b], #52]\n\t"
  42416. "and r12, r12, r3\n\t"
  42417. "and lr, lr, r3\n\t"
  42418. "subs r12, r12, lr\n\t"
  42419. "it hi\n\t"
  42420. "movhi r2, r6\n\t"
  42421. "it lo\n\t"
  42422. "movlo r2, r3\n\t"
  42423. "it ne\n\t"
  42424. "movne r3, r5\n\t"
  42425. "ldr r12, [%[a], #48]\n\t"
  42426. "ldr lr, [%[b], #48]\n\t"
  42427. "and r12, r12, r3\n\t"
  42428. "and lr, lr, r3\n\t"
  42429. "subs r12, r12, lr\n\t"
  42430. "it hi\n\t"
  42431. "movhi r2, r6\n\t"
  42432. "it lo\n\t"
  42433. "movlo r2, r3\n\t"
  42434. "it ne\n\t"
  42435. "movne r3, r5\n\t"
  42436. "ldr r12, [%[a], #44]\n\t"
  42437. "ldr lr, [%[b], #44]\n\t"
  42438. "and r12, r12, r3\n\t"
  42439. "and lr, lr, r3\n\t"
  42440. "subs r12, r12, lr\n\t"
  42441. "it hi\n\t"
  42442. "movhi r2, r6\n\t"
  42443. "it lo\n\t"
  42444. "movlo r2, r3\n\t"
  42445. "it ne\n\t"
  42446. "movne r3, r5\n\t"
  42447. "ldr r12, [%[a], #40]\n\t"
  42448. "ldr lr, [%[b], #40]\n\t"
  42449. "and r12, r12, r3\n\t"
  42450. "and lr, lr, r3\n\t"
  42451. "subs r12, r12, lr\n\t"
  42452. "it hi\n\t"
  42453. "movhi r2, r6\n\t"
  42454. "it lo\n\t"
  42455. "movlo r2, r3\n\t"
  42456. "it ne\n\t"
  42457. "movne r3, r5\n\t"
  42458. "ldr r12, [%[a], #36]\n\t"
  42459. "ldr lr, [%[b], #36]\n\t"
  42460. "and r12, r12, r3\n\t"
  42461. "and lr, lr, r3\n\t"
  42462. "subs r12, r12, lr\n\t"
  42463. "it hi\n\t"
  42464. "movhi r2, r6\n\t"
  42465. "it lo\n\t"
  42466. "movlo r2, r3\n\t"
  42467. "it ne\n\t"
  42468. "movne r3, r5\n\t"
  42469. "ldr r12, [%[a], #32]\n\t"
  42470. "ldr lr, [%[b], #32]\n\t"
  42471. "and r12, r12, r3\n\t"
  42472. "and lr, lr, r3\n\t"
  42473. "subs r12, r12, lr\n\t"
  42474. "it hi\n\t"
  42475. "movhi r2, r6\n\t"
  42476. "it lo\n\t"
  42477. "movlo r2, r3\n\t"
  42478. "it ne\n\t"
  42479. "movne r3, r5\n\t"
  42480. "ldr r12, [%[a], #28]\n\t"
  42481. "ldr lr, [%[b], #28]\n\t"
  42482. "and r12, r12, r3\n\t"
  42483. "and lr, lr, r3\n\t"
  42484. "subs r12, r12, lr\n\t"
  42485. "it hi\n\t"
  42486. "movhi r2, r6\n\t"
  42487. "it lo\n\t"
  42488. "movlo r2, r3\n\t"
  42489. "it ne\n\t"
  42490. "movne r3, r5\n\t"
  42491. "ldr r12, [%[a], #24]\n\t"
  42492. "ldr lr, [%[b], #24]\n\t"
  42493. "and r12, r12, r3\n\t"
  42494. "and lr, lr, r3\n\t"
  42495. "subs r12, r12, lr\n\t"
  42496. "it hi\n\t"
  42497. "movhi r2, r6\n\t"
  42498. "it lo\n\t"
  42499. "movlo r2, r3\n\t"
  42500. "it ne\n\t"
  42501. "movne r3, r5\n\t"
  42502. "ldr r12, [%[a], #20]\n\t"
  42503. "ldr lr, [%[b], #20]\n\t"
  42504. "and r12, r12, r3\n\t"
  42505. "and lr, lr, r3\n\t"
  42506. "subs r12, r12, lr\n\t"
  42507. "it hi\n\t"
  42508. "movhi r2, r6\n\t"
  42509. "it lo\n\t"
  42510. "movlo r2, r3\n\t"
  42511. "it ne\n\t"
  42512. "movne r3, r5\n\t"
  42513. "ldr r12, [%[a], #16]\n\t"
  42514. "ldr lr, [%[b], #16]\n\t"
  42515. "and r12, r12, r3\n\t"
  42516. "and lr, lr, r3\n\t"
  42517. "subs r12, r12, lr\n\t"
  42518. "it hi\n\t"
  42519. "movhi r2, r6\n\t"
  42520. "it lo\n\t"
  42521. "movlo r2, r3\n\t"
  42522. "it ne\n\t"
  42523. "movne r3, r5\n\t"
  42524. "ldr r12, [%[a], #12]\n\t"
  42525. "ldr lr, [%[b], #12]\n\t"
  42526. "and r12, r12, r3\n\t"
  42527. "and lr, lr, r3\n\t"
  42528. "subs r12, r12, lr\n\t"
  42529. "it hi\n\t"
  42530. "movhi r2, r6\n\t"
  42531. "it lo\n\t"
  42532. "movlo r2, r3\n\t"
  42533. "it ne\n\t"
  42534. "movne r3, r5\n\t"
  42535. "ldr r12, [%[a], #8]\n\t"
  42536. "ldr lr, [%[b], #8]\n\t"
  42537. "and r12, r12, r3\n\t"
  42538. "and lr, lr, r3\n\t"
  42539. "subs r12, r12, lr\n\t"
  42540. "it hi\n\t"
  42541. "movhi r2, r6\n\t"
  42542. "it lo\n\t"
  42543. "movlo r2, r3\n\t"
  42544. "it ne\n\t"
  42545. "movne r3, r5\n\t"
  42546. "ldr r12, [%[a], #4]\n\t"
  42547. "ldr lr, [%[b], #4]\n\t"
  42548. "and r12, r12, r3\n\t"
  42549. "and lr, lr, r3\n\t"
  42550. "subs r12, r12, lr\n\t"
  42551. "it hi\n\t"
  42552. "movhi r2, r6\n\t"
  42553. "it lo\n\t"
  42554. "movlo r2, r3\n\t"
  42555. "it ne\n\t"
  42556. "movne r3, r5\n\t"
  42557. "ldr r12, [%[a]]\n\t"
  42558. "ldr lr, [%[b]]\n\t"
  42559. "and r12, r12, r3\n\t"
  42560. "and lr, lr, r3\n\t"
  42561. "subs r12, r12, lr\n\t"
  42562. "it hi\n\t"
  42563. "movhi r2, r6\n\t"
  42564. "it lo\n\t"
  42565. "movlo r2, r3\n\t"
  42566. "it ne\n\t"
  42567. "movne r3, r5\n\t"
  42568. "eor r2, r2, r3\n\t"
  42569. #endif /*WOLFSSL_SP_SMALL */
  42570. "mov %[a], r2\n\t"
  42571. : [a] "+r" (a), [b] "+r" (b)
  42572. :
  42573. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6"
  42574. );
  42575. return (uint32_t)(size_t)a;
  42576. }
  42577. /* Divide d in a and put remainder into r (m*d + r = a)
  42578. * m is not calculated as it is not needed at this time.
  42579. *
  42580. * a Number to be divided.
  42581. * d Number to divide with.
  42582. * m Multiplier result.
  42583. * r Remainder from the division.
  42584. * returns MP_OKAY indicating success.
  42585. */
  42586. static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d, sp_digit* m,
  42587. sp_digit* r)
  42588. {
  42589. sp_digit t1[192], t2[97];
  42590. sp_digit div, r1;
  42591. int i;
  42592. (void)m;
  42593. div = d[95];
  42594. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  42595. r1 = sp_3072_cmp_96(&t1[96], d) >= 0;
  42596. sp_3072_cond_sub_96(&t1[96], &t1[96], d, (sp_digit)0 - r1);
  42597. for (i = 95; i >= 0; i--) {
  42598. volatile sp_digit mask = (sp_digit)0 - (t1[96 + i] == div);
  42599. sp_digit hi = t1[96 + i] + mask;
  42600. r1 = div_3072_word_96(hi, t1[96 + i - 1], div);
  42601. r1 |= mask;
  42602. sp_3072_mul_d_96(t2, d, r1);
  42603. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  42604. t1[96 + i] -= t2[96];
  42605. sp_3072_mask_96(t2, d, t1[96 + i]);
  42606. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  42607. sp_3072_mask_96(t2, d, t1[96 + i]);
  42608. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  42609. }
  42610. r1 = sp_3072_cmp_96(t1, d) >= 0;
  42611. sp_3072_cond_sub_96(r, t1, d, (sp_digit)0 - r1);
  42612. return MP_OKAY;
  42613. }
  42614. /* Reduce a modulo m into r. (r = a mod m)
  42615. *
  42616. * r A single precision number that is the reduced result.
  42617. * a A single precision number that is to be reduced.
  42618. * m A single precision number that is the modulus to reduce with.
  42619. * returns MP_OKAY indicating success.
  42620. */
  42621. static WC_INLINE int sp_3072_mod_96(sp_digit* r, const sp_digit* a, const sp_digit* m)
  42622. {
  42623. return sp_3072_div_96(a, m, NULL, r);
  42624. }
  42625. #endif /* WOLFSSL_HAVE_SP_DH || !WOLFSSL_RSA_PUBLIC_ONLY */
  42626. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  42627. defined(WOLFSSL_HAVE_SP_DH)
  42628. #ifdef WOLFSSL_SP_SMALL
  42629. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  42630. *
  42631. * r A single precision number that is the result of the operation.
  42632. * a A single precision number being exponentiated.
  42633. * e A single precision number that is the exponent.
  42634. * bits The number of bits in the exponent.
  42635. * m A single precision number that is the modulus.
  42636. * returns 0 on success.
  42637. * returns MEMORY_E on dynamic memory allocation failure.
  42638. * returns MP_VAL when base is even or exponent is 0.
  42639. */
  42640. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  42641. int bits, const sp_digit* m, int reduceA)
  42642. {
  42643. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  42644. sp_digit* td = NULL;
  42645. #else
  42646. sp_digit td[8 * 192];
  42647. #endif
  42648. sp_digit* t[8];
  42649. sp_digit* norm = NULL;
  42650. sp_digit mp = 1;
  42651. sp_digit n;
  42652. sp_digit mask;
  42653. int i;
  42654. int c;
  42655. byte y;
  42656. int err = MP_OKAY;
  42657. if (bits == 0) {
  42658. err = MP_VAL;
  42659. }
  42660. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  42661. if (err == MP_OKAY) {
  42662. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 192), NULL,
  42663. DYNAMIC_TYPE_TMP_BUFFER);
  42664. if (td == NULL)
  42665. err = MEMORY_E;
  42666. }
  42667. #endif
  42668. if (err == MP_OKAY) {
  42669. norm = td;
  42670. for (i=0; i<8; i++) {
  42671. t[i] = td + i * 192;
  42672. }
  42673. sp_3072_mont_setup(m, &mp);
  42674. sp_3072_mont_norm_96(norm, m);
  42675. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  42676. if (reduceA != 0) {
  42677. err = sp_3072_mod_96(t[1] + 96, a, m);
  42678. if (err == MP_OKAY) {
  42679. err = sp_3072_mod_96(t[1], t[1], m);
  42680. }
  42681. }
  42682. else {
  42683. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  42684. err = sp_3072_mod_96(t[1], t[1], m);
  42685. }
  42686. }
  42687. if (err == MP_OKAY) {
  42688. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  42689. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  42690. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  42691. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  42692. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  42693. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  42694. i = (bits - 1) / 32;
  42695. n = e[i--];
  42696. c = bits & 31;
  42697. if (c == 0) {
  42698. c = 32;
  42699. }
  42700. c -= bits % 3;
  42701. if (c == 32) {
  42702. c = 29;
  42703. }
  42704. if (c < 0) {
  42705. /* Number of bits in top word is less than number needed. */
  42706. c = -c;
  42707. y = (byte)(n << c);
  42708. n = e[i--];
  42709. y |= (byte)(n >> (64 - c));
  42710. n <<= c;
  42711. c = 64 - c;
  42712. }
  42713. else if (c == 0) {
  42714. /* All bits in top word used. */
  42715. y = (byte)n;
  42716. }
  42717. else {
  42718. y = (byte)(n >> c);
  42719. n <<= 32 - c;
  42720. }
  42721. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  42722. for (; i>=0 || c>=3; ) {
  42723. if (c == 0) {
  42724. n = e[i--];
  42725. y = (byte)(n >> 29);
  42726. n <<= 3;
  42727. c = 29;
  42728. }
  42729. else if (c < 3) {
  42730. y = (byte)(n >> 29);
  42731. n = e[i--];
  42732. c = 3 - c;
  42733. y |= (byte)(n >> (32 - c));
  42734. n <<= c;
  42735. c = 32 - c;
  42736. }
  42737. else {
  42738. y = (byte)((n >> 29) & 0x7);
  42739. n <<= 3;
  42740. c -= 3;
  42741. }
  42742. sp_3072_mont_sqr_96(r, r, m, mp);
  42743. sp_3072_mont_sqr_96(r, r, m, mp);
  42744. sp_3072_mont_sqr_96(r, r, m, mp);
  42745. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  42746. }
  42747. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  42748. sp_3072_mont_reduce_96(r, m, mp);
  42749. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  42750. sp_3072_cond_sub_96(r, r, m, mask);
  42751. }
  42752. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  42753. if (td != NULL)
  42754. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  42755. #endif
  42756. return err;
  42757. }
  42758. #else
  42759. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  42760. *
  42761. * r A single precision number that is the result of the operation.
  42762. * a A single precision number being exponentiated.
  42763. * e A single precision number that is the exponent.
  42764. * bits The number of bits in the exponent.
  42765. * m A single precision number that is the modulus.
  42766. * returns 0 on success.
  42767. * returns MEMORY_E on dynamic memory allocation failure.
  42768. * returns MP_VAL when base is even or exponent is 0.
  42769. */
  42770. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  42771. int bits, const sp_digit* m, int reduceA)
  42772. {
  42773. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  42774. sp_digit* td = NULL;
  42775. #else
  42776. sp_digit td[16 * 192];
  42777. #endif
  42778. sp_digit* t[16];
  42779. sp_digit* norm = NULL;
  42780. sp_digit mp = 1;
  42781. sp_digit n;
  42782. sp_digit mask;
  42783. int i;
  42784. int c;
  42785. byte y;
  42786. int err = MP_OKAY;
  42787. if (bits == 0) {
  42788. err = MP_VAL;
  42789. }
  42790. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  42791. if (err == MP_OKAY) {
  42792. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 192), NULL,
  42793. DYNAMIC_TYPE_TMP_BUFFER);
  42794. if (td == NULL)
  42795. err = MEMORY_E;
  42796. }
  42797. #endif
  42798. if (err == MP_OKAY) {
  42799. norm = td;
  42800. for (i=0; i<16; i++) {
  42801. t[i] = td + i * 192;
  42802. }
  42803. sp_3072_mont_setup(m, &mp);
  42804. sp_3072_mont_norm_96(norm, m);
  42805. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  42806. if (reduceA != 0) {
  42807. err = sp_3072_mod_96(t[1] + 96, a, m);
  42808. if (err == MP_OKAY) {
  42809. err = sp_3072_mod_96(t[1], t[1], m);
  42810. }
  42811. }
  42812. else {
  42813. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  42814. err = sp_3072_mod_96(t[1], t[1], m);
  42815. }
  42816. }
  42817. if (err == MP_OKAY) {
  42818. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  42819. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  42820. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  42821. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  42822. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  42823. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  42824. sp_3072_mont_sqr_96(t[ 8], t[ 4], m, mp);
  42825. sp_3072_mont_mul_96(t[ 9], t[ 5], t[ 4], m, mp);
  42826. sp_3072_mont_sqr_96(t[10], t[ 5], m, mp);
  42827. sp_3072_mont_mul_96(t[11], t[ 6], t[ 5], m, mp);
  42828. sp_3072_mont_sqr_96(t[12], t[ 6], m, mp);
  42829. sp_3072_mont_mul_96(t[13], t[ 7], t[ 6], m, mp);
  42830. sp_3072_mont_sqr_96(t[14], t[ 7], m, mp);
  42831. sp_3072_mont_mul_96(t[15], t[ 8], t[ 7], m, mp);
  42832. i = (bits - 1) / 32;
  42833. n = e[i--];
  42834. c = bits & 31;
  42835. if (c == 0) {
  42836. c = 32;
  42837. }
  42838. c -= bits % 4;
  42839. if (c == 32) {
  42840. c = 28;
  42841. }
  42842. if (c < 0) {
  42843. /* Number of bits in top word is less than number needed. */
  42844. c = -c;
  42845. y = (byte)(n << c);
  42846. n = e[i--];
  42847. y |= (byte)(n >> (64 - c));
  42848. n <<= c;
  42849. c = 64 - c;
  42850. }
  42851. else if (c == 0) {
  42852. /* All bits in top word used. */
  42853. y = (byte)n;
  42854. }
  42855. else {
  42856. y = (byte)(n >> c);
  42857. n <<= 32 - c;
  42858. }
  42859. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  42860. for (; i>=0 || c>=4; ) {
  42861. if (c == 0) {
  42862. n = e[i--];
  42863. y = (byte)(n >> 28);
  42864. n <<= 4;
  42865. c = 28;
  42866. }
  42867. else if (c < 4) {
  42868. y = (byte)(n >> 28);
  42869. n = e[i--];
  42870. c = 4 - c;
  42871. y |= (byte)(n >> (32 - c));
  42872. n <<= c;
  42873. c = 32 - c;
  42874. }
  42875. else {
  42876. y = (byte)((n >> 28) & 0xf);
  42877. n <<= 4;
  42878. c -= 4;
  42879. }
  42880. sp_3072_mont_sqr_96(r, r, m, mp);
  42881. sp_3072_mont_sqr_96(r, r, m, mp);
  42882. sp_3072_mont_sqr_96(r, r, m, mp);
  42883. sp_3072_mont_sqr_96(r, r, m, mp);
  42884. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  42885. }
  42886. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  42887. sp_3072_mont_reduce_96(r, m, mp);
  42888. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  42889. sp_3072_cond_sub_96(r, r, m, mask);
  42890. }
  42891. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  42892. if (td != NULL)
  42893. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  42894. #endif
  42895. return err;
  42896. }
  42897. #endif /* WOLFSSL_SP_SMALL */
  42898. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  42899. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  42900. #ifdef WOLFSSL_HAVE_SP_RSA
  42901. /* RSA public key operation.
  42902. *
  42903. * in Array of bytes representing the number to exponentiate, base.
  42904. * inLen Number of bytes in base.
  42905. * em Public exponent.
  42906. * mm Modulus.
  42907. * out Buffer to hold big-endian bytes of exponentiation result.
  42908. * Must be at least 384 bytes long.
  42909. * outLen Number of bytes in result.
  42910. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  42911. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  42912. */
  42913. int sp_RsaPublic_3072(const byte* in, word32 inLen, const mp_int* em,
  42914. const mp_int* mm, byte* out, word32* outLen)
  42915. {
  42916. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  42917. sp_digit* a = NULL;
  42918. #else
  42919. sp_digit a[96 * 5];
  42920. #endif
  42921. sp_digit* m = NULL;
  42922. sp_digit* r = NULL;
  42923. sp_digit *ah = NULL;
  42924. sp_digit e[1] = {0};
  42925. int err = MP_OKAY;
  42926. if (*outLen < 384) {
  42927. err = MP_TO_E;
  42928. }
  42929. else if (mp_count_bits(em) > 32 || inLen > 384 ||
  42930. mp_count_bits(mm) != 3072) {
  42931. err = MP_READ_E;
  42932. }
  42933. else if (mp_iseven(mm)) {
  42934. err = MP_VAL;
  42935. }
  42936. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  42937. if (err == MP_OKAY) {
  42938. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 5, NULL,
  42939. DYNAMIC_TYPE_RSA);
  42940. if (a == NULL)
  42941. err = MEMORY_E;
  42942. }
  42943. #endif
  42944. if (err == MP_OKAY) {
  42945. ah = a + 96;
  42946. r = a + 96 * 2;
  42947. m = r + 96 * 2;
  42948. sp_3072_from_bin(ah, 96, in, inLen);
  42949. #if DIGIT_BIT >= 32
  42950. e[0] = em->dp[0];
  42951. #else
  42952. e[0] = em->dp[0];
  42953. if (em->used > 1) {
  42954. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  42955. }
  42956. #endif
  42957. if (e[0] == 0) {
  42958. err = MP_EXPTMOD_E;
  42959. }
  42960. }
  42961. if (err == MP_OKAY) {
  42962. sp_3072_from_mp(m, 96, mm);
  42963. if (e[0] == 0x10001) {
  42964. int i;
  42965. sp_digit mp;
  42966. sp_3072_mont_setup(m, &mp);
  42967. /* Convert to Montgomery form. */
  42968. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  42969. err = sp_3072_mod_96_cond(r, a, m);
  42970. /* Montgomery form: r = a.R mod m */
  42971. if (err == MP_OKAY) {
  42972. /* r = a ^ 0x10000 => r = a squared 16 times */
  42973. for (i = 15; i >= 0; i--) {
  42974. sp_3072_mont_sqr_96(r, r, m, mp);
  42975. }
  42976. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  42977. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  42978. */
  42979. sp_3072_mont_mul_96(r, r, ah, m, mp);
  42980. for (i = 95; i > 0; i--) {
  42981. if (r[i] != m[i]) {
  42982. break;
  42983. }
  42984. }
  42985. if (r[i] >= m[i]) {
  42986. sp_3072_sub_in_place_96(r, m);
  42987. }
  42988. }
  42989. }
  42990. else if (e[0] == 0x3) {
  42991. if (err == MP_OKAY) {
  42992. sp_3072_sqr_96(r, ah);
  42993. err = sp_3072_mod_96_cond(r, r, m);
  42994. }
  42995. if (err == MP_OKAY) {
  42996. sp_3072_mul_96(r, ah, r);
  42997. err = sp_3072_mod_96_cond(r, r, m);
  42998. }
  42999. }
  43000. else {
  43001. int i;
  43002. sp_digit mp;
  43003. sp_3072_mont_setup(m, &mp);
  43004. /* Convert to Montgomery form. */
  43005. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  43006. err = sp_3072_mod_96_cond(a, a, m);
  43007. if (err == MP_OKAY) {
  43008. for (i = 31; i >= 0; i--) {
  43009. if (e[0] >> i) {
  43010. break;
  43011. }
  43012. }
  43013. XMEMCPY(r, a, sizeof(sp_digit) * 96);
  43014. for (i--; i >= 0; i--) {
  43015. sp_3072_mont_sqr_96(r, r, m, mp);
  43016. if (((e[0] >> i) & 1) == 1) {
  43017. sp_3072_mont_mul_96(r, r, a, m, mp);
  43018. }
  43019. }
  43020. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96);
  43021. sp_3072_mont_reduce_96(r, m, mp);
  43022. for (i = 95; i > 0; i--) {
  43023. if (r[i] != m[i]) {
  43024. break;
  43025. }
  43026. }
  43027. if (r[i] >= m[i]) {
  43028. sp_3072_sub_in_place_96(r, m);
  43029. }
  43030. }
  43031. }
  43032. }
  43033. if (err == MP_OKAY) {
  43034. sp_3072_to_bin_96(r, out);
  43035. *outLen = 384;
  43036. }
  43037. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  43038. if (a != NULL)
  43039. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  43040. #endif
  43041. return err;
  43042. }
  43043. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  43044. #ifdef WOLFSSL_SP_SMALL
  43045. /* Conditionally add a and b using the mask m.
  43046. * m is -1 to add and 0 when not.
  43047. *
  43048. * r A single precision number representing conditional add result.
  43049. * a A single precision number to add with.
  43050. * b A single precision number to add.
  43051. * m Mask value to apply.
  43052. */
  43053. static sp_digit sp_3072_cond_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  43054. {
  43055. register sp_digit* r asm ("r0") = r_p;
  43056. register const sp_digit* a asm ("r1") = a_p;
  43057. register const sp_digit* b asm ("r2") = b_p;
  43058. register sp_digit m asm ("r3") = m_p;
  43059. __asm__ __volatile__ (
  43060. "mov lr, #0\n\t"
  43061. "mov r6, #0\n\t"
  43062. "mov r12, #0\n\t"
  43063. "\n"
  43064. "L_sp_3072_cond_add_48_words_%=: \n\t"
  43065. "adds lr, lr, #-1\n\t"
  43066. "ldr r4, [%[a], r12]\n\t"
  43067. "ldr r5, [%[b], r12]\n\t"
  43068. "and r5, r5, %[m]\n\t"
  43069. "adcs r4, r4, r5\n\t"
  43070. "adc lr, r6, r6\n\t"
  43071. "str r4, [%[r], r12]\n\t"
  43072. "add r12, r12, #4\n\t"
  43073. "cmp r12, #0xc0\n\t"
  43074. "blt L_sp_3072_cond_add_48_words_%=\n\t"
  43075. "mov %[r], lr\n\t"
  43076. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  43077. :
  43078. : "memory", "r12", "lr", "r4", "r5", "r6"
  43079. );
  43080. return (uint32_t)(size_t)r;
  43081. }
  43082. #else
  43083. /* Conditionally add a and b using the mask m.
  43084. * m is -1 to add and 0 when not.
  43085. *
  43086. * r A single precision number representing conditional add result.
  43087. * a A single precision number to add with.
  43088. * b A single precision number to add.
  43089. * m Mask value to apply.
  43090. */
  43091. static sp_digit sp_3072_cond_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  43092. {
  43093. register sp_digit* r asm ("r0") = r_p;
  43094. register const sp_digit* a asm ("r1") = a_p;
  43095. register const sp_digit* b asm ("r2") = b_p;
  43096. register sp_digit m asm ("r3") = m_p;
  43097. __asm__ __volatile__ (
  43098. "mov r8, #0\n\t"
  43099. "ldm %[a]!, {r4, r5}\n\t"
  43100. "ldm %[b]!, {r6, r7}\n\t"
  43101. "and r6, r6, %[m]\n\t"
  43102. "and r7, r7, %[m]\n\t"
  43103. "adds r4, r4, r6\n\t"
  43104. "adcs r5, r5, r7\n\t"
  43105. "stm %[r]!, {r4, r5}\n\t"
  43106. "ldm %[a]!, {r4, r5}\n\t"
  43107. "ldm %[b]!, {r6, r7}\n\t"
  43108. "and r6, r6, %[m]\n\t"
  43109. "and r7, r7, %[m]\n\t"
  43110. "adcs r4, r4, r6\n\t"
  43111. "adcs r5, r5, r7\n\t"
  43112. "stm %[r]!, {r4, r5}\n\t"
  43113. "ldm %[a]!, {r4, r5}\n\t"
  43114. "ldm %[b]!, {r6, r7}\n\t"
  43115. "and r6, r6, %[m]\n\t"
  43116. "and r7, r7, %[m]\n\t"
  43117. "adcs r4, r4, r6\n\t"
  43118. "adcs r5, r5, r7\n\t"
  43119. "stm %[r]!, {r4, r5}\n\t"
  43120. "ldm %[a]!, {r4, r5}\n\t"
  43121. "ldm %[b]!, {r6, r7}\n\t"
  43122. "and r6, r6, %[m]\n\t"
  43123. "and r7, r7, %[m]\n\t"
  43124. "adcs r4, r4, r6\n\t"
  43125. "adcs r5, r5, r7\n\t"
  43126. "stm %[r]!, {r4, r5}\n\t"
  43127. "ldm %[a]!, {r4, r5}\n\t"
  43128. "ldm %[b]!, {r6, r7}\n\t"
  43129. "and r6, r6, %[m]\n\t"
  43130. "and r7, r7, %[m]\n\t"
  43131. "adcs r4, r4, r6\n\t"
  43132. "adcs r5, r5, r7\n\t"
  43133. "stm %[r]!, {r4, r5}\n\t"
  43134. "ldm %[a]!, {r4, r5}\n\t"
  43135. "ldm %[b]!, {r6, r7}\n\t"
  43136. "and r6, r6, %[m]\n\t"
  43137. "and r7, r7, %[m]\n\t"
  43138. "adcs r4, r4, r6\n\t"
  43139. "adcs r5, r5, r7\n\t"
  43140. "stm %[r]!, {r4, r5}\n\t"
  43141. "ldm %[a]!, {r4, r5}\n\t"
  43142. "ldm %[b]!, {r6, r7}\n\t"
  43143. "and r6, r6, %[m]\n\t"
  43144. "and r7, r7, %[m]\n\t"
  43145. "adcs r4, r4, r6\n\t"
  43146. "adcs r5, r5, r7\n\t"
  43147. "stm %[r]!, {r4, r5}\n\t"
  43148. "ldm %[a]!, {r4, r5}\n\t"
  43149. "ldm %[b]!, {r6, r7}\n\t"
  43150. "and r6, r6, %[m]\n\t"
  43151. "and r7, r7, %[m]\n\t"
  43152. "adcs r4, r4, r6\n\t"
  43153. "adcs r5, r5, r7\n\t"
  43154. "stm %[r]!, {r4, r5}\n\t"
  43155. "ldm %[a]!, {r4, r5}\n\t"
  43156. "ldm %[b]!, {r6, r7}\n\t"
  43157. "and r6, r6, %[m]\n\t"
  43158. "and r7, r7, %[m]\n\t"
  43159. "adcs r4, r4, r6\n\t"
  43160. "adcs r5, r5, r7\n\t"
  43161. "stm %[r]!, {r4, r5}\n\t"
  43162. "ldm %[a]!, {r4, r5}\n\t"
  43163. "ldm %[b]!, {r6, r7}\n\t"
  43164. "and r6, r6, %[m]\n\t"
  43165. "and r7, r7, %[m]\n\t"
  43166. "adcs r4, r4, r6\n\t"
  43167. "adcs r5, r5, r7\n\t"
  43168. "stm %[r]!, {r4, r5}\n\t"
  43169. "ldm %[a]!, {r4, r5}\n\t"
  43170. "ldm %[b]!, {r6, r7}\n\t"
  43171. "and r6, r6, %[m]\n\t"
  43172. "and r7, r7, %[m]\n\t"
  43173. "adcs r4, r4, r6\n\t"
  43174. "adcs r5, r5, r7\n\t"
  43175. "stm %[r]!, {r4, r5}\n\t"
  43176. "ldm %[a]!, {r4, r5}\n\t"
  43177. "ldm %[b]!, {r6, r7}\n\t"
  43178. "and r6, r6, %[m]\n\t"
  43179. "and r7, r7, %[m]\n\t"
  43180. "adcs r4, r4, r6\n\t"
  43181. "adcs r5, r5, r7\n\t"
  43182. "stm %[r]!, {r4, r5}\n\t"
  43183. "ldm %[a]!, {r4, r5}\n\t"
  43184. "ldm %[b]!, {r6, r7}\n\t"
  43185. "and r6, r6, %[m]\n\t"
  43186. "and r7, r7, %[m]\n\t"
  43187. "adcs r4, r4, r6\n\t"
  43188. "adcs r5, r5, r7\n\t"
  43189. "stm %[r]!, {r4, r5}\n\t"
  43190. "ldm %[a]!, {r4, r5}\n\t"
  43191. "ldm %[b]!, {r6, r7}\n\t"
  43192. "and r6, r6, %[m]\n\t"
  43193. "and r7, r7, %[m]\n\t"
  43194. "adcs r4, r4, r6\n\t"
  43195. "adcs r5, r5, r7\n\t"
  43196. "stm %[r]!, {r4, r5}\n\t"
  43197. "ldm %[a]!, {r4, r5}\n\t"
  43198. "ldm %[b]!, {r6, r7}\n\t"
  43199. "and r6, r6, %[m]\n\t"
  43200. "and r7, r7, %[m]\n\t"
  43201. "adcs r4, r4, r6\n\t"
  43202. "adcs r5, r5, r7\n\t"
  43203. "stm %[r]!, {r4, r5}\n\t"
  43204. "ldm %[a]!, {r4, r5}\n\t"
  43205. "ldm %[b]!, {r6, r7}\n\t"
  43206. "and r6, r6, %[m]\n\t"
  43207. "and r7, r7, %[m]\n\t"
  43208. "adcs r4, r4, r6\n\t"
  43209. "adcs r5, r5, r7\n\t"
  43210. "stm %[r]!, {r4, r5}\n\t"
  43211. "ldm %[a]!, {r4, r5}\n\t"
  43212. "ldm %[b]!, {r6, r7}\n\t"
  43213. "and r6, r6, %[m]\n\t"
  43214. "and r7, r7, %[m]\n\t"
  43215. "adcs r4, r4, r6\n\t"
  43216. "adcs r5, r5, r7\n\t"
  43217. "stm %[r]!, {r4, r5}\n\t"
  43218. "ldm %[a]!, {r4, r5}\n\t"
  43219. "ldm %[b]!, {r6, r7}\n\t"
  43220. "and r6, r6, %[m]\n\t"
  43221. "and r7, r7, %[m]\n\t"
  43222. "adcs r4, r4, r6\n\t"
  43223. "adcs r5, r5, r7\n\t"
  43224. "stm %[r]!, {r4, r5}\n\t"
  43225. "ldm %[a]!, {r4, r5}\n\t"
  43226. "ldm %[b]!, {r6, r7}\n\t"
  43227. "and r6, r6, %[m]\n\t"
  43228. "and r7, r7, %[m]\n\t"
  43229. "adcs r4, r4, r6\n\t"
  43230. "adcs r5, r5, r7\n\t"
  43231. "stm %[r]!, {r4, r5}\n\t"
  43232. "ldm %[a]!, {r4, r5}\n\t"
  43233. "ldm %[b]!, {r6, r7}\n\t"
  43234. "and r6, r6, %[m]\n\t"
  43235. "and r7, r7, %[m]\n\t"
  43236. "adcs r4, r4, r6\n\t"
  43237. "adcs r5, r5, r7\n\t"
  43238. "stm %[r]!, {r4, r5}\n\t"
  43239. "ldm %[a]!, {r4, r5}\n\t"
  43240. "ldm %[b]!, {r6, r7}\n\t"
  43241. "and r6, r6, %[m]\n\t"
  43242. "and r7, r7, %[m]\n\t"
  43243. "adcs r4, r4, r6\n\t"
  43244. "adcs r5, r5, r7\n\t"
  43245. "stm %[r]!, {r4, r5}\n\t"
  43246. "ldm %[a]!, {r4, r5}\n\t"
  43247. "ldm %[b]!, {r6, r7}\n\t"
  43248. "and r6, r6, %[m]\n\t"
  43249. "and r7, r7, %[m]\n\t"
  43250. "adcs r4, r4, r6\n\t"
  43251. "adcs r5, r5, r7\n\t"
  43252. "stm %[r]!, {r4, r5}\n\t"
  43253. "ldm %[a]!, {r4, r5}\n\t"
  43254. "ldm %[b]!, {r6, r7}\n\t"
  43255. "and r6, r6, %[m]\n\t"
  43256. "and r7, r7, %[m]\n\t"
  43257. "adcs r4, r4, r6\n\t"
  43258. "adcs r5, r5, r7\n\t"
  43259. "stm %[r]!, {r4, r5}\n\t"
  43260. "ldm %[a]!, {r4, r5}\n\t"
  43261. "ldm %[b]!, {r6, r7}\n\t"
  43262. "and r6, r6, %[m]\n\t"
  43263. "and r7, r7, %[m]\n\t"
  43264. "adcs r4, r4, r6\n\t"
  43265. "adcs r5, r5, r7\n\t"
  43266. "stm %[r]!, {r4, r5}\n\t"
  43267. "adc %[r], r8, r8\n\t"
  43268. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  43269. :
  43270. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  43271. );
  43272. return (uint32_t)(size_t)r;
  43273. }
  43274. #endif /* WOLFSSL_SP_SMALL */
  43275. /* RSA private key operation.
  43276. *
  43277. * in Array of bytes representing the number to exponentiate, base.
  43278. * inLen Number of bytes in base.
  43279. * dm Private exponent.
  43280. * pm First prime.
  43281. * qm Second prime.
  43282. * dpm First prime's CRT exponent.
  43283. * dqm Second prime's CRT exponent.
  43284. * qim Inverse of second prime mod p.
  43285. * mm Modulus.
  43286. * out Buffer to hold big-endian bytes of exponentiation result.
  43287. * Must be at least 384 bytes long.
  43288. * outLen Number of bytes in result.
  43289. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  43290. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  43291. */
  43292. int sp_RsaPrivate_3072(const byte* in, word32 inLen, const mp_int* dm,
  43293. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  43294. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  43295. {
  43296. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  43297. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  43298. sp_digit* d = NULL;
  43299. #else
  43300. sp_digit d[96 * 4];
  43301. #endif
  43302. sp_digit* a = NULL;
  43303. sp_digit* m = NULL;
  43304. sp_digit* r = NULL;
  43305. int err = MP_OKAY;
  43306. (void)pm;
  43307. (void)qm;
  43308. (void)dpm;
  43309. (void)dqm;
  43310. (void)qim;
  43311. if (*outLen < 384U) {
  43312. err = MP_TO_E;
  43313. }
  43314. if (err == MP_OKAY) {
  43315. if (mp_count_bits(dm) > 3072) {
  43316. err = MP_READ_E;
  43317. }
  43318. else if (inLen > 384) {
  43319. err = MP_READ_E;
  43320. }
  43321. else if (mp_count_bits(mm) != 3072) {
  43322. err = MP_READ_E;
  43323. }
  43324. else if (mp_iseven(mm)) {
  43325. err = MP_VAL;
  43326. }
  43327. }
  43328. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  43329. if (err == MP_OKAY) {
  43330. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL,
  43331. DYNAMIC_TYPE_RSA);
  43332. if (d == NULL)
  43333. err = MEMORY_E;
  43334. }
  43335. #endif
  43336. if (err == MP_OKAY) {
  43337. a = d + 96;
  43338. m = a + 192;
  43339. r = a;
  43340. sp_3072_from_bin(a, 96, in, inLen);
  43341. sp_3072_from_mp(d, 96, dm);
  43342. sp_3072_from_mp(m, 96, mm);
  43343. err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0);
  43344. }
  43345. if (err == MP_OKAY) {
  43346. sp_3072_to_bin_96(r, out);
  43347. *outLen = 384;
  43348. }
  43349. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  43350. if (d != NULL)
  43351. #endif
  43352. {
  43353. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  43354. if (a != NULL)
  43355. ForceZero(a, sizeof(sp_digit) * 96);
  43356. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  43357. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  43358. #endif
  43359. }
  43360. return err;
  43361. #else
  43362. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  43363. sp_digit* a = NULL;
  43364. #else
  43365. sp_digit a[48 * 11];
  43366. #endif
  43367. sp_digit* p = NULL;
  43368. sp_digit* q = NULL;
  43369. sp_digit* dp = NULL;
  43370. sp_digit* tmpa = NULL;
  43371. sp_digit* tmpb = NULL;
  43372. sp_digit* r = NULL;
  43373. sp_digit* qi = NULL;
  43374. sp_digit* dq = NULL;
  43375. sp_digit c;
  43376. int err = MP_OKAY;
  43377. (void)dm;
  43378. (void)mm;
  43379. if (*outLen < 384) {
  43380. err = MP_TO_E;
  43381. }
  43382. else if (inLen > 384 || mp_count_bits(mm) != 3072) {
  43383. err = MP_READ_E;
  43384. }
  43385. else if (mp_iseven(mm)) {
  43386. err = MP_VAL;
  43387. }
  43388. else if (mp_iseven(pm)) {
  43389. err = MP_VAL;
  43390. }
  43391. else if (mp_iseven(qm)) {
  43392. err = MP_VAL;
  43393. }
  43394. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  43395. if (err == MP_OKAY) {
  43396. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 11, NULL,
  43397. DYNAMIC_TYPE_RSA);
  43398. if (a == NULL)
  43399. err = MEMORY_E;
  43400. }
  43401. #endif
  43402. if (err == MP_OKAY) {
  43403. p = a + 96 * 2;
  43404. q = p + 48;
  43405. qi = dq = dp = q + 48;
  43406. tmpa = qi + 48;
  43407. tmpb = tmpa + 96;
  43408. r = a;
  43409. sp_3072_from_bin(a, 96, in, inLen);
  43410. sp_3072_from_mp(p, 48, pm);
  43411. sp_3072_from_mp(q, 48, qm);
  43412. sp_3072_from_mp(dp, 48, dpm);
  43413. err = sp_3072_mod_exp_48(tmpa, a, dp, 1536, p, 1);
  43414. }
  43415. if (err == MP_OKAY) {
  43416. sp_3072_from_mp(dq, 48, dqm);
  43417. err = sp_3072_mod_exp_48(tmpb, a, dq, 1536, q, 1);
  43418. }
  43419. if (err == MP_OKAY) {
  43420. c = sp_3072_sub_in_place_48(tmpa, tmpb);
  43421. c += sp_3072_cond_add_48(tmpa, tmpa, p, c);
  43422. sp_3072_cond_add_48(tmpa, tmpa, p, c);
  43423. sp_3072_from_mp(qi, 48, qim);
  43424. sp_3072_mul_48(tmpa, tmpa, qi);
  43425. err = sp_3072_mod_48(tmpa, tmpa, p);
  43426. }
  43427. if (err == MP_OKAY) {
  43428. sp_3072_mul_48(tmpa, q, tmpa);
  43429. XMEMSET(&tmpb[48], 0, sizeof(sp_digit) * 48);
  43430. sp_3072_add_96(r, tmpb, tmpa);
  43431. sp_3072_to_bin_96(r, out);
  43432. *outLen = 384;
  43433. }
  43434. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  43435. if (a != NULL)
  43436. #endif
  43437. {
  43438. ForceZero(a, sizeof(sp_digit) * 48 * 11);
  43439. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  43440. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  43441. #endif
  43442. }
  43443. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  43444. return err;
  43445. }
  43446. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  43447. #endif /* WOLFSSL_HAVE_SP_RSA */
  43448. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  43449. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  43450. /* Convert an array of sp_digit to an mp_int.
  43451. *
  43452. * a A single precision integer.
  43453. * r A multi-precision integer.
  43454. */
  43455. static int sp_3072_to_mp(const sp_digit* a, mp_int* r)
  43456. {
  43457. int err;
  43458. err = mp_grow(r, (3072 + DIGIT_BIT - 1) / DIGIT_BIT);
  43459. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  43460. #if DIGIT_BIT == 32
  43461. XMEMCPY(r->dp, a, sizeof(sp_digit) * 96);
  43462. r->used = 96;
  43463. mp_clamp(r);
  43464. #elif DIGIT_BIT < 32
  43465. int i;
  43466. int j = 0;
  43467. int s = 0;
  43468. r->dp[0] = 0;
  43469. for (i = 0; i < 96; i++) {
  43470. r->dp[j] |= (mp_digit)(a[i] << s);
  43471. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  43472. s = DIGIT_BIT - s;
  43473. r->dp[++j] = (mp_digit)(a[i] >> s);
  43474. while (s + DIGIT_BIT <= 32) {
  43475. s += DIGIT_BIT;
  43476. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  43477. if (s == SP_WORD_SIZE) {
  43478. r->dp[j] = 0;
  43479. }
  43480. else {
  43481. r->dp[j] = (mp_digit)(a[i] >> s);
  43482. }
  43483. }
  43484. s = 32 - s;
  43485. }
  43486. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  43487. mp_clamp(r);
  43488. #else
  43489. int i;
  43490. int j = 0;
  43491. int s = 0;
  43492. r->dp[0] = 0;
  43493. for (i = 0; i < 96; i++) {
  43494. r->dp[j] |= ((mp_digit)a[i]) << s;
  43495. if (s + 32 >= DIGIT_BIT) {
  43496. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  43497. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  43498. #endif
  43499. s = DIGIT_BIT - s;
  43500. r->dp[++j] = a[i] >> s;
  43501. s = 32 - s;
  43502. }
  43503. else {
  43504. s += 32;
  43505. }
  43506. }
  43507. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  43508. mp_clamp(r);
  43509. #endif
  43510. }
  43511. return err;
  43512. }
  43513. /* Perform the modular exponentiation for Diffie-Hellman.
  43514. *
  43515. * base Base. MP integer.
  43516. * exp Exponent. MP integer.
  43517. * mod Modulus. MP integer.
  43518. * res Result. MP integer.
  43519. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  43520. * and MEMORY_E if memory allocation fails.
  43521. */
  43522. int sp_ModExp_3072(const mp_int* base, const mp_int* exp, const mp_int* mod,
  43523. mp_int* res)
  43524. {
  43525. int err = MP_OKAY;
  43526. sp_digit b[192];
  43527. sp_digit e[96];
  43528. sp_digit m[96];
  43529. sp_digit* r = b;
  43530. int expBits = mp_count_bits(exp);
  43531. if (mp_count_bits(base) > 3072) {
  43532. err = MP_READ_E;
  43533. }
  43534. else if (expBits > 3072) {
  43535. err = MP_READ_E;
  43536. }
  43537. else if (mp_count_bits(mod) != 3072) {
  43538. err = MP_READ_E;
  43539. }
  43540. else if (mp_iseven(mod)) {
  43541. err = MP_VAL;
  43542. }
  43543. if (err == MP_OKAY) {
  43544. sp_3072_from_mp(b, 96, base);
  43545. sp_3072_from_mp(e, 96, exp);
  43546. sp_3072_from_mp(m, 96, mod);
  43547. err = sp_3072_mod_exp_96(r, b, e, expBits, m, 0);
  43548. }
  43549. if (err == MP_OKAY) {
  43550. err = sp_3072_to_mp(r, res);
  43551. }
  43552. XMEMSET(e, 0, sizeof(e));
  43553. return err;
  43554. }
  43555. #ifdef WOLFSSL_HAVE_SP_DH
  43556. #ifdef HAVE_FFDHE_3072
  43557. static void sp_3072_lshift_96(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  43558. {
  43559. register sp_digit* r asm ("r0") = r_p;
  43560. register const sp_digit* a asm ("r1") = a_p;
  43561. register byte n asm ("r2") = n_p;
  43562. __asm__ __volatile__ (
  43563. "rsb r12, %[n], #31\n\t"
  43564. "ldr r5, [%[a], #380]\n\t"
  43565. "lsr r6, r5, #1\n\t"
  43566. "lsl r5, r5, %[n]\n\t"
  43567. "lsr r6, r6, r12\n\t"
  43568. "ldr r4, [%[a], #376]\n\t"
  43569. "str r6, [%[r], #384]\n\t"
  43570. "lsr r3, r4, #1\n\t"
  43571. "lsl r4, r4, %[n]\n\t"
  43572. "lsr r3, r3, r12\n\t"
  43573. "orr r5, r5, r3\n\t"
  43574. "ldr r6, [%[a], #372]\n\t"
  43575. "str r5, [%[r], #380]\n\t"
  43576. "lsr r3, r6, #1\n\t"
  43577. "lsl r6, r6, %[n]\n\t"
  43578. "lsr r3, r3, r12\n\t"
  43579. "orr r4, r4, r3\n\t"
  43580. "ldr r5, [%[a], #368]\n\t"
  43581. "str r4, [%[r], #376]\n\t"
  43582. "lsr r3, r5, #1\n\t"
  43583. "lsl r5, r5, %[n]\n\t"
  43584. "lsr r3, r3, r12\n\t"
  43585. "orr r6, r6, r3\n\t"
  43586. "ldr r4, [%[a], #364]\n\t"
  43587. "str r6, [%[r], #372]\n\t"
  43588. "lsr r3, r4, #1\n\t"
  43589. "lsl r4, r4, %[n]\n\t"
  43590. "lsr r3, r3, r12\n\t"
  43591. "orr r5, r5, r3\n\t"
  43592. "ldr r6, [%[a], #360]\n\t"
  43593. "str r5, [%[r], #368]\n\t"
  43594. "lsr r3, r6, #1\n\t"
  43595. "lsl r6, r6, %[n]\n\t"
  43596. "lsr r3, r3, r12\n\t"
  43597. "orr r4, r4, r3\n\t"
  43598. "ldr r5, [%[a], #356]\n\t"
  43599. "str r4, [%[r], #364]\n\t"
  43600. "lsr r3, r5, #1\n\t"
  43601. "lsl r5, r5, %[n]\n\t"
  43602. "lsr r3, r3, r12\n\t"
  43603. "orr r6, r6, r3\n\t"
  43604. "ldr r4, [%[a], #352]\n\t"
  43605. "str r6, [%[r], #360]\n\t"
  43606. "lsr r3, r4, #1\n\t"
  43607. "lsl r4, r4, %[n]\n\t"
  43608. "lsr r3, r3, r12\n\t"
  43609. "orr r5, r5, r3\n\t"
  43610. "ldr r6, [%[a], #348]\n\t"
  43611. "str r5, [%[r], #356]\n\t"
  43612. "lsr r3, r6, #1\n\t"
  43613. "lsl r6, r6, %[n]\n\t"
  43614. "lsr r3, r3, r12\n\t"
  43615. "orr r4, r4, r3\n\t"
  43616. "ldr r5, [%[a], #344]\n\t"
  43617. "str r4, [%[r], #352]\n\t"
  43618. "lsr r3, r5, #1\n\t"
  43619. "lsl r5, r5, %[n]\n\t"
  43620. "lsr r3, r3, r12\n\t"
  43621. "orr r6, r6, r3\n\t"
  43622. "ldr r4, [%[a], #340]\n\t"
  43623. "str r6, [%[r], #348]\n\t"
  43624. "lsr r3, r4, #1\n\t"
  43625. "lsl r4, r4, %[n]\n\t"
  43626. "lsr r3, r3, r12\n\t"
  43627. "orr r5, r5, r3\n\t"
  43628. "ldr r6, [%[a], #336]\n\t"
  43629. "str r5, [%[r], #344]\n\t"
  43630. "lsr r3, r6, #1\n\t"
  43631. "lsl r6, r6, %[n]\n\t"
  43632. "lsr r3, r3, r12\n\t"
  43633. "orr r4, r4, r3\n\t"
  43634. "ldr r5, [%[a], #332]\n\t"
  43635. "str r4, [%[r], #340]\n\t"
  43636. "lsr r3, r5, #1\n\t"
  43637. "lsl r5, r5, %[n]\n\t"
  43638. "lsr r3, r3, r12\n\t"
  43639. "orr r6, r6, r3\n\t"
  43640. "ldr r4, [%[a], #328]\n\t"
  43641. "str r6, [%[r], #336]\n\t"
  43642. "lsr r3, r4, #1\n\t"
  43643. "lsl r4, r4, %[n]\n\t"
  43644. "lsr r3, r3, r12\n\t"
  43645. "orr r5, r5, r3\n\t"
  43646. "ldr r6, [%[a], #324]\n\t"
  43647. "str r5, [%[r], #332]\n\t"
  43648. "lsr r3, r6, #1\n\t"
  43649. "lsl r6, r6, %[n]\n\t"
  43650. "lsr r3, r3, r12\n\t"
  43651. "orr r4, r4, r3\n\t"
  43652. "ldr r5, [%[a], #320]\n\t"
  43653. "str r4, [%[r], #328]\n\t"
  43654. "lsr r3, r5, #1\n\t"
  43655. "lsl r5, r5, %[n]\n\t"
  43656. "lsr r3, r3, r12\n\t"
  43657. "orr r6, r6, r3\n\t"
  43658. "ldr r4, [%[a], #316]\n\t"
  43659. "str r6, [%[r], #324]\n\t"
  43660. "lsr r3, r4, #1\n\t"
  43661. "lsl r4, r4, %[n]\n\t"
  43662. "lsr r3, r3, r12\n\t"
  43663. "orr r5, r5, r3\n\t"
  43664. "ldr r6, [%[a], #312]\n\t"
  43665. "str r5, [%[r], #320]\n\t"
  43666. "lsr r3, r6, #1\n\t"
  43667. "lsl r6, r6, %[n]\n\t"
  43668. "lsr r3, r3, r12\n\t"
  43669. "orr r4, r4, r3\n\t"
  43670. "ldr r5, [%[a], #308]\n\t"
  43671. "str r4, [%[r], #316]\n\t"
  43672. "lsr r3, r5, #1\n\t"
  43673. "lsl r5, r5, %[n]\n\t"
  43674. "lsr r3, r3, r12\n\t"
  43675. "orr r6, r6, r3\n\t"
  43676. "ldr r4, [%[a], #304]\n\t"
  43677. "str r6, [%[r], #312]\n\t"
  43678. "lsr r3, r4, #1\n\t"
  43679. "lsl r4, r4, %[n]\n\t"
  43680. "lsr r3, r3, r12\n\t"
  43681. "orr r5, r5, r3\n\t"
  43682. "ldr r6, [%[a], #300]\n\t"
  43683. "str r5, [%[r], #308]\n\t"
  43684. "lsr r3, r6, #1\n\t"
  43685. "lsl r6, r6, %[n]\n\t"
  43686. "lsr r3, r3, r12\n\t"
  43687. "orr r4, r4, r3\n\t"
  43688. "ldr r5, [%[a], #296]\n\t"
  43689. "str r4, [%[r], #304]\n\t"
  43690. "lsr r3, r5, #1\n\t"
  43691. "lsl r5, r5, %[n]\n\t"
  43692. "lsr r3, r3, r12\n\t"
  43693. "orr r6, r6, r3\n\t"
  43694. "ldr r4, [%[a], #292]\n\t"
  43695. "str r6, [%[r], #300]\n\t"
  43696. "lsr r3, r4, #1\n\t"
  43697. "lsl r4, r4, %[n]\n\t"
  43698. "lsr r3, r3, r12\n\t"
  43699. "orr r5, r5, r3\n\t"
  43700. "ldr r6, [%[a], #288]\n\t"
  43701. "str r5, [%[r], #296]\n\t"
  43702. "lsr r3, r6, #1\n\t"
  43703. "lsl r6, r6, %[n]\n\t"
  43704. "lsr r3, r3, r12\n\t"
  43705. "orr r4, r4, r3\n\t"
  43706. "ldr r5, [%[a], #284]\n\t"
  43707. "str r4, [%[r], #292]\n\t"
  43708. "lsr r3, r5, #1\n\t"
  43709. "lsl r5, r5, %[n]\n\t"
  43710. "lsr r3, r3, r12\n\t"
  43711. "orr r6, r6, r3\n\t"
  43712. "ldr r4, [%[a], #280]\n\t"
  43713. "str r6, [%[r], #288]\n\t"
  43714. "lsr r3, r4, #1\n\t"
  43715. "lsl r4, r4, %[n]\n\t"
  43716. "lsr r3, r3, r12\n\t"
  43717. "orr r5, r5, r3\n\t"
  43718. "ldr r6, [%[a], #276]\n\t"
  43719. "str r5, [%[r], #284]\n\t"
  43720. "lsr r3, r6, #1\n\t"
  43721. "lsl r6, r6, %[n]\n\t"
  43722. "lsr r3, r3, r12\n\t"
  43723. "orr r4, r4, r3\n\t"
  43724. "ldr r5, [%[a], #272]\n\t"
  43725. "str r4, [%[r], #280]\n\t"
  43726. "lsr r3, r5, #1\n\t"
  43727. "lsl r5, r5, %[n]\n\t"
  43728. "lsr r3, r3, r12\n\t"
  43729. "orr r6, r6, r3\n\t"
  43730. "ldr r4, [%[a], #268]\n\t"
  43731. "str r6, [%[r], #276]\n\t"
  43732. "lsr r3, r4, #1\n\t"
  43733. "lsl r4, r4, %[n]\n\t"
  43734. "lsr r3, r3, r12\n\t"
  43735. "orr r5, r5, r3\n\t"
  43736. "ldr r6, [%[a], #264]\n\t"
  43737. "str r5, [%[r], #272]\n\t"
  43738. "lsr r3, r6, #1\n\t"
  43739. "lsl r6, r6, %[n]\n\t"
  43740. "lsr r3, r3, r12\n\t"
  43741. "orr r4, r4, r3\n\t"
  43742. "ldr r5, [%[a], #260]\n\t"
  43743. "str r4, [%[r], #268]\n\t"
  43744. "lsr r3, r5, #1\n\t"
  43745. "lsl r5, r5, %[n]\n\t"
  43746. "lsr r3, r3, r12\n\t"
  43747. "orr r6, r6, r3\n\t"
  43748. "ldr r4, [%[a], #256]\n\t"
  43749. "str r6, [%[r], #264]\n\t"
  43750. "lsr r3, r4, #1\n\t"
  43751. "lsl r4, r4, %[n]\n\t"
  43752. "lsr r3, r3, r12\n\t"
  43753. "orr r5, r5, r3\n\t"
  43754. "ldr r6, [%[a], #252]\n\t"
  43755. "str r5, [%[r], #260]\n\t"
  43756. "lsr r3, r6, #1\n\t"
  43757. "lsl r6, r6, %[n]\n\t"
  43758. "lsr r3, r3, r12\n\t"
  43759. "orr r4, r4, r3\n\t"
  43760. "ldr r5, [%[a], #248]\n\t"
  43761. "str r4, [%[r], #256]\n\t"
  43762. "lsr r3, r5, #1\n\t"
  43763. "lsl r5, r5, %[n]\n\t"
  43764. "lsr r3, r3, r12\n\t"
  43765. "orr r6, r6, r3\n\t"
  43766. "ldr r4, [%[a], #244]\n\t"
  43767. "str r6, [%[r], #252]\n\t"
  43768. "lsr r3, r4, #1\n\t"
  43769. "lsl r4, r4, %[n]\n\t"
  43770. "lsr r3, r3, r12\n\t"
  43771. "orr r5, r5, r3\n\t"
  43772. "ldr r6, [%[a], #240]\n\t"
  43773. "str r5, [%[r], #248]\n\t"
  43774. "lsr r3, r6, #1\n\t"
  43775. "lsl r6, r6, %[n]\n\t"
  43776. "lsr r3, r3, r12\n\t"
  43777. "orr r4, r4, r3\n\t"
  43778. "ldr r5, [%[a], #236]\n\t"
  43779. "str r4, [%[r], #244]\n\t"
  43780. "lsr r3, r5, #1\n\t"
  43781. "lsl r5, r5, %[n]\n\t"
  43782. "lsr r3, r3, r12\n\t"
  43783. "orr r6, r6, r3\n\t"
  43784. "ldr r4, [%[a], #232]\n\t"
  43785. "str r6, [%[r], #240]\n\t"
  43786. "lsr r3, r4, #1\n\t"
  43787. "lsl r4, r4, %[n]\n\t"
  43788. "lsr r3, r3, r12\n\t"
  43789. "orr r5, r5, r3\n\t"
  43790. "ldr r6, [%[a], #228]\n\t"
  43791. "str r5, [%[r], #236]\n\t"
  43792. "lsr r3, r6, #1\n\t"
  43793. "lsl r6, r6, %[n]\n\t"
  43794. "lsr r3, r3, r12\n\t"
  43795. "orr r4, r4, r3\n\t"
  43796. "ldr r5, [%[a], #224]\n\t"
  43797. "str r4, [%[r], #232]\n\t"
  43798. "lsr r3, r5, #1\n\t"
  43799. "lsl r5, r5, %[n]\n\t"
  43800. "lsr r3, r3, r12\n\t"
  43801. "orr r6, r6, r3\n\t"
  43802. "ldr r4, [%[a], #220]\n\t"
  43803. "str r6, [%[r], #228]\n\t"
  43804. "lsr r3, r4, #1\n\t"
  43805. "lsl r4, r4, %[n]\n\t"
  43806. "lsr r3, r3, r12\n\t"
  43807. "orr r5, r5, r3\n\t"
  43808. "ldr r6, [%[a], #216]\n\t"
  43809. "str r5, [%[r], #224]\n\t"
  43810. "lsr r3, r6, #1\n\t"
  43811. "lsl r6, r6, %[n]\n\t"
  43812. "lsr r3, r3, r12\n\t"
  43813. "orr r4, r4, r3\n\t"
  43814. "ldr r5, [%[a], #212]\n\t"
  43815. "str r4, [%[r], #220]\n\t"
  43816. "lsr r3, r5, #1\n\t"
  43817. "lsl r5, r5, %[n]\n\t"
  43818. "lsr r3, r3, r12\n\t"
  43819. "orr r6, r6, r3\n\t"
  43820. "ldr r4, [%[a], #208]\n\t"
  43821. "str r6, [%[r], #216]\n\t"
  43822. "lsr r3, r4, #1\n\t"
  43823. "lsl r4, r4, %[n]\n\t"
  43824. "lsr r3, r3, r12\n\t"
  43825. "orr r5, r5, r3\n\t"
  43826. "ldr r6, [%[a], #204]\n\t"
  43827. "str r5, [%[r], #212]\n\t"
  43828. "lsr r3, r6, #1\n\t"
  43829. "lsl r6, r6, %[n]\n\t"
  43830. "lsr r3, r3, r12\n\t"
  43831. "orr r4, r4, r3\n\t"
  43832. "ldr r5, [%[a], #200]\n\t"
  43833. "str r4, [%[r], #208]\n\t"
  43834. "lsr r3, r5, #1\n\t"
  43835. "lsl r5, r5, %[n]\n\t"
  43836. "lsr r3, r3, r12\n\t"
  43837. "orr r6, r6, r3\n\t"
  43838. "ldr r4, [%[a], #196]\n\t"
  43839. "str r6, [%[r], #204]\n\t"
  43840. "lsr r3, r4, #1\n\t"
  43841. "lsl r4, r4, %[n]\n\t"
  43842. "lsr r3, r3, r12\n\t"
  43843. "orr r5, r5, r3\n\t"
  43844. "ldr r6, [%[a], #192]\n\t"
  43845. "str r5, [%[r], #200]\n\t"
  43846. "lsr r3, r6, #1\n\t"
  43847. "lsl r6, r6, %[n]\n\t"
  43848. "lsr r3, r3, r12\n\t"
  43849. "orr r4, r4, r3\n\t"
  43850. "ldr r5, [%[a], #188]\n\t"
  43851. "str r4, [%[r], #196]\n\t"
  43852. "lsr r3, r5, #1\n\t"
  43853. "lsl r5, r5, %[n]\n\t"
  43854. "lsr r3, r3, r12\n\t"
  43855. "orr r6, r6, r3\n\t"
  43856. "ldr r4, [%[a], #184]\n\t"
  43857. "str r6, [%[r], #192]\n\t"
  43858. "lsr r3, r4, #1\n\t"
  43859. "lsl r4, r4, %[n]\n\t"
  43860. "lsr r3, r3, r12\n\t"
  43861. "orr r5, r5, r3\n\t"
  43862. "ldr r6, [%[a], #180]\n\t"
  43863. "str r5, [%[r], #188]\n\t"
  43864. "lsr r3, r6, #1\n\t"
  43865. "lsl r6, r6, %[n]\n\t"
  43866. "lsr r3, r3, r12\n\t"
  43867. "orr r4, r4, r3\n\t"
  43868. "ldr r5, [%[a], #176]\n\t"
  43869. "str r4, [%[r], #184]\n\t"
  43870. "lsr r3, r5, #1\n\t"
  43871. "lsl r5, r5, %[n]\n\t"
  43872. "lsr r3, r3, r12\n\t"
  43873. "orr r6, r6, r3\n\t"
  43874. "ldr r4, [%[a], #172]\n\t"
  43875. "str r6, [%[r], #180]\n\t"
  43876. "lsr r3, r4, #1\n\t"
  43877. "lsl r4, r4, %[n]\n\t"
  43878. "lsr r3, r3, r12\n\t"
  43879. "orr r5, r5, r3\n\t"
  43880. "ldr r6, [%[a], #168]\n\t"
  43881. "str r5, [%[r], #176]\n\t"
  43882. "lsr r3, r6, #1\n\t"
  43883. "lsl r6, r6, %[n]\n\t"
  43884. "lsr r3, r3, r12\n\t"
  43885. "orr r4, r4, r3\n\t"
  43886. "ldr r5, [%[a], #164]\n\t"
  43887. "str r4, [%[r], #172]\n\t"
  43888. "lsr r3, r5, #1\n\t"
  43889. "lsl r5, r5, %[n]\n\t"
  43890. "lsr r3, r3, r12\n\t"
  43891. "orr r6, r6, r3\n\t"
  43892. "ldr r4, [%[a], #160]\n\t"
  43893. "str r6, [%[r], #168]\n\t"
  43894. "lsr r3, r4, #1\n\t"
  43895. "lsl r4, r4, %[n]\n\t"
  43896. "lsr r3, r3, r12\n\t"
  43897. "orr r5, r5, r3\n\t"
  43898. "ldr r6, [%[a], #156]\n\t"
  43899. "str r5, [%[r], #164]\n\t"
  43900. "lsr r3, r6, #1\n\t"
  43901. "lsl r6, r6, %[n]\n\t"
  43902. "lsr r3, r3, r12\n\t"
  43903. "orr r4, r4, r3\n\t"
  43904. "ldr r5, [%[a], #152]\n\t"
  43905. "str r4, [%[r], #160]\n\t"
  43906. "lsr r3, r5, #1\n\t"
  43907. "lsl r5, r5, %[n]\n\t"
  43908. "lsr r3, r3, r12\n\t"
  43909. "orr r6, r6, r3\n\t"
  43910. "ldr r4, [%[a], #148]\n\t"
  43911. "str r6, [%[r], #156]\n\t"
  43912. "lsr r3, r4, #1\n\t"
  43913. "lsl r4, r4, %[n]\n\t"
  43914. "lsr r3, r3, r12\n\t"
  43915. "orr r5, r5, r3\n\t"
  43916. "ldr r6, [%[a], #144]\n\t"
  43917. "str r5, [%[r], #152]\n\t"
  43918. "lsr r3, r6, #1\n\t"
  43919. "lsl r6, r6, %[n]\n\t"
  43920. "lsr r3, r3, r12\n\t"
  43921. "orr r4, r4, r3\n\t"
  43922. "ldr r5, [%[a], #140]\n\t"
  43923. "str r4, [%[r], #148]\n\t"
  43924. "lsr r3, r5, #1\n\t"
  43925. "lsl r5, r5, %[n]\n\t"
  43926. "lsr r3, r3, r12\n\t"
  43927. "orr r6, r6, r3\n\t"
  43928. "ldr r4, [%[a], #136]\n\t"
  43929. "str r6, [%[r], #144]\n\t"
  43930. "lsr r3, r4, #1\n\t"
  43931. "lsl r4, r4, %[n]\n\t"
  43932. "lsr r3, r3, r12\n\t"
  43933. "orr r5, r5, r3\n\t"
  43934. "ldr r6, [%[a], #132]\n\t"
  43935. "str r5, [%[r], #140]\n\t"
  43936. "lsr r3, r6, #1\n\t"
  43937. "lsl r6, r6, %[n]\n\t"
  43938. "lsr r3, r3, r12\n\t"
  43939. "orr r4, r4, r3\n\t"
  43940. "ldr r5, [%[a], #128]\n\t"
  43941. "str r4, [%[r], #136]\n\t"
  43942. "lsr r3, r5, #1\n\t"
  43943. "lsl r5, r5, %[n]\n\t"
  43944. "lsr r3, r3, r12\n\t"
  43945. "orr r6, r6, r3\n\t"
  43946. "ldr r4, [%[a], #124]\n\t"
  43947. "str r6, [%[r], #132]\n\t"
  43948. "lsr r3, r4, #1\n\t"
  43949. "lsl r4, r4, %[n]\n\t"
  43950. "lsr r3, r3, r12\n\t"
  43951. "orr r5, r5, r3\n\t"
  43952. "ldr r6, [%[a], #120]\n\t"
  43953. "str r5, [%[r], #128]\n\t"
  43954. "lsr r3, r6, #1\n\t"
  43955. "lsl r6, r6, %[n]\n\t"
  43956. "lsr r3, r3, r12\n\t"
  43957. "orr r4, r4, r3\n\t"
  43958. "ldr r5, [%[a], #116]\n\t"
  43959. "str r4, [%[r], #124]\n\t"
  43960. "lsr r3, r5, #1\n\t"
  43961. "lsl r5, r5, %[n]\n\t"
  43962. "lsr r3, r3, r12\n\t"
  43963. "orr r6, r6, r3\n\t"
  43964. "ldr r4, [%[a], #112]\n\t"
  43965. "str r6, [%[r], #120]\n\t"
  43966. "lsr r3, r4, #1\n\t"
  43967. "lsl r4, r4, %[n]\n\t"
  43968. "lsr r3, r3, r12\n\t"
  43969. "orr r5, r5, r3\n\t"
  43970. "ldr r6, [%[a], #108]\n\t"
  43971. "str r5, [%[r], #116]\n\t"
  43972. "lsr r3, r6, #1\n\t"
  43973. "lsl r6, r6, %[n]\n\t"
  43974. "lsr r3, r3, r12\n\t"
  43975. "orr r4, r4, r3\n\t"
  43976. "ldr r5, [%[a], #104]\n\t"
  43977. "str r4, [%[r], #112]\n\t"
  43978. "lsr r3, r5, #1\n\t"
  43979. "lsl r5, r5, %[n]\n\t"
  43980. "lsr r3, r3, r12\n\t"
  43981. "orr r6, r6, r3\n\t"
  43982. "ldr r4, [%[a], #100]\n\t"
  43983. "str r6, [%[r], #108]\n\t"
  43984. "lsr r3, r4, #1\n\t"
  43985. "lsl r4, r4, %[n]\n\t"
  43986. "lsr r3, r3, r12\n\t"
  43987. "orr r5, r5, r3\n\t"
  43988. "ldr r6, [%[a], #96]\n\t"
  43989. "str r5, [%[r], #104]\n\t"
  43990. "lsr r3, r6, #1\n\t"
  43991. "lsl r6, r6, %[n]\n\t"
  43992. "lsr r3, r3, r12\n\t"
  43993. "orr r4, r4, r3\n\t"
  43994. "ldr r5, [%[a], #92]\n\t"
  43995. "str r4, [%[r], #100]\n\t"
  43996. "lsr r3, r5, #1\n\t"
  43997. "lsl r5, r5, %[n]\n\t"
  43998. "lsr r3, r3, r12\n\t"
  43999. "orr r6, r6, r3\n\t"
  44000. "ldr r4, [%[a], #88]\n\t"
  44001. "str r6, [%[r], #96]\n\t"
  44002. "lsr r3, r4, #1\n\t"
  44003. "lsl r4, r4, %[n]\n\t"
  44004. "lsr r3, r3, r12\n\t"
  44005. "orr r5, r5, r3\n\t"
  44006. "ldr r6, [%[a], #84]\n\t"
  44007. "str r5, [%[r], #92]\n\t"
  44008. "lsr r3, r6, #1\n\t"
  44009. "lsl r6, r6, %[n]\n\t"
  44010. "lsr r3, r3, r12\n\t"
  44011. "orr r4, r4, r3\n\t"
  44012. "ldr r5, [%[a], #80]\n\t"
  44013. "str r4, [%[r], #88]\n\t"
  44014. "lsr r3, r5, #1\n\t"
  44015. "lsl r5, r5, %[n]\n\t"
  44016. "lsr r3, r3, r12\n\t"
  44017. "orr r6, r6, r3\n\t"
  44018. "ldr r4, [%[a], #76]\n\t"
  44019. "str r6, [%[r], #84]\n\t"
  44020. "lsr r3, r4, #1\n\t"
  44021. "lsl r4, r4, %[n]\n\t"
  44022. "lsr r3, r3, r12\n\t"
  44023. "orr r5, r5, r3\n\t"
  44024. "ldr r6, [%[a], #72]\n\t"
  44025. "str r5, [%[r], #80]\n\t"
  44026. "lsr r3, r6, #1\n\t"
  44027. "lsl r6, r6, %[n]\n\t"
  44028. "lsr r3, r3, r12\n\t"
  44029. "orr r4, r4, r3\n\t"
  44030. "ldr r5, [%[a], #68]\n\t"
  44031. "str r4, [%[r], #76]\n\t"
  44032. "lsr r3, r5, #1\n\t"
  44033. "lsl r5, r5, %[n]\n\t"
  44034. "lsr r3, r3, r12\n\t"
  44035. "orr r6, r6, r3\n\t"
  44036. "ldr r4, [%[a], #64]\n\t"
  44037. "str r6, [%[r], #72]\n\t"
  44038. "lsr r3, r4, #1\n\t"
  44039. "lsl r4, r4, %[n]\n\t"
  44040. "lsr r3, r3, r12\n\t"
  44041. "orr r5, r5, r3\n\t"
  44042. "ldr r6, [%[a], #60]\n\t"
  44043. "str r5, [%[r], #68]\n\t"
  44044. "lsr r3, r6, #1\n\t"
  44045. "lsl r6, r6, %[n]\n\t"
  44046. "lsr r3, r3, r12\n\t"
  44047. "orr r4, r4, r3\n\t"
  44048. "ldr r5, [%[a], #56]\n\t"
  44049. "str r4, [%[r], #64]\n\t"
  44050. "lsr r3, r5, #1\n\t"
  44051. "lsl r5, r5, %[n]\n\t"
  44052. "lsr r3, r3, r12\n\t"
  44053. "orr r6, r6, r3\n\t"
  44054. "ldr r4, [%[a], #52]\n\t"
  44055. "str r6, [%[r], #60]\n\t"
  44056. "lsr r3, r4, #1\n\t"
  44057. "lsl r4, r4, %[n]\n\t"
  44058. "lsr r3, r3, r12\n\t"
  44059. "orr r5, r5, r3\n\t"
  44060. "ldr r6, [%[a], #48]\n\t"
  44061. "str r5, [%[r], #56]\n\t"
  44062. "lsr r3, r6, #1\n\t"
  44063. "lsl r6, r6, %[n]\n\t"
  44064. "lsr r3, r3, r12\n\t"
  44065. "orr r4, r4, r3\n\t"
  44066. "ldr r5, [%[a], #44]\n\t"
  44067. "str r4, [%[r], #52]\n\t"
  44068. "lsr r3, r5, #1\n\t"
  44069. "lsl r5, r5, %[n]\n\t"
  44070. "lsr r3, r3, r12\n\t"
  44071. "orr r6, r6, r3\n\t"
  44072. "ldr r4, [%[a], #40]\n\t"
  44073. "str r6, [%[r], #48]\n\t"
  44074. "lsr r3, r4, #1\n\t"
  44075. "lsl r4, r4, %[n]\n\t"
  44076. "lsr r3, r3, r12\n\t"
  44077. "orr r5, r5, r3\n\t"
  44078. "ldr r6, [%[a], #36]\n\t"
  44079. "str r5, [%[r], #44]\n\t"
  44080. "lsr r3, r6, #1\n\t"
  44081. "lsl r6, r6, %[n]\n\t"
  44082. "lsr r3, r3, r12\n\t"
  44083. "orr r4, r4, r3\n\t"
  44084. "ldr r5, [%[a], #32]\n\t"
  44085. "str r4, [%[r], #40]\n\t"
  44086. "lsr r3, r5, #1\n\t"
  44087. "lsl r5, r5, %[n]\n\t"
  44088. "lsr r3, r3, r12\n\t"
  44089. "orr r6, r6, r3\n\t"
  44090. "ldr r4, [%[a], #28]\n\t"
  44091. "str r6, [%[r], #36]\n\t"
  44092. "lsr r3, r4, #1\n\t"
  44093. "lsl r4, r4, %[n]\n\t"
  44094. "lsr r3, r3, r12\n\t"
  44095. "orr r5, r5, r3\n\t"
  44096. "ldr r6, [%[a], #24]\n\t"
  44097. "str r5, [%[r], #32]\n\t"
  44098. "lsr r3, r6, #1\n\t"
  44099. "lsl r6, r6, %[n]\n\t"
  44100. "lsr r3, r3, r12\n\t"
  44101. "orr r4, r4, r3\n\t"
  44102. "ldr r5, [%[a], #20]\n\t"
  44103. "str r4, [%[r], #28]\n\t"
  44104. "lsr r3, r5, #1\n\t"
  44105. "lsl r5, r5, %[n]\n\t"
  44106. "lsr r3, r3, r12\n\t"
  44107. "orr r6, r6, r3\n\t"
  44108. "ldr r4, [%[a], #16]\n\t"
  44109. "str r6, [%[r], #24]\n\t"
  44110. "lsr r3, r4, #1\n\t"
  44111. "lsl r4, r4, %[n]\n\t"
  44112. "lsr r3, r3, r12\n\t"
  44113. "orr r5, r5, r3\n\t"
  44114. "ldr r6, [%[a], #12]\n\t"
  44115. "str r5, [%[r], #20]\n\t"
  44116. "lsr r3, r6, #1\n\t"
  44117. "lsl r6, r6, %[n]\n\t"
  44118. "lsr r3, r3, r12\n\t"
  44119. "orr r4, r4, r3\n\t"
  44120. "ldr r5, [%[a], #8]\n\t"
  44121. "str r4, [%[r], #16]\n\t"
  44122. "lsr r3, r5, #1\n\t"
  44123. "lsl r5, r5, %[n]\n\t"
  44124. "lsr r3, r3, r12\n\t"
  44125. "orr r6, r6, r3\n\t"
  44126. "ldr r4, [%[a], #4]\n\t"
  44127. "str r6, [%[r], #12]\n\t"
  44128. "lsr r3, r4, #1\n\t"
  44129. "lsl r4, r4, %[n]\n\t"
  44130. "lsr r3, r3, r12\n\t"
  44131. "orr r5, r5, r3\n\t"
  44132. "ldr r6, [%[a]]\n\t"
  44133. "str r5, [%[r], #8]\n\t"
  44134. "lsr r3, r6, #1\n\t"
  44135. "lsl r6, r6, %[n]\n\t"
  44136. "lsr r3, r3, r12\n\t"
  44137. "orr r4, r4, r3\n\t"
  44138. "str r6, [%[r]]\n\t"
  44139. "str r4, [%[r], #4]\n\t"
  44140. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  44141. :
  44142. : "memory", "r4", "r5", "r6", "r3", "r12"
  44143. );
  44144. }
  44145. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  44146. *
  44147. * r A single precision number that is the result of the operation.
  44148. * e A single precision number that is the exponent.
  44149. * bits The number of bits in the exponent.
  44150. * m A single precision number that is the modulus.
  44151. * returns 0 on success.
  44152. * returns MEMORY_E on dynamic memory allocation failure.
  44153. * returns MP_VAL when base is even.
  44154. */
  44155. static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits,
  44156. const sp_digit* m)
  44157. {
  44158. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  44159. sp_digit* td = NULL;
  44160. #else
  44161. sp_digit td[289];
  44162. #endif
  44163. sp_digit* norm = NULL;
  44164. sp_digit* tmp = NULL;
  44165. sp_digit mp = 1;
  44166. sp_digit n;
  44167. sp_digit o;
  44168. sp_digit mask;
  44169. int i;
  44170. int c;
  44171. byte y;
  44172. int err = MP_OKAY;
  44173. if (bits == 0) {
  44174. err = MP_VAL;
  44175. }
  44176. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  44177. if (err == MP_OKAY) {
  44178. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 289, NULL,
  44179. DYNAMIC_TYPE_TMP_BUFFER);
  44180. if (td == NULL)
  44181. err = MEMORY_E;
  44182. }
  44183. #endif
  44184. if (err == MP_OKAY) {
  44185. norm = td;
  44186. tmp = td + 192;
  44187. sp_3072_mont_setup(m, &mp);
  44188. sp_3072_mont_norm_96(norm, m);
  44189. i = (bits - 1) / 32;
  44190. n = e[i--];
  44191. c = bits & 31;
  44192. if (c == 0) {
  44193. c = 32;
  44194. }
  44195. c -= bits % 5;
  44196. if (c == 32) {
  44197. c = 27;
  44198. }
  44199. if (c < 0) {
  44200. /* Number of bits in top word is less than number needed. */
  44201. c = -c;
  44202. y = (byte)(n << c);
  44203. n = e[i--];
  44204. y |= (byte)(n >> (64 - c));
  44205. n <<= c;
  44206. c = 64 - c;
  44207. }
  44208. else if (c == 0) {
  44209. /* All bits in top word used. */
  44210. y = (byte)n;
  44211. }
  44212. else {
  44213. y = (byte)(n >> c);
  44214. n <<= 32 - c;
  44215. }
  44216. sp_3072_lshift_96(r, norm, y);
  44217. for (; i>=0 || c>=5; ) {
  44218. if (c == 0) {
  44219. n = e[i--];
  44220. y = (byte)(n >> 27);
  44221. n <<= 5;
  44222. c = 27;
  44223. }
  44224. else if (c < 5) {
  44225. y = (byte)(n >> 27);
  44226. n = e[i--];
  44227. c = 5 - c;
  44228. y |= (byte)(n >> (32 - c));
  44229. n <<= c;
  44230. c = 32 - c;
  44231. }
  44232. else {
  44233. y = (byte)((n >> 27) & 0x1f);
  44234. n <<= 5;
  44235. c -= 5;
  44236. }
  44237. sp_3072_mont_sqr_96(r, r, m, mp);
  44238. sp_3072_mont_sqr_96(r, r, m, mp);
  44239. sp_3072_mont_sqr_96(r, r, m, mp);
  44240. sp_3072_mont_sqr_96(r, r, m, mp);
  44241. sp_3072_mont_sqr_96(r, r, m, mp);
  44242. sp_3072_lshift_96(r, r, y);
  44243. sp_3072_mul_d_96(tmp, norm, r[96]);
  44244. r[96] = 0;
  44245. o = sp_3072_add_96(r, r, tmp);
  44246. sp_3072_cond_sub_96(r, r, m, (sp_digit)0 - o);
  44247. }
  44248. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  44249. sp_3072_mont_reduce_96(r, m, mp);
  44250. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  44251. sp_3072_cond_sub_96(r, r, m, mask);
  44252. }
  44253. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  44254. if (td != NULL)
  44255. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44256. #endif
  44257. return err;
  44258. }
  44259. #endif /* HAVE_FFDHE_3072 */
  44260. /* Perform the modular exponentiation for Diffie-Hellman.
  44261. *
  44262. * base Base.
  44263. * exp Array of bytes that is the exponent.
  44264. * expLen Length of data, in bytes, in exponent.
  44265. * mod Modulus.
  44266. * out Buffer to hold big-endian bytes of exponentiation result.
  44267. * Must be at least 384 bytes long.
  44268. * outLen Length, in bytes, of exponentiation result.
  44269. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  44270. * and MEMORY_E if memory allocation fails.
  44271. */
  44272. int sp_DhExp_3072(const mp_int* base, const byte* exp, word32 expLen,
  44273. const mp_int* mod, byte* out, word32* outLen)
  44274. {
  44275. int err = MP_OKAY;
  44276. sp_digit b[192];
  44277. sp_digit e[96];
  44278. sp_digit m[96];
  44279. sp_digit* r = b;
  44280. word32 i;
  44281. if (mp_count_bits(base) > 3072) {
  44282. err = MP_READ_E;
  44283. }
  44284. else if (expLen > 384) {
  44285. err = MP_READ_E;
  44286. }
  44287. else if (mp_count_bits(mod) != 3072) {
  44288. err = MP_READ_E;
  44289. }
  44290. else if (mp_iseven(mod)) {
  44291. err = MP_VAL;
  44292. }
  44293. if (err == MP_OKAY) {
  44294. sp_3072_from_mp(b, 96, base);
  44295. sp_3072_from_bin(e, 96, exp, expLen);
  44296. sp_3072_from_mp(m, 96, mod);
  44297. #ifdef HAVE_FFDHE_3072
  44298. if (base->used == 1 && base->dp[0] == 2 && m[95] == (sp_digit)-1)
  44299. err = sp_3072_mod_exp_2_96(r, e, expLen * 8, m);
  44300. else
  44301. #endif
  44302. err = sp_3072_mod_exp_96(r, b, e, expLen * 8, m, 0);
  44303. }
  44304. if (err == MP_OKAY) {
  44305. sp_3072_to_bin_96(r, out);
  44306. *outLen = 384;
  44307. for (i=0; i<384 && out[i] == 0; i++) {
  44308. /* Search for first non-zero. */
  44309. }
  44310. *outLen -= i;
  44311. XMEMMOVE(out, out + i, *outLen);
  44312. }
  44313. XMEMSET(e, 0, sizeof(e));
  44314. return err;
  44315. }
  44316. #endif /* WOLFSSL_HAVE_SP_DH */
  44317. /* Perform the modular exponentiation for Diffie-Hellman.
  44318. *
  44319. * base Base. MP integer.
  44320. * exp Exponent. MP integer.
  44321. * mod Modulus. MP integer.
  44322. * res Result. MP integer.
  44323. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  44324. * and MEMORY_E if memory allocation fails.
  44325. */
  44326. int sp_ModExp_1536(const mp_int* base, const mp_int* exp, const mp_int* mod,
  44327. mp_int* res)
  44328. {
  44329. int err = MP_OKAY;
  44330. sp_digit b[96];
  44331. sp_digit e[48];
  44332. sp_digit m[48];
  44333. sp_digit* r = b;
  44334. int expBits = mp_count_bits(exp);
  44335. if (mp_count_bits(base) > 1536) {
  44336. err = MP_READ_E;
  44337. }
  44338. else if (expBits > 1536) {
  44339. err = MP_READ_E;
  44340. }
  44341. else if (mp_count_bits(mod) != 1536) {
  44342. err = MP_READ_E;
  44343. }
  44344. else if (mp_iseven(mod)) {
  44345. err = MP_VAL;
  44346. }
  44347. if (err == MP_OKAY) {
  44348. sp_3072_from_mp(b, 48, base);
  44349. sp_3072_from_mp(e, 48, exp);
  44350. sp_3072_from_mp(m, 48, mod);
  44351. err = sp_3072_mod_exp_48(r, b, e, expBits, m, 0);
  44352. }
  44353. if (err == MP_OKAY) {
  44354. XMEMSET(r + 48, 0, sizeof(*r) * 48U);
  44355. err = sp_3072_to_mp(r, res);
  44356. res->used = mod->used;
  44357. mp_clamp(res);
  44358. }
  44359. XMEMSET(e, 0, sizeof(e));
  44360. return err;
  44361. }
  44362. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  44363. #endif /* !WOLFSSL_SP_NO_3072 */
  44364. #ifdef WOLFSSL_SP_4096
  44365. /* Read big endian unsigned byte array into r.
  44366. *
  44367. * r A single precision integer.
  44368. * size Maximum number of bytes to convert
  44369. * a Byte array.
  44370. * n Number of bytes in array to read.
  44371. */
  44372. static void sp_4096_from_bin(sp_digit* r, int size, const byte* a, int n)
  44373. {
  44374. int i;
  44375. int j;
  44376. byte* d;
  44377. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  44378. r[j] = ((sp_digit)a[i - 0] << 0) |
  44379. ((sp_digit)a[i - 1] << 8) |
  44380. ((sp_digit)a[i - 2] << 16) |
  44381. ((sp_digit)a[i - 3] << 24);
  44382. j++;
  44383. }
  44384. if (i >= 0) {
  44385. r[j] = 0;
  44386. d = (byte*)r;
  44387. switch (i) {
  44388. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  44389. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  44390. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  44391. }
  44392. j++;
  44393. }
  44394. for (; j < size; j++) {
  44395. r[j] = 0;
  44396. }
  44397. }
  44398. /* Convert an mp_int to an array of sp_digit.
  44399. *
  44400. * r A single precision integer.
  44401. * size Maximum number of bytes to convert
  44402. * a A multi-precision integer.
  44403. */
  44404. static void sp_4096_from_mp(sp_digit* r, int size, const mp_int* a)
  44405. {
  44406. #if DIGIT_BIT == 32
  44407. int i;
  44408. int j = 0;
  44409. for (i = 0; i < size; i++) {
  44410. sp_digit mask =
  44411. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  44412. r[i] = a->dp[j] & mask;
  44413. j += (int)(((sp_digit)1) -
  44414. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  44415. }
  44416. #elif DIGIT_BIT > 32
  44417. int i;
  44418. int j = 0;
  44419. word32 s = 0;
  44420. r[0] = 0;
  44421. for (i = 0; i < a->used && j < size; i++) {
  44422. r[j] |= ((sp_digit)a->dp[i] << s);
  44423. r[j] &= 0xffffffff;
  44424. s = 32U - s;
  44425. if (j + 1 >= size) {
  44426. break;
  44427. }
  44428. /* lint allow cast of mismatch word32 and mp_digit */
  44429. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  44430. while ((s + 32U) <= (word32)DIGIT_BIT) {
  44431. s += 32U;
  44432. r[j] &= 0xffffffff;
  44433. if (j + 1 >= size) {
  44434. break;
  44435. }
  44436. if (s < (word32)DIGIT_BIT) {
  44437. /* lint allow cast of mismatch word32 and mp_digit */
  44438. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  44439. }
  44440. else {
  44441. r[++j] = (sp_digit)0;
  44442. }
  44443. }
  44444. s = (word32)DIGIT_BIT - s;
  44445. }
  44446. for (j++; j < size; j++) {
  44447. r[j] = 0;
  44448. }
  44449. #else
  44450. int i;
  44451. int j = 0;
  44452. int s = 0;
  44453. r[0] = 0;
  44454. for (i = 0; i < a->used && j < size; i++) {
  44455. r[j] |= ((sp_digit)a->dp[i]) << s;
  44456. if (s + DIGIT_BIT >= 32) {
  44457. r[j] &= 0xffffffff;
  44458. if (j + 1 >= size) {
  44459. break;
  44460. }
  44461. s = 32 - s;
  44462. if (s == DIGIT_BIT) {
  44463. r[++j] = 0;
  44464. s = 0;
  44465. }
  44466. else {
  44467. r[++j] = a->dp[i] >> s;
  44468. s = DIGIT_BIT - s;
  44469. }
  44470. }
  44471. else {
  44472. s += DIGIT_BIT;
  44473. }
  44474. }
  44475. for (j++; j < size; j++) {
  44476. r[j] = 0;
  44477. }
  44478. #endif
  44479. }
  44480. /* Write r as big endian to byte array.
  44481. * Fixed length number of bytes written: 512
  44482. *
  44483. * r A single precision integer.
  44484. * a Byte array.
  44485. */
  44486. static void sp_4096_to_bin_128(sp_digit* r, byte* a)
  44487. {
  44488. int i;
  44489. int j = 0;
  44490. for (i = 127; i >= 0; i--) {
  44491. a[j++] = r[i] >> 24;
  44492. a[j++] = r[i] >> 16;
  44493. a[j++] = r[i] >> 8;
  44494. a[j++] = r[i] >> 0;
  44495. }
  44496. }
  44497. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  44498. /* Normalize the values in each word to 32.
  44499. *
  44500. * a Array of sp_digit to normalize.
  44501. */
  44502. #define sp_4096_norm_128(a)
  44503. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  44504. /* Normalize the values in each word to 32.
  44505. *
  44506. * a Array of sp_digit to normalize.
  44507. */
  44508. #define sp_4096_norm_128(a)
  44509. #ifndef WOLFSSL_SP_SMALL
  44510. /* Sub b from a into a. (a -= b)
  44511. *
  44512. * a A single precision integer and result.
  44513. * b A single precision integer.
  44514. */
  44515. static sp_digit sp_4096_sub_in_place_128(sp_digit* a_p, const sp_digit* b_p)
  44516. {
  44517. register sp_digit* a asm ("r0") = a_p;
  44518. register const sp_digit* b asm ("r1") = b_p;
  44519. __asm__ __volatile__ (
  44520. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44521. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44522. "subs r2, r2, r6\n\t"
  44523. "sbcs r3, r3, r7\n\t"
  44524. "sbcs r4, r4, r8\n\t"
  44525. "sbcs r5, r5, r9\n\t"
  44526. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44527. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44528. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44529. "sbcs r2, r2, r6\n\t"
  44530. "sbcs r3, r3, r7\n\t"
  44531. "sbcs r4, r4, r8\n\t"
  44532. "sbcs r5, r5, r9\n\t"
  44533. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44534. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44535. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44536. "sbcs r2, r2, r6\n\t"
  44537. "sbcs r3, r3, r7\n\t"
  44538. "sbcs r4, r4, r8\n\t"
  44539. "sbcs r5, r5, r9\n\t"
  44540. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44541. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44542. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44543. "sbcs r2, r2, r6\n\t"
  44544. "sbcs r3, r3, r7\n\t"
  44545. "sbcs r4, r4, r8\n\t"
  44546. "sbcs r5, r5, r9\n\t"
  44547. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44548. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44549. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44550. "sbcs r2, r2, r6\n\t"
  44551. "sbcs r3, r3, r7\n\t"
  44552. "sbcs r4, r4, r8\n\t"
  44553. "sbcs r5, r5, r9\n\t"
  44554. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44555. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44556. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44557. "sbcs r2, r2, r6\n\t"
  44558. "sbcs r3, r3, r7\n\t"
  44559. "sbcs r4, r4, r8\n\t"
  44560. "sbcs r5, r5, r9\n\t"
  44561. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44562. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44563. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44564. "sbcs r2, r2, r6\n\t"
  44565. "sbcs r3, r3, r7\n\t"
  44566. "sbcs r4, r4, r8\n\t"
  44567. "sbcs r5, r5, r9\n\t"
  44568. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44569. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44570. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44571. "sbcs r2, r2, r6\n\t"
  44572. "sbcs r3, r3, r7\n\t"
  44573. "sbcs r4, r4, r8\n\t"
  44574. "sbcs r5, r5, r9\n\t"
  44575. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44576. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44577. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44578. "sbcs r2, r2, r6\n\t"
  44579. "sbcs r3, r3, r7\n\t"
  44580. "sbcs r4, r4, r8\n\t"
  44581. "sbcs r5, r5, r9\n\t"
  44582. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44583. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44584. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44585. "sbcs r2, r2, r6\n\t"
  44586. "sbcs r3, r3, r7\n\t"
  44587. "sbcs r4, r4, r8\n\t"
  44588. "sbcs r5, r5, r9\n\t"
  44589. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44590. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44591. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44592. "sbcs r2, r2, r6\n\t"
  44593. "sbcs r3, r3, r7\n\t"
  44594. "sbcs r4, r4, r8\n\t"
  44595. "sbcs r5, r5, r9\n\t"
  44596. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44597. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44598. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44599. "sbcs r2, r2, r6\n\t"
  44600. "sbcs r3, r3, r7\n\t"
  44601. "sbcs r4, r4, r8\n\t"
  44602. "sbcs r5, r5, r9\n\t"
  44603. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44604. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44605. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44606. "sbcs r2, r2, r6\n\t"
  44607. "sbcs r3, r3, r7\n\t"
  44608. "sbcs r4, r4, r8\n\t"
  44609. "sbcs r5, r5, r9\n\t"
  44610. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44611. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44612. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44613. "sbcs r2, r2, r6\n\t"
  44614. "sbcs r3, r3, r7\n\t"
  44615. "sbcs r4, r4, r8\n\t"
  44616. "sbcs r5, r5, r9\n\t"
  44617. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44618. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44619. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44620. "sbcs r2, r2, r6\n\t"
  44621. "sbcs r3, r3, r7\n\t"
  44622. "sbcs r4, r4, r8\n\t"
  44623. "sbcs r5, r5, r9\n\t"
  44624. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44625. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44626. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44627. "sbcs r2, r2, r6\n\t"
  44628. "sbcs r3, r3, r7\n\t"
  44629. "sbcs r4, r4, r8\n\t"
  44630. "sbcs r5, r5, r9\n\t"
  44631. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44632. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44633. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44634. "sbcs r2, r2, r6\n\t"
  44635. "sbcs r3, r3, r7\n\t"
  44636. "sbcs r4, r4, r8\n\t"
  44637. "sbcs r5, r5, r9\n\t"
  44638. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44639. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44640. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44641. "sbcs r2, r2, r6\n\t"
  44642. "sbcs r3, r3, r7\n\t"
  44643. "sbcs r4, r4, r8\n\t"
  44644. "sbcs r5, r5, r9\n\t"
  44645. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44646. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44647. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44648. "sbcs r2, r2, r6\n\t"
  44649. "sbcs r3, r3, r7\n\t"
  44650. "sbcs r4, r4, r8\n\t"
  44651. "sbcs r5, r5, r9\n\t"
  44652. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44653. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44654. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44655. "sbcs r2, r2, r6\n\t"
  44656. "sbcs r3, r3, r7\n\t"
  44657. "sbcs r4, r4, r8\n\t"
  44658. "sbcs r5, r5, r9\n\t"
  44659. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44660. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44661. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44662. "sbcs r2, r2, r6\n\t"
  44663. "sbcs r3, r3, r7\n\t"
  44664. "sbcs r4, r4, r8\n\t"
  44665. "sbcs r5, r5, r9\n\t"
  44666. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44667. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44668. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44669. "sbcs r2, r2, r6\n\t"
  44670. "sbcs r3, r3, r7\n\t"
  44671. "sbcs r4, r4, r8\n\t"
  44672. "sbcs r5, r5, r9\n\t"
  44673. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44674. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44675. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44676. "sbcs r2, r2, r6\n\t"
  44677. "sbcs r3, r3, r7\n\t"
  44678. "sbcs r4, r4, r8\n\t"
  44679. "sbcs r5, r5, r9\n\t"
  44680. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44681. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44682. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44683. "sbcs r2, r2, r6\n\t"
  44684. "sbcs r3, r3, r7\n\t"
  44685. "sbcs r4, r4, r8\n\t"
  44686. "sbcs r5, r5, r9\n\t"
  44687. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44688. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44689. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44690. "sbcs r2, r2, r6\n\t"
  44691. "sbcs r3, r3, r7\n\t"
  44692. "sbcs r4, r4, r8\n\t"
  44693. "sbcs r5, r5, r9\n\t"
  44694. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44695. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44696. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44697. "sbcs r2, r2, r6\n\t"
  44698. "sbcs r3, r3, r7\n\t"
  44699. "sbcs r4, r4, r8\n\t"
  44700. "sbcs r5, r5, r9\n\t"
  44701. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44702. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44703. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44704. "sbcs r2, r2, r6\n\t"
  44705. "sbcs r3, r3, r7\n\t"
  44706. "sbcs r4, r4, r8\n\t"
  44707. "sbcs r5, r5, r9\n\t"
  44708. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44709. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44710. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44711. "sbcs r2, r2, r6\n\t"
  44712. "sbcs r3, r3, r7\n\t"
  44713. "sbcs r4, r4, r8\n\t"
  44714. "sbcs r5, r5, r9\n\t"
  44715. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44716. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44717. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44718. "sbcs r2, r2, r6\n\t"
  44719. "sbcs r3, r3, r7\n\t"
  44720. "sbcs r4, r4, r8\n\t"
  44721. "sbcs r5, r5, r9\n\t"
  44722. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44723. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44724. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44725. "sbcs r2, r2, r6\n\t"
  44726. "sbcs r3, r3, r7\n\t"
  44727. "sbcs r4, r4, r8\n\t"
  44728. "sbcs r5, r5, r9\n\t"
  44729. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44730. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44731. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44732. "sbcs r2, r2, r6\n\t"
  44733. "sbcs r3, r3, r7\n\t"
  44734. "sbcs r4, r4, r8\n\t"
  44735. "sbcs r5, r5, r9\n\t"
  44736. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44737. "ldm %[a], {r2, r3, r4, r5}\n\t"
  44738. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  44739. "sbcs r2, r2, r6\n\t"
  44740. "sbcs r3, r3, r7\n\t"
  44741. "sbcs r4, r4, r8\n\t"
  44742. "sbcs r5, r5, r9\n\t"
  44743. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  44744. "sbc %[a], r9, r9\n\t"
  44745. : [a] "+r" (a), [b] "+r" (b)
  44746. :
  44747. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  44748. );
  44749. return (uint32_t)(size_t)a;
  44750. }
  44751. /* Add b to a into r. (r = a + b)
  44752. *
  44753. * r A single precision integer.
  44754. * a A single precision integer.
  44755. * b A single precision integer.
  44756. */
  44757. static sp_digit sp_4096_add_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  44758. {
  44759. register sp_digit* r asm ("r0") = r_p;
  44760. register const sp_digit* a asm ("r1") = a_p;
  44761. register const sp_digit* b asm ("r2") = b_p;
  44762. __asm__ __volatile__ (
  44763. "mov r12, #0\n\t"
  44764. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44765. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44766. "adds r3, r3, r7\n\t"
  44767. "adcs r4, r4, r8\n\t"
  44768. "adcs r5, r5, r9\n\t"
  44769. "adcs r6, r6, r10\n\t"
  44770. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44771. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44772. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44773. "adcs r3, r3, r7\n\t"
  44774. "adcs r4, r4, r8\n\t"
  44775. "adcs r5, r5, r9\n\t"
  44776. "adcs r6, r6, r10\n\t"
  44777. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44778. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44779. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44780. "adcs r3, r3, r7\n\t"
  44781. "adcs r4, r4, r8\n\t"
  44782. "adcs r5, r5, r9\n\t"
  44783. "adcs r6, r6, r10\n\t"
  44784. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44785. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44786. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44787. "adcs r3, r3, r7\n\t"
  44788. "adcs r4, r4, r8\n\t"
  44789. "adcs r5, r5, r9\n\t"
  44790. "adcs r6, r6, r10\n\t"
  44791. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44792. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44793. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44794. "adcs r3, r3, r7\n\t"
  44795. "adcs r4, r4, r8\n\t"
  44796. "adcs r5, r5, r9\n\t"
  44797. "adcs r6, r6, r10\n\t"
  44798. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44799. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44800. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44801. "adcs r3, r3, r7\n\t"
  44802. "adcs r4, r4, r8\n\t"
  44803. "adcs r5, r5, r9\n\t"
  44804. "adcs r6, r6, r10\n\t"
  44805. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44806. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44807. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44808. "adcs r3, r3, r7\n\t"
  44809. "adcs r4, r4, r8\n\t"
  44810. "adcs r5, r5, r9\n\t"
  44811. "adcs r6, r6, r10\n\t"
  44812. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44813. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44814. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44815. "adcs r3, r3, r7\n\t"
  44816. "adcs r4, r4, r8\n\t"
  44817. "adcs r5, r5, r9\n\t"
  44818. "adcs r6, r6, r10\n\t"
  44819. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44820. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44821. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44822. "adcs r3, r3, r7\n\t"
  44823. "adcs r4, r4, r8\n\t"
  44824. "adcs r5, r5, r9\n\t"
  44825. "adcs r6, r6, r10\n\t"
  44826. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44827. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44828. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44829. "adcs r3, r3, r7\n\t"
  44830. "adcs r4, r4, r8\n\t"
  44831. "adcs r5, r5, r9\n\t"
  44832. "adcs r6, r6, r10\n\t"
  44833. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44834. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44835. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44836. "adcs r3, r3, r7\n\t"
  44837. "adcs r4, r4, r8\n\t"
  44838. "adcs r5, r5, r9\n\t"
  44839. "adcs r6, r6, r10\n\t"
  44840. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44841. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44842. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44843. "adcs r3, r3, r7\n\t"
  44844. "adcs r4, r4, r8\n\t"
  44845. "adcs r5, r5, r9\n\t"
  44846. "adcs r6, r6, r10\n\t"
  44847. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44848. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44849. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44850. "adcs r3, r3, r7\n\t"
  44851. "adcs r4, r4, r8\n\t"
  44852. "adcs r5, r5, r9\n\t"
  44853. "adcs r6, r6, r10\n\t"
  44854. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44855. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44856. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44857. "adcs r3, r3, r7\n\t"
  44858. "adcs r4, r4, r8\n\t"
  44859. "adcs r5, r5, r9\n\t"
  44860. "adcs r6, r6, r10\n\t"
  44861. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44862. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44863. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44864. "adcs r3, r3, r7\n\t"
  44865. "adcs r4, r4, r8\n\t"
  44866. "adcs r5, r5, r9\n\t"
  44867. "adcs r6, r6, r10\n\t"
  44868. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44869. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44870. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44871. "adcs r3, r3, r7\n\t"
  44872. "adcs r4, r4, r8\n\t"
  44873. "adcs r5, r5, r9\n\t"
  44874. "adcs r6, r6, r10\n\t"
  44875. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44876. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44877. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44878. "adcs r3, r3, r7\n\t"
  44879. "adcs r4, r4, r8\n\t"
  44880. "adcs r5, r5, r9\n\t"
  44881. "adcs r6, r6, r10\n\t"
  44882. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44883. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44884. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44885. "adcs r3, r3, r7\n\t"
  44886. "adcs r4, r4, r8\n\t"
  44887. "adcs r5, r5, r9\n\t"
  44888. "adcs r6, r6, r10\n\t"
  44889. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44890. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44891. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44892. "adcs r3, r3, r7\n\t"
  44893. "adcs r4, r4, r8\n\t"
  44894. "adcs r5, r5, r9\n\t"
  44895. "adcs r6, r6, r10\n\t"
  44896. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44897. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44898. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44899. "adcs r3, r3, r7\n\t"
  44900. "adcs r4, r4, r8\n\t"
  44901. "adcs r5, r5, r9\n\t"
  44902. "adcs r6, r6, r10\n\t"
  44903. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44904. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44905. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44906. "adcs r3, r3, r7\n\t"
  44907. "adcs r4, r4, r8\n\t"
  44908. "adcs r5, r5, r9\n\t"
  44909. "adcs r6, r6, r10\n\t"
  44910. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44911. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44912. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44913. "adcs r3, r3, r7\n\t"
  44914. "adcs r4, r4, r8\n\t"
  44915. "adcs r5, r5, r9\n\t"
  44916. "adcs r6, r6, r10\n\t"
  44917. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44918. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44919. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44920. "adcs r3, r3, r7\n\t"
  44921. "adcs r4, r4, r8\n\t"
  44922. "adcs r5, r5, r9\n\t"
  44923. "adcs r6, r6, r10\n\t"
  44924. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44925. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44926. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44927. "adcs r3, r3, r7\n\t"
  44928. "adcs r4, r4, r8\n\t"
  44929. "adcs r5, r5, r9\n\t"
  44930. "adcs r6, r6, r10\n\t"
  44931. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44932. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44933. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44934. "adcs r3, r3, r7\n\t"
  44935. "adcs r4, r4, r8\n\t"
  44936. "adcs r5, r5, r9\n\t"
  44937. "adcs r6, r6, r10\n\t"
  44938. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44939. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44940. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44941. "adcs r3, r3, r7\n\t"
  44942. "adcs r4, r4, r8\n\t"
  44943. "adcs r5, r5, r9\n\t"
  44944. "adcs r6, r6, r10\n\t"
  44945. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44946. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44947. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44948. "adcs r3, r3, r7\n\t"
  44949. "adcs r4, r4, r8\n\t"
  44950. "adcs r5, r5, r9\n\t"
  44951. "adcs r6, r6, r10\n\t"
  44952. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44953. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44954. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44955. "adcs r3, r3, r7\n\t"
  44956. "adcs r4, r4, r8\n\t"
  44957. "adcs r5, r5, r9\n\t"
  44958. "adcs r6, r6, r10\n\t"
  44959. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44960. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44961. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44962. "adcs r3, r3, r7\n\t"
  44963. "adcs r4, r4, r8\n\t"
  44964. "adcs r5, r5, r9\n\t"
  44965. "adcs r6, r6, r10\n\t"
  44966. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44967. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44968. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44969. "adcs r3, r3, r7\n\t"
  44970. "adcs r4, r4, r8\n\t"
  44971. "adcs r5, r5, r9\n\t"
  44972. "adcs r6, r6, r10\n\t"
  44973. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44974. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44975. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44976. "adcs r3, r3, r7\n\t"
  44977. "adcs r4, r4, r8\n\t"
  44978. "adcs r5, r5, r9\n\t"
  44979. "adcs r6, r6, r10\n\t"
  44980. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44981. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  44982. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  44983. "adcs r3, r3, r7\n\t"
  44984. "adcs r4, r4, r8\n\t"
  44985. "adcs r5, r5, r9\n\t"
  44986. "adcs r6, r6, r10\n\t"
  44987. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  44988. "adc %[r], r12, r12\n\t"
  44989. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  44990. :
  44991. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  44992. );
  44993. return (uint32_t)(size_t)r;
  44994. }
  44995. /* Multiply a and b into r. (r = a * b)
  44996. *
  44997. * r A single precision integer.
  44998. * a A single precision integer.
  44999. * b A single precision integer.
  45000. */
  45001. SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a,
  45002. const sp_digit* b)
  45003. {
  45004. sp_digit* z0 = r;
  45005. sp_digit z1[128];
  45006. sp_digit a1[64];
  45007. sp_digit b1[64];
  45008. sp_digit* z2 = r + 128;
  45009. sp_digit u;
  45010. sp_digit ca;
  45011. sp_digit cb;
  45012. ca = sp_2048_add_64(a1, a, &a[64]);
  45013. cb = sp_2048_add_64(b1, b, &b[64]);
  45014. u = ca & cb;
  45015. sp_2048_mul_64(z2, &a[64], &b[64]);
  45016. sp_2048_mul_64(z0, a, b);
  45017. sp_2048_mul_64(z1, a1, b1);
  45018. u += sp_4096_sub_in_place_128(z1, z0);
  45019. u += sp_4096_sub_in_place_128(z1, z2);
  45020. sp_2048_mask_64(a1, a1, 0 - cb);
  45021. u += sp_2048_add_64(z1 + 64, z1 + 64, a1);
  45022. sp_2048_mask_64(b1, b1, 0 - ca);
  45023. u += sp_2048_add_64(z1 + 64, z1 + 64, b1);
  45024. u += sp_4096_add_128(r + 64, r + 64, z1);
  45025. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (64 - 1));
  45026. a1[0] = u;
  45027. (void)sp_2048_add_64(r + 192, r + 192, a1);
  45028. }
  45029. /* Square a and put result in r. (r = a * a)
  45030. *
  45031. * r A single precision integer.
  45032. * a A single precision integer.
  45033. */
  45034. SP_NOINLINE static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a)
  45035. {
  45036. sp_digit* z0 = r;
  45037. sp_digit* z2 = r + 128;
  45038. sp_digit z1[128];
  45039. sp_digit* a1 = z1;
  45040. sp_digit zero[64];
  45041. sp_digit u;
  45042. sp_digit mask;
  45043. sp_digit* p1;
  45044. sp_digit* p2;
  45045. XMEMSET(zero, 0, sizeof(sp_digit) * 64);
  45046. mask = sp_2048_sub_64(a1, a, &a[64]);
  45047. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  45048. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  45049. (void)sp_2048_sub_64(a1, p1, p2);
  45050. sp_2048_sqr_64(z2, &a[64]);
  45051. sp_2048_sqr_64(z0, a);
  45052. sp_2048_sqr_64(z1, a1);
  45053. u = 0;
  45054. u -= sp_4096_sub_in_place_128(z1, z2);
  45055. u -= sp_4096_sub_in_place_128(z1, z0);
  45056. u += sp_4096_sub_in_place_128(r + 64, z1);
  45057. zero[0] = u;
  45058. (void)sp_2048_add_64(r + 192, r + 192, zero);
  45059. }
  45060. #endif /* !WOLFSSL_SP_SMALL */
  45061. #ifdef WOLFSSL_SP_SMALL
  45062. /* Add b to a into r. (r = a + b)
  45063. *
  45064. * r A single precision integer.
  45065. * a A single precision integer.
  45066. * b A single precision integer.
  45067. */
  45068. static sp_digit sp_4096_add_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  45069. {
  45070. register sp_digit* r asm ("r0") = r_p;
  45071. register const sp_digit* a asm ("r1") = a_p;
  45072. register const sp_digit* b asm ("r2") = b_p;
  45073. __asm__ __volatile__ (
  45074. "mov r3, #0\n\t"
  45075. "add r12, %[a], #0x200\n\t"
  45076. "\n"
  45077. "L_sp_4096_add_128_word_%=: \n\t"
  45078. "adds r3, r3, #-1\n\t"
  45079. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  45080. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  45081. "adcs r4, r4, r8\n\t"
  45082. "adcs r5, r5, r9\n\t"
  45083. "adcs r6, r6, r10\n\t"
  45084. "adcs r7, r7, r11\n\t"
  45085. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  45086. "mov r4, #0\n\t"
  45087. "adc r3, r4, #0\n\t"
  45088. "cmp %[a], r12\n\t"
  45089. "bne L_sp_4096_add_128_word_%=\n\t"
  45090. "mov %[r], r3\n\t"
  45091. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  45092. :
  45093. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  45094. );
  45095. return (uint32_t)(size_t)r;
  45096. }
  45097. #endif /* WOLFSSL_SP_SMALL */
  45098. #ifdef WOLFSSL_SP_SMALL
  45099. /* Sub b from a into a. (a -= b)
  45100. *
  45101. * a A single precision integer.
  45102. * b A single precision integer.
  45103. */
  45104. static sp_digit sp_4096_sub_in_place_128(sp_digit* a_p, const sp_digit* b_p)
  45105. {
  45106. register sp_digit* a asm ("r0") = a_p;
  45107. register const sp_digit* b asm ("r1") = b_p;
  45108. __asm__ __volatile__ (
  45109. "mov r10, #0\n\t"
  45110. "mov r12, #0\n\t"
  45111. "add lr, %[a], #0x200\n\t"
  45112. "\n"
  45113. "L_sp_4096_sub_in_pkace_128_word_%=: \n\t"
  45114. "subs r12, r10, r12\n\t"
  45115. "ldm %[a], {r2, r3, r4, r5}\n\t"
  45116. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  45117. "sbcs r2, r2, r6\n\t"
  45118. "sbcs r3, r3, r7\n\t"
  45119. "sbcs r4, r4, r8\n\t"
  45120. "sbcs r5, r5, r9\n\t"
  45121. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  45122. "sbc r12, r10, r10\n\t"
  45123. "cmp %[a], lr\n\t"
  45124. "bne L_sp_4096_sub_in_pkace_128_word_%=\n\t"
  45125. "mov %[a], r12\n\t"
  45126. : [a] "+r" (a), [b] "+r" (b)
  45127. :
  45128. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10"
  45129. );
  45130. return (uint32_t)(size_t)a;
  45131. }
  45132. #endif /* WOLFSSL_SP_SMALL */
  45133. #ifdef WOLFSSL_SP_SMALL
  45134. /* Multiply a and b into r. (r = a * b)
  45135. *
  45136. * r A single precision integer.
  45137. * a A single precision integer.
  45138. * b A single precision integer.
  45139. */
  45140. static void sp_4096_mul_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  45141. {
  45142. register sp_digit* r asm ("r0") = r_p;
  45143. register const sp_digit* a asm ("r1") = a_p;
  45144. register const sp_digit* b asm ("r2") = b_p;
  45145. __asm__ __volatile__ (
  45146. "sub sp, sp, #0x400\n\t"
  45147. "mov r5, #0\n\t"
  45148. "mov r6, #0\n\t"
  45149. "mov r7, #0\n\t"
  45150. "mov r8, #0\n\t"
  45151. "\n"
  45152. "L_sp_4096_mul_128_outer_%=: \n\t"
  45153. "subs r3, r5, #0x1fc\n\t"
  45154. "it cc\n\t"
  45155. "movcc r3, #0\n\t"
  45156. "sub r4, r5, r3\n\t"
  45157. "\n"
  45158. "L_sp_4096_mul_128_inner_%=: \n\t"
  45159. "ldr lr, [%[a], r3]\n\t"
  45160. "ldr r11, [%[b], r4]\n\t"
  45161. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45162. "lsl r9, lr, #16\n\t"
  45163. "lsl r10, r11, #16\n\t"
  45164. "lsr r9, r9, #16\n\t"
  45165. "lsr r10, r10, #16\n\t"
  45166. "mul r10, r9, r10\n\t"
  45167. "adds r6, r6, r10\n\t"
  45168. "adcs r7, r7, #0\n\t"
  45169. "adc r8, r8, #0\n\t"
  45170. "lsr r10, r11, #16\n\t"
  45171. "mul r9, r10, r9\n\t"
  45172. "lsr r10, r9, #16\n\t"
  45173. "lsl r9, r9, #16\n\t"
  45174. "adds r6, r6, r9\n\t"
  45175. "adcs r7, r7, r10\n\t"
  45176. "adc r8, r8, #0\n\t"
  45177. "lsr r9, lr, #16\n\t"
  45178. "lsr r10, r11, #16\n\t"
  45179. "mul r10, r9, r10\n\t"
  45180. "adds r7, r7, r10\n\t"
  45181. "adc r8, r8, #0\n\t"
  45182. "lsl r10, r11, #16\n\t"
  45183. "lsr r10, r10, #16\n\t"
  45184. "mul r9, r10, r9\n\t"
  45185. "lsr r10, r9, #16\n\t"
  45186. "lsl r9, r9, #16\n\t"
  45187. "adds r6, r6, r9\n\t"
  45188. "adcs r7, r7, r10\n\t"
  45189. "adc r8, r8, #0\n\t"
  45190. #else
  45191. "umull r9, r10, lr, r11\n\t"
  45192. "adds r6, r6, r9\n\t"
  45193. "adcs r7, r7, r10\n\t"
  45194. "adc r8, r8, #0\n\t"
  45195. #endif
  45196. "add r3, r3, #4\n\t"
  45197. "sub r4, r4, #4\n\t"
  45198. "cmp r3, #0x200\n\t"
  45199. "beq L_sp_4096_mul_128_inner_done_%=\n\t"
  45200. "cmp r3, r5\n\t"
  45201. "ble L_sp_4096_mul_128_inner_%=\n\t"
  45202. "\n"
  45203. "L_sp_4096_mul_128_inner_done_%=: \n\t"
  45204. "str r6, [sp, r5]\n\t"
  45205. "mov r6, r7\n\t"
  45206. "mov r7, r8\n\t"
  45207. "mov r8, #0\n\t"
  45208. "add r5, r5, #4\n\t"
  45209. "cmp r5, #0x3f8\n\t"
  45210. "ble L_sp_4096_mul_128_outer_%=\n\t"
  45211. "str r6, [sp, r5]\n\t"
  45212. "\n"
  45213. "L_sp_4096_mul_128_store_%=: \n\t"
  45214. "ldm sp!, {r6, r7, r8, r9}\n\t"
  45215. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  45216. "subs r5, r5, #16\n\t"
  45217. "bgt L_sp_4096_mul_128_store_%=\n\t"
  45218. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  45219. :
  45220. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11"
  45221. );
  45222. }
  45223. /* Square a and put result in r. (r = a * a)
  45224. *
  45225. * r A single precision integer.
  45226. * a A single precision integer.
  45227. */
  45228. static void sp_4096_sqr_128(sp_digit* r_p, const sp_digit* a_p)
  45229. {
  45230. register sp_digit* r asm ("r0") = r_p;
  45231. register const sp_digit* a asm ("r1") = a_p;
  45232. __asm__ __volatile__ (
  45233. "sub sp, sp, #0x400\n\t"
  45234. "mov r12, #0\n\t"
  45235. "mov r6, #0\n\t"
  45236. "mov r7, #0\n\t"
  45237. "mov r8, #0\n\t"
  45238. "mov r5, #0\n\t"
  45239. "\n"
  45240. "L_sp_4096_sqr_128_outer_%=: \n\t"
  45241. "subs r3, r5, #0x1fc\n\t"
  45242. "it cc\n\t"
  45243. "movcc r3, r12\n\t"
  45244. "sub r4, r5, r3\n\t"
  45245. "\n"
  45246. "L_sp_4096_sqr_128_inner_%=: \n\t"
  45247. "cmp r4, r3\n\t"
  45248. "beq L_sp_4096_sqr_128_op_sqr_%=\n\t"
  45249. "ldr lr, [%[a], r3]\n\t"
  45250. "ldr r11, [%[a], r4]\n\t"
  45251. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45252. "lsl r9, lr, #16\n\t"
  45253. "lsl r10, r11, #16\n\t"
  45254. "lsr r9, r9, #16\n\t"
  45255. "lsr r10, r10, #16\n\t"
  45256. "mul r10, r9, r10\n\t"
  45257. "adds r6, r6, r10\n\t"
  45258. "adcs r7, r7, #0\n\t"
  45259. "adc r8, r8, #0\n\t"
  45260. "adds r6, r6, r10\n\t"
  45261. "adcs r7, r7, #0\n\t"
  45262. "adc r8, r8, #0\n\t"
  45263. "lsr r10, r11, #16\n\t"
  45264. "mul r9, r10, r9\n\t"
  45265. "lsr r10, r9, #16\n\t"
  45266. "lsl r9, r9, #16\n\t"
  45267. "adds r6, r6, r9\n\t"
  45268. "adcs r7, r7, r10\n\t"
  45269. "adc r8, r8, #0\n\t"
  45270. "adds r6, r6, r9\n\t"
  45271. "adcs r7, r7, r10\n\t"
  45272. "adc r8, r8, #0\n\t"
  45273. "lsr r9, lr, #16\n\t"
  45274. "lsr r10, r11, #16\n\t"
  45275. "mul r10, r9, r10\n\t"
  45276. "adds r7, r7, r10\n\t"
  45277. "adc r8, r8, #0\n\t"
  45278. "adds r7, r7, r10\n\t"
  45279. "adc r8, r8, #0\n\t"
  45280. "lsl r10, r11, #16\n\t"
  45281. "lsr r10, r10, #16\n\t"
  45282. "mul r9, r10, r9\n\t"
  45283. "lsr r10, r9, #16\n\t"
  45284. "lsl r9, r9, #16\n\t"
  45285. "adds r6, r6, r9\n\t"
  45286. "adcs r7, r7, r10\n\t"
  45287. "adc r8, r8, #0\n\t"
  45288. "adds r6, r6, r9\n\t"
  45289. "adcs r7, r7, r10\n\t"
  45290. "adc r8, r8, #0\n\t"
  45291. #else
  45292. "umull r9, r10, lr, r11\n\t"
  45293. "adds r6, r6, r9\n\t"
  45294. "adcs r7, r7, r10\n\t"
  45295. "adc r8, r8, #0\n\t"
  45296. "adds r6, r6, r9\n\t"
  45297. "adcs r7, r7, r10\n\t"
  45298. "adc r8, r8, #0\n\t"
  45299. #endif
  45300. "bal L_sp_4096_sqr_128_op_done_%=\n\t"
  45301. "\n"
  45302. "L_sp_4096_sqr_128_op_sqr_%=: \n\t"
  45303. "ldr lr, [%[a], r3]\n\t"
  45304. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45305. "lsl r9, lr, #16\n\t"
  45306. "lsr r10, lr, #16\n\t"
  45307. "lsr r9, r9, #16\n\t"
  45308. "mov r11, r9\n\t"
  45309. "mul r9, r11, r9\n\t"
  45310. "mov r11, r10\n\t"
  45311. "mul r10, r11, r10\n\t"
  45312. "adds r6, r6, r9\n\t"
  45313. "adcs r7, r7, r10\n\t"
  45314. "adc r8, r8, #0\n\t"
  45315. "lsr r10, lr, #16\n\t"
  45316. "lsl r9, lr, #16\n\t"
  45317. "lsr r9, r9, #16\n\t"
  45318. "mul r9, r10, r9\n\t"
  45319. "lsr r10, r9, #15\n\t"
  45320. "lsl r9, r9, #17\n\t"
  45321. "adds r6, r6, r9\n\t"
  45322. "adcs r7, r7, r10\n\t"
  45323. "adc r8, r8, #0\n\t"
  45324. #else
  45325. "umull r9, r10, lr, lr\n\t"
  45326. "adds r6, r6, r9\n\t"
  45327. "adcs r7, r7, r10\n\t"
  45328. "adc r8, r8, #0\n\t"
  45329. #endif
  45330. "\n"
  45331. "L_sp_4096_sqr_128_op_done_%=: \n\t"
  45332. "add r3, r3, #4\n\t"
  45333. "sub r4, r4, #4\n\t"
  45334. "cmp r3, #0x200\n\t"
  45335. "beq L_sp_4096_sqr_128_inner_done_%=\n\t"
  45336. "cmp r3, r4\n\t"
  45337. "bgt L_sp_4096_sqr_128_inner_done_%=\n\t"
  45338. "cmp r3, r5\n\t"
  45339. "ble L_sp_4096_sqr_128_inner_%=\n\t"
  45340. "\n"
  45341. "L_sp_4096_sqr_128_inner_done_%=: \n\t"
  45342. "str r6, [sp, r5]\n\t"
  45343. "mov r6, r7\n\t"
  45344. "mov r7, r8\n\t"
  45345. "mov r8, #0\n\t"
  45346. "add r5, r5, #4\n\t"
  45347. "cmp r5, #0x3f8\n\t"
  45348. "ble L_sp_4096_sqr_128_outer_%=\n\t"
  45349. "str r6, [sp, r5]\n\t"
  45350. "\n"
  45351. "L_sp_4096_sqr_128_store_%=: \n\t"
  45352. "ldm sp!, {r6, r7, r8, r9}\n\t"
  45353. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  45354. "subs r5, r5, #16\n\t"
  45355. "bgt L_sp_4096_sqr_128_store_%=\n\t"
  45356. : [r] "+r" (r), [a] "+r" (a)
  45357. :
  45358. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12"
  45359. );
  45360. }
  45361. #endif /* WOLFSSL_SP_SMALL */
  45362. /* Caclulate the bottom digit of -1/a mod 2^n.
  45363. *
  45364. * a A single precision number.
  45365. * rho Bottom word of inverse.
  45366. */
  45367. static void sp_4096_mont_setup(const sp_digit* a, sp_digit* rho)
  45368. {
  45369. sp_digit x;
  45370. sp_digit b;
  45371. b = a[0];
  45372. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  45373. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  45374. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  45375. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  45376. /* rho = -1/m mod b */
  45377. *rho = (sp_digit)0 - x;
  45378. }
  45379. #ifdef WOLFSSL_SP_SMALL
  45380. /* Mul a by digit b into r. (r = a * b)
  45381. *
  45382. * r A single precision integer.
  45383. * a A single precision integer.
  45384. * b A single precision digit.
  45385. */
  45386. static void sp_4096_mul_d_128(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  45387. {
  45388. register sp_digit* r asm ("r0") = r_p;
  45389. register const sp_digit* a asm ("r1") = a_p;
  45390. register sp_digit b asm ("r2") = b_p;
  45391. __asm__ __volatile__ (
  45392. "mov r10, #0\n\t"
  45393. /* A[0] * B */
  45394. "ldr r8, [%[a]]\n\t"
  45395. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45396. "lsl r6, %[b], #16\n\t"
  45397. "lsl r5, r8, #16\n\t"
  45398. "lsr r6, r6, #16\n\t"
  45399. "lsr r5, r5, #16\n\t"
  45400. "mul r5, r6, r5\n\t"
  45401. "lsr r7, r8, #16\n\t"
  45402. "mul r6, r7, r6\n\t"
  45403. "lsr r3, r6, #16\n\t"
  45404. "lsl r6, r6, #16\n\t"
  45405. "adds r5, r5, r6\n\t"
  45406. "adc r3, r3, #0\n\t"
  45407. "lsr r6, %[b], #16\n\t"
  45408. "mul r7, r6, r7\n\t"
  45409. "add r3, r3, r7\n\t"
  45410. "lsl r7, r8, #16\n\t"
  45411. "lsr r7, r7, #16\n\t"
  45412. "mul r6, r7, r6\n\t"
  45413. "lsr r7, r6, #16\n\t"
  45414. "lsl r6, r6, #16\n\t"
  45415. "adds r5, r5, r6\n\t"
  45416. "adc r3, r3, r7\n\t"
  45417. #else
  45418. "umull r5, r3, %[b], r8\n\t"
  45419. #endif
  45420. "mov r4, #0\n\t"
  45421. "str r5, [%[r]]\n\t"
  45422. "mov r5, #0\n\t"
  45423. "mov r9, #4\n\t"
  45424. "\n"
  45425. "L_sp_4096_mul_d_128_word_%=: \n\t"
  45426. /* A[i] * B */
  45427. "ldr r8, [%[a], r9]\n\t"
  45428. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45429. "lsl r6, %[b], #16\n\t"
  45430. "lsl r7, r8, #16\n\t"
  45431. "lsr r6, r6, #16\n\t"
  45432. "lsr r7, r7, #16\n\t"
  45433. "mul r7, r6, r7\n\t"
  45434. "adds r3, r3, r7\n\t"
  45435. "adcs r4, r4, #0\n\t"
  45436. "adc r5, r5, #0\n\t"
  45437. "lsr r7, r8, #16\n\t"
  45438. "mul r6, r7, r6\n\t"
  45439. "lsr r7, r6, #16\n\t"
  45440. "lsl r6, r6, #16\n\t"
  45441. "adds r3, r3, r6\n\t"
  45442. "adcs r4, r4, r7\n\t"
  45443. "adc r5, r5, #0\n\t"
  45444. "lsr r6, %[b], #16\n\t"
  45445. "lsr r7, r8, #16\n\t"
  45446. "mul r7, r6, r7\n\t"
  45447. "adds r4, r4, r7\n\t"
  45448. "adc r5, r5, #0\n\t"
  45449. "lsl r7, r8, #16\n\t"
  45450. "lsr r7, r7, #16\n\t"
  45451. "mul r6, r7, r6\n\t"
  45452. "lsr r7, r6, #16\n\t"
  45453. "lsl r6, r6, #16\n\t"
  45454. "adds r3, r3, r6\n\t"
  45455. "adcs r4, r4, r7\n\t"
  45456. "adc r5, r5, #0\n\t"
  45457. #else
  45458. "umull r6, r7, %[b], r8\n\t"
  45459. "adds r3, r3, r6\n\t"
  45460. "adcs r4, r4, r7\n\t"
  45461. "adc r5, r5, #0\n\t"
  45462. #endif
  45463. "str r3, [%[r], r9]\n\t"
  45464. "mov r3, r4\n\t"
  45465. "mov r4, r5\n\t"
  45466. "mov r5, #0\n\t"
  45467. "add r9, r9, #4\n\t"
  45468. "cmp r9, #0x200\n\t"
  45469. "blt L_sp_4096_mul_d_128_word_%=\n\t"
  45470. "str r3, [%[r], #512]\n\t"
  45471. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  45472. :
  45473. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  45474. );
  45475. }
  45476. #else
  45477. /* Mul a by digit b into r. (r = a * b)
  45478. *
  45479. * r A single precision integer.
  45480. * a A single precision integer.
  45481. * b A single precision digit.
  45482. */
  45483. static void sp_4096_mul_d_128(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  45484. {
  45485. register sp_digit* r asm ("r0") = r_p;
  45486. register const sp_digit* a asm ("r1") = a_p;
  45487. register sp_digit b asm ("r2") = b_p;
  45488. __asm__ __volatile__ (
  45489. "mov r10, #0\n\t"
  45490. /* A[0] * B */
  45491. "ldr r8, [%[a]], #4\n\t"
  45492. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45493. "lsl r6, %[b], #16\n\t"
  45494. "lsl r3, r8, #16\n\t"
  45495. "lsr r6, r6, #16\n\t"
  45496. "lsr r3, r3, #16\n\t"
  45497. "mul r3, r6, r3\n\t"
  45498. "lsr r7, r8, #16\n\t"
  45499. "mul r6, r7, r6\n\t"
  45500. "lsr r4, r6, #16\n\t"
  45501. "lsl r6, r6, #16\n\t"
  45502. "adds r3, r3, r6\n\t"
  45503. "adc r4, r4, #0\n\t"
  45504. "lsr r6, %[b], #16\n\t"
  45505. "mul r7, r6, r7\n\t"
  45506. "add r4, r4, r7\n\t"
  45507. "lsl r7, r8, #16\n\t"
  45508. "lsr r7, r7, #16\n\t"
  45509. "mul r6, r7, r6\n\t"
  45510. "lsr r7, r6, #16\n\t"
  45511. "lsl r6, r6, #16\n\t"
  45512. "adds r3, r3, r6\n\t"
  45513. "adc r4, r4, r7\n\t"
  45514. #else
  45515. "umull r3, r4, %[b], r8\n\t"
  45516. #endif
  45517. "mov r5, #0\n\t"
  45518. "str r3, [%[r]], #4\n\t"
  45519. /* A[1] * B */
  45520. "ldr r8, [%[a]], #4\n\t"
  45521. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45522. "lsl r6, %[b], #16\n\t"
  45523. "lsl r7, r8, #16\n\t"
  45524. "lsr r6, r6, #16\n\t"
  45525. "lsr r7, r7, #16\n\t"
  45526. "mul r7, r6, r7\n\t"
  45527. "adds r4, r4, r7\n\t"
  45528. "adcs r5, r5, #0\n\t"
  45529. "mov r3, #0\n\t"
  45530. "adc r3, r3, #0\n\t"
  45531. "lsr r7, r8, #16\n\t"
  45532. "mul r6, r7, r6\n\t"
  45533. "lsr r7, r6, #16\n\t"
  45534. "lsl r6, r6, #16\n\t"
  45535. "adds r4, r4, r6\n\t"
  45536. "adcs r5, r5, r7\n\t"
  45537. "adc r3, r3, #0\n\t"
  45538. "lsr r6, %[b], #16\n\t"
  45539. "lsr r7, r8, #16\n\t"
  45540. "mul r7, r6, r7\n\t"
  45541. "adds r5, r5, r7\n\t"
  45542. "adc r3, r3, #0\n\t"
  45543. "lsl r7, r8, #16\n\t"
  45544. "lsr r7, r7, #16\n\t"
  45545. "mul r6, r7, r6\n\t"
  45546. "lsr r7, r6, #16\n\t"
  45547. "lsl r6, r6, #16\n\t"
  45548. "adds r4, r4, r6\n\t"
  45549. "adcs r5, r5, r7\n\t"
  45550. "adc r3, r3, #0\n\t"
  45551. #else
  45552. "umull r6, r7, %[b], r8\n\t"
  45553. "adds r4, r4, r6\n\t"
  45554. "adcs r5, r5, r7\n\t"
  45555. "mov r3, #0\n\t"
  45556. "adc r3, r3, #0\n\t"
  45557. #endif
  45558. "str r4, [%[r]], #4\n\t"
  45559. /* A[2] * B */
  45560. "ldr r8, [%[a]], #4\n\t"
  45561. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45562. "lsl r6, %[b], #16\n\t"
  45563. "lsl r7, r8, #16\n\t"
  45564. "lsr r6, r6, #16\n\t"
  45565. "lsr r7, r7, #16\n\t"
  45566. "mul r7, r6, r7\n\t"
  45567. "adds r5, r5, r7\n\t"
  45568. "adcs r3, r3, #0\n\t"
  45569. "mov r4, #0\n\t"
  45570. "adc r4, r4, #0\n\t"
  45571. "lsr r7, r8, #16\n\t"
  45572. "mul r6, r7, r6\n\t"
  45573. "lsr r7, r6, #16\n\t"
  45574. "lsl r6, r6, #16\n\t"
  45575. "adds r5, r5, r6\n\t"
  45576. "adcs r3, r3, r7\n\t"
  45577. "adc r4, r4, #0\n\t"
  45578. "lsr r6, %[b], #16\n\t"
  45579. "lsr r7, r8, #16\n\t"
  45580. "mul r7, r6, r7\n\t"
  45581. "adds r3, r3, r7\n\t"
  45582. "adc r4, r4, #0\n\t"
  45583. "lsl r7, r8, #16\n\t"
  45584. "lsr r7, r7, #16\n\t"
  45585. "mul r6, r7, r6\n\t"
  45586. "lsr r7, r6, #16\n\t"
  45587. "lsl r6, r6, #16\n\t"
  45588. "adds r5, r5, r6\n\t"
  45589. "adcs r3, r3, r7\n\t"
  45590. "adc r4, r4, #0\n\t"
  45591. #else
  45592. "umull r6, r7, %[b], r8\n\t"
  45593. "adds r5, r5, r6\n\t"
  45594. "adcs r3, r3, r7\n\t"
  45595. "mov r4, #0\n\t"
  45596. "adc r4, r4, #0\n\t"
  45597. #endif
  45598. "str r5, [%[r]], #4\n\t"
  45599. /* A[3] * B */
  45600. "ldr r8, [%[a]], #4\n\t"
  45601. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45602. "lsl r6, %[b], #16\n\t"
  45603. "lsl r7, r8, #16\n\t"
  45604. "lsr r6, r6, #16\n\t"
  45605. "lsr r7, r7, #16\n\t"
  45606. "mul r7, r6, r7\n\t"
  45607. "adds r3, r3, r7\n\t"
  45608. "adcs r4, r4, #0\n\t"
  45609. "mov r5, #0\n\t"
  45610. "adc r5, r5, #0\n\t"
  45611. "lsr r7, r8, #16\n\t"
  45612. "mul r6, r7, r6\n\t"
  45613. "lsr r7, r6, #16\n\t"
  45614. "lsl r6, r6, #16\n\t"
  45615. "adds r3, r3, r6\n\t"
  45616. "adcs r4, r4, r7\n\t"
  45617. "adc r5, r5, #0\n\t"
  45618. "lsr r6, %[b], #16\n\t"
  45619. "lsr r7, r8, #16\n\t"
  45620. "mul r7, r6, r7\n\t"
  45621. "adds r4, r4, r7\n\t"
  45622. "adc r5, r5, #0\n\t"
  45623. "lsl r7, r8, #16\n\t"
  45624. "lsr r7, r7, #16\n\t"
  45625. "mul r6, r7, r6\n\t"
  45626. "lsr r7, r6, #16\n\t"
  45627. "lsl r6, r6, #16\n\t"
  45628. "adds r3, r3, r6\n\t"
  45629. "adcs r4, r4, r7\n\t"
  45630. "adc r5, r5, #0\n\t"
  45631. #else
  45632. "umull r6, r7, %[b], r8\n\t"
  45633. "adds r3, r3, r6\n\t"
  45634. "adcs r4, r4, r7\n\t"
  45635. "mov r5, #0\n\t"
  45636. "adc r5, r5, #0\n\t"
  45637. #endif
  45638. "str r3, [%[r]], #4\n\t"
  45639. /* A[4] * B */
  45640. "ldr r8, [%[a]], #4\n\t"
  45641. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45642. "lsl r6, %[b], #16\n\t"
  45643. "lsl r7, r8, #16\n\t"
  45644. "lsr r6, r6, #16\n\t"
  45645. "lsr r7, r7, #16\n\t"
  45646. "mul r7, r6, r7\n\t"
  45647. "adds r4, r4, r7\n\t"
  45648. "adcs r5, r5, #0\n\t"
  45649. "mov r3, #0\n\t"
  45650. "adc r3, r3, #0\n\t"
  45651. "lsr r7, r8, #16\n\t"
  45652. "mul r6, r7, r6\n\t"
  45653. "lsr r7, r6, #16\n\t"
  45654. "lsl r6, r6, #16\n\t"
  45655. "adds r4, r4, r6\n\t"
  45656. "adcs r5, r5, r7\n\t"
  45657. "adc r3, r3, #0\n\t"
  45658. "lsr r6, %[b], #16\n\t"
  45659. "lsr r7, r8, #16\n\t"
  45660. "mul r7, r6, r7\n\t"
  45661. "adds r5, r5, r7\n\t"
  45662. "adc r3, r3, #0\n\t"
  45663. "lsl r7, r8, #16\n\t"
  45664. "lsr r7, r7, #16\n\t"
  45665. "mul r6, r7, r6\n\t"
  45666. "lsr r7, r6, #16\n\t"
  45667. "lsl r6, r6, #16\n\t"
  45668. "adds r4, r4, r6\n\t"
  45669. "adcs r5, r5, r7\n\t"
  45670. "adc r3, r3, #0\n\t"
  45671. #else
  45672. "umull r6, r7, %[b], r8\n\t"
  45673. "adds r4, r4, r6\n\t"
  45674. "adcs r5, r5, r7\n\t"
  45675. "mov r3, #0\n\t"
  45676. "adc r3, r3, #0\n\t"
  45677. #endif
  45678. "str r4, [%[r]], #4\n\t"
  45679. /* A[5] * B */
  45680. "ldr r8, [%[a]], #4\n\t"
  45681. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45682. "lsl r6, %[b], #16\n\t"
  45683. "lsl r7, r8, #16\n\t"
  45684. "lsr r6, r6, #16\n\t"
  45685. "lsr r7, r7, #16\n\t"
  45686. "mul r7, r6, r7\n\t"
  45687. "adds r5, r5, r7\n\t"
  45688. "adcs r3, r3, #0\n\t"
  45689. "mov r4, #0\n\t"
  45690. "adc r4, r4, #0\n\t"
  45691. "lsr r7, r8, #16\n\t"
  45692. "mul r6, r7, r6\n\t"
  45693. "lsr r7, r6, #16\n\t"
  45694. "lsl r6, r6, #16\n\t"
  45695. "adds r5, r5, r6\n\t"
  45696. "adcs r3, r3, r7\n\t"
  45697. "adc r4, r4, #0\n\t"
  45698. "lsr r6, %[b], #16\n\t"
  45699. "lsr r7, r8, #16\n\t"
  45700. "mul r7, r6, r7\n\t"
  45701. "adds r3, r3, r7\n\t"
  45702. "adc r4, r4, #0\n\t"
  45703. "lsl r7, r8, #16\n\t"
  45704. "lsr r7, r7, #16\n\t"
  45705. "mul r6, r7, r6\n\t"
  45706. "lsr r7, r6, #16\n\t"
  45707. "lsl r6, r6, #16\n\t"
  45708. "adds r5, r5, r6\n\t"
  45709. "adcs r3, r3, r7\n\t"
  45710. "adc r4, r4, #0\n\t"
  45711. #else
  45712. "umull r6, r7, %[b], r8\n\t"
  45713. "adds r5, r5, r6\n\t"
  45714. "adcs r3, r3, r7\n\t"
  45715. "mov r4, #0\n\t"
  45716. "adc r4, r4, #0\n\t"
  45717. #endif
  45718. "str r5, [%[r]], #4\n\t"
  45719. /* A[6] * B */
  45720. "ldr r8, [%[a]], #4\n\t"
  45721. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45722. "lsl r6, %[b], #16\n\t"
  45723. "lsl r7, r8, #16\n\t"
  45724. "lsr r6, r6, #16\n\t"
  45725. "lsr r7, r7, #16\n\t"
  45726. "mul r7, r6, r7\n\t"
  45727. "adds r3, r3, r7\n\t"
  45728. "adcs r4, r4, #0\n\t"
  45729. "mov r5, #0\n\t"
  45730. "adc r5, r5, #0\n\t"
  45731. "lsr r7, r8, #16\n\t"
  45732. "mul r6, r7, r6\n\t"
  45733. "lsr r7, r6, #16\n\t"
  45734. "lsl r6, r6, #16\n\t"
  45735. "adds r3, r3, r6\n\t"
  45736. "adcs r4, r4, r7\n\t"
  45737. "adc r5, r5, #0\n\t"
  45738. "lsr r6, %[b], #16\n\t"
  45739. "lsr r7, r8, #16\n\t"
  45740. "mul r7, r6, r7\n\t"
  45741. "adds r4, r4, r7\n\t"
  45742. "adc r5, r5, #0\n\t"
  45743. "lsl r7, r8, #16\n\t"
  45744. "lsr r7, r7, #16\n\t"
  45745. "mul r6, r7, r6\n\t"
  45746. "lsr r7, r6, #16\n\t"
  45747. "lsl r6, r6, #16\n\t"
  45748. "adds r3, r3, r6\n\t"
  45749. "adcs r4, r4, r7\n\t"
  45750. "adc r5, r5, #0\n\t"
  45751. #else
  45752. "umull r6, r7, %[b], r8\n\t"
  45753. "adds r3, r3, r6\n\t"
  45754. "adcs r4, r4, r7\n\t"
  45755. "mov r5, #0\n\t"
  45756. "adc r5, r5, #0\n\t"
  45757. #endif
  45758. "str r3, [%[r]], #4\n\t"
  45759. /* A[7] * B */
  45760. "ldr r8, [%[a]], #4\n\t"
  45761. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45762. "lsl r6, %[b], #16\n\t"
  45763. "lsl r7, r8, #16\n\t"
  45764. "lsr r6, r6, #16\n\t"
  45765. "lsr r7, r7, #16\n\t"
  45766. "mul r7, r6, r7\n\t"
  45767. "adds r4, r4, r7\n\t"
  45768. "adcs r5, r5, #0\n\t"
  45769. "mov r3, #0\n\t"
  45770. "adc r3, r3, #0\n\t"
  45771. "lsr r7, r8, #16\n\t"
  45772. "mul r6, r7, r6\n\t"
  45773. "lsr r7, r6, #16\n\t"
  45774. "lsl r6, r6, #16\n\t"
  45775. "adds r4, r4, r6\n\t"
  45776. "adcs r5, r5, r7\n\t"
  45777. "adc r3, r3, #0\n\t"
  45778. "lsr r6, %[b], #16\n\t"
  45779. "lsr r7, r8, #16\n\t"
  45780. "mul r7, r6, r7\n\t"
  45781. "adds r5, r5, r7\n\t"
  45782. "adc r3, r3, #0\n\t"
  45783. "lsl r7, r8, #16\n\t"
  45784. "lsr r7, r7, #16\n\t"
  45785. "mul r6, r7, r6\n\t"
  45786. "lsr r7, r6, #16\n\t"
  45787. "lsl r6, r6, #16\n\t"
  45788. "adds r4, r4, r6\n\t"
  45789. "adcs r5, r5, r7\n\t"
  45790. "adc r3, r3, #0\n\t"
  45791. #else
  45792. "umull r6, r7, %[b], r8\n\t"
  45793. "adds r4, r4, r6\n\t"
  45794. "adcs r5, r5, r7\n\t"
  45795. "mov r3, #0\n\t"
  45796. "adc r3, r3, #0\n\t"
  45797. #endif
  45798. "str r4, [%[r]], #4\n\t"
  45799. /* A[8] * B */
  45800. "ldr r8, [%[a]], #4\n\t"
  45801. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45802. "lsl r6, %[b], #16\n\t"
  45803. "lsl r7, r8, #16\n\t"
  45804. "lsr r6, r6, #16\n\t"
  45805. "lsr r7, r7, #16\n\t"
  45806. "mul r7, r6, r7\n\t"
  45807. "adds r5, r5, r7\n\t"
  45808. "adcs r3, r3, #0\n\t"
  45809. "mov r4, #0\n\t"
  45810. "adc r4, r4, #0\n\t"
  45811. "lsr r7, r8, #16\n\t"
  45812. "mul r6, r7, r6\n\t"
  45813. "lsr r7, r6, #16\n\t"
  45814. "lsl r6, r6, #16\n\t"
  45815. "adds r5, r5, r6\n\t"
  45816. "adcs r3, r3, r7\n\t"
  45817. "adc r4, r4, #0\n\t"
  45818. "lsr r6, %[b], #16\n\t"
  45819. "lsr r7, r8, #16\n\t"
  45820. "mul r7, r6, r7\n\t"
  45821. "adds r3, r3, r7\n\t"
  45822. "adc r4, r4, #0\n\t"
  45823. "lsl r7, r8, #16\n\t"
  45824. "lsr r7, r7, #16\n\t"
  45825. "mul r6, r7, r6\n\t"
  45826. "lsr r7, r6, #16\n\t"
  45827. "lsl r6, r6, #16\n\t"
  45828. "adds r5, r5, r6\n\t"
  45829. "adcs r3, r3, r7\n\t"
  45830. "adc r4, r4, #0\n\t"
  45831. #else
  45832. "umull r6, r7, %[b], r8\n\t"
  45833. "adds r5, r5, r6\n\t"
  45834. "adcs r3, r3, r7\n\t"
  45835. "mov r4, #0\n\t"
  45836. "adc r4, r4, #0\n\t"
  45837. #endif
  45838. "str r5, [%[r]], #4\n\t"
  45839. /* A[9] * B */
  45840. "ldr r8, [%[a]], #4\n\t"
  45841. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45842. "lsl r6, %[b], #16\n\t"
  45843. "lsl r7, r8, #16\n\t"
  45844. "lsr r6, r6, #16\n\t"
  45845. "lsr r7, r7, #16\n\t"
  45846. "mul r7, r6, r7\n\t"
  45847. "adds r3, r3, r7\n\t"
  45848. "adcs r4, r4, #0\n\t"
  45849. "mov r5, #0\n\t"
  45850. "adc r5, r5, #0\n\t"
  45851. "lsr r7, r8, #16\n\t"
  45852. "mul r6, r7, r6\n\t"
  45853. "lsr r7, r6, #16\n\t"
  45854. "lsl r6, r6, #16\n\t"
  45855. "adds r3, r3, r6\n\t"
  45856. "adcs r4, r4, r7\n\t"
  45857. "adc r5, r5, #0\n\t"
  45858. "lsr r6, %[b], #16\n\t"
  45859. "lsr r7, r8, #16\n\t"
  45860. "mul r7, r6, r7\n\t"
  45861. "adds r4, r4, r7\n\t"
  45862. "adc r5, r5, #0\n\t"
  45863. "lsl r7, r8, #16\n\t"
  45864. "lsr r7, r7, #16\n\t"
  45865. "mul r6, r7, r6\n\t"
  45866. "lsr r7, r6, #16\n\t"
  45867. "lsl r6, r6, #16\n\t"
  45868. "adds r3, r3, r6\n\t"
  45869. "adcs r4, r4, r7\n\t"
  45870. "adc r5, r5, #0\n\t"
  45871. #else
  45872. "umull r6, r7, %[b], r8\n\t"
  45873. "adds r3, r3, r6\n\t"
  45874. "adcs r4, r4, r7\n\t"
  45875. "mov r5, #0\n\t"
  45876. "adc r5, r5, #0\n\t"
  45877. #endif
  45878. "str r3, [%[r]], #4\n\t"
  45879. /* A[10] * B */
  45880. "ldr r8, [%[a]], #4\n\t"
  45881. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45882. "lsl r6, %[b], #16\n\t"
  45883. "lsl r7, r8, #16\n\t"
  45884. "lsr r6, r6, #16\n\t"
  45885. "lsr r7, r7, #16\n\t"
  45886. "mul r7, r6, r7\n\t"
  45887. "adds r4, r4, r7\n\t"
  45888. "adcs r5, r5, #0\n\t"
  45889. "mov r3, #0\n\t"
  45890. "adc r3, r3, #0\n\t"
  45891. "lsr r7, r8, #16\n\t"
  45892. "mul r6, r7, r6\n\t"
  45893. "lsr r7, r6, #16\n\t"
  45894. "lsl r6, r6, #16\n\t"
  45895. "adds r4, r4, r6\n\t"
  45896. "adcs r5, r5, r7\n\t"
  45897. "adc r3, r3, #0\n\t"
  45898. "lsr r6, %[b], #16\n\t"
  45899. "lsr r7, r8, #16\n\t"
  45900. "mul r7, r6, r7\n\t"
  45901. "adds r5, r5, r7\n\t"
  45902. "adc r3, r3, #0\n\t"
  45903. "lsl r7, r8, #16\n\t"
  45904. "lsr r7, r7, #16\n\t"
  45905. "mul r6, r7, r6\n\t"
  45906. "lsr r7, r6, #16\n\t"
  45907. "lsl r6, r6, #16\n\t"
  45908. "adds r4, r4, r6\n\t"
  45909. "adcs r5, r5, r7\n\t"
  45910. "adc r3, r3, #0\n\t"
  45911. #else
  45912. "umull r6, r7, %[b], r8\n\t"
  45913. "adds r4, r4, r6\n\t"
  45914. "adcs r5, r5, r7\n\t"
  45915. "mov r3, #0\n\t"
  45916. "adc r3, r3, #0\n\t"
  45917. #endif
  45918. "str r4, [%[r]], #4\n\t"
  45919. /* A[11] * B */
  45920. "ldr r8, [%[a]], #4\n\t"
  45921. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45922. "lsl r6, %[b], #16\n\t"
  45923. "lsl r7, r8, #16\n\t"
  45924. "lsr r6, r6, #16\n\t"
  45925. "lsr r7, r7, #16\n\t"
  45926. "mul r7, r6, r7\n\t"
  45927. "adds r5, r5, r7\n\t"
  45928. "adcs r3, r3, #0\n\t"
  45929. "mov r4, #0\n\t"
  45930. "adc r4, r4, #0\n\t"
  45931. "lsr r7, r8, #16\n\t"
  45932. "mul r6, r7, r6\n\t"
  45933. "lsr r7, r6, #16\n\t"
  45934. "lsl r6, r6, #16\n\t"
  45935. "adds r5, r5, r6\n\t"
  45936. "adcs r3, r3, r7\n\t"
  45937. "adc r4, r4, #0\n\t"
  45938. "lsr r6, %[b], #16\n\t"
  45939. "lsr r7, r8, #16\n\t"
  45940. "mul r7, r6, r7\n\t"
  45941. "adds r3, r3, r7\n\t"
  45942. "adc r4, r4, #0\n\t"
  45943. "lsl r7, r8, #16\n\t"
  45944. "lsr r7, r7, #16\n\t"
  45945. "mul r6, r7, r6\n\t"
  45946. "lsr r7, r6, #16\n\t"
  45947. "lsl r6, r6, #16\n\t"
  45948. "adds r5, r5, r6\n\t"
  45949. "adcs r3, r3, r7\n\t"
  45950. "adc r4, r4, #0\n\t"
  45951. #else
  45952. "umull r6, r7, %[b], r8\n\t"
  45953. "adds r5, r5, r6\n\t"
  45954. "adcs r3, r3, r7\n\t"
  45955. "mov r4, #0\n\t"
  45956. "adc r4, r4, #0\n\t"
  45957. #endif
  45958. "str r5, [%[r]], #4\n\t"
  45959. /* A[12] * B */
  45960. "ldr r8, [%[a]], #4\n\t"
  45961. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  45962. "lsl r6, %[b], #16\n\t"
  45963. "lsl r7, r8, #16\n\t"
  45964. "lsr r6, r6, #16\n\t"
  45965. "lsr r7, r7, #16\n\t"
  45966. "mul r7, r6, r7\n\t"
  45967. "adds r3, r3, r7\n\t"
  45968. "adcs r4, r4, #0\n\t"
  45969. "mov r5, #0\n\t"
  45970. "adc r5, r5, #0\n\t"
  45971. "lsr r7, r8, #16\n\t"
  45972. "mul r6, r7, r6\n\t"
  45973. "lsr r7, r6, #16\n\t"
  45974. "lsl r6, r6, #16\n\t"
  45975. "adds r3, r3, r6\n\t"
  45976. "adcs r4, r4, r7\n\t"
  45977. "adc r5, r5, #0\n\t"
  45978. "lsr r6, %[b], #16\n\t"
  45979. "lsr r7, r8, #16\n\t"
  45980. "mul r7, r6, r7\n\t"
  45981. "adds r4, r4, r7\n\t"
  45982. "adc r5, r5, #0\n\t"
  45983. "lsl r7, r8, #16\n\t"
  45984. "lsr r7, r7, #16\n\t"
  45985. "mul r6, r7, r6\n\t"
  45986. "lsr r7, r6, #16\n\t"
  45987. "lsl r6, r6, #16\n\t"
  45988. "adds r3, r3, r6\n\t"
  45989. "adcs r4, r4, r7\n\t"
  45990. "adc r5, r5, #0\n\t"
  45991. #else
  45992. "umull r6, r7, %[b], r8\n\t"
  45993. "adds r3, r3, r6\n\t"
  45994. "adcs r4, r4, r7\n\t"
  45995. "mov r5, #0\n\t"
  45996. "adc r5, r5, #0\n\t"
  45997. #endif
  45998. "str r3, [%[r]], #4\n\t"
  45999. /* A[13] * B */
  46000. "ldr r8, [%[a]], #4\n\t"
  46001. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46002. "lsl r6, %[b], #16\n\t"
  46003. "lsl r7, r8, #16\n\t"
  46004. "lsr r6, r6, #16\n\t"
  46005. "lsr r7, r7, #16\n\t"
  46006. "mul r7, r6, r7\n\t"
  46007. "adds r4, r4, r7\n\t"
  46008. "adcs r5, r5, #0\n\t"
  46009. "mov r3, #0\n\t"
  46010. "adc r3, r3, #0\n\t"
  46011. "lsr r7, r8, #16\n\t"
  46012. "mul r6, r7, r6\n\t"
  46013. "lsr r7, r6, #16\n\t"
  46014. "lsl r6, r6, #16\n\t"
  46015. "adds r4, r4, r6\n\t"
  46016. "adcs r5, r5, r7\n\t"
  46017. "adc r3, r3, #0\n\t"
  46018. "lsr r6, %[b], #16\n\t"
  46019. "lsr r7, r8, #16\n\t"
  46020. "mul r7, r6, r7\n\t"
  46021. "adds r5, r5, r7\n\t"
  46022. "adc r3, r3, #0\n\t"
  46023. "lsl r7, r8, #16\n\t"
  46024. "lsr r7, r7, #16\n\t"
  46025. "mul r6, r7, r6\n\t"
  46026. "lsr r7, r6, #16\n\t"
  46027. "lsl r6, r6, #16\n\t"
  46028. "adds r4, r4, r6\n\t"
  46029. "adcs r5, r5, r7\n\t"
  46030. "adc r3, r3, #0\n\t"
  46031. #else
  46032. "umull r6, r7, %[b], r8\n\t"
  46033. "adds r4, r4, r6\n\t"
  46034. "adcs r5, r5, r7\n\t"
  46035. "mov r3, #0\n\t"
  46036. "adc r3, r3, #0\n\t"
  46037. #endif
  46038. "str r4, [%[r]], #4\n\t"
  46039. /* A[14] * B */
  46040. "ldr r8, [%[a]], #4\n\t"
  46041. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46042. "lsl r6, %[b], #16\n\t"
  46043. "lsl r7, r8, #16\n\t"
  46044. "lsr r6, r6, #16\n\t"
  46045. "lsr r7, r7, #16\n\t"
  46046. "mul r7, r6, r7\n\t"
  46047. "adds r5, r5, r7\n\t"
  46048. "adcs r3, r3, #0\n\t"
  46049. "mov r4, #0\n\t"
  46050. "adc r4, r4, #0\n\t"
  46051. "lsr r7, r8, #16\n\t"
  46052. "mul r6, r7, r6\n\t"
  46053. "lsr r7, r6, #16\n\t"
  46054. "lsl r6, r6, #16\n\t"
  46055. "adds r5, r5, r6\n\t"
  46056. "adcs r3, r3, r7\n\t"
  46057. "adc r4, r4, #0\n\t"
  46058. "lsr r6, %[b], #16\n\t"
  46059. "lsr r7, r8, #16\n\t"
  46060. "mul r7, r6, r7\n\t"
  46061. "adds r3, r3, r7\n\t"
  46062. "adc r4, r4, #0\n\t"
  46063. "lsl r7, r8, #16\n\t"
  46064. "lsr r7, r7, #16\n\t"
  46065. "mul r6, r7, r6\n\t"
  46066. "lsr r7, r6, #16\n\t"
  46067. "lsl r6, r6, #16\n\t"
  46068. "adds r5, r5, r6\n\t"
  46069. "adcs r3, r3, r7\n\t"
  46070. "adc r4, r4, #0\n\t"
  46071. #else
  46072. "umull r6, r7, %[b], r8\n\t"
  46073. "adds r5, r5, r6\n\t"
  46074. "adcs r3, r3, r7\n\t"
  46075. "mov r4, #0\n\t"
  46076. "adc r4, r4, #0\n\t"
  46077. #endif
  46078. "str r5, [%[r]], #4\n\t"
  46079. /* A[15] * B */
  46080. "ldr r8, [%[a]], #4\n\t"
  46081. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46082. "lsl r6, %[b], #16\n\t"
  46083. "lsl r7, r8, #16\n\t"
  46084. "lsr r6, r6, #16\n\t"
  46085. "lsr r7, r7, #16\n\t"
  46086. "mul r7, r6, r7\n\t"
  46087. "adds r3, r3, r7\n\t"
  46088. "adcs r4, r4, #0\n\t"
  46089. "mov r5, #0\n\t"
  46090. "adc r5, r5, #0\n\t"
  46091. "lsr r7, r8, #16\n\t"
  46092. "mul r6, r7, r6\n\t"
  46093. "lsr r7, r6, #16\n\t"
  46094. "lsl r6, r6, #16\n\t"
  46095. "adds r3, r3, r6\n\t"
  46096. "adcs r4, r4, r7\n\t"
  46097. "adc r5, r5, #0\n\t"
  46098. "lsr r6, %[b], #16\n\t"
  46099. "lsr r7, r8, #16\n\t"
  46100. "mul r7, r6, r7\n\t"
  46101. "adds r4, r4, r7\n\t"
  46102. "adc r5, r5, #0\n\t"
  46103. "lsl r7, r8, #16\n\t"
  46104. "lsr r7, r7, #16\n\t"
  46105. "mul r6, r7, r6\n\t"
  46106. "lsr r7, r6, #16\n\t"
  46107. "lsl r6, r6, #16\n\t"
  46108. "adds r3, r3, r6\n\t"
  46109. "adcs r4, r4, r7\n\t"
  46110. "adc r5, r5, #0\n\t"
  46111. #else
  46112. "umull r6, r7, %[b], r8\n\t"
  46113. "adds r3, r3, r6\n\t"
  46114. "adcs r4, r4, r7\n\t"
  46115. "mov r5, #0\n\t"
  46116. "adc r5, r5, #0\n\t"
  46117. #endif
  46118. "str r3, [%[r]], #4\n\t"
  46119. /* A[16] * B */
  46120. "ldr r8, [%[a]], #4\n\t"
  46121. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46122. "lsl r6, %[b], #16\n\t"
  46123. "lsl r7, r8, #16\n\t"
  46124. "lsr r6, r6, #16\n\t"
  46125. "lsr r7, r7, #16\n\t"
  46126. "mul r7, r6, r7\n\t"
  46127. "adds r4, r4, r7\n\t"
  46128. "adcs r5, r5, #0\n\t"
  46129. "mov r3, #0\n\t"
  46130. "adc r3, r3, #0\n\t"
  46131. "lsr r7, r8, #16\n\t"
  46132. "mul r6, r7, r6\n\t"
  46133. "lsr r7, r6, #16\n\t"
  46134. "lsl r6, r6, #16\n\t"
  46135. "adds r4, r4, r6\n\t"
  46136. "adcs r5, r5, r7\n\t"
  46137. "adc r3, r3, #0\n\t"
  46138. "lsr r6, %[b], #16\n\t"
  46139. "lsr r7, r8, #16\n\t"
  46140. "mul r7, r6, r7\n\t"
  46141. "adds r5, r5, r7\n\t"
  46142. "adc r3, r3, #0\n\t"
  46143. "lsl r7, r8, #16\n\t"
  46144. "lsr r7, r7, #16\n\t"
  46145. "mul r6, r7, r6\n\t"
  46146. "lsr r7, r6, #16\n\t"
  46147. "lsl r6, r6, #16\n\t"
  46148. "adds r4, r4, r6\n\t"
  46149. "adcs r5, r5, r7\n\t"
  46150. "adc r3, r3, #0\n\t"
  46151. #else
  46152. "umull r6, r7, %[b], r8\n\t"
  46153. "adds r4, r4, r6\n\t"
  46154. "adcs r5, r5, r7\n\t"
  46155. "mov r3, #0\n\t"
  46156. "adc r3, r3, #0\n\t"
  46157. #endif
  46158. "str r4, [%[r]], #4\n\t"
  46159. /* A[17] * B */
  46160. "ldr r8, [%[a]], #4\n\t"
  46161. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46162. "lsl r6, %[b], #16\n\t"
  46163. "lsl r7, r8, #16\n\t"
  46164. "lsr r6, r6, #16\n\t"
  46165. "lsr r7, r7, #16\n\t"
  46166. "mul r7, r6, r7\n\t"
  46167. "adds r5, r5, r7\n\t"
  46168. "adcs r3, r3, #0\n\t"
  46169. "mov r4, #0\n\t"
  46170. "adc r4, r4, #0\n\t"
  46171. "lsr r7, r8, #16\n\t"
  46172. "mul r6, r7, r6\n\t"
  46173. "lsr r7, r6, #16\n\t"
  46174. "lsl r6, r6, #16\n\t"
  46175. "adds r5, r5, r6\n\t"
  46176. "adcs r3, r3, r7\n\t"
  46177. "adc r4, r4, #0\n\t"
  46178. "lsr r6, %[b], #16\n\t"
  46179. "lsr r7, r8, #16\n\t"
  46180. "mul r7, r6, r7\n\t"
  46181. "adds r3, r3, r7\n\t"
  46182. "adc r4, r4, #0\n\t"
  46183. "lsl r7, r8, #16\n\t"
  46184. "lsr r7, r7, #16\n\t"
  46185. "mul r6, r7, r6\n\t"
  46186. "lsr r7, r6, #16\n\t"
  46187. "lsl r6, r6, #16\n\t"
  46188. "adds r5, r5, r6\n\t"
  46189. "adcs r3, r3, r7\n\t"
  46190. "adc r4, r4, #0\n\t"
  46191. #else
  46192. "umull r6, r7, %[b], r8\n\t"
  46193. "adds r5, r5, r6\n\t"
  46194. "adcs r3, r3, r7\n\t"
  46195. "mov r4, #0\n\t"
  46196. "adc r4, r4, #0\n\t"
  46197. #endif
  46198. "str r5, [%[r]], #4\n\t"
  46199. /* A[18] * B */
  46200. "ldr r8, [%[a]], #4\n\t"
  46201. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46202. "lsl r6, %[b], #16\n\t"
  46203. "lsl r7, r8, #16\n\t"
  46204. "lsr r6, r6, #16\n\t"
  46205. "lsr r7, r7, #16\n\t"
  46206. "mul r7, r6, r7\n\t"
  46207. "adds r3, r3, r7\n\t"
  46208. "adcs r4, r4, #0\n\t"
  46209. "mov r5, #0\n\t"
  46210. "adc r5, r5, #0\n\t"
  46211. "lsr r7, r8, #16\n\t"
  46212. "mul r6, r7, r6\n\t"
  46213. "lsr r7, r6, #16\n\t"
  46214. "lsl r6, r6, #16\n\t"
  46215. "adds r3, r3, r6\n\t"
  46216. "adcs r4, r4, r7\n\t"
  46217. "adc r5, r5, #0\n\t"
  46218. "lsr r6, %[b], #16\n\t"
  46219. "lsr r7, r8, #16\n\t"
  46220. "mul r7, r6, r7\n\t"
  46221. "adds r4, r4, r7\n\t"
  46222. "adc r5, r5, #0\n\t"
  46223. "lsl r7, r8, #16\n\t"
  46224. "lsr r7, r7, #16\n\t"
  46225. "mul r6, r7, r6\n\t"
  46226. "lsr r7, r6, #16\n\t"
  46227. "lsl r6, r6, #16\n\t"
  46228. "adds r3, r3, r6\n\t"
  46229. "adcs r4, r4, r7\n\t"
  46230. "adc r5, r5, #0\n\t"
  46231. #else
  46232. "umull r6, r7, %[b], r8\n\t"
  46233. "adds r3, r3, r6\n\t"
  46234. "adcs r4, r4, r7\n\t"
  46235. "mov r5, #0\n\t"
  46236. "adc r5, r5, #0\n\t"
  46237. #endif
  46238. "str r3, [%[r]], #4\n\t"
  46239. /* A[19] * B */
  46240. "ldr r8, [%[a]], #4\n\t"
  46241. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46242. "lsl r6, %[b], #16\n\t"
  46243. "lsl r7, r8, #16\n\t"
  46244. "lsr r6, r6, #16\n\t"
  46245. "lsr r7, r7, #16\n\t"
  46246. "mul r7, r6, r7\n\t"
  46247. "adds r4, r4, r7\n\t"
  46248. "adcs r5, r5, #0\n\t"
  46249. "mov r3, #0\n\t"
  46250. "adc r3, r3, #0\n\t"
  46251. "lsr r7, r8, #16\n\t"
  46252. "mul r6, r7, r6\n\t"
  46253. "lsr r7, r6, #16\n\t"
  46254. "lsl r6, r6, #16\n\t"
  46255. "adds r4, r4, r6\n\t"
  46256. "adcs r5, r5, r7\n\t"
  46257. "adc r3, r3, #0\n\t"
  46258. "lsr r6, %[b], #16\n\t"
  46259. "lsr r7, r8, #16\n\t"
  46260. "mul r7, r6, r7\n\t"
  46261. "adds r5, r5, r7\n\t"
  46262. "adc r3, r3, #0\n\t"
  46263. "lsl r7, r8, #16\n\t"
  46264. "lsr r7, r7, #16\n\t"
  46265. "mul r6, r7, r6\n\t"
  46266. "lsr r7, r6, #16\n\t"
  46267. "lsl r6, r6, #16\n\t"
  46268. "adds r4, r4, r6\n\t"
  46269. "adcs r5, r5, r7\n\t"
  46270. "adc r3, r3, #0\n\t"
  46271. #else
  46272. "umull r6, r7, %[b], r8\n\t"
  46273. "adds r4, r4, r6\n\t"
  46274. "adcs r5, r5, r7\n\t"
  46275. "mov r3, #0\n\t"
  46276. "adc r3, r3, #0\n\t"
  46277. #endif
  46278. "str r4, [%[r]], #4\n\t"
  46279. /* A[20] * B */
  46280. "ldr r8, [%[a]], #4\n\t"
  46281. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46282. "lsl r6, %[b], #16\n\t"
  46283. "lsl r7, r8, #16\n\t"
  46284. "lsr r6, r6, #16\n\t"
  46285. "lsr r7, r7, #16\n\t"
  46286. "mul r7, r6, r7\n\t"
  46287. "adds r5, r5, r7\n\t"
  46288. "adcs r3, r3, #0\n\t"
  46289. "mov r4, #0\n\t"
  46290. "adc r4, r4, #0\n\t"
  46291. "lsr r7, r8, #16\n\t"
  46292. "mul r6, r7, r6\n\t"
  46293. "lsr r7, r6, #16\n\t"
  46294. "lsl r6, r6, #16\n\t"
  46295. "adds r5, r5, r6\n\t"
  46296. "adcs r3, r3, r7\n\t"
  46297. "adc r4, r4, #0\n\t"
  46298. "lsr r6, %[b], #16\n\t"
  46299. "lsr r7, r8, #16\n\t"
  46300. "mul r7, r6, r7\n\t"
  46301. "adds r3, r3, r7\n\t"
  46302. "adc r4, r4, #0\n\t"
  46303. "lsl r7, r8, #16\n\t"
  46304. "lsr r7, r7, #16\n\t"
  46305. "mul r6, r7, r6\n\t"
  46306. "lsr r7, r6, #16\n\t"
  46307. "lsl r6, r6, #16\n\t"
  46308. "adds r5, r5, r6\n\t"
  46309. "adcs r3, r3, r7\n\t"
  46310. "adc r4, r4, #0\n\t"
  46311. #else
  46312. "umull r6, r7, %[b], r8\n\t"
  46313. "adds r5, r5, r6\n\t"
  46314. "adcs r3, r3, r7\n\t"
  46315. "mov r4, #0\n\t"
  46316. "adc r4, r4, #0\n\t"
  46317. #endif
  46318. "str r5, [%[r]], #4\n\t"
  46319. /* A[21] * B */
  46320. "ldr r8, [%[a]], #4\n\t"
  46321. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46322. "lsl r6, %[b], #16\n\t"
  46323. "lsl r7, r8, #16\n\t"
  46324. "lsr r6, r6, #16\n\t"
  46325. "lsr r7, r7, #16\n\t"
  46326. "mul r7, r6, r7\n\t"
  46327. "adds r3, r3, r7\n\t"
  46328. "adcs r4, r4, #0\n\t"
  46329. "mov r5, #0\n\t"
  46330. "adc r5, r5, #0\n\t"
  46331. "lsr r7, r8, #16\n\t"
  46332. "mul r6, r7, r6\n\t"
  46333. "lsr r7, r6, #16\n\t"
  46334. "lsl r6, r6, #16\n\t"
  46335. "adds r3, r3, r6\n\t"
  46336. "adcs r4, r4, r7\n\t"
  46337. "adc r5, r5, #0\n\t"
  46338. "lsr r6, %[b], #16\n\t"
  46339. "lsr r7, r8, #16\n\t"
  46340. "mul r7, r6, r7\n\t"
  46341. "adds r4, r4, r7\n\t"
  46342. "adc r5, r5, #0\n\t"
  46343. "lsl r7, r8, #16\n\t"
  46344. "lsr r7, r7, #16\n\t"
  46345. "mul r6, r7, r6\n\t"
  46346. "lsr r7, r6, #16\n\t"
  46347. "lsl r6, r6, #16\n\t"
  46348. "adds r3, r3, r6\n\t"
  46349. "adcs r4, r4, r7\n\t"
  46350. "adc r5, r5, #0\n\t"
  46351. #else
  46352. "umull r6, r7, %[b], r8\n\t"
  46353. "adds r3, r3, r6\n\t"
  46354. "adcs r4, r4, r7\n\t"
  46355. "mov r5, #0\n\t"
  46356. "adc r5, r5, #0\n\t"
  46357. #endif
  46358. "str r3, [%[r]], #4\n\t"
  46359. /* A[22] * B */
  46360. "ldr r8, [%[a]], #4\n\t"
  46361. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46362. "lsl r6, %[b], #16\n\t"
  46363. "lsl r7, r8, #16\n\t"
  46364. "lsr r6, r6, #16\n\t"
  46365. "lsr r7, r7, #16\n\t"
  46366. "mul r7, r6, r7\n\t"
  46367. "adds r4, r4, r7\n\t"
  46368. "adcs r5, r5, #0\n\t"
  46369. "mov r3, #0\n\t"
  46370. "adc r3, r3, #0\n\t"
  46371. "lsr r7, r8, #16\n\t"
  46372. "mul r6, r7, r6\n\t"
  46373. "lsr r7, r6, #16\n\t"
  46374. "lsl r6, r6, #16\n\t"
  46375. "adds r4, r4, r6\n\t"
  46376. "adcs r5, r5, r7\n\t"
  46377. "adc r3, r3, #0\n\t"
  46378. "lsr r6, %[b], #16\n\t"
  46379. "lsr r7, r8, #16\n\t"
  46380. "mul r7, r6, r7\n\t"
  46381. "adds r5, r5, r7\n\t"
  46382. "adc r3, r3, #0\n\t"
  46383. "lsl r7, r8, #16\n\t"
  46384. "lsr r7, r7, #16\n\t"
  46385. "mul r6, r7, r6\n\t"
  46386. "lsr r7, r6, #16\n\t"
  46387. "lsl r6, r6, #16\n\t"
  46388. "adds r4, r4, r6\n\t"
  46389. "adcs r5, r5, r7\n\t"
  46390. "adc r3, r3, #0\n\t"
  46391. #else
  46392. "umull r6, r7, %[b], r8\n\t"
  46393. "adds r4, r4, r6\n\t"
  46394. "adcs r5, r5, r7\n\t"
  46395. "mov r3, #0\n\t"
  46396. "adc r3, r3, #0\n\t"
  46397. #endif
  46398. "str r4, [%[r]], #4\n\t"
  46399. /* A[23] * B */
  46400. "ldr r8, [%[a]], #4\n\t"
  46401. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46402. "lsl r6, %[b], #16\n\t"
  46403. "lsl r7, r8, #16\n\t"
  46404. "lsr r6, r6, #16\n\t"
  46405. "lsr r7, r7, #16\n\t"
  46406. "mul r7, r6, r7\n\t"
  46407. "adds r5, r5, r7\n\t"
  46408. "adcs r3, r3, #0\n\t"
  46409. "mov r4, #0\n\t"
  46410. "adc r4, r4, #0\n\t"
  46411. "lsr r7, r8, #16\n\t"
  46412. "mul r6, r7, r6\n\t"
  46413. "lsr r7, r6, #16\n\t"
  46414. "lsl r6, r6, #16\n\t"
  46415. "adds r5, r5, r6\n\t"
  46416. "adcs r3, r3, r7\n\t"
  46417. "adc r4, r4, #0\n\t"
  46418. "lsr r6, %[b], #16\n\t"
  46419. "lsr r7, r8, #16\n\t"
  46420. "mul r7, r6, r7\n\t"
  46421. "adds r3, r3, r7\n\t"
  46422. "adc r4, r4, #0\n\t"
  46423. "lsl r7, r8, #16\n\t"
  46424. "lsr r7, r7, #16\n\t"
  46425. "mul r6, r7, r6\n\t"
  46426. "lsr r7, r6, #16\n\t"
  46427. "lsl r6, r6, #16\n\t"
  46428. "adds r5, r5, r6\n\t"
  46429. "adcs r3, r3, r7\n\t"
  46430. "adc r4, r4, #0\n\t"
  46431. #else
  46432. "umull r6, r7, %[b], r8\n\t"
  46433. "adds r5, r5, r6\n\t"
  46434. "adcs r3, r3, r7\n\t"
  46435. "mov r4, #0\n\t"
  46436. "adc r4, r4, #0\n\t"
  46437. #endif
  46438. "str r5, [%[r]], #4\n\t"
  46439. /* A[24] * B */
  46440. "ldr r8, [%[a]], #4\n\t"
  46441. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46442. "lsl r6, %[b], #16\n\t"
  46443. "lsl r7, r8, #16\n\t"
  46444. "lsr r6, r6, #16\n\t"
  46445. "lsr r7, r7, #16\n\t"
  46446. "mul r7, r6, r7\n\t"
  46447. "adds r3, r3, r7\n\t"
  46448. "adcs r4, r4, #0\n\t"
  46449. "mov r5, #0\n\t"
  46450. "adc r5, r5, #0\n\t"
  46451. "lsr r7, r8, #16\n\t"
  46452. "mul r6, r7, r6\n\t"
  46453. "lsr r7, r6, #16\n\t"
  46454. "lsl r6, r6, #16\n\t"
  46455. "adds r3, r3, r6\n\t"
  46456. "adcs r4, r4, r7\n\t"
  46457. "adc r5, r5, #0\n\t"
  46458. "lsr r6, %[b], #16\n\t"
  46459. "lsr r7, r8, #16\n\t"
  46460. "mul r7, r6, r7\n\t"
  46461. "adds r4, r4, r7\n\t"
  46462. "adc r5, r5, #0\n\t"
  46463. "lsl r7, r8, #16\n\t"
  46464. "lsr r7, r7, #16\n\t"
  46465. "mul r6, r7, r6\n\t"
  46466. "lsr r7, r6, #16\n\t"
  46467. "lsl r6, r6, #16\n\t"
  46468. "adds r3, r3, r6\n\t"
  46469. "adcs r4, r4, r7\n\t"
  46470. "adc r5, r5, #0\n\t"
  46471. #else
  46472. "umull r6, r7, %[b], r8\n\t"
  46473. "adds r3, r3, r6\n\t"
  46474. "adcs r4, r4, r7\n\t"
  46475. "mov r5, #0\n\t"
  46476. "adc r5, r5, #0\n\t"
  46477. #endif
  46478. "str r3, [%[r]], #4\n\t"
  46479. /* A[25] * B */
  46480. "ldr r8, [%[a]], #4\n\t"
  46481. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46482. "lsl r6, %[b], #16\n\t"
  46483. "lsl r7, r8, #16\n\t"
  46484. "lsr r6, r6, #16\n\t"
  46485. "lsr r7, r7, #16\n\t"
  46486. "mul r7, r6, r7\n\t"
  46487. "adds r4, r4, r7\n\t"
  46488. "adcs r5, r5, #0\n\t"
  46489. "mov r3, #0\n\t"
  46490. "adc r3, r3, #0\n\t"
  46491. "lsr r7, r8, #16\n\t"
  46492. "mul r6, r7, r6\n\t"
  46493. "lsr r7, r6, #16\n\t"
  46494. "lsl r6, r6, #16\n\t"
  46495. "adds r4, r4, r6\n\t"
  46496. "adcs r5, r5, r7\n\t"
  46497. "adc r3, r3, #0\n\t"
  46498. "lsr r6, %[b], #16\n\t"
  46499. "lsr r7, r8, #16\n\t"
  46500. "mul r7, r6, r7\n\t"
  46501. "adds r5, r5, r7\n\t"
  46502. "adc r3, r3, #0\n\t"
  46503. "lsl r7, r8, #16\n\t"
  46504. "lsr r7, r7, #16\n\t"
  46505. "mul r6, r7, r6\n\t"
  46506. "lsr r7, r6, #16\n\t"
  46507. "lsl r6, r6, #16\n\t"
  46508. "adds r4, r4, r6\n\t"
  46509. "adcs r5, r5, r7\n\t"
  46510. "adc r3, r3, #0\n\t"
  46511. #else
  46512. "umull r6, r7, %[b], r8\n\t"
  46513. "adds r4, r4, r6\n\t"
  46514. "adcs r5, r5, r7\n\t"
  46515. "mov r3, #0\n\t"
  46516. "adc r3, r3, #0\n\t"
  46517. #endif
  46518. "str r4, [%[r]], #4\n\t"
  46519. /* A[26] * B */
  46520. "ldr r8, [%[a]], #4\n\t"
  46521. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46522. "lsl r6, %[b], #16\n\t"
  46523. "lsl r7, r8, #16\n\t"
  46524. "lsr r6, r6, #16\n\t"
  46525. "lsr r7, r7, #16\n\t"
  46526. "mul r7, r6, r7\n\t"
  46527. "adds r5, r5, r7\n\t"
  46528. "adcs r3, r3, #0\n\t"
  46529. "mov r4, #0\n\t"
  46530. "adc r4, r4, #0\n\t"
  46531. "lsr r7, r8, #16\n\t"
  46532. "mul r6, r7, r6\n\t"
  46533. "lsr r7, r6, #16\n\t"
  46534. "lsl r6, r6, #16\n\t"
  46535. "adds r5, r5, r6\n\t"
  46536. "adcs r3, r3, r7\n\t"
  46537. "adc r4, r4, #0\n\t"
  46538. "lsr r6, %[b], #16\n\t"
  46539. "lsr r7, r8, #16\n\t"
  46540. "mul r7, r6, r7\n\t"
  46541. "adds r3, r3, r7\n\t"
  46542. "adc r4, r4, #0\n\t"
  46543. "lsl r7, r8, #16\n\t"
  46544. "lsr r7, r7, #16\n\t"
  46545. "mul r6, r7, r6\n\t"
  46546. "lsr r7, r6, #16\n\t"
  46547. "lsl r6, r6, #16\n\t"
  46548. "adds r5, r5, r6\n\t"
  46549. "adcs r3, r3, r7\n\t"
  46550. "adc r4, r4, #0\n\t"
  46551. #else
  46552. "umull r6, r7, %[b], r8\n\t"
  46553. "adds r5, r5, r6\n\t"
  46554. "adcs r3, r3, r7\n\t"
  46555. "mov r4, #0\n\t"
  46556. "adc r4, r4, #0\n\t"
  46557. #endif
  46558. "str r5, [%[r]], #4\n\t"
  46559. /* A[27] * B */
  46560. "ldr r8, [%[a]], #4\n\t"
  46561. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46562. "lsl r6, %[b], #16\n\t"
  46563. "lsl r7, r8, #16\n\t"
  46564. "lsr r6, r6, #16\n\t"
  46565. "lsr r7, r7, #16\n\t"
  46566. "mul r7, r6, r7\n\t"
  46567. "adds r3, r3, r7\n\t"
  46568. "adcs r4, r4, #0\n\t"
  46569. "mov r5, #0\n\t"
  46570. "adc r5, r5, #0\n\t"
  46571. "lsr r7, r8, #16\n\t"
  46572. "mul r6, r7, r6\n\t"
  46573. "lsr r7, r6, #16\n\t"
  46574. "lsl r6, r6, #16\n\t"
  46575. "adds r3, r3, r6\n\t"
  46576. "adcs r4, r4, r7\n\t"
  46577. "adc r5, r5, #0\n\t"
  46578. "lsr r6, %[b], #16\n\t"
  46579. "lsr r7, r8, #16\n\t"
  46580. "mul r7, r6, r7\n\t"
  46581. "adds r4, r4, r7\n\t"
  46582. "adc r5, r5, #0\n\t"
  46583. "lsl r7, r8, #16\n\t"
  46584. "lsr r7, r7, #16\n\t"
  46585. "mul r6, r7, r6\n\t"
  46586. "lsr r7, r6, #16\n\t"
  46587. "lsl r6, r6, #16\n\t"
  46588. "adds r3, r3, r6\n\t"
  46589. "adcs r4, r4, r7\n\t"
  46590. "adc r5, r5, #0\n\t"
  46591. #else
  46592. "umull r6, r7, %[b], r8\n\t"
  46593. "adds r3, r3, r6\n\t"
  46594. "adcs r4, r4, r7\n\t"
  46595. "mov r5, #0\n\t"
  46596. "adc r5, r5, #0\n\t"
  46597. #endif
  46598. "str r3, [%[r]], #4\n\t"
  46599. /* A[28] * B */
  46600. "ldr r8, [%[a]], #4\n\t"
  46601. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46602. "lsl r6, %[b], #16\n\t"
  46603. "lsl r7, r8, #16\n\t"
  46604. "lsr r6, r6, #16\n\t"
  46605. "lsr r7, r7, #16\n\t"
  46606. "mul r7, r6, r7\n\t"
  46607. "adds r4, r4, r7\n\t"
  46608. "adcs r5, r5, #0\n\t"
  46609. "mov r3, #0\n\t"
  46610. "adc r3, r3, #0\n\t"
  46611. "lsr r7, r8, #16\n\t"
  46612. "mul r6, r7, r6\n\t"
  46613. "lsr r7, r6, #16\n\t"
  46614. "lsl r6, r6, #16\n\t"
  46615. "adds r4, r4, r6\n\t"
  46616. "adcs r5, r5, r7\n\t"
  46617. "adc r3, r3, #0\n\t"
  46618. "lsr r6, %[b], #16\n\t"
  46619. "lsr r7, r8, #16\n\t"
  46620. "mul r7, r6, r7\n\t"
  46621. "adds r5, r5, r7\n\t"
  46622. "adc r3, r3, #0\n\t"
  46623. "lsl r7, r8, #16\n\t"
  46624. "lsr r7, r7, #16\n\t"
  46625. "mul r6, r7, r6\n\t"
  46626. "lsr r7, r6, #16\n\t"
  46627. "lsl r6, r6, #16\n\t"
  46628. "adds r4, r4, r6\n\t"
  46629. "adcs r5, r5, r7\n\t"
  46630. "adc r3, r3, #0\n\t"
  46631. #else
  46632. "umull r6, r7, %[b], r8\n\t"
  46633. "adds r4, r4, r6\n\t"
  46634. "adcs r5, r5, r7\n\t"
  46635. "mov r3, #0\n\t"
  46636. "adc r3, r3, #0\n\t"
  46637. #endif
  46638. "str r4, [%[r]], #4\n\t"
  46639. /* A[29] * B */
  46640. "ldr r8, [%[a]], #4\n\t"
  46641. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46642. "lsl r6, %[b], #16\n\t"
  46643. "lsl r7, r8, #16\n\t"
  46644. "lsr r6, r6, #16\n\t"
  46645. "lsr r7, r7, #16\n\t"
  46646. "mul r7, r6, r7\n\t"
  46647. "adds r5, r5, r7\n\t"
  46648. "adcs r3, r3, #0\n\t"
  46649. "mov r4, #0\n\t"
  46650. "adc r4, r4, #0\n\t"
  46651. "lsr r7, r8, #16\n\t"
  46652. "mul r6, r7, r6\n\t"
  46653. "lsr r7, r6, #16\n\t"
  46654. "lsl r6, r6, #16\n\t"
  46655. "adds r5, r5, r6\n\t"
  46656. "adcs r3, r3, r7\n\t"
  46657. "adc r4, r4, #0\n\t"
  46658. "lsr r6, %[b], #16\n\t"
  46659. "lsr r7, r8, #16\n\t"
  46660. "mul r7, r6, r7\n\t"
  46661. "adds r3, r3, r7\n\t"
  46662. "adc r4, r4, #0\n\t"
  46663. "lsl r7, r8, #16\n\t"
  46664. "lsr r7, r7, #16\n\t"
  46665. "mul r6, r7, r6\n\t"
  46666. "lsr r7, r6, #16\n\t"
  46667. "lsl r6, r6, #16\n\t"
  46668. "adds r5, r5, r6\n\t"
  46669. "adcs r3, r3, r7\n\t"
  46670. "adc r4, r4, #0\n\t"
  46671. #else
  46672. "umull r6, r7, %[b], r8\n\t"
  46673. "adds r5, r5, r6\n\t"
  46674. "adcs r3, r3, r7\n\t"
  46675. "mov r4, #0\n\t"
  46676. "adc r4, r4, #0\n\t"
  46677. #endif
  46678. "str r5, [%[r]], #4\n\t"
  46679. /* A[30] * B */
  46680. "ldr r8, [%[a]], #4\n\t"
  46681. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46682. "lsl r6, %[b], #16\n\t"
  46683. "lsl r7, r8, #16\n\t"
  46684. "lsr r6, r6, #16\n\t"
  46685. "lsr r7, r7, #16\n\t"
  46686. "mul r7, r6, r7\n\t"
  46687. "adds r3, r3, r7\n\t"
  46688. "adcs r4, r4, #0\n\t"
  46689. "mov r5, #0\n\t"
  46690. "adc r5, r5, #0\n\t"
  46691. "lsr r7, r8, #16\n\t"
  46692. "mul r6, r7, r6\n\t"
  46693. "lsr r7, r6, #16\n\t"
  46694. "lsl r6, r6, #16\n\t"
  46695. "adds r3, r3, r6\n\t"
  46696. "adcs r4, r4, r7\n\t"
  46697. "adc r5, r5, #0\n\t"
  46698. "lsr r6, %[b], #16\n\t"
  46699. "lsr r7, r8, #16\n\t"
  46700. "mul r7, r6, r7\n\t"
  46701. "adds r4, r4, r7\n\t"
  46702. "adc r5, r5, #0\n\t"
  46703. "lsl r7, r8, #16\n\t"
  46704. "lsr r7, r7, #16\n\t"
  46705. "mul r6, r7, r6\n\t"
  46706. "lsr r7, r6, #16\n\t"
  46707. "lsl r6, r6, #16\n\t"
  46708. "adds r3, r3, r6\n\t"
  46709. "adcs r4, r4, r7\n\t"
  46710. "adc r5, r5, #0\n\t"
  46711. #else
  46712. "umull r6, r7, %[b], r8\n\t"
  46713. "adds r3, r3, r6\n\t"
  46714. "adcs r4, r4, r7\n\t"
  46715. "mov r5, #0\n\t"
  46716. "adc r5, r5, #0\n\t"
  46717. #endif
  46718. "str r3, [%[r]], #4\n\t"
  46719. /* A[31] * B */
  46720. "ldr r8, [%[a]], #4\n\t"
  46721. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46722. "lsl r6, %[b], #16\n\t"
  46723. "lsl r7, r8, #16\n\t"
  46724. "lsr r6, r6, #16\n\t"
  46725. "lsr r7, r7, #16\n\t"
  46726. "mul r7, r6, r7\n\t"
  46727. "adds r4, r4, r7\n\t"
  46728. "adcs r5, r5, #0\n\t"
  46729. "mov r3, #0\n\t"
  46730. "adc r3, r3, #0\n\t"
  46731. "lsr r7, r8, #16\n\t"
  46732. "mul r6, r7, r6\n\t"
  46733. "lsr r7, r6, #16\n\t"
  46734. "lsl r6, r6, #16\n\t"
  46735. "adds r4, r4, r6\n\t"
  46736. "adcs r5, r5, r7\n\t"
  46737. "adc r3, r3, #0\n\t"
  46738. "lsr r6, %[b], #16\n\t"
  46739. "lsr r7, r8, #16\n\t"
  46740. "mul r7, r6, r7\n\t"
  46741. "adds r5, r5, r7\n\t"
  46742. "adc r3, r3, #0\n\t"
  46743. "lsl r7, r8, #16\n\t"
  46744. "lsr r7, r7, #16\n\t"
  46745. "mul r6, r7, r6\n\t"
  46746. "lsr r7, r6, #16\n\t"
  46747. "lsl r6, r6, #16\n\t"
  46748. "adds r4, r4, r6\n\t"
  46749. "adcs r5, r5, r7\n\t"
  46750. "adc r3, r3, #0\n\t"
  46751. #else
  46752. "umull r6, r7, %[b], r8\n\t"
  46753. "adds r4, r4, r6\n\t"
  46754. "adcs r5, r5, r7\n\t"
  46755. "mov r3, #0\n\t"
  46756. "adc r3, r3, #0\n\t"
  46757. #endif
  46758. "str r4, [%[r]], #4\n\t"
  46759. /* A[32] * B */
  46760. "ldr r8, [%[a]], #4\n\t"
  46761. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46762. "lsl r6, %[b], #16\n\t"
  46763. "lsl r7, r8, #16\n\t"
  46764. "lsr r6, r6, #16\n\t"
  46765. "lsr r7, r7, #16\n\t"
  46766. "mul r7, r6, r7\n\t"
  46767. "adds r5, r5, r7\n\t"
  46768. "adcs r3, r3, #0\n\t"
  46769. "mov r4, #0\n\t"
  46770. "adc r4, r4, #0\n\t"
  46771. "lsr r7, r8, #16\n\t"
  46772. "mul r6, r7, r6\n\t"
  46773. "lsr r7, r6, #16\n\t"
  46774. "lsl r6, r6, #16\n\t"
  46775. "adds r5, r5, r6\n\t"
  46776. "adcs r3, r3, r7\n\t"
  46777. "adc r4, r4, #0\n\t"
  46778. "lsr r6, %[b], #16\n\t"
  46779. "lsr r7, r8, #16\n\t"
  46780. "mul r7, r6, r7\n\t"
  46781. "adds r3, r3, r7\n\t"
  46782. "adc r4, r4, #0\n\t"
  46783. "lsl r7, r8, #16\n\t"
  46784. "lsr r7, r7, #16\n\t"
  46785. "mul r6, r7, r6\n\t"
  46786. "lsr r7, r6, #16\n\t"
  46787. "lsl r6, r6, #16\n\t"
  46788. "adds r5, r5, r6\n\t"
  46789. "adcs r3, r3, r7\n\t"
  46790. "adc r4, r4, #0\n\t"
  46791. #else
  46792. "umull r6, r7, %[b], r8\n\t"
  46793. "adds r5, r5, r6\n\t"
  46794. "adcs r3, r3, r7\n\t"
  46795. "mov r4, #0\n\t"
  46796. "adc r4, r4, #0\n\t"
  46797. #endif
  46798. "str r5, [%[r]], #4\n\t"
  46799. /* A[33] * B */
  46800. "ldr r8, [%[a]], #4\n\t"
  46801. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46802. "lsl r6, %[b], #16\n\t"
  46803. "lsl r7, r8, #16\n\t"
  46804. "lsr r6, r6, #16\n\t"
  46805. "lsr r7, r7, #16\n\t"
  46806. "mul r7, r6, r7\n\t"
  46807. "adds r3, r3, r7\n\t"
  46808. "adcs r4, r4, #0\n\t"
  46809. "mov r5, #0\n\t"
  46810. "adc r5, r5, #0\n\t"
  46811. "lsr r7, r8, #16\n\t"
  46812. "mul r6, r7, r6\n\t"
  46813. "lsr r7, r6, #16\n\t"
  46814. "lsl r6, r6, #16\n\t"
  46815. "adds r3, r3, r6\n\t"
  46816. "adcs r4, r4, r7\n\t"
  46817. "adc r5, r5, #0\n\t"
  46818. "lsr r6, %[b], #16\n\t"
  46819. "lsr r7, r8, #16\n\t"
  46820. "mul r7, r6, r7\n\t"
  46821. "adds r4, r4, r7\n\t"
  46822. "adc r5, r5, #0\n\t"
  46823. "lsl r7, r8, #16\n\t"
  46824. "lsr r7, r7, #16\n\t"
  46825. "mul r6, r7, r6\n\t"
  46826. "lsr r7, r6, #16\n\t"
  46827. "lsl r6, r6, #16\n\t"
  46828. "adds r3, r3, r6\n\t"
  46829. "adcs r4, r4, r7\n\t"
  46830. "adc r5, r5, #0\n\t"
  46831. #else
  46832. "umull r6, r7, %[b], r8\n\t"
  46833. "adds r3, r3, r6\n\t"
  46834. "adcs r4, r4, r7\n\t"
  46835. "mov r5, #0\n\t"
  46836. "adc r5, r5, #0\n\t"
  46837. #endif
  46838. "str r3, [%[r]], #4\n\t"
  46839. /* A[34] * B */
  46840. "ldr r8, [%[a]], #4\n\t"
  46841. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46842. "lsl r6, %[b], #16\n\t"
  46843. "lsl r7, r8, #16\n\t"
  46844. "lsr r6, r6, #16\n\t"
  46845. "lsr r7, r7, #16\n\t"
  46846. "mul r7, r6, r7\n\t"
  46847. "adds r4, r4, r7\n\t"
  46848. "adcs r5, r5, #0\n\t"
  46849. "mov r3, #0\n\t"
  46850. "adc r3, r3, #0\n\t"
  46851. "lsr r7, r8, #16\n\t"
  46852. "mul r6, r7, r6\n\t"
  46853. "lsr r7, r6, #16\n\t"
  46854. "lsl r6, r6, #16\n\t"
  46855. "adds r4, r4, r6\n\t"
  46856. "adcs r5, r5, r7\n\t"
  46857. "adc r3, r3, #0\n\t"
  46858. "lsr r6, %[b], #16\n\t"
  46859. "lsr r7, r8, #16\n\t"
  46860. "mul r7, r6, r7\n\t"
  46861. "adds r5, r5, r7\n\t"
  46862. "adc r3, r3, #0\n\t"
  46863. "lsl r7, r8, #16\n\t"
  46864. "lsr r7, r7, #16\n\t"
  46865. "mul r6, r7, r6\n\t"
  46866. "lsr r7, r6, #16\n\t"
  46867. "lsl r6, r6, #16\n\t"
  46868. "adds r4, r4, r6\n\t"
  46869. "adcs r5, r5, r7\n\t"
  46870. "adc r3, r3, #0\n\t"
  46871. #else
  46872. "umull r6, r7, %[b], r8\n\t"
  46873. "adds r4, r4, r6\n\t"
  46874. "adcs r5, r5, r7\n\t"
  46875. "mov r3, #0\n\t"
  46876. "adc r3, r3, #0\n\t"
  46877. #endif
  46878. "str r4, [%[r]], #4\n\t"
  46879. /* A[35] * B */
  46880. "ldr r8, [%[a]], #4\n\t"
  46881. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46882. "lsl r6, %[b], #16\n\t"
  46883. "lsl r7, r8, #16\n\t"
  46884. "lsr r6, r6, #16\n\t"
  46885. "lsr r7, r7, #16\n\t"
  46886. "mul r7, r6, r7\n\t"
  46887. "adds r5, r5, r7\n\t"
  46888. "adcs r3, r3, #0\n\t"
  46889. "mov r4, #0\n\t"
  46890. "adc r4, r4, #0\n\t"
  46891. "lsr r7, r8, #16\n\t"
  46892. "mul r6, r7, r6\n\t"
  46893. "lsr r7, r6, #16\n\t"
  46894. "lsl r6, r6, #16\n\t"
  46895. "adds r5, r5, r6\n\t"
  46896. "adcs r3, r3, r7\n\t"
  46897. "adc r4, r4, #0\n\t"
  46898. "lsr r6, %[b], #16\n\t"
  46899. "lsr r7, r8, #16\n\t"
  46900. "mul r7, r6, r7\n\t"
  46901. "adds r3, r3, r7\n\t"
  46902. "adc r4, r4, #0\n\t"
  46903. "lsl r7, r8, #16\n\t"
  46904. "lsr r7, r7, #16\n\t"
  46905. "mul r6, r7, r6\n\t"
  46906. "lsr r7, r6, #16\n\t"
  46907. "lsl r6, r6, #16\n\t"
  46908. "adds r5, r5, r6\n\t"
  46909. "adcs r3, r3, r7\n\t"
  46910. "adc r4, r4, #0\n\t"
  46911. #else
  46912. "umull r6, r7, %[b], r8\n\t"
  46913. "adds r5, r5, r6\n\t"
  46914. "adcs r3, r3, r7\n\t"
  46915. "mov r4, #0\n\t"
  46916. "adc r4, r4, #0\n\t"
  46917. #endif
  46918. "str r5, [%[r]], #4\n\t"
  46919. /* A[36] * B */
  46920. "ldr r8, [%[a]], #4\n\t"
  46921. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46922. "lsl r6, %[b], #16\n\t"
  46923. "lsl r7, r8, #16\n\t"
  46924. "lsr r6, r6, #16\n\t"
  46925. "lsr r7, r7, #16\n\t"
  46926. "mul r7, r6, r7\n\t"
  46927. "adds r3, r3, r7\n\t"
  46928. "adcs r4, r4, #0\n\t"
  46929. "mov r5, #0\n\t"
  46930. "adc r5, r5, #0\n\t"
  46931. "lsr r7, r8, #16\n\t"
  46932. "mul r6, r7, r6\n\t"
  46933. "lsr r7, r6, #16\n\t"
  46934. "lsl r6, r6, #16\n\t"
  46935. "adds r3, r3, r6\n\t"
  46936. "adcs r4, r4, r7\n\t"
  46937. "adc r5, r5, #0\n\t"
  46938. "lsr r6, %[b], #16\n\t"
  46939. "lsr r7, r8, #16\n\t"
  46940. "mul r7, r6, r7\n\t"
  46941. "adds r4, r4, r7\n\t"
  46942. "adc r5, r5, #0\n\t"
  46943. "lsl r7, r8, #16\n\t"
  46944. "lsr r7, r7, #16\n\t"
  46945. "mul r6, r7, r6\n\t"
  46946. "lsr r7, r6, #16\n\t"
  46947. "lsl r6, r6, #16\n\t"
  46948. "adds r3, r3, r6\n\t"
  46949. "adcs r4, r4, r7\n\t"
  46950. "adc r5, r5, #0\n\t"
  46951. #else
  46952. "umull r6, r7, %[b], r8\n\t"
  46953. "adds r3, r3, r6\n\t"
  46954. "adcs r4, r4, r7\n\t"
  46955. "mov r5, #0\n\t"
  46956. "adc r5, r5, #0\n\t"
  46957. #endif
  46958. "str r3, [%[r]], #4\n\t"
  46959. /* A[37] * B */
  46960. "ldr r8, [%[a]], #4\n\t"
  46961. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  46962. "lsl r6, %[b], #16\n\t"
  46963. "lsl r7, r8, #16\n\t"
  46964. "lsr r6, r6, #16\n\t"
  46965. "lsr r7, r7, #16\n\t"
  46966. "mul r7, r6, r7\n\t"
  46967. "adds r4, r4, r7\n\t"
  46968. "adcs r5, r5, #0\n\t"
  46969. "mov r3, #0\n\t"
  46970. "adc r3, r3, #0\n\t"
  46971. "lsr r7, r8, #16\n\t"
  46972. "mul r6, r7, r6\n\t"
  46973. "lsr r7, r6, #16\n\t"
  46974. "lsl r6, r6, #16\n\t"
  46975. "adds r4, r4, r6\n\t"
  46976. "adcs r5, r5, r7\n\t"
  46977. "adc r3, r3, #0\n\t"
  46978. "lsr r6, %[b], #16\n\t"
  46979. "lsr r7, r8, #16\n\t"
  46980. "mul r7, r6, r7\n\t"
  46981. "adds r5, r5, r7\n\t"
  46982. "adc r3, r3, #0\n\t"
  46983. "lsl r7, r8, #16\n\t"
  46984. "lsr r7, r7, #16\n\t"
  46985. "mul r6, r7, r6\n\t"
  46986. "lsr r7, r6, #16\n\t"
  46987. "lsl r6, r6, #16\n\t"
  46988. "adds r4, r4, r6\n\t"
  46989. "adcs r5, r5, r7\n\t"
  46990. "adc r3, r3, #0\n\t"
  46991. #else
  46992. "umull r6, r7, %[b], r8\n\t"
  46993. "adds r4, r4, r6\n\t"
  46994. "adcs r5, r5, r7\n\t"
  46995. "mov r3, #0\n\t"
  46996. "adc r3, r3, #0\n\t"
  46997. #endif
  46998. "str r4, [%[r]], #4\n\t"
  46999. /* A[38] * B */
  47000. "ldr r8, [%[a]], #4\n\t"
  47001. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47002. "lsl r6, %[b], #16\n\t"
  47003. "lsl r7, r8, #16\n\t"
  47004. "lsr r6, r6, #16\n\t"
  47005. "lsr r7, r7, #16\n\t"
  47006. "mul r7, r6, r7\n\t"
  47007. "adds r5, r5, r7\n\t"
  47008. "adcs r3, r3, #0\n\t"
  47009. "mov r4, #0\n\t"
  47010. "adc r4, r4, #0\n\t"
  47011. "lsr r7, r8, #16\n\t"
  47012. "mul r6, r7, r6\n\t"
  47013. "lsr r7, r6, #16\n\t"
  47014. "lsl r6, r6, #16\n\t"
  47015. "adds r5, r5, r6\n\t"
  47016. "adcs r3, r3, r7\n\t"
  47017. "adc r4, r4, #0\n\t"
  47018. "lsr r6, %[b], #16\n\t"
  47019. "lsr r7, r8, #16\n\t"
  47020. "mul r7, r6, r7\n\t"
  47021. "adds r3, r3, r7\n\t"
  47022. "adc r4, r4, #0\n\t"
  47023. "lsl r7, r8, #16\n\t"
  47024. "lsr r7, r7, #16\n\t"
  47025. "mul r6, r7, r6\n\t"
  47026. "lsr r7, r6, #16\n\t"
  47027. "lsl r6, r6, #16\n\t"
  47028. "adds r5, r5, r6\n\t"
  47029. "adcs r3, r3, r7\n\t"
  47030. "adc r4, r4, #0\n\t"
  47031. #else
  47032. "umull r6, r7, %[b], r8\n\t"
  47033. "adds r5, r5, r6\n\t"
  47034. "adcs r3, r3, r7\n\t"
  47035. "mov r4, #0\n\t"
  47036. "adc r4, r4, #0\n\t"
  47037. #endif
  47038. "str r5, [%[r]], #4\n\t"
  47039. /* A[39] * B */
  47040. "ldr r8, [%[a]], #4\n\t"
  47041. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47042. "lsl r6, %[b], #16\n\t"
  47043. "lsl r7, r8, #16\n\t"
  47044. "lsr r6, r6, #16\n\t"
  47045. "lsr r7, r7, #16\n\t"
  47046. "mul r7, r6, r7\n\t"
  47047. "adds r3, r3, r7\n\t"
  47048. "adcs r4, r4, #0\n\t"
  47049. "mov r5, #0\n\t"
  47050. "adc r5, r5, #0\n\t"
  47051. "lsr r7, r8, #16\n\t"
  47052. "mul r6, r7, r6\n\t"
  47053. "lsr r7, r6, #16\n\t"
  47054. "lsl r6, r6, #16\n\t"
  47055. "adds r3, r3, r6\n\t"
  47056. "adcs r4, r4, r7\n\t"
  47057. "adc r5, r5, #0\n\t"
  47058. "lsr r6, %[b], #16\n\t"
  47059. "lsr r7, r8, #16\n\t"
  47060. "mul r7, r6, r7\n\t"
  47061. "adds r4, r4, r7\n\t"
  47062. "adc r5, r5, #0\n\t"
  47063. "lsl r7, r8, #16\n\t"
  47064. "lsr r7, r7, #16\n\t"
  47065. "mul r6, r7, r6\n\t"
  47066. "lsr r7, r6, #16\n\t"
  47067. "lsl r6, r6, #16\n\t"
  47068. "adds r3, r3, r6\n\t"
  47069. "adcs r4, r4, r7\n\t"
  47070. "adc r5, r5, #0\n\t"
  47071. #else
  47072. "umull r6, r7, %[b], r8\n\t"
  47073. "adds r3, r3, r6\n\t"
  47074. "adcs r4, r4, r7\n\t"
  47075. "mov r5, #0\n\t"
  47076. "adc r5, r5, #0\n\t"
  47077. #endif
  47078. "str r3, [%[r]], #4\n\t"
  47079. /* A[40] * B */
  47080. "ldr r8, [%[a]], #4\n\t"
  47081. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47082. "lsl r6, %[b], #16\n\t"
  47083. "lsl r7, r8, #16\n\t"
  47084. "lsr r6, r6, #16\n\t"
  47085. "lsr r7, r7, #16\n\t"
  47086. "mul r7, r6, r7\n\t"
  47087. "adds r4, r4, r7\n\t"
  47088. "adcs r5, r5, #0\n\t"
  47089. "mov r3, #0\n\t"
  47090. "adc r3, r3, #0\n\t"
  47091. "lsr r7, r8, #16\n\t"
  47092. "mul r6, r7, r6\n\t"
  47093. "lsr r7, r6, #16\n\t"
  47094. "lsl r6, r6, #16\n\t"
  47095. "adds r4, r4, r6\n\t"
  47096. "adcs r5, r5, r7\n\t"
  47097. "adc r3, r3, #0\n\t"
  47098. "lsr r6, %[b], #16\n\t"
  47099. "lsr r7, r8, #16\n\t"
  47100. "mul r7, r6, r7\n\t"
  47101. "adds r5, r5, r7\n\t"
  47102. "adc r3, r3, #0\n\t"
  47103. "lsl r7, r8, #16\n\t"
  47104. "lsr r7, r7, #16\n\t"
  47105. "mul r6, r7, r6\n\t"
  47106. "lsr r7, r6, #16\n\t"
  47107. "lsl r6, r6, #16\n\t"
  47108. "adds r4, r4, r6\n\t"
  47109. "adcs r5, r5, r7\n\t"
  47110. "adc r3, r3, #0\n\t"
  47111. #else
  47112. "umull r6, r7, %[b], r8\n\t"
  47113. "adds r4, r4, r6\n\t"
  47114. "adcs r5, r5, r7\n\t"
  47115. "mov r3, #0\n\t"
  47116. "adc r3, r3, #0\n\t"
  47117. #endif
  47118. "str r4, [%[r]], #4\n\t"
  47119. /* A[41] * B */
  47120. "ldr r8, [%[a]], #4\n\t"
  47121. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47122. "lsl r6, %[b], #16\n\t"
  47123. "lsl r7, r8, #16\n\t"
  47124. "lsr r6, r6, #16\n\t"
  47125. "lsr r7, r7, #16\n\t"
  47126. "mul r7, r6, r7\n\t"
  47127. "adds r5, r5, r7\n\t"
  47128. "adcs r3, r3, #0\n\t"
  47129. "mov r4, #0\n\t"
  47130. "adc r4, r4, #0\n\t"
  47131. "lsr r7, r8, #16\n\t"
  47132. "mul r6, r7, r6\n\t"
  47133. "lsr r7, r6, #16\n\t"
  47134. "lsl r6, r6, #16\n\t"
  47135. "adds r5, r5, r6\n\t"
  47136. "adcs r3, r3, r7\n\t"
  47137. "adc r4, r4, #0\n\t"
  47138. "lsr r6, %[b], #16\n\t"
  47139. "lsr r7, r8, #16\n\t"
  47140. "mul r7, r6, r7\n\t"
  47141. "adds r3, r3, r7\n\t"
  47142. "adc r4, r4, #0\n\t"
  47143. "lsl r7, r8, #16\n\t"
  47144. "lsr r7, r7, #16\n\t"
  47145. "mul r6, r7, r6\n\t"
  47146. "lsr r7, r6, #16\n\t"
  47147. "lsl r6, r6, #16\n\t"
  47148. "adds r5, r5, r6\n\t"
  47149. "adcs r3, r3, r7\n\t"
  47150. "adc r4, r4, #0\n\t"
  47151. #else
  47152. "umull r6, r7, %[b], r8\n\t"
  47153. "adds r5, r5, r6\n\t"
  47154. "adcs r3, r3, r7\n\t"
  47155. "mov r4, #0\n\t"
  47156. "adc r4, r4, #0\n\t"
  47157. #endif
  47158. "str r5, [%[r]], #4\n\t"
  47159. /* A[42] * B */
  47160. "ldr r8, [%[a]], #4\n\t"
  47161. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47162. "lsl r6, %[b], #16\n\t"
  47163. "lsl r7, r8, #16\n\t"
  47164. "lsr r6, r6, #16\n\t"
  47165. "lsr r7, r7, #16\n\t"
  47166. "mul r7, r6, r7\n\t"
  47167. "adds r3, r3, r7\n\t"
  47168. "adcs r4, r4, #0\n\t"
  47169. "mov r5, #0\n\t"
  47170. "adc r5, r5, #0\n\t"
  47171. "lsr r7, r8, #16\n\t"
  47172. "mul r6, r7, r6\n\t"
  47173. "lsr r7, r6, #16\n\t"
  47174. "lsl r6, r6, #16\n\t"
  47175. "adds r3, r3, r6\n\t"
  47176. "adcs r4, r4, r7\n\t"
  47177. "adc r5, r5, #0\n\t"
  47178. "lsr r6, %[b], #16\n\t"
  47179. "lsr r7, r8, #16\n\t"
  47180. "mul r7, r6, r7\n\t"
  47181. "adds r4, r4, r7\n\t"
  47182. "adc r5, r5, #0\n\t"
  47183. "lsl r7, r8, #16\n\t"
  47184. "lsr r7, r7, #16\n\t"
  47185. "mul r6, r7, r6\n\t"
  47186. "lsr r7, r6, #16\n\t"
  47187. "lsl r6, r6, #16\n\t"
  47188. "adds r3, r3, r6\n\t"
  47189. "adcs r4, r4, r7\n\t"
  47190. "adc r5, r5, #0\n\t"
  47191. #else
  47192. "umull r6, r7, %[b], r8\n\t"
  47193. "adds r3, r3, r6\n\t"
  47194. "adcs r4, r4, r7\n\t"
  47195. "mov r5, #0\n\t"
  47196. "adc r5, r5, #0\n\t"
  47197. #endif
  47198. "str r3, [%[r]], #4\n\t"
  47199. /* A[43] * B */
  47200. "ldr r8, [%[a]], #4\n\t"
  47201. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47202. "lsl r6, %[b], #16\n\t"
  47203. "lsl r7, r8, #16\n\t"
  47204. "lsr r6, r6, #16\n\t"
  47205. "lsr r7, r7, #16\n\t"
  47206. "mul r7, r6, r7\n\t"
  47207. "adds r4, r4, r7\n\t"
  47208. "adcs r5, r5, #0\n\t"
  47209. "mov r3, #0\n\t"
  47210. "adc r3, r3, #0\n\t"
  47211. "lsr r7, r8, #16\n\t"
  47212. "mul r6, r7, r6\n\t"
  47213. "lsr r7, r6, #16\n\t"
  47214. "lsl r6, r6, #16\n\t"
  47215. "adds r4, r4, r6\n\t"
  47216. "adcs r5, r5, r7\n\t"
  47217. "adc r3, r3, #0\n\t"
  47218. "lsr r6, %[b], #16\n\t"
  47219. "lsr r7, r8, #16\n\t"
  47220. "mul r7, r6, r7\n\t"
  47221. "adds r5, r5, r7\n\t"
  47222. "adc r3, r3, #0\n\t"
  47223. "lsl r7, r8, #16\n\t"
  47224. "lsr r7, r7, #16\n\t"
  47225. "mul r6, r7, r6\n\t"
  47226. "lsr r7, r6, #16\n\t"
  47227. "lsl r6, r6, #16\n\t"
  47228. "adds r4, r4, r6\n\t"
  47229. "adcs r5, r5, r7\n\t"
  47230. "adc r3, r3, #0\n\t"
  47231. #else
  47232. "umull r6, r7, %[b], r8\n\t"
  47233. "adds r4, r4, r6\n\t"
  47234. "adcs r5, r5, r7\n\t"
  47235. "mov r3, #0\n\t"
  47236. "adc r3, r3, #0\n\t"
  47237. #endif
  47238. "str r4, [%[r]], #4\n\t"
  47239. /* A[44] * B */
  47240. "ldr r8, [%[a]], #4\n\t"
  47241. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47242. "lsl r6, %[b], #16\n\t"
  47243. "lsl r7, r8, #16\n\t"
  47244. "lsr r6, r6, #16\n\t"
  47245. "lsr r7, r7, #16\n\t"
  47246. "mul r7, r6, r7\n\t"
  47247. "adds r5, r5, r7\n\t"
  47248. "adcs r3, r3, #0\n\t"
  47249. "mov r4, #0\n\t"
  47250. "adc r4, r4, #0\n\t"
  47251. "lsr r7, r8, #16\n\t"
  47252. "mul r6, r7, r6\n\t"
  47253. "lsr r7, r6, #16\n\t"
  47254. "lsl r6, r6, #16\n\t"
  47255. "adds r5, r5, r6\n\t"
  47256. "adcs r3, r3, r7\n\t"
  47257. "adc r4, r4, #0\n\t"
  47258. "lsr r6, %[b], #16\n\t"
  47259. "lsr r7, r8, #16\n\t"
  47260. "mul r7, r6, r7\n\t"
  47261. "adds r3, r3, r7\n\t"
  47262. "adc r4, r4, #0\n\t"
  47263. "lsl r7, r8, #16\n\t"
  47264. "lsr r7, r7, #16\n\t"
  47265. "mul r6, r7, r6\n\t"
  47266. "lsr r7, r6, #16\n\t"
  47267. "lsl r6, r6, #16\n\t"
  47268. "adds r5, r5, r6\n\t"
  47269. "adcs r3, r3, r7\n\t"
  47270. "adc r4, r4, #0\n\t"
  47271. #else
  47272. "umull r6, r7, %[b], r8\n\t"
  47273. "adds r5, r5, r6\n\t"
  47274. "adcs r3, r3, r7\n\t"
  47275. "mov r4, #0\n\t"
  47276. "adc r4, r4, #0\n\t"
  47277. #endif
  47278. "str r5, [%[r]], #4\n\t"
  47279. /* A[45] * B */
  47280. "ldr r8, [%[a]], #4\n\t"
  47281. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47282. "lsl r6, %[b], #16\n\t"
  47283. "lsl r7, r8, #16\n\t"
  47284. "lsr r6, r6, #16\n\t"
  47285. "lsr r7, r7, #16\n\t"
  47286. "mul r7, r6, r7\n\t"
  47287. "adds r3, r3, r7\n\t"
  47288. "adcs r4, r4, #0\n\t"
  47289. "mov r5, #0\n\t"
  47290. "adc r5, r5, #0\n\t"
  47291. "lsr r7, r8, #16\n\t"
  47292. "mul r6, r7, r6\n\t"
  47293. "lsr r7, r6, #16\n\t"
  47294. "lsl r6, r6, #16\n\t"
  47295. "adds r3, r3, r6\n\t"
  47296. "adcs r4, r4, r7\n\t"
  47297. "adc r5, r5, #0\n\t"
  47298. "lsr r6, %[b], #16\n\t"
  47299. "lsr r7, r8, #16\n\t"
  47300. "mul r7, r6, r7\n\t"
  47301. "adds r4, r4, r7\n\t"
  47302. "adc r5, r5, #0\n\t"
  47303. "lsl r7, r8, #16\n\t"
  47304. "lsr r7, r7, #16\n\t"
  47305. "mul r6, r7, r6\n\t"
  47306. "lsr r7, r6, #16\n\t"
  47307. "lsl r6, r6, #16\n\t"
  47308. "adds r3, r3, r6\n\t"
  47309. "adcs r4, r4, r7\n\t"
  47310. "adc r5, r5, #0\n\t"
  47311. #else
  47312. "umull r6, r7, %[b], r8\n\t"
  47313. "adds r3, r3, r6\n\t"
  47314. "adcs r4, r4, r7\n\t"
  47315. "mov r5, #0\n\t"
  47316. "adc r5, r5, #0\n\t"
  47317. #endif
  47318. "str r3, [%[r]], #4\n\t"
  47319. /* A[46] * B */
  47320. "ldr r8, [%[a]], #4\n\t"
  47321. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47322. "lsl r6, %[b], #16\n\t"
  47323. "lsl r7, r8, #16\n\t"
  47324. "lsr r6, r6, #16\n\t"
  47325. "lsr r7, r7, #16\n\t"
  47326. "mul r7, r6, r7\n\t"
  47327. "adds r4, r4, r7\n\t"
  47328. "adcs r5, r5, #0\n\t"
  47329. "mov r3, #0\n\t"
  47330. "adc r3, r3, #0\n\t"
  47331. "lsr r7, r8, #16\n\t"
  47332. "mul r6, r7, r6\n\t"
  47333. "lsr r7, r6, #16\n\t"
  47334. "lsl r6, r6, #16\n\t"
  47335. "adds r4, r4, r6\n\t"
  47336. "adcs r5, r5, r7\n\t"
  47337. "adc r3, r3, #0\n\t"
  47338. "lsr r6, %[b], #16\n\t"
  47339. "lsr r7, r8, #16\n\t"
  47340. "mul r7, r6, r7\n\t"
  47341. "adds r5, r5, r7\n\t"
  47342. "adc r3, r3, #0\n\t"
  47343. "lsl r7, r8, #16\n\t"
  47344. "lsr r7, r7, #16\n\t"
  47345. "mul r6, r7, r6\n\t"
  47346. "lsr r7, r6, #16\n\t"
  47347. "lsl r6, r6, #16\n\t"
  47348. "adds r4, r4, r6\n\t"
  47349. "adcs r5, r5, r7\n\t"
  47350. "adc r3, r3, #0\n\t"
  47351. #else
  47352. "umull r6, r7, %[b], r8\n\t"
  47353. "adds r4, r4, r6\n\t"
  47354. "adcs r5, r5, r7\n\t"
  47355. "mov r3, #0\n\t"
  47356. "adc r3, r3, #0\n\t"
  47357. #endif
  47358. "str r4, [%[r]], #4\n\t"
  47359. /* A[47] * B */
  47360. "ldr r8, [%[a]], #4\n\t"
  47361. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47362. "lsl r6, %[b], #16\n\t"
  47363. "lsl r7, r8, #16\n\t"
  47364. "lsr r6, r6, #16\n\t"
  47365. "lsr r7, r7, #16\n\t"
  47366. "mul r7, r6, r7\n\t"
  47367. "adds r5, r5, r7\n\t"
  47368. "adcs r3, r3, #0\n\t"
  47369. "mov r4, #0\n\t"
  47370. "adc r4, r4, #0\n\t"
  47371. "lsr r7, r8, #16\n\t"
  47372. "mul r6, r7, r6\n\t"
  47373. "lsr r7, r6, #16\n\t"
  47374. "lsl r6, r6, #16\n\t"
  47375. "adds r5, r5, r6\n\t"
  47376. "adcs r3, r3, r7\n\t"
  47377. "adc r4, r4, #0\n\t"
  47378. "lsr r6, %[b], #16\n\t"
  47379. "lsr r7, r8, #16\n\t"
  47380. "mul r7, r6, r7\n\t"
  47381. "adds r3, r3, r7\n\t"
  47382. "adc r4, r4, #0\n\t"
  47383. "lsl r7, r8, #16\n\t"
  47384. "lsr r7, r7, #16\n\t"
  47385. "mul r6, r7, r6\n\t"
  47386. "lsr r7, r6, #16\n\t"
  47387. "lsl r6, r6, #16\n\t"
  47388. "adds r5, r5, r6\n\t"
  47389. "adcs r3, r3, r7\n\t"
  47390. "adc r4, r4, #0\n\t"
  47391. #else
  47392. "umull r6, r7, %[b], r8\n\t"
  47393. "adds r5, r5, r6\n\t"
  47394. "adcs r3, r3, r7\n\t"
  47395. "mov r4, #0\n\t"
  47396. "adc r4, r4, #0\n\t"
  47397. #endif
  47398. "str r5, [%[r]], #4\n\t"
  47399. /* A[48] * B */
  47400. "ldr r8, [%[a]], #4\n\t"
  47401. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47402. "lsl r6, %[b], #16\n\t"
  47403. "lsl r7, r8, #16\n\t"
  47404. "lsr r6, r6, #16\n\t"
  47405. "lsr r7, r7, #16\n\t"
  47406. "mul r7, r6, r7\n\t"
  47407. "adds r3, r3, r7\n\t"
  47408. "adcs r4, r4, #0\n\t"
  47409. "mov r5, #0\n\t"
  47410. "adc r5, r5, #0\n\t"
  47411. "lsr r7, r8, #16\n\t"
  47412. "mul r6, r7, r6\n\t"
  47413. "lsr r7, r6, #16\n\t"
  47414. "lsl r6, r6, #16\n\t"
  47415. "adds r3, r3, r6\n\t"
  47416. "adcs r4, r4, r7\n\t"
  47417. "adc r5, r5, #0\n\t"
  47418. "lsr r6, %[b], #16\n\t"
  47419. "lsr r7, r8, #16\n\t"
  47420. "mul r7, r6, r7\n\t"
  47421. "adds r4, r4, r7\n\t"
  47422. "adc r5, r5, #0\n\t"
  47423. "lsl r7, r8, #16\n\t"
  47424. "lsr r7, r7, #16\n\t"
  47425. "mul r6, r7, r6\n\t"
  47426. "lsr r7, r6, #16\n\t"
  47427. "lsl r6, r6, #16\n\t"
  47428. "adds r3, r3, r6\n\t"
  47429. "adcs r4, r4, r7\n\t"
  47430. "adc r5, r5, #0\n\t"
  47431. #else
  47432. "umull r6, r7, %[b], r8\n\t"
  47433. "adds r3, r3, r6\n\t"
  47434. "adcs r4, r4, r7\n\t"
  47435. "mov r5, #0\n\t"
  47436. "adc r5, r5, #0\n\t"
  47437. #endif
  47438. "str r3, [%[r]], #4\n\t"
  47439. /* A[49] * B */
  47440. "ldr r8, [%[a]], #4\n\t"
  47441. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47442. "lsl r6, %[b], #16\n\t"
  47443. "lsl r7, r8, #16\n\t"
  47444. "lsr r6, r6, #16\n\t"
  47445. "lsr r7, r7, #16\n\t"
  47446. "mul r7, r6, r7\n\t"
  47447. "adds r4, r4, r7\n\t"
  47448. "adcs r5, r5, #0\n\t"
  47449. "mov r3, #0\n\t"
  47450. "adc r3, r3, #0\n\t"
  47451. "lsr r7, r8, #16\n\t"
  47452. "mul r6, r7, r6\n\t"
  47453. "lsr r7, r6, #16\n\t"
  47454. "lsl r6, r6, #16\n\t"
  47455. "adds r4, r4, r6\n\t"
  47456. "adcs r5, r5, r7\n\t"
  47457. "adc r3, r3, #0\n\t"
  47458. "lsr r6, %[b], #16\n\t"
  47459. "lsr r7, r8, #16\n\t"
  47460. "mul r7, r6, r7\n\t"
  47461. "adds r5, r5, r7\n\t"
  47462. "adc r3, r3, #0\n\t"
  47463. "lsl r7, r8, #16\n\t"
  47464. "lsr r7, r7, #16\n\t"
  47465. "mul r6, r7, r6\n\t"
  47466. "lsr r7, r6, #16\n\t"
  47467. "lsl r6, r6, #16\n\t"
  47468. "adds r4, r4, r6\n\t"
  47469. "adcs r5, r5, r7\n\t"
  47470. "adc r3, r3, #0\n\t"
  47471. #else
  47472. "umull r6, r7, %[b], r8\n\t"
  47473. "adds r4, r4, r6\n\t"
  47474. "adcs r5, r5, r7\n\t"
  47475. "mov r3, #0\n\t"
  47476. "adc r3, r3, #0\n\t"
  47477. #endif
  47478. "str r4, [%[r]], #4\n\t"
  47479. /* A[50] * B */
  47480. "ldr r8, [%[a]], #4\n\t"
  47481. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47482. "lsl r6, %[b], #16\n\t"
  47483. "lsl r7, r8, #16\n\t"
  47484. "lsr r6, r6, #16\n\t"
  47485. "lsr r7, r7, #16\n\t"
  47486. "mul r7, r6, r7\n\t"
  47487. "adds r5, r5, r7\n\t"
  47488. "adcs r3, r3, #0\n\t"
  47489. "mov r4, #0\n\t"
  47490. "adc r4, r4, #0\n\t"
  47491. "lsr r7, r8, #16\n\t"
  47492. "mul r6, r7, r6\n\t"
  47493. "lsr r7, r6, #16\n\t"
  47494. "lsl r6, r6, #16\n\t"
  47495. "adds r5, r5, r6\n\t"
  47496. "adcs r3, r3, r7\n\t"
  47497. "adc r4, r4, #0\n\t"
  47498. "lsr r6, %[b], #16\n\t"
  47499. "lsr r7, r8, #16\n\t"
  47500. "mul r7, r6, r7\n\t"
  47501. "adds r3, r3, r7\n\t"
  47502. "adc r4, r4, #0\n\t"
  47503. "lsl r7, r8, #16\n\t"
  47504. "lsr r7, r7, #16\n\t"
  47505. "mul r6, r7, r6\n\t"
  47506. "lsr r7, r6, #16\n\t"
  47507. "lsl r6, r6, #16\n\t"
  47508. "adds r5, r5, r6\n\t"
  47509. "adcs r3, r3, r7\n\t"
  47510. "adc r4, r4, #0\n\t"
  47511. #else
  47512. "umull r6, r7, %[b], r8\n\t"
  47513. "adds r5, r5, r6\n\t"
  47514. "adcs r3, r3, r7\n\t"
  47515. "mov r4, #0\n\t"
  47516. "adc r4, r4, #0\n\t"
  47517. #endif
  47518. "str r5, [%[r]], #4\n\t"
  47519. /* A[51] * B */
  47520. "ldr r8, [%[a]], #4\n\t"
  47521. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47522. "lsl r6, %[b], #16\n\t"
  47523. "lsl r7, r8, #16\n\t"
  47524. "lsr r6, r6, #16\n\t"
  47525. "lsr r7, r7, #16\n\t"
  47526. "mul r7, r6, r7\n\t"
  47527. "adds r3, r3, r7\n\t"
  47528. "adcs r4, r4, #0\n\t"
  47529. "mov r5, #0\n\t"
  47530. "adc r5, r5, #0\n\t"
  47531. "lsr r7, r8, #16\n\t"
  47532. "mul r6, r7, r6\n\t"
  47533. "lsr r7, r6, #16\n\t"
  47534. "lsl r6, r6, #16\n\t"
  47535. "adds r3, r3, r6\n\t"
  47536. "adcs r4, r4, r7\n\t"
  47537. "adc r5, r5, #0\n\t"
  47538. "lsr r6, %[b], #16\n\t"
  47539. "lsr r7, r8, #16\n\t"
  47540. "mul r7, r6, r7\n\t"
  47541. "adds r4, r4, r7\n\t"
  47542. "adc r5, r5, #0\n\t"
  47543. "lsl r7, r8, #16\n\t"
  47544. "lsr r7, r7, #16\n\t"
  47545. "mul r6, r7, r6\n\t"
  47546. "lsr r7, r6, #16\n\t"
  47547. "lsl r6, r6, #16\n\t"
  47548. "adds r3, r3, r6\n\t"
  47549. "adcs r4, r4, r7\n\t"
  47550. "adc r5, r5, #0\n\t"
  47551. #else
  47552. "umull r6, r7, %[b], r8\n\t"
  47553. "adds r3, r3, r6\n\t"
  47554. "adcs r4, r4, r7\n\t"
  47555. "mov r5, #0\n\t"
  47556. "adc r5, r5, #0\n\t"
  47557. #endif
  47558. "str r3, [%[r]], #4\n\t"
  47559. /* A[52] * B */
  47560. "ldr r8, [%[a]], #4\n\t"
  47561. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47562. "lsl r6, %[b], #16\n\t"
  47563. "lsl r7, r8, #16\n\t"
  47564. "lsr r6, r6, #16\n\t"
  47565. "lsr r7, r7, #16\n\t"
  47566. "mul r7, r6, r7\n\t"
  47567. "adds r4, r4, r7\n\t"
  47568. "adcs r5, r5, #0\n\t"
  47569. "mov r3, #0\n\t"
  47570. "adc r3, r3, #0\n\t"
  47571. "lsr r7, r8, #16\n\t"
  47572. "mul r6, r7, r6\n\t"
  47573. "lsr r7, r6, #16\n\t"
  47574. "lsl r6, r6, #16\n\t"
  47575. "adds r4, r4, r6\n\t"
  47576. "adcs r5, r5, r7\n\t"
  47577. "adc r3, r3, #0\n\t"
  47578. "lsr r6, %[b], #16\n\t"
  47579. "lsr r7, r8, #16\n\t"
  47580. "mul r7, r6, r7\n\t"
  47581. "adds r5, r5, r7\n\t"
  47582. "adc r3, r3, #0\n\t"
  47583. "lsl r7, r8, #16\n\t"
  47584. "lsr r7, r7, #16\n\t"
  47585. "mul r6, r7, r6\n\t"
  47586. "lsr r7, r6, #16\n\t"
  47587. "lsl r6, r6, #16\n\t"
  47588. "adds r4, r4, r6\n\t"
  47589. "adcs r5, r5, r7\n\t"
  47590. "adc r3, r3, #0\n\t"
  47591. #else
  47592. "umull r6, r7, %[b], r8\n\t"
  47593. "adds r4, r4, r6\n\t"
  47594. "adcs r5, r5, r7\n\t"
  47595. "mov r3, #0\n\t"
  47596. "adc r3, r3, #0\n\t"
  47597. #endif
  47598. "str r4, [%[r]], #4\n\t"
  47599. /* A[53] * B */
  47600. "ldr r8, [%[a]], #4\n\t"
  47601. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47602. "lsl r6, %[b], #16\n\t"
  47603. "lsl r7, r8, #16\n\t"
  47604. "lsr r6, r6, #16\n\t"
  47605. "lsr r7, r7, #16\n\t"
  47606. "mul r7, r6, r7\n\t"
  47607. "adds r5, r5, r7\n\t"
  47608. "adcs r3, r3, #0\n\t"
  47609. "mov r4, #0\n\t"
  47610. "adc r4, r4, #0\n\t"
  47611. "lsr r7, r8, #16\n\t"
  47612. "mul r6, r7, r6\n\t"
  47613. "lsr r7, r6, #16\n\t"
  47614. "lsl r6, r6, #16\n\t"
  47615. "adds r5, r5, r6\n\t"
  47616. "adcs r3, r3, r7\n\t"
  47617. "adc r4, r4, #0\n\t"
  47618. "lsr r6, %[b], #16\n\t"
  47619. "lsr r7, r8, #16\n\t"
  47620. "mul r7, r6, r7\n\t"
  47621. "adds r3, r3, r7\n\t"
  47622. "adc r4, r4, #0\n\t"
  47623. "lsl r7, r8, #16\n\t"
  47624. "lsr r7, r7, #16\n\t"
  47625. "mul r6, r7, r6\n\t"
  47626. "lsr r7, r6, #16\n\t"
  47627. "lsl r6, r6, #16\n\t"
  47628. "adds r5, r5, r6\n\t"
  47629. "adcs r3, r3, r7\n\t"
  47630. "adc r4, r4, #0\n\t"
  47631. #else
  47632. "umull r6, r7, %[b], r8\n\t"
  47633. "adds r5, r5, r6\n\t"
  47634. "adcs r3, r3, r7\n\t"
  47635. "mov r4, #0\n\t"
  47636. "adc r4, r4, #0\n\t"
  47637. #endif
  47638. "str r5, [%[r]], #4\n\t"
  47639. /* A[54] * B */
  47640. "ldr r8, [%[a]], #4\n\t"
  47641. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47642. "lsl r6, %[b], #16\n\t"
  47643. "lsl r7, r8, #16\n\t"
  47644. "lsr r6, r6, #16\n\t"
  47645. "lsr r7, r7, #16\n\t"
  47646. "mul r7, r6, r7\n\t"
  47647. "adds r3, r3, r7\n\t"
  47648. "adcs r4, r4, #0\n\t"
  47649. "mov r5, #0\n\t"
  47650. "adc r5, r5, #0\n\t"
  47651. "lsr r7, r8, #16\n\t"
  47652. "mul r6, r7, r6\n\t"
  47653. "lsr r7, r6, #16\n\t"
  47654. "lsl r6, r6, #16\n\t"
  47655. "adds r3, r3, r6\n\t"
  47656. "adcs r4, r4, r7\n\t"
  47657. "adc r5, r5, #0\n\t"
  47658. "lsr r6, %[b], #16\n\t"
  47659. "lsr r7, r8, #16\n\t"
  47660. "mul r7, r6, r7\n\t"
  47661. "adds r4, r4, r7\n\t"
  47662. "adc r5, r5, #0\n\t"
  47663. "lsl r7, r8, #16\n\t"
  47664. "lsr r7, r7, #16\n\t"
  47665. "mul r6, r7, r6\n\t"
  47666. "lsr r7, r6, #16\n\t"
  47667. "lsl r6, r6, #16\n\t"
  47668. "adds r3, r3, r6\n\t"
  47669. "adcs r4, r4, r7\n\t"
  47670. "adc r5, r5, #0\n\t"
  47671. #else
  47672. "umull r6, r7, %[b], r8\n\t"
  47673. "adds r3, r3, r6\n\t"
  47674. "adcs r4, r4, r7\n\t"
  47675. "mov r5, #0\n\t"
  47676. "adc r5, r5, #0\n\t"
  47677. #endif
  47678. "str r3, [%[r]], #4\n\t"
  47679. /* A[55] * B */
  47680. "ldr r8, [%[a]], #4\n\t"
  47681. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47682. "lsl r6, %[b], #16\n\t"
  47683. "lsl r7, r8, #16\n\t"
  47684. "lsr r6, r6, #16\n\t"
  47685. "lsr r7, r7, #16\n\t"
  47686. "mul r7, r6, r7\n\t"
  47687. "adds r4, r4, r7\n\t"
  47688. "adcs r5, r5, #0\n\t"
  47689. "mov r3, #0\n\t"
  47690. "adc r3, r3, #0\n\t"
  47691. "lsr r7, r8, #16\n\t"
  47692. "mul r6, r7, r6\n\t"
  47693. "lsr r7, r6, #16\n\t"
  47694. "lsl r6, r6, #16\n\t"
  47695. "adds r4, r4, r6\n\t"
  47696. "adcs r5, r5, r7\n\t"
  47697. "adc r3, r3, #0\n\t"
  47698. "lsr r6, %[b], #16\n\t"
  47699. "lsr r7, r8, #16\n\t"
  47700. "mul r7, r6, r7\n\t"
  47701. "adds r5, r5, r7\n\t"
  47702. "adc r3, r3, #0\n\t"
  47703. "lsl r7, r8, #16\n\t"
  47704. "lsr r7, r7, #16\n\t"
  47705. "mul r6, r7, r6\n\t"
  47706. "lsr r7, r6, #16\n\t"
  47707. "lsl r6, r6, #16\n\t"
  47708. "adds r4, r4, r6\n\t"
  47709. "adcs r5, r5, r7\n\t"
  47710. "adc r3, r3, #0\n\t"
  47711. #else
  47712. "umull r6, r7, %[b], r8\n\t"
  47713. "adds r4, r4, r6\n\t"
  47714. "adcs r5, r5, r7\n\t"
  47715. "mov r3, #0\n\t"
  47716. "adc r3, r3, #0\n\t"
  47717. #endif
  47718. "str r4, [%[r]], #4\n\t"
  47719. /* A[56] * B */
  47720. "ldr r8, [%[a]], #4\n\t"
  47721. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47722. "lsl r6, %[b], #16\n\t"
  47723. "lsl r7, r8, #16\n\t"
  47724. "lsr r6, r6, #16\n\t"
  47725. "lsr r7, r7, #16\n\t"
  47726. "mul r7, r6, r7\n\t"
  47727. "adds r5, r5, r7\n\t"
  47728. "adcs r3, r3, #0\n\t"
  47729. "mov r4, #0\n\t"
  47730. "adc r4, r4, #0\n\t"
  47731. "lsr r7, r8, #16\n\t"
  47732. "mul r6, r7, r6\n\t"
  47733. "lsr r7, r6, #16\n\t"
  47734. "lsl r6, r6, #16\n\t"
  47735. "adds r5, r5, r6\n\t"
  47736. "adcs r3, r3, r7\n\t"
  47737. "adc r4, r4, #0\n\t"
  47738. "lsr r6, %[b], #16\n\t"
  47739. "lsr r7, r8, #16\n\t"
  47740. "mul r7, r6, r7\n\t"
  47741. "adds r3, r3, r7\n\t"
  47742. "adc r4, r4, #0\n\t"
  47743. "lsl r7, r8, #16\n\t"
  47744. "lsr r7, r7, #16\n\t"
  47745. "mul r6, r7, r6\n\t"
  47746. "lsr r7, r6, #16\n\t"
  47747. "lsl r6, r6, #16\n\t"
  47748. "adds r5, r5, r6\n\t"
  47749. "adcs r3, r3, r7\n\t"
  47750. "adc r4, r4, #0\n\t"
  47751. #else
  47752. "umull r6, r7, %[b], r8\n\t"
  47753. "adds r5, r5, r6\n\t"
  47754. "adcs r3, r3, r7\n\t"
  47755. "mov r4, #0\n\t"
  47756. "adc r4, r4, #0\n\t"
  47757. #endif
  47758. "str r5, [%[r]], #4\n\t"
  47759. /* A[57] * B */
  47760. "ldr r8, [%[a]], #4\n\t"
  47761. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47762. "lsl r6, %[b], #16\n\t"
  47763. "lsl r7, r8, #16\n\t"
  47764. "lsr r6, r6, #16\n\t"
  47765. "lsr r7, r7, #16\n\t"
  47766. "mul r7, r6, r7\n\t"
  47767. "adds r3, r3, r7\n\t"
  47768. "adcs r4, r4, #0\n\t"
  47769. "mov r5, #0\n\t"
  47770. "adc r5, r5, #0\n\t"
  47771. "lsr r7, r8, #16\n\t"
  47772. "mul r6, r7, r6\n\t"
  47773. "lsr r7, r6, #16\n\t"
  47774. "lsl r6, r6, #16\n\t"
  47775. "adds r3, r3, r6\n\t"
  47776. "adcs r4, r4, r7\n\t"
  47777. "adc r5, r5, #0\n\t"
  47778. "lsr r6, %[b], #16\n\t"
  47779. "lsr r7, r8, #16\n\t"
  47780. "mul r7, r6, r7\n\t"
  47781. "adds r4, r4, r7\n\t"
  47782. "adc r5, r5, #0\n\t"
  47783. "lsl r7, r8, #16\n\t"
  47784. "lsr r7, r7, #16\n\t"
  47785. "mul r6, r7, r6\n\t"
  47786. "lsr r7, r6, #16\n\t"
  47787. "lsl r6, r6, #16\n\t"
  47788. "adds r3, r3, r6\n\t"
  47789. "adcs r4, r4, r7\n\t"
  47790. "adc r5, r5, #0\n\t"
  47791. #else
  47792. "umull r6, r7, %[b], r8\n\t"
  47793. "adds r3, r3, r6\n\t"
  47794. "adcs r4, r4, r7\n\t"
  47795. "mov r5, #0\n\t"
  47796. "adc r5, r5, #0\n\t"
  47797. #endif
  47798. "str r3, [%[r]], #4\n\t"
  47799. /* A[58] * B */
  47800. "ldr r8, [%[a]], #4\n\t"
  47801. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47802. "lsl r6, %[b], #16\n\t"
  47803. "lsl r7, r8, #16\n\t"
  47804. "lsr r6, r6, #16\n\t"
  47805. "lsr r7, r7, #16\n\t"
  47806. "mul r7, r6, r7\n\t"
  47807. "adds r4, r4, r7\n\t"
  47808. "adcs r5, r5, #0\n\t"
  47809. "mov r3, #0\n\t"
  47810. "adc r3, r3, #0\n\t"
  47811. "lsr r7, r8, #16\n\t"
  47812. "mul r6, r7, r6\n\t"
  47813. "lsr r7, r6, #16\n\t"
  47814. "lsl r6, r6, #16\n\t"
  47815. "adds r4, r4, r6\n\t"
  47816. "adcs r5, r5, r7\n\t"
  47817. "adc r3, r3, #0\n\t"
  47818. "lsr r6, %[b], #16\n\t"
  47819. "lsr r7, r8, #16\n\t"
  47820. "mul r7, r6, r7\n\t"
  47821. "adds r5, r5, r7\n\t"
  47822. "adc r3, r3, #0\n\t"
  47823. "lsl r7, r8, #16\n\t"
  47824. "lsr r7, r7, #16\n\t"
  47825. "mul r6, r7, r6\n\t"
  47826. "lsr r7, r6, #16\n\t"
  47827. "lsl r6, r6, #16\n\t"
  47828. "adds r4, r4, r6\n\t"
  47829. "adcs r5, r5, r7\n\t"
  47830. "adc r3, r3, #0\n\t"
  47831. #else
  47832. "umull r6, r7, %[b], r8\n\t"
  47833. "adds r4, r4, r6\n\t"
  47834. "adcs r5, r5, r7\n\t"
  47835. "mov r3, #0\n\t"
  47836. "adc r3, r3, #0\n\t"
  47837. #endif
  47838. "str r4, [%[r]], #4\n\t"
  47839. /* A[59] * B */
  47840. "ldr r8, [%[a]], #4\n\t"
  47841. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47842. "lsl r6, %[b], #16\n\t"
  47843. "lsl r7, r8, #16\n\t"
  47844. "lsr r6, r6, #16\n\t"
  47845. "lsr r7, r7, #16\n\t"
  47846. "mul r7, r6, r7\n\t"
  47847. "adds r5, r5, r7\n\t"
  47848. "adcs r3, r3, #0\n\t"
  47849. "mov r4, #0\n\t"
  47850. "adc r4, r4, #0\n\t"
  47851. "lsr r7, r8, #16\n\t"
  47852. "mul r6, r7, r6\n\t"
  47853. "lsr r7, r6, #16\n\t"
  47854. "lsl r6, r6, #16\n\t"
  47855. "adds r5, r5, r6\n\t"
  47856. "adcs r3, r3, r7\n\t"
  47857. "adc r4, r4, #0\n\t"
  47858. "lsr r6, %[b], #16\n\t"
  47859. "lsr r7, r8, #16\n\t"
  47860. "mul r7, r6, r7\n\t"
  47861. "adds r3, r3, r7\n\t"
  47862. "adc r4, r4, #0\n\t"
  47863. "lsl r7, r8, #16\n\t"
  47864. "lsr r7, r7, #16\n\t"
  47865. "mul r6, r7, r6\n\t"
  47866. "lsr r7, r6, #16\n\t"
  47867. "lsl r6, r6, #16\n\t"
  47868. "adds r5, r5, r6\n\t"
  47869. "adcs r3, r3, r7\n\t"
  47870. "adc r4, r4, #0\n\t"
  47871. #else
  47872. "umull r6, r7, %[b], r8\n\t"
  47873. "adds r5, r5, r6\n\t"
  47874. "adcs r3, r3, r7\n\t"
  47875. "mov r4, #0\n\t"
  47876. "adc r4, r4, #0\n\t"
  47877. #endif
  47878. "str r5, [%[r]], #4\n\t"
  47879. /* A[60] * B */
  47880. "ldr r8, [%[a]], #4\n\t"
  47881. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47882. "lsl r6, %[b], #16\n\t"
  47883. "lsl r7, r8, #16\n\t"
  47884. "lsr r6, r6, #16\n\t"
  47885. "lsr r7, r7, #16\n\t"
  47886. "mul r7, r6, r7\n\t"
  47887. "adds r3, r3, r7\n\t"
  47888. "adcs r4, r4, #0\n\t"
  47889. "mov r5, #0\n\t"
  47890. "adc r5, r5, #0\n\t"
  47891. "lsr r7, r8, #16\n\t"
  47892. "mul r6, r7, r6\n\t"
  47893. "lsr r7, r6, #16\n\t"
  47894. "lsl r6, r6, #16\n\t"
  47895. "adds r3, r3, r6\n\t"
  47896. "adcs r4, r4, r7\n\t"
  47897. "adc r5, r5, #0\n\t"
  47898. "lsr r6, %[b], #16\n\t"
  47899. "lsr r7, r8, #16\n\t"
  47900. "mul r7, r6, r7\n\t"
  47901. "adds r4, r4, r7\n\t"
  47902. "adc r5, r5, #0\n\t"
  47903. "lsl r7, r8, #16\n\t"
  47904. "lsr r7, r7, #16\n\t"
  47905. "mul r6, r7, r6\n\t"
  47906. "lsr r7, r6, #16\n\t"
  47907. "lsl r6, r6, #16\n\t"
  47908. "adds r3, r3, r6\n\t"
  47909. "adcs r4, r4, r7\n\t"
  47910. "adc r5, r5, #0\n\t"
  47911. #else
  47912. "umull r6, r7, %[b], r8\n\t"
  47913. "adds r3, r3, r6\n\t"
  47914. "adcs r4, r4, r7\n\t"
  47915. "mov r5, #0\n\t"
  47916. "adc r5, r5, #0\n\t"
  47917. #endif
  47918. "str r3, [%[r]], #4\n\t"
  47919. /* A[61] * B */
  47920. "ldr r8, [%[a]], #4\n\t"
  47921. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47922. "lsl r6, %[b], #16\n\t"
  47923. "lsl r7, r8, #16\n\t"
  47924. "lsr r6, r6, #16\n\t"
  47925. "lsr r7, r7, #16\n\t"
  47926. "mul r7, r6, r7\n\t"
  47927. "adds r4, r4, r7\n\t"
  47928. "adcs r5, r5, #0\n\t"
  47929. "mov r3, #0\n\t"
  47930. "adc r3, r3, #0\n\t"
  47931. "lsr r7, r8, #16\n\t"
  47932. "mul r6, r7, r6\n\t"
  47933. "lsr r7, r6, #16\n\t"
  47934. "lsl r6, r6, #16\n\t"
  47935. "adds r4, r4, r6\n\t"
  47936. "adcs r5, r5, r7\n\t"
  47937. "adc r3, r3, #0\n\t"
  47938. "lsr r6, %[b], #16\n\t"
  47939. "lsr r7, r8, #16\n\t"
  47940. "mul r7, r6, r7\n\t"
  47941. "adds r5, r5, r7\n\t"
  47942. "adc r3, r3, #0\n\t"
  47943. "lsl r7, r8, #16\n\t"
  47944. "lsr r7, r7, #16\n\t"
  47945. "mul r6, r7, r6\n\t"
  47946. "lsr r7, r6, #16\n\t"
  47947. "lsl r6, r6, #16\n\t"
  47948. "adds r4, r4, r6\n\t"
  47949. "adcs r5, r5, r7\n\t"
  47950. "adc r3, r3, #0\n\t"
  47951. #else
  47952. "umull r6, r7, %[b], r8\n\t"
  47953. "adds r4, r4, r6\n\t"
  47954. "adcs r5, r5, r7\n\t"
  47955. "mov r3, #0\n\t"
  47956. "adc r3, r3, #0\n\t"
  47957. #endif
  47958. "str r4, [%[r]], #4\n\t"
  47959. /* A[62] * B */
  47960. "ldr r8, [%[a]], #4\n\t"
  47961. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  47962. "lsl r6, %[b], #16\n\t"
  47963. "lsl r7, r8, #16\n\t"
  47964. "lsr r6, r6, #16\n\t"
  47965. "lsr r7, r7, #16\n\t"
  47966. "mul r7, r6, r7\n\t"
  47967. "adds r5, r5, r7\n\t"
  47968. "adcs r3, r3, #0\n\t"
  47969. "mov r4, #0\n\t"
  47970. "adc r4, r4, #0\n\t"
  47971. "lsr r7, r8, #16\n\t"
  47972. "mul r6, r7, r6\n\t"
  47973. "lsr r7, r6, #16\n\t"
  47974. "lsl r6, r6, #16\n\t"
  47975. "adds r5, r5, r6\n\t"
  47976. "adcs r3, r3, r7\n\t"
  47977. "adc r4, r4, #0\n\t"
  47978. "lsr r6, %[b], #16\n\t"
  47979. "lsr r7, r8, #16\n\t"
  47980. "mul r7, r6, r7\n\t"
  47981. "adds r3, r3, r7\n\t"
  47982. "adc r4, r4, #0\n\t"
  47983. "lsl r7, r8, #16\n\t"
  47984. "lsr r7, r7, #16\n\t"
  47985. "mul r6, r7, r6\n\t"
  47986. "lsr r7, r6, #16\n\t"
  47987. "lsl r6, r6, #16\n\t"
  47988. "adds r5, r5, r6\n\t"
  47989. "adcs r3, r3, r7\n\t"
  47990. "adc r4, r4, #0\n\t"
  47991. #else
  47992. "umull r6, r7, %[b], r8\n\t"
  47993. "adds r5, r5, r6\n\t"
  47994. "adcs r3, r3, r7\n\t"
  47995. "mov r4, #0\n\t"
  47996. "adc r4, r4, #0\n\t"
  47997. #endif
  47998. "str r5, [%[r]], #4\n\t"
  47999. /* A[63] * B */
  48000. "ldr r8, [%[a]], #4\n\t"
  48001. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48002. "lsl r6, %[b], #16\n\t"
  48003. "lsl r7, r8, #16\n\t"
  48004. "lsr r6, r6, #16\n\t"
  48005. "lsr r7, r7, #16\n\t"
  48006. "mul r7, r6, r7\n\t"
  48007. "adds r3, r3, r7\n\t"
  48008. "adcs r4, r4, #0\n\t"
  48009. "mov r5, #0\n\t"
  48010. "adc r5, r5, #0\n\t"
  48011. "lsr r7, r8, #16\n\t"
  48012. "mul r6, r7, r6\n\t"
  48013. "lsr r7, r6, #16\n\t"
  48014. "lsl r6, r6, #16\n\t"
  48015. "adds r3, r3, r6\n\t"
  48016. "adcs r4, r4, r7\n\t"
  48017. "adc r5, r5, #0\n\t"
  48018. "lsr r6, %[b], #16\n\t"
  48019. "lsr r7, r8, #16\n\t"
  48020. "mul r7, r6, r7\n\t"
  48021. "adds r4, r4, r7\n\t"
  48022. "adc r5, r5, #0\n\t"
  48023. "lsl r7, r8, #16\n\t"
  48024. "lsr r7, r7, #16\n\t"
  48025. "mul r6, r7, r6\n\t"
  48026. "lsr r7, r6, #16\n\t"
  48027. "lsl r6, r6, #16\n\t"
  48028. "adds r3, r3, r6\n\t"
  48029. "adcs r4, r4, r7\n\t"
  48030. "adc r5, r5, #0\n\t"
  48031. #else
  48032. "umull r6, r7, %[b], r8\n\t"
  48033. "adds r3, r3, r6\n\t"
  48034. "adcs r4, r4, r7\n\t"
  48035. "mov r5, #0\n\t"
  48036. "adc r5, r5, #0\n\t"
  48037. #endif
  48038. "str r3, [%[r]], #4\n\t"
  48039. /* A[64] * B */
  48040. "ldr r8, [%[a]], #4\n\t"
  48041. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48042. "lsl r6, %[b], #16\n\t"
  48043. "lsl r7, r8, #16\n\t"
  48044. "lsr r6, r6, #16\n\t"
  48045. "lsr r7, r7, #16\n\t"
  48046. "mul r7, r6, r7\n\t"
  48047. "adds r4, r4, r7\n\t"
  48048. "adcs r5, r5, #0\n\t"
  48049. "mov r3, #0\n\t"
  48050. "adc r3, r3, #0\n\t"
  48051. "lsr r7, r8, #16\n\t"
  48052. "mul r6, r7, r6\n\t"
  48053. "lsr r7, r6, #16\n\t"
  48054. "lsl r6, r6, #16\n\t"
  48055. "adds r4, r4, r6\n\t"
  48056. "adcs r5, r5, r7\n\t"
  48057. "adc r3, r3, #0\n\t"
  48058. "lsr r6, %[b], #16\n\t"
  48059. "lsr r7, r8, #16\n\t"
  48060. "mul r7, r6, r7\n\t"
  48061. "adds r5, r5, r7\n\t"
  48062. "adc r3, r3, #0\n\t"
  48063. "lsl r7, r8, #16\n\t"
  48064. "lsr r7, r7, #16\n\t"
  48065. "mul r6, r7, r6\n\t"
  48066. "lsr r7, r6, #16\n\t"
  48067. "lsl r6, r6, #16\n\t"
  48068. "adds r4, r4, r6\n\t"
  48069. "adcs r5, r5, r7\n\t"
  48070. "adc r3, r3, #0\n\t"
  48071. #else
  48072. "umull r6, r7, %[b], r8\n\t"
  48073. "adds r4, r4, r6\n\t"
  48074. "adcs r5, r5, r7\n\t"
  48075. "mov r3, #0\n\t"
  48076. "adc r3, r3, #0\n\t"
  48077. #endif
  48078. "str r4, [%[r]], #4\n\t"
  48079. /* A[65] * B */
  48080. "ldr r8, [%[a]], #4\n\t"
  48081. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48082. "lsl r6, %[b], #16\n\t"
  48083. "lsl r7, r8, #16\n\t"
  48084. "lsr r6, r6, #16\n\t"
  48085. "lsr r7, r7, #16\n\t"
  48086. "mul r7, r6, r7\n\t"
  48087. "adds r5, r5, r7\n\t"
  48088. "adcs r3, r3, #0\n\t"
  48089. "mov r4, #0\n\t"
  48090. "adc r4, r4, #0\n\t"
  48091. "lsr r7, r8, #16\n\t"
  48092. "mul r6, r7, r6\n\t"
  48093. "lsr r7, r6, #16\n\t"
  48094. "lsl r6, r6, #16\n\t"
  48095. "adds r5, r5, r6\n\t"
  48096. "adcs r3, r3, r7\n\t"
  48097. "adc r4, r4, #0\n\t"
  48098. "lsr r6, %[b], #16\n\t"
  48099. "lsr r7, r8, #16\n\t"
  48100. "mul r7, r6, r7\n\t"
  48101. "adds r3, r3, r7\n\t"
  48102. "adc r4, r4, #0\n\t"
  48103. "lsl r7, r8, #16\n\t"
  48104. "lsr r7, r7, #16\n\t"
  48105. "mul r6, r7, r6\n\t"
  48106. "lsr r7, r6, #16\n\t"
  48107. "lsl r6, r6, #16\n\t"
  48108. "adds r5, r5, r6\n\t"
  48109. "adcs r3, r3, r7\n\t"
  48110. "adc r4, r4, #0\n\t"
  48111. #else
  48112. "umull r6, r7, %[b], r8\n\t"
  48113. "adds r5, r5, r6\n\t"
  48114. "adcs r3, r3, r7\n\t"
  48115. "mov r4, #0\n\t"
  48116. "adc r4, r4, #0\n\t"
  48117. #endif
  48118. "str r5, [%[r]], #4\n\t"
  48119. /* A[66] * B */
  48120. "ldr r8, [%[a]], #4\n\t"
  48121. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48122. "lsl r6, %[b], #16\n\t"
  48123. "lsl r7, r8, #16\n\t"
  48124. "lsr r6, r6, #16\n\t"
  48125. "lsr r7, r7, #16\n\t"
  48126. "mul r7, r6, r7\n\t"
  48127. "adds r3, r3, r7\n\t"
  48128. "adcs r4, r4, #0\n\t"
  48129. "mov r5, #0\n\t"
  48130. "adc r5, r5, #0\n\t"
  48131. "lsr r7, r8, #16\n\t"
  48132. "mul r6, r7, r6\n\t"
  48133. "lsr r7, r6, #16\n\t"
  48134. "lsl r6, r6, #16\n\t"
  48135. "adds r3, r3, r6\n\t"
  48136. "adcs r4, r4, r7\n\t"
  48137. "adc r5, r5, #0\n\t"
  48138. "lsr r6, %[b], #16\n\t"
  48139. "lsr r7, r8, #16\n\t"
  48140. "mul r7, r6, r7\n\t"
  48141. "adds r4, r4, r7\n\t"
  48142. "adc r5, r5, #0\n\t"
  48143. "lsl r7, r8, #16\n\t"
  48144. "lsr r7, r7, #16\n\t"
  48145. "mul r6, r7, r6\n\t"
  48146. "lsr r7, r6, #16\n\t"
  48147. "lsl r6, r6, #16\n\t"
  48148. "adds r3, r3, r6\n\t"
  48149. "adcs r4, r4, r7\n\t"
  48150. "adc r5, r5, #0\n\t"
  48151. #else
  48152. "umull r6, r7, %[b], r8\n\t"
  48153. "adds r3, r3, r6\n\t"
  48154. "adcs r4, r4, r7\n\t"
  48155. "mov r5, #0\n\t"
  48156. "adc r5, r5, #0\n\t"
  48157. #endif
  48158. "str r3, [%[r]], #4\n\t"
  48159. /* A[67] * B */
  48160. "ldr r8, [%[a]], #4\n\t"
  48161. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48162. "lsl r6, %[b], #16\n\t"
  48163. "lsl r7, r8, #16\n\t"
  48164. "lsr r6, r6, #16\n\t"
  48165. "lsr r7, r7, #16\n\t"
  48166. "mul r7, r6, r7\n\t"
  48167. "adds r4, r4, r7\n\t"
  48168. "adcs r5, r5, #0\n\t"
  48169. "mov r3, #0\n\t"
  48170. "adc r3, r3, #0\n\t"
  48171. "lsr r7, r8, #16\n\t"
  48172. "mul r6, r7, r6\n\t"
  48173. "lsr r7, r6, #16\n\t"
  48174. "lsl r6, r6, #16\n\t"
  48175. "adds r4, r4, r6\n\t"
  48176. "adcs r5, r5, r7\n\t"
  48177. "adc r3, r3, #0\n\t"
  48178. "lsr r6, %[b], #16\n\t"
  48179. "lsr r7, r8, #16\n\t"
  48180. "mul r7, r6, r7\n\t"
  48181. "adds r5, r5, r7\n\t"
  48182. "adc r3, r3, #0\n\t"
  48183. "lsl r7, r8, #16\n\t"
  48184. "lsr r7, r7, #16\n\t"
  48185. "mul r6, r7, r6\n\t"
  48186. "lsr r7, r6, #16\n\t"
  48187. "lsl r6, r6, #16\n\t"
  48188. "adds r4, r4, r6\n\t"
  48189. "adcs r5, r5, r7\n\t"
  48190. "adc r3, r3, #0\n\t"
  48191. #else
  48192. "umull r6, r7, %[b], r8\n\t"
  48193. "adds r4, r4, r6\n\t"
  48194. "adcs r5, r5, r7\n\t"
  48195. "mov r3, #0\n\t"
  48196. "adc r3, r3, #0\n\t"
  48197. #endif
  48198. "str r4, [%[r]], #4\n\t"
  48199. /* A[68] * B */
  48200. "ldr r8, [%[a]], #4\n\t"
  48201. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48202. "lsl r6, %[b], #16\n\t"
  48203. "lsl r7, r8, #16\n\t"
  48204. "lsr r6, r6, #16\n\t"
  48205. "lsr r7, r7, #16\n\t"
  48206. "mul r7, r6, r7\n\t"
  48207. "adds r5, r5, r7\n\t"
  48208. "adcs r3, r3, #0\n\t"
  48209. "mov r4, #0\n\t"
  48210. "adc r4, r4, #0\n\t"
  48211. "lsr r7, r8, #16\n\t"
  48212. "mul r6, r7, r6\n\t"
  48213. "lsr r7, r6, #16\n\t"
  48214. "lsl r6, r6, #16\n\t"
  48215. "adds r5, r5, r6\n\t"
  48216. "adcs r3, r3, r7\n\t"
  48217. "adc r4, r4, #0\n\t"
  48218. "lsr r6, %[b], #16\n\t"
  48219. "lsr r7, r8, #16\n\t"
  48220. "mul r7, r6, r7\n\t"
  48221. "adds r3, r3, r7\n\t"
  48222. "adc r4, r4, #0\n\t"
  48223. "lsl r7, r8, #16\n\t"
  48224. "lsr r7, r7, #16\n\t"
  48225. "mul r6, r7, r6\n\t"
  48226. "lsr r7, r6, #16\n\t"
  48227. "lsl r6, r6, #16\n\t"
  48228. "adds r5, r5, r6\n\t"
  48229. "adcs r3, r3, r7\n\t"
  48230. "adc r4, r4, #0\n\t"
  48231. #else
  48232. "umull r6, r7, %[b], r8\n\t"
  48233. "adds r5, r5, r6\n\t"
  48234. "adcs r3, r3, r7\n\t"
  48235. "mov r4, #0\n\t"
  48236. "adc r4, r4, #0\n\t"
  48237. #endif
  48238. "str r5, [%[r]], #4\n\t"
  48239. /* A[69] * B */
  48240. "ldr r8, [%[a]], #4\n\t"
  48241. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48242. "lsl r6, %[b], #16\n\t"
  48243. "lsl r7, r8, #16\n\t"
  48244. "lsr r6, r6, #16\n\t"
  48245. "lsr r7, r7, #16\n\t"
  48246. "mul r7, r6, r7\n\t"
  48247. "adds r3, r3, r7\n\t"
  48248. "adcs r4, r4, #0\n\t"
  48249. "mov r5, #0\n\t"
  48250. "adc r5, r5, #0\n\t"
  48251. "lsr r7, r8, #16\n\t"
  48252. "mul r6, r7, r6\n\t"
  48253. "lsr r7, r6, #16\n\t"
  48254. "lsl r6, r6, #16\n\t"
  48255. "adds r3, r3, r6\n\t"
  48256. "adcs r4, r4, r7\n\t"
  48257. "adc r5, r5, #0\n\t"
  48258. "lsr r6, %[b], #16\n\t"
  48259. "lsr r7, r8, #16\n\t"
  48260. "mul r7, r6, r7\n\t"
  48261. "adds r4, r4, r7\n\t"
  48262. "adc r5, r5, #0\n\t"
  48263. "lsl r7, r8, #16\n\t"
  48264. "lsr r7, r7, #16\n\t"
  48265. "mul r6, r7, r6\n\t"
  48266. "lsr r7, r6, #16\n\t"
  48267. "lsl r6, r6, #16\n\t"
  48268. "adds r3, r3, r6\n\t"
  48269. "adcs r4, r4, r7\n\t"
  48270. "adc r5, r5, #0\n\t"
  48271. #else
  48272. "umull r6, r7, %[b], r8\n\t"
  48273. "adds r3, r3, r6\n\t"
  48274. "adcs r4, r4, r7\n\t"
  48275. "mov r5, #0\n\t"
  48276. "adc r5, r5, #0\n\t"
  48277. #endif
  48278. "str r3, [%[r]], #4\n\t"
  48279. /* A[70] * B */
  48280. "ldr r8, [%[a]], #4\n\t"
  48281. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48282. "lsl r6, %[b], #16\n\t"
  48283. "lsl r7, r8, #16\n\t"
  48284. "lsr r6, r6, #16\n\t"
  48285. "lsr r7, r7, #16\n\t"
  48286. "mul r7, r6, r7\n\t"
  48287. "adds r4, r4, r7\n\t"
  48288. "adcs r5, r5, #0\n\t"
  48289. "mov r3, #0\n\t"
  48290. "adc r3, r3, #0\n\t"
  48291. "lsr r7, r8, #16\n\t"
  48292. "mul r6, r7, r6\n\t"
  48293. "lsr r7, r6, #16\n\t"
  48294. "lsl r6, r6, #16\n\t"
  48295. "adds r4, r4, r6\n\t"
  48296. "adcs r5, r5, r7\n\t"
  48297. "adc r3, r3, #0\n\t"
  48298. "lsr r6, %[b], #16\n\t"
  48299. "lsr r7, r8, #16\n\t"
  48300. "mul r7, r6, r7\n\t"
  48301. "adds r5, r5, r7\n\t"
  48302. "adc r3, r3, #0\n\t"
  48303. "lsl r7, r8, #16\n\t"
  48304. "lsr r7, r7, #16\n\t"
  48305. "mul r6, r7, r6\n\t"
  48306. "lsr r7, r6, #16\n\t"
  48307. "lsl r6, r6, #16\n\t"
  48308. "adds r4, r4, r6\n\t"
  48309. "adcs r5, r5, r7\n\t"
  48310. "adc r3, r3, #0\n\t"
  48311. #else
  48312. "umull r6, r7, %[b], r8\n\t"
  48313. "adds r4, r4, r6\n\t"
  48314. "adcs r5, r5, r7\n\t"
  48315. "mov r3, #0\n\t"
  48316. "adc r3, r3, #0\n\t"
  48317. #endif
  48318. "str r4, [%[r]], #4\n\t"
  48319. /* A[71] * B */
  48320. "ldr r8, [%[a]], #4\n\t"
  48321. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48322. "lsl r6, %[b], #16\n\t"
  48323. "lsl r7, r8, #16\n\t"
  48324. "lsr r6, r6, #16\n\t"
  48325. "lsr r7, r7, #16\n\t"
  48326. "mul r7, r6, r7\n\t"
  48327. "adds r5, r5, r7\n\t"
  48328. "adcs r3, r3, #0\n\t"
  48329. "mov r4, #0\n\t"
  48330. "adc r4, r4, #0\n\t"
  48331. "lsr r7, r8, #16\n\t"
  48332. "mul r6, r7, r6\n\t"
  48333. "lsr r7, r6, #16\n\t"
  48334. "lsl r6, r6, #16\n\t"
  48335. "adds r5, r5, r6\n\t"
  48336. "adcs r3, r3, r7\n\t"
  48337. "adc r4, r4, #0\n\t"
  48338. "lsr r6, %[b], #16\n\t"
  48339. "lsr r7, r8, #16\n\t"
  48340. "mul r7, r6, r7\n\t"
  48341. "adds r3, r3, r7\n\t"
  48342. "adc r4, r4, #0\n\t"
  48343. "lsl r7, r8, #16\n\t"
  48344. "lsr r7, r7, #16\n\t"
  48345. "mul r6, r7, r6\n\t"
  48346. "lsr r7, r6, #16\n\t"
  48347. "lsl r6, r6, #16\n\t"
  48348. "adds r5, r5, r6\n\t"
  48349. "adcs r3, r3, r7\n\t"
  48350. "adc r4, r4, #0\n\t"
  48351. #else
  48352. "umull r6, r7, %[b], r8\n\t"
  48353. "adds r5, r5, r6\n\t"
  48354. "adcs r3, r3, r7\n\t"
  48355. "mov r4, #0\n\t"
  48356. "adc r4, r4, #0\n\t"
  48357. #endif
  48358. "str r5, [%[r]], #4\n\t"
  48359. /* A[72] * B */
  48360. "ldr r8, [%[a]], #4\n\t"
  48361. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48362. "lsl r6, %[b], #16\n\t"
  48363. "lsl r7, r8, #16\n\t"
  48364. "lsr r6, r6, #16\n\t"
  48365. "lsr r7, r7, #16\n\t"
  48366. "mul r7, r6, r7\n\t"
  48367. "adds r3, r3, r7\n\t"
  48368. "adcs r4, r4, #0\n\t"
  48369. "mov r5, #0\n\t"
  48370. "adc r5, r5, #0\n\t"
  48371. "lsr r7, r8, #16\n\t"
  48372. "mul r6, r7, r6\n\t"
  48373. "lsr r7, r6, #16\n\t"
  48374. "lsl r6, r6, #16\n\t"
  48375. "adds r3, r3, r6\n\t"
  48376. "adcs r4, r4, r7\n\t"
  48377. "adc r5, r5, #0\n\t"
  48378. "lsr r6, %[b], #16\n\t"
  48379. "lsr r7, r8, #16\n\t"
  48380. "mul r7, r6, r7\n\t"
  48381. "adds r4, r4, r7\n\t"
  48382. "adc r5, r5, #0\n\t"
  48383. "lsl r7, r8, #16\n\t"
  48384. "lsr r7, r7, #16\n\t"
  48385. "mul r6, r7, r6\n\t"
  48386. "lsr r7, r6, #16\n\t"
  48387. "lsl r6, r6, #16\n\t"
  48388. "adds r3, r3, r6\n\t"
  48389. "adcs r4, r4, r7\n\t"
  48390. "adc r5, r5, #0\n\t"
  48391. #else
  48392. "umull r6, r7, %[b], r8\n\t"
  48393. "adds r3, r3, r6\n\t"
  48394. "adcs r4, r4, r7\n\t"
  48395. "mov r5, #0\n\t"
  48396. "adc r5, r5, #0\n\t"
  48397. #endif
  48398. "str r3, [%[r]], #4\n\t"
  48399. /* A[73] * B */
  48400. "ldr r8, [%[a]], #4\n\t"
  48401. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48402. "lsl r6, %[b], #16\n\t"
  48403. "lsl r7, r8, #16\n\t"
  48404. "lsr r6, r6, #16\n\t"
  48405. "lsr r7, r7, #16\n\t"
  48406. "mul r7, r6, r7\n\t"
  48407. "adds r4, r4, r7\n\t"
  48408. "adcs r5, r5, #0\n\t"
  48409. "mov r3, #0\n\t"
  48410. "adc r3, r3, #0\n\t"
  48411. "lsr r7, r8, #16\n\t"
  48412. "mul r6, r7, r6\n\t"
  48413. "lsr r7, r6, #16\n\t"
  48414. "lsl r6, r6, #16\n\t"
  48415. "adds r4, r4, r6\n\t"
  48416. "adcs r5, r5, r7\n\t"
  48417. "adc r3, r3, #0\n\t"
  48418. "lsr r6, %[b], #16\n\t"
  48419. "lsr r7, r8, #16\n\t"
  48420. "mul r7, r6, r7\n\t"
  48421. "adds r5, r5, r7\n\t"
  48422. "adc r3, r3, #0\n\t"
  48423. "lsl r7, r8, #16\n\t"
  48424. "lsr r7, r7, #16\n\t"
  48425. "mul r6, r7, r6\n\t"
  48426. "lsr r7, r6, #16\n\t"
  48427. "lsl r6, r6, #16\n\t"
  48428. "adds r4, r4, r6\n\t"
  48429. "adcs r5, r5, r7\n\t"
  48430. "adc r3, r3, #0\n\t"
  48431. #else
  48432. "umull r6, r7, %[b], r8\n\t"
  48433. "adds r4, r4, r6\n\t"
  48434. "adcs r5, r5, r7\n\t"
  48435. "mov r3, #0\n\t"
  48436. "adc r3, r3, #0\n\t"
  48437. #endif
  48438. "str r4, [%[r]], #4\n\t"
  48439. /* A[74] * B */
  48440. "ldr r8, [%[a]], #4\n\t"
  48441. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48442. "lsl r6, %[b], #16\n\t"
  48443. "lsl r7, r8, #16\n\t"
  48444. "lsr r6, r6, #16\n\t"
  48445. "lsr r7, r7, #16\n\t"
  48446. "mul r7, r6, r7\n\t"
  48447. "adds r5, r5, r7\n\t"
  48448. "adcs r3, r3, #0\n\t"
  48449. "mov r4, #0\n\t"
  48450. "adc r4, r4, #0\n\t"
  48451. "lsr r7, r8, #16\n\t"
  48452. "mul r6, r7, r6\n\t"
  48453. "lsr r7, r6, #16\n\t"
  48454. "lsl r6, r6, #16\n\t"
  48455. "adds r5, r5, r6\n\t"
  48456. "adcs r3, r3, r7\n\t"
  48457. "adc r4, r4, #0\n\t"
  48458. "lsr r6, %[b], #16\n\t"
  48459. "lsr r7, r8, #16\n\t"
  48460. "mul r7, r6, r7\n\t"
  48461. "adds r3, r3, r7\n\t"
  48462. "adc r4, r4, #0\n\t"
  48463. "lsl r7, r8, #16\n\t"
  48464. "lsr r7, r7, #16\n\t"
  48465. "mul r6, r7, r6\n\t"
  48466. "lsr r7, r6, #16\n\t"
  48467. "lsl r6, r6, #16\n\t"
  48468. "adds r5, r5, r6\n\t"
  48469. "adcs r3, r3, r7\n\t"
  48470. "adc r4, r4, #0\n\t"
  48471. #else
  48472. "umull r6, r7, %[b], r8\n\t"
  48473. "adds r5, r5, r6\n\t"
  48474. "adcs r3, r3, r7\n\t"
  48475. "mov r4, #0\n\t"
  48476. "adc r4, r4, #0\n\t"
  48477. #endif
  48478. "str r5, [%[r]], #4\n\t"
  48479. /* A[75] * B */
  48480. "ldr r8, [%[a]], #4\n\t"
  48481. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48482. "lsl r6, %[b], #16\n\t"
  48483. "lsl r7, r8, #16\n\t"
  48484. "lsr r6, r6, #16\n\t"
  48485. "lsr r7, r7, #16\n\t"
  48486. "mul r7, r6, r7\n\t"
  48487. "adds r3, r3, r7\n\t"
  48488. "adcs r4, r4, #0\n\t"
  48489. "mov r5, #0\n\t"
  48490. "adc r5, r5, #0\n\t"
  48491. "lsr r7, r8, #16\n\t"
  48492. "mul r6, r7, r6\n\t"
  48493. "lsr r7, r6, #16\n\t"
  48494. "lsl r6, r6, #16\n\t"
  48495. "adds r3, r3, r6\n\t"
  48496. "adcs r4, r4, r7\n\t"
  48497. "adc r5, r5, #0\n\t"
  48498. "lsr r6, %[b], #16\n\t"
  48499. "lsr r7, r8, #16\n\t"
  48500. "mul r7, r6, r7\n\t"
  48501. "adds r4, r4, r7\n\t"
  48502. "adc r5, r5, #0\n\t"
  48503. "lsl r7, r8, #16\n\t"
  48504. "lsr r7, r7, #16\n\t"
  48505. "mul r6, r7, r6\n\t"
  48506. "lsr r7, r6, #16\n\t"
  48507. "lsl r6, r6, #16\n\t"
  48508. "adds r3, r3, r6\n\t"
  48509. "adcs r4, r4, r7\n\t"
  48510. "adc r5, r5, #0\n\t"
  48511. #else
  48512. "umull r6, r7, %[b], r8\n\t"
  48513. "adds r3, r3, r6\n\t"
  48514. "adcs r4, r4, r7\n\t"
  48515. "mov r5, #0\n\t"
  48516. "adc r5, r5, #0\n\t"
  48517. #endif
  48518. "str r3, [%[r]], #4\n\t"
  48519. /* A[76] * B */
  48520. "ldr r8, [%[a]], #4\n\t"
  48521. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48522. "lsl r6, %[b], #16\n\t"
  48523. "lsl r7, r8, #16\n\t"
  48524. "lsr r6, r6, #16\n\t"
  48525. "lsr r7, r7, #16\n\t"
  48526. "mul r7, r6, r7\n\t"
  48527. "adds r4, r4, r7\n\t"
  48528. "adcs r5, r5, #0\n\t"
  48529. "mov r3, #0\n\t"
  48530. "adc r3, r3, #0\n\t"
  48531. "lsr r7, r8, #16\n\t"
  48532. "mul r6, r7, r6\n\t"
  48533. "lsr r7, r6, #16\n\t"
  48534. "lsl r6, r6, #16\n\t"
  48535. "adds r4, r4, r6\n\t"
  48536. "adcs r5, r5, r7\n\t"
  48537. "adc r3, r3, #0\n\t"
  48538. "lsr r6, %[b], #16\n\t"
  48539. "lsr r7, r8, #16\n\t"
  48540. "mul r7, r6, r7\n\t"
  48541. "adds r5, r5, r7\n\t"
  48542. "adc r3, r3, #0\n\t"
  48543. "lsl r7, r8, #16\n\t"
  48544. "lsr r7, r7, #16\n\t"
  48545. "mul r6, r7, r6\n\t"
  48546. "lsr r7, r6, #16\n\t"
  48547. "lsl r6, r6, #16\n\t"
  48548. "adds r4, r4, r6\n\t"
  48549. "adcs r5, r5, r7\n\t"
  48550. "adc r3, r3, #0\n\t"
  48551. #else
  48552. "umull r6, r7, %[b], r8\n\t"
  48553. "adds r4, r4, r6\n\t"
  48554. "adcs r5, r5, r7\n\t"
  48555. "mov r3, #0\n\t"
  48556. "adc r3, r3, #0\n\t"
  48557. #endif
  48558. "str r4, [%[r]], #4\n\t"
  48559. /* A[77] * B */
  48560. "ldr r8, [%[a]], #4\n\t"
  48561. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48562. "lsl r6, %[b], #16\n\t"
  48563. "lsl r7, r8, #16\n\t"
  48564. "lsr r6, r6, #16\n\t"
  48565. "lsr r7, r7, #16\n\t"
  48566. "mul r7, r6, r7\n\t"
  48567. "adds r5, r5, r7\n\t"
  48568. "adcs r3, r3, #0\n\t"
  48569. "mov r4, #0\n\t"
  48570. "adc r4, r4, #0\n\t"
  48571. "lsr r7, r8, #16\n\t"
  48572. "mul r6, r7, r6\n\t"
  48573. "lsr r7, r6, #16\n\t"
  48574. "lsl r6, r6, #16\n\t"
  48575. "adds r5, r5, r6\n\t"
  48576. "adcs r3, r3, r7\n\t"
  48577. "adc r4, r4, #0\n\t"
  48578. "lsr r6, %[b], #16\n\t"
  48579. "lsr r7, r8, #16\n\t"
  48580. "mul r7, r6, r7\n\t"
  48581. "adds r3, r3, r7\n\t"
  48582. "adc r4, r4, #0\n\t"
  48583. "lsl r7, r8, #16\n\t"
  48584. "lsr r7, r7, #16\n\t"
  48585. "mul r6, r7, r6\n\t"
  48586. "lsr r7, r6, #16\n\t"
  48587. "lsl r6, r6, #16\n\t"
  48588. "adds r5, r5, r6\n\t"
  48589. "adcs r3, r3, r7\n\t"
  48590. "adc r4, r4, #0\n\t"
  48591. #else
  48592. "umull r6, r7, %[b], r8\n\t"
  48593. "adds r5, r5, r6\n\t"
  48594. "adcs r3, r3, r7\n\t"
  48595. "mov r4, #0\n\t"
  48596. "adc r4, r4, #0\n\t"
  48597. #endif
  48598. "str r5, [%[r]], #4\n\t"
  48599. /* A[78] * B */
  48600. "ldr r8, [%[a]], #4\n\t"
  48601. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48602. "lsl r6, %[b], #16\n\t"
  48603. "lsl r7, r8, #16\n\t"
  48604. "lsr r6, r6, #16\n\t"
  48605. "lsr r7, r7, #16\n\t"
  48606. "mul r7, r6, r7\n\t"
  48607. "adds r3, r3, r7\n\t"
  48608. "adcs r4, r4, #0\n\t"
  48609. "mov r5, #0\n\t"
  48610. "adc r5, r5, #0\n\t"
  48611. "lsr r7, r8, #16\n\t"
  48612. "mul r6, r7, r6\n\t"
  48613. "lsr r7, r6, #16\n\t"
  48614. "lsl r6, r6, #16\n\t"
  48615. "adds r3, r3, r6\n\t"
  48616. "adcs r4, r4, r7\n\t"
  48617. "adc r5, r5, #0\n\t"
  48618. "lsr r6, %[b], #16\n\t"
  48619. "lsr r7, r8, #16\n\t"
  48620. "mul r7, r6, r7\n\t"
  48621. "adds r4, r4, r7\n\t"
  48622. "adc r5, r5, #0\n\t"
  48623. "lsl r7, r8, #16\n\t"
  48624. "lsr r7, r7, #16\n\t"
  48625. "mul r6, r7, r6\n\t"
  48626. "lsr r7, r6, #16\n\t"
  48627. "lsl r6, r6, #16\n\t"
  48628. "adds r3, r3, r6\n\t"
  48629. "adcs r4, r4, r7\n\t"
  48630. "adc r5, r5, #0\n\t"
  48631. #else
  48632. "umull r6, r7, %[b], r8\n\t"
  48633. "adds r3, r3, r6\n\t"
  48634. "adcs r4, r4, r7\n\t"
  48635. "mov r5, #0\n\t"
  48636. "adc r5, r5, #0\n\t"
  48637. #endif
  48638. "str r3, [%[r]], #4\n\t"
  48639. /* A[79] * B */
  48640. "ldr r8, [%[a]], #4\n\t"
  48641. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48642. "lsl r6, %[b], #16\n\t"
  48643. "lsl r7, r8, #16\n\t"
  48644. "lsr r6, r6, #16\n\t"
  48645. "lsr r7, r7, #16\n\t"
  48646. "mul r7, r6, r7\n\t"
  48647. "adds r4, r4, r7\n\t"
  48648. "adcs r5, r5, #0\n\t"
  48649. "mov r3, #0\n\t"
  48650. "adc r3, r3, #0\n\t"
  48651. "lsr r7, r8, #16\n\t"
  48652. "mul r6, r7, r6\n\t"
  48653. "lsr r7, r6, #16\n\t"
  48654. "lsl r6, r6, #16\n\t"
  48655. "adds r4, r4, r6\n\t"
  48656. "adcs r5, r5, r7\n\t"
  48657. "adc r3, r3, #0\n\t"
  48658. "lsr r6, %[b], #16\n\t"
  48659. "lsr r7, r8, #16\n\t"
  48660. "mul r7, r6, r7\n\t"
  48661. "adds r5, r5, r7\n\t"
  48662. "adc r3, r3, #0\n\t"
  48663. "lsl r7, r8, #16\n\t"
  48664. "lsr r7, r7, #16\n\t"
  48665. "mul r6, r7, r6\n\t"
  48666. "lsr r7, r6, #16\n\t"
  48667. "lsl r6, r6, #16\n\t"
  48668. "adds r4, r4, r6\n\t"
  48669. "adcs r5, r5, r7\n\t"
  48670. "adc r3, r3, #0\n\t"
  48671. #else
  48672. "umull r6, r7, %[b], r8\n\t"
  48673. "adds r4, r4, r6\n\t"
  48674. "adcs r5, r5, r7\n\t"
  48675. "mov r3, #0\n\t"
  48676. "adc r3, r3, #0\n\t"
  48677. #endif
  48678. "str r4, [%[r]], #4\n\t"
  48679. /* A[80] * B */
  48680. "ldr r8, [%[a]], #4\n\t"
  48681. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48682. "lsl r6, %[b], #16\n\t"
  48683. "lsl r7, r8, #16\n\t"
  48684. "lsr r6, r6, #16\n\t"
  48685. "lsr r7, r7, #16\n\t"
  48686. "mul r7, r6, r7\n\t"
  48687. "adds r5, r5, r7\n\t"
  48688. "adcs r3, r3, #0\n\t"
  48689. "mov r4, #0\n\t"
  48690. "adc r4, r4, #0\n\t"
  48691. "lsr r7, r8, #16\n\t"
  48692. "mul r6, r7, r6\n\t"
  48693. "lsr r7, r6, #16\n\t"
  48694. "lsl r6, r6, #16\n\t"
  48695. "adds r5, r5, r6\n\t"
  48696. "adcs r3, r3, r7\n\t"
  48697. "adc r4, r4, #0\n\t"
  48698. "lsr r6, %[b], #16\n\t"
  48699. "lsr r7, r8, #16\n\t"
  48700. "mul r7, r6, r7\n\t"
  48701. "adds r3, r3, r7\n\t"
  48702. "adc r4, r4, #0\n\t"
  48703. "lsl r7, r8, #16\n\t"
  48704. "lsr r7, r7, #16\n\t"
  48705. "mul r6, r7, r6\n\t"
  48706. "lsr r7, r6, #16\n\t"
  48707. "lsl r6, r6, #16\n\t"
  48708. "adds r5, r5, r6\n\t"
  48709. "adcs r3, r3, r7\n\t"
  48710. "adc r4, r4, #0\n\t"
  48711. #else
  48712. "umull r6, r7, %[b], r8\n\t"
  48713. "adds r5, r5, r6\n\t"
  48714. "adcs r3, r3, r7\n\t"
  48715. "mov r4, #0\n\t"
  48716. "adc r4, r4, #0\n\t"
  48717. #endif
  48718. "str r5, [%[r]], #4\n\t"
  48719. /* A[81] * B */
  48720. "ldr r8, [%[a]], #4\n\t"
  48721. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48722. "lsl r6, %[b], #16\n\t"
  48723. "lsl r7, r8, #16\n\t"
  48724. "lsr r6, r6, #16\n\t"
  48725. "lsr r7, r7, #16\n\t"
  48726. "mul r7, r6, r7\n\t"
  48727. "adds r3, r3, r7\n\t"
  48728. "adcs r4, r4, #0\n\t"
  48729. "mov r5, #0\n\t"
  48730. "adc r5, r5, #0\n\t"
  48731. "lsr r7, r8, #16\n\t"
  48732. "mul r6, r7, r6\n\t"
  48733. "lsr r7, r6, #16\n\t"
  48734. "lsl r6, r6, #16\n\t"
  48735. "adds r3, r3, r6\n\t"
  48736. "adcs r4, r4, r7\n\t"
  48737. "adc r5, r5, #0\n\t"
  48738. "lsr r6, %[b], #16\n\t"
  48739. "lsr r7, r8, #16\n\t"
  48740. "mul r7, r6, r7\n\t"
  48741. "adds r4, r4, r7\n\t"
  48742. "adc r5, r5, #0\n\t"
  48743. "lsl r7, r8, #16\n\t"
  48744. "lsr r7, r7, #16\n\t"
  48745. "mul r6, r7, r6\n\t"
  48746. "lsr r7, r6, #16\n\t"
  48747. "lsl r6, r6, #16\n\t"
  48748. "adds r3, r3, r6\n\t"
  48749. "adcs r4, r4, r7\n\t"
  48750. "adc r5, r5, #0\n\t"
  48751. #else
  48752. "umull r6, r7, %[b], r8\n\t"
  48753. "adds r3, r3, r6\n\t"
  48754. "adcs r4, r4, r7\n\t"
  48755. "mov r5, #0\n\t"
  48756. "adc r5, r5, #0\n\t"
  48757. #endif
  48758. "str r3, [%[r]], #4\n\t"
  48759. /* A[82] * B */
  48760. "ldr r8, [%[a]], #4\n\t"
  48761. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48762. "lsl r6, %[b], #16\n\t"
  48763. "lsl r7, r8, #16\n\t"
  48764. "lsr r6, r6, #16\n\t"
  48765. "lsr r7, r7, #16\n\t"
  48766. "mul r7, r6, r7\n\t"
  48767. "adds r4, r4, r7\n\t"
  48768. "adcs r5, r5, #0\n\t"
  48769. "mov r3, #0\n\t"
  48770. "adc r3, r3, #0\n\t"
  48771. "lsr r7, r8, #16\n\t"
  48772. "mul r6, r7, r6\n\t"
  48773. "lsr r7, r6, #16\n\t"
  48774. "lsl r6, r6, #16\n\t"
  48775. "adds r4, r4, r6\n\t"
  48776. "adcs r5, r5, r7\n\t"
  48777. "adc r3, r3, #0\n\t"
  48778. "lsr r6, %[b], #16\n\t"
  48779. "lsr r7, r8, #16\n\t"
  48780. "mul r7, r6, r7\n\t"
  48781. "adds r5, r5, r7\n\t"
  48782. "adc r3, r3, #0\n\t"
  48783. "lsl r7, r8, #16\n\t"
  48784. "lsr r7, r7, #16\n\t"
  48785. "mul r6, r7, r6\n\t"
  48786. "lsr r7, r6, #16\n\t"
  48787. "lsl r6, r6, #16\n\t"
  48788. "adds r4, r4, r6\n\t"
  48789. "adcs r5, r5, r7\n\t"
  48790. "adc r3, r3, #0\n\t"
  48791. #else
  48792. "umull r6, r7, %[b], r8\n\t"
  48793. "adds r4, r4, r6\n\t"
  48794. "adcs r5, r5, r7\n\t"
  48795. "mov r3, #0\n\t"
  48796. "adc r3, r3, #0\n\t"
  48797. #endif
  48798. "str r4, [%[r]], #4\n\t"
  48799. /* A[83] * B */
  48800. "ldr r8, [%[a]], #4\n\t"
  48801. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48802. "lsl r6, %[b], #16\n\t"
  48803. "lsl r7, r8, #16\n\t"
  48804. "lsr r6, r6, #16\n\t"
  48805. "lsr r7, r7, #16\n\t"
  48806. "mul r7, r6, r7\n\t"
  48807. "adds r5, r5, r7\n\t"
  48808. "adcs r3, r3, #0\n\t"
  48809. "mov r4, #0\n\t"
  48810. "adc r4, r4, #0\n\t"
  48811. "lsr r7, r8, #16\n\t"
  48812. "mul r6, r7, r6\n\t"
  48813. "lsr r7, r6, #16\n\t"
  48814. "lsl r6, r6, #16\n\t"
  48815. "adds r5, r5, r6\n\t"
  48816. "adcs r3, r3, r7\n\t"
  48817. "adc r4, r4, #0\n\t"
  48818. "lsr r6, %[b], #16\n\t"
  48819. "lsr r7, r8, #16\n\t"
  48820. "mul r7, r6, r7\n\t"
  48821. "adds r3, r3, r7\n\t"
  48822. "adc r4, r4, #0\n\t"
  48823. "lsl r7, r8, #16\n\t"
  48824. "lsr r7, r7, #16\n\t"
  48825. "mul r6, r7, r6\n\t"
  48826. "lsr r7, r6, #16\n\t"
  48827. "lsl r6, r6, #16\n\t"
  48828. "adds r5, r5, r6\n\t"
  48829. "adcs r3, r3, r7\n\t"
  48830. "adc r4, r4, #0\n\t"
  48831. #else
  48832. "umull r6, r7, %[b], r8\n\t"
  48833. "adds r5, r5, r6\n\t"
  48834. "adcs r3, r3, r7\n\t"
  48835. "mov r4, #0\n\t"
  48836. "adc r4, r4, #0\n\t"
  48837. #endif
  48838. "str r5, [%[r]], #4\n\t"
  48839. /* A[84] * B */
  48840. "ldr r8, [%[a]], #4\n\t"
  48841. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48842. "lsl r6, %[b], #16\n\t"
  48843. "lsl r7, r8, #16\n\t"
  48844. "lsr r6, r6, #16\n\t"
  48845. "lsr r7, r7, #16\n\t"
  48846. "mul r7, r6, r7\n\t"
  48847. "adds r3, r3, r7\n\t"
  48848. "adcs r4, r4, #0\n\t"
  48849. "mov r5, #0\n\t"
  48850. "adc r5, r5, #0\n\t"
  48851. "lsr r7, r8, #16\n\t"
  48852. "mul r6, r7, r6\n\t"
  48853. "lsr r7, r6, #16\n\t"
  48854. "lsl r6, r6, #16\n\t"
  48855. "adds r3, r3, r6\n\t"
  48856. "adcs r4, r4, r7\n\t"
  48857. "adc r5, r5, #0\n\t"
  48858. "lsr r6, %[b], #16\n\t"
  48859. "lsr r7, r8, #16\n\t"
  48860. "mul r7, r6, r7\n\t"
  48861. "adds r4, r4, r7\n\t"
  48862. "adc r5, r5, #0\n\t"
  48863. "lsl r7, r8, #16\n\t"
  48864. "lsr r7, r7, #16\n\t"
  48865. "mul r6, r7, r6\n\t"
  48866. "lsr r7, r6, #16\n\t"
  48867. "lsl r6, r6, #16\n\t"
  48868. "adds r3, r3, r6\n\t"
  48869. "adcs r4, r4, r7\n\t"
  48870. "adc r5, r5, #0\n\t"
  48871. #else
  48872. "umull r6, r7, %[b], r8\n\t"
  48873. "adds r3, r3, r6\n\t"
  48874. "adcs r4, r4, r7\n\t"
  48875. "mov r5, #0\n\t"
  48876. "adc r5, r5, #0\n\t"
  48877. #endif
  48878. "str r3, [%[r]], #4\n\t"
  48879. /* A[85] * B */
  48880. "ldr r8, [%[a]], #4\n\t"
  48881. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48882. "lsl r6, %[b], #16\n\t"
  48883. "lsl r7, r8, #16\n\t"
  48884. "lsr r6, r6, #16\n\t"
  48885. "lsr r7, r7, #16\n\t"
  48886. "mul r7, r6, r7\n\t"
  48887. "adds r4, r4, r7\n\t"
  48888. "adcs r5, r5, #0\n\t"
  48889. "mov r3, #0\n\t"
  48890. "adc r3, r3, #0\n\t"
  48891. "lsr r7, r8, #16\n\t"
  48892. "mul r6, r7, r6\n\t"
  48893. "lsr r7, r6, #16\n\t"
  48894. "lsl r6, r6, #16\n\t"
  48895. "adds r4, r4, r6\n\t"
  48896. "adcs r5, r5, r7\n\t"
  48897. "adc r3, r3, #0\n\t"
  48898. "lsr r6, %[b], #16\n\t"
  48899. "lsr r7, r8, #16\n\t"
  48900. "mul r7, r6, r7\n\t"
  48901. "adds r5, r5, r7\n\t"
  48902. "adc r3, r3, #0\n\t"
  48903. "lsl r7, r8, #16\n\t"
  48904. "lsr r7, r7, #16\n\t"
  48905. "mul r6, r7, r6\n\t"
  48906. "lsr r7, r6, #16\n\t"
  48907. "lsl r6, r6, #16\n\t"
  48908. "adds r4, r4, r6\n\t"
  48909. "adcs r5, r5, r7\n\t"
  48910. "adc r3, r3, #0\n\t"
  48911. #else
  48912. "umull r6, r7, %[b], r8\n\t"
  48913. "adds r4, r4, r6\n\t"
  48914. "adcs r5, r5, r7\n\t"
  48915. "mov r3, #0\n\t"
  48916. "adc r3, r3, #0\n\t"
  48917. #endif
  48918. "str r4, [%[r]], #4\n\t"
  48919. /* A[86] * B */
  48920. "ldr r8, [%[a]], #4\n\t"
  48921. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48922. "lsl r6, %[b], #16\n\t"
  48923. "lsl r7, r8, #16\n\t"
  48924. "lsr r6, r6, #16\n\t"
  48925. "lsr r7, r7, #16\n\t"
  48926. "mul r7, r6, r7\n\t"
  48927. "adds r5, r5, r7\n\t"
  48928. "adcs r3, r3, #0\n\t"
  48929. "mov r4, #0\n\t"
  48930. "adc r4, r4, #0\n\t"
  48931. "lsr r7, r8, #16\n\t"
  48932. "mul r6, r7, r6\n\t"
  48933. "lsr r7, r6, #16\n\t"
  48934. "lsl r6, r6, #16\n\t"
  48935. "adds r5, r5, r6\n\t"
  48936. "adcs r3, r3, r7\n\t"
  48937. "adc r4, r4, #0\n\t"
  48938. "lsr r6, %[b], #16\n\t"
  48939. "lsr r7, r8, #16\n\t"
  48940. "mul r7, r6, r7\n\t"
  48941. "adds r3, r3, r7\n\t"
  48942. "adc r4, r4, #0\n\t"
  48943. "lsl r7, r8, #16\n\t"
  48944. "lsr r7, r7, #16\n\t"
  48945. "mul r6, r7, r6\n\t"
  48946. "lsr r7, r6, #16\n\t"
  48947. "lsl r6, r6, #16\n\t"
  48948. "adds r5, r5, r6\n\t"
  48949. "adcs r3, r3, r7\n\t"
  48950. "adc r4, r4, #0\n\t"
  48951. #else
  48952. "umull r6, r7, %[b], r8\n\t"
  48953. "adds r5, r5, r6\n\t"
  48954. "adcs r3, r3, r7\n\t"
  48955. "mov r4, #0\n\t"
  48956. "adc r4, r4, #0\n\t"
  48957. #endif
  48958. "str r5, [%[r]], #4\n\t"
  48959. /* A[87] * B */
  48960. "ldr r8, [%[a]], #4\n\t"
  48961. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  48962. "lsl r6, %[b], #16\n\t"
  48963. "lsl r7, r8, #16\n\t"
  48964. "lsr r6, r6, #16\n\t"
  48965. "lsr r7, r7, #16\n\t"
  48966. "mul r7, r6, r7\n\t"
  48967. "adds r3, r3, r7\n\t"
  48968. "adcs r4, r4, #0\n\t"
  48969. "mov r5, #0\n\t"
  48970. "adc r5, r5, #0\n\t"
  48971. "lsr r7, r8, #16\n\t"
  48972. "mul r6, r7, r6\n\t"
  48973. "lsr r7, r6, #16\n\t"
  48974. "lsl r6, r6, #16\n\t"
  48975. "adds r3, r3, r6\n\t"
  48976. "adcs r4, r4, r7\n\t"
  48977. "adc r5, r5, #0\n\t"
  48978. "lsr r6, %[b], #16\n\t"
  48979. "lsr r7, r8, #16\n\t"
  48980. "mul r7, r6, r7\n\t"
  48981. "adds r4, r4, r7\n\t"
  48982. "adc r5, r5, #0\n\t"
  48983. "lsl r7, r8, #16\n\t"
  48984. "lsr r7, r7, #16\n\t"
  48985. "mul r6, r7, r6\n\t"
  48986. "lsr r7, r6, #16\n\t"
  48987. "lsl r6, r6, #16\n\t"
  48988. "adds r3, r3, r6\n\t"
  48989. "adcs r4, r4, r7\n\t"
  48990. "adc r5, r5, #0\n\t"
  48991. #else
  48992. "umull r6, r7, %[b], r8\n\t"
  48993. "adds r3, r3, r6\n\t"
  48994. "adcs r4, r4, r7\n\t"
  48995. "mov r5, #0\n\t"
  48996. "adc r5, r5, #0\n\t"
  48997. #endif
  48998. "str r3, [%[r]], #4\n\t"
  48999. /* A[88] * B */
  49000. "ldr r8, [%[a]], #4\n\t"
  49001. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49002. "lsl r6, %[b], #16\n\t"
  49003. "lsl r7, r8, #16\n\t"
  49004. "lsr r6, r6, #16\n\t"
  49005. "lsr r7, r7, #16\n\t"
  49006. "mul r7, r6, r7\n\t"
  49007. "adds r4, r4, r7\n\t"
  49008. "adcs r5, r5, #0\n\t"
  49009. "mov r3, #0\n\t"
  49010. "adc r3, r3, #0\n\t"
  49011. "lsr r7, r8, #16\n\t"
  49012. "mul r6, r7, r6\n\t"
  49013. "lsr r7, r6, #16\n\t"
  49014. "lsl r6, r6, #16\n\t"
  49015. "adds r4, r4, r6\n\t"
  49016. "adcs r5, r5, r7\n\t"
  49017. "adc r3, r3, #0\n\t"
  49018. "lsr r6, %[b], #16\n\t"
  49019. "lsr r7, r8, #16\n\t"
  49020. "mul r7, r6, r7\n\t"
  49021. "adds r5, r5, r7\n\t"
  49022. "adc r3, r3, #0\n\t"
  49023. "lsl r7, r8, #16\n\t"
  49024. "lsr r7, r7, #16\n\t"
  49025. "mul r6, r7, r6\n\t"
  49026. "lsr r7, r6, #16\n\t"
  49027. "lsl r6, r6, #16\n\t"
  49028. "adds r4, r4, r6\n\t"
  49029. "adcs r5, r5, r7\n\t"
  49030. "adc r3, r3, #0\n\t"
  49031. #else
  49032. "umull r6, r7, %[b], r8\n\t"
  49033. "adds r4, r4, r6\n\t"
  49034. "adcs r5, r5, r7\n\t"
  49035. "mov r3, #0\n\t"
  49036. "adc r3, r3, #0\n\t"
  49037. #endif
  49038. "str r4, [%[r]], #4\n\t"
  49039. /* A[89] * B */
  49040. "ldr r8, [%[a]], #4\n\t"
  49041. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49042. "lsl r6, %[b], #16\n\t"
  49043. "lsl r7, r8, #16\n\t"
  49044. "lsr r6, r6, #16\n\t"
  49045. "lsr r7, r7, #16\n\t"
  49046. "mul r7, r6, r7\n\t"
  49047. "adds r5, r5, r7\n\t"
  49048. "adcs r3, r3, #0\n\t"
  49049. "mov r4, #0\n\t"
  49050. "adc r4, r4, #0\n\t"
  49051. "lsr r7, r8, #16\n\t"
  49052. "mul r6, r7, r6\n\t"
  49053. "lsr r7, r6, #16\n\t"
  49054. "lsl r6, r6, #16\n\t"
  49055. "adds r5, r5, r6\n\t"
  49056. "adcs r3, r3, r7\n\t"
  49057. "adc r4, r4, #0\n\t"
  49058. "lsr r6, %[b], #16\n\t"
  49059. "lsr r7, r8, #16\n\t"
  49060. "mul r7, r6, r7\n\t"
  49061. "adds r3, r3, r7\n\t"
  49062. "adc r4, r4, #0\n\t"
  49063. "lsl r7, r8, #16\n\t"
  49064. "lsr r7, r7, #16\n\t"
  49065. "mul r6, r7, r6\n\t"
  49066. "lsr r7, r6, #16\n\t"
  49067. "lsl r6, r6, #16\n\t"
  49068. "adds r5, r5, r6\n\t"
  49069. "adcs r3, r3, r7\n\t"
  49070. "adc r4, r4, #0\n\t"
  49071. #else
  49072. "umull r6, r7, %[b], r8\n\t"
  49073. "adds r5, r5, r6\n\t"
  49074. "adcs r3, r3, r7\n\t"
  49075. "mov r4, #0\n\t"
  49076. "adc r4, r4, #0\n\t"
  49077. #endif
  49078. "str r5, [%[r]], #4\n\t"
  49079. /* A[90] * B */
  49080. "ldr r8, [%[a]], #4\n\t"
  49081. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49082. "lsl r6, %[b], #16\n\t"
  49083. "lsl r7, r8, #16\n\t"
  49084. "lsr r6, r6, #16\n\t"
  49085. "lsr r7, r7, #16\n\t"
  49086. "mul r7, r6, r7\n\t"
  49087. "adds r3, r3, r7\n\t"
  49088. "adcs r4, r4, #0\n\t"
  49089. "mov r5, #0\n\t"
  49090. "adc r5, r5, #0\n\t"
  49091. "lsr r7, r8, #16\n\t"
  49092. "mul r6, r7, r6\n\t"
  49093. "lsr r7, r6, #16\n\t"
  49094. "lsl r6, r6, #16\n\t"
  49095. "adds r3, r3, r6\n\t"
  49096. "adcs r4, r4, r7\n\t"
  49097. "adc r5, r5, #0\n\t"
  49098. "lsr r6, %[b], #16\n\t"
  49099. "lsr r7, r8, #16\n\t"
  49100. "mul r7, r6, r7\n\t"
  49101. "adds r4, r4, r7\n\t"
  49102. "adc r5, r5, #0\n\t"
  49103. "lsl r7, r8, #16\n\t"
  49104. "lsr r7, r7, #16\n\t"
  49105. "mul r6, r7, r6\n\t"
  49106. "lsr r7, r6, #16\n\t"
  49107. "lsl r6, r6, #16\n\t"
  49108. "adds r3, r3, r6\n\t"
  49109. "adcs r4, r4, r7\n\t"
  49110. "adc r5, r5, #0\n\t"
  49111. #else
  49112. "umull r6, r7, %[b], r8\n\t"
  49113. "adds r3, r3, r6\n\t"
  49114. "adcs r4, r4, r7\n\t"
  49115. "mov r5, #0\n\t"
  49116. "adc r5, r5, #0\n\t"
  49117. #endif
  49118. "str r3, [%[r]], #4\n\t"
  49119. /* A[91] * B */
  49120. "ldr r8, [%[a]], #4\n\t"
  49121. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49122. "lsl r6, %[b], #16\n\t"
  49123. "lsl r7, r8, #16\n\t"
  49124. "lsr r6, r6, #16\n\t"
  49125. "lsr r7, r7, #16\n\t"
  49126. "mul r7, r6, r7\n\t"
  49127. "adds r4, r4, r7\n\t"
  49128. "adcs r5, r5, #0\n\t"
  49129. "mov r3, #0\n\t"
  49130. "adc r3, r3, #0\n\t"
  49131. "lsr r7, r8, #16\n\t"
  49132. "mul r6, r7, r6\n\t"
  49133. "lsr r7, r6, #16\n\t"
  49134. "lsl r6, r6, #16\n\t"
  49135. "adds r4, r4, r6\n\t"
  49136. "adcs r5, r5, r7\n\t"
  49137. "adc r3, r3, #0\n\t"
  49138. "lsr r6, %[b], #16\n\t"
  49139. "lsr r7, r8, #16\n\t"
  49140. "mul r7, r6, r7\n\t"
  49141. "adds r5, r5, r7\n\t"
  49142. "adc r3, r3, #0\n\t"
  49143. "lsl r7, r8, #16\n\t"
  49144. "lsr r7, r7, #16\n\t"
  49145. "mul r6, r7, r6\n\t"
  49146. "lsr r7, r6, #16\n\t"
  49147. "lsl r6, r6, #16\n\t"
  49148. "adds r4, r4, r6\n\t"
  49149. "adcs r5, r5, r7\n\t"
  49150. "adc r3, r3, #0\n\t"
  49151. #else
  49152. "umull r6, r7, %[b], r8\n\t"
  49153. "adds r4, r4, r6\n\t"
  49154. "adcs r5, r5, r7\n\t"
  49155. "mov r3, #0\n\t"
  49156. "adc r3, r3, #0\n\t"
  49157. #endif
  49158. "str r4, [%[r]], #4\n\t"
  49159. /* A[92] * B */
  49160. "ldr r8, [%[a]], #4\n\t"
  49161. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49162. "lsl r6, %[b], #16\n\t"
  49163. "lsl r7, r8, #16\n\t"
  49164. "lsr r6, r6, #16\n\t"
  49165. "lsr r7, r7, #16\n\t"
  49166. "mul r7, r6, r7\n\t"
  49167. "adds r5, r5, r7\n\t"
  49168. "adcs r3, r3, #0\n\t"
  49169. "mov r4, #0\n\t"
  49170. "adc r4, r4, #0\n\t"
  49171. "lsr r7, r8, #16\n\t"
  49172. "mul r6, r7, r6\n\t"
  49173. "lsr r7, r6, #16\n\t"
  49174. "lsl r6, r6, #16\n\t"
  49175. "adds r5, r5, r6\n\t"
  49176. "adcs r3, r3, r7\n\t"
  49177. "adc r4, r4, #0\n\t"
  49178. "lsr r6, %[b], #16\n\t"
  49179. "lsr r7, r8, #16\n\t"
  49180. "mul r7, r6, r7\n\t"
  49181. "adds r3, r3, r7\n\t"
  49182. "adc r4, r4, #0\n\t"
  49183. "lsl r7, r8, #16\n\t"
  49184. "lsr r7, r7, #16\n\t"
  49185. "mul r6, r7, r6\n\t"
  49186. "lsr r7, r6, #16\n\t"
  49187. "lsl r6, r6, #16\n\t"
  49188. "adds r5, r5, r6\n\t"
  49189. "adcs r3, r3, r7\n\t"
  49190. "adc r4, r4, #0\n\t"
  49191. #else
  49192. "umull r6, r7, %[b], r8\n\t"
  49193. "adds r5, r5, r6\n\t"
  49194. "adcs r3, r3, r7\n\t"
  49195. "mov r4, #0\n\t"
  49196. "adc r4, r4, #0\n\t"
  49197. #endif
  49198. "str r5, [%[r]], #4\n\t"
  49199. /* A[93] * B */
  49200. "ldr r8, [%[a]], #4\n\t"
  49201. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49202. "lsl r6, %[b], #16\n\t"
  49203. "lsl r7, r8, #16\n\t"
  49204. "lsr r6, r6, #16\n\t"
  49205. "lsr r7, r7, #16\n\t"
  49206. "mul r7, r6, r7\n\t"
  49207. "adds r3, r3, r7\n\t"
  49208. "adcs r4, r4, #0\n\t"
  49209. "mov r5, #0\n\t"
  49210. "adc r5, r5, #0\n\t"
  49211. "lsr r7, r8, #16\n\t"
  49212. "mul r6, r7, r6\n\t"
  49213. "lsr r7, r6, #16\n\t"
  49214. "lsl r6, r6, #16\n\t"
  49215. "adds r3, r3, r6\n\t"
  49216. "adcs r4, r4, r7\n\t"
  49217. "adc r5, r5, #0\n\t"
  49218. "lsr r6, %[b], #16\n\t"
  49219. "lsr r7, r8, #16\n\t"
  49220. "mul r7, r6, r7\n\t"
  49221. "adds r4, r4, r7\n\t"
  49222. "adc r5, r5, #0\n\t"
  49223. "lsl r7, r8, #16\n\t"
  49224. "lsr r7, r7, #16\n\t"
  49225. "mul r6, r7, r6\n\t"
  49226. "lsr r7, r6, #16\n\t"
  49227. "lsl r6, r6, #16\n\t"
  49228. "adds r3, r3, r6\n\t"
  49229. "adcs r4, r4, r7\n\t"
  49230. "adc r5, r5, #0\n\t"
  49231. #else
  49232. "umull r6, r7, %[b], r8\n\t"
  49233. "adds r3, r3, r6\n\t"
  49234. "adcs r4, r4, r7\n\t"
  49235. "mov r5, #0\n\t"
  49236. "adc r5, r5, #0\n\t"
  49237. #endif
  49238. "str r3, [%[r]], #4\n\t"
  49239. /* A[94] * B */
  49240. "ldr r8, [%[a]], #4\n\t"
  49241. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49242. "lsl r6, %[b], #16\n\t"
  49243. "lsl r7, r8, #16\n\t"
  49244. "lsr r6, r6, #16\n\t"
  49245. "lsr r7, r7, #16\n\t"
  49246. "mul r7, r6, r7\n\t"
  49247. "adds r4, r4, r7\n\t"
  49248. "adcs r5, r5, #0\n\t"
  49249. "mov r3, #0\n\t"
  49250. "adc r3, r3, #0\n\t"
  49251. "lsr r7, r8, #16\n\t"
  49252. "mul r6, r7, r6\n\t"
  49253. "lsr r7, r6, #16\n\t"
  49254. "lsl r6, r6, #16\n\t"
  49255. "adds r4, r4, r6\n\t"
  49256. "adcs r5, r5, r7\n\t"
  49257. "adc r3, r3, #0\n\t"
  49258. "lsr r6, %[b], #16\n\t"
  49259. "lsr r7, r8, #16\n\t"
  49260. "mul r7, r6, r7\n\t"
  49261. "adds r5, r5, r7\n\t"
  49262. "adc r3, r3, #0\n\t"
  49263. "lsl r7, r8, #16\n\t"
  49264. "lsr r7, r7, #16\n\t"
  49265. "mul r6, r7, r6\n\t"
  49266. "lsr r7, r6, #16\n\t"
  49267. "lsl r6, r6, #16\n\t"
  49268. "adds r4, r4, r6\n\t"
  49269. "adcs r5, r5, r7\n\t"
  49270. "adc r3, r3, #0\n\t"
  49271. #else
  49272. "umull r6, r7, %[b], r8\n\t"
  49273. "adds r4, r4, r6\n\t"
  49274. "adcs r5, r5, r7\n\t"
  49275. "mov r3, #0\n\t"
  49276. "adc r3, r3, #0\n\t"
  49277. #endif
  49278. "str r4, [%[r]], #4\n\t"
  49279. /* A[95] * B */
  49280. "ldr r8, [%[a]], #4\n\t"
  49281. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49282. "lsl r6, %[b], #16\n\t"
  49283. "lsl r7, r8, #16\n\t"
  49284. "lsr r6, r6, #16\n\t"
  49285. "lsr r7, r7, #16\n\t"
  49286. "mul r7, r6, r7\n\t"
  49287. "adds r5, r5, r7\n\t"
  49288. "adcs r3, r3, #0\n\t"
  49289. "mov r4, #0\n\t"
  49290. "adc r4, r4, #0\n\t"
  49291. "lsr r7, r8, #16\n\t"
  49292. "mul r6, r7, r6\n\t"
  49293. "lsr r7, r6, #16\n\t"
  49294. "lsl r6, r6, #16\n\t"
  49295. "adds r5, r5, r6\n\t"
  49296. "adcs r3, r3, r7\n\t"
  49297. "adc r4, r4, #0\n\t"
  49298. "lsr r6, %[b], #16\n\t"
  49299. "lsr r7, r8, #16\n\t"
  49300. "mul r7, r6, r7\n\t"
  49301. "adds r3, r3, r7\n\t"
  49302. "adc r4, r4, #0\n\t"
  49303. "lsl r7, r8, #16\n\t"
  49304. "lsr r7, r7, #16\n\t"
  49305. "mul r6, r7, r6\n\t"
  49306. "lsr r7, r6, #16\n\t"
  49307. "lsl r6, r6, #16\n\t"
  49308. "adds r5, r5, r6\n\t"
  49309. "adcs r3, r3, r7\n\t"
  49310. "adc r4, r4, #0\n\t"
  49311. #else
  49312. "umull r6, r7, %[b], r8\n\t"
  49313. "adds r5, r5, r6\n\t"
  49314. "adcs r3, r3, r7\n\t"
  49315. "mov r4, #0\n\t"
  49316. "adc r4, r4, #0\n\t"
  49317. #endif
  49318. "str r5, [%[r]], #4\n\t"
  49319. /* A[96] * B */
  49320. "ldr r8, [%[a]], #4\n\t"
  49321. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49322. "lsl r6, %[b], #16\n\t"
  49323. "lsl r7, r8, #16\n\t"
  49324. "lsr r6, r6, #16\n\t"
  49325. "lsr r7, r7, #16\n\t"
  49326. "mul r7, r6, r7\n\t"
  49327. "adds r3, r3, r7\n\t"
  49328. "adcs r4, r4, #0\n\t"
  49329. "mov r5, #0\n\t"
  49330. "adc r5, r5, #0\n\t"
  49331. "lsr r7, r8, #16\n\t"
  49332. "mul r6, r7, r6\n\t"
  49333. "lsr r7, r6, #16\n\t"
  49334. "lsl r6, r6, #16\n\t"
  49335. "adds r3, r3, r6\n\t"
  49336. "adcs r4, r4, r7\n\t"
  49337. "adc r5, r5, #0\n\t"
  49338. "lsr r6, %[b], #16\n\t"
  49339. "lsr r7, r8, #16\n\t"
  49340. "mul r7, r6, r7\n\t"
  49341. "adds r4, r4, r7\n\t"
  49342. "adc r5, r5, #0\n\t"
  49343. "lsl r7, r8, #16\n\t"
  49344. "lsr r7, r7, #16\n\t"
  49345. "mul r6, r7, r6\n\t"
  49346. "lsr r7, r6, #16\n\t"
  49347. "lsl r6, r6, #16\n\t"
  49348. "adds r3, r3, r6\n\t"
  49349. "adcs r4, r4, r7\n\t"
  49350. "adc r5, r5, #0\n\t"
  49351. #else
  49352. "umull r6, r7, %[b], r8\n\t"
  49353. "adds r3, r3, r6\n\t"
  49354. "adcs r4, r4, r7\n\t"
  49355. "mov r5, #0\n\t"
  49356. "adc r5, r5, #0\n\t"
  49357. #endif
  49358. "str r3, [%[r]], #4\n\t"
  49359. /* A[97] * B */
  49360. "ldr r8, [%[a]], #4\n\t"
  49361. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49362. "lsl r6, %[b], #16\n\t"
  49363. "lsl r7, r8, #16\n\t"
  49364. "lsr r6, r6, #16\n\t"
  49365. "lsr r7, r7, #16\n\t"
  49366. "mul r7, r6, r7\n\t"
  49367. "adds r4, r4, r7\n\t"
  49368. "adcs r5, r5, #0\n\t"
  49369. "mov r3, #0\n\t"
  49370. "adc r3, r3, #0\n\t"
  49371. "lsr r7, r8, #16\n\t"
  49372. "mul r6, r7, r6\n\t"
  49373. "lsr r7, r6, #16\n\t"
  49374. "lsl r6, r6, #16\n\t"
  49375. "adds r4, r4, r6\n\t"
  49376. "adcs r5, r5, r7\n\t"
  49377. "adc r3, r3, #0\n\t"
  49378. "lsr r6, %[b], #16\n\t"
  49379. "lsr r7, r8, #16\n\t"
  49380. "mul r7, r6, r7\n\t"
  49381. "adds r5, r5, r7\n\t"
  49382. "adc r3, r3, #0\n\t"
  49383. "lsl r7, r8, #16\n\t"
  49384. "lsr r7, r7, #16\n\t"
  49385. "mul r6, r7, r6\n\t"
  49386. "lsr r7, r6, #16\n\t"
  49387. "lsl r6, r6, #16\n\t"
  49388. "adds r4, r4, r6\n\t"
  49389. "adcs r5, r5, r7\n\t"
  49390. "adc r3, r3, #0\n\t"
  49391. #else
  49392. "umull r6, r7, %[b], r8\n\t"
  49393. "adds r4, r4, r6\n\t"
  49394. "adcs r5, r5, r7\n\t"
  49395. "mov r3, #0\n\t"
  49396. "adc r3, r3, #0\n\t"
  49397. #endif
  49398. "str r4, [%[r]], #4\n\t"
  49399. /* A[98] * B */
  49400. "ldr r8, [%[a]], #4\n\t"
  49401. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49402. "lsl r6, %[b], #16\n\t"
  49403. "lsl r7, r8, #16\n\t"
  49404. "lsr r6, r6, #16\n\t"
  49405. "lsr r7, r7, #16\n\t"
  49406. "mul r7, r6, r7\n\t"
  49407. "adds r5, r5, r7\n\t"
  49408. "adcs r3, r3, #0\n\t"
  49409. "mov r4, #0\n\t"
  49410. "adc r4, r4, #0\n\t"
  49411. "lsr r7, r8, #16\n\t"
  49412. "mul r6, r7, r6\n\t"
  49413. "lsr r7, r6, #16\n\t"
  49414. "lsl r6, r6, #16\n\t"
  49415. "adds r5, r5, r6\n\t"
  49416. "adcs r3, r3, r7\n\t"
  49417. "adc r4, r4, #0\n\t"
  49418. "lsr r6, %[b], #16\n\t"
  49419. "lsr r7, r8, #16\n\t"
  49420. "mul r7, r6, r7\n\t"
  49421. "adds r3, r3, r7\n\t"
  49422. "adc r4, r4, #0\n\t"
  49423. "lsl r7, r8, #16\n\t"
  49424. "lsr r7, r7, #16\n\t"
  49425. "mul r6, r7, r6\n\t"
  49426. "lsr r7, r6, #16\n\t"
  49427. "lsl r6, r6, #16\n\t"
  49428. "adds r5, r5, r6\n\t"
  49429. "adcs r3, r3, r7\n\t"
  49430. "adc r4, r4, #0\n\t"
  49431. #else
  49432. "umull r6, r7, %[b], r8\n\t"
  49433. "adds r5, r5, r6\n\t"
  49434. "adcs r3, r3, r7\n\t"
  49435. "mov r4, #0\n\t"
  49436. "adc r4, r4, #0\n\t"
  49437. #endif
  49438. "str r5, [%[r]], #4\n\t"
  49439. /* A[99] * B */
  49440. "ldr r8, [%[a]], #4\n\t"
  49441. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49442. "lsl r6, %[b], #16\n\t"
  49443. "lsl r7, r8, #16\n\t"
  49444. "lsr r6, r6, #16\n\t"
  49445. "lsr r7, r7, #16\n\t"
  49446. "mul r7, r6, r7\n\t"
  49447. "adds r3, r3, r7\n\t"
  49448. "adcs r4, r4, #0\n\t"
  49449. "mov r5, #0\n\t"
  49450. "adc r5, r5, #0\n\t"
  49451. "lsr r7, r8, #16\n\t"
  49452. "mul r6, r7, r6\n\t"
  49453. "lsr r7, r6, #16\n\t"
  49454. "lsl r6, r6, #16\n\t"
  49455. "adds r3, r3, r6\n\t"
  49456. "adcs r4, r4, r7\n\t"
  49457. "adc r5, r5, #0\n\t"
  49458. "lsr r6, %[b], #16\n\t"
  49459. "lsr r7, r8, #16\n\t"
  49460. "mul r7, r6, r7\n\t"
  49461. "adds r4, r4, r7\n\t"
  49462. "adc r5, r5, #0\n\t"
  49463. "lsl r7, r8, #16\n\t"
  49464. "lsr r7, r7, #16\n\t"
  49465. "mul r6, r7, r6\n\t"
  49466. "lsr r7, r6, #16\n\t"
  49467. "lsl r6, r6, #16\n\t"
  49468. "adds r3, r3, r6\n\t"
  49469. "adcs r4, r4, r7\n\t"
  49470. "adc r5, r5, #0\n\t"
  49471. #else
  49472. "umull r6, r7, %[b], r8\n\t"
  49473. "adds r3, r3, r6\n\t"
  49474. "adcs r4, r4, r7\n\t"
  49475. "mov r5, #0\n\t"
  49476. "adc r5, r5, #0\n\t"
  49477. #endif
  49478. "str r3, [%[r]], #4\n\t"
  49479. /* A[100] * B */
  49480. "ldr r8, [%[a]], #4\n\t"
  49481. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49482. "lsl r6, %[b], #16\n\t"
  49483. "lsl r7, r8, #16\n\t"
  49484. "lsr r6, r6, #16\n\t"
  49485. "lsr r7, r7, #16\n\t"
  49486. "mul r7, r6, r7\n\t"
  49487. "adds r4, r4, r7\n\t"
  49488. "adcs r5, r5, #0\n\t"
  49489. "mov r3, #0\n\t"
  49490. "adc r3, r3, #0\n\t"
  49491. "lsr r7, r8, #16\n\t"
  49492. "mul r6, r7, r6\n\t"
  49493. "lsr r7, r6, #16\n\t"
  49494. "lsl r6, r6, #16\n\t"
  49495. "adds r4, r4, r6\n\t"
  49496. "adcs r5, r5, r7\n\t"
  49497. "adc r3, r3, #0\n\t"
  49498. "lsr r6, %[b], #16\n\t"
  49499. "lsr r7, r8, #16\n\t"
  49500. "mul r7, r6, r7\n\t"
  49501. "adds r5, r5, r7\n\t"
  49502. "adc r3, r3, #0\n\t"
  49503. "lsl r7, r8, #16\n\t"
  49504. "lsr r7, r7, #16\n\t"
  49505. "mul r6, r7, r6\n\t"
  49506. "lsr r7, r6, #16\n\t"
  49507. "lsl r6, r6, #16\n\t"
  49508. "adds r4, r4, r6\n\t"
  49509. "adcs r5, r5, r7\n\t"
  49510. "adc r3, r3, #0\n\t"
  49511. #else
  49512. "umull r6, r7, %[b], r8\n\t"
  49513. "adds r4, r4, r6\n\t"
  49514. "adcs r5, r5, r7\n\t"
  49515. "mov r3, #0\n\t"
  49516. "adc r3, r3, #0\n\t"
  49517. #endif
  49518. "str r4, [%[r]], #4\n\t"
  49519. /* A[101] * B */
  49520. "ldr r8, [%[a]], #4\n\t"
  49521. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49522. "lsl r6, %[b], #16\n\t"
  49523. "lsl r7, r8, #16\n\t"
  49524. "lsr r6, r6, #16\n\t"
  49525. "lsr r7, r7, #16\n\t"
  49526. "mul r7, r6, r7\n\t"
  49527. "adds r5, r5, r7\n\t"
  49528. "adcs r3, r3, #0\n\t"
  49529. "mov r4, #0\n\t"
  49530. "adc r4, r4, #0\n\t"
  49531. "lsr r7, r8, #16\n\t"
  49532. "mul r6, r7, r6\n\t"
  49533. "lsr r7, r6, #16\n\t"
  49534. "lsl r6, r6, #16\n\t"
  49535. "adds r5, r5, r6\n\t"
  49536. "adcs r3, r3, r7\n\t"
  49537. "adc r4, r4, #0\n\t"
  49538. "lsr r6, %[b], #16\n\t"
  49539. "lsr r7, r8, #16\n\t"
  49540. "mul r7, r6, r7\n\t"
  49541. "adds r3, r3, r7\n\t"
  49542. "adc r4, r4, #0\n\t"
  49543. "lsl r7, r8, #16\n\t"
  49544. "lsr r7, r7, #16\n\t"
  49545. "mul r6, r7, r6\n\t"
  49546. "lsr r7, r6, #16\n\t"
  49547. "lsl r6, r6, #16\n\t"
  49548. "adds r5, r5, r6\n\t"
  49549. "adcs r3, r3, r7\n\t"
  49550. "adc r4, r4, #0\n\t"
  49551. #else
  49552. "umull r6, r7, %[b], r8\n\t"
  49553. "adds r5, r5, r6\n\t"
  49554. "adcs r3, r3, r7\n\t"
  49555. "mov r4, #0\n\t"
  49556. "adc r4, r4, #0\n\t"
  49557. #endif
  49558. "str r5, [%[r]], #4\n\t"
  49559. /* A[102] * B */
  49560. "ldr r8, [%[a]], #4\n\t"
  49561. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49562. "lsl r6, %[b], #16\n\t"
  49563. "lsl r7, r8, #16\n\t"
  49564. "lsr r6, r6, #16\n\t"
  49565. "lsr r7, r7, #16\n\t"
  49566. "mul r7, r6, r7\n\t"
  49567. "adds r3, r3, r7\n\t"
  49568. "adcs r4, r4, #0\n\t"
  49569. "mov r5, #0\n\t"
  49570. "adc r5, r5, #0\n\t"
  49571. "lsr r7, r8, #16\n\t"
  49572. "mul r6, r7, r6\n\t"
  49573. "lsr r7, r6, #16\n\t"
  49574. "lsl r6, r6, #16\n\t"
  49575. "adds r3, r3, r6\n\t"
  49576. "adcs r4, r4, r7\n\t"
  49577. "adc r5, r5, #0\n\t"
  49578. "lsr r6, %[b], #16\n\t"
  49579. "lsr r7, r8, #16\n\t"
  49580. "mul r7, r6, r7\n\t"
  49581. "adds r4, r4, r7\n\t"
  49582. "adc r5, r5, #0\n\t"
  49583. "lsl r7, r8, #16\n\t"
  49584. "lsr r7, r7, #16\n\t"
  49585. "mul r6, r7, r6\n\t"
  49586. "lsr r7, r6, #16\n\t"
  49587. "lsl r6, r6, #16\n\t"
  49588. "adds r3, r3, r6\n\t"
  49589. "adcs r4, r4, r7\n\t"
  49590. "adc r5, r5, #0\n\t"
  49591. #else
  49592. "umull r6, r7, %[b], r8\n\t"
  49593. "adds r3, r3, r6\n\t"
  49594. "adcs r4, r4, r7\n\t"
  49595. "mov r5, #0\n\t"
  49596. "adc r5, r5, #0\n\t"
  49597. #endif
  49598. "str r3, [%[r]], #4\n\t"
  49599. /* A[103] * B */
  49600. "ldr r8, [%[a]], #4\n\t"
  49601. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49602. "lsl r6, %[b], #16\n\t"
  49603. "lsl r7, r8, #16\n\t"
  49604. "lsr r6, r6, #16\n\t"
  49605. "lsr r7, r7, #16\n\t"
  49606. "mul r7, r6, r7\n\t"
  49607. "adds r4, r4, r7\n\t"
  49608. "adcs r5, r5, #0\n\t"
  49609. "mov r3, #0\n\t"
  49610. "adc r3, r3, #0\n\t"
  49611. "lsr r7, r8, #16\n\t"
  49612. "mul r6, r7, r6\n\t"
  49613. "lsr r7, r6, #16\n\t"
  49614. "lsl r6, r6, #16\n\t"
  49615. "adds r4, r4, r6\n\t"
  49616. "adcs r5, r5, r7\n\t"
  49617. "adc r3, r3, #0\n\t"
  49618. "lsr r6, %[b], #16\n\t"
  49619. "lsr r7, r8, #16\n\t"
  49620. "mul r7, r6, r7\n\t"
  49621. "adds r5, r5, r7\n\t"
  49622. "adc r3, r3, #0\n\t"
  49623. "lsl r7, r8, #16\n\t"
  49624. "lsr r7, r7, #16\n\t"
  49625. "mul r6, r7, r6\n\t"
  49626. "lsr r7, r6, #16\n\t"
  49627. "lsl r6, r6, #16\n\t"
  49628. "adds r4, r4, r6\n\t"
  49629. "adcs r5, r5, r7\n\t"
  49630. "adc r3, r3, #0\n\t"
  49631. #else
  49632. "umull r6, r7, %[b], r8\n\t"
  49633. "adds r4, r4, r6\n\t"
  49634. "adcs r5, r5, r7\n\t"
  49635. "mov r3, #0\n\t"
  49636. "adc r3, r3, #0\n\t"
  49637. #endif
  49638. "str r4, [%[r]], #4\n\t"
  49639. /* A[104] * B */
  49640. "ldr r8, [%[a]], #4\n\t"
  49641. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49642. "lsl r6, %[b], #16\n\t"
  49643. "lsl r7, r8, #16\n\t"
  49644. "lsr r6, r6, #16\n\t"
  49645. "lsr r7, r7, #16\n\t"
  49646. "mul r7, r6, r7\n\t"
  49647. "adds r5, r5, r7\n\t"
  49648. "adcs r3, r3, #0\n\t"
  49649. "mov r4, #0\n\t"
  49650. "adc r4, r4, #0\n\t"
  49651. "lsr r7, r8, #16\n\t"
  49652. "mul r6, r7, r6\n\t"
  49653. "lsr r7, r6, #16\n\t"
  49654. "lsl r6, r6, #16\n\t"
  49655. "adds r5, r5, r6\n\t"
  49656. "adcs r3, r3, r7\n\t"
  49657. "adc r4, r4, #0\n\t"
  49658. "lsr r6, %[b], #16\n\t"
  49659. "lsr r7, r8, #16\n\t"
  49660. "mul r7, r6, r7\n\t"
  49661. "adds r3, r3, r7\n\t"
  49662. "adc r4, r4, #0\n\t"
  49663. "lsl r7, r8, #16\n\t"
  49664. "lsr r7, r7, #16\n\t"
  49665. "mul r6, r7, r6\n\t"
  49666. "lsr r7, r6, #16\n\t"
  49667. "lsl r6, r6, #16\n\t"
  49668. "adds r5, r5, r6\n\t"
  49669. "adcs r3, r3, r7\n\t"
  49670. "adc r4, r4, #0\n\t"
  49671. #else
  49672. "umull r6, r7, %[b], r8\n\t"
  49673. "adds r5, r5, r6\n\t"
  49674. "adcs r3, r3, r7\n\t"
  49675. "mov r4, #0\n\t"
  49676. "adc r4, r4, #0\n\t"
  49677. #endif
  49678. "str r5, [%[r]], #4\n\t"
  49679. /* A[105] * B */
  49680. "ldr r8, [%[a]], #4\n\t"
  49681. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49682. "lsl r6, %[b], #16\n\t"
  49683. "lsl r7, r8, #16\n\t"
  49684. "lsr r6, r6, #16\n\t"
  49685. "lsr r7, r7, #16\n\t"
  49686. "mul r7, r6, r7\n\t"
  49687. "adds r3, r3, r7\n\t"
  49688. "adcs r4, r4, #0\n\t"
  49689. "mov r5, #0\n\t"
  49690. "adc r5, r5, #0\n\t"
  49691. "lsr r7, r8, #16\n\t"
  49692. "mul r6, r7, r6\n\t"
  49693. "lsr r7, r6, #16\n\t"
  49694. "lsl r6, r6, #16\n\t"
  49695. "adds r3, r3, r6\n\t"
  49696. "adcs r4, r4, r7\n\t"
  49697. "adc r5, r5, #0\n\t"
  49698. "lsr r6, %[b], #16\n\t"
  49699. "lsr r7, r8, #16\n\t"
  49700. "mul r7, r6, r7\n\t"
  49701. "adds r4, r4, r7\n\t"
  49702. "adc r5, r5, #0\n\t"
  49703. "lsl r7, r8, #16\n\t"
  49704. "lsr r7, r7, #16\n\t"
  49705. "mul r6, r7, r6\n\t"
  49706. "lsr r7, r6, #16\n\t"
  49707. "lsl r6, r6, #16\n\t"
  49708. "adds r3, r3, r6\n\t"
  49709. "adcs r4, r4, r7\n\t"
  49710. "adc r5, r5, #0\n\t"
  49711. #else
  49712. "umull r6, r7, %[b], r8\n\t"
  49713. "adds r3, r3, r6\n\t"
  49714. "adcs r4, r4, r7\n\t"
  49715. "mov r5, #0\n\t"
  49716. "adc r5, r5, #0\n\t"
  49717. #endif
  49718. "str r3, [%[r]], #4\n\t"
  49719. /* A[106] * B */
  49720. "ldr r8, [%[a]], #4\n\t"
  49721. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49722. "lsl r6, %[b], #16\n\t"
  49723. "lsl r7, r8, #16\n\t"
  49724. "lsr r6, r6, #16\n\t"
  49725. "lsr r7, r7, #16\n\t"
  49726. "mul r7, r6, r7\n\t"
  49727. "adds r4, r4, r7\n\t"
  49728. "adcs r5, r5, #0\n\t"
  49729. "mov r3, #0\n\t"
  49730. "adc r3, r3, #0\n\t"
  49731. "lsr r7, r8, #16\n\t"
  49732. "mul r6, r7, r6\n\t"
  49733. "lsr r7, r6, #16\n\t"
  49734. "lsl r6, r6, #16\n\t"
  49735. "adds r4, r4, r6\n\t"
  49736. "adcs r5, r5, r7\n\t"
  49737. "adc r3, r3, #0\n\t"
  49738. "lsr r6, %[b], #16\n\t"
  49739. "lsr r7, r8, #16\n\t"
  49740. "mul r7, r6, r7\n\t"
  49741. "adds r5, r5, r7\n\t"
  49742. "adc r3, r3, #0\n\t"
  49743. "lsl r7, r8, #16\n\t"
  49744. "lsr r7, r7, #16\n\t"
  49745. "mul r6, r7, r6\n\t"
  49746. "lsr r7, r6, #16\n\t"
  49747. "lsl r6, r6, #16\n\t"
  49748. "adds r4, r4, r6\n\t"
  49749. "adcs r5, r5, r7\n\t"
  49750. "adc r3, r3, #0\n\t"
  49751. #else
  49752. "umull r6, r7, %[b], r8\n\t"
  49753. "adds r4, r4, r6\n\t"
  49754. "adcs r5, r5, r7\n\t"
  49755. "mov r3, #0\n\t"
  49756. "adc r3, r3, #0\n\t"
  49757. #endif
  49758. "str r4, [%[r]], #4\n\t"
  49759. /* A[107] * B */
  49760. "ldr r8, [%[a]], #4\n\t"
  49761. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49762. "lsl r6, %[b], #16\n\t"
  49763. "lsl r7, r8, #16\n\t"
  49764. "lsr r6, r6, #16\n\t"
  49765. "lsr r7, r7, #16\n\t"
  49766. "mul r7, r6, r7\n\t"
  49767. "adds r5, r5, r7\n\t"
  49768. "adcs r3, r3, #0\n\t"
  49769. "mov r4, #0\n\t"
  49770. "adc r4, r4, #0\n\t"
  49771. "lsr r7, r8, #16\n\t"
  49772. "mul r6, r7, r6\n\t"
  49773. "lsr r7, r6, #16\n\t"
  49774. "lsl r6, r6, #16\n\t"
  49775. "adds r5, r5, r6\n\t"
  49776. "adcs r3, r3, r7\n\t"
  49777. "adc r4, r4, #0\n\t"
  49778. "lsr r6, %[b], #16\n\t"
  49779. "lsr r7, r8, #16\n\t"
  49780. "mul r7, r6, r7\n\t"
  49781. "adds r3, r3, r7\n\t"
  49782. "adc r4, r4, #0\n\t"
  49783. "lsl r7, r8, #16\n\t"
  49784. "lsr r7, r7, #16\n\t"
  49785. "mul r6, r7, r6\n\t"
  49786. "lsr r7, r6, #16\n\t"
  49787. "lsl r6, r6, #16\n\t"
  49788. "adds r5, r5, r6\n\t"
  49789. "adcs r3, r3, r7\n\t"
  49790. "adc r4, r4, #0\n\t"
  49791. #else
  49792. "umull r6, r7, %[b], r8\n\t"
  49793. "adds r5, r5, r6\n\t"
  49794. "adcs r3, r3, r7\n\t"
  49795. "mov r4, #0\n\t"
  49796. "adc r4, r4, #0\n\t"
  49797. #endif
  49798. "str r5, [%[r]], #4\n\t"
  49799. /* A[108] * B */
  49800. "ldr r8, [%[a]], #4\n\t"
  49801. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49802. "lsl r6, %[b], #16\n\t"
  49803. "lsl r7, r8, #16\n\t"
  49804. "lsr r6, r6, #16\n\t"
  49805. "lsr r7, r7, #16\n\t"
  49806. "mul r7, r6, r7\n\t"
  49807. "adds r3, r3, r7\n\t"
  49808. "adcs r4, r4, #0\n\t"
  49809. "mov r5, #0\n\t"
  49810. "adc r5, r5, #0\n\t"
  49811. "lsr r7, r8, #16\n\t"
  49812. "mul r6, r7, r6\n\t"
  49813. "lsr r7, r6, #16\n\t"
  49814. "lsl r6, r6, #16\n\t"
  49815. "adds r3, r3, r6\n\t"
  49816. "adcs r4, r4, r7\n\t"
  49817. "adc r5, r5, #0\n\t"
  49818. "lsr r6, %[b], #16\n\t"
  49819. "lsr r7, r8, #16\n\t"
  49820. "mul r7, r6, r7\n\t"
  49821. "adds r4, r4, r7\n\t"
  49822. "adc r5, r5, #0\n\t"
  49823. "lsl r7, r8, #16\n\t"
  49824. "lsr r7, r7, #16\n\t"
  49825. "mul r6, r7, r6\n\t"
  49826. "lsr r7, r6, #16\n\t"
  49827. "lsl r6, r6, #16\n\t"
  49828. "adds r3, r3, r6\n\t"
  49829. "adcs r4, r4, r7\n\t"
  49830. "adc r5, r5, #0\n\t"
  49831. #else
  49832. "umull r6, r7, %[b], r8\n\t"
  49833. "adds r3, r3, r6\n\t"
  49834. "adcs r4, r4, r7\n\t"
  49835. "mov r5, #0\n\t"
  49836. "adc r5, r5, #0\n\t"
  49837. #endif
  49838. "str r3, [%[r]], #4\n\t"
  49839. /* A[109] * B */
  49840. "ldr r8, [%[a]], #4\n\t"
  49841. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49842. "lsl r6, %[b], #16\n\t"
  49843. "lsl r7, r8, #16\n\t"
  49844. "lsr r6, r6, #16\n\t"
  49845. "lsr r7, r7, #16\n\t"
  49846. "mul r7, r6, r7\n\t"
  49847. "adds r4, r4, r7\n\t"
  49848. "adcs r5, r5, #0\n\t"
  49849. "mov r3, #0\n\t"
  49850. "adc r3, r3, #0\n\t"
  49851. "lsr r7, r8, #16\n\t"
  49852. "mul r6, r7, r6\n\t"
  49853. "lsr r7, r6, #16\n\t"
  49854. "lsl r6, r6, #16\n\t"
  49855. "adds r4, r4, r6\n\t"
  49856. "adcs r5, r5, r7\n\t"
  49857. "adc r3, r3, #0\n\t"
  49858. "lsr r6, %[b], #16\n\t"
  49859. "lsr r7, r8, #16\n\t"
  49860. "mul r7, r6, r7\n\t"
  49861. "adds r5, r5, r7\n\t"
  49862. "adc r3, r3, #0\n\t"
  49863. "lsl r7, r8, #16\n\t"
  49864. "lsr r7, r7, #16\n\t"
  49865. "mul r6, r7, r6\n\t"
  49866. "lsr r7, r6, #16\n\t"
  49867. "lsl r6, r6, #16\n\t"
  49868. "adds r4, r4, r6\n\t"
  49869. "adcs r5, r5, r7\n\t"
  49870. "adc r3, r3, #0\n\t"
  49871. #else
  49872. "umull r6, r7, %[b], r8\n\t"
  49873. "adds r4, r4, r6\n\t"
  49874. "adcs r5, r5, r7\n\t"
  49875. "mov r3, #0\n\t"
  49876. "adc r3, r3, #0\n\t"
  49877. #endif
  49878. "str r4, [%[r]], #4\n\t"
  49879. /* A[110] * B */
  49880. "ldr r8, [%[a]], #4\n\t"
  49881. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49882. "lsl r6, %[b], #16\n\t"
  49883. "lsl r7, r8, #16\n\t"
  49884. "lsr r6, r6, #16\n\t"
  49885. "lsr r7, r7, #16\n\t"
  49886. "mul r7, r6, r7\n\t"
  49887. "adds r5, r5, r7\n\t"
  49888. "adcs r3, r3, #0\n\t"
  49889. "mov r4, #0\n\t"
  49890. "adc r4, r4, #0\n\t"
  49891. "lsr r7, r8, #16\n\t"
  49892. "mul r6, r7, r6\n\t"
  49893. "lsr r7, r6, #16\n\t"
  49894. "lsl r6, r6, #16\n\t"
  49895. "adds r5, r5, r6\n\t"
  49896. "adcs r3, r3, r7\n\t"
  49897. "adc r4, r4, #0\n\t"
  49898. "lsr r6, %[b], #16\n\t"
  49899. "lsr r7, r8, #16\n\t"
  49900. "mul r7, r6, r7\n\t"
  49901. "adds r3, r3, r7\n\t"
  49902. "adc r4, r4, #0\n\t"
  49903. "lsl r7, r8, #16\n\t"
  49904. "lsr r7, r7, #16\n\t"
  49905. "mul r6, r7, r6\n\t"
  49906. "lsr r7, r6, #16\n\t"
  49907. "lsl r6, r6, #16\n\t"
  49908. "adds r5, r5, r6\n\t"
  49909. "adcs r3, r3, r7\n\t"
  49910. "adc r4, r4, #0\n\t"
  49911. #else
  49912. "umull r6, r7, %[b], r8\n\t"
  49913. "adds r5, r5, r6\n\t"
  49914. "adcs r3, r3, r7\n\t"
  49915. "mov r4, #0\n\t"
  49916. "adc r4, r4, #0\n\t"
  49917. #endif
  49918. "str r5, [%[r]], #4\n\t"
  49919. /* A[111] * B */
  49920. "ldr r8, [%[a]], #4\n\t"
  49921. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49922. "lsl r6, %[b], #16\n\t"
  49923. "lsl r7, r8, #16\n\t"
  49924. "lsr r6, r6, #16\n\t"
  49925. "lsr r7, r7, #16\n\t"
  49926. "mul r7, r6, r7\n\t"
  49927. "adds r3, r3, r7\n\t"
  49928. "adcs r4, r4, #0\n\t"
  49929. "mov r5, #0\n\t"
  49930. "adc r5, r5, #0\n\t"
  49931. "lsr r7, r8, #16\n\t"
  49932. "mul r6, r7, r6\n\t"
  49933. "lsr r7, r6, #16\n\t"
  49934. "lsl r6, r6, #16\n\t"
  49935. "adds r3, r3, r6\n\t"
  49936. "adcs r4, r4, r7\n\t"
  49937. "adc r5, r5, #0\n\t"
  49938. "lsr r6, %[b], #16\n\t"
  49939. "lsr r7, r8, #16\n\t"
  49940. "mul r7, r6, r7\n\t"
  49941. "adds r4, r4, r7\n\t"
  49942. "adc r5, r5, #0\n\t"
  49943. "lsl r7, r8, #16\n\t"
  49944. "lsr r7, r7, #16\n\t"
  49945. "mul r6, r7, r6\n\t"
  49946. "lsr r7, r6, #16\n\t"
  49947. "lsl r6, r6, #16\n\t"
  49948. "adds r3, r3, r6\n\t"
  49949. "adcs r4, r4, r7\n\t"
  49950. "adc r5, r5, #0\n\t"
  49951. #else
  49952. "umull r6, r7, %[b], r8\n\t"
  49953. "adds r3, r3, r6\n\t"
  49954. "adcs r4, r4, r7\n\t"
  49955. "mov r5, #0\n\t"
  49956. "adc r5, r5, #0\n\t"
  49957. #endif
  49958. "str r3, [%[r]], #4\n\t"
  49959. /* A[112] * B */
  49960. "ldr r8, [%[a]], #4\n\t"
  49961. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  49962. "lsl r6, %[b], #16\n\t"
  49963. "lsl r7, r8, #16\n\t"
  49964. "lsr r6, r6, #16\n\t"
  49965. "lsr r7, r7, #16\n\t"
  49966. "mul r7, r6, r7\n\t"
  49967. "adds r4, r4, r7\n\t"
  49968. "adcs r5, r5, #0\n\t"
  49969. "mov r3, #0\n\t"
  49970. "adc r3, r3, #0\n\t"
  49971. "lsr r7, r8, #16\n\t"
  49972. "mul r6, r7, r6\n\t"
  49973. "lsr r7, r6, #16\n\t"
  49974. "lsl r6, r6, #16\n\t"
  49975. "adds r4, r4, r6\n\t"
  49976. "adcs r5, r5, r7\n\t"
  49977. "adc r3, r3, #0\n\t"
  49978. "lsr r6, %[b], #16\n\t"
  49979. "lsr r7, r8, #16\n\t"
  49980. "mul r7, r6, r7\n\t"
  49981. "adds r5, r5, r7\n\t"
  49982. "adc r3, r3, #0\n\t"
  49983. "lsl r7, r8, #16\n\t"
  49984. "lsr r7, r7, #16\n\t"
  49985. "mul r6, r7, r6\n\t"
  49986. "lsr r7, r6, #16\n\t"
  49987. "lsl r6, r6, #16\n\t"
  49988. "adds r4, r4, r6\n\t"
  49989. "adcs r5, r5, r7\n\t"
  49990. "adc r3, r3, #0\n\t"
  49991. #else
  49992. "umull r6, r7, %[b], r8\n\t"
  49993. "adds r4, r4, r6\n\t"
  49994. "adcs r5, r5, r7\n\t"
  49995. "mov r3, #0\n\t"
  49996. "adc r3, r3, #0\n\t"
  49997. #endif
  49998. "str r4, [%[r]], #4\n\t"
  49999. /* A[113] * B */
  50000. "ldr r8, [%[a]], #4\n\t"
  50001. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50002. "lsl r6, %[b], #16\n\t"
  50003. "lsl r7, r8, #16\n\t"
  50004. "lsr r6, r6, #16\n\t"
  50005. "lsr r7, r7, #16\n\t"
  50006. "mul r7, r6, r7\n\t"
  50007. "adds r5, r5, r7\n\t"
  50008. "adcs r3, r3, #0\n\t"
  50009. "mov r4, #0\n\t"
  50010. "adc r4, r4, #0\n\t"
  50011. "lsr r7, r8, #16\n\t"
  50012. "mul r6, r7, r6\n\t"
  50013. "lsr r7, r6, #16\n\t"
  50014. "lsl r6, r6, #16\n\t"
  50015. "adds r5, r5, r6\n\t"
  50016. "adcs r3, r3, r7\n\t"
  50017. "adc r4, r4, #0\n\t"
  50018. "lsr r6, %[b], #16\n\t"
  50019. "lsr r7, r8, #16\n\t"
  50020. "mul r7, r6, r7\n\t"
  50021. "adds r3, r3, r7\n\t"
  50022. "adc r4, r4, #0\n\t"
  50023. "lsl r7, r8, #16\n\t"
  50024. "lsr r7, r7, #16\n\t"
  50025. "mul r6, r7, r6\n\t"
  50026. "lsr r7, r6, #16\n\t"
  50027. "lsl r6, r6, #16\n\t"
  50028. "adds r5, r5, r6\n\t"
  50029. "adcs r3, r3, r7\n\t"
  50030. "adc r4, r4, #0\n\t"
  50031. #else
  50032. "umull r6, r7, %[b], r8\n\t"
  50033. "adds r5, r5, r6\n\t"
  50034. "adcs r3, r3, r7\n\t"
  50035. "mov r4, #0\n\t"
  50036. "adc r4, r4, #0\n\t"
  50037. #endif
  50038. "str r5, [%[r]], #4\n\t"
  50039. /* A[114] * B */
  50040. "ldr r8, [%[a]], #4\n\t"
  50041. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50042. "lsl r6, %[b], #16\n\t"
  50043. "lsl r7, r8, #16\n\t"
  50044. "lsr r6, r6, #16\n\t"
  50045. "lsr r7, r7, #16\n\t"
  50046. "mul r7, r6, r7\n\t"
  50047. "adds r3, r3, r7\n\t"
  50048. "adcs r4, r4, #0\n\t"
  50049. "mov r5, #0\n\t"
  50050. "adc r5, r5, #0\n\t"
  50051. "lsr r7, r8, #16\n\t"
  50052. "mul r6, r7, r6\n\t"
  50053. "lsr r7, r6, #16\n\t"
  50054. "lsl r6, r6, #16\n\t"
  50055. "adds r3, r3, r6\n\t"
  50056. "adcs r4, r4, r7\n\t"
  50057. "adc r5, r5, #0\n\t"
  50058. "lsr r6, %[b], #16\n\t"
  50059. "lsr r7, r8, #16\n\t"
  50060. "mul r7, r6, r7\n\t"
  50061. "adds r4, r4, r7\n\t"
  50062. "adc r5, r5, #0\n\t"
  50063. "lsl r7, r8, #16\n\t"
  50064. "lsr r7, r7, #16\n\t"
  50065. "mul r6, r7, r6\n\t"
  50066. "lsr r7, r6, #16\n\t"
  50067. "lsl r6, r6, #16\n\t"
  50068. "adds r3, r3, r6\n\t"
  50069. "adcs r4, r4, r7\n\t"
  50070. "adc r5, r5, #0\n\t"
  50071. #else
  50072. "umull r6, r7, %[b], r8\n\t"
  50073. "adds r3, r3, r6\n\t"
  50074. "adcs r4, r4, r7\n\t"
  50075. "mov r5, #0\n\t"
  50076. "adc r5, r5, #0\n\t"
  50077. #endif
  50078. "str r3, [%[r]], #4\n\t"
  50079. /* A[115] * B */
  50080. "ldr r8, [%[a]], #4\n\t"
  50081. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50082. "lsl r6, %[b], #16\n\t"
  50083. "lsl r7, r8, #16\n\t"
  50084. "lsr r6, r6, #16\n\t"
  50085. "lsr r7, r7, #16\n\t"
  50086. "mul r7, r6, r7\n\t"
  50087. "adds r4, r4, r7\n\t"
  50088. "adcs r5, r5, #0\n\t"
  50089. "mov r3, #0\n\t"
  50090. "adc r3, r3, #0\n\t"
  50091. "lsr r7, r8, #16\n\t"
  50092. "mul r6, r7, r6\n\t"
  50093. "lsr r7, r6, #16\n\t"
  50094. "lsl r6, r6, #16\n\t"
  50095. "adds r4, r4, r6\n\t"
  50096. "adcs r5, r5, r7\n\t"
  50097. "adc r3, r3, #0\n\t"
  50098. "lsr r6, %[b], #16\n\t"
  50099. "lsr r7, r8, #16\n\t"
  50100. "mul r7, r6, r7\n\t"
  50101. "adds r5, r5, r7\n\t"
  50102. "adc r3, r3, #0\n\t"
  50103. "lsl r7, r8, #16\n\t"
  50104. "lsr r7, r7, #16\n\t"
  50105. "mul r6, r7, r6\n\t"
  50106. "lsr r7, r6, #16\n\t"
  50107. "lsl r6, r6, #16\n\t"
  50108. "adds r4, r4, r6\n\t"
  50109. "adcs r5, r5, r7\n\t"
  50110. "adc r3, r3, #0\n\t"
  50111. #else
  50112. "umull r6, r7, %[b], r8\n\t"
  50113. "adds r4, r4, r6\n\t"
  50114. "adcs r5, r5, r7\n\t"
  50115. "mov r3, #0\n\t"
  50116. "adc r3, r3, #0\n\t"
  50117. #endif
  50118. "str r4, [%[r]], #4\n\t"
  50119. /* A[116] * B */
  50120. "ldr r8, [%[a]], #4\n\t"
  50121. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50122. "lsl r6, %[b], #16\n\t"
  50123. "lsl r7, r8, #16\n\t"
  50124. "lsr r6, r6, #16\n\t"
  50125. "lsr r7, r7, #16\n\t"
  50126. "mul r7, r6, r7\n\t"
  50127. "adds r5, r5, r7\n\t"
  50128. "adcs r3, r3, #0\n\t"
  50129. "mov r4, #0\n\t"
  50130. "adc r4, r4, #0\n\t"
  50131. "lsr r7, r8, #16\n\t"
  50132. "mul r6, r7, r6\n\t"
  50133. "lsr r7, r6, #16\n\t"
  50134. "lsl r6, r6, #16\n\t"
  50135. "adds r5, r5, r6\n\t"
  50136. "adcs r3, r3, r7\n\t"
  50137. "adc r4, r4, #0\n\t"
  50138. "lsr r6, %[b], #16\n\t"
  50139. "lsr r7, r8, #16\n\t"
  50140. "mul r7, r6, r7\n\t"
  50141. "adds r3, r3, r7\n\t"
  50142. "adc r4, r4, #0\n\t"
  50143. "lsl r7, r8, #16\n\t"
  50144. "lsr r7, r7, #16\n\t"
  50145. "mul r6, r7, r6\n\t"
  50146. "lsr r7, r6, #16\n\t"
  50147. "lsl r6, r6, #16\n\t"
  50148. "adds r5, r5, r6\n\t"
  50149. "adcs r3, r3, r7\n\t"
  50150. "adc r4, r4, #0\n\t"
  50151. #else
  50152. "umull r6, r7, %[b], r8\n\t"
  50153. "adds r5, r5, r6\n\t"
  50154. "adcs r3, r3, r7\n\t"
  50155. "mov r4, #0\n\t"
  50156. "adc r4, r4, #0\n\t"
  50157. #endif
  50158. "str r5, [%[r]], #4\n\t"
  50159. /* A[117] * B */
  50160. "ldr r8, [%[a]], #4\n\t"
  50161. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50162. "lsl r6, %[b], #16\n\t"
  50163. "lsl r7, r8, #16\n\t"
  50164. "lsr r6, r6, #16\n\t"
  50165. "lsr r7, r7, #16\n\t"
  50166. "mul r7, r6, r7\n\t"
  50167. "adds r3, r3, r7\n\t"
  50168. "adcs r4, r4, #0\n\t"
  50169. "mov r5, #0\n\t"
  50170. "adc r5, r5, #0\n\t"
  50171. "lsr r7, r8, #16\n\t"
  50172. "mul r6, r7, r6\n\t"
  50173. "lsr r7, r6, #16\n\t"
  50174. "lsl r6, r6, #16\n\t"
  50175. "adds r3, r3, r6\n\t"
  50176. "adcs r4, r4, r7\n\t"
  50177. "adc r5, r5, #0\n\t"
  50178. "lsr r6, %[b], #16\n\t"
  50179. "lsr r7, r8, #16\n\t"
  50180. "mul r7, r6, r7\n\t"
  50181. "adds r4, r4, r7\n\t"
  50182. "adc r5, r5, #0\n\t"
  50183. "lsl r7, r8, #16\n\t"
  50184. "lsr r7, r7, #16\n\t"
  50185. "mul r6, r7, r6\n\t"
  50186. "lsr r7, r6, #16\n\t"
  50187. "lsl r6, r6, #16\n\t"
  50188. "adds r3, r3, r6\n\t"
  50189. "adcs r4, r4, r7\n\t"
  50190. "adc r5, r5, #0\n\t"
  50191. #else
  50192. "umull r6, r7, %[b], r8\n\t"
  50193. "adds r3, r3, r6\n\t"
  50194. "adcs r4, r4, r7\n\t"
  50195. "mov r5, #0\n\t"
  50196. "adc r5, r5, #0\n\t"
  50197. #endif
  50198. "str r3, [%[r]], #4\n\t"
  50199. /* A[118] * B */
  50200. "ldr r8, [%[a]], #4\n\t"
  50201. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50202. "lsl r6, %[b], #16\n\t"
  50203. "lsl r7, r8, #16\n\t"
  50204. "lsr r6, r6, #16\n\t"
  50205. "lsr r7, r7, #16\n\t"
  50206. "mul r7, r6, r7\n\t"
  50207. "adds r4, r4, r7\n\t"
  50208. "adcs r5, r5, #0\n\t"
  50209. "mov r3, #0\n\t"
  50210. "adc r3, r3, #0\n\t"
  50211. "lsr r7, r8, #16\n\t"
  50212. "mul r6, r7, r6\n\t"
  50213. "lsr r7, r6, #16\n\t"
  50214. "lsl r6, r6, #16\n\t"
  50215. "adds r4, r4, r6\n\t"
  50216. "adcs r5, r5, r7\n\t"
  50217. "adc r3, r3, #0\n\t"
  50218. "lsr r6, %[b], #16\n\t"
  50219. "lsr r7, r8, #16\n\t"
  50220. "mul r7, r6, r7\n\t"
  50221. "adds r5, r5, r7\n\t"
  50222. "adc r3, r3, #0\n\t"
  50223. "lsl r7, r8, #16\n\t"
  50224. "lsr r7, r7, #16\n\t"
  50225. "mul r6, r7, r6\n\t"
  50226. "lsr r7, r6, #16\n\t"
  50227. "lsl r6, r6, #16\n\t"
  50228. "adds r4, r4, r6\n\t"
  50229. "adcs r5, r5, r7\n\t"
  50230. "adc r3, r3, #0\n\t"
  50231. #else
  50232. "umull r6, r7, %[b], r8\n\t"
  50233. "adds r4, r4, r6\n\t"
  50234. "adcs r5, r5, r7\n\t"
  50235. "mov r3, #0\n\t"
  50236. "adc r3, r3, #0\n\t"
  50237. #endif
  50238. "str r4, [%[r]], #4\n\t"
  50239. /* A[119] * B */
  50240. "ldr r8, [%[a]], #4\n\t"
  50241. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50242. "lsl r6, %[b], #16\n\t"
  50243. "lsl r7, r8, #16\n\t"
  50244. "lsr r6, r6, #16\n\t"
  50245. "lsr r7, r7, #16\n\t"
  50246. "mul r7, r6, r7\n\t"
  50247. "adds r5, r5, r7\n\t"
  50248. "adcs r3, r3, #0\n\t"
  50249. "mov r4, #0\n\t"
  50250. "adc r4, r4, #0\n\t"
  50251. "lsr r7, r8, #16\n\t"
  50252. "mul r6, r7, r6\n\t"
  50253. "lsr r7, r6, #16\n\t"
  50254. "lsl r6, r6, #16\n\t"
  50255. "adds r5, r5, r6\n\t"
  50256. "adcs r3, r3, r7\n\t"
  50257. "adc r4, r4, #0\n\t"
  50258. "lsr r6, %[b], #16\n\t"
  50259. "lsr r7, r8, #16\n\t"
  50260. "mul r7, r6, r7\n\t"
  50261. "adds r3, r3, r7\n\t"
  50262. "adc r4, r4, #0\n\t"
  50263. "lsl r7, r8, #16\n\t"
  50264. "lsr r7, r7, #16\n\t"
  50265. "mul r6, r7, r6\n\t"
  50266. "lsr r7, r6, #16\n\t"
  50267. "lsl r6, r6, #16\n\t"
  50268. "adds r5, r5, r6\n\t"
  50269. "adcs r3, r3, r7\n\t"
  50270. "adc r4, r4, #0\n\t"
  50271. #else
  50272. "umull r6, r7, %[b], r8\n\t"
  50273. "adds r5, r5, r6\n\t"
  50274. "adcs r3, r3, r7\n\t"
  50275. "mov r4, #0\n\t"
  50276. "adc r4, r4, #0\n\t"
  50277. #endif
  50278. "str r5, [%[r]], #4\n\t"
  50279. /* A[120] * B */
  50280. "ldr r8, [%[a]], #4\n\t"
  50281. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50282. "lsl r6, %[b], #16\n\t"
  50283. "lsl r7, r8, #16\n\t"
  50284. "lsr r6, r6, #16\n\t"
  50285. "lsr r7, r7, #16\n\t"
  50286. "mul r7, r6, r7\n\t"
  50287. "adds r3, r3, r7\n\t"
  50288. "adcs r4, r4, #0\n\t"
  50289. "mov r5, #0\n\t"
  50290. "adc r5, r5, #0\n\t"
  50291. "lsr r7, r8, #16\n\t"
  50292. "mul r6, r7, r6\n\t"
  50293. "lsr r7, r6, #16\n\t"
  50294. "lsl r6, r6, #16\n\t"
  50295. "adds r3, r3, r6\n\t"
  50296. "adcs r4, r4, r7\n\t"
  50297. "adc r5, r5, #0\n\t"
  50298. "lsr r6, %[b], #16\n\t"
  50299. "lsr r7, r8, #16\n\t"
  50300. "mul r7, r6, r7\n\t"
  50301. "adds r4, r4, r7\n\t"
  50302. "adc r5, r5, #0\n\t"
  50303. "lsl r7, r8, #16\n\t"
  50304. "lsr r7, r7, #16\n\t"
  50305. "mul r6, r7, r6\n\t"
  50306. "lsr r7, r6, #16\n\t"
  50307. "lsl r6, r6, #16\n\t"
  50308. "adds r3, r3, r6\n\t"
  50309. "adcs r4, r4, r7\n\t"
  50310. "adc r5, r5, #0\n\t"
  50311. #else
  50312. "umull r6, r7, %[b], r8\n\t"
  50313. "adds r3, r3, r6\n\t"
  50314. "adcs r4, r4, r7\n\t"
  50315. "mov r5, #0\n\t"
  50316. "adc r5, r5, #0\n\t"
  50317. #endif
  50318. "str r3, [%[r]], #4\n\t"
  50319. /* A[121] * B */
  50320. "ldr r8, [%[a]], #4\n\t"
  50321. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50322. "lsl r6, %[b], #16\n\t"
  50323. "lsl r7, r8, #16\n\t"
  50324. "lsr r6, r6, #16\n\t"
  50325. "lsr r7, r7, #16\n\t"
  50326. "mul r7, r6, r7\n\t"
  50327. "adds r4, r4, r7\n\t"
  50328. "adcs r5, r5, #0\n\t"
  50329. "mov r3, #0\n\t"
  50330. "adc r3, r3, #0\n\t"
  50331. "lsr r7, r8, #16\n\t"
  50332. "mul r6, r7, r6\n\t"
  50333. "lsr r7, r6, #16\n\t"
  50334. "lsl r6, r6, #16\n\t"
  50335. "adds r4, r4, r6\n\t"
  50336. "adcs r5, r5, r7\n\t"
  50337. "adc r3, r3, #0\n\t"
  50338. "lsr r6, %[b], #16\n\t"
  50339. "lsr r7, r8, #16\n\t"
  50340. "mul r7, r6, r7\n\t"
  50341. "adds r5, r5, r7\n\t"
  50342. "adc r3, r3, #0\n\t"
  50343. "lsl r7, r8, #16\n\t"
  50344. "lsr r7, r7, #16\n\t"
  50345. "mul r6, r7, r6\n\t"
  50346. "lsr r7, r6, #16\n\t"
  50347. "lsl r6, r6, #16\n\t"
  50348. "adds r4, r4, r6\n\t"
  50349. "adcs r5, r5, r7\n\t"
  50350. "adc r3, r3, #0\n\t"
  50351. #else
  50352. "umull r6, r7, %[b], r8\n\t"
  50353. "adds r4, r4, r6\n\t"
  50354. "adcs r5, r5, r7\n\t"
  50355. "mov r3, #0\n\t"
  50356. "adc r3, r3, #0\n\t"
  50357. #endif
  50358. "str r4, [%[r]], #4\n\t"
  50359. /* A[122] * B */
  50360. "ldr r8, [%[a]], #4\n\t"
  50361. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50362. "lsl r6, %[b], #16\n\t"
  50363. "lsl r7, r8, #16\n\t"
  50364. "lsr r6, r6, #16\n\t"
  50365. "lsr r7, r7, #16\n\t"
  50366. "mul r7, r6, r7\n\t"
  50367. "adds r5, r5, r7\n\t"
  50368. "adcs r3, r3, #0\n\t"
  50369. "mov r4, #0\n\t"
  50370. "adc r4, r4, #0\n\t"
  50371. "lsr r7, r8, #16\n\t"
  50372. "mul r6, r7, r6\n\t"
  50373. "lsr r7, r6, #16\n\t"
  50374. "lsl r6, r6, #16\n\t"
  50375. "adds r5, r5, r6\n\t"
  50376. "adcs r3, r3, r7\n\t"
  50377. "adc r4, r4, #0\n\t"
  50378. "lsr r6, %[b], #16\n\t"
  50379. "lsr r7, r8, #16\n\t"
  50380. "mul r7, r6, r7\n\t"
  50381. "adds r3, r3, r7\n\t"
  50382. "adc r4, r4, #0\n\t"
  50383. "lsl r7, r8, #16\n\t"
  50384. "lsr r7, r7, #16\n\t"
  50385. "mul r6, r7, r6\n\t"
  50386. "lsr r7, r6, #16\n\t"
  50387. "lsl r6, r6, #16\n\t"
  50388. "adds r5, r5, r6\n\t"
  50389. "adcs r3, r3, r7\n\t"
  50390. "adc r4, r4, #0\n\t"
  50391. #else
  50392. "umull r6, r7, %[b], r8\n\t"
  50393. "adds r5, r5, r6\n\t"
  50394. "adcs r3, r3, r7\n\t"
  50395. "mov r4, #0\n\t"
  50396. "adc r4, r4, #0\n\t"
  50397. #endif
  50398. "str r5, [%[r]], #4\n\t"
  50399. /* A[123] * B */
  50400. "ldr r8, [%[a]], #4\n\t"
  50401. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50402. "lsl r6, %[b], #16\n\t"
  50403. "lsl r7, r8, #16\n\t"
  50404. "lsr r6, r6, #16\n\t"
  50405. "lsr r7, r7, #16\n\t"
  50406. "mul r7, r6, r7\n\t"
  50407. "adds r3, r3, r7\n\t"
  50408. "adcs r4, r4, #0\n\t"
  50409. "mov r5, #0\n\t"
  50410. "adc r5, r5, #0\n\t"
  50411. "lsr r7, r8, #16\n\t"
  50412. "mul r6, r7, r6\n\t"
  50413. "lsr r7, r6, #16\n\t"
  50414. "lsl r6, r6, #16\n\t"
  50415. "adds r3, r3, r6\n\t"
  50416. "adcs r4, r4, r7\n\t"
  50417. "adc r5, r5, #0\n\t"
  50418. "lsr r6, %[b], #16\n\t"
  50419. "lsr r7, r8, #16\n\t"
  50420. "mul r7, r6, r7\n\t"
  50421. "adds r4, r4, r7\n\t"
  50422. "adc r5, r5, #0\n\t"
  50423. "lsl r7, r8, #16\n\t"
  50424. "lsr r7, r7, #16\n\t"
  50425. "mul r6, r7, r6\n\t"
  50426. "lsr r7, r6, #16\n\t"
  50427. "lsl r6, r6, #16\n\t"
  50428. "adds r3, r3, r6\n\t"
  50429. "adcs r4, r4, r7\n\t"
  50430. "adc r5, r5, #0\n\t"
  50431. #else
  50432. "umull r6, r7, %[b], r8\n\t"
  50433. "adds r3, r3, r6\n\t"
  50434. "adcs r4, r4, r7\n\t"
  50435. "mov r5, #0\n\t"
  50436. "adc r5, r5, #0\n\t"
  50437. #endif
  50438. "str r3, [%[r]], #4\n\t"
  50439. /* A[124] * B */
  50440. "ldr r8, [%[a]], #4\n\t"
  50441. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50442. "lsl r6, %[b], #16\n\t"
  50443. "lsl r7, r8, #16\n\t"
  50444. "lsr r6, r6, #16\n\t"
  50445. "lsr r7, r7, #16\n\t"
  50446. "mul r7, r6, r7\n\t"
  50447. "adds r4, r4, r7\n\t"
  50448. "adcs r5, r5, #0\n\t"
  50449. "mov r3, #0\n\t"
  50450. "adc r3, r3, #0\n\t"
  50451. "lsr r7, r8, #16\n\t"
  50452. "mul r6, r7, r6\n\t"
  50453. "lsr r7, r6, #16\n\t"
  50454. "lsl r6, r6, #16\n\t"
  50455. "adds r4, r4, r6\n\t"
  50456. "adcs r5, r5, r7\n\t"
  50457. "adc r3, r3, #0\n\t"
  50458. "lsr r6, %[b], #16\n\t"
  50459. "lsr r7, r8, #16\n\t"
  50460. "mul r7, r6, r7\n\t"
  50461. "adds r5, r5, r7\n\t"
  50462. "adc r3, r3, #0\n\t"
  50463. "lsl r7, r8, #16\n\t"
  50464. "lsr r7, r7, #16\n\t"
  50465. "mul r6, r7, r6\n\t"
  50466. "lsr r7, r6, #16\n\t"
  50467. "lsl r6, r6, #16\n\t"
  50468. "adds r4, r4, r6\n\t"
  50469. "adcs r5, r5, r7\n\t"
  50470. "adc r3, r3, #0\n\t"
  50471. #else
  50472. "umull r6, r7, %[b], r8\n\t"
  50473. "adds r4, r4, r6\n\t"
  50474. "adcs r5, r5, r7\n\t"
  50475. "mov r3, #0\n\t"
  50476. "adc r3, r3, #0\n\t"
  50477. #endif
  50478. "str r4, [%[r]], #4\n\t"
  50479. /* A[125] * B */
  50480. "ldr r8, [%[a]], #4\n\t"
  50481. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50482. "lsl r6, %[b], #16\n\t"
  50483. "lsl r7, r8, #16\n\t"
  50484. "lsr r6, r6, #16\n\t"
  50485. "lsr r7, r7, #16\n\t"
  50486. "mul r7, r6, r7\n\t"
  50487. "adds r5, r5, r7\n\t"
  50488. "adcs r3, r3, #0\n\t"
  50489. "mov r4, #0\n\t"
  50490. "adc r4, r4, #0\n\t"
  50491. "lsr r7, r8, #16\n\t"
  50492. "mul r6, r7, r6\n\t"
  50493. "lsr r7, r6, #16\n\t"
  50494. "lsl r6, r6, #16\n\t"
  50495. "adds r5, r5, r6\n\t"
  50496. "adcs r3, r3, r7\n\t"
  50497. "adc r4, r4, #0\n\t"
  50498. "lsr r6, %[b], #16\n\t"
  50499. "lsr r7, r8, #16\n\t"
  50500. "mul r7, r6, r7\n\t"
  50501. "adds r3, r3, r7\n\t"
  50502. "adc r4, r4, #0\n\t"
  50503. "lsl r7, r8, #16\n\t"
  50504. "lsr r7, r7, #16\n\t"
  50505. "mul r6, r7, r6\n\t"
  50506. "lsr r7, r6, #16\n\t"
  50507. "lsl r6, r6, #16\n\t"
  50508. "adds r5, r5, r6\n\t"
  50509. "adcs r3, r3, r7\n\t"
  50510. "adc r4, r4, #0\n\t"
  50511. #else
  50512. "umull r6, r7, %[b], r8\n\t"
  50513. "adds r5, r5, r6\n\t"
  50514. "adcs r3, r3, r7\n\t"
  50515. "mov r4, #0\n\t"
  50516. "adc r4, r4, #0\n\t"
  50517. #endif
  50518. "str r5, [%[r]], #4\n\t"
  50519. /* A[126] * B */
  50520. "ldr r8, [%[a]], #4\n\t"
  50521. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50522. "lsl r6, %[b], #16\n\t"
  50523. "lsl r7, r8, #16\n\t"
  50524. "lsr r6, r6, #16\n\t"
  50525. "lsr r7, r7, #16\n\t"
  50526. "mul r7, r6, r7\n\t"
  50527. "adds r3, r3, r7\n\t"
  50528. "adcs r4, r4, #0\n\t"
  50529. "mov r5, #0\n\t"
  50530. "adc r5, r5, #0\n\t"
  50531. "lsr r7, r8, #16\n\t"
  50532. "mul r6, r7, r6\n\t"
  50533. "lsr r7, r6, #16\n\t"
  50534. "lsl r6, r6, #16\n\t"
  50535. "adds r3, r3, r6\n\t"
  50536. "adcs r4, r4, r7\n\t"
  50537. "adc r5, r5, #0\n\t"
  50538. "lsr r6, %[b], #16\n\t"
  50539. "lsr r7, r8, #16\n\t"
  50540. "mul r7, r6, r7\n\t"
  50541. "adds r4, r4, r7\n\t"
  50542. "adc r5, r5, #0\n\t"
  50543. "lsl r7, r8, #16\n\t"
  50544. "lsr r7, r7, #16\n\t"
  50545. "mul r6, r7, r6\n\t"
  50546. "lsr r7, r6, #16\n\t"
  50547. "lsl r6, r6, #16\n\t"
  50548. "adds r3, r3, r6\n\t"
  50549. "adcs r4, r4, r7\n\t"
  50550. "adc r5, r5, #0\n\t"
  50551. #else
  50552. "umull r6, r7, %[b], r8\n\t"
  50553. "adds r3, r3, r6\n\t"
  50554. "adcs r4, r4, r7\n\t"
  50555. "mov r5, #0\n\t"
  50556. "adc r5, r5, #0\n\t"
  50557. #endif
  50558. "str r3, [%[r]], #4\n\t"
  50559. /* A[127] * B */
  50560. "ldr r8, [%[a]], #4\n\t"
  50561. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  50562. "lsl r6, %[b], #16\n\t"
  50563. "lsl r7, r8, #16\n\t"
  50564. "lsr r6, r6, #16\n\t"
  50565. "lsr r7, r7, #16\n\t"
  50566. "mul r7, r6, r7\n\t"
  50567. "adds r4, r4, r7\n\t"
  50568. "adc r5, r5, #0\n\t"
  50569. "lsr r7, r8, #16\n\t"
  50570. "mul r6, r7, r6\n\t"
  50571. "lsr r7, r6, #16\n\t"
  50572. "lsl r6, r6, #16\n\t"
  50573. "adds r4, r4, r6\n\t"
  50574. "adc r5, r5, r7\n\t"
  50575. "lsr r6, %[b], #16\n\t"
  50576. "lsr r7, r8, #16\n\t"
  50577. "mul r7, r6, r7\n\t"
  50578. "add r5, r5, r7\n\t"
  50579. "lsl r7, r8, #16\n\t"
  50580. "lsr r7, r7, #16\n\t"
  50581. "mul r6, r7, r6\n\t"
  50582. "lsr r7, r6, #16\n\t"
  50583. "lsl r6, r6, #16\n\t"
  50584. "adds r4, r4, r6\n\t"
  50585. "adc r5, r5, r7\n\t"
  50586. #else
  50587. "umull r6, r7, %[b], r8\n\t"
  50588. "adds r4, r4, r6\n\t"
  50589. "adc r5, r5, r7\n\t"
  50590. #endif
  50591. "str r4, [%[r]], #4\n\t"
  50592. "str r5, [%[r]]\n\t"
  50593. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  50594. :
  50595. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10"
  50596. );
  50597. }
  50598. #endif /* WOLFSSL_SP_SMALL */
  50599. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  50600. /* r = 2^n mod m where n is the number of bits to reduce by.
  50601. * Given m must be 4096 bits, just need to subtract.
  50602. *
  50603. * r A single precision number.
  50604. * m A single precision number.
  50605. */
  50606. static void sp_4096_mont_norm_128(sp_digit* r, const sp_digit* m)
  50607. {
  50608. XMEMSET(r, 0, sizeof(sp_digit) * 128);
  50609. /* r = 2^n mod m */
  50610. sp_4096_sub_in_place_128(r, m);
  50611. }
  50612. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  50613. #ifdef WOLFSSL_SP_SMALL
  50614. /* Conditionally subtract b from a using the mask m.
  50615. * m is -1 to subtract and 0 when not copying.
  50616. *
  50617. * r A single precision number representing condition subtract result.
  50618. * a A single precision number to subtract from.
  50619. * b A single precision number to subtract.
  50620. * m Mask value to apply.
  50621. */
  50622. static sp_digit sp_4096_cond_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  50623. {
  50624. register sp_digit* r asm ("r0") = r_p;
  50625. register const sp_digit* a asm ("r1") = a_p;
  50626. register const sp_digit* b asm ("r2") = b_p;
  50627. register sp_digit m asm ("r3") = m_p;
  50628. __asm__ __volatile__ (
  50629. "mov r6, #0\n\t"
  50630. "mov r12, #0\n\t"
  50631. "mov lr, #0\n\t"
  50632. "\n"
  50633. "L_sp_4096_cond_sub_128_words_%=: \n\t"
  50634. "subs r12, r6, r12\n\t"
  50635. "ldr r4, [%[a], lr]\n\t"
  50636. "ldr r5, [%[b], lr]\n\t"
  50637. "and r5, r5, %[m]\n\t"
  50638. "sbcs r4, r4, r5\n\t"
  50639. "sbc r12, r6, r6\n\t"
  50640. "str r4, [%[r], lr]\n\t"
  50641. "add lr, lr, #4\n\t"
  50642. "cmp lr, #0x200\n\t"
  50643. "blt L_sp_4096_cond_sub_128_words_%=\n\t"
  50644. "mov %[r], r12\n\t"
  50645. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  50646. :
  50647. : "memory", "r12", "lr", "r4", "r5", "r6"
  50648. );
  50649. return (uint32_t)(size_t)r;
  50650. }
  50651. #else
  50652. /* Conditionally subtract b from a using the mask m.
  50653. * m is -1 to subtract and 0 when not copying.
  50654. *
  50655. * r A single precision number representing condition subtract result.
  50656. * a A single precision number to subtract from.
  50657. * b A single precision number to subtract.
  50658. * m Mask value to apply.
  50659. */
  50660. static sp_digit sp_4096_cond_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  50661. {
  50662. register sp_digit* r asm ("r0") = r_p;
  50663. register const sp_digit* a asm ("r1") = a_p;
  50664. register const sp_digit* b asm ("r2") = b_p;
  50665. register sp_digit m asm ("r3") = m_p;
  50666. __asm__ __volatile__ (
  50667. "mov lr, #0\n\t"
  50668. "ldm %[a]!, {r4, r5}\n\t"
  50669. "ldm %[b]!, {r6, r7}\n\t"
  50670. "and r6, r6, %[m]\n\t"
  50671. "and r7, r7, %[m]\n\t"
  50672. "subs r4, r4, r6\n\t"
  50673. "sbcs r5, r5, r7\n\t"
  50674. "stm %[r]!, {r4, r5}\n\t"
  50675. "ldm %[a]!, {r4, r5}\n\t"
  50676. "ldm %[b]!, {r6, r7}\n\t"
  50677. "and r6, r6, %[m]\n\t"
  50678. "and r7, r7, %[m]\n\t"
  50679. "sbcs r4, r4, r6\n\t"
  50680. "sbcs r5, r5, r7\n\t"
  50681. "stm %[r]!, {r4, r5}\n\t"
  50682. "ldm %[a]!, {r4, r5}\n\t"
  50683. "ldm %[b]!, {r6, r7}\n\t"
  50684. "and r6, r6, %[m]\n\t"
  50685. "and r7, r7, %[m]\n\t"
  50686. "sbcs r4, r4, r6\n\t"
  50687. "sbcs r5, r5, r7\n\t"
  50688. "stm %[r]!, {r4, r5}\n\t"
  50689. "ldm %[a]!, {r4, r5}\n\t"
  50690. "ldm %[b]!, {r6, r7}\n\t"
  50691. "and r6, r6, %[m]\n\t"
  50692. "and r7, r7, %[m]\n\t"
  50693. "sbcs r4, r4, r6\n\t"
  50694. "sbcs r5, r5, r7\n\t"
  50695. "stm %[r]!, {r4, r5}\n\t"
  50696. "ldm %[a]!, {r4, r5}\n\t"
  50697. "ldm %[b]!, {r6, r7}\n\t"
  50698. "and r6, r6, %[m]\n\t"
  50699. "and r7, r7, %[m]\n\t"
  50700. "sbcs r4, r4, r6\n\t"
  50701. "sbcs r5, r5, r7\n\t"
  50702. "stm %[r]!, {r4, r5}\n\t"
  50703. "ldm %[a]!, {r4, r5}\n\t"
  50704. "ldm %[b]!, {r6, r7}\n\t"
  50705. "and r6, r6, %[m]\n\t"
  50706. "and r7, r7, %[m]\n\t"
  50707. "sbcs r4, r4, r6\n\t"
  50708. "sbcs r5, r5, r7\n\t"
  50709. "stm %[r]!, {r4, r5}\n\t"
  50710. "ldm %[a]!, {r4, r5}\n\t"
  50711. "ldm %[b]!, {r6, r7}\n\t"
  50712. "and r6, r6, %[m]\n\t"
  50713. "and r7, r7, %[m]\n\t"
  50714. "sbcs r4, r4, r6\n\t"
  50715. "sbcs r5, r5, r7\n\t"
  50716. "stm %[r]!, {r4, r5}\n\t"
  50717. "ldm %[a]!, {r4, r5}\n\t"
  50718. "ldm %[b]!, {r6, r7}\n\t"
  50719. "and r6, r6, %[m]\n\t"
  50720. "and r7, r7, %[m]\n\t"
  50721. "sbcs r4, r4, r6\n\t"
  50722. "sbcs r5, r5, r7\n\t"
  50723. "stm %[r]!, {r4, r5}\n\t"
  50724. "ldm %[a]!, {r4, r5}\n\t"
  50725. "ldm %[b]!, {r6, r7}\n\t"
  50726. "and r6, r6, %[m]\n\t"
  50727. "and r7, r7, %[m]\n\t"
  50728. "sbcs r4, r4, r6\n\t"
  50729. "sbcs r5, r5, r7\n\t"
  50730. "stm %[r]!, {r4, r5}\n\t"
  50731. "ldm %[a]!, {r4, r5}\n\t"
  50732. "ldm %[b]!, {r6, r7}\n\t"
  50733. "and r6, r6, %[m]\n\t"
  50734. "and r7, r7, %[m]\n\t"
  50735. "sbcs r4, r4, r6\n\t"
  50736. "sbcs r5, r5, r7\n\t"
  50737. "stm %[r]!, {r4, r5}\n\t"
  50738. "ldm %[a]!, {r4, r5}\n\t"
  50739. "ldm %[b]!, {r6, r7}\n\t"
  50740. "and r6, r6, %[m]\n\t"
  50741. "and r7, r7, %[m]\n\t"
  50742. "sbcs r4, r4, r6\n\t"
  50743. "sbcs r5, r5, r7\n\t"
  50744. "stm %[r]!, {r4, r5}\n\t"
  50745. "ldm %[a]!, {r4, r5}\n\t"
  50746. "ldm %[b]!, {r6, r7}\n\t"
  50747. "and r6, r6, %[m]\n\t"
  50748. "and r7, r7, %[m]\n\t"
  50749. "sbcs r4, r4, r6\n\t"
  50750. "sbcs r5, r5, r7\n\t"
  50751. "stm %[r]!, {r4, r5}\n\t"
  50752. "ldm %[a]!, {r4, r5}\n\t"
  50753. "ldm %[b]!, {r6, r7}\n\t"
  50754. "and r6, r6, %[m]\n\t"
  50755. "and r7, r7, %[m]\n\t"
  50756. "sbcs r4, r4, r6\n\t"
  50757. "sbcs r5, r5, r7\n\t"
  50758. "stm %[r]!, {r4, r5}\n\t"
  50759. "ldm %[a]!, {r4, r5}\n\t"
  50760. "ldm %[b]!, {r6, r7}\n\t"
  50761. "and r6, r6, %[m]\n\t"
  50762. "and r7, r7, %[m]\n\t"
  50763. "sbcs r4, r4, r6\n\t"
  50764. "sbcs r5, r5, r7\n\t"
  50765. "stm %[r]!, {r4, r5}\n\t"
  50766. "ldm %[a]!, {r4, r5}\n\t"
  50767. "ldm %[b]!, {r6, r7}\n\t"
  50768. "and r6, r6, %[m]\n\t"
  50769. "and r7, r7, %[m]\n\t"
  50770. "sbcs r4, r4, r6\n\t"
  50771. "sbcs r5, r5, r7\n\t"
  50772. "stm %[r]!, {r4, r5}\n\t"
  50773. "ldm %[a]!, {r4, r5}\n\t"
  50774. "ldm %[b]!, {r6, r7}\n\t"
  50775. "and r6, r6, %[m]\n\t"
  50776. "and r7, r7, %[m]\n\t"
  50777. "sbcs r4, r4, r6\n\t"
  50778. "sbcs r5, r5, r7\n\t"
  50779. "stm %[r]!, {r4, r5}\n\t"
  50780. "ldm %[a]!, {r4, r5}\n\t"
  50781. "ldm %[b]!, {r6, r7}\n\t"
  50782. "and r6, r6, %[m]\n\t"
  50783. "and r7, r7, %[m]\n\t"
  50784. "sbcs r4, r4, r6\n\t"
  50785. "sbcs r5, r5, r7\n\t"
  50786. "stm %[r]!, {r4, r5}\n\t"
  50787. "ldm %[a]!, {r4, r5}\n\t"
  50788. "ldm %[b]!, {r6, r7}\n\t"
  50789. "and r6, r6, %[m]\n\t"
  50790. "and r7, r7, %[m]\n\t"
  50791. "sbcs r4, r4, r6\n\t"
  50792. "sbcs r5, r5, r7\n\t"
  50793. "stm %[r]!, {r4, r5}\n\t"
  50794. "ldm %[a]!, {r4, r5}\n\t"
  50795. "ldm %[b]!, {r6, r7}\n\t"
  50796. "and r6, r6, %[m]\n\t"
  50797. "and r7, r7, %[m]\n\t"
  50798. "sbcs r4, r4, r6\n\t"
  50799. "sbcs r5, r5, r7\n\t"
  50800. "stm %[r]!, {r4, r5}\n\t"
  50801. "ldm %[a]!, {r4, r5}\n\t"
  50802. "ldm %[b]!, {r6, r7}\n\t"
  50803. "and r6, r6, %[m]\n\t"
  50804. "and r7, r7, %[m]\n\t"
  50805. "sbcs r4, r4, r6\n\t"
  50806. "sbcs r5, r5, r7\n\t"
  50807. "stm %[r]!, {r4, r5}\n\t"
  50808. "ldm %[a]!, {r4, r5}\n\t"
  50809. "ldm %[b]!, {r6, r7}\n\t"
  50810. "and r6, r6, %[m]\n\t"
  50811. "and r7, r7, %[m]\n\t"
  50812. "sbcs r4, r4, r6\n\t"
  50813. "sbcs r5, r5, r7\n\t"
  50814. "stm %[r]!, {r4, r5}\n\t"
  50815. "ldm %[a]!, {r4, r5}\n\t"
  50816. "ldm %[b]!, {r6, r7}\n\t"
  50817. "and r6, r6, %[m]\n\t"
  50818. "and r7, r7, %[m]\n\t"
  50819. "sbcs r4, r4, r6\n\t"
  50820. "sbcs r5, r5, r7\n\t"
  50821. "stm %[r]!, {r4, r5}\n\t"
  50822. "ldm %[a]!, {r4, r5}\n\t"
  50823. "ldm %[b]!, {r6, r7}\n\t"
  50824. "and r6, r6, %[m]\n\t"
  50825. "and r7, r7, %[m]\n\t"
  50826. "sbcs r4, r4, r6\n\t"
  50827. "sbcs r5, r5, r7\n\t"
  50828. "stm %[r]!, {r4, r5}\n\t"
  50829. "ldm %[a]!, {r4, r5}\n\t"
  50830. "ldm %[b]!, {r6, r7}\n\t"
  50831. "and r6, r6, %[m]\n\t"
  50832. "and r7, r7, %[m]\n\t"
  50833. "sbcs r4, r4, r6\n\t"
  50834. "sbcs r5, r5, r7\n\t"
  50835. "stm %[r]!, {r4, r5}\n\t"
  50836. "ldm %[a]!, {r4, r5}\n\t"
  50837. "ldm %[b]!, {r6, r7}\n\t"
  50838. "and r6, r6, %[m]\n\t"
  50839. "and r7, r7, %[m]\n\t"
  50840. "sbcs r4, r4, r6\n\t"
  50841. "sbcs r5, r5, r7\n\t"
  50842. "stm %[r]!, {r4, r5}\n\t"
  50843. "ldm %[a]!, {r4, r5}\n\t"
  50844. "ldm %[b]!, {r6, r7}\n\t"
  50845. "and r6, r6, %[m]\n\t"
  50846. "and r7, r7, %[m]\n\t"
  50847. "sbcs r4, r4, r6\n\t"
  50848. "sbcs r5, r5, r7\n\t"
  50849. "stm %[r]!, {r4, r5}\n\t"
  50850. "ldm %[a]!, {r4, r5}\n\t"
  50851. "ldm %[b]!, {r6, r7}\n\t"
  50852. "and r6, r6, %[m]\n\t"
  50853. "and r7, r7, %[m]\n\t"
  50854. "sbcs r4, r4, r6\n\t"
  50855. "sbcs r5, r5, r7\n\t"
  50856. "stm %[r]!, {r4, r5}\n\t"
  50857. "ldm %[a]!, {r4, r5}\n\t"
  50858. "ldm %[b]!, {r6, r7}\n\t"
  50859. "and r6, r6, %[m]\n\t"
  50860. "and r7, r7, %[m]\n\t"
  50861. "sbcs r4, r4, r6\n\t"
  50862. "sbcs r5, r5, r7\n\t"
  50863. "stm %[r]!, {r4, r5}\n\t"
  50864. "ldm %[a]!, {r4, r5}\n\t"
  50865. "ldm %[b]!, {r6, r7}\n\t"
  50866. "and r6, r6, %[m]\n\t"
  50867. "and r7, r7, %[m]\n\t"
  50868. "sbcs r4, r4, r6\n\t"
  50869. "sbcs r5, r5, r7\n\t"
  50870. "stm %[r]!, {r4, r5}\n\t"
  50871. "ldm %[a]!, {r4, r5}\n\t"
  50872. "ldm %[b]!, {r6, r7}\n\t"
  50873. "and r6, r6, %[m]\n\t"
  50874. "and r7, r7, %[m]\n\t"
  50875. "sbcs r4, r4, r6\n\t"
  50876. "sbcs r5, r5, r7\n\t"
  50877. "stm %[r]!, {r4, r5}\n\t"
  50878. "ldm %[a]!, {r4, r5}\n\t"
  50879. "ldm %[b]!, {r6, r7}\n\t"
  50880. "and r6, r6, %[m]\n\t"
  50881. "and r7, r7, %[m]\n\t"
  50882. "sbcs r4, r4, r6\n\t"
  50883. "sbcs r5, r5, r7\n\t"
  50884. "stm %[r]!, {r4, r5}\n\t"
  50885. "ldm %[a]!, {r4, r5}\n\t"
  50886. "ldm %[b]!, {r6, r7}\n\t"
  50887. "and r6, r6, %[m]\n\t"
  50888. "and r7, r7, %[m]\n\t"
  50889. "sbcs r4, r4, r6\n\t"
  50890. "sbcs r5, r5, r7\n\t"
  50891. "stm %[r]!, {r4, r5}\n\t"
  50892. "ldm %[a]!, {r4, r5}\n\t"
  50893. "ldm %[b]!, {r6, r7}\n\t"
  50894. "and r6, r6, %[m]\n\t"
  50895. "and r7, r7, %[m]\n\t"
  50896. "sbcs r4, r4, r6\n\t"
  50897. "sbcs r5, r5, r7\n\t"
  50898. "stm %[r]!, {r4, r5}\n\t"
  50899. "ldm %[a]!, {r4, r5}\n\t"
  50900. "ldm %[b]!, {r6, r7}\n\t"
  50901. "and r6, r6, %[m]\n\t"
  50902. "and r7, r7, %[m]\n\t"
  50903. "sbcs r4, r4, r6\n\t"
  50904. "sbcs r5, r5, r7\n\t"
  50905. "stm %[r]!, {r4, r5}\n\t"
  50906. "ldm %[a]!, {r4, r5}\n\t"
  50907. "ldm %[b]!, {r6, r7}\n\t"
  50908. "and r6, r6, %[m]\n\t"
  50909. "and r7, r7, %[m]\n\t"
  50910. "sbcs r4, r4, r6\n\t"
  50911. "sbcs r5, r5, r7\n\t"
  50912. "stm %[r]!, {r4, r5}\n\t"
  50913. "ldm %[a]!, {r4, r5}\n\t"
  50914. "ldm %[b]!, {r6, r7}\n\t"
  50915. "and r6, r6, %[m]\n\t"
  50916. "and r7, r7, %[m]\n\t"
  50917. "sbcs r4, r4, r6\n\t"
  50918. "sbcs r5, r5, r7\n\t"
  50919. "stm %[r]!, {r4, r5}\n\t"
  50920. "ldm %[a]!, {r4, r5}\n\t"
  50921. "ldm %[b]!, {r6, r7}\n\t"
  50922. "and r6, r6, %[m]\n\t"
  50923. "and r7, r7, %[m]\n\t"
  50924. "sbcs r4, r4, r6\n\t"
  50925. "sbcs r5, r5, r7\n\t"
  50926. "stm %[r]!, {r4, r5}\n\t"
  50927. "ldm %[a]!, {r4, r5}\n\t"
  50928. "ldm %[b]!, {r6, r7}\n\t"
  50929. "and r6, r6, %[m]\n\t"
  50930. "and r7, r7, %[m]\n\t"
  50931. "sbcs r4, r4, r6\n\t"
  50932. "sbcs r5, r5, r7\n\t"
  50933. "stm %[r]!, {r4, r5}\n\t"
  50934. "ldm %[a]!, {r4, r5}\n\t"
  50935. "ldm %[b]!, {r6, r7}\n\t"
  50936. "and r6, r6, %[m]\n\t"
  50937. "and r7, r7, %[m]\n\t"
  50938. "sbcs r4, r4, r6\n\t"
  50939. "sbcs r5, r5, r7\n\t"
  50940. "stm %[r]!, {r4, r5}\n\t"
  50941. "ldm %[a]!, {r4, r5}\n\t"
  50942. "ldm %[b]!, {r6, r7}\n\t"
  50943. "and r6, r6, %[m]\n\t"
  50944. "and r7, r7, %[m]\n\t"
  50945. "sbcs r4, r4, r6\n\t"
  50946. "sbcs r5, r5, r7\n\t"
  50947. "stm %[r]!, {r4, r5}\n\t"
  50948. "ldm %[a]!, {r4, r5}\n\t"
  50949. "ldm %[b]!, {r6, r7}\n\t"
  50950. "and r6, r6, %[m]\n\t"
  50951. "and r7, r7, %[m]\n\t"
  50952. "sbcs r4, r4, r6\n\t"
  50953. "sbcs r5, r5, r7\n\t"
  50954. "stm %[r]!, {r4, r5}\n\t"
  50955. "ldm %[a]!, {r4, r5}\n\t"
  50956. "ldm %[b]!, {r6, r7}\n\t"
  50957. "and r6, r6, %[m]\n\t"
  50958. "and r7, r7, %[m]\n\t"
  50959. "sbcs r4, r4, r6\n\t"
  50960. "sbcs r5, r5, r7\n\t"
  50961. "stm %[r]!, {r4, r5}\n\t"
  50962. "ldm %[a]!, {r4, r5}\n\t"
  50963. "ldm %[b]!, {r6, r7}\n\t"
  50964. "and r6, r6, %[m]\n\t"
  50965. "and r7, r7, %[m]\n\t"
  50966. "sbcs r4, r4, r6\n\t"
  50967. "sbcs r5, r5, r7\n\t"
  50968. "stm %[r]!, {r4, r5}\n\t"
  50969. "ldm %[a]!, {r4, r5}\n\t"
  50970. "ldm %[b]!, {r6, r7}\n\t"
  50971. "and r6, r6, %[m]\n\t"
  50972. "and r7, r7, %[m]\n\t"
  50973. "sbcs r4, r4, r6\n\t"
  50974. "sbcs r5, r5, r7\n\t"
  50975. "stm %[r]!, {r4, r5}\n\t"
  50976. "ldm %[a]!, {r4, r5}\n\t"
  50977. "ldm %[b]!, {r6, r7}\n\t"
  50978. "and r6, r6, %[m]\n\t"
  50979. "and r7, r7, %[m]\n\t"
  50980. "sbcs r4, r4, r6\n\t"
  50981. "sbcs r5, r5, r7\n\t"
  50982. "stm %[r]!, {r4, r5}\n\t"
  50983. "ldm %[a]!, {r4, r5}\n\t"
  50984. "ldm %[b]!, {r6, r7}\n\t"
  50985. "and r6, r6, %[m]\n\t"
  50986. "and r7, r7, %[m]\n\t"
  50987. "sbcs r4, r4, r6\n\t"
  50988. "sbcs r5, r5, r7\n\t"
  50989. "stm %[r]!, {r4, r5}\n\t"
  50990. "ldm %[a]!, {r4, r5}\n\t"
  50991. "ldm %[b]!, {r6, r7}\n\t"
  50992. "and r6, r6, %[m]\n\t"
  50993. "and r7, r7, %[m]\n\t"
  50994. "sbcs r4, r4, r6\n\t"
  50995. "sbcs r5, r5, r7\n\t"
  50996. "stm %[r]!, {r4, r5}\n\t"
  50997. "ldm %[a]!, {r4, r5}\n\t"
  50998. "ldm %[b]!, {r6, r7}\n\t"
  50999. "and r6, r6, %[m]\n\t"
  51000. "and r7, r7, %[m]\n\t"
  51001. "sbcs r4, r4, r6\n\t"
  51002. "sbcs r5, r5, r7\n\t"
  51003. "stm %[r]!, {r4, r5}\n\t"
  51004. "ldm %[a]!, {r4, r5}\n\t"
  51005. "ldm %[b]!, {r6, r7}\n\t"
  51006. "and r6, r6, %[m]\n\t"
  51007. "and r7, r7, %[m]\n\t"
  51008. "sbcs r4, r4, r6\n\t"
  51009. "sbcs r5, r5, r7\n\t"
  51010. "stm %[r]!, {r4, r5}\n\t"
  51011. "ldm %[a]!, {r4, r5}\n\t"
  51012. "ldm %[b]!, {r6, r7}\n\t"
  51013. "and r6, r6, %[m]\n\t"
  51014. "and r7, r7, %[m]\n\t"
  51015. "sbcs r4, r4, r6\n\t"
  51016. "sbcs r5, r5, r7\n\t"
  51017. "stm %[r]!, {r4, r5}\n\t"
  51018. "ldm %[a]!, {r4, r5}\n\t"
  51019. "ldm %[b]!, {r6, r7}\n\t"
  51020. "and r6, r6, %[m]\n\t"
  51021. "and r7, r7, %[m]\n\t"
  51022. "sbcs r4, r4, r6\n\t"
  51023. "sbcs r5, r5, r7\n\t"
  51024. "stm %[r]!, {r4, r5}\n\t"
  51025. "ldm %[a]!, {r4, r5}\n\t"
  51026. "ldm %[b]!, {r6, r7}\n\t"
  51027. "and r6, r6, %[m]\n\t"
  51028. "and r7, r7, %[m]\n\t"
  51029. "sbcs r4, r4, r6\n\t"
  51030. "sbcs r5, r5, r7\n\t"
  51031. "stm %[r]!, {r4, r5}\n\t"
  51032. "ldm %[a]!, {r4, r5}\n\t"
  51033. "ldm %[b]!, {r6, r7}\n\t"
  51034. "and r6, r6, %[m]\n\t"
  51035. "and r7, r7, %[m]\n\t"
  51036. "sbcs r4, r4, r6\n\t"
  51037. "sbcs r5, r5, r7\n\t"
  51038. "stm %[r]!, {r4, r5}\n\t"
  51039. "ldm %[a]!, {r4, r5}\n\t"
  51040. "ldm %[b]!, {r6, r7}\n\t"
  51041. "and r6, r6, %[m]\n\t"
  51042. "and r7, r7, %[m]\n\t"
  51043. "sbcs r4, r4, r6\n\t"
  51044. "sbcs r5, r5, r7\n\t"
  51045. "stm %[r]!, {r4, r5}\n\t"
  51046. "ldm %[a]!, {r4, r5}\n\t"
  51047. "ldm %[b]!, {r6, r7}\n\t"
  51048. "and r6, r6, %[m]\n\t"
  51049. "and r7, r7, %[m]\n\t"
  51050. "sbcs r4, r4, r6\n\t"
  51051. "sbcs r5, r5, r7\n\t"
  51052. "stm %[r]!, {r4, r5}\n\t"
  51053. "ldm %[a]!, {r4, r5}\n\t"
  51054. "ldm %[b]!, {r6, r7}\n\t"
  51055. "and r6, r6, %[m]\n\t"
  51056. "and r7, r7, %[m]\n\t"
  51057. "sbcs r4, r4, r6\n\t"
  51058. "sbcs r5, r5, r7\n\t"
  51059. "stm %[r]!, {r4, r5}\n\t"
  51060. "ldm %[a]!, {r4, r5}\n\t"
  51061. "ldm %[b]!, {r6, r7}\n\t"
  51062. "and r6, r6, %[m]\n\t"
  51063. "and r7, r7, %[m]\n\t"
  51064. "sbcs r4, r4, r6\n\t"
  51065. "sbcs r5, r5, r7\n\t"
  51066. "stm %[r]!, {r4, r5}\n\t"
  51067. "ldm %[a]!, {r4, r5}\n\t"
  51068. "ldm %[b]!, {r6, r7}\n\t"
  51069. "and r6, r6, %[m]\n\t"
  51070. "and r7, r7, %[m]\n\t"
  51071. "sbcs r4, r4, r6\n\t"
  51072. "sbcs r5, r5, r7\n\t"
  51073. "stm %[r]!, {r4, r5}\n\t"
  51074. "ldm %[a]!, {r4, r5}\n\t"
  51075. "ldm %[b]!, {r6, r7}\n\t"
  51076. "and r6, r6, %[m]\n\t"
  51077. "and r7, r7, %[m]\n\t"
  51078. "sbcs r4, r4, r6\n\t"
  51079. "sbcs r5, r5, r7\n\t"
  51080. "stm %[r]!, {r4, r5}\n\t"
  51081. "ldm %[a]!, {r4, r5}\n\t"
  51082. "ldm %[b]!, {r6, r7}\n\t"
  51083. "and r6, r6, %[m]\n\t"
  51084. "and r7, r7, %[m]\n\t"
  51085. "sbcs r4, r4, r6\n\t"
  51086. "sbcs r5, r5, r7\n\t"
  51087. "stm %[r]!, {r4, r5}\n\t"
  51088. "ldm %[a]!, {r4, r5}\n\t"
  51089. "ldm %[b]!, {r6, r7}\n\t"
  51090. "and r6, r6, %[m]\n\t"
  51091. "and r7, r7, %[m]\n\t"
  51092. "sbcs r4, r4, r6\n\t"
  51093. "sbcs r5, r5, r7\n\t"
  51094. "stm %[r]!, {r4, r5}\n\t"
  51095. "ldm %[a]!, {r4, r5}\n\t"
  51096. "ldm %[b]!, {r6, r7}\n\t"
  51097. "and r6, r6, %[m]\n\t"
  51098. "and r7, r7, %[m]\n\t"
  51099. "sbcs r4, r4, r6\n\t"
  51100. "sbcs r5, r5, r7\n\t"
  51101. "stm %[r]!, {r4, r5}\n\t"
  51102. "ldm %[a]!, {r4, r5}\n\t"
  51103. "ldm %[b]!, {r6, r7}\n\t"
  51104. "and r6, r6, %[m]\n\t"
  51105. "and r7, r7, %[m]\n\t"
  51106. "sbcs r4, r4, r6\n\t"
  51107. "sbcs r5, r5, r7\n\t"
  51108. "stm %[r]!, {r4, r5}\n\t"
  51109. "ldm %[a]!, {r4, r5}\n\t"
  51110. "ldm %[b]!, {r6, r7}\n\t"
  51111. "and r6, r6, %[m]\n\t"
  51112. "and r7, r7, %[m]\n\t"
  51113. "sbcs r4, r4, r6\n\t"
  51114. "sbcs r5, r5, r7\n\t"
  51115. "stm %[r]!, {r4, r5}\n\t"
  51116. "sbc %[r], lr, lr\n\t"
  51117. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  51118. :
  51119. : "memory", "r12", "lr", "r4", "r5", "r6", "r7"
  51120. );
  51121. return (uint32_t)(size_t)r;
  51122. }
  51123. #endif /* WOLFSSL_SP_SMALL */
  51124. /* Reduce the number back to 4096 bits using Montgomery reduction.
  51125. *
  51126. * a A single precision number to reduce in place.
  51127. * m The single precision number representing the modulus.
  51128. * mp The digit representing the negative inverse of m mod 2^n.
  51129. */
  51130. static SP_NOINLINE void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  51131. {
  51132. register sp_digit* a asm ("r0") = a_p;
  51133. register const sp_digit* m asm ("r1") = m_p;
  51134. register sp_digit mp asm ("r2") = mp_p;
  51135. __asm__ __volatile__ (
  51136. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  51137. "ldr r11, [%[m]]\n\t"
  51138. #endif
  51139. /* i = 0 */
  51140. "mov r9, #0\n\t"
  51141. "mov r3, #0\n\t"
  51142. "ldr r12, [%[a]]\n\t"
  51143. "ldr lr, [%[a], #4]\n\t"
  51144. "\n"
  51145. "L_sp_4096_mont_reduce_128_word_%=: \n\t"
  51146. /* mu = a[i] * mp */
  51147. "mul r8, %[mp], r12\n\t"
  51148. /* a[i+0] += m[0] * mu */
  51149. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51150. "ldr r11, [%[m]]\n\t"
  51151. #endif
  51152. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51153. "lsr r7, r11, #16\n\t"
  51154. "lsr r6, r8, #16\n\t"
  51155. "mul r5, r6, r7\n\t"
  51156. "lsl r7, r11, #16\n\t"
  51157. "lsr r7, r7, #16\n\t"
  51158. "mul r6, r7, r6\n\t"
  51159. "lsr r7, r6, #16\n\t"
  51160. "lsl r6, r6, #16\n\t"
  51161. "adds r12, r12, r6\n\t"
  51162. "adc r5, r5, r7\n\t"
  51163. "lsl r6, r8, #16\n\t"
  51164. "lsl r7, r11, #16\n\t"
  51165. "lsr r6, r6, #16\n\t"
  51166. "lsr r7, r7, #16\n\t"
  51167. "mul r7, r6, r7\n\t"
  51168. "adds r12, r12, r7\n\t"
  51169. "adc r5, r5, #0\n\t"
  51170. "lsr r7, r11, #16\n\t"
  51171. "mul r6, r7, r6\n\t"
  51172. "lsr r7, r6, #16\n\t"
  51173. "lsl r6, r6, #16\n\t"
  51174. "adds r12, r12, r6\n\t"
  51175. "adc r5, r5, r7\n\t"
  51176. #else
  51177. "umull r6, r7, r8, r11\n\t"
  51178. "adds r12, r12, r6\n\t"
  51179. "adc r5, r7, #0\n\t"
  51180. #endif
  51181. /* a[i+1] += m[1] * mu */
  51182. "ldr r7, [%[m], #4]\n\t"
  51183. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51184. "lsr r10, r7, #16\n\t"
  51185. "lsr r6, r8, #16\n\t"
  51186. "mul r4, r6, r10\n\t"
  51187. "lsl r10, r7, #16\n\t"
  51188. "lsr r10, r10, #16\n\t"
  51189. "mul r6, r10, r6\n\t"
  51190. "lsr r10, r6, #16\n\t"
  51191. "lsl r6, r6, #16\n\t"
  51192. "adds lr, lr, r6\n\t"
  51193. "adc r4, r4, r10\n\t"
  51194. "lsl r6, r8, #16\n\t"
  51195. "lsl r10, r7, #16\n\t"
  51196. "lsr r6, r6, #16\n\t"
  51197. "lsr r10, r10, #16\n\t"
  51198. "mul r10, r6, r10\n\t"
  51199. "adds lr, lr, r10\n\t"
  51200. "adc r4, r4, #0\n\t"
  51201. "lsr r10, r7, #16\n\t"
  51202. "mul r6, r10, r6\n\t"
  51203. "lsr r10, r6, #16\n\t"
  51204. "lsl r6, r6, #16\n\t"
  51205. "adds lr, lr, r6\n\t"
  51206. "adc r4, r4, r10\n\t"
  51207. #else
  51208. "umull r6, r10, r8, r7\n\t"
  51209. "adds lr, lr, r6\n\t"
  51210. "adc r4, r10, #0\n\t"
  51211. #endif
  51212. "mov r12, lr\n\t"
  51213. "adds r12, r12, r5\n\t"
  51214. "adc r4, r4, #0\n\t"
  51215. /* a[i+2] += m[2] * mu */
  51216. "ldr r7, [%[m], #8]\n\t"
  51217. "ldr lr, [%[a], #8]\n\t"
  51218. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51219. "lsr r10, r7, #16\n\t"
  51220. "lsr r6, r8, #16\n\t"
  51221. "mul r5, r6, r10\n\t"
  51222. "lsl r10, r7, #16\n\t"
  51223. "lsr r10, r10, #16\n\t"
  51224. "mul r6, r10, r6\n\t"
  51225. "lsr r10, r6, #16\n\t"
  51226. "lsl r6, r6, #16\n\t"
  51227. "adds lr, lr, r6\n\t"
  51228. "adc r5, r5, r10\n\t"
  51229. "lsl r6, r8, #16\n\t"
  51230. "lsl r10, r7, #16\n\t"
  51231. "lsr r6, r6, #16\n\t"
  51232. "lsr r10, r10, #16\n\t"
  51233. "mul r10, r6, r10\n\t"
  51234. "adds lr, lr, r10\n\t"
  51235. "adc r5, r5, #0\n\t"
  51236. "lsr r10, r7, #16\n\t"
  51237. "mul r6, r10, r6\n\t"
  51238. "lsr r10, r6, #16\n\t"
  51239. "lsl r6, r6, #16\n\t"
  51240. "adds lr, lr, r6\n\t"
  51241. "adc r5, r5, r10\n\t"
  51242. #else
  51243. "umull r6, r10, r8, r7\n\t"
  51244. "adds lr, lr, r6\n\t"
  51245. "adc r5, r10, #0\n\t"
  51246. #endif
  51247. "adds lr, lr, r4\n\t"
  51248. "adc r5, r5, #0\n\t"
  51249. /* a[i+3] += m[3] * mu */
  51250. "ldr r7, [%[m], #12]\n\t"
  51251. "ldr r10, [%[a], #12]\n\t"
  51252. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51253. "lsr r11, r7, #16\n\t"
  51254. "lsr r6, r8, #16\n\t"
  51255. "mul r4, r6, r11\n\t"
  51256. "lsl r11, r7, #16\n\t"
  51257. "lsr r11, r11, #16\n\t"
  51258. "mul r6, r11, r6\n\t"
  51259. "lsr r11, r6, #16\n\t"
  51260. "lsl r6, r6, #16\n\t"
  51261. "adds r10, r10, r6\n\t"
  51262. "adc r4, r4, r11\n\t"
  51263. "lsl r6, r8, #16\n\t"
  51264. "lsl r11, r7, #16\n\t"
  51265. "lsr r6, r6, #16\n\t"
  51266. "lsr r11, r11, #16\n\t"
  51267. "mul r11, r6, r11\n\t"
  51268. "adds r10, r10, r11\n\t"
  51269. "adc r4, r4, #0\n\t"
  51270. "lsr r11, r7, #16\n\t"
  51271. "mul r6, r11, r6\n\t"
  51272. "lsr r11, r6, #16\n\t"
  51273. "lsl r6, r6, #16\n\t"
  51274. "adds r10, r10, r6\n\t"
  51275. "adc r4, r4, r11\n\t"
  51276. #else
  51277. "umull r6, r7, r8, r7\n\t"
  51278. "adds r10, r10, r6\n\t"
  51279. "adc r4, r7, #0\n\t"
  51280. #endif
  51281. "adds r10, r10, r5\n\t"
  51282. "str r10, [%[a], #12]\n\t"
  51283. "adc r4, r4, #0\n\t"
  51284. /* a[i+4] += m[4] * mu */
  51285. "ldr r7, [%[m], #16]\n\t"
  51286. "ldr r10, [%[a], #16]\n\t"
  51287. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51288. "lsr r11, r7, #16\n\t"
  51289. "lsr r6, r8, #16\n\t"
  51290. "mul r5, r6, r11\n\t"
  51291. "lsl r11, r7, #16\n\t"
  51292. "lsr r11, r11, #16\n\t"
  51293. "mul r6, r11, r6\n\t"
  51294. "lsr r11, r6, #16\n\t"
  51295. "lsl r6, r6, #16\n\t"
  51296. "adds r10, r10, r6\n\t"
  51297. "adc r5, r5, r11\n\t"
  51298. "lsl r6, r8, #16\n\t"
  51299. "lsl r11, r7, #16\n\t"
  51300. "lsr r6, r6, #16\n\t"
  51301. "lsr r11, r11, #16\n\t"
  51302. "mul r11, r6, r11\n\t"
  51303. "adds r10, r10, r11\n\t"
  51304. "adc r5, r5, #0\n\t"
  51305. "lsr r11, r7, #16\n\t"
  51306. "mul r6, r11, r6\n\t"
  51307. "lsr r11, r6, #16\n\t"
  51308. "lsl r6, r6, #16\n\t"
  51309. "adds r10, r10, r6\n\t"
  51310. "adc r5, r5, r11\n\t"
  51311. #else
  51312. "umull r6, r7, r8, r7\n\t"
  51313. "adds r10, r10, r6\n\t"
  51314. "adc r5, r7, #0\n\t"
  51315. #endif
  51316. "adds r10, r10, r4\n\t"
  51317. "str r10, [%[a], #16]\n\t"
  51318. "adc r5, r5, #0\n\t"
  51319. /* a[i+5] += m[5] * mu */
  51320. "ldr r7, [%[m], #20]\n\t"
  51321. "ldr r10, [%[a], #20]\n\t"
  51322. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51323. "lsr r11, r7, #16\n\t"
  51324. "lsr r6, r8, #16\n\t"
  51325. "mul r4, r6, r11\n\t"
  51326. "lsl r11, r7, #16\n\t"
  51327. "lsr r11, r11, #16\n\t"
  51328. "mul r6, r11, r6\n\t"
  51329. "lsr r11, r6, #16\n\t"
  51330. "lsl r6, r6, #16\n\t"
  51331. "adds r10, r10, r6\n\t"
  51332. "adc r4, r4, r11\n\t"
  51333. "lsl r6, r8, #16\n\t"
  51334. "lsl r11, r7, #16\n\t"
  51335. "lsr r6, r6, #16\n\t"
  51336. "lsr r11, r11, #16\n\t"
  51337. "mul r11, r6, r11\n\t"
  51338. "adds r10, r10, r11\n\t"
  51339. "adc r4, r4, #0\n\t"
  51340. "lsr r11, r7, #16\n\t"
  51341. "mul r6, r11, r6\n\t"
  51342. "lsr r11, r6, #16\n\t"
  51343. "lsl r6, r6, #16\n\t"
  51344. "adds r10, r10, r6\n\t"
  51345. "adc r4, r4, r11\n\t"
  51346. #else
  51347. "umull r6, r7, r8, r7\n\t"
  51348. "adds r10, r10, r6\n\t"
  51349. "adc r4, r7, #0\n\t"
  51350. #endif
  51351. "adds r10, r10, r5\n\t"
  51352. "str r10, [%[a], #20]\n\t"
  51353. "adc r4, r4, #0\n\t"
  51354. /* a[i+6] += m[6] * mu */
  51355. "ldr r7, [%[m], #24]\n\t"
  51356. "ldr r10, [%[a], #24]\n\t"
  51357. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51358. "lsr r11, r7, #16\n\t"
  51359. "lsr r6, r8, #16\n\t"
  51360. "mul r5, r6, r11\n\t"
  51361. "lsl r11, r7, #16\n\t"
  51362. "lsr r11, r11, #16\n\t"
  51363. "mul r6, r11, r6\n\t"
  51364. "lsr r11, r6, #16\n\t"
  51365. "lsl r6, r6, #16\n\t"
  51366. "adds r10, r10, r6\n\t"
  51367. "adc r5, r5, r11\n\t"
  51368. "lsl r6, r8, #16\n\t"
  51369. "lsl r11, r7, #16\n\t"
  51370. "lsr r6, r6, #16\n\t"
  51371. "lsr r11, r11, #16\n\t"
  51372. "mul r11, r6, r11\n\t"
  51373. "adds r10, r10, r11\n\t"
  51374. "adc r5, r5, #0\n\t"
  51375. "lsr r11, r7, #16\n\t"
  51376. "mul r6, r11, r6\n\t"
  51377. "lsr r11, r6, #16\n\t"
  51378. "lsl r6, r6, #16\n\t"
  51379. "adds r10, r10, r6\n\t"
  51380. "adc r5, r5, r11\n\t"
  51381. #else
  51382. "umull r6, r7, r8, r7\n\t"
  51383. "adds r10, r10, r6\n\t"
  51384. "adc r5, r7, #0\n\t"
  51385. #endif
  51386. "adds r10, r10, r4\n\t"
  51387. "str r10, [%[a], #24]\n\t"
  51388. "adc r5, r5, #0\n\t"
  51389. /* a[i+7] += m[7] * mu */
  51390. "ldr r7, [%[m], #28]\n\t"
  51391. "ldr r10, [%[a], #28]\n\t"
  51392. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51393. "lsr r11, r7, #16\n\t"
  51394. "lsr r6, r8, #16\n\t"
  51395. "mul r4, r6, r11\n\t"
  51396. "lsl r11, r7, #16\n\t"
  51397. "lsr r11, r11, #16\n\t"
  51398. "mul r6, r11, r6\n\t"
  51399. "lsr r11, r6, #16\n\t"
  51400. "lsl r6, r6, #16\n\t"
  51401. "adds r10, r10, r6\n\t"
  51402. "adc r4, r4, r11\n\t"
  51403. "lsl r6, r8, #16\n\t"
  51404. "lsl r11, r7, #16\n\t"
  51405. "lsr r6, r6, #16\n\t"
  51406. "lsr r11, r11, #16\n\t"
  51407. "mul r11, r6, r11\n\t"
  51408. "adds r10, r10, r11\n\t"
  51409. "adc r4, r4, #0\n\t"
  51410. "lsr r11, r7, #16\n\t"
  51411. "mul r6, r11, r6\n\t"
  51412. "lsr r11, r6, #16\n\t"
  51413. "lsl r6, r6, #16\n\t"
  51414. "adds r10, r10, r6\n\t"
  51415. "adc r4, r4, r11\n\t"
  51416. #else
  51417. "umull r6, r7, r8, r7\n\t"
  51418. "adds r10, r10, r6\n\t"
  51419. "adc r4, r7, #0\n\t"
  51420. #endif
  51421. "adds r10, r10, r5\n\t"
  51422. "str r10, [%[a], #28]\n\t"
  51423. "adc r4, r4, #0\n\t"
  51424. /* a[i+8] += m[8] * mu */
  51425. "ldr r7, [%[m], #32]\n\t"
  51426. "ldr r10, [%[a], #32]\n\t"
  51427. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51428. "lsr r11, r7, #16\n\t"
  51429. "lsr r6, r8, #16\n\t"
  51430. "mul r5, r6, r11\n\t"
  51431. "lsl r11, r7, #16\n\t"
  51432. "lsr r11, r11, #16\n\t"
  51433. "mul r6, r11, r6\n\t"
  51434. "lsr r11, r6, #16\n\t"
  51435. "lsl r6, r6, #16\n\t"
  51436. "adds r10, r10, r6\n\t"
  51437. "adc r5, r5, r11\n\t"
  51438. "lsl r6, r8, #16\n\t"
  51439. "lsl r11, r7, #16\n\t"
  51440. "lsr r6, r6, #16\n\t"
  51441. "lsr r11, r11, #16\n\t"
  51442. "mul r11, r6, r11\n\t"
  51443. "adds r10, r10, r11\n\t"
  51444. "adc r5, r5, #0\n\t"
  51445. "lsr r11, r7, #16\n\t"
  51446. "mul r6, r11, r6\n\t"
  51447. "lsr r11, r6, #16\n\t"
  51448. "lsl r6, r6, #16\n\t"
  51449. "adds r10, r10, r6\n\t"
  51450. "adc r5, r5, r11\n\t"
  51451. #else
  51452. "umull r6, r7, r8, r7\n\t"
  51453. "adds r10, r10, r6\n\t"
  51454. "adc r5, r7, #0\n\t"
  51455. #endif
  51456. "adds r10, r10, r4\n\t"
  51457. "str r10, [%[a], #32]\n\t"
  51458. "adc r5, r5, #0\n\t"
  51459. /* a[i+9] += m[9] * mu */
  51460. "ldr r7, [%[m], #36]\n\t"
  51461. "ldr r10, [%[a], #36]\n\t"
  51462. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51463. "lsr r11, r7, #16\n\t"
  51464. "lsr r6, r8, #16\n\t"
  51465. "mul r4, r6, r11\n\t"
  51466. "lsl r11, r7, #16\n\t"
  51467. "lsr r11, r11, #16\n\t"
  51468. "mul r6, r11, r6\n\t"
  51469. "lsr r11, r6, #16\n\t"
  51470. "lsl r6, r6, #16\n\t"
  51471. "adds r10, r10, r6\n\t"
  51472. "adc r4, r4, r11\n\t"
  51473. "lsl r6, r8, #16\n\t"
  51474. "lsl r11, r7, #16\n\t"
  51475. "lsr r6, r6, #16\n\t"
  51476. "lsr r11, r11, #16\n\t"
  51477. "mul r11, r6, r11\n\t"
  51478. "adds r10, r10, r11\n\t"
  51479. "adc r4, r4, #0\n\t"
  51480. "lsr r11, r7, #16\n\t"
  51481. "mul r6, r11, r6\n\t"
  51482. "lsr r11, r6, #16\n\t"
  51483. "lsl r6, r6, #16\n\t"
  51484. "adds r10, r10, r6\n\t"
  51485. "adc r4, r4, r11\n\t"
  51486. #else
  51487. "umull r6, r7, r8, r7\n\t"
  51488. "adds r10, r10, r6\n\t"
  51489. "adc r4, r7, #0\n\t"
  51490. #endif
  51491. "adds r10, r10, r5\n\t"
  51492. "str r10, [%[a], #36]\n\t"
  51493. "adc r4, r4, #0\n\t"
  51494. /* a[i+10] += m[10] * mu */
  51495. "ldr r7, [%[m], #40]\n\t"
  51496. "ldr r10, [%[a], #40]\n\t"
  51497. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51498. "lsr r11, r7, #16\n\t"
  51499. "lsr r6, r8, #16\n\t"
  51500. "mul r5, r6, r11\n\t"
  51501. "lsl r11, r7, #16\n\t"
  51502. "lsr r11, r11, #16\n\t"
  51503. "mul r6, r11, r6\n\t"
  51504. "lsr r11, r6, #16\n\t"
  51505. "lsl r6, r6, #16\n\t"
  51506. "adds r10, r10, r6\n\t"
  51507. "adc r5, r5, r11\n\t"
  51508. "lsl r6, r8, #16\n\t"
  51509. "lsl r11, r7, #16\n\t"
  51510. "lsr r6, r6, #16\n\t"
  51511. "lsr r11, r11, #16\n\t"
  51512. "mul r11, r6, r11\n\t"
  51513. "adds r10, r10, r11\n\t"
  51514. "adc r5, r5, #0\n\t"
  51515. "lsr r11, r7, #16\n\t"
  51516. "mul r6, r11, r6\n\t"
  51517. "lsr r11, r6, #16\n\t"
  51518. "lsl r6, r6, #16\n\t"
  51519. "adds r10, r10, r6\n\t"
  51520. "adc r5, r5, r11\n\t"
  51521. #else
  51522. "umull r6, r7, r8, r7\n\t"
  51523. "adds r10, r10, r6\n\t"
  51524. "adc r5, r7, #0\n\t"
  51525. #endif
  51526. "adds r10, r10, r4\n\t"
  51527. "str r10, [%[a], #40]\n\t"
  51528. "adc r5, r5, #0\n\t"
  51529. /* a[i+11] += m[11] * mu */
  51530. "ldr r7, [%[m], #44]\n\t"
  51531. "ldr r10, [%[a], #44]\n\t"
  51532. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51533. "lsr r11, r7, #16\n\t"
  51534. "lsr r6, r8, #16\n\t"
  51535. "mul r4, r6, r11\n\t"
  51536. "lsl r11, r7, #16\n\t"
  51537. "lsr r11, r11, #16\n\t"
  51538. "mul r6, r11, r6\n\t"
  51539. "lsr r11, r6, #16\n\t"
  51540. "lsl r6, r6, #16\n\t"
  51541. "adds r10, r10, r6\n\t"
  51542. "adc r4, r4, r11\n\t"
  51543. "lsl r6, r8, #16\n\t"
  51544. "lsl r11, r7, #16\n\t"
  51545. "lsr r6, r6, #16\n\t"
  51546. "lsr r11, r11, #16\n\t"
  51547. "mul r11, r6, r11\n\t"
  51548. "adds r10, r10, r11\n\t"
  51549. "adc r4, r4, #0\n\t"
  51550. "lsr r11, r7, #16\n\t"
  51551. "mul r6, r11, r6\n\t"
  51552. "lsr r11, r6, #16\n\t"
  51553. "lsl r6, r6, #16\n\t"
  51554. "adds r10, r10, r6\n\t"
  51555. "adc r4, r4, r11\n\t"
  51556. #else
  51557. "umull r6, r7, r8, r7\n\t"
  51558. "adds r10, r10, r6\n\t"
  51559. "adc r4, r7, #0\n\t"
  51560. #endif
  51561. "adds r10, r10, r5\n\t"
  51562. "str r10, [%[a], #44]\n\t"
  51563. "adc r4, r4, #0\n\t"
  51564. /* a[i+12] += m[12] * mu */
  51565. "ldr r7, [%[m], #48]\n\t"
  51566. "ldr r10, [%[a], #48]\n\t"
  51567. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51568. "lsr r11, r7, #16\n\t"
  51569. "lsr r6, r8, #16\n\t"
  51570. "mul r5, r6, r11\n\t"
  51571. "lsl r11, r7, #16\n\t"
  51572. "lsr r11, r11, #16\n\t"
  51573. "mul r6, r11, r6\n\t"
  51574. "lsr r11, r6, #16\n\t"
  51575. "lsl r6, r6, #16\n\t"
  51576. "adds r10, r10, r6\n\t"
  51577. "adc r5, r5, r11\n\t"
  51578. "lsl r6, r8, #16\n\t"
  51579. "lsl r11, r7, #16\n\t"
  51580. "lsr r6, r6, #16\n\t"
  51581. "lsr r11, r11, #16\n\t"
  51582. "mul r11, r6, r11\n\t"
  51583. "adds r10, r10, r11\n\t"
  51584. "adc r5, r5, #0\n\t"
  51585. "lsr r11, r7, #16\n\t"
  51586. "mul r6, r11, r6\n\t"
  51587. "lsr r11, r6, #16\n\t"
  51588. "lsl r6, r6, #16\n\t"
  51589. "adds r10, r10, r6\n\t"
  51590. "adc r5, r5, r11\n\t"
  51591. #else
  51592. "umull r6, r7, r8, r7\n\t"
  51593. "adds r10, r10, r6\n\t"
  51594. "adc r5, r7, #0\n\t"
  51595. #endif
  51596. "adds r10, r10, r4\n\t"
  51597. "str r10, [%[a], #48]\n\t"
  51598. "adc r5, r5, #0\n\t"
  51599. /* a[i+13] += m[13] * mu */
  51600. "ldr r7, [%[m], #52]\n\t"
  51601. "ldr r10, [%[a], #52]\n\t"
  51602. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51603. "lsr r11, r7, #16\n\t"
  51604. "lsr r6, r8, #16\n\t"
  51605. "mul r4, r6, r11\n\t"
  51606. "lsl r11, r7, #16\n\t"
  51607. "lsr r11, r11, #16\n\t"
  51608. "mul r6, r11, r6\n\t"
  51609. "lsr r11, r6, #16\n\t"
  51610. "lsl r6, r6, #16\n\t"
  51611. "adds r10, r10, r6\n\t"
  51612. "adc r4, r4, r11\n\t"
  51613. "lsl r6, r8, #16\n\t"
  51614. "lsl r11, r7, #16\n\t"
  51615. "lsr r6, r6, #16\n\t"
  51616. "lsr r11, r11, #16\n\t"
  51617. "mul r11, r6, r11\n\t"
  51618. "adds r10, r10, r11\n\t"
  51619. "adc r4, r4, #0\n\t"
  51620. "lsr r11, r7, #16\n\t"
  51621. "mul r6, r11, r6\n\t"
  51622. "lsr r11, r6, #16\n\t"
  51623. "lsl r6, r6, #16\n\t"
  51624. "adds r10, r10, r6\n\t"
  51625. "adc r4, r4, r11\n\t"
  51626. #else
  51627. "umull r6, r7, r8, r7\n\t"
  51628. "adds r10, r10, r6\n\t"
  51629. "adc r4, r7, #0\n\t"
  51630. #endif
  51631. "adds r10, r10, r5\n\t"
  51632. "str r10, [%[a], #52]\n\t"
  51633. "adc r4, r4, #0\n\t"
  51634. /* a[i+14] += m[14] * mu */
  51635. "ldr r7, [%[m], #56]\n\t"
  51636. "ldr r10, [%[a], #56]\n\t"
  51637. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51638. "lsr r11, r7, #16\n\t"
  51639. "lsr r6, r8, #16\n\t"
  51640. "mul r5, r6, r11\n\t"
  51641. "lsl r11, r7, #16\n\t"
  51642. "lsr r11, r11, #16\n\t"
  51643. "mul r6, r11, r6\n\t"
  51644. "lsr r11, r6, #16\n\t"
  51645. "lsl r6, r6, #16\n\t"
  51646. "adds r10, r10, r6\n\t"
  51647. "adc r5, r5, r11\n\t"
  51648. "lsl r6, r8, #16\n\t"
  51649. "lsl r11, r7, #16\n\t"
  51650. "lsr r6, r6, #16\n\t"
  51651. "lsr r11, r11, #16\n\t"
  51652. "mul r11, r6, r11\n\t"
  51653. "adds r10, r10, r11\n\t"
  51654. "adc r5, r5, #0\n\t"
  51655. "lsr r11, r7, #16\n\t"
  51656. "mul r6, r11, r6\n\t"
  51657. "lsr r11, r6, #16\n\t"
  51658. "lsl r6, r6, #16\n\t"
  51659. "adds r10, r10, r6\n\t"
  51660. "adc r5, r5, r11\n\t"
  51661. #else
  51662. "umull r6, r7, r8, r7\n\t"
  51663. "adds r10, r10, r6\n\t"
  51664. "adc r5, r7, #0\n\t"
  51665. #endif
  51666. "adds r10, r10, r4\n\t"
  51667. "str r10, [%[a], #56]\n\t"
  51668. "adc r5, r5, #0\n\t"
  51669. /* a[i+15] += m[15] * mu */
  51670. "ldr r7, [%[m], #60]\n\t"
  51671. "ldr r10, [%[a], #60]\n\t"
  51672. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51673. "lsr r11, r7, #16\n\t"
  51674. "lsr r6, r8, #16\n\t"
  51675. "mul r4, r6, r11\n\t"
  51676. "lsl r11, r7, #16\n\t"
  51677. "lsr r11, r11, #16\n\t"
  51678. "mul r6, r11, r6\n\t"
  51679. "lsr r11, r6, #16\n\t"
  51680. "lsl r6, r6, #16\n\t"
  51681. "adds r10, r10, r6\n\t"
  51682. "adc r4, r4, r11\n\t"
  51683. "lsl r6, r8, #16\n\t"
  51684. "lsl r11, r7, #16\n\t"
  51685. "lsr r6, r6, #16\n\t"
  51686. "lsr r11, r11, #16\n\t"
  51687. "mul r11, r6, r11\n\t"
  51688. "adds r10, r10, r11\n\t"
  51689. "adc r4, r4, #0\n\t"
  51690. "lsr r11, r7, #16\n\t"
  51691. "mul r6, r11, r6\n\t"
  51692. "lsr r11, r6, #16\n\t"
  51693. "lsl r6, r6, #16\n\t"
  51694. "adds r10, r10, r6\n\t"
  51695. "adc r4, r4, r11\n\t"
  51696. #else
  51697. "umull r6, r7, r8, r7\n\t"
  51698. "adds r10, r10, r6\n\t"
  51699. "adc r4, r7, #0\n\t"
  51700. #endif
  51701. "adds r10, r10, r5\n\t"
  51702. "str r10, [%[a], #60]\n\t"
  51703. "adc r4, r4, #0\n\t"
  51704. /* a[i+16] += m[16] * mu */
  51705. "ldr r7, [%[m], #64]\n\t"
  51706. "ldr r10, [%[a], #64]\n\t"
  51707. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51708. "lsr r11, r7, #16\n\t"
  51709. "lsr r6, r8, #16\n\t"
  51710. "mul r5, r6, r11\n\t"
  51711. "lsl r11, r7, #16\n\t"
  51712. "lsr r11, r11, #16\n\t"
  51713. "mul r6, r11, r6\n\t"
  51714. "lsr r11, r6, #16\n\t"
  51715. "lsl r6, r6, #16\n\t"
  51716. "adds r10, r10, r6\n\t"
  51717. "adc r5, r5, r11\n\t"
  51718. "lsl r6, r8, #16\n\t"
  51719. "lsl r11, r7, #16\n\t"
  51720. "lsr r6, r6, #16\n\t"
  51721. "lsr r11, r11, #16\n\t"
  51722. "mul r11, r6, r11\n\t"
  51723. "adds r10, r10, r11\n\t"
  51724. "adc r5, r5, #0\n\t"
  51725. "lsr r11, r7, #16\n\t"
  51726. "mul r6, r11, r6\n\t"
  51727. "lsr r11, r6, #16\n\t"
  51728. "lsl r6, r6, #16\n\t"
  51729. "adds r10, r10, r6\n\t"
  51730. "adc r5, r5, r11\n\t"
  51731. #else
  51732. "umull r6, r7, r8, r7\n\t"
  51733. "adds r10, r10, r6\n\t"
  51734. "adc r5, r7, #0\n\t"
  51735. #endif
  51736. "adds r10, r10, r4\n\t"
  51737. "str r10, [%[a], #64]\n\t"
  51738. "adc r5, r5, #0\n\t"
  51739. /* a[i+17] += m[17] * mu */
  51740. "ldr r7, [%[m], #68]\n\t"
  51741. "ldr r10, [%[a], #68]\n\t"
  51742. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51743. "lsr r11, r7, #16\n\t"
  51744. "lsr r6, r8, #16\n\t"
  51745. "mul r4, r6, r11\n\t"
  51746. "lsl r11, r7, #16\n\t"
  51747. "lsr r11, r11, #16\n\t"
  51748. "mul r6, r11, r6\n\t"
  51749. "lsr r11, r6, #16\n\t"
  51750. "lsl r6, r6, #16\n\t"
  51751. "adds r10, r10, r6\n\t"
  51752. "adc r4, r4, r11\n\t"
  51753. "lsl r6, r8, #16\n\t"
  51754. "lsl r11, r7, #16\n\t"
  51755. "lsr r6, r6, #16\n\t"
  51756. "lsr r11, r11, #16\n\t"
  51757. "mul r11, r6, r11\n\t"
  51758. "adds r10, r10, r11\n\t"
  51759. "adc r4, r4, #0\n\t"
  51760. "lsr r11, r7, #16\n\t"
  51761. "mul r6, r11, r6\n\t"
  51762. "lsr r11, r6, #16\n\t"
  51763. "lsl r6, r6, #16\n\t"
  51764. "adds r10, r10, r6\n\t"
  51765. "adc r4, r4, r11\n\t"
  51766. #else
  51767. "umull r6, r7, r8, r7\n\t"
  51768. "adds r10, r10, r6\n\t"
  51769. "adc r4, r7, #0\n\t"
  51770. #endif
  51771. "adds r10, r10, r5\n\t"
  51772. "str r10, [%[a], #68]\n\t"
  51773. "adc r4, r4, #0\n\t"
  51774. /* a[i+18] += m[18] * mu */
  51775. "ldr r7, [%[m], #72]\n\t"
  51776. "ldr r10, [%[a], #72]\n\t"
  51777. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51778. "lsr r11, r7, #16\n\t"
  51779. "lsr r6, r8, #16\n\t"
  51780. "mul r5, r6, r11\n\t"
  51781. "lsl r11, r7, #16\n\t"
  51782. "lsr r11, r11, #16\n\t"
  51783. "mul r6, r11, r6\n\t"
  51784. "lsr r11, r6, #16\n\t"
  51785. "lsl r6, r6, #16\n\t"
  51786. "adds r10, r10, r6\n\t"
  51787. "adc r5, r5, r11\n\t"
  51788. "lsl r6, r8, #16\n\t"
  51789. "lsl r11, r7, #16\n\t"
  51790. "lsr r6, r6, #16\n\t"
  51791. "lsr r11, r11, #16\n\t"
  51792. "mul r11, r6, r11\n\t"
  51793. "adds r10, r10, r11\n\t"
  51794. "adc r5, r5, #0\n\t"
  51795. "lsr r11, r7, #16\n\t"
  51796. "mul r6, r11, r6\n\t"
  51797. "lsr r11, r6, #16\n\t"
  51798. "lsl r6, r6, #16\n\t"
  51799. "adds r10, r10, r6\n\t"
  51800. "adc r5, r5, r11\n\t"
  51801. #else
  51802. "umull r6, r7, r8, r7\n\t"
  51803. "adds r10, r10, r6\n\t"
  51804. "adc r5, r7, #0\n\t"
  51805. #endif
  51806. "adds r10, r10, r4\n\t"
  51807. "str r10, [%[a], #72]\n\t"
  51808. "adc r5, r5, #0\n\t"
  51809. /* a[i+19] += m[19] * mu */
  51810. "ldr r7, [%[m], #76]\n\t"
  51811. "ldr r10, [%[a], #76]\n\t"
  51812. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51813. "lsr r11, r7, #16\n\t"
  51814. "lsr r6, r8, #16\n\t"
  51815. "mul r4, r6, r11\n\t"
  51816. "lsl r11, r7, #16\n\t"
  51817. "lsr r11, r11, #16\n\t"
  51818. "mul r6, r11, r6\n\t"
  51819. "lsr r11, r6, #16\n\t"
  51820. "lsl r6, r6, #16\n\t"
  51821. "adds r10, r10, r6\n\t"
  51822. "adc r4, r4, r11\n\t"
  51823. "lsl r6, r8, #16\n\t"
  51824. "lsl r11, r7, #16\n\t"
  51825. "lsr r6, r6, #16\n\t"
  51826. "lsr r11, r11, #16\n\t"
  51827. "mul r11, r6, r11\n\t"
  51828. "adds r10, r10, r11\n\t"
  51829. "adc r4, r4, #0\n\t"
  51830. "lsr r11, r7, #16\n\t"
  51831. "mul r6, r11, r6\n\t"
  51832. "lsr r11, r6, #16\n\t"
  51833. "lsl r6, r6, #16\n\t"
  51834. "adds r10, r10, r6\n\t"
  51835. "adc r4, r4, r11\n\t"
  51836. #else
  51837. "umull r6, r7, r8, r7\n\t"
  51838. "adds r10, r10, r6\n\t"
  51839. "adc r4, r7, #0\n\t"
  51840. #endif
  51841. "adds r10, r10, r5\n\t"
  51842. "str r10, [%[a], #76]\n\t"
  51843. "adc r4, r4, #0\n\t"
  51844. /* a[i+20] += m[20] * mu */
  51845. "ldr r7, [%[m], #80]\n\t"
  51846. "ldr r10, [%[a], #80]\n\t"
  51847. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51848. "lsr r11, r7, #16\n\t"
  51849. "lsr r6, r8, #16\n\t"
  51850. "mul r5, r6, r11\n\t"
  51851. "lsl r11, r7, #16\n\t"
  51852. "lsr r11, r11, #16\n\t"
  51853. "mul r6, r11, r6\n\t"
  51854. "lsr r11, r6, #16\n\t"
  51855. "lsl r6, r6, #16\n\t"
  51856. "adds r10, r10, r6\n\t"
  51857. "adc r5, r5, r11\n\t"
  51858. "lsl r6, r8, #16\n\t"
  51859. "lsl r11, r7, #16\n\t"
  51860. "lsr r6, r6, #16\n\t"
  51861. "lsr r11, r11, #16\n\t"
  51862. "mul r11, r6, r11\n\t"
  51863. "adds r10, r10, r11\n\t"
  51864. "adc r5, r5, #0\n\t"
  51865. "lsr r11, r7, #16\n\t"
  51866. "mul r6, r11, r6\n\t"
  51867. "lsr r11, r6, #16\n\t"
  51868. "lsl r6, r6, #16\n\t"
  51869. "adds r10, r10, r6\n\t"
  51870. "adc r5, r5, r11\n\t"
  51871. #else
  51872. "umull r6, r7, r8, r7\n\t"
  51873. "adds r10, r10, r6\n\t"
  51874. "adc r5, r7, #0\n\t"
  51875. #endif
  51876. "adds r10, r10, r4\n\t"
  51877. "str r10, [%[a], #80]\n\t"
  51878. "adc r5, r5, #0\n\t"
  51879. /* a[i+21] += m[21] * mu */
  51880. "ldr r7, [%[m], #84]\n\t"
  51881. "ldr r10, [%[a], #84]\n\t"
  51882. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51883. "lsr r11, r7, #16\n\t"
  51884. "lsr r6, r8, #16\n\t"
  51885. "mul r4, r6, r11\n\t"
  51886. "lsl r11, r7, #16\n\t"
  51887. "lsr r11, r11, #16\n\t"
  51888. "mul r6, r11, r6\n\t"
  51889. "lsr r11, r6, #16\n\t"
  51890. "lsl r6, r6, #16\n\t"
  51891. "adds r10, r10, r6\n\t"
  51892. "adc r4, r4, r11\n\t"
  51893. "lsl r6, r8, #16\n\t"
  51894. "lsl r11, r7, #16\n\t"
  51895. "lsr r6, r6, #16\n\t"
  51896. "lsr r11, r11, #16\n\t"
  51897. "mul r11, r6, r11\n\t"
  51898. "adds r10, r10, r11\n\t"
  51899. "adc r4, r4, #0\n\t"
  51900. "lsr r11, r7, #16\n\t"
  51901. "mul r6, r11, r6\n\t"
  51902. "lsr r11, r6, #16\n\t"
  51903. "lsl r6, r6, #16\n\t"
  51904. "adds r10, r10, r6\n\t"
  51905. "adc r4, r4, r11\n\t"
  51906. #else
  51907. "umull r6, r7, r8, r7\n\t"
  51908. "adds r10, r10, r6\n\t"
  51909. "adc r4, r7, #0\n\t"
  51910. #endif
  51911. "adds r10, r10, r5\n\t"
  51912. "str r10, [%[a], #84]\n\t"
  51913. "adc r4, r4, #0\n\t"
  51914. /* a[i+22] += m[22] * mu */
  51915. "ldr r7, [%[m], #88]\n\t"
  51916. "ldr r10, [%[a], #88]\n\t"
  51917. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51918. "lsr r11, r7, #16\n\t"
  51919. "lsr r6, r8, #16\n\t"
  51920. "mul r5, r6, r11\n\t"
  51921. "lsl r11, r7, #16\n\t"
  51922. "lsr r11, r11, #16\n\t"
  51923. "mul r6, r11, r6\n\t"
  51924. "lsr r11, r6, #16\n\t"
  51925. "lsl r6, r6, #16\n\t"
  51926. "adds r10, r10, r6\n\t"
  51927. "adc r5, r5, r11\n\t"
  51928. "lsl r6, r8, #16\n\t"
  51929. "lsl r11, r7, #16\n\t"
  51930. "lsr r6, r6, #16\n\t"
  51931. "lsr r11, r11, #16\n\t"
  51932. "mul r11, r6, r11\n\t"
  51933. "adds r10, r10, r11\n\t"
  51934. "adc r5, r5, #0\n\t"
  51935. "lsr r11, r7, #16\n\t"
  51936. "mul r6, r11, r6\n\t"
  51937. "lsr r11, r6, #16\n\t"
  51938. "lsl r6, r6, #16\n\t"
  51939. "adds r10, r10, r6\n\t"
  51940. "adc r5, r5, r11\n\t"
  51941. #else
  51942. "umull r6, r7, r8, r7\n\t"
  51943. "adds r10, r10, r6\n\t"
  51944. "adc r5, r7, #0\n\t"
  51945. #endif
  51946. "adds r10, r10, r4\n\t"
  51947. "str r10, [%[a], #88]\n\t"
  51948. "adc r5, r5, #0\n\t"
  51949. /* a[i+23] += m[23] * mu */
  51950. "ldr r7, [%[m], #92]\n\t"
  51951. "ldr r10, [%[a], #92]\n\t"
  51952. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51953. "lsr r11, r7, #16\n\t"
  51954. "lsr r6, r8, #16\n\t"
  51955. "mul r4, r6, r11\n\t"
  51956. "lsl r11, r7, #16\n\t"
  51957. "lsr r11, r11, #16\n\t"
  51958. "mul r6, r11, r6\n\t"
  51959. "lsr r11, r6, #16\n\t"
  51960. "lsl r6, r6, #16\n\t"
  51961. "adds r10, r10, r6\n\t"
  51962. "adc r4, r4, r11\n\t"
  51963. "lsl r6, r8, #16\n\t"
  51964. "lsl r11, r7, #16\n\t"
  51965. "lsr r6, r6, #16\n\t"
  51966. "lsr r11, r11, #16\n\t"
  51967. "mul r11, r6, r11\n\t"
  51968. "adds r10, r10, r11\n\t"
  51969. "adc r4, r4, #0\n\t"
  51970. "lsr r11, r7, #16\n\t"
  51971. "mul r6, r11, r6\n\t"
  51972. "lsr r11, r6, #16\n\t"
  51973. "lsl r6, r6, #16\n\t"
  51974. "adds r10, r10, r6\n\t"
  51975. "adc r4, r4, r11\n\t"
  51976. #else
  51977. "umull r6, r7, r8, r7\n\t"
  51978. "adds r10, r10, r6\n\t"
  51979. "adc r4, r7, #0\n\t"
  51980. #endif
  51981. "adds r10, r10, r5\n\t"
  51982. "str r10, [%[a], #92]\n\t"
  51983. "adc r4, r4, #0\n\t"
  51984. /* a[i+24] += m[24] * mu */
  51985. "ldr r7, [%[m], #96]\n\t"
  51986. "ldr r10, [%[a], #96]\n\t"
  51987. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  51988. "lsr r11, r7, #16\n\t"
  51989. "lsr r6, r8, #16\n\t"
  51990. "mul r5, r6, r11\n\t"
  51991. "lsl r11, r7, #16\n\t"
  51992. "lsr r11, r11, #16\n\t"
  51993. "mul r6, r11, r6\n\t"
  51994. "lsr r11, r6, #16\n\t"
  51995. "lsl r6, r6, #16\n\t"
  51996. "adds r10, r10, r6\n\t"
  51997. "adc r5, r5, r11\n\t"
  51998. "lsl r6, r8, #16\n\t"
  51999. "lsl r11, r7, #16\n\t"
  52000. "lsr r6, r6, #16\n\t"
  52001. "lsr r11, r11, #16\n\t"
  52002. "mul r11, r6, r11\n\t"
  52003. "adds r10, r10, r11\n\t"
  52004. "adc r5, r5, #0\n\t"
  52005. "lsr r11, r7, #16\n\t"
  52006. "mul r6, r11, r6\n\t"
  52007. "lsr r11, r6, #16\n\t"
  52008. "lsl r6, r6, #16\n\t"
  52009. "adds r10, r10, r6\n\t"
  52010. "adc r5, r5, r11\n\t"
  52011. #else
  52012. "umull r6, r7, r8, r7\n\t"
  52013. "adds r10, r10, r6\n\t"
  52014. "adc r5, r7, #0\n\t"
  52015. #endif
  52016. "adds r10, r10, r4\n\t"
  52017. "str r10, [%[a], #96]\n\t"
  52018. "adc r5, r5, #0\n\t"
  52019. /* a[i+25] += m[25] * mu */
  52020. "ldr r7, [%[m], #100]\n\t"
  52021. "ldr r10, [%[a], #100]\n\t"
  52022. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52023. "lsr r11, r7, #16\n\t"
  52024. "lsr r6, r8, #16\n\t"
  52025. "mul r4, r6, r11\n\t"
  52026. "lsl r11, r7, #16\n\t"
  52027. "lsr r11, r11, #16\n\t"
  52028. "mul r6, r11, r6\n\t"
  52029. "lsr r11, r6, #16\n\t"
  52030. "lsl r6, r6, #16\n\t"
  52031. "adds r10, r10, r6\n\t"
  52032. "adc r4, r4, r11\n\t"
  52033. "lsl r6, r8, #16\n\t"
  52034. "lsl r11, r7, #16\n\t"
  52035. "lsr r6, r6, #16\n\t"
  52036. "lsr r11, r11, #16\n\t"
  52037. "mul r11, r6, r11\n\t"
  52038. "adds r10, r10, r11\n\t"
  52039. "adc r4, r4, #0\n\t"
  52040. "lsr r11, r7, #16\n\t"
  52041. "mul r6, r11, r6\n\t"
  52042. "lsr r11, r6, #16\n\t"
  52043. "lsl r6, r6, #16\n\t"
  52044. "adds r10, r10, r6\n\t"
  52045. "adc r4, r4, r11\n\t"
  52046. #else
  52047. "umull r6, r7, r8, r7\n\t"
  52048. "adds r10, r10, r6\n\t"
  52049. "adc r4, r7, #0\n\t"
  52050. #endif
  52051. "adds r10, r10, r5\n\t"
  52052. "str r10, [%[a], #100]\n\t"
  52053. "adc r4, r4, #0\n\t"
  52054. /* a[i+26] += m[26] * mu */
  52055. "ldr r7, [%[m], #104]\n\t"
  52056. "ldr r10, [%[a], #104]\n\t"
  52057. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52058. "lsr r11, r7, #16\n\t"
  52059. "lsr r6, r8, #16\n\t"
  52060. "mul r5, r6, r11\n\t"
  52061. "lsl r11, r7, #16\n\t"
  52062. "lsr r11, r11, #16\n\t"
  52063. "mul r6, r11, r6\n\t"
  52064. "lsr r11, r6, #16\n\t"
  52065. "lsl r6, r6, #16\n\t"
  52066. "adds r10, r10, r6\n\t"
  52067. "adc r5, r5, r11\n\t"
  52068. "lsl r6, r8, #16\n\t"
  52069. "lsl r11, r7, #16\n\t"
  52070. "lsr r6, r6, #16\n\t"
  52071. "lsr r11, r11, #16\n\t"
  52072. "mul r11, r6, r11\n\t"
  52073. "adds r10, r10, r11\n\t"
  52074. "adc r5, r5, #0\n\t"
  52075. "lsr r11, r7, #16\n\t"
  52076. "mul r6, r11, r6\n\t"
  52077. "lsr r11, r6, #16\n\t"
  52078. "lsl r6, r6, #16\n\t"
  52079. "adds r10, r10, r6\n\t"
  52080. "adc r5, r5, r11\n\t"
  52081. #else
  52082. "umull r6, r7, r8, r7\n\t"
  52083. "adds r10, r10, r6\n\t"
  52084. "adc r5, r7, #0\n\t"
  52085. #endif
  52086. "adds r10, r10, r4\n\t"
  52087. "str r10, [%[a], #104]\n\t"
  52088. "adc r5, r5, #0\n\t"
  52089. /* a[i+27] += m[27] * mu */
  52090. "ldr r7, [%[m], #108]\n\t"
  52091. "ldr r10, [%[a], #108]\n\t"
  52092. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52093. "lsr r11, r7, #16\n\t"
  52094. "lsr r6, r8, #16\n\t"
  52095. "mul r4, r6, r11\n\t"
  52096. "lsl r11, r7, #16\n\t"
  52097. "lsr r11, r11, #16\n\t"
  52098. "mul r6, r11, r6\n\t"
  52099. "lsr r11, r6, #16\n\t"
  52100. "lsl r6, r6, #16\n\t"
  52101. "adds r10, r10, r6\n\t"
  52102. "adc r4, r4, r11\n\t"
  52103. "lsl r6, r8, #16\n\t"
  52104. "lsl r11, r7, #16\n\t"
  52105. "lsr r6, r6, #16\n\t"
  52106. "lsr r11, r11, #16\n\t"
  52107. "mul r11, r6, r11\n\t"
  52108. "adds r10, r10, r11\n\t"
  52109. "adc r4, r4, #0\n\t"
  52110. "lsr r11, r7, #16\n\t"
  52111. "mul r6, r11, r6\n\t"
  52112. "lsr r11, r6, #16\n\t"
  52113. "lsl r6, r6, #16\n\t"
  52114. "adds r10, r10, r6\n\t"
  52115. "adc r4, r4, r11\n\t"
  52116. #else
  52117. "umull r6, r7, r8, r7\n\t"
  52118. "adds r10, r10, r6\n\t"
  52119. "adc r4, r7, #0\n\t"
  52120. #endif
  52121. "adds r10, r10, r5\n\t"
  52122. "str r10, [%[a], #108]\n\t"
  52123. "adc r4, r4, #0\n\t"
  52124. /* a[i+28] += m[28] * mu */
  52125. "ldr r7, [%[m], #112]\n\t"
  52126. "ldr r10, [%[a], #112]\n\t"
  52127. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52128. "lsr r11, r7, #16\n\t"
  52129. "lsr r6, r8, #16\n\t"
  52130. "mul r5, r6, r11\n\t"
  52131. "lsl r11, r7, #16\n\t"
  52132. "lsr r11, r11, #16\n\t"
  52133. "mul r6, r11, r6\n\t"
  52134. "lsr r11, r6, #16\n\t"
  52135. "lsl r6, r6, #16\n\t"
  52136. "adds r10, r10, r6\n\t"
  52137. "adc r5, r5, r11\n\t"
  52138. "lsl r6, r8, #16\n\t"
  52139. "lsl r11, r7, #16\n\t"
  52140. "lsr r6, r6, #16\n\t"
  52141. "lsr r11, r11, #16\n\t"
  52142. "mul r11, r6, r11\n\t"
  52143. "adds r10, r10, r11\n\t"
  52144. "adc r5, r5, #0\n\t"
  52145. "lsr r11, r7, #16\n\t"
  52146. "mul r6, r11, r6\n\t"
  52147. "lsr r11, r6, #16\n\t"
  52148. "lsl r6, r6, #16\n\t"
  52149. "adds r10, r10, r6\n\t"
  52150. "adc r5, r5, r11\n\t"
  52151. #else
  52152. "umull r6, r7, r8, r7\n\t"
  52153. "adds r10, r10, r6\n\t"
  52154. "adc r5, r7, #0\n\t"
  52155. #endif
  52156. "adds r10, r10, r4\n\t"
  52157. "str r10, [%[a], #112]\n\t"
  52158. "adc r5, r5, #0\n\t"
  52159. /* a[i+29] += m[29] * mu */
  52160. "ldr r7, [%[m], #116]\n\t"
  52161. "ldr r10, [%[a], #116]\n\t"
  52162. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52163. "lsr r11, r7, #16\n\t"
  52164. "lsr r6, r8, #16\n\t"
  52165. "mul r4, r6, r11\n\t"
  52166. "lsl r11, r7, #16\n\t"
  52167. "lsr r11, r11, #16\n\t"
  52168. "mul r6, r11, r6\n\t"
  52169. "lsr r11, r6, #16\n\t"
  52170. "lsl r6, r6, #16\n\t"
  52171. "adds r10, r10, r6\n\t"
  52172. "adc r4, r4, r11\n\t"
  52173. "lsl r6, r8, #16\n\t"
  52174. "lsl r11, r7, #16\n\t"
  52175. "lsr r6, r6, #16\n\t"
  52176. "lsr r11, r11, #16\n\t"
  52177. "mul r11, r6, r11\n\t"
  52178. "adds r10, r10, r11\n\t"
  52179. "adc r4, r4, #0\n\t"
  52180. "lsr r11, r7, #16\n\t"
  52181. "mul r6, r11, r6\n\t"
  52182. "lsr r11, r6, #16\n\t"
  52183. "lsl r6, r6, #16\n\t"
  52184. "adds r10, r10, r6\n\t"
  52185. "adc r4, r4, r11\n\t"
  52186. #else
  52187. "umull r6, r7, r8, r7\n\t"
  52188. "adds r10, r10, r6\n\t"
  52189. "adc r4, r7, #0\n\t"
  52190. #endif
  52191. "adds r10, r10, r5\n\t"
  52192. "str r10, [%[a], #116]\n\t"
  52193. "adc r4, r4, #0\n\t"
  52194. /* a[i+30] += m[30] * mu */
  52195. "ldr r7, [%[m], #120]\n\t"
  52196. "ldr r10, [%[a], #120]\n\t"
  52197. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52198. "lsr r11, r7, #16\n\t"
  52199. "lsr r6, r8, #16\n\t"
  52200. "mul r5, r6, r11\n\t"
  52201. "lsl r11, r7, #16\n\t"
  52202. "lsr r11, r11, #16\n\t"
  52203. "mul r6, r11, r6\n\t"
  52204. "lsr r11, r6, #16\n\t"
  52205. "lsl r6, r6, #16\n\t"
  52206. "adds r10, r10, r6\n\t"
  52207. "adc r5, r5, r11\n\t"
  52208. "lsl r6, r8, #16\n\t"
  52209. "lsl r11, r7, #16\n\t"
  52210. "lsr r6, r6, #16\n\t"
  52211. "lsr r11, r11, #16\n\t"
  52212. "mul r11, r6, r11\n\t"
  52213. "adds r10, r10, r11\n\t"
  52214. "adc r5, r5, #0\n\t"
  52215. "lsr r11, r7, #16\n\t"
  52216. "mul r6, r11, r6\n\t"
  52217. "lsr r11, r6, #16\n\t"
  52218. "lsl r6, r6, #16\n\t"
  52219. "adds r10, r10, r6\n\t"
  52220. "adc r5, r5, r11\n\t"
  52221. #else
  52222. "umull r6, r7, r8, r7\n\t"
  52223. "adds r10, r10, r6\n\t"
  52224. "adc r5, r7, #0\n\t"
  52225. #endif
  52226. "adds r10, r10, r4\n\t"
  52227. "str r10, [%[a], #120]\n\t"
  52228. "adc r5, r5, #0\n\t"
  52229. /* a[i+31] += m[31] * mu */
  52230. "ldr r7, [%[m], #124]\n\t"
  52231. "ldr r10, [%[a], #124]\n\t"
  52232. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52233. "lsr r11, r7, #16\n\t"
  52234. "lsr r6, r8, #16\n\t"
  52235. "mul r4, r6, r11\n\t"
  52236. "lsl r11, r7, #16\n\t"
  52237. "lsr r11, r11, #16\n\t"
  52238. "mul r6, r11, r6\n\t"
  52239. "lsr r11, r6, #16\n\t"
  52240. "lsl r6, r6, #16\n\t"
  52241. "adds r10, r10, r6\n\t"
  52242. "adc r4, r4, r11\n\t"
  52243. "lsl r6, r8, #16\n\t"
  52244. "lsl r11, r7, #16\n\t"
  52245. "lsr r6, r6, #16\n\t"
  52246. "lsr r11, r11, #16\n\t"
  52247. "mul r11, r6, r11\n\t"
  52248. "adds r10, r10, r11\n\t"
  52249. "adc r4, r4, #0\n\t"
  52250. "lsr r11, r7, #16\n\t"
  52251. "mul r6, r11, r6\n\t"
  52252. "lsr r11, r6, #16\n\t"
  52253. "lsl r6, r6, #16\n\t"
  52254. "adds r10, r10, r6\n\t"
  52255. "adc r4, r4, r11\n\t"
  52256. #else
  52257. "umull r6, r7, r8, r7\n\t"
  52258. "adds r10, r10, r6\n\t"
  52259. "adc r4, r7, #0\n\t"
  52260. #endif
  52261. "adds r10, r10, r5\n\t"
  52262. "str r10, [%[a], #124]\n\t"
  52263. "adc r4, r4, #0\n\t"
  52264. /* a[i+32] += m[32] * mu */
  52265. "ldr r7, [%[m], #128]\n\t"
  52266. "ldr r10, [%[a], #128]\n\t"
  52267. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52268. "lsr r11, r7, #16\n\t"
  52269. "lsr r6, r8, #16\n\t"
  52270. "mul r5, r6, r11\n\t"
  52271. "lsl r11, r7, #16\n\t"
  52272. "lsr r11, r11, #16\n\t"
  52273. "mul r6, r11, r6\n\t"
  52274. "lsr r11, r6, #16\n\t"
  52275. "lsl r6, r6, #16\n\t"
  52276. "adds r10, r10, r6\n\t"
  52277. "adc r5, r5, r11\n\t"
  52278. "lsl r6, r8, #16\n\t"
  52279. "lsl r11, r7, #16\n\t"
  52280. "lsr r6, r6, #16\n\t"
  52281. "lsr r11, r11, #16\n\t"
  52282. "mul r11, r6, r11\n\t"
  52283. "adds r10, r10, r11\n\t"
  52284. "adc r5, r5, #0\n\t"
  52285. "lsr r11, r7, #16\n\t"
  52286. "mul r6, r11, r6\n\t"
  52287. "lsr r11, r6, #16\n\t"
  52288. "lsl r6, r6, #16\n\t"
  52289. "adds r10, r10, r6\n\t"
  52290. "adc r5, r5, r11\n\t"
  52291. #else
  52292. "umull r6, r7, r8, r7\n\t"
  52293. "adds r10, r10, r6\n\t"
  52294. "adc r5, r7, #0\n\t"
  52295. #endif
  52296. "adds r10, r10, r4\n\t"
  52297. "str r10, [%[a], #128]\n\t"
  52298. "adc r5, r5, #0\n\t"
  52299. /* a[i+33] += m[33] * mu */
  52300. "ldr r7, [%[m], #132]\n\t"
  52301. "ldr r10, [%[a], #132]\n\t"
  52302. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52303. "lsr r11, r7, #16\n\t"
  52304. "lsr r6, r8, #16\n\t"
  52305. "mul r4, r6, r11\n\t"
  52306. "lsl r11, r7, #16\n\t"
  52307. "lsr r11, r11, #16\n\t"
  52308. "mul r6, r11, r6\n\t"
  52309. "lsr r11, r6, #16\n\t"
  52310. "lsl r6, r6, #16\n\t"
  52311. "adds r10, r10, r6\n\t"
  52312. "adc r4, r4, r11\n\t"
  52313. "lsl r6, r8, #16\n\t"
  52314. "lsl r11, r7, #16\n\t"
  52315. "lsr r6, r6, #16\n\t"
  52316. "lsr r11, r11, #16\n\t"
  52317. "mul r11, r6, r11\n\t"
  52318. "adds r10, r10, r11\n\t"
  52319. "adc r4, r4, #0\n\t"
  52320. "lsr r11, r7, #16\n\t"
  52321. "mul r6, r11, r6\n\t"
  52322. "lsr r11, r6, #16\n\t"
  52323. "lsl r6, r6, #16\n\t"
  52324. "adds r10, r10, r6\n\t"
  52325. "adc r4, r4, r11\n\t"
  52326. #else
  52327. "umull r6, r7, r8, r7\n\t"
  52328. "adds r10, r10, r6\n\t"
  52329. "adc r4, r7, #0\n\t"
  52330. #endif
  52331. "adds r10, r10, r5\n\t"
  52332. "str r10, [%[a], #132]\n\t"
  52333. "adc r4, r4, #0\n\t"
  52334. /* a[i+34] += m[34] * mu */
  52335. "ldr r7, [%[m], #136]\n\t"
  52336. "ldr r10, [%[a], #136]\n\t"
  52337. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52338. "lsr r11, r7, #16\n\t"
  52339. "lsr r6, r8, #16\n\t"
  52340. "mul r5, r6, r11\n\t"
  52341. "lsl r11, r7, #16\n\t"
  52342. "lsr r11, r11, #16\n\t"
  52343. "mul r6, r11, r6\n\t"
  52344. "lsr r11, r6, #16\n\t"
  52345. "lsl r6, r6, #16\n\t"
  52346. "adds r10, r10, r6\n\t"
  52347. "adc r5, r5, r11\n\t"
  52348. "lsl r6, r8, #16\n\t"
  52349. "lsl r11, r7, #16\n\t"
  52350. "lsr r6, r6, #16\n\t"
  52351. "lsr r11, r11, #16\n\t"
  52352. "mul r11, r6, r11\n\t"
  52353. "adds r10, r10, r11\n\t"
  52354. "adc r5, r5, #0\n\t"
  52355. "lsr r11, r7, #16\n\t"
  52356. "mul r6, r11, r6\n\t"
  52357. "lsr r11, r6, #16\n\t"
  52358. "lsl r6, r6, #16\n\t"
  52359. "adds r10, r10, r6\n\t"
  52360. "adc r5, r5, r11\n\t"
  52361. #else
  52362. "umull r6, r7, r8, r7\n\t"
  52363. "adds r10, r10, r6\n\t"
  52364. "adc r5, r7, #0\n\t"
  52365. #endif
  52366. "adds r10, r10, r4\n\t"
  52367. "str r10, [%[a], #136]\n\t"
  52368. "adc r5, r5, #0\n\t"
  52369. /* a[i+35] += m[35] * mu */
  52370. "ldr r7, [%[m], #140]\n\t"
  52371. "ldr r10, [%[a], #140]\n\t"
  52372. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52373. "lsr r11, r7, #16\n\t"
  52374. "lsr r6, r8, #16\n\t"
  52375. "mul r4, r6, r11\n\t"
  52376. "lsl r11, r7, #16\n\t"
  52377. "lsr r11, r11, #16\n\t"
  52378. "mul r6, r11, r6\n\t"
  52379. "lsr r11, r6, #16\n\t"
  52380. "lsl r6, r6, #16\n\t"
  52381. "adds r10, r10, r6\n\t"
  52382. "adc r4, r4, r11\n\t"
  52383. "lsl r6, r8, #16\n\t"
  52384. "lsl r11, r7, #16\n\t"
  52385. "lsr r6, r6, #16\n\t"
  52386. "lsr r11, r11, #16\n\t"
  52387. "mul r11, r6, r11\n\t"
  52388. "adds r10, r10, r11\n\t"
  52389. "adc r4, r4, #0\n\t"
  52390. "lsr r11, r7, #16\n\t"
  52391. "mul r6, r11, r6\n\t"
  52392. "lsr r11, r6, #16\n\t"
  52393. "lsl r6, r6, #16\n\t"
  52394. "adds r10, r10, r6\n\t"
  52395. "adc r4, r4, r11\n\t"
  52396. #else
  52397. "umull r6, r7, r8, r7\n\t"
  52398. "adds r10, r10, r6\n\t"
  52399. "adc r4, r7, #0\n\t"
  52400. #endif
  52401. "adds r10, r10, r5\n\t"
  52402. "str r10, [%[a], #140]\n\t"
  52403. "adc r4, r4, #0\n\t"
  52404. /* a[i+36] += m[36] * mu */
  52405. "ldr r7, [%[m], #144]\n\t"
  52406. "ldr r10, [%[a], #144]\n\t"
  52407. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52408. "lsr r11, r7, #16\n\t"
  52409. "lsr r6, r8, #16\n\t"
  52410. "mul r5, r6, r11\n\t"
  52411. "lsl r11, r7, #16\n\t"
  52412. "lsr r11, r11, #16\n\t"
  52413. "mul r6, r11, r6\n\t"
  52414. "lsr r11, r6, #16\n\t"
  52415. "lsl r6, r6, #16\n\t"
  52416. "adds r10, r10, r6\n\t"
  52417. "adc r5, r5, r11\n\t"
  52418. "lsl r6, r8, #16\n\t"
  52419. "lsl r11, r7, #16\n\t"
  52420. "lsr r6, r6, #16\n\t"
  52421. "lsr r11, r11, #16\n\t"
  52422. "mul r11, r6, r11\n\t"
  52423. "adds r10, r10, r11\n\t"
  52424. "adc r5, r5, #0\n\t"
  52425. "lsr r11, r7, #16\n\t"
  52426. "mul r6, r11, r6\n\t"
  52427. "lsr r11, r6, #16\n\t"
  52428. "lsl r6, r6, #16\n\t"
  52429. "adds r10, r10, r6\n\t"
  52430. "adc r5, r5, r11\n\t"
  52431. #else
  52432. "umull r6, r7, r8, r7\n\t"
  52433. "adds r10, r10, r6\n\t"
  52434. "adc r5, r7, #0\n\t"
  52435. #endif
  52436. "adds r10, r10, r4\n\t"
  52437. "str r10, [%[a], #144]\n\t"
  52438. "adc r5, r5, #0\n\t"
  52439. /* a[i+37] += m[37] * mu */
  52440. "ldr r7, [%[m], #148]\n\t"
  52441. "ldr r10, [%[a], #148]\n\t"
  52442. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52443. "lsr r11, r7, #16\n\t"
  52444. "lsr r6, r8, #16\n\t"
  52445. "mul r4, r6, r11\n\t"
  52446. "lsl r11, r7, #16\n\t"
  52447. "lsr r11, r11, #16\n\t"
  52448. "mul r6, r11, r6\n\t"
  52449. "lsr r11, r6, #16\n\t"
  52450. "lsl r6, r6, #16\n\t"
  52451. "adds r10, r10, r6\n\t"
  52452. "adc r4, r4, r11\n\t"
  52453. "lsl r6, r8, #16\n\t"
  52454. "lsl r11, r7, #16\n\t"
  52455. "lsr r6, r6, #16\n\t"
  52456. "lsr r11, r11, #16\n\t"
  52457. "mul r11, r6, r11\n\t"
  52458. "adds r10, r10, r11\n\t"
  52459. "adc r4, r4, #0\n\t"
  52460. "lsr r11, r7, #16\n\t"
  52461. "mul r6, r11, r6\n\t"
  52462. "lsr r11, r6, #16\n\t"
  52463. "lsl r6, r6, #16\n\t"
  52464. "adds r10, r10, r6\n\t"
  52465. "adc r4, r4, r11\n\t"
  52466. #else
  52467. "umull r6, r7, r8, r7\n\t"
  52468. "adds r10, r10, r6\n\t"
  52469. "adc r4, r7, #0\n\t"
  52470. #endif
  52471. "adds r10, r10, r5\n\t"
  52472. "str r10, [%[a], #148]\n\t"
  52473. "adc r4, r4, #0\n\t"
  52474. /* a[i+38] += m[38] * mu */
  52475. "ldr r7, [%[m], #152]\n\t"
  52476. "ldr r10, [%[a], #152]\n\t"
  52477. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52478. "lsr r11, r7, #16\n\t"
  52479. "lsr r6, r8, #16\n\t"
  52480. "mul r5, r6, r11\n\t"
  52481. "lsl r11, r7, #16\n\t"
  52482. "lsr r11, r11, #16\n\t"
  52483. "mul r6, r11, r6\n\t"
  52484. "lsr r11, r6, #16\n\t"
  52485. "lsl r6, r6, #16\n\t"
  52486. "adds r10, r10, r6\n\t"
  52487. "adc r5, r5, r11\n\t"
  52488. "lsl r6, r8, #16\n\t"
  52489. "lsl r11, r7, #16\n\t"
  52490. "lsr r6, r6, #16\n\t"
  52491. "lsr r11, r11, #16\n\t"
  52492. "mul r11, r6, r11\n\t"
  52493. "adds r10, r10, r11\n\t"
  52494. "adc r5, r5, #0\n\t"
  52495. "lsr r11, r7, #16\n\t"
  52496. "mul r6, r11, r6\n\t"
  52497. "lsr r11, r6, #16\n\t"
  52498. "lsl r6, r6, #16\n\t"
  52499. "adds r10, r10, r6\n\t"
  52500. "adc r5, r5, r11\n\t"
  52501. #else
  52502. "umull r6, r7, r8, r7\n\t"
  52503. "adds r10, r10, r6\n\t"
  52504. "adc r5, r7, #0\n\t"
  52505. #endif
  52506. "adds r10, r10, r4\n\t"
  52507. "str r10, [%[a], #152]\n\t"
  52508. "adc r5, r5, #0\n\t"
  52509. /* a[i+39] += m[39] * mu */
  52510. "ldr r7, [%[m], #156]\n\t"
  52511. "ldr r10, [%[a], #156]\n\t"
  52512. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52513. "lsr r11, r7, #16\n\t"
  52514. "lsr r6, r8, #16\n\t"
  52515. "mul r4, r6, r11\n\t"
  52516. "lsl r11, r7, #16\n\t"
  52517. "lsr r11, r11, #16\n\t"
  52518. "mul r6, r11, r6\n\t"
  52519. "lsr r11, r6, #16\n\t"
  52520. "lsl r6, r6, #16\n\t"
  52521. "adds r10, r10, r6\n\t"
  52522. "adc r4, r4, r11\n\t"
  52523. "lsl r6, r8, #16\n\t"
  52524. "lsl r11, r7, #16\n\t"
  52525. "lsr r6, r6, #16\n\t"
  52526. "lsr r11, r11, #16\n\t"
  52527. "mul r11, r6, r11\n\t"
  52528. "adds r10, r10, r11\n\t"
  52529. "adc r4, r4, #0\n\t"
  52530. "lsr r11, r7, #16\n\t"
  52531. "mul r6, r11, r6\n\t"
  52532. "lsr r11, r6, #16\n\t"
  52533. "lsl r6, r6, #16\n\t"
  52534. "adds r10, r10, r6\n\t"
  52535. "adc r4, r4, r11\n\t"
  52536. #else
  52537. "umull r6, r7, r8, r7\n\t"
  52538. "adds r10, r10, r6\n\t"
  52539. "adc r4, r7, #0\n\t"
  52540. #endif
  52541. "adds r10, r10, r5\n\t"
  52542. "str r10, [%[a], #156]\n\t"
  52543. "adc r4, r4, #0\n\t"
  52544. /* a[i+40] += m[40] * mu */
  52545. "ldr r7, [%[m], #160]\n\t"
  52546. "ldr r10, [%[a], #160]\n\t"
  52547. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52548. "lsr r11, r7, #16\n\t"
  52549. "lsr r6, r8, #16\n\t"
  52550. "mul r5, r6, r11\n\t"
  52551. "lsl r11, r7, #16\n\t"
  52552. "lsr r11, r11, #16\n\t"
  52553. "mul r6, r11, r6\n\t"
  52554. "lsr r11, r6, #16\n\t"
  52555. "lsl r6, r6, #16\n\t"
  52556. "adds r10, r10, r6\n\t"
  52557. "adc r5, r5, r11\n\t"
  52558. "lsl r6, r8, #16\n\t"
  52559. "lsl r11, r7, #16\n\t"
  52560. "lsr r6, r6, #16\n\t"
  52561. "lsr r11, r11, #16\n\t"
  52562. "mul r11, r6, r11\n\t"
  52563. "adds r10, r10, r11\n\t"
  52564. "adc r5, r5, #0\n\t"
  52565. "lsr r11, r7, #16\n\t"
  52566. "mul r6, r11, r6\n\t"
  52567. "lsr r11, r6, #16\n\t"
  52568. "lsl r6, r6, #16\n\t"
  52569. "adds r10, r10, r6\n\t"
  52570. "adc r5, r5, r11\n\t"
  52571. #else
  52572. "umull r6, r7, r8, r7\n\t"
  52573. "adds r10, r10, r6\n\t"
  52574. "adc r5, r7, #0\n\t"
  52575. #endif
  52576. "adds r10, r10, r4\n\t"
  52577. "str r10, [%[a], #160]\n\t"
  52578. "adc r5, r5, #0\n\t"
  52579. /* a[i+41] += m[41] * mu */
  52580. "ldr r7, [%[m], #164]\n\t"
  52581. "ldr r10, [%[a], #164]\n\t"
  52582. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52583. "lsr r11, r7, #16\n\t"
  52584. "lsr r6, r8, #16\n\t"
  52585. "mul r4, r6, r11\n\t"
  52586. "lsl r11, r7, #16\n\t"
  52587. "lsr r11, r11, #16\n\t"
  52588. "mul r6, r11, r6\n\t"
  52589. "lsr r11, r6, #16\n\t"
  52590. "lsl r6, r6, #16\n\t"
  52591. "adds r10, r10, r6\n\t"
  52592. "adc r4, r4, r11\n\t"
  52593. "lsl r6, r8, #16\n\t"
  52594. "lsl r11, r7, #16\n\t"
  52595. "lsr r6, r6, #16\n\t"
  52596. "lsr r11, r11, #16\n\t"
  52597. "mul r11, r6, r11\n\t"
  52598. "adds r10, r10, r11\n\t"
  52599. "adc r4, r4, #0\n\t"
  52600. "lsr r11, r7, #16\n\t"
  52601. "mul r6, r11, r6\n\t"
  52602. "lsr r11, r6, #16\n\t"
  52603. "lsl r6, r6, #16\n\t"
  52604. "adds r10, r10, r6\n\t"
  52605. "adc r4, r4, r11\n\t"
  52606. #else
  52607. "umull r6, r7, r8, r7\n\t"
  52608. "adds r10, r10, r6\n\t"
  52609. "adc r4, r7, #0\n\t"
  52610. #endif
  52611. "adds r10, r10, r5\n\t"
  52612. "str r10, [%[a], #164]\n\t"
  52613. "adc r4, r4, #0\n\t"
  52614. /* a[i+42] += m[42] * mu */
  52615. "ldr r7, [%[m], #168]\n\t"
  52616. "ldr r10, [%[a], #168]\n\t"
  52617. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52618. "lsr r11, r7, #16\n\t"
  52619. "lsr r6, r8, #16\n\t"
  52620. "mul r5, r6, r11\n\t"
  52621. "lsl r11, r7, #16\n\t"
  52622. "lsr r11, r11, #16\n\t"
  52623. "mul r6, r11, r6\n\t"
  52624. "lsr r11, r6, #16\n\t"
  52625. "lsl r6, r6, #16\n\t"
  52626. "adds r10, r10, r6\n\t"
  52627. "adc r5, r5, r11\n\t"
  52628. "lsl r6, r8, #16\n\t"
  52629. "lsl r11, r7, #16\n\t"
  52630. "lsr r6, r6, #16\n\t"
  52631. "lsr r11, r11, #16\n\t"
  52632. "mul r11, r6, r11\n\t"
  52633. "adds r10, r10, r11\n\t"
  52634. "adc r5, r5, #0\n\t"
  52635. "lsr r11, r7, #16\n\t"
  52636. "mul r6, r11, r6\n\t"
  52637. "lsr r11, r6, #16\n\t"
  52638. "lsl r6, r6, #16\n\t"
  52639. "adds r10, r10, r6\n\t"
  52640. "adc r5, r5, r11\n\t"
  52641. #else
  52642. "umull r6, r7, r8, r7\n\t"
  52643. "adds r10, r10, r6\n\t"
  52644. "adc r5, r7, #0\n\t"
  52645. #endif
  52646. "adds r10, r10, r4\n\t"
  52647. "str r10, [%[a], #168]\n\t"
  52648. "adc r5, r5, #0\n\t"
  52649. /* a[i+43] += m[43] * mu */
  52650. "ldr r7, [%[m], #172]\n\t"
  52651. "ldr r10, [%[a], #172]\n\t"
  52652. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52653. "lsr r11, r7, #16\n\t"
  52654. "lsr r6, r8, #16\n\t"
  52655. "mul r4, r6, r11\n\t"
  52656. "lsl r11, r7, #16\n\t"
  52657. "lsr r11, r11, #16\n\t"
  52658. "mul r6, r11, r6\n\t"
  52659. "lsr r11, r6, #16\n\t"
  52660. "lsl r6, r6, #16\n\t"
  52661. "adds r10, r10, r6\n\t"
  52662. "adc r4, r4, r11\n\t"
  52663. "lsl r6, r8, #16\n\t"
  52664. "lsl r11, r7, #16\n\t"
  52665. "lsr r6, r6, #16\n\t"
  52666. "lsr r11, r11, #16\n\t"
  52667. "mul r11, r6, r11\n\t"
  52668. "adds r10, r10, r11\n\t"
  52669. "adc r4, r4, #0\n\t"
  52670. "lsr r11, r7, #16\n\t"
  52671. "mul r6, r11, r6\n\t"
  52672. "lsr r11, r6, #16\n\t"
  52673. "lsl r6, r6, #16\n\t"
  52674. "adds r10, r10, r6\n\t"
  52675. "adc r4, r4, r11\n\t"
  52676. #else
  52677. "umull r6, r7, r8, r7\n\t"
  52678. "adds r10, r10, r6\n\t"
  52679. "adc r4, r7, #0\n\t"
  52680. #endif
  52681. "adds r10, r10, r5\n\t"
  52682. "str r10, [%[a], #172]\n\t"
  52683. "adc r4, r4, #0\n\t"
  52684. /* a[i+44] += m[44] * mu */
  52685. "ldr r7, [%[m], #176]\n\t"
  52686. "ldr r10, [%[a], #176]\n\t"
  52687. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52688. "lsr r11, r7, #16\n\t"
  52689. "lsr r6, r8, #16\n\t"
  52690. "mul r5, r6, r11\n\t"
  52691. "lsl r11, r7, #16\n\t"
  52692. "lsr r11, r11, #16\n\t"
  52693. "mul r6, r11, r6\n\t"
  52694. "lsr r11, r6, #16\n\t"
  52695. "lsl r6, r6, #16\n\t"
  52696. "adds r10, r10, r6\n\t"
  52697. "adc r5, r5, r11\n\t"
  52698. "lsl r6, r8, #16\n\t"
  52699. "lsl r11, r7, #16\n\t"
  52700. "lsr r6, r6, #16\n\t"
  52701. "lsr r11, r11, #16\n\t"
  52702. "mul r11, r6, r11\n\t"
  52703. "adds r10, r10, r11\n\t"
  52704. "adc r5, r5, #0\n\t"
  52705. "lsr r11, r7, #16\n\t"
  52706. "mul r6, r11, r6\n\t"
  52707. "lsr r11, r6, #16\n\t"
  52708. "lsl r6, r6, #16\n\t"
  52709. "adds r10, r10, r6\n\t"
  52710. "adc r5, r5, r11\n\t"
  52711. #else
  52712. "umull r6, r7, r8, r7\n\t"
  52713. "adds r10, r10, r6\n\t"
  52714. "adc r5, r7, #0\n\t"
  52715. #endif
  52716. "adds r10, r10, r4\n\t"
  52717. "str r10, [%[a], #176]\n\t"
  52718. "adc r5, r5, #0\n\t"
  52719. /* a[i+45] += m[45] * mu */
  52720. "ldr r7, [%[m], #180]\n\t"
  52721. "ldr r10, [%[a], #180]\n\t"
  52722. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52723. "lsr r11, r7, #16\n\t"
  52724. "lsr r6, r8, #16\n\t"
  52725. "mul r4, r6, r11\n\t"
  52726. "lsl r11, r7, #16\n\t"
  52727. "lsr r11, r11, #16\n\t"
  52728. "mul r6, r11, r6\n\t"
  52729. "lsr r11, r6, #16\n\t"
  52730. "lsl r6, r6, #16\n\t"
  52731. "adds r10, r10, r6\n\t"
  52732. "adc r4, r4, r11\n\t"
  52733. "lsl r6, r8, #16\n\t"
  52734. "lsl r11, r7, #16\n\t"
  52735. "lsr r6, r6, #16\n\t"
  52736. "lsr r11, r11, #16\n\t"
  52737. "mul r11, r6, r11\n\t"
  52738. "adds r10, r10, r11\n\t"
  52739. "adc r4, r4, #0\n\t"
  52740. "lsr r11, r7, #16\n\t"
  52741. "mul r6, r11, r6\n\t"
  52742. "lsr r11, r6, #16\n\t"
  52743. "lsl r6, r6, #16\n\t"
  52744. "adds r10, r10, r6\n\t"
  52745. "adc r4, r4, r11\n\t"
  52746. #else
  52747. "umull r6, r7, r8, r7\n\t"
  52748. "adds r10, r10, r6\n\t"
  52749. "adc r4, r7, #0\n\t"
  52750. #endif
  52751. "adds r10, r10, r5\n\t"
  52752. "str r10, [%[a], #180]\n\t"
  52753. "adc r4, r4, #0\n\t"
  52754. /* a[i+46] += m[46] * mu */
  52755. "ldr r7, [%[m], #184]\n\t"
  52756. "ldr r10, [%[a], #184]\n\t"
  52757. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52758. "lsr r11, r7, #16\n\t"
  52759. "lsr r6, r8, #16\n\t"
  52760. "mul r5, r6, r11\n\t"
  52761. "lsl r11, r7, #16\n\t"
  52762. "lsr r11, r11, #16\n\t"
  52763. "mul r6, r11, r6\n\t"
  52764. "lsr r11, r6, #16\n\t"
  52765. "lsl r6, r6, #16\n\t"
  52766. "adds r10, r10, r6\n\t"
  52767. "adc r5, r5, r11\n\t"
  52768. "lsl r6, r8, #16\n\t"
  52769. "lsl r11, r7, #16\n\t"
  52770. "lsr r6, r6, #16\n\t"
  52771. "lsr r11, r11, #16\n\t"
  52772. "mul r11, r6, r11\n\t"
  52773. "adds r10, r10, r11\n\t"
  52774. "adc r5, r5, #0\n\t"
  52775. "lsr r11, r7, #16\n\t"
  52776. "mul r6, r11, r6\n\t"
  52777. "lsr r11, r6, #16\n\t"
  52778. "lsl r6, r6, #16\n\t"
  52779. "adds r10, r10, r6\n\t"
  52780. "adc r5, r5, r11\n\t"
  52781. #else
  52782. "umull r6, r7, r8, r7\n\t"
  52783. "adds r10, r10, r6\n\t"
  52784. "adc r5, r7, #0\n\t"
  52785. #endif
  52786. "adds r10, r10, r4\n\t"
  52787. "str r10, [%[a], #184]\n\t"
  52788. "adc r5, r5, #0\n\t"
  52789. /* a[i+47] += m[47] * mu */
  52790. "ldr r7, [%[m], #188]\n\t"
  52791. "ldr r10, [%[a], #188]\n\t"
  52792. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52793. "lsr r11, r7, #16\n\t"
  52794. "lsr r6, r8, #16\n\t"
  52795. "mul r4, r6, r11\n\t"
  52796. "lsl r11, r7, #16\n\t"
  52797. "lsr r11, r11, #16\n\t"
  52798. "mul r6, r11, r6\n\t"
  52799. "lsr r11, r6, #16\n\t"
  52800. "lsl r6, r6, #16\n\t"
  52801. "adds r10, r10, r6\n\t"
  52802. "adc r4, r4, r11\n\t"
  52803. "lsl r6, r8, #16\n\t"
  52804. "lsl r11, r7, #16\n\t"
  52805. "lsr r6, r6, #16\n\t"
  52806. "lsr r11, r11, #16\n\t"
  52807. "mul r11, r6, r11\n\t"
  52808. "adds r10, r10, r11\n\t"
  52809. "adc r4, r4, #0\n\t"
  52810. "lsr r11, r7, #16\n\t"
  52811. "mul r6, r11, r6\n\t"
  52812. "lsr r11, r6, #16\n\t"
  52813. "lsl r6, r6, #16\n\t"
  52814. "adds r10, r10, r6\n\t"
  52815. "adc r4, r4, r11\n\t"
  52816. #else
  52817. "umull r6, r7, r8, r7\n\t"
  52818. "adds r10, r10, r6\n\t"
  52819. "adc r4, r7, #0\n\t"
  52820. #endif
  52821. "adds r10, r10, r5\n\t"
  52822. "str r10, [%[a], #188]\n\t"
  52823. "adc r4, r4, #0\n\t"
  52824. /* a[i+48] += m[48] * mu */
  52825. "ldr r7, [%[m], #192]\n\t"
  52826. "ldr r10, [%[a], #192]\n\t"
  52827. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52828. "lsr r11, r7, #16\n\t"
  52829. "lsr r6, r8, #16\n\t"
  52830. "mul r5, r6, r11\n\t"
  52831. "lsl r11, r7, #16\n\t"
  52832. "lsr r11, r11, #16\n\t"
  52833. "mul r6, r11, r6\n\t"
  52834. "lsr r11, r6, #16\n\t"
  52835. "lsl r6, r6, #16\n\t"
  52836. "adds r10, r10, r6\n\t"
  52837. "adc r5, r5, r11\n\t"
  52838. "lsl r6, r8, #16\n\t"
  52839. "lsl r11, r7, #16\n\t"
  52840. "lsr r6, r6, #16\n\t"
  52841. "lsr r11, r11, #16\n\t"
  52842. "mul r11, r6, r11\n\t"
  52843. "adds r10, r10, r11\n\t"
  52844. "adc r5, r5, #0\n\t"
  52845. "lsr r11, r7, #16\n\t"
  52846. "mul r6, r11, r6\n\t"
  52847. "lsr r11, r6, #16\n\t"
  52848. "lsl r6, r6, #16\n\t"
  52849. "adds r10, r10, r6\n\t"
  52850. "adc r5, r5, r11\n\t"
  52851. #else
  52852. "umull r6, r7, r8, r7\n\t"
  52853. "adds r10, r10, r6\n\t"
  52854. "adc r5, r7, #0\n\t"
  52855. #endif
  52856. "adds r10, r10, r4\n\t"
  52857. "str r10, [%[a], #192]\n\t"
  52858. "adc r5, r5, #0\n\t"
  52859. /* a[i+49] += m[49] * mu */
  52860. "ldr r7, [%[m], #196]\n\t"
  52861. "ldr r10, [%[a], #196]\n\t"
  52862. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52863. "lsr r11, r7, #16\n\t"
  52864. "lsr r6, r8, #16\n\t"
  52865. "mul r4, r6, r11\n\t"
  52866. "lsl r11, r7, #16\n\t"
  52867. "lsr r11, r11, #16\n\t"
  52868. "mul r6, r11, r6\n\t"
  52869. "lsr r11, r6, #16\n\t"
  52870. "lsl r6, r6, #16\n\t"
  52871. "adds r10, r10, r6\n\t"
  52872. "adc r4, r4, r11\n\t"
  52873. "lsl r6, r8, #16\n\t"
  52874. "lsl r11, r7, #16\n\t"
  52875. "lsr r6, r6, #16\n\t"
  52876. "lsr r11, r11, #16\n\t"
  52877. "mul r11, r6, r11\n\t"
  52878. "adds r10, r10, r11\n\t"
  52879. "adc r4, r4, #0\n\t"
  52880. "lsr r11, r7, #16\n\t"
  52881. "mul r6, r11, r6\n\t"
  52882. "lsr r11, r6, #16\n\t"
  52883. "lsl r6, r6, #16\n\t"
  52884. "adds r10, r10, r6\n\t"
  52885. "adc r4, r4, r11\n\t"
  52886. #else
  52887. "umull r6, r7, r8, r7\n\t"
  52888. "adds r10, r10, r6\n\t"
  52889. "adc r4, r7, #0\n\t"
  52890. #endif
  52891. "adds r10, r10, r5\n\t"
  52892. "str r10, [%[a], #196]\n\t"
  52893. "adc r4, r4, #0\n\t"
  52894. /* a[i+50] += m[50] * mu */
  52895. "ldr r7, [%[m], #200]\n\t"
  52896. "ldr r10, [%[a], #200]\n\t"
  52897. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52898. "lsr r11, r7, #16\n\t"
  52899. "lsr r6, r8, #16\n\t"
  52900. "mul r5, r6, r11\n\t"
  52901. "lsl r11, r7, #16\n\t"
  52902. "lsr r11, r11, #16\n\t"
  52903. "mul r6, r11, r6\n\t"
  52904. "lsr r11, r6, #16\n\t"
  52905. "lsl r6, r6, #16\n\t"
  52906. "adds r10, r10, r6\n\t"
  52907. "adc r5, r5, r11\n\t"
  52908. "lsl r6, r8, #16\n\t"
  52909. "lsl r11, r7, #16\n\t"
  52910. "lsr r6, r6, #16\n\t"
  52911. "lsr r11, r11, #16\n\t"
  52912. "mul r11, r6, r11\n\t"
  52913. "adds r10, r10, r11\n\t"
  52914. "adc r5, r5, #0\n\t"
  52915. "lsr r11, r7, #16\n\t"
  52916. "mul r6, r11, r6\n\t"
  52917. "lsr r11, r6, #16\n\t"
  52918. "lsl r6, r6, #16\n\t"
  52919. "adds r10, r10, r6\n\t"
  52920. "adc r5, r5, r11\n\t"
  52921. #else
  52922. "umull r6, r7, r8, r7\n\t"
  52923. "adds r10, r10, r6\n\t"
  52924. "adc r5, r7, #0\n\t"
  52925. #endif
  52926. "adds r10, r10, r4\n\t"
  52927. "str r10, [%[a], #200]\n\t"
  52928. "adc r5, r5, #0\n\t"
  52929. /* a[i+51] += m[51] * mu */
  52930. "ldr r7, [%[m], #204]\n\t"
  52931. "ldr r10, [%[a], #204]\n\t"
  52932. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52933. "lsr r11, r7, #16\n\t"
  52934. "lsr r6, r8, #16\n\t"
  52935. "mul r4, r6, r11\n\t"
  52936. "lsl r11, r7, #16\n\t"
  52937. "lsr r11, r11, #16\n\t"
  52938. "mul r6, r11, r6\n\t"
  52939. "lsr r11, r6, #16\n\t"
  52940. "lsl r6, r6, #16\n\t"
  52941. "adds r10, r10, r6\n\t"
  52942. "adc r4, r4, r11\n\t"
  52943. "lsl r6, r8, #16\n\t"
  52944. "lsl r11, r7, #16\n\t"
  52945. "lsr r6, r6, #16\n\t"
  52946. "lsr r11, r11, #16\n\t"
  52947. "mul r11, r6, r11\n\t"
  52948. "adds r10, r10, r11\n\t"
  52949. "adc r4, r4, #0\n\t"
  52950. "lsr r11, r7, #16\n\t"
  52951. "mul r6, r11, r6\n\t"
  52952. "lsr r11, r6, #16\n\t"
  52953. "lsl r6, r6, #16\n\t"
  52954. "adds r10, r10, r6\n\t"
  52955. "adc r4, r4, r11\n\t"
  52956. #else
  52957. "umull r6, r7, r8, r7\n\t"
  52958. "adds r10, r10, r6\n\t"
  52959. "adc r4, r7, #0\n\t"
  52960. #endif
  52961. "adds r10, r10, r5\n\t"
  52962. "str r10, [%[a], #204]\n\t"
  52963. "adc r4, r4, #0\n\t"
  52964. /* a[i+52] += m[52] * mu */
  52965. "ldr r7, [%[m], #208]\n\t"
  52966. "ldr r10, [%[a], #208]\n\t"
  52967. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  52968. "lsr r11, r7, #16\n\t"
  52969. "lsr r6, r8, #16\n\t"
  52970. "mul r5, r6, r11\n\t"
  52971. "lsl r11, r7, #16\n\t"
  52972. "lsr r11, r11, #16\n\t"
  52973. "mul r6, r11, r6\n\t"
  52974. "lsr r11, r6, #16\n\t"
  52975. "lsl r6, r6, #16\n\t"
  52976. "adds r10, r10, r6\n\t"
  52977. "adc r5, r5, r11\n\t"
  52978. "lsl r6, r8, #16\n\t"
  52979. "lsl r11, r7, #16\n\t"
  52980. "lsr r6, r6, #16\n\t"
  52981. "lsr r11, r11, #16\n\t"
  52982. "mul r11, r6, r11\n\t"
  52983. "adds r10, r10, r11\n\t"
  52984. "adc r5, r5, #0\n\t"
  52985. "lsr r11, r7, #16\n\t"
  52986. "mul r6, r11, r6\n\t"
  52987. "lsr r11, r6, #16\n\t"
  52988. "lsl r6, r6, #16\n\t"
  52989. "adds r10, r10, r6\n\t"
  52990. "adc r5, r5, r11\n\t"
  52991. #else
  52992. "umull r6, r7, r8, r7\n\t"
  52993. "adds r10, r10, r6\n\t"
  52994. "adc r5, r7, #0\n\t"
  52995. #endif
  52996. "adds r10, r10, r4\n\t"
  52997. "str r10, [%[a], #208]\n\t"
  52998. "adc r5, r5, #0\n\t"
  52999. /* a[i+53] += m[53] * mu */
  53000. "ldr r7, [%[m], #212]\n\t"
  53001. "ldr r10, [%[a], #212]\n\t"
  53002. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53003. "lsr r11, r7, #16\n\t"
  53004. "lsr r6, r8, #16\n\t"
  53005. "mul r4, r6, r11\n\t"
  53006. "lsl r11, r7, #16\n\t"
  53007. "lsr r11, r11, #16\n\t"
  53008. "mul r6, r11, r6\n\t"
  53009. "lsr r11, r6, #16\n\t"
  53010. "lsl r6, r6, #16\n\t"
  53011. "adds r10, r10, r6\n\t"
  53012. "adc r4, r4, r11\n\t"
  53013. "lsl r6, r8, #16\n\t"
  53014. "lsl r11, r7, #16\n\t"
  53015. "lsr r6, r6, #16\n\t"
  53016. "lsr r11, r11, #16\n\t"
  53017. "mul r11, r6, r11\n\t"
  53018. "adds r10, r10, r11\n\t"
  53019. "adc r4, r4, #0\n\t"
  53020. "lsr r11, r7, #16\n\t"
  53021. "mul r6, r11, r6\n\t"
  53022. "lsr r11, r6, #16\n\t"
  53023. "lsl r6, r6, #16\n\t"
  53024. "adds r10, r10, r6\n\t"
  53025. "adc r4, r4, r11\n\t"
  53026. #else
  53027. "umull r6, r7, r8, r7\n\t"
  53028. "adds r10, r10, r6\n\t"
  53029. "adc r4, r7, #0\n\t"
  53030. #endif
  53031. "adds r10, r10, r5\n\t"
  53032. "str r10, [%[a], #212]\n\t"
  53033. "adc r4, r4, #0\n\t"
  53034. /* a[i+54] += m[54] * mu */
  53035. "ldr r7, [%[m], #216]\n\t"
  53036. "ldr r10, [%[a], #216]\n\t"
  53037. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53038. "lsr r11, r7, #16\n\t"
  53039. "lsr r6, r8, #16\n\t"
  53040. "mul r5, r6, r11\n\t"
  53041. "lsl r11, r7, #16\n\t"
  53042. "lsr r11, r11, #16\n\t"
  53043. "mul r6, r11, r6\n\t"
  53044. "lsr r11, r6, #16\n\t"
  53045. "lsl r6, r6, #16\n\t"
  53046. "adds r10, r10, r6\n\t"
  53047. "adc r5, r5, r11\n\t"
  53048. "lsl r6, r8, #16\n\t"
  53049. "lsl r11, r7, #16\n\t"
  53050. "lsr r6, r6, #16\n\t"
  53051. "lsr r11, r11, #16\n\t"
  53052. "mul r11, r6, r11\n\t"
  53053. "adds r10, r10, r11\n\t"
  53054. "adc r5, r5, #0\n\t"
  53055. "lsr r11, r7, #16\n\t"
  53056. "mul r6, r11, r6\n\t"
  53057. "lsr r11, r6, #16\n\t"
  53058. "lsl r6, r6, #16\n\t"
  53059. "adds r10, r10, r6\n\t"
  53060. "adc r5, r5, r11\n\t"
  53061. #else
  53062. "umull r6, r7, r8, r7\n\t"
  53063. "adds r10, r10, r6\n\t"
  53064. "adc r5, r7, #0\n\t"
  53065. #endif
  53066. "adds r10, r10, r4\n\t"
  53067. "str r10, [%[a], #216]\n\t"
  53068. "adc r5, r5, #0\n\t"
  53069. /* a[i+55] += m[55] * mu */
  53070. "ldr r7, [%[m], #220]\n\t"
  53071. "ldr r10, [%[a], #220]\n\t"
  53072. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53073. "lsr r11, r7, #16\n\t"
  53074. "lsr r6, r8, #16\n\t"
  53075. "mul r4, r6, r11\n\t"
  53076. "lsl r11, r7, #16\n\t"
  53077. "lsr r11, r11, #16\n\t"
  53078. "mul r6, r11, r6\n\t"
  53079. "lsr r11, r6, #16\n\t"
  53080. "lsl r6, r6, #16\n\t"
  53081. "adds r10, r10, r6\n\t"
  53082. "adc r4, r4, r11\n\t"
  53083. "lsl r6, r8, #16\n\t"
  53084. "lsl r11, r7, #16\n\t"
  53085. "lsr r6, r6, #16\n\t"
  53086. "lsr r11, r11, #16\n\t"
  53087. "mul r11, r6, r11\n\t"
  53088. "adds r10, r10, r11\n\t"
  53089. "adc r4, r4, #0\n\t"
  53090. "lsr r11, r7, #16\n\t"
  53091. "mul r6, r11, r6\n\t"
  53092. "lsr r11, r6, #16\n\t"
  53093. "lsl r6, r6, #16\n\t"
  53094. "adds r10, r10, r6\n\t"
  53095. "adc r4, r4, r11\n\t"
  53096. #else
  53097. "umull r6, r7, r8, r7\n\t"
  53098. "adds r10, r10, r6\n\t"
  53099. "adc r4, r7, #0\n\t"
  53100. #endif
  53101. "adds r10, r10, r5\n\t"
  53102. "str r10, [%[a], #220]\n\t"
  53103. "adc r4, r4, #0\n\t"
  53104. /* a[i+56] += m[56] * mu */
  53105. "ldr r7, [%[m], #224]\n\t"
  53106. "ldr r10, [%[a], #224]\n\t"
  53107. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53108. "lsr r11, r7, #16\n\t"
  53109. "lsr r6, r8, #16\n\t"
  53110. "mul r5, r6, r11\n\t"
  53111. "lsl r11, r7, #16\n\t"
  53112. "lsr r11, r11, #16\n\t"
  53113. "mul r6, r11, r6\n\t"
  53114. "lsr r11, r6, #16\n\t"
  53115. "lsl r6, r6, #16\n\t"
  53116. "adds r10, r10, r6\n\t"
  53117. "adc r5, r5, r11\n\t"
  53118. "lsl r6, r8, #16\n\t"
  53119. "lsl r11, r7, #16\n\t"
  53120. "lsr r6, r6, #16\n\t"
  53121. "lsr r11, r11, #16\n\t"
  53122. "mul r11, r6, r11\n\t"
  53123. "adds r10, r10, r11\n\t"
  53124. "adc r5, r5, #0\n\t"
  53125. "lsr r11, r7, #16\n\t"
  53126. "mul r6, r11, r6\n\t"
  53127. "lsr r11, r6, #16\n\t"
  53128. "lsl r6, r6, #16\n\t"
  53129. "adds r10, r10, r6\n\t"
  53130. "adc r5, r5, r11\n\t"
  53131. #else
  53132. "umull r6, r7, r8, r7\n\t"
  53133. "adds r10, r10, r6\n\t"
  53134. "adc r5, r7, #0\n\t"
  53135. #endif
  53136. "adds r10, r10, r4\n\t"
  53137. "str r10, [%[a], #224]\n\t"
  53138. "adc r5, r5, #0\n\t"
  53139. /* a[i+57] += m[57] * mu */
  53140. "ldr r7, [%[m], #228]\n\t"
  53141. "ldr r10, [%[a], #228]\n\t"
  53142. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53143. "lsr r11, r7, #16\n\t"
  53144. "lsr r6, r8, #16\n\t"
  53145. "mul r4, r6, r11\n\t"
  53146. "lsl r11, r7, #16\n\t"
  53147. "lsr r11, r11, #16\n\t"
  53148. "mul r6, r11, r6\n\t"
  53149. "lsr r11, r6, #16\n\t"
  53150. "lsl r6, r6, #16\n\t"
  53151. "adds r10, r10, r6\n\t"
  53152. "adc r4, r4, r11\n\t"
  53153. "lsl r6, r8, #16\n\t"
  53154. "lsl r11, r7, #16\n\t"
  53155. "lsr r6, r6, #16\n\t"
  53156. "lsr r11, r11, #16\n\t"
  53157. "mul r11, r6, r11\n\t"
  53158. "adds r10, r10, r11\n\t"
  53159. "adc r4, r4, #0\n\t"
  53160. "lsr r11, r7, #16\n\t"
  53161. "mul r6, r11, r6\n\t"
  53162. "lsr r11, r6, #16\n\t"
  53163. "lsl r6, r6, #16\n\t"
  53164. "adds r10, r10, r6\n\t"
  53165. "adc r4, r4, r11\n\t"
  53166. #else
  53167. "umull r6, r7, r8, r7\n\t"
  53168. "adds r10, r10, r6\n\t"
  53169. "adc r4, r7, #0\n\t"
  53170. #endif
  53171. "adds r10, r10, r5\n\t"
  53172. "str r10, [%[a], #228]\n\t"
  53173. "adc r4, r4, #0\n\t"
  53174. /* a[i+58] += m[58] * mu */
  53175. "ldr r7, [%[m], #232]\n\t"
  53176. "ldr r10, [%[a], #232]\n\t"
  53177. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53178. "lsr r11, r7, #16\n\t"
  53179. "lsr r6, r8, #16\n\t"
  53180. "mul r5, r6, r11\n\t"
  53181. "lsl r11, r7, #16\n\t"
  53182. "lsr r11, r11, #16\n\t"
  53183. "mul r6, r11, r6\n\t"
  53184. "lsr r11, r6, #16\n\t"
  53185. "lsl r6, r6, #16\n\t"
  53186. "adds r10, r10, r6\n\t"
  53187. "adc r5, r5, r11\n\t"
  53188. "lsl r6, r8, #16\n\t"
  53189. "lsl r11, r7, #16\n\t"
  53190. "lsr r6, r6, #16\n\t"
  53191. "lsr r11, r11, #16\n\t"
  53192. "mul r11, r6, r11\n\t"
  53193. "adds r10, r10, r11\n\t"
  53194. "adc r5, r5, #0\n\t"
  53195. "lsr r11, r7, #16\n\t"
  53196. "mul r6, r11, r6\n\t"
  53197. "lsr r11, r6, #16\n\t"
  53198. "lsl r6, r6, #16\n\t"
  53199. "adds r10, r10, r6\n\t"
  53200. "adc r5, r5, r11\n\t"
  53201. #else
  53202. "umull r6, r7, r8, r7\n\t"
  53203. "adds r10, r10, r6\n\t"
  53204. "adc r5, r7, #0\n\t"
  53205. #endif
  53206. "adds r10, r10, r4\n\t"
  53207. "str r10, [%[a], #232]\n\t"
  53208. "adc r5, r5, #0\n\t"
  53209. /* a[i+59] += m[59] * mu */
  53210. "ldr r7, [%[m], #236]\n\t"
  53211. "ldr r10, [%[a], #236]\n\t"
  53212. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53213. "lsr r11, r7, #16\n\t"
  53214. "lsr r6, r8, #16\n\t"
  53215. "mul r4, r6, r11\n\t"
  53216. "lsl r11, r7, #16\n\t"
  53217. "lsr r11, r11, #16\n\t"
  53218. "mul r6, r11, r6\n\t"
  53219. "lsr r11, r6, #16\n\t"
  53220. "lsl r6, r6, #16\n\t"
  53221. "adds r10, r10, r6\n\t"
  53222. "adc r4, r4, r11\n\t"
  53223. "lsl r6, r8, #16\n\t"
  53224. "lsl r11, r7, #16\n\t"
  53225. "lsr r6, r6, #16\n\t"
  53226. "lsr r11, r11, #16\n\t"
  53227. "mul r11, r6, r11\n\t"
  53228. "adds r10, r10, r11\n\t"
  53229. "adc r4, r4, #0\n\t"
  53230. "lsr r11, r7, #16\n\t"
  53231. "mul r6, r11, r6\n\t"
  53232. "lsr r11, r6, #16\n\t"
  53233. "lsl r6, r6, #16\n\t"
  53234. "adds r10, r10, r6\n\t"
  53235. "adc r4, r4, r11\n\t"
  53236. #else
  53237. "umull r6, r7, r8, r7\n\t"
  53238. "adds r10, r10, r6\n\t"
  53239. "adc r4, r7, #0\n\t"
  53240. #endif
  53241. "adds r10, r10, r5\n\t"
  53242. "str r10, [%[a], #236]\n\t"
  53243. "adc r4, r4, #0\n\t"
  53244. /* a[i+60] += m[60] * mu */
  53245. "ldr r7, [%[m], #240]\n\t"
  53246. "ldr r10, [%[a], #240]\n\t"
  53247. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53248. "lsr r11, r7, #16\n\t"
  53249. "lsr r6, r8, #16\n\t"
  53250. "mul r5, r6, r11\n\t"
  53251. "lsl r11, r7, #16\n\t"
  53252. "lsr r11, r11, #16\n\t"
  53253. "mul r6, r11, r6\n\t"
  53254. "lsr r11, r6, #16\n\t"
  53255. "lsl r6, r6, #16\n\t"
  53256. "adds r10, r10, r6\n\t"
  53257. "adc r5, r5, r11\n\t"
  53258. "lsl r6, r8, #16\n\t"
  53259. "lsl r11, r7, #16\n\t"
  53260. "lsr r6, r6, #16\n\t"
  53261. "lsr r11, r11, #16\n\t"
  53262. "mul r11, r6, r11\n\t"
  53263. "adds r10, r10, r11\n\t"
  53264. "adc r5, r5, #0\n\t"
  53265. "lsr r11, r7, #16\n\t"
  53266. "mul r6, r11, r6\n\t"
  53267. "lsr r11, r6, #16\n\t"
  53268. "lsl r6, r6, #16\n\t"
  53269. "adds r10, r10, r6\n\t"
  53270. "adc r5, r5, r11\n\t"
  53271. #else
  53272. "umull r6, r7, r8, r7\n\t"
  53273. "adds r10, r10, r6\n\t"
  53274. "adc r5, r7, #0\n\t"
  53275. #endif
  53276. "adds r10, r10, r4\n\t"
  53277. "str r10, [%[a], #240]\n\t"
  53278. "adc r5, r5, #0\n\t"
  53279. /* a[i+61] += m[61] * mu */
  53280. "ldr r7, [%[m], #244]\n\t"
  53281. "ldr r10, [%[a], #244]\n\t"
  53282. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53283. "lsr r11, r7, #16\n\t"
  53284. "lsr r6, r8, #16\n\t"
  53285. "mul r4, r6, r11\n\t"
  53286. "lsl r11, r7, #16\n\t"
  53287. "lsr r11, r11, #16\n\t"
  53288. "mul r6, r11, r6\n\t"
  53289. "lsr r11, r6, #16\n\t"
  53290. "lsl r6, r6, #16\n\t"
  53291. "adds r10, r10, r6\n\t"
  53292. "adc r4, r4, r11\n\t"
  53293. "lsl r6, r8, #16\n\t"
  53294. "lsl r11, r7, #16\n\t"
  53295. "lsr r6, r6, #16\n\t"
  53296. "lsr r11, r11, #16\n\t"
  53297. "mul r11, r6, r11\n\t"
  53298. "adds r10, r10, r11\n\t"
  53299. "adc r4, r4, #0\n\t"
  53300. "lsr r11, r7, #16\n\t"
  53301. "mul r6, r11, r6\n\t"
  53302. "lsr r11, r6, #16\n\t"
  53303. "lsl r6, r6, #16\n\t"
  53304. "adds r10, r10, r6\n\t"
  53305. "adc r4, r4, r11\n\t"
  53306. #else
  53307. "umull r6, r7, r8, r7\n\t"
  53308. "adds r10, r10, r6\n\t"
  53309. "adc r4, r7, #0\n\t"
  53310. #endif
  53311. "adds r10, r10, r5\n\t"
  53312. "str r10, [%[a], #244]\n\t"
  53313. "adc r4, r4, #0\n\t"
  53314. /* a[i+62] += m[62] * mu */
  53315. "ldr r7, [%[m], #248]\n\t"
  53316. "ldr r10, [%[a], #248]\n\t"
  53317. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53318. "lsr r11, r7, #16\n\t"
  53319. "lsr r6, r8, #16\n\t"
  53320. "mul r5, r6, r11\n\t"
  53321. "lsl r11, r7, #16\n\t"
  53322. "lsr r11, r11, #16\n\t"
  53323. "mul r6, r11, r6\n\t"
  53324. "lsr r11, r6, #16\n\t"
  53325. "lsl r6, r6, #16\n\t"
  53326. "adds r10, r10, r6\n\t"
  53327. "adc r5, r5, r11\n\t"
  53328. "lsl r6, r8, #16\n\t"
  53329. "lsl r11, r7, #16\n\t"
  53330. "lsr r6, r6, #16\n\t"
  53331. "lsr r11, r11, #16\n\t"
  53332. "mul r11, r6, r11\n\t"
  53333. "adds r10, r10, r11\n\t"
  53334. "adc r5, r5, #0\n\t"
  53335. "lsr r11, r7, #16\n\t"
  53336. "mul r6, r11, r6\n\t"
  53337. "lsr r11, r6, #16\n\t"
  53338. "lsl r6, r6, #16\n\t"
  53339. "adds r10, r10, r6\n\t"
  53340. "adc r5, r5, r11\n\t"
  53341. #else
  53342. "umull r6, r7, r8, r7\n\t"
  53343. "adds r10, r10, r6\n\t"
  53344. "adc r5, r7, #0\n\t"
  53345. #endif
  53346. "adds r10, r10, r4\n\t"
  53347. "str r10, [%[a], #248]\n\t"
  53348. "adc r5, r5, #0\n\t"
  53349. /* a[i+63] += m[63] * mu */
  53350. "ldr r7, [%[m], #252]\n\t"
  53351. "ldr r10, [%[a], #252]\n\t"
  53352. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53353. "lsr r11, r7, #16\n\t"
  53354. "lsr r6, r8, #16\n\t"
  53355. "mul r4, r6, r11\n\t"
  53356. "lsl r11, r7, #16\n\t"
  53357. "lsr r11, r11, #16\n\t"
  53358. "mul r6, r11, r6\n\t"
  53359. "lsr r11, r6, #16\n\t"
  53360. "lsl r6, r6, #16\n\t"
  53361. "adds r10, r10, r6\n\t"
  53362. "adc r4, r4, r11\n\t"
  53363. "lsl r6, r8, #16\n\t"
  53364. "lsl r11, r7, #16\n\t"
  53365. "lsr r6, r6, #16\n\t"
  53366. "lsr r11, r11, #16\n\t"
  53367. "mul r11, r6, r11\n\t"
  53368. "adds r10, r10, r11\n\t"
  53369. "adc r4, r4, #0\n\t"
  53370. "lsr r11, r7, #16\n\t"
  53371. "mul r6, r11, r6\n\t"
  53372. "lsr r11, r6, #16\n\t"
  53373. "lsl r6, r6, #16\n\t"
  53374. "adds r10, r10, r6\n\t"
  53375. "adc r4, r4, r11\n\t"
  53376. #else
  53377. "umull r6, r7, r8, r7\n\t"
  53378. "adds r10, r10, r6\n\t"
  53379. "adc r4, r7, #0\n\t"
  53380. #endif
  53381. "adds r10, r10, r5\n\t"
  53382. "str r10, [%[a], #252]\n\t"
  53383. "adc r4, r4, #0\n\t"
  53384. /* a[i+64] += m[64] * mu */
  53385. "ldr r7, [%[m], #256]\n\t"
  53386. "ldr r10, [%[a], #256]\n\t"
  53387. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53388. "lsr r11, r7, #16\n\t"
  53389. "lsr r6, r8, #16\n\t"
  53390. "mul r5, r6, r11\n\t"
  53391. "lsl r11, r7, #16\n\t"
  53392. "lsr r11, r11, #16\n\t"
  53393. "mul r6, r11, r6\n\t"
  53394. "lsr r11, r6, #16\n\t"
  53395. "lsl r6, r6, #16\n\t"
  53396. "adds r10, r10, r6\n\t"
  53397. "adc r5, r5, r11\n\t"
  53398. "lsl r6, r8, #16\n\t"
  53399. "lsl r11, r7, #16\n\t"
  53400. "lsr r6, r6, #16\n\t"
  53401. "lsr r11, r11, #16\n\t"
  53402. "mul r11, r6, r11\n\t"
  53403. "adds r10, r10, r11\n\t"
  53404. "adc r5, r5, #0\n\t"
  53405. "lsr r11, r7, #16\n\t"
  53406. "mul r6, r11, r6\n\t"
  53407. "lsr r11, r6, #16\n\t"
  53408. "lsl r6, r6, #16\n\t"
  53409. "adds r10, r10, r6\n\t"
  53410. "adc r5, r5, r11\n\t"
  53411. #else
  53412. "umull r6, r7, r8, r7\n\t"
  53413. "adds r10, r10, r6\n\t"
  53414. "adc r5, r7, #0\n\t"
  53415. #endif
  53416. "adds r10, r10, r4\n\t"
  53417. "str r10, [%[a], #256]\n\t"
  53418. "adc r5, r5, #0\n\t"
  53419. /* a[i+65] += m[65] * mu */
  53420. "ldr r7, [%[m], #260]\n\t"
  53421. "ldr r10, [%[a], #260]\n\t"
  53422. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53423. "lsr r11, r7, #16\n\t"
  53424. "lsr r6, r8, #16\n\t"
  53425. "mul r4, r6, r11\n\t"
  53426. "lsl r11, r7, #16\n\t"
  53427. "lsr r11, r11, #16\n\t"
  53428. "mul r6, r11, r6\n\t"
  53429. "lsr r11, r6, #16\n\t"
  53430. "lsl r6, r6, #16\n\t"
  53431. "adds r10, r10, r6\n\t"
  53432. "adc r4, r4, r11\n\t"
  53433. "lsl r6, r8, #16\n\t"
  53434. "lsl r11, r7, #16\n\t"
  53435. "lsr r6, r6, #16\n\t"
  53436. "lsr r11, r11, #16\n\t"
  53437. "mul r11, r6, r11\n\t"
  53438. "adds r10, r10, r11\n\t"
  53439. "adc r4, r4, #0\n\t"
  53440. "lsr r11, r7, #16\n\t"
  53441. "mul r6, r11, r6\n\t"
  53442. "lsr r11, r6, #16\n\t"
  53443. "lsl r6, r6, #16\n\t"
  53444. "adds r10, r10, r6\n\t"
  53445. "adc r4, r4, r11\n\t"
  53446. #else
  53447. "umull r6, r7, r8, r7\n\t"
  53448. "adds r10, r10, r6\n\t"
  53449. "adc r4, r7, #0\n\t"
  53450. #endif
  53451. "adds r10, r10, r5\n\t"
  53452. "str r10, [%[a], #260]\n\t"
  53453. "adc r4, r4, #0\n\t"
  53454. /* a[i+66] += m[66] * mu */
  53455. "ldr r7, [%[m], #264]\n\t"
  53456. "ldr r10, [%[a], #264]\n\t"
  53457. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53458. "lsr r11, r7, #16\n\t"
  53459. "lsr r6, r8, #16\n\t"
  53460. "mul r5, r6, r11\n\t"
  53461. "lsl r11, r7, #16\n\t"
  53462. "lsr r11, r11, #16\n\t"
  53463. "mul r6, r11, r6\n\t"
  53464. "lsr r11, r6, #16\n\t"
  53465. "lsl r6, r6, #16\n\t"
  53466. "adds r10, r10, r6\n\t"
  53467. "adc r5, r5, r11\n\t"
  53468. "lsl r6, r8, #16\n\t"
  53469. "lsl r11, r7, #16\n\t"
  53470. "lsr r6, r6, #16\n\t"
  53471. "lsr r11, r11, #16\n\t"
  53472. "mul r11, r6, r11\n\t"
  53473. "adds r10, r10, r11\n\t"
  53474. "adc r5, r5, #0\n\t"
  53475. "lsr r11, r7, #16\n\t"
  53476. "mul r6, r11, r6\n\t"
  53477. "lsr r11, r6, #16\n\t"
  53478. "lsl r6, r6, #16\n\t"
  53479. "adds r10, r10, r6\n\t"
  53480. "adc r5, r5, r11\n\t"
  53481. #else
  53482. "umull r6, r7, r8, r7\n\t"
  53483. "adds r10, r10, r6\n\t"
  53484. "adc r5, r7, #0\n\t"
  53485. #endif
  53486. "adds r10, r10, r4\n\t"
  53487. "str r10, [%[a], #264]\n\t"
  53488. "adc r5, r5, #0\n\t"
  53489. /* a[i+67] += m[67] * mu */
  53490. "ldr r7, [%[m], #268]\n\t"
  53491. "ldr r10, [%[a], #268]\n\t"
  53492. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53493. "lsr r11, r7, #16\n\t"
  53494. "lsr r6, r8, #16\n\t"
  53495. "mul r4, r6, r11\n\t"
  53496. "lsl r11, r7, #16\n\t"
  53497. "lsr r11, r11, #16\n\t"
  53498. "mul r6, r11, r6\n\t"
  53499. "lsr r11, r6, #16\n\t"
  53500. "lsl r6, r6, #16\n\t"
  53501. "adds r10, r10, r6\n\t"
  53502. "adc r4, r4, r11\n\t"
  53503. "lsl r6, r8, #16\n\t"
  53504. "lsl r11, r7, #16\n\t"
  53505. "lsr r6, r6, #16\n\t"
  53506. "lsr r11, r11, #16\n\t"
  53507. "mul r11, r6, r11\n\t"
  53508. "adds r10, r10, r11\n\t"
  53509. "adc r4, r4, #0\n\t"
  53510. "lsr r11, r7, #16\n\t"
  53511. "mul r6, r11, r6\n\t"
  53512. "lsr r11, r6, #16\n\t"
  53513. "lsl r6, r6, #16\n\t"
  53514. "adds r10, r10, r6\n\t"
  53515. "adc r4, r4, r11\n\t"
  53516. #else
  53517. "umull r6, r7, r8, r7\n\t"
  53518. "adds r10, r10, r6\n\t"
  53519. "adc r4, r7, #0\n\t"
  53520. #endif
  53521. "adds r10, r10, r5\n\t"
  53522. "str r10, [%[a], #268]\n\t"
  53523. "adc r4, r4, #0\n\t"
  53524. /* a[i+68] += m[68] * mu */
  53525. "ldr r7, [%[m], #272]\n\t"
  53526. "ldr r10, [%[a], #272]\n\t"
  53527. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53528. "lsr r11, r7, #16\n\t"
  53529. "lsr r6, r8, #16\n\t"
  53530. "mul r5, r6, r11\n\t"
  53531. "lsl r11, r7, #16\n\t"
  53532. "lsr r11, r11, #16\n\t"
  53533. "mul r6, r11, r6\n\t"
  53534. "lsr r11, r6, #16\n\t"
  53535. "lsl r6, r6, #16\n\t"
  53536. "adds r10, r10, r6\n\t"
  53537. "adc r5, r5, r11\n\t"
  53538. "lsl r6, r8, #16\n\t"
  53539. "lsl r11, r7, #16\n\t"
  53540. "lsr r6, r6, #16\n\t"
  53541. "lsr r11, r11, #16\n\t"
  53542. "mul r11, r6, r11\n\t"
  53543. "adds r10, r10, r11\n\t"
  53544. "adc r5, r5, #0\n\t"
  53545. "lsr r11, r7, #16\n\t"
  53546. "mul r6, r11, r6\n\t"
  53547. "lsr r11, r6, #16\n\t"
  53548. "lsl r6, r6, #16\n\t"
  53549. "adds r10, r10, r6\n\t"
  53550. "adc r5, r5, r11\n\t"
  53551. #else
  53552. "umull r6, r7, r8, r7\n\t"
  53553. "adds r10, r10, r6\n\t"
  53554. "adc r5, r7, #0\n\t"
  53555. #endif
  53556. "adds r10, r10, r4\n\t"
  53557. "str r10, [%[a], #272]\n\t"
  53558. "adc r5, r5, #0\n\t"
  53559. /* a[i+69] += m[69] * mu */
  53560. "ldr r7, [%[m], #276]\n\t"
  53561. "ldr r10, [%[a], #276]\n\t"
  53562. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53563. "lsr r11, r7, #16\n\t"
  53564. "lsr r6, r8, #16\n\t"
  53565. "mul r4, r6, r11\n\t"
  53566. "lsl r11, r7, #16\n\t"
  53567. "lsr r11, r11, #16\n\t"
  53568. "mul r6, r11, r6\n\t"
  53569. "lsr r11, r6, #16\n\t"
  53570. "lsl r6, r6, #16\n\t"
  53571. "adds r10, r10, r6\n\t"
  53572. "adc r4, r4, r11\n\t"
  53573. "lsl r6, r8, #16\n\t"
  53574. "lsl r11, r7, #16\n\t"
  53575. "lsr r6, r6, #16\n\t"
  53576. "lsr r11, r11, #16\n\t"
  53577. "mul r11, r6, r11\n\t"
  53578. "adds r10, r10, r11\n\t"
  53579. "adc r4, r4, #0\n\t"
  53580. "lsr r11, r7, #16\n\t"
  53581. "mul r6, r11, r6\n\t"
  53582. "lsr r11, r6, #16\n\t"
  53583. "lsl r6, r6, #16\n\t"
  53584. "adds r10, r10, r6\n\t"
  53585. "adc r4, r4, r11\n\t"
  53586. #else
  53587. "umull r6, r7, r8, r7\n\t"
  53588. "adds r10, r10, r6\n\t"
  53589. "adc r4, r7, #0\n\t"
  53590. #endif
  53591. "adds r10, r10, r5\n\t"
  53592. "str r10, [%[a], #276]\n\t"
  53593. "adc r4, r4, #0\n\t"
  53594. /* a[i+70] += m[70] * mu */
  53595. "ldr r7, [%[m], #280]\n\t"
  53596. "ldr r10, [%[a], #280]\n\t"
  53597. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53598. "lsr r11, r7, #16\n\t"
  53599. "lsr r6, r8, #16\n\t"
  53600. "mul r5, r6, r11\n\t"
  53601. "lsl r11, r7, #16\n\t"
  53602. "lsr r11, r11, #16\n\t"
  53603. "mul r6, r11, r6\n\t"
  53604. "lsr r11, r6, #16\n\t"
  53605. "lsl r6, r6, #16\n\t"
  53606. "adds r10, r10, r6\n\t"
  53607. "adc r5, r5, r11\n\t"
  53608. "lsl r6, r8, #16\n\t"
  53609. "lsl r11, r7, #16\n\t"
  53610. "lsr r6, r6, #16\n\t"
  53611. "lsr r11, r11, #16\n\t"
  53612. "mul r11, r6, r11\n\t"
  53613. "adds r10, r10, r11\n\t"
  53614. "adc r5, r5, #0\n\t"
  53615. "lsr r11, r7, #16\n\t"
  53616. "mul r6, r11, r6\n\t"
  53617. "lsr r11, r6, #16\n\t"
  53618. "lsl r6, r6, #16\n\t"
  53619. "adds r10, r10, r6\n\t"
  53620. "adc r5, r5, r11\n\t"
  53621. #else
  53622. "umull r6, r7, r8, r7\n\t"
  53623. "adds r10, r10, r6\n\t"
  53624. "adc r5, r7, #0\n\t"
  53625. #endif
  53626. "adds r10, r10, r4\n\t"
  53627. "str r10, [%[a], #280]\n\t"
  53628. "adc r5, r5, #0\n\t"
  53629. /* a[i+71] += m[71] * mu */
  53630. "ldr r7, [%[m], #284]\n\t"
  53631. "ldr r10, [%[a], #284]\n\t"
  53632. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53633. "lsr r11, r7, #16\n\t"
  53634. "lsr r6, r8, #16\n\t"
  53635. "mul r4, r6, r11\n\t"
  53636. "lsl r11, r7, #16\n\t"
  53637. "lsr r11, r11, #16\n\t"
  53638. "mul r6, r11, r6\n\t"
  53639. "lsr r11, r6, #16\n\t"
  53640. "lsl r6, r6, #16\n\t"
  53641. "adds r10, r10, r6\n\t"
  53642. "adc r4, r4, r11\n\t"
  53643. "lsl r6, r8, #16\n\t"
  53644. "lsl r11, r7, #16\n\t"
  53645. "lsr r6, r6, #16\n\t"
  53646. "lsr r11, r11, #16\n\t"
  53647. "mul r11, r6, r11\n\t"
  53648. "adds r10, r10, r11\n\t"
  53649. "adc r4, r4, #0\n\t"
  53650. "lsr r11, r7, #16\n\t"
  53651. "mul r6, r11, r6\n\t"
  53652. "lsr r11, r6, #16\n\t"
  53653. "lsl r6, r6, #16\n\t"
  53654. "adds r10, r10, r6\n\t"
  53655. "adc r4, r4, r11\n\t"
  53656. #else
  53657. "umull r6, r7, r8, r7\n\t"
  53658. "adds r10, r10, r6\n\t"
  53659. "adc r4, r7, #0\n\t"
  53660. #endif
  53661. "adds r10, r10, r5\n\t"
  53662. "str r10, [%[a], #284]\n\t"
  53663. "adc r4, r4, #0\n\t"
  53664. /* a[i+72] += m[72] * mu */
  53665. "ldr r7, [%[m], #288]\n\t"
  53666. "ldr r10, [%[a], #288]\n\t"
  53667. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53668. "lsr r11, r7, #16\n\t"
  53669. "lsr r6, r8, #16\n\t"
  53670. "mul r5, r6, r11\n\t"
  53671. "lsl r11, r7, #16\n\t"
  53672. "lsr r11, r11, #16\n\t"
  53673. "mul r6, r11, r6\n\t"
  53674. "lsr r11, r6, #16\n\t"
  53675. "lsl r6, r6, #16\n\t"
  53676. "adds r10, r10, r6\n\t"
  53677. "adc r5, r5, r11\n\t"
  53678. "lsl r6, r8, #16\n\t"
  53679. "lsl r11, r7, #16\n\t"
  53680. "lsr r6, r6, #16\n\t"
  53681. "lsr r11, r11, #16\n\t"
  53682. "mul r11, r6, r11\n\t"
  53683. "adds r10, r10, r11\n\t"
  53684. "adc r5, r5, #0\n\t"
  53685. "lsr r11, r7, #16\n\t"
  53686. "mul r6, r11, r6\n\t"
  53687. "lsr r11, r6, #16\n\t"
  53688. "lsl r6, r6, #16\n\t"
  53689. "adds r10, r10, r6\n\t"
  53690. "adc r5, r5, r11\n\t"
  53691. #else
  53692. "umull r6, r7, r8, r7\n\t"
  53693. "adds r10, r10, r6\n\t"
  53694. "adc r5, r7, #0\n\t"
  53695. #endif
  53696. "adds r10, r10, r4\n\t"
  53697. "str r10, [%[a], #288]\n\t"
  53698. "adc r5, r5, #0\n\t"
  53699. /* a[i+73] += m[73] * mu */
  53700. "ldr r7, [%[m], #292]\n\t"
  53701. "ldr r10, [%[a], #292]\n\t"
  53702. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53703. "lsr r11, r7, #16\n\t"
  53704. "lsr r6, r8, #16\n\t"
  53705. "mul r4, r6, r11\n\t"
  53706. "lsl r11, r7, #16\n\t"
  53707. "lsr r11, r11, #16\n\t"
  53708. "mul r6, r11, r6\n\t"
  53709. "lsr r11, r6, #16\n\t"
  53710. "lsl r6, r6, #16\n\t"
  53711. "adds r10, r10, r6\n\t"
  53712. "adc r4, r4, r11\n\t"
  53713. "lsl r6, r8, #16\n\t"
  53714. "lsl r11, r7, #16\n\t"
  53715. "lsr r6, r6, #16\n\t"
  53716. "lsr r11, r11, #16\n\t"
  53717. "mul r11, r6, r11\n\t"
  53718. "adds r10, r10, r11\n\t"
  53719. "adc r4, r4, #0\n\t"
  53720. "lsr r11, r7, #16\n\t"
  53721. "mul r6, r11, r6\n\t"
  53722. "lsr r11, r6, #16\n\t"
  53723. "lsl r6, r6, #16\n\t"
  53724. "adds r10, r10, r6\n\t"
  53725. "adc r4, r4, r11\n\t"
  53726. #else
  53727. "umull r6, r7, r8, r7\n\t"
  53728. "adds r10, r10, r6\n\t"
  53729. "adc r4, r7, #0\n\t"
  53730. #endif
  53731. "adds r10, r10, r5\n\t"
  53732. "str r10, [%[a], #292]\n\t"
  53733. "adc r4, r4, #0\n\t"
  53734. /* a[i+74] += m[74] * mu */
  53735. "ldr r7, [%[m], #296]\n\t"
  53736. "ldr r10, [%[a], #296]\n\t"
  53737. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53738. "lsr r11, r7, #16\n\t"
  53739. "lsr r6, r8, #16\n\t"
  53740. "mul r5, r6, r11\n\t"
  53741. "lsl r11, r7, #16\n\t"
  53742. "lsr r11, r11, #16\n\t"
  53743. "mul r6, r11, r6\n\t"
  53744. "lsr r11, r6, #16\n\t"
  53745. "lsl r6, r6, #16\n\t"
  53746. "adds r10, r10, r6\n\t"
  53747. "adc r5, r5, r11\n\t"
  53748. "lsl r6, r8, #16\n\t"
  53749. "lsl r11, r7, #16\n\t"
  53750. "lsr r6, r6, #16\n\t"
  53751. "lsr r11, r11, #16\n\t"
  53752. "mul r11, r6, r11\n\t"
  53753. "adds r10, r10, r11\n\t"
  53754. "adc r5, r5, #0\n\t"
  53755. "lsr r11, r7, #16\n\t"
  53756. "mul r6, r11, r6\n\t"
  53757. "lsr r11, r6, #16\n\t"
  53758. "lsl r6, r6, #16\n\t"
  53759. "adds r10, r10, r6\n\t"
  53760. "adc r5, r5, r11\n\t"
  53761. #else
  53762. "umull r6, r7, r8, r7\n\t"
  53763. "adds r10, r10, r6\n\t"
  53764. "adc r5, r7, #0\n\t"
  53765. #endif
  53766. "adds r10, r10, r4\n\t"
  53767. "str r10, [%[a], #296]\n\t"
  53768. "adc r5, r5, #0\n\t"
  53769. /* a[i+75] += m[75] * mu */
  53770. "ldr r7, [%[m], #300]\n\t"
  53771. "ldr r10, [%[a], #300]\n\t"
  53772. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53773. "lsr r11, r7, #16\n\t"
  53774. "lsr r6, r8, #16\n\t"
  53775. "mul r4, r6, r11\n\t"
  53776. "lsl r11, r7, #16\n\t"
  53777. "lsr r11, r11, #16\n\t"
  53778. "mul r6, r11, r6\n\t"
  53779. "lsr r11, r6, #16\n\t"
  53780. "lsl r6, r6, #16\n\t"
  53781. "adds r10, r10, r6\n\t"
  53782. "adc r4, r4, r11\n\t"
  53783. "lsl r6, r8, #16\n\t"
  53784. "lsl r11, r7, #16\n\t"
  53785. "lsr r6, r6, #16\n\t"
  53786. "lsr r11, r11, #16\n\t"
  53787. "mul r11, r6, r11\n\t"
  53788. "adds r10, r10, r11\n\t"
  53789. "adc r4, r4, #0\n\t"
  53790. "lsr r11, r7, #16\n\t"
  53791. "mul r6, r11, r6\n\t"
  53792. "lsr r11, r6, #16\n\t"
  53793. "lsl r6, r6, #16\n\t"
  53794. "adds r10, r10, r6\n\t"
  53795. "adc r4, r4, r11\n\t"
  53796. #else
  53797. "umull r6, r7, r8, r7\n\t"
  53798. "adds r10, r10, r6\n\t"
  53799. "adc r4, r7, #0\n\t"
  53800. #endif
  53801. "adds r10, r10, r5\n\t"
  53802. "str r10, [%[a], #300]\n\t"
  53803. "adc r4, r4, #0\n\t"
  53804. /* a[i+76] += m[76] * mu */
  53805. "ldr r7, [%[m], #304]\n\t"
  53806. "ldr r10, [%[a], #304]\n\t"
  53807. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53808. "lsr r11, r7, #16\n\t"
  53809. "lsr r6, r8, #16\n\t"
  53810. "mul r5, r6, r11\n\t"
  53811. "lsl r11, r7, #16\n\t"
  53812. "lsr r11, r11, #16\n\t"
  53813. "mul r6, r11, r6\n\t"
  53814. "lsr r11, r6, #16\n\t"
  53815. "lsl r6, r6, #16\n\t"
  53816. "adds r10, r10, r6\n\t"
  53817. "adc r5, r5, r11\n\t"
  53818. "lsl r6, r8, #16\n\t"
  53819. "lsl r11, r7, #16\n\t"
  53820. "lsr r6, r6, #16\n\t"
  53821. "lsr r11, r11, #16\n\t"
  53822. "mul r11, r6, r11\n\t"
  53823. "adds r10, r10, r11\n\t"
  53824. "adc r5, r5, #0\n\t"
  53825. "lsr r11, r7, #16\n\t"
  53826. "mul r6, r11, r6\n\t"
  53827. "lsr r11, r6, #16\n\t"
  53828. "lsl r6, r6, #16\n\t"
  53829. "adds r10, r10, r6\n\t"
  53830. "adc r5, r5, r11\n\t"
  53831. #else
  53832. "umull r6, r7, r8, r7\n\t"
  53833. "adds r10, r10, r6\n\t"
  53834. "adc r5, r7, #0\n\t"
  53835. #endif
  53836. "adds r10, r10, r4\n\t"
  53837. "str r10, [%[a], #304]\n\t"
  53838. "adc r5, r5, #0\n\t"
  53839. /* a[i+77] += m[77] * mu */
  53840. "ldr r7, [%[m], #308]\n\t"
  53841. "ldr r10, [%[a], #308]\n\t"
  53842. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53843. "lsr r11, r7, #16\n\t"
  53844. "lsr r6, r8, #16\n\t"
  53845. "mul r4, r6, r11\n\t"
  53846. "lsl r11, r7, #16\n\t"
  53847. "lsr r11, r11, #16\n\t"
  53848. "mul r6, r11, r6\n\t"
  53849. "lsr r11, r6, #16\n\t"
  53850. "lsl r6, r6, #16\n\t"
  53851. "adds r10, r10, r6\n\t"
  53852. "adc r4, r4, r11\n\t"
  53853. "lsl r6, r8, #16\n\t"
  53854. "lsl r11, r7, #16\n\t"
  53855. "lsr r6, r6, #16\n\t"
  53856. "lsr r11, r11, #16\n\t"
  53857. "mul r11, r6, r11\n\t"
  53858. "adds r10, r10, r11\n\t"
  53859. "adc r4, r4, #0\n\t"
  53860. "lsr r11, r7, #16\n\t"
  53861. "mul r6, r11, r6\n\t"
  53862. "lsr r11, r6, #16\n\t"
  53863. "lsl r6, r6, #16\n\t"
  53864. "adds r10, r10, r6\n\t"
  53865. "adc r4, r4, r11\n\t"
  53866. #else
  53867. "umull r6, r7, r8, r7\n\t"
  53868. "adds r10, r10, r6\n\t"
  53869. "adc r4, r7, #0\n\t"
  53870. #endif
  53871. "adds r10, r10, r5\n\t"
  53872. "str r10, [%[a], #308]\n\t"
  53873. "adc r4, r4, #0\n\t"
  53874. /* a[i+78] += m[78] * mu */
  53875. "ldr r7, [%[m], #312]\n\t"
  53876. "ldr r10, [%[a], #312]\n\t"
  53877. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53878. "lsr r11, r7, #16\n\t"
  53879. "lsr r6, r8, #16\n\t"
  53880. "mul r5, r6, r11\n\t"
  53881. "lsl r11, r7, #16\n\t"
  53882. "lsr r11, r11, #16\n\t"
  53883. "mul r6, r11, r6\n\t"
  53884. "lsr r11, r6, #16\n\t"
  53885. "lsl r6, r6, #16\n\t"
  53886. "adds r10, r10, r6\n\t"
  53887. "adc r5, r5, r11\n\t"
  53888. "lsl r6, r8, #16\n\t"
  53889. "lsl r11, r7, #16\n\t"
  53890. "lsr r6, r6, #16\n\t"
  53891. "lsr r11, r11, #16\n\t"
  53892. "mul r11, r6, r11\n\t"
  53893. "adds r10, r10, r11\n\t"
  53894. "adc r5, r5, #0\n\t"
  53895. "lsr r11, r7, #16\n\t"
  53896. "mul r6, r11, r6\n\t"
  53897. "lsr r11, r6, #16\n\t"
  53898. "lsl r6, r6, #16\n\t"
  53899. "adds r10, r10, r6\n\t"
  53900. "adc r5, r5, r11\n\t"
  53901. #else
  53902. "umull r6, r7, r8, r7\n\t"
  53903. "adds r10, r10, r6\n\t"
  53904. "adc r5, r7, #0\n\t"
  53905. #endif
  53906. "adds r10, r10, r4\n\t"
  53907. "str r10, [%[a], #312]\n\t"
  53908. "adc r5, r5, #0\n\t"
  53909. /* a[i+79] += m[79] * mu */
  53910. "ldr r7, [%[m], #316]\n\t"
  53911. "ldr r10, [%[a], #316]\n\t"
  53912. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53913. "lsr r11, r7, #16\n\t"
  53914. "lsr r6, r8, #16\n\t"
  53915. "mul r4, r6, r11\n\t"
  53916. "lsl r11, r7, #16\n\t"
  53917. "lsr r11, r11, #16\n\t"
  53918. "mul r6, r11, r6\n\t"
  53919. "lsr r11, r6, #16\n\t"
  53920. "lsl r6, r6, #16\n\t"
  53921. "adds r10, r10, r6\n\t"
  53922. "adc r4, r4, r11\n\t"
  53923. "lsl r6, r8, #16\n\t"
  53924. "lsl r11, r7, #16\n\t"
  53925. "lsr r6, r6, #16\n\t"
  53926. "lsr r11, r11, #16\n\t"
  53927. "mul r11, r6, r11\n\t"
  53928. "adds r10, r10, r11\n\t"
  53929. "adc r4, r4, #0\n\t"
  53930. "lsr r11, r7, #16\n\t"
  53931. "mul r6, r11, r6\n\t"
  53932. "lsr r11, r6, #16\n\t"
  53933. "lsl r6, r6, #16\n\t"
  53934. "adds r10, r10, r6\n\t"
  53935. "adc r4, r4, r11\n\t"
  53936. #else
  53937. "umull r6, r7, r8, r7\n\t"
  53938. "adds r10, r10, r6\n\t"
  53939. "adc r4, r7, #0\n\t"
  53940. #endif
  53941. "adds r10, r10, r5\n\t"
  53942. "str r10, [%[a], #316]\n\t"
  53943. "adc r4, r4, #0\n\t"
  53944. /* a[i+80] += m[80] * mu */
  53945. "ldr r7, [%[m], #320]\n\t"
  53946. "ldr r10, [%[a], #320]\n\t"
  53947. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53948. "lsr r11, r7, #16\n\t"
  53949. "lsr r6, r8, #16\n\t"
  53950. "mul r5, r6, r11\n\t"
  53951. "lsl r11, r7, #16\n\t"
  53952. "lsr r11, r11, #16\n\t"
  53953. "mul r6, r11, r6\n\t"
  53954. "lsr r11, r6, #16\n\t"
  53955. "lsl r6, r6, #16\n\t"
  53956. "adds r10, r10, r6\n\t"
  53957. "adc r5, r5, r11\n\t"
  53958. "lsl r6, r8, #16\n\t"
  53959. "lsl r11, r7, #16\n\t"
  53960. "lsr r6, r6, #16\n\t"
  53961. "lsr r11, r11, #16\n\t"
  53962. "mul r11, r6, r11\n\t"
  53963. "adds r10, r10, r11\n\t"
  53964. "adc r5, r5, #0\n\t"
  53965. "lsr r11, r7, #16\n\t"
  53966. "mul r6, r11, r6\n\t"
  53967. "lsr r11, r6, #16\n\t"
  53968. "lsl r6, r6, #16\n\t"
  53969. "adds r10, r10, r6\n\t"
  53970. "adc r5, r5, r11\n\t"
  53971. #else
  53972. "umull r6, r7, r8, r7\n\t"
  53973. "adds r10, r10, r6\n\t"
  53974. "adc r5, r7, #0\n\t"
  53975. #endif
  53976. "adds r10, r10, r4\n\t"
  53977. "str r10, [%[a], #320]\n\t"
  53978. "adc r5, r5, #0\n\t"
  53979. /* a[i+81] += m[81] * mu */
  53980. "ldr r7, [%[m], #324]\n\t"
  53981. "ldr r10, [%[a], #324]\n\t"
  53982. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  53983. "lsr r11, r7, #16\n\t"
  53984. "lsr r6, r8, #16\n\t"
  53985. "mul r4, r6, r11\n\t"
  53986. "lsl r11, r7, #16\n\t"
  53987. "lsr r11, r11, #16\n\t"
  53988. "mul r6, r11, r6\n\t"
  53989. "lsr r11, r6, #16\n\t"
  53990. "lsl r6, r6, #16\n\t"
  53991. "adds r10, r10, r6\n\t"
  53992. "adc r4, r4, r11\n\t"
  53993. "lsl r6, r8, #16\n\t"
  53994. "lsl r11, r7, #16\n\t"
  53995. "lsr r6, r6, #16\n\t"
  53996. "lsr r11, r11, #16\n\t"
  53997. "mul r11, r6, r11\n\t"
  53998. "adds r10, r10, r11\n\t"
  53999. "adc r4, r4, #0\n\t"
  54000. "lsr r11, r7, #16\n\t"
  54001. "mul r6, r11, r6\n\t"
  54002. "lsr r11, r6, #16\n\t"
  54003. "lsl r6, r6, #16\n\t"
  54004. "adds r10, r10, r6\n\t"
  54005. "adc r4, r4, r11\n\t"
  54006. #else
  54007. "umull r6, r7, r8, r7\n\t"
  54008. "adds r10, r10, r6\n\t"
  54009. "adc r4, r7, #0\n\t"
  54010. #endif
  54011. "adds r10, r10, r5\n\t"
  54012. "str r10, [%[a], #324]\n\t"
  54013. "adc r4, r4, #0\n\t"
  54014. /* a[i+82] += m[82] * mu */
  54015. "ldr r7, [%[m], #328]\n\t"
  54016. "ldr r10, [%[a], #328]\n\t"
  54017. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54018. "lsr r11, r7, #16\n\t"
  54019. "lsr r6, r8, #16\n\t"
  54020. "mul r5, r6, r11\n\t"
  54021. "lsl r11, r7, #16\n\t"
  54022. "lsr r11, r11, #16\n\t"
  54023. "mul r6, r11, r6\n\t"
  54024. "lsr r11, r6, #16\n\t"
  54025. "lsl r6, r6, #16\n\t"
  54026. "adds r10, r10, r6\n\t"
  54027. "adc r5, r5, r11\n\t"
  54028. "lsl r6, r8, #16\n\t"
  54029. "lsl r11, r7, #16\n\t"
  54030. "lsr r6, r6, #16\n\t"
  54031. "lsr r11, r11, #16\n\t"
  54032. "mul r11, r6, r11\n\t"
  54033. "adds r10, r10, r11\n\t"
  54034. "adc r5, r5, #0\n\t"
  54035. "lsr r11, r7, #16\n\t"
  54036. "mul r6, r11, r6\n\t"
  54037. "lsr r11, r6, #16\n\t"
  54038. "lsl r6, r6, #16\n\t"
  54039. "adds r10, r10, r6\n\t"
  54040. "adc r5, r5, r11\n\t"
  54041. #else
  54042. "umull r6, r7, r8, r7\n\t"
  54043. "adds r10, r10, r6\n\t"
  54044. "adc r5, r7, #0\n\t"
  54045. #endif
  54046. "adds r10, r10, r4\n\t"
  54047. "str r10, [%[a], #328]\n\t"
  54048. "adc r5, r5, #0\n\t"
  54049. /* a[i+83] += m[83] * mu */
  54050. "ldr r7, [%[m], #332]\n\t"
  54051. "ldr r10, [%[a], #332]\n\t"
  54052. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54053. "lsr r11, r7, #16\n\t"
  54054. "lsr r6, r8, #16\n\t"
  54055. "mul r4, r6, r11\n\t"
  54056. "lsl r11, r7, #16\n\t"
  54057. "lsr r11, r11, #16\n\t"
  54058. "mul r6, r11, r6\n\t"
  54059. "lsr r11, r6, #16\n\t"
  54060. "lsl r6, r6, #16\n\t"
  54061. "adds r10, r10, r6\n\t"
  54062. "adc r4, r4, r11\n\t"
  54063. "lsl r6, r8, #16\n\t"
  54064. "lsl r11, r7, #16\n\t"
  54065. "lsr r6, r6, #16\n\t"
  54066. "lsr r11, r11, #16\n\t"
  54067. "mul r11, r6, r11\n\t"
  54068. "adds r10, r10, r11\n\t"
  54069. "adc r4, r4, #0\n\t"
  54070. "lsr r11, r7, #16\n\t"
  54071. "mul r6, r11, r6\n\t"
  54072. "lsr r11, r6, #16\n\t"
  54073. "lsl r6, r6, #16\n\t"
  54074. "adds r10, r10, r6\n\t"
  54075. "adc r4, r4, r11\n\t"
  54076. #else
  54077. "umull r6, r7, r8, r7\n\t"
  54078. "adds r10, r10, r6\n\t"
  54079. "adc r4, r7, #0\n\t"
  54080. #endif
  54081. "adds r10, r10, r5\n\t"
  54082. "str r10, [%[a], #332]\n\t"
  54083. "adc r4, r4, #0\n\t"
  54084. /* a[i+84] += m[84] * mu */
  54085. "ldr r7, [%[m], #336]\n\t"
  54086. "ldr r10, [%[a], #336]\n\t"
  54087. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54088. "lsr r11, r7, #16\n\t"
  54089. "lsr r6, r8, #16\n\t"
  54090. "mul r5, r6, r11\n\t"
  54091. "lsl r11, r7, #16\n\t"
  54092. "lsr r11, r11, #16\n\t"
  54093. "mul r6, r11, r6\n\t"
  54094. "lsr r11, r6, #16\n\t"
  54095. "lsl r6, r6, #16\n\t"
  54096. "adds r10, r10, r6\n\t"
  54097. "adc r5, r5, r11\n\t"
  54098. "lsl r6, r8, #16\n\t"
  54099. "lsl r11, r7, #16\n\t"
  54100. "lsr r6, r6, #16\n\t"
  54101. "lsr r11, r11, #16\n\t"
  54102. "mul r11, r6, r11\n\t"
  54103. "adds r10, r10, r11\n\t"
  54104. "adc r5, r5, #0\n\t"
  54105. "lsr r11, r7, #16\n\t"
  54106. "mul r6, r11, r6\n\t"
  54107. "lsr r11, r6, #16\n\t"
  54108. "lsl r6, r6, #16\n\t"
  54109. "adds r10, r10, r6\n\t"
  54110. "adc r5, r5, r11\n\t"
  54111. #else
  54112. "umull r6, r7, r8, r7\n\t"
  54113. "adds r10, r10, r6\n\t"
  54114. "adc r5, r7, #0\n\t"
  54115. #endif
  54116. "adds r10, r10, r4\n\t"
  54117. "str r10, [%[a], #336]\n\t"
  54118. "adc r5, r5, #0\n\t"
  54119. /* a[i+85] += m[85] * mu */
  54120. "ldr r7, [%[m], #340]\n\t"
  54121. "ldr r10, [%[a], #340]\n\t"
  54122. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54123. "lsr r11, r7, #16\n\t"
  54124. "lsr r6, r8, #16\n\t"
  54125. "mul r4, r6, r11\n\t"
  54126. "lsl r11, r7, #16\n\t"
  54127. "lsr r11, r11, #16\n\t"
  54128. "mul r6, r11, r6\n\t"
  54129. "lsr r11, r6, #16\n\t"
  54130. "lsl r6, r6, #16\n\t"
  54131. "adds r10, r10, r6\n\t"
  54132. "adc r4, r4, r11\n\t"
  54133. "lsl r6, r8, #16\n\t"
  54134. "lsl r11, r7, #16\n\t"
  54135. "lsr r6, r6, #16\n\t"
  54136. "lsr r11, r11, #16\n\t"
  54137. "mul r11, r6, r11\n\t"
  54138. "adds r10, r10, r11\n\t"
  54139. "adc r4, r4, #0\n\t"
  54140. "lsr r11, r7, #16\n\t"
  54141. "mul r6, r11, r6\n\t"
  54142. "lsr r11, r6, #16\n\t"
  54143. "lsl r6, r6, #16\n\t"
  54144. "adds r10, r10, r6\n\t"
  54145. "adc r4, r4, r11\n\t"
  54146. #else
  54147. "umull r6, r7, r8, r7\n\t"
  54148. "adds r10, r10, r6\n\t"
  54149. "adc r4, r7, #0\n\t"
  54150. #endif
  54151. "adds r10, r10, r5\n\t"
  54152. "str r10, [%[a], #340]\n\t"
  54153. "adc r4, r4, #0\n\t"
  54154. /* a[i+86] += m[86] * mu */
  54155. "ldr r7, [%[m], #344]\n\t"
  54156. "ldr r10, [%[a], #344]\n\t"
  54157. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54158. "lsr r11, r7, #16\n\t"
  54159. "lsr r6, r8, #16\n\t"
  54160. "mul r5, r6, r11\n\t"
  54161. "lsl r11, r7, #16\n\t"
  54162. "lsr r11, r11, #16\n\t"
  54163. "mul r6, r11, r6\n\t"
  54164. "lsr r11, r6, #16\n\t"
  54165. "lsl r6, r6, #16\n\t"
  54166. "adds r10, r10, r6\n\t"
  54167. "adc r5, r5, r11\n\t"
  54168. "lsl r6, r8, #16\n\t"
  54169. "lsl r11, r7, #16\n\t"
  54170. "lsr r6, r6, #16\n\t"
  54171. "lsr r11, r11, #16\n\t"
  54172. "mul r11, r6, r11\n\t"
  54173. "adds r10, r10, r11\n\t"
  54174. "adc r5, r5, #0\n\t"
  54175. "lsr r11, r7, #16\n\t"
  54176. "mul r6, r11, r6\n\t"
  54177. "lsr r11, r6, #16\n\t"
  54178. "lsl r6, r6, #16\n\t"
  54179. "adds r10, r10, r6\n\t"
  54180. "adc r5, r5, r11\n\t"
  54181. #else
  54182. "umull r6, r7, r8, r7\n\t"
  54183. "adds r10, r10, r6\n\t"
  54184. "adc r5, r7, #0\n\t"
  54185. #endif
  54186. "adds r10, r10, r4\n\t"
  54187. "str r10, [%[a], #344]\n\t"
  54188. "adc r5, r5, #0\n\t"
  54189. /* a[i+87] += m[87] * mu */
  54190. "ldr r7, [%[m], #348]\n\t"
  54191. "ldr r10, [%[a], #348]\n\t"
  54192. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54193. "lsr r11, r7, #16\n\t"
  54194. "lsr r6, r8, #16\n\t"
  54195. "mul r4, r6, r11\n\t"
  54196. "lsl r11, r7, #16\n\t"
  54197. "lsr r11, r11, #16\n\t"
  54198. "mul r6, r11, r6\n\t"
  54199. "lsr r11, r6, #16\n\t"
  54200. "lsl r6, r6, #16\n\t"
  54201. "adds r10, r10, r6\n\t"
  54202. "adc r4, r4, r11\n\t"
  54203. "lsl r6, r8, #16\n\t"
  54204. "lsl r11, r7, #16\n\t"
  54205. "lsr r6, r6, #16\n\t"
  54206. "lsr r11, r11, #16\n\t"
  54207. "mul r11, r6, r11\n\t"
  54208. "adds r10, r10, r11\n\t"
  54209. "adc r4, r4, #0\n\t"
  54210. "lsr r11, r7, #16\n\t"
  54211. "mul r6, r11, r6\n\t"
  54212. "lsr r11, r6, #16\n\t"
  54213. "lsl r6, r6, #16\n\t"
  54214. "adds r10, r10, r6\n\t"
  54215. "adc r4, r4, r11\n\t"
  54216. #else
  54217. "umull r6, r7, r8, r7\n\t"
  54218. "adds r10, r10, r6\n\t"
  54219. "adc r4, r7, #0\n\t"
  54220. #endif
  54221. "adds r10, r10, r5\n\t"
  54222. "str r10, [%[a], #348]\n\t"
  54223. "adc r4, r4, #0\n\t"
  54224. /* a[i+88] += m[88] * mu */
  54225. "ldr r7, [%[m], #352]\n\t"
  54226. "ldr r10, [%[a], #352]\n\t"
  54227. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54228. "lsr r11, r7, #16\n\t"
  54229. "lsr r6, r8, #16\n\t"
  54230. "mul r5, r6, r11\n\t"
  54231. "lsl r11, r7, #16\n\t"
  54232. "lsr r11, r11, #16\n\t"
  54233. "mul r6, r11, r6\n\t"
  54234. "lsr r11, r6, #16\n\t"
  54235. "lsl r6, r6, #16\n\t"
  54236. "adds r10, r10, r6\n\t"
  54237. "adc r5, r5, r11\n\t"
  54238. "lsl r6, r8, #16\n\t"
  54239. "lsl r11, r7, #16\n\t"
  54240. "lsr r6, r6, #16\n\t"
  54241. "lsr r11, r11, #16\n\t"
  54242. "mul r11, r6, r11\n\t"
  54243. "adds r10, r10, r11\n\t"
  54244. "adc r5, r5, #0\n\t"
  54245. "lsr r11, r7, #16\n\t"
  54246. "mul r6, r11, r6\n\t"
  54247. "lsr r11, r6, #16\n\t"
  54248. "lsl r6, r6, #16\n\t"
  54249. "adds r10, r10, r6\n\t"
  54250. "adc r5, r5, r11\n\t"
  54251. #else
  54252. "umull r6, r7, r8, r7\n\t"
  54253. "adds r10, r10, r6\n\t"
  54254. "adc r5, r7, #0\n\t"
  54255. #endif
  54256. "adds r10, r10, r4\n\t"
  54257. "str r10, [%[a], #352]\n\t"
  54258. "adc r5, r5, #0\n\t"
  54259. /* a[i+89] += m[89] * mu */
  54260. "ldr r7, [%[m], #356]\n\t"
  54261. "ldr r10, [%[a], #356]\n\t"
  54262. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54263. "lsr r11, r7, #16\n\t"
  54264. "lsr r6, r8, #16\n\t"
  54265. "mul r4, r6, r11\n\t"
  54266. "lsl r11, r7, #16\n\t"
  54267. "lsr r11, r11, #16\n\t"
  54268. "mul r6, r11, r6\n\t"
  54269. "lsr r11, r6, #16\n\t"
  54270. "lsl r6, r6, #16\n\t"
  54271. "adds r10, r10, r6\n\t"
  54272. "adc r4, r4, r11\n\t"
  54273. "lsl r6, r8, #16\n\t"
  54274. "lsl r11, r7, #16\n\t"
  54275. "lsr r6, r6, #16\n\t"
  54276. "lsr r11, r11, #16\n\t"
  54277. "mul r11, r6, r11\n\t"
  54278. "adds r10, r10, r11\n\t"
  54279. "adc r4, r4, #0\n\t"
  54280. "lsr r11, r7, #16\n\t"
  54281. "mul r6, r11, r6\n\t"
  54282. "lsr r11, r6, #16\n\t"
  54283. "lsl r6, r6, #16\n\t"
  54284. "adds r10, r10, r6\n\t"
  54285. "adc r4, r4, r11\n\t"
  54286. #else
  54287. "umull r6, r7, r8, r7\n\t"
  54288. "adds r10, r10, r6\n\t"
  54289. "adc r4, r7, #0\n\t"
  54290. #endif
  54291. "adds r10, r10, r5\n\t"
  54292. "str r10, [%[a], #356]\n\t"
  54293. "adc r4, r4, #0\n\t"
  54294. /* a[i+90] += m[90] * mu */
  54295. "ldr r7, [%[m], #360]\n\t"
  54296. "ldr r10, [%[a], #360]\n\t"
  54297. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54298. "lsr r11, r7, #16\n\t"
  54299. "lsr r6, r8, #16\n\t"
  54300. "mul r5, r6, r11\n\t"
  54301. "lsl r11, r7, #16\n\t"
  54302. "lsr r11, r11, #16\n\t"
  54303. "mul r6, r11, r6\n\t"
  54304. "lsr r11, r6, #16\n\t"
  54305. "lsl r6, r6, #16\n\t"
  54306. "adds r10, r10, r6\n\t"
  54307. "adc r5, r5, r11\n\t"
  54308. "lsl r6, r8, #16\n\t"
  54309. "lsl r11, r7, #16\n\t"
  54310. "lsr r6, r6, #16\n\t"
  54311. "lsr r11, r11, #16\n\t"
  54312. "mul r11, r6, r11\n\t"
  54313. "adds r10, r10, r11\n\t"
  54314. "adc r5, r5, #0\n\t"
  54315. "lsr r11, r7, #16\n\t"
  54316. "mul r6, r11, r6\n\t"
  54317. "lsr r11, r6, #16\n\t"
  54318. "lsl r6, r6, #16\n\t"
  54319. "adds r10, r10, r6\n\t"
  54320. "adc r5, r5, r11\n\t"
  54321. #else
  54322. "umull r6, r7, r8, r7\n\t"
  54323. "adds r10, r10, r6\n\t"
  54324. "adc r5, r7, #0\n\t"
  54325. #endif
  54326. "adds r10, r10, r4\n\t"
  54327. "str r10, [%[a], #360]\n\t"
  54328. "adc r5, r5, #0\n\t"
  54329. /* a[i+91] += m[91] * mu */
  54330. "ldr r7, [%[m], #364]\n\t"
  54331. "ldr r10, [%[a], #364]\n\t"
  54332. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54333. "lsr r11, r7, #16\n\t"
  54334. "lsr r6, r8, #16\n\t"
  54335. "mul r4, r6, r11\n\t"
  54336. "lsl r11, r7, #16\n\t"
  54337. "lsr r11, r11, #16\n\t"
  54338. "mul r6, r11, r6\n\t"
  54339. "lsr r11, r6, #16\n\t"
  54340. "lsl r6, r6, #16\n\t"
  54341. "adds r10, r10, r6\n\t"
  54342. "adc r4, r4, r11\n\t"
  54343. "lsl r6, r8, #16\n\t"
  54344. "lsl r11, r7, #16\n\t"
  54345. "lsr r6, r6, #16\n\t"
  54346. "lsr r11, r11, #16\n\t"
  54347. "mul r11, r6, r11\n\t"
  54348. "adds r10, r10, r11\n\t"
  54349. "adc r4, r4, #0\n\t"
  54350. "lsr r11, r7, #16\n\t"
  54351. "mul r6, r11, r6\n\t"
  54352. "lsr r11, r6, #16\n\t"
  54353. "lsl r6, r6, #16\n\t"
  54354. "adds r10, r10, r6\n\t"
  54355. "adc r4, r4, r11\n\t"
  54356. #else
  54357. "umull r6, r7, r8, r7\n\t"
  54358. "adds r10, r10, r6\n\t"
  54359. "adc r4, r7, #0\n\t"
  54360. #endif
  54361. "adds r10, r10, r5\n\t"
  54362. "str r10, [%[a], #364]\n\t"
  54363. "adc r4, r4, #0\n\t"
  54364. /* a[i+92] += m[92] * mu */
  54365. "ldr r7, [%[m], #368]\n\t"
  54366. "ldr r10, [%[a], #368]\n\t"
  54367. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54368. "lsr r11, r7, #16\n\t"
  54369. "lsr r6, r8, #16\n\t"
  54370. "mul r5, r6, r11\n\t"
  54371. "lsl r11, r7, #16\n\t"
  54372. "lsr r11, r11, #16\n\t"
  54373. "mul r6, r11, r6\n\t"
  54374. "lsr r11, r6, #16\n\t"
  54375. "lsl r6, r6, #16\n\t"
  54376. "adds r10, r10, r6\n\t"
  54377. "adc r5, r5, r11\n\t"
  54378. "lsl r6, r8, #16\n\t"
  54379. "lsl r11, r7, #16\n\t"
  54380. "lsr r6, r6, #16\n\t"
  54381. "lsr r11, r11, #16\n\t"
  54382. "mul r11, r6, r11\n\t"
  54383. "adds r10, r10, r11\n\t"
  54384. "adc r5, r5, #0\n\t"
  54385. "lsr r11, r7, #16\n\t"
  54386. "mul r6, r11, r6\n\t"
  54387. "lsr r11, r6, #16\n\t"
  54388. "lsl r6, r6, #16\n\t"
  54389. "adds r10, r10, r6\n\t"
  54390. "adc r5, r5, r11\n\t"
  54391. #else
  54392. "umull r6, r7, r8, r7\n\t"
  54393. "adds r10, r10, r6\n\t"
  54394. "adc r5, r7, #0\n\t"
  54395. #endif
  54396. "adds r10, r10, r4\n\t"
  54397. "str r10, [%[a], #368]\n\t"
  54398. "adc r5, r5, #0\n\t"
  54399. /* a[i+93] += m[93] * mu */
  54400. "ldr r7, [%[m], #372]\n\t"
  54401. "ldr r10, [%[a], #372]\n\t"
  54402. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54403. "lsr r11, r7, #16\n\t"
  54404. "lsr r6, r8, #16\n\t"
  54405. "mul r4, r6, r11\n\t"
  54406. "lsl r11, r7, #16\n\t"
  54407. "lsr r11, r11, #16\n\t"
  54408. "mul r6, r11, r6\n\t"
  54409. "lsr r11, r6, #16\n\t"
  54410. "lsl r6, r6, #16\n\t"
  54411. "adds r10, r10, r6\n\t"
  54412. "adc r4, r4, r11\n\t"
  54413. "lsl r6, r8, #16\n\t"
  54414. "lsl r11, r7, #16\n\t"
  54415. "lsr r6, r6, #16\n\t"
  54416. "lsr r11, r11, #16\n\t"
  54417. "mul r11, r6, r11\n\t"
  54418. "adds r10, r10, r11\n\t"
  54419. "adc r4, r4, #0\n\t"
  54420. "lsr r11, r7, #16\n\t"
  54421. "mul r6, r11, r6\n\t"
  54422. "lsr r11, r6, #16\n\t"
  54423. "lsl r6, r6, #16\n\t"
  54424. "adds r10, r10, r6\n\t"
  54425. "adc r4, r4, r11\n\t"
  54426. #else
  54427. "umull r6, r7, r8, r7\n\t"
  54428. "adds r10, r10, r6\n\t"
  54429. "adc r4, r7, #0\n\t"
  54430. #endif
  54431. "adds r10, r10, r5\n\t"
  54432. "str r10, [%[a], #372]\n\t"
  54433. "adc r4, r4, #0\n\t"
  54434. /* a[i+94] += m[94] * mu */
  54435. "ldr r7, [%[m], #376]\n\t"
  54436. "ldr r10, [%[a], #376]\n\t"
  54437. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54438. "lsr r11, r7, #16\n\t"
  54439. "lsr r6, r8, #16\n\t"
  54440. "mul r5, r6, r11\n\t"
  54441. "lsl r11, r7, #16\n\t"
  54442. "lsr r11, r11, #16\n\t"
  54443. "mul r6, r11, r6\n\t"
  54444. "lsr r11, r6, #16\n\t"
  54445. "lsl r6, r6, #16\n\t"
  54446. "adds r10, r10, r6\n\t"
  54447. "adc r5, r5, r11\n\t"
  54448. "lsl r6, r8, #16\n\t"
  54449. "lsl r11, r7, #16\n\t"
  54450. "lsr r6, r6, #16\n\t"
  54451. "lsr r11, r11, #16\n\t"
  54452. "mul r11, r6, r11\n\t"
  54453. "adds r10, r10, r11\n\t"
  54454. "adc r5, r5, #0\n\t"
  54455. "lsr r11, r7, #16\n\t"
  54456. "mul r6, r11, r6\n\t"
  54457. "lsr r11, r6, #16\n\t"
  54458. "lsl r6, r6, #16\n\t"
  54459. "adds r10, r10, r6\n\t"
  54460. "adc r5, r5, r11\n\t"
  54461. #else
  54462. "umull r6, r7, r8, r7\n\t"
  54463. "adds r10, r10, r6\n\t"
  54464. "adc r5, r7, #0\n\t"
  54465. #endif
  54466. "adds r10, r10, r4\n\t"
  54467. "str r10, [%[a], #376]\n\t"
  54468. "adc r5, r5, #0\n\t"
  54469. /* a[i+95] += m[95] * mu */
  54470. "ldr r7, [%[m], #380]\n\t"
  54471. "ldr r10, [%[a], #380]\n\t"
  54472. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54473. "lsr r11, r7, #16\n\t"
  54474. "lsr r6, r8, #16\n\t"
  54475. "mul r4, r6, r11\n\t"
  54476. "lsl r11, r7, #16\n\t"
  54477. "lsr r11, r11, #16\n\t"
  54478. "mul r6, r11, r6\n\t"
  54479. "lsr r11, r6, #16\n\t"
  54480. "lsl r6, r6, #16\n\t"
  54481. "adds r10, r10, r6\n\t"
  54482. "adc r4, r4, r11\n\t"
  54483. "lsl r6, r8, #16\n\t"
  54484. "lsl r11, r7, #16\n\t"
  54485. "lsr r6, r6, #16\n\t"
  54486. "lsr r11, r11, #16\n\t"
  54487. "mul r11, r6, r11\n\t"
  54488. "adds r10, r10, r11\n\t"
  54489. "adc r4, r4, #0\n\t"
  54490. "lsr r11, r7, #16\n\t"
  54491. "mul r6, r11, r6\n\t"
  54492. "lsr r11, r6, #16\n\t"
  54493. "lsl r6, r6, #16\n\t"
  54494. "adds r10, r10, r6\n\t"
  54495. "adc r4, r4, r11\n\t"
  54496. #else
  54497. "umull r6, r7, r8, r7\n\t"
  54498. "adds r10, r10, r6\n\t"
  54499. "adc r4, r7, #0\n\t"
  54500. #endif
  54501. "adds r10, r10, r5\n\t"
  54502. "str r10, [%[a], #380]\n\t"
  54503. "adc r4, r4, #0\n\t"
  54504. /* a[i+96] += m[96] * mu */
  54505. "ldr r7, [%[m], #384]\n\t"
  54506. "ldr r10, [%[a], #384]\n\t"
  54507. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54508. "lsr r11, r7, #16\n\t"
  54509. "lsr r6, r8, #16\n\t"
  54510. "mul r5, r6, r11\n\t"
  54511. "lsl r11, r7, #16\n\t"
  54512. "lsr r11, r11, #16\n\t"
  54513. "mul r6, r11, r6\n\t"
  54514. "lsr r11, r6, #16\n\t"
  54515. "lsl r6, r6, #16\n\t"
  54516. "adds r10, r10, r6\n\t"
  54517. "adc r5, r5, r11\n\t"
  54518. "lsl r6, r8, #16\n\t"
  54519. "lsl r11, r7, #16\n\t"
  54520. "lsr r6, r6, #16\n\t"
  54521. "lsr r11, r11, #16\n\t"
  54522. "mul r11, r6, r11\n\t"
  54523. "adds r10, r10, r11\n\t"
  54524. "adc r5, r5, #0\n\t"
  54525. "lsr r11, r7, #16\n\t"
  54526. "mul r6, r11, r6\n\t"
  54527. "lsr r11, r6, #16\n\t"
  54528. "lsl r6, r6, #16\n\t"
  54529. "adds r10, r10, r6\n\t"
  54530. "adc r5, r5, r11\n\t"
  54531. #else
  54532. "umull r6, r7, r8, r7\n\t"
  54533. "adds r10, r10, r6\n\t"
  54534. "adc r5, r7, #0\n\t"
  54535. #endif
  54536. "adds r10, r10, r4\n\t"
  54537. "str r10, [%[a], #384]\n\t"
  54538. "adc r5, r5, #0\n\t"
  54539. /* a[i+97] += m[97] * mu */
  54540. "ldr r7, [%[m], #388]\n\t"
  54541. "ldr r10, [%[a], #388]\n\t"
  54542. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54543. "lsr r11, r7, #16\n\t"
  54544. "lsr r6, r8, #16\n\t"
  54545. "mul r4, r6, r11\n\t"
  54546. "lsl r11, r7, #16\n\t"
  54547. "lsr r11, r11, #16\n\t"
  54548. "mul r6, r11, r6\n\t"
  54549. "lsr r11, r6, #16\n\t"
  54550. "lsl r6, r6, #16\n\t"
  54551. "adds r10, r10, r6\n\t"
  54552. "adc r4, r4, r11\n\t"
  54553. "lsl r6, r8, #16\n\t"
  54554. "lsl r11, r7, #16\n\t"
  54555. "lsr r6, r6, #16\n\t"
  54556. "lsr r11, r11, #16\n\t"
  54557. "mul r11, r6, r11\n\t"
  54558. "adds r10, r10, r11\n\t"
  54559. "adc r4, r4, #0\n\t"
  54560. "lsr r11, r7, #16\n\t"
  54561. "mul r6, r11, r6\n\t"
  54562. "lsr r11, r6, #16\n\t"
  54563. "lsl r6, r6, #16\n\t"
  54564. "adds r10, r10, r6\n\t"
  54565. "adc r4, r4, r11\n\t"
  54566. #else
  54567. "umull r6, r7, r8, r7\n\t"
  54568. "adds r10, r10, r6\n\t"
  54569. "adc r4, r7, #0\n\t"
  54570. #endif
  54571. "adds r10, r10, r5\n\t"
  54572. "str r10, [%[a], #388]\n\t"
  54573. "adc r4, r4, #0\n\t"
  54574. /* a[i+98] += m[98] * mu */
  54575. "ldr r7, [%[m], #392]\n\t"
  54576. "ldr r10, [%[a], #392]\n\t"
  54577. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54578. "lsr r11, r7, #16\n\t"
  54579. "lsr r6, r8, #16\n\t"
  54580. "mul r5, r6, r11\n\t"
  54581. "lsl r11, r7, #16\n\t"
  54582. "lsr r11, r11, #16\n\t"
  54583. "mul r6, r11, r6\n\t"
  54584. "lsr r11, r6, #16\n\t"
  54585. "lsl r6, r6, #16\n\t"
  54586. "adds r10, r10, r6\n\t"
  54587. "adc r5, r5, r11\n\t"
  54588. "lsl r6, r8, #16\n\t"
  54589. "lsl r11, r7, #16\n\t"
  54590. "lsr r6, r6, #16\n\t"
  54591. "lsr r11, r11, #16\n\t"
  54592. "mul r11, r6, r11\n\t"
  54593. "adds r10, r10, r11\n\t"
  54594. "adc r5, r5, #0\n\t"
  54595. "lsr r11, r7, #16\n\t"
  54596. "mul r6, r11, r6\n\t"
  54597. "lsr r11, r6, #16\n\t"
  54598. "lsl r6, r6, #16\n\t"
  54599. "adds r10, r10, r6\n\t"
  54600. "adc r5, r5, r11\n\t"
  54601. #else
  54602. "umull r6, r7, r8, r7\n\t"
  54603. "adds r10, r10, r6\n\t"
  54604. "adc r5, r7, #0\n\t"
  54605. #endif
  54606. "adds r10, r10, r4\n\t"
  54607. "str r10, [%[a], #392]\n\t"
  54608. "adc r5, r5, #0\n\t"
  54609. /* a[i+99] += m[99] * mu */
  54610. "ldr r7, [%[m], #396]\n\t"
  54611. "ldr r10, [%[a], #396]\n\t"
  54612. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54613. "lsr r11, r7, #16\n\t"
  54614. "lsr r6, r8, #16\n\t"
  54615. "mul r4, r6, r11\n\t"
  54616. "lsl r11, r7, #16\n\t"
  54617. "lsr r11, r11, #16\n\t"
  54618. "mul r6, r11, r6\n\t"
  54619. "lsr r11, r6, #16\n\t"
  54620. "lsl r6, r6, #16\n\t"
  54621. "adds r10, r10, r6\n\t"
  54622. "adc r4, r4, r11\n\t"
  54623. "lsl r6, r8, #16\n\t"
  54624. "lsl r11, r7, #16\n\t"
  54625. "lsr r6, r6, #16\n\t"
  54626. "lsr r11, r11, #16\n\t"
  54627. "mul r11, r6, r11\n\t"
  54628. "adds r10, r10, r11\n\t"
  54629. "adc r4, r4, #0\n\t"
  54630. "lsr r11, r7, #16\n\t"
  54631. "mul r6, r11, r6\n\t"
  54632. "lsr r11, r6, #16\n\t"
  54633. "lsl r6, r6, #16\n\t"
  54634. "adds r10, r10, r6\n\t"
  54635. "adc r4, r4, r11\n\t"
  54636. #else
  54637. "umull r6, r7, r8, r7\n\t"
  54638. "adds r10, r10, r6\n\t"
  54639. "adc r4, r7, #0\n\t"
  54640. #endif
  54641. "adds r10, r10, r5\n\t"
  54642. "str r10, [%[a], #396]\n\t"
  54643. "adc r4, r4, #0\n\t"
  54644. /* a[i+100] += m[100] * mu */
  54645. "ldr r7, [%[m], #400]\n\t"
  54646. "ldr r10, [%[a], #400]\n\t"
  54647. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54648. "lsr r11, r7, #16\n\t"
  54649. "lsr r6, r8, #16\n\t"
  54650. "mul r5, r6, r11\n\t"
  54651. "lsl r11, r7, #16\n\t"
  54652. "lsr r11, r11, #16\n\t"
  54653. "mul r6, r11, r6\n\t"
  54654. "lsr r11, r6, #16\n\t"
  54655. "lsl r6, r6, #16\n\t"
  54656. "adds r10, r10, r6\n\t"
  54657. "adc r5, r5, r11\n\t"
  54658. "lsl r6, r8, #16\n\t"
  54659. "lsl r11, r7, #16\n\t"
  54660. "lsr r6, r6, #16\n\t"
  54661. "lsr r11, r11, #16\n\t"
  54662. "mul r11, r6, r11\n\t"
  54663. "adds r10, r10, r11\n\t"
  54664. "adc r5, r5, #0\n\t"
  54665. "lsr r11, r7, #16\n\t"
  54666. "mul r6, r11, r6\n\t"
  54667. "lsr r11, r6, #16\n\t"
  54668. "lsl r6, r6, #16\n\t"
  54669. "adds r10, r10, r6\n\t"
  54670. "adc r5, r5, r11\n\t"
  54671. #else
  54672. "umull r6, r7, r8, r7\n\t"
  54673. "adds r10, r10, r6\n\t"
  54674. "adc r5, r7, #0\n\t"
  54675. #endif
  54676. "adds r10, r10, r4\n\t"
  54677. "str r10, [%[a], #400]\n\t"
  54678. "adc r5, r5, #0\n\t"
  54679. /* a[i+101] += m[101] * mu */
  54680. "ldr r7, [%[m], #404]\n\t"
  54681. "ldr r10, [%[a], #404]\n\t"
  54682. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54683. "lsr r11, r7, #16\n\t"
  54684. "lsr r6, r8, #16\n\t"
  54685. "mul r4, r6, r11\n\t"
  54686. "lsl r11, r7, #16\n\t"
  54687. "lsr r11, r11, #16\n\t"
  54688. "mul r6, r11, r6\n\t"
  54689. "lsr r11, r6, #16\n\t"
  54690. "lsl r6, r6, #16\n\t"
  54691. "adds r10, r10, r6\n\t"
  54692. "adc r4, r4, r11\n\t"
  54693. "lsl r6, r8, #16\n\t"
  54694. "lsl r11, r7, #16\n\t"
  54695. "lsr r6, r6, #16\n\t"
  54696. "lsr r11, r11, #16\n\t"
  54697. "mul r11, r6, r11\n\t"
  54698. "adds r10, r10, r11\n\t"
  54699. "adc r4, r4, #0\n\t"
  54700. "lsr r11, r7, #16\n\t"
  54701. "mul r6, r11, r6\n\t"
  54702. "lsr r11, r6, #16\n\t"
  54703. "lsl r6, r6, #16\n\t"
  54704. "adds r10, r10, r6\n\t"
  54705. "adc r4, r4, r11\n\t"
  54706. #else
  54707. "umull r6, r7, r8, r7\n\t"
  54708. "adds r10, r10, r6\n\t"
  54709. "adc r4, r7, #0\n\t"
  54710. #endif
  54711. "adds r10, r10, r5\n\t"
  54712. "str r10, [%[a], #404]\n\t"
  54713. "adc r4, r4, #0\n\t"
  54714. /* a[i+102] += m[102] * mu */
  54715. "ldr r7, [%[m], #408]\n\t"
  54716. "ldr r10, [%[a], #408]\n\t"
  54717. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54718. "lsr r11, r7, #16\n\t"
  54719. "lsr r6, r8, #16\n\t"
  54720. "mul r5, r6, r11\n\t"
  54721. "lsl r11, r7, #16\n\t"
  54722. "lsr r11, r11, #16\n\t"
  54723. "mul r6, r11, r6\n\t"
  54724. "lsr r11, r6, #16\n\t"
  54725. "lsl r6, r6, #16\n\t"
  54726. "adds r10, r10, r6\n\t"
  54727. "adc r5, r5, r11\n\t"
  54728. "lsl r6, r8, #16\n\t"
  54729. "lsl r11, r7, #16\n\t"
  54730. "lsr r6, r6, #16\n\t"
  54731. "lsr r11, r11, #16\n\t"
  54732. "mul r11, r6, r11\n\t"
  54733. "adds r10, r10, r11\n\t"
  54734. "adc r5, r5, #0\n\t"
  54735. "lsr r11, r7, #16\n\t"
  54736. "mul r6, r11, r6\n\t"
  54737. "lsr r11, r6, #16\n\t"
  54738. "lsl r6, r6, #16\n\t"
  54739. "adds r10, r10, r6\n\t"
  54740. "adc r5, r5, r11\n\t"
  54741. #else
  54742. "umull r6, r7, r8, r7\n\t"
  54743. "adds r10, r10, r6\n\t"
  54744. "adc r5, r7, #0\n\t"
  54745. #endif
  54746. "adds r10, r10, r4\n\t"
  54747. "str r10, [%[a], #408]\n\t"
  54748. "adc r5, r5, #0\n\t"
  54749. /* a[i+103] += m[103] * mu */
  54750. "ldr r7, [%[m], #412]\n\t"
  54751. "ldr r10, [%[a], #412]\n\t"
  54752. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54753. "lsr r11, r7, #16\n\t"
  54754. "lsr r6, r8, #16\n\t"
  54755. "mul r4, r6, r11\n\t"
  54756. "lsl r11, r7, #16\n\t"
  54757. "lsr r11, r11, #16\n\t"
  54758. "mul r6, r11, r6\n\t"
  54759. "lsr r11, r6, #16\n\t"
  54760. "lsl r6, r6, #16\n\t"
  54761. "adds r10, r10, r6\n\t"
  54762. "adc r4, r4, r11\n\t"
  54763. "lsl r6, r8, #16\n\t"
  54764. "lsl r11, r7, #16\n\t"
  54765. "lsr r6, r6, #16\n\t"
  54766. "lsr r11, r11, #16\n\t"
  54767. "mul r11, r6, r11\n\t"
  54768. "adds r10, r10, r11\n\t"
  54769. "adc r4, r4, #0\n\t"
  54770. "lsr r11, r7, #16\n\t"
  54771. "mul r6, r11, r6\n\t"
  54772. "lsr r11, r6, #16\n\t"
  54773. "lsl r6, r6, #16\n\t"
  54774. "adds r10, r10, r6\n\t"
  54775. "adc r4, r4, r11\n\t"
  54776. #else
  54777. "umull r6, r7, r8, r7\n\t"
  54778. "adds r10, r10, r6\n\t"
  54779. "adc r4, r7, #0\n\t"
  54780. #endif
  54781. "adds r10, r10, r5\n\t"
  54782. "str r10, [%[a], #412]\n\t"
  54783. "adc r4, r4, #0\n\t"
  54784. /* a[i+104] += m[104] * mu */
  54785. "ldr r7, [%[m], #416]\n\t"
  54786. "ldr r10, [%[a], #416]\n\t"
  54787. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54788. "lsr r11, r7, #16\n\t"
  54789. "lsr r6, r8, #16\n\t"
  54790. "mul r5, r6, r11\n\t"
  54791. "lsl r11, r7, #16\n\t"
  54792. "lsr r11, r11, #16\n\t"
  54793. "mul r6, r11, r6\n\t"
  54794. "lsr r11, r6, #16\n\t"
  54795. "lsl r6, r6, #16\n\t"
  54796. "adds r10, r10, r6\n\t"
  54797. "adc r5, r5, r11\n\t"
  54798. "lsl r6, r8, #16\n\t"
  54799. "lsl r11, r7, #16\n\t"
  54800. "lsr r6, r6, #16\n\t"
  54801. "lsr r11, r11, #16\n\t"
  54802. "mul r11, r6, r11\n\t"
  54803. "adds r10, r10, r11\n\t"
  54804. "adc r5, r5, #0\n\t"
  54805. "lsr r11, r7, #16\n\t"
  54806. "mul r6, r11, r6\n\t"
  54807. "lsr r11, r6, #16\n\t"
  54808. "lsl r6, r6, #16\n\t"
  54809. "adds r10, r10, r6\n\t"
  54810. "adc r5, r5, r11\n\t"
  54811. #else
  54812. "umull r6, r7, r8, r7\n\t"
  54813. "adds r10, r10, r6\n\t"
  54814. "adc r5, r7, #0\n\t"
  54815. #endif
  54816. "adds r10, r10, r4\n\t"
  54817. "str r10, [%[a], #416]\n\t"
  54818. "adc r5, r5, #0\n\t"
  54819. /* a[i+105] += m[105] * mu */
  54820. "ldr r7, [%[m], #420]\n\t"
  54821. "ldr r10, [%[a], #420]\n\t"
  54822. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54823. "lsr r11, r7, #16\n\t"
  54824. "lsr r6, r8, #16\n\t"
  54825. "mul r4, r6, r11\n\t"
  54826. "lsl r11, r7, #16\n\t"
  54827. "lsr r11, r11, #16\n\t"
  54828. "mul r6, r11, r6\n\t"
  54829. "lsr r11, r6, #16\n\t"
  54830. "lsl r6, r6, #16\n\t"
  54831. "adds r10, r10, r6\n\t"
  54832. "adc r4, r4, r11\n\t"
  54833. "lsl r6, r8, #16\n\t"
  54834. "lsl r11, r7, #16\n\t"
  54835. "lsr r6, r6, #16\n\t"
  54836. "lsr r11, r11, #16\n\t"
  54837. "mul r11, r6, r11\n\t"
  54838. "adds r10, r10, r11\n\t"
  54839. "adc r4, r4, #0\n\t"
  54840. "lsr r11, r7, #16\n\t"
  54841. "mul r6, r11, r6\n\t"
  54842. "lsr r11, r6, #16\n\t"
  54843. "lsl r6, r6, #16\n\t"
  54844. "adds r10, r10, r6\n\t"
  54845. "adc r4, r4, r11\n\t"
  54846. #else
  54847. "umull r6, r7, r8, r7\n\t"
  54848. "adds r10, r10, r6\n\t"
  54849. "adc r4, r7, #0\n\t"
  54850. #endif
  54851. "adds r10, r10, r5\n\t"
  54852. "str r10, [%[a], #420]\n\t"
  54853. "adc r4, r4, #0\n\t"
  54854. /* a[i+106] += m[106] * mu */
  54855. "ldr r7, [%[m], #424]\n\t"
  54856. "ldr r10, [%[a], #424]\n\t"
  54857. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54858. "lsr r11, r7, #16\n\t"
  54859. "lsr r6, r8, #16\n\t"
  54860. "mul r5, r6, r11\n\t"
  54861. "lsl r11, r7, #16\n\t"
  54862. "lsr r11, r11, #16\n\t"
  54863. "mul r6, r11, r6\n\t"
  54864. "lsr r11, r6, #16\n\t"
  54865. "lsl r6, r6, #16\n\t"
  54866. "adds r10, r10, r6\n\t"
  54867. "adc r5, r5, r11\n\t"
  54868. "lsl r6, r8, #16\n\t"
  54869. "lsl r11, r7, #16\n\t"
  54870. "lsr r6, r6, #16\n\t"
  54871. "lsr r11, r11, #16\n\t"
  54872. "mul r11, r6, r11\n\t"
  54873. "adds r10, r10, r11\n\t"
  54874. "adc r5, r5, #0\n\t"
  54875. "lsr r11, r7, #16\n\t"
  54876. "mul r6, r11, r6\n\t"
  54877. "lsr r11, r6, #16\n\t"
  54878. "lsl r6, r6, #16\n\t"
  54879. "adds r10, r10, r6\n\t"
  54880. "adc r5, r5, r11\n\t"
  54881. #else
  54882. "umull r6, r7, r8, r7\n\t"
  54883. "adds r10, r10, r6\n\t"
  54884. "adc r5, r7, #0\n\t"
  54885. #endif
  54886. "adds r10, r10, r4\n\t"
  54887. "str r10, [%[a], #424]\n\t"
  54888. "adc r5, r5, #0\n\t"
  54889. /* a[i+107] += m[107] * mu */
  54890. "ldr r7, [%[m], #428]\n\t"
  54891. "ldr r10, [%[a], #428]\n\t"
  54892. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54893. "lsr r11, r7, #16\n\t"
  54894. "lsr r6, r8, #16\n\t"
  54895. "mul r4, r6, r11\n\t"
  54896. "lsl r11, r7, #16\n\t"
  54897. "lsr r11, r11, #16\n\t"
  54898. "mul r6, r11, r6\n\t"
  54899. "lsr r11, r6, #16\n\t"
  54900. "lsl r6, r6, #16\n\t"
  54901. "adds r10, r10, r6\n\t"
  54902. "adc r4, r4, r11\n\t"
  54903. "lsl r6, r8, #16\n\t"
  54904. "lsl r11, r7, #16\n\t"
  54905. "lsr r6, r6, #16\n\t"
  54906. "lsr r11, r11, #16\n\t"
  54907. "mul r11, r6, r11\n\t"
  54908. "adds r10, r10, r11\n\t"
  54909. "adc r4, r4, #0\n\t"
  54910. "lsr r11, r7, #16\n\t"
  54911. "mul r6, r11, r6\n\t"
  54912. "lsr r11, r6, #16\n\t"
  54913. "lsl r6, r6, #16\n\t"
  54914. "adds r10, r10, r6\n\t"
  54915. "adc r4, r4, r11\n\t"
  54916. #else
  54917. "umull r6, r7, r8, r7\n\t"
  54918. "adds r10, r10, r6\n\t"
  54919. "adc r4, r7, #0\n\t"
  54920. #endif
  54921. "adds r10, r10, r5\n\t"
  54922. "str r10, [%[a], #428]\n\t"
  54923. "adc r4, r4, #0\n\t"
  54924. /* a[i+108] += m[108] * mu */
  54925. "ldr r7, [%[m], #432]\n\t"
  54926. "ldr r10, [%[a], #432]\n\t"
  54927. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54928. "lsr r11, r7, #16\n\t"
  54929. "lsr r6, r8, #16\n\t"
  54930. "mul r5, r6, r11\n\t"
  54931. "lsl r11, r7, #16\n\t"
  54932. "lsr r11, r11, #16\n\t"
  54933. "mul r6, r11, r6\n\t"
  54934. "lsr r11, r6, #16\n\t"
  54935. "lsl r6, r6, #16\n\t"
  54936. "adds r10, r10, r6\n\t"
  54937. "adc r5, r5, r11\n\t"
  54938. "lsl r6, r8, #16\n\t"
  54939. "lsl r11, r7, #16\n\t"
  54940. "lsr r6, r6, #16\n\t"
  54941. "lsr r11, r11, #16\n\t"
  54942. "mul r11, r6, r11\n\t"
  54943. "adds r10, r10, r11\n\t"
  54944. "adc r5, r5, #0\n\t"
  54945. "lsr r11, r7, #16\n\t"
  54946. "mul r6, r11, r6\n\t"
  54947. "lsr r11, r6, #16\n\t"
  54948. "lsl r6, r6, #16\n\t"
  54949. "adds r10, r10, r6\n\t"
  54950. "adc r5, r5, r11\n\t"
  54951. #else
  54952. "umull r6, r7, r8, r7\n\t"
  54953. "adds r10, r10, r6\n\t"
  54954. "adc r5, r7, #0\n\t"
  54955. #endif
  54956. "adds r10, r10, r4\n\t"
  54957. "str r10, [%[a], #432]\n\t"
  54958. "adc r5, r5, #0\n\t"
  54959. /* a[i+109] += m[109] * mu */
  54960. "ldr r7, [%[m], #436]\n\t"
  54961. "ldr r10, [%[a], #436]\n\t"
  54962. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54963. "lsr r11, r7, #16\n\t"
  54964. "lsr r6, r8, #16\n\t"
  54965. "mul r4, r6, r11\n\t"
  54966. "lsl r11, r7, #16\n\t"
  54967. "lsr r11, r11, #16\n\t"
  54968. "mul r6, r11, r6\n\t"
  54969. "lsr r11, r6, #16\n\t"
  54970. "lsl r6, r6, #16\n\t"
  54971. "adds r10, r10, r6\n\t"
  54972. "adc r4, r4, r11\n\t"
  54973. "lsl r6, r8, #16\n\t"
  54974. "lsl r11, r7, #16\n\t"
  54975. "lsr r6, r6, #16\n\t"
  54976. "lsr r11, r11, #16\n\t"
  54977. "mul r11, r6, r11\n\t"
  54978. "adds r10, r10, r11\n\t"
  54979. "adc r4, r4, #0\n\t"
  54980. "lsr r11, r7, #16\n\t"
  54981. "mul r6, r11, r6\n\t"
  54982. "lsr r11, r6, #16\n\t"
  54983. "lsl r6, r6, #16\n\t"
  54984. "adds r10, r10, r6\n\t"
  54985. "adc r4, r4, r11\n\t"
  54986. #else
  54987. "umull r6, r7, r8, r7\n\t"
  54988. "adds r10, r10, r6\n\t"
  54989. "adc r4, r7, #0\n\t"
  54990. #endif
  54991. "adds r10, r10, r5\n\t"
  54992. "str r10, [%[a], #436]\n\t"
  54993. "adc r4, r4, #0\n\t"
  54994. /* a[i+110] += m[110] * mu */
  54995. "ldr r7, [%[m], #440]\n\t"
  54996. "ldr r10, [%[a], #440]\n\t"
  54997. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  54998. "lsr r11, r7, #16\n\t"
  54999. "lsr r6, r8, #16\n\t"
  55000. "mul r5, r6, r11\n\t"
  55001. "lsl r11, r7, #16\n\t"
  55002. "lsr r11, r11, #16\n\t"
  55003. "mul r6, r11, r6\n\t"
  55004. "lsr r11, r6, #16\n\t"
  55005. "lsl r6, r6, #16\n\t"
  55006. "adds r10, r10, r6\n\t"
  55007. "adc r5, r5, r11\n\t"
  55008. "lsl r6, r8, #16\n\t"
  55009. "lsl r11, r7, #16\n\t"
  55010. "lsr r6, r6, #16\n\t"
  55011. "lsr r11, r11, #16\n\t"
  55012. "mul r11, r6, r11\n\t"
  55013. "adds r10, r10, r11\n\t"
  55014. "adc r5, r5, #0\n\t"
  55015. "lsr r11, r7, #16\n\t"
  55016. "mul r6, r11, r6\n\t"
  55017. "lsr r11, r6, #16\n\t"
  55018. "lsl r6, r6, #16\n\t"
  55019. "adds r10, r10, r6\n\t"
  55020. "adc r5, r5, r11\n\t"
  55021. #else
  55022. "umull r6, r7, r8, r7\n\t"
  55023. "adds r10, r10, r6\n\t"
  55024. "adc r5, r7, #0\n\t"
  55025. #endif
  55026. "adds r10, r10, r4\n\t"
  55027. "str r10, [%[a], #440]\n\t"
  55028. "adc r5, r5, #0\n\t"
  55029. /* a[i+111] += m[111] * mu */
  55030. "ldr r7, [%[m], #444]\n\t"
  55031. "ldr r10, [%[a], #444]\n\t"
  55032. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55033. "lsr r11, r7, #16\n\t"
  55034. "lsr r6, r8, #16\n\t"
  55035. "mul r4, r6, r11\n\t"
  55036. "lsl r11, r7, #16\n\t"
  55037. "lsr r11, r11, #16\n\t"
  55038. "mul r6, r11, r6\n\t"
  55039. "lsr r11, r6, #16\n\t"
  55040. "lsl r6, r6, #16\n\t"
  55041. "adds r10, r10, r6\n\t"
  55042. "adc r4, r4, r11\n\t"
  55043. "lsl r6, r8, #16\n\t"
  55044. "lsl r11, r7, #16\n\t"
  55045. "lsr r6, r6, #16\n\t"
  55046. "lsr r11, r11, #16\n\t"
  55047. "mul r11, r6, r11\n\t"
  55048. "adds r10, r10, r11\n\t"
  55049. "adc r4, r4, #0\n\t"
  55050. "lsr r11, r7, #16\n\t"
  55051. "mul r6, r11, r6\n\t"
  55052. "lsr r11, r6, #16\n\t"
  55053. "lsl r6, r6, #16\n\t"
  55054. "adds r10, r10, r6\n\t"
  55055. "adc r4, r4, r11\n\t"
  55056. #else
  55057. "umull r6, r7, r8, r7\n\t"
  55058. "adds r10, r10, r6\n\t"
  55059. "adc r4, r7, #0\n\t"
  55060. #endif
  55061. "adds r10, r10, r5\n\t"
  55062. "str r10, [%[a], #444]\n\t"
  55063. "adc r4, r4, #0\n\t"
  55064. /* a[i+112] += m[112] * mu */
  55065. "ldr r7, [%[m], #448]\n\t"
  55066. "ldr r10, [%[a], #448]\n\t"
  55067. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55068. "lsr r11, r7, #16\n\t"
  55069. "lsr r6, r8, #16\n\t"
  55070. "mul r5, r6, r11\n\t"
  55071. "lsl r11, r7, #16\n\t"
  55072. "lsr r11, r11, #16\n\t"
  55073. "mul r6, r11, r6\n\t"
  55074. "lsr r11, r6, #16\n\t"
  55075. "lsl r6, r6, #16\n\t"
  55076. "adds r10, r10, r6\n\t"
  55077. "adc r5, r5, r11\n\t"
  55078. "lsl r6, r8, #16\n\t"
  55079. "lsl r11, r7, #16\n\t"
  55080. "lsr r6, r6, #16\n\t"
  55081. "lsr r11, r11, #16\n\t"
  55082. "mul r11, r6, r11\n\t"
  55083. "adds r10, r10, r11\n\t"
  55084. "adc r5, r5, #0\n\t"
  55085. "lsr r11, r7, #16\n\t"
  55086. "mul r6, r11, r6\n\t"
  55087. "lsr r11, r6, #16\n\t"
  55088. "lsl r6, r6, #16\n\t"
  55089. "adds r10, r10, r6\n\t"
  55090. "adc r5, r5, r11\n\t"
  55091. #else
  55092. "umull r6, r7, r8, r7\n\t"
  55093. "adds r10, r10, r6\n\t"
  55094. "adc r5, r7, #0\n\t"
  55095. #endif
  55096. "adds r10, r10, r4\n\t"
  55097. "str r10, [%[a], #448]\n\t"
  55098. "adc r5, r5, #0\n\t"
  55099. /* a[i+113] += m[113] * mu */
  55100. "ldr r7, [%[m], #452]\n\t"
  55101. "ldr r10, [%[a], #452]\n\t"
  55102. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55103. "lsr r11, r7, #16\n\t"
  55104. "lsr r6, r8, #16\n\t"
  55105. "mul r4, r6, r11\n\t"
  55106. "lsl r11, r7, #16\n\t"
  55107. "lsr r11, r11, #16\n\t"
  55108. "mul r6, r11, r6\n\t"
  55109. "lsr r11, r6, #16\n\t"
  55110. "lsl r6, r6, #16\n\t"
  55111. "adds r10, r10, r6\n\t"
  55112. "adc r4, r4, r11\n\t"
  55113. "lsl r6, r8, #16\n\t"
  55114. "lsl r11, r7, #16\n\t"
  55115. "lsr r6, r6, #16\n\t"
  55116. "lsr r11, r11, #16\n\t"
  55117. "mul r11, r6, r11\n\t"
  55118. "adds r10, r10, r11\n\t"
  55119. "adc r4, r4, #0\n\t"
  55120. "lsr r11, r7, #16\n\t"
  55121. "mul r6, r11, r6\n\t"
  55122. "lsr r11, r6, #16\n\t"
  55123. "lsl r6, r6, #16\n\t"
  55124. "adds r10, r10, r6\n\t"
  55125. "adc r4, r4, r11\n\t"
  55126. #else
  55127. "umull r6, r7, r8, r7\n\t"
  55128. "adds r10, r10, r6\n\t"
  55129. "adc r4, r7, #0\n\t"
  55130. #endif
  55131. "adds r10, r10, r5\n\t"
  55132. "str r10, [%[a], #452]\n\t"
  55133. "adc r4, r4, #0\n\t"
  55134. /* a[i+114] += m[114] * mu */
  55135. "ldr r7, [%[m], #456]\n\t"
  55136. "ldr r10, [%[a], #456]\n\t"
  55137. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55138. "lsr r11, r7, #16\n\t"
  55139. "lsr r6, r8, #16\n\t"
  55140. "mul r5, r6, r11\n\t"
  55141. "lsl r11, r7, #16\n\t"
  55142. "lsr r11, r11, #16\n\t"
  55143. "mul r6, r11, r6\n\t"
  55144. "lsr r11, r6, #16\n\t"
  55145. "lsl r6, r6, #16\n\t"
  55146. "adds r10, r10, r6\n\t"
  55147. "adc r5, r5, r11\n\t"
  55148. "lsl r6, r8, #16\n\t"
  55149. "lsl r11, r7, #16\n\t"
  55150. "lsr r6, r6, #16\n\t"
  55151. "lsr r11, r11, #16\n\t"
  55152. "mul r11, r6, r11\n\t"
  55153. "adds r10, r10, r11\n\t"
  55154. "adc r5, r5, #0\n\t"
  55155. "lsr r11, r7, #16\n\t"
  55156. "mul r6, r11, r6\n\t"
  55157. "lsr r11, r6, #16\n\t"
  55158. "lsl r6, r6, #16\n\t"
  55159. "adds r10, r10, r6\n\t"
  55160. "adc r5, r5, r11\n\t"
  55161. #else
  55162. "umull r6, r7, r8, r7\n\t"
  55163. "adds r10, r10, r6\n\t"
  55164. "adc r5, r7, #0\n\t"
  55165. #endif
  55166. "adds r10, r10, r4\n\t"
  55167. "str r10, [%[a], #456]\n\t"
  55168. "adc r5, r5, #0\n\t"
  55169. /* a[i+115] += m[115] * mu */
  55170. "ldr r7, [%[m], #460]\n\t"
  55171. "ldr r10, [%[a], #460]\n\t"
  55172. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55173. "lsr r11, r7, #16\n\t"
  55174. "lsr r6, r8, #16\n\t"
  55175. "mul r4, r6, r11\n\t"
  55176. "lsl r11, r7, #16\n\t"
  55177. "lsr r11, r11, #16\n\t"
  55178. "mul r6, r11, r6\n\t"
  55179. "lsr r11, r6, #16\n\t"
  55180. "lsl r6, r6, #16\n\t"
  55181. "adds r10, r10, r6\n\t"
  55182. "adc r4, r4, r11\n\t"
  55183. "lsl r6, r8, #16\n\t"
  55184. "lsl r11, r7, #16\n\t"
  55185. "lsr r6, r6, #16\n\t"
  55186. "lsr r11, r11, #16\n\t"
  55187. "mul r11, r6, r11\n\t"
  55188. "adds r10, r10, r11\n\t"
  55189. "adc r4, r4, #0\n\t"
  55190. "lsr r11, r7, #16\n\t"
  55191. "mul r6, r11, r6\n\t"
  55192. "lsr r11, r6, #16\n\t"
  55193. "lsl r6, r6, #16\n\t"
  55194. "adds r10, r10, r6\n\t"
  55195. "adc r4, r4, r11\n\t"
  55196. #else
  55197. "umull r6, r7, r8, r7\n\t"
  55198. "adds r10, r10, r6\n\t"
  55199. "adc r4, r7, #0\n\t"
  55200. #endif
  55201. "adds r10, r10, r5\n\t"
  55202. "str r10, [%[a], #460]\n\t"
  55203. "adc r4, r4, #0\n\t"
  55204. /* a[i+116] += m[116] * mu */
  55205. "ldr r7, [%[m], #464]\n\t"
  55206. "ldr r10, [%[a], #464]\n\t"
  55207. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55208. "lsr r11, r7, #16\n\t"
  55209. "lsr r6, r8, #16\n\t"
  55210. "mul r5, r6, r11\n\t"
  55211. "lsl r11, r7, #16\n\t"
  55212. "lsr r11, r11, #16\n\t"
  55213. "mul r6, r11, r6\n\t"
  55214. "lsr r11, r6, #16\n\t"
  55215. "lsl r6, r6, #16\n\t"
  55216. "adds r10, r10, r6\n\t"
  55217. "adc r5, r5, r11\n\t"
  55218. "lsl r6, r8, #16\n\t"
  55219. "lsl r11, r7, #16\n\t"
  55220. "lsr r6, r6, #16\n\t"
  55221. "lsr r11, r11, #16\n\t"
  55222. "mul r11, r6, r11\n\t"
  55223. "adds r10, r10, r11\n\t"
  55224. "adc r5, r5, #0\n\t"
  55225. "lsr r11, r7, #16\n\t"
  55226. "mul r6, r11, r6\n\t"
  55227. "lsr r11, r6, #16\n\t"
  55228. "lsl r6, r6, #16\n\t"
  55229. "adds r10, r10, r6\n\t"
  55230. "adc r5, r5, r11\n\t"
  55231. #else
  55232. "umull r6, r7, r8, r7\n\t"
  55233. "adds r10, r10, r6\n\t"
  55234. "adc r5, r7, #0\n\t"
  55235. #endif
  55236. "adds r10, r10, r4\n\t"
  55237. "str r10, [%[a], #464]\n\t"
  55238. "adc r5, r5, #0\n\t"
  55239. /* a[i+117] += m[117] * mu */
  55240. "ldr r7, [%[m], #468]\n\t"
  55241. "ldr r10, [%[a], #468]\n\t"
  55242. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55243. "lsr r11, r7, #16\n\t"
  55244. "lsr r6, r8, #16\n\t"
  55245. "mul r4, r6, r11\n\t"
  55246. "lsl r11, r7, #16\n\t"
  55247. "lsr r11, r11, #16\n\t"
  55248. "mul r6, r11, r6\n\t"
  55249. "lsr r11, r6, #16\n\t"
  55250. "lsl r6, r6, #16\n\t"
  55251. "adds r10, r10, r6\n\t"
  55252. "adc r4, r4, r11\n\t"
  55253. "lsl r6, r8, #16\n\t"
  55254. "lsl r11, r7, #16\n\t"
  55255. "lsr r6, r6, #16\n\t"
  55256. "lsr r11, r11, #16\n\t"
  55257. "mul r11, r6, r11\n\t"
  55258. "adds r10, r10, r11\n\t"
  55259. "adc r4, r4, #0\n\t"
  55260. "lsr r11, r7, #16\n\t"
  55261. "mul r6, r11, r6\n\t"
  55262. "lsr r11, r6, #16\n\t"
  55263. "lsl r6, r6, #16\n\t"
  55264. "adds r10, r10, r6\n\t"
  55265. "adc r4, r4, r11\n\t"
  55266. #else
  55267. "umull r6, r7, r8, r7\n\t"
  55268. "adds r10, r10, r6\n\t"
  55269. "adc r4, r7, #0\n\t"
  55270. #endif
  55271. "adds r10, r10, r5\n\t"
  55272. "str r10, [%[a], #468]\n\t"
  55273. "adc r4, r4, #0\n\t"
  55274. /* a[i+118] += m[118] * mu */
  55275. "ldr r7, [%[m], #472]\n\t"
  55276. "ldr r10, [%[a], #472]\n\t"
  55277. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55278. "lsr r11, r7, #16\n\t"
  55279. "lsr r6, r8, #16\n\t"
  55280. "mul r5, r6, r11\n\t"
  55281. "lsl r11, r7, #16\n\t"
  55282. "lsr r11, r11, #16\n\t"
  55283. "mul r6, r11, r6\n\t"
  55284. "lsr r11, r6, #16\n\t"
  55285. "lsl r6, r6, #16\n\t"
  55286. "adds r10, r10, r6\n\t"
  55287. "adc r5, r5, r11\n\t"
  55288. "lsl r6, r8, #16\n\t"
  55289. "lsl r11, r7, #16\n\t"
  55290. "lsr r6, r6, #16\n\t"
  55291. "lsr r11, r11, #16\n\t"
  55292. "mul r11, r6, r11\n\t"
  55293. "adds r10, r10, r11\n\t"
  55294. "adc r5, r5, #0\n\t"
  55295. "lsr r11, r7, #16\n\t"
  55296. "mul r6, r11, r6\n\t"
  55297. "lsr r11, r6, #16\n\t"
  55298. "lsl r6, r6, #16\n\t"
  55299. "adds r10, r10, r6\n\t"
  55300. "adc r5, r5, r11\n\t"
  55301. #else
  55302. "umull r6, r7, r8, r7\n\t"
  55303. "adds r10, r10, r6\n\t"
  55304. "adc r5, r7, #0\n\t"
  55305. #endif
  55306. "adds r10, r10, r4\n\t"
  55307. "str r10, [%[a], #472]\n\t"
  55308. "adc r5, r5, #0\n\t"
  55309. /* a[i+119] += m[119] * mu */
  55310. "ldr r7, [%[m], #476]\n\t"
  55311. "ldr r10, [%[a], #476]\n\t"
  55312. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55313. "lsr r11, r7, #16\n\t"
  55314. "lsr r6, r8, #16\n\t"
  55315. "mul r4, r6, r11\n\t"
  55316. "lsl r11, r7, #16\n\t"
  55317. "lsr r11, r11, #16\n\t"
  55318. "mul r6, r11, r6\n\t"
  55319. "lsr r11, r6, #16\n\t"
  55320. "lsl r6, r6, #16\n\t"
  55321. "adds r10, r10, r6\n\t"
  55322. "adc r4, r4, r11\n\t"
  55323. "lsl r6, r8, #16\n\t"
  55324. "lsl r11, r7, #16\n\t"
  55325. "lsr r6, r6, #16\n\t"
  55326. "lsr r11, r11, #16\n\t"
  55327. "mul r11, r6, r11\n\t"
  55328. "adds r10, r10, r11\n\t"
  55329. "adc r4, r4, #0\n\t"
  55330. "lsr r11, r7, #16\n\t"
  55331. "mul r6, r11, r6\n\t"
  55332. "lsr r11, r6, #16\n\t"
  55333. "lsl r6, r6, #16\n\t"
  55334. "adds r10, r10, r6\n\t"
  55335. "adc r4, r4, r11\n\t"
  55336. #else
  55337. "umull r6, r7, r8, r7\n\t"
  55338. "adds r10, r10, r6\n\t"
  55339. "adc r4, r7, #0\n\t"
  55340. #endif
  55341. "adds r10, r10, r5\n\t"
  55342. "str r10, [%[a], #476]\n\t"
  55343. "adc r4, r4, #0\n\t"
  55344. /* a[i+120] += m[120] * mu */
  55345. "ldr r7, [%[m], #480]\n\t"
  55346. "ldr r10, [%[a], #480]\n\t"
  55347. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55348. "lsr r11, r7, #16\n\t"
  55349. "lsr r6, r8, #16\n\t"
  55350. "mul r5, r6, r11\n\t"
  55351. "lsl r11, r7, #16\n\t"
  55352. "lsr r11, r11, #16\n\t"
  55353. "mul r6, r11, r6\n\t"
  55354. "lsr r11, r6, #16\n\t"
  55355. "lsl r6, r6, #16\n\t"
  55356. "adds r10, r10, r6\n\t"
  55357. "adc r5, r5, r11\n\t"
  55358. "lsl r6, r8, #16\n\t"
  55359. "lsl r11, r7, #16\n\t"
  55360. "lsr r6, r6, #16\n\t"
  55361. "lsr r11, r11, #16\n\t"
  55362. "mul r11, r6, r11\n\t"
  55363. "adds r10, r10, r11\n\t"
  55364. "adc r5, r5, #0\n\t"
  55365. "lsr r11, r7, #16\n\t"
  55366. "mul r6, r11, r6\n\t"
  55367. "lsr r11, r6, #16\n\t"
  55368. "lsl r6, r6, #16\n\t"
  55369. "adds r10, r10, r6\n\t"
  55370. "adc r5, r5, r11\n\t"
  55371. #else
  55372. "umull r6, r7, r8, r7\n\t"
  55373. "adds r10, r10, r6\n\t"
  55374. "adc r5, r7, #0\n\t"
  55375. #endif
  55376. "adds r10, r10, r4\n\t"
  55377. "str r10, [%[a], #480]\n\t"
  55378. "adc r5, r5, #0\n\t"
  55379. /* a[i+121] += m[121] * mu */
  55380. "ldr r7, [%[m], #484]\n\t"
  55381. "ldr r10, [%[a], #484]\n\t"
  55382. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55383. "lsr r11, r7, #16\n\t"
  55384. "lsr r6, r8, #16\n\t"
  55385. "mul r4, r6, r11\n\t"
  55386. "lsl r11, r7, #16\n\t"
  55387. "lsr r11, r11, #16\n\t"
  55388. "mul r6, r11, r6\n\t"
  55389. "lsr r11, r6, #16\n\t"
  55390. "lsl r6, r6, #16\n\t"
  55391. "adds r10, r10, r6\n\t"
  55392. "adc r4, r4, r11\n\t"
  55393. "lsl r6, r8, #16\n\t"
  55394. "lsl r11, r7, #16\n\t"
  55395. "lsr r6, r6, #16\n\t"
  55396. "lsr r11, r11, #16\n\t"
  55397. "mul r11, r6, r11\n\t"
  55398. "adds r10, r10, r11\n\t"
  55399. "adc r4, r4, #0\n\t"
  55400. "lsr r11, r7, #16\n\t"
  55401. "mul r6, r11, r6\n\t"
  55402. "lsr r11, r6, #16\n\t"
  55403. "lsl r6, r6, #16\n\t"
  55404. "adds r10, r10, r6\n\t"
  55405. "adc r4, r4, r11\n\t"
  55406. #else
  55407. "umull r6, r7, r8, r7\n\t"
  55408. "adds r10, r10, r6\n\t"
  55409. "adc r4, r7, #0\n\t"
  55410. #endif
  55411. "adds r10, r10, r5\n\t"
  55412. "str r10, [%[a], #484]\n\t"
  55413. "adc r4, r4, #0\n\t"
  55414. /* a[i+122] += m[122] * mu */
  55415. "ldr r7, [%[m], #488]\n\t"
  55416. "ldr r10, [%[a], #488]\n\t"
  55417. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55418. "lsr r11, r7, #16\n\t"
  55419. "lsr r6, r8, #16\n\t"
  55420. "mul r5, r6, r11\n\t"
  55421. "lsl r11, r7, #16\n\t"
  55422. "lsr r11, r11, #16\n\t"
  55423. "mul r6, r11, r6\n\t"
  55424. "lsr r11, r6, #16\n\t"
  55425. "lsl r6, r6, #16\n\t"
  55426. "adds r10, r10, r6\n\t"
  55427. "adc r5, r5, r11\n\t"
  55428. "lsl r6, r8, #16\n\t"
  55429. "lsl r11, r7, #16\n\t"
  55430. "lsr r6, r6, #16\n\t"
  55431. "lsr r11, r11, #16\n\t"
  55432. "mul r11, r6, r11\n\t"
  55433. "adds r10, r10, r11\n\t"
  55434. "adc r5, r5, #0\n\t"
  55435. "lsr r11, r7, #16\n\t"
  55436. "mul r6, r11, r6\n\t"
  55437. "lsr r11, r6, #16\n\t"
  55438. "lsl r6, r6, #16\n\t"
  55439. "adds r10, r10, r6\n\t"
  55440. "adc r5, r5, r11\n\t"
  55441. #else
  55442. "umull r6, r7, r8, r7\n\t"
  55443. "adds r10, r10, r6\n\t"
  55444. "adc r5, r7, #0\n\t"
  55445. #endif
  55446. "adds r10, r10, r4\n\t"
  55447. "str r10, [%[a], #488]\n\t"
  55448. "adc r5, r5, #0\n\t"
  55449. /* a[i+123] += m[123] * mu */
  55450. "ldr r7, [%[m], #492]\n\t"
  55451. "ldr r10, [%[a], #492]\n\t"
  55452. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55453. "lsr r11, r7, #16\n\t"
  55454. "lsr r6, r8, #16\n\t"
  55455. "mul r4, r6, r11\n\t"
  55456. "lsl r11, r7, #16\n\t"
  55457. "lsr r11, r11, #16\n\t"
  55458. "mul r6, r11, r6\n\t"
  55459. "lsr r11, r6, #16\n\t"
  55460. "lsl r6, r6, #16\n\t"
  55461. "adds r10, r10, r6\n\t"
  55462. "adc r4, r4, r11\n\t"
  55463. "lsl r6, r8, #16\n\t"
  55464. "lsl r11, r7, #16\n\t"
  55465. "lsr r6, r6, #16\n\t"
  55466. "lsr r11, r11, #16\n\t"
  55467. "mul r11, r6, r11\n\t"
  55468. "adds r10, r10, r11\n\t"
  55469. "adc r4, r4, #0\n\t"
  55470. "lsr r11, r7, #16\n\t"
  55471. "mul r6, r11, r6\n\t"
  55472. "lsr r11, r6, #16\n\t"
  55473. "lsl r6, r6, #16\n\t"
  55474. "adds r10, r10, r6\n\t"
  55475. "adc r4, r4, r11\n\t"
  55476. #else
  55477. "umull r6, r7, r8, r7\n\t"
  55478. "adds r10, r10, r6\n\t"
  55479. "adc r4, r7, #0\n\t"
  55480. #endif
  55481. "adds r10, r10, r5\n\t"
  55482. "str r10, [%[a], #492]\n\t"
  55483. "adc r4, r4, #0\n\t"
  55484. /* a[i+124] += m[124] * mu */
  55485. "ldr r7, [%[m], #496]\n\t"
  55486. "ldr r10, [%[a], #496]\n\t"
  55487. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55488. "lsr r11, r7, #16\n\t"
  55489. "lsr r6, r8, #16\n\t"
  55490. "mul r5, r6, r11\n\t"
  55491. "lsl r11, r7, #16\n\t"
  55492. "lsr r11, r11, #16\n\t"
  55493. "mul r6, r11, r6\n\t"
  55494. "lsr r11, r6, #16\n\t"
  55495. "lsl r6, r6, #16\n\t"
  55496. "adds r10, r10, r6\n\t"
  55497. "adc r5, r5, r11\n\t"
  55498. "lsl r6, r8, #16\n\t"
  55499. "lsl r11, r7, #16\n\t"
  55500. "lsr r6, r6, #16\n\t"
  55501. "lsr r11, r11, #16\n\t"
  55502. "mul r11, r6, r11\n\t"
  55503. "adds r10, r10, r11\n\t"
  55504. "adc r5, r5, #0\n\t"
  55505. "lsr r11, r7, #16\n\t"
  55506. "mul r6, r11, r6\n\t"
  55507. "lsr r11, r6, #16\n\t"
  55508. "lsl r6, r6, #16\n\t"
  55509. "adds r10, r10, r6\n\t"
  55510. "adc r5, r5, r11\n\t"
  55511. #else
  55512. "umull r6, r7, r8, r7\n\t"
  55513. "adds r10, r10, r6\n\t"
  55514. "adc r5, r7, #0\n\t"
  55515. #endif
  55516. "adds r10, r10, r4\n\t"
  55517. "str r10, [%[a], #496]\n\t"
  55518. "adc r5, r5, #0\n\t"
  55519. /* a[i+125] += m[125] * mu */
  55520. "ldr r7, [%[m], #500]\n\t"
  55521. "ldr r10, [%[a], #500]\n\t"
  55522. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55523. "lsr r11, r7, #16\n\t"
  55524. "lsr r6, r8, #16\n\t"
  55525. "mul r4, r6, r11\n\t"
  55526. "lsl r11, r7, #16\n\t"
  55527. "lsr r11, r11, #16\n\t"
  55528. "mul r6, r11, r6\n\t"
  55529. "lsr r11, r6, #16\n\t"
  55530. "lsl r6, r6, #16\n\t"
  55531. "adds r10, r10, r6\n\t"
  55532. "adc r4, r4, r11\n\t"
  55533. "lsl r6, r8, #16\n\t"
  55534. "lsl r11, r7, #16\n\t"
  55535. "lsr r6, r6, #16\n\t"
  55536. "lsr r11, r11, #16\n\t"
  55537. "mul r11, r6, r11\n\t"
  55538. "adds r10, r10, r11\n\t"
  55539. "adc r4, r4, #0\n\t"
  55540. "lsr r11, r7, #16\n\t"
  55541. "mul r6, r11, r6\n\t"
  55542. "lsr r11, r6, #16\n\t"
  55543. "lsl r6, r6, #16\n\t"
  55544. "adds r10, r10, r6\n\t"
  55545. "adc r4, r4, r11\n\t"
  55546. #else
  55547. "umull r6, r7, r8, r7\n\t"
  55548. "adds r10, r10, r6\n\t"
  55549. "adc r4, r7, #0\n\t"
  55550. #endif
  55551. "adds r10, r10, r5\n\t"
  55552. "str r10, [%[a], #500]\n\t"
  55553. "adc r4, r4, #0\n\t"
  55554. /* a[i+126] += m[126] * mu */
  55555. "ldr r7, [%[m], #504]\n\t"
  55556. "ldr r10, [%[a], #504]\n\t"
  55557. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55558. "lsr r11, r7, #16\n\t"
  55559. "lsr r6, r8, #16\n\t"
  55560. "mul r5, r6, r11\n\t"
  55561. "lsl r11, r7, #16\n\t"
  55562. "lsr r11, r11, #16\n\t"
  55563. "mul r6, r11, r6\n\t"
  55564. "lsr r11, r6, #16\n\t"
  55565. "lsl r6, r6, #16\n\t"
  55566. "adds r10, r10, r6\n\t"
  55567. "adc r5, r5, r11\n\t"
  55568. "lsl r6, r8, #16\n\t"
  55569. "lsl r11, r7, #16\n\t"
  55570. "lsr r6, r6, #16\n\t"
  55571. "lsr r11, r11, #16\n\t"
  55572. "mul r11, r6, r11\n\t"
  55573. "adds r10, r10, r11\n\t"
  55574. "adc r5, r5, #0\n\t"
  55575. "lsr r11, r7, #16\n\t"
  55576. "mul r6, r11, r6\n\t"
  55577. "lsr r11, r6, #16\n\t"
  55578. "lsl r6, r6, #16\n\t"
  55579. "adds r10, r10, r6\n\t"
  55580. "adc r5, r5, r11\n\t"
  55581. #else
  55582. "umull r6, r7, r8, r7\n\t"
  55583. "adds r10, r10, r6\n\t"
  55584. "adc r5, r7, #0\n\t"
  55585. #endif
  55586. "adds r10, r10, r4\n\t"
  55587. "str r10, [%[a], #504]\n\t"
  55588. "adc r5, r5, #0\n\t"
  55589. /* a[i+127] += m[127] * mu */
  55590. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  55591. "ldr r7, [%[m], #508]\n\t"
  55592. #else
  55593. "ldr r11, [%[m], #508]\n\t"
  55594. #endif
  55595. "ldr r10, [%[a], #508]\n\t"
  55596. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  55597. "lsl r6, r8, #16\n\t"
  55598. "lsl r7, r11, #16\n\t"
  55599. "lsr r6, r6, #16\n\t"
  55600. "lsr r7, r7, #16\n\t"
  55601. "mul r7, r6, r7\n\t"
  55602. "adds r5, r5, r7\n\t"
  55603. "adcs r4, r3, #0\n\t"
  55604. "mov r3, #0\n\t"
  55605. "adc r3, r3, r3\n\t"
  55606. "lsr r7, r11, #16\n\t"
  55607. "mul r6, r7, r6\n\t"
  55608. "lsr r7, r6, #16\n\t"
  55609. "lsl r6, r6, #16\n\t"
  55610. "adds r5, r5, r6\n\t"
  55611. "adcs r4, r4, r7\n\t"
  55612. "adc r3, r3, #0\n\t"
  55613. "mov r6, r8\n\t"
  55614. "lsr r7, r11, #16\n\t"
  55615. "lsr r6, r6, #16\n\t"
  55616. "mul r7, r6, r7\n\t"
  55617. "adds r4, r4, r7\n\t"
  55618. "lsl r7, r11, #16\n\t"
  55619. "adc r3, r3, #0\n\t"
  55620. "lsr r7, r7, #16\n\t"
  55621. "mul r6, r7, r6\n\t"
  55622. "lsr r7, r6, #16\n\t"
  55623. "lsl r6, r6, #16\n\t"
  55624. "adds r5, r5, r6\n\t"
  55625. "adcs r4, r4, r7\n\t"
  55626. "adc r3, r3, #0\n\t"
  55627. #else
  55628. "umull r6, r7, r8, r7\n\t"
  55629. "adds r5, r5, r6\n\t"
  55630. "adcs r4, r7, r3\n\t"
  55631. "mov r3, #0\n\t"
  55632. "adc r3, r3, r3\n\t"
  55633. #endif
  55634. "adds r10, r10, r5\n\t"
  55635. "str r10, [%[a], #508]\n\t"
  55636. "ldr r10, [%[a], #512]\n\t"
  55637. "adcs r10, r10, r4\n\t"
  55638. "str r10, [%[a], #512]\n\t"
  55639. "adc r3, r3, #0\n\t"
  55640. /* i += 1 */
  55641. "add r9, r9, #4\n\t"
  55642. "add %[a], %[a], #4\n\t"
  55643. "cmp r9, #0x200\n\t"
  55644. "blt L_sp_4096_mont_reduce_128_word_%=\n\t"
  55645. "str r12, [%[a]]\n\t"
  55646. "str lr, [%[a], #4]\n\t"
  55647. "mov %[mp], r3\n\t"
  55648. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  55649. :
  55650. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  55651. );
  55652. sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp);
  55653. }
  55654. /* Multiply two Montgomery form numbers mod the modulus (prime).
  55655. * (r = a * b mod m)
  55656. *
  55657. * r Result of multiplication.
  55658. * a First number to multiply in Montgomery form.
  55659. * b Second number to multiply in Montgomery form.
  55660. * m Modulus (prime).
  55661. * mp Montgomery mulitplier.
  55662. */
  55663. SP_NOINLINE static void sp_4096_mont_mul_128(sp_digit* r, const sp_digit* a,
  55664. const sp_digit* b, const sp_digit* m, sp_digit mp)
  55665. {
  55666. sp_4096_mul_128(r, a, b);
  55667. sp_4096_mont_reduce_128(r, m, mp);
  55668. }
  55669. /* Square the Montgomery form number. (r = a * a mod m)
  55670. *
  55671. * r Result of squaring.
  55672. * a Number to square in Montgomery form.
  55673. * m Modulus (prime).
  55674. * mp Montgomery mulitplier.
  55675. */
  55676. SP_NOINLINE static void sp_4096_mont_sqr_128(sp_digit* r, const sp_digit* a,
  55677. const sp_digit* m, sp_digit mp)
  55678. {
  55679. sp_4096_sqr_128(r, a);
  55680. sp_4096_mont_reduce_128(r, m, mp);
  55681. }
  55682. #ifdef WOLFSSL_SP_SMALL
  55683. /* Sub b from a into r. (r = a - b)
  55684. *
  55685. * r A single precision integer.
  55686. * a A single precision integer.
  55687. * b A single precision integer.
  55688. */
  55689. static sp_digit sp_4096_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  55690. {
  55691. register sp_digit* r asm ("r0") = r_p;
  55692. register const sp_digit* a asm ("r1") = a_p;
  55693. register const sp_digit* b asm ("r2") = b_p;
  55694. __asm__ __volatile__ (
  55695. "mov r12, #0\n\t"
  55696. "add lr, %[a], #0x200\n\t"
  55697. "\n"
  55698. "L_sp_4096_sub_128_word_%=: \n\t"
  55699. "rsbs r12, r12, #0\n\t"
  55700. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55701. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55702. "sbcs r3, r3, r7\n\t"
  55703. "sbcs r4, r4, r8\n\t"
  55704. "sbcs r5, r5, r9\n\t"
  55705. "sbcs r6, r6, r10\n\t"
  55706. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55707. "sbc r12, r3, r3\n\t"
  55708. "cmp %[a], lr\n\t"
  55709. "bne L_sp_4096_sub_128_word_%=\n\t"
  55710. "mov %[r], r12\n\t"
  55711. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  55712. :
  55713. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr"
  55714. );
  55715. return (uint32_t)(size_t)r;
  55716. }
  55717. #else
  55718. /* Sub b from a into r. (r = a - b)
  55719. *
  55720. * r A single precision integer.
  55721. * a A single precision integer.
  55722. * b A single precision integer.
  55723. */
  55724. static sp_digit sp_4096_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  55725. {
  55726. register sp_digit* r asm ("r0") = r_p;
  55727. register const sp_digit* a asm ("r1") = a_p;
  55728. register const sp_digit* b asm ("r2") = b_p;
  55729. __asm__ __volatile__ (
  55730. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55731. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55732. "subs r3, r3, r7\n\t"
  55733. "sbcs r4, r4, r8\n\t"
  55734. "sbcs r5, r5, r9\n\t"
  55735. "sbcs r6, r6, r10\n\t"
  55736. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55737. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55738. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55739. "sbcs r3, r3, r7\n\t"
  55740. "sbcs r4, r4, r8\n\t"
  55741. "sbcs r5, r5, r9\n\t"
  55742. "sbcs r6, r6, r10\n\t"
  55743. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55744. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55745. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55746. "sbcs r3, r3, r7\n\t"
  55747. "sbcs r4, r4, r8\n\t"
  55748. "sbcs r5, r5, r9\n\t"
  55749. "sbcs r6, r6, r10\n\t"
  55750. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55751. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55752. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55753. "sbcs r3, r3, r7\n\t"
  55754. "sbcs r4, r4, r8\n\t"
  55755. "sbcs r5, r5, r9\n\t"
  55756. "sbcs r6, r6, r10\n\t"
  55757. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55758. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55759. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55760. "sbcs r3, r3, r7\n\t"
  55761. "sbcs r4, r4, r8\n\t"
  55762. "sbcs r5, r5, r9\n\t"
  55763. "sbcs r6, r6, r10\n\t"
  55764. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55765. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55766. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55767. "sbcs r3, r3, r7\n\t"
  55768. "sbcs r4, r4, r8\n\t"
  55769. "sbcs r5, r5, r9\n\t"
  55770. "sbcs r6, r6, r10\n\t"
  55771. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55772. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55773. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55774. "sbcs r3, r3, r7\n\t"
  55775. "sbcs r4, r4, r8\n\t"
  55776. "sbcs r5, r5, r9\n\t"
  55777. "sbcs r6, r6, r10\n\t"
  55778. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55779. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55780. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55781. "sbcs r3, r3, r7\n\t"
  55782. "sbcs r4, r4, r8\n\t"
  55783. "sbcs r5, r5, r9\n\t"
  55784. "sbcs r6, r6, r10\n\t"
  55785. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55786. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55787. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55788. "sbcs r3, r3, r7\n\t"
  55789. "sbcs r4, r4, r8\n\t"
  55790. "sbcs r5, r5, r9\n\t"
  55791. "sbcs r6, r6, r10\n\t"
  55792. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55793. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55794. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55795. "sbcs r3, r3, r7\n\t"
  55796. "sbcs r4, r4, r8\n\t"
  55797. "sbcs r5, r5, r9\n\t"
  55798. "sbcs r6, r6, r10\n\t"
  55799. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55800. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55801. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55802. "sbcs r3, r3, r7\n\t"
  55803. "sbcs r4, r4, r8\n\t"
  55804. "sbcs r5, r5, r9\n\t"
  55805. "sbcs r6, r6, r10\n\t"
  55806. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55807. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55808. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55809. "sbcs r3, r3, r7\n\t"
  55810. "sbcs r4, r4, r8\n\t"
  55811. "sbcs r5, r5, r9\n\t"
  55812. "sbcs r6, r6, r10\n\t"
  55813. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55814. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55815. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55816. "sbcs r3, r3, r7\n\t"
  55817. "sbcs r4, r4, r8\n\t"
  55818. "sbcs r5, r5, r9\n\t"
  55819. "sbcs r6, r6, r10\n\t"
  55820. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55821. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55822. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55823. "sbcs r3, r3, r7\n\t"
  55824. "sbcs r4, r4, r8\n\t"
  55825. "sbcs r5, r5, r9\n\t"
  55826. "sbcs r6, r6, r10\n\t"
  55827. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55828. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55829. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55830. "sbcs r3, r3, r7\n\t"
  55831. "sbcs r4, r4, r8\n\t"
  55832. "sbcs r5, r5, r9\n\t"
  55833. "sbcs r6, r6, r10\n\t"
  55834. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55835. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55836. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55837. "sbcs r3, r3, r7\n\t"
  55838. "sbcs r4, r4, r8\n\t"
  55839. "sbcs r5, r5, r9\n\t"
  55840. "sbcs r6, r6, r10\n\t"
  55841. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55842. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55843. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55844. "sbcs r3, r3, r7\n\t"
  55845. "sbcs r4, r4, r8\n\t"
  55846. "sbcs r5, r5, r9\n\t"
  55847. "sbcs r6, r6, r10\n\t"
  55848. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55849. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55850. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55851. "sbcs r3, r3, r7\n\t"
  55852. "sbcs r4, r4, r8\n\t"
  55853. "sbcs r5, r5, r9\n\t"
  55854. "sbcs r6, r6, r10\n\t"
  55855. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55856. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55857. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55858. "sbcs r3, r3, r7\n\t"
  55859. "sbcs r4, r4, r8\n\t"
  55860. "sbcs r5, r5, r9\n\t"
  55861. "sbcs r6, r6, r10\n\t"
  55862. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55863. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55864. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55865. "sbcs r3, r3, r7\n\t"
  55866. "sbcs r4, r4, r8\n\t"
  55867. "sbcs r5, r5, r9\n\t"
  55868. "sbcs r6, r6, r10\n\t"
  55869. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55870. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55871. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55872. "sbcs r3, r3, r7\n\t"
  55873. "sbcs r4, r4, r8\n\t"
  55874. "sbcs r5, r5, r9\n\t"
  55875. "sbcs r6, r6, r10\n\t"
  55876. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55877. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55878. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55879. "sbcs r3, r3, r7\n\t"
  55880. "sbcs r4, r4, r8\n\t"
  55881. "sbcs r5, r5, r9\n\t"
  55882. "sbcs r6, r6, r10\n\t"
  55883. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55884. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55885. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55886. "sbcs r3, r3, r7\n\t"
  55887. "sbcs r4, r4, r8\n\t"
  55888. "sbcs r5, r5, r9\n\t"
  55889. "sbcs r6, r6, r10\n\t"
  55890. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55891. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55892. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55893. "sbcs r3, r3, r7\n\t"
  55894. "sbcs r4, r4, r8\n\t"
  55895. "sbcs r5, r5, r9\n\t"
  55896. "sbcs r6, r6, r10\n\t"
  55897. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55898. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55899. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55900. "sbcs r3, r3, r7\n\t"
  55901. "sbcs r4, r4, r8\n\t"
  55902. "sbcs r5, r5, r9\n\t"
  55903. "sbcs r6, r6, r10\n\t"
  55904. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55905. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55906. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55907. "sbcs r3, r3, r7\n\t"
  55908. "sbcs r4, r4, r8\n\t"
  55909. "sbcs r5, r5, r9\n\t"
  55910. "sbcs r6, r6, r10\n\t"
  55911. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55912. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55913. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55914. "sbcs r3, r3, r7\n\t"
  55915. "sbcs r4, r4, r8\n\t"
  55916. "sbcs r5, r5, r9\n\t"
  55917. "sbcs r6, r6, r10\n\t"
  55918. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55919. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55920. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55921. "sbcs r3, r3, r7\n\t"
  55922. "sbcs r4, r4, r8\n\t"
  55923. "sbcs r5, r5, r9\n\t"
  55924. "sbcs r6, r6, r10\n\t"
  55925. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55926. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55927. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55928. "sbcs r3, r3, r7\n\t"
  55929. "sbcs r4, r4, r8\n\t"
  55930. "sbcs r5, r5, r9\n\t"
  55931. "sbcs r6, r6, r10\n\t"
  55932. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55933. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55934. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55935. "sbcs r3, r3, r7\n\t"
  55936. "sbcs r4, r4, r8\n\t"
  55937. "sbcs r5, r5, r9\n\t"
  55938. "sbcs r6, r6, r10\n\t"
  55939. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55940. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55941. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55942. "sbcs r3, r3, r7\n\t"
  55943. "sbcs r4, r4, r8\n\t"
  55944. "sbcs r5, r5, r9\n\t"
  55945. "sbcs r6, r6, r10\n\t"
  55946. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55947. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  55948. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  55949. "sbcs r3, r3, r7\n\t"
  55950. "sbcs r4, r4, r8\n\t"
  55951. "sbcs r5, r5, r9\n\t"
  55952. "sbcs r6, r6, r10\n\t"
  55953. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  55954. "sbc %[r], r6, r6\n\t"
  55955. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  55956. :
  55957. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  55958. );
  55959. return (uint32_t)(size_t)r;
  55960. }
  55961. #endif /* WOLFSSL_SP_SMALL */
  55962. #ifdef WOLFSSL_SP_USE_UDIV
  55963. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  55964. *
  55965. * d1 The high order half of the number to divide.
  55966. * d0 The low order half of the number to divide.
  55967. * div The divisor.
  55968. * returns the result of the division.
  55969. *
  55970. * Note that this is an approximate div. It may give an answer 1 larger.
  55971. */
  55972. static sp_digit div_4096_word_128(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  55973. {
  55974. register sp_digit d1 asm ("r0") = d1_p;
  55975. register sp_digit d0 asm ("r1") = d0_p;
  55976. register sp_digit div asm ("r2") = div_p;
  55977. __asm__ __volatile__ (
  55978. "lsr r6, %[div], #16\n\t"
  55979. "add lr, r6, #1\n\t"
  55980. "udiv r4, %[d1], lr\n\t"
  55981. "lsl r5, %[div], #16\n\t"
  55982. "lsl r4, r4, #16\n\t"
  55983. "umull r3, r12, %[div], r4\n\t"
  55984. "subs %[d0], %[d0], r3\n\t"
  55985. "sbc %[d1], %[d1], r12\n\t"
  55986. "subs r3, %[d1], lr\n\t"
  55987. "sbc r7, r7, r7\n\t"
  55988. "add r7, r7, #1\n\t"
  55989. "rsb r8, r7, #0\n\t"
  55990. "lsl r7, r7, #16\n\t"
  55991. "and r5, r5, r8\n\t"
  55992. "and r6, r6, r8\n\t"
  55993. "subs %[d0], %[d0], r5\n\t"
  55994. "add r4, r4, r7\n\t"
  55995. "sbc %[d1], %[d1], r6\n\t"
  55996. "lsl r12, %[d1], #16\n\t"
  55997. "lsr r3, %[d0], #16\n\t"
  55998. "orr r3, r3, r12\n\t"
  55999. "udiv r3, r3, lr\n\t"
  56000. "add r4, r4, r3\n\t"
  56001. "umull r3, r12, %[div], r3\n\t"
  56002. "subs %[d0], %[d0], r3\n\t"
  56003. "sbc %[d1], %[d1], r12\n\t"
  56004. "lsl r12, %[d1], #16\n\t"
  56005. "lsr r3, %[d0], #16\n\t"
  56006. "orr r3, r3, r12\n\t"
  56007. "udiv r3, r3, lr\n\t"
  56008. "add r4, r4, r3\n\t"
  56009. "mul r3, %[div], r3\n\t"
  56010. "sub %[d0], %[d0], r3\n\t"
  56011. "udiv r3, %[d0], %[div]\n\t"
  56012. "add %[d1], r4, r3\n\t"
  56013. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  56014. :
  56015. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  56016. );
  56017. return (uint32_t)(size_t)d1;
  56018. }
  56019. #else
  56020. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  56021. *
  56022. * d1 The high order half of the number to divide.
  56023. * d0 The low order half of the number to divide.
  56024. * div The divisor.
  56025. * returns the result of the division.
  56026. *
  56027. * Note that this is an approximate div. It may give an answer 1 larger.
  56028. */
  56029. static sp_digit div_4096_word_128(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  56030. {
  56031. register sp_digit d1 asm ("r0") = d1_p;
  56032. register sp_digit d0 asm ("r1") = d0_p;
  56033. register sp_digit div asm ("r2") = div_p;
  56034. __asm__ __volatile__ (
  56035. "lsr lr, %[div], #1\n\t"
  56036. "add lr, lr, #1\n\t"
  56037. "mov r4, %[d0]\n\t"
  56038. "mov r5, %[d1]\n\t"
  56039. /* Do top 32 */
  56040. "subs r6, lr, r5\n\t"
  56041. "sbc r6, r6, r6\n\t"
  56042. "mov r3, #0\n\t"
  56043. "sub r3, r3, r6\n\t"
  56044. "and r6, r6, lr\n\t"
  56045. "subs r5, r5, r6\n\t"
  56046. /* Next 30 bits */
  56047. "mov r12, #29\n\t"
  56048. "\n"
  56049. "L_div_4096_word_128_bit_%=: \n\t"
  56050. "lsls r4, r4, #1\n\t"
  56051. "adc r5, r5, r5\n\t"
  56052. "subs r6, lr, r5\n\t"
  56053. "sbc r6, r6, r6\n\t"
  56054. "add r3, r3, r3\n\t"
  56055. "sub r3, r3, r6\n\t"
  56056. "and r6, r6, lr\n\t"
  56057. "subs r5, r5, r6\n\t"
  56058. "subs r12, r12, #1\n\t"
  56059. "bpl L_div_4096_word_128_bit_%=\n\t"
  56060. "add r3, r3, r3\n\t"
  56061. "add r3, r3, #1\n\t"
  56062. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  56063. "lsl r7, r3, #16\n\t"
  56064. "lsl r4, %[div], #16\n\t"
  56065. "lsr r7, r7, #16\n\t"
  56066. "lsr r4, r4, #16\n\t"
  56067. "mul r4, r7, r4\n\t"
  56068. "lsr r8, %[div], #16\n\t"
  56069. "mul r7, r8, r7\n\t"
  56070. "lsr r5, r7, #16\n\t"
  56071. "lsl r7, r7, #16\n\t"
  56072. "adds r4, r4, r7\n\t"
  56073. "adc r5, r5, #0\n\t"
  56074. "lsr r7, r3, #16\n\t"
  56075. "mul r8, r7, r8\n\t"
  56076. "add r5, r5, r8\n\t"
  56077. "lsl r8, %[div], #16\n\t"
  56078. "lsr r8, r8, #16\n\t"
  56079. "mul r7, r8, r7\n\t"
  56080. "lsr r8, r7, #16\n\t"
  56081. "lsl r7, r7, #16\n\t"
  56082. "adds r4, r4, r7\n\t"
  56083. "adc r5, r5, r8\n\t"
  56084. #else
  56085. "umull r4, r5, r3, %[div]\n\t"
  56086. #endif
  56087. "subs r7, %[d0], r4\n\t"
  56088. "sbc r8, %[d1], r5\n\t"
  56089. "add r3, r3, r8\n\t"
  56090. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  56091. "lsl r7, r3, #16\n\t"
  56092. "lsl r4, %[div], #16\n\t"
  56093. "lsr r7, r7, #16\n\t"
  56094. "lsr r4, r4, #16\n\t"
  56095. "mul r4, r7, r4\n\t"
  56096. "lsr r8, %[div], #16\n\t"
  56097. "mul r7, r8, r7\n\t"
  56098. "lsr r5, r7, #16\n\t"
  56099. "lsl r7, r7, #16\n\t"
  56100. "adds r4, r4, r7\n\t"
  56101. "adc r5, r5, #0\n\t"
  56102. "lsr r7, r3, #16\n\t"
  56103. "mul r8, r7, r8\n\t"
  56104. "add r5, r5, r8\n\t"
  56105. "lsl r8, %[div], #16\n\t"
  56106. "lsr r8, r8, #16\n\t"
  56107. "mul r7, r8, r7\n\t"
  56108. "lsr r8, r7, #16\n\t"
  56109. "lsl r7, r7, #16\n\t"
  56110. "adds r4, r4, r7\n\t"
  56111. "adc r5, r5, r8\n\t"
  56112. #else
  56113. "umull r4, r5, r3, %[div]\n\t"
  56114. #endif
  56115. "subs r7, %[d0], r4\n\t"
  56116. "sbc r8, %[d1], r5\n\t"
  56117. "add r3, r3, r8\n\t"
  56118. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  56119. "lsl r7, r3, #16\n\t"
  56120. "lsl r4, %[div], #16\n\t"
  56121. "lsr r7, r7, #16\n\t"
  56122. "lsr r4, r4, #16\n\t"
  56123. "mul r4, r7, r4\n\t"
  56124. "lsr r8, %[div], #16\n\t"
  56125. "mul r7, r8, r7\n\t"
  56126. "lsr r5, r7, #16\n\t"
  56127. "lsl r7, r7, #16\n\t"
  56128. "adds r4, r4, r7\n\t"
  56129. "adc r5, r5, #0\n\t"
  56130. "lsr r7, r3, #16\n\t"
  56131. "mul r8, r7, r8\n\t"
  56132. "add r5, r5, r8\n\t"
  56133. "lsl r8, %[div], #16\n\t"
  56134. "lsr r8, r8, #16\n\t"
  56135. "mul r7, r8, r7\n\t"
  56136. "lsr r8, r7, #16\n\t"
  56137. "lsl r7, r7, #16\n\t"
  56138. "adds r4, r4, r7\n\t"
  56139. "adc r5, r5, r8\n\t"
  56140. #else
  56141. "umull r4, r5, r3, %[div]\n\t"
  56142. #endif
  56143. "subs r7, %[d0], r4\n\t"
  56144. "sbc r8, %[d1], r5\n\t"
  56145. "add r3, r3, r8\n\t"
  56146. "subs r6, %[div], r7\n\t"
  56147. "sbc r6, r6, r6\n\t"
  56148. "sub %[d1], r3, r6\n\t"
  56149. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  56150. :
  56151. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  56152. );
  56153. return (uint32_t)(size_t)d1;
  56154. }
  56155. #endif
  56156. /* Divide d in a and put remainder into r (m*d + r = a)
  56157. * m is not calculated as it is not needed at this time.
  56158. *
  56159. * a Number to be divided.
  56160. * d Number to divide with.
  56161. * m Multiplier result.
  56162. * r Remainder from the division.
  56163. * returns MP_OKAY indicating success.
  56164. */
  56165. static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
  56166. sp_digit* r)
  56167. {
  56168. sp_digit t1[256], t2[129];
  56169. sp_digit div, r1;
  56170. int i;
  56171. (void)m;
  56172. div = d[127];
  56173. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  56174. for (i = 127; i > 0; i--) {
  56175. if (t1[i + 128] != d[i])
  56176. break;
  56177. }
  56178. if (t1[i + 128] >= d[i]) {
  56179. sp_4096_sub_in_place_128(&t1[128], d);
  56180. }
  56181. for (i = 127; i >= 0; i--) {
  56182. if (t1[128 + i] == div) {
  56183. r1 = SP_DIGIT_MAX;
  56184. }
  56185. else {
  56186. r1 = div_4096_word_128(t1[128 + i], t1[128 + i - 1], div);
  56187. }
  56188. sp_4096_mul_d_128(t2, d, r1);
  56189. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  56190. t1[128 + i] -= t2[128];
  56191. if (t1[128 + i] != 0) {
  56192. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  56193. if (t1[128 + i] != 0)
  56194. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  56195. }
  56196. }
  56197. for (i = 127; i > 0; i--) {
  56198. if (t1[i] != d[i])
  56199. break;
  56200. }
  56201. if (t1[i] >= d[i]) {
  56202. sp_4096_sub_128(r, t1, d);
  56203. }
  56204. else {
  56205. XMEMCPY(r, t1, sizeof(*t1) * 128);
  56206. }
  56207. return MP_OKAY;
  56208. }
  56209. /* Reduce a modulo m into r. (r = a mod m)
  56210. *
  56211. * r A single precision number that is the reduced result.
  56212. * a A single precision number that is to be reduced.
  56213. * m A single precision number that is the modulus to reduce with.
  56214. * returns MP_OKAY indicating success.
  56215. */
  56216. static WC_INLINE int sp_4096_mod_128_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  56217. {
  56218. return sp_4096_div_128_cond(a, m, NULL, r);
  56219. }
  56220. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  56221. #if defined(WOLFSSL_HAVE_SP_DH) || !defined(WOLFSSL_RSA_PUBLIC_ONLY)
  56222. /* AND m into each word of a and store in r.
  56223. *
  56224. * r A single precision integer.
  56225. * a A single precision integer.
  56226. * m Mask to AND against each digit.
  56227. */
  56228. static void sp_4096_mask_128(sp_digit* r, const sp_digit* a, sp_digit m)
  56229. {
  56230. #ifdef WOLFSSL_SP_SMALL
  56231. int i;
  56232. for (i=0; i<128; i++) {
  56233. r[i] = a[i] & m;
  56234. }
  56235. #else
  56236. int i;
  56237. for (i = 0; i < 128; i += 8) {
  56238. r[i+0] = a[i+0] & m;
  56239. r[i+1] = a[i+1] & m;
  56240. r[i+2] = a[i+2] & m;
  56241. r[i+3] = a[i+3] & m;
  56242. r[i+4] = a[i+4] & m;
  56243. r[i+5] = a[i+5] & m;
  56244. r[i+6] = a[i+6] & m;
  56245. r[i+7] = a[i+7] & m;
  56246. }
  56247. #endif
  56248. }
  56249. /* Compare a with b in constant time.
  56250. *
  56251. * a A single precision integer.
  56252. * b A single precision integer.
  56253. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  56254. * respectively.
  56255. */
  56256. static sp_int32 sp_4096_cmp_128(const sp_digit* a_p, const sp_digit* b_p)
  56257. {
  56258. register const sp_digit* a asm ("r0") = a_p;
  56259. register const sp_digit* b asm ("r1") = b_p;
  56260. __asm__ __volatile__ (
  56261. "mov r2, #-1\n\t"
  56262. "mov r6, #1\n\t"
  56263. "mov r5, #0\n\t"
  56264. "mov r3, #-1\n\t"
  56265. #ifdef WOLFSSL_SP_SMALL
  56266. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  56267. "mov r4, #0x1\n\t"
  56268. "lsl r4, r4, #8\n\t"
  56269. "add r4, r4, #0xfc\n\t"
  56270. #else
  56271. "mov r4, #0x1fc\n\t"
  56272. #endif
  56273. "\n"
  56274. "L_sp_4096_cmp_128_words_%=: \n\t"
  56275. "ldr r12, [%[a], r4]\n\t"
  56276. "ldr lr, [%[b], r4]\n\t"
  56277. "and r12, r12, r3\n\t"
  56278. "and lr, lr, r3\n\t"
  56279. "subs r12, r12, lr\n\t"
  56280. "it hi\n\t"
  56281. "movhi r2, r6\n\t"
  56282. "it lo\n\t"
  56283. "movlo r2, r3\n\t"
  56284. "it ne\n\t"
  56285. "movne r3, r5\n\t"
  56286. "subs r4, r4, #4\n\t"
  56287. "bcs L_sp_4096_cmp_128_words_%=\n\t"
  56288. "eor r2, r2, r3\n\t"
  56289. #else
  56290. "ldr r12, [%[a], #508]\n\t"
  56291. "ldr lr, [%[b], #508]\n\t"
  56292. "and r12, r12, r3\n\t"
  56293. "and lr, lr, r3\n\t"
  56294. "subs r12, r12, lr\n\t"
  56295. "it hi\n\t"
  56296. "movhi r2, r6\n\t"
  56297. "it lo\n\t"
  56298. "movlo r2, r3\n\t"
  56299. "it ne\n\t"
  56300. "movne r3, r5\n\t"
  56301. "ldr r12, [%[a], #504]\n\t"
  56302. "ldr lr, [%[b], #504]\n\t"
  56303. "and r12, r12, r3\n\t"
  56304. "and lr, lr, r3\n\t"
  56305. "subs r12, r12, lr\n\t"
  56306. "it hi\n\t"
  56307. "movhi r2, r6\n\t"
  56308. "it lo\n\t"
  56309. "movlo r2, r3\n\t"
  56310. "it ne\n\t"
  56311. "movne r3, r5\n\t"
  56312. "ldr r12, [%[a], #500]\n\t"
  56313. "ldr lr, [%[b], #500]\n\t"
  56314. "and r12, r12, r3\n\t"
  56315. "and lr, lr, r3\n\t"
  56316. "subs r12, r12, lr\n\t"
  56317. "it hi\n\t"
  56318. "movhi r2, r6\n\t"
  56319. "it lo\n\t"
  56320. "movlo r2, r3\n\t"
  56321. "it ne\n\t"
  56322. "movne r3, r5\n\t"
  56323. "ldr r12, [%[a], #496]\n\t"
  56324. "ldr lr, [%[b], #496]\n\t"
  56325. "and r12, r12, r3\n\t"
  56326. "and lr, lr, r3\n\t"
  56327. "subs r12, r12, lr\n\t"
  56328. "it hi\n\t"
  56329. "movhi r2, r6\n\t"
  56330. "it lo\n\t"
  56331. "movlo r2, r3\n\t"
  56332. "it ne\n\t"
  56333. "movne r3, r5\n\t"
  56334. "ldr r12, [%[a], #492]\n\t"
  56335. "ldr lr, [%[b], #492]\n\t"
  56336. "and r12, r12, r3\n\t"
  56337. "and lr, lr, r3\n\t"
  56338. "subs r12, r12, lr\n\t"
  56339. "it hi\n\t"
  56340. "movhi r2, r6\n\t"
  56341. "it lo\n\t"
  56342. "movlo r2, r3\n\t"
  56343. "it ne\n\t"
  56344. "movne r3, r5\n\t"
  56345. "ldr r12, [%[a], #488]\n\t"
  56346. "ldr lr, [%[b], #488]\n\t"
  56347. "and r12, r12, r3\n\t"
  56348. "and lr, lr, r3\n\t"
  56349. "subs r12, r12, lr\n\t"
  56350. "it hi\n\t"
  56351. "movhi r2, r6\n\t"
  56352. "it lo\n\t"
  56353. "movlo r2, r3\n\t"
  56354. "it ne\n\t"
  56355. "movne r3, r5\n\t"
  56356. "ldr r12, [%[a], #484]\n\t"
  56357. "ldr lr, [%[b], #484]\n\t"
  56358. "and r12, r12, r3\n\t"
  56359. "and lr, lr, r3\n\t"
  56360. "subs r12, r12, lr\n\t"
  56361. "it hi\n\t"
  56362. "movhi r2, r6\n\t"
  56363. "it lo\n\t"
  56364. "movlo r2, r3\n\t"
  56365. "it ne\n\t"
  56366. "movne r3, r5\n\t"
  56367. "ldr r12, [%[a], #480]\n\t"
  56368. "ldr lr, [%[b], #480]\n\t"
  56369. "and r12, r12, r3\n\t"
  56370. "and lr, lr, r3\n\t"
  56371. "subs r12, r12, lr\n\t"
  56372. "it hi\n\t"
  56373. "movhi r2, r6\n\t"
  56374. "it lo\n\t"
  56375. "movlo r2, r3\n\t"
  56376. "it ne\n\t"
  56377. "movne r3, r5\n\t"
  56378. "ldr r12, [%[a], #476]\n\t"
  56379. "ldr lr, [%[b], #476]\n\t"
  56380. "and r12, r12, r3\n\t"
  56381. "and lr, lr, r3\n\t"
  56382. "subs r12, r12, lr\n\t"
  56383. "it hi\n\t"
  56384. "movhi r2, r6\n\t"
  56385. "it lo\n\t"
  56386. "movlo r2, r3\n\t"
  56387. "it ne\n\t"
  56388. "movne r3, r5\n\t"
  56389. "ldr r12, [%[a], #472]\n\t"
  56390. "ldr lr, [%[b], #472]\n\t"
  56391. "and r12, r12, r3\n\t"
  56392. "and lr, lr, r3\n\t"
  56393. "subs r12, r12, lr\n\t"
  56394. "it hi\n\t"
  56395. "movhi r2, r6\n\t"
  56396. "it lo\n\t"
  56397. "movlo r2, r3\n\t"
  56398. "it ne\n\t"
  56399. "movne r3, r5\n\t"
  56400. "ldr r12, [%[a], #468]\n\t"
  56401. "ldr lr, [%[b], #468]\n\t"
  56402. "and r12, r12, r3\n\t"
  56403. "and lr, lr, r3\n\t"
  56404. "subs r12, r12, lr\n\t"
  56405. "it hi\n\t"
  56406. "movhi r2, r6\n\t"
  56407. "it lo\n\t"
  56408. "movlo r2, r3\n\t"
  56409. "it ne\n\t"
  56410. "movne r3, r5\n\t"
  56411. "ldr r12, [%[a], #464]\n\t"
  56412. "ldr lr, [%[b], #464]\n\t"
  56413. "and r12, r12, r3\n\t"
  56414. "and lr, lr, r3\n\t"
  56415. "subs r12, r12, lr\n\t"
  56416. "it hi\n\t"
  56417. "movhi r2, r6\n\t"
  56418. "it lo\n\t"
  56419. "movlo r2, r3\n\t"
  56420. "it ne\n\t"
  56421. "movne r3, r5\n\t"
  56422. "ldr r12, [%[a], #460]\n\t"
  56423. "ldr lr, [%[b], #460]\n\t"
  56424. "and r12, r12, r3\n\t"
  56425. "and lr, lr, r3\n\t"
  56426. "subs r12, r12, lr\n\t"
  56427. "it hi\n\t"
  56428. "movhi r2, r6\n\t"
  56429. "it lo\n\t"
  56430. "movlo r2, r3\n\t"
  56431. "it ne\n\t"
  56432. "movne r3, r5\n\t"
  56433. "ldr r12, [%[a], #456]\n\t"
  56434. "ldr lr, [%[b], #456]\n\t"
  56435. "and r12, r12, r3\n\t"
  56436. "and lr, lr, r3\n\t"
  56437. "subs r12, r12, lr\n\t"
  56438. "it hi\n\t"
  56439. "movhi r2, r6\n\t"
  56440. "it lo\n\t"
  56441. "movlo r2, r3\n\t"
  56442. "it ne\n\t"
  56443. "movne r3, r5\n\t"
  56444. "ldr r12, [%[a], #452]\n\t"
  56445. "ldr lr, [%[b], #452]\n\t"
  56446. "and r12, r12, r3\n\t"
  56447. "and lr, lr, r3\n\t"
  56448. "subs r12, r12, lr\n\t"
  56449. "it hi\n\t"
  56450. "movhi r2, r6\n\t"
  56451. "it lo\n\t"
  56452. "movlo r2, r3\n\t"
  56453. "it ne\n\t"
  56454. "movne r3, r5\n\t"
  56455. "ldr r12, [%[a], #448]\n\t"
  56456. "ldr lr, [%[b], #448]\n\t"
  56457. "and r12, r12, r3\n\t"
  56458. "and lr, lr, r3\n\t"
  56459. "subs r12, r12, lr\n\t"
  56460. "it hi\n\t"
  56461. "movhi r2, r6\n\t"
  56462. "it lo\n\t"
  56463. "movlo r2, r3\n\t"
  56464. "it ne\n\t"
  56465. "movne r3, r5\n\t"
  56466. "ldr r12, [%[a], #444]\n\t"
  56467. "ldr lr, [%[b], #444]\n\t"
  56468. "and r12, r12, r3\n\t"
  56469. "and lr, lr, r3\n\t"
  56470. "subs r12, r12, lr\n\t"
  56471. "it hi\n\t"
  56472. "movhi r2, r6\n\t"
  56473. "it lo\n\t"
  56474. "movlo r2, r3\n\t"
  56475. "it ne\n\t"
  56476. "movne r3, r5\n\t"
  56477. "ldr r12, [%[a], #440]\n\t"
  56478. "ldr lr, [%[b], #440]\n\t"
  56479. "and r12, r12, r3\n\t"
  56480. "and lr, lr, r3\n\t"
  56481. "subs r12, r12, lr\n\t"
  56482. "it hi\n\t"
  56483. "movhi r2, r6\n\t"
  56484. "it lo\n\t"
  56485. "movlo r2, r3\n\t"
  56486. "it ne\n\t"
  56487. "movne r3, r5\n\t"
  56488. "ldr r12, [%[a], #436]\n\t"
  56489. "ldr lr, [%[b], #436]\n\t"
  56490. "and r12, r12, r3\n\t"
  56491. "and lr, lr, r3\n\t"
  56492. "subs r12, r12, lr\n\t"
  56493. "it hi\n\t"
  56494. "movhi r2, r6\n\t"
  56495. "it lo\n\t"
  56496. "movlo r2, r3\n\t"
  56497. "it ne\n\t"
  56498. "movne r3, r5\n\t"
  56499. "ldr r12, [%[a], #432]\n\t"
  56500. "ldr lr, [%[b], #432]\n\t"
  56501. "and r12, r12, r3\n\t"
  56502. "and lr, lr, r3\n\t"
  56503. "subs r12, r12, lr\n\t"
  56504. "it hi\n\t"
  56505. "movhi r2, r6\n\t"
  56506. "it lo\n\t"
  56507. "movlo r2, r3\n\t"
  56508. "it ne\n\t"
  56509. "movne r3, r5\n\t"
  56510. "ldr r12, [%[a], #428]\n\t"
  56511. "ldr lr, [%[b], #428]\n\t"
  56512. "and r12, r12, r3\n\t"
  56513. "and lr, lr, r3\n\t"
  56514. "subs r12, r12, lr\n\t"
  56515. "it hi\n\t"
  56516. "movhi r2, r6\n\t"
  56517. "it lo\n\t"
  56518. "movlo r2, r3\n\t"
  56519. "it ne\n\t"
  56520. "movne r3, r5\n\t"
  56521. "ldr r12, [%[a], #424]\n\t"
  56522. "ldr lr, [%[b], #424]\n\t"
  56523. "and r12, r12, r3\n\t"
  56524. "and lr, lr, r3\n\t"
  56525. "subs r12, r12, lr\n\t"
  56526. "it hi\n\t"
  56527. "movhi r2, r6\n\t"
  56528. "it lo\n\t"
  56529. "movlo r2, r3\n\t"
  56530. "it ne\n\t"
  56531. "movne r3, r5\n\t"
  56532. "ldr r12, [%[a], #420]\n\t"
  56533. "ldr lr, [%[b], #420]\n\t"
  56534. "and r12, r12, r3\n\t"
  56535. "and lr, lr, r3\n\t"
  56536. "subs r12, r12, lr\n\t"
  56537. "it hi\n\t"
  56538. "movhi r2, r6\n\t"
  56539. "it lo\n\t"
  56540. "movlo r2, r3\n\t"
  56541. "it ne\n\t"
  56542. "movne r3, r5\n\t"
  56543. "ldr r12, [%[a], #416]\n\t"
  56544. "ldr lr, [%[b], #416]\n\t"
  56545. "and r12, r12, r3\n\t"
  56546. "and lr, lr, r3\n\t"
  56547. "subs r12, r12, lr\n\t"
  56548. "it hi\n\t"
  56549. "movhi r2, r6\n\t"
  56550. "it lo\n\t"
  56551. "movlo r2, r3\n\t"
  56552. "it ne\n\t"
  56553. "movne r3, r5\n\t"
  56554. "ldr r12, [%[a], #412]\n\t"
  56555. "ldr lr, [%[b], #412]\n\t"
  56556. "and r12, r12, r3\n\t"
  56557. "and lr, lr, r3\n\t"
  56558. "subs r12, r12, lr\n\t"
  56559. "it hi\n\t"
  56560. "movhi r2, r6\n\t"
  56561. "it lo\n\t"
  56562. "movlo r2, r3\n\t"
  56563. "it ne\n\t"
  56564. "movne r3, r5\n\t"
  56565. "ldr r12, [%[a], #408]\n\t"
  56566. "ldr lr, [%[b], #408]\n\t"
  56567. "and r12, r12, r3\n\t"
  56568. "and lr, lr, r3\n\t"
  56569. "subs r12, r12, lr\n\t"
  56570. "it hi\n\t"
  56571. "movhi r2, r6\n\t"
  56572. "it lo\n\t"
  56573. "movlo r2, r3\n\t"
  56574. "it ne\n\t"
  56575. "movne r3, r5\n\t"
  56576. "ldr r12, [%[a], #404]\n\t"
  56577. "ldr lr, [%[b], #404]\n\t"
  56578. "and r12, r12, r3\n\t"
  56579. "and lr, lr, r3\n\t"
  56580. "subs r12, r12, lr\n\t"
  56581. "it hi\n\t"
  56582. "movhi r2, r6\n\t"
  56583. "it lo\n\t"
  56584. "movlo r2, r3\n\t"
  56585. "it ne\n\t"
  56586. "movne r3, r5\n\t"
  56587. "ldr r12, [%[a], #400]\n\t"
  56588. "ldr lr, [%[b], #400]\n\t"
  56589. "and r12, r12, r3\n\t"
  56590. "and lr, lr, r3\n\t"
  56591. "subs r12, r12, lr\n\t"
  56592. "it hi\n\t"
  56593. "movhi r2, r6\n\t"
  56594. "it lo\n\t"
  56595. "movlo r2, r3\n\t"
  56596. "it ne\n\t"
  56597. "movne r3, r5\n\t"
  56598. "ldr r12, [%[a], #396]\n\t"
  56599. "ldr lr, [%[b], #396]\n\t"
  56600. "and r12, r12, r3\n\t"
  56601. "and lr, lr, r3\n\t"
  56602. "subs r12, r12, lr\n\t"
  56603. "it hi\n\t"
  56604. "movhi r2, r6\n\t"
  56605. "it lo\n\t"
  56606. "movlo r2, r3\n\t"
  56607. "it ne\n\t"
  56608. "movne r3, r5\n\t"
  56609. "ldr r12, [%[a], #392]\n\t"
  56610. "ldr lr, [%[b], #392]\n\t"
  56611. "and r12, r12, r3\n\t"
  56612. "and lr, lr, r3\n\t"
  56613. "subs r12, r12, lr\n\t"
  56614. "it hi\n\t"
  56615. "movhi r2, r6\n\t"
  56616. "it lo\n\t"
  56617. "movlo r2, r3\n\t"
  56618. "it ne\n\t"
  56619. "movne r3, r5\n\t"
  56620. "ldr r12, [%[a], #388]\n\t"
  56621. "ldr lr, [%[b], #388]\n\t"
  56622. "and r12, r12, r3\n\t"
  56623. "and lr, lr, r3\n\t"
  56624. "subs r12, r12, lr\n\t"
  56625. "it hi\n\t"
  56626. "movhi r2, r6\n\t"
  56627. "it lo\n\t"
  56628. "movlo r2, r3\n\t"
  56629. "it ne\n\t"
  56630. "movne r3, r5\n\t"
  56631. "ldr r12, [%[a], #384]\n\t"
  56632. "ldr lr, [%[b], #384]\n\t"
  56633. "and r12, r12, r3\n\t"
  56634. "and lr, lr, r3\n\t"
  56635. "subs r12, r12, lr\n\t"
  56636. "it hi\n\t"
  56637. "movhi r2, r6\n\t"
  56638. "it lo\n\t"
  56639. "movlo r2, r3\n\t"
  56640. "it ne\n\t"
  56641. "movne r3, r5\n\t"
  56642. "ldr r12, [%[a], #380]\n\t"
  56643. "ldr lr, [%[b], #380]\n\t"
  56644. "and r12, r12, r3\n\t"
  56645. "and lr, lr, r3\n\t"
  56646. "subs r12, r12, lr\n\t"
  56647. "it hi\n\t"
  56648. "movhi r2, r6\n\t"
  56649. "it lo\n\t"
  56650. "movlo r2, r3\n\t"
  56651. "it ne\n\t"
  56652. "movne r3, r5\n\t"
  56653. "ldr r12, [%[a], #376]\n\t"
  56654. "ldr lr, [%[b], #376]\n\t"
  56655. "and r12, r12, r3\n\t"
  56656. "and lr, lr, r3\n\t"
  56657. "subs r12, r12, lr\n\t"
  56658. "it hi\n\t"
  56659. "movhi r2, r6\n\t"
  56660. "it lo\n\t"
  56661. "movlo r2, r3\n\t"
  56662. "it ne\n\t"
  56663. "movne r3, r5\n\t"
  56664. "ldr r12, [%[a], #372]\n\t"
  56665. "ldr lr, [%[b], #372]\n\t"
  56666. "and r12, r12, r3\n\t"
  56667. "and lr, lr, r3\n\t"
  56668. "subs r12, r12, lr\n\t"
  56669. "it hi\n\t"
  56670. "movhi r2, r6\n\t"
  56671. "it lo\n\t"
  56672. "movlo r2, r3\n\t"
  56673. "it ne\n\t"
  56674. "movne r3, r5\n\t"
  56675. "ldr r12, [%[a], #368]\n\t"
  56676. "ldr lr, [%[b], #368]\n\t"
  56677. "and r12, r12, r3\n\t"
  56678. "and lr, lr, r3\n\t"
  56679. "subs r12, r12, lr\n\t"
  56680. "it hi\n\t"
  56681. "movhi r2, r6\n\t"
  56682. "it lo\n\t"
  56683. "movlo r2, r3\n\t"
  56684. "it ne\n\t"
  56685. "movne r3, r5\n\t"
  56686. "ldr r12, [%[a], #364]\n\t"
  56687. "ldr lr, [%[b], #364]\n\t"
  56688. "and r12, r12, r3\n\t"
  56689. "and lr, lr, r3\n\t"
  56690. "subs r12, r12, lr\n\t"
  56691. "it hi\n\t"
  56692. "movhi r2, r6\n\t"
  56693. "it lo\n\t"
  56694. "movlo r2, r3\n\t"
  56695. "it ne\n\t"
  56696. "movne r3, r5\n\t"
  56697. "ldr r12, [%[a], #360]\n\t"
  56698. "ldr lr, [%[b], #360]\n\t"
  56699. "and r12, r12, r3\n\t"
  56700. "and lr, lr, r3\n\t"
  56701. "subs r12, r12, lr\n\t"
  56702. "it hi\n\t"
  56703. "movhi r2, r6\n\t"
  56704. "it lo\n\t"
  56705. "movlo r2, r3\n\t"
  56706. "it ne\n\t"
  56707. "movne r3, r5\n\t"
  56708. "ldr r12, [%[a], #356]\n\t"
  56709. "ldr lr, [%[b], #356]\n\t"
  56710. "and r12, r12, r3\n\t"
  56711. "and lr, lr, r3\n\t"
  56712. "subs r12, r12, lr\n\t"
  56713. "it hi\n\t"
  56714. "movhi r2, r6\n\t"
  56715. "it lo\n\t"
  56716. "movlo r2, r3\n\t"
  56717. "it ne\n\t"
  56718. "movne r3, r5\n\t"
  56719. "ldr r12, [%[a], #352]\n\t"
  56720. "ldr lr, [%[b], #352]\n\t"
  56721. "and r12, r12, r3\n\t"
  56722. "and lr, lr, r3\n\t"
  56723. "subs r12, r12, lr\n\t"
  56724. "it hi\n\t"
  56725. "movhi r2, r6\n\t"
  56726. "it lo\n\t"
  56727. "movlo r2, r3\n\t"
  56728. "it ne\n\t"
  56729. "movne r3, r5\n\t"
  56730. "ldr r12, [%[a], #348]\n\t"
  56731. "ldr lr, [%[b], #348]\n\t"
  56732. "and r12, r12, r3\n\t"
  56733. "and lr, lr, r3\n\t"
  56734. "subs r12, r12, lr\n\t"
  56735. "it hi\n\t"
  56736. "movhi r2, r6\n\t"
  56737. "it lo\n\t"
  56738. "movlo r2, r3\n\t"
  56739. "it ne\n\t"
  56740. "movne r3, r5\n\t"
  56741. "ldr r12, [%[a], #344]\n\t"
  56742. "ldr lr, [%[b], #344]\n\t"
  56743. "and r12, r12, r3\n\t"
  56744. "and lr, lr, r3\n\t"
  56745. "subs r12, r12, lr\n\t"
  56746. "it hi\n\t"
  56747. "movhi r2, r6\n\t"
  56748. "it lo\n\t"
  56749. "movlo r2, r3\n\t"
  56750. "it ne\n\t"
  56751. "movne r3, r5\n\t"
  56752. "ldr r12, [%[a], #340]\n\t"
  56753. "ldr lr, [%[b], #340]\n\t"
  56754. "and r12, r12, r3\n\t"
  56755. "and lr, lr, r3\n\t"
  56756. "subs r12, r12, lr\n\t"
  56757. "it hi\n\t"
  56758. "movhi r2, r6\n\t"
  56759. "it lo\n\t"
  56760. "movlo r2, r3\n\t"
  56761. "it ne\n\t"
  56762. "movne r3, r5\n\t"
  56763. "ldr r12, [%[a], #336]\n\t"
  56764. "ldr lr, [%[b], #336]\n\t"
  56765. "and r12, r12, r3\n\t"
  56766. "and lr, lr, r3\n\t"
  56767. "subs r12, r12, lr\n\t"
  56768. "it hi\n\t"
  56769. "movhi r2, r6\n\t"
  56770. "it lo\n\t"
  56771. "movlo r2, r3\n\t"
  56772. "it ne\n\t"
  56773. "movne r3, r5\n\t"
  56774. "ldr r12, [%[a], #332]\n\t"
  56775. "ldr lr, [%[b], #332]\n\t"
  56776. "and r12, r12, r3\n\t"
  56777. "and lr, lr, r3\n\t"
  56778. "subs r12, r12, lr\n\t"
  56779. "it hi\n\t"
  56780. "movhi r2, r6\n\t"
  56781. "it lo\n\t"
  56782. "movlo r2, r3\n\t"
  56783. "it ne\n\t"
  56784. "movne r3, r5\n\t"
  56785. "ldr r12, [%[a], #328]\n\t"
  56786. "ldr lr, [%[b], #328]\n\t"
  56787. "and r12, r12, r3\n\t"
  56788. "and lr, lr, r3\n\t"
  56789. "subs r12, r12, lr\n\t"
  56790. "it hi\n\t"
  56791. "movhi r2, r6\n\t"
  56792. "it lo\n\t"
  56793. "movlo r2, r3\n\t"
  56794. "it ne\n\t"
  56795. "movne r3, r5\n\t"
  56796. "ldr r12, [%[a], #324]\n\t"
  56797. "ldr lr, [%[b], #324]\n\t"
  56798. "and r12, r12, r3\n\t"
  56799. "and lr, lr, r3\n\t"
  56800. "subs r12, r12, lr\n\t"
  56801. "it hi\n\t"
  56802. "movhi r2, r6\n\t"
  56803. "it lo\n\t"
  56804. "movlo r2, r3\n\t"
  56805. "it ne\n\t"
  56806. "movne r3, r5\n\t"
  56807. "ldr r12, [%[a], #320]\n\t"
  56808. "ldr lr, [%[b], #320]\n\t"
  56809. "and r12, r12, r3\n\t"
  56810. "and lr, lr, r3\n\t"
  56811. "subs r12, r12, lr\n\t"
  56812. "it hi\n\t"
  56813. "movhi r2, r6\n\t"
  56814. "it lo\n\t"
  56815. "movlo r2, r3\n\t"
  56816. "it ne\n\t"
  56817. "movne r3, r5\n\t"
  56818. "ldr r12, [%[a], #316]\n\t"
  56819. "ldr lr, [%[b], #316]\n\t"
  56820. "and r12, r12, r3\n\t"
  56821. "and lr, lr, r3\n\t"
  56822. "subs r12, r12, lr\n\t"
  56823. "it hi\n\t"
  56824. "movhi r2, r6\n\t"
  56825. "it lo\n\t"
  56826. "movlo r2, r3\n\t"
  56827. "it ne\n\t"
  56828. "movne r3, r5\n\t"
  56829. "ldr r12, [%[a], #312]\n\t"
  56830. "ldr lr, [%[b], #312]\n\t"
  56831. "and r12, r12, r3\n\t"
  56832. "and lr, lr, r3\n\t"
  56833. "subs r12, r12, lr\n\t"
  56834. "it hi\n\t"
  56835. "movhi r2, r6\n\t"
  56836. "it lo\n\t"
  56837. "movlo r2, r3\n\t"
  56838. "it ne\n\t"
  56839. "movne r3, r5\n\t"
  56840. "ldr r12, [%[a], #308]\n\t"
  56841. "ldr lr, [%[b], #308]\n\t"
  56842. "and r12, r12, r3\n\t"
  56843. "and lr, lr, r3\n\t"
  56844. "subs r12, r12, lr\n\t"
  56845. "it hi\n\t"
  56846. "movhi r2, r6\n\t"
  56847. "it lo\n\t"
  56848. "movlo r2, r3\n\t"
  56849. "it ne\n\t"
  56850. "movne r3, r5\n\t"
  56851. "ldr r12, [%[a], #304]\n\t"
  56852. "ldr lr, [%[b], #304]\n\t"
  56853. "and r12, r12, r3\n\t"
  56854. "and lr, lr, r3\n\t"
  56855. "subs r12, r12, lr\n\t"
  56856. "it hi\n\t"
  56857. "movhi r2, r6\n\t"
  56858. "it lo\n\t"
  56859. "movlo r2, r3\n\t"
  56860. "it ne\n\t"
  56861. "movne r3, r5\n\t"
  56862. "ldr r12, [%[a], #300]\n\t"
  56863. "ldr lr, [%[b], #300]\n\t"
  56864. "and r12, r12, r3\n\t"
  56865. "and lr, lr, r3\n\t"
  56866. "subs r12, r12, lr\n\t"
  56867. "it hi\n\t"
  56868. "movhi r2, r6\n\t"
  56869. "it lo\n\t"
  56870. "movlo r2, r3\n\t"
  56871. "it ne\n\t"
  56872. "movne r3, r5\n\t"
  56873. "ldr r12, [%[a], #296]\n\t"
  56874. "ldr lr, [%[b], #296]\n\t"
  56875. "and r12, r12, r3\n\t"
  56876. "and lr, lr, r3\n\t"
  56877. "subs r12, r12, lr\n\t"
  56878. "it hi\n\t"
  56879. "movhi r2, r6\n\t"
  56880. "it lo\n\t"
  56881. "movlo r2, r3\n\t"
  56882. "it ne\n\t"
  56883. "movne r3, r5\n\t"
  56884. "ldr r12, [%[a], #292]\n\t"
  56885. "ldr lr, [%[b], #292]\n\t"
  56886. "and r12, r12, r3\n\t"
  56887. "and lr, lr, r3\n\t"
  56888. "subs r12, r12, lr\n\t"
  56889. "it hi\n\t"
  56890. "movhi r2, r6\n\t"
  56891. "it lo\n\t"
  56892. "movlo r2, r3\n\t"
  56893. "it ne\n\t"
  56894. "movne r3, r5\n\t"
  56895. "ldr r12, [%[a], #288]\n\t"
  56896. "ldr lr, [%[b], #288]\n\t"
  56897. "and r12, r12, r3\n\t"
  56898. "and lr, lr, r3\n\t"
  56899. "subs r12, r12, lr\n\t"
  56900. "it hi\n\t"
  56901. "movhi r2, r6\n\t"
  56902. "it lo\n\t"
  56903. "movlo r2, r3\n\t"
  56904. "it ne\n\t"
  56905. "movne r3, r5\n\t"
  56906. "ldr r12, [%[a], #284]\n\t"
  56907. "ldr lr, [%[b], #284]\n\t"
  56908. "and r12, r12, r3\n\t"
  56909. "and lr, lr, r3\n\t"
  56910. "subs r12, r12, lr\n\t"
  56911. "it hi\n\t"
  56912. "movhi r2, r6\n\t"
  56913. "it lo\n\t"
  56914. "movlo r2, r3\n\t"
  56915. "it ne\n\t"
  56916. "movne r3, r5\n\t"
  56917. "ldr r12, [%[a], #280]\n\t"
  56918. "ldr lr, [%[b], #280]\n\t"
  56919. "and r12, r12, r3\n\t"
  56920. "and lr, lr, r3\n\t"
  56921. "subs r12, r12, lr\n\t"
  56922. "it hi\n\t"
  56923. "movhi r2, r6\n\t"
  56924. "it lo\n\t"
  56925. "movlo r2, r3\n\t"
  56926. "it ne\n\t"
  56927. "movne r3, r5\n\t"
  56928. "ldr r12, [%[a], #276]\n\t"
  56929. "ldr lr, [%[b], #276]\n\t"
  56930. "and r12, r12, r3\n\t"
  56931. "and lr, lr, r3\n\t"
  56932. "subs r12, r12, lr\n\t"
  56933. "it hi\n\t"
  56934. "movhi r2, r6\n\t"
  56935. "it lo\n\t"
  56936. "movlo r2, r3\n\t"
  56937. "it ne\n\t"
  56938. "movne r3, r5\n\t"
  56939. "ldr r12, [%[a], #272]\n\t"
  56940. "ldr lr, [%[b], #272]\n\t"
  56941. "and r12, r12, r3\n\t"
  56942. "and lr, lr, r3\n\t"
  56943. "subs r12, r12, lr\n\t"
  56944. "it hi\n\t"
  56945. "movhi r2, r6\n\t"
  56946. "it lo\n\t"
  56947. "movlo r2, r3\n\t"
  56948. "it ne\n\t"
  56949. "movne r3, r5\n\t"
  56950. "ldr r12, [%[a], #268]\n\t"
  56951. "ldr lr, [%[b], #268]\n\t"
  56952. "and r12, r12, r3\n\t"
  56953. "and lr, lr, r3\n\t"
  56954. "subs r12, r12, lr\n\t"
  56955. "it hi\n\t"
  56956. "movhi r2, r6\n\t"
  56957. "it lo\n\t"
  56958. "movlo r2, r3\n\t"
  56959. "it ne\n\t"
  56960. "movne r3, r5\n\t"
  56961. "ldr r12, [%[a], #264]\n\t"
  56962. "ldr lr, [%[b], #264]\n\t"
  56963. "and r12, r12, r3\n\t"
  56964. "and lr, lr, r3\n\t"
  56965. "subs r12, r12, lr\n\t"
  56966. "it hi\n\t"
  56967. "movhi r2, r6\n\t"
  56968. "it lo\n\t"
  56969. "movlo r2, r3\n\t"
  56970. "it ne\n\t"
  56971. "movne r3, r5\n\t"
  56972. "ldr r12, [%[a], #260]\n\t"
  56973. "ldr lr, [%[b], #260]\n\t"
  56974. "and r12, r12, r3\n\t"
  56975. "and lr, lr, r3\n\t"
  56976. "subs r12, r12, lr\n\t"
  56977. "it hi\n\t"
  56978. "movhi r2, r6\n\t"
  56979. "it lo\n\t"
  56980. "movlo r2, r3\n\t"
  56981. "it ne\n\t"
  56982. "movne r3, r5\n\t"
  56983. "ldr r12, [%[a], #256]\n\t"
  56984. "ldr lr, [%[b], #256]\n\t"
  56985. "and r12, r12, r3\n\t"
  56986. "and lr, lr, r3\n\t"
  56987. "subs r12, r12, lr\n\t"
  56988. "it hi\n\t"
  56989. "movhi r2, r6\n\t"
  56990. "it lo\n\t"
  56991. "movlo r2, r3\n\t"
  56992. "it ne\n\t"
  56993. "movne r3, r5\n\t"
  56994. "ldr r12, [%[a], #252]\n\t"
  56995. "ldr lr, [%[b], #252]\n\t"
  56996. "and r12, r12, r3\n\t"
  56997. "and lr, lr, r3\n\t"
  56998. "subs r12, r12, lr\n\t"
  56999. "it hi\n\t"
  57000. "movhi r2, r6\n\t"
  57001. "it lo\n\t"
  57002. "movlo r2, r3\n\t"
  57003. "it ne\n\t"
  57004. "movne r3, r5\n\t"
  57005. "ldr r12, [%[a], #248]\n\t"
  57006. "ldr lr, [%[b], #248]\n\t"
  57007. "and r12, r12, r3\n\t"
  57008. "and lr, lr, r3\n\t"
  57009. "subs r12, r12, lr\n\t"
  57010. "it hi\n\t"
  57011. "movhi r2, r6\n\t"
  57012. "it lo\n\t"
  57013. "movlo r2, r3\n\t"
  57014. "it ne\n\t"
  57015. "movne r3, r5\n\t"
  57016. "ldr r12, [%[a], #244]\n\t"
  57017. "ldr lr, [%[b], #244]\n\t"
  57018. "and r12, r12, r3\n\t"
  57019. "and lr, lr, r3\n\t"
  57020. "subs r12, r12, lr\n\t"
  57021. "it hi\n\t"
  57022. "movhi r2, r6\n\t"
  57023. "it lo\n\t"
  57024. "movlo r2, r3\n\t"
  57025. "it ne\n\t"
  57026. "movne r3, r5\n\t"
  57027. "ldr r12, [%[a], #240]\n\t"
  57028. "ldr lr, [%[b], #240]\n\t"
  57029. "and r12, r12, r3\n\t"
  57030. "and lr, lr, r3\n\t"
  57031. "subs r12, r12, lr\n\t"
  57032. "it hi\n\t"
  57033. "movhi r2, r6\n\t"
  57034. "it lo\n\t"
  57035. "movlo r2, r3\n\t"
  57036. "it ne\n\t"
  57037. "movne r3, r5\n\t"
  57038. "ldr r12, [%[a], #236]\n\t"
  57039. "ldr lr, [%[b], #236]\n\t"
  57040. "and r12, r12, r3\n\t"
  57041. "and lr, lr, r3\n\t"
  57042. "subs r12, r12, lr\n\t"
  57043. "it hi\n\t"
  57044. "movhi r2, r6\n\t"
  57045. "it lo\n\t"
  57046. "movlo r2, r3\n\t"
  57047. "it ne\n\t"
  57048. "movne r3, r5\n\t"
  57049. "ldr r12, [%[a], #232]\n\t"
  57050. "ldr lr, [%[b], #232]\n\t"
  57051. "and r12, r12, r3\n\t"
  57052. "and lr, lr, r3\n\t"
  57053. "subs r12, r12, lr\n\t"
  57054. "it hi\n\t"
  57055. "movhi r2, r6\n\t"
  57056. "it lo\n\t"
  57057. "movlo r2, r3\n\t"
  57058. "it ne\n\t"
  57059. "movne r3, r5\n\t"
  57060. "ldr r12, [%[a], #228]\n\t"
  57061. "ldr lr, [%[b], #228]\n\t"
  57062. "and r12, r12, r3\n\t"
  57063. "and lr, lr, r3\n\t"
  57064. "subs r12, r12, lr\n\t"
  57065. "it hi\n\t"
  57066. "movhi r2, r6\n\t"
  57067. "it lo\n\t"
  57068. "movlo r2, r3\n\t"
  57069. "it ne\n\t"
  57070. "movne r3, r5\n\t"
  57071. "ldr r12, [%[a], #224]\n\t"
  57072. "ldr lr, [%[b], #224]\n\t"
  57073. "and r12, r12, r3\n\t"
  57074. "and lr, lr, r3\n\t"
  57075. "subs r12, r12, lr\n\t"
  57076. "it hi\n\t"
  57077. "movhi r2, r6\n\t"
  57078. "it lo\n\t"
  57079. "movlo r2, r3\n\t"
  57080. "it ne\n\t"
  57081. "movne r3, r5\n\t"
  57082. "ldr r12, [%[a], #220]\n\t"
  57083. "ldr lr, [%[b], #220]\n\t"
  57084. "and r12, r12, r3\n\t"
  57085. "and lr, lr, r3\n\t"
  57086. "subs r12, r12, lr\n\t"
  57087. "it hi\n\t"
  57088. "movhi r2, r6\n\t"
  57089. "it lo\n\t"
  57090. "movlo r2, r3\n\t"
  57091. "it ne\n\t"
  57092. "movne r3, r5\n\t"
  57093. "ldr r12, [%[a], #216]\n\t"
  57094. "ldr lr, [%[b], #216]\n\t"
  57095. "and r12, r12, r3\n\t"
  57096. "and lr, lr, r3\n\t"
  57097. "subs r12, r12, lr\n\t"
  57098. "it hi\n\t"
  57099. "movhi r2, r6\n\t"
  57100. "it lo\n\t"
  57101. "movlo r2, r3\n\t"
  57102. "it ne\n\t"
  57103. "movne r3, r5\n\t"
  57104. "ldr r12, [%[a], #212]\n\t"
  57105. "ldr lr, [%[b], #212]\n\t"
  57106. "and r12, r12, r3\n\t"
  57107. "and lr, lr, r3\n\t"
  57108. "subs r12, r12, lr\n\t"
  57109. "it hi\n\t"
  57110. "movhi r2, r6\n\t"
  57111. "it lo\n\t"
  57112. "movlo r2, r3\n\t"
  57113. "it ne\n\t"
  57114. "movne r3, r5\n\t"
  57115. "ldr r12, [%[a], #208]\n\t"
  57116. "ldr lr, [%[b], #208]\n\t"
  57117. "and r12, r12, r3\n\t"
  57118. "and lr, lr, r3\n\t"
  57119. "subs r12, r12, lr\n\t"
  57120. "it hi\n\t"
  57121. "movhi r2, r6\n\t"
  57122. "it lo\n\t"
  57123. "movlo r2, r3\n\t"
  57124. "it ne\n\t"
  57125. "movne r3, r5\n\t"
  57126. "ldr r12, [%[a], #204]\n\t"
  57127. "ldr lr, [%[b], #204]\n\t"
  57128. "and r12, r12, r3\n\t"
  57129. "and lr, lr, r3\n\t"
  57130. "subs r12, r12, lr\n\t"
  57131. "it hi\n\t"
  57132. "movhi r2, r6\n\t"
  57133. "it lo\n\t"
  57134. "movlo r2, r3\n\t"
  57135. "it ne\n\t"
  57136. "movne r3, r5\n\t"
  57137. "ldr r12, [%[a], #200]\n\t"
  57138. "ldr lr, [%[b], #200]\n\t"
  57139. "and r12, r12, r3\n\t"
  57140. "and lr, lr, r3\n\t"
  57141. "subs r12, r12, lr\n\t"
  57142. "it hi\n\t"
  57143. "movhi r2, r6\n\t"
  57144. "it lo\n\t"
  57145. "movlo r2, r3\n\t"
  57146. "it ne\n\t"
  57147. "movne r3, r5\n\t"
  57148. "ldr r12, [%[a], #196]\n\t"
  57149. "ldr lr, [%[b], #196]\n\t"
  57150. "and r12, r12, r3\n\t"
  57151. "and lr, lr, r3\n\t"
  57152. "subs r12, r12, lr\n\t"
  57153. "it hi\n\t"
  57154. "movhi r2, r6\n\t"
  57155. "it lo\n\t"
  57156. "movlo r2, r3\n\t"
  57157. "it ne\n\t"
  57158. "movne r3, r5\n\t"
  57159. "ldr r12, [%[a], #192]\n\t"
  57160. "ldr lr, [%[b], #192]\n\t"
  57161. "and r12, r12, r3\n\t"
  57162. "and lr, lr, r3\n\t"
  57163. "subs r12, r12, lr\n\t"
  57164. "it hi\n\t"
  57165. "movhi r2, r6\n\t"
  57166. "it lo\n\t"
  57167. "movlo r2, r3\n\t"
  57168. "it ne\n\t"
  57169. "movne r3, r5\n\t"
  57170. "ldr r12, [%[a], #188]\n\t"
  57171. "ldr lr, [%[b], #188]\n\t"
  57172. "and r12, r12, r3\n\t"
  57173. "and lr, lr, r3\n\t"
  57174. "subs r12, r12, lr\n\t"
  57175. "it hi\n\t"
  57176. "movhi r2, r6\n\t"
  57177. "it lo\n\t"
  57178. "movlo r2, r3\n\t"
  57179. "it ne\n\t"
  57180. "movne r3, r5\n\t"
  57181. "ldr r12, [%[a], #184]\n\t"
  57182. "ldr lr, [%[b], #184]\n\t"
  57183. "and r12, r12, r3\n\t"
  57184. "and lr, lr, r3\n\t"
  57185. "subs r12, r12, lr\n\t"
  57186. "it hi\n\t"
  57187. "movhi r2, r6\n\t"
  57188. "it lo\n\t"
  57189. "movlo r2, r3\n\t"
  57190. "it ne\n\t"
  57191. "movne r3, r5\n\t"
  57192. "ldr r12, [%[a], #180]\n\t"
  57193. "ldr lr, [%[b], #180]\n\t"
  57194. "and r12, r12, r3\n\t"
  57195. "and lr, lr, r3\n\t"
  57196. "subs r12, r12, lr\n\t"
  57197. "it hi\n\t"
  57198. "movhi r2, r6\n\t"
  57199. "it lo\n\t"
  57200. "movlo r2, r3\n\t"
  57201. "it ne\n\t"
  57202. "movne r3, r5\n\t"
  57203. "ldr r12, [%[a], #176]\n\t"
  57204. "ldr lr, [%[b], #176]\n\t"
  57205. "and r12, r12, r3\n\t"
  57206. "and lr, lr, r3\n\t"
  57207. "subs r12, r12, lr\n\t"
  57208. "it hi\n\t"
  57209. "movhi r2, r6\n\t"
  57210. "it lo\n\t"
  57211. "movlo r2, r3\n\t"
  57212. "it ne\n\t"
  57213. "movne r3, r5\n\t"
  57214. "ldr r12, [%[a], #172]\n\t"
  57215. "ldr lr, [%[b], #172]\n\t"
  57216. "and r12, r12, r3\n\t"
  57217. "and lr, lr, r3\n\t"
  57218. "subs r12, r12, lr\n\t"
  57219. "it hi\n\t"
  57220. "movhi r2, r6\n\t"
  57221. "it lo\n\t"
  57222. "movlo r2, r3\n\t"
  57223. "it ne\n\t"
  57224. "movne r3, r5\n\t"
  57225. "ldr r12, [%[a], #168]\n\t"
  57226. "ldr lr, [%[b], #168]\n\t"
  57227. "and r12, r12, r3\n\t"
  57228. "and lr, lr, r3\n\t"
  57229. "subs r12, r12, lr\n\t"
  57230. "it hi\n\t"
  57231. "movhi r2, r6\n\t"
  57232. "it lo\n\t"
  57233. "movlo r2, r3\n\t"
  57234. "it ne\n\t"
  57235. "movne r3, r5\n\t"
  57236. "ldr r12, [%[a], #164]\n\t"
  57237. "ldr lr, [%[b], #164]\n\t"
  57238. "and r12, r12, r3\n\t"
  57239. "and lr, lr, r3\n\t"
  57240. "subs r12, r12, lr\n\t"
  57241. "it hi\n\t"
  57242. "movhi r2, r6\n\t"
  57243. "it lo\n\t"
  57244. "movlo r2, r3\n\t"
  57245. "it ne\n\t"
  57246. "movne r3, r5\n\t"
  57247. "ldr r12, [%[a], #160]\n\t"
  57248. "ldr lr, [%[b], #160]\n\t"
  57249. "and r12, r12, r3\n\t"
  57250. "and lr, lr, r3\n\t"
  57251. "subs r12, r12, lr\n\t"
  57252. "it hi\n\t"
  57253. "movhi r2, r6\n\t"
  57254. "it lo\n\t"
  57255. "movlo r2, r3\n\t"
  57256. "it ne\n\t"
  57257. "movne r3, r5\n\t"
  57258. "ldr r12, [%[a], #156]\n\t"
  57259. "ldr lr, [%[b], #156]\n\t"
  57260. "and r12, r12, r3\n\t"
  57261. "and lr, lr, r3\n\t"
  57262. "subs r12, r12, lr\n\t"
  57263. "it hi\n\t"
  57264. "movhi r2, r6\n\t"
  57265. "it lo\n\t"
  57266. "movlo r2, r3\n\t"
  57267. "it ne\n\t"
  57268. "movne r3, r5\n\t"
  57269. "ldr r12, [%[a], #152]\n\t"
  57270. "ldr lr, [%[b], #152]\n\t"
  57271. "and r12, r12, r3\n\t"
  57272. "and lr, lr, r3\n\t"
  57273. "subs r12, r12, lr\n\t"
  57274. "it hi\n\t"
  57275. "movhi r2, r6\n\t"
  57276. "it lo\n\t"
  57277. "movlo r2, r3\n\t"
  57278. "it ne\n\t"
  57279. "movne r3, r5\n\t"
  57280. "ldr r12, [%[a], #148]\n\t"
  57281. "ldr lr, [%[b], #148]\n\t"
  57282. "and r12, r12, r3\n\t"
  57283. "and lr, lr, r3\n\t"
  57284. "subs r12, r12, lr\n\t"
  57285. "it hi\n\t"
  57286. "movhi r2, r6\n\t"
  57287. "it lo\n\t"
  57288. "movlo r2, r3\n\t"
  57289. "it ne\n\t"
  57290. "movne r3, r5\n\t"
  57291. "ldr r12, [%[a], #144]\n\t"
  57292. "ldr lr, [%[b], #144]\n\t"
  57293. "and r12, r12, r3\n\t"
  57294. "and lr, lr, r3\n\t"
  57295. "subs r12, r12, lr\n\t"
  57296. "it hi\n\t"
  57297. "movhi r2, r6\n\t"
  57298. "it lo\n\t"
  57299. "movlo r2, r3\n\t"
  57300. "it ne\n\t"
  57301. "movne r3, r5\n\t"
  57302. "ldr r12, [%[a], #140]\n\t"
  57303. "ldr lr, [%[b], #140]\n\t"
  57304. "and r12, r12, r3\n\t"
  57305. "and lr, lr, r3\n\t"
  57306. "subs r12, r12, lr\n\t"
  57307. "it hi\n\t"
  57308. "movhi r2, r6\n\t"
  57309. "it lo\n\t"
  57310. "movlo r2, r3\n\t"
  57311. "it ne\n\t"
  57312. "movne r3, r5\n\t"
  57313. "ldr r12, [%[a], #136]\n\t"
  57314. "ldr lr, [%[b], #136]\n\t"
  57315. "and r12, r12, r3\n\t"
  57316. "and lr, lr, r3\n\t"
  57317. "subs r12, r12, lr\n\t"
  57318. "it hi\n\t"
  57319. "movhi r2, r6\n\t"
  57320. "it lo\n\t"
  57321. "movlo r2, r3\n\t"
  57322. "it ne\n\t"
  57323. "movne r3, r5\n\t"
  57324. "ldr r12, [%[a], #132]\n\t"
  57325. "ldr lr, [%[b], #132]\n\t"
  57326. "and r12, r12, r3\n\t"
  57327. "and lr, lr, r3\n\t"
  57328. "subs r12, r12, lr\n\t"
  57329. "it hi\n\t"
  57330. "movhi r2, r6\n\t"
  57331. "it lo\n\t"
  57332. "movlo r2, r3\n\t"
  57333. "it ne\n\t"
  57334. "movne r3, r5\n\t"
  57335. "ldr r12, [%[a], #128]\n\t"
  57336. "ldr lr, [%[b], #128]\n\t"
  57337. "and r12, r12, r3\n\t"
  57338. "and lr, lr, r3\n\t"
  57339. "subs r12, r12, lr\n\t"
  57340. "it hi\n\t"
  57341. "movhi r2, r6\n\t"
  57342. "it lo\n\t"
  57343. "movlo r2, r3\n\t"
  57344. "it ne\n\t"
  57345. "movne r3, r5\n\t"
  57346. "ldr r12, [%[a], #124]\n\t"
  57347. "ldr lr, [%[b], #124]\n\t"
  57348. "and r12, r12, r3\n\t"
  57349. "and lr, lr, r3\n\t"
  57350. "subs r12, r12, lr\n\t"
  57351. "it hi\n\t"
  57352. "movhi r2, r6\n\t"
  57353. "it lo\n\t"
  57354. "movlo r2, r3\n\t"
  57355. "it ne\n\t"
  57356. "movne r3, r5\n\t"
  57357. "ldr r12, [%[a], #120]\n\t"
  57358. "ldr lr, [%[b], #120]\n\t"
  57359. "and r12, r12, r3\n\t"
  57360. "and lr, lr, r3\n\t"
  57361. "subs r12, r12, lr\n\t"
  57362. "it hi\n\t"
  57363. "movhi r2, r6\n\t"
  57364. "it lo\n\t"
  57365. "movlo r2, r3\n\t"
  57366. "it ne\n\t"
  57367. "movne r3, r5\n\t"
  57368. "ldr r12, [%[a], #116]\n\t"
  57369. "ldr lr, [%[b], #116]\n\t"
  57370. "and r12, r12, r3\n\t"
  57371. "and lr, lr, r3\n\t"
  57372. "subs r12, r12, lr\n\t"
  57373. "it hi\n\t"
  57374. "movhi r2, r6\n\t"
  57375. "it lo\n\t"
  57376. "movlo r2, r3\n\t"
  57377. "it ne\n\t"
  57378. "movne r3, r5\n\t"
  57379. "ldr r12, [%[a], #112]\n\t"
  57380. "ldr lr, [%[b], #112]\n\t"
  57381. "and r12, r12, r3\n\t"
  57382. "and lr, lr, r3\n\t"
  57383. "subs r12, r12, lr\n\t"
  57384. "it hi\n\t"
  57385. "movhi r2, r6\n\t"
  57386. "it lo\n\t"
  57387. "movlo r2, r3\n\t"
  57388. "it ne\n\t"
  57389. "movne r3, r5\n\t"
  57390. "ldr r12, [%[a], #108]\n\t"
  57391. "ldr lr, [%[b], #108]\n\t"
  57392. "and r12, r12, r3\n\t"
  57393. "and lr, lr, r3\n\t"
  57394. "subs r12, r12, lr\n\t"
  57395. "it hi\n\t"
  57396. "movhi r2, r6\n\t"
  57397. "it lo\n\t"
  57398. "movlo r2, r3\n\t"
  57399. "it ne\n\t"
  57400. "movne r3, r5\n\t"
  57401. "ldr r12, [%[a], #104]\n\t"
  57402. "ldr lr, [%[b], #104]\n\t"
  57403. "and r12, r12, r3\n\t"
  57404. "and lr, lr, r3\n\t"
  57405. "subs r12, r12, lr\n\t"
  57406. "it hi\n\t"
  57407. "movhi r2, r6\n\t"
  57408. "it lo\n\t"
  57409. "movlo r2, r3\n\t"
  57410. "it ne\n\t"
  57411. "movne r3, r5\n\t"
  57412. "ldr r12, [%[a], #100]\n\t"
  57413. "ldr lr, [%[b], #100]\n\t"
  57414. "and r12, r12, r3\n\t"
  57415. "and lr, lr, r3\n\t"
  57416. "subs r12, r12, lr\n\t"
  57417. "it hi\n\t"
  57418. "movhi r2, r6\n\t"
  57419. "it lo\n\t"
  57420. "movlo r2, r3\n\t"
  57421. "it ne\n\t"
  57422. "movne r3, r5\n\t"
  57423. "ldr r12, [%[a], #96]\n\t"
  57424. "ldr lr, [%[b], #96]\n\t"
  57425. "and r12, r12, r3\n\t"
  57426. "and lr, lr, r3\n\t"
  57427. "subs r12, r12, lr\n\t"
  57428. "it hi\n\t"
  57429. "movhi r2, r6\n\t"
  57430. "it lo\n\t"
  57431. "movlo r2, r3\n\t"
  57432. "it ne\n\t"
  57433. "movne r3, r5\n\t"
  57434. "ldr r12, [%[a], #92]\n\t"
  57435. "ldr lr, [%[b], #92]\n\t"
  57436. "and r12, r12, r3\n\t"
  57437. "and lr, lr, r3\n\t"
  57438. "subs r12, r12, lr\n\t"
  57439. "it hi\n\t"
  57440. "movhi r2, r6\n\t"
  57441. "it lo\n\t"
  57442. "movlo r2, r3\n\t"
  57443. "it ne\n\t"
  57444. "movne r3, r5\n\t"
  57445. "ldr r12, [%[a], #88]\n\t"
  57446. "ldr lr, [%[b], #88]\n\t"
  57447. "and r12, r12, r3\n\t"
  57448. "and lr, lr, r3\n\t"
  57449. "subs r12, r12, lr\n\t"
  57450. "it hi\n\t"
  57451. "movhi r2, r6\n\t"
  57452. "it lo\n\t"
  57453. "movlo r2, r3\n\t"
  57454. "it ne\n\t"
  57455. "movne r3, r5\n\t"
  57456. "ldr r12, [%[a], #84]\n\t"
  57457. "ldr lr, [%[b], #84]\n\t"
  57458. "and r12, r12, r3\n\t"
  57459. "and lr, lr, r3\n\t"
  57460. "subs r12, r12, lr\n\t"
  57461. "it hi\n\t"
  57462. "movhi r2, r6\n\t"
  57463. "it lo\n\t"
  57464. "movlo r2, r3\n\t"
  57465. "it ne\n\t"
  57466. "movne r3, r5\n\t"
  57467. "ldr r12, [%[a], #80]\n\t"
  57468. "ldr lr, [%[b], #80]\n\t"
  57469. "and r12, r12, r3\n\t"
  57470. "and lr, lr, r3\n\t"
  57471. "subs r12, r12, lr\n\t"
  57472. "it hi\n\t"
  57473. "movhi r2, r6\n\t"
  57474. "it lo\n\t"
  57475. "movlo r2, r3\n\t"
  57476. "it ne\n\t"
  57477. "movne r3, r5\n\t"
  57478. "ldr r12, [%[a], #76]\n\t"
  57479. "ldr lr, [%[b], #76]\n\t"
  57480. "and r12, r12, r3\n\t"
  57481. "and lr, lr, r3\n\t"
  57482. "subs r12, r12, lr\n\t"
  57483. "it hi\n\t"
  57484. "movhi r2, r6\n\t"
  57485. "it lo\n\t"
  57486. "movlo r2, r3\n\t"
  57487. "it ne\n\t"
  57488. "movne r3, r5\n\t"
  57489. "ldr r12, [%[a], #72]\n\t"
  57490. "ldr lr, [%[b], #72]\n\t"
  57491. "and r12, r12, r3\n\t"
  57492. "and lr, lr, r3\n\t"
  57493. "subs r12, r12, lr\n\t"
  57494. "it hi\n\t"
  57495. "movhi r2, r6\n\t"
  57496. "it lo\n\t"
  57497. "movlo r2, r3\n\t"
  57498. "it ne\n\t"
  57499. "movne r3, r5\n\t"
  57500. "ldr r12, [%[a], #68]\n\t"
  57501. "ldr lr, [%[b], #68]\n\t"
  57502. "and r12, r12, r3\n\t"
  57503. "and lr, lr, r3\n\t"
  57504. "subs r12, r12, lr\n\t"
  57505. "it hi\n\t"
  57506. "movhi r2, r6\n\t"
  57507. "it lo\n\t"
  57508. "movlo r2, r3\n\t"
  57509. "it ne\n\t"
  57510. "movne r3, r5\n\t"
  57511. "ldr r12, [%[a], #64]\n\t"
  57512. "ldr lr, [%[b], #64]\n\t"
  57513. "and r12, r12, r3\n\t"
  57514. "and lr, lr, r3\n\t"
  57515. "subs r12, r12, lr\n\t"
  57516. "it hi\n\t"
  57517. "movhi r2, r6\n\t"
  57518. "it lo\n\t"
  57519. "movlo r2, r3\n\t"
  57520. "it ne\n\t"
  57521. "movne r3, r5\n\t"
  57522. "ldr r12, [%[a], #60]\n\t"
  57523. "ldr lr, [%[b], #60]\n\t"
  57524. "and r12, r12, r3\n\t"
  57525. "and lr, lr, r3\n\t"
  57526. "subs r12, r12, lr\n\t"
  57527. "it hi\n\t"
  57528. "movhi r2, r6\n\t"
  57529. "it lo\n\t"
  57530. "movlo r2, r3\n\t"
  57531. "it ne\n\t"
  57532. "movne r3, r5\n\t"
  57533. "ldr r12, [%[a], #56]\n\t"
  57534. "ldr lr, [%[b], #56]\n\t"
  57535. "and r12, r12, r3\n\t"
  57536. "and lr, lr, r3\n\t"
  57537. "subs r12, r12, lr\n\t"
  57538. "it hi\n\t"
  57539. "movhi r2, r6\n\t"
  57540. "it lo\n\t"
  57541. "movlo r2, r3\n\t"
  57542. "it ne\n\t"
  57543. "movne r3, r5\n\t"
  57544. "ldr r12, [%[a], #52]\n\t"
  57545. "ldr lr, [%[b], #52]\n\t"
  57546. "and r12, r12, r3\n\t"
  57547. "and lr, lr, r3\n\t"
  57548. "subs r12, r12, lr\n\t"
  57549. "it hi\n\t"
  57550. "movhi r2, r6\n\t"
  57551. "it lo\n\t"
  57552. "movlo r2, r3\n\t"
  57553. "it ne\n\t"
  57554. "movne r3, r5\n\t"
  57555. "ldr r12, [%[a], #48]\n\t"
  57556. "ldr lr, [%[b], #48]\n\t"
  57557. "and r12, r12, r3\n\t"
  57558. "and lr, lr, r3\n\t"
  57559. "subs r12, r12, lr\n\t"
  57560. "it hi\n\t"
  57561. "movhi r2, r6\n\t"
  57562. "it lo\n\t"
  57563. "movlo r2, r3\n\t"
  57564. "it ne\n\t"
  57565. "movne r3, r5\n\t"
  57566. "ldr r12, [%[a], #44]\n\t"
  57567. "ldr lr, [%[b], #44]\n\t"
  57568. "and r12, r12, r3\n\t"
  57569. "and lr, lr, r3\n\t"
  57570. "subs r12, r12, lr\n\t"
  57571. "it hi\n\t"
  57572. "movhi r2, r6\n\t"
  57573. "it lo\n\t"
  57574. "movlo r2, r3\n\t"
  57575. "it ne\n\t"
  57576. "movne r3, r5\n\t"
  57577. "ldr r12, [%[a], #40]\n\t"
  57578. "ldr lr, [%[b], #40]\n\t"
  57579. "and r12, r12, r3\n\t"
  57580. "and lr, lr, r3\n\t"
  57581. "subs r12, r12, lr\n\t"
  57582. "it hi\n\t"
  57583. "movhi r2, r6\n\t"
  57584. "it lo\n\t"
  57585. "movlo r2, r3\n\t"
  57586. "it ne\n\t"
  57587. "movne r3, r5\n\t"
  57588. "ldr r12, [%[a], #36]\n\t"
  57589. "ldr lr, [%[b], #36]\n\t"
  57590. "and r12, r12, r3\n\t"
  57591. "and lr, lr, r3\n\t"
  57592. "subs r12, r12, lr\n\t"
  57593. "it hi\n\t"
  57594. "movhi r2, r6\n\t"
  57595. "it lo\n\t"
  57596. "movlo r2, r3\n\t"
  57597. "it ne\n\t"
  57598. "movne r3, r5\n\t"
  57599. "ldr r12, [%[a], #32]\n\t"
  57600. "ldr lr, [%[b], #32]\n\t"
  57601. "and r12, r12, r3\n\t"
  57602. "and lr, lr, r3\n\t"
  57603. "subs r12, r12, lr\n\t"
  57604. "it hi\n\t"
  57605. "movhi r2, r6\n\t"
  57606. "it lo\n\t"
  57607. "movlo r2, r3\n\t"
  57608. "it ne\n\t"
  57609. "movne r3, r5\n\t"
  57610. "ldr r12, [%[a], #28]\n\t"
  57611. "ldr lr, [%[b], #28]\n\t"
  57612. "and r12, r12, r3\n\t"
  57613. "and lr, lr, r3\n\t"
  57614. "subs r12, r12, lr\n\t"
  57615. "it hi\n\t"
  57616. "movhi r2, r6\n\t"
  57617. "it lo\n\t"
  57618. "movlo r2, r3\n\t"
  57619. "it ne\n\t"
  57620. "movne r3, r5\n\t"
  57621. "ldr r12, [%[a], #24]\n\t"
  57622. "ldr lr, [%[b], #24]\n\t"
  57623. "and r12, r12, r3\n\t"
  57624. "and lr, lr, r3\n\t"
  57625. "subs r12, r12, lr\n\t"
  57626. "it hi\n\t"
  57627. "movhi r2, r6\n\t"
  57628. "it lo\n\t"
  57629. "movlo r2, r3\n\t"
  57630. "it ne\n\t"
  57631. "movne r3, r5\n\t"
  57632. "ldr r12, [%[a], #20]\n\t"
  57633. "ldr lr, [%[b], #20]\n\t"
  57634. "and r12, r12, r3\n\t"
  57635. "and lr, lr, r3\n\t"
  57636. "subs r12, r12, lr\n\t"
  57637. "it hi\n\t"
  57638. "movhi r2, r6\n\t"
  57639. "it lo\n\t"
  57640. "movlo r2, r3\n\t"
  57641. "it ne\n\t"
  57642. "movne r3, r5\n\t"
  57643. "ldr r12, [%[a], #16]\n\t"
  57644. "ldr lr, [%[b], #16]\n\t"
  57645. "and r12, r12, r3\n\t"
  57646. "and lr, lr, r3\n\t"
  57647. "subs r12, r12, lr\n\t"
  57648. "it hi\n\t"
  57649. "movhi r2, r6\n\t"
  57650. "it lo\n\t"
  57651. "movlo r2, r3\n\t"
  57652. "it ne\n\t"
  57653. "movne r3, r5\n\t"
  57654. "ldr r12, [%[a], #12]\n\t"
  57655. "ldr lr, [%[b], #12]\n\t"
  57656. "and r12, r12, r3\n\t"
  57657. "and lr, lr, r3\n\t"
  57658. "subs r12, r12, lr\n\t"
  57659. "it hi\n\t"
  57660. "movhi r2, r6\n\t"
  57661. "it lo\n\t"
  57662. "movlo r2, r3\n\t"
  57663. "it ne\n\t"
  57664. "movne r3, r5\n\t"
  57665. "ldr r12, [%[a], #8]\n\t"
  57666. "ldr lr, [%[b], #8]\n\t"
  57667. "and r12, r12, r3\n\t"
  57668. "and lr, lr, r3\n\t"
  57669. "subs r12, r12, lr\n\t"
  57670. "it hi\n\t"
  57671. "movhi r2, r6\n\t"
  57672. "it lo\n\t"
  57673. "movlo r2, r3\n\t"
  57674. "it ne\n\t"
  57675. "movne r3, r5\n\t"
  57676. "ldr r12, [%[a], #4]\n\t"
  57677. "ldr lr, [%[b], #4]\n\t"
  57678. "and r12, r12, r3\n\t"
  57679. "and lr, lr, r3\n\t"
  57680. "subs r12, r12, lr\n\t"
  57681. "it hi\n\t"
  57682. "movhi r2, r6\n\t"
  57683. "it lo\n\t"
  57684. "movlo r2, r3\n\t"
  57685. "it ne\n\t"
  57686. "movne r3, r5\n\t"
  57687. "ldr r12, [%[a]]\n\t"
  57688. "ldr lr, [%[b]]\n\t"
  57689. "and r12, r12, r3\n\t"
  57690. "and lr, lr, r3\n\t"
  57691. "subs r12, r12, lr\n\t"
  57692. "it hi\n\t"
  57693. "movhi r2, r6\n\t"
  57694. "it lo\n\t"
  57695. "movlo r2, r3\n\t"
  57696. "it ne\n\t"
  57697. "movne r3, r5\n\t"
  57698. "eor r2, r2, r3\n\t"
  57699. #endif /*WOLFSSL_SP_SMALL */
  57700. "mov %[a], r2\n\t"
  57701. : [a] "+r" (a), [b] "+r" (b)
  57702. :
  57703. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6"
  57704. );
  57705. return (uint32_t)(size_t)a;
  57706. }
  57707. /* Divide d in a and put remainder into r (m*d + r = a)
  57708. * m is not calculated as it is not needed at this time.
  57709. *
  57710. * a Number to be divided.
  57711. * d Number to divide with.
  57712. * m Multiplier result.
  57713. * r Remainder from the division.
  57714. * returns MP_OKAY indicating success.
  57715. */
  57716. static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d, sp_digit* m,
  57717. sp_digit* r)
  57718. {
  57719. sp_digit t1[256], t2[129];
  57720. sp_digit div, r1;
  57721. int i;
  57722. (void)m;
  57723. div = d[127];
  57724. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  57725. r1 = sp_4096_cmp_128(&t1[128], d) >= 0;
  57726. sp_4096_cond_sub_128(&t1[128], &t1[128], d, (sp_digit)0 - r1);
  57727. for (i = 127; i >= 0; i--) {
  57728. volatile sp_digit mask = (sp_digit)0 - (t1[128 + i] == div);
  57729. sp_digit hi = t1[128 + i] + mask;
  57730. r1 = div_4096_word_128(hi, t1[128 + i - 1], div);
  57731. r1 |= mask;
  57732. sp_4096_mul_d_128(t2, d, r1);
  57733. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  57734. t1[128 + i] -= t2[128];
  57735. sp_4096_mask_128(t2, d, t1[128 + i]);
  57736. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  57737. sp_4096_mask_128(t2, d, t1[128 + i]);
  57738. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  57739. }
  57740. r1 = sp_4096_cmp_128(t1, d) >= 0;
  57741. sp_4096_cond_sub_128(r, t1, d, (sp_digit)0 - r1);
  57742. return MP_OKAY;
  57743. }
  57744. /* Reduce a modulo m into r. (r = a mod m)
  57745. *
  57746. * r A single precision number that is the reduced result.
  57747. * a A single precision number that is to be reduced.
  57748. * m A single precision number that is the modulus to reduce with.
  57749. * returns MP_OKAY indicating success.
  57750. */
  57751. static WC_INLINE int sp_4096_mod_128(sp_digit* r, const sp_digit* a, const sp_digit* m)
  57752. {
  57753. return sp_4096_div_128(a, m, NULL, r);
  57754. }
  57755. #endif /* WOLFSSL_HAVE_SP_DH || !WOLFSSL_RSA_PUBLIC_ONLY */
  57756. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  57757. defined(WOLFSSL_HAVE_SP_DH)
  57758. #ifdef WOLFSSL_SP_SMALL
  57759. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  57760. *
  57761. * r A single precision number that is the result of the operation.
  57762. * a A single precision number being exponentiated.
  57763. * e A single precision number that is the exponent.
  57764. * bits The number of bits in the exponent.
  57765. * m A single precision number that is the modulus.
  57766. * returns 0 on success.
  57767. * returns MEMORY_E on dynamic memory allocation failure.
  57768. * returns MP_VAL when base is even or exponent is 0.
  57769. */
  57770. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  57771. int bits, const sp_digit* m, int reduceA)
  57772. {
  57773. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  57774. sp_digit* td = NULL;
  57775. #else
  57776. sp_digit td[8 * 256];
  57777. #endif
  57778. sp_digit* t[8];
  57779. sp_digit* norm = NULL;
  57780. sp_digit mp = 1;
  57781. sp_digit n;
  57782. sp_digit mask;
  57783. int i;
  57784. int c;
  57785. byte y;
  57786. int err = MP_OKAY;
  57787. if (bits == 0) {
  57788. err = MP_VAL;
  57789. }
  57790. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  57791. if (err == MP_OKAY) {
  57792. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 256), NULL,
  57793. DYNAMIC_TYPE_TMP_BUFFER);
  57794. if (td == NULL)
  57795. err = MEMORY_E;
  57796. }
  57797. #endif
  57798. if (err == MP_OKAY) {
  57799. norm = td;
  57800. for (i=0; i<8; i++) {
  57801. t[i] = td + i * 256;
  57802. }
  57803. sp_4096_mont_setup(m, &mp);
  57804. sp_4096_mont_norm_128(norm, m);
  57805. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  57806. if (reduceA != 0) {
  57807. err = sp_4096_mod_128(t[1] + 128, a, m);
  57808. if (err == MP_OKAY) {
  57809. err = sp_4096_mod_128(t[1], t[1], m);
  57810. }
  57811. }
  57812. else {
  57813. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  57814. err = sp_4096_mod_128(t[1], t[1], m);
  57815. }
  57816. }
  57817. if (err == MP_OKAY) {
  57818. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  57819. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  57820. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  57821. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  57822. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  57823. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  57824. i = (bits - 1) / 32;
  57825. n = e[i--];
  57826. c = bits & 31;
  57827. if (c == 0) {
  57828. c = 32;
  57829. }
  57830. c -= bits % 3;
  57831. if (c == 32) {
  57832. c = 29;
  57833. }
  57834. if (c < 0) {
  57835. /* Number of bits in top word is less than number needed. */
  57836. c = -c;
  57837. y = (byte)(n << c);
  57838. n = e[i--];
  57839. y |= (byte)(n >> (64 - c));
  57840. n <<= c;
  57841. c = 64 - c;
  57842. }
  57843. else if (c == 0) {
  57844. /* All bits in top word used. */
  57845. y = (byte)n;
  57846. }
  57847. else {
  57848. y = (byte)(n >> c);
  57849. n <<= 32 - c;
  57850. }
  57851. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  57852. for (; i>=0 || c>=3; ) {
  57853. if (c == 0) {
  57854. n = e[i--];
  57855. y = (byte)(n >> 29);
  57856. n <<= 3;
  57857. c = 29;
  57858. }
  57859. else if (c < 3) {
  57860. y = (byte)(n >> 29);
  57861. n = e[i--];
  57862. c = 3 - c;
  57863. y |= (byte)(n >> (32 - c));
  57864. n <<= c;
  57865. c = 32 - c;
  57866. }
  57867. else {
  57868. y = (byte)((n >> 29) & 0x7);
  57869. n <<= 3;
  57870. c -= 3;
  57871. }
  57872. sp_4096_mont_sqr_128(r, r, m, mp);
  57873. sp_4096_mont_sqr_128(r, r, m, mp);
  57874. sp_4096_mont_sqr_128(r, r, m, mp);
  57875. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  57876. }
  57877. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  57878. sp_4096_mont_reduce_128(r, m, mp);
  57879. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  57880. sp_4096_cond_sub_128(r, r, m, mask);
  57881. }
  57882. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  57883. if (td != NULL)
  57884. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  57885. #endif
  57886. return err;
  57887. }
  57888. #else
  57889. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  57890. *
  57891. * r A single precision number that is the result of the operation.
  57892. * a A single precision number being exponentiated.
  57893. * e A single precision number that is the exponent.
  57894. * bits The number of bits in the exponent.
  57895. * m A single precision number that is the modulus.
  57896. * returns 0 on success.
  57897. * returns MEMORY_E on dynamic memory allocation failure.
  57898. * returns MP_VAL when base is even or exponent is 0.
  57899. */
  57900. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  57901. int bits, const sp_digit* m, int reduceA)
  57902. {
  57903. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  57904. sp_digit* td = NULL;
  57905. #else
  57906. sp_digit td[16 * 256];
  57907. #endif
  57908. sp_digit* t[16];
  57909. sp_digit* norm = NULL;
  57910. sp_digit mp = 1;
  57911. sp_digit n;
  57912. sp_digit mask;
  57913. int i;
  57914. int c;
  57915. byte y;
  57916. int err = MP_OKAY;
  57917. if (bits == 0) {
  57918. err = MP_VAL;
  57919. }
  57920. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  57921. if (err == MP_OKAY) {
  57922. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 256), NULL,
  57923. DYNAMIC_TYPE_TMP_BUFFER);
  57924. if (td == NULL)
  57925. err = MEMORY_E;
  57926. }
  57927. #endif
  57928. if (err == MP_OKAY) {
  57929. norm = td;
  57930. for (i=0; i<16; i++) {
  57931. t[i] = td + i * 256;
  57932. }
  57933. sp_4096_mont_setup(m, &mp);
  57934. sp_4096_mont_norm_128(norm, m);
  57935. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  57936. if (reduceA != 0) {
  57937. err = sp_4096_mod_128(t[1] + 128, a, m);
  57938. if (err == MP_OKAY) {
  57939. err = sp_4096_mod_128(t[1], t[1], m);
  57940. }
  57941. }
  57942. else {
  57943. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  57944. err = sp_4096_mod_128(t[1], t[1], m);
  57945. }
  57946. }
  57947. if (err == MP_OKAY) {
  57948. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  57949. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  57950. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  57951. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  57952. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  57953. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  57954. sp_4096_mont_sqr_128(t[ 8], t[ 4], m, mp);
  57955. sp_4096_mont_mul_128(t[ 9], t[ 5], t[ 4], m, mp);
  57956. sp_4096_mont_sqr_128(t[10], t[ 5], m, mp);
  57957. sp_4096_mont_mul_128(t[11], t[ 6], t[ 5], m, mp);
  57958. sp_4096_mont_sqr_128(t[12], t[ 6], m, mp);
  57959. sp_4096_mont_mul_128(t[13], t[ 7], t[ 6], m, mp);
  57960. sp_4096_mont_sqr_128(t[14], t[ 7], m, mp);
  57961. sp_4096_mont_mul_128(t[15], t[ 8], t[ 7], m, mp);
  57962. i = (bits - 1) / 32;
  57963. n = e[i--];
  57964. c = bits & 31;
  57965. if (c == 0) {
  57966. c = 32;
  57967. }
  57968. c -= bits % 4;
  57969. if (c == 32) {
  57970. c = 28;
  57971. }
  57972. if (c < 0) {
  57973. /* Number of bits in top word is less than number needed. */
  57974. c = -c;
  57975. y = (byte)(n << c);
  57976. n = e[i--];
  57977. y |= (byte)(n >> (64 - c));
  57978. n <<= c;
  57979. c = 64 - c;
  57980. }
  57981. else if (c == 0) {
  57982. /* All bits in top word used. */
  57983. y = (byte)n;
  57984. }
  57985. else {
  57986. y = (byte)(n >> c);
  57987. n <<= 32 - c;
  57988. }
  57989. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  57990. for (; i>=0 || c>=4; ) {
  57991. if (c == 0) {
  57992. n = e[i--];
  57993. y = (byte)(n >> 28);
  57994. n <<= 4;
  57995. c = 28;
  57996. }
  57997. else if (c < 4) {
  57998. y = (byte)(n >> 28);
  57999. n = e[i--];
  58000. c = 4 - c;
  58001. y |= (byte)(n >> (32 - c));
  58002. n <<= c;
  58003. c = 32 - c;
  58004. }
  58005. else {
  58006. y = (byte)((n >> 28) & 0xf);
  58007. n <<= 4;
  58008. c -= 4;
  58009. }
  58010. sp_4096_mont_sqr_128(r, r, m, mp);
  58011. sp_4096_mont_sqr_128(r, r, m, mp);
  58012. sp_4096_mont_sqr_128(r, r, m, mp);
  58013. sp_4096_mont_sqr_128(r, r, m, mp);
  58014. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  58015. }
  58016. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  58017. sp_4096_mont_reduce_128(r, m, mp);
  58018. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  58019. sp_4096_cond_sub_128(r, r, m, mask);
  58020. }
  58021. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  58022. if (td != NULL)
  58023. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  58024. #endif
  58025. return err;
  58026. }
  58027. #endif /* WOLFSSL_SP_SMALL */
  58028. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  58029. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  58030. #ifdef WOLFSSL_HAVE_SP_RSA
  58031. /* RSA public key operation.
  58032. *
  58033. * in Array of bytes representing the number to exponentiate, base.
  58034. * inLen Number of bytes in base.
  58035. * em Public exponent.
  58036. * mm Modulus.
  58037. * out Buffer to hold big-endian bytes of exponentiation result.
  58038. * Must be at least 512 bytes long.
  58039. * outLen Number of bytes in result.
  58040. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  58041. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  58042. */
  58043. int sp_RsaPublic_4096(const byte* in, word32 inLen, const mp_int* em,
  58044. const mp_int* mm, byte* out, word32* outLen)
  58045. {
  58046. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  58047. sp_digit* a = NULL;
  58048. #else
  58049. sp_digit a[128 * 5];
  58050. #endif
  58051. sp_digit* m = NULL;
  58052. sp_digit* r = NULL;
  58053. sp_digit *ah = NULL;
  58054. sp_digit e[1] = {0};
  58055. int err = MP_OKAY;
  58056. if (*outLen < 512) {
  58057. err = MP_TO_E;
  58058. }
  58059. else if (mp_count_bits(em) > 32 || inLen > 512 ||
  58060. mp_count_bits(mm) != 4096) {
  58061. err = MP_READ_E;
  58062. }
  58063. else if (mp_iseven(mm)) {
  58064. err = MP_VAL;
  58065. }
  58066. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  58067. if (err == MP_OKAY) {
  58068. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 5, NULL,
  58069. DYNAMIC_TYPE_RSA);
  58070. if (a == NULL)
  58071. err = MEMORY_E;
  58072. }
  58073. #endif
  58074. if (err == MP_OKAY) {
  58075. ah = a + 128;
  58076. r = a + 128 * 2;
  58077. m = r + 128 * 2;
  58078. sp_4096_from_bin(ah, 128, in, inLen);
  58079. #if DIGIT_BIT >= 32
  58080. e[0] = em->dp[0];
  58081. #else
  58082. e[0] = em->dp[0];
  58083. if (em->used > 1) {
  58084. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  58085. }
  58086. #endif
  58087. if (e[0] == 0) {
  58088. err = MP_EXPTMOD_E;
  58089. }
  58090. }
  58091. if (err == MP_OKAY) {
  58092. sp_4096_from_mp(m, 128, mm);
  58093. if (e[0] == 0x10001) {
  58094. int i;
  58095. sp_digit mp;
  58096. sp_4096_mont_setup(m, &mp);
  58097. /* Convert to Montgomery form. */
  58098. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  58099. err = sp_4096_mod_128_cond(r, a, m);
  58100. /* Montgomery form: r = a.R mod m */
  58101. if (err == MP_OKAY) {
  58102. /* r = a ^ 0x10000 => r = a squared 16 times */
  58103. for (i = 15; i >= 0; i--) {
  58104. sp_4096_mont_sqr_128(r, r, m, mp);
  58105. }
  58106. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  58107. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  58108. */
  58109. sp_4096_mont_mul_128(r, r, ah, m, mp);
  58110. for (i = 127; i > 0; i--) {
  58111. if (r[i] != m[i]) {
  58112. break;
  58113. }
  58114. }
  58115. if (r[i] >= m[i]) {
  58116. sp_4096_sub_in_place_128(r, m);
  58117. }
  58118. }
  58119. }
  58120. else if (e[0] == 0x3) {
  58121. if (err == MP_OKAY) {
  58122. sp_4096_sqr_128(r, ah);
  58123. err = sp_4096_mod_128_cond(r, r, m);
  58124. }
  58125. if (err == MP_OKAY) {
  58126. sp_4096_mul_128(r, ah, r);
  58127. err = sp_4096_mod_128_cond(r, r, m);
  58128. }
  58129. }
  58130. else {
  58131. int i;
  58132. sp_digit mp;
  58133. sp_4096_mont_setup(m, &mp);
  58134. /* Convert to Montgomery form. */
  58135. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  58136. err = sp_4096_mod_128_cond(a, a, m);
  58137. if (err == MP_OKAY) {
  58138. for (i = 31; i >= 0; i--) {
  58139. if (e[0] >> i) {
  58140. break;
  58141. }
  58142. }
  58143. XMEMCPY(r, a, sizeof(sp_digit) * 128);
  58144. for (i--; i >= 0; i--) {
  58145. sp_4096_mont_sqr_128(r, r, m, mp);
  58146. if (((e[0] >> i) & 1) == 1) {
  58147. sp_4096_mont_mul_128(r, r, a, m, mp);
  58148. }
  58149. }
  58150. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128);
  58151. sp_4096_mont_reduce_128(r, m, mp);
  58152. for (i = 127; i > 0; i--) {
  58153. if (r[i] != m[i]) {
  58154. break;
  58155. }
  58156. }
  58157. if (r[i] >= m[i]) {
  58158. sp_4096_sub_in_place_128(r, m);
  58159. }
  58160. }
  58161. }
  58162. }
  58163. if (err == MP_OKAY) {
  58164. sp_4096_to_bin_128(r, out);
  58165. *outLen = 512;
  58166. }
  58167. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  58168. if (a != NULL)
  58169. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  58170. #endif
  58171. return err;
  58172. }
  58173. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  58174. #ifdef WOLFSSL_SP_SMALL
  58175. /* Conditionally add a and b using the mask m.
  58176. * m is -1 to add and 0 when not.
  58177. *
  58178. * r A single precision number representing conditional add result.
  58179. * a A single precision number to add with.
  58180. * b A single precision number to add.
  58181. * m Mask value to apply.
  58182. */
  58183. static sp_digit sp_4096_cond_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  58184. {
  58185. register sp_digit* r asm ("r0") = r_p;
  58186. register const sp_digit* a asm ("r1") = a_p;
  58187. register const sp_digit* b asm ("r2") = b_p;
  58188. register sp_digit m asm ("r3") = m_p;
  58189. __asm__ __volatile__ (
  58190. "mov lr, #0\n\t"
  58191. "mov r6, #0\n\t"
  58192. "mov r12, #0\n\t"
  58193. "\n"
  58194. "L_sp_4096_cond_add_64_words_%=: \n\t"
  58195. "adds lr, lr, #-1\n\t"
  58196. "ldr r4, [%[a], r12]\n\t"
  58197. "ldr r5, [%[b], r12]\n\t"
  58198. "and r5, r5, %[m]\n\t"
  58199. "adcs r4, r4, r5\n\t"
  58200. "adc lr, r6, r6\n\t"
  58201. "str r4, [%[r], r12]\n\t"
  58202. "add r12, r12, #4\n\t"
  58203. "cmp r12, #0x100\n\t"
  58204. "blt L_sp_4096_cond_add_64_words_%=\n\t"
  58205. "mov %[r], lr\n\t"
  58206. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  58207. :
  58208. : "memory", "r12", "lr", "r4", "r5", "r6"
  58209. );
  58210. return (uint32_t)(size_t)r;
  58211. }
  58212. #else
  58213. /* Conditionally add a and b using the mask m.
  58214. * m is -1 to add and 0 when not.
  58215. *
  58216. * r A single precision number representing conditional add result.
  58217. * a A single precision number to add with.
  58218. * b A single precision number to add.
  58219. * m Mask value to apply.
  58220. */
  58221. static sp_digit sp_4096_cond_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  58222. {
  58223. register sp_digit* r asm ("r0") = r_p;
  58224. register const sp_digit* a asm ("r1") = a_p;
  58225. register const sp_digit* b asm ("r2") = b_p;
  58226. register sp_digit m asm ("r3") = m_p;
  58227. __asm__ __volatile__ (
  58228. "mov r8, #0\n\t"
  58229. "ldm %[a]!, {r4, r5}\n\t"
  58230. "ldm %[b]!, {r6, r7}\n\t"
  58231. "and r6, r6, %[m]\n\t"
  58232. "and r7, r7, %[m]\n\t"
  58233. "adds r4, r4, r6\n\t"
  58234. "adcs r5, r5, r7\n\t"
  58235. "stm %[r]!, {r4, r5}\n\t"
  58236. "ldm %[a]!, {r4, r5}\n\t"
  58237. "ldm %[b]!, {r6, r7}\n\t"
  58238. "and r6, r6, %[m]\n\t"
  58239. "and r7, r7, %[m]\n\t"
  58240. "adcs r4, r4, r6\n\t"
  58241. "adcs r5, r5, r7\n\t"
  58242. "stm %[r]!, {r4, r5}\n\t"
  58243. "ldm %[a]!, {r4, r5}\n\t"
  58244. "ldm %[b]!, {r6, r7}\n\t"
  58245. "and r6, r6, %[m]\n\t"
  58246. "and r7, r7, %[m]\n\t"
  58247. "adcs r4, r4, r6\n\t"
  58248. "adcs r5, r5, r7\n\t"
  58249. "stm %[r]!, {r4, r5}\n\t"
  58250. "ldm %[a]!, {r4, r5}\n\t"
  58251. "ldm %[b]!, {r6, r7}\n\t"
  58252. "and r6, r6, %[m]\n\t"
  58253. "and r7, r7, %[m]\n\t"
  58254. "adcs r4, r4, r6\n\t"
  58255. "adcs r5, r5, r7\n\t"
  58256. "stm %[r]!, {r4, r5}\n\t"
  58257. "ldm %[a]!, {r4, r5}\n\t"
  58258. "ldm %[b]!, {r6, r7}\n\t"
  58259. "and r6, r6, %[m]\n\t"
  58260. "and r7, r7, %[m]\n\t"
  58261. "adcs r4, r4, r6\n\t"
  58262. "adcs r5, r5, r7\n\t"
  58263. "stm %[r]!, {r4, r5}\n\t"
  58264. "ldm %[a]!, {r4, r5}\n\t"
  58265. "ldm %[b]!, {r6, r7}\n\t"
  58266. "and r6, r6, %[m]\n\t"
  58267. "and r7, r7, %[m]\n\t"
  58268. "adcs r4, r4, r6\n\t"
  58269. "adcs r5, r5, r7\n\t"
  58270. "stm %[r]!, {r4, r5}\n\t"
  58271. "ldm %[a]!, {r4, r5}\n\t"
  58272. "ldm %[b]!, {r6, r7}\n\t"
  58273. "and r6, r6, %[m]\n\t"
  58274. "and r7, r7, %[m]\n\t"
  58275. "adcs r4, r4, r6\n\t"
  58276. "adcs r5, r5, r7\n\t"
  58277. "stm %[r]!, {r4, r5}\n\t"
  58278. "ldm %[a]!, {r4, r5}\n\t"
  58279. "ldm %[b]!, {r6, r7}\n\t"
  58280. "and r6, r6, %[m]\n\t"
  58281. "and r7, r7, %[m]\n\t"
  58282. "adcs r4, r4, r6\n\t"
  58283. "adcs r5, r5, r7\n\t"
  58284. "stm %[r]!, {r4, r5}\n\t"
  58285. "ldm %[a]!, {r4, r5}\n\t"
  58286. "ldm %[b]!, {r6, r7}\n\t"
  58287. "and r6, r6, %[m]\n\t"
  58288. "and r7, r7, %[m]\n\t"
  58289. "adcs r4, r4, r6\n\t"
  58290. "adcs r5, r5, r7\n\t"
  58291. "stm %[r]!, {r4, r5}\n\t"
  58292. "ldm %[a]!, {r4, r5}\n\t"
  58293. "ldm %[b]!, {r6, r7}\n\t"
  58294. "and r6, r6, %[m]\n\t"
  58295. "and r7, r7, %[m]\n\t"
  58296. "adcs r4, r4, r6\n\t"
  58297. "adcs r5, r5, r7\n\t"
  58298. "stm %[r]!, {r4, r5}\n\t"
  58299. "ldm %[a]!, {r4, r5}\n\t"
  58300. "ldm %[b]!, {r6, r7}\n\t"
  58301. "and r6, r6, %[m]\n\t"
  58302. "and r7, r7, %[m]\n\t"
  58303. "adcs r4, r4, r6\n\t"
  58304. "adcs r5, r5, r7\n\t"
  58305. "stm %[r]!, {r4, r5}\n\t"
  58306. "ldm %[a]!, {r4, r5}\n\t"
  58307. "ldm %[b]!, {r6, r7}\n\t"
  58308. "and r6, r6, %[m]\n\t"
  58309. "and r7, r7, %[m]\n\t"
  58310. "adcs r4, r4, r6\n\t"
  58311. "adcs r5, r5, r7\n\t"
  58312. "stm %[r]!, {r4, r5}\n\t"
  58313. "ldm %[a]!, {r4, r5}\n\t"
  58314. "ldm %[b]!, {r6, r7}\n\t"
  58315. "and r6, r6, %[m]\n\t"
  58316. "and r7, r7, %[m]\n\t"
  58317. "adcs r4, r4, r6\n\t"
  58318. "adcs r5, r5, r7\n\t"
  58319. "stm %[r]!, {r4, r5}\n\t"
  58320. "ldm %[a]!, {r4, r5}\n\t"
  58321. "ldm %[b]!, {r6, r7}\n\t"
  58322. "and r6, r6, %[m]\n\t"
  58323. "and r7, r7, %[m]\n\t"
  58324. "adcs r4, r4, r6\n\t"
  58325. "adcs r5, r5, r7\n\t"
  58326. "stm %[r]!, {r4, r5}\n\t"
  58327. "ldm %[a]!, {r4, r5}\n\t"
  58328. "ldm %[b]!, {r6, r7}\n\t"
  58329. "and r6, r6, %[m]\n\t"
  58330. "and r7, r7, %[m]\n\t"
  58331. "adcs r4, r4, r6\n\t"
  58332. "adcs r5, r5, r7\n\t"
  58333. "stm %[r]!, {r4, r5}\n\t"
  58334. "ldm %[a]!, {r4, r5}\n\t"
  58335. "ldm %[b]!, {r6, r7}\n\t"
  58336. "and r6, r6, %[m]\n\t"
  58337. "and r7, r7, %[m]\n\t"
  58338. "adcs r4, r4, r6\n\t"
  58339. "adcs r5, r5, r7\n\t"
  58340. "stm %[r]!, {r4, r5}\n\t"
  58341. "ldm %[a]!, {r4, r5}\n\t"
  58342. "ldm %[b]!, {r6, r7}\n\t"
  58343. "and r6, r6, %[m]\n\t"
  58344. "and r7, r7, %[m]\n\t"
  58345. "adcs r4, r4, r6\n\t"
  58346. "adcs r5, r5, r7\n\t"
  58347. "stm %[r]!, {r4, r5}\n\t"
  58348. "ldm %[a]!, {r4, r5}\n\t"
  58349. "ldm %[b]!, {r6, r7}\n\t"
  58350. "and r6, r6, %[m]\n\t"
  58351. "and r7, r7, %[m]\n\t"
  58352. "adcs r4, r4, r6\n\t"
  58353. "adcs r5, r5, r7\n\t"
  58354. "stm %[r]!, {r4, r5}\n\t"
  58355. "ldm %[a]!, {r4, r5}\n\t"
  58356. "ldm %[b]!, {r6, r7}\n\t"
  58357. "and r6, r6, %[m]\n\t"
  58358. "and r7, r7, %[m]\n\t"
  58359. "adcs r4, r4, r6\n\t"
  58360. "adcs r5, r5, r7\n\t"
  58361. "stm %[r]!, {r4, r5}\n\t"
  58362. "ldm %[a]!, {r4, r5}\n\t"
  58363. "ldm %[b]!, {r6, r7}\n\t"
  58364. "and r6, r6, %[m]\n\t"
  58365. "and r7, r7, %[m]\n\t"
  58366. "adcs r4, r4, r6\n\t"
  58367. "adcs r5, r5, r7\n\t"
  58368. "stm %[r]!, {r4, r5}\n\t"
  58369. "ldm %[a]!, {r4, r5}\n\t"
  58370. "ldm %[b]!, {r6, r7}\n\t"
  58371. "and r6, r6, %[m]\n\t"
  58372. "and r7, r7, %[m]\n\t"
  58373. "adcs r4, r4, r6\n\t"
  58374. "adcs r5, r5, r7\n\t"
  58375. "stm %[r]!, {r4, r5}\n\t"
  58376. "ldm %[a]!, {r4, r5}\n\t"
  58377. "ldm %[b]!, {r6, r7}\n\t"
  58378. "and r6, r6, %[m]\n\t"
  58379. "and r7, r7, %[m]\n\t"
  58380. "adcs r4, r4, r6\n\t"
  58381. "adcs r5, r5, r7\n\t"
  58382. "stm %[r]!, {r4, r5}\n\t"
  58383. "ldm %[a]!, {r4, r5}\n\t"
  58384. "ldm %[b]!, {r6, r7}\n\t"
  58385. "and r6, r6, %[m]\n\t"
  58386. "and r7, r7, %[m]\n\t"
  58387. "adcs r4, r4, r6\n\t"
  58388. "adcs r5, r5, r7\n\t"
  58389. "stm %[r]!, {r4, r5}\n\t"
  58390. "ldm %[a]!, {r4, r5}\n\t"
  58391. "ldm %[b]!, {r6, r7}\n\t"
  58392. "and r6, r6, %[m]\n\t"
  58393. "and r7, r7, %[m]\n\t"
  58394. "adcs r4, r4, r6\n\t"
  58395. "adcs r5, r5, r7\n\t"
  58396. "stm %[r]!, {r4, r5}\n\t"
  58397. "ldm %[a]!, {r4, r5}\n\t"
  58398. "ldm %[b]!, {r6, r7}\n\t"
  58399. "and r6, r6, %[m]\n\t"
  58400. "and r7, r7, %[m]\n\t"
  58401. "adcs r4, r4, r6\n\t"
  58402. "adcs r5, r5, r7\n\t"
  58403. "stm %[r]!, {r4, r5}\n\t"
  58404. "ldm %[a]!, {r4, r5}\n\t"
  58405. "ldm %[b]!, {r6, r7}\n\t"
  58406. "and r6, r6, %[m]\n\t"
  58407. "and r7, r7, %[m]\n\t"
  58408. "adcs r4, r4, r6\n\t"
  58409. "adcs r5, r5, r7\n\t"
  58410. "stm %[r]!, {r4, r5}\n\t"
  58411. "ldm %[a]!, {r4, r5}\n\t"
  58412. "ldm %[b]!, {r6, r7}\n\t"
  58413. "and r6, r6, %[m]\n\t"
  58414. "and r7, r7, %[m]\n\t"
  58415. "adcs r4, r4, r6\n\t"
  58416. "adcs r5, r5, r7\n\t"
  58417. "stm %[r]!, {r4, r5}\n\t"
  58418. "ldm %[a]!, {r4, r5}\n\t"
  58419. "ldm %[b]!, {r6, r7}\n\t"
  58420. "and r6, r6, %[m]\n\t"
  58421. "and r7, r7, %[m]\n\t"
  58422. "adcs r4, r4, r6\n\t"
  58423. "adcs r5, r5, r7\n\t"
  58424. "stm %[r]!, {r4, r5}\n\t"
  58425. "ldm %[a]!, {r4, r5}\n\t"
  58426. "ldm %[b]!, {r6, r7}\n\t"
  58427. "and r6, r6, %[m]\n\t"
  58428. "and r7, r7, %[m]\n\t"
  58429. "adcs r4, r4, r6\n\t"
  58430. "adcs r5, r5, r7\n\t"
  58431. "stm %[r]!, {r4, r5}\n\t"
  58432. "ldm %[a]!, {r4, r5}\n\t"
  58433. "ldm %[b]!, {r6, r7}\n\t"
  58434. "and r6, r6, %[m]\n\t"
  58435. "and r7, r7, %[m]\n\t"
  58436. "adcs r4, r4, r6\n\t"
  58437. "adcs r5, r5, r7\n\t"
  58438. "stm %[r]!, {r4, r5}\n\t"
  58439. "ldm %[a]!, {r4, r5}\n\t"
  58440. "ldm %[b]!, {r6, r7}\n\t"
  58441. "and r6, r6, %[m]\n\t"
  58442. "and r7, r7, %[m]\n\t"
  58443. "adcs r4, r4, r6\n\t"
  58444. "adcs r5, r5, r7\n\t"
  58445. "stm %[r]!, {r4, r5}\n\t"
  58446. "ldm %[a]!, {r4, r5}\n\t"
  58447. "ldm %[b]!, {r6, r7}\n\t"
  58448. "and r6, r6, %[m]\n\t"
  58449. "and r7, r7, %[m]\n\t"
  58450. "adcs r4, r4, r6\n\t"
  58451. "adcs r5, r5, r7\n\t"
  58452. "stm %[r]!, {r4, r5}\n\t"
  58453. "adc %[r], r8, r8\n\t"
  58454. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  58455. :
  58456. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  58457. );
  58458. return (uint32_t)(size_t)r;
  58459. }
  58460. #endif /* WOLFSSL_SP_SMALL */
  58461. /* RSA private key operation.
  58462. *
  58463. * in Array of bytes representing the number to exponentiate, base.
  58464. * inLen Number of bytes in base.
  58465. * dm Private exponent.
  58466. * pm First prime.
  58467. * qm Second prime.
  58468. * dpm First prime's CRT exponent.
  58469. * dqm Second prime's CRT exponent.
  58470. * qim Inverse of second prime mod p.
  58471. * mm Modulus.
  58472. * out Buffer to hold big-endian bytes of exponentiation result.
  58473. * Must be at least 512 bytes long.
  58474. * outLen Number of bytes in result.
  58475. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  58476. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  58477. */
  58478. int sp_RsaPrivate_4096(const byte* in, word32 inLen, const mp_int* dm,
  58479. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  58480. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  58481. {
  58482. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  58483. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  58484. sp_digit* d = NULL;
  58485. #else
  58486. sp_digit d[128 * 4];
  58487. #endif
  58488. sp_digit* a = NULL;
  58489. sp_digit* m = NULL;
  58490. sp_digit* r = NULL;
  58491. int err = MP_OKAY;
  58492. (void)pm;
  58493. (void)qm;
  58494. (void)dpm;
  58495. (void)dqm;
  58496. (void)qim;
  58497. if (*outLen < 512U) {
  58498. err = MP_TO_E;
  58499. }
  58500. if (err == MP_OKAY) {
  58501. if (mp_count_bits(dm) > 4096) {
  58502. err = MP_READ_E;
  58503. }
  58504. else if (inLen > 512) {
  58505. err = MP_READ_E;
  58506. }
  58507. else if (mp_count_bits(mm) != 4096) {
  58508. err = MP_READ_E;
  58509. }
  58510. else if (mp_iseven(mm)) {
  58511. err = MP_VAL;
  58512. }
  58513. }
  58514. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  58515. if (err == MP_OKAY) {
  58516. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL,
  58517. DYNAMIC_TYPE_RSA);
  58518. if (d == NULL)
  58519. err = MEMORY_E;
  58520. }
  58521. #endif
  58522. if (err == MP_OKAY) {
  58523. a = d + 128;
  58524. m = a + 256;
  58525. r = a;
  58526. sp_4096_from_bin(a, 128, in, inLen);
  58527. sp_4096_from_mp(d, 128, dm);
  58528. sp_4096_from_mp(m, 128, mm);
  58529. err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0);
  58530. }
  58531. if (err == MP_OKAY) {
  58532. sp_4096_to_bin_128(r, out);
  58533. *outLen = 512;
  58534. }
  58535. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  58536. if (d != NULL)
  58537. #endif
  58538. {
  58539. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  58540. if (a != NULL)
  58541. ForceZero(a, sizeof(sp_digit) * 128);
  58542. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  58543. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  58544. #endif
  58545. }
  58546. return err;
  58547. #else
  58548. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  58549. sp_digit* a = NULL;
  58550. #else
  58551. sp_digit a[64 * 11];
  58552. #endif
  58553. sp_digit* p = NULL;
  58554. sp_digit* q = NULL;
  58555. sp_digit* dp = NULL;
  58556. sp_digit* tmpa = NULL;
  58557. sp_digit* tmpb = NULL;
  58558. sp_digit* r = NULL;
  58559. sp_digit* qi = NULL;
  58560. sp_digit* dq = NULL;
  58561. sp_digit c;
  58562. int err = MP_OKAY;
  58563. (void)dm;
  58564. (void)mm;
  58565. if (*outLen < 512) {
  58566. err = MP_TO_E;
  58567. }
  58568. else if (inLen > 512 || mp_count_bits(mm) != 4096) {
  58569. err = MP_READ_E;
  58570. }
  58571. else if (mp_iseven(mm)) {
  58572. err = MP_VAL;
  58573. }
  58574. else if (mp_iseven(pm)) {
  58575. err = MP_VAL;
  58576. }
  58577. else if (mp_iseven(qm)) {
  58578. err = MP_VAL;
  58579. }
  58580. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  58581. if (err == MP_OKAY) {
  58582. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 11, NULL,
  58583. DYNAMIC_TYPE_RSA);
  58584. if (a == NULL)
  58585. err = MEMORY_E;
  58586. }
  58587. #endif
  58588. if (err == MP_OKAY) {
  58589. p = a + 128 * 2;
  58590. q = p + 64;
  58591. qi = dq = dp = q + 64;
  58592. tmpa = qi + 64;
  58593. tmpb = tmpa + 128;
  58594. r = a;
  58595. sp_4096_from_bin(a, 128, in, inLen);
  58596. sp_4096_from_mp(p, 64, pm);
  58597. sp_4096_from_mp(q, 64, qm);
  58598. sp_4096_from_mp(dp, 64, dpm);
  58599. err = sp_2048_mod_exp_64(tmpa, a, dp, 2048, p, 1);
  58600. }
  58601. if (err == MP_OKAY) {
  58602. sp_4096_from_mp(dq, 64, dqm);
  58603. err = sp_2048_mod_exp_64(tmpb, a, dq, 2048, q, 1);
  58604. }
  58605. if (err == MP_OKAY) {
  58606. c = sp_2048_sub_in_place_64(tmpa, tmpb);
  58607. c += sp_4096_cond_add_64(tmpa, tmpa, p, c);
  58608. sp_4096_cond_add_64(tmpa, tmpa, p, c);
  58609. sp_2048_from_mp(qi, 64, qim);
  58610. sp_2048_mul_64(tmpa, tmpa, qi);
  58611. err = sp_2048_mod_64(tmpa, tmpa, p);
  58612. }
  58613. if (err == MP_OKAY) {
  58614. sp_2048_mul_64(tmpa, q, tmpa);
  58615. XMEMSET(&tmpb[64], 0, sizeof(sp_digit) * 64);
  58616. sp_4096_add_128(r, tmpb, tmpa);
  58617. sp_4096_to_bin_128(r, out);
  58618. *outLen = 512;
  58619. }
  58620. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  58621. if (a != NULL)
  58622. #endif
  58623. {
  58624. ForceZero(a, sizeof(sp_digit) * 64 * 11);
  58625. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  58626. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  58627. #endif
  58628. }
  58629. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  58630. return err;
  58631. }
  58632. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  58633. #endif /* WOLFSSL_HAVE_SP_RSA */
  58634. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  58635. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  58636. /* Convert an array of sp_digit to an mp_int.
  58637. *
  58638. * a A single precision integer.
  58639. * r A multi-precision integer.
  58640. */
  58641. static int sp_4096_to_mp(const sp_digit* a, mp_int* r)
  58642. {
  58643. int err;
  58644. err = mp_grow(r, (4096 + DIGIT_BIT - 1) / DIGIT_BIT);
  58645. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  58646. #if DIGIT_BIT == 32
  58647. XMEMCPY(r->dp, a, sizeof(sp_digit) * 128);
  58648. r->used = 128;
  58649. mp_clamp(r);
  58650. #elif DIGIT_BIT < 32
  58651. int i;
  58652. int j = 0;
  58653. int s = 0;
  58654. r->dp[0] = 0;
  58655. for (i = 0; i < 128; i++) {
  58656. r->dp[j] |= (mp_digit)(a[i] << s);
  58657. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  58658. s = DIGIT_BIT - s;
  58659. r->dp[++j] = (mp_digit)(a[i] >> s);
  58660. while (s + DIGIT_BIT <= 32) {
  58661. s += DIGIT_BIT;
  58662. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  58663. if (s == SP_WORD_SIZE) {
  58664. r->dp[j] = 0;
  58665. }
  58666. else {
  58667. r->dp[j] = (mp_digit)(a[i] >> s);
  58668. }
  58669. }
  58670. s = 32 - s;
  58671. }
  58672. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  58673. mp_clamp(r);
  58674. #else
  58675. int i;
  58676. int j = 0;
  58677. int s = 0;
  58678. r->dp[0] = 0;
  58679. for (i = 0; i < 128; i++) {
  58680. r->dp[j] |= ((mp_digit)a[i]) << s;
  58681. if (s + 32 >= DIGIT_BIT) {
  58682. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  58683. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  58684. #endif
  58685. s = DIGIT_BIT - s;
  58686. r->dp[++j] = a[i] >> s;
  58687. s = 32 - s;
  58688. }
  58689. else {
  58690. s += 32;
  58691. }
  58692. }
  58693. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  58694. mp_clamp(r);
  58695. #endif
  58696. }
  58697. return err;
  58698. }
  58699. /* Perform the modular exponentiation for Diffie-Hellman.
  58700. *
  58701. * base Base. MP integer.
  58702. * exp Exponent. MP integer.
  58703. * mod Modulus. MP integer.
  58704. * res Result. MP integer.
  58705. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  58706. * and MEMORY_E if memory allocation fails.
  58707. */
  58708. int sp_ModExp_4096(const mp_int* base, const mp_int* exp, const mp_int* mod,
  58709. mp_int* res)
  58710. {
  58711. int err = MP_OKAY;
  58712. sp_digit b[256];
  58713. sp_digit e[128];
  58714. sp_digit m[128];
  58715. sp_digit* r = b;
  58716. int expBits = mp_count_bits(exp);
  58717. if (mp_count_bits(base) > 4096) {
  58718. err = MP_READ_E;
  58719. }
  58720. else if (expBits > 4096) {
  58721. err = MP_READ_E;
  58722. }
  58723. else if (mp_count_bits(mod) != 4096) {
  58724. err = MP_READ_E;
  58725. }
  58726. else if (mp_iseven(mod)) {
  58727. err = MP_VAL;
  58728. }
  58729. if (err == MP_OKAY) {
  58730. sp_4096_from_mp(b, 128, base);
  58731. sp_4096_from_mp(e, 128, exp);
  58732. sp_4096_from_mp(m, 128, mod);
  58733. err = sp_4096_mod_exp_128(r, b, e, expBits, m, 0);
  58734. }
  58735. if (err == MP_OKAY) {
  58736. err = sp_4096_to_mp(r, res);
  58737. }
  58738. XMEMSET(e, 0, sizeof(e));
  58739. return err;
  58740. }
  58741. #ifdef WOLFSSL_HAVE_SP_DH
  58742. #ifdef HAVE_FFDHE_4096
  58743. static void sp_4096_lshift_128(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  58744. {
  58745. register sp_digit* r asm ("r0") = r_p;
  58746. register const sp_digit* a asm ("r1") = a_p;
  58747. register byte n asm ("r2") = n_p;
  58748. __asm__ __volatile__ (
  58749. "rsb r12, %[n], #31\n\t"
  58750. "ldr r5, [%[a], #508]\n\t"
  58751. "lsr r6, r5, #1\n\t"
  58752. "lsl r5, r5, %[n]\n\t"
  58753. "lsr r6, r6, r12\n\t"
  58754. "ldr r4, [%[a], #504]\n\t"
  58755. "str r6, [%[r], #512]\n\t"
  58756. "lsr r3, r4, #1\n\t"
  58757. "lsl r4, r4, %[n]\n\t"
  58758. "lsr r3, r3, r12\n\t"
  58759. "orr r5, r5, r3\n\t"
  58760. "ldr r6, [%[a], #500]\n\t"
  58761. "str r5, [%[r], #508]\n\t"
  58762. "lsr r3, r6, #1\n\t"
  58763. "lsl r6, r6, %[n]\n\t"
  58764. "lsr r3, r3, r12\n\t"
  58765. "orr r4, r4, r3\n\t"
  58766. "ldr r5, [%[a], #496]\n\t"
  58767. "str r4, [%[r], #504]\n\t"
  58768. "lsr r3, r5, #1\n\t"
  58769. "lsl r5, r5, %[n]\n\t"
  58770. "lsr r3, r3, r12\n\t"
  58771. "orr r6, r6, r3\n\t"
  58772. "ldr r4, [%[a], #492]\n\t"
  58773. "str r6, [%[r], #500]\n\t"
  58774. "lsr r3, r4, #1\n\t"
  58775. "lsl r4, r4, %[n]\n\t"
  58776. "lsr r3, r3, r12\n\t"
  58777. "orr r5, r5, r3\n\t"
  58778. "ldr r6, [%[a], #488]\n\t"
  58779. "str r5, [%[r], #496]\n\t"
  58780. "lsr r3, r6, #1\n\t"
  58781. "lsl r6, r6, %[n]\n\t"
  58782. "lsr r3, r3, r12\n\t"
  58783. "orr r4, r4, r3\n\t"
  58784. "ldr r5, [%[a], #484]\n\t"
  58785. "str r4, [%[r], #492]\n\t"
  58786. "lsr r3, r5, #1\n\t"
  58787. "lsl r5, r5, %[n]\n\t"
  58788. "lsr r3, r3, r12\n\t"
  58789. "orr r6, r6, r3\n\t"
  58790. "ldr r4, [%[a], #480]\n\t"
  58791. "str r6, [%[r], #488]\n\t"
  58792. "lsr r3, r4, #1\n\t"
  58793. "lsl r4, r4, %[n]\n\t"
  58794. "lsr r3, r3, r12\n\t"
  58795. "orr r5, r5, r3\n\t"
  58796. "ldr r6, [%[a], #476]\n\t"
  58797. "str r5, [%[r], #484]\n\t"
  58798. "lsr r3, r6, #1\n\t"
  58799. "lsl r6, r6, %[n]\n\t"
  58800. "lsr r3, r3, r12\n\t"
  58801. "orr r4, r4, r3\n\t"
  58802. "ldr r5, [%[a], #472]\n\t"
  58803. "str r4, [%[r], #480]\n\t"
  58804. "lsr r3, r5, #1\n\t"
  58805. "lsl r5, r5, %[n]\n\t"
  58806. "lsr r3, r3, r12\n\t"
  58807. "orr r6, r6, r3\n\t"
  58808. "ldr r4, [%[a], #468]\n\t"
  58809. "str r6, [%[r], #476]\n\t"
  58810. "lsr r3, r4, #1\n\t"
  58811. "lsl r4, r4, %[n]\n\t"
  58812. "lsr r3, r3, r12\n\t"
  58813. "orr r5, r5, r3\n\t"
  58814. "ldr r6, [%[a], #464]\n\t"
  58815. "str r5, [%[r], #472]\n\t"
  58816. "lsr r3, r6, #1\n\t"
  58817. "lsl r6, r6, %[n]\n\t"
  58818. "lsr r3, r3, r12\n\t"
  58819. "orr r4, r4, r3\n\t"
  58820. "ldr r5, [%[a], #460]\n\t"
  58821. "str r4, [%[r], #468]\n\t"
  58822. "lsr r3, r5, #1\n\t"
  58823. "lsl r5, r5, %[n]\n\t"
  58824. "lsr r3, r3, r12\n\t"
  58825. "orr r6, r6, r3\n\t"
  58826. "ldr r4, [%[a], #456]\n\t"
  58827. "str r6, [%[r], #464]\n\t"
  58828. "lsr r3, r4, #1\n\t"
  58829. "lsl r4, r4, %[n]\n\t"
  58830. "lsr r3, r3, r12\n\t"
  58831. "orr r5, r5, r3\n\t"
  58832. "ldr r6, [%[a], #452]\n\t"
  58833. "str r5, [%[r], #460]\n\t"
  58834. "lsr r3, r6, #1\n\t"
  58835. "lsl r6, r6, %[n]\n\t"
  58836. "lsr r3, r3, r12\n\t"
  58837. "orr r4, r4, r3\n\t"
  58838. "ldr r5, [%[a], #448]\n\t"
  58839. "str r4, [%[r], #456]\n\t"
  58840. "lsr r3, r5, #1\n\t"
  58841. "lsl r5, r5, %[n]\n\t"
  58842. "lsr r3, r3, r12\n\t"
  58843. "orr r6, r6, r3\n\t"
  58844. "ldr r4, [%[a], #444]\n\t"
  58845. "str r6, [%[r], #452]\n\t"
  58846. "lsr r3, r4, #1\n\t"
  58847. "lsl r4, r4, %[n]\n\t"
  58848. "lsr r3, r3, r12\n\t"
  58849. "orr r5, r5, r3\n\t"
  58850. "ldr r6, [%[a], #440]\n\t"
  58851. "str r5, [%[r], #448]\n\t"
  58852. "lsr r3, r6, #1\n\t"
  58853. "lsl r6, r6, %[n]\n\t"
  58854. "lsr r3, r3, r12\n\t"
  58855. "orr r4, r4, r3\n\t"
  58856. "ldr r5, [%[a], #436]\n\t"
  58857. "str r4, [%[r], #444]\n\t"
  58858. "lsr r3, r5, #1\n\t"
  58859. "lsl r5, r5, %[n]\n\t"
  58860. "lsr r3, r3, r12\n\t"
  58861. "orr r6, r6, r3\n\t"
  58862. "ldr r4, [%[a], #432]\n\t"
  58863. "str r6, [%[r], #440]\n\t"
  58864. "lsr r3, r4, #1\n\t"
  58865. "lsl r4, r4, %[n]\n\t"
  58866. "lsr r3, r3, r12\n\t"
  58867. "orr r5, r5, r3\n\t"
  58868. "ldr r6, [%[a], #428]\n\t"
  58869. "str r5, [%[r], #436]\n\t"
  58870. "lsr r3, r6, #1\n\t"
  58871. "lsl r6, r6, %[n]\n\t"
  58872. "lsr r3, r3, r12\n\t"
  58873. "orr r4, r4, r3\n\t"
  58874. "ldr r5, [%[a], #424]\n\t"
  58875. "str r4, [%[r], #432]\n\t"
  58876. "lsr r3, r5, #1\n\t"
  58877. "lsl r5, r5, %[n]\n\t"
  58878. "lsr r3, r3, r12\n\t"
  58879. "orr r6, r6, r3\n\t"
  58880. "ldr r4, [%[a], #420]\n\t"
  58881. "str r6, [%[r], #428]\n\t"
  58882. "lsr r3, r4, #1\n\t"
  58883. "lsl r4, r4, %[n]\n\t"
  58884. "lsr r3, r3, r12\n\t"
  58885. "orr r5, r5, r3\n\t"
  58886. "ldr r6, [%[a], #416]\n\t"
  58887. "str r5, [%[r], #424]\n\t"
  58888. "lsr r3, r6, #1\n\t"
  58889. "lsl r6, r6, %[n]\n\t"
  58890. "lsr r3, r3, r12\n\t"
  58891. "orr r4, r4, r3\n\t"
  58892. "ldr r5, [%[a], #412]\n\t"
  58893. "str r4, [%[r], #420]\n\t"
  58894. "lsr r3, r5, #1\n\t"
  58895. "lsl r5, r5, %[n]\n\t"
  58896. "lsr r3, r3, r12\n\t"
  58897. "orr r6, r6, r3\n\t"
  58898. "ldr r4, [%[a], #408]\n\t"
  58899. "str r6, [%[r], #416]\n\t"
  58900. "lsr r3, r4, #1\n\t"
  58901. "lsl r4, r4, %[n]\n\t"
  58902. "lsr r3, r3, r12\n\t"
  58903. "orr r5, r5, r3\n\t"
  58904. "ldr r6, [%[a], #404]\n\t"
  58905. "str r5, [%[r], #412]\n\t"
  58906. "lsr r3, r6, #1\n\t"
  58907. "lsl r6, r6, %[n]\n\t"
  58908. "lsr r3, r3, r12\n\t"
  58909. "orr r4, r4, r3\n\t"
  58910. "ldr r5, [%[a], #400]\n\t"
  58911. "str r4, [%[r], #408]\n\t"
  58912. "lsr r3, r5, #1\n\t"
  58913. "lsl r5, r5, %[n]\n\t"
  58914. "lsr r3, r3, r12\n\t"
  58915. "orr r6, r6, r3\n\t"
  58916. "ldr r4, [%[a], #396]\n\t"
  58917. "str r6, [%[r], #404]\n\t"
  58918. "lsr r3, r4, #1\n\t"
  58919. "lsl r4, r4, %[n]\n\t"
  58920. "lsr r3, r3, r12\n\t"
  58921. "orr r5, r5, r3\n\t"
  58922. "ldr r6, [%[a], #392]\n\t"
  58923. "str r5, [%[r], #400]\n\t"
  58924. "lsr r3, r6, #1\n\t"
  58925. "lsl r6, r6, %[n]\n\t"
  58926. "lsr r3, r3, r12\n\t"
  58927. "orr r4, r4, r3\n\t"
  58928. "ldr r5, [%[a], #388]\n\t"
  58929. "str r4, [%[r], #396]\n\t"
  58930. "lsr r3, r5, #1\n\t"
  58931. "lsl r5, r5, %[n]\n\t"
  58932. "lsr r3, r3, r12\n\t"
  58933. "orr r6, r6, r3\n\t"
  58934. "ldr r4, [%[a], #384]\n\t"
  58935. "str r6, [%[r], #392]\n\t"
  58936. "lsr r3, r4, #1\n\t"
  58937. "lsl r4, r4, %[n]\n\t"
  58938. "lsr r3, r3, r12\n\t"
  58939. "orr r5, r5, r3\n\t"
  58940. "ldr r6, [%[a], #380]\n\t"
  58941. "str r5, [%[r], #388]\n\t"
  58942. "lsr r3, r6, #1\n\t"
  58943. "lsl r6, r6, %[n]\n\t"
  58944. "lsr r3, r3, r12\n\t"
  58945. "orr r4, r4, r3\n\t"
  58946. "ldr r5, [%[a], #376]\n\t"
  58947. "str r4, [%[r], #384]\n\t"
  58948. "lsr r3, r5, #1\n\t"
  58949. "lsl r5, r5, %[n]\n\t"
  58950. "lsr r3, r3, r12\n\t"
  58951. "orr r6, r6, r3\n\t"
  58952. "ldr r4, [%[a], #372]\n\t"
  58953. "str r6, [%[r], #380]\n\t"
  58954. "lsr r3, r4, #1\n\t"
  58955. "lsl r4, r4, %[n]\n\t"
  58956. "lsr r3, r3, r12\n\t"
  58957. "orr r5, r5, r3\n\t"
  58958. "ldr r6, [%[a], #368]\n\t"
  58959. "str r5, [%[r], #376]\n\t"
  58960. "lsr r3, r6, #1\n\t"
  58961. "lsl r6, r6, %[n]\n\t"
  58962. "lsr r3, r3, r12\n\t"
  58963. "orr r4, r4, r3\n\t"
  58964. "ldr r5, [%[a], #364]\n\t"
  58965. "str r4, [%[r], #372]\n\t"
  58966. "lsr r3, r5, #1\n\t"
  58967. "lsl r5, r5, %[n]\n\t"
  58968. "lsr r3, r3, r12\n\t"
  58969. "orr r6, r6, r3\n\t"
  58970. "ldr r4, [%[a], #360]\n\t"
  58971. "str r6, [%[r], #368]\n\t"
  58972. "lsr r3, r4, #1\n\t"
  58973. "lsl r4, r4, %[n]\n\t"
  58974. "lsr r3, r3, r12\n\t"
  58975. "orr r5, r5, r3\n\t"
  58976. "ldr r6, [%[a], #356]\n\t"
  58977. "str r5, [%[r], #364]\n\t"
  58978. "lsr r3, r6, #1\n\t"
  58979. "lsl r6, r6, %[n]\n\t"
  58980. "lsr r3, r3, r12\n\t"
  58981. "orr r4, r4, r3\n\t"
  58982. "ldr r5, [%[a], #352]\n\t"
  58983. "str r4, [%[r], #360]\n\t"
  58984. "lsr r3, r5, #1\n\t"
  58985. "lsl r5, r5, %[n]\n\t"
  58986. "lsr r3, r3, r12\n\t"
  58987. "orr r6, r6, r3\n\t"
  58988. "ldr r4, [%[a], #348]\n\t"
  58989. "str r6, [%[r], #356]\n\t"
  58990. "lsr r3, r4, #1\n\t"
  58991. "lsl r4, r4, %[n]\n\t"
  58992. "lsr r3, r3, r12\n\t"
  58993. "orr r5, r5, r3\n\t"
  58994. "ldr r6, [%[a], #344]\n\t"
  58995. "str r5, [%[r], #352]\n\t"
  58996. "lsr r3, r6, #1\n\t"
  58997. "lsl r6, r6, %[n]\n\t"
  58998. "lsr r3, r3, r12\n\t"
  58999. "orr r4, r4, r3\n\t"
  59000. "ldr r5, [%[a], #340]\n\t"
  59001. "str r4, [%[r], #348]\n\t"
  59002. "lsr r3, r5, #1\n\t"
  59003. "lsl r5, r5, %[n]\n\t"
  59004. "lsr r3, r3, r12\n\t"
  59005. "orr r6, r6, r3\n\t"
  59006. "ldr r4, [%[a], #336]\n\t"
  59007. "str r6, [%[r], #344]\n\t"
  59008. "lsr r3, r4, #1\n\t"
  59009. "lsl r4, r4, %[n]\n\t"
  59010. "lsr r3, r3, r12\n\t"
  59011. "orr r5, r5, r3\n\t"
  59012. "ldr r6, [%[a], #332]\n\t"
  59013. "str r5, [%[r], #340]\n\t"
  59014. "lsr r3, r6, #1\n\t"
  59015. "lsl r6, r6, %[n]\n\t"
  59016. "lsr r3, r3, r12\n\t"
  59017. "orr r4, r4, r3\n\t"
  59018. "ldr r5, [%[a], #328]\n\t"
  59019. "str r4, [%[r], #336]\n\t"
  59020. "lsr r3, r5, #1\n\t"
  59021. "lsl r5, r5, %[n]\n\t"
  59022. "lsr r3, r3, r12\n\t"
  59023. "orr r6, r6, r3\n\t"
  59024. "ldr r4, [%[a], #324]\n\t"
  59025. "str r6, [%[r], #332]\n\t"
  59026. "lsr r3, r4, #1\n\t"
  59027. "lsl r4, r4, %[n]\n\t"
  59028. "lsr r3, r3, r12\n\t"
  59029. "orr r5, r5, r3\n\t"
  59030. "ldr r6, [%[a], #320]\n\t"
  59031. "str r5, [%[r], #328]\n\t"
  59032. "lsr r3, r6, #1\n\t"
  59033. "lsl r6, r6, %[n]\n\t"
  59034. "lsr r3, r3, r12\n\t"
  59035. "orr r4, r4, r3\n\t"
  59036. "ldr r5, [%[a], #316]\n\t"
  59037. "str r4, [%[r], #324]\n\t"
  59038. "lsr r3, r5, #1\n\t"
  59039. "lsl r5, r5, %[n]\n\t"
  59040. "lsr r3, r3, r12\n\t"
  59041. "orr r6, r6, r3\n\t"
  59042. "ldr r4, [%[a], #312]\n\t"
  59043. "str r6, [%[r], #320]\n\t"
  59044. "lsr r3, r4, #1\n\t"
  59045. "lsl r4, r4, %[n]\n\t"
  59046. "lsr r3, r3, r12\n\t"
  59047. "orr r5, r5, r3\n\t"
  59048. "ldr r6, [%[a], #308]\n\t"
  59049. "str r5, [%[r], #316]\n\t"
  59050. "lsr r3, r6, #1\n\t"
  59051. "lsl r6, r6, %[n]\n\t"
  59052. "lsr r3, r3, r12\n\t"
  59053. "orr r4, r4, r3\n\t"
  59054. "ldr r5, [%[a], #304]\n\t"
  59055. "str r4, [%[r], #312]\n\t"
  59056. "lsr r3, r5, #1\n\t"
  59057. "lsl r5, r5, %[n]\n\t"
  59058. "lsr r3, r3, r12\n\t"
  59059. "orr r6, r6, r3\n\t"
  59060. "ldr r4, [%[a], #300]\n\t"
  59061. "str r6, [%[r], #308]\n\t"
  59062. "lsr r3, r4, #1\n\t"
  59063. "lsl r4, r4, %[n]\n\t"
  59064. "lsr r3, r3, r12\n\t"
  59065. "orr r5, r5, r3\n\t"
  59066. "ldr r6, [%[a], #296]\n\t"
  59067. "str r5, [%[r], #304]\n\t"
  59068. "lsr r3, r6, #1\n\t"
  59069. "lsl r6, r6, %[n]\n\t"
  59070. "lsr r3, r3, r12\n\t"
  59071. "orr r4, r4, r3\n\t"
  59072. "ldr r5, [%[a], #292]\n\t"
  59073. "str r4, [%[r], #300]\n\t"
  59074. "lsr r3, r5, #1\n\t"
  59075. "lsl r5, r5, %[n]\n\t"
  59076. "lsr r3, r3, r12\n\t"
  59077. "orr r6, r6, r3\n\t"
  59078. "ldr r4, [%[a], #288]\n\t"
  59079. "str r6, [%[r], #296]\n\t"
  59080. "lsr r3, r4, #1\n\t"
  59081. "lsl r4, r4, %[n]\n\t"
  59082. "lsr r3, r3, r12\n\t"
  59083. "orr r5, r5, r3\n\t"
  59084. "ldr r6, [%[a], #284]\n\t"
  59085. "str r5, [%[r], #292]\n\t"
  59086. "lsr r3, r6, #1\n\t"
  59087. "lsl r6, r6, %[n]\n\t"
  59088. "lsr r3, r3, r12\n\t"
  59089. "orr r4, r4, r3\n\t"
  59090. "ldr r5, [%[a], #280]\n\t"
  59091. "str r4, [%[r], #288]\n\t"
  59092. "lsr r3, r5, #1\n\t"
  59093. "lsl r5, r5, %[n]\n\t"
  59094. "lsr r3, r3, r12\n\t"
  59095. "orr r6, r6, r3\n\t"
  59096. "ldr r4, [%[a], #276]\n\t"
  59097. "str r6, [%[r], #284]\n\t"
  59098. "lsr r3, r4, #1\n\t"
  59099. "lsl r4, r4, %[n]\n\t"
  59100. "lsr r3, r3, r12\n\t"
  59101. "orr r5, r5, r3\n\t"
  59102. "ldr r6, [%[a], #272]\n\t"
  59103. "str r5, [%[r], #280]\n\t"
  59104. "lsr r3, r6, #1\n\t"
  59105. "lsl r6, r6, %[n]\n\t"
  59106. "lsr r3, r3, r12\n\t"
  59107. "orr r4, r4, r3\n\t"
  59108. "ldr r5, [%[a], #268]\n\t"
  59109. "str r4, [%[r], #276]\n\t"
  59110. "lsr r3, r5, #1\n\t"
  59111. "lsl r5, r5, %[n]\n\t"
  59112. "lsr r3, r3, r12\n\t"
  59113. "orr r6, r6, r3\n\t"
  59114. "ldr r4, [%[a], #264]\n\t"
  59115. "str r6, [%[r], #272]\n\t"
  59116. "lsr r3, r4, #1\n\t"
  59117. "lsl r4, r4, %[n]\n\t"
  59118. "lsr r3, r3, r12\n\t"
  59119. "orr r5, r5, r3\n\t"
  59120. "ldr r6, [%[a], #260]\n\t"
  59121. "str r5, [%[r], #268]\n\t"
  59122. "lsr r3, r6, #1\n\t"
  59123. "lsl r6, r6, %[n]\n\t"
  59124. "lsr r3, r3, r12\n\t"
  59125. "orr r4, r4, r3\n\t"
  59126. "ldr r5, [%[a], #256]\n\t"
  59127. "str r4, [%[r], #264]\n\t"
  59128. "lsr r3, r5, #1\n\t"
  59129. "lsl r5, r5, %[n]\n\t"
  59130. "lsr r3, r3, r12\n\t"
  59131. "orr r6, r6, r3\n\t"
  59132. "ldr r4, [%[a], #252]\n\t"
  59133. "str r6, [%[r], #260]\n\t"
  59134. "lsr r3, r4, #1\n\t"
  59135. "lsl r4, r4, %[n]\n\t"
  59136. "lsr r3, r3, r12\n\t"
  59137. "orr r5, r5, r3\n\t"
  59138. "ldr r6, [%[a], #248]\n\t"
  59139. "str r5, [%[r], #256]\n\t"
  59140. "lsr r3, r6, #1\n\t"
  59141. "lsl r6, r6, %[n]\n\t"
  59142. "lsr r3, r3, r12\n\t"
  59143. "orr r4, r4, r3\n\t"
  59144. "ldr r5, [%[a], #244]\n\t"
  59145. "str r4, [%[r], #252]\n\t"
  59146. "lsr r3, r5, #1\n\t"
  59147. "lsl r5, r5, %[n]\n\t"
  59148. "lsr r3, r3, r12\n\t"
  59149. "orr r6, r6, r3\n\t"
  59150. "ldr r4, [%[a], #240]\n\t"
  59151. "str r6, [%[r], #248]\n\t"
  59152. "lsr r3, r4, #1\n\t"
  59153. "lsl r4, r4, %[n]\n\t"
  59154. "lsr r3, r3, r12\n\t"
  59155. "orr r5, r5, r3\n\t"
  59156. "ldr r6, [%[a], #236]\n\t"
  59157. "str r5, [%[r], #244]\n\t"
  59158. "lsr r3, r6, #1\n\t"
  59159. "lsl r6, r6, %[n]\n\t"
  59160. "lsr r3, r3, r12\n\t"
  59161. "orr r4, r4, r3\n\t"
  59162. "ldr r5, [%[a], #232]\n\t"
  59163. "str r4, [%[r], #240]\n\t"
  59164. "lsr r3, r5, #1\n\t"
  59165. "lsl r5, r5, %[n]\n\t"
  59166. "lsr r3, r3, r12\n\t"
  59167. "orr r6, r6, r3\n\t"
  59168. "ldr r4, [%[a], #228]\n\t"
  59169. "str r6, [%[r], #236]\n\t"
  59170. "lsr r3, r4, #1\n\t"
  59171. "lsl r4, r4, %[n]\n\t"
  59172. "lsr r3, r3, r12\n\t"
  59173. "orr r5, r5, r3\n\t"
  59174. "ldr r6, [%[a], #224]\n\t"
  59175. "str r5, [%[r], #232]\n\t"
  59176. "lsr r3, r6, #1\n\t"
  59177. "lsl r6, r6, %[n]\n\t"
  59178. "lsr r3, r3, r12\n\t"
  59179. "orr r4, r4, r3\n\t"
  59180. "ldr r5, [%[a], #220]\n\t"
  59181. "str r4, [%[r], #228]\n\t"
  59182. "lsr r3, r5, #1\n\t"
  59183. "lsl r5, r5, %[n]\n\t"
  59184. "lsr r3, r3, r12\n\t"
  59185. "orr r6, r6, r3\n\t"
  59186. "ldr r4, [%[a], #216]\n\t"
  59187. "str r6, [%[r], #224]\n\t"
  59188. "lsr r3, r4, #1\n\t"
  59189. "lsl r4, r4, %[n]\n\t"
  59190. "lsr r3, r3, r12\n\t"
  59191. "orr r5, r5, r3\n\t"
  59192. "ldr r6, [%[a], #212]\n\t"
  59193. "str r5, [%[r], #220]\n\t"
  59194. "lsr r3, r6, #1\n\t"
  59195. "lsl r6, r6, %[n]\n\t"
  59196. "lsr r3, r3, r12\n\t"
  59197. "orr r4, r4, r3\n\t"
  59198. "ldr r5, [%[a], #208]\n\t"
  59199. "str r4, [%[r], #216]\n\t"
  59200. "lsr r3, r5, #1\n\t"
  59201. "lsl r5, r5, %[n]\n\t"
  59202. "lsr r3, r3, r12\n\t"
  59203. "orr r6, r6, r3\n\t"
  59204. "ldr r4, [%[a], #204]\n\t"
  59205. "str r6, [%[r], #212]\n\t"
  59206. "lsr r3, r4, #1\n\t"
  59207. "lsl r4, r4, %[n]\n\t"
  59208. "lsr r3, r3, r12\n\t"
  59209. "orr r5, r5, r3\n\t"
  59210. "ldr r6, [%[a], #200]\n\t"
  59211. "str r5, [%[r], #208]\n\t"
  59212. "lsr r3, r6, #1\n\t"
  59213. "lsl r6, r6, %[n]\n\t"
  59214. "lsr r3, r3, r12\n\t"
  59215. "orr r4, r4, r3\n\t"
  59216. "ldr r5, [%[a], #196]\n\t"
  59217. "str r4, [%[r], #204]\n\t"
  59218. "lsr r3, r5, #1\n\t"
  59219. "lsl r5, r5, %[n]\n\t"
  59220. "lsr r3, r3, r12\n\t"
  59221. "orr r6, r6, r3\n\t"
  59222. "ldr r4, [%[a], #192]\n\t"
  59223. "str r6, [%[r], #200]\n\t"
  59224. "lsr r3, r4, #1\n\t"
  59225. "lsl r4, r4, %[n]\n\t"
  59226. "lsr r3, r3, r12\n\t"
  59227. "orr r5, r5, r3\n\t"
  59228. "ldr r6, [%[a], #188]\n\t"
  59229. "str r5, [%[r], #196]\n\t"
  59230. "lsr r3, r6, #1\n\t"
  59231. "lsl r6, r6, %[n]\n\t"
  59232. "lsr r3, r3, r12\n\t"
  59233. "orr r4, r4, r3\n\t"
  59234. "ldr r5, [%[a], #184]\n\t"
  59235. "str r4, [%[r], #192]\n\t"
  59236. "lsr r3, r5, #1\n\t"
  59237. "lsl r5, r5, %[n]\n\t"
  59238. "lsr r3, r3, r12\n\t"
  59239. "orr r6, r6, r3\n\t"
  59240. "ldr r4, [%[a], #180]\n\t"
  59241. "str r6, [%[r], #188]\n\t"
  59242. "lsr r3, r4, #1\n\t"
  59243. "lsl r4, r4, %[n]\n\t"
  59244. "lsr r3, r3, r12\n\t"
  59245. "orr r5, r5, r3\n\t"
  59246. "ldr r6, [%[a], #176]\n\t"
  59247. "str r5, [%[r], #184]\n\t"
  59248. "lsr r3, r6, #1\n\t"
  59249. "lsl r6, r6, %[n]\n\t"
  59250. "lsr r3, r3, r12\n\t"
  59251. "orr r4, r4, r3\n\t"
  59252. "ldr r5, [%[a], #172]\n\t"
  59253. "str r4, [%[r], #180]\n\t"
  59254. "lsr r3, r5, #1\n\t"
  59255. "lsl r5, r5, %[n]\n\t"
  59256. "lsr r3, r3, r12\n\t"
  59257. "orr r6, r6, r3\n\t"
  59258. "ldr r4, [%[a], #168]\n\t"
  59259. "str r6, [%[r], #176]\n\t"
  59260. "lsr r3, r4, #1\n\t"
  59261. "lsl r4, r4, %[n]\n\t"
  59262. "lsr r3, r3, r12\n\t"
  59263. "orr r5, r5, r3\n\t"
  59264. "ldr r6, [%[a], #164]\n\t"
  59265. "str r5, [%[r], #172]\n\t"
  59266. "lsr r3, r6, #1\n\t"
  59267. "lsl r6, r6, %[n]\n\t"
  59268. "lsr r3, r3, r12\n\t"
  59269. "orr r4, r4, r3\n\t"
  59270. "ldr r5, [%[a], #160]\n\t"
  59271. "str r4, [%[r], #168]\n\t"
  59272. "lsr r3, r5, #1\n\t"
  59273. "lsl r5, r5, %[n]\n\t"
  59274. "lsr r3, r3, r12\n\t"
  59275. "orr r6, r6, r3\n\t"
  59276. "ldr r4, [%[a], #156]\n\t"
  59277. "str r6, [%[r], #164]\n\t"
  59278. "lsr r3, r4, #1\n\t"
  59279. "lsl r4, r4, %[n]\n\t"
  59280. "lsr r3, r3, r12\n\t"
  59281. "orr r5, r5, r3\n\t"
  59282. "ldr r6, [%[a], #152]\n\t"
  59283. "str r5, [%[r], #160]\n\t"
  59284. "lsr r3, r6, #1\n\t"
  59285. "lsl r6, r6, %[n]\n\t"
  59286. "lsr r3, r3, r12\n\t"
  59287. "orr r4, r4, r3\n\t"
  59288. "ldr r5, [%[a], #148]\n\t"
  59289. "str r4, [%[r], #156]\n\t"
  59290. "lsr r3, r5, #1\n\t"
  59291. "lsl r5, r5, %[n]\n\t"
  59292. "lsr r3, r3, r12\n\t"
  59293. "orr r6, r6, r3\n\t"
  59294. "ldr r4, [%[a], #144]\n\t"
  59295. "str r6, [%[r], #152]\n\t"
  59296. "lsr r3, r4, #1\n\t"
  59297. "lsl r4, r4, %[n]\n\t"
  59298. "lsr r3, r3, r12\n\t"
  59299. "orr r5, r5, r3\n\t"
  59300. "ldr r6, [%[a], #140]\n\t"
  59301. "str r5, [%[r], #148]\n\t"
  59302. "lsr r3, r6, #1\n\t"
  59303. "lsl r6, r6, %[n]\n\t"
  59304. "lsr r3, r3, r12\n\t"
  59305. "orr r4, r4, r3\n\t"
  59306. "ldr r5, [%[a], #136]\n\t"
  59307. "str r4, [%[r], #144]\n\t"
  59308. "lsr r3, r5, #1\n\t"
  59309. "lsl r5, r5, %[n]\n\t"
  59310. "lsr r3, r3, r12\n\t"
  59311. "orr r6, r6, r3\n\t"
  59312. "ldr r4, [%[a], #132]\n\t"
  59313. "str r6, [%[r], #140]\n\t"
  59314. "lsr r3, r4, #1\n\t"
  59315. "lsl r4, r4, %[n]\n\t"
  59316. "lsr r3, r3, r12\n\t"
  59317. "orr r5, r5, r3\n\t"
  59318. "ldr r6, [%[a], #128]\n\t"
  59319. "str r5, [%[r], #136]\n\t"
  59320. "lsr r3, r6, #1\n\t"
  59321. "lsl r6, r6, %[n]\n\t"
  59322. "lsr r3, r3, r12\n\t"
  59323. "orr r4, r4, r3\n\t"
  59324. "ldr r5, [%[a], #124]\n\t"
  59325. "str r4, [%[r], #132]\n\t"
  59326. "lsr r3, r5, #1\n\t"
  59327. "lsl r5, r5, %[n]\n\t"
  59328. "lsr r3, r3, r12\n\t"
  59329. "orr r6, r6, r3\n\t"
  59330. "ldr r4, [%[a], #120]\n\t"
  59331. "str r6, [%[r], #128]\n\t"
  59332. "lsr r3, r4, #1\n\t"
  59333. "lsl r4, r4, %[n]\n\t"
  59334. "lsr r3, r3, r12\n\t"
  59335. "orr r5, r5, r3\n\t"
  59336. "ldr r6, [%[a], #116]\n\t"
  59337. "str r5, [%[r], #124]\n\t"
  59338. "lsr r3, r6, #1\n\t"
  59339. "lsl r6, r6, %[n]\n\t"
  59340. "lsr r3, r3, r12\n\t"
  59341. "orr r4, r4, r3\n\t"
  59342. "ldr r5, [%[a], #112]\n\t"
  59343. "str r4, [%[r], #120]\n\t"
  59344. "lsr r3, r5, #1\n\t"
  59345. "lsl r5, r5, %[n]\n\t"
  59346. "lsr r3, r3, r12\n\t"
  59347. "orr r6, r6, r3\n\t"
  59348. "ldr r4, [%[a], #108]\n\t"
  59349. "str r6, [%[r], #116]\n\t"
  59350. "lsr r3, r4, #1\n\t"
  59351. "lsl r4, r4, %[n]\n\t"
  59352. "lsr r3, r3, r12\n\t"
  59353. "orr r5, r5, r3\n\t"
  59354. "ldr r6, [%[a], #104]\n\t"
  59355. "str r5, [%[r], #112]\n\t"
  59356. "lsr r3, r6, #1\n\t"
  59357. "lsl r6, r6, %[n]\n\t"
  59358. "lsr r3, r3, r12\n\t"
  59359. "orr r4, r4, r3\n\t"
  59360. "ldr r5, [%[a], #100]\n\t"
  59361. "str r4, [%[r], #108]\n\t"
  59362. "lsr r3, r5, #1\n\t"
  59363. "lsl r5, r5, %[n]\n\t"
  59364. "lsr r3, r3, r12\n\t"
  59365. "orr r6, r6, r3\n\t"
  59366. "ldr r4, [%[a], #96]\n\t"
  59367. "str r6, [%[r], #104]\n\t"
  59368. "lsr r3, r4, #1\n\t"
  59369. "lsl r4, r4, %[n]\n\t"
  59370. "lsr r3, r3, r12\n\t"
  59371. "orr r5, r5, r3\n\t"
  59372. "ldr r6, [%[a], #92]\n\t"
  59373. "str r5, [%[r], #100]\n\t"
  59374. "lsr r3, r6, #1\n\t"
  59375. "lsl r6, r6, %[n]\n\t"
  59376. "lsr r3, r3, r12\n\t"
  59377. "orr r4, r4, r3\n\t"
  59378. "ldr r5, [%[a], #88]\n\t"
  59379. "str r4, [%[r], #96]\n\t"
  59380. "lsr r3, r5, #1\n\t"
  59381. "lsl r5, r5, %[n]\n\t"
  59382. "lsr r3, r3, r12\n\t"
  59383. "orr r6, r6, r3\n\t"
  59384. "ldr r4, [%[a], #84]\n\t"
  59385. "str r6, [%[r], #92]\n\t"
  59386. "lsr r3, r4, #1\n\t"
  59387. "lsl r4, r4, %[n]\n\t"
  59388. "lsr r3, r3, r12\n\t"
  59389. "orr r5, r5, r3\n\t"
  59390. "ldr r6, [%[a], #80]\n\t"
  59391. "str r5, [%[r], #88]\n\t"
  59392. "lsr r3, r6, #1\n\t"
  59393. "lsl r6, r6, %[n]\n\t"
  59394. "lsr r3, r3, r12\n\t"
  59395. "orr r4, r4, r3\n\t"
  59396. "ldr r5, [%[a], #76]\n\t"
  59397. "str r4, [%[r], #84]\n\t"
  59398. "lsr r3, r5, #1\n\t"
  59399. "lsl r5, r5, %[n]\n\t"
  59400. "lsr r3, r3, r12\n\t"
  59401. "orr r6, r6, r3\n\t"
  59402. "ldr r4, [%[a], #72]\n\t"
  59403. "str r6, [%[r], #80]\n\t"
  59404. "lsr r3, r4, #1\n\t"
  59405. "lsl r4, r4, %[n]\n\t"
  59406. "lsr r3, r3, r12\n\t"
  59407. "orr r5, r5, r3\n\t"
  59408. "ldr r6, [%[a], #68]\n\t"
  59409. "str r5, [%[r], #76]\n\t"
  59410. "lsr r3, r6, #1\n\t"
  59411. "lsl r6, r6, %[n]\n\t"
  59412. "lsr r3, r3, r12\n\t"
  59413. "orr r4, r4, r3\n\t"
  59414. "ldr r5, [%[a], #64]\n\t"
  59415. "str r4, [%[r], #72]\n\t"
  59416. "lsr r3, r5, #1\n\t"
  59417. "lsl r5, r5, %[n]\n\t"
  59418. "lsr r3, r3, r12\n\t"
  59419. "orr r6, r6, r3\n\t"
  59420. "ldr r4, [%[a], #60]\n\t"
  59421. "str r6, [%[r], #68]\n\t"
  59422. "lsr r3, r4, #1\n\t"
  59423. "lsl r4, r4, %[n]\n\t"
  59424. "lsr r3, r3, r12\n\t"
  59425. "orr r5, r5, r3\n\t"
  59426. "ldr r6, [%[a], #56]\n\t"
  59427. "str r5, [%[r], #64]\n\t"
  59428. "lsr r3, r6, #1\n\t"
  59429. "lsl r6, r6, %[n]\n\t"
  59430. "lsr r3, r3, r12\n\t"
  59431. "orr r4, r4, r3\n\t"
  59432. "ldr r5, [%[a], #52]\n\t"
  59433. "str r4, [%[r], #60]\n\t"
  59434. "lsr r3, r5, #1\n\t"
  59435. "lsl r5, r5, %[n]\n\t"
  59436. "lsr r3, r3, r12\n\t"
  59437. "orr r6, r6, r3\n\t"
  59438. "ldr r4, [%[a], #48]\n\t"
  59439. "str r6, [%[r], #56]\n\t"
  59440. "lsr r3, r4, #1\n\t"
  59441. "lsl r4, r4, %[n]\n\t"
  59442. "lsr r3, r3, r12\n\t"
  59443. "orr r5, r5, r3\n\t"
  59444. "ldr r6, [%[a], #44]\n\t"
  59445. "str r5, [%[r], #52]\n\t"
  59446. "lsr r3, r6, #1\n\t"
  59447. "lsl r6, r6, %[n]\n\t"
  59448. "lsr r3, r3, r12\n\t"
  59449. "orr r4, r4, r3\n\t"
  59450. "ldr r5, [%[a], #40]\n\t"
  59451. "str r4, [%[r], #48]\n\t"
  59452. "lsr r3, r5, #1\n\t"
  59453. "lsl r5, r5, %[n]\n\t"
  59454. "lsr r3, r3, r12\n\t"
  59455. "orr r6, r6, r3\n\t"
  59456. "ldr r4, [%[a], #36]\n\t"
  59457. "str r6, [%[r], #44]\n\t"
  59458. "lsr r3, r4, #1\n\t"
  59459. "lsl r4, r4, %[n]\n\t"
  59460. "lsr r3, r3, r12\n\t"
  59461. "orr r5, r5, r3\n\t"
  59462. "ldr r6, [%[a], #32]\n\t"
  59463. "str r5, [%[r], #40]\n\t"
  59464. "lsr r3, r6, #1\n\t"
  59465. "lsl r6, r6, %[n]\n\t"
  59466. "lsr r3, r3, r12\n\t"
  59467. "orr r4, r4, r3\n\t"
  59468. "ldr r5, [%[a], #28]\n\t"
  59469. "str r4, [%[r], #36]\n\t"
  59470. "lsr r3, r5, #1\n\t"
  59471. "lsl r5, r5, %[n]\n\t"
  59472. "lsr r3, r3, r12\n\t"
  59473. "orr r6, r6, r3\n\t"
  59474. "ldr r4, [%[a], #24]\n\t"
  59475. "str r6, [%[r], #32]\n\t"
  59476. "lsr r3, r4, #1\n\t"
  59477. "lsl r4, r4, %[n]\n\t"
  59478. "lsr r3, r3, r12\n\t"
  59479. "orr r5, r5, r3\n\t"
  59480. "ldr r6, [%[a], #20]\n\t"
  59481. "str r5, [%[r], #28]\n\t"
  59482. "lsr r3, r6, #1\n\t"
  59483. "lsl r6, r6, %[n]\n\t"
  59484. "lsr r3, r3, r12\n\t"
  59485. "orr r4, r4, r3\n\t"
  59486. "ldr r5, [%[a], #16]\n\t"
  59487. "str r4, [%[r], #24]\n\t"
  59488. "lsr r3, r5, #1\n\t"
  59489. "lsl r5, r5, %[n]\n\t"
  59490. "lsr r3, r3, r12\n\t"
  59491. "orr r6, r6, r3\n\t"
  59492. "ldr r4, [%[a], #12]\n\t"
  59493. "str r6, [%[r], #20]\n\t"
  59494. "lsr r3, r4, #1\n\t"
  59495. "lsl r4, r4, %[n]\n\t"
  59496. "lsr r3, r3, r12\n\t"
  59497. "orr r5, r5, r3\n\t"
  59498. "ldr r6, [%[a], #8]\n\t"
  59499. "str r5, [%[r], #16]\n\t"
  59500. "lsr r3, r6, #1\n\t"
  59501. "lsl r6, r6, %[n]\n\t"
  59502. "lsr r3, r3, r12\n\t"
  59503. "orr r4, r4, r3\n\t"
  59504. "ldr r5, [%[a], #4]\n\t"
  59505. "str r4, [%[r], #12]\n\t"
  59506. "lsr r3, r5, #1\n\t"
  59507. "lsl r5, r5, %[n]\n\t"
  59508. "lsr r3, r3, r12\n\t"
  59509. "orr r6, r6, r3\n\t"
  59510. "ldr r4, [%[a]]\n\t"
  59511. "str r6, [%[r], #8]\n\t"
  59512. "lsr r3, r4, #1\n\t"
  59513. "lsl r4, r4, %[n]\n\t"
  59514. "lsr r3, r3, r12\n\t"
  59515. "orr r5, r5, r3\n\t"
  59516. "str r4, [%[r]]\n\t"
  59517. "str r5, [%[r], #4]\n\t"
  59518. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  59519. :
  59520. : "memory", "r4", "r5", "r6", "r3", "r12"
  59521. );
  59522. }
  59523. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  59524. *
  59525. * r A single precision number that is the result of the operation.
  59526. * e A single precision number that is the exponent.
  59527. * bits The number of bits in the exponent.
  59528. * m A single precision number that is the modulus.
  59529. * returns 0 on success.
  59530. * returns MEMORY_E on dynamic memory allocation failure.
  59531. * returns MP_VAL when base is even.
  59532. */
  59533. static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits,
  59534. const sp_digit* m)
  59535. {
  59536. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  59537. sp_digit* td = NULL;
  59538. #else
  59539. sp_digit td[385];
  59540. #endif
  59541. sp_digit* norm = NULL;
  59542. sp_digit* tmp = NULL;
  59543. sp_digit mp = 1;
  59544. sp_digit n;
  59545. sp_digit o;
  59546. sp_digit mask;
  59547. int i;
  59548. int c;
  59549. byte y;
  59550. int err = MP_OKAY;
  59551. if (bits == 0) {
  59552. err = MP_VAL;
  59553. }
  59554. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  59555. if (err == MP_OKAY) {
  59556. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 385, NULL,
  59557. DYNAMIC_TYPE_TMP_BUFFER);
  59558. if (td == NULL)
  59559. err = MEMORY_E;
  59560. }
  59561. #endif
  59562. if (err == MP_OKAY) {
  59563. norm = td;
  59564. tmp = td + 256;
  59565. sp_4096_mont_setup(m, &mp);
  59566. sp_4096_mont_norm_128(norm, m);
  59567. i = (bits - 1) / 32;
  59568. n = e[i--];
  59569. c = bits & 31;
  59570. if (c == 0) {
  59571. c = 32;
  59572. }
  59573. c -= bits % 5;
  59574. if (c == 32) {
  59575. c = 27;
  59576. }
  59577. if (c < 0) {
  59578. /* Number of bits in top word is less than number needed. */
  59579. c = -c;
  59580. y = (byte)(n << c);
  59581. n = e[i--];
  59582. y |= (byte)(n >> (64 - c));
  59583. n <<= c;
  59584. c = 64 - c;
  59585. }
  59586. else if (c == 0) {
  59587. /* All bits in top word used. */
  59588. y = (byte)n;
  59589. }
  59590. else {
  59591. y = (byte)(n >> c);
  59592. n <<= 32 - c;
  59593. }
  59594. sp_4096_lshift_128(r, norm, y);
  59595. for (; i>=0 || c>=5; ) {
  59596. if (c == 0) {
  59597. n = e[i--];
  59598. y = (byte)(n >> 27);
  59599. n <<= 5;
  59600. c = 27;
  59601. }
  59602. else if (c < 5) {
  59603. y = (byte)(n >> 27);
  59604. n = e[i--];
  59605. c = 5 - c;
  59606. y |= (byte)(n >> (32 - c));
  59607. n <<= c;
  59608. c = 32 - c;
  59609. }
  59610. else {
  59611. y = (byte)((n >> 27) & 0x1f);
  59612. n <<= 5;
  59613. c -= 5;
  59614. }
  59615. sp_4096_mont_sqr_128(r, r, m, mp);
  59616. sp_4096_mont_sqr_128(r, r, m, mp);
  59617. sp_4096_mont_sqr_128(r, r, m, mp);
  59618. sp_4096_mont_sqr_128(r, r, m, mp);
  59619. sp_4096_mont_sqr_128(r, r, m, mp);
  59620. sp_4096_lshift_128(r, r, y);
  59621. sp_4096_mul_d_128(tmp, norm, r[128]);
  59622. r[128] = 0;
  59623. o = sp_4096_add_128(r, r, tmp);
  59624. sp_4096_cond_sub_128(r, r, m, (sp_digit)0 - o);
  59625. }
  59626. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  59627. sp_4096_mont_reduce_128(r, m, mp);
  59628. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  59629. sp_4096_cond_sub_128(r, r, m, mask);
  59630. }
  59631. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  59632. if (td != NULL)
  59633. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  59634. #endif
  59635. return err;
  59636. }
  59637. #endif /* HAVE_FFDHE_4096 */
  59638. /* Perform the modular exponentiation for Diffie-Hellman.
  59639. *
  59640. * base Base.
  59641. * exp Array of bytes that is the exponent.
  59642. * expLen Length of data, in bytes, in exponent.
  59643. * mod Modulus.
  59644. * out Buffer to hold big-endian bytes of exponentiation result.
  59645. * Must be at least 512 bytes long.
  59646. * outLen Length, in bytes, of exponentiation result.
  59647. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  59648. * and MEMORY_E if memory allocation fails.
  59649. */
  59650. int sp_DhExp_4096(const mp_int* base, const byte* exp, word32 expLen,
  59651. const mp_int* mod, byte* out, word32* outLen)
  59652. {
  59653. int err = MP_OKAY;
  59654. sp_digit b[256];
  59655. sp_digit e[128];
  59656. sp_digit m[128];
  59657. sp_digit* r = b;
  59658. word32 i;
  59659. if (mp_count_bits(base) > 4096) {
  59660. err = MP_READ_E;
  59661. }
  59662. else if (expLen > 512) {
  59663. err = MP_READ_E;
  59664. }
  59665. else if (mp_count_bits(mod) != 4096) {
  59666. err = MP_READ_E;
  59667. }
  59668. else if (mp_iseven(mod)) {
  59669. err = MP_VAL;
  59670. }
  59671. if (err == MP_OKAY) {
  59672. sp_4096_from_mp(b, 128, base);
  59673. sp_4096_from_bin(e, 128, exp, expLen);
  59674. sp_4096_from_mp(m, 128, mod);
  59675. #ifdef HAVE_FFDHE_4096
  59676. if (base->used == 1 && base->dp[0] == 2 && m[127] == (sp_digit)-1)
  59677. err = sp_4096_mod_exp_2_128(r, e, expLen * 8, m);
  59678. else
  59679. #endif
  59680. err = sp_4096_mod_exp_128(r, b, e, expLen * 8, m, 0);
  59681. }
  59682. if (err == MP_OKAY) {
  59683. sp_4096_to_bin_128(r, out);
  59684. *outLen = 512;
  59685. for (i=0; i<512 && out[i] == 0; i++) {
  59686. /* Search for first non-zero. */
  59687. }
  59688. *outLen -= i;
  59689. XMEMMOVE(out, out + i, *outLen);
  59690. }
  59691. XMEMSET(e, 0, sizeof(e));
  59692. return err;
  59693. }
  59694. #endif /* WOLFSSL_HAVE_SP_DH */
  59695. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  59696. #endif /* WOLFSSL_SP_4096 */
  59697. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH */
  59698. #ifdef WOLFSSL_HAVE_SP_ECC
  59699. #ifndef WOLFSSL_SP_NO_256
  59700. /* Point structure to use. */
  59701. typedef struct sp_point_256 {
  59702. /* X ordinate of point. */
  59703. sp_digit x[2 * 8];
  59704. /* Y ordinate of point. */
  59705. sp_digit y[2 * 8];
  59706. /* Z ordinate of point. */
  59707. sp_digit z[2 * 8];
  59708. /* Indicates point is at infinity. */
  59709. int infinity;
  59710. } sp_point_256;
  59711. /* The modulus (prime) of the curve P256. */
  59712. static const sp_digit p256_mod[8] = {
  59713. 0xffffffff,0xffffffff,0xffffffff,0x00000000,0x00000000,0x00000000,
  59714. 0x00000001,0xffffffff
  59715. };
  59716. /* The Montgomery normalizer for modulus of the curve P256. */
  59717. static const sp_digit p256_norm_mod[8] = {
  59718. 0x00000001,0x00000000,0x00000000,0xffffffff,0xffffffff,0xffffffff,
  59719. 0xfffffffe,0x00000000
  59720. };
  59721. /* The Montgomery multiplier for modulus of the curve P256. */
  59722. static const sp_digit p256_mp_mod = 0x00000001;
  59723. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  59724. defined(HAVE_ECC_VERIFY)
  59725. /* The order of the curve P256. */
  59726. static const sp_digit p256_order[8] = {
  59727. 0xfc632551,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  59728. 0x00000000,0xffffffff
  59729. };
  59730. #endif
  59731. /* The order of the curve P256 minus 2. */
  59732. static const sp_digit p256_order2[8] = {
  59733. 0xfc63254f,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  59734. 0x00000000,0xffffffff
  59735. };
  59736. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  59737. /* The Montgomery normalizer for order of the curve P256. */
  59738. static const sp_digit p256_norm_order[8] = {
  59739. 0x039cdaaf,0x0c46353d,0x58e8617b,0x43190552,0x00000000,0x00000000,
  59740. 0xffffffff,0x00000000
  59741. };
  59742. #endif
  59743. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  59744. /* The Montgomery multiplier for order of the curve P256. */
  59745. static const sp_digit p256_mp_order = 0xee00bc4f;
  59746. #endif
  59747. /* The base point of curve P256. */
  59748. static const sp_point_256 p256_base = {
  59749. /* X ordinate */
  59750. {
  59751. 0xd898c296,0xf4a13945,0x2deb33a0,0x77037d81,0x63a440f2,0xf8bce6e5,
  59752. 0xe12c4247,0x6b17d1f2,
  59753. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  59754. (sp_digit)0, (sp_digit)0, (sp_digit)0
  59755. },
  59756. /* Y ordinate */
  59757. {
  59758. 0x37bf51f5,0xcbb64068,0x6b315ece,0x2bce3357,0x7c0f9e16,0x8ee7eb4a,
  59759. 0xfe1a7f9b,0x4fe342e2,
  59760. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  59761. (sp_digit)0, (sp_digit)0, (sp_digit)0
  59762. },
  59763. /* Z ordinate */
  59764. {
  59765. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  59766. 0x00000000,0x00000000,
  59767. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  59768. (sp_digit)0, (sp_digit)0, (sp_digit)0
  59769. },
  59770. /* infinity */
  59771. 0
  59772. };
  59773. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  59774. static const sp_digit p256_b[8] = {
  59775. 0x27d2604b,0x3bce3c3e,0xcc53b0f6,0x651d06b0,0x769886bc,0xb3ebbd55,
  59776. 0xaa3a93e7,0x5ac635d8
  59777. };
  59778. #endif
  59779. #ifdef WOLFSSL_SP_SMALL
  59780. /* Multiply a and b into r. (r = a * b)
  59781. *
  59782. * r A single precision integer.
  59783. * a A single precision integer.
  59784. * b A single precision integer.
  59785. */
  59786. static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  59787. {
  59788. register sp_digit* r asm ("r0") = r_p;
  59789. register const sp_digit* a asm ("r1") = a_p;
  59790. register const sp_digit* b asm ("r2") = b_p;
  59791. __asm__ __volatile__ (
  59792. "sub sp, sp, #0x40\n\t"
  59793. "mov r5, #0\n\t"
  59794. "mov r6, #0\n\t"
  59795. "mov r7, #0\n\t"
  59796. "mov r8, #0\n\t"
  59797. "\n"
  59798. "L_sp_256_mul_8_outer_%=: \n\t"
  59799. "subs r3, r5, #28\n\t"
  59800. "it cc\n\t"
  59801. "movcc r3, #0\n\t"
  59802. "sub r4, r5, r3\n\t"
  59803. "\n"
  59804. "L_sp_256_mul_8_inner_%=: \n\t"
  59805. "ldr lr, [%[a], r3]\n\t"
  59806. "ldr r11, [%[b], r4]\n\t"
  59807. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  59808. "lsl r9, lr, #16\n\t"
  59809. "lsl r10, r11, #16\n\t"
  59810. "lsr r9, r9, #16\n\t"
  59811. "lsr r10, r10, #16\n\t"
  59812. "mul r10, r9, r10\n\t"
  59813. "adds r6, r6, r10\n\t"
  59814. "adcs r7, r7, #0\n\t"
  59815. "adc r8, r8, #0\n\t"
  59816. "lsr r10, r11, #16\n\t"
  59817. "mul r9, r10, r9\n\t"
  59818. "lsr r10, r9, #16\n\t"
  59819. "lsl r9, r9, #16\n\t"
  59820. "adds r6, r6, r9\n\t"
  59821. "adcs r7, r7, r10\n\t"
  59822. "adc r8, r8, #0\n\t"
  59823. "lsr r9, lr, #16\n\t"
  59824. "lsr r10, r11, #16\n\t"
  59825. "mul r10, r9, r10\n\t"
  59826. "adds r7, r7, r10\n\t"
  59827. "adc r8, r8, #0\n\t"
  59828. "lsl r10, r11, #16\n\t"
  59829. "lsr r10, r10, #16\n\t"
  59830. "mul r9, r10, r9\n\t"
  59831. "lsr r10, r9, #16\n\t"
  59832. "lsl r9, r9, #16\n\t"
  59833. "adds r6, r6, r9\n\t"
  59834. "adcs r7, r7, r10\n\t"
  59835. "adc r8, r8, #0\n\t"
  59836. #else
  59837. "umull r9, r10, lr, r11\n\t"
  59838. "adds r6, r6, r9\n\t"
  59839. "adcs r7, r7, r10\n\t"
  59840. "adc r8, r8, #0\n\t"
  59841. #endif
  59842. "add r3, r3, #4\n\t"
  59843. "sub r4, r4, #4\n\t"
  59844. "cmp r3, #32\n\t"
  59845. "beq L_sp_256_mul_8_inner_done_%=\n\t"
  59846. "cmp r3, r5\n\t"
  59847. "ble L_sp_256_mul_8_inner_%=\n\t"
  59848. "\n"
  59849. "L_sp_256_mul_8_inner_done_%=: \n\t"
  59850. "str r6, [sp, r5]\n\t"
  59851. "mov r6, r7\n\t"
  59852. "mov r7, r8\n\t"
  59853. "mov r8, #0\n\t"
  59854. "add r5, r5, #4\n\t"
  59855. "cmp r5, #56\n\t"
  59856. "ble L_sp_256_mul_8_outer_%=\n\t"
  59857. "str r6, [sp, r5]\n\t"
  59858. "\n"
  59859. "L_sp_256_mul_8_store_%=: \n\t"
  59860. "ldm sp!, {r6, r7, r8, r9}\n\t"
  59861. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  59862. "subs r5, r5, #16\n\t"
  59863. "bgt L_sp_256_mul_8_store_%=\n\t"
  59864. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  59865. :
  59866. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11"
  59867. );
  59868. }
  59869. #else
  59870. /* Multiply a and b into r. (r = a * b)
  59871. *
  59872. * r A single precision integer.
  59873. * a A single precision integer.
  59874. * b A single precision integer.
  59875. */
  59876. static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  59877. {
  59878. register sp_digit* r asm ("r0") = r_p;
  59879. register const sp_digit* a asm ("r1") = a_p;
  59880. register const sp_digit* b asm ("r2") = b_p;
  59881. __asm__ __volatile__ (
  59882. "sub sp, sp, #32\n\t"
  59883. "mov r10, #0\n\t"
  59884. /* A[0] * B[0] */
  59885. "ldr r11, [%[a]]\n\t"
  59886. "ldr r12, [%[b]]\n\t"
  59887. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  59888. "lsl r6, r11, #16\n\t"
  59889. "lsl r3, r12, #16\n\t"
  59890. "lsr r6, r6, #16\n\t"
  59891. "lsr r3, r3, #16\n\t"
  59892. "mul r3, r6, r3\n\t"
  59893. "lsr r7, r12, #16\n\t"
  59894. "mul r6, r7, r6\n\t"
  59895. "lsr r4, r6, #16\n\t"
  59896. "lsl r6, r6, #16\n\t"
  59897. "adds r3, r3, r6\n\t"
  59898. "adc r4, r4, #0\n\t"
  59899. "lsr r6, r11, #16\n\t"
  59900. "mul r7, r6, r7\n\t"
  59901. "add r4, r4, r7\n\t"
  59902. "lsl r7, r12, #16\n\t"
  59903. "lsr r7, r7, #16\n\t"
  59904. "mul r6, r7, r6\n\t"
  59905. "lsr r7, r6, #16\n\t"
  59906. "lsl r6, r6, #16\n\t"
  59907. "adds r3, r3, r6\n\t"
  59908. "adc r4, r4, r7\n\t"
  59909. "mov r5, #0\n\t"
  59910. #else
  59911. "umull r3, r4, r11, r12\n\t"
  59912. "mov r5, #0\n\t"
  59913. #endif
  59914. "str r3, [sp]\n\t"
  59915. /* A[0] * B[1] */
  59916. "ldr r9, [%[b], #4]\n\t"
  59917. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  59918. "lsl r6, r11, #16\n\t"
  59919. "lsl r7, r9, #16\n\t"
  59920. "lsr r6, r6, #16\n\t"
  59921. "lsr r7, r7, #16\n\t"
  59922. "mul r7, r6, r7\n\t"
  59923. "adds r4, r4, r7\n\t"
  59924. "adcs r5, r5, #0\n\t"
  59925. "mov r3, #0\n\t"
  59926. "adc r3, r3, #0\n\t"
  59927. "lsr r7, r9, #16\n\t"
  59928. "mul r6, r7, r6\n\t"
  59929. "lsr r7, r6, #16\n\t"
  59930. "lsl r6, r6, #16\n\t"
  59931. "adds r4, r4, r6\n\t"
  59932. "adcs r5, r5, r7\n\t"
  59933. "adc r3, r3, #0\n\t"
  59934. "lsr r6, r11, #16\n\t"
  59935. "lsr r7, r9, #16\n\t"
  59936. "mul r7, r6, r7\n\t"
  59937. "adds r5, r5, r7\n\t"
  59938. "adc r3, r3, #0\n\t"
  59939. "lsl r7, r9, #16\n\t"
  59940. "lsr r7, r7, #16\n\t"
  59941. "mul r6, r7, r6\n\t"
  59942. "lsr r7, r6, #16\n\t"
  59943. "lsl r6, r6, #16\n\t"
  59944. "adds r4, r4, r6\n\t"
  59945. "adcs r5, r5, r7\n\t"
  59946. "adc r3, r3, #0\n\t"
  59947. #else
  59948. "umull r6, r7, r11, r9\n\t"
  59949. "adds r4, r4, r6\n\t"
  59950. "adcs r5, r5, r7\n\t"
  59951. "mov r3, #0\n\t"
  59952. "adc r3, r3, #0\n\t"
  59953. #endif
  59954. /* A[1] * B[0] */
  59955. "ldr r8, [%[a], #4]\n\t"
  59956. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  59957. "lsl r6, r8, #16\n\t"
  59958. "lsl r7, r12, #16\n\t"
  59959. "lsr r6, r6, #16\n\t"
  59960. "lsr r7, r7, #16\n\t"
  59961. "mul r7, r6, r7\n\t"
  59962. "adds r4, r4, r7\n\t"
  59963. "adcs r5, r5, #0\n\t"
  59964. "adc r3, r3, #0\n\t"
  59965. "lsr r7, r12, #16\n\t"
  59966. "mul r6, r7, r6\n\t"
  59967. "lsr r7, r6, #16\n\t"
  59968. "lsl r6, r6, #16\n\t"
  59969. "adds r4, r4, r6\n\t"
  59970. "adcs r5, r5, r7\n\t"
  59971. "adc r3, r3, #0\n\t"
  59972. "lsr r6, r8, #16\n\t"
  59973. "lsr r7, r12, #16\n\t"
  59974. "mul r7, r6, r7\n\t"
  59975. "adds r5, r5, r7\n\t"
  59976. "adc r3, r3, #0\n\t"
  59977. "lsl r7, r12, #16\n\t"
  59978. "lsr r7, r7, #16\n\t"
  59979. "mul r6, r7, r6\n\t"
  59980. "lsr r7, r6, #16\n\t"
  59981. "lsl r6, r6, #16\n\t"
  59982. "adds r4, r4, r6\n\t"
  59983. "adcs r5, r5, r7\n\t"
  59984. "adc r3, r3, #0\n\t"
  59985. #else
  59986. "umull r6, r7, r8, r12\n\t"
  59987. "adds r4, r4, r6\n\t"
  59988. "adcs r5, r5, r7\n\t"
  59989. "adc r3, r3, #0\n\t"
  59990. #endif
  59991. "str r4, [sp, #4]\n\t"
  59992. /* A[2] * B[0] */
  59993. "ldr r8, [%[a], #8]\n\t"
  59994. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  59995. "lsl r6, r8, #16\n\t"
  59996. "lsl r7, r12, #16\n\t"
  59997. "lsr r6, r6, #16\n\t"
  59998. "lsr r7, r7, #16\n\t"
  59999. "mul r7, r6, r7\n\t"
  60000. "adds r5, r5, r7\n\t"
  60001. "adcs r3, r3, #0\n\t"
  60002. "mov r4, #0\n\t"
  60003. "adc r4, r4, #0\n\t"
  60004. "lsr r7, r12, #16\n\t"
  60005. "mul r6, r7, r6\n\t"
  60006. "lsr r7, r6, #16\n\t"
  60007. "lsl r6, r6, #16\n\t"
  60008. "adds r5, r5, r6\n\t"
  60009. "adcs r3, r3, r7\n\t"
  60010. "adc r4, r4, #0\n\t"
  60011. "lsr r6, r8, #16\n\t"
  60012. "lsr r7, r12, #16\n\t"
  60013. "mul r7, r6, r7\n\t"
  60014. "adds r3, r3, r7\n\t"
  60015. "adc r4, r4, #0\n\t"
  60016. "lsl r7, r12, #16\n\t"
  60017. "lsr r7, r7, #16\n\t"
  60018. "mul r6, r7, r6\n\t"
  60019. "lsr r7, r6, #16\n\t"
  60020. "lsl r6, r6, #16\n\t"
  60021. "adds r5, r5, r6\n\t"
  60022. "adcs r3, r3, r7\n\t"
  60023. "adc r4, r4, #0\n\t"
  60024. #else
  60025. "umull r6, r7, r8, r12\n\t"
  60026. "adds r5, r5, r6\n\t"
  60027. "adcs r3, r3, r7\n\t"
  60028. "mov r4, #0\n\t"
  60029. "adc r4, r4, #0\n\t"
  60030. #endif
  60031. /* A[1] * B[1] */
  60032. "ldr r11, [%[a], #4]\n\t"
  60033. "ldr r12, [%[b], #4]\n\t"
  60034. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60035. "lsl r6, r11, #16\n\t"
  60036. "lsl r7, r12, #16\n\t"
  60037. "lsr r6, r6, #16\n\t"
  60038. "lsr r7, r7, #16\n\t"
  60039. "mul r7, r6, r7\n\t"
  60040. "adds r5, r5, r7\n\t"
  60041. "adcs r3, r3, #0\n\t"
  60042. "adc r4, r4, #0\n\t"
  60043. "lsr r7, r12, #16\n\t"
  60044. "mul r6, r7, r6\n\t"
  60045. "lsr r7, r6, #16\n\t"
  60046. "lsl r6, r6, #16\n\t"
  60047. "adds r5, r5, r6\n\t"
  60048. "adcs r3, r3, r7\n\t"
  60049. "adc r4, r4, #0\n\t"
  60050. "lsr r6, r11, #16\n\t"
  60051. "lsr r7, r12, #16\n\t"
  60052. "mul r7, r6, r7\n\t"
  60053. "adds r3, r3, r7\n\t"
  60054. "adc r4, r4, #0\n\t"
  60055. "lsl r7, r12, #16\n\t"
  60056. "lsr r7, r7, #16\n\t"
  60057. "mul r6, r7, r6\n\t"
  60058. "lsr r7, r6, #16\n\t"
  60059. "lsl r6, r6, #16\n\t"
  60060. "adds r5, r5, r6\n\t"
  60061. "adcs r3, r3, r7\n\t"
  60062. "adc r4, r4, #0\n\t"
  60063. #else
  60064. "umull r6, r7, r11, r12\n\t"
  60065. "adds r5, r5, r6\n\t"
  60066. "adcs r3, r3, r7\n\t"
  60067. "adc r4, r4, #0\n\t"
  60068. #endif
  60069. /* A[0] * B[2] */
  60070. "ldr r8, [%[a]]\n\t"
  60071. "ldr r9, [%[b], #8]\n\t"
  60072. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60073. "lsl r6, r8, #16\n\t"
  60074. "lsl r7, r9, #16\n\t"
  60075. "lsr r6, r6, #16\n\t"
  60076. "lsr r7, r7, #16\n\t"
  60077. "mul r7, r6, r7\n\t"
  60078. "adds r5, r5, r7\n\t"
  60079. "adcs r3, r3, #0\n\t"
  60080. "adc r4, r4, #0\n\t"
  60081. "lsr r7, r9, #16\n\t"
  60082. "mul r6, r7, r6\n\t"
  60083. "lsr r7, r6, #16\n\t"
  60084. "lsl r6, r6, #16\n\t"
  60085. "adds r5, r5, r6\n\t"
  60086. "adcs r3, r3, r7\n\t"
  60087. "adc r4, r4, #0\n\t"
  60088. "lsr r6, r8, #16\n\t"
  60089. "lsr r7, r9, #16\n\t"
  60090. "mul r7, r6, r7\n\t"
  60091. "adds r3, r3, r7\n\t"
  60092. "adc r4, r4, #0\n\t"
  60093. "lsl r7, r9, #16\n\t"
  60094. "lsr r7, r7, #16\n\t"
  60095. "mul r6, r7, r6\n\t"
  60096. "lsr r7, r6, #16\n\t"
  60097. "lsl r6, r6, #16\n\t"
  60098. "adds r5, r5, r6\n\t"
  60099. "adcs r3, r3, r7\n\t"
  60100. "adc r4, r4, #0\n\t"
  60101. #else
  60102. "umull r6, r7, r8, r9\n\t"
  60103. "adds r5, r5, r6\n\t"
  60104. "adcs r3, r3, r7\n\t"
  60105. "adc r4, r4, #0\n\t"
  60106. #endif
  60107. "str r5, [sp, #8]\n\t"
  60108. /* A[0] * B[3] */
  60109. "ldr r9, [%[b], #12]\n\t"
  60110. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60111. "lsl r6, r8, #16\n\t"
  60112. "lsl r7, r9, #16\n\t"
  60113. "lsr r6, r6, #16\n\t"
  60114. "lsr r7, r7, #16\n\t"
  60115. "mul r7, r6, r7\n\t"
  60116. "adds r3, r3, r7\n\t"
  60117. "adcs r4, r4, #0\n\t"
  60118. "mov r5, #0\n\t"
  60119. "adc r5, r5, #0\n\t"
  60120. "lsr r7, r9, #16\n\t"
  60121. "mul r6, r7, r6\n\t"
  60122. "lsr r7, r6, #16\n\t"
  60123. "lsl r6, r6, #16\n\t"
  60124. "adds r3, r3, r6\n\t"
  60125. "adcs r4, r4, r7\n\t"
  60126. "adc r5, r5, #0\n\t"
  60127. "lsr r6, r8, #16\n\t"
  60128. "lsr r7, r9, #16\n\t"
  60129. "mul r7, r6, r7\n\t"
  60130. "adds r4, r4, r7\n\t"
  60131. "adc r5, r5, #0\n\t"
  60132. "lsl r7, r9, #16\n\t"
  60133. "lsr r7, r7, #16\n\t"
  60134. "mul r6, r7, r6\n\t"
  60135. "lsr r7, r6, #16\n\t"
  60136. "lsl r6, r6, #16\n\t"
  60137. "adds r3, r3, r6\n\t"
  60138. "adcs r4, r4, r7\n\t"
  60139. "adc r5, r5, #0\n\t"
  60140. #else
  60141. "umull r6, r7, r8, r9\n\t"
  60142. "adds r3, r3, r6\n\t"
  60143. "adcs r4, r4, r7\n\t"
  60144. "mov r5, #0\n\t"
  60145. "adc r5, r5, #0\n\t"
  60146. #endif
  60147. /* A[1] * B[2] */
  60148. "ldr r9, [%[b], #8]\n\t"
  60149. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60150. "lsl r6, r11, #16\n\t"
  60151. "lsl r7, r9, #16\n\t"
  60152. "lsr r6, r6, #16\n\t"
  60153. "lsr r7, r7, #16\n\t"
  60154. "mul r7, r6, r7\n\t"
  60155. "adds r3, r3, r7\n\t"
  60156. "adcs r4, r4, #0\n\t"
  60157. "adc r5, r5, #0\n\t"
  60158. "lsr r7, r9, #16\n\t"
  60159. "mul r6, r7, r6\n\t"
  60160. "lsr r7, r6, #16\n\t"
  60161. "lsl r6, r6, #16\n\t"
  60162. "adds r3, r3, r6\n\t"
  60163. "adcs r4, r4, r7\n\t"
  60164. "adc r5, r5, #0\n\t"
  60165. "lsr r6, r11, #16\n\t"
  60166. "lsr r7, r9, #16\n\t"
  60167. "mul r7, r6, r7\n\t"
  60168. "adds r4, r4, r7\n\t"
  60169. "adc r5, r5, #0\n\t"
  60170. "lsl r7, r9, #16\n\t"
  60171. "lsr r7, r7, #16\n\t"
  60172. "mul r6, r7, r6\n\t"
  60173. "lsr r7, r6, #16\n\t"
  60174. "lsl r6, r6, #16\n\t"
  60175. "adds r3, r3, r6\n\t"
  60176. "adcs r4, r4, r7\n\t"
  60177. "adc r5, r5, #0\n\t"
  60178. #else
  60179. "umull r6, r7, r11, r9\n\t"
  60180. "adds r3, r3, r6\n\t"
  60181. "adcs r4, r4, r7\n\t"
  60182. "adc r5, r5, #0\n\t"
  60183. #endif
  60184. /* A[2] * B[1] */
  60185. "ldr r8, [%[a], #8]\n\t"
  60186. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60187. "lsl r6, r8, #16\n\t"
  60188. "lsl r7, r12, #16\n\t"
  60189. "lsr r6, r6, #16\n\t"
  60190. "lsr r7, r7, #16\n\t"
  60191. "mul r7, r6, r7\n\t"
  60192. "adds r3, r3, r7\n\t"
  60193. "adcs r4, r4, #0\n\t"
  60194. "adc r5, r5, #0\n\t"
  60195. "lsr r7, r12, #16\n\t"
  60196. "mul r6, r7, r6\n\t"
  60197. "lsr r7, r6, #16\n\t"
  60198. "lsl r6, r6, #16\n\t"
  60199. "adds r3, r3, r6\n\t"
  60200. "adcs r4, r4, r7\n\t"
  60201. "adc r5, r5, #0\n\t"
  60202. "lsr r6, r8, #16\n\t"
  60203. "lsr r7, r12, #16\n\t"
  60204. "mul r7, r6, r7\n\t"
  60205. "adds r4, r4, r7\n\t"
  60206. "adc r5, r5, #0\n\t"
  60207. "lsl r7, r12, #16\n\t"
  60208. "lsr r7, r7, #16\n\t"
  60209. "mul r6, r7, r6\n\t"
  60210. "lsr r7, r6, #16\n\t"
  60211. "lsl r6, r6, #16\n\t"
  60212. "adds r3, r3, r6\n\t"
  60213. "adcs r4, r4, r7\n\t"
  60214. "adc r5, r5, #0\n\t"
  60215. #else
  60216. "umull r6, r7, r8, r12\n\t"
  60217. "adds r3, r3, r6\n\t"
  60218. "adcs r4, r4, r7\n\t"
  60219. "adc r5, r5, #0\n\t"
  60220. #endif
  60221. /* A[3] * B[0] */
  60222. "ldr r8, [%[a], #12]\n\t"
  60223. "ldr r9, [%[b]]\n\t"
  60224. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60225. "lsl r6, r8, #16\n\t"
  60226. "lsl r7, r9, #16\n\t"
  60227. "lsr r6, r6, #16\n\t"
  60228. "lsr r7, r7, #16\n\t"
  60229. "mul r7, r6, r7\n\t"
  60230. "adds r3, r3, r7\n\t"
  60231. "adcs r4, r4, #0\n\t"
  60232. "adc r5, r5, #0\n\t"
  60233. "lsr r7, r9, #16\n\t"
  60234. "mul r6, r7, r6\n\t"
  60235. "lsr r7, r6, #16\n\t"
  60236. "lsl r6, r6, #16\n\t"
  60237. "adds r3, r3, r6\n\t"
  60238. "adcs r4, r4, r7\n\t"
  60239. "adc r5, r5, #0\n\t"
  60240. "lsr r6, r8, #16\n\t"
  60241. "lsr r7, r9, #16\n\t"
  60242. "mul r7, r6, r7\n\t"
  60243. "adds r4, r4, r7\n\t"
  60244. "adc r5, r5, #0\n\t"
  60245. "lsl r7, r9, #16\n\t"
  60246. "lsr r7, r7, #16\n\t"
  60247. "mul r6, r7, r6\n\t"
  60248. "lsr r7, r6, #16\n\t"
  60249. "lsl r6, r6, #16\n\t"
  60250. "adds r3, r3, r6\n\t"
  60251. "adcs r4, r4, r7\n\t"
  60252. "adc r5, r5, #0\n\t"
  60253. #else
  60254. "umull r6, r7, r8, r9\n\t"
  60255. "adds r3, r3, r6\n\t"
  60256. "adcs r4, r4, r7\n\t"
  60257. "adc r5, r5, #0\n\t"
  60258. #endif
  60259. "str r3, [sp, #12]\n\t"
  60260. /* A[4] * B[0] */
  60261. "ldr r8, [%[a], #16]\n\t"
  60262. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60263. "lsl r6, r8, #16\n\t"
  60264. "lsl r7, r9, #16\n\t"
  60265. "lsr r6, r6, #16\n\t"
  60266. "lsr r7, r7, #16\n\t"
  60267. "mul r7, r6, r7\n\t"
  60268. "adds r4, r4, r7\n\t"
  60269. "adcs r5, r5, #0\n\t"
  60270. "mov r3, #0\n\t"
  60271. "adc r3, r3, #0\n\t"
  60272. "lsr r7, r9, #16\n\t"
  60273. "mul r6, r7, r6\n\t"
  60274. "lsr r7, r6, #16\n\t"
  60275. "lsl r6, r6, #16\n\t"
  60276. "adds r4, r4, r6\n\t"
  60277. "adcs r5, r5, r7\n\t"
  60278. "adc r3, r3, #0\n\t"
  60279. "lsr r6, r8, #16\n\t"
  60280. "lsr r7, r9, #16\n\t"
  60281. "mul r7, r6, r7\n\t"
  60282. "adds r5, r5, r7\n\t"
  60283. "adc r3, r3, #0\n\t"
  60284. "lsl r7, r9, #16\n\t"
  60285. "lsr r7, r7, #16\n\t"
  60286. "mul r6, r7, r6\n\t"
  60287. "lsr r7, r6, #16\n\t"
  60288. "lsl r6, r6, #16\n\t"
  60289. "adds r4, r4, r6\n\t"
  60290. "adcs r5, r5, r7\n\t"
  60291. "adc r3, r3, #0\n\t"
  60292. #else
  60293. "umull r6, r7, r8, r9\n\t"
  60294. "adds r4, r4, r6\n\t"
  60295. "adcs r5, r5, r7\n\t"
  60296. "mov r3, #0\n\t"
  60297. "adc r3, r3, #0\n\t"
  60298. #endif
  60299. /* A[3] * B[1] */
  60300. "ldr r8, [%[a], #12]\n\t"
  60301. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60302. "lsl r6, r8, #16\n\t"
  60303. "lsl r7, r12, #16\n\t"
  60304. "lsr r6, r6, #16\n\t"
  60305. "lsr r7, r7, #16\n\t"
  60306. "mul r7, r6, r7\n\t"
  60307. "adds r4, r4, r7\n\t"
  60308. "adcs r5, r5, #0\n\t"
  60309. "adc r3, r3, #0\n\t"
  60310. "lsr r7, r12, #16\n\t"
  60311. "mul r6, r7, r6\n\t"
  60312. "lsr r7, r6, #16\n\t"
  60313. "lsl r6, r6, #16\n\t"
  60314. "adds r4, r4, r6\n\t"
  60315. "adcs r5, r5, r7\n\t"
  60316. "adc r3, r3, #0\n\t"
  60317. "lsr r6, r8, #16\n\t"
  60318. "lsr r7, r12, #16\n\t"
  60319. "mul r7, r6, r7\n\t"
  60320. "adds r5, r5, r7\n\t"
  60321. "adc r3, r3, #0\n\t"
  60322. "lsl r7, r12, #16\n\t"
  60323. "lsr r7, r7, #16\n\t"
  60324. "mul r6, r7, r6\n\t"
  60325. "lsr r7, r6, #16\n\t"
  60326. "lsl r6, r6, #16\n\t"
  60327. "adds r4, r4, r6\n\t"
  60328. "adcs r5, r5, r7\n\t"
  60329. "adc r3, r3, #0\n\t"
  60330. #else
  60331. "umull r6, r7, r8, r12\n\t"
  60332. "adds r4, r4, r6\n\t"
  60333. "adcs r5, r5, r7\n\t"
  60334. "adc r3, r3, #0\n\t"
  60335. #endif
  60336. /* A[2] * B[2] */
  60337. "ldr r11, [%[a], #8]\n\t"
  60338. "ldr r12, [%[b], #8]\n\t"
  60339. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60340. "lsl r6, r11, #16\n\t"
  60341. "lsl r7, r12, #16\n\t"
  60342. "lsr r6, r6, #16\n\t"
  60343. "lsr r7, r7, #16\n\t"
  60344. "mul r7, r6, r7\n\t"
  60345. "adds r4, r4, r7\n\t"
  60346. "adcs r5, r5, #0\n\t"
  60347. "adc r3, r3, #0\n\t"
  60348. "lsr r7, r12, #16\n\t"
  60349. "mul r6, r7, r6\n\t"
  60350. "lsr r7, r6, #16\n\t"
  60351. "lsl r6, r6, #16\n\t"
  60352. "adds r4, r4, r6\n\t"
  60353. "adcs r5, r5, r7\n\t"
  60354. "adc r3, r3, #0\n\t"
  60355. "lsr r6, r11, #16\n\t"
  60356. "lsr r7, r12, #16\n\t"
  60357. "mul r7, r6, r7\n\t"
  60358. "adds r5, r5, r7\n\t"
  60359. "adc r3, r3, #0\n\t"
  60360. "lsl r7, r12, #16\n\t"
  60361. "lsr r7, r7, #16\n\t"
  60362. "mul r6, r7, r6\n\t"
  60363. "lsr r7, r6, #16\n\t"
  60364. "lsl r6, r6, #16\n\t"
  60365. "adds r4, r4, r6\n\t"
  60366. "adcs r5, r5, r7\n\t"
  60367. "adc r3, r3, #0\n\t"
  60368. #else
  60369. "umull r6, r7, r11, r12\n\t"
  60370. "adds r4, r4, r6\n\t"
  60371. "adcs r5, r5, r7\n\t"
  60372. "adc r3, r3, #0\n\t"
  60373. #endif
  60374. /* A[1] * B[3] */
  60375. "ldr r8, [%[a], #4]\n\t"
  60376. "ldr r9, [%[b], #12]\n\t"
  60377. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60378. "lsl r6, r8, #16\n\t"
  60379. "lsl r7, r9, #16\n\t"
  60380. "lsr r6, r6, #16\n\t"
  60381. "lsr r7, r7, #16\n\t"
  60382. "mul r7, r6, r7\n\t"
  60383. "adds r4, r4, r7\n\t"
  60384. "adcs r5, r5, #0\n\t"
  60385. "adc r3, r3, #0\n\t"
  60386. "lsr r7, r9, #16\n\t"
  60387. "mul r6, r7, r6\n\t"
  60388. "lsr r7, r6, #16\n\t"
  60389. "lsl r6, r6, #16\n\t"
  60390. "adds r4, r4, r6\n\t"
  60391. "adcs r5, r5, r7\n\t"
  60392. "adc r3, r3, #0\n\t"
  60393. "lsr r6, r8, #16\n\t"
  60394. "lsr r7, r9, #16\n\t"
  60395. "mul r7, r6, r7\n\t"
  60396. "adds r5, r5, r7\n\t"
  60397. "adc r3, r3, #0\n\t"
  60398. "lsl r7, r9, #16\n\t"
  60399. "lsr r7, r7, #16\n\t"
  60400. "mul r6, r7, r6\n\t"
  60401. "lsr r7, r6, #16\n\t"
  60402. "lsl r6, r6, #16\n\t"
  60403. "adds r4, r4, r6\n\t"
  60404. "adcs r5, r5, r7\n\t"
  60405. "adc r3, r3, #0\n\t"
  60406. #else
  60407. "umull r6, r7, r8, r9\n\t"
  60408. "adds r4, r4, r6\n\t"
  60409. "adcs r5, r5, r7\n\t"
  60410. "adc r3, r3, #0\n\t"
  60411. #endif
  60412. /* A[0] * B[4] */
  60413. "ldr r8, [%[a]]\n\t"
  60414. "ldr r9, [%[b], #16]\n\t"
  60415. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60416. "lsl r6, r8, #16\n\t"
  60417. "lsl r7, r9, #16\n\t"
  60418. "lsr r6, r6, #16\n\t"
  60419. "lsr r7, r7, #16\n\t"
  60420. "mul r7, r6, r7\n\t"
  60421. "adds r4, r4, r7\n\t"
  60422. "adcs r5, r5, #0\n\t"
  60423. "adc r3, r3, #0\n\t"
  60424. "lsr r7, r9, #16\n\t"
  60425. "mul r6, r7, r6\n\t"
  60426. "lsr r7, r6, #16\n\t"
  60427. "lsl r6, r6, #16\n\t"
  60428. "adds r4, r4, r6\n\t"
  60429. "adcs r5, r5, r7\n\t"
  60430. "adc r3, r3, #0\n\t"
  60431. "lsr r6, r8, #16\n\t"
  60432. "lsr r7, r9, #16\n\t"
  60433. "mul r7, r6, r7\n\t"
  60434. "adds r5, r5, r7\n\t"
  60435. "adc r3, r3, #0\n\t"
  60436. "lsl r7, r9, #16\n\t"
  60437. "lsr r7, r7, #16\n\t"
  60438. "mul r6, r7, r6\n\t"
  60439. "lsr r7, r6, #16\n\t"
  60440. "lsl r6, r6, #16\n\t"
  60441. "adds r4, r4, r6\n\t"
  60442. "adcs r5, r5, r7\n\t"
  60443. "adc r3, r3, #0\n\t"
  60444. #else
  60445. "umull r6, r7, r8, r9\n\t"
  60446. "adds r4, r4, r6\n\t"
  60447. "adcs r5, r5, r7\n\t"
  60448. "adc r3, r3, #0\n\t"
  60449. #endif
  60450. "str r4, [sp, #16]\n\t"
  60451. /* A[0] * B[5] */
  60452. "ldr r9, [%[b], #20]\n\t"
  60453. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60454. "lsl r6, r8, #16\n\t"
  60455. "lsl r7, r9, #16\n\t"
  60456. "lsr r6, r6, #16\n\t"
  60457. "lsr r7, r7, #16\n\t"
  60458. "mul r7, r6, r7\n\t"
  60459. "adds r5, r5, r7\n\t"
  60460. "adcs r3, r3, #0\n\t"
  60461. "mov r4, #0\n\t"
  60462. "adc r4, r4, #0\n\t"
  60463. "lsr r7, r9, #16\n\t"
  60464. "mul r6, r7, r6\n\t"
  60465. "lsr r7, r6, #16\n\t"
  60466. "lsl r6, r6, #16\n\t"
  60467. "adds r5, r5, r6\n\t"
  60468. "adcs r3, r3, r7\n\t"
  60469. "adc r4, r4, #0\n\t"
  60470. "lsr r6, r8, #16\n\t"
  60471. "lsr r7, r9, #16\n\t"
  60472. "mul r7, r6, r7\n\t"
  60473. "adds r3, r3, r7\n\t"
  60474. "adc r4, r4, #0\n\t"
  60475. "lsl r7, r9, #16\n\t"
  60476. "lsr r7, r7, #16\n\t"
  60477. "mul r6, r7, r6\n\t"
  60478. "lsr r7, r6, #16\n\t"
  60479. "lsl r6, r6, #16\n\t"
  60480. "adds r5, r5, r6\n\t"
  60481. "adcs r3, r3, r7\n\t"
  60482. "adc r4, r4, #0\n\t"
  60483. #else
  60484. "umull r6, r7, r8, r9\n\t"
  60485. "adds r5, r5, r6\n\t"
  60486. "adcs r3, r3, r7\n\t"
  60487. "mov r4, #0\n\t"
  60488. "adc r4, r4, #0\n\t"
  60489. #endif
  60490. /* A[1] * B[4] */
  60491. "ldr r8, [%[a], #4]\n\t"
  60492. "ldr r9, [%[b], #16]\n\t"
  60493. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60494. "lsl r6, r8, #16\n\t"
  60495. "lsl r7, r9, #16\n\t"
  60496. "lsr r6, r6, #16\n\t"
  60497. "lsr r7, r7, #16\n\t"
  60498. "mul r7, r6, r7\n\t"
  60499. "adds r5, r5, r7\n\t"
  60500. "adcs r3, r3, #0\n\t"
  60501. "adc r4, r4, #0\n\t"
  60502. "lsr r7, r9, #16\n\t"
  60503. "mul r6, r7, r6\n\t"
  60504. "lsr r7, r6, #16\n\t"
  60505. "lsl r6, r6, #16\n\t"
  60506. "adds r5, r5, r6\n\t"
  60507. "adcs r3, r3, r7\n\t"
  60508. "adc r4, r4, #0\n\t"
  60509. "lsr r6, r8, #16\n\t"
  60510. "lsr r7, r9, #16\n\t"
  60511. "mul r7, r6, r7\n\t"
  60512. "adds r3, r3, r7\n\t"
  60513. "adc r4, r4, #0\n\t"
  60514. "lsl r7, r9, #16\n\t"
  60515. "lsr r7, r7, #16\n\t"
  60516. "mul r6, r7, r6\n\t"
  60517. "lsr r7, r6, #16\n\t"
  60518. "lsl r6, r6, #16\n\t"
  60519. "adds r5, r5, r6\n\t"
  60520. "adcs r3, r3, r7\n\t"
  60521. "adc r4, r4, #0\n\t"
  60522. #else
  60523. "umull r6, r7, r8, r9\n\t"
  60524. "adds r5, r5, r6\n\t"
  60525. "adcs r3, r3, r7\n\t"
  60526. "adc r4, r4, #0\n\t"
  60527. #endif
  60528. /* A[2] * B[3] */
  60529. "ldr r9, [%[b], #12]\n\t"
  60530. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60531. "lsl r6, r11, #16\n\t"
  60532. "lsl r7, r9, #16\n\t"
  60533. "lsr r6, r6, #16\n\t"
  60534. "lsr r7, r7, #16\n\t"
  60535. "mul r7, r6, r7\n\t"
  60536. "adds r5, r5, r7\n\t"
  60537. "adcs r3, r3, #0\n\t"
  60538. "adc r4, r4, #0\n\t"
  60539. "lsr r7, r9, #16\n\t"
  60540. "mul r6, r7, r6\n\t"
  60541. "lsr r7, r6, #16\n\t"
  60542. "lsl r6, r6, #16\n\t"
  60543. "adds r5, r5, r6\n\t"
  60544. "adcs r3, r3, r7\n\t"
  60545. "adc r4, r4, #0\n\t"
  60546. "lsr r6, r11, #16\n\t"
  60547. "lsr r7, r9, #16\n\t"
  60548. "mul r7, r6, r7\n\t"
  60549. "adds r3, r3, r7\n\t"
  60550. "adc r4, r4, #0\n\t"
  60551. "lsl r7, r9, #16\n\t"
  60552. "lsr r7, r7, #16\n\t"
  60553. "mul r6, r7, r6\n\t"
  60554. "lsr r7, r6, #16\n\t"
  60555. "lsl r6, r6, #16\n\t"
  60556. "adds r5, r5, r6\n\t"
  60557. "adcs r3, r3, r7\n\t"
  60558. "adc r4, r4, #0\n\t"
  60559. #else
  60560. "umull r6, r7, r11, r9\n\t"
  60561. "adds r5, r5, r6\n\t"
  60562. "adcs r3, r3, r7\n\t"
  60563. "adc r4, r4, #0\n\t"
  60564. #endif
  60565. /* A[3] * B[2] */
  60566. "ldr r8, [%[a], #12]\n\t"
  60567. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60568. "lsl r6, r8, #16\n\t"
  60569. "lsl r7, r12, #16\n\t"
  60570. "lsr r6, r6, #16\n\t"
  60571. "lsr r7, r7, #16\n\t"
  60572. "mul r7, r6, r7\n\t"
  60573. "adds r5, r5, r7\n\t"
  60574. "adcs r3, r3, #0\n\t"
  60575. "adc r4, r4, #0\n\t"
  60576. "lsr r7, r12, #16\n\t"
  60577. "mul r6, r7, r6\n\t"
  60578. "lsr r7, r6, #16\n\t"
  60579. "lsl r6, r6, #16\n\t"
  60580. "adds r5, r5, r6\n\t"
  60581. "adcs r3, r3, r7\n\t"
  60582. "adc r4, r4, #0\n\t"
  60583. "lsr r6, r8, #16\n\t"
  60584. "lsr r7, r12, #16\n\t"
  60585. "mul r7, r6, r7\n\t"
  60586. "adds r3, r3, r7\n\t"
  60587. "adc r4, r4, #0\n\t"
  60588. "lsl r7, r12, #16\n\t"
  60589. "lsr r7, r7, #16\n\t"
  60590. "mul r6, r7, r6\n\t"
  60591. "lsr r7, r6, #16\n\t"
  60592. "lsl r6, r6, #16\n\t"
  60593. "adds r5, r5, r6\n\t"
  60594. "adcs r3, r3, r7\n\t"
  60595. "adc r4, r4, #0\n\t"
  60596. #else
  60597. "umull r6, r7, r8, r12\n\t"
  60598. "adds r5, r5, r6\n\t"
  60599. "adcs r3, r3, r7\n\t"
  60600. "adc r4, r4, #0\n\t"
  60601. #endif
  60602. /* A[4] * B[1] */
  60603. "ldr r8, [%[a], #16]\n\t"
  60604. "ldr r9, [%[b], #4]\n\t"
  60605. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60606. "lsl r6, r8, #16\n\t"
  60607. "lsl r7, r9, #16\n\t"
  60608. "lsr r6, r6, #16\n\t"
  60609. "lsr r7, r7, #16\n\t"
  60610. "mul r7, r6, r7\n\t"
  60611. "adds r5, r5, r7\n\t"
  60612. "adcs r3, r3, #0\n\t"
  60613. "adc r4, r4, #0\n\t"
  60614. "lsr r7, r9, #16\n\t"
  60615. "mul r6, r7, r6\n\t"
  60616. "lsr r7, r6, #16\n\t"
  60617. "lsl r6, r6, #16\n\t"
  60618. "adds r5, r5, r6\n\t"
  60619. "adcs r3, r3, r7\n\t"
  60620. "adc r4, r4, #0\n\t"
  60621. "lsr r6, r8, #16\n\t"
  60622. "lsr r7, r9, #16\n\t"
  60623. "mul r7, r6, r7\n\t"
  60624. "adds r3, r3, r7\n\t"
  60625. "adc r4, r4, #0\n\t"
  60626. "lsl r7, r9, #16\n\t"
  60627. "lsr r7, r7, #16\n\t"
  60628. "mul r6, r7, r6\n\t"
  60629. "lsr r7, r6, #16\n\t"
  60630. "lsl r6, r6, #16\n\t"
  60631. "adds r5, r5, r6\n\t"
  60632. "adcs r3, r3, r7\n\t"
  60633. "adc r4, r4, #0\n\t"
  60634. #else
  60635. "umull r6, r7, r8, r9\n\t"
  60636. "adds r5, r5, r6\n\t"
  60637. "adcs r3, r3, r7\n\t"
  60638. "adc r4, r4, #0\n\t"
  60639. #endif
  60640. /* A[5] * B[0] */
  60641. "ldr r8, [%[a], #20]\n\t"
  60642. "ldr r9, [%[b]]\n\t"
  60643. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60644. "lsl r6, r8, #16\n\t"
  60645. "lsl r7, r9, #16\n\t"
  60646. "lsr r6, r6, #16\n\t"
  60647. "lsr r7, r7, #16\n\t"
  60648. "mul r7, r6, r7\n\t"
  60649. "adds r5, r5, r7\n\t"
  60650. "adcs r3, r3, #0\n\t"
  60651. "adc r4, r4, #0\n\t"
  60652. "lsr r7, r9, #16\n\t"
  60653. "mul r6, r7, r6\n\t"
  60654. "lsr r7, r6, #16\n\t"
  60655. "lsl r6, r6, #16\n\t"
  60656. "adds r5, r5, r6\n\t"
  60657. "adcs r3, r3, r7\n\t"
  60658. "adc r4, r4, #0\n\t"
  60659. "lsr r6, r8, #16\n\t"
  60660. "lsr r7, r9, #16\n\t"
  60661. "mul r7, r6, r7\n\t"
  60662. "adds r3, r3, r7\n\t"
  60663. "adc r4, r4, #0\n\t"
  60664. "lsl r7, r9, #16\n\t"
  60665. "lsr r7, r7, #16\n\t"
  60666. "mul r6, r7, r6\n\t"
  60667. "lsr r7, r6, #16\n\t"
  60668. "lsl r6, r6, #16\n\t"
  60669. "adds r5, r5, r6\n\t"
  60670. "adcs r3, r3, r7\n\t"
  60671. "adc r4, r4, #0\n\t"
  60672. #else
  60673. "umull r6, r7, r8, r9\n\t"
  60674. "adds r5, r5, r6\n\t"
  60675. "adcs r3, r3, r7\n\t"
  60676. "adc r4, r4, #0\n\t"
  60677. #endif
  60678. "str r5, [sp, #20]\n\t"
  60679. /* A[6] * B[0] */
  60680. "ldr r8, [%[a], #24]\n\t"
  60681. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60682. "lsl r6, r8, #16\n\t"
  60683. "lsl r7, r9, #16\n\t"
  60684. "lsr r6, r6, #16\n\t"
  60685. "lsr r7, r7, #16\n\t"
  60686. "mul r7, r6, r7\n\t"
  60687. "adds r3, r3, r7\n\t"
  60688. "adcs r4, r4, #0\n\t"
  60689. "mov r5, #0\n\t"
  60690. "adc r5, r5, #0\n\t"
  60691. "lsr r7, r9, #16\n\t"
  60692. "mul r6, r7, r6\n\t"
  60693. "lsr r7, r6, #16\n\t"
  60694. "lsl r6, r6, #16\n\t"
  60695. "adds r3, r3, r6\n\t"
  60696. "adcs r4, r4, r7\n\t"
  60697. "adc r5, r5, #0\n\t"
  60698. "lsr r6, r8, #16\n\t"
  60699. "lsr r7, r9, #16\n\t"
  60700. "mul r7, r6, r7\n\t"
  60701. "adds r4, r4, r7\n\t"
  60702. "adc r5, r5, #0\n\t"
  60703. "lsl r7, r9, #16\n\t"
  60704. "lsr r7, r7, #16\n\t"
  60705. "mul r6, r7, r6\n\t"
  60706. "lsr r7, r6, #16\n\t"
  60707. "lsl r6, r6, #16\n\t"
  60708. "adds r3, r3, r6\n\t"
  60709. "adcs r4, r4, r7\n\t"
  60710. "adc r5, r5, #0\n\t"
  60711. #else
  60712. "umull r6, r7, r8, r9\n\t"
  60713. "adds r3, r3, r6\n\t"
  60714. "adcs r4, r4, r7\n\t"
  60715. "mov r5, #0\n\t"
  60716. "adc r5, r5, #0\n\t"
  60717. #endif
  60718. /* A[5] * B[1] */
  60719. "ldr r8, [%[a], #20]\n\t"
  60720. "ldr r9, [%[b], #4]\n\t"
  60721. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60722. "lsl r6, r8, #16\n\t"
  60723. "lsl r7, r9, #16\n\t"
  60724. "lsr r6, r6, #16\n\t"
  60725. "lsr r7, r7, #16\n\t"
  60726. "mul r7, r6, r7\n\t"
  60727. "adds r3, r3, r7\n\t"
  60728. "adcs r4, r4, #0\n\t"
  60729. "adc r5, r5, #0\n\t"
  60730. "lsr r7, r9, #16\n\t"
  60731. "mul r6, r7, r6\n\t"
  60732. "lsr r7, r6, #16\n\t"
  60733. "lsl r6, r6, #16\n\t"
  60734. "adds r3, r3, r6\n\t"
  60735. "adcs r4, r4, r7\n\t"
  60736. "adc r5, r5, #0\n\t"
  60737. "lsr r6, r8, #16\n\t"
  60738. "lsr r7, r9, #16\n\t"
  60739. "mul r7, r6, r7\n\t"
  60740. "adds r4, r4, r7\n\t"
  60741. "adc r5, r5, #0\n\t"
  60742. "lsl r7, r9, #16\n\t"
  60743. "lsr r7, r7, #16\n\t"
  60744. "mul r6, r7, r6\n\t"
  60745. "lsr r7, r6, #16\n\t"
  60746. "lsl r6, r6, #16\n\t"
  60747. "adds r3, r3, r6\n\t"
  60748. "adcs r4, r4, r7\n\t"
  60749. "adc r5, r5, #0\n\t"
  60750. #else
  60751. "umull r6, r7, r8, r9\n\t"
  60752. "adds r3, r3, r6\n\t"
  60753. "adcs r4, r4, r7\n\t"
  60754. "adc r5, r5, #0\n\t"
  60755. #endif
  60756. /* A[4] * B[2] */
  60757. "ldr r8, [%[a], #16]\n\t"
  60758. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60759. "lsl r6, r8, #16\n\t"
  60760. "lsl r7, r12, #16\n\t"
  60761. "lsr r6, r6, #16\n\t"
  60762. "lsr r7, r7, #16\n\t"
  60763. "mul r7, r6, r7\n\t"
  60764. "adds r3, r3, r7\n\t"
  60765. "adcs r4, r4, #0\n\t"
  60766. "adc r5, r5, #0\n\t"
  60767. "lsr r7, r12, #16\n\t"
  60768. "mul r6, r7, r6\n\t"
  60769. "lsr r7, r6, #16\n\t"
  60770. "lsl r6, r6, #16\n\t"
  60771. "adds r3, r3, r6\n\t"
  60772. "adcs r4, r4, r7\n\t"
  60773. "adc r5, r5, #0\n\t"
  60774. "lsr r6, r8, #16\n\t"
  60775. "lsr r7, r12, #16\n\t"
  60776. "mul r7, r6, r7\n\t"
  60777. "adds r4, r4, r7\n\t"
  60778. "adc r5, r5, #0\n\t"
  60779. "lsl r7, r12, #16\n\t"
  60780. "lsr r7, r7, #16\n\t"
  60781. "mul r6, r7, r6\n\t"
  60782. "lsr r7, r6, #16\n\t"
  60783. "lsl r6, r6, #16\n\t"
  60784. "adds r3, r3, r6\n\t"
  60785. "adcs r4, r4, r7\n\t"
  60786. "adc r5, r5, #0\n\t"
  60787. #else
  60788. "umull r6, r7, r8, r12\n\t"
  60789. "adds r3, r3, r6\n\t"
  60790. "adcs r4, r4, r7\n\t"
  60791. "adc r5, r5, #0\n\t"
  60792. #endif
  60793. /* A[3] * B[3] */
  60794. "ldr r11, [%[a], #12]\n\t"
  60795. "ldr r12, [%[b], #12]\n\t"
  60796. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60797. "lsl r6, r11, #16\n\t"
  60798. "lsl r7, r12, #16\n\t"
  60799. "lsr r6, r6, #16\n\t"
  60800. "lsr r7, r7, #16\n\t"
  60801. "mul r7, r6, r7\n\t"
  60802. "adds r3, r3, r7\n\t"
  60803. "adcs r4, r4, #0\n\t"
  60804. "adc r5, r5, #0\n\t"
  60805. "lsr r7, r12, #16\n\t"
  60806. "mul r6, r7, r6\n\t"
  60807. "lsr r7, r6, #16\n\t"
  60808. "lsl r6, r6, #16\n\t"
  60809. "adds r3, r3, r6\n\t"
  60810. "adcs r4, r4, r7\n\t"
  60811. "adc r5, r5, #0\n\t"
  60812. "lsr r6, r11, #16\n\t"
  60813. "lsr r7, r12, #16\n\t"
  60814. "mul r7, r6, r7\n\t"
  60815. "adds r4, r4, r7\n\t"
  60816. "adc r5, r5, #0\n\t"
  60817. "lsl r7, r12, #16\n\t"
  60818. "lsr r7, r7, #16\n\t"
  60819. "mul r6, r7, r6\n\t"
  60820. "lsr r7, r6, #16\n\t"
  60821. "lsl r6, r6, #16\n\t"
  60822. "adds r3, r3, r6\n\t"
  60823. "adcs r4, r4, r7\n\t"
  60824. "adc r5, r5, #0\n\t"
  60825. #else
  60826. "umull r6, r7, r11, r12\n\t"
  60827. "adds r3, r3, r6\n\t"
  60828. "adcs r4, r4, r7\n\t"
  60829. "adc r5, r5, #0\n\t"
  60830. #endif
  60831. /* A[2] * B[4] */
  60832. "ldr r8, [%[a], #8]\n\t"
  60833. "ldr r9, [%[b], #16]\n\t"
  60834. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60835. "lsl r6, r8, #16\n\t"
  60836. "lsl r7, r9, #16\n\t"
  60837. "lsr r6, r6, #16\n\t"
  60838. "lsr r7, r7, #16\n\t"
  60839. "mul r7, r6, r7\n\t"
  60840. "adds r3, r3, r7\n\t"
  60841. "adcs r4, r4, #0\n\t"
  60842. "adc r5, r5, #0\n\t"
  60843. "lsr r7, r9, #16\n\t"
  60844. "mul r6, r7, r6\n\t"
  60845. "lsr r7, r6, #16\n\t"
  60846. "lsl r6, r6, #16\n\t"
  60847. "adds r3, r3, r6\n\t"
  60848. "adcs r4, r4, r7\n\t"
  60849. "adc r5, r5, #0\n\t"
  60850. "lsr r6, r8, #16\n\t"
  60851. "lsr r7, r9, #16\n\t"
  60852. "mul r7, r6, r7\n\t"
  60853. "adds r4, r4, r7\n\t"
  60854. "adc r5, r5, #0\n\t"
  60855. "lsl r7, r9, #16\n\t"
  60856. "lsr r7, r7, #16\n\t"
  60857. "mul r6, r7, r6\n\t"
  60858. "lsr r7, r6, #16\n\t"
  60859. "lsl r6, r6, #16\n\t"
  60860. "adds r3, r3, r6\n\t"
  60861. "adcs r4, r4, r7\n\t"
  60862. "adc r5, r5, #0\n\t"
  60863. #else
  60864. "umull r6, r7, r8, r9\n\t"
  60865. "adds r3, r3, r6\n\t"
  60866. "adcs r4, r4, r7\n\t"
  60867. "adc r5, r5, #0\n\t"
  60868. #endif
  60869. /* A[1] * B[5] */
  60870. "ldr r8, [%[a], #4]\n\t"
  60871. "ldr r9, [%[b], #20]\n\t"
  60872. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60873. "lsl r6, r8, #16\n\t"
  60874. "lsl r7, r9, #16\n\t"
  60875. "lsr r6, r6, #16\n\t"
  60876. "lsr r7, r7, #16\n\t"
  60877. "mul r7, r6, r7\n\t"
  60878. "adds r3, r3, r7\n\t"
  60879. "adcs r4, r4, #0\n\t"
  60880. "adc r5, r5, #0\n\t"
  60881. "lsr r7, r9, #16\n\t"
  60882. "mul r6, r7, r6\n\t"
  60883. "lsr r7, r6, #16\n\t"
  60884. "lsl r6, r6, #16\n\t"
  60885. "adds r3, r3, r6\n\t"
  60886. "adcs r4, r4, r7\n\t"
  60887. "adc r5, r5, #0\n\t"
  60888. "lsr r6, r8, #16\n\t"
  60889. "lsr r7, r9, #16\n\t"
  60890. "mul r7, r6, r7\n\t"
  60891. "adds r4, r4, r7\n\t"
  60892. "adc r5, r5, #0\n\t"
  60893. "lsl r7, r9, #16\n\t"
  60894. "lsr r7, r7, #16\n\t"
  60895. "mul r6, r7, r6\n\t"
  60896. "lsr r7, r6, #16\n\t"
  60897. "lsl r6, r6, #16\n\t"
  60898. "adds r3, r3, r6\n\t"
  60899. "adcs r4, r4, r7\n\t"
  60900. "adc r5, r5, #0\n\t"
  60901. #else
  60902. "umull r6, r7, r8, r9\n\t"
  60903. "adds r3, r3, r6\n\t"
  60904. "adcs r4, r4, r7\n\t"
  60905. "adc r5, r5, #0\n\t"
  60906. #endif
  60907. /* A[0] * B[6] */
  60908. "ldr r8, [%[a]]\n\t"
  60909. "ldr r9, [%[b], #24]\n\t"
  60910. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60911. "lsl r6, r8, #16\n\t"
  60912. "lsl r7, r9, #16\n\t"
  60913. "lsr r6, r6, #16\n\t"
  60914. "lsr r7, r7, #16\n\t"
  60915. "mul r7, r6, r7\n\t"
  60916. "adds r3, r3, r7\n\t"
  60917. "adcs r4, r4, #0\n\t"
  60918. "adc r5, r5, #0\n\t"
  60919. "lsr r7, r9, #16\n\t"
  60920. "mul r6, r7, r6\n\t"
  60921. "lsr r7, r6, #16\n\t"
  60922. "lsl r6, r6, #16\n\t"
  60923. "adds r3, r3, r6\n\t"
  60924. "adcs r4, r4, r7\n\t"
  60925. "adc r5, r5, #0\n\t"
  60926. "lsr r6, r8, #16\n\t"
  60927. "lsr r7, r9, #16\n\t"
  60928. "mul r7, r6, r7\n\t"
  60929. "adds r4, r4, r7\n\t"
  60930. "adc r5, r5, #0\n\t"
  60931. "lsl r7, r9, #16\n\t"
  60932. "lsr r7, r7, #16\n\t"
  60933. "mul r6, r7, r6\n\t"
  60934. "lsr r7, r6, #16\n\t"
  60935. "lsl r6, r6, #16\n\t"
  60936. "adds r3, r3, r6\n\t"
  60937. "adcs r4, r4, r7\n\t"
  60938. "adc r5, r5, #0\n\t"
  60939. #else
  60940. "umull r6, r7, r8, r9\n\t"
  60941. "adds r3, r3, r6\n\t"
  60942. "adcs r4, r4, r7\n\t"
  60943. "adc r5, r5, #0\n\t"
  60944. #endif
  60945. "str r3, [sp, #24]\n\t"
  60946. /* A[0] * B[7] */
  60947. "ldr r9, [%[b], #28]\n\t"
  60948. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60949. "lsl r6, r8, #16\n\t"
  60950. "lsl r7, r9, #16\n\t"
  60951. "lsr r6, r6, #16\n\t"
  60952. "lsr r7, r7, #16\n\t"
  60953. "mul r7, r6, r7\n\t"
  60954. "adds r4, r4, r7\n\t"
  60955. "adcs r5, r5, #0\n\t"
  60956. "mov r3, #0\n\t"
  60957. "adc r3, r3, #0\n\t"
  60958. "lsr r7, r9, #16\n\t"
  60959. "mul r6, r7, r6\n\t"
  60960. "lsr r7, r6, #16\n\t"
  60961. "lsl r6, r6, #16\n\t"
  60962. "adds r4, r4, r6\n\t"
  60963. "adcs r5, r5, r7\n\t"
  60964. "adc r3, r3, #0\n\t"
  60965. "lsr r6, r8, #16\n\t"
  60966. "lsr r7, r9, #16\n\t"
  60967. "mul r7, r6, r7\n\t"
  60968. "adds r5, r5, r7\n\t"
  60969. "adc r3, r3, #0\n\t"
  60970. "lsl r7, r9, #16\n\t"
  60971. "lsr r7, r7, #16\n\t"
  60972. "mul r6, r7, r6\n\t"
  60973. "lsr r7, r6, #16\n\t"
  60974. "lsl r6, r6, #16\n\t"
  60975. "adds r4, r4, r6\n\t"
  60976. "adcs r5, r5, r7\n\t"
  60977. "adc r3, r3, #0\n\t"
  60978. #else
  60979. "umull r6, r7, r8, r9\n\t"
  60980. "adds r4, r4, r6\n\t"
  60981. "adcs r5, r5, r7\n\t"
  60982. "mov r3, #0\n\t"
  60983. "adc r3, r3, #0\n\t"
  60984. #endif
  60985. /* A[1] * B[6] */
  60986. "ldr r8, [%[a], #4]\n\t"
  60987. "ldr r9, [%[b], #24]\n\t"
  60988. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  60989. "lsl r6, r8, #16\n\t"
  60990. "lsl r7, r9, #16\n\t"
  60991. "lsr r6, r6, #16\n\t"
  60992. "lsr r7, r7, #16\n\t"
  60993. "mul r7, r6, r7\n\t"
  60994. "adds r4, r4, r7\n\t"
  60995. "adcs r5, r5, #0\n\t"
  60996. "adc r3, r3, #0\n\t"
  60997. "lsr r7, r9, #16\n\t"
  60998. "mul r6, r7, r6\n\t"
  60999. "lsr r7, r6, #16\n\t"
  61000. "lsl r6, r6, #16\n\t"
  61001. "adds r4, r4, r6\n\t"
  61002. "adcs r5, r5, r7\n\t"
  61003. "adc r3, r3, #0\n\t"
  61004. "lsr r6, r8, #16\n\t"
  61005. "lsr r7, r9, #16\n\t"
  61006. "mul r7, r6, r7\n\t"
  61007. "adds r5, r5, r7\n\t"
  61008. "adc r3, r3, #0\n\t"
  61009. "lsl r7, r9, #16\n\t"
  61010. "lsr r7, r7, #16\n\t"
  61011. "mul r6, r7, r6\n\t"
  61012. "lsr r7, r6, #16\n\t"
  61013. "lsl r6, r6, #16\n\t"
  61014. "adds r4, r4, r6\n\t"
  61015. "adcs r5, r5, r7\n\t"
  61016. "adc r3, r3, #0\n\t"
  61017. #else
  61018. "umull r6, r7, r8, r9\n\t"
  61019. "adds r4, r4, r6\n\t"
  61020. "adcs r5, r5, r7\n\t"
  61021. "adc r3, r3, #0\n\t"
  61022. #endif
  61023. /* A[2] * B[5] */
  61024. "ldr r8, [%[a], #8]\n\t"
  61025. "ldr r9, [%[b], #20]\n\t"
  61026. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61027. "lsl r6, r8, #16\n\t"
  61028. "lsl r7, r9, #16\n\t"
  61029. "lsr r6, r6, #16\n\t"
  61030. "lsr r7, r7, #16\n\t"
  61031. "mul r7, r6, r7\n\t"
  61032. "adds r4, r4, r7\n\t"
  61033. "adcs r5, r5, #0\n\t"
  61034. "adc r3, r3, #0\n\t"
  61035. "lsr r7, r9, #16\n\t"
  61036. "mul r6, r7, r6\n\t"
  61037. "lsr r7, r6, #16\n\t"
  61038. "lsl r6, r6, #16\n\t"
  61039. "adds r4, r4, r6\n\t"
  61040. "adcs r5, r5, r7\n\t"
  61041. "adc r3, r3, #0\n\t"
  61042. "lsr r6, r8, #16\n\t"
  61043. "lsr r7, r9, #16\n\t"
  61044. "mul r7, r6, r7\n\t"
  61045. "adds r5, r5, r7\n\t"
  61046. "adc r3, r3, #0\n\t"
  61047. "lsl r7, r9, #16\n\t"
  61048. "lsr r7, r7, #16\n\t"
  61049. "mul r6, r7, r6\n\t"
  61050. "lsr r7, r6, #16\n\t"
  61051. "lsl r6, r6, #16\n\t"
  61052. "adds r4, r4, r6\n\t"
  61053. "adcs r5, r5, r7\n\t"
  61054. "adc r3, r3, #0\n\t"
  61055. #else
  61056. "umull r6, r7, r8, r9\n\t"
  61057. "adds r4, r4, r6\n\t"
  61058. "adcs r5, r5, r7\n\t"
  61059. "adc r3, r3, #0\n\t"
  61060. #endif
  61061. /* A[3] * B[4] */
  61062. "ldr r9, [%[b], #16]\n\t"
  61063. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61064. "lsl r6, r11, #16\n\t"
  61065. "lsl r7, r9, #16\n\t"
  61066. "lsr r6, r6, #16\n\t"
  61067. "lsr r7, r7, #16\n\t"
  61068. "mul r7, r6, r7\n\t"
  61069. "adds r4, r4, r7\n\t"
  61070. "adcs r5, r5, #0\n\t"
  61071. "adc r3, r3, #0\n\t"
  61072. "lsr r7, r9, #16\n\t"
  61073. "mul r6, r7, r6\n\t"
  61074. "lsr r7, r6, #16\n\t"
  61075. "lsl r6, r6, #16\n\t"
  61076. "adds r4, r4, r6\n\t"
  61077. "adcs r5, r5, r7\n\t"
  61078. "adc r3, r3, #0\n\t"
  61079. "lsr r6, r11, #16\n\t"
  61080. "lsr r7, r9, #16\n\t"
  61081. "mul r7, r6, r7\n\t"
  61082. "adds r5, r5, r7\n\t"
  61083. "adc r3, r3, #0\n\t"
  61084. "lsl r7, r9, #16\n\t"
  61085. "lsr r7, r7, #16\n\t"
  61086. "mul r6, r7, r6\n\t"
  61087. "lsr r7, r6, #16\n\t"
  61088. "lsl r6, r6, #16\n\t"
  61089. "adds r4, r4, r6\n\t"
  61090. "adcs r5, r5, r7\n\t"
  61091. "adc r3, r3, #0\n\t"
  61092. #else
  61093. "umull r6, r7, r11, r9\n\t"
  61094. "adds r4, r4, r6\n\t"
  61095. "adcs r5, r5, r7\n\t"
  61096. "adc r3, r3, #0\n\t"
  61097. #endif
  61098. /* A[4] * B[3] */
  61099. "ldr r8, [%[a], #16]\n\t"
  61100. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61101. "lsl r6, r8, #16\n\t"
  61102. "lsl r7, r12, #16\n\t"
  61103. "lsr r6, r6, #16\n\t"
  61104. "lsr r7, r7, #16\n\t"
  61105. "mul r7, r6, r7\n\t"
  61106. "adds r4, r4, r7\n\t"
  61107. "adcs r5, r5, #0\n\t"
  61108. "adc r3, r3, #0\n\t"
  61109. "lsr r7, r12, #16\n\t"
  61110. "mul r6, r7, r6\n\t"
  61111. "lsr r7, r6, #16\n\t"
  61112. "lsl r6, r6, #16\n\t"
  61113. "adds r4, r4, r6\n\t"
  61114. "adcs r5, r5, r7\n\t"
  61115. "adc r3, r3, #0\n\t"
  61116. "lsr r6, r8, #16\n\t"
  61117. "lsr r7, r12, #16\n\t"
  61118. "mul r7, r6, r7\n\t"
  61119. "adds r5, r5, r7\n\t"
  61120. "adc r3, r3, #0\n\t"
  61121. "lsl r7, r12, #16\n\t"
  61122. "lsr r7, r7, #16\n\t"
  61123. "mul r6, r7, r6\n\t"
  61124. "lsr r7, r6, #16\n\t"
  61125. "lsl r6, r6, #16\n\t"
  61126. "adds r4, r4, r6\n\t"
  61127. "adcs r5, r5, r7\n\t"
  61128. "adc r3, r3, #0\n\t"
  61129. #else
  61130. "umull r6, r7, r8, r12\n\t"
  61131. "adds r4, r4, r6\n\t"
  61132. "adcs r5, r5, r7\n\t"
  61133. "adc r3, r3, #0\n\t"
  61134. #endif
  61135. /* A[5] * B[2] */
  61136. "ldr r8, [%[a], #20]\n\t"
  61137. "ldr r9, [%[b], #8]\n\t"
  61138. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61139. "lsl r6, r8, #16\n\t"
  61140. "lsl r7, r9, #16\n\t"
  61141. "lsr r6, r6, #16\n\t"
  61142. "lsr r7, r7, #16\n\t"
  61143. "mul r7, r6, r7\n\t"
  61144. "adds r4, r4, r7\n\t"
  61145. "adcs r5, r5, #0\n\t"
  61146. "adc r3, r3, #0\n\t"
  61147. "lsr r7, r9, #16\n\t"
  61148. "mul r6, r7, r6\n\t"
  61149. "lsr r7, r6, #16\n\t"
  61150. "lsl r6, r6, #16\n\t"
  61151. "adds r4, r4, r6\n\t"
  61152. "adcs r5, r5, r7\n\t"
  61153. "adc r3, r3, #0\n\t"
  61154. "lsr r6, r8, #16\n\t"
  61155. "lsr r7, r9, #16\n\t"
  61156. "mul r7, r6, r7\n\t"
  61157. "adds r5, r5, r7\n\t"
  61158. "adc r3, r3, #0\n\t"
  61159. "lsl r7, r9, #16\n\t"
  61160. "lsr r7, r7, #16\n\t"
  61161. "mul r6, r7, r6\n\t"
  61162. "lsr r7, r6, #16\n\t"
  61163. "lsl r6, r6, #16\n\t"
  61164. "adds r4, r4, r6\n\t"
  61165. "adcs r5, r5, r7\n\t"
  61166. "adc r3, r3, #0\n\t"
  61167. #else
  61168. "umull r6, r7, r8, r9\n\t"
  61169. "adds r4, r4, r6\n\t"
  61170. "adcs r5, r5, r7\n\t"
  61171. "adc r3, r3, #0\n\t"
  61172. #endif
  61173. /* A[6] * B[1] */
  61174. "ldr r8, [%[a], #24]\n\t"
  61175. "ldr r9, [%[b], #4]\n\t"
  61176. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61177. "lsl r6, r8, #16\n\t"
  61178. "lsl r7, r9, #16\n\t"
  61179. "lsr r6, r6, #16\n\t"
  61180. "lsr r7, r7, #16\n\t"
  61181. "mul r7, r6, r7\n\t"
  61182. "adds r4, r4, r7\n\t"
  61183. "adcs r5, r5, #0\n\t"
  61184. "adc r3, r3, #0\n\t"
  61185. "lsr r7, r9, #16\n\t"
  61186. "mul r6, r7, r6\n\t"
  61187. "lsr r7, r6, #16\n\t"
  61188. "lsl r6, r6, #16\n\t"
  61189. "adds r4, r4, r6\n\t"
  61190. "adcs r5, r5, r7\n\t"
  61191. "adc r3, r3, #0\n\t"
  61192. "lsr r6, r8, #16\n\t"
  61193. "lsr r7, r9, #16\n\t"
  61194. "mul r7, r6, r7\n\t"
  61195. "adds r5, r5, r7\n\t"
  61196. "adc r3, r3, #0\n\t"
  61197. "lsl r7, r9, #16\n\t"
  61198. "lsr r7, r7, #16\n\t"
  61199. "mul r6, r7, r6\n\t"
  61200. "lsr r7, r6, #16\n\t"
  61201. "lsl r6, r6, #16\n\t"
  61202. "adds r4, r4, r6\n\t"
  61203. "adcs r5, r5, r7\n\t"
  61204. "adc r3, r3, #0\n\t"
  61205. #else
  61206. "umull r6, r7, r8, r9\n\t"
  61207. "adds r4, r4, r6\n\t"
  61208. "adcs r5, r5, r7\n\t"
  61209. "adc r3, r3, #0\n\t"
  61210. #endif
  61211. /* A[7] * B[0] */
  61212. "ldr r8, [%[a], #28]\n\t"
  61213. "ldr r9, [%[b]]\n\t"
  61214. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61215. "lsl r6, r8, #16\n\t"
  61216. "lsl r7, r9, #16\n\t"
  61217. "lsr r6, r6, #16\n\t"
  61218. "lsr r7, r7, #16\n\t"
  61219. "mul r7, r6, r7\n\t"
  61220. "adds r4, r4, r7\n\t"
  61221. "adcs r5, r5, #0\n\t"
  61222. "adc r3, r3, #0\n\t"
  61223. "lsr r7, r9, #16\n\t"
  61224. "mul r6, r7, r6\n\t"
  61225. "lsr r7, r6, #16\n\t"
  61226. "lsl r6, r6, #16\n\t"
  61227. "adds r4, r4, r6\n\t"
  61228. "adcs r5, r5, r7\n\t"
  61229. "adc r3, r3, #0\n\t"
  61230. "lsr r6, r8, #16\n\t"
  61231. "lsr r7, r9, #16\n\t"
  61232. "mul r7, r6, r7\n\t"
  61233. "adds r5, r5, r7\n\t"
  61234. "adc r3, r3, #0\n\t"
  61235. "lsl r7, r9, #16\n\t"
  61236. "lsr r7, r7, #16\n\t"
  61237. "mul r6, r7, r6\n\t"
  61238. "lsr r7, r6, #16\n\t"
  61239. "lsl r6, r6, #16\n\t"
  61240. "adds r4, r4, r6\n\t"
  61241. "adcs r5, r5, r7\n\t"
  61242. "adc r3, r3, #0\n\t"
  61243. #else
  61244. "umull r6, r7, r8, r9\n\t"
  61245. "adds r4, r4, r6\n\t"
  61246. "adcs r5, r5, r7\n\t"
  61247. "adc r3, r3, #0\n\t"
  61248. #endif
  61249. "str r4, [sp, #28]\n\t"
  61250. /* A[7] * B[1] */
  61251. "ldr r9, [%[b], #4]\n\t"
  61252. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61253. "lsl r6, r8, #16\n\t"
  61254. "lsl r7, r9, #16\n\t"
  61255. "lsr r6, r6, #16\n\t"
  61256. "lsr r7, r7, #16\n\t"
  61257. "mul r7, r6, r7\n\t"
  61258. "adds r5, r5, r7\n\t"
  61259. "adcs r3, r3, #0\n\t"
  61260. "mov r4, #0\n\t"
  61261. "adc r4, r4, #0\n\t"
  61262. "lsr r7, r9, #16\n\t"
  61263. "mul r6, r7, r6\n\t"
  61264. "lsr r7, r6, #16\n\t"
  61265. "lsl r6, r6, #16\n\t"
  61266. "adds r5, r5, r6\n\t"
  61267. "adcs r3, r3, r7\n\t"
  61268. "adc r4, r4, #0\n\t"
  61269. "lsr r6, r8, #16\n\t"
  61270. "lsr r7, r9, #16\n\t"
  61271. "mul r7, r6, r7\n\t"
  61272. "adds r3, r3, r7\n\t"
  61273. "adc r4, r4, #0\n\t"
  61274. "lsl r7, r9, #16\n\t"
  61275. "lsr r7, r7, #16\n\t"
  61276. "mul r6, r7, r6\n\t"
  61277. "lsr r7, r6, #16\n\t"
  61278. "lsl r6, r6, #16\n\t"
  61279. "adds r5, r5, r6\n\t"
  61280. "adcs r3, r3, r7\n\t"
  61281. "adc r4, r4, #0\n\t"
  61282. #else
  61283. "umull r6, r7, r8, r9\n\t"
  61284. "adds r5, r5, r6\n\t"
  61285. "adcs r3, r3, r7\n\t"
  61286. "mov r4, #0\n\t"
  61287. "adc r4, r4, #0\n\t"
  61288. #endif
  61289. /* A[6] * B[2] */
  61290. "ldr r8, [%[a], #24]\n\t"
  61291. "ldr r9, [%[b], #8]\n\t"
  61292. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61293. "lsl r6, r8, #16\n\t"
  61294. "lsl r7, r9, #16\n\t"
  61295. "lsr r6, r6, #16\n\t"
  61296. "lsr r7, r7, #16\n\t"
  61297. "mul r7, r6, r7\n\t"
  61298. "adds r5, r5, r7\n\t"
  61299. "adcs r3, r3, #0\n\t"
  61300. "adc r4, r4, #0\n\t"
  61301. "lsr r7, r9, #16\n\t"
  61302. "mul r6, r7, r6\n\t"
  61303. "lsr r7, r6, #16\n\t"
  61304. "lsl r6, r6, #16\n\t"
  61305. "adds r5, r5, r6\n\t"
  61306. "adcs r3, r3, r7\n\t"
  61307. "adc r4, r4, #0\n\t"
  61308. "lsr r6, r8, #16\n\t"
  61309. "lsr r7, r9, #16\n\t"
  61310. "mul r7, r6, r7\n\t"
  61311. "adds r3, r3, r7\n\t"
  61312. "adc r4, r4, #0\n\t"
  61313. "lsl r7, r9, #16\n\t"
  61314. "lsr r7, r7, #16\n\t"
  61315. "mul r6, r7, r6\n\t"
  61316. "lsr r7, r6, #16\n\t"
  61317. "lsl r6, r6, #16\n\t"
  61318. "adds r5, r5, r6\n\t"
  61319. "adcs r3, r3, r7\n\t"
  61320. "adc r4, r4, #0\n\t"
  61321. #else
  61322. "umull r6, r7, r8, r9\n\t"
  61323. "adds r5, r5, r6\n\t"
  61324. "adcs r3, r3, r7\n\t"
  61325. "adc r4, r4, #0\n\t"
  61326. #endif
  61327. /* A[5] * B[3] */
  61328. "ldr r8, [%[a], #20]\n\t"
  61329. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61330. "lsl r6, r8, #16\n\t"
  61331. "lsl r7, r12, #16\n\t"
  61332. "lsr r6, r6, #16\n\t"
  61333. "lsr r7, r7, #16\n\t"
  61334. "mul r7, r6, r7\n\t"
  61335. "adds r5, r5, r7\n\t"
  61336. "adcs r3, r3, #0\n\t"
  61337. "adc r4, r4, #0\n\t"
  61338. "lsr r7, r12, #16\n\t"
  61339. "mul r6, r7, r6\n\t"
  61340. "lsr r7, r6, #16\n\t"
  61341. "lsl r6, r6, #16\n\t"
  61342. "adds r5, r5, r6\n\t"
  61343. "adcs r3, r3, r7\n\t"
  61344. "adc r4, r4, #0\n\t"
  61345. "lsr r6, r8, #16\n\t"
  61346. "lsr r7, r12, #16\n\t"
  61347. "mul r7, r6, r7\n\t"
  61348. "adds r3, r3, r7\n\t"
  61349. "adc r4, r4, #0\n\t"
  61350. "lsl r7, r12, #16\n\t"
  61351. "lsr r7, r7, #16\n\t"
  61352. "mul r6, r7, r6\n\t"
  61353. "lsr r7, r6, #16\n\t"
  61354. "lsl r6, r6, #16\n\t"
  61355. "adds r5, r5, r6\n\t"
  61356. "adcs r3, r3, r7\n\t"
  61357. "adc r4, r4, #0\n\t"
  61358. #else
  61359. "umull r6, r7, r8, r12\n\t"
  61360. "adds r5, r5, r6\n\t"
  61361. "adcs r3, r3, r7\n\t"
  61362. "adc r4, r4, #0\n\t"
  61363. #endif
  61364. /* A[4] * B[4] */
  61365. "ldr r11, [%[a], #16]\n\t"
  61366. "ldr r12, [%[b], #16]\n\t"
  61367. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61368. "lsl r6, r11, #16\n\t"
  61369. "lsl r7, r12, #16\n\t"
  61370. "lsr r6, r6, #16\n\t"
  61371. "lsr r7, r7, #16\n\t"
  61372. "mul r7, r6, r7\n\t"
  61373. "adds r5, r5, r7\n\t"
  61374. "adcs r3, r3, #0\n\t"
  61375. "adc r4, r4, #0\n\t"
  61376. "lsr r7, r12, #16\n\t"
  61377. "mul r6, r7, r6\n\t"
  61378. "lsr r7, r6, #16\n\t"
  61379. "lsl r6, r6, #16\n\t"
  61380. "adds r5, r5, r6\n\t"
  61381. "adcs r3, r3, r7\n\t"
  61382. "adc r4, r4, #0\n\t"
  61383. "lsr r6, r11, #16\n\t"
  61384. "lsr r7, r12, #16\n\t"
  61385. "mul r7, r6, r7\n\t"
  61386. "adds r3, r3, r7\n\t"
  61387. "adc r4, r4, #0\n\t"
  61388. "lsl r7, r12, #16\n\t"
  61389. "lsr r7, r7, #16\n\t"
  61390. "mul r6, r7, r6\n\t"
  61391. "lsr r7, r6, #16\n\t"
  61392. "lsl r6, r6, #16\n\t"
  61393. "adds r5, r5, r6\n\t"
  61394. "adcs r3, r3, r7\n\t"
  61395. "adc r4, r4, #0\n\t"
  61396. #else
  61397. "umull r6, r7, r11, r12\n\t"
  61398. "adds r5, r5, r6\n\t"
  61399. "adcs r3, r3, r7\n\t"
  61400. "adc r4, r4, #0\n\t"
  61401. #endif
  61402. /* A[3] * B[5] */
  61403. "ldr r8, [%[a], #12]\n\t"
  61404. "ldr r9, [%[b], #20]\n\t"
  61405. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61406. "lsl r6, r8, #16\n\t"
  61407. "lsl r7, r9, #16\n\t"
  61408. "lsr r6, r6, #16\n\t"
  61409. "lsr r7, r7, #16\n\t"
  61410. "mul r7, r6, r7\n\t"
  61411. "adds r5, r5, r7\n\t"
  61412. "adcs r3, r3, #0\n\t"
  61413. "adc r4, r4, #0\n\t"
  61414. "lsr r7, r9, #16\n\t"
  61415. "mul r6, r7, r6\n\t"
  61416. "lsr r7, r6, #16\n\t"
  61417. "lsl r6, r6, #16\n\t"
  61418. "adds r5, r5, r6\n\t"
  61419. "adcs r3, r3, r7\n\t"
  61420. "adc r4, r4, #0\n\t"
  61421. "lsr r6, r8, #16\n\t"
  61422. "lsr r7, r9, #16\n\t"
  61423. "mul r7, r6, r7\n\t"
  61424. "adds r3, r3, r7\n\t"
  61425. "adc r4, r4, #0\n\t"
  61426. "lsl r7, r9, #16\n\t"
  61427. "lsr r7, r7, #16\n\t"
  61428. "mul r6, r7, r6\n\t"
  61429. "lsr r7, r6, #16\n\t"
  61430. "lsl r6, r6, #16\n\t"
  61431. "adds r5, r5, r6\n\t"
  61432. "adcs r3, r3, r7\n\t"
  61433. "adc r4, r4, #0\n\t"
  61434. #else
  61435. "umull r6, r7, r8, r9\n\t"
  61436. "adds r5, r5, r6\n\t"
  61437. "adcs r3, r3, r7\n\t"
  61438. "adc r4, r4, #0\n\t"
  61439. #endif
  61440. /* A[2] * B[6] */
  61441. "ldr r8, [%[a], #8]\n\t"
  61442. "ldr r9, [%[b], #24]\n\t"
  61443. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61444. "lsl r6, r8, #16\n\t"
  61445. "lsl r7, r9, #16\n\t"
  61446. "lsr r6, r6, #16\n\t"
  61447. "lsr r7, r7, #16\n\t"
  61448. "mul r7, r6, r7\n\t"
  61449. "adds r5, r5, r7\n\t"
  61450. "adcs r3, r3, #0\n\t"
  61451. "adc r4, r4, #0\n\t"
  61452. "lsr r7, r9, #16\n\t"
  61453. "mul r6, r7, r6\n\t"
  61454. "lsr r7, r6, #16\n\t"
  61455. "lsl r6, r6, #16\n\t"
  61456. "adds r5, r5, r6\n\t"
  61457. "adcs r3, r3, r7\n\t"
  61458. "adc r4, r4, #0\n\t"
  61459. "lsr r6, r8, #16\n\t"
  61460. "lsr r7, r9, #16\n\t"
  61461. "mul r7, r6, r7\n\t"
  61462. "adds r3, r3, r7\n\t"
  61463. "adc r4, r4, #0\n\t"
  61464. "lsl r7, r9, #16\n\t"
  61465. "lsr r7, r7, #16\n\t"
  61466. "mul r6, r7, r6\n\t"
  61467. "lsr r7, r6, #16\n\t"
  61468. "lsl r6, r6, #16\n\t"
  61469. "adds r5, r5, r6\n\t"
  61470. "adcs r3, r3, r7\n\t"
  61471. "adc r4, r4, #0\n\t"
  61472. #else
  61473. "umull r6, r7, r8, r9\n\t"
  61474. "adds r5, r5, r6\n\t"
  61475. "adcs r3, r3, r7\n\t"
  61476. "adc r4, r4, #0\n\t"
  61477. #endif
  61478. /* A[1] * B[7] */
  61479. "ldr r8, [%[a], #4]\n\t"
  61480. "ldr r9, [%[b], #28]\n\t"
  61481. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61482. "lsl r6, r8, #16\n\t"
  61483. "lsl r7, r9, #16\n\t"
  61484. "lsr r6, r6, #16\n\t"
  61485. "lsr r7, r7, #16\n\t"
  61486. "mul r7, r6, r7\n\t"
  61487. "adds r5, r5, r7\n\t"
  61488. "adcs r3, r3, #0\n\t"
  61489. "adc r4, r4, #0\n\t"
  61490. "lsr r7, r9, #16\n\t"
  61491. "mul r6, r7, r6\n\t"
  61492. "lsr r7, r6, #16\n\t"
  61493. "lsl r6, r6, #16\n\t"
  61494. "adds r5, r5, r6\n\t"
  61495. "adcs r3, r3, r7\n\t"
  61496. "adc r4, r4, #0\n\t"
  61497. "lsr r6, r8, #16\n\t"
  61498. "lsr r7, r9, #16\n\t"
  61499. "mul r7, r6, r7\n\t"
  61500. "adds r3, r3, r7\n\t"
  61501. "adc r4, r4, #0\n\t"
  61502. "lsl r7, r9, #16\n\t"
  61503. "lsr r7, r7, #16\n\t"
  61504. "mul r6, r7, r6\n\t"
  61505. "lsr r7, r6, #16\n\t"
  61506. "lsl r6, r6, #16\n\t"
  61507. "adds r5, r5, r6\n\t"
  61508. "adcs r3, r3, r7\n\t"
  61509. "adc r4, r4, #0\n\t"
  61510. #else
  61511. "umull r6, r7, r8, r9\n\t"
  61512. "adds r5, r5, r6\n\t"
  61513. "adcs r3, r3, r7\n\t"
  61514. "adc r4, r4, #0\n\t"
  61515. #endif
  61516. "str r5, [%[r], #32]\n\t"
  61517. /* A[2] * B[7] */
  61518. "ldr r8, [%[a], #8]\n\t"
  61519. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61520. "lsl r6, r8, #16\n\t"
  61521. "lsl r7, r9, #16\n\t"
  61522. "lsr r6, r6, #16\n\t"
  61523. "lsr r7, r7, #16\n\t"
  61524. "mul r7, r6, r7\n\t"
  61525. "adds r3, r3, r7\n\t"
  61526. "adcs r4, r4, #0\n\t"
  61527. "mov r5, #0\n\t"
  61528. "adc r5, r5, #0\n\t"
  61529. "lsr r7, r9, #16\n\t"
  61530. "mul r6, r7, r6\n\t"
  61531. "lsr r7, r6, #16\n\t"
  61532. "lsl r6, r6, #16\n\t"
  61533. "adds r3, r3, r6\n\t"
  61534. "adcs r4, r4, r7\n\t"
  61535. "adc r5, r5, #0\n\t"
  61536. "lsr r6, r8, #16\n\t"
  61537. "lsr r7, r9, #16\n\t"
  61538. "mul r7, r6, r7\n\t"
  61539. "adds r4, r4, r7\n\t"
  61540. "adc r5, r5, #0\n\t"
  61541. "lsl r7, r9, #16\n\t"
  61542. "lsr r7, r7, #16\n\t"
  61543. "mul r6, r7, r6\n\t"
  61544. "lsr r7, r6, #16\n\t"
  61545. "lsl r6, r6, #16\n\t"
  61546. "adds r3, r3, r6\n\t"
  61547. "adcs r4, r4, r7\n\t"
  61548. "adc r5, r5, #0\n\t"
  61549. #else
  61550. "umull r6, r7, r8, r9\n\t"
  61551. "adds r3, r3, r6\n\t"
  61552. "adcs r4, r4, r7\n\t"
  61553. "mov r5, #0\n\t"
  61554. "adc r5, r5, #0\n\t"
  61555. #endif
  61556. /* A[3] * B[6] */
  61557. "ldr r8, [%[a], #12]\n\t"
  61558. "ldr r9, [%[b], #24]\n\t"
  61559. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61560. "lsl r6, r8, #16\n\t"
  61561. "lsl r7, r9, #16\n\t"
  61562. "lsr r6, r6, #16\n\t"
  61563. "lsr r7, r7, #16\n\t"
  61564. "mul r7, r6, r7\n\t"
  61565. "adds r3, r3, r7\n\t"
  61566. "adcs r4, r4, #0\n\t"
  61567. "adc r5, r5, #0\n\t"
  61568. "lsr r7, r9, #16\n\t"
  61569. "mul r6, r7, r6\n\t"
  61570. "lsr r7, r6, #16\n\t"
  61571. "lsl r6, r6, #16\n\t"
  61572. "adds r3, r3, r6\n\t"
  61573. "adcs r4, r4, r7\n\t"
  61574. "adc r5, r5, #0\n\t"
  61575. "lsr r6, r8, #16\n\t"
  61576. "lsr r7, r9, #16\n\t"
  61577. "mul r7, r6, r7\n\t"
  61578. "adds r4, r4, r7\n\t"
  61579. "adc r5, r5, #0\n\t"
  61580. "lsl r7, r9, #16\n\t"
  61581. "lsr r7, r7, #16\n\t"
  61582. "mul r6, r7, r6\n\t"
  61583. "lsr r7, r6, #16\n\t"
  61584. "lsl r6, r6, #16\n\t"
  61585. "adds r3, r3, r6\n\t"
  61586. "adcs r4, r4, r7\n\t"
  61587. "adc r5, r5, #0\n\t"
  61588. #else
  61589. "umull r6, r7, r8, r9\n\t"
  61590. "adds r3, r3, r6\n\t"
  61591. "adcs r4, r4, r7\n\t"
  61592. "adc r5, r5, #0\n\t"
  61593. #endif
  61594. /* A[4] * B[5] */
  61595. "ldr r9, [%[b], #20]\n\t"
  61596. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61597. "lsl r6, r11, #16\n\t"
  61598. "lsl r7, r9, #16\n\t"
  61599. "lsr r6, r6, #16\n\t"
  61600. "lsr r7, r7, #16\n\t"
  61601. "mul r7, r6, r7\n\t"
  61602. "adds r3, r3, r7\n\t"
  61603. "adcs r4, r4, #0\n\t"
  61604. "adc r5, r5, #0\n\t"
  61605. "lsr r7, r9, #16\n\t"
  61606. "mul r6, r7, r6\n\t"
  61607. "lsr r7, r6, #16\n\t"
  61608. "lsl r6, r6, #16\n\t"
  61609. "adds r3, r3, r6\n\t"
  61610. "adcs r4, r4, r7\n\t"
  61611. "adc r5, r5, #0\n\t"
  61612. "lsr r6, r11, #16\n\t"
  61613. "lsr r7, r9, #16\n\t"
  61614. "mul r7, r6, r7\n\t"
  61615. "adds r4, r4, r7\n\t"
  61616. "adc r5, r5, #0\n\t"
  61617. "lsl r7, r9, #16\n\t"
  61618. "lsr r7, r7, #16\n\t"
  61619. "mul r6, r7, r6\n\t"
  61620. "lsr r7, r6, #16\n\t"
  61621. "lsl r6, r6, #16\n\t"
  61622. "adds r3, r3, r6\n\t"
  61623. "adcs r4, r4, r7\n\t"
  61624. "adc r5, r5, #0\n\t"
  61625. #else
  61626. "umull r6, r7, r11, r9\n\t"
  61627. "adds r3, r3, r6\n\t"
  61628. "adcs r4, r4, r7\n\t"
  61629. "adc r5, r5, #0\n\t"
  61630. #endif
  61631. /* A[5] * B[4] */
  61632. "ldr r8, [%[a], #20]\n\t"
  61633. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61634. "lsl r6, r8, #16\n\t"
  61635. "lsl r7, r12, #16\n\t"
  61636. "lsr r6, r6, #16\n\t"
  61637. "lsr r7, r7, #16\n\t"
  61638. "mul r7, r6, r7\n\t"
  61639. "adds r3, r3, r7\n\t"
  61640. "adcs r4, r4, #0\n\t"
  61641. "adc r5, r5, #0\n\t"
  61642. "lsr r7, r12, #16\n\t"
  61643. "mul r6, r7, r6\n\t"
  61644. "lsr r7, r6, #16\n\t"
  61645. "lsl r6, r6, #16\n\t"
  61646. "adds r3, r3, r6\n\t"
  61647. "adcs r4, r4, r7\n\t"
  61648. "adc r5, r5, #0\n\t"
  61649. "lsr r6, r8, #16\n\t"
  61650. "lsr r7, r12, #16\n\t"
  61651. "mul r7, r6, r7\n\t"
  61652. "adds r4, r4, r7\n\t"
  61653. "adc r5, r5, #0\n\t"
  61654. "lsl r7, r12, #16\n\t"
  61655. "lsr r7, r7, #16\n\t"
  61656. "mul r6, r7, r6\n\t"
  61657. "lsr r7, r6, #16\n\t"
  61658. "lsl r6, r6, #16\n\t"
  61659. "adds r3, r3, r6\n\t"
  61660. "adcs r4, r4, r7\n\t"
  61661. "adc r5, r5, #0\n\t"
  61662. #else
  61663. "umull r6, r7, r8, r12\n\t"
  61664. "adds r3, r3, r6\n\t"
  61665. "adcs r4, r4, r7\n\t"
  61666. "adc r5, r5, #0\n\t"
  61667. #endif
  61668. /* A[6] * B[3] */
  61669. "ldr r8, [%[a], #24]\n\t"
  61670. "ldr r9, [%[b], #12]\n\t"
  61671. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61672. "lsl r6, r8, #16\n\t"
  61673. "lsl r7, r9, #16\n\t"
  61674. "lsr r6, r6, #16\n\t"
  61675. "lsr r7, r7, #16\n\t"
  61676. "mul r7, r6, r7\n\t"
  61677. "adds r3, r3, r7\n\t"
  61678. "adcs r4, r4, #0\n\t"
  61679. "adc r5, r5, #0\n\t"
  61680. "lsr r7, r9, #16\n\t"
  61681. "mul r6, r7, r6\n\t"
  61682. "lsr r7, r6, #16\n\t"
  61683. "lsl r6, r6, #16\n\t"
  61684. "adds r3, r3, r6\n\t"
  61685. "adcs r4, r4, r7\n\t"
  61686. "adc r5, r5, #0\n\t"
  61687. "lsr r6, r8, #16\n\t"
  61688. "lsr r7, r9, #16\n\t"
  61689. "mul r7, r6, r7\n\t"
  61690. "adds r4, r4, r7\n\t"
  61691. "adc r5, r5, #0\n\t"
  61692. "lsl r7, r9, #16\n\t"
  61693. "lsr r7, r7, #16\n\t"
  61694. "mul r6, r7, r6\n\t"
  61695. "lsr r7, r6, #16\n\t"
  61696. "lsl r6, r6, #16\n\t"
  61697. "adds r3, r3, r6\n\t"
  61698. "adcs r4, r4, r7\n\t"
  61699. "adc r5, r5, #0\n\t"
  61700. #else
  61701. "umull r6, r7, r8, r9\n\t"
  61702. "adds r3, r3, r6\n\t"
  61703. "adcs r4, r4, r7\n\t"
  61704. "adc r5, r5, #0\n\t"
  61705. #endif
  61706. /* A[7] * B[2] */
  61707. "ldr r8, [%[a], #28]\n\t"
  61708. "ldr r9, [%[b], #8]\n\t"
  61709. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61710. "lsl r6, r8, #16\n\t"
  61711. "lsl r7, r9, #16\n\t"
  61712. "lsr r6, r6, #16\n\t"
  61713. "lsr r7, r7, #16\n\t"
  61714. "mul r7, r6, r7\n\t"
  61715. "adds r3, r3, r7\n\t"
  61716. "adcs r4, r4, #0\n\t"
  61717. "adc r5, r5, #0\n\t"
  61718. "lsr r7, r9, #16\n\t"
  61719. "mul r6, r7, r6\n\t"
  61720. "lsr r7, r6, #16\n\t"
  61721. "lsl r6, r6, #16\n\t"
  61722. "adds r3, r3, r6\n\t"
  61723. "adcs r4, r4, r7\n\t"
  61724. "adc r5, r5, #0\n\t"
  61725. "lsr r6, r8, #16\n\t"
  61726. "lsr r7, r9, #16\n\t"
  61727. "mul r7, r6, r7\n\t"
  61728. "adds r4, r4, r7\n\t"
  61729. "adc r5, r5, #0\n\t"
  61730. "lsl r7, r9, #16\n\t"
  61731. "lsr r7, r7, #16\n\t"
  61732. "mul r6, r7, r6\n\t"
  61733. "lsr r7, r6, #16\n\t"
  61734. "lsl r6, r6, #16\n\t"
  61735. "adds r3, r3, r6\n\t"
  61736. "adcs r4, r4, r7\n\t"
  61737. "adc r5, r5, #0\n\t"
  61738. #else
  61739. "umull r6, r7, r8, r9\n\t"
  61740. "adds r3, r3, r6\n\t"
  61741. "adcs r4, r4, r7\n\t"
  61742. "adc r5, r5, #0\n\t"
  61743. #endif
  61744. "str r3, [%[r], #36]\n\t"
  61745. /* A[7] * B[3] */
  61746. "ldr r9, [%[b], #12]\n\t"
  61747. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61748. "lsl r6, r8, #16\n\t"
  61749. "lsl r7, r9, #16\n\t"
  61750. "lsr r6, r6, #16\n\t"
  61751. "lsr r7, r7, #16\n\t"
  61752. "mul r7, r6, r7\n\t"
  61753. "adds r4, r4, r7\n\t"
  61754. "adcs r5, r5, #0\n\t"
  61755. "mov r3, #0\n\t"
  61756. "adc r3, r3, #0\n\t"
  61757. "lsr r7, r9, #16\n\t"
  61758. "mul r6, r7, r6\n\t"
  61759. "lsr r7, r6, #16\n\t"
  61760. "lsl r6, r6, #16\n\t"
  61761. "adds r4, r4, r6\n\t"
  61762. "adcs r5, r5, r7\n\t"
  61763. "adc r3, r3, #0\n\t"
  61764. "lsr r6, r8, #16\n\t"
  61765. "lsr r7, r9, #16\n\t"
  61766. "mul r7, r6, r7\n\t"
  61767. "adds r5, r5, r7\n\t"
  61768. "adc r3, r3, #0\n\t"
  61769. "lsl r7, r9, #16\n\t"
  61770. "lsr r7, r7, #16\n\t"
  61771. "mul r6, r7, r6\n\t"
  61772. "lsr r7, r6, #16\n\t"
  61773. "lsl r6, r6, #16\n\t"
  61774. "adds r4, r4, r6\n\t"
  61775. "adcs r5, r5, r7\n\t"
  61776. "adc r3, r3, #0\n\t"
  61777. #else
  61778. "umull r6, r7, r8, r9\n\t"
  61779. "adds r4, r4, r6\n\t"
  61780. "adcs r5, r5, r7\n\t"
  61781. "mov r3, #0\n\t"
  61782. "adc r3, r3, #0\n\t"
  61783. #endif
  61784. /* A[6] * B[4] */
  61785. "ldr r8, [%[a], #24]\n\t"
  61786. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61787. "lsl r6, r8, #16\n\t"
  61788. "lsl r7, r12, #16\n\t"
  61789. "lsr r6, r6, #16\n\t"
  61790. "lsr r7, r7, #16\n\t"
  61791. "mul r7, r6, r7\n\t"
  61792. "adds r4, r4, r7\n\t"
  61793. "adcs r5, r5, #0\n\t"
  61794. "adc r3, r3, #0\n\t"
  61795. "lsr r7, r12, #16\n\t"
  61796. "mul r6, r7, r6\n\t"
  61797. "lsr r7, r6, #16\n\t"
  61798. "lsl r6, r6, #16\n\t"
  61799. "adds r4, r4, r6\n\t"
  61800. "adcs r5, r5, r7\n\t"
  61801. "adc r3, r3, #0\n\t"
  61802. "lsr r6, r8, #16\n\t"
  61803. "lsr r7, r12, #16\n\t"
  61804. "mul r7, r6, r7\n\t"
  61805. "adds r5, r5, r7\n\t"
  61806. "adc r3, r3, #0\n\t"
  61807. "lsl r7, r12, #16\n\t"
  61808. "lsr r7, r7, #16\n\t"
  61809. "mul r6, r7, r6\n\t"
  61810. "lsr r7, r6, #16\n\t"
  61811. "lsl r6, r6, #16\n\t"
  61812. "adds r4, r4, r6\n\t"
  61813. "adcs r5, r5, r7\n\t"
  61814. "adc r3, r3, #0\n\t"
  61815. #else
  61816. "umull r6, r7, r8, r12\n\t"
  61817. "adds r4, r4, r6\n\t"
  61818. "adcs r5, r5, r7\n\t"
  61819. "adc r3, r3, #0\n\t"
  61820. #endif
  61821. /* A[5] * B[5] */
  61822. "ldr r11, [%[a], #20]\n\t"
  61823. "ldr r12, [%[b], #20]\n\t"
  61824. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61825. "lsl r6, r11, #16\n\t"
  61826. "lsl r7, r12, #16\n\t"
  61827. "lsr r6, r6, #16\n\t"
  61828. "lsr r7, r7, #16\n\t"
  61829. "mul r7, r6, r7\n\t"
  61830. "adds r4, r4, r7\n\t"
  61831. "adcs r5, r5, #0\n\t"
  61832. "adc r3, r3, #0\n\t"
  61833. "lsr r7, r12, #16\n\t"
  61834. "mul r6, r7, r6\n\t"
  61835. "lsr r7, r6, #16\n\t"
  61836. "lsl r6, r6, #16\n\t"
  61837. "adds r4, r4, r6\n\t"
  61838. "adcs r5, r5, r7\n\t"
  61839. "adc r3, r3, #0\n\t"
  61840. "lsr r6, r11, #16\n\t"
  61841. "lsr r7, r12, #16\n\t"
  61842. "mul r7, r6, r7\n\t"
  61843. "adds r5, r5, r7\n\t"
  61844. "adc r3, r3, #0\n\t"
  61845. "lsl r7, r12, #16\n\t"
  61846. "lsr r7, r7, #16\n\t"
  61847. "mul r6, r7, r6\n\t"
  61848. "lsr r7, r6, #16\n\t"
  61849. "lsl r6, r6, #16\n\t"
  61850. "adds r4, r4, r6\n\t"
  61851. "adcs r5, r5, r7\n\t"
  61852. "adc r3, r3, #0\n\t"
  61853. #else
  61854. "umull r6, r7, r11, r12\n\t"
  61855. "adds r4, r4, r6\n\t"
  61856. "adcs r5, r5, r7\n\t"
  61857. "adc r3, r3, #0\n\t"
  61858. #endif
  61859. /* A[4] * B[6] */
  61860. "ldr r8, [%[a], #16]\n\t"
  61861. "ldr r9, [%[b], #24]\n\t"
  61862. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61863. "lsl r6, r8, #16\n\t"
  61864. "lsl r7, r9, #16\n\t"
  61865. "lsr r6, r6, #16\n\t"
  61866. "lsr r7, r7, #16\n\t"
  61867. "mul r7, r6, r7\n\t"
  61868. "adds r4, r4, r7\n\t"
  61869. "adcs r5, r5, #0\n\t"
  61870. "adc r3, r3, #0\n\t"
  61871. "lsr r7, r9, #16\n\t"
  61872. "mul r6, r7, r6\n\t"
  61873. "lsr r7, r6, #16\n\t"
  61874. "lsl r6, r6, #16\n\t"
  61875. "adds r4, r4, r6\n\t"
  61876. "adcs r5, r5, r7\n\t"
  61877. "adc r3, r3, #0\n\t"
  61878. "lsr r6, r8, #16\n\t"
  61879. "lsr r7, r9, #16\n\t"
  61880. "mul r7, r6, r7\n\t"
  61881. "adds r5, r5, r7\n\t"
  61882. "adc r3, r3, #0\n\t"
  61883. "lsl r7, r9, #16\n\t"
  61884. "lsr r7, r7, #16\n\t"
  61885. "mul r6, r7, r6\n\t"
  61886. "lsr r7, r6, #16\n\t"
  61887. "lsl r6, r6, #16\n\t"
  61888. "adds r4, r4, r6\n\t"
  61889. "adcs r5, r5, r7\n\t"
  61890. "adc r3, r3, #0\n\t"
  61891. #else
  61892. "umull r6, r7, r8, r9\n\t"
  61893. "adds r4, r4, r6\n\t"
  61894. "adcs r5, r5, r7\n\t"
  61895. "adc r3, r3, #0\n\t"
  61896. #endif
  61897. /* A[3] * B[7] */
  61898. "ldr r8, [%[a], #12]\n\t"
  61899. "ldr r9, [%[b], #28]\n\t"
  61900. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61901. "lsl r6, r8, #16\n\t"
  61902. "lsl r7, r9, #16\n\t"
  61903. "lsr r6, r6, #16\n\t"
  61904. "lsr r7, r7, #16\n\t"
  61905. "mul r7, r6, r7\n\t"
  61906. "adds r4, r4, r7\n\t"
  61907. "adcs r5, r5, #0\n\t"
  61908. "adc r3, r3, #0\n\t"
  61909. "lsr r7, r9, #16\n\t"
  61910. "mul r6, r7, r6\n\t"
  61911. "lsr r7, r6, #16\n\t"
  61912. "lsl r6, r6, #16\n\t"
  61913. "adds r4, r4, r6\n\t"
  61914. "adcs r5, r5, r7\n\t"
  61915. "adc r3, r3, #0\n\t"
  61916. "lsr r6, r8, #16\n\t"
  61917. "lsr r7, r9, #16\n\t"
  61918. "mul r7, r6, r7\n\t"
  61919. "adds r5, r5, r7\n\t"
  61920. "adc r3, r3, #0\n\t"
  61921. "lsl r7, r9, #16\n\t"
  61922. "lsr r7, r7, #16\n\t"
  61923. "mul r6, r7, r6\n\t"
  61924. "lsr r7, r6, #16\n\t"
  61925. "lsl r6, r6, #16\n\t"
  61926. "adds r4, r4, r6\n\t"
  61927. "adcs r5, r5, r7\n\t"
  61928. "adc r3, r3, #0\n\t"
  61929. #else
  61930. "umull r6, r7, r8, r9\n\t"
  61931. "adds r4, r4, r6\n\t"
  61932. "adcs r5, r5, r7\n\t"
  61933. "adc r3, r3, #0\n\t"
  61934. #endif
  61935. "str r4, [%[r], #40]\n\t"
  61936. /* A[4] * B[7] */
  61937. "ldr r8, [%[a], #16]\n\t"
  61938. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61939. "lsl r6, r8, #16\n\t"
  61940. "lsl r7, r9, #16\n\t"
  61941. "lsr r6, r6, #16\n\t"
  61942. "lsr r7, r7, #16\n\t"
  61943. "mul r7, r6, r7\n\t"
  61944. "adds r5, r5, r7\n\t"
  61945. "adcs r3, r3, #0\n\t"
  61946. "mov r4, #0\n\t"
  61947. "adc r4, r4, #0\n\t"
  61948. "lsr r7, r9, #16\n\t"
  61949. "mul r6, r7, r6\n\t"
  61950. "lsr r7, r6, #16\n\t"
  61951. "lsl r6, r6, #16\n\t"
  61952. "adds r5, r5, r6\n\t"
  61953. "adcs r3, r3, r7\n\t"
  61954. "adc r4, r4, #0\n\t"
  61955. "lsr r6, r8, #16\n\t"
  61956. "lsr r7, r9, #16\n\t"
  61957. "mul r7, r6, r7\n\t"
  61958. "adds r3, r3, r7\n\t"
  61959. "adc r4, r4, #0\n\t"
  61960. "lsl r7, r9, #16\n\t"
  61961. "lsr r7, r7, #16\n\t"
  61962. "mul r6, r7, r6\n\t"
  61963. "lsr r7, r6, #16\n\t"
  61964. "lsl r6, r6, #16\n\t"
  61965. "adds r5, r5, r6\n\t"
  61966. "adcs r3, r3, r7\n\t"
  61967. "adc r4, r4, #0\n\t"
  61968. #else
  61969. "umull r6, r7, r8, r9\n\t"
  61970. "adds r5, r5, r6\n\t"
  61971. "adcs r3, r3, r7\n\t"
  61972. "mov r4, #0\n\t"
  61973. "adc r4, r4, #0\n\t"
  61974. #endif
  61975. /* A[5] * B[6] */
  61976. "ldr r9, [%[b], #24]\n\t"
  61977. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  61978. "lsl r6, r11, #16\n\t"
  61979. "lsl r7, r9, #16\n\t"
  61980. "lsr r6, r6, #16\n\t"
  61981. "lsr r7, r7, #16\n\t"
  61982. "mul r7, r6, r7\n\t"
  61983. "adds r5, r5, r7\n\t"
  61984. "adcs r3, r3, #0\n\t"
  61985. "adc r4, r4, #0\n\t"
  61986. "lsr r7, r9, #16\n\t"
  61987. "mul r6, r7, r6\n\t"
  61988. "lsr r7, r6, #16\n\t"
  61989. "lsl r6, r6, #16\n\t"
  61990. "adds r5, r5, r6\n\t"
  61991. "adcs r3, r3, r7\n\t"
  61992. "adc r4, r4, #0\n\t"
  61993. "lsr r6, r11, #16\n\t"
  61994. "lsr r7, r9, #16\n\t"
  61995. "mul r7, r6, r7\n\t"
  61996. "adds r3, r3, r7\n\t"
  61997. "adc r4, r4, #0\n\t"
  61998. "lsl r7, r9, #16\n\t"
  61999. "lsr r7, r7, #16\n\t"
  62000. "mul r6, r7, r6\n\t"
  62001. "lsr r7, r6, #16\n\t"
  62002. "lsl r6, r6, #16\n\t"
  62003. "adds r5, r5, r6\n\t"
  62004. "adcs r3, r3, r7\n\t"
  62005. "adc r4, r4, #0\n\t"
  62006. #else
  62007. "umull r6, r7, r11, r9\n\t"
  62008. "adds r5, r5, r6\n\t"
  62009. "adcs r3, r3, r7\n\t"
  62010. "adc r4, r4, #0\n\t"
  62011. #endif
  62012. /* A[6] * B[5] */
  62013. "ldr r8, [%[a], #24]\n\t"
  62014. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62015. "lsl r6, r8, #16\n\t"
  62016. "lsl r7, r12, #16\n\t"
  62017. "lsr r6, r6, #16\n\t"
  62018. "lsr r7, r7, #16\n\t"
  62019. "mul r7, r6, r7\n\t"
  62020. "adds r5, r5, r7\n\t"
  62021. "adcs r3, r3, #0\n\t"
  62022. "adc r4, r4, #0\n\t"
  62023. "lsr r7, r12, #16\n\t"
  62024. "mul r6, r7, r6\n\t"
  62025. "lsr r7, r6, #16\n\t"
  62026. "lsl r6, r6, #16\n\t"
  62027. "adds r5, r5, r6\n\t"
  62028. "adcs r3, r3, r7\n\t"
  62029. "adc r4, r4, #0\n\t"
  62030. "lsr r6, r8, #16\n\t"
  62031. "lsr r7, r12, #16\n\t"
  62032. "mul r7, r6, r7\n\t"
  62033. "adds r3, r3, r7\n\t"
  62034. "adc r4, r4, #0\n\t"
  62035. "lsl r7, r12, #16\n\t"
  62036. "lsr r7, r7, #16\n\t"
  62037. "mul r6, r7, r6\n\t"
  62038. "lsr r7, r6, #16\n\t"
  62039. "lsl r6, r6, #16\n\t"
  62040. "adds r5, r5, r6\n\t"
  62041. "adcs r3, r3, r7\n\t"
  62042. "adc r4, r4, #0\n\t"
  62043. #else
  62044. "umull r6, r7, r8, r12\n\t"
  62045. "adds r5, r5, r6\n\t"
  62046. "adcs r3, r3, r7\n\t"
  62047. "adc r4, r4, #0\n\t"
  62048. #endif
  62049. /* A[7] * B[4] */
  62050. "ldr r8, [%[a], #28]\n\t"
  62051. "ldr r9, [%[b], #16]\n\t"
  62052. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62053. "lsl r6, r8, #16\n\t"
  62054. "lsl r7, r9, #16\n\t"
  62055. "lsr r6, r6, #16\n\t"
  62056. "lsr r7, r7, #16\n\t"
  62057. "mul r7, r6, r7\n\t"
  62058. "adds r5, r5, r7\n\t"
  62059. "adcs r3, r3, #0\n\t"
  62060. "adc r4, r4, #0\n\t"
  62061. "lsr r7, r9, #16\n\t"
  62062. "mul r6, r7, r6\n\t"
  62063. "lsr r7, r6, #16\n\t"
  62064. "lsl r6, r6, #16\n\t"
  62065. "adds r5, r5, r6\n\t"
  62066. "adcs r3, r3, r7\n\t"
  62067. "adc r4, r4, #0\n\t"
  62068. "lsr r6, r8, #16\n\t"
  62069. "lsr r7, r9, #16\n\t"
  62070. "mul r7, r6, r7\n\t"
  62071. "adds r3, r3, r7\n\t"
  62072. "adc r4, r4, #0\n\t"
  62073. "lsl r7, r9, #16\n\t"
  62074. "lsr r7, r7, #16\n\t"
  62075. "mul r6, r7, r6\n\t"
  62076. "lsr r7, r6, #16\n\t"
  62077. "lsl r6, r6, #16\n\t"
  62078. "adds r5, r5, r6\n\t"
  62079. "adcs r3, r3, r7\n\t"
  62080. "adc r4, r4, #0\n\t"
  62081. #else
  62082. "umull r6, r7, r8, r9\n\t"
  62083. "adds r5, r5, r6\n\t"
  62084. "adcs r3, r3, r7\n\t"
  62085. "adc r4, r4, #0\n\t"
  62086. #endif
  62087. "str r5, [%[r], #44]\n\t"
  62088. /* A[7] * B[5] */
  62089. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62090. "lsl r6, r8, #16\n\t"
  62091. "lsl r7, r12, #16\n\t"
  62092. "lsr r6, r6, #16\n\t"
  62093. "lsr r7, r7, #16\n\t"
  62094. "mul r7, r6, r7\n\t"
  62095. "adds r3, r3, r7\n\t"
  62096. "adcs r4, r4, #0\n\t"
  62097. "mov r5, #0\n\t"
  62098. "adc r5, r5, #0\n\t"
  62099. "lsr r7, r12, #16\n\t"
  62100. "mul r6, r7, r6\n\t"
  62101. "lsr r7, r6, #16\n\t"
  62102. "lsl r6, r6, #16\n\t"
  62103. "adds r3, r3, r6\n\t"
  62104. "adcs r4, r4, r7\n\t"
  62105. "adc r5, r5, #0\n\t"
  62106. "lsr r6, r8, #16\n\t"
  62107. "lsr r7, r12, #16\n\t"
  62108. "mul r7, r6, r7\n\t"
  62109. "adds r4, r4, r7\n\t"
  62110. "adc r5, r5, #0\n\t"
  62111. "lsl r7, r12, #16\n\t"
  62112. "lsr r7, r7, #16\n\t"
  62113. "mul r6, r7, r6\n\t"
  62114. "lsr r7, r6, #16\n\t"
  62115. "lsl r6, r6, #16\n\t"
  62116. "adds r3, r3, r6\n\t"
  62117. "adcs r4, r4, r7\n\t"
  62118. "adc r5, r5, #0\n\t"
  62119. #else
  62120. "umull r6, r7, r8, r12\n\t"
  62121. "adds r3, r3, r6\n\t"
  62122. "adcs r4, r4, r7\n\t"
  62123. "mov r5, #0\n\t"
  62124. "adc r5, r5, #0\n\t"
  62125. #endif
  62126. /* A[6] * B[6] */
  62127. "ldr r11, [%[a], #24]\n\t"
  62128. "ldr r12, [%[b], #24]\n\t"
  62129. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62130. "lsl r6, r11, #16\n\t"
  62131. "lsl r7, r12, #16\n\t"
  62132. "lsr r6, r6, #16\n\t"
  62133. "lsr r7, r7, #16\n\t"
  62134. "mul r7, r6, r7\n\t"
  62135. "adds r3, r3, r7\n\t"
  62136. "adcs r4, r4, #0\n\t"
  62137. "adc r5, r5, #0\n\t"
  62138. "lsr r7, r12, #16\n\t"
  62139. "mul r6, r7, r6\n\t"
  62140. "lsr r7, r6, #16\n\t"
  62141. "lsl r6, r6, #16\n\t"
  62142. "adds r3, r3, r6\n\t"
  62143. "adcs r4, r4, r7\n\t"
  62144. "adc r5, r5, #0\n\t"
  62145. "lsr r6, r11, #16\n\t"
  62146. "lsr r7, r12, #16\n\t"
  62147. "mul r7, r6, r7\n\t"
  62148. "adds r4, r4, r7\n\t"
  62149. "adc r5, r5, #0\n\t"
  62150. "lsl r7, r12, #16\n\t"
  62151. "lsr r7, r7, #16\n\t"
  62152. "mul r6, r7, r6\n\t"
  62153. "lsr r7, r6, #16\n\t"
  62154. "lsl r6, r6, #16\n\t"
  62155. "adds r3, r3, r6\n\t"
  62156. "adcs r4, r4, r7\n\t"
  62157. "adc r5, r5, #0\n\t"
  62158. #else
  62159. "umull r6, r7, r11, r12\n\t"
  62160. "adds r3, r3, r6\n\t"
  62161. "adcs r4, r4, r7\n\t"
  62162. "adc r5, r5, #0\n\t"
  62163. #endif
  62164. /* A[5] * B[7] */
  62165. "ldr r8, [%[a], #20]\n\t"
  62166. "ldr r9, [%[b], #28]\n\t"
  62167. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62168. "lsl r6, r8, #16\n\t"
  62169. "lsl r7, r9, #16\n\t"
  62170. "lsr r6, r6, #16\n\t"
  62171. "lsr r7, r7, #16\n\t"
  62172. "mul r7, r6, r7\n\t"
  62173. "adds r3, r3, r7\n\t"
  62174. "adcs r4, r4, #0\n\t"
  62175. "adc r5, r5, #0\n\t"
  62176. "lsr r7, r9, #16\n\t"
  62177. "mul r6, r7, r6\n\t"
  62178. "lsr r7, r6, #16\n\t"
  62179. "lsl r6, r6, #16\n\t"
  62180. "adds r3, r3, r6\n\t"
  62181. "adcs r4, r4, r7\n\t"
  62182. "adc r5, r5, #0\n\t"
  62183. "lsr r6, r8, #16\n\t"
  62184. "lsr r7, r9, #16\n\t"
  62185. "mul r7, r6, r7\n\t"
  62186. "adds r4, r4, r7\n\t"
  62187. "adc r5, r5, #0\n\t"
  62188. "lsl r7, r9, #16\n\t"
  62189. "lsr r7, r7, #16\n\t"
  62190. "mul r6, r7, r6\n\t"
  62191. "lsr r7, r6, #16\n\t"
  62192. "lsl r6, r6, #16\n\t"
  62193. "adds r3, r3, r6\n\t"
  62194. "adcs r4, r4, r7\n\t"
  62195. "adc r5, r5, #0\n\t"
  62196. #else
  62197. "umull r6, r7, r8, r9\n\t"
  62198. "adds r3, r3, r6\n\t"
  62199. "adcs r4, r4, r7\n\t"
  62200. "adc r5, r5, #0\n\t"
  62201. #endif
  62202. "str r3, [%[r], #48]\n\t"
  62203. /* A[6] * B[7] */
  62204. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62205. "lsl r6, r11, #16\n\t"
  62206. "lsl r7, r9, #16\n\t"
  62207. "lsr r6, r6, #16\n\t"
  62208. "lsr r7, r7, #16\n\t"
  62209. "mul r7, r6, r7\n\t"
  62210. "adds r4, r4, r7\n\t"
  62211. "adcs r5, r5, #0\n\t"
  62212. "mov r3, #0\n\t"
  62213. "adc r3, r3, #0\n\t"
  62214. "lsr r7, r9, #16\n\t"
  62215. "mul r6, r7, r6\n\t"
  62216. "lsr r7, r6, #16\n\t"
  62217. "lsl r6, r6, #16\n\t"
  62218. "adds r4, r4, r6\n\t"
  62219. "adcs r5, r5, r7\n\t"
  62220. "adc r3, r3, #0\n\t"
  62221. "lsr r6, r11, #16\n\t"
  62222. "lsr r7, r9, #16\n\t"
  62223. "mul r7, r6, r7\n\t"
  62224. "adds r5, r5, r7\n\t"
  62225. "adc r3, r3, #0\n\t"
  62226. "lsl r7, r9, #16\n\t"
  62227. "lsr r7, r7, #16\n\t"
  62228. "mul r6, r7, r6\n\t"
  62229. "lsr r7, r6, #16\n\t"
  62230. "lsl r6, r6, #16\n\t"
  62231. "adds r4, r4, r6\n\t"
  62232. "adcs r5, r5, r7\n\t"
  62233. "adc r3, r3, #0\n\t"
  62234. #else
  62235. "umull r6, r7, r11, r9\n\t"
  62236. "adds r4, r4, r6\n\t"
  62237. "adcs r5, r5, r7\n\t"
  62238. "mov r3, #0\n\t"
  62239. "adc r3, r3, #0\n\t"
  62240. #endif
  62241. /* A[7] * B[6] */
  62242. "ldr r8, [%[a], #28]\n\t"
  62243. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62244. "lsl r6, r8, #16\n\t"
  62245. "lsl r7, r12, #16\n\t"
  62246. "lsr r6, r6, #16\n\t"
  62247. "lsr r7, r7, #16\n\t"
  62248. "mul r7, r6, r7\n\t"
  62249. "adds r4, r4, r7\n\t"
  62250. "adcs r5, r5, #0\n\t"
  62251. "adc r3, r3, #0\n\t"
  62252. "lsr r7, r12, #16\n\t"
  62253. "mul r6, r7, r6\n\t"
  62254. "lsr r7, r6, #16\n\t"
  62255. "lsl r6, r6, #16\n\t"
  62256. "adds r4, r4, r6\n\t"
  62257. "adcs r5, r5, r7\n\t"
  62258. "adc r3, r3, #0\n\t"
  62259. "lsr r6, r8, #16\n\t"
  62260. "lsr r7, r12, #16\n\t"
  62261. "mul r7, r6, r7\n\t"
  62262. "adds r5, r5, r7\n\t"
  62263. "adc r3, r3, #0\n\t"
  62264. "lsl r7, r12, #16\n\t"
  62265. "lsr r7, r7, #16\n\t"
  62266. "mul r6, r7, r6\n\t"
  62267. "lsr r7, r6, #16\n\t"
  62268. "lsl r6, r6, #16\n\t"
  62269. "adds r4, r4, r6\n\t"
  62270. "adcs r5, r5, r7\n\t"
  62271. "adc r3, r3, #0\n\t"
  62272. #else
  62273. "umull r6, r7, r8, r12\n\t"
  62274. "adds r4, r4, r6\n\t"
  62275. "adcs r5, r5, r7\n\t"
  62276. "adc r3, r3, #0\n\t"
  62277. #endif
  62278. "str r4, [%[r], #52]\n\t"
  62279. /* A[7] * B[7] */
  62280. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62281. "lsl r6, r8, #16\n\t"
  62282. "lsl r7, r9, #16\n\t"
  62283. "lsr r6, r6, #16\n\t"
  62284. "lsr r7, r7, #16\n\t"
  62285. "mul r7, r6, r7\n\t"
  62286. "adds r5, r5, r7\n\t"
  62287. "adc r3, r3, #0\n\t"
  62288. "lsr r7, r9, #16\n\t"
  62289. "mul r6, r7, r6\n\t"
  62290. "lsr r7, r6, #16\n\t"
  62291. "lsl r6, r6, #16\n\t"
  62292. "adds r5, r5, r6\n\t"
  62293. "adc r3, r3, r7\n\t"
  62294. "lsr r6, r8, #16\n\t"
  62295. "lsr r7, r9, #16\n\t"
  62296. "mul r7, r6, r7\n\t"
  62297. "add r3, r3, r7\n\t"
  62298. "lsl r7, r9, #16\n\t"
  62299. "lsr r7, r7, #16\n\t"
  62300. "mul r6, r7, r6\n\t"
  62301. "lsr r7, r6, #16\n\t"
  62302. "lsl r6, r6, #16\n\t"
  62303. "adds r5, r5, r6\n\t"
  62304. "adc r3, r3, r7\n\t"
  62305. #else
  62306. "umull r6, r7, r8, r9\n\t"
  62307. "adds r5, r5, r6\n\t"
  62308. "adc r3, r3, r7\n\t"
  62309. #endif
  62310. "str r5, [%[r], #56]\n\t"
  62311. "str r3, [%[r], #60]\n\t"
  62312. "ldm sp!, {r3, r4, r5, r6}\n\t"
  62313. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  62314. "ldm sp!, {r3, r4, r5, r6}\n\t"
  62315. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  62316. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  62317. :
  62318. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  62319. );
  62320. }
  62321. #endif /* WOLFSSL_SP_SMALL */
  62322. #ifdef WOLFSSL_SP_SMALL
  62323. /* Square a and put result in r. (r = a * a)
  62324. *
  62325. * r A single precision integer.
  62326. * a A single precision integer.
  62327. */
  62328. static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  62329. {
  62330. register sp_digit* r asm ("r0") = r_p;
  62331. register const sp_digit* a asm ("r1") = a_p;
  62332. __asm__ __volatile__ (
  62333. "sub sp, sp, #0x40\n\t"
  62334. "mov r12, #0\n\t"
  62335. "mov r6, #0\n\t"
  62336. "mov r7, #0\n\t"
  62337. "mov r8, #0\n\t"
  62338. "mov r5, #0\n\t"
  62339. "\n"
  62340. "L_sp_256_sqr_8_outer_%=: \n\t"
  62341. "subs r3, r5, #28\n\t"
  62342. "it cc\n\t"
  62343. "movcc r3, r12\n\t"
  62344. "sub r4, r5, r3\n\t"
  62345. "\n"
  62346. "L_sp_256_sqr_8_inner_%=: \n\t"
  62347. "cmp r4, r3\n\t"
  62348. "beq L_sp_256_sqr_8_op_sqr_%=\n\t"
  62349. "ldr lr, [%[a], r3]\n\t"
  62350. "ldr r11, [%[a], r4]\n\t"
  62351. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62352. "lsl r9, lr, #16\n\t"
  62353. "lsl r10, r11, #16\n\t"
  62354. "lsr r9, r9, #16\n\t"
  62355. "lsr r10, r10, #16\n\t"
  62356. "mul r10, r9, r10\n\t"
  62357. "adds r6, r6, r10\n\t"
  62358. "adcs r7, r7, #0\n\t"
  62359. "adc r8, r8, #0\n\t"
  62360. "adds r6, r6, r10\n\t"
  62361. "adcs r7, r7, #0\n\t"
  62362. "adc r8, r8, #0\n\t"
  62363. "lsr r10, r11, #16\n\t"
  62364. "mul r9, r10, r9\n\t"
  62365. "lsr r10, r9, #16\n\t"
  62366. "lsl r9, r9, #16\n\t"
  62367. "adds r6, r6, r9\n\t"
  62368. "adcs r7, r7, r10\n\t"
  62369. "adc r8, r8, #0\n\t"
  62370. "adds r6, r6, r9\n\t"
  62371. "adcs r7, r7, r10\n\t"
  62372. "adc r8, r8, #0\n\t"
  62373. "lsr r9, lr, #16\n\t"
  62374. "lsr r10, r11, #16\n\t"
  62375. "mul r10, r9, r10\n\t"
  62376. "adds r7, r7, r10\n\t"
  62377. "adc r8, r8, #0\n\t"
  62378. "adds r7, r7, r10\n\t"
  62379. "adc r8, r8, #0\n\t"
  62380. "lsl r10, r11, #16\n\t"
  62381. "lsr r10, r10, #16\n\t"
  62382. "mul r9, r10, r9\n\t"
  62383. "lsr r10, r9, #16\n\t"
  62384. "lsl r9, r9, #16\n\t"
  62385. "adds r6, r6, r9\n\t"
  62386. "adcs r7, r7, r10\n\t"
  62387. "adc r8, r8, #0\n\t"
  62388. "adds r6, r6, r9\n\t"
  62389. "adcs r7, r7, r10\n\t"
  62390. "adc r8, r8, #0\n\t"
  62391. #else
  62392. "umull r9, r10, lr, r11\n\t"
  62393. "adds r6, r6, r9\n\t"
  62394. "adcs r7, r7, r10\n\t"
  62395. "adc r8, r8, #0\n\t"
  62396. "adds r6, r6, r9\n\t"
  62397. "adcs r7, r7, r10\n\t"
  62398. "adc r8, r8, #0\n\t"
  62399. #endif
  62400. "bal L_sp_256_sqr_8_op_done_%=\n\t"
  62401. "\n"
  62402. "L_sp_256_sqr_8_op_sqr_%=: \n\t"
  62403. "ldr lr, [%[a], r3]\n\t"
  62404. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62405. "lsl r9, lr, #16\n\t"
  62406. "lsr r10, lr, #16\n\t"
  62407. "lsr r9, r9, #16\n\t"
  62408. "mov r11, r9\n\t"
  62409. "mul r9, r11, r9\n\t"
  62410. "mov r11, r10\n\t"
  62411. "mul r10, r11, r10\n\t"
  62412. "adds r6, r6, r9\n\t"
  62413. "adcs r7, r7, r10\n\t"
  62414. "adc r8, r8, #0\n\t"
  62415. "lsr r10, lr, #16\n\t"
  62416. "lsl r9, lr, #16\n\t"
  62417. "lsr r9, r9, #16\n\t"
  62418. "mul r9, r10, r9\n\t"
  62419. "lsr r10, r9, #15\n\t"
  62420. "lsl r9, r9, #17\n\t"
  62421. "adds r6, r6, r9\n\t"
  62422. "adcs r7, r7, r10\n\t"
  62423. "adc r8, r8, #0\n\t"
  62424. #else
  62425. "umull r9, r10, lr, lr\n\t"
  62426. "adds r6, r6, r9\n\t"
  62427. "adcs r7, r7, r10\n\t"
  62428. "adc r8, r8, #0\n\t"
  62429. #endif
  62430. "\n"
  62431. "L_sp_256_sqr_8_op_done_%=: \n\t"
  62432. "add r3, r3, #4\n\t"
  62433. "sub r4, r4, #4\n\t"
  62434. "cmp r3, #32\n\t"
  62435. "beq L_sp_256_sqr_8_inner_done_%=\n\t"
  62436. "cmp r3, r4\n\t"
  62437. "bgt L_sp_256_sqr_8_inner_done_%=\n\t"
  62438. "cmp r3, r5\n\t"
  62439. "ble L_sp_256_sqr_8_inner_%=\n\t"
  62440. "\n"
  62441. "L_sp_256_sqr_8_inner_done_%=: \n\t"
  62442. "str r6, [sp, r5]\n\t"
  62443. "mov r6, r7\n\t"
  62444. "mov r7, r8\n\t"
  62445. "mov r8, #0\n\t"
  62446. "add r5, r5, #4\n\t"
  62447. "cmp r5, #56\n\t"
  62448. "ble L_sp_256_sqr_8_outer_%=\n\t"
  62449. "str r6, [sp, r5]\n\t"
  62450. "\n"
  62451. "L_sp_256_sqr_8_store_%=: \n\t"
  62452. "ldm sp!, {r6, r7, r8, r9}\n\t"
  62453. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  62454. "subs r5, r5, #16\n\t"
  62455. "bgt L_sp_256_sqr_8_store_%=\n\t"
  62456. : [r] "+r" (r), [a] "+r" (a)
  62457. :
  62458. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12"
  62459. );
  62460. }
  62461. #else
  62462. /* Square a and put result in r. (r = a * a)
  62463. *
  62464. * r A single precision integer.
  62465. * a A single precision integer.
  62466. */
  62467. static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p)
  62468. {
  62469. register sp_digit* r asm ("r0") = r_p;
  62470. register const sp_digit* a asm ("r1") = a_p;
  62471. __asm__ __volatile__ (
  62472. "sub sp, sp, #32\n\t"
  62473. /* A[0] * A[0] */
  62474. "ldr r10, [%[a]]\n\t"
  62475. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62476. "lsr r9, r10, #16\n\t"
  62477. "lsl r2, r10, #16\n\t"
  62478. "lsr r2, r2, #16\n\t"
  62479. "mul r8, r2, r2\n\t"
  62480. "mul r3, r9, r9\n\t"
  62481. "mul r2, r9, r2\n\t"
  62482. "lsr r9, r2, #15\n\t"
  62483. "lsl r2, r2, #17\n\t"
  62484. "adds r8, r8, r2\n\t"
  62485. "adc r3, r3, r9\n\t"
  62486. #else
  62487. "umull r8, r3, r10, r10\n\t"
  62488. #endif
  62489. "mov r4, #0\n\t"
  62490. "str r8, [sp]\n\t"
  62491. /* A[0] * A[1] */
  62492. "ldr r10, [%[a], #4]\n\t"
  62493. "ldr r12, [%[a]]\n\t"
  62494. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62495. "lsl r8, r10, #16\n\t"
  62496. "lsl r9, r12, #16\n\t"
  62497. "lsr r8, r8, #16\n\t"
  62498. "lsr r9, r9, #16\n\t"
  62499. "mul r9, r8, r9\n\t"
  62500. "adds r3, r3, r9\n\t"
  62501. "adcs r4, r4, #0\n\t"
  62502. "mov r2, #0\n\t"
  62503. "adc r2, r2, #0\n\t"
  62504. "adds r3, r3, r9\n\t"
  62505. "adcs r4, r4, #0\n\t"
  62506. "adc r2, r2, #0\n\t"
  62507. "lsr r9, r12, #16\n\t"
  62508. "mul r8, r9, r8\n\t"
  62509. "lsr r9, r8, #16\n\t"
  62510. "lsl r8, r8, #16\n\t"
  62511. "adds r3, r3, r8\n\t"
  62512. "adcs r4, r4, r9\n\t"
  62513. "adc r2, r2, #0\n\t"
  62514. "adds r3, r3, r8\n\t"
  62515. "adcs r4, r4, r9\n\t"
  62516. "adc r2, r2, #0\n\t"
  62517. "lsr r8, r10, #16\n\t"
  62518. "lsr r9, r12, #16\n\t"
  62519. "mul r9, r8, r9\n\t"
  62520. "adds r4, r4, r9\n\t"
  62521. "adc r2, r2, #0\n\t"
  62522. "adds r4, r4, r9\n\t"
  62523. "adc r2, r2, #0\n\t"
  62524. "lsl r9, r12, #16\n\t"
  62525. "lsr r9, r9, #16\n\t"
  62526. "mul r8, r9, r8\n\t"
  62527. "lsr r9, r8, #16\n\t"
  62528. "lsl r8, r8, #16\n\t"
  62529. "adds r3, r3, r8\n\t"
  62530. "adcs r4, r4, r9\n\t"
  62531. "adc r2, r2, #0\n\t"
  62532. "adds r3, r3, r8\n\t"
  62533. "adcs r4, r4, r9\n\t"
  62534. "adc r2, r2, #0\n\t"
  62535. #else
  62536. "umull r8, r9, r10, r12\n\t"
  62537. "adds r3, r3, r8\n\t"
  62538. "adcs r4, r4, r9\n\t"
  62539. "mov r2, #0\n\t"
  62540. "adc r2, r2, #0\n\t"
  62541. "adds r3, r3, r8\n\t"
  62542. "adcs r4, r4, r9\n\t"
  62543. "mov r2, #0\n\t"
  62544. "adc r2, r2, #0\n\t"
  62545. #endif
  62546. "str r3, [sp, #4]\n\t"
  62547. /* A[0] * A[2] */
  62548. "ldr r10, [%[a], #8]\n\t"
  62549. "ldr r12, [%[a]]\n\t"
  62550. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62551. "lsl r8, r10, #16\n\t"
  62552. "lsl r9, r12, #16\n\t"
  62553. "lsr r8, r8, #16\n\t"
  62554. "lsr r9, r9, #16\n\t"
  62555. "mul r9, r8, r9\n\t"
  62556. "adds r4, r4, r9\n\t"
  62557. "adcs r2, r2, #0\n\t"
  62558. "mov r3, #0\n\t"
  62559. "adc r3, r3, #0\n\t"
  62560. "adds r4, r4, r9\n\t"
  62561. "adcs r2, r2, #0\n\t"
  62562. "adc r3, r3, #0\n\t"
  62563. "lsr r9, r12, #16\n\t"
  62564. "mul r8, r9, r8\n\t"
  62565. "lsr r9, r8, #16\n\t"
  62566. "lsl r8, r8, #16\n\t"
  62567. "adds r4, r4, r8\n\t"
  62568. "adcs r2, r2, r9\n\t"
  62569. "adc r3, r3, #0\n\t"
  62570. "adds r4, r4, r8\n\t"
  62571. "adcs r2, r2, r9\n\t"
  62572. "adc r3, r3, #0\n\t"
  62573. "lsr r8, r10, #16\n\t"
  62574. "lsr r9, r12, #16\n\t"
  62575. "mul r9, r8, r9\n\t"
  62576. "adds r2, r2, r9\n\t"
  62577. "adc r3, r3, #0\n\t"
  62578. "adds r2, r2, r9\n\t"
  62579. "adc r3, r3, #0\n\t"
  62580. "lsl r9, r12, #16\n\t"
  62581. "lsr r9, r9, #16\n\t"
  62582. "mul r8, r9, r8\n\t"
  62583. "lsr r9, r8, #16\n\t"
  62584. "lsl r8, r8, #16\n\t"
  62585. "adds r4, r4, r8\n\t"
  62586. "adcs r2, r2, r9\n\t"
  62587. "adc r3, r3, #0\n\t"
  62588. "adds r4, r4, r8\n\t"
  62589. "adcs r2, r2, r9\n\t"
  62590. "adc r3, r3, #0\n\t"
  62591. #else
  62592. "umull r8, r9, r10, r12\n\t"
  62593. "adds r4, r4, r8\n\t"
  62594. "adcs r2, r2, r9\n\t"
  62595. "mov r3, #0\n\t"
  62596. "adc r3, r3, #0\n\t"
  62597. "adds r4, r4, r8\n\t"
  62598. "adcs r2, r2, r9\n\t"
  62599. "mov r3, #0\n\t"
  62600. "adc r3, r3, #0\n\t"
  62601. #endif
  62602. /* A[1] * A[1] */
  62603. "ldr r10, [%[a], #4]\n\t"
  62604. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62605. "lsl r8, r10, #16\n\t"
  62606. "lsr r9, r10, #16\n\t"
  62607. "lsr r8, r8, #16\n\t"
  62608. "mov r12, r8\n\t"
  62609. "mul r8, r12, r8\n\t"
  62610. "mov r12, r9\n\t"
  62611. "mul r9, r12, r9\n\t"
  62612. "adds r4, r4, r8\n\t"
  62613. "adcs r2, r2, r9\n\t"
  62614. "adc r3, r3, #0\n\t"
  62615. "lsr r9, r10, #16\n\t"
  62616. "lsl r8, r10, #16\n\t"
  62617. "lsr r8, r8, #16\n\t"
  62618. "mul r8, r9, r8\n\t"
  62619. "lsr r9, r8, #15\n\t"
  62620. "lsl r8, r8, #17\n\t"
  62621. "adds r4, r4, r8\n\t"
  62622. "adcs r2, r2, r9\n\t"
  62623. "adc r3, r3, #0\n\t"
  62624. #else
  62625. "umull r8, r9, r10, r10\n\t"
  62626. "adds r4, r4, r8\n\t"
  62627. "adcs r2, r2, r9\n\t"
  62628. "adc r3, r3, #0\n\t"
  62629. #endif
  62630. "str r4, [sp, #8]\n\t"
  62631. /* A[0] * A[3] */
  62632. "ldr r10, [%[a], #12]\n\t"
  62633. "ldr r12, [%[a]]\n\t"
  62634. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62635. "lsl r8, r10, #16\n\t"
  62636. "lsl r9, r12, #16\n\t"
  62637. "lsr r8, r8, #16\n\t"
  62638. "lsr r9, r9, #16\n\t"
  62639. "mul r9, r8, r9\n\t"
  62640. "adds r2, r2, r9\n\t"
  62641. "adcs r3, r3, #0\n\t"
  62642. "mov r4, #0\n\t"
  62643. "adc r4, r4, #0\n\t"
  62644. "adds r2, r2, r9\n\t"
  62645. "adcs r3, r3, #0\n\t"
  62646. "adc r4, r4, #0\n\t"
  62647. "lsr r9, r12, #16\n\t"
  62648. "mul r8, r9, r8\n\t"
  62649. "lsr r9, r8, #16\n\t"
  62650. "lsl r8, r8, #16\n\t"
  62651. "adds r2, r2, r8\n\t"
  62652. "adcs r3, r3, r9\n\t"
  62653. "adc r4, r4, #0\n\t"
  62654. "adds r2, r2, r8\n\t"
  62655. "adcs r3, r3, r9\n\t"
  62656. "adc r4, r4, #0\n\t"
  62657. "lsr r8, r10, #16\n\t"
  62658. "lsr r9, r12, #16\n\t"
  62659. "mul r9, r8, r9\n\t"
  62660. "adds r3, r3, r9\n\t"
  62661. "adc r4, r4, #0\n\t"
  62662. "adds r3, r3, r9\n\t"
  62663. "adc r4, r4, #0\n\t"
  62664. "lsl r9, r12, #16\n\t"
  62665. "lsr r9, r9, #16\n\t"
  62666. "mul r8, r9, r8\n\t"
  62667. "lsr r9, r8, #16\n\t"
  62668. "lsl r8, r8, #16\n\t"
  62669. "adds r2, r2, r8\n\t"
  62670. "adcs r3, r3, r9\n\t"
  62671. "adc r4, r4, #0\n\t"
  62672. "adds r2, r2, r8\n\t"
  62673. "adcs r3, r3, r9\n\t"
  62674. "adc r4, r4, #0\n\t"
  62675. #else
  62676. "umull r8, r9, r10, r12\n\t"
  62677. "adds r2, r2, r8\n\t"
  62678. "adcs r3, r3, r9\n\t"
  62679. "mov r4, #0\n\t"
  62680. "adc r4, r4, #0\n\t"
  62681. "adds r2, r2, r8\n\t"
  62682. "adcs r3, r3, r9\n\t"
  62683. "mov r4, #0\n\t"
  62684. "adc r4, r4, #0\n\t"
  62685. #endif
  62686. /* A[1] * A[2] */
  62687. "ldr r10, [%[a], #8]\n\t"
  62688. "ldr r12, [%[a], #4]\n\t"
  62689. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62690. "lsl r8, r10, #16\n\t"
  62691. "lsl r9, r12, #16\n\t"
  62692. "lsr r8, r8, #16\n\t"
  62693. "lsr r9, r9, #16\n\t"
  62694. "mul r9, r8, r9\n\t"
  62695. "adds r2, r2, r9\n\t"
  62696. "adcs r3, r3, #0\n\t"
  62697. "adc r4, r4, #0\n\t"
  62698. "adds r2, r2, r9\n\t"
  62699. "adcs r3, r3, #0\n\t"
  62700. "adc r4, r4, #0\n\t"
  62701. "lsr r9, r12, #16\n\t"
  62702. "mul r8, r9, r8\n\t"
  62703. "lsr r9, r8, #16\n\t"
  62704. "lsl r8, r8, #16\n\t"
  62705. "adds r2, r2, r8\n\t"
  62706. "adcs r3, r3, r9\n\t"
  62707. "adc r4, r4, #0\n\t"
  62708. "adds r2, r2, r8\n\t"
  62709. "adcs r3, r3, r9\n\t"
  62710. "adc r4, r4, #0\n\t"
  62711. "lsr r8, r10, #16\n\t"
  62712. "lsr r9, r12, #16\n\t"
  62713. "mul r9, r8, r9\n\t"
  62714. "adds r3, r3, r9\n\t"
  62715. "adc r4, r4, #0\n\t"
  62716. "adds r3, r3, r9\n\t"
  62717. "adc r4, r4, #0\n\t"
  62718. "lsl r9, r12, #16\n\t"
  62719. "lsr r9, r9, #16\n\t"
  62720. "mul r8, r9, r8\n\t"
  62721. "lsr r9, r8, #16\n\t"
  62722. "lsl r8, r8, #16\n\t"
  62723. "adds r2, r2, r8\n\t"
  62724. "adcs r3, r3, r9\n\t"
  62725. "adc r4, r4, #0\n\t"
  62726. "adds r2, r2, r8\n\t"
  62727. "adcs r3, r3, r9\n\t"
  62728. "adc r4, r4, #0\n\t"
  62729. #else
  62730. "umull r8, r9, r10, r12\n\t"
  62731. "adds r2, r2, r8\n\t"
  62732. "adcs r3, r3, r9\n\t"
  62733. "adc r4, r4, #0\n\t"
  62734. "adds r2, r2, r8\n\t"
  62735. "adcs r3, r3, r9\n\t"
  62736. "adc r4, r4, #0\n\t"
  62737. #endif
  62738. "str r2, [sp, #12]\n\t"
  62739. /* A[0] * A[4] */
  62740. "ldr r10, [%[a], #16]\n\t"
  62741. "ldr r12, [%[a]]\n\t"
  62742. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62743. "lsl r8, r10, #16\n\t"
  62744. "lsl r9, r12, #16\n\t"
  62745. "lsr r8, r8, #16\n\t"
  62746. "lsr r9, r9, #16\n\t"
  62747. "mul r9, r8, r9\n\t"
  62748. "adds r3, r3, r9\n\t"
  62749. "adcs r4, r4, #0\n\t"
  62750. "mov r2, #0\n\t"
  62751. "adc r2, r2, #0\n\t"
  62752. "adds r3, r3, r9\n\t"
  62753. "adcs r4, r4, #0\n\t"
  62754. "adc r2, r2, #0\n\t"
  62755. "lsr r9, r12, #16\n\t"
  62756. "mul r8, r9, r8\n\t"
  62757. "lsr r9, r8, #16\n\t"
  62758. "lsl r8, r8, #16\n\t"
  62759. "adds r3, r3, r8\n\t"
  62760. "adcs r4, r4, r9\n\t"
  62761. "adc r2, r2, #0\n\t"
  62762. "adds r3, r3, r8\n\t"
  62763. "adcs r4, r4, r9\n\t"
  62764. "adc r2, r2, #0\n\t"
  62765. "lsr r8, r10, #16\n\t"
  62766. "lsr r9, r12, #16\n\t"
  62767. "mul r9, r8, r9\n\t"
  62768. "adds r4, r4, r9\n\t"
  62769. "adc r2, r2, #0\n\t"
  62770. "adds r4, r4, r9\n\t"
  62771. "adc r2, r2, #0\n\t"
  62772. "lsl r9, r12, #16\n\t"
  62773. "lsr r9, r9, #16\n\t"
  62774. "mul r8, r9, r8\n\t"
  62775. "lsr r9, r8, #16\n\t"
  62776. "lsl r8, r8, #16\n\t"
  62777. "adds r3, r3, r8\n\t"
  62778. "adcs r4, r4, r9\n\t"
  62779. "adc r2, r2, #0\n\t"
  62780. "adds r3, r3, r8\n\t"
  62781. "adcs r4, r4, r9\n\t"
  62782. "adc r2, r2, #0\n\t"
  62783. #else
  62784. "umull r8, r9, r10, r12\n\t"
  62785. "adds r3, r3, r8\n\t"
  62786. "adcs r4, r4, r9\n\t"
  62787. "mov r2, #0\n\t"
  62788. "adc r2, r2, #0\n\t"
  62789. "adds r3, r3, r8\n\t"
  62790. "adcs r4, r4, r9\n\t"
  62791. "mov r2, #0\n\t"
  62792. "adc r2, r2, #0\n\t"
  62793. #endif
  62794. /* A[1] * A[3] */
  62795. "ldr r10, [%[a], #12]\n\t"
  62796. "ldr r12, [%[a], #4]\n\t"
  62797. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62798. "lsl r8, r10, #16\n\t"
  62799. "lsl r9, r12, #16\n\t"
  62800. "lsr r8, r8, #16\n\t"
  62801. "lsr r9, r9, #16\n\t"
  62802. "mul r9, r8, r9\n\t"
  62803. "adds r3, r3, r9\n\t"
  62804. "adcs r4, r4, #0\n\t"
  62805. "adc r2, r2, #0\n\t"
  62806. "adds r3, r3, r9\n\t"
  62807. "adcs r4, r4, #0\n\t"
  62808. "adc r2, r2, #0\n\t"
  62809. "lsr r9, r12, #16\n\t"
  62810. "mul r8, r9, r8\n\t"
  62811. "lsr r9, r8, #16\n\t"
  62812. "lsl r8, r8, #16\n\t"
  62813. "adds r3, r3, r8\n\t"
  62814. "adcs r4, r4, r9\n\t"
  62815. "adc r2, r2, #0\n\t"
  62816. "adds r3, r3, r8\n\t"
  62817. "adcs r4, r4, r9\n\t"
  62818. "adc r2, r2, #0\n\t"
  62819. "lsr r8, r10, #16\n\t"
  62820. "lsr r9, r12, #16\n\t"
  62821. "mul r9, r8, r9\n\t"
  62822. "adds r4, r4, r9\n\t"
  62823. "adc r2, r2, #0\n\t"
  62824. "adds r4, r4, r9\n\t"
  62825. "adc r2, r2, #0\n\t"
  62826. "lsl r9, r12, #16\n\t"
  62827. "lsr r9, r9, #16\n\t"
  62828. "mul r8, r9, r8\n\t"
  62829. "lsr r9, r8, #16\n\t"
  62830. "lsl r8, r8, #16\n\t"
  62831. "adds r3, r3, r8\n\t"
  62832. "adcs r4, r4, r9\n\t"
  62833. "adc r2, r2, #0\n\t"
  62834. "adds r3, r3, r8\n\t"
  62835. "adcs r4, r4, r9\n\t"
  62836. "adc r2, r2, #0\n\t"
  62837. #else
  62838. "umull r8, r9, r10, r12\n\t"
  62839. "adds r3, r3, r8\n\t"
  62840. "adcs r4, r4, r9\n\t"
  62841. "adc r2, r2, #0\n\t"
  62842. "adds r3, r3, r8\n\t"
  62843. "adcs r4, r4, r9\n\t"
  62844. "adc r2, r2, #0\n\t"
  62845. #endif
  62846. /* A[2] * A[2] */
  62847. "ldr r10, [%[a], #8]\n\t"
  62848. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62849. "lsl r8, r10, #16\n\t"
  62850. "lsr r9, r10, #16\n\t"
  62851. "lsr r8, r8, #16\n\t"
  62852. "mov r12, r8\n\t"
  62853. "mul r8, r12, r8\n\t"
  62854. "mov r12, r9\n\t"
  62855. "mul r9, r12, r9\n\t"
  62856. "adds r3, r3, r8\n\t"
  62857. "adcs r4, r4, r9\n\t"
  62858. "adc r2, r2, #0\n\t"
  62859. "lsr r9, r10, #16\n\t"
  62860. "lsl r8, r10, #16\n\t"
  62861. "lsr r8, r8, #16\n\t"
  62862. "mul r8, r9, r8\n\t"
  62863. "lsr r9, r8, #15\n\t"
  62864. "lsl r8, r8, #17\n\t"
  62865. "adds r3, r3, r8\n\t"
  62866. "adcs r4, r4, r9\n\t"
  62867. "adc r2, r2, #0\n\t"
  62868. #else
  62869. "umull r8, r9, r10, r10\n\t"
  62870. "adds r3, r3, r8\n\t"
  62871. "adcs r4, r4, r9\n\t"
  62872. "adc r2, r2, #0\n\t"
  62873. #endif
  62874. "str r3, [sp, #16]\n\t"
  62875. /* A[0] * A[5] */
  62876. "ldr r10, [%[a], #20]\n\t"
  62877. "ldr r12, [%[a]]\n\t"
  62878. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62879. "lsl r8, r10, #16\n\t"
  62880. "lsl r5, r12, #16\n\t"
  62881. "lsr r8, r8, #16\n\t"
  62882. "lsr r5, r5, #16\n\t"
  62883. "mul r5, r8, r5\n\t"
  62884. "lsr r9, r12, #16\n\t"
  62885. "mul r8, r9, r8\n\t"
  62886. "lsr r6, r8, #16\n\t"
  62887. "lsl r8, r8, #16\n\t"
  62888. "adds r5, r5, r8\n\t"
  62889. "adc r6, r6, #0\n\t"
  62890. "lsr r8, r10, #16\n\t"
  62891. "mul r9, r8, r9\n\t"
  62892. "add r6, r6, r9\n\t"
  62893. "lsl r9, r12, #16\n\t"
  62894. "lsr r9, r9, #16\n\t"
  62895. "mul r8, r9, r8\n\t"
  62896. "lsr r9, r8, #16\n\t"
  62897. "lsl r8, r8, #16\n\t"
  62898. "adds r5, r5, r8\n\t"
  62899. "adc r6, r6, r9\n\t"
  62900. #else
  62901. "umull r5, r6, r10, r12\n\t"
  62902. #endif
  62903. "mov r3, #0\n\t"
  62904. "mov r7, #0\n\t"
  62905. /* A[1] * A[4] */
  62906. "ldr r10, [%[a], #16]\n\t"
  62907. "ldr r12, [%[a], #4]\n\t"
  62908. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62909. "lsl r8, r10, #16\n\t"
  62910. "lsl r9, r12, #16\n\t"
  62911. "lsr r8, r8, #16\n\t"
  62912. "lsr r9, r9, #16\n\t"
  62913. "mul r9, r8, r9\n\t"
  62914. "adds r5, r5, r9\n\t"
  62915. "adcs r6, r6, #0\n\t"
  62916. "adc r7, r7, #0\n\t"
  62917. "lsr r9, r12, #16\n\t"
  62918. "mul r8, r9, r8\n\t"
  62919. "lsr r9, r8, #16\n\t"
  62920. "lsl r8, r8, #16\n\t"
  62921. "adds r5, r5, r8\n\t"
  62922. "adcs r6, r6, r9\n\t"
  62923. "adc r7, r7, #0\n\t"
  62924. "lsr r8, r10, #16\n\t"
  62925. "lsr r9, r12, #16\n\t"
  62926. "mul r9, r8, r9\n\t"
  62927. "adds r6, r6, r9\n\t"
  62928. "adc r7, r7, #0\n\t"
  62929. "lsl r9, r12, #16\n\t"
  62930. "lsr r9, r9, #16\n\t"
  62931. "mul r8, r9, r8\n\t"
  62932. "lsr r9, r8, #16\n\t"
  62933. "lsl r8, r8, #16\n\t"
  62934. "adds r5, r5, r8\n\t"
  62935. "adcs r6, r6, r9\n\t"
  62936. "adc r7, r7, #0\n\t"
  62937. #else
  62938. "umull r8, r9, r10, r12\n\t"
  62939. "adds r5, r5, r8\n\t"
  62940. "adcs r6, r6, r9\n\t"
  62941. "adc r7, r7, #0\n\t"
  62942. #endif
  62943. /* A[2] * A[3] */
  62944. "ldr r10, [%[a], #12]\n\t"
  62945. "ldr r12, [%[a], #8]\n\t"
  62946. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62947. "lsl r8, r10, #16\n\t"
  62948. "lsl r9, r12, #16\n\t"
  62949. "lsr r8, r8, #16\n\t"
  62950. "lsr r9, r9, #16\n\t"
  62951. "mul r9, r8, r9\n\t"
  62952. "adds r5, r5, r9\n\t"
  62953. "adcs r6, r6, #0\n\t"
  62954. "adc r7, r7, #0\n\t"
  62955. "lsr r9, r12, #16\n\t"
  62956. "mul r8, r9, r8\n\t"
  62957. "lsr r9, r8, #16\n\t"
  62958. "lsl r8, r8, #16\n\t"
  62959. "adds r5, r5, r8\n\t"
  62960. "adcs r6, r6, r9\n\t"
  62961. "adc r7, r7, #0\n\t"
  62962. "lsr r8, r10, #16\n\t"
  62963. "lsr r9, r12, #16\n\t"
  62964. "mul r9, r8, r9\n\t"
  62965. "adds r6, r6, r9\n\t"
  62966. "adc r7, r7, #0\n\t"
  62967. "lsl r9, r12, #16\n\t"
  62968. "lsr r9, r9, #16\n\t"
  62969. "mul r8, r9, r8\n\t"
  62970. "lsr r9, r8, #16\n\t"
  62971. "lsl r8, r8, #16\n\t"
  62972. "adds r5, r5, r8\n\t"
  62973. "adcs r6, r6, r9\n\t"
  62974. "adc r7, r7, #0\n\t"
  62975. #else
  62976. "umull r8, r9, r10, r12\n\t"
  62977. "adds r5, r5, r8\n\t"
  62978. "adcs r6, r6, r9\n\t"
  62979. "adc r7, r7, #0\n\t"
  62980. #endif
  62981. "adds r5, r5, r5\n\t"
  62982. "adcs r6, r6, r6\n\t"
  62983. "adc r7, r7, r7\n\t"
  62984. "adds r4, r4, r5\n\t"
  62985. "adcs r2, r2, r6\n\t"
  62986. "adc r3, r3, r7\n\t"
  62987. "str r4, [sp, #20]\n\t"
  62988. /* A[0] * A[6] */
  62989. "ldr r10, [%[a], #24]\n\t"
  62990. "ldr r12, [%[a]]\n\t"
  62991. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  62992. "lsl r8, r10, #16\n\t"
  62993. "lsl r5, r12, #16\n\t"
  62994. "lsr r8, r8, #16\n\t"
  62995. "lsr r5, r5, #16\n\t"
  62996. "mul r5, r8, r5\n\t"
  62997. "lsr r9, r12, #16\n\t"
  62998. "mul r8, r9, r8\n\t"
  62999. "lsr r6, r8, #16\n\t"
  63000. "lsl r8, r8, #16\n\t"
  63001. "adds r5, r5, r8\n\t"
  63002. "adc r6, r6, #0\n\t"
  63003. "lsr r8, r10, #16\n\t"
  63004. "mul r9, r8, r9\n\t"
  63005. "add r6, r6, r9\n\t"
  63006. "lsl r9, r12, #16\n\t"
  63007. "lsr r9, r9, #16\n\t"
  63008. "mul r8, r9, r8\n\t"
  63009. "lsr r9, r8, #16\n\t"
  63010. "lsl r8, r8, #16\n\t"
  63011. "adds r5, r5, r8\n\t"
  63012. "adc r6, r6, r9\n\t"
  63013. #else
  63014. "umull r5, r6, r10, r12\n\t"
  63015. #endif
  63016. "mov r4, #0\n\t"
  63017. "mov r7, #0\n\t"
  63018. /* A[1] * A[5] */
  63019. "ldr r10, [%[a], #20]\n\t"
  63020. "ldr r12, [%[a], #4]\n\t"
  63021. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63022. "lsl r8, r10, #16\n\t"
  63023. "lsl r9, r12, #16\n\t"
  63024. "lsr r8, r8, #16\n\t"
  63025. "lsr r9, r9, #16\n\t"
  63026. "mul r9, r8, r9\n\t"
  63027. "adds r5, r5, r9\n\t"
  63028. "adcs r6, r6, #0\n\t"
  63029. "adc r7, r7, #0\n\t"
  63030. "lsr r9, r12, #16\n\t"
  63031. "mul r8, r9, r8\n\t"
  63032. "lsr r9, r8, #16\n\t"
  63033. "lsl r8, r8, #16\n\t"
  63034. "adds r5, r5, r8\n\t"
  63035. "adcs r6, r6, r9\n\t"
  63036. "adc r7, r7, #0\n\t"
  63037. "lsr r8, r10, #16\n\t"
  63038. "lsr r9, r12, #16\n\t"
  63039. "mul r9, r8, r9\n\t"
  63040. "adds r6, r6, r9\n\t"
  63041. "adc r7, r7, #0\n\t"
  63042. "lsl r9, r12, #16\n\t"
  63043. "lsr r9, r9, #16\n\t"
  63044. "mul r8, r9, r8\n\t"
  63045. "lsr r9, r8, #16\n\t"
  63046. "lsl r8, r8, #16\n\t"
  63047. "adds r5, r5, r8\n\t"
  63048. "adcs r6, r6, r9\n\t"
  63049. "adc r7, r7, #0\n\t"
  63050. #else
  63051. "umull r8, r9, r10, r12\n\t"
  63052. "adds r5, r5, r8\n\t"
  63053. "adcs r6, r6, r9\n\t"
  63054. "adc r7, r7, #0\n\t"
  63055. #endif
  63056. /* A[2] * A[4] */
  63057. "ldr r10, [%[a], #16]\n\t"
  63058. "ldr r12, [%[a], #8]\n\t"
  63059. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63060. "lsl r8, r10, #16\n\t"
  63061. "lsl r9, r12, #16\n\t"
  63062. "lsr r8, r8, #16\n\t"
  63063. "lsr r9, r9, #16\n\t"
  63064. "mul r9, r8, r9\n\t"
  63065. "adds r5, r5, r9\n\t"
  63066. "adcs r6, r6, #0\n\t"
  63067. "adc r7, r7, #0\n\t"
  63068. "lsr r9, r12, #16\n\t"
  63069. "mul r8, r9, r8\n\t"
  63070. "lsr r9, r8, #16\n\t"
  63071. "lsl r8, r8, #16\n\t"
  63072. "adds r5, r5, r8\n\t"
  63073. "adcs r6, r6, r9\n\t"
  63074. "adc r7, r7, #0\n\t"
  63075. "lsr r8, r10, #16\n\t"
  63076. "lsr r9, r12, #16\n\t"
  63077. "mul r9, r8, r9\n\t"
  63078. "adds r6, r6, r9\n\t"
  63079. "adc r7, r7, #0\n\t"
  63080. "lsl r9, r12, #16\n\t"
  63081. "lsr r9, r9, #16\n\t"
  63082. "mul r8, r9, r8\n\t"
  63083. "lsr r9, r8, #16\n\t"
  63084. "lsl r8, r8, #16\n\t"
  63085. "adds r5, r5, r8\n\t"
  63086. "adcs r6, r6, r9\n\t"
  63087. "adc r7, r7, #0\n\t"
  63088. #else
  63089. "umull r8, r9, r10, r12\n\t"
  63090. "adds r5, r5, r8\n\t"
  63091. "adcs r6, r6, r9\n\t"
  63092. "adc r7, r7, #0\n\t"
  63093. #endif
  63094. /* A[3] * A[3] */
  63095. "ldr r10, [%[a], #12]\n\t"
  63096. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63097. "lsl r8, r10, #16\n\t"
  63098. "lsr r9, r10, #16\n\t"
  63099. "lsr r8, r8, #16\n\t"
  63100. "mov r12, r8\n\t"
  63101. "mul r8, r12, r8\n\t"
  63102. "mov r12, r9\n\t"
  63103. "mul r9, r12, r9\n\t"
  63104. "adds r2, r2, r8\n\t"
  63105. "adcs r3, r3, r9\n\t"
  63106. "adc r4, r4, #0\n\t"
  63107. "lsr r9, r10, #16\n\t"
  63108. "lsl r8, r10, #16\n\t"
  63109. "lsr r8, r8, #16\n\t"
  63110. "mul r8, r9, r8\n\t"
  63111. "lsr r9, r8, #15\n\t"
  63112. "lsl r8, r8, #17\n\t"
  63113. "adds r2, r2, r8\n\t"
  63114. "adcs r3, r3, r9\n\t"
  63115. "adc r4, r4, #0\n\t"
  63116. "adds r5, r5, r5\n\t"
  63117. "adcs r6, r6, r6\n\t"
  63118. "adc r7, r7, r7\n\t"
  63119. #else
  63120. "umull r8, r9, r10, r10\n\t"
  63121. "adds r5, r5, r5\n\t"
  63122. "adcs r6, r6, r6\n\t"
  63123. "adc r7, r7, r7\n\t"
  63124. "adds r2, r2, r8\n\t"
  63125. "adcs r3, r3, r9\n\t"
  63126. "adc r4, r4, #0\n\t"
  63127. #endif
  63128. "adds r2, r2, r5\n\t"
  63129. "adcs r3, r3, r6\n\t"
  63130. "adc r4, r4, r7\n\t"
  63131. "str r2, [sp, #24]\n\t"
  63132. /* A[0] * A[7] */
  63133. "ldr r10, [%[a], #28]\n\t"
  63134. "ldr r12, [%[a]]\n\t"
  63135. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63136. "lsl r8, r10, #16\n\t"
  63137. "lsl r5, r12, #16\n\t"
  63138. "lsr r8, r8, #16\n\t"
  63139. "lsr r5, r5, #16\n\t"
  63140. "mul r5, r8, r5\n\t"
  63141. "lsr r9, r12, #16\n\t"
  63142. "mul r8, r9, r8\n\t"
  63143. "lsr r6, r8, #16\n\t"
  63144. "lsl r8, r8, #16\n\t"
  63145. "adds r5, r5, r8\n\t"
  63146. "adc r6, r6, #0\n\t"
  63147. "lsr r8, r10, #16\n\t"
  63148. "mul r9, r8, r9\n\t"
  63149. "add r6, r6, r9\n\t"
  63150. "lsl r9, r12, #16\n\t"
  63151. "lsr r9, r9, #16\n\t"
  63152. "mul r8, r9, r8\n\t"
  63153. "lsr r9, r8, #16\n\t"
  63154. "lsl r8, r8, #16\n\t"
  63155. "adds r5, r5, r8\n\t"
  63156. "adc r6, r6, r9\n\t"
  63157. #else
  63158. "umull r5, r6, r10, r12\n\t"
  63159. #endif
  63160. "mov r2, #0\n\t"
  63161. "mov r7, #0\n\t"
  63162. /* A[1] * A[6] */
  63163. "ldr r10, [%[a], #24]\n\t"
  63164. "ldr r12, [%[a], #4]\n\t"
  63165. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63166. "lsl r8, r10, #16\n\t"
  63167. "lsl r9, r12, #16\n\t"
  63168. "lsr r8, r8, #16\n\t"
  63169. "lsr r9, r9, #16\n\t"
  63170. "mul r9, r8, r9\n\t"
  63171. "adds r5, r5, r9\n\t"
  63172. "adcs r6, r6, #0\n\t"
  63173. "adc r7, r7, #0\n\t"
  63174. "lsr r9, r12, #16\n\t"
  63175. "mul r8, r9, r8\n\t"
  63176. "lsr r9, r8, #16\n\t"
  63177. "lsl r8, r8, #16\n\t"
  63178. "adds r5, r5, r8\n\t"
  63179. "adcs r6, r6, r9\n\t"
  63180. "adc r7, r7, #0\n\t"
  63181. "lsr r8, r10, #16\n\t"
  63182. "lsr r9, r12, #16\n\t"
  63183. "mul r9, r8, r9\n\t"
  63184. "adds r6, r6, r9\n\t"
  63185. "adc r7, r7, #0\n\t"
  63186. "lsl r9, r12, #16\n\t"
  63187. "lsr r9, r9, #16\n\t"
  63188. "mul r8, r9, r8\n\t"
  63189. "lsr r9, r8, #16\n\t"
  63190. "lsl r8, r8, #16\n\t"
  63191. "adds r5, r5, r8\n\t"
  63192. "adcs r6, r6, r9\n\t"
  63193. "adc r7, r7, #0\n\t"
  63194. #else
  63195. "umull r8, r9, r10, r12\n\t"
  63196. "adds r5, r5, r8\n\t"
  63197. "adcs r6, r6, r9\n\t"
  63198. "adc r7, r7, #0\n\t"
  63199. #endif
  63200. /* A[2] * A[5] */
  63201. "ldr r10, [%[a], #20]\n\t"
  63202. "ldr r12, [%[a], #8]\n\t"
  63203. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63204. "lsl r8, r10, #16\n\t"
  63205. "lsl r9, r12, #16\n\t"
  63206. "lsr r8, r8, #16\n\t"
  63207. "lsr r9, r9, #16\n\t"
  63208. "mul r9, r8, r9\n\t"
  63209. "adds r5, r5, r9\n\t"
  63210. "adcs r6, r6, #0\n\t"
  63211. "adc r7, r7, #0\n\t"
  63212. "lsr r9, r12, #16\n\t"
  63213. "mul r8, r9, r8\n\t"
  63214. "lsr r9, r8, #16\n\t"
  63215. "lsl r8, r8, #16\n\t"
  63216. "adds r5, r5, r8\n\t"
  63217. "adcs r6, r6, r9\n\t"
  63218. "adc r7, r7, #0\n\t"
  63219. "lsr r8, r10, #16\n\t"
  63220. "lsr r9, r12, #16\n\t"
  63221. "mul r9, r8, r9\n\t"
  63222. "adds r6, r6, r9\n\t"
  63223. "adc r7, r7, #0\n\t"
  63224. "lsl r9, r12, #16\n\t"
  63225. "lsr r9, r9, #16\n\t"
  63226. "mul r8, r9, r8\n\t"
  63227. "lsr r9, r8, #16\n\t"
  63228. "lsl r8, r8, #16\n\t"
  63229. "adds r5, r5, r8\n\t"
  63230. "adcs r6, r6, r9\n\t"
  63231. "adc r7, r7, #0\n\t"
  63232. #else
  63233. "umull r8, r9, r10, r12\n\t"
  63234. "adds r5, r5, r8\n\t"
  63235. "adcs r6, r6, r9\n\t"
  63236. "adc r7, r7, #0\n\t"
  63237. #endif
  63238. /* A[3] * A[4] */
  63239. "ldr r10, [%[a], #16]\n\t"
  63240. "ldr r12, [%[a], #12]\n\t"
  63241. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63242. "lsl r8, r10, #16\n\t"
  63243. "lsl r9, r12, #16\n\t"
  63244. "lsr r8, r8, #16\n\t"
  63245. "lsr r9, r9, #16\n\t"
  63246. "mul r9, r8, r9\n\t"
  63247. "adds r5, r5, r9\n\t"
  63248. "adcs r6, r6, #0\n\t"
  63249. "adc r7, r7, #0\n\t"
  63250. "lsr r9, r12, #16\n\t"
  63251. "mul r8, r9, r8\n\t"
  63252. "lsr r9, r8, #16\n\t"
  63253. "lsl r8, r8, #16\n\t"
  63254. "adds r5, r5, r8\n\t"
  63255. "adcs r6, r6, r9\n\t"
  63256. "adc r7, r7, #0\n\t"
  63257. "lsr r8, r10, #16\n\t"
  63258. "lsr r9, r12, #16\n\t"
  63259. "mul r9, r8, r9\n\t"
  63260. "adds r6, r6, r9\n\t"
  63261. "adc r7, r7, #0\n\t"
  63262. "lsl r9, r12, #16\n\t"
  63263. "lsr r9, r9, #16\n\t"
  63264. "mul r8, r9, r8\n\t"
  63265. "lsr r9, r8, #16\n\t"
  63266. "lsl r8, r8, #16\n\t"
  63267. "adds r5, r5, r8\n\t"
  63268. "adcs r6, r6, r9\n\t"
  63269. "adc r7, r7, #0\n\t"
  63270. #else
  63271. "umull r8, r9, r10, r12\n\t"
  63272. "adds r5, r5, r8\n\t"
  63273. "adcs r6, r6, r9\n\t"
  63274. "adc r7, r7, #0\n\t"
  63275. #endif
  63276. "adds r5, r5, r5\n\t"
  63277. "adcs r6, r6, r6\n\t"
  63278. "adc r7, r7, r7\n\t"
  63279. "adds r3, r3, r5\n\t"
  63280. "adcs r4, r4, r6\n\t"
  63281. "adc r2, r2, r7\n\t"
  63282. "str r3, [sp, #28]\n\t"
  63283. /* A[1] * A[7] */
  63284. "ldr r10, [%[a], #28]\n\t"
  63285. "ldr r12, [%[a], #4]\n\t"
  63286. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63287. "lsl r8, r10, #16\n\t"
  63288. "lsl r5, r12, #16\n\t"
  63289. "lsr r8, r8, #16\n\t"
  63290. "lsr r5, r5, #16\n\t"
  63291. "mul r5, r8, r5\n\t"
  63292. "lsr r9, r12, #16\n\t"
  63293. "mul r8, r9, r8\n\t"
  63294. "lsr r6, r8, #16\n\t"
  63295. "lsl r8, r8, #16\n\t"
  63296. "adds r5, r5, r8\n\t"
  63297. "adc r6, r6, #0\n\t"
  63298. "lsr r8, r10, #16\n\t"
  63299. "mul r9, r8, r9\n\t"
  63300. "add r6, r6, r9\n\t"
  63301. "lsl r9, r12, #16\n\t"
  63302. "lsr r9, r9, #16\n\t"
  63303. "mul r8, r9, r8\n\t"
  63304. "lsr r9, r8, #16\n\t"
  63305. "lsl r8, r8, #16\n\t"
  63306. "adds r5, r5, r8\n\t"
  63307. "adc r6, r6, r9\n\t"
  63308. #else
  63309. "umull r5, r6, r10, r12\n\t"
  63310. #endif
  63311. "mov r3, #0\n\t"
  63312. "mov r7, #0\n\t"
  63313. /* A[2] * A[6] */
  63314. "ldr r10, [%[a], #24]\n\t"
  63315. "ldr r12, [%[a], #8]\n\t"
  63316. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63317. "lsl r8, r10, #16\n\t"
  63318. "lsl r9, r12, #16\n\t"
  63319. "lsr r8, r8, #16\n\t"
  63320. "lsr r9, r9, #16\n\t"
  63321. "mul r9, r8, r9\n\t"
  63322. "adds r5, r5, r9\n\t"
  63323. "adcs r6, r6, #0\n\t"
  63324. "adc r7, r7, #0\n\t"
  63325. "lsr r9, r12, #16\n\t"
  63326. "mul r8, r9, r8\n\t"
  63327. "lsr r9, r8, #16\n\t"
  63328. "lsl r8, r8, #16\n\t"
  63329. "adds r5, r5, r8\n\t"
  63330. "adcs r6, r6, r9\n\t"
  63331. "adc r7, r7, #0\n\t"
  63332. "lsr r8, r10, #16\n\t"
  63333. "lsr r9, r12, #16\n\t"
  63334. "mul r9, r8, r9\n\t"
  63335. "adds r6, r6, r9\n\t"
  63336. "adc r7, r7, #0\n\t"
  63337. "lsl r9, r12, #16\n\t"
  63338. "lsr r9, r9, #16\n\t"
  63339. "mul r8, r9, r8\n\t"
  63340. "lsr r9, r8, #16\n\t"
  63341. "lsl r8, r8, #16\n\t"
  63342. "adds r5, r5, r8\n\t"
  63343. "adcs r6, r6, r9\n\t"
  63344. "adc r7, r7, #0\n\t"
  63345. #else
  63346. "umull r8, r9, r10, r12\n\t"
  63347. "adds r5, r5, r8\n\t"
  63348. "adcs r6, r6, r9\n\t"
  63349. "adc r7, r7, #0\n\t"
  63350. #endif
  63351. /* A[3] * A[5] */
  63352. "ldr r10, [%[a], #20]\n\t"
  63353. "ldr r12, [%[a], #12]\n\t"
  63354. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63355. "lsl r8, r10, #16\n\t"
  63356. "lsl r9, r12, #16\n\t"
  63357. "lsr r8, r8, #16\n\t"
  63358. "lsr r9, r9, #16\n\t"
  63359. "mul r9, r8, r9\n\t"
  63360. "adds r5, r5, r9\n\t"
  63361. "adcs r6, r6, #0\n\t"
  63362. "adc r7, r7, #0\n\t"
  63363. "lsr r9, r12, #16\n\t"
  63364. "mul r8, r9, r8\n\t"
  63365. "lsr r9, r8, #16\n\t"
  63366. "lsl r8, r8, #16\n\t"
  63367. "adds r5, r5, r8\n\t"
  63368. "adcs r6, r6, r9\n\t"
  63369. "adc r7, r7, #0\n\t"
  63370. "lsr r8, r10, #16\n\t"
  63371. "lsr r9, r12, #16\n\t"
  63372. "mul r9, r8, r9\n\t"
  63373. "adds r6, r6, r9\n\t"
  63374. "adc r7, r7, #0\n\t"
  63375. "lsl r9, r12, #16\n\t"
  63376. "lsr r9, r9, #16\n\t"
  63377. "mul r8, r9, r8\n\t"
  63378. "lsr r9, r8, #16\n\t"
  63379. "lsl r8, r8, #16\n\t"
  63380. "adds r5, r5, r8\n\t"
  63381. "adcs r6, r6, r9\n\t"
  63382. "adc r7, r7, #0\n\t"
  63383. #else
  63384. "umull r8, r9, r10, r12\n\t"
  63385. "adds r5, r5, r8\n\t"
  63386. "adcs r6, r6, r9\n\t"
  63387. "adc r7, r7, #0\n\t"
  63388. #endif
  63389. /* A[4] * A[4] */
  63390. "ldr r10, [%[a], #16]\n\t"
  63391. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63392. "lsl r8, r10, #16\n\t"
  63393. "lsr r9, r10, #16\n\t"
  63394. "lsr r8, r8, #16\n\t"
  63395. "mov r12, r8\n\t"
  63396. "mul r8, r12, r8\n\t"
  63397. "mov r12, r9\n\t"
  63398. "mul r9, r12, r9\n\t"
  63399. "adds r4, r4, r8\n\t"
  63400. "adcs r2, r2, r9\n\t"
  63401. "adc r3, r3, #0\n\t"
  63402. "lsr r9, r10, #16\n\t"
  63403. "lsl r8, r10, #16\n\t"
  63404. "lsr r8, r8, #16\n\t"
  63405. "mul r8, r9, r8\n\t"
  63406. "lsr r9, r8, #15\n\t"
  63407. "lsl r8, r8, #17\n\t"
  63408. "adds r4, r4, r8\n\t"
  63409. "adcs r2, r2, r9\n\t"
  63410. "adc r3, r3, #0\n\t"
  63411. "adds r5, r5, r5\n\t"
  63412. "adcs r6, r6, r6\n\t"
  63413. "adc r7, r7, r7\n\t"
  63414. #else
  63415. "umull r8, r9, r10, r10\n\t"
  63416. "adds r5, r5, r5\n\t"
  63417. "adcs r6, r6, r6\n\t"
  63418. "adc r7, r7, r7\n\t"
  63419. "adds r4, r4, r8\n\t"
  63420. "adcs r2, r2, r9\n\t"
  63421. "adc r3, r3, #0\n\t"
  63422. #endif
  63423. "adds r4, r4, r5\n\t"
  63424. "adcs r2, r2, r6\n\t"
  63425. "adc r3, r3, r7\n\t"
  63426. "str r4, [%[r], #32]\n\t"
  63427. /* A[2] * A[7] */
  63428. "ldr r10, [%[a], #28]\n\t"
  63429. "ldr r12, [%[a], #8]\n\t"
  63430. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63431. "lsl r8, r10, #16\n\t"
  63432. "lsl r5, r12, #16\n\t"
  63433. "lsr r8, r8, #16\n\t"
  63434. "lsr r5, r5, #16\n\t"
  63435. "mul r5, r8, r5\n\t"
  63436. "lsr r9, r12, #16\n\t"
  63437. "mul r8, r9, r8\n\t"
  63438. "lsr r6, r8, #16\n\t"
  63439. "lsl r8, r8, #16\n\t"
  63440. "adds r5, r5, r8\n\t"
  63441. "adc r6, r6, #0\n\t"
  63442. "lsr r8, r10, #16\n\t"
  63443. "mul r9, r8, r9\n\t"
  63444. "add r6, r6, r9\n\t"
  63445. "lsl r9, r12, #16\n\t"
  63446. "lsr r9, r9, #16\n\t"
  63447. "mul r8, r9, r8\n\t"
  63448. "lsr r9, r8, #16\n\t"
  63449. "lsl r8, r8, #16\n\t"
  63450. "adds r5, r5, r8\n\t"
  63451. "adc r6, r6, r9\n\t"
  63452. #else
  63453. "umull r5, r6, r10, r12\n\t"
  63454. #endif
  63455. "mov r4, #0\n\t"
  63456. "mov r7, #0\n\t"
  63457. /* A[3] * A[6] */
  63458. "ldr r10, [%[a], #24]\n\t"
  63459. "ldr r12, [%[a], #12]\n\t"
  63460. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63461. "lsl r8, r10, #16\n\t"
  63462. "lsl r9, r12, #16\n\t"
  63463. "lsr r8, r8, #16\n\t"
  63464. "lsr r9, r9, #16\n\t"
  63465. "mul r9, r8, r9\n\t"
  63466. "adds r5, r5, r9\n\t"
  63467. "adcs r6, r6, #0\n\t"
  63468. "adc r7, r7, #0\n\t"
  63469. "lsr r9, r12, #16\n\t"
  63470. "mul r8, r9, r8\n\t"
  63471. "lsr r9, r8, #16\n\t"
  63472. "lsl r8, r8, #16\n\t"
  63473. "adds r5, r5, r8\n\t"
  63474. "adcs r6, r6, r9\n\t"
  63475. "adc r7, r7, #0\n\t"
  63476. "lsr r8, r10, #16\n\t"
  63477. "lsr r9, r12, #16\n\t"
  63478. "mul r9, r8, r9\n\t"
  63479. "adds r6, r6, r9\n\t"
  63480. "adc r7, r7, #0\n\t"
  63481. "lsl r9, r12, #16\n\t"
  63482. "lsr r9, r9, #16\n\t"
  63483. "mul r8, r9, r8\n\t"
  63484. "lsr r9, r8, #16\n\t"
  63485. "lsl r8, r8, #16\n\t"
  63486. "adds r5, r5, r8\n\t"
  63487. "adcs r6, r6, r9\n\t"
  63488. "adc r7, r7, #0\n\t"
  63489. #else
  63490. "umull r8, r9, r10, r12\n\t"
  63491. "adds r5, r5, r8\n\t"
  63492. "adcs r6, r6, r9\n\t"
  63493. "adc r7, r7, #0\n\t"
  63494. #endif
  63495. /* A[4] * A[5] */
  63496. "ldr r10, [%[a], #20]\n\t"
  63497. "ldr r12, [%[a], #16]\n\t"
  63498. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63499. "lsl r8, r10, #16\n\t"
  63500. "lsl r9, r12, #16\n\t"
  63501. "lsr r8, r8, #16\n\t"
  63502. "lsr r9, r9, #16\n\t"
  63503. "mul r9, r8, r9\n\t"
  63504. "adds r5, r5, r9\n\t"
  63505. "adcs r6, r6, #0\n\t"
  63506. "adc r7, r7, #0\n\t"
  63507. "lsr r9, r12, #16\n\t"
  63508. "mul r8, r9, r8\n\t"
  63509. "lsr r9, r8, #16\n\t"
  63510. "lsl r8, r8, #16\n\t"
  63511. "adds r5, r5, r8\n\t"
  63512. "adcs r6, r6, r9\n\t"
  63513. "adc r7, r7, #0\n\t"
  63514. "lsr r8, r10, #16\n\t"
  63515. "lsr r9, r12, #16\n\t"
  63516. "mul r9, r8, r9\n\t"
  63517. "adds r6, r6, r9\n\t"
  63518. "adc r7, r7, #0\n\t"
  63519. "lsl r9, r12, #16\n\t"
  63520. "lsr r9, r9, #16\n\t"
  63521. "mul r8, r9, r8\n\t"
  63522. "lsr r9, r8, #16\n\t"
  63523. "lsl r8, r8, #16\n\t"
  63524. "adds r5, r5, r8\n\t"
  63525. "adcs r6, r6, r9\n\t"
  63526. "adc r7, r7, #0\n\t"
  63527. #else
  63528. "umull r8, r9, r10, r12\n\t"
  63529. "adds r5, r5, r8\n\t"
  63530. "adcs r6, r6, r9\n\t"
  63531. "adc r7, r7, #0\n\t"
  63532. #endif
  63533. "adds r5, r5, r5\n\t"
  63534. "adcs r6, r6, r6\n\t"
  63535. "adc r7, r7, r7\n\t"
  63536. "adds r2, r2, r5\n\t"
  63537. "adcs r3, r3, r6\n\t"
  63538. "adc r4, r4, r7\n\t"
  63539. "str r2, [%[r], #36]\n\t"
  63540. /* A[3] * A[7] */
  63541. "ldr r10, [%[a], #28]\n\t"
  63542. "ldr r12, [%[a], #12]\n\t"
  63543. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63544. "lsl r8, r10, #16\n\t"
  63545. "lsl r9, r12, #16\n\t"
  63546. "lsr r8, r8, #16\n\t"
  63547. "lsr r9, r9, #16\n\t"
  63548. "mul r9, r8, r9\n\t"
  63549. "adds r3, r3, r9\n\t"
  63550. "adcs r4, r4, #0\n\t"
  63551. "mov r2, #0\n\t"
  63552. "adc r2, r2, #0\n\t"
  63553. "adds r3, r3, r9\n\t"
  63554. "adcs r4, r4, #0\n\t"
  63555. "adc r2, r2, #0\n\t"
  63556. "lsr r9, r12, #16\n\t"
  63557. "mul r8, r9, r8\n\t"
  63558. "lsr r9, r8, #16\n\t"
  63559. "lsl r8, r8, #16\n\t"
  63560. "adds r3, r3, r8\n\t"
  63561. "adcs r4, r4, r9\n\t"
  63562. "adc r2, r2, #0\n\t"
  63563. "adds r3, r3, r8\n\t"
  63564. "adcs r4, r4, r9\n\t"
  63565. "adc r2, r2, #0\n\t"
  63566. "lsr r8, r10, #16\n\t"
  63567. "lsr r9, r12, #16\n\t"
  63568. "mul r9, r8, r9\n\t"
  63569. "adds r4, r4, r9\n\t"
  63570. "adc r2, r2, #0\n\t"
  63571. "adds r4, r4, r9\n\t"
  63572. "adc r2, r2, #0\n\t"
  63573. "lsl r9, r12, #16\n\t"
  63574. "lsr r9, r9, #16\n\t"
  63575. "mul r8, r9, r8\n\t"
  63576. "lsr r9, r8, #16\n\t"
  63577. "lsl r8, r8, #16\n\t"
  63578. "adds r3, r3, r8\n\t"
  63579. "adcs r4, r4, r9\n\t"
  63580. "adc r2, r2, #0\n\t"
  63581. "adds r3, r3, r8\n\t"
  63582. "adcs r4, r4, r9\n\t"
  63583. "adc r2, r2, #0\n\t"
  63584. #else
  63585. "umull r8, r9, r10, r12\n\t"
  63586. "adds r3, r3, r8\n\t"
  63587. "adcs r4, r4, r9\n\t"
  63588. "mov r2, #0\n\t"
  63589. "adc r2, r2, #0\n\t"
  63590. "adds r3, r3, r8\n\t"
  63591. "adcs r4, r4, r9\n\t"
  63592. "mov r2, #0\n\t"
  63593. "adc r2, r2, #0\n\t"
  63594. #endif
  63595. /* A[4] * A[6] */
  63596. "ldr r10, [%[a], #24]\n\t"
  63597. "ldr r12, [%[a], #16]\n\t"
  63598. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63599. "lsl r8, r10, #16\n\t"
  63600. "lsl r9, r12, #16\n\t"
  63601. "lsr r8, r8, #16\n\t"
  63602. "lsr r9, r9, #16\n\t"
  63603. "mul r9, r8, r9\n\t"
  63604. "adds r3, r3, r9\n\t"
  63605. "adcs r4, r4, #0\n\t"
  63606. "adc r2, r2, #0\n\t"
  63607. "adds r3, r3, r9\n\t"
  63608. "adcs r4, r4, #0\n\t"
  63609. "adc r2, r2, #0\n\t"
  63610. "lsr r9, r12, #16\n\t"
  63611. "mul r8, r9, r8\n\t"
  63612. "lsr r9, r8, #16\n\t"
  63613. "lsl r8, r8, #16\n\t"
  63614. "adds r3, r3, r8\n\t"
  63615. "adcs r4, r4, r9\n\t"
  63616. "adc r2, r2, #0\n\t"
  63617. "adds r3, r3, r8\n\t"
  63618. "adcs r4, r4, r9\n\t"
  63619. "adc r2, r2, #0\n\t"
  63620. "lsr r8, r10, #16\n\t"
  63621. "lsr r9, r12, #16\n\t"
  63622. "mul r9, r8, r9\n\t"
  63623. "adds r4, r4, r9\n\t"
  63624. "adc r2, r2, #0\n\t"
  63625. "adds r4, r4, r9\n\t"
  63626. "adc r2, r2, #0\n\t"
  63627. "lsl r9, r12, #16\n\t"
  63628. "lsr r9, r9, #16\n\t"
  63629. "mul r8, r9, r8\n\t"
  63630. "lsr r9, r8, #16\n\t"
  63631. "lsl r8, r8, #16\n\t"
  63632. "adds r3, r3, r8\n\t"
  63633. "adcs r4, r4, r9\n\t"
  63634. "adc r2, r2, #0\n\t"
  63635. "adds r3, r3, r8\n\t"
  63636. "adcs r4, r4, r9\n\t"
  63637. "adc r2, r2, #0\n\t"
  63638. #else
  63639. "umull r8, r9, r10, r12\n\t"
  63640. "adds r3, r3, r8\n\t"
  63641. "adcs r4, r4, r9\n\t"
  63642. "adc r2, r2, #0\n\t"
  63643. "adds r3, r3, r8\n\t"
  63644. "adcs r4, r4, r9\n\t"
  63645. "adc r2, r2, #0\n\t"
  63646. #endif
  63647. /* A[5] * A[5] */
  63648. "ldr r10, [%[a], #20]\n\t"
  63649. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63650. "lsl r8, r10, #16\n\t"
  63651. "lsr r9, r10, #16\n\t"
  63652. "lsr r8, r8, #16\n\t"
  63653. "mov r12, r8\n\t"
  63654. "mul r8, r12, r8\n\t"
  63655. "mov r12, r9\n\t"
  63656. "mul r9, r12, r9\n\t"
  63657. "adds r3, r3, r8\n\t"
  63658. "adcs r4, r4, r9\n\t"
  63659. "adc r2, r2, #0\n\t"
  63660. "lsr r9, r10, #16\n\t"
  63661. "lsl r8, r10, #16\n\t"
  63662. "lsr r8, r8, #16\n\t"
  63663. "mul r8, r9, r8\n\t"
  63664. "lsr r9, r8, #15\n\t"
  63665. "lsl r8, r8, #17\n\t"
  63666. "adds r3, r3, r8\n\t"
  63667. "adcs r4, r4, r9\n\t"
  63668. "adc r2, r2, #0\n\t"
  63669. #else
  63670. "umull r8, r9, r10, r10\n\t"
  63671. "adds r3, r3, r8\n\t"
  63672. "adcs r4, r4, r9\n\t"
  63673. "adc r2, r2, #0\n\t"
  63674. #endif
  63675. "str r3, [%[r], #40]\n\t"
  63676. /* A[4] * A[7] */
  63677. "ldr r10, [%[a], #28]\n\t"
  63678. "ldr r12, [%[a], #16]\n\t"
  63679. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63680. "lsl r8, r10, #16\n\t"
  63681. "lsl r9, r12, #16\n\t"
  63682. "lsr r8, r8, #16\n\t"
  63683. "lsr r9, r9, #16\n\t"
  63684. "mul r9, r8, r9\n\t"
  63685. "adds r4, r4, r9\n\t"
  63686. "adcs r2, r2, #0\n\t"
  63687. "mov r3, #0\n\t"
  63688. "adc r3, r3, #0\n\t"
  63689. "adds r4, r4, r9\n\t"
  63690. "adcs r2, r2, #0\n\t"
  63691. "adc r3, r3, #0\n\t"
  63692. "lsr r9, r12, #16\n\t"
  63693. "mul r8, r9, r8\n\t"
  63694. "lsr r9, r8, #16\n\t"
  63695. "lsl r8, r8, #16\n\t"
  63696. "adds r4, r4, r8\n\t"
  63697. "adcs r2, r2, r9\n\t"
  63698. "adc r3, r3, #0\n\t"
  63699. "adds r4, r4, r8\n\t"
  63700. "adcs r2, r2, r9\n\t"
  63701. "adc r3, r3, #0\n\t"
  63702. "lsr r8, r10, #16\n\t"
  63703. "lsr r9, r12, #16\n\t"
  63704. "mul r9, r8, r9\n\t"
  63705. "adds r2, r2, r9\n\t"
  63706. "adc r3, r3, #0\n\t"
  63707. "adds r2, r2, r9\n\t"
  63708. "adc r3, r3, #0\n\t"
  63709. "lsl r9, r12, #16\n\t"
  63710. "lsr r9, r9, #16\n\t"
  63711. "mul r8, r9, r8\n\t"
  63712. "lsr r9, r8, #16\n\t"
  63713. "lsl r8, r8, #16\n\t"
  63714. "adds r4, r4, r8\n\t"
  63715. "adcs r2, r2, r9\n\t"
  63716. "adc r3, r3, #0\n\t"
  63717. "adds r4, r4, r8\n\t"
  63718. "adcs r2, r2, r9\n\t"
  63719. "adc r3, r3, #0\n\t"
  63720. #else
  63721. "umull r8, r9, r10, r12\n\t"
  63722. "adds r4, r4, r8\n\t"
  63723. "adcs r2, r2, r9\n\t"
  63724. "mov r3, #0\n\t"
  63725. "adc r3, r3, #0\n\t"
  63726. "adds r4, r4, r8\n\t"
  63727. "adcs r2, r2, r9\n\t"
  63728. "mov r3, #0\n\t"
  63729. "adc r3, r3, #0\n\t"
  63730. #endif
  63731. /* A[5] * A[6] */
  63732. "ldr r10, [%[a], #24]\n\t"
  63733. "ldr r12, [%[a], #20]\n\t"
  63734. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63735. "lsl r8, r10, #16\n\t"
  63736. "lsl r9, r12, #16\n\t"
  63737. "lsr r8, r8, #16\n\t"
  63738. "lsr r9, r9, #16\n\t"
  63739. "mul r9, r8, r9\n\t"
  63740. "adds r4, r4, r9\n\t"
  63741. "adcs r2, r2, #0\n\t"
  63742. "adc r3, r3, #0\n\t"
  63743. "adds r4, r4, r9\n\t"
  63744. "adcs r2, r2, #0\n\t"
  63745. "adc r3, r3, #0\n\t"
  63746. "lsr r9, r12, #16\n\t"
  63747. "mul r8, r9, r8\n\t"
  63748. "lsr r9, r8, #16\n\t"
  63749. "lsl r8, r8, #16\n\t"
  63750. "adds r4, r4, r8\n\t"
  63751. "adcs r2, r2, r9\n\t"
  63752. "adc r3, r3, #0\n\t"
  63753. "adds r4, r4, r8\n\t"
  63754. "adcs r2, r2, r9\n\t"
  63755. "adc r3, r3, #0\n\t"
  63756. "lsr r8, r10, #16\n\t"
  63757. "lsr r9, r12, #16\n\t"
  63758. "mul r9, r8, r9\n\t"
  63759. "adds r2, r2, r9\n\t"
  63760. "adc r3, r3, #0\n\t"
  63761. "adds r2, r2, r9\n\t"
  63762. "adc r3, r3, #0\n\t"
  63763. "lsl r9, r12, #16\n\t"
  63764. "lsr r9, r9, #16\n\t"
  63765. "mul r8, r9, r8\n\t"
  63766. "lsr r9, r8, #16\n\t"
  63767. "lsl r8, r8, #16\n\t"
  63768. "adds r4, r4, r8\n\t"
  63769. "adcs r2, r2, r9\n\t"
  63770. "adc r3, r3, #0\n\t"
  63771. "adds r4, r4, r8\n\t"
  63772. "adcs r2, r2, r9\n\t"
  63773. "adc r3, r3, #0\n\t"
  63774. #else
  63775. "umull r8, r9, r10, r12\n\t"
  63776. "adds r4, r4, r8\n\t"
  63777. "adcs r2, r2, r9\n\t"
  63778. "adc r3, r3, #0\n\t"
  63779. "adds r4, r4, r8\n\t"
  63780. "adcs r2, r2, r9\n\t"
  63781. "adc r3, r3, #0\n\t"
  63782. #endif
  63783. "str r4, [%[r], #44]\n\t"
  63784. /* A[5] * A[7] */
  63785. "ldr r10, [%[a], #28]\n\t"
  63786. "ldr r12, [%[a], #20]\n\t"
  63787. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63788. "lsl r8, r10, #16\n\t"
  63789. "lsl r9, r12, #16\n\t"
  63790. "lsr r8, r8, #16\n\t"
  63791. "lsr r9, r9, #16\n\t"
  63792. "mul r9, r8, r9\n\t"
  63793. "adds r2, r2, r9\n\t"
  63794. "adcs r3, r3, #0\n\t"
  63795. "mov r4, #0\n\t"
  63796. "adc r4, r4, #0\n\t"
  63797. "adds r2, r2, r9\n\t"
  63798. "adcs r3, r3, #0\n\t"
  63799. "adc r4, r4, #0\n\t"
  63800. "lsr r9, r12, #16\n\t"
  63801. "mul r8, r9, r8\n\t"
  63802. "lsr r9, r8, #16\n\t"
  63803. "lsl r8, r8, #16\n\t"
  63804. "adds r2, r2, r8\n\t"
  63805. "adcs r3, r3, r9\n\t"
  63806. "adc r4, r4, #0\n\t"
  63807. "adds r2, r2, r8\n\t"
  63808. "adcs r3, r3, r9\n\t"
  63809. "adc r4, r4, #0\n\t"
  63810. "lsr r8, r10, #16\n\t"
  63811. "lsr r9, r12, #16\n\t"
  63812. "mul r9, r8, r9\n\t"
  63813. "adds r3, r3, r9\n\t"
  63814. "adc r4, r4, #0\n\t"
  63815. "adds r3, r3, r9\n\t"
  63816. "adc r4, r4, #0\n\t"
  63817. "lsl r9, r12, #16\n\t"
  63818. "lsr r9, r9, #16\n\t"
  63819. "mul r8, r9, r8\n\t"
  63820. "lsr r9, r8, #16\n\t"
  63821. "lsl r8, r8, #16\n\t"
  63822. "adds r2, r2, r8\n\t"
  63823. "adcs r3, r3, r9\n\t"
  63824. "adc r4, r4, #0\n\t"
  63825. "adds r2, r2, r8\n\t"
  63826. "adcs r3, r3, r9\n\t"
  63827. "adc r4, r4, #0\n\t"
  63828. #else
  63829. "umull r8, r9, r10, r12\n\t"
  63830. "adds r2, r2, r8\n\t"
  63831. "adcs r3, r3, r9\n\t"
  63832. "mov r4, #0\n\t"
  63833. "adc r4, r4, #0\n\t"
  63834. "adds r2, r2, r8\n\t"
  63835. "adcs r3, r3, r9\n\t"
  63836. "mov r4, #0\n\t"
  63837. "adc r4, r4, #0\n\t"
  63838. #endif
  63839. /* A[6] * A[6] */
  63840. "ldr r10, [%[a], #24]\n\t"
  63841. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63842. "lsl r8, r10, #16\n\t"
  63843. "lsr r9, r10, #16\n\t"
  63844. "lsr r8, r8, #16\n\t"
  63845. "mov r12, r8\n\t"
  63846. "mul r8, r12, r8\n\t"
  63847. "mov r12, r9\n\t"
  63848. "mul r9, r12, r9\n\t"
  63849. "adds r2, r2, r8\n\t"
  63850. "adcs r3, r3, r9\n\t"
  63851. "adc r4, r4, #0\n\t"
  63852. "lsr r9, r10, #16\n\t"
  63853. "lsl r8, r10, #16\n\t"
  63854. "lsr r8, r8, #16\n\t"
  63855. "mul r8, r9, r8\n\t"
  63856. "lsr r9, r8, #15\n\t"
  63857. "lsl r8, r8, #17\n\t"
  63858. "adds r2, r2, r8\n\t"
  63859. "adcs r3, r3, r9\n\t"
  63860. "adc r4, r4, #0\n\t"
  63861. #else
  63862. "umull r8, r9, r10, r10\n\t"
  63863. "adds r2, r2, r8\n\t"
  63864. "adcs r3, r3, r9\n\t"
  63865. "adc r4, r4, #0\n\t"
  63866. #endif
  63867. "str r2, [%[r], #48]\n\t"
  63868. /* A[6] * A[7] */
  63869. "ldr r10, [%[a], #28]\n\t"
  63870. "ldr r12, [%[a], #24]\n\t"
  63871. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63872. "lsl r8, r10, #16\n\t"
  63873. "lsl r9, r12, #16\n\t"
  63874. "lsr r8, r8, #16\n\t"
  63875. "lsr r9, r9, #16\n\t"
  63876. "mul r9, r8, r9\n\t"
  63877. "adds r3, r3, r9\n\t"
  63878. "adcs r4, r4, #0\n\t"
  63879. "mov r2, #0\n\t"
  63880. "adc r2, r2, #0\n\t"
  63881. "adds r3, r3, r9\n\t"
  63882. "adcs r4, r4, #0\n\t"
  63883. "adc r2, r2, #0\n\t"
  63884. "lsr r9, r12, #16\n\t"
  63885. "mul r8, r9, r8\n\t"
  63886. "lsr r9, r8, #16\n\t"
  63887. "lsl r8, r8, #16\n\t"
  63888. "adds r3, r3, r8\n\t"
  63889. "adcs r4, r4, r9\n\t"
  63890. "adc r2, r2, #0\n\t"
  63891. "adds r3, r3, r8\n\t"
  63892. "adcs r4, r4, r9\n\t"
  63893. "adc r2, r2, #0\n\t"
  63894. "lsr r8, r10, #16\n\t"
  63895. "lsr r9, r12, #16\n\t"
  63896. "mul r9, r8, r9\n\t"
  63897. "adds r4, r4, r9\n\t"
  63898. "adc r2, r2, #0\n\t"
  63899. "adds r4, r4, r9\n\t"
  63900. "adc r2, r2, #0\n\t"
  63901. "lsl r9, r12, #16\n\t"
  63902. "lsr r9, r9, #16\n\t"
  63903. "mul r8, r9, r8\n\t"
  63904. "lsr r9, r8, #16\n\t"
  63905. "lsl r8, r8, #16\n\t"
  63906. "adds r3, r3, r8\n\t"
  63907. "adcs r4, r4, r9\n\t"
  63908. "adc r2, r2, #0\n\t"
  63909. "adds r3, r3, r8\n\t"
  63910. "adcs r4, r4, r9\n\t"
  63911. "adc r2, r2, #0\n\t"
  63912. #else
  63913. "umull r8, r9, r10, r12\n\t"
  63914. "adds r3, r3, r8\n\t"
  63915. "adcs r4, r4, r9\n\t"
  63916. "mov r2, #0\n\t"
  63917. "adc r2, r2, #0\n\t"
  63918. "adds r3, r3, r8\n\t"
  63919. "adcs r4, r4, r9\n\t"
  63920. "mov r2, #0\n\t"
  63921. "adc r2, r2, #0\n\t"
  63922. #endif
  63923. "str r3, [%[r], #52]\n\t"
  63924. /* A[7] * A[7] */
  63925. "ldr r10, [%[a], #28]\n\t"
  63926. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  63927. "lsl r8, r10, #16\n\t"
  63928. "lsr r9, r10, #16\n\t"
  63929. "lsr r8, r8, #16\n\t"
  63930. "mov r12, r8\n\t"
  63931. "mul r8, r12, r8\n\t"
  63932. "mov r12, r9\n\t"
  63933. "mul r9, r12, r9\n\t"
  63934. "adds r4, r4, r8\n\t"
  63935. "adc r2, r2, r9\n\t"
  63936. "lsr r9, r10, #16\n\t"
  63937. "lsl r8, r10, #16\n\t"
  63938. "lsr r8, r8, #16\n\t"
  63939. "mul r8, r9, r8\n\t"
  63940. "lsr r9, r8, #15\n\t"
  63941. "lsl r8, r8, #17\n\t"
  63942. "adds r4, r4, r8\n\t"
  63943. "adc r2, r2, r9\n\t"
  63944. #else
  63945. "umull r8, r9, r10, r10\n\t"
  63946. "adds r4, r4, r8\n\t"
  63947. "adc r2, r2, r9\n\t"
  63948. #endif
  63949. "str r4, [%[r], #56]\n\t"
  63950. "str r2, [%[r], #60]\n\t"
  63951. "ldm sp!, {r2, r3, r4, r8}\n\t"
  63952. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  63953. "ldm sp!, {r2, r3, r4, r8}\n\t"
  63954. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  63955. : [r] "+r" (r), [a] "+r" (a)
  63956. :
  63957. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  63958. );
  63959. }
  63960. #endif /* WOLFSSL_SP_SMALL */
  63961. #ifdef WOLFSSL_SP_SMALL
  63962. /* Add b to a into r. (r = a + b)
  63963. *
  63964. * r A single precision integer.
  63965. * a A single precision integer.
  63966. * b A single precision integer.
  63967. */
  63968. static sp_digit sp_256_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  63969. {
  63970. register sp_digit* r asm ("r0") = r_p;
  63971. register const sp_digit* a asm ("r1") = a_p;
  63972. register const sp_digit* b asm ("r2") = b_p;
  63973. __asm__ __volatile__ (
  63974. "mov r3, #0\n\t"
  63975. "add r12, %[a], #32\n\t"
  63976. "\n"
  63977. "L_sp_256_add_8_word_%=: \n\t"
  63978. "adds r3, r3, #-1\n\t"
  63979. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  63980. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  63981. "adcs r4, r4, r8\n\t"
  63982. "adcs r5, r5, r9\n\t"
  63983. "adcs r6, r6, r10\n\t"
  63984. "adcs r7, r7, r11\n\t"
  63985. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  63986. "mov r4, #0\n\t"
  63987. "adc r3, r4, #0\n\t"
  63988. "cmp %[a], r12\n\t"
  63989. "bne L_sp_256_add_8_word_%=\n\t"
  63990. "mov %[r], r3\n\t"
  63991. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  63992. :
  63993. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  63994. );
  63995. return (uint32_t)(size_t)r;
  63996. }
  63997. #else
  63998. /* Add b to a into r. (r = a + b)
  63999. *
  64000. * r A single precision integer.
  64001. * a A single precision integer.
  64002. * b A single precision integer.
  64003. */
  64004. static sp_digit sp_256_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  64005. {
  64006. register sp_digit* r asm ("r0") = r_p;
  64007. register const sp_digit* a asm ("r1") = a_p;
  64008. register const sp_digit* b asm ("r2") = b_p;
  64009. __asm__ __volatile__ (
  64010. "mov r12, #0\n\t"
  64011. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  64012. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  64013. "adds r3, r3, r7\n\t"
  64014. "adcs r4, r4, r8\n\t"
  64015. "adcs r5, r5, r9\n\t"
  64016. "adcs r6, r6, r10\n\t"
  64017. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  64018. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  64019. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  64020. "adcs r3, r3, r7\n\t"
  64021. "adcs r4, r4, r8\n\t"
  64022. "adcs r5, r5, r9\n\t"
  64023. "adcs r6, r6, r10\n\t"
  64024. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  64025. "adc %[r], r12, r12\n\t"
  64026. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  64027. :
  64028. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  64029. );
  64030. return (uint32_t)(size_t)r;
  64031. }
  64032. #endif /* WOLFSSL_SP_SMALL */
  64033. #ifdef WOLFSSL_SP_SMALL
  64034. /* Sub b from a into r. (r = a - b)
  64035. *
  64036. * r A single precision integer.
  64037. * a A single precision integer.
  64038. * b A single precision integer.
  64039. */
  64040. static sp_digit sp_256_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  64041. {
  64042. register sp_digit* r asm ("r0") = r_p;
  64043. register const sp_digit* a asm ("r1") = a_p;
  64044. register const sp_digit* b asm ("r2") = b_p;
  64045. __asm__ __volatile__ (
  64046. "mov r12, #0\n\t"
  64047. "add lr, %[a], #32\n\t"
  64048. "\n"
  64049. "L_sp_256_sub_8_word_%=: \n\t"
  64050. "rsbs r12, r12, #0\n\t"
  64051. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  64052. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  64053. "sbcs r3, r3, r7\n\t"
  64054. "sbcs r4, r4, r8\n\t"
  64055. "sbcs r5, r5, r9\n\t"
  64056. "sbcs r6, r6, r10\n\t"
  64057. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  64058. "sbc r12, r3, r3\n\t"
  64059. "cmp %[a], lr\n\t"
  64060. "bne L_sp_256_sub_8_word_%=\n\t"
  64061. "mov %[r], r12\n\t"
  64062. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  64063. :
  64064. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr"
  64065. );
  64066. return (uint32_t)(size_t)r;
  64067. }
  64068. #else
  64069. /* Sub b from a into r. (r = a - b)
  64070. *
  64071. * r A single precision integer.
  64072. * a A single precision integer.
  64073. * b A single precision integer.
  64074. */
  64075. static sp_digit sp_256_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  64076. {
  64077. register sp_digit* r asm ("r0") = r_p;
  64078. register const sp_digit* a asm ("r1") = a_p;
  64079. register const sp_digit* b asm ("r2") = b_p;
  64080. __asm__ __volatile__ (
  64081. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  64082. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  64083. "subs r3, r3, r7\n\t"
  64084. "sbcs r4, r4, r8\n\t"
  64085. "sbcs r5, r5, r9\n\t"
  64086. "sbcs r6, r6, r10\n\t"
  64087. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  64088. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  64089. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  64090. "sbcs r3, r3, r7\n\t"
  64091. "sbcs r4, r4, r8\n\t"
  64092. "sbcs r5, r5, r9\n\t"
  64093. "sbcs r6, r6, r10\n\t"
  64094. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  64095. "sbc %[r], r6, r6\n\t"
  64096. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  64097. :
  64098. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  64099. );
  64100. return (uint32_t)(size_t)r;
  64101. }
  64102. #endif /* WOLFSSL_SP_SMALL */
  64103. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  64104. *
  64105. * r The resulting Montgomery form number.
  64106. * a The number to convert.
  64107. * m The modulus (prime).
  64108. */
  64109. static int sp_256_mod_mul_norm_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  64110. {
  64111. register sp_digit* r asm ("r0") = r_p;
  64112. register const sp_digit* a asm ("r1") = a_p;
  64113. __asm__ __volatile__ (
  64114. "sub sp, sp, #24\n\t"
  64115. "ldm %[a], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  64116. /* Clear overflow and underflow */
  64117. "mov lr, #0\n\t"
  64118. "mov r10, #0\n\t"
  64119. "# t[0] = 1 1 0 -1 -1 -1 -1 0\n\t"
  64120. "adds r12, r2, r3\n\t"
  64121. "adc lr, lr, #0\n\t"
  64122. "subs r12, r12, r5\n\t"
  64123. "sbc r10, r10, #0\n\t"
  64124. "subs r12, r12, r6\n\t"
  64125. "sbc r10, r10, #0\n\t"
  64126. "subs r12, r12, r7\n\t"
  64127. "sbc r10, r10, #0\n\t"
  64128. "subs r12, r12, r8\n\t"
  64129. "sbc r10, r10, #0\n\t"
  64130. /* Store t[0] */
  64131. "str r12, [sp]\n\t"
  64132. "neg r10, r10\n\t"
  64133. "mov r12, #0\n\t"
  64134. "# t[1] = 0 1 1 0 -1 -1 -1 -1\n\t"
  64135. "adds lr, lr, r3\n\t"
  64136. "adc r12, r12, #0\n\t"
  64137. "adds lr, lr, r4\n\t"
  64138. "adc r12, r12, #0\n\t"
  64139. "subs lr, lr, r10\n\t"
  64140. "sbc r10, r10, r10\n\t"
  64141. "subs lr, lr, r6\n\t"
  64142. "sbc r10, r10, #0\n\t"
  64143. "subs lr, lr, r7\n\t"
  64144. "sbc r10, r10, #0\n\t"
  64145. "subs lr, lr, r8\n\t"
  64146. "sbc r10, r10, #0\n\t"
  64147. "subs lr, lr, r9\n\t"
  64148. "sbc r10, r10, #0\n\t"
  64149. /* Store t[1] */
  64150. "str lr, [sp, #4]\n\t"
  64151. "neg r10, r10\n\t"
  64152. "mov lr, #0\n\t"
  64153. "# t[2] = 0 0 1 1 0 -1 -1 -1\n\t"
  64154. "adds r12, r12, r4\n\t"
  64155. "adc lr, lr, #0\n\t"
  64156. "adds r12, r12, r5\n\t"
  64157. "adc lr, lr, #0\n\t"
  64158. "subs r12, r12, r10\n\t"
  64159. "sbc r10, r10, r10\n\t"
  64160. "subs r12, r12, r7\n\t"
  64161. "sbc r10, r10, #0\n\t"
  64162. "subs r12, r12, r8\n\t"
  64163. "sbc r10, r10, #0\n\t"
  64164. "subs r12, r12, r9\n\t"
  64165. "sbc r10, r10, #0\n\t"
  64166. /* Store t[2] */
  64167. "str r12, [sp, #8]\n\t"
  64168. "neg r10, r10\n\t"
  64169. "mov r12, #0\n\t"
  64170. "# t[3] = -1 -1 0 2 2 1 0 -1\n\t"
  64171. "adds lr, lr, r5\n\t"
  64172. "adc r12, r12, #0\n\t"
  64173. "adds lr, lr, r5\n\t"
  64174. "adc r12, r12, #0\n\t"
  64175. "adds lr, lr, r6\n\t"
  64176. "adc r12, r12, #0\n\t"
  64177. "adds lr, lr, r6\n\t"
  64178. "adc r12, r12, #0\n\t"
  64179. "adds lr, lr, r7\n\t"
  64180. "adc r12, r12, #0\n\t"
  64181. "subs lr, lr, r10\n\t"
  64182. "sbc r10, r10, r10\n\t"
  64183. "subs lr, lr, r2\n\t"
  64184. "sbc r10, r10, #0\n\t"
  64185. "subs lr, lr, r3\n\t"
  64186. "sbc r10, r10, #0\n\t"
  64187. "subs lr, lr, r9\n\t"
  64188. "sbc r10, r10, #0\n\t"
  64189. /* Store t[3] */
  64190. "str lr, [sp, #12]\n\t"
  64191. "neg r10, r10\n\t"
  64192. "mov lr, #0\n\t"
  64193. "# t[4] = 0 -1 -1 0 2 2 1 0\n\t"
  64194. "adds r12, r12, r6\n\t"
  64195. "adc lr, lr, #0\n\t"
  64196. "adds r12, r12, r6\n\t"
  64197. "adc lr, lr, #0\n\t"
  64198. "adds r12, r12, r7\n\t"
  64199. "adc lr, lr, #0\n\t"
  64200. "adds r12, r12, r7\n\t"
  64201. "adc lr, lr, #0\n\t"
  64202. "adds r12, r12, r8\n\t"
  64203. "adc lr, lr, #0\n\t"
  64204. "subs r12, r12, r10\n\t"
  64205. "sbc r10, r10, r10\n\t"
  64206. "subs r12, r12, r3\n\t"
  64207. "sbc r10, r10, #0\n\t"
  64208. "subs r12, r12, r4\n\t"
  64209. "sbc r10, r10, #0\n\t"
  64210. /* Store t[4] */
  64211. "str r12, [sp, #16]\n\t"
  64212. "neg r10, r10\n\t"
  64213. "mov r12, #0\n\t"
  64214. "# t[5] = 0 0 -1 -1 0 2 2 1\n\t"
  64215. "adds lr, lr, r7\n\t"
  64216. "adc r12, r12, #0\n\t"
  64217. "adds lr, lr, r7\n\t"
  64218. "adc r12, r12, #0\n\t"
  64219. "adds lr, lr, r8\n\t"
  64220. "adc r12, r12, #0\n\t"
  64221. "adds lr, lr, r8\n\t"
  64222. "adc r12, r12, #0\n\t"
  64223. "adds lr, lr, r9\n\t"
  64224. "adc r12, r12, #0\n\t"
  64225. "subs lr, lr, r10\n\t"
  64226. "sbc r10, r10, r10\n\t"
  64227. "subs lr, lr, r4\n\t"
  64228. "sbc r10, r10, #0\n\t"
  64229. "subs lr, lr, r5\n\t"
  64230. "sbc r10, r10, #0\n\t"
  64231. /* Store t[5] */
  64232. "str lr, [sp, #20]\n\t"
  64233. "neg r10, r10\n\t"
  64234. "mov lr, #0\n\t"
  64235. "# t[6] = -1 -1 0 0 0 1 3 2\n\t"
  64236. "adds r12, r12, r7\n\t"
  64237. "adc lr, lr, #0\n\t"
  64238. "adds r12, r12, r8\n\t"
  64239. "adc lr, lr, #0\n\t"
  64240. "adds r12, r12, r8\n\t"
  64241. "adc lr, lr, #0\n\t"
  64242. "adds r12, r12, r8\n\t"
  64243. "adc lr, lr, #0\n\t"
  64244. "adds r12, r12, r9\n\t"
  64245. "adc lr, lr, #0\n\t"
  64246. "adds r12, r12, r9\n\t"
  64247. "adc lr, lr, #0\n\t"
  64248. "subs r12, r12, r10\n\t"
  64249. "sbc r10, r10, r10\n\t"
  64250. "subs r12, r12, r2\n\t"
  64251. "sbc r10, r10, #0\n\t"
  64252. "subs r12, r12, r3\n\t"
  64253. "sbc r10, r10, #0\n\t"
  64254. /* Store t[6] */
  64255. "mov r8, r12\n\t"
  64256. "neg r10, r10\n\t"
  64257. "mov r12, #0\n\t"
  64258. "# t[7] = 1 0 -1 -1 -1 -1 0 3\n\t"
  64259. "adds lr, lr, r2\n\t"
  64260. "adc r12, r12, #0\n\t"
  64261. "adds lr, lr, r9\n\t"
  64262. "adc r12, r12, #0\n\t"
  64263. "adds lr, lr, r9\n\t"
  64264. "adc r12, r12, #0\n\t"
  64265. "adds lr, lr, r9\n\t"
  64266. "adc r12, r12, #0\n\t"
  64267. "subs lr, lr, r10\n\t"
  64268. "sbc r10, r10, r10\n\t"
  64269. "subs lr, lr, r4\n\t"
  64270. "sbc r10, r10, #0\n\t"
  64271. "subs lr, lr, r5\n\t"
  64272. "sbc r10, r10, #0\n\t"
  64273. "subs lr, lr, r6\n\t"
  64274. "sbc r10, r10, #0\n\t"
  64275. "subs lr, lr, r7\n\t"
  64276. "sbc r10, r10, #0\n\t"
  64277. /* Store t[7] */
  64278. /* Load intermediate */
  64279. "ldm sp, {r2, r3, r4, r5, r6, r7}\n\t"
  64280. "neg r10, r10\n\t"
  64281. /* Add overflow */
  64282. /* Subtract underflow - add neg underflow */
  64283. "adds r2, r2, r12\n\t"
  64284. "adcs r3, r3, #0\n\t"
  64285. "adcs r4, r4, #0\n\t"
  64286. "adcs r5, r5, r10\n\t"
  64287. "adcs r6, r6, #0\n\t"
  64288. "adcs r7, r7, #0\n\t"
  64289. "adcs r8, r8, r10\n\t"
  64290. "adc lr, lr, r12\n\t"
  64291. /* Subtract overflow */
  64292. /* Add underflow - subtract neg underflow */
  64293. "subs r2, r2, r10\n\t"
  64294. "sbcs r3, r3, #0\n\t"
  64295. "sbcs r4, r4, #0\n\t"
  64296. "sbcs r5, r5, r12\n\t"
  64297. "sbcs r6, r6, #0\n\t"
  64298. "sbcs r7, r7, #0\n\t"
  64299. "sbcs r8, r8, r12\n\t"
  64300. "sbc lr, lr, r10\n\t"
  64301. /* Store result */
  64302. "stm %[r], {r2, r3, r4, r5, r6, r7, r8, lr}\n\t"
  64303. "mov %[r], #0\n\t"
  64304. "add sp, sp, #24\n\t"
  64305. : [r] "+r" (r), [a] "+r" (a)
  64306. :
  64307. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10"
  64308. );
  64309. (void)m_p;
  64310. return (uint32_t)(size_t)r;
  64311. }
  64312. /* Convert an mp_int to an array of sp_digit.
  64313. *
  64314. * r A single precision integer.
  64315. * size Maximum number of bytes to convert
  64316. * a A multi-precision integer.
  64317. */
  64318. static void sp_256_from_mp(sp_digit* r, int size, const mp_int* a)
  64319. {
  64320. #if DIGIT_BIT == 32
  64321. int i;
  64322. int j = 0;
  64323. for (i = 0; i < size; i++) {
  64324. sp_digit mask =
  64325. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  64326. r[i] = a->dp[j] & mask;
  64327. j += (int)(((sp_digit)1) -
  64328. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  64329. }
  64330. #elif DIGIT_BIT > 32
  64331. int i;
  64332. int j = 0;
  64333. word32 s = 0;
  64334. r[0] = 0;
  64335. for (i = 0; i < a->used && j < size; i++) {
  64336. r[j] |= ((sp_digit)a->dp[i] << s);
  64337. r[j] &= 0xffffffff;
  64338. s = 32U - s;
  64339. if (j + 1 >= size) {
  64340. break;
  64341. }
  64342. /* lint allow cast of mismatch word32 and mp_digit */
  64343. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  64344. while ((s + 32U) <= (word32)DIGIT_BIT) {
  64345. s += 32U;
  64346. r[j] &= 0xffffffff;
  64347. if (j + 1 >= size) {
  64348. break;
  64349. }
  64350. if (s < (word32)DIGIT_BIT) {
  64351. /* lint allow cast of mismatch word32 and mp_digit */
  64352. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  64353. }
  64354. else {
  64355. r[++j] = (sp_digit)0;
  64356. }
  64357. }
  64358. s = (word32)DIGIT_BIT - s;
  64359. }
  64360. for (j++; j < size; j++) {
  64361. r[j] = 0;
  64362. }
  64363. #else
  64364. int i;
  64365. int j = 0;
  64366. int s = 0;
  64367. r[0] = 0;
  64368. for (i = 0; i < a->used && j < size; i++) {
  64369. r[j] |= ((sp_digit)a->dp[i]) << s;
  64370. if (s + DIGIT_BIT >= 32) {
  64371. r[j] &= 0xffffffff;
  64372. if (j + 1 >= size) {
  64373. break;
  64374. }
  64375. s = 32 - s;
  64376. if (s == DIGIT_BIT) {
  64377. r[++j] = 0;
  64378. s = 0;
  64379. }
  64380. else {
  64381. r[++j] = a->dp[i] >> s;
  64382. s = DIGIT_BIT - s;
  64383. }
  64384. }
  64385. else {
  64386. s += DIGIT_BIT;
  64387. }
  64388. }
  64389. for (j++; j < size; j++) {
  64390. r[j] = 0;
  64391. }
  64392. #endif
  64393. }
  64394. /* Convert a point of type ecc_point to type sp_point_256.
  64395. *
  64396. * p Point of type sp_point_256 (result).
  64397. * pm Point of type ecc_point.
  64398. */
  64399. static void sp_256_point_from_ecc_point_8(sp_point_256* p,
  64400. const ecc_point* pm)
  64401. {
  64402. XMEMSET(p->x, 0, sizeof(p->x));
  64403. XMEMSET(p->y, 0, sizeof(p->y));
  64404. XMEMSET(p->z, 0, sizeof(p->z));
  64405. sp_256_from_mp(p->x, 8, pm->x);
  64406. sp_256_from_mp(p->y, 8, pm->y);
  64407. sp_256_from_mp(p->z, 8, pm->z);
  64408. p->infinity = 0;
  64409. }
  64410. /* Convert an array of sp_digit to an mp_int.
  64411. *
  64412. * a A single precision integer.
  64413. * r A multi-precision integer.
  64414. */
  64415. static int sp_256_to_mp(const sp_digit* a, mp_int* r)
  64416. {
  64417. int err;
  64418. err = mp_grow(r, (256 + DIGIT_BIT - 1) / DIGIT_BIT);
  64419. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  64420. #if DIGIT_BIT == 32
  64421. XMEMCPY(r->dp, a, sizeof(sp_digit) * 8);
  64422. r->used = 8;
  64423. mp_clamp(r);
  64424. #elif DIGIT_BIT < 32
  64425. int i;
  64426. int j = 0;
  64427. int s = 0;
  64428. r->dp[0] = 0;
  64429. for (i = 0; i < 8; i++) {
  64430. r->dp[j] |= (mp_digit)(a[i] << s);
  64431. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  64432. s = DIGIT_BIT - s;
  64433. r->dp[++j] = (mp_digit)(a[i] >> s);
  64434. while (s + DIGIT_BIT <= 32) {
  64435. s += DIGIT_BIT;
  64436. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  64437. if (s == SP_WORD_SIZE) {
  64438. r->dp[j] = 0;
  64439. }
  64440. else {
  64441. r->dp[j] = (mp_digit)(a[i] >> s);
  64442. }
  64443. }
  64444. s = 32 - s;
  64445. }
  64446. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  64447. mp_clamp(r);
  64448. #else
  64449. int i;
  64450. int j = 0;
  64451. int s = 0;
  64452. r->dp[0] = 0;
  64453. for (i = 0; i < 8; i++) {
  64454. r->dp[j] |= ((mp_digit)a[i]) << s;
  64455. if (s + 32 >= DIGIT_BIT) {
  64456. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  64457. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  64458. #endif
  64459. s = DIGIT_BIT - s;
  64460. r->dp[++j] = a[i] >> s;
  64461. s = 32 - s;
  64462. }
  64463. else {
  64464. s += 32;
  64465. }
  64466. }
  64467. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  64468. mp_clamp(r);
  64469. #endif
  64470. }
  64471. return err;
  64472. }
  64473. /* Convert a point of type sp_point_256 to type ecc_point.
  64474. *
  64475. * p Point of type sp_point_256.
  64476. * pm Point of type ecc_point (result).
  64477. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  64478. * MP_OKAY.
  64479. */
  64480. static int sp_256_point_to_ecc_point_8(const sp_point_256* p, ecc_point* pm)
  64481. {
  64482. int err;
  64483. err = sp_256_to_mp(p->x, pm->x);
  64484. if (err == MP_OKAY) {
  64485. err = sp_256_to_mp(p->y, pm->y);
  64486. }
  64487. if (err == MP_OKAY) {
  64488. err = sp_256_to_mp(p->z, pm->z);
  64489. }
  64490. return err;
  64491. }
  64492. /* Multiply two Montgomery form numbers mod the modulus (prime).
  64493. * (r = a * b mod m)
  64494. *
  64495. * r Result of multiplication.
  64496. * a First number to multiply in Montgomery form.
  64497. * b Second number to multiply in Montgomery form.
  64498. * m Modulus (prime).
  64499. * mp Montgomery mulitplier.
  64500. */
  64501. static SP_NOINLINE void sp_256_mont_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p, sp_digit mp_p)
  64502. {
  64503. register sp_digit* r asm ("r0") = r_p;
  64504. register const sp_digit* a asm ("r1") = a_p;
  64505. register const sp_digit* b asm ("r2") = b_p;
  64506. __asm__ __volatile__ (
  64507. "sub sp, sp, #0x44\n\t"
  64508. "mov r5, #0\n\t"
  64509. /* A[0] * B[0] */
  64510. "ldr r6, [%[a]]\n\t"
  64511. "ldr r7, [%[b]]\n\t"
  64512. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64513. "lsl r3, r6, #16\n\t"
  64514. "lsl r8, r7, #16\n\t"
  64515. "lsr r3, r3, #16\n\t"
  64516. "lsr r8, r8, #16\n\t"
  64517. "mul r8, r3, r8\n\t"
  64518. "lsr r4, r7, #16\n\t"
  64519. "mul r3, r4, r3\n\t"
  64520. "lsr r9, r3, #16\n\t"
  64521. "lsl r3, r3, #16\n\t"
  64522. "adds r8, r8, r3\n\t"
  64523. "adc r9, r9, #0\n\t"
  64524. "lsr r3, r6, #16\n\t"
  64525. "mul r4, r3, r4\n\t"
  64526. "add r9, r9, r4\n\t"
  64527. "lsl r4, r7, #16\n\t"
  64528. "lsr r4, r4, #16\n\t"
  64529. "mul r3, r4, r3\n\t"
  64530. "lsr r4, r3, #16\n\t"
  64531. "lsl r3, r3, #16\n\t"
  64532. "adds r8, r8, r3\n\t"
  64533. "adc r9, r9, r4\n\t"
  64534. #else
  64535. "umull r8, r9, r6, r7\n\t"
  64536. #endif
  64537. "str r8, [sp]\n\t"
  64538. /* A[0] * B[1] */
  64539. "ldr r7, [%[b], #4]\n\t"
  64540. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64541. "lsl r3, r6, #16\n\t"
  64542. "lsl r4, r7, #16\n\t"
  64543. "lsr r3, r3, #16\n\t"
  64544. "lsr r4, r4, #16\n\t"
  64545. "mul r4, r3, r4\n\t"
  64546. "mov r10, #0\n\t"
  64547. "adds r9, r9, r4\n\t"
  64548. "adc r10, r10, #0\n\t"
  64549. "lsr r4, r7, #16\n\t"
  64550. "mul r3, r4, r3\n\t"
  64551. "lsr r4, r3, #16\n\t"
  64552. "lsl r3, r3, #16\n\t"
  64553. "adds r9, r9, r3\n\t"
  64554. "adc r10, r10, r4\n\t"
  64555. "lsr r3, r6, #16\n\t"
  64556. "lsr r4, r7, #16\n\t"
  64557. "mul r4, r3, r4\n\t"
  64558. "add r10, r10, r4\n\t"
  64559. "lsl r4, r7, #16\n\t"
  64560. "lsr r4, r4, #16\n\t"
  64561. "mul r3, r4, r3\n\t"
  64562. "lsr r4, r3, #16\n\t"
  64563. "lsl r3, r3, #16\n\t"
  64564. "adds r9, r9, r3\n\t"
  64565. "adc r10, r10, r4\n\t"
  64566. #else
  64567. "umull r3, r4, r6, r7\n\t"
  64568. "adds r9, r9, r3\n\t"
  64569. "adc r10, r4, #0\n\t"
  64570. #endif
  64571. /* A[1] * B[0] */
  64572. "ldr r6, [%[a], #4]\n\t"
  64573. "ldr r7, [%[b]]\n\t"
  64574. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64575. "lsl r3, r6, #16\n\t"
  64576. "lsl r4, r7, #16\n\t"
  64577. "lsr r3, r3, #16\n\t"
  64578. "lsr r4, r4, #16\n\t"
  64579. "mul r4, r3, r4\n\t"
  64580. "adds r9, r9, r4\n\t"
  64581. "adcs r10, r10, #0\n\t"
  64582. "adc lr, r5, #0\n\t"
  64583. "lsr r4, r7, #16\n\t"
  64584. "mul r3, r4, r3\n\t"
  64585. "lsr r4, r3, #16\n\t"
  64586. "lsl r3, r3, #16\n\t"
  64587. "adds r9, r9, r3\n\t"
  64588. "adcs r10, r10, r4\n\t"
  64589. "adc lr, lr, #0\n\t"
  64590. "lsr r3, r6, #16\n\t"
  64591. "lsr r4, r7, #16\n\t"
  64592. "mul r4, r3, r4\n\t"
  64593. "adds r10, r10, r4\n\t"
  64594. "adc lr, lr, #0\n\t"
  64595. "lsl r4, r7, #16\n\t"
  64596. "lsr r4, r4, #16\n\t"
  64597. "mul r3, r4, r3\n\t"
  64598. "lsr r4, r3, #16\n\t"
  64599. "lsl r3, r3, #16\n\t"
  64600. "adds r9, r9, r3\n\t"
  64601. "adcs r10, r10, r4\n\t"
  64602. "adc lr, lr, #0\n\t"
  64603. #else
  64604. "umull r3, r4, r6, r7\n\t"
  64605. "adds r9, r9, r3\n\t"
  64606. "adcs r10, r4, r10\n\t"
  64607. "adc lr, r5, #0\n\t"
  64608. #endif
  64609. "str r9, [sp, #4]\n\t"
  64610. /* A[2] * B[0] */
  64611. "ldr r6, [%[a], #8]\n\t"
  64612. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64613. "lsl r3, r6, #16\n\t"
  64614. "lsl r4, r7, #16\n\t"
  64615. "lsr r3, r3, #16\n\t"
  64616. "lsr r4, r4, #16\n\t"
  64617. "mul r4, r3, r4\n\t"
  64618. "adds r10, r10, r4\n\t"
  64619. "adc lr, lr, #0\n\t"
  64620. "lsr r4, r7, #16\n\t"
  64621. "mul r3, r4, r3\n\t"
  64622. "lsr r4, r3, #16\n\t"
  64623. "lsl r3, r3, #16\n\t"
  64624. "adds r10, r10, r3\n\t"
  64625. "adc lr, lr, r4\n\t"
  64626. "lsr r3, r6, #16\n\t"
  64627. "lsr r4, r7, #16\n\t"
  64628. "mul r4, r3, r4\n\t"
  64629. "add lr, lr, r4\n\t"
  64630. "lsl r4, r7, #16\n\t"
  64631. "lsr r4, r4, #16\n\t"
  64632. "mul r3, r4, r3\n\t"
  64633. "lsr r4, r3, #16\n\t"
  64634. "lsl r3, r3, #16\n\t"
  64635. "adds r10, r10, r3\n\t"
  64636. "adc lr, lr, r4\n\t"
  64637. #else
  64638. "umull r3, r4, r6, r7\n\t"
  64639. "adds r10, r10, r3\n\t"
  64640. "adc lr, r4, lr\n\t"
  64641. #endif
  64642. /* A[1] * B[1] */
  64643. "ldr r6, [%[a], #4]\n\t"
  64644. "ldr r7, [%[b], #4]\n\t"
  64645. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64646. "lsl r3, r6, #16\n\t"
  64647. "lsl r4, r7, #16\n\t"
  64648. "lsr r3, r3, #16\n\t"
  64649. "lsr r4, r4, #16\n\t"
  64650. "mul r4, r3, r4\n\t"
  64651. "adds r10, r10, r4\n\t"
  64652. "adcs lr, lr, #0\n\t"
  64653. "adc r8, r5, #0\n\t"
  64654. "lsr r4, r7, #16\n\t"
  64655. "mul r3, r4, r3\n\t"
  64656. "lsr r4, r3, #16\n\t"
  64657. "lsl r3, r3, #16\n\t"
  64658. "adds r10, r10, r3\n\t"
  64659. "adcs lr, lr, r4\n\t"
  64660. "adc r8, r8, #0\n\t"
  64661. "lsr r3, r6, #16\n\t"
  64662. "lsr r4, r7, #16\n\t"
  64663. "mul r4, r3, r4\n\t"
  64664. "adds lr, lr, r4\n\t"
  64665. "adc r8, r8, #0\n\t"
  64666. "lsl r4, r7, #16\n\t"
  64667. "lsr r4, r4, #16\n\t"
  64668. "mul r3, r4, r3\n\t"
  64669. "lsr r4, r3, #16\n\t"
  64670. "lsl r3, r3, #16\n\t"
  64671. "adds r10, r10, r3\n\t"
  64672. "adcs lr, lr, r4\n\t"
  64673. "adc r8, r8, #0\n\t"
  64674. #else
  64675. "umull r3, r4, r6, r7\n\t"
  64676. "adds r10, r10, r3\n\t"
  64677. "adcs lr, r4, lr\n\t"
  64678. "adc r8, r5, #0\n\t"
  64679. #endif
  64680. /* A[0] * B[2] */
  64681. "ldr r6, [%[a]]\n\t"
  64682. "ldr r7, [%[b], #8]\n\t"
  64683. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64684. "lsl r3, r6, #16\n\t"
  64685. "lsl r4, r7, #16\n\t"
  64686. "lsr r3, r3, #16\n\t"
  64687. "lsr r4, r4, #16\n\t"
  64688. "mul r4, r3, r4\n\t"
  64689. "adds r10, r10, r4\n\t"
  64690. "adcs lr, lr, #0\n\t"
  64691. "adc r8, r5, r8\n\t"
  64692. "lsr r4, r7, #16\n\t"
  64693. "mul r3, r4, r3\n\t"
  64694. "lsr r4, r3, #16\n\t"
  64695. "lsl r3, r3, #16\n\t"
  64696. "adds r10, r10, r3\n\t"
  64697. "adcs lr, lr, r4\n\t"
  64698. "adc r8, r8, #0\n\t"
  64699. "lsr r3, r6, #16\n\t"
  64700. "lsr r4, r7, #16\n\t"
  64701. "mul r4, r3, r4\n\t"
  64702. "adds lr, lr, r4\n\t"
  64703. "adc r8, r8, #0\n\t"
  64704. "lsl r4, r7, #16\n\t"
  64705. "lsr r4, r4, #16\n\t"
  64706. "mul r3, r4, r3\n\t"
  64707. "lsr r4, r3, #16\n\t"
  64708. "lsl r3, r3, #16\n\t"
  64709. "adds r10, r10, r3\n\t"
  64710. "adcs lr, lr, r4\n\t"
  64711. "adc r8, r8, #0\n\t"
  64712. #else
  64713. "umull r3, r4, r6, r7\n\t"
  64714. "adds r10, r10, r3\n\t"
  64715. "adcs lr, r4, lr\n\t"
  64716. "adc r8, r5, r8\n\t"
  64717. #endif
  64718. "str r10, [sp, #8]\n\t"
  64719. /* A[0] * B[3] */
  64720. "ldr r7, [%[b], #12]\n\t"
  64721. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64722. "lsl r3, r6, #16\n\t"
  64723. "lsl r4, r7, #16\n\t"
  64724. "lsr r3, r3, #16\n\t"
  64725. "lsr r4, r4, #16\n\t"
  64726. "mul r4, r3, r4\n\t"
  64727. "adds lr, lr, r4\n\t"
  64728. "adcs r8, r8, #0\n\t"
  64729. "adc r9, r5, #0\n\t"
  64730. "lsr r4, r7, #16\n\t"
  64731. "mul r3, r4, r3\n\t"
  64732. "lsr r4, r3, #16\n\t"
  64733. "lsl r3, r3, #16\n\t"
  64734. "adds lr, lr, r3\n\t"
  64735. "adcs r8, r8, r4\n\t"
  64736. "adc r9, r9, #0\n\t"
  64737. "lsr r3, r6, #16\n\t"
  64738. "lsr r4, r7, #16\n\t"
  64739. "mul r4, r3, r4\n\t"
  64740. "adds r8, r8, r4\n\t"
  64741. "adc r9, r9, #0\n\t"
  64742. "lsl r4, r7, #16\n\t"
  64743. "lsr r4, r4, #16\n\t"
  64744. "mul r3, r4, r3\n\t"
  64745. "lsr r4, r3, #16\n\t"
  64746. "lsl r3, r3, #16\n\t"
  64747. "adds lr, lr, r3\n\t"
  64748. "adcs r8, r8, r4\n\t"
  64749. "adc r9, r9, #0\n\t"
  64750. #else
  64751. "umull r3, r4, r6, r7\n\t"
  64752. "adds lr, lr, r3\n\t"
  64753. "adcs r8, r4, r8\n\t"
  64754. "adc r9, r5, #0\n\t"
  64755. #endif
  64756. /* A[1] * B[2] */
  64757. "ldr r6, [%[a], #4]\n\t"
  64758. "ldr r7, [%[b], #8]\n\t"
  64759. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64760. "lsl r3, r6, #16\n\t"
  64761. "lsl r4, r7, #16\n\t"
  64762. "lsr r3, r3, #16\n\t"
  64763. "lsr r4, r4, #16\n\t"
  64764. "mul r4, r3, r4\n\t"
  64765. "adds lr, lr, r4\n\t"
  64766. "adcs r8, r8, #0\n\t"
  64767. "adc r9, r5, r9\n\t"
  64768. "lsr r4, r7, #16\n\t"
  64769. "mul r3, r4, r3\n\t"
  64770. "lsr r4, r3, #16\n\t"
  64771. "lsl r3, r3, #16\n\t"
  64772. "adds lr, lr, r3\n\t"
  64773. "adcs r8, r8, r4\n\t"
  64774. "adc r9, r9, #0\n\t"
  64775. "lsr r3, r6, #16\n\t"
  64776. "lsr r4, r7, #16\n\t"
  64777. "mul r4, r3, r4\n\t"
  64778. "adds r8, r8, r4\n\t"
  64779. "adc r9, r9, #0\n\t"
  64780. "lsl r4, r7, #16\n\t"
  64781. "lsr r4, r4, #16\n\t"
  64782. "mul r3, r4, r3\n\t"
  64783. "lsr r4, r3, #16\n\t"
  64784. "lsl r3, r3, #16\n\t"
  64785. "adds lr, lr, r3\n\t"
  64786. "adcs r8, r8, r4\n\t"
  64787. "adc r9, r9, #0\n\t"
  64788. #else
  64789. "umull r3, r4, r6, r7\n\t"
  64790. "adds lr, lr, r3\n\t"
  64791. "adcs r8, r4, r8\n\t"
  64792. "adc r9, r5, r9\n\t"
  64793. #endif
  64794. /* A[2] * B[1] */
  64795. "ldr r6, [%[a], #8]\n\t"
  64796. "ldr r7, [%[b], #4]\n\t"
  64797. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64798. "lsl r3, r6, #16\n\t"
  64799. "lsl r4, r7, #16\n\t"
  64800. "lsr r3, r3, #16\n\t"
  64801. "lsr r4, r4, #16\n\t"
  64802. "mul r4, r3, r4\n\t"
  64803. "adds lr, lr, r4\n\t"
  64804. "adcs r8, r8, #0\n\t"
  64805. "adc r9, r5, r9\n\t"
  64806. "lsr r4, r7, #16\n\t"
  64807. "mul r3, r4, r3\n\t"
  64808. "lsr r4, r3, #16\n\t"
  64809. "lsl r3, r3, #16\n\t"
  64810. "adds lr, lr, r3\n\t"
  64811. "adcs r8, r8, r4\n\t"
  64812. "adc r9, r9, #0\n\t"
  64813. "lsr r3, r6, #16\n\t"
  64814. "lsr r4, r7, #16\n\t"
  64815. "mul r4, r3, r4\n\t"
  64816. "adds r8, r8, r4\n\t"
  64817. "adc r9, r9, #0\n\t"
  64818. "lsl r4, r7, #16\n\t"
  64819. "lsr r4, r4, #16\n\t"
  64820. "mul r3, r4, r3\n\t"
  64821. "lsr r4, r3, #16\n\t"
  64822. "lsl r3, r3, #16\n\t"
  64823. "adds lr, lr, r3\n\t"
  64824. "adcs r8, r8, r4\n\t"
  64825. "adc r9, r9, #0\n\t"
  64826. #else
  64827. "umull r3, r4, r6, r7\n\t"
  64828. "adds lr, lr, r3\n\t"
  64829. "adcs r8, r4, r8\n\t"
  64830. "adc r9, r5, r9\n\t"
  64831. #endif
  64832. /* A[3] * B[0] */
  64833. "ldr r6, [%[a], #12]\n\t"
  64834. "ldr r7, [%[b]]\n\t"
  64835. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64836. "lsl r3, r6, #16\n\t"
  64837. "lsl r4, r7, #16\n\t"
  64838. "lsr r3, r3, #16\n\t"
  64839. "lsr r4, r4, #16\n\t"
  64840. "mul r4, r3, r4\n\t"
  64841. "adds lr, lr, r4\n\t"
  64842. "adcs r8, r8, #0\n\t"
  64843. "adc r9, r5, r9\n\t"
  64844. "lsr r4, r7, #16\n\t"
  64845. "mul r3, r4, r3\n\t"
  64846. "lsr r4, r3, #16\n\t"
  64847. "lsl r3, r3, #16\n\t"
  64848. "adds lr, lr, r3\n\t"
  64849. "adcs r8, r8, r4\n\t"
  64850. "adc r9, r9, #0\n\t"
  64851. "lsr r3, r6, #16\n\t"
  64852. "lsr r4, r7, #16\n\t"
  64853. "mul r4, r3, r4\n\t"
  64854. "adds r8, r8, r4\n\t"
  64855. "adc r9, r9, #0\n\t"
  64856. "lsl r4, r7, #16\n\t"
  64857. "lsr r4, r4, #16\n\t"
  64858. "mul r3, r4, r3\n\t"
  64859. "lsr r4, r3, #16\n\t"
  64860. "lsl r3, r3, #16\n\t"
  64861. "adds lr, lr, r3\n\t"
  64862. "adcs r8, r8, r4\n\t"
  64863. "adc r9, r9, #0\n\t"
  64864. #else
  64865. "umull r3, r4, r6, r7\n\t"
  64866. "adds lr, lr, r3\n\t"
  64867. "adcs r8, r4, r8\n\t"
  64868. "adc r9, r5, r9\n\t"
  64869. #endif
  64870. "str lr, [sp, #12]\n\t"
  64871. /* A[4] * B[0] */
  64872. "ldr r6, [%[a], #16]\n\t"
  64873. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64874. "lsl r3, r6, #16\n\t"
  64875. "lsl r4, r7, #16\n\t"
  64876. "lsr r3, r3, #16\n\t"
  64877. "lsr r4, r4, #16\n\t"
  64878. "mul r4, r3, r4\n\t"
  64879. "adds r8, r8, r4\n\t"
  64880. "adcs r9, r9, #0\n\t"
  64881. "adc r10, r5, #0\n\t"
  64882. "lsr r4, r7, #16\n\t"
  64883. "mul r3, r4, r3\n\t"
  64884. "lsr r4, r3, #16\n\t"
  64885. "lsl r3, r3, #16\n\t"
  64886. "adds r8, r8, r3\n\t"
  64887. "adcs r9, r9, r4\n\t"
  64888. "adc r10, r10, #0\n\t"
  64889. "lsr r3, r6, #16\n\t"
  64890. "lsr r4, r7, #16\n\t"
  64891. "mul r4, r3, r4\n\t"
  64892. "adds r9, r9, r4\n\t"
  64893. "adc r10, r10, #0\n\t"
  64894. "lsl r4, r7, #16\n\t"
  64895. "lsr r4, r4, #16\n\t"
  64896. "mul r3, r4, r3\n\t"
  64897. "lsr r4, r3, #16\n\t"
  64898. "lsl r3, r3, #16\n\t"
  64899. "adds r8, r8, r3\n\t"
  64900. "adcs r9, r9, r4\n\t"
  64901. "adc r10, r10, #0\n\t"
  64902. #else
  64903. "umull r3, r4, r6, r7\n\t"
  64904. "adds r8, r8, r3\n\t"
  64905. "adcs r9, r4, r9\n\t"
  64906. "adc r10, r5, #0\n\t"
  64907. #endif
  64908. /* A[3] * B[1] */
  64909. "ldr r6, [%[a], #12]\n\t"
  64910. "ldr r7, [%[b], #4]\n\t"
  64911. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64912. "lsl r3, r6, #16\n\t"
  64913. "lsl r4, r7, #16\n\t"
  64914. "lsr r3, r3, #16\n\t"
  64915. "lsr r4, r4, #16\n\t"
  64916. "mul r4, r3, r4\n\t"
  64917. "adds r8, r8, r4\n\t"
  64918. "adcs r9, r9, #0\n\t"
  64919. "adc r10, r5, r10\n\t"
  64920. "lsr r4, r7, #16\n\t"
  64921. "mul r3, r4, r3\n\t"
  64922. "lsr r4, r3, #16\n\t"
  64923. "lsl r3, r3, #16\n\t"
  64924. "adds r8, r8, r3\n\t"
  64925. "adcs r9, r9, r4\n\t"
  64926. "adc r10, r10, #0\n\t"
  64927. "lsr r3, r6, #16\n\t"
  64928. "lsr r4, r7, #16\n\t"
  64929. "mul r4, r3, r4\n\t"
  64930. "adds r9, r9, r4\n\t"
  64931. "adc r10, r10, #0\n\t"
  64932. "lsl r4, r7, #16\n\t"
  64933. "lsr r4, r4, #16\n\t"
  64934. "mul r3, r4, r3\n\t"
  64935. "lsr r4, r3, #16\n\t"
  64936. "lsl r3, r3, #16\n\t"
  64937. "adds r8, r8, r3\n\t"
  64938. "adcs r9, r9, r4\n\t"
  64939. "adc r10, r10, #0\n\t"
  64940. #else
  64941. "umull r3, r4, r6, r7\n\t"
  64942. "adds r8, r8, r3\n\t"
  64943. "adcs r9, r4, r9\n\t"
  64944. "adc r10, r5, r10\n\t"
  64945. #endif
  64946. /* A[2] * B[2] */
  64947. "ldr r6, [%[a], #8]\n\t"
  64948. "ldr r7, [%[b], #8]\n\t"
  64949. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64950. "lsl r3, r6, #16\n\t"
  64951. "lsl r4, r7, #16\n\t"
  64952. "lsr r3, r3, #16\n\t"
  64953. "lsr r4, r4, #16\n\t"
  64954. "mul r4, r3, r4\n\t"
  64955. "adds r8, r8, r4\n\t"
  64956. "adcs r9, r9, #0\n\t"
  64957. "adc r10, r5, r10\n\t"
  64958. "lsr r4, r7, #16\n\t"
  64959. "mul r3, r4, r3\n\t"
  64960. "lsr r4, r3, #16\n\t"
  64961. "lsl r3, r3, #16\n\t"
  64962. "adds r8, r8, r3\n\t"
  64963. "adcs r9, r9, r4\n\t"
  64964. "adc r10, r10, #0\n\t"
  64965. "lsr r3, r6, #16\n\t"
  64966. "lsr r4, r7, #16\n\t"
  64967. "mul r4, r3, r4\n\t"
  64968. "adds r9, r9, r4\n\t"
  64969. "adc r10, r10, #0\n\t"
  64970. "lsl r4, r7, #16\n\t"
  64971. "lsr r4, r4, #16\n\t"
  64972. "mul r3, r4, r3\n\t"
  64973. "lsr r4, r3, #16\n\t"
  64974. "lsl r3, r3, #16\n\t"
  64975. "adds r8, r8, r3\n\t"
  64976. "adcs r9, r9, r4\n\t"
  64977. "adc r10, r10, #0\n\t"
  64978. #else
  64979. "umull r3, r4, r6, r7\n\t"
  64980. "adds r8, r8, r3\n\t"
  64981. "adcs r9, r4, r9\n\t"
  64982. "adc r10, r5, r10\n\t"
  64983. #endif
  64984. /* A[1] * B[3] */
  64985. "ldr r6, [%[a], #4]\n\t"
  64986. "ldr r7, [%[b], #12]\n\t"
  64987. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  64988. "lsl r3, r6, #16\n\t"
  64989. "lsl r4, r7, #16\n\t"
  64990. "lsr r3, r3, #16\n\t"
  64991. "lsr r4, r4, #16\n\t"
  64992. "mul r4, r3, r4\n\t"
  64993. "adds r8, r8, r4\n\t"
  64994. "adcs r9, r9, #0\n\t"
  64995. "adc r10, r5, r10\n\t"
  64996. "lsr r4, r7, #16\n\t"
  64997. "mul r3, r4, r3\n\t"
  64998. "lsr r4, r3, #16\n\t"
  64999. "lsl r3, r3, #16\n\t"
  65000. "adds r8, r8, r3\n\t"
  65001. "adcs r9, r9, r4\n\t"
  65002. "adc r10, r10, #0\n\t"
  65003. "lsr r3, r6, #16\n\t"
  65004. "lsr r4, r7, #16\n\t"
  65005. "mul r4, r3, r4\n\t"
  65006. "adds r9, r9, r4\n\t"
  65007. "adc r10, r10, #0\n\t"
  65008. "lsl r4, r7, #16\n\t"
  65009. "lsr r4, r4, #16\n\t"
  65010. "mul r3, r4, r3\n\t"
  65011. "lsr r4, r3, #16\n\t"
  65012. "lsl r3, r3, #16\n\t"
  65013. "adds r8, r8, r3\n\t"
  65014. "adcs r9, r9, r4\n\t"
  65015. "adc r10, r10, #0\n\t"
  65016. #else
  65017. "umull r3, r4, r6, r7\n\t"
  65018. "adds r8, r8, r3\n\t"
  65019. "adcs r9, r4, r9\n\t"
  65020. "adc r10, r5, r10\n\t"
  65021. #endif
  65022. /* A[0] * B[4] */
  65023. "ldr r6, [%[a]]\n\t"
  65024. "ldr r7, [%[b], #16]\n\t"
  65025. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65026. "lsl r3, r6, #16\n\t"
  65027. "lsl r4, r7, #16\n\t"
  65028. "lsr r3, r3, #16\n\t"
  65029. "lsr r4, r4, #16\n\t"
  65030. "mul r4, r3, r4\n\t"
  65031. "adds r8, r8, r4\n\t"
  65032. "adcs r9, r9, #0\n\t"
  65033. "adc r10, r5, r10\n\t"
  65034. "lsr r4, r7, #16\n\t"
  65035. "mul r3, r4, r3\n\t"
  65036. "lsr r4, r3, #16\n\t"
  65037. "lsl r3, r3, #16\n\t"
  65038. "adds r8, r8, r3\n\t"
  65039. "adcs r9, r9, r4\n\t"
  65040. "adc r10, r10, #0\n\t"
  65041. "lsr r3, r6, #16\n\t"
  65042. "lsr r4, r7, #16\n\t"
  65043. "mul r4, r3, r4\n\t"
  65044. "adds r9, r9, r4\n\t"
  65045. "adc r10, r10, #0\n\t"
  65046. "lsl r4, r7, #16\n\t"
  65047. "lsr r4, r4, #16\n\t"
  65048. "mul r3, r4, r3\n\t"
  65049. "lsr r4, r3, #16\n\t"
  65050. "lsl r3, r3, #16\n\t"
  65051. "adds r8, r8, r3\n\t"
  65052. "adcs r9, r9, r4\n\t"
  65053. "adc r10, r10, #0\n\t"
  65054. #else
  65055. "umull r3, r4, r6, r7\n\t"
  65056. "adds r8, r8, r3\n\t"
  65057. "adcs r9, r4, r9\n\t"
  65058. "adc r10, r5, r10\n\t"
  65059. #endif
  65060. "str r8, [sp, #16]\n\t"
  65061. /* A[0] * B[5] */
  65062. "ldr r7, [%[b], #20]\n\t"
  65063. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65064. "lsl r3, r6, #16\n\t"
  65065. "lsl r4, r7, #16\n\t"
  65066. "lsr r3, r3, #16\n\t"
  65067. "lsr r4, r4, #16\n\t"
  65068. "mul r4, r3, r4\n\t"
  65069. "adds r9, r9, r4\n\t"
  65070. "adcs r10, r10, #0\n\t"
  65071. "adc lr, r5, #0\n\t"
  65072. "lsr r4, r7, #16\n\t"
  65073. "mul r3, r4, r3\n\t"
  65074. "lsr r4, r3, #16\n\t"
  65075. "lsl r3, r3, #16\n\t"
  65076. "adds r9, r9, r3\n\t"
  65077. "adcs r10, r10, r4\n\t"
  65078. "adc lr, lr, #0\n\t"
  65079. "lsr r3, r6, #16\n\t"
  65080. "lsr r4, r7, #16\n\t"
  65081. "mul r4, r3, r4\n\t"
  65082. "adds r10, r10, r4\n\t"
  65083. "adc lr, lr, #0\n\t"
  65084. "lsl r4, r7, #16\n\t"
  65085. "lsr r4, r4, #16\n\t"
  65086. "mul r3, r4, r3\n\t"
  65087. "lsr r4, r3, #16\n\t"
  65088. "lsl r3, r3, #16\n\t"
  65089. "adds r9, r9, r3\n\t"
  65090. "adcs r10, r10, r4\n\t"
  65091. "adc lr, lr, #0\n\t"
  65092. #else
  65093. "umull r3, r4, r6, r7\n\t"
  65094. "adds r9, r9, r3\n\t"
  65095. "adcs r10, r4, r10\n\t"
  65096. "adc lr, r5, #0\n\t"
  65097. #endif
  65098. /* A[1] * B[4] */
  65099. "ldr r6, [%[a], #4]\n\t"
  65100. "ldr r7, [%[b], #16]\n\t"
  65101. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65102. "lsl r3, r6, #16\n\t"
  65103. "lsl r4, r7, #16\n\t"
  65104. "lsr r3, r3, #16\n\t"
  65105. "lsr r4, r4, #16\n\t"
  65106. "mul r4, r3, r4\n\t"
  65107. "adds r9, r9, r4\n\t"
  65108. "adcs r10, r10, #0\n\t"
  65109. "adc lr, r5, lr\n\t"
  65110. "lsr r4, r7, #16\n\t"
  65111. "mul r3, r4, r3\n\t"
  65112. "lsr r4, r3, #16\n\t"
  65113. "lsl r3, r3, #16\n\t"
  65114. "adds r9, r9, r3\n\t"
  65115. "adcs r10, r10, r4\n\t"
  65116. "adc lr, lr, #0\n\t"
  65117. "lsr r3, r6, #16\n\t"
  65118. "lsr r4, r7, #16\n\t"
  65119. "mul r4, r3, r4\n\t"
  65120. "adds r10, r10, r4\n\t"
  65121. "adc lr, lr, #0\n\t"
  65122. "lsl r4, r7, #16\n\t"
  65123. "lsr r4, r4, #16\n\t"
  65124. "mul r3, r4, r3\n\t"
  65125. "lsr r4, r3, #16\n\t"
  65126. "lsl r3, r3, #16\n\t"
  65127. "adds r9, r9, r3\n\t"
  65128. "adcs r10, r10, r4\n\t"
  65129. "adc lr, lr, #0\n\t"
  65130. #else
  65131. "umull r3, r4, r6, r7\n\t"
  65132. "adds r9, r9, r3\n\t"
  65133. "adcs r10, r4, r10\n\t"
  65134. "adc lr, r5, lr\n\t"
  65135. #endif
  65136. /* A[2] * B[3] */
  65137. "ldr r6, [%[a], #8]\n\t"
  65138. "ldr r7, [%[b], #12]\n\t"
  65139. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65140. "lsl r3, r6, #16\n\t"
  65141. "lsl r4, r7, #16\n\t"
  65142. "lsr r3, r3, #16\n\t"
  65143. "lsr r4, r4, #16\n\t"
  65144. "mul r4, r3, r4\n\t"
  65145. "adds r9, r9, r4\n\t"
  65146. "adcs r10, r10, #0\n\t"
  65147. "adc lr, r5, lr\n\t"
  65148. "lsr r4, r7, #16\n\t"
  65149. "mul r3, r4, r3\n\t"
  65150. "lsr r4, r3, #16\n\t"
  65151. "lsl r3, r3, #16\n\t"
  65152. "adds r9, r9, r3\n\t"
  65153. "adcs r10, r10, r4\n\t"
  65154. "adc lr, lr, #0\n\t"
  65155. "lsr r3, r6, #16\n\t"
  65156. "lsr r4, r7, #16\n\t"
  65157. "mul r4, r3, r4\n\t"
  65158. "adds r10, r10, r4\n\t"
  65159. "adc lr, lr, #0\n\t"
  65160. "lsl r4, r7, #16\n\t"
  65161. "lsr r4, r4, #16\n\t"
  65162. "mul r3, r4, r3\n\t"
  65163. "lsr r4, r3, #16\n\t"
  65164. "lsl r3, r3, #16\n\t"
  65165. "adds r9, r9, r3\n\t"
  65166. "adcs r10, r10, r4\n\t"
  65167. "adc lr, lr, #0\n\t"
  65168. #else
  65169. "umull r3, r4, r6, r7\n\t"
  65170. "adds r9, r9, r3\n\t"
  65171. "adcs r10, r4, r10\n\t"
  65172. "adc lr, r5, lr\n\t"
  65173. #endif
  65174. /* A[3] * B[2] */
  65175. "ldr r6, [%[a], #12]\n\t"
  65176. "ldr r7, [%[b], #8]\n\t"
  65177. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65178. "lsl r3, r6, #16\n\t"
  65179. "lsl r4, r7, #16\n\t"
  65180. "lsr r3, r3, #16\n\t"
  65181. "lsr r4, r4, #16\n\t"
  65182. "mul r4, r3, r4\n\t"
  65183. "adds r9, r9, r4\n\t"
  65184. "adcs r10, r10, #0\n\t"
  65185. "adc lr, r5, lr\n\t"
  65186. "lsr r4, r7, #16\n\t"
  65187. "mul r3, r4, r3\n\t"
  65188. "lsr r4, r3, #16\n\t"
  65189. "lsl r3, r3, #16\n\t"
  65190. "adds r9, r9, r3\n\t"
  65191. "adcs r10, r10, r4\n\t"
  65192. "adc lr, lr, #0\n\t"
  65193. "lsr r3, r6, #16\n\t"
  65194. "lsr r4, r7, #16\n\t"
  65195. "mul r4, r3, r4\n\t"
  65196. "adds r10, r10, r4\n\t"
  65197. "adc lr, lr, #0\n\t"
  65198. "lsl r4, r7, #16\n\t"
  65199. "lsr r4, r4, #16\n\t"
  65200. "mul r3, r4, r3\n\t"
  65201. "lsr r4, r3, #16\n\t"
  65202. "lsl r3, r3, #16\n\t"
  65203. "adds r9, r9, r3\n\t"
  65204. "adcs r10, r10, r4\n\t"
  65205. "adc lr, lr, #0\n\t"
  65206. #else
  65207. "umull r3, r4, r6, r7\n\t"
  65208. "adds r9, r9, r3\n\t"
  65209. "adcs r10, r4, r10\n\t"
  65210. "adc lr, r5, lr\n\t"
  65211. #endif
  65212. /* A[4] * B[1] */
  65213. "ldr r6, [%[a], #16]\n\t"
  65214. "ldr r7, [%[b], #4]\n\t"
  65215. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65216. "lsl r3, r6, #16\n\t"
  65217. "lsl r4, r7, #16\n\t"
  65218. "lsr r3, r3, #16\n\t"
  65219. "lsr r4, r4, #16\n\t"
  65220. "mul r4, r3, r4\n\t"
  65221. "adds r9, r9, r4\n\t"
  65222. "adcs r10, r10, #0\n\t"
  65223. "adc lr, r5, lr\n\t"
  65224. "lsr r4, r7, #16\n\t"
  65225. "mul r3, r4, r3\n\t"
  65226. "lsr r4, r3, #16\n\t"
  65227. "lsl r3, r3, #16\n\t"
  65228. "adds r9, r9, r3\n\t"
  65229. "adcs r10, r10, r4\n\t"
  65230. "adc lr, lr, #0\n\t"
  65231. "lsr r3, r6, #16\n\t"
  65232. "lsr r4, r7, #16\n\t"
  65233. "mul r4, r3, r4\n\t"
  65234. "adds r10, r10, r4\n\t"
  65235. "adc lr, lr, #0\n\t"
  65236. "lsl r4, r7, #16\n\t"
  65237. "lsr r4, r4, #16\n\t"
  65238. "mul r3, r4, r3\n\t"
  65239. "lsr r4, r3, #16\n\t"
  65240. "lsl r3, r3, #16\n\t"
  65241. "adds r9, r9, r3\n\t"
  65242. "adcs r10, r10, r4\n\t"
  65243. "adc lr, lr, #0\n\t"
  65244. #else
  65245. "umull r3, r4, r6, r7\n\t"
  65246. "adds r9, r9, r3\n\t"
  65247. "adcs r10, r4, r10\n\t"
  65248. "adc lr, r5, lr\n\t"
  65249. #endif
  65250. /* A[5] * B[0] */
  65251. "ldr r6, [%[a], #20]\n\t"
  65252. "ldr r7, [%[b]]\n\t"
  65253. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65254. "lsl r3, r6, #16\n\t"
  65255. "lsl r4, r7, #16\n\t"
  65256. "lsr r3, r3, #16\n\t"
  65257. "lsr r4, r4, #16\n\t"
  65258. "mul r4, r3, r4\n\t"
  65259. "adds r9, r9, r4\n\t"
  65260. "adcs r10, r10, #0\n\t"
  65261. "adc lr, r5, lr\n\t"
  65262. "lsr r4, r7, #16\n\t"
  65263. "mul r3, r4, r3\n\t"
  65264. "lsr r4, r3, #16\n\t"
  65265. "lsl r3, r3, #16\n\t"
  65266. "adds r9, r9, r3\n\t"
  65267. "adcs r10, r10, r4\n\t"
  65268. "adc lr, lr, #0\n\t"
  65269. "lsr r3, r6, #16\n\t"
  65270. "lsr r4, r7, #16\n\t"
  65271. "mul r4, r3, r4\n\t"
  65272. "adds r10, r10, r4\n\t"
  65273. "adc lr, lr, #0\n\t"
  65274. "lsl r4, r7, #16\n\t"
  65275. "lsr r4, r4, #16\n\t"
  65276. "mul r3, r4, r3\n\t"
  65277. "lsr r4, r3, #16\n\t"
  65278. "lsl r3, r3, #16\n\t"
  65279. "adds r9, r9, r3\n\t"
  65280. "adcs r10, r10, r4\n\t"
  65281. "adc lr, lr, #0\n\t"
  65282. #else
  65283. "umull r3, r4, r6, r7\n\t"
  65284. "adds r9, r9, r3\n\t"
  65285. "adcs r10, r4, r10\n\t"
  65286. "adc lr, r5, lr\n\t"
  65287. #endif
  65288. "str r9, [sp, #20]\n\t"
  65289. /* A[6] * B[0] */
  65290. "ldr r6, [%[a], #24]\n\t"
  65291. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65292. "lsl r3, r6, #16\n\t"
  65293. "lsl r4, r7, #16\n\t"
  65294. "lsr r3, r3, #16\n\t"
  65295. "lsr r4, r4, #16\n\t"
  65296. "mul r4, r3, r4\n\t"
  65297. "adds r10, r10, r4\n\t"
  65298. "adcs lr, lr, #0\n\t"
  65299. "adc r8, r5, #0\n\t"
  65300. "lsr r4, r7, #16\n\t"
  65301. "mul r3, r4, r3\n\t"
  65302. "lsr r4, r3, #16\n\t"
  65303. "lsl r3, r3, #16\n\t"
  65304. "adds r10, r10, r3\n\t"
  65305. "adcs lr, lr, r4\n\t"
  65306. "adc r8, r8, #0\n\t"
  65307. "lsr r3, r6, #16\n\t"
  65308. "lsr r4, r7, #16\n\t"
  65309. "mul r4, r3, r4\n\t"
  65310. "adds lr, lr, r4\n\t"
  65311. "adc r8, r8, #0\n\t"
  65312. "lsl r4, r7, #16\n\t"
  65313. "lsr r4, r4, #16\n\t"
  65314. "mul r3, r4, r3\n\t"
  65315. "lsr r4, r3, #16\n\t"
  65316. "lsl r3, r3, #16\n\t"
  65317. "adds r10, r10, r3\n\t"
  65318. "adcs lr, lr, r4\n\t"
  65319. "adc r8, r8, #0\n\t"
  65320. #else
  65321. "umull r3, r4, r6, r7\n\t"
  65322. "adds r10, r10, r3\n\t"
  65323. "adcs lr, r4, lr\n\t"
  65324. "adc r8, r5, #0\n\t"
  65325. #endif
  65326. /* A[5] * B[1] */
  65327. "ldr r6, [%[a], #20]\n\t"
  65328. "ldr r7, [%[b], #4]\n\t"
  65329. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65330. "lsl r3, r6, #16\n\t"
  65331. "lsl r4, r7, #16\n\t"
  65332. "lsr r3, r3, #16\n\t"
  65333. "lsr r4, r4, #16\n\t"
  65334. "mul r4, r3, r4\n\t"
  65335. "adds r10, r10, r4\n\t"
  65336. "adcs lr, lr, #0\n\t"
  65337. "adc r8, r5, r8\n\t"
  65338. "lsr r4, r7, #16\n\t"
  65339. "mul r3, r4, r3\n\t"
  65340. "lsr r4, r3, #16\n\t"
  65341. "lsl r3, r3, #16\n\t"
  65342. "adds r10, r10, r3\n\t"
  65343. "adcs lr, lr, r4\n\t"
  65344. "adc r8, r8, #0\n\t"
  65345. "lsr r3, r6, #16\n\t"
  65346. "lsr r4, r7, #16\n\t"
  65347. "mul r4, r3, r4\n\t"
  65348. "adds lr, lr, r4\n\t"
  65349. "adc r8, r8, #0\n\t"
  65350. "lsl r4, r7, #16\n\t"
  65351. "lsr r4, r4, #16\n\t"
  65352. "mul r3, r4, r3\n\t"
  65353. "lsr r4, r3, #16\n\t"
  65354. "lsl r3, r3, #16\n\t"
  65355. "adds r10, r10, r3\n\t"
  65356. "adcs lr, lr, r4\n\t"
  65357. "adc r8, r8, #0\n\t"
  65358. #else
  65359. "umull r3, r4, r6, r7\n\t"
  65360. "adds r10, r10, r3\n\t"
  65361. "adcs lr, r4, lr\n\t"
  65362. "adc r8, r5, r8\n\t"
  65363. #endif
  65364. /* A[4] * B[2] */
  65365. "ldr r6, [%[a], #16]\n\t"
  65366. "ldr r7, [%[b], #8]\n\t"
  65367. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65368. "lsl r3, r6, #16\n\t"
  65369. "lsl r4, r7, #16\n\t"
  65370. "lsr r3, r3, #16\n\t"
  65371. "lsr r4, r4, #16\n\t"
  65372. "mul r4, r3, r4\n\t"
  65373. "adds r10, r10, r4\n\t"
  65374. "adcs lr, lr, #0\n\t"
  65375. "adc r8, r5, r8\n\t"
  65376. "lsr r4, r7, #16\n\t"
  65377. "mul r3, r4, r3\n\t"
  65378. "lsr r4, r3, #16\n\t"
  65379. "lsl r3, r3, #16\n\t"
  65380. "adds r10, r10, r3\n\t"
  65381. "adcs lr, lr, r4\n\t"
  65382. "adc r8, r8, #0\n\t"
  65383. "lsr r3, r6, #16\n\t"
  65384. "lsr r4, r7, #16\n\t"
  65385. "mul r4, r3, r4\n\t"
  65386. "adds lr, lr, r4\n\t"
  65387. "adc r8, r8, #0\n\t"
  65388. "lsl r4, r7, #16\n\t"
  65389. "lsr r4, r4, #16\n\t"
  65390. "mul r3, r4, r3\n\t"
  65391. "lsr r4, r3, #16\n\t"
  65392. "lsl r3, r3, #16\n\t"
  65393. "adds r10, r10, r3\n\t"
  65394. "adcs lr, lr, r4\n\t"
  65395. "adc r8, r8, #0\n\t"
  65396. #else
  65397. "umull r3, r4, r6, r7\n\t"
  65398. "adds r10, r10, r3\n\t"
  65399. "adcs lr, r4, lr\n\t"
  65400. "adc r8, r5, r8\n\t"
  65401. #endif
  65402. /* A[3] * B[3] */
  65403. "ldr r6, [%[a], #12]\n\t"
  65404. "ldr r7, [%[b], #12]\n\t"
  65405. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65406. "lsl r3, r6, #16\n\t"
  65407. "lsl r4, r7, #16\n\t"
  65408. "lsr r3, r3, #16\n\t"
  65409. "lsr r4, r4, #16\n\t"
  65410. "mul r4, r3, r4\n\t"
  65411. "adds r10, r10, r4\n\t"
  65412. "adcs lr, lr, #0\n\t"
  65413. "adc r8, r5, r8\n\t"
  65414. "lsr r4, r7, #16\n\t"
  65415. "mul r3, r4, r3\n\t"
  65416. "lsr r4, r3, #16\n\t"
  65417. "lsl r3, r3, #16\n\t"
  65418. "adds r10, r10, r3\n\t"
  65419. "adcs lr, lr, r4\n\t"
  65420. "adc r8, r8, #0\n\t"
  65421. "lsr r3, r6, #16\n\t"
  65422. "lsr r4, r7, #16\n\t"
  65423. "mul r4, r3, r4\n\t"
  65424. "adds lr, lr, r4\n\t"
  65425. "adc r8, r8, #0\n\t"
  65426. "lsl r4, r7, #16\n\t"
  65427. "lsr r4, r4, #16\n\t"
  65428. "mul r3, r4, r3\n\t"
  65429. "lsr r4, r3, #16\n\t"
  65430. "lsl r3, r3, #16\n\t"
  65431. "adds r10, r10, r3\n\t"
  65432. "adcs lr, lr, r4\n\t"
  65433. "adc r8, r8, #0\n\t"
  65434. #else
  65435. "umull r3, r4, r6, r7\n\t"
  65436. "adds r10, r10, r3\n\t"
  65437. "adcs lr, r4, lr\n\t"
  65438. "adc r8, r5, r8\n\t"
  65439. #endif
  65440. /* A[2] * B[4] */
  65441. "ldr r6, [%[a], #8]\n\t"
  65442. "ldr r7, [%[b], #16]\n\t"
  65443. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65444. "lsl r3, r6, #16\n\t"
  65445. "lsl r4, r7, #16\n\t"
  65446. "lsr r3, r3, #16\n\t"
  65447. "lsr r4, r4, #16\n\t"
  65448. "mul r4, r3, r4\n\t"
  65449. "adds r10, r10, r4\n\t"
  65450. "adcs lr, lr, #0\n\t"
  65451. "adc r8, r5, r8\n\t"
  65452. "lsr r4, r7, #16\n\t"
  65453. "mul r3, r4, r3\n\t"
  65454. "lsr r4, r3, #16\n\t"
  65455. "lsl r3, r3, #16\n\t"
  65456. "adds r10, r10, r3\n\t"
  65457. "adcs lr, lr, r4\n\t"
  65458. "adc r8, r8, #0\n\t"
  65459. "lsr r3, r6, #16\n\t"
  65460. "lsr r4, r7, #16\n\t"
  65461. "mul r4, r3, r4\n\t"
  65462. "adds lr, lr, r4\n\t"
  65463. "adc r8, r8, #0\n\t"
  65464. "lsl r4, r7, #16\n\t"
  65465. "lsr r4, r4, #16\n\t"
  65466. "mul r3, r4, r3\n\t"
  65467. "lsr r4, r3, #16\n\t"
  65468. "lsl r3, r3, #16\n\t"
  65469. "adds r10, r10, r3\n\t"
  65470. "adcs lr, lr, r4\n\t"
  65471. "adc r8, r8, #0\n\t"
  65472. #else
  65473. "umull r3, r4, r6, r7\n\t"
  65474. "adds r10, r10, r3\n\t"
  65475. "adcs lr, r4, lr\n\t"
  65476. "adc r8, r5, r8\n\t"
  65477. #endif
  65478. /* A[1] * B[5] */
  65479. "ldr r6, [%[a], #4]\n\t"
  65480. "ldr r7, [%[b], #20]\n\t"
  65481. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65482. "lsl r3, r6, #16\n\t"
  65483. "lsl r4, r7, #16\n\t"
  65484. "lsr r3, r3, #16\n\t"
  65485. "lsr r4, r4, #16\n\t"
  65486. "mul r4, r3, r4\n\t"
  65487. "adds r10, r10, r4\n\t"
  65488. "adcs lr, lr, #0\n\t"
  65489. "adc r8, r5, r8\n\t"
  65490. "lsr r4, r7, #16\n\t"
  65491. "mul r3, r4, r3\n\t"
  65492. "lsr r4, r3, #16\n\t"
  65493. "lsl r3, r3, #16\n\t"
  65494. "adds r10, r10, r3\n\t"
  65495. "adcs lr, lr, r4\n\t"
  65496. "adc r8, r8, #0\n\t"
  65497. "lsr r3, r6, #16\n\t"
  65498. "lsr r4, r7, #16\n\t"
  65499. "mul r4, r3, r4\n\t"
  65500. "adds lr, lr, r4\n\t"
  65501. "adc r8, r8, #0\n\t"
  65502. "lsl r4, r7, #16\n\t"
  65503. "lsr r4, r4, #16\n\t"
  65504. "mul r3, r4, r3\n\t"
  65505. "lsr r4, r3, #16\n\t"
  65506. "lsl r3, r3, #16\n\t"
  65507. "adds r10, r10, r3\n\t"
  65508. "adcs lr, lr, r4\n\t"
  65509. "adc r8, r8, #0\n\t"
  65510. #else
  65511. "umull r3, r4, r6, r7\n\t"
  65512. "adds r10, r10, r3\n\t"
  65513. "adcs lr, r4, lr\n\t"
  65514. "adc r8, r5, r8\n\t"
  65515. #endif
  65516. /* A[0] * B[6] */
  65517. "ldr r6, [%[a]]\n\t"
  65518. "ldr r7, [%[b], #24]\n\t"
  65519. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65520. "lsl r3, r6, #16\n\t"
  65521. "lsl r4, r7, #16\n\t"
  65522. "lsr r3, r3, #16\n\t"
  65523. "lsr r4, r4, #16\n\t"
  65524. "mul r4, r3, r4\n\t"
  65525. "adds r10, r10, r4\n\t"
  65526. "adcs lr, lr, #0\n\t"
  65527. "adc r8, r5, r8\n\t"
  65528. "lsr r4, r7, #16\n\t"
  65529. "mul r3, r4, r3\n\t"
  65530. "lsr r4, r3, #16\n\t"
  65531. "lsl r3, r3, #16\n\t"
  65532. "adds r10, r10, r3\n\t"
  65533. "adcs lr, lr, r4\n\t"
  65534. "adc r8, r8, #0\n\t"
  65535. "lsr r3, r6, #16\n\t"
  65536. "lsr r4, r7, #16\n\t"
  65537. "mul r4, r3, r4\n\t"
  65538. "adds lr, lr, r4\n\t"
  65539. "adc r8, r8, #0\n\t"
  65540. "lsl r4, r7, #16\n\t"
  65541. "lsr r4, r4, #16\n\t"
  65542. "mul r3, r4, r3\n\t"
  65543. "lsr r4, r3, #16\n\t"
  65544. "lsl r3, r3, #16\n\t"
  65545. "adds r10, r10, r3\n\t"
  65546. "adcs lr, lr, r4\n\t"
  65547. "adc r8, r8, #0\n\t"
  65548. #else
  65549. "umull r3, r4, r6, r7\n\t"
  65550. "adds r10, r10, r3\n\t"
  65551. "adcs lr, r4, lr\n\t"
  65552. "adc r8, r5, r8\n\t"
  65553. #endif
  65554. "str r10, [sp, #24]\n\t"
  65555. /* A[0] * B[7] */
  65556. "ldr r7, [%[b], #28]\n\t"
  65557. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65558. "lsl r3, r6, #16\n\t"
  65559. "lsl r4, r7, #16\n\t"
  65560. "lsr r3, r3, #16\n\t"
  65561. "lsr r4, r4, #16\n\t"
  65562. "mul r4, r3, r4\n\t"
  65563. "adds lr, lr, r4\n\t"
  65564. "adcs r8, r8, #0\n\t"
  65565. "adc r9, r5, #0\n\t"
  65566. "lsr r4, r7, #16\n\t"
  65567. "mul r3, r4, r3\n\t"
  65568. "lsr r4, r3, #16\n\t"
  65569. "lsl r3, r3, #16\n\t"
  65570. "adds lr, lr, r3\n\t"
  65571. "adcs r8, r8, r4\n\t"
  65572. "adc r9, r9, #0\n\t"
  65573. "lsr r3, r6, #16\n\t"
  65574. "lsr r4, r7, #16\n\t"
  65575. "mul r4, r3, r4\n\t"
  65576. "adds r8, r8, r4\n\t"
  65577. "adc r9, r9, #0\n\t"
  65578. "lsl r4, r7, #16\n\t"
  65579. "lsr r4, r4, #16\n\t"
  65580. "mul r3, r4, r3\n\t"
  65581. "lsr r4, r3, #16\n\t"
  65582. "lsl r3, r3, #16\n\t"
  65583. "adds lr, lr, r3\n\t"
  65584. "adcs r8, r8, r4\n\t"
  65585. "adc r9, r9, #0\n\t"
  65586. #else
  65587. "umull r3, r4, r6, r7\n\t"
  65588. "adds lr, lr, r3\n\t"
  65589. "adcs r8, r4, r8\n\t"
  65590. "adc r9, r5, #0\n\t"
  65591. #endif
  65592. /* A[1] * B[6] */
  65593. "ldr r6, [%[a], #4]\n\t"
  65594. "ldr r7, [%[b], #24]\n\t"
  65595. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65596. "lsl r3, r6, #16\n\t"
  65597. "lsl r4, r7, #16\n\t"
  65598. "lsr r3, r3, #16\n\t"
  65599. "lsr r4, r4, #16\n\t"
  65600. "mul r4, r3, r4\n\t"
  65601. "adds lr, lr, r4\n\t"
  65602. "adcs r8, r8, #0\n\t"
  65603. "adc r9, r5, r9\n\t"
  65604. "lsr r4, r7, #16\n\t"
  65605. "mul r3, r4, r3\n\t"
  65606. "lsr r4, r3, #16\n\t"
  65607. "lsl r3, r3, #16\n\t"
  65608. "adds lr, lr, r3\n\t"
  65609. "adcs r8, r8, r4\n\t"
  65610. "adc r9, r9, #0\n\t"
  65611. "lsr r3, r6, #16\n\t"
  65612. "lsr r4, r7, #16\n\t"
  65613. "mul r4, r3, r4\n\t"
  65614. "adds r8, r8, r4\n\t"
  65615. "adc r9, r9, #0\n\t"
  65616. "lsl r4, r7, #16\n\t"
  65617. "lsr r4, r4, #16\n\t"
  65618. "mul r3, r4, r3\n\t"
  65619. "lsr r4, r3, #16\n\t"
  65620. "lsl r3, r3, #16\n\t"
  65621. "adds lr, lr, r3\n\t"
  65622. "adcs r8, r8, r4\n\t"
  65623. "adc r9, r9, #0\n\t"
  65624. #else
  65625. "umull r3, r4, r6, r7\n\t"
  65626. "adds lr, lr, r3\n\t"
  65627. "adcs r8, r4, r8\n\t"
  65628. "adc r9, r5, r9\n\t"
  65629. #endif
  65630. /* A[2] * B[5] */
  65631. "ldr r6, [%[a], #8]\n\t"
  65632. "ldr r7, [%[b], #20]\n\t"
  65633. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65634. "lsl r3, r6, #16\n\t"
  65635. "lsl r4, r7, #16\n\t"
  65636. "lsr r3, r3, #16\n\t"
  65637. "lsr r4, r4, #16\n\t"
  65638. "mul r4, r3, r4\n\t"
  65639. "adds lr, lr, r4\n\t"
  65640. "adcs r8, r8, #0\n\t"
  65641. "adc r9, r5, r9\n\t"
  65642. "lsr r4, r7, #16\n\t"
  65643. "mul r3, r4, r3\n\t"
  65644. "lsr r4, r3, #16\n\t"
  65645. "lsl r3, r3, #16\n\t"
  65646. "adds lr, lr, r3\n\t"
  65647. "adcs r8, r8, r4\n\t"
  65648. "adc r9, r9, #0\n\t"
  65649. "lsr r3, r6, #16\n\t"
  65650. "lsr r4, r7, #16\n\t"
  65651. "mul r4, r3, r4\n\t"
  65652. "adds r8, r8, r4\n\t"
  65653. "adc r9, r9, #0\n\t"
  65654. "lsl r4, r7, #16\n\t"
  65655. "lsr r4, r4, #16\n\t"
  65656. "mul r3, r4, r3\n\t"
  65657. "lsr r4, r3, #16\n\t"
  65658. "lsl r3, r3, #16\n\t"
  65659. "adds lr, lr, r3\n\t"
  65660. "adcs r8, r8, r4\n\t"
  65661. "adc r9, r9, #0\n\t"
  65662. #else
  65663. "umull r3, r4, r6, r7\n\t"
  65664. "adds lr, lr, r3\n\t"
  65665. "adcs r8, r4, r8\n\t"
  65666. "adc r9, r5, r9\n\t"
  65667. #endif
  65668. /* A[3] * B[4] */
  65669. "ldr r6, [%[a], #12]\n\t"
  65670. "ldr r7, [%[b], #16]\n\t"
  65671. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65672. "lsl r3, r6, #16\n\t"
  65673. "lsl r4, r7, #16\n\t"
  65674. "lsr r3, r3, #16\n\t"
  65675. "lsr r4, r4, #16\n\t"
  65676. "mul r4, r3, r4\n\t"
  65677. "adds lr, lr, r4\n\t"
  65678. "adcs r8, r8, #0\n\t"
  65679. "adc r9, r5, r9\n\t"
  65680. "lsr r4, r7, #16\n\t"
  65681. "mul r3, r4, r3\n\t"
  65682. "lsr r4, r3, #16\n\t"
  65683. "lsl r3, r3, #16\n\t"
  65684. "adds lr, lr, r3\n\t"
  65685. "adcs r8, r8, r4\n\t"
  65686. "adc r9, r9, #0\n\t"
  65687. "lsr r3, r6, #16\n\t"
  65688. "lsr r4, r7, #16\n\t"
  65689. "mul r4, r3, r4\n\t"
  65690. "adds r8, r8, r4\n\t"
  65691. "adc r9, r9, #0\n\t"
  65692. "lsl r4, r7, #16\n\t"
  65693. "lsr r4, r4, #16\n\t"
  65694. "mul r3, r4, r3\n\t"
  65695. "lsr r4, r3, #16\n\t"
  65696. "lsl r3, r3, #16\n\t"
  65697. "adds lr, lr, r3\n\t"
  65698. "adcs r8, r8, r4\n\t"
  65699. "adc r9, r9, #0\n\t"
  65700. #else
  65701. "umull r3, r4, r6, r7\n\t"
  65702. "adds lr, lr, r3\n\t"
  65703. "adcs r8, r4, r8\n\t"
  65704. "adc r9, r5, r9\n\t"
  65705. #endif
  65706. /* A[4] * B[3] */
  65707. "ldr r6, [%[a], #16]\n\t"
  65708. "ldr r7, [%[b], #12]\n\t"
  65709. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65710. "lsl r3, r6, #16\n\t"
  65711. "lsl r4, r7, #16\n\t"
  65712. "lsr r3, r3, #16\n\t"
  65713. "lsr r4, r4, #16\n\t"
  65714. "mul r4, r3, r4\n\t"
  65715. "adds lr, lr, r4\n\t"
  65716. "adcs r8, r8, #0\n\t"
  65717. "adc r9, r5, r9\n\t"
  65718. "lsr r4, r7, #16\n\t"
  65719. "mul r3, r4, r3\n\t"
  65720. "lsr r4, r3, #16\n\t"
  65721. "lsl r3, r3, #16\n\t"
  65722. "adds lr, lr, r3\n\t"
  65723. "adcs r8, r8, r4\n\t"
  65724. "adc r9, r9, #0\n\t"
  65725. "lsr r3, r6, #16\n\t"
  65726. "lsr r4, r7, #16\n\t"
  65727. "mul r4, r3, r4\n\t"
  65728. "adds r8, r8, r4\n\t"
  65729. "adc r9, r9, #0\n\t"
  65730. "lsl r4, r7, #16\n\t"
  65731. "lsr r4, r4, #16\n\t"
  65732. "mul r3, r4, r3\n\t"
  65733. "lsr r4, r3, #16\n\t"
  65734. "lsl r3, r3, #16\n\t"
  65735. "adds lr, lr, r3\n\t"
  65736. "adcs r8, r8, r4\n\t"
  65737. "adc r9, r9, #0\n\t"
  65738. #else
  65739. "umull r3, r4, r6, r7\n\t"
  65740. "adds lr, lr, r3\n\t"
  65741. "adcs r8, r4, r8\n\t"
  65742. "adc r9, r5, r9\n\t"
  65743. #endif
  65744. /* A[5] * B[2] */
  65745. "ldr r6, [%[a], #20]\n\t"
  65746. "ldr r7, [%[b], #8]\n\t"
  65747. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65748. "lsl r3, r6, #16\n\t"
  65749. "lsl r4, r7, #16\n\t"
  65750. "lsr r3, r3, #16\n\t"
  65751. "lsr r4, r4, #16\n\t"
  65752. "mul r4, r3, r4\n\t"
  65753. "adds lr, lr, r4\n\t"
  65754. "adcs r8, r8, #0\n\t"
  65755. "adc r9, r5, r9\n\t"
  65756. "lsr r4, r7, #16\n\t"
  65757. "mul r3, r4, r3\n\t"
  65758. "lsr r4, r3, #16\n\t"
  65759. "lsl r3, r3, #16\n\t"
  65760. "adds lr, lr, r3\n\t"
  65761. "adcs r8, r8, r4\n\t"
  65762. "adc r9, r9, #0\n\t"
  65763. "lsr r3, r6, #16\n\t"
  65764. "lsr r4, r7, #16\n\t"
  65765. "mul r4, r3, r4\n\t"
  65766. "adds r8, r8, r4\n\t"
  65767. "adc r9, r9, #0\n\t"
  65768. "lsl r4, r7, #16\n\t"
  65769. "lsr r4, r4, #16\n\t"
  65770. "mul r3, r4, r3\n\t"
  65771. "lsr r4, r3, #16\n\t"
  65772. "lsl r3, r3, #16\n\t"
  65773. "adds lr, lr, r3\n\t"
  65774. "adcs r8, r8, r4\n\t"
  65775. "adc r9, r9, #0\n\t"
  65776. #else
  65777. "umull r3, r4, r6, r7\n\t"
  65778. "adds lr, lr, r3\n\t"
  65779. "adcs r8, r4, r8\n\t"
  65780. "adc r9, r5, r9\n\t"
  65781. #endif
  65782. /* A[6] * B[1] */
  65783. "ldr r6, [%[a], #24]\n\t"
  65784. "ldr r7, [%[b], #4]\n\t"
  65785. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65786. "lsl r3, r6, #16\n\t"
  65787. "lsl r4, r7, #16\n\t"
  65788. "lsr r3, r3, #16\n\t"
  65789. "lsr r4, r4, #16\n\t"
  65790. "mul r4, r3, r4\n\t"
  65791. "adds lr, lr, r4\n\t"
  65792. "adcs r8, r8, #0\n\t"
  65793. "adc r9, r5, r9\n\t"
  65794. "lsr r4, r7, #16\n\t"
  65795. "mul r3, r4, r3\n\t"
  65796. "lsr r4, r3, #16\n\t"
  65797. "lsl r3, r3, #16\n\t"
  65798. "adds lr, lr, r3\n\t"
  65799. "adcs r8, r8, r4\n\t"
  65800. "adc r9, r9, #0\n\t"
  65801. "lsr r3, r6, #16\n\t"
  65802. "lsr r4, r7, #16\n\t"
  65803. "mul r4, r3, r4\n\t"
  65804. "adds r8, r8, r4\n\t"
  65805. "adc r9, r9, #0\n\t"
  65806. "lsl r4, r7, #16\n\t"
  65807. "lsr r4, r4, #16\n\t"
  65808. "mul r3, r4, r3\n\t"
  65809. "lsr r4, r3, #16\n\t"
  65810. "lsl r3, r3, #16\n\t"
  65811. "adds lr, lr, r3\n\t"
  65812. "adcs r8, r8, r4\n\t"
  65813. "adc r9, r9, #0\n\t"
  65814. #else
  65815. "umull r3, r4, r6, r7\n\t"
  65816. "adds lr, lr, r3\n\t"
  65817. "adcs r8, r4, r8\n\t"
  65818. "adc r9, r5, r9\n\t"
  65819. #endif
  65820. /* A[7] * B[0] */
  65821. "ldr r6, [%[a], #28]\n\t"
  65822. "ldr r7, [%[b]]\n\t"
  65823. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65824. "lsl r3, r6, #16\n\t"
  65825. "lsl r4, r7, #16\n\t"
  65826. "lsr r3, r3, #16\n\t"
  65827. "lsr r4, r4, #16\n\t"
  65828. "mul r4, r3, r4\n\t"
  65829. "adds lr, lr, r4\n\t"
  65830. "adcs r8, r8, #0\n\t"
  65831. "adc r9, r5, r9\n\t"
  65832. "lsr r4, r7, #16\n\t"
  65833. "mul r3, r4, r3\n\t"
  65834. "lsr r4, r3, #16\n\t"
  65835. "lsl r3, r3, #16\n\t"
  65836. "adds lr, lr, r3\n\t"
  65837. "adcs r8, r8, r4\n\t"
  65838. "adc r9, r9, #0\n\t"
  65839. "lsr r3, r6, #16\n\t"
  65840. "lsr r4, r7, #16\n\t"
  65841. "mul r4, r3, r4\n\t"
  65842. "adds r8, r8, r4\n\t"
  65843. "adc r9, r9, #0\n\t"
  65844. "lsl r4, r7, #16\n\t"
  65845. "lsr r4, r4, #16\n\t"
  65846. "mul r3, r4, r3\n\t"
  65847. "lsr r4, r3, #16\n\t"
  65848. "lsl r3, r3, #16\n\t"
  65849. "adds lr, lr, r3\n\t"
  65850. "adcs r8, r8, r4\n\t"
  65851. "adc r9, r9, #0\n\t"
  65852. #else
  65853. "umull r3, r4, r6, r7\n\t"
  65854. "adds lr, lr, r3\n\t"
  65855. "adcs r8, r4, r8\n\t"
  65856. "adc r9, r5, r9\n\t"
  65857. #endif
  65858. "str lr, [sp, #28]\n\t"
  65859. /* A[7] * B[1] */
  65860. "ldr r7, [%[b], #4]\n\t"
  65861. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65862. "lsl r3, r6, #16\n\t"
  65863. "lsl r4, r7, #16\n\t"
  65864. "lsr r3, r3, #16\n\t"
  65865. "lsr r4, r4, #16\n\t"
  65866. "mul r4, r3, r4\n\t"
  65867. "adds r8, r8, r4\n\t"
  65868. "adcs r9, r9, #0\n\t"
  65869. "adc r10, r5, #0\n\t"
  65870. "lsr r4, r7, #16\n\t"
  65871. "mul r3, r4, r3\n\t"
  65872. "lsr r4, r3, #16\n\t"
  65873. "lsl r3, r3, #16\n\t"
  65874. "adds r8, r8, r3\n\t"
  65875. "adcs r9, r9, r4\n\t"
  65876. "adc r10, r10, #0\n\t"
  65877. "lsr r3, r6, #16\n\t"
  65878. "lsr r4, r7, #16\n\t"
  65879. "mul r4, r3, r4\n\t"
  65880. "adds r9, r9, r4\n\t"
  65881. "adc r10, r10, #0\n\t"
  65882. "lsl r4, r7, #16\n\t"
  65883. "lsr r4, r4, #16\n\t"
  65884. "mul r3, r4, r3\n\t"
  65885. "lsr r4, r3, #16\n\t"
  65886. "lsl r3, r3, #16\n\t"
  65887. "adds r8, r8, r3\n\t"
  65888. "adcs r9, r9, r4\n\t"
  65889. "adc r10, r10, #0\n\t"
  65890. #else
  65891. "umull r3, r4, r6, r7\n\t"
  65892. "adds r8, r8, r3\n\t"
  65893. "adcs r9, r4, r9\n\t"
  65894. "adc r10, r5, #0\n\t"
  65895. #endif
  65896. /* A[6] * B[2] */
  65897. "ldr r6, [%[a], #24]\n\t"
  65898. "ldr r7, [%[b], #8]\n\t"
  65899. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65900. "lsl r3, r6, #16\n\t"
  65901. "lsl r4, r7, #16\n\t"
  65902. "lsr r3, r3, #16\n\t"
  65903. "lsr r4, r4, #16\n\t"
  65904. "mul r4, r3, r4\n\t"
  65905. "adds r8, r8, r4\n\t"
  65906. "adcs r9, r9, #0\n\t"
  65907. "adc r10, r5, r10\n\t"
  65908. "lsr r4, r7, #16\n\t"
  65909. "mul r3, r4, r3\n\t"
  65910. "lsr r4, r3, #16\n\t"
  65911. "lsl r3, r3, #16\n\t"
  65912. "adds r8, r8, r3\n\t"
  65913. "adcs r9, r9, r4\n\t"
  65914. "adc r10, r10, #0\n\t"
  65915. "lsr r3, r6, #16\n\t"
  65916. "lsr r4, r7, #16\n\t"
  65917. "mul r4, r3, r4\n\t"
  65918. "adds r9, r9, r4\n\t"
  65919. "adc r10, r10, #0\n\t"
  65920. "lsl r4, r7, #16\n\t"
  65921. "lsr r4, r4, #16\n\t"
  65922. "mul r3, r4, r3\n\t"
  65923. "lsr r4, r3, #16\n\t"
  65924. "lsl r3, r3, #16\n\t"
  65925. "adds r8, r8, r3\n\t"
  65926. "adcs r9, r9, r4\n\t"
  65927. "adc r10, r10, #0\n\t"
  65928. #else
  65929. "umull r3, r4, r6, r7\n\t"
  65930. "adds r8, r8, r3\n\t"
  65931. "adcs r9, r4, r9\n\t"
  65932. "adc r10, r5, r10\n\t"
  65933. #endif
  65934. /* A[5] * B[3] */
  65935. "ldr r6, [%[a], #20]\n\t"
  65936. "ldr r7, [%[b], #12]\n\t"
  65937. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65938. "lsl r3, r6, #16\n\t"
  65939. "lsl r4, r7, #16\n\t"
  65940. "lsr r3, r3, #16\n\t"
  65941. "lsr r4, r4, #16\n\t"
  65942. "mul r4, r3, r4\n\t"
  65943. "adds r8, r8, r4\n\t"
  65944. "adcs r9, r9, #0\n\t"
  65945. "adc r10, r5, r10\n\t"
  65946. "lsr r4, r7, #16\n\t"
  65947. "mul r3, r4, r3\n\t"
  65948. "lsr r4, r3, #16\n\t"
  65949. "lsl r3, r3, #16\n\t"
  65950. "adds r8, r8, r3\n\t"
  65951. "adcs r9, r9, r4\n\t"
  65952. "adc r10, r10, #0\n\t"
  65953. "lsr r3, r6, #16\n\t"
  65954. "lsr r4, r7, #16\n\t"
  65955. "mul r4, r3, r4\n\t"
  65956. "adds r9, r9, r4\n\t"
  65957. "adc r10, r10, #0\n\t"
  65958. "lsl r4, r7, #16\n\t"
  65959. "lsr r4, r4, #16\n\t"
  65960. "mul r3, r4, r3\n\t"
  65961. "lsr r4, r3, #16\n\t"
  65962. "lsl r3, r3, #16\n\t"
  65963. "adds r8, r8, r3\n\t"
  65964. "adcs r9, r9, r4\n\t"
  65965. "adc r10, r10, #0\n\t"
  65966. #else
  65967. "umull r3, r4, r6, r7\n\t"
  65968. "adds r8, r8, r3\n\t"
  65969. "adcs r9, r4, r9\n\t"
  65970. "adc r10, r5, r10\n\t"
  65971. #endif
  65972. /* A[4] * B[4] */
  65973. "ldr r6, [%[a], #16]\n\t"
  65974. "ldr r7, [%[b], #16]\n\t"
  65975. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  65976. "lsl r3, r6, #16\n\t"
  65977. "lsl r4, r7, #16\n\t"
  65978. "lsr r3, r3, #16\n\t"
  65979. "lsr r4, r4, #16\n\t"
  65980. "mul r4, r3, r4\n\t"
  65981. "adds r8, r8, r4\n\t"
  65982. "adcs r9, r9, #0\n\t"
  65983. "adc r10, r5, r10\n\t"
  65984. "lsr r4, r7, #16\n\t"
  65985. "mul r3, r4, r3\n\t"
  65986. "lsr r4, r3, #16\n\t"
  65987. "lsl r3, r3, #16\n\t"
  65988. "adds r8, r8, r3\n\t"
  65989. "adcs r9, r9, r4\n\t"
  65990. "adc r10, r10, #0\n\t"
  65991. "lsr r3, r6, #16\n\t"
  65992. "lsr r4, r7, #16\n\t"
  65993. "mul r4, r3, r4\n\t"
  65994. "adds r9, r9, r4\n\t"
  65995. "adc r10, r10, #0\n\t"
  65996. "lsl r4, r7, #16\n\t"
  65997. "lsr r4, r4, #16\n\t"
  65998. "mul r3, r4, r3\n\t"
  65999. "lsr r4, r3, #16\n\t"
  66000. "lsl r3, r3, #16\n\t"
  66001. "adds r8, r8, r3\n\t"
  66002. "adcs r9, r9, r4\n\t"
  66003. "adc r10, r10, #0\n\t"
  66004. #else
  66005. "umull r3, r4, r6, r7\n\t"
  66006. "adds r8, r8, r3\n\t"
  66007. "adcs r9, r4, r9\n\t"
  66008. "adc r10, r5, r10\n\t"
  66009. #endif
  66010. /* A[3] * B[5] */
  66011. "ldr r6, [%[a], #12]\n\t"
  66012. "ldr r7, [%[b], #20]\n\t"
  66013. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66014. "lsl r3, r6, #16\n\t"
  66015. "lsl r4, r7, #16\n\t"
  66016. "lsr r3, r3, #16\n\t"
  66017. "lsr r4, r4, #16\n\t"
  66018. "mul r4, r3, r4\n\t"
  66019. "adds r8, r8, r4\n\t"
  66020. "adcs r9, r9, #0\n\t"
  66021. "adc r10, r5, r10\n\t"
  66022. "lsr r4, r7, #16\n\t"
  66023. "mul r3, r4, r3\n\t"
  66024. "lsr r4, r3, #16\n\t"
  66025. "lsl r3, r3, #16\n\t"
  66026. "adds r8, r8, r3\n\t"
  66027. "adcs r9, r9, r4\n\t"
  66028. "adc r10, r10, #0\n\t"
  66029. "lsr r3, r6, #16\n\t"
  66030. "lsr r4, r7, #16\n\t"
  66031. "mul r4, r3, r4\n\t"
  66032. "adds r9, r9, r4\n\t"
  66033. "adc r10, r10, #0\n\t"
  66034. "lsl r4, r7, #16\n\t"
  66035. "lsr r4, r4, #16\n\t"
  66036. "mul r3, r4, r3\n\t"
  66037. "lsr r4, r3, #16\n\t"
  66038. "lsl r3, r3, #16\n\t"
  66039. "adds r8, r8, r3\n\t"
  66040. "adcs r9, r9, r4\n\t"
  66041. "adc r10, r10, #0\n\t"
  66042. #else
  66043. "umull r3, r4, r6, r7\n\t"
  66044. "adds r8, r8, r3\n\t"
  66045. "adcs r9, r4, r9\n\t"
  66046. "adc r10, r5, r10\n\t"
  66047. #endif
  66048. /* A[2] * B[6] */
  66049. "ldr r6, [%[a], #8]\n\t"
  66050. "ldr r7, [%[b], #24]\n\t"
  66051. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66052. "lsl r3, r6, #16\n\t"
  66053. "lsl r4, r7, #16\n\t"
  66054. "lsr r3, r3, #16\n\t"
  66055. "lsr r4, r4, #16\n\t"
  66056. "mul r4, r3, r4\n\t"
  66057. "adds r8, r8, r4\n\t"
  66058. "adcs r9, r9, #0\n\t"
  66059. "adc r10, r5, r10\n\t"
  66060. "lsr r4, r7, #16\n\t"
  66061. "mul r3, r4, r3\n\t"
  66062. "lsr r4, r3, #16\n\t"
  66063. "lsl r3, r3, #16\n\t"
  66064. "adds r8, r8, r3\n\t"
  66065. "adcs r9, r9, r4\n\t"
  66066. "adc r10, r10, #0\n\t"
  66067. "lsr r3, r6, #16\n\t"
  66068. "lsr r4, r7, #16\n\t"
  66069. "mul r4, r3, r4\n\t"
  66070. "adds r9, r9, r4\n\t"
  66071. "adc r10, r10, #0\n\t"
  66072. "lsl r4, r7, #16\n\t"
  66073. "lsr r4, r4, #16\n\t"
  66074. "mul r3, r4, r3\n\t"
  66075. "lsr r4, r3, #16\n\t"
  66076. "lsl r3, r3, #16\n\t"
  66077. "adds r8, r8, r3\n\t"
  66078. "adcs r9, r9, r4\n\t"
  66079. "adc r10, r10, #0\n\t"
  66080. #else
  66081. "umull r3, r4, r6, r7\n\t"
  66082. "adds r8, r8, r3\n\t"
  66083. "adcs r9, r4, r9\n\t"
  66084. "adc r10, r5, r10\n\t"
  66085. #endif
  66086. /* A[1] * B[7] */
  66087. "ldr r6, [%[a], #4]\n\t"
  66088. "ldr r7, [%[b], #28]\n\t"
  66089. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66090. "lsl r3, r6, #16\n\t"
  66091. "lsl r4, r7, #16\n\t"
  66092. "lsr r3, r3, #16\n\t"
  66093. "lsr r4, r4, #16\n\t"
  66094. "mul r4, r3, r4\n\t"
  66095. "adds r8, r8, r4\n\t"
  66096. "adcs r9, r9, #0\n\t"
  66097. "adc r10, r5, r10\n\t"
  66098. "lsr r4, r7, #16\n\t"
  66099. "mul r3, r4, r3\n\t"
  66100. "lsr r4, r3, #16\n\t"
  66101. "lsl r3, r3, #16\n\t"
  66102. "adds r8, r8, r3\n\t"
  66103. "adcs r9, r9, r4\n\t"
  66104. "adc r10, r10, #0\n\t"
  66105. "lsr r3, r6, #16\n\t"
  66106. "lsr r4, r7, #16\n\t"
  66107. "mul r4, r3, r4\n\t"
  66108. "adds r9, r9, r4\n\t"
  66109. "adc r10, r10, #0\n\t"
  66110. "lsl r4, r7, #16\n\t"
  66111. "lsr r4, r4, #16\n\t"
  66112. "mul r3, r4, r3\n\t"
  66113. "lsr r4, r3, #16\n\t"
  66114. "lsl r3, r3, #16\n\t"
  66115. "adds r8, r8, r3\n\t"
  66116. "adcs r9, r9, r4\n\t"
  66117. "adc r10, r10, #0\n\t"
  66118. #else
  66119. "umull r3, r4, r6, r7\n\t"
  66120. "adds r8, r8, r3\n\t"
  66121. "adcs r9, r4, r9\n\t"
  66122. "adc r10, r5, r10\n\t"
  66123. #endif
  66124. "str r8, [sp, #32]\n\t"
  66125. /* A[2] * B[7] */
  66126. "ldr r6, [%[a], #8]\n\t"
  66127. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66128. "lsl r3, r6, #16\n\t"
  66129. "lsl r4, r7, #16\n\t"
  66130. "lsr r3, r3, #16\n\t"
  66131. "lsr r4, r4, #16\n\t"
  66132. "mul r4, r3, r4\n\t"
  66133. "adds r9, r9, r4\n\t"
  66134. "adcs r10, r10, #0\n\t"
  66135. "adc lr, r5, #0\n\t"
  66136. "lsr r4, r7, #16\n\t"
  66137. "mul r3, r4, r3\n\t"
  66138. "lsr r4, r3, #16\n\t"
  66139. "lsl r3, r3, #16\n\t"
  66140. "adds r9, r9, r3\n\t"
  66141. "adcs r10, r10, r4\n\t"
  66142. "adc lr, lr, #0\n\t"
  66143. "lsr r3, r6, #16\n\t"
  66144. "lsr r4, r7, #16\n\t"
  66145. "mul r4, r3, r4\n\t"
  66146. "adds r10, r10, r4\n\t"
  66147. "adc lr, lr, #0\n\t"
  66148. "lsl r4, r7, #16\n\t"
  66149. "lsr r4, r4, #16\n\t"
  66150. "mul r3, r4, r3\n\t"
  66151. "lsr r4, r3, #16\n\t"
  66152. "lsl r3, r3, #16\n\t"
  66153. "adds r9, r9, r3\n\t"
  66154. "adcs r10, r10, r4\n\t"
  66155. "adc lr, lr, #0\n\t"
  66156. #else
  66157. "umull r3, r4, r6, r7\n\t"
  66158. "adds r9, r9, r3\n\t"
  66159. "adcs r10, r4, r10\n\t"
  66160. "adc lr, r5, #0\n\t"
  66161. #endif
  66162. /* A[3] * B[6] */
  66163. "ldr r6, [%[a], #12]\n\t"
  66164. "ldr r7, [%[b], #24]\n\t"
  66165. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66166. "lsl r3, r6, #16\n\t"
  66167. "lsl r4, r7, #16\n\t"
  66168. "lsr r3, r3, #16\n\t"
  66169. "lsr r4, r4, #16\n\t"
  66170. "mul r4, r3, r4\n\t"
  66171. "adds r9, r9, r4\n\t"
  66172. "adcs r10, r10, #0\n\t"
  66173. "adc lr, r5, lr\n\t"
  66174. "lsr r4, r7, #16\n\t"
  66175. "mul r3, r4, r3\n\t"
  66176. "lsr r4, r3, #16\n\t"
  66177. "lsl r3, r3, #16\n\t"
  66178. "adds r9, r9, r3\n\t"
  66179. "adcs r10, r10, r4\n\t"
  66180. "adc lr, lr, #0\n\t"
  66181. "lsr r3, r6, #16\n\t"
  66182. "lsr r4, r7, #16\n\t"
  66183. "mul r4, r3, r4\n\t"
  66184. "adds r10, r10, r4\n\t"
  66185. "adc lr, lr, #0\n\t"
  66186. "lsl r4, r7, #16\n\t"
  66187. "lsr r4, r4, #16\n\t"
  66188. "mul r3, r4, r3\n\t"
  66189. "lsr r4, r3, #16\n\t"
  66190. "lsl r3, r3, #16\n\t"
  66191. "adds r9, r9, r3\n\t"
  66192. "adcs r10, r10, r4\n\t"
  66193. "adc lr, lr, #0\n\t"
  66194. #else
  66195. "umull r3, r4, r6, r7\n\t"
  66196. "adds r9, r9, r3\n\t"
  66197. "adcs r10, r4, r10\n\t"
  66198. "adc lr, r5, lr\n\t"
  66199. #endif
  66200. /* A[4] * B[5] */
  66201. "ldr r6, [%[a], #16]\n\t"
  66202. "ldr r7, [%[b], #20]\n\t"
  66203. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66204. "lsl r3, r6, #16\n\t"
  66205. "lsl r4, r7, #16\n\t"
  66206. "lsr r3, r3, #16\n\t"
  66207. "lsr r4, r4, #16\n\t"
  66208. "mul r4, r3, r4\n\t"
  66209. "adds r9, r9, r4\n\t"
  66210. "adcs r10, r10, #0\n\t"
  66211. "adc lr, r5, lr\n\t"
  66212. "lsr r4, r7, #16\n\t"
  66213. "mul r3, r4, r3\n\t"
  66214. "lsr r4, r3, #16\n\t"
  66215. "lsl r3, r3, #16\n\t"
  66216. "adds r9, r9, r3\n\t"
  66217. "adcs r10, r10, r4\n\t"
  66218. "adc lr, lr, #0\n\t"
  66219. "lsr r3, r6, #16\n\t"
  66220. "lsr r4, r7, #16\n\t"
  66221. "mul r4, r3, r4\n\t"
  66222. "adds r10, r10, r4\n\t"
  66223. "adc lr, lr, #0\n\t"
  66224. "lsl r4, r7, #16\n\t"
  66225. "lsr r4, r4, #16\n\t"
  66226. "mul r3, r4, r3\n\t"
  66227. "lsr r4, r3, #16\n\t"
  66228. "lsl r3, r3, #16\n\t"
  66229. "adds r9, r9, r3\n\t"
  66230. "adcs r10, r10, r4\n\t"
  66231. "adc lr, lr, #0\n\t"
  66232. #else
  66233. "umull r3, r4, r6, r7\n\t"
  66234. "adds r9, r9, r3\n\t"
  66235. "adcs r10, r4, r10\n\t"
  66236. "adc lr, r5, lr\n\t"
  66237. #endif
  66238. /* A[5] * B[4] */
  66239. "ldr r6, [%[a], #20]\n\t"
  66240. "ldr r7, [%[b], #16]\n\t"
  66241. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66242. "lsl r3, r6, #16\n\t"
  66243. "lsl r4, r7, #16\n\t"
  66244. "lsr r3, r3, #16\n\t"
  66245. "lsr r4, r4, #16\n\t"
  66246. "mul r4, r3, r4\n\t"
  66247. "adds r9, r9, r4\n\t"
  66248. "adcs r10, r10, #0\n\t"
  66249. "adc lr, r5, lr\n\t"
  66250. "lsr r4, r7, #16\n\t"
  66251. "mul r3, r4, r3\n\t"
  66252. "lsr r4, r3, #16\n\t"
  66253. "lsl r3, r3, #16\n\t"
  66254. "adds r9, r9, r3\n\t"
  66255. "adcs r10, r10, r4\n\t"
  66256. "adc lr, lr, #0\n\t"
  66257. "lsr r3, r6, #16\n\t"
  66258. "lsr r4, r7, #16\n\t"
  66259. "mul r4, r3, r4\n\t"
  66260. "adds r10, r10, r4\n\t"
  66261. "adc lr, lr, #0\n\t"
  66262. "lsl r4, r7, #16\n\t"
  66263. "lsr r4, r4, #16\n\t"
  66264. "mul r3, r4, r3\n\t"
  66265. "lsr r4, r3, #16\n\t"
  66266. "lsl r3, r3, #16\n\t"
  66267. "adds r9, r9, r3\n\t"
  66268. "adcs r10, r10, r4\n\t"
  66269. "adc lr, lr, #0\n\t"
  66270. #else
  66271. "umull r3, r4, r6, r7\n\t"
  66272. "adds r9, r9, r3\n\t"
  66273. "adcs r10, r4, r10\n\t"
  66274. "adc lr, r5, lr\n\t"
  66275. #endif
  66276. /* A[6] * B[3] */
  66277. "ldr r6, [%[a], #24]\n\t"
  66278. "ldr r7, [%[b], #12]\n\t"
  66279. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66280. "lsl r3, r6, #16\n\t"
  66281. "lsl r4, r7, #16\n\t"
  66282. "lsr r3, r3, #16\n\t"
  66283. "lsr r4, r4, #16\n\t"
  66284. "mul r4, r3, r4\n\t"
  66285. "adds r9, r9, r4\n\t"
  66286. "adcs r10, r10, #0\n\t"
  66287. "adc lr, r5, lr\n\t"
  66288. "lsr r4, r7, #16\n\t"
  66289. "mul r3, r4, r3\n\t"
  66290. "lsr r4, r3, #16\n\t"
  66291. "lsl r3, r3, #16\n\t"
  66292. "adds r9, r9, r3\n\t"
  66293. "adcs r10, r10, r4\n\t"
  66294. "adc lr, lr, #0\n\t"
  66295. "lsr r3, r6, #16\n\t"
  66296. "lsr r4, r7, #16\n\t"
  66297. "mul r4, r3, r4\n\t"
  66298. "adds r10, r10, r4\n\t"
  66299. "adc lr, lr, #0\n\t"
  66300. "lsl r4, r7, #16\n\t"
  66301. "lsr r4, r4, #16\n\t"
  66302. "mul r3, r4, r3\n\t"
  66303. "lsr r4, r3, #16\n\t"
  66304. "lsl r3, r3, #16\n\t"
  66305. "adds r9, r9, r3\n\t"
  66306. "adcs r10, r10, r4\n\t"
  66307. "adc lr, lr, #0\n\t"
  66308. #else
  66309. "umull r3, r4, r6, r7\n\t"
  66310. "adds r9, r9, r3\n\t"
  66311. "adcs r10, r4, r10\n\t"
  66312. "adc lr, r5, lr\n\t"
  66313. #endif
  66314. /* A[7] * B[2] */
  66315. "ldr r6, [%[a], #28]\n\t"
  66316. "ldr r7, [%[b], #8]\n\t"
  66317. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66318. "lsl r3, r6, #16\n\t"
  66319. "lsl r4, r7, #16\n\t"
  66320. "lsr r3, r3, #16\n\t"
  66321. "lsr r4, r4, #16\n\t"
  66322. "mul r4, r3, r4\n\t"
  66323. "adds r9, r9, r4\n\t"
  66324. "adcs r10, r10, #0\n\t"
  66325. "adc lr, r5, lr\n\t"
  66326. "lsr r4, r7, #16\n\t"
  66327. "mul r3, r4, r3\n\t"
  66328. "lsr r4, r3, #16\n\t"
  66329. "lsl r3, r3, #16\n\t"
  66330. "adds r9, r9, r3\n\t"
  66331. "adcs r10, r10, r4\n\t"
  66332. "adc lr, lr, #0\n\t"
  66333. "lsr r3, r6, #16\n\t"
  66334. "lsr r4, r7, #16\n\t"
  66335. "mul r4, r3, r4\n\t"
  66336. "adds r10, r10, r4\n\t"
  66337. "adc lr, lr, #0\n\t"
  66338. "lsl r4, r7, #16\n\t"
  66339. "lsr r4, r4, #16\n\t"
  66340. "mul r3, r4, r3\n\t"
  66341. "lsr r4, r3, #16\n\t"
  66342. "lsl r3, r3, #16\n\t"
  66343. "adds r9, r9, r3\n\t"
  66344. "adcs r10, r10, r4\n\t"
  66345. "adc lr, lr, #0\n\t"
  66346. #else
  66347. "umull r3, r4, r6, r7\n\t"
  66348. "adds r9, r9, r3\n\t"
  66349. "adcs r10, r4, r10\n\t"
  66350. "adc lr, r5, lr\n\t"
  66351. #endif
  66352. "str r9, [sp, #36]\n\t"
  66353. /* A[7] * B[3] */
  66354. "ldr r7, [%[b], #12]\n\t"
  66355. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66356. "lsl r3, r6, #16\n\t"
  66357. "lsl r4, r7, #16\n\t"
  66358. "lsr r3, r3, #16\n\t"
  66359. "lsr r4, r4, #16\n\t"
  66360. "mul r4, r3, r4\n\t"
  66361. "adds r10, r10, r4\n\t"
  66362. "adcs lr, lr, #0\n\t"
  66363. "adc r8, r5, #0\n\t"
  66364. "lsr r4, r7, #16\n\t"
  66365. "mul r3, r4, r3\n\t"
  66366. "lsr r4, r3, #16\n\t"
  66367. "lsl r3, r3, #16\n\t"
  66368. "adds r10, r10, r3\n\t"
  66369. "adcs lr, lr, r4\n\t"
  66370. "adc r8, r8, #0\n\t"
  66371. "lsr r3, r6, #16\n\t"
  66372. "lsr r4, r7, #16\n\t"
  66373. "mul r4, r3, r4\n\t"
  66374. "adds lr, lr, r4\n\t"
  66375. "adc r8, r8, #0\n\t"
  66376. "lsl r4, r7, #16\n\t"
  66377. "lsr r4, r4, #16\n\t"
  66378. "mul r3, r4, r3\n\t"
  66379. "lsr r4, r3, #16\n\t"
  66380. "lsl r3, r3, #16\n\t"
  66381. "adds r10, r10, r3\n\t"
  66382. "adcs lr, lr, r4\n\t"
  66383. "adc r8, r8, #0\n\t"
  66384. #else
  66385. "umull r3, r4, r6, r7\n\t"
  66386. "adds r10, r10, r3\n\t"
  66387. "adcs lr, r4, lr\n\t"
  66388. "adc r8, r5, #0\n\t"
  66389. #endif
  66390. /* A[6] * B[4] */
  66391. "ldr r6, [%[a], #24]\n\t"
  66392. "ldr r7, [%[b], #16]\n\t"
  66393. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66394. "lsl r3, r6, #16\n\t"
  66395. "lsl r4, r7, #16\n\t"
  66396. "lsr r3, r3, #16\n\t"
  66397. "lsr r4, r4, #16\n\t"
  66398. "mul r4, r3, r4\n\t"
  66399. "adds r10, r10, r4\n\t"
  66400. "adcs lr, lr, #0\n\t"
  66401. "adc r8, r5, r8\n\t"
  66402. "lsr r4, r7, #16\n\t"
  66403. "mul r3, r4, r3\n\t"
  66404. "lsr r4, r3, #16\n\t"
  66405. "lsl r3, r3, #16\n\t"
  66406. "adds r10, r10, r3\n\t"
  66407. "adcs lr, lr, r4\n\t"
  66408. "adc r8, r8, #0\n\t"
  66409. "lsr r3, r6, #16\n\t"
  66410. "lsr r4, r7, #16\n\t"
  66411. "mul r4, r3, r4\n\t"
  66412. "adds lr, lr, r4\n\t"
  66413. "adc r8, r8, #0\n\t"
  66414. "lsl r4, r7, #16\n\t"
  66415. "lsr r4, r4, #16\n\t"
  66416. "mul r3, r4, r3\n\t"
  66417. "lsr r4, r3, #16\n\t"
  66418. "lsl r3, r3, #16\n\t"
  66419. "adds r10, r10, r3\n\t"
  66420. "adcs lr, lr, r4\n\t"
  66421. "adc r8, r8, #0\n\t"
  66422. #else
  66423. "umull r3, r4, r6, r7\n\t"
  66424. "adds r10, r10, r3\n\t"
  66425. "adcs lr, r4, lr\n\t"
  66426. "adc r8, r5, r8\n\t"
  66427. #endif
  66428. /* A[5] * B[5] */
  66429. "ldr r6, [%[a], #20]\n\t"
  66430. "ldr r7, [%[b], #20]\n\t"
  66431. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66432. "lsl r3, r6, #16\n\t"
  66433. "lsl r4, r7, #16\n\t"
  66434. "lsr r3, r3, #16\n\t"
  66435. "lsr r4, r4, #16\n\t"
  66436. "mul r4, r3, r4\n\t"
  66437. "adds r10, r10, r4\n\t"
  66438. "adcs lr, lr, #0\n\t"
  66439. "adc r8, r5, r8\n\t"
  66440. "lsr r4, r7, #16\n\t"
  66441. "mul r3, r4, r3\n\t"
  66442. "lsr r4, r3, #16\n\t"
  66443. "lsl r3, r3, #16\n\t"
  66444. "adds r10, r10, r3\n\t"
  66445. "adcs lr, lr, r4\n\t"
  66446. "adc r8, r8, #0\n\t"
  66447. "lsr r3, r6, #16\n\t"
  66448. "lsr r4, r7, #16\n\t"
  66449. "mul r4, r3, r4\n\t"
  66450. "adds lr, lr, r4\n\t"
  66451. "adc r8, r8, #0\n\t"
  66452. "lsl r4, r7, #16\n\t"
  66453. "lsr r4, r4, #16\n\t"
  66454. "mul r3, r4, r3\n\t"
  66455. "lsr r4, r3, #16\n\t"
  66456. "lsl r3, r3, #16\n\t"
  66457. "adds r10, r10, r3\n\t"
  66458. "adcs lr, lr, r4\n\t"
  66459. "adc r8, r8, #0\n\t"
  66460. #else
  66461. "umull r3, r4, r6, r7\n\t"
  66462. "adds r10, r10, r3\n\t"
  66463. "adcs lr, r4, lr\n\t"
  66464. "adc r8, r5, r8\n\t"
  66465. #endif
  66466. /* A[4] * B[6] */
  66467. "ldr r6, [%[a], #16]\n\t"
  66468. "ldr r7, [%[b], #24]\n\t"
  66469. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66470. "lsl r3, r6, #16\n\t"
  66471. "lsl r4, r7, #16\n\t"
  66472. "lsr r3, r3, #16\n\t"
  66473. "lsr r4, r4, #16\n\t"
  66474. "mul r4, r3, r4\n\t"
  66475. "adds r10, r10, r4\n\t"
  66476. "adcs lr, lr, #0\n\t"
  66477. "adc r8, r5, r8\n\t"
  66478. "lsr r4, r7, #16\n\t"
  66479. "mul r3, r4, r3\n\t"
  66480. "lsr r4, r3, #16\n\t"
  66481. "lsl r3, r3, #16\n\t"
  66482. "adds r10, r10, r3\n\t"
  66483. "adcs lr, lr, r4\n\t"
  66484. "adc r8, r8, #0\n\t"
  66485. "lsr r3, r6, #16\n\t"
  66486. "lsr r4, r7, #16\n\t"
  66487. "mul r4, r3, r4\n\t"
  66488. "adds lr, lr, r4\n\t"
  66489. "adc r8, r8, #0\n\t"
  66490. "lsl r4, r7, #16\n\t"
  66491. "lsr r4, r4, #16\n\t"
  66492. "mul r3, r4, r3\n\t"
  66493. "lsr r4, r3, #16\n\t"
  66494. "lsl r3, r3, #16\n\t"
  66495. "adds r10, r10, r3\n\t"
  66496. "adcs lr, lr, r4\n\t"
  66497. "adc r8, r8, #0\n\t"
  66498. #else
  66499. "umull r3, r4, r6, r7\n\t"
  66500. "adds r10, r10, r3\n\t"
  66501. "adcs lr, r4, lr\n\t"
  66502. "adc r8, r5, r8\n\t"
  66503. #endif
  66504. /* A[3] * B[7] */
  66505. "ldr r6, [%[a], #12]\n\t"
  66506. "ldr r7, [%[b], #28]\n\t"
  66507. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66508. "lsl r3, r6, #16\n\t"
  66509. "lsl r4, r7, #16\n\t"
  66510. "lsr r3, r3, #16\n\t"
  66511. "lsr r4, r4, #16\n\t"
  66512. "mul r4, r3, r4\n\t"
  66513. "adds r10, r10, r4\n\t"
  66514. "adcs lr, lr, #0\n\t"
  66515. "adc r8, r5, r8\n\t"
  66516. "lsr r4, r7, #16\n\t"
  66517. "mul r3, r4, r3\n\t"
  66518. "lsr r4, r3, #16\n\t"
  66519. "lsl r3, r3, #16\n\t"
  66520. "adds r10, r10, r3\n\t"
  66521. "adcs lr, lr, r4\n\t"
  66522. "adc r8, r8, #0\n\t"
  66523. "lsr r3, r6, #16\n\t"
  66524. "lsr r4, r7, #16\n\t"
  66525. "mul r4, r3, r4\n\t"
  66526. "adds lr, lr, r4\n\t"
  66527. "adc r8, r8, #0\n\t"
  66528. "lsl r4, r7, #16\n\t"
  66529. "lsr r4, r4, #16\n\t"
  66530. "mul r3, r4, r3\n\t"
  66531. "lsr r4, r3, #16\n\t"
  66532. "lsl r3, r3, #16\n\t"
  66533. "adds r10, r10, r3\n\t"
  66534. "adcs lr, lr, r4\n\t"
  66535. "adc r8, r8, #0\n\t"
  66536. #else
  66537. "umull r3, r4, r6, r7\n\t"
  66538. "adds r10, r10, r3\n\t"
  66539. "adcs lr, r4, lr\n\t"
  66540. "adc r8, r5, r8\n\t"
  66541. #endif
  66542. "str r10, [sp, #40]\n\t"
  66543. /* A[4] * B[7] */
  66544. "ldr r6, [%[a], #16]\n\t"
  66545. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66546. "lsl r3, r6, #16\n\t"
  66547. "lsl r4, r7, #16\n\t"
  66548. "lsr r3, r3, #16\n\t"
  66549. "lsr r4, r4, #16\n\t"
  66550. "mul r4, r3, r4\n\t"
  66551. "adds lr, lr, r4\n\t"
  66552. "adcs r8, r8, #0\n\t"
  66553. "adc r9, r5, #0\n\t"
  66554. "lsr r4, r7, #16\n\t"
  66555. "mul r3, r4, r3\n\t"
  66556. "lsr r4, r3, #16\n\t"
  66557. "lsl r3, r3, #16\n\t"
  66558. "adds lr, lr, r3\n\t"
  66559. "adcs r8, r8, r4\n\t"
  66560. "adc r9, r9, #0\n\t"
  66561. "lsr r3, r6, #16\n\t"
  66562. "lsr r4, r7, #16\n\t"
  66563. "mul r4, r3, r4\n\t"
  66564. "adds r8, r8, r4\n\t"
  66565. "adc r9, r9, #0\n\t"
  66566. "lsl r4, r7, #16\n\t"
  66567. "lsr r4, r4, #16\n\t"
  66568. "mul r3, r4, r3\n\t"
  66569. "lsr r4, r3, #16\n\t"
  66570. "lsl r3, r3, #16\n\t"
  66571. "adds lr, lr, r3\n\t"
  66572. "adcs r8, r8, r4\n\t"
  66573. "adc r9, r9, #0\n\t"
  66574. #else
  66575. "umull r3, r4, r6, r7\n\t"
  66576. "adds lr, lr, r3\n\t"
  66577. "adcs r8, r4, r8\n\t"
  66578. "adc r9, r5, #0\n\t"
  66579. #endif
  66580. /* A[5] * B[6] */
  66581. "ldr r6, [%[a], #20]\n\t"
  66582. "ldr r7, [%[b], #24]\n\t"
  66583. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66584. "lsl r3, r6, #16\n\t"
  66585. "lsl r4, r7, #16\n\t"
  66586. "lsr r3, r3, #16\n\t"
  66587. "lsr r4, r4, #16\n\t"
  66588. "mul r4, r3, r4\n\t"
  66589. "adds lr, lr, r4\n\t"
  66590. "adcs r8, r8, #0\n\t"
  66591. "adc r9, r5, r9\n\t"
  66592. "lsr r4, r7, #16\n\t"
  66593. "mul r3, r4, r3\n\t"
  66594. "lsr r4, r3, #16\n\t"
  66595. "lsl r3, r3, #16\n\t"
  66596. "adds lr, lr, r3\n\t"
  66597. "adcs r8, r8, r4\n\t"
  66598. "adc r9, r9, #0\n\t"
  66599. "lsr r3, r6, #16\n\t"
  66600. "lsr r4, r7, #16\n\t"
  66601. "mul r4, r3, r4\n\t"
  66602. "adds r8, r8, r4\n\t"
  66603. "adc r9, r9, #0\n\t"
  66604. "lsl r4, r7, #16\n\t"
  66605. "lsr r4, r4, #16\n\t"
  66606. "mul r3, r4, r3\n\t"
  66607. "lsr r4, r3, #16\n\t"
  66608. "lsl r3, r3, #16\n\t"
  66609. "adds lr, lr, r3\n\t"
  66610. "adcs r8, r8, r4\n\t"
  66611. "adc r9, r9, #0\n\t"
  66612. #else
  66613. "umull r3, r4, r6, r7\n\t"
  66614. "adds lr, lr, r3\n\t"
  66615. "adcs r8, r4, r8\n\t"
  66616. "adc r9, r5, r9\n\t"
  66617. #endif
  66618. /* A[6] * B[5] */
  66619. "ldr r6, [%[a], #24]\n\t"
  66620. "ldr r7, [%[b], #20]\n\t"
  66621. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66622. "lsl r3, r6, #16\n\t"
  66623. "lsl r4, r7, #16\n\t"
  66624. "lsr r3, r3, #16\n\t"
  66625. "lsr r4, r4, #16\n\t"
  66626. "mul r4, r3, r4\n\t"
  66627. "adds lr, lr, r4\n\t"
  66628. "adcs r8, r8, #0\n\t"
  66629. "adc r9, r5, r9\n\t"
  66630. "lsr r4, r7, #16\n\t"
  66631. "mul r3, r4, r3\n\t"
  66632. "lsr r4, r3, #16\n\t"
  66633. "lsl r3, r3, #16\n\t"
  66634. "adds lr, lr, r3\n\t"
  66635. "adcs r8, r8, r4\n\t"
  66636. "adc r9, r9, #0\n\t"
  66637. "lsr r3, r6, #16\n\t"
  66638. "lsr r4, r7, #16\n\t"
  66639. "mul r4, r3, r4\n\t"
  66640. "adds r8, r8, r4\n\t"
  66641. "adc r9, r9, #0\n\t"
  66642. "lsl r4, r7, #16\n\t"
  66643. "lsr r4, r4, #16\n\t"
  66644. "mul r3, r4, r3\n\t"
  66645. "lsr r4, r3, #16\n\t"
  66646. "lsl r3, r3, #16\n\t"
  66647. "adds lr, lr, r3\n\t"
  66648. "adcs r8, r8, r4\n\t"
  66649. "adc r9, r9, #0\n\t"
  66650. #else
  66651. "umull r3, r4, r6, r7\n\t"
  66652. "adds lr, lr, r3\n\t"
  66653. "adcs r8, r4, r8\n\t"
  66654. "adc r9, r5, r9\n\t"
  66655. #endif
  66656. /* A[7] * B[4] */
  66657. "ldr r6, [%[a], #28]\n\t"
  66658. "ldr r7, [%[b], #16]\n\t"
  66659. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66660. "lsl r3, r6, #16\n\t"
  66661. "lsl r4, r7, #16\n\t"
  66662. "lsr r3, r3, #16\n\t"
  66663. "lsr r4, r4, #16\n\t"
  66664. "mul r4, r3, r4\n\t"
  66665. "adds lr, lr, r4\n\t"
  66666. "adcs r8, r8, #0\n\t"
  66667. "adc r9, r5, r9\n\t"
  66668. "lsr r4, r7, #16\n\t"
  66669. "mul r3, r4, r3\n\t"
  66670. "lsr r4, r3, #16\n\t"
  66671. "lsl r3, r3, #16\n\t"
  66672. "adds lr, lr, r3\n\t"
  66673. "adcs r8, r8, r4\n\t"
  66674. "adc r9, r9, #0\n\t"
  66675. "lsr r3, r6, #16\n\t"
  66676. "lsr r4, r7, #16\n\t"
  66677. "mul r4, r3, r4\n\t"
  66678. "adds r8, r8, r4\n\t"
  66679. "adc r9, r9, #0\n\t"
  66680. "lsl r4, r7, #16\n\t"
  66681. "lsr r4, r4, #16\n\t"
  66682. "mul r3, r4, r3\n\t"
  66683. "lsr r4, r3, #16\n\t"
  66684. "lsl r3, r3, #16\n\t"
  66685. "adds lr, lr, r3\n\t"
  66686. "adcs r8, r8, r4\n\t"
  66687. "adc r9, r9, #0\n\t"
  66688. #else
  66689. "umull r3, r4, r6, r7\n\t"
  66690. "adds lr, lr, r3\n\t"
  66691. "adcs r8, r4, r8\n\t"
  66692. "adc r9, r5, r9\n\t"
  66693. #endif
  66694. "str lr, [sp, #44]\n\t"
  66695. /* A[7] * B[5] */
  66696. "ldr r7, [%[b], #20]\n\t"
  66697. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66698. "lsl r3, r6, #16\n\t"
  66699. "lsl r4, r7, #16\n\t"
  66700. "lsr r3, r3, #16\n\t"
  66701. "lsr r4, r4, #16\n\t"
  66702. "mul r4, r3, r4\n\t"
  66703. "adds r8, r8, r4\n\t"
  66704. "adcs r9, r9, #0\n\t"
  66705. "adc r10, r5, #0\n\t"
  66706. "lsr r4, r7, #16\n\t"
  66707. "mul r3, r4, r3\n\t"
  66708. "lsr r4, r3, #16\n\t"
  66709. "lsl r3, r3, #16\n\t"
  66710. "adds r8, r8, r3\n\t"
  66711. "adcs r9, r9, r4\n\t"
  66712. "adc r10, r10, #0\n\t"
  66713. "lsr r3, r6, #16\n\t"
  66714. "lsr r4, r7, #16\n\t"
  66715. "mul r4, r3, r4\n\t"
  66716. "adds r9, r9, r4\n\t"
  66717. "adc r10, r10, #0\n\t"
  66718. "lsl r4, r7, #16\n\t"
  66719. "lsr r4, r4, #16\n\t"
  66720. "mul r3, r4, r3\n\t"
  66721. "lsr r4, r3, #16\n\t"
  66722. "lsl r3, r3, #16\n\t"
  66723. "adds r8, r8, r3\n\t"
  66724. "adcs r9, r9, r4\n\t"
  66725. "adc r10, r10, #0\n\t"
  66726. #else
  66727. "umull r3, r4, r6, r7\n\t"
  66728. "adds r8, r8, r3\n\t"
  66729. "adcs r9, r4, r9\n\t"
  66730. "adc r10, r5, #0\n\t"
  66731. #endif
  66732. /* A[6] * B[6] */
  66733. "ldr r6, [%[a], #24]\n\t"
  66734. "ldr r7, [%[b], #24]\n\t"
  66735. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66736. "lsl r3, r6, #16\n\t"
  66737. "lsl r4, r7, #16\n\t"
  66738. "lsr r3, r3, #16\n\t"
  66739. "lsr r4, r4, #16\n\t"
  66740. "mul r4, r3, r4\n\t"
  66741. "adds r8, r8, r4\n\t"
  66742. "adcs r9, r9, #0\n\t"
  66743. "adc r10, r5, r10\n\t"
  66744. "lsr r4, r7, #16\n\t"
  66745. "mul r3, r4, r3\n\t"
  66746. "lsr r4, r3, #16\n\t"
  66747. "lsl r3, r3, #16\n\t"
  66748. "adds r8, r8, r3\n\t"
  66749. "adcs r9, r9, r4\n\t"
  66750. "adc r10, r10, #0\n\t"
  66751. "lsr r3, r6, #16\n\t"
  66752. "lsr r4, r7, #16\n\t"
  66753. "mul r4, r3, r4\n\t"
  66754. "adds r9, r9, r4\n\t"
  66755. "adc r10, r10, #0\n\t"
  66756. "lsl r4, r7, #16\n\t"
  66757. "lsr r4, r4, #16\n\t"
  66758. "mul r3, r4, r3\n\t"
  66759. "lsr r4, r3, #16\n\t"
  66760. "lsl r3, r3, #16\n\t"
  66761. "adds r8, r8, r3\n\t"
  66762. "adcs r9, r9, r4\n\t"
  66763. "adc r10, r10, #0\n\t"
  66764. #else
  66765. "umull r3, r4, r6, r7\n\t"
  66766. "adds r8, r8, r3\n\t"
  66767. "adcs r9, r4, r9\n\t"
  66768. "adc r10, r5, r10\n\t"
  66769. #endif
  66770. /* A[5] * B[7] */
  66771. "ldr r6, [%[a], #20]\n\t"
  66772. "ldr r7, [%[b], #28]\n\t"
  66773. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66774. "lsl r3, r6, #16\n\t"
  66775. "lsl r4, r7, #16\n\t"
  66776. "lsr r3, r3, #16\n\t"
  66777. "lsr r4, r4, #16\n\t"
  66778. "mul r4, r3, r4\n\t"
  66779. "adds r8, r8, r4\n\t"
  66780. "adcs r9, r9, #0\n\t"
  66781. "adc r10, r5, r10\n\t"
  66782. "lsr r4, r7, #16\n\t"
  66783. "mul r3, r4, r3\n\t"
  66784. "lsr r4, r3, #16\n\t"
  66785. "lsl r3, r3, #16\n\t"
  66786. "adds r8, r8, r3\n\t"
  66787. "adcs r9, r9, r4\n\t"
  66788. "adc r10, r10, #0\n\t"
  66789. "lsr r3, r6, #16\n\t"
  66790. "lsr r4, r7, #16\n\t"
  66791. "mul r4, r3, r4\n\t"
  66792. "adds r9, r9, r4\n\t"
  66793. "adc r10, r10, #0\n\t"
  66794. "lsl r4, r7, #16\n\t"
  66795. "lsr r4, r4, #16\n\t"
  66796. "mul r3, r4, r3\n\t"
  66797. "lsr r4, r3, #16\n\t"
  66798. "lsl r3, r3, #16\n\t"
  66799. "adds r8, r8, r3\n\t"
  66800. "adcs r9, r9, r4\n\t"
  66801. "adc r10, r10, #0\n\t"
  66802. #else
  66803. "umull r3, r4, r6, r7\n\t"
  66804. "adds r8, r8, r3\n\t"
  66805. "adcs r9, r4, r9\n\t"
  66806. "adc r10, r5, r10\n\t"
  66807. #endif
  66808. /* A[6] * B[7] */
  66809. "ldr r6, [%[a], #24]\n\t"
  66810. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66811. "lsl r3, r6, #16\n\t"
  66812. "lsl r4, r7, #16\n\t"
  66813. "lsr r3, r3, #16\n\t"
  66814. "lsr r4, r4, #16\n\t"
  66815. "mul r4, r3, r4\n\t"
  66816. "adds r9, r9, r4\n\t"
  66817. "adcs r10, r10, #0\n\t"
  66818. "adc lr, r5, #0\n\t"
  66819. "lsr r4, r7, #16\n\t"
  66820. "mul r3, r4, r3\n\t"
  66821. "lsr r4, r3, #16\n\t"
  66822. "lsl r3, r3, #16\n\t"
  66823. "adds r9, r9, r3\n\t"
  66824. "adcs r10, r10, r4\n\t"
  66825. "adc lr, lr, #0\n\t"
  66826. "lsr r3, r6, #16\n\t"
  66827. "lsr r4, r7, #16\n\t"
  66828. "mul r4, r3, r4\n\t"
  66829. "adds r10, r10, r4\n\t"
  66830. "adc lr, lr, #0\n\t"
  66831. "lsl r4, r7, #16\n\t"
  66832. "lsr r4, r4, #16\n\t"
  66833. "mul r3, r4, r3\n\t"
  66834. "lsr r4, r3, #16\n\t"
  66835. "lsl r3, r3, #16\n\t"
  66836. "adds r9, r9, r3\n\t"
  66837. "adcs r10, r10, r4\n\t"
  66838. "adc lr, lr, #0\n\t"
  66839. #else
  66840. "umull r3, r4, r6, r7\n\t"
  66841. "adds r9, r9, r3\n\t"
  66842. "adcs r10, r4, r10\n\t"
  66843. "adc lr, r5, #0\n\t"
  66844. #endif
  66845. /* A[7] * B[6] */
  66846. "ldr r6, [%[a], #28]\n\t"
  66847. "ldr r7, [%[b], #24]\n\t"
  66848. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66849. "lsl r3, r6, #16\n\t"
  66850. "lsl r4, r7, #16\n\t"
  66851. "lsr r3, r3, #16\n\t"
  66852. "lsr r4, r4, #16\n\t"
  66853. "mul r4, r3, r4\n\t"
  66854. "adds r9, r9, r4\n\t"
  66855. "adcs r10, r10, #0\n\t"
  66856. "adc lr, r5, lr\n\t"
  66857. "lsr r4, r7, #16\n\t"
  66858. "mul r3, r4, r3\n\t"
  66859. "lsr r4, r3, #16\n\t"
  66860. "lsl r3, r3, #16\n\t"
  66861. "adds r9, r9, r3\n\t"
  66862. "adcs r10, r10, r4\n\t"
  66863. "adc lr, lr, #0\n\t"
  66864. "lsr r3, r6, #16\n\t"
  66865. "lsr r4, r7, #16\n\t"
  66866. "mul r4, r3, r4\n\t"
  66867. "adds r10, r10, r4\n\t"
  66868. "adc lr, lr, #0\n\t"
  66869. "lsl r4, r7, #16\n\t"
  66870. "lsr r4, r4, #16\n\t"
  66871. "mul r3, r4, r3\n\t"
  66872. "lsr r4, r3, #16\n\t"
  66873. "lsl r3, r3, #16\n\t"
  66874. "adds r9, r9, r3\n\t"
  66875. "adcs r10, r10, r4\n\t"
  66876. "adc lr, lr, #0\n\t"
  66877. #else
  66878. "umull r3, r4, r6, r7\n\t"
  66879. "adds r9, r9, r3\n\t"
  66880. "adcs r10, r4, r10\n\t"
  66881. "adc lr, r5, lr\n\t"
  66882. #endif
  66883. /* A[7] * B[7] */
  66884. "ldr r7, [%[b], #28]\n\t"
  66885. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  66886. "lsl r3, r6, #16\n\t"
  66887. "lsl r4, r7, #16\n\t"
  66888. "lsr r3, r3, #16\n\t"
  66889. "lsr r4, r4, #16\n\t"
  66890. "mul r4, r3, r4\n\t"
  66891. "adds r10, r10, r4\n\t"
  66892. "adc lr, lr, #0\n\t"
  66893. "lsr r4, r7, #16\n\t"
  66894. "mul r3, r4, r3\n\t"
  66895. "lsr r4, r3, #16\n\t"
  66896. "lsl r3, r3, #16\n\t"
  66897. "adds r10, r10, r3\n\t"
  66898. "adc lr, lr, r4\n\t"
  66899. "lsr r3, r6, #16\n\t"
  66900. "lsr r4, r7, #16\n\t"
  66901. "mul r4, r3, r4\n\t"
  66902. "add lr, lr, r4\n\t"
  66903. "lsl r4, r7, #16\n\t"
  66904. "lsr r4, r4, #16\n\t"
  66905. "mul r3, r4, r3\n\t"
  66906. "lsr r4, r3, #16\n\t"
  66907. "lsl r3, r3, #16\n\t"
  66908. "adds r10, r10, r3\n\t"
  66909. "adc lr, lr, r4\n\t"
  66910. #else
  66911. "umull r3, r4, r6, r7\n\t"
  66912. "adds r10, r10, r3\n\t"
  66913. "adc lr, r4, lr\n\t"
  66914. #endif
  66915. "str r8, [sp, #48]\n\t"
  66916. "str r9, [sp, #52]\n\t"
  66917. "str r10, [sp, #56]\n\t"
  66918. "str lr, [sp, #60]\n\t"
  66919. /* Start Reduction */
  66920. "ldr r4, [sp]\n\t"
  66921. "ldr r5, [sp, #4]\n\t"
  66922. "ldr r6, [sp, #8]\n\t"
  66923. "ldr r7, [sp, #12]\n\t"
  66924. "ldr r8, [sp, #16]\n\t"
  66925. "ldr r9, [sp, #20]\n\t"
  66926. "ldr r10, [sp, #24]\n\t"
  66927. "ldr lr, [sp, #28]\n\t"
  66928. /* mu = a[0..7] + a[0..4] << 96 + (a[0..1] * 2) << 192 */
  66929. /* - a[0] << 224 */
  66930. /* + (a[0..1] * 2) << (6 * 32) */
  66931. "adds r10, r10, r4\n\t"
  66932. "adc lr, lr, r5\n\t"
  66933. "adds r10, r10, r4\n\t"
  66934. "adc lr, lr, r5\n\t"
  66935. /* - a[0] << (7 * 32) */
  66936. "sub lr, lr, r4\n\t"
  66937. /* + a[0..4] << (3 * 32) */
  66938. "mov %[a], r7\n\t"
  66939. "mov r12, r8\n\t"
  66940. "adds r7, r7, r4\n\t"
  66941. "adcs r8, r8, r5\n\t"
  66942. "adcs r9, r9, r6\n\t"
  66943. "adcs r10, r10, %[a]\n\t"
  66944. "adc lr, lr, r12\n\t"
  66945. "str r7, [sp, #12]\n\t"
  66946. "str r8, [sp, #16]\n\t"
  66947. "str r9, [sp, #20]\n\t"
  66948. /* a += mu * m */
  66949. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  66950. /* a[6] += t[0] + t[3] */
  66951. /* a[7] += t[1] + t[4] */
  66952. "ldr %[a], [sp, #24]\n\t"
  66953. "ldr %[b], [sp, #28]\n\t"
  66954. "adds %[a], %[a], r4\n\t"
  66955. "adcs %[b], %[b], r5\n\t"
  66956. "mov r12, #0\n\t"
  66957. "adc r12, r12, #0\n\t"
  66958. "adds %[a], %[a], r7\n\t"
  66959. "adcs %[b], %[b], r8\n\t"
  66960. "adc r12, r12, #0\n\t"
  66961. "str r10, [sp, #24]\n\t"
  66962. "str lr, [sp, #28]\n\t"
  66963. "str %[b], [sp, #64]\n\t"
  66964. /* a[8] += t[0] + t[2] + t[5] */
  66965. /* a[9] += t[1] + t[3] + t[6] */
  66966. /* a[10] += t[2] + t[4] + t[7] */
  66967. "ldr %[a], [sp, #32]\n\t"
  66968. "ldr %[b], [sp, #36]\n\t"
  66969. "ldr r3, [sp, #40]\n\t"
  66970. "adds %[a], %[a], r12\n\t"
  66971. "adcs %[b], %[b], #0\n\t"
  66972. "adcs r3, r3, #0\n\t"
  66973. "mov r12, #0\n\t"
  66974. "adc r12, r12, #0\n\t"
  66975. "adds %[a], %[a], r4\n\t"
  66976. "adcs %[b], %[b], r5\n\t"
  66977. "adcs r3, r3, r6\n\t"
  66978. "adc r12, r12, #0\n\t"
  66979. "adds %[a], %[a], r6\n\t"
  66980. "adcs %[b], %[b], r7\n\t"
  66981. "adcs r3, r3, r8\n\t"
  66982. "adc r12, r12, #0\n\t"
  66983. "adds %[a], %[a], r9\n\t"
  66984. "adcs %[b], %[b], r10\n\t"
  66985. "adcs r3, r3, lr\n\t"
  66986. "adc r12, r12, #0\n\t"
  66987. "str %[a], [sp, #32]\n\t"
  66988. "str %[b], [sp, #36]\n\t"
  66989. "str r3, [sp, #40]\n\t"
  66990. /* a[11] += t[3] + t[5] */
  66991. /* a[12] += t[4] + t[6] */
  66992. /* a[13] += t[5] + t[7] */
  66993. /* a[14] += t[6] */
  66994. /* a[15] += t[7] */
  66995. "ldr %[a], [sp, #44]\n\t"
  66996. "ldr %[b], [sp, #48]\n\t"
  66997. "ldr r3, [sp, #52]\n\t"
  66998. "ldr r4, [sp, #56]\n\t"
  66999. "ldr r5, [sp, #60]\n\t"
  67000. "adds %[a], %[a], r12\n\t"
  67001. "adcs %[b], %[b], #0\n\t"
  67002. "adcs r3, r3, #0\n\t"
  67003. "adcs r4, r4, #0\n\t"
  67004. "adcs r5, r5, #0\n\t"
  67005. "mov r12, #0\n\t"
  67006. "adc r12, r12, #0\n\t"
  67007. "adds %[a], %[a], r7\n\t"
  67008. "adcs %[b], %[b], r8\n\t"
  67009. "adcs r3, r3, r9\n\t"
  67010. "adcs r4, r4, r10\n\t"
  67011. "adcs r5, r5, lr\n\t"
  67012. "adc r12, r12, #0\n\t"
  67013. "adds %[a], %[a], r9\n\t"
  67014. "adcs %[b], %[b], r10\n\t"
  67015. "adcs r3, r3, lr\n\t"
  67016. "adcs r4, r4, #0\n\t"
  67017. "adcs r5, r5, #0\n\t"
  67018. "adc r12, r12, #0\n\t"
  67019. "str %[a], [sp, #44]\n\t"
  67020. "str %[b], [sp, #48]\n\t"
  67021. "str r3, [sp, #52]\n\t"
  67022. "str r4, [sp, #56]\n\t"
  67023. "str r5, [sp, #60]\n\t"
  67024. "ldr %[a], [sp, #64]\n\t"
  67025. "ldr %[b], [sp, #32]\n\t"
  67026. "ldr r3, [sp, #36]\n\t"
  67027. "ldr r4, [sp, #40]\n\t"
  67028. "ldr r8, [sp]\n\t"
  67029. "ldr r9, [sp, #4]\n\t"
  67030. "ldr r10, [sp, #8]\n\t"
  67031. "ldr lr, [sp, #12]\n\t"
  67032. "subs %[a], %[a], r8\n\t"
  67033. "sbcs %[b], %[b], r9\n\t"
  67034. "sbcs r3, r3, r10\n\t"
  67035. "sbcs r4, r4, lr\n\t"
  67036. "str %[b], [sp, #32]\n\t"
  67037. "str r3, [sp, #36]\n\t"
  67038. "str r4, [sp, #40]\n\t"
  67039. "ldr %[a], [sp, #44]\n\t"
  67040. "ldr %[b], [sp, #48]\n\t"
  67041. "ldr r3, [sp, #52]\n\t"
  67042. "ldr r4, [sp, #56]\n\t"
  67043. "ldr r5, [sp, #60]\n\t"
  67044. "ldr r8, [sp, #16]\n\t"
  67045. "ldr r9, [sp, #20]\n\t"
  67046. "ldr r10, [sp, #24]\n\t"
  67047. "ldr lr, [sp, #28]\n\t"
  67048. "sbcs %[a], %[a], r8\n\t"
  67049. "sbcs %[b], %[b], r9\n\t"
  67050. "sbcs r3, r3, r10\n\t"
  67051. "sbcs r4, r4, lr\n\t"
  67052. "sbc r5, r5, #0\n\t"
  67053. /* mask m and sub from result if overflow */
  67054. "rsb r12, r12, #0\n\t"
  67055. "and lr, r12, #1\n\t"
  67056. "ldr r6, [sp, #32]\n\t"
  67057. "ldr r7, [sp, #36]\n\t"
  67058. "ldr r8, [sp, #40]\n\t"
  67059. "subs r6, r6, r12\n\t"
  67060. "sbcs r7, r7, r12\n\t"
  67061. "sbcs r8, r8, r12\n\t"
  67062. "sbcs %[a], %[a], #0\n\t"
  67063. "sbcs %[b], %[b], #0\n\t"
  67064. "sbcs r3, r3, #0\n\t"
  67065. "sbcs r4, r4, lr\n\t"
  67066. "sbc r5, r5, r12\n\t"
  67067. "stm %[r]!, {r6, r7, r8}\n\t"
  67068. "stm %[r]!, {%[a], %[b], r3, r4, r5}\n\t"
  67069. "add sp, sp, #0x44\n\t"
  67070. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  67071. :
  67072. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r12"
  67073. );
  67074. (void)mp_p;
  67075. (void)m_p;
  67076. (void)mp_p;
  67077. }
  67078. /* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m)
  67079. *
  67080. * r Result of squaring.
  67081. * a Number to square in Montgomery form.
  67082. * m Modulus (prime).
  67083. * mp Montgomery mulitplier.
  67084. */
  67085. static SP_NOINLINE void sp_256_mont_sqr_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  67086. {
  67087. register sp_digit* r asm ("r0") = r_p;
  67088. register const sp_digit* a asm ("r1") = a_p;
  67089. __asm__ __volatile__ (
  67090. "sub sp, sp, #0x44\n\t"
  67091. "mov r5, #0\n\t"
  67092. /* A[0] * A[1] */
  67093. "ldr r6, [%[a]]\n\t"
  67094. "ldr r7, [%[a], #4]\n\t"
  67095. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67096. "lsl r3, r6, #16\n\t"
  67097. "lsl r9, r7, #16\n\t"
  67098. "lsr r3, r3, #16\n\t"
  67099. "lsr r9, r9, #16\n\t"
  67100. "mul r9, r3, r9\n\t"
  67101. "lsr r4, r7, #16\n\t"
  67102. "mul r3, r4, r3\n\t"
  67103. "lsr r10, r3, #16\n\t"
  67104. "lsl r3, r3, #16\n\t"
  67105. "adds r9, r9, r3\n\t"
  67106. "adc r10, r10, #0\n\t"
  67107. "lsr r3, r6, #16\n\t"
  67108. "mul r4, r3, r4\n\t"
  67109. "add r10, r10, r4\n\t"
  67110. "lsl r4, r7, #16\n\t"
  67111. "lsr r4, r4, #16\n\t"
  67112. "mul r3, r4, r3\n\t"
  67113. "lsr r4, r3, #16\n\t"
  67114. "lsl r3, r3, #16\n\t"
  67115. "adds r9, r9, r3\n\t"
  67116. "adc r10, r10, r4\n\t"
  67117. #else
  67118. "umull r9, r10, r6, r7\n\t"
  67119. #endif
  67120. "str r9, [sp, #4]\n\t"
  67121. /* A[0] * A[2] */
  67122. "ldr r7, [%[a], #8]\n\t"
  67123. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67124. "lsl r3, r6, #16\n\t"
  67125. "lsl r4, r7, #16\n\t"
  67126. "lsr r3, r3, #16\n\t"
  67127. "lsr r4, r4, #16\n\t"
  67128. "mul r4, r3, r4\n\t"
  67129. "mov lr, #0\n\t"
  67130. "adds r10, r10, r4\n\t"
  67131. "adc lr, lr, #0\n\t"
  67132. "lsr r4, r7, #16\n\t"
  67133. "mul r3, r4, r3\n\t"
  67134. "lsr r4, r3, #16\n\t"
  67135. "lsl r3, r3, #16\n\t"
  67136. "adds r10, r10, r3\n\t"
  67137. "adc lr, lr, r4\n\t"
  67138. "lsr r3, r6, #16\n\t"
  67139. "lsr r4, r7, #16\n\t"
  67140. "mul r4, r3, r4\n\t"
  67141. "add lr, lr, r4\n\t"
  67142. "lsl r4, r7, #16\n\t"
  67143. "lsr r4, r4, #16\n\t"
  67144. "mul r3, r4, r3\n\t"
  67145. "lsr r4, r3, #16\n\t"
  67146. "lsl r3, r3, #16\n\t"
  67147. "adds r10, r10, r3\n\t"
  67148. "adc lr, lr, r4\n\t"
  67149. #else
  67150. "umull r3, r4, r6, r7\n\t"
  67151. "adds r10, r10, r3\n\t"
  67152. "adc lr, r4, #0\n\t"
  67153. #endif
  67154. "str r10, [sp, #8]\n\t"
  67155. /* A[0] * A[3] */
  67156. "ldr r7, [%[a], #12]\n\t"
  67157. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67158. "lsl r3, r6, #16\n\t"
  67159. "lsl r4, r7, #16\n\t"
  67160. "lsr r3, r3, #16\n\t"
  67161. "lsr r4, r4, #16\n\t"
  67162. "mul r4, r3, r4\n\t"
  67163. "mov r8, #0\n\t"
  67164. "adds lr, lr, r4\n\t"
  67165. "adc r8, r8, #0\n\t"
  67166. "lsr r4, r7, #16\n\t"
  67167. "mul r3, r4, r3\n\t"
  67168. "lsr r4, r3, #16\n\t"
  67169. "lsl r3, r3, #16\n\t"
  67170. "adds lr, lr, r3\n\t"
  67171. "adc r8, r8, r4\n\t"
  67172. "lsr r3, r6, #16\n\t"
  67173. "lsr r4, r7, #16\n\t"
  67174. "mul r4, r3, r4\n\t"
  67175. "add r8, r8, r4\n\t"
  67176. "lsl r4, r7, #16\n\t"
  67177. "lsr r4, r4, #16\n\t"
  67178. "mul r3, r4, r3\n\t"
  67179. "lsr r4, r3, #16\n\t"
  67180. "lsl r3, r3, #16\n\t"
  67181. "adds lr, lr, r3\n\t"
  67182. "adc r8, r8, r4\n\t"
  67183. #else
  67184. "umull r3, r4, r6, r7\n\t"
  67185. "adds lr, lr, r3\n\t"
  67186. "adc r8, r4, #0\n\t"
  67187. #endif
  67188. /* A[1] * A[2] */
  67189. "ldr r6, [%[a], #4]\n\t"
  67190. "ldr r7, [%[a], #8]\n\t"
  67191. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67192. "lsl r3, r6, #16\n\t"
  67193. "lsl r4, r7, #16\n\t"
  67194. "lsr r3, r3, #16\n\t"
  67195. "lsr r4, r4, #16\n\t"
  67196. "mul r4, r3, r4\n\t"
  67197. "adds lr, lr, r4\n\t"
  67198. "adcs r8, r8, #0\n\t"
  67199. "adc r9, r5, #0\n\t"
  67200. "lsr r4, r7, #16\n\t"
  67201. "mul r3, r4, r3\n\t"
  67202. "lsr r4, r3, #16\n\t"
  67203. "lsl r3, r3, #16\n\t"
  67204. "adds lr, lr, r3\n\t"
  67205. "adcs r8, r8, r4\n\t"
  67206. "adc r9, r9, #0\n\t"
  67207. "lsr r3, r6, #16\n\t"
  67208. "lsr r4, r7, #16\n\t"
  67209. "mul r4, r3, r4\n\t"
  67210. "adds r8, r8, r4\n\t"
  67211. "adc r9, r9, #0\n\t"
  67212. "lsl r4, r7, #16\n\t"
  67213. "lsr r4, r4, #16\n\t"
  67214. "mul r3, r4, r3\n\t"
  67215. "lsr r4, r3, #16\n\t"
  67216. "lsl r3, r3, #16\n\t"
  67217. "adds lr, lr, r3\n\t"
  67218. "adcs r8, r8, r4\n\t"
  67219. "adc r9, r9, #0\n\t"
  67220. #else
  67221. "umull r3, r4, r6, r7\n\t"
  67222. "adds lr, lr, r3\n\t"
  67223. "adcs r8, r4, r8\n\t"
  67224. "adc r9, r5, #0\n\t"
  67225. #endif
  67226. "str lr, [sp, #12]\n\t"
  67227. /* A[1] * A[3] */
  67228. "ldr r7, [%[a], #12]\n\t"
  67229. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67230. "lsl r3, r6, #16\n\t"
  67231. "lsl r4, r7, #16\n\t"
  67232. "lsr r3, r3, #16\n\t"
  67233. "lsr r4, r4, #16\n\t"
  67234. "mul r4, r3, r4\n\t"
  67235. "adds r8, r8, r4\n\t"
  67236. "adc r9, r9, #0\n\t"
  67237. "lsr r4, r7, #16\n\t"
  67238. "mul r3, r4, r3\n\t"
  67239. "lsr r4, r3, #16\n\t"
  67240. "lsl r3, r3, #16\n\t"
  67241. "adds r8, r8, r3\n\t"
  67242. "adc r9, r9, r4\n\t"
  67243. "lsr r3, r6, #16\n\t"
  67244. "lsr r4, r7, #16\n\t"
  67245. "mul r4, r3, r4\n\t"
  67246. "add r9, r9, r4\n\t"
  67247. "lsl r4, r7, #16\n\t"
  67248. "lsr r4, r4, #16\n\t"
  67249. "mul r3, r4, r3\n\t"
  67250. "lsr r4, r3, #16\n\t"
  67251. "lsl r3, r3, #16\n\t"
  67252. "adds r8, r8, r3\n\t"
  67253. "adc r9, r9, r4\n\t"
  67254. #else
  67255. "umull r3, r4, r6, r7\n\t"
  67256. "adds r8, r8, r3\n\t"
  67257. "adc r9, r4, r9\n\t"
  67258. #endif
  67259. /* A[0] * A[4] */
  67260. "ldr r6, [%[a]]\n\t"
  67261. "ldr r7, [%[a], #16]\n\t"
  67262. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67263. "lsl r3, r6, #16\n\t"
  67264. "lsl r4, r7, #16\n\t"
  67265. "lsr r3, r3, #16\n\t"
  67266. "lsr r4, r4, #16\n\t"
  67267. "mul r4, r3, r4\n\t"
  67268. "adds r8, r8, r4\n\t"
  67269. "adcs r9, r9, #0\n\t"
  67270. "adc r10, r5, #0\n\t"
  67271. "lsr r4, r7, #16\n\t"
  67272. "mul r3, r4, r3\n\t"
  67273. "lsr r4, r3, #16\n\t"
  67274. "lsl r3, r3, #16\n\t"
  67275. "adds r8, r8, r3\n\t"
  67276. "adcs r9, r9, r4\n\t"
  67277. "adc r10, r10, #0\n\t"
  67278. "lsr r3, r6, #16\n\t"
  67279. "lsr r4, r7, #16\n\t"
  67280. "mul r4, r3, r4\n\t"
  67281. "adds r9, r9, r4\n\t"
  67282. "adc r10, r10, #0\n\t"
  67283. "lsl r4, r7, #16\n\t"
  67284. "lsr r4, r4, #16\n\t"
  67285. "mul r3, r4, r3\n\t"
  67286. "lsr r4, r3, #16\n\t"
  67287. "lsl r3, r3, #16\n\t"
  67288. "adds r8, r8, r3\n\t"
  67289. "adcs r9, r9, r4\n\t"
  67290. "adc r10, r10, #0\n\t"
  67291. #else
  67292. "umull r3, r4, r6, r7\n\t"
  67293. "adds r8, r8, r3\n\t"
  67294. "adcs r9, r4, r9\n\t"
  67295. "adc r10, r5, #0\n\t"
  67296. #endif
  67297. "str r8, [sp, #16]\n\t"
  67298. /* A[0] * A[5] */
  67299. "ldr r7, [%[a], #20]\n\t"
  67300. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67301. "lsl r3, r6, #16\n\t"
  67302. "lsl r4, r7, #16\n\t"
  67303. "lsr r3, r3, #16\n\t"
  67304. "lsr r4, r4, #16\n\t"
  67305. "mul r4, r3, r4\n\t"
  67306. "adds r9, r9, r4\n\t"
  67307. "adc r10, r10, #0\n\t"
  67308. "lsr r4, r7, #16\n\t"
  67309. "mul r3, r4, r3\n\t"
  67310. "lsr r4, r3, #16\n\t"
  67311. "lsl r3, r3, #16\n\t"
  67312. "adds r9, r9, r3\n\t"
  67313. "adc r10, r10, r4\n\t"
  67314. "lsr r3, r6, #16\n\t"
  67315. "lsr r4, r7, #16\n\t"
  67316. "mul r4, r3, r4\n\t"
  67317. "add r10, r10, r4\n\t"
  67318. "lsl r4, r7, #16\n\t"
  67319. "lsr r4, r4, #16\n\t"
  67320. "mul r3, r4, r3\n\t"
  67321. "lsr r4, r3, #16\n\t"
  67322. "lsl r3, r3, #16\n\t"
  67323. "adds r9, r9, r3\n\t"
  67324. "adc r10, r10, r4\n\t"
  67325. #else
  67326. "umull r3, r4, r6, r7\n\t"
  67327. "adds r9, r9, r3\n\t"
  67328. "adc r10, r4, r10\n\t"
  67329. #endif
  67330. /* A[1] * A[4] */
  67331. "ldr r6, [%[a], #4]\n\t"
  67332. "ldr r7, [%[a], #16]\n\t"
  67333. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67334. "lsl r3, r6, #16\n\t"
  67335. "lsl r4, r7, #16\n\t"
  67336. "lsr r3, r3, #16\n\t"
  67337. "lsr r4, r4, #16\n\t"
  67338. "mul r4, r3, r4\n\t"
  67339. "adds r9, r9, r4\n\t"
  67340. "adcs r10, r10, #0\n\t"
  67341. "adc lr, r5, #0\n\t"
  67342. "lsr r4, r7, #16\n\t"
  67343. "mul r3, r4, r3\n\t"
  67344. "lsr r4, r3, #16\n\t"
  67345. "lsl r3, r3, #16\n\t"
  67346. "adds r9, r9, r3\n\t"
  67347. "adcs r10, r10, r4\n\t"
  67348. "adc lr, lr, #0\n\t"
  67349. "lsr r3, r6, #16\n\t"
  67350. "lsr r4, r7, #16\n\t"
  67351. "mul r4, r3, r4\n\t"
  67352. "adds r10, r10, r4\n\t"
  67353. "adc lr, lr, #0\n\t"
  67354. "lsl r4, r7, #16\n\t"
  67355. "lsr r4, r4, #16\n\t"
  67356. "mul r3, r4, r3\n\t"
  67357. "lsr r4, r3, #16\n\t"
  67358. "lsl r3, r3, #16\n\t"
  67359. "adds r9, r9, r3\n\t"
  67360. "adcs r10, r10, r4\n\t"
  67361. "adc lr, lr, #0\n\t"
  67362. #else
  67363. "umull r3, r4, r6, r7\n\t"
  67364. "adds r9, r9, r3\n\t"
  67365. "adcs r10, r4, r10\n\t"
  67366. "adc lr, r5, #0\n\t"
  67367. #endif
  67368. /* A[2] * A[3] */
  67369. "ldr r6, [%[a], #8]\n\t"
  67370. "ldr r7, [%[a], #12]\n\t"
  67371. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67372. "lsl r3, r6, #16\n\t"
  67373. "lsl r4, r7, #16\n\t"
  67374. "lsr r3, r3, #16\n\t"
  67375. "lsr r4, r4, #16\n\t"
  67376. "mul r4, r3, r4\n\t"
  67377. "adds r9, r9, r4\n\t"
  67378. "adcs r10, r10, #0\n\t"
  67379. "adc lr, r5, lr\n\t"
  67380. "lsr r4, r7, #16\n\t"
  67381. "mul r3, r4, r3\n\t"
  67382. "lsr r4, r3, #16\n\t"
  67383. "lsl r3, r3, #16\n\t"
  67384. "adds r9, r9, r3\n\t"
  67385. "adcs r10, r10, r4\n\t"
  67386. "adc lr, lr, #0\n\t"
  67387. "lsr r3, r6, #16\n\t"
  67388. "lsr r4, r7, #16\n\t"
  67389. "mul r4, r3, r4\n\t"
  67390. "adds r10, r10, r4\n\t"
  67391. "adc lr, lr, #0\n\t"
  67392. "lsl r4, r7, #16\n\t"
  67393. "lsr r4, r4, #16\n\t"
  67394. "mul r3, r4, r3\n\t"
  67395. "lsr r4, r3, #16\n\t"
  67396. "lsl r3, r3, #16\n\t"
  67397. "adds r9, r9, r3\n\t"
  67398. "adcs r10, r10, r4\n\t"
  67399. "adc lr, lr, #0\n\t"
  67400. #else
  67401. "umull r3, r4, r6, r7\n\t"
  67402. "adds r9, r9, r3\n\t"
  67403. "adcs r10, r4, r10\n\t"
  67404. "adc lr, r5, lr\n\t"
  67405. #endif
  67406. "str r9, [sp, #20]\n\t"
  67407. /* A[2] * A[4] */
  67408. "ldr r7, [%[a], #16]\n\t"
  67409. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67410. "lsl r3, r6, #16\n\t"
  67411. "lsl r4, r7, #16\n\t"
  67412. "lsr r3, r3, #16\n\t"
  67413. "lsr r4, r4, #16\n\t"
  67414. "mul r4, r3, r4\n\t"
  67415. "adds r10, r10, r4\n\t"
  67416. "adcs lr, lr, #0\n\t"
  67417. "adc r8, r5, #0\n\t"
  67418. "lsr r4, r7, #16\n\t"
  67419. "mul r3, r4, r3\n\t"
  67420. "lsr r4, r3, #16\n\t"
  67421. "lsl r3, r3, #16\n\t"
  67422. "adds r10, r10, r3\n\t"
  67423. "adcs lr, lr, r4\n\t"
  67424. "adc r8, r8, #0\n\t"
  67425. "lsr r3, r6, #16\n\t"
  67426. "lsr r4, r7, #16\n\t"
  67427. "mul r4, r3, r4\n\t"
  67428. "adds lr, lr, r4\n\t"
  67429. "adc r8, r8, #0\n\t"
  67430. "lsl r4, r7, #16\n\t"
  67431. "lsr r4, r4, #16\n\t"
  67432. "mul r3, r4, r3\n\t"
  67433. "lsr r4, r3, #16\n\t"
  67434. "lsl r3, r3, #16\n\t"
  67435. "adds r10, r10, r3\n\t"
  67436. "adcs lr, lr, r4\n\t"
  67437. "adc r8, r8, #0\n\t"
  67438. #else
  67439. "umull r3, r4, r6, r7\n\t"
  67440. "adds r10, r10, r3\n\t"
  67441. "adcs lr, r4, lr\n\t"
  67442. "adc r8, r5, #0\n\t"
  67443. #endif
  67444. /* A[1] * A[5] */
  67445. "ldr r6, [%[a], #4]\n\t"
  67446. "ldr r7, [%[a], #20]\n\t"
  67447. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67448. "lsl r3, r6, #16\n\t"
  67449. "lsl r4, r7, #16\n\t"
  67450. "lsr r3, r3, #16\n\t"
  67451. "lsr r4, r4, #16\n\t"
  67452. "mul r4, r3, r4\n\t"
  67453. "adds r10, r10, r4\n\t"
  67454. "adcs lr, lr, #0\n\t"
  67455. "adc r8, r5, r8\n\t"
  67456. "lsr r4, r7, #16\n\t"
  67457. "mul r3, r4, r3\n\t"
  67458. "lsr r4, r3, #16\n\t"
  67459. "lsl r3, r3, #16\n\t"
  67460. "adds r10, r10, r3\n\t"
  67461. "adcs lr, lr, r4\n\t"
  67462. "adc r8, r8, #0\n\t"
  67463. "lsr r3, r6, #16\n\t"
  67464. "lsr r4, r7, #16\n\t"
  67465. "mul r4, r3, r4\n\t"
  67466. "adds lr, lr, r4\n\t"
  67467. "adc r8, r8, #0\n\t"
  67468. "lsl r4, r7, #16\n\t"
  67469. "lsr r4, r4, #16\n\t"
  67470. "mul r3, r4, r3\n\t"
  67471. "lsr r4, r3, #16\n\t"
  67472. "lsl r3, r3, #16\n\t"
  67473. "adds r10, r10, r3\n\t"
  67474. "adcs lr, lr, r4\n\t"
  67475. "adc r8, r8, #0\n\t"
  67476. #else
  67477. "umull r3, r4, r6, r7\n\t"
  67478. "adds r10, r10, r3\n\t"
  67479. "adcs lr, r4, lr\n\t"
  67480. "adc r8, r5, r8\n\t"
  67481. #endif
  67482. /* A[0] * A[6] */
  67483. "ldr r6, [%[a]]\n\t"
  67484. "ldr r7, [%[a], #24]\n\t"
  67485. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67486. "lsl r3, r6, #16\n\t"
  67487. "lsl r4, r7, #16\n\t"
  67488. "lsr r3, r3, #16\n\t"
  67489. "lsr r4, r4, #16\n\t"
  67490. "mul r4, r3, r4\n\t"
  67491. "adds r10, r10, r4\n\t"
  67492. "adcs lr, lr, #0\n\t"
  67493. "adc r8, r5, r8\n\t"
  67494. "lsr r4, r7, #16\n\t"
  67495. "mul r3, r4, r3\n\t"
  67496. "lsr r4, r3, #16\n\t"
  67497. "lsl r3, r3, #16\n\t"
  67498. "adds r10, r10, r3\n\t"
  67499. "adcs lr, lr, r4\n\t"
  67500. "adc r8, r8, #0\n\t"
  67501. "lsr r3, r6, #16\n\t"
  67502. "lsr r4, r7, #16\n\t"
  67503. "mul r4, r3, r4\n\t"
  67504. "adds lr, lr, r4\n\t"
  67505. "adc r8, r8, #0\n\t"
  67506. "lsl r4, r7, #16\n\t"
  67507. "lsr r4, r4, #16\n\t"
  67508. "mul r3, r4, r3\n\t"
  67509. "lsr r4, r3, #16\n\t"
  67510. "lsl r3, r3, #16\n\t"
  67511. "adds r10, r10, r3\n\t"
  67512. "adcs lr, lr, r4\n\t"
  67513. "adc r8, r8, #0\n\t"
  67514. #else
  67515. "umull r3, r4, r6, r7\n\t"
  67516. "adds r10, r10, r3\n\t"
  67517. "adcs lr, r4, lr\n\t"
  67518. "adc r8, r5, r8\n\t"
  67519. #endif
  67520. "str r10, [sp, #24]\n\t"
  67521. /* A[0] * A[7] */
  67522. "ldr r7, [%[a], #28]\n\t"
  67523. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67524. "lsl r3, r6, #16\n\t"
  67525. "lsl r4, r7, #16\n\t"
  67526. "lsr r3, r3, #16\n\t"
  67527. "lsr r4, r4, #16\n\t"
  67528. "mul r4, r3, r4\n\t"
  67529. "adds lr, lr, r4\n\t"
  67530. "adcs r8, r8, #0\n\t"
  67531. "adc r9, r5, #0\n\t"
  67532. "lsr r4, r7, #16\n\t"
  67533. "mul r3, r4, r3\n\t"
  67534. "lsr r4, r3, #16\n\t"
  67535. "lsl r3, r3, #16\n\t"
  67536. "adds lr, lr, r3\n\t"
  67537. "adcs r8, r8, r4\n\t"
  67538. "adc r9, r9, #0\n\t"
  67539. "lsr r3, r6, #16\n\t"
  67540. "lsr r4, r7, #16\n\t"
  67541. "mul r4, r3, r4\n\t"
  67542. "adds r8, r8, r4\n\t"
  67543. "adc r9, r9, #0\n\t"
  67544. "lsl r4, r7, #16\n\t"
  67545. "lsr r4, r4, #16\n\t"
  67546. "mul r3, r4, r3\n\t"
  67547. "lsr r4, r3, #16\n\t"
  67548. "lsl r3, r3, #16\n\t"
  67549. "adds lr, lr, r3\n\t"
  67550. "adcs r8, r8, r4\n\t"
  67551. "adc r9, r9, #0\n\t"
  67552. #else
  67553. "umull r3, r4, r6, r7\n\t"
  67554. "adds lr, lr, r3\n\t"
  67555. "adcs r8, r4, r8\n\t"
  67556. "adc r9, r5, #0\n\t"
  67557. #endif
  67558. /* A[1] * A[6] */
  67559. "ldr r6, [%[a], #4]\n\t"
  67560. "ldr r7, [%[a], #24]\n\t"
  67561. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67562. "lsl r3, r6, #16\n\t"
  67563. "lsl r4, r7, #16\n\t"
  67564. "lsr r3, r3, #16\n\t"
  67565. "lsr r4, r4, #16\n\t"
  67566. "mul r4, r3, r4\n\t"
  67567. "adds lr, lr, r4\n\t"
  67568. "adcs r8, r8, #0\n\t"
  67569. "adc r9, r5, r9\n\t"
  67570. "lsr r4, r7, #16\n\t"
  67571. "mul r3, r4, r3\n\t"
  67572. "lsr r4, r3, #16\n\t"
  67573. "lsl r3, r3, #16\n\t"
  67574. "adds lr, lr, r3\n\t"
  67575. "adcs r8, r8, r4\n\t"
  67576. "adc r9, r9, #0\n\t"
  67577. "lsr r3, r6, #16\n\t"
  67578. "lsr r4, r7, #16\n\t"
  67579. "mul r4, r3, r4\n\t"
  67580. "adds r8, r8, r4\n\t"
  67581. "adc r9, r9, #0\n\t"
  67582. "lsl r4, r7, #16\n\t"
  67583. "lsr r4, r4, #16\n\t"
  67584. "mul r3, r4, r3\n\t"
  67585. "lsr r4, r3, #16\n\t"
  67586. "lsl r3, r3, #16\n\t"
  67587. "adds lr, lr, r3\n\t"
  67588. "adcs r8, r8, r4\n\t"
  67589. "adc r9, r9, #0\n\t"
  67590. #else
  67591. "umull r3, r4, r6, r7\n\t"
  67592. "adds lr, lr, r3\n\t"
  67593. "adcs r8, r4, r8\n\t"
  67594. "adc r9, r5, r9\n\t"
  67595. #endif
  67596. /* A[2] * A[5] */
  67597. "ldr r6, [%[a], #8]\n\t"
  67598. "ldr r7, [%[a], #20]\n\t"
  67599. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67600. "lsl r3, r6, #16\n\t"
  67601. "lsl r4, r7, #16\n\t"
  67602. "lsr r3, r3, #16\n\t"
  67603. "lsr r4, r4, #16\n\t"
  67604. "mul r4, r3, r4\n\t"
  67605. "adds lr, lr, r4\n\t"
  67606. "adcs r8, r8, #0\n\t"
  67607. "adc r9, r5, r9\n\t"
  67608. "lsr r4, r7, #16\n\t"
  67609. "mul r3, r4, r3\n\t"
  67610. "lsr r4, r3, #16\n\t"
  67611. "lsl r3, r3, #16\n\t"
  67612. "adds lr, lr, r3\n\t"
  67613. "adcs r8, r8, r4\n\t"
  67614. "adc r9, r9, #0\n\t"
  67615. "lsr r3, r6, #16\n\t"
  67616. "lsr r4, r7, #16\n\t"
  67617. "mul r4, r3, r4\n\t"
  67618. "adds r8, r8, r4\n\t"
  67619. "adc r9, r9, #0\n\t"
  67620. "lsl r4, r7, #16\n\t"
  67621. "lsr r4, r4, #16\n\t"
  67622. "mul r3, r4, r3\n\t"
  67623. "lsr r4, r3, #16\n\t"
  67624. "lsl r3, r3, #16\n\t"
  67625. "adds lr, lr, r3\n\t"
  67626. "adcs r8, r8, r4\n\t"
  67627. "adc r9, r9, #0\n\t"
  67628. #else
  67629. "umull r3, r4, r6, r7\n\t"
  67630. "adds lr, lr, r3\n\t"
  67631. "adcs r8, r4, r8\n\t"
  67632. "adc r9, r5, r9\n\t"
  67633. #endif
  67634. /* A[3] * A[4] */
  67635. "ldr r6, [%[a], #12]\n\t"
  67636. "ldr r7, [%[a], #16]\n\t"
  67637. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67638. "lsl r3, r6, #16\n\t"
  67639. "lsl r4, r7, #16\n\t"
  67640. "lsr r3, r3, #16\n\t"
  67641. "lsr r4, r4, #16\n\t"
  67642. "mul r4, r3, r4\n\t"
  67643. "adds lr, lr, r4\n\t"
  67644. "adcs r8, r8, #0\n\t"
  67645. "adc r9, r5, r9\n\t"
  67646. "lsr r4, r7, #16\n\t"
  67647. "mul r3, r4, r3\n\t"
  67648. "lsr r4, r3, #16\n\t"
  67649. "lsl r3, r3, #16\n\t"
  67650. "adds lr, lr, r3\n\t"
  67651. "adcs r8, r8, r4\n\t"
  67652. "adc r9, r9, #0\n\t"
  67653. "lsr r3, r6, #16\n\t"
  67654. "lsr r4, r7, #16\n\t"
  67655. "mul r4, r3, r4\n\t"
  67656. "adds r8, r8, r4\n\t"
  67657. "adc r9, r9, #0\n\t"
  67658. "lsl r4, r7, #16\n\t"
  67659. "lsr r4, r4, #16\n\t"
  67660. "mul r3, r4, r3\n\t"
  67661. "lsr r4, r3, #16\n\t"
  67662. "lsl r3, r3, #16\n\t"
  67663. "adds lr, lr, r3\n\t"
  67664. "adcs r8, r8, r4\n\t"
  67665. "adc r9, r9, #0\n\t"
  67666. #else
  67667. "umull r3, r4, r6, r7\n\t"
  67668. "adds lr, lr, r3\n\t"
  67669. "adcs r8, r4, r8\n\t"
  67670. "adc r9, r5, r9\n\t"
  67671. #endif
  67672. "str lr, [sp, #28]\n\t"
  67673. /* A[3] * A[5] */
  67674. "ldr r7, [%[a], #20]\n\t"
  67675. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67676. "lsl r3, r6, #16\n\t"
  67677. "lsl r4, r7, #16\n\t"
  67678. "lsr r3, r3, #16\n\t"
  67679. "lsr r4, r4, #16\n\t"
  67680. "mul r4, r3, r4\n\t"
  67681. "adds r8, r8, r4\n\t"
  67682. "adcs r9, r9, #0\n\t"
  67683. "adc r10, r5, #0\n\t"
  67684. "lsr r4, r7, #16\n\t"
  67685. "mul r3, r4, r3\n\t"
  67686. "lsr r4, r3, #16\n\t"
  67687. "lsl r3, r3, #16\n\t"
  67688. "adds r8, r8, r3\n\t"
  67689. "adcs r9, r9, r4\n\t"
  67690. "adc r10, r10, #0\n\t"
  67691. "lsr r3, r6, #16\n\t"
  67692. "lsr r4, r7, #16\n\t"
  67693. "mul r4, r3, r4\n\t"
  67694. "adds r9, r9, r4\n\t"
  67695. "adc r10, r10, #0\n\t"
  67696. "lsl r4, r7, #16\n\t"
  67697. "lsr r4, r4, #16\n\t"
  67698. "mul r3, r4, r3\n\t"
  67699. "lsr r4, r3, #16\n\t"
  67700. "lsl r3, r3, #16\n\t"
  67701. "adds r8, r8, r3\n\t"
  67702. "adcs r9, r9, r4\n\t"
  67703. "adc r10, r10, #0\n\t"
  67704. #else
  67705. "umull r3, r4, r6, r7\n\t"
  67706. "adds r8, r8, r3\n\t"
  67707. "adcs r9, r4, r9\n\t"
  67708. "adc r10, r5, #0\n\t"
  67709. #endif
  67710. /* A[2] * A[6] */
  67711. "ldr r6, [%[a], #8]\n\t"
  67712. "ldr r7, [%[a], #24]\n\t"
  67713. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67714. "lsl r3, r6, #16\n\t"
  67715. "lsl r4, r7, #16\n\t"
  67716. "lsr r3, r3, #16\n\t"
  67717. "lsr r4, r4, #16\n\t"
  67718. "mul r4, r3, r4\n\t"
  67719. "adds r8, r8, r4\n\t"
  67720. "adcs r9, r9, #0\n\t"
  67721. "adc r10, r5, r10\n\t"
  67722. "lsr r4, r7, #16\n\t"
  67723. "mul r3, r4, r3\n\t"
  67724. "lsr r4, r3, #16\n\t"
  67725. "lsl r3, r3, #16\n\t"
  67726. "adds r8, r8, r3\n\t"
  67727. "adcs r9, r9, r4\n\t"
  67728. "adc r10, r10, #0\n\t"
  67729. "lsr r3, r6, #16\n\t"
  67730. "lsr r4, r7, #16\n\t"
  67731. "mul r4, r3, r4\n\t"
  67732. "adds r9, r9, r4\n\t"
  67733. "adc r10, r10, #0\n\t"
  67734. "lsl r4, r7, #16\n\t"
  67735. "lsr r4, r4, #16\n\t"
  67736. "mul r3, r4, r3\n\t"
  67737. "lsr r4, r3, #16\n\t"
  67738. "lsl r3, r3, #16\n\t"
  67739. "adds r8, r8, r3\n\t"
  67740. "adcs r9, r9, r4\n\t"
  67741. "adc r10, r10, #0\n\t"
  67742. #else
  67743. "umull r3, r4, r6, r7\n\t"
  67744. "adds r8, r8, r3\n\t"
  67745. "adcs r9, r4, r9\n\t"
  67746. "adc r10, r5, r10\n\t"
  67747. #endif
  67748. /* A[1] * A[7] */
  67749. "ldr r6, [%[a], #4]\n\t"
  67750. "ldr r7, [%[a], #28]\n\t"
  67751. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67752. "lsl r3, r6, #16\n\t"
  67753. "lsl r4, r7, #16\n\t"
  67754. "lsr r3, r3, #16\n\t"
  67755. "lsr r4, r4, #16\n\t"
  67756. "mul r4, r3, r4\n\t"
  67757. "adds r8, r8, r4\n\t"
  67758. "adcs r9, r9, #0\n\t"
  67759. "adc r10, r5, r10\n\t"
  67760. "lsr r4, r7, #16\n\t"
  67761. "mul r3, r4, r3\n\t"
  67762. "lsr r4, r3, #16\n\t"
  67763. "lsl r3, r3, #16\n\t"
  67764. "adds r8, r8, r3\n\t"
  67765. "adcs r9, r9, r4\n\t"
  67766. "adc r10, r10, #0\n\t"
  67767. "lsr r3, r6, #16\n\t"
  67768. "lsr r4, r7, #16\n\t"
  67769. "mul r4, r3, r4\n\t"
  67770. "adds r9, r9, r4\n\t"
  67771. "adc r10, r10, #0\n\t"
  67772. "lsl r4, r7, #16\n\t"
  67773. "lsr r4, r4, #16\n\t"
  67774. "mul r3, r4, r3\n\t"
  67775. "lsr r4, r3, #16\n\t"
  67776. "lsl r3, r3, #16\n\t"
  67777. "adds r8, r8, r3\n\t"
  67778. "adcs r9, r9, r4\n\t"
  67779. "adc r10, r10, #0\n\t"
  67780. #else
  67781. "umull r3, r4, r6, r7\n\t"
  67782. "adds r8, r8, r3\n\t"
  67783. "adcs r9, r4, r9\n\t"
  67784. "adc r10, r5, r10\n\t"
  67785. #endif
  67786. "str r8, [sp, #32]\n\t"
  67787. /* A[2] * A[7] */
  67788. "ldr r6, [%[a], #8]\n\t"
  67789. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67790. "lsl r3, r6, #16\n\t"
  67791. "lsl r4, r7, #16\n\t"
  67792. "lsr r3, r3, #16\n\t"
  67793. "lsr r4, r4, #16\n\t"
  67794. "mul r4, r3, r4\n\t"
  67795. "adds r9, r9, r4\n\t"
  67796. "adcs r10, r10, #0\n\t"
  67797. "adc lr, r5, #0\n\t"
  67798. "lsr r4, r7, #16\n\t"
  67799. "mul r3, r4, r3\n\t"
  67800. "lsr r4, r3, #16\n\t"
  67801. "lsl r3, r3, #16\n\t"
  67802. "adds r9, r9, r3\n\t"
  67803. "adcs r10, r10, r4\n\t"
  67804. "adc lr, lr, #0\n\t"
  67805. "lsr r3, r6, #16\n\t"
  67806. "lsr r4, r7, #16\n\t"
  67807. "mul r4, r3, r4\n\t"
  67808. "adds r10, r10, r4\n\t"
  67809. "adc lr, lr, #0\n\t"
  67810. "lsl r4, r7, #16\n\t"
  67811. "lsr r4, r4, #16\n\t"
  67812. "mul r3, r4, r3\n\t"
  67813. "lsr r4, r3, #16\n\t"
  67814. "lsl r3, r3, #16\n\t"
  67815. "adds r9, r9, r3\n\t"
  67816. "adcs r10, r10, r4\n\t"
  67817. "adc lr, lr, #0\n\t"
  67818. #else
  67819. "umull r3, r4, r6, r7\n\t"
  67820. "adds r9, r9, r3\n\t"
  67821. "adcs r10, r4, r10\n\t"
  67822. "adc lr, r5, #0\n\t"
  67823. #endif
  67824. /* A[3] * A[6] */
  67825. "ldr r6, [%[a], #12]\n\t"
  67826. "ldr r7, [%[a], #24]\n\t"
  67827. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67828. "lsl r3, r6, #16\n\t"
  67829. "lsl r4, r7, #16\n\t"
  67830. "lsr r3, r3, #16\n\t"
  67831. "lsr r4, r4, #16\n\t"
  67832. "mul r4, r3, r4\n\t"
  67833. "adds r9, r9, r4\n\t"
  67834. "adcs r10, r10, #0\n\t"
  67835. "adc lr, r5, lr\n\t"
  67836. "lsr r4, r7, #16\n\t"
  67837. "mul r3, r4, r3\n\t"
  67838. "lsr r4, r3, #16\n\t"
  67839. "lsl r3, r3, #16\n\t"
  67840. "adds r9, r9, r3\n\t"
  67841. "adcs r10, r10, r4\n\t"
  67842. "adc lr, lr, #0\n\t"
  67843. "lsr r3, r6, #16\n\t"
  67844. "lsr r4, r7, #16\n\t"
  67845. "mul r4, r3, r4\n\t"
  67846. "adds r10, r10, r4\n\t"
  67847. "adc lr, lr, #0\n\t"
  67848. "lsl r4, r7, #16\n\t"
  67849. "lsr r4, r4, #16\n\t"
  67850. "mul r3, r4, r3\n\t"
  67851. "lsr r4, r3, #16\n\t"
  67852. "lsl r3, r3, #16\n\t"
  67853. "adds r9, r9, r3\n\t"
  67854. "adcs r10, r10, r4\n\t"
  67855. "adc lr, lr, #0\n\t"
  67856. #else
  67857. "umull r3, r4, r6, r7\n\t"
  67858. "adds r9, r9, r3\n\t"
  67859. "adcs r10, r4, r10\n\t"
  67860. "adc lr, r5, lr\n\t"
  67861. #endif
  67862. /* A[4] * A[5] */
  67863. "ldr r6, [%[a], #16]\n\t"
  67864. "ldr r7, [%[a], #20]\n\t"
  67865. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67866. "lsl r3, r6, #16\n\t"
  67867. "lsl r4, r7, #16\n\t"
  67868. "lsr r3, r3, #16\n\t"
  67869. "lsr r4, r4, #16\n\t"
  67870. "mul r4, r3, r4\n\t"
  67871. "adds r9, r9, r4\n\t"
  67872. "adcs r10, r10, #0\n\t"
  67873. "adc lr, r5, lr\n\t"
  67874. "lsr r4, r7, #16\n\t"
  67875. "mul r3, r4, r3\n\t"
  67876. "lsr r4, r3, #16\n\t"
  67877. "lsl r3, r3, #16\n\t"
  67878. "adds r9, r9, r3\n\t"
  67879. "adcs r10, r10, r4\n\t"
  67880. "adc lr, lr, #0\n\t"
  67881. "lsr r3, r6, #16\n\t"
  67882. "lsr r4, r7, #16\n\t"
  67883. "mul r4, r3, r4\n\t"
  67884. "adds r10, r10, r4\n\t"
  67885. "adc lr, lr, #0\n\t"
  67886. "lsl r4, r7, #16\n\t"
  67887. "lsr r4, r4, #16\n\t"
  67888. "mul r3, r4, r3\n\t"
  67889. "lsr r4, r3, #16\n\t"
  67890. "lsl r3, r3, #16\n\t"
  67891. "adds r9, r9, r3\n\t"
  67892. "adcs r10, r10, r4\n\t"
  67893. "adc lr, lr, #0\n\t"
  67894. #else
  67895. "umull r3, r4, r6, r7\n\t"
  67896. "adds r9, r9, r3\n\t"
  67897. "adcs r10, r4, r10\n\t"
  67898. "adc lr, r5, lr\n\t"
  67899. #endif
  67900. "str r9, [sp, #36]\n\t"
  67901. /* A[4] * A[6] */
  67902. "ldr r7, [%[a], #24]\n\t"
  67903. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67904. "lsl r3, r6, #16\n\t"
  67905. "lsl r4, r7, #16\n\t"
  67906. "lsr r3, r3, #16\n\t"
  67907. "lsr r4, r4, #16\n\t"
  67908. "mul r4, r3, r4\n\t"
  67909. "adds r10, r10, r4\n\t"
  67910. "adcs lr, lr, #0\n\t"
  67911. "adc r8, r5, #0\n\t"
  67912. "lsr r4, r7, #16\n\t"
  67913. "mul r3, r4, r3\n\t"
  67914. "lsr r4, r3, #16\n\t"
  67915. "lsl r3, r3, #16\n\t"
  67916. "adds r10, r10, r3\n\t"
  67917. "adcs lr, lr, r4\n\t"
  67918. "adc r8, r8, #0\n\t"
  67919. "lsr r3, r6, #16\n\t"
  67920. "lsr r4, r7, #16\n\t"
  67921. "mul r4, r3, r4\n\t"
  67922. "adds lr, lr, r4\n\t"
  67923. "adc r8, r8, #0\n\t"
  67924. "lsl r4, r7, #16\n\t"
  67925. "lsr r4, r4, #16\n\t"
  67926. "mul r3, r4, r3\n\t"
  67927. "lsr r4, r3, #16\n\t"
  67928. "lsl r3, r3, #16\n\t"
  67929. "adds r10, r10, r3\n\t"
  67930. "adcs lr, lr, r4\n\t"
  67931. "adc r8, r8, #0\n\t"
  67932. #else
  67933. "umull r3, r4, r6, r7\n\t"
  67934. "adds r10, r10, r3\n\t"
  67935. "adcs lr, r4, lr\n\t"
  67936. "adc r8, r5, #0\n\t"
  67937. #endif
  67938. /* A[3] * A[7] */
  67939. "ldr r6, [%[a], #12]\n\t"
  67940. "ldr r7, [%[a], #28]\n\t"
  67941. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67942. "lsl r3, r6, #16\n\t"
  67943. "lsl r4, r7, #16\n\t"
  67944. "lsr r3, r3, #16\n\t"
  67945. "lsr r4, r4, #16\n\t"
  67946. "mul r4, r3, r4\n\t"
  67947. "adds r10, r10, r4\n\t"
  67948. "adcs lr, lr, #0\n\t"
  67949. "adc r8, r5, r8\n\t"
  67950. "lsr r4, r7, #16\n\t"
  67951. "mul r3, r4, r3\n\t"
  67952. "lsr r4, r3, #16\n\t"
  67953. "lsl r3, r3, #16\n\t"
  67954. "adds r10, r10, r3\n\t"
  67955. "adcs lr, lr, r4\n\t"
  67956. "adc r8, r8, #0\n\t"
  67957. "lsr r3, r6, #16\n\t"
  67958. "lsr r4, r7, #16\n\t"
  67959. "mul r4, r3, r4\n\t"
  67960. "adds lr, lr, r4\n\t"
  67961. "adc r8, r8, #0\n\t"
  67962. "lsl r4, r7, #16\n\t"
  67963. "lsr r4, r4, #16\n\t"
  67964. "mul r3, r4, r3\n\t"
  67965. "lsr r4, r3, #16\n\t"
  67966. "lsl r3, r3, #16\n\t"
  67967. "adds r10, r10, r3\n\t"
  67968. "adcs lr, lr, r4\n\t"
  67969. "adc r8, r8, #0\n\t"
  67970. #else
  67971. "umull r3, r4, r6, r7\n\t"
  67972. "adds r10, r10, r3\n\t"
  67973. "adcs lr, r4, lr\n\t"
  67974. "adc r8, r5, r8\n\t"
  67975. #endif
  67976. "str r10, [sp, #40]\n\t"
  67977. /* A[4] * A[7] */
  67978. "ldr r6, [%[a], #16]\n\t"
  67979. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  67980. "lsl r3, r6, #16\n\t"
  67981. "lsl r4, r7, #16\n\t"
  67982. "lsr r3, r3, #16\n\t"
  67983. "lsr r4, r4, #16\n\t"
  67984. "mul r4, r3, r4\n\t"
  67985. "adds lr, lr, r4\n\t"
  67986. "adcs r8, r8, #0\n\t"
  67987. "adc r9, r5, #0\n\t"
  67988. "lsr r4, r7, #16\n\t"
  67989. "mul r3, r4, r3\n\t"
  67990. "lsr r4, r3, #16\n\t"
  67991. "lsl r3, r3, #16\n\t"
  67992. "adds lr, lr, r3\n\t"
  67993. "adcs r8, r8, r4\n\t"
  67994. "adc r9, r9, #0\n\t"
  67995. "lsr r3, r6, #16\n\t"
  67996. "lsr r4, r7, #16\n\t"
  67997. "mul r4, r3, r4\n\t"
  67998. "adds r8, r8, r4\n\t"
  67999. "adc r9, r9, #0\n\t"
  68000. "lsl r4, r7, #16\n\t"
  68001. "lsr r4, r4, #16\n\t"
  68002. "mul r3, r4, r3\n\t"
  68003. "lsr r4, r3, #16\n\t"
  68004. "lsl r3, r3, #16\n\t"
  68005. "adds lr, lr, r3\n\t"
  68006. "adcs r8, r8, r4\n\t"
  68007. "adc r9, r9, #0\n\t"
  68008. #else
  68009. "umull r3, r4, r6, r7\n\t"
  68010. "adds lr, lr, r3\n\t"
  68011. "adcs r8, r4, r8\n\t"
  68012. "adc r9, r5, #0\n\t"
  68013. #endif
  68014. /* A[5] * A[6] */
  68015. "ldr r6, [%[a], #20]\n\t"
  68016. "ldr r7, [%[a], #24]\n\t"
  68017. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68018. "lsl r3, r6, #16\n\t"
  68019. "lsl r4, r7, #16\n\t"
  68020. "lsr r3, r3, #16\n\t"
  68021. "lsr r4, r4, #16\n\t"
  68022. "mul r4, r3, r4\n\t"
  68023. "adds lr, lr, r4\n\t"
  68024. "adcs r8, r8, #0\n\t"
  68025. "adc r9, r5, r9\n\t"
  68026. "lsr r4, r7, #16\n\t"
  68027. "mul r3, r4, r3\n\t"
  68028. "lsr r4, r3, #16\n\t"
  68029. "lsl r3, r3, #16\n\t"
  68030. "adds lr, lr, r3\n\t"
  68031. "adcs r8, r8, r4\n\t"
  68032. "adc r9, r9, #0\n\t"
  68033. "lsr r3, r6, #16\n\t"
  68034. "lsr r4, r7, #16\n\t"
  68035. "mul r4, r3, r4\n\t"
  68036. "adds r8, r8, r4\n\t"
  68037. "adc r9, r9, #0\n\t"
  68038. "lsl r4, r7, #16\n\t"
  68039. "lsr r4, r4, #16\n\t"
  68040. "mul r3, r4, r3\n\t"
  68041. "lsr r4, r3, #16\n\t"
  68042. "lsl r3, r3, #16\n\t"
  68043. "adds lr, lr, r3\n\t"
  68044. "adcs r8, r8, r4\n\t"
  68045. "adc r9, r9, #0\n\t"
  68046. #else
  68047. "umull r3, r4, r6, r7\n\t"
  68048. "adds lr, lr, r3\n\t"
  68049. "adcs r8, r4, r8\n\t"
  68050. "adc r9, r5, r9\n\t"
  68051. #endif
  68052. "str lr, [sp, #44]\n\t"
  68053. /* A[5] * A[7] */
  68054. "ldr r7, [%[a], #28]\n\t"
  68055. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68056. "lsl r3, r6, #16\n\t"
  68057. "lsl r4, r7, #16\n\t"
  68058. "lsr r3, r3, #16\n\t"
  68059. "lsr r4, r4, #16\n\t"
  68060. "mul r4, r3, r4\n\t"
  68061. "adds r8, r8, r4\n\t"
  68062. "adcs r9, r9, #0\n\t"
  68063. "adc r10, r5, #0\n\t"
  68064. "lsr r4, r7, #16\n\t"
  68065. "mul r3, r4, r3\n\t"
  68066. "lsr r4, r3, #16\n\t"
  68067. "lsl r3, r3, #16\n\t"
  68068. "adds r8, r8, r3\n\t"
  68069. "adcs r9, r9, r4\n\t"
  68070. "adc r10, r10, #0\n\t"
  68071. "lsr r3, r6, #16\n\t"
  68072. "lsr r4, r7, #16\n\t"
  68073. "mul r4, r3, r4\n\t"
  68074. "adds r9, r9, r4\n\t"
  68075. "adc r10, r10, #0\n\t"
  68076. "lsl r4, r7, #16\n\t"
  68077. "lsr r4, r4, #16\n\t"
  68078. "mul r3, r4, r3\n\t"
  68079. "lsr r4, r3, #16\n\t"
  68080. "lsl r3, r3, #16\n\t"
  68081. "adds r8, r8, r3\n\t"
  68082. "adcs r9, r9, r4\n\t"
  68083. "adc r10, r10, #0\n\t"
  68084. #else
  68085. "umull r3, r4, r6, r7\n\t"
  68086. "adds r8, r8, r3\n\t"
  68087. "adcs r9, r4, r9\n\t"
  68088. "adc r10, r5, #0\n\t"
  68089. #endif
  68090. "str r8, [sp, #48]\n\t"
  68091. /* A[6] * A[7] */
  68092. "ldr r6, [%[a], #24]\n\t"
  68093. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68094. "lsl r3, r6, #16\n\t"
  68095. "lsl r4, r7, #16\n\t"
  68096. "lsr r3, r3, #16\n\t"
  68097. "lsr r4, r4, #16\n\t"
  68098. "mul r4, r3, r4\n\t"
  68099. "adds r9, r9, r4\n\t"
  68100. "adc r10, r10, #0\n\t"
  68101. "lsr r4, r7, #16\n\t"
  68102. "mul r3, r4, r3\n\t"
  68103. "lsr r4, r3, #16\n\t"
  68104. "lsl r3, r3, #16\n\t"
  68105. "adds r9, r9, r3\n\t"
  68106. "adc r10, r10, r4\n\t"
  68107. "lsr r3, r6, #16\n\t"
  68108. "lsr r4, r7, #16\n\t"
  68109. "mul r4, r3, r4\n\t"
  68110. "add r10, r10, r4\n\t"
  68111. "lsl r4, r7, #16\n\t"
  68112. "lsr r4, r4, #16\n\t"
  68113. "mul r3, r4, r3\n\t"
  68114. "lsr r4, r3, #16\n\t"
  68115. "lsl r3, r3, #16\n\t"
  68116. "adds r9, r9, r3\n\t"
  68117. "adc r10, r10, r4\n\t"
  68118. #else
  68119. "umull r3, r4, r6, r7\n\t"
  68120. "adds r9, r9, r3\n\t"
  68121. "adc r10, r4, r10\n\t"
  68122. #endif
  68123. "str r9, [sp, #52]\n\t"
  68124. "str r10, [sp, #56]\n\t"
  68125. /* Double */
  68126. "ldr r4, [sp, #4]\n\t"
  68127. "ldr r6, [sp, #8]\n\t"
  68128. "ldr r7, [sp, #12]\n\t"
  68129. "ldr r8, [sp, #16]\n\t"
  68130. "ldr r9, [sp, #20]\n\t"
  68131. "ldr r10, [sp, #24]\n\t"
  68132. "ldr lr, [sp, #28]\n\t"
  68133. "ldr r12, [sp, #32]\n\t"
  68134. "ldr r3, [sp, #36]\n\t"
  68135. "adds r4, r4, r4\n\t"
  68136. "adcs r6, r6, r6\n\t"
  68137. "adcs r7, r7, r7\n\t"
  68138. "adcs r8, r8, r8\n\t"
  68139. "adcs r9, r9, r9\n\t"
  68140. "adcs r10, r10, r10\n\t"
  68141. "adcs lr, lr, lr\n\t"
  68142. "adcs r12, r12, r12\n\t"
  68143. "adcs r3, r3, r3\n\t"
  68144. "str r4, [sp, #4]\n\t"
  68145. "str r6, [sp, #8]\n\t"
  68146. "str r7, [sp, #12]\n\t"
  68147. "str r8, [sp, #16]\n\t"
  68148. "str r9, [sp, #20]\n\t"
  68149. "str r10, [sp, #24]\n\t"
  68150. "str lr, [sp, #28]\n\t"
  68151. "str r12, [sp, #32]\n\t"
  68152. "str r3, [sp, #36]\n\t"
  68153. "ldr r4, [sp, #40]\n\t"
  68154. "ldr r6, [sp, #44]\n\t"
  68155. "ldr r7, [sp, #48]\n\t"
  68156. "ldr r8, [sp, #52]\n\t"
  68157. "ldr r9, [sp, #56]\n\t"
  68158. "adcs r4, r4, r4\n\t"
  68159. "adcs r6, r6, r6\n\t"
  68160. "adcs r7, r7, r7\n\t"
  68161. "adcs r8, r8, r8\n\t"
  68162. "adcs r9, r9, r9\n\t"
  68163. "str r4, [sp, #40]\n\t"
  68164. "str r6, [sp, #44]\n\t"
  68165. "str r7, [sp, #48]\n\t"
  68166. "str r8, [sp, #52]\n\t"
  68167. "str r9, [sp, #56]\n\t"
  68168. "adc r10, r5, #0\n\t"
  68169. "str r10, [sp, #60]\n\t"
  68170. "ldr r4, [sp, #4]\n\t"
  68171. "ldr r5, [sp, #8]\n\t"
  68172. "ldr r12, [sp, #12]\n\t"
  68173. /* A[0] * A[0] */
  68174. "ldr r6, [%[a]]\n\t"
  68175. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68176. "lsr r7, r6, #16\n\t"
  68177. "lsl r6, r6, #16\n\t"
  68178. "lsr r6, r6, #16\n\t"
  68179. "mul r8, r6, r6\n\t"
  68180. "mul r9, r7, r7\n\t"
  68181. "mul r6, r7, r6\n\t"
  68182. "lsr r7, r6, #15\n\t"
  68183. "lsl r6, r6, #17\n\t"
  68184. "adds r8, r8, r6\n\t"
  68185. "adc r9, r9, r7\n\t"
  68186. #else
  68187. "umull r8, r9, r6, r6\n\t"
  68188. #endif
  68189. /* A[1] * A[1] */
  68190. "ldr r6, [%[a], #4]\n\t"
  68191. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68192. "lsr r7, r6, #16\n\t"
  68193. "lsl r6, r6, #16\n\t"
  68194. "lsr r6, r6, #16\n\t"
  68195. "mul r10, r6, r6\n\t"
  68196. "mul lr, r7, r7\n\t"
  68197. "mul r6, r7, r6\n\t"
  68198. "lsr r7, r6, #15\n\t"
  68199. "lsl r6, r6, #17\n\t"
  68200. "adds r10, r10, r6\n\t"
  68201. "adc lr, lr, r7\n\t"
  68202. #else
  68203. "umull r10, lr, r6, r6\n\t"
  68204. #endif
  68205. "adds r9, r9, r4\n\t"
  68206. "adcs r10, r10, r5\n\t"
  68207. "adcs lr, lr, r12\n\t"
  68208. "str r8, [sp]\n\t"
  68209. "str r9, [sp, #4]\n\t"
  68210. "str r10, [sp, #8]\n\t"
  68211. "str lr, [sp, #12]\n\t"
  68212. "ldr r3, [sp, #16]\n\t"
  68213. "ldr r4, [sp, #20]\n\t"
  68214. "ldr r5, [sp, #24]\n\t"
  68215. "ldr r12, [sp, #28]\n\t"
  68216. /* A[2] * A[2] */
  68217. "ldr r6, [%[a], #8]\n\t"
  68218. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68219. "lsr r7, r6, #16\n\t"
  68220. "lsl r6, r6, #16\n\t"
  68221. "lsr r6, r6, #16\n\t"
  68222. "mul r8, r6, r6\n\t"
  68223. "mul r9, r7, r7\n\t"
  68224. "mul r6, r7, r6\n\t"
  68225. "lsr r7, r6, #15\n\t"
  68226. "lsl r6, r6, #17\n\t"
  68227. "adcs r8, r8, r6\n\t"
  68228. "adc r9, r9, r7\n\t"
  68229. #else
  68230. "umull r8, r9, r6, r6\n\t"
  68231. #endif
  68232. /* A[3] * A[3] */
  68233. "ldr r6, [%[a], #12]\n\t"
  68234. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68235. "lsr r7, r6, #16\n\t"
  68236. "lsl r6, r6, #16\n\t"
  68237. "lsr r6, r6, #16\n\t"
  68238. "mul r10, r6, r6\n\t"
  68239. "mul lr, r7, r7\n\t"
  68240. "mul r6, r7, r6\n\t"
  68241. "lsr r7, r6, #15\n\t"
  68242. "lsl r6, r6, #17\n\t"
  68243. "adds r10, r10, r6\n\t"
  68244. "adc lr, lr, r7\n\t"
  68245. #else
  68246. "umull r10, lr, r6, r6\n\t"
  68247. #endif
  68248. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  68249. "adcs r8, r8, r3\n\t"
  68250. "adcs r9, r9, r4\n\t"
  68251. #else
  68252. "adds r8, r8, r3\n\t"
  68253. "adcs r9, r9, r4\n\t"
  68254. #endif
  68255. "adcs r10, r10, r5\n\t"
  68256. "adcs lr, lr, r12\n\t"
  68257. "str r8, [sp, #16]\n\t"
  68258. "str r9, [sp, #20]\n\t"
  68259. "str r10, [sp, #24]\n\t"
  68260. "str lr, [sp, #28]\n\t"
  68261. "ldr r3, [sp, #32]\n\t"
  68262. "ldr r4, [sp, #36]\n\t"
  68263. "ldr r5, [sp, #40]\n\t"
  68264. "ldr r12, [sp, #44]\n\t"
  68265. /* A[4] * A[4] */
  68266. "ldr r6, [%[a], #16]\n\t"
  68267. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68268. "lsr r7, r6, #16\n\t"
  68269. "lsl r6, r6, #16\n\t"
  68270. "lsr r6, r6, #16\n\t"
  68271. "mul r8, r6, r6\n\t"
  68272. "mul r9, r7, r7\n\t"
  68273. "mul r6, r7, r6\n\t"
  68274. "lsr r7, r6, #15\n\t"
  68275. "lsl r6, r6, #17\n\t"
  68276. "adcs r8, r8, r6\n\t"
  68277. "adc r9, r9, r7\n\t"
  68278. #else
  68279. "umull r8, r9, r6, r6\n\t"
  68280. #endif
  68281. /* A[5] * A[5] */
  68282. "ldr r6, [%[a], #20]\n\t"
  68283. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68284. "lsr r7, r6, #16\n\t"
  68285. "lsl r6, r6, #16\n\t"
  68286. "lsr r6, r6, #16\n\t"
  68287. "mul r10, r6, r6\n\t"
  68288. "mul lr, r7, r7\n\t"
  68289. "mul r6, r7, r6\n\t"
  68290. "lsr r7, r6, #15\n\t"
  68291. "lsl r6, r6, #17\n\t"
  68292. "adds r10, r10, r6\n\t"
  68293. "adc lr, lr, r7\n\t"
  68294. #else
  68295. "umull r10, lr, r6, r6\n\t"
  68296. #endif
  68297. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  68298. "adcs r8, r8, r3\n\t"
  68299. "adcs r9, r9, r4\n\t"
  68300. #else
  68301. "adds r8, r8, r3\n\t"
  68302. "adcs r9, r9, r4\n\t"
  68303. #endif
  68304. "adcs r10, r10, r5\n\t"
  68305. "adcs lr, lr, r12\n\t"
  68306. "str r8, [sp, #32]\n\t"
  68307. "str r9, [sp, #36]\n\t"
  68308. "str r10, [sp, #40]\n\t"
  68309. "str lr, [sp, #44]\n\t"
  68310. "ldr r3, [sp, #48]\n\t"
  68311. "ldr r4, [sp, #52]\n\t"
  68312. "ldr r5, [sp, #56]\n\t"
  68313. "ldr r12, [sp, #60]\n\t"
  68314. /* A[6] * A[6] */
  68315. "ldr r6, [%[a], #24]\n\t"
  68316. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68317. "lsr r7, r6, #16\n\t"
  68318. "lsl r6, r6, #16\n\t"
  68319. "lsr r6, r6, #16\n\t"
  68320. "mul r8, r6, r6\n\t"
  68321. "mul r9, r7, r7\n\t"
  68322. "mul r6, r7, r6\n\t"
  68323. "lsr r7, r6, #15\n\t"
  68324. "lsl r6, r6, #17\n\t"
  68325. "adcs r8, r8, r6\n\t"
  68326. "adc r9, r9, r7\n\t"
  68327. #else
  68328. "umull r8, r9, r6, r6\n\t"
  68329. #endif
  68330. /* A[7] * A[7] */
  68331. "ldr r6, [%[a], #28]\n\t"
  68332. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68333. "lsr r7, r6, #16\n\t"
  68334. "lsl r6, r6, #16\n\t"
  68335. "lsr r6, r6, #16\n\t"
  68336. "mul r10, r6, r6\n\t"
  68337. "mul lr, r7, r7\n\t"
  68338. "mul r6, r7, r6\n\t"
  68339. "lsr r7, r6, #15\n\t"
  68340. "lsl r6, r6, #17\n\t"
  68341. "adds r10, r10, r6\n\t"
  68342. "adc lr, lr, r7\n\t"
  68343. #else
  68344. "umull r10, lr, r6, r6\n\t"
  68345. #endif
  68346. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  68347. "adcs r8, r8, r3\n\t"
  68348. "adcs r9, r9, r4\n\t"
  68349. #else
  68350. "adds r8, r8, r3\n\t"
  68351. "adcs r9, r9, r4\n\t"
  68352. #endif
  68353. "adcs r10, r10, r5\n\t"
  68354. "adc lr, lr, r12\n\t"
  68355. "str r8, [sp, #48]\n\t"
  68356. "str r9, [sp, #52]\n\t"
  68357. "str r10, [sp, #56]\n\t"
  68358. "str lr, [sp, #60]\n\t"
  68359. /* Start Reduction */
  68360. "ldr r4, [sp]\n\t"
  68361. "ldr r5, [sp, #4]\n\t"
  68362. "ldr r6, [sp, #8]\n\t"
  68363. "ldr r7, [sp, #12]\n\t"
  68364. "ldr r8, [sp, #16]\n\t"
  68365. "ldr r9, [sp, #20]\n\t"
  68366. "ldr r10, [sp, #24]\n\t"
  68367. "ldr lr, [sp, #28]\n\t"
  68368. /* mu = a[0..7] + a[0..4] << 96 + (a[0..1] * 2) << 192 */
  68369. /* - a[0] << 224 */
  68370. /* + (a[0..1] * 2) << (6 * 32) */
  68371. "adds r10, r10, r4\n\t"
  68372. "adc lr, lr, r5\n\t"
  68373. "adds r10, r10, r4\n\t"
  68374. "adc lr, lr, r5\n\t"
  68375. /* - a[0] << (7 * 32) */
  68376. "sub lr, lr, r4\n\t"
  68377. /* + a[0..4] << (3 * 32) */
  68378. "mov %[a], r7\n\t"
  68379. "mov r12, r8\n\t"
  68380. "adds r7, r7, r4\n\t"
  68381. "adcs r8, r8, r5\n\t"
  68382. "adcs r9, r9, r6\n\t"
  68383. "adcs r10, r10, %[a]\n\t"
  68384. "adc lr, lr, r12\n\t"
  68385. "str r7, [sp, #12]\n\t"
  68386. "str r8, [sp, #16]\n\t"
  68387. "str r9, [sp, #20]\n\t"
  68388. /* a += mu * m */
  68389. /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */
  68390. /* a[6] += t[0] + t[3] */
  68391. /* a[7] += t[1] + t[4] */
  68392. "ldr %[a], [sp, #24]\n\t"
  68393. "ldr r2, [sp, #28]\n\t"
  68394. "adds %[a], %[a], r4\n\t"
  68395. "adcs r2, r2, r5\n\t"
  68396. "mov r12, #0\n\t"
  68397. "adc r12, r12, #0\n\t"
  68398. "adds %[a], %[a], r7\n\t"
  68399. "adcs r2, r2, r8\n\t"
  68400. "adc r12, r12, #0\n\t"
  68401. "str r10, [sp, #24]\n\t"
  68402. "str lr, [sp, #28]\n\t"
  68403. "str r2, [sp, #64]\n\t"
  68404. /* a[8] += t[0] + t[2] + t[5] */
  68405. /* a[9] += t[1] + t[3] + t[6] */
  68406. /* a[10] += t[2] + t[4] + t[7] */
  68407. "ldr %[a], [sp, #32]\n\t"
  68408. "ldr r2, [sp, #36]\n\t"
  68409. "ldr r3, [sp, #40]\n\t"
  68410. "adds %[a], %[a], r12\n\t"
  68411. "adcs r2, r2, #0\n\t"
  68412. "adcs r3, r3, #0\n\t"
  68413. "mov r12, #0\n\t"
  68414. "adc r12, r12, #0\n\t"
  68415. "adds %[a], %[a], r4\n\t"
  68416. "adcs r2, r2, r5\n\t"
  68417. "adcs r3, r3, r6\n\t"
  68418. "adc r12, r12, #0\n\t"
  68419. "adds %[a], %[a], r6\n\t"
  68420. "adcs r2, r2, r7\n\t"
  68421. "adcs r3, r3, r8\n\t"
  68422. "adc r12, r12, #0\n\t"
  68423. "adds %[a], %[a], r9\n\t"
  68424. "adcs r2, r2, r10\n\t"
  68425. "adcs r3, r3, lr\n\t"
  68426. "adc r12, r12, #0\n\t"
  68427. "str %[a], [sp, #32]\n\t"
  68428. "str r2, [sp, #36]\n\t"
  68429. "str r3, [sp, #40]\n\t"
  68430. /* a[11] += t[3] + t[5] */
  68431. /* a[12] += t[4] + t[6] */
  68432. /* a[13] += t[5] + t[7] */
  68433. /* a[14] += t[6] */
  68434. /* a[15] += t[7] */
  68435. "ldr %[a], [sp, #44]\n\t"
  68436. "ldr r2, [sp, #48]\n\t"
  68437. "ldr r3, [sp, #52]\n\t"
  68438. "ldr r4, [sp, #56]\n\t"
  68439. "ldr r5, [sp, #60]\n\t"
  68440. "adds %[a], %[a], r12\n\t"
  68441. "adcs r2, r2, #0\n\t"
  68442. "adcs r3, r3, #0\n\t"
  68443. "adcs r4, r4, #0\n\t"
  68444. "adcs r5, r5, #0\n\t"
  68445. "mov r12, #0\n\t"
  68446. "adc r12, r12, #0\n\t"
  68447. "adds %[a], %[a], r7\n\t"
  68448. "adcs r2, r2, r8\n\t"
  68449. "adcs r3, r3, r9\n\t"
  68450. "adcs r4, r4, r10\n\t"
  68451. "adcs r5, r5, lr\n\t"
  68452. "adc r12, r12, #0\n\t"
  68453. "adds %[a], %[a], r9\n\t"
  68454. "adcs r2, r2, r10\n\t"
  68455. "adcs r3, r3, lr\n\t"
  68456. "adcs r4, r4, #0\n\t"
  68457. "adcs r5, r5, #0\n\t"
  68458. "adc r12, r12, #0\n\t"
  68459. "str %[a], [sp, #44]\n\t"
  68460. "str r2, [sp, #48]\n\t"
  68461. "str r3, [sp, #52]\n\t"
  68462. "str r4, [sp, #56]\n\t"
  68463. "str r5, [sp, #60]\n\t"
  68464. "ldr %[a], [sp, #64]\n\t"
  68465. "ldr r2, [sp, #32]\n\t"
  68466. "ldr r3, [sp, #36]\n\t"
  68467. "ldr r4, [sp, #40]\n\t"
  68468. "ldr r8, [sp]\n\t"
  68469. "ldr r9, [sp, #4]\n\t"
  68470. "ldr r10, [sp, #8]\n\t"
  68471. "ldr lr, [sp, #12]\n\t"
  68472. "subs %[a], %[a], r8\n\t"
  68473. "sbcs r2, r2, r9\n\t"
  68474. "sbcs r3, r3, r10\n\t"
  68475. "sbcs r4, r4, lr\n\t"
  68476. "str r2, [sp, #32]\n\t"
  68477. "str r3, [sp, #36]\n\t"
  68478. "str r4, [sp, #40]\n\t"
  68479. "ldr %[a], [sp, #44]\n\t"
  68480. "ldr r2, [sp, #48]\n\t"
  68481. "ldr r3, [sp, #52]\n\t"
  68482. "ldr r4, [sp, #56]\n\t"
  68483. "ldr r5, [sp, #60]\n\t"
  68484. "ldr r8, [sp, #16]\n\t"
  68485. "ldr r9, [sp, #20]\n\t"
  68486. "ldr r10, [sp, #24]\n\t"
  68487. "ldr lr, [sp, #28]\n\t"
  68488. "sbcs %[a], %[a], r8\n\t"
  68489. "sbcs r2, r2, r9\n\t"
  68490. "sbcs r3, r3, r10\n\t"
  68491. "sbcs r4, r4, lr\n\t"
  68492. "sbc r5, r5, #0\n\t"
  68493. /* mask m and sub from result if overflow */
  68494. "rsb r12, r12, #0\n\t"
  68495. "and lr, r12, #1\n\t"
  68496. "ldr r6, [sp, #32]\n\t"
  68497. "ldr r7, [sp, #36]\n\t"
  68498. "ldr r8, [sp, #40]\n\t"
  68499. "subs r6, r6, r12\n\t"
  68500. "sbcs r7, r7, r12\n\t"
  68501. "sbcs r8, r8, r12\n\t"
  68502. "sbcs %[a], %[a], #0\n\t"
  68503. "sbcs r2, r2, #0\n\t"
  68504. "sbcs r3, r3, #0\n\t"
  68505. "sbcs r4, r4, lr\n\t"
  68506. "sbc r5, r5, r12\n\t"
  68507. "stm %[r]!, {r6, r7, r8}\n\t"
  68508. "stm %[r]!, {%[a], r2, r3, r4, r5}\n\t"
  68509. "add sp, sp, #0x44\n\t"
  68510. : [r] "+r" (r), [a] "+r" (a)
  68511. :
  68512. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r12", "r8", "r9", "r10", "lr"
  68513. );
  68514. (void)m_p;
  68515. (void)mp_p;
  68516. }
  68517. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  68518. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  68519. *
  68520. * r Result of squaring.
  68521. * a Number to square in Montgomery form.
  68522. * n Number of times to square.
  68523. * m Modulus (prime).
  68524. * mp Montgomery mulitplier.
  68525. */
  68526. static void sp_256_mont_sqr_n_8(sp_digit* r, const sp_digit* a, int n,
  68527. const sp_digit* m, sp_digit mp)
  68528. {
  68529. sp_256_mont_sqr_8(r, a, m, mp);
  68530. for (; n > 1; n--) {
  68531. sp_256_mont_sqr_8(r, r, m, mp);
  68532. }
  68533. }
  68534. #endif /* !WOLFSSL_SP_SMALL || HAVE_COMP_KEY */
  68535. #ifdef WOLFSSL_SP_SMALL
  68536. /* Mod-2 for the P256 curve. */
  68537. static const uint32_t p256_mod_minus_2[8] = {
  68538. 0xfffffffdU,0xffffffffU,0xffffffffU,0x00000000U,0x00000000U,0x00000000U,
  68539. 0x00000001U,0xffffffffU
  68540. };
  68541. #endif /* !WOLFSSL_SP_SMALL */
  68542. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  68543. * P256 curve. (r = 1 / a mod m)
  68544. *
  68545. * r Inverse result.
  68546. * a Number to invert.
  68547. * td Temporary data.
  68548. */
  68549. static void sp_256_mont_inv_8(sp_digit* r, const sp_digit* a, sp_digit* td)
  68550. {
  68551. #ifdef WOLFSSL_SP_SMALL
  68552. sp_digit* t = td;
  68553. int i;
  68554. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  68555. for (i=254; i>=0; i--) {
  68556. sp_256_mont_sqr_8(t, t, p256_mod, p256_mp_mod);
  68557. if (p256_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  68558. sp_256_mont_mul_8(t, t, a, p256_mod, p256_mp_mod);
  68559. }
  68560. XMEMCPY(r, t, sizeof(sp_digit) * 8);
  68561. #else
  68562. sp_digit* t1 = td;
  68563. sp_digit* t2 = td + 2 * 8;
  68564. sp_digit* t3 = td + 4 * 8;
  68565. /* 0x2 */
  68566. sp_256_mont_sqr_8(t1, a, p256_mod, p256_mp_mod);
  68567. /* 0x3 */
  68568. sp_256_mont_mul_8(t2, t1, a, p256_mod, p256_mp_mod);
  68569. /* 0xc */
  68570. sp_256_mont_sqr_n_8(t1, t2, 2, p256_mod, p256_mp_mod);
  68571. /* 0xd */
  68572. sp_256_mont_mul_8(t3, t1, a, p256_mod, p256_mp_mod);
  68573. /* 0xf */
  68574. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  68575. /* 0xf0 */
  68576. sp_256_mont_sqr_n_8(t1, t2, 4, p256_mod, p256_mp_mod);
  68577. /* 0xfd */
  68578. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  68579. /* 0xff */
  68580. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  68581. /* 0xff00 */
  68582. sp_256_mont_sqr_n_8(t1, t2, 8, p256_mod, p256_mp_mod);
  68583. /* 0xfffd */
  68584. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  68585. /* 0xffff */
  68586. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  68587. /* 0xffff0000 */
  68588. sp_256_mont_sqr_n_8(t1, t2, 16, p256_mod, p256_mp_mod);
  68589. /* 0xfffffffd */
  68590. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  68591. /* 0xffffffff */
  68592. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  68593. /* 0xffffffff00000000 */
  68594. sp_256_mont_sqr_n_8(t1, t2, 32, p256_mod, p256_mp_mod);
  68595. /* 0xffffffffffffffff */
  68596. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  68597. /* 0xffffffff00000001 */
  68598. sp_256_mont_mul_8(r, t1, a, p256_mod, p256_mp_mod);
  68599. /* 0xffffffff000000010000000000000000000000000000000000000000 */
  68600. sp_256_mont_sqr_n_8(r, r, 160, p256_mod, p256_mp_mod);
  68601. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff */
  68602. sp_256_mont_mul_8(r, r, t2, p256_mod, p256_mp_mod);
  68603. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff00000000 */
  68604. sp_256_mont_sqr_n_8(r, r, 32, p256_mod, p256_mp_mod);
  68605. /* 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffd */
  68606. sp_256_mont_mul_8(r, r, t3, p256_mod, p256_mp_mod);
  68607. #endif /* WOLFSSL_SP_SMALL */
  68608. }
  68609. /* Compare a with b in constant time.
  68610. *
  68611. * a A single precision integer.
  68612. * b A single precision integer.
  68613. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  68614. * respectively.
  68615. */
  68616. static sp_int32 sp_256_cmp_8(const sp_digit* a_p, const sp_digit* b_p)
  68617. {
  68618. register const sp_digit* a asm ("r0") = a_p;
  68619. register const sp_digit* b asm ("r1") = b_p;
  68620. __asm__ __volatile__ (
  68621. "mov r2, #-1\n\t"
  68622. "mov r6, #1\n\t"
  68623. "mov r5, #0\n\t"
  68624. "mov r3, #-1\n\t"
  68625. #ifdef WOLFSSL_SP_SMALL
  68626. "mov r4, #28\n\t"
  68627. "\n"
  68628. "L_sp_256_cmp_8_words_%=: \n\t"
  68629. "ldr r12, [%[a], r4]\n\t"
  68630. "ldr lr, [%[b], r4]\n\t"
  68631. "and r12, r12, r3\n\t"
  68632. "and lr, lr, r3\n\t"
  68633. "subs r12, r12, lr\n\t"
  68634. "it hi\n\t"
  68635. "movhi r2, r6\n\t"
  68636. "it lo\n\t"
  68637. "movlo r2, r3\n\t"
  68638. "it ne\n\t"
  68639. "movne r3, r5\n\t"
  68640. "subs r4, r4, #4\n\t"
  68641. "bcs L_sp_256_cmp_8_words_%=\n\t"
  68642. "eor r2, r2, r3\n\t"
  68643. #else
  68644. "ldr r12, [%[a], #28]\n\t"
  68645. "ldr lr, [%[b], #28]\n\t"
  68646. "and r12, r12, r3\n\t"
  68647. "and lr, lr, r3\n\t"
  68648. "subs r12, r12, lr\n\t"
  68649. "it hi\n\t"
  68650. "movhi r2, r6\n\t"
  68651. "it lo\n\t"
  68652. "movlo r2, r3\n\t"
  68653. "it ne\n\t"
  68654. "movne r3, r5\n\t"
  68655. "ldr r12, [%[a], #24]\n\t"
  68656. "ldr lr, [%[b], #24]\n\t"
  68657. "and r12, r12, r3\n\t"
  68658. "and lr, lr, r3\n\t"
  68659. "subs r12, r12, lr\n\t"
  68660. "it hi\n\t"
  68661. "movhi r2, r6\n\t"
  68662. "it lo\n\t"
  68663. "movlo r2, r3\n\t"
  68664. "it ne\n\t"
  68665. "movne r3, r5\n\t"
  68666. "ldr r12, [%[a], #20]\n\t"
  68667. "ldr lr, [%[b], #20]\n\t"
  68668. "and r12, r12, r3\n\t"
  68669. "and lr, lr, r3\n\t"
  68670. "subs r12, r12, lr\n\t"
  68671. "it hi\n\t"
  68672. "movhi r2, r6\n\t"
  68673. "it lo\n\t"
  68674. "movlo r2, r3\n\t"
  68675. "it ne\n\t"
  68676. "movne r3, r5\n\t"
  68677. "ldr r12, [%[a], #16]\n\t"
  68678. "ldr lr, [%[b], #16]\n\t"
  68679. "and r12, r12, r3\n\t"
  68680. "and lr, lr, r3\n\t"
  68681. "subs r12, r12, lr\n\t"
  68682. "it hi\n\t"
  68683. "movhi r2, r6\n\t"
  68684. "it lo\n\t"
  68685. "movlo r2, r3\n\t"
  68686. "it ne\n\t"
  68687. "movne r3, r5\n\t"
  68688. "ldr r12, [%[a], #12]\n\t"
  68689. "ldr lr, [%[b], #12]\n\t"
  68690. "and r12, r12, r3\n\t"
  68691. "and lr, lr, r3\n\t"
  68692. "subs r12, r12, lr\n\t"
  68693. "it hi\n\t"
  68694. "movhi r2, r6\n\t"
  68695. "it lo\n\t"
  68696. "movlo r2, r3\n\t"
  68697. "it ne\n\t"
  68698. "movne r3, r5\n\t"
  68699. "ldr r12, [%[a], #8]\n\t"
  68700. "ldr lr, [%[b], #8]\n\t"
  68701. "and r12, r12, r3\n\t"
  68702. "and lr, lr, r3\n\t"
  68703. "subs r12, r12, lr\n\t"
  68704. "it hi\n\t"
  68705. "movhi r2, r6\n\t"
  68706. "it lo\n\t"
  68707. "movlo r2, r3\n\t"
  68708. "it ne\n\t"
  68709. "movne r3, r5\n\t"
  68710. "ldr r12, [%[a], #4]\n\t"
  68711. "ldr lr, [%[b], #4]\n\t"
  68712. "and r12, r12, r3\n\t"
  68713. "and lr, lr, r3\n\t"
  68714. "subs r12, r12, lr\n\t"
  68715. "it hi\n\t"
  68716. "movhi r2, r6\n\t"
  68717. "it lo\n\t"
  68718. "movlo r2, r3\n\t"
  68719. "it ne\n\t"
  68720. "movne r3, r5\n\t"
  68721. "ldr r12, [%[a]]\n\t"
  68722. "ldr lr, [%[b]]\n\t"
  68723. "and r12, r12, r3\n\t"
  68724. "and lr, lr, r3\n\t"
  68725. "subs r12, r12, lr\n\t"
  68726. "it hi\n\t"
  68727. "movhi r2, r6\n\t"
  68728. "it lo\n\t"
  68729. "movlo r2, r3\n\t"
  68730. "it ne\n\t"
  68731. "movne r3, r5\n\t"
  68732. "eor r2, r2, r3\n\t"
  68733. #endif /*WOLFSSL_SP_SMALL */
  68734. "mov %[a], r2\n\t"
  68735. : [a] "+r" (a), [b] "+r" (b)
  68736. :
  68737. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6"
  68738. );
  68739. return (uint32_t)(size_t)a;
  68740. }
  68741. /* Normalize the values in each word to 32.
  68742. *
  68743. * a Array of sp_digit to normalize.
  68744. */
  68745. #define sp_256_norm_8(a)
  68746. #ifdef WOLFSSL_SP_SMALL
  68747. /* Conditionally subtract b from a using the mask m.
  68748. * m is -1 to subtract and 0 when not copying.
  68749. *
  68750. * r A single precision number representing condition subtract result.
  68751. * a A single precision number to subtract from.
  68752. * b A single precision number to subtract.
  68753. * m Mask value to apply.
  68754. */
  68755. static sp_digit sp_256_cond_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  68756. {
  68757. register sp_digit* r asm ("r0") = r_p;
  68758. register const sp_digit* a asm ("r1") = a_p;
  68759. register const sp_digit* b asm ("r2") = b_p;
  68760. register sp_digit m asm ("r3") = m_p;
  68761. __asm__ __volatile__ (
  68762. "mov r6, #0\n\t"
  68763. "mov r12, #0\n\t"
  68764. "mov lr, #0\n\t"
  68765. "\n"
  68766. "L_sp_256_cond_sub_8_words_%=: \n\t"
  68767. "subs r12, r6, r12\n\t"
  68768. "ldr r4, [%[a], lr]\n\t"
  68769. "ldr r5, [%[b], lr]\n\t"
  68770. "and r5, r5, %[m]\n\t"
  68771. "sbcs r4, r4, r5\n\t"
  68772. "sbc r12, r6, r6\n\t"
  68773. "str r4, [%[r], lr]\n\t"
  68774. "add lr, lr, #4\n\t"
  68775. "cmp lr, #32\n\t"
  68776. "blt L_sp_256_cond_sub_8_words_%=\n\t"
  68777. "mov %[r], r12\n\t"
  68778. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  68779. :
  68780. : "memory", "r12", "lr", "r4", "r5", "r6"
  68781. );
  68782. return (uint32_t)(size_t)r;
  68783. }
  68784. #else
  68785. /* Conditionally subtract b from a using the mask m.
  68786. * m is -1 to subtract and 0 when not copying.
  68787. *
  68788. * r A single precision number representing condition subtract result.
  68789. * a A single precision number to subtract from.
  68790. * b A single precision number to subtract.
  68791. * m Mask value to apply.
  68792. */
  68793. static sp_digit sp_256_cond_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  68794. {
  68795. register sp_digit* r asm ("r0") = r_p;
  68796. register const sp_digit* a asm ("r1") = a_p;
  68797. register const sp_digit* b asm ("r2") = b_p;
  68798. register sp_digit m asm ("r3") = m_p;
  68799. __asm__ __volatile__ (
  68800. "mov lr, #0\n\t"
  68801. "ldm %[a]!, {r4, r5}\n\t"
  68802. "ldm %[b]!, {r6, r7}\n\t"
  68803. "and r6, r6, %[m]\n\t"
  68804. "and r7, r7, %[m]\n\t"
  68805. "subs r4, r4, r6\n\t"
  68806. "sbcs r5, r5, r7\n\t"
  68807. "stm %[r]!, {r4, r5}\n\t"
  68808. "ldm %[a]!, {r4, r5}\n\t"
  68809. "ldm %[b]!, {r6, r7}\n\t"
  68810. "and r6, r6, %[m]\n\t"
  68811. "and r7, r7, %[m]\n\t"
  68812. "sbcs r4, r4, r6\n\t"
  68813. "sbcs r5, r5, r7\n\t"
  68814. "stm %[r]!, {r4, r5}\n\t"
  68815. "ldm %[a]!, {r4, r5}\n\t"
  68816. "ldm %[b]!, {r6, r7}\n\t"
  68817. "and r6, r6, %[m]\n\t"
  68818. "and r7, r7, %[m]\n\t"
  68819. "sbcs r4, r4, r6\n\t"
  68820. "sbcs r5, r5, r7\n\t"
  68821. "stm %[r]!, {r4, r5}\n\t"
  68822. "ldm %[a]!, {r4, r5}\n\t"
  68823. "ldm %[b]!, {r6, r7}\n\t"
  68824. "and r6, r6, %[m]\n\t"
  68825. "and r7, r7, %[m]\n\t"
  68826. "sbcs r4, r4, r6\n\t"
  68827. "sbcs r5, r5, r7\n\t"
  68828. "stm %[r]!, {r4, r5}\n\t"
  68829. "sbc %[r], lr, lr\n\t"
  68830. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  68831. :
  68832. : "memory", "r12", "lr", "r4", "r5", "r6", "r7"
  68833. );
  68834. return (uint32_t)(size_t)r;
  68835. }
  68836. #endif /* WOLFSSL_SP_SMALL */
  68837. #ifndef WOLFSSL_SP_SMALL
  68838. #define sp_256_mont_reduce_order_8 sp_256_mont_reduce_8
  68839. /* Reduce the number back to 256 bits using Montgomery reduction.
  68840. *
  68841. * a A single precision number to reduce in place.
  68842. * m The single precision number representing the modulus.
  68843. * mp The digit representing the negative inverse of m mod 2^n.
  68844. */
  68845. static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  68846. {
  68847. register sp_digit* a asm ("r0") = a_p;
  68848. register const sp_digit* m asm ("r1") = m_p;
  68849. register sp_digit mp asm ("r2") = mp_p;
  68850. __asm__ __volatile__ (
  68851. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  68852. "ldr r11, [%[m]]\n\t"
  68853. #endif
  68854. /* i = 0 */
  68855. "mov r9, #0\n\t"
  68856. "mov r3, #0\n\t"
  68857. "ldr r12, [%[a]]\n\t"
  68858. "ldr lr, [%[a], #4]\n\t"
  68859. "\n"
  68860. "L_sp_256_mont_reduce_8_word_%=: \n\t"
  68861. /* mu = a[i] * mp */
  68862. "mul r8, %[mp], r12\n\t"
  68863. /* a[i+0] += m[0] * mu */
  68864. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68865. "ldr r11, [%[m]]\n\t"
  68866. #endif
  68867. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68868. "lsr r7, r11, #16\n\t"
  68869. "lsr r6, r8, #16\n\t"
  68870. "mul r5, r6, r7\n\t"
  68871. "lsl r7, r11, #16\n\t"
  68872. "lsr r7, r7, #16\n\t"
  68873. "mul r6, r7, r6\n\t"
  68874. "lsr r7, r6, #16\n\t"
  68875. "lsl r6, r6, #16\n\t"
  68876. "adds r12, r12, r6\n\t"
  68877. "adc r5, r5, r7\n\t"
  68878. "lsl r6, r8, #16\n\t"
  68879. "lsl r7, r11, #16\n\t"
  68880. "lsr r6, r6, #16\n\t"
  68881. "lsr r7, r7, #16\n\t"
  68882. "mul r7, r6, r7\n\t"
  68883. "adds r12, r12, r7\n\t"
  68884. "adc r5, r5, #0\n\t"
  68885. "lsr r7, r11, #16\n\t"
  68886. "mul r6, r7, r6\n\t"
  68887. "lsr r7, r6, #16\n\t"
  68888. "lsl r6, r6, #16\n\t"
  68889. "adds r12, r12, r6\n\t"
  68890. "adc r5, r5, r7\n\t"
  68891. #else
  68892. "umull r6, r7, r8, r11\n\t"
  68893. "adds r12, r12, r6\n\t"
  68894. "adc r5, r7, #0\n\t"
  68895. #endif
  68896. /* a[i+1] += m[1] * mu */
  68897. "ldr r7, [%[m], #4]\n\t"
  68898. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68899. "lsr r10, r7, #16\n\t"
  68900. "lsr r6, r8, #16\n\t"
  68901. "mul r4, r6, r10\n\t"
  68902. "lsl r10, r7, #16\n\t"
  68903. "lsr r10, r10, #16\n\t"
  68904. "mul r6, r10, r6\n\t"
  68905. "lsr r10, r6, #16\n\t"
  68906. "lsl r6, r6, #16\n\t"
  68907. "adds lr, lr, r6\n\t"
  68908. "adc r4, r4, r10\n\t"
  68909. "lsl r6, r8, #16\n\t"
  68910. "lsl r10, r7, #16\n\t"
  68911. "lsr r6, r6, #16\n\t"
  68912. "lsr r10, r10, #16\n\t"
  68913. "mul r10, r6, r10\n\t"
  68914. "adds lr, lr, r10\n\t"
  68915. "adc r4, r4, #0\n\t"
  68916. "lsr r10, r7, #16\n\t"
  68917. "mul r6, r10, r6\n\t"
  68918. "lsr r10, r6, #16\n\t"
  68919. "lsl r6, r6, #16\n\t"
  68920. "adds lr, lr, r6\n\t"
  68921. "adc r4, r4, r10\n\t"
  68922. #else
  68923. "umull r6, r10, r8, r7\n\t"
  68924. "adds lr, lr, r6\n\t"
  68925. "adc r4, r10, #0\n\t"
  68926. #endif
  68927. "mov r12, lr\n\t"
  68928. "adds r12, r12, r5\n\t"
  68929. "adc r4, r4, #0\n\t"
  68930. /* a[i+2] += m[2] * mu */
  68931. "ldr r7, [%[m], #8]\n\t"
  68932. "ldr lr, [%[a], #8]\n\t"
  68933. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68934. "lsr r10, r7, #16\n\t"
  68935. "lsr r6, r8, #16\n\t"
  68936. "mul r5, r6, r10\n\t"
  68937. "lsl r10, r7, #16\n\t"
  68938. "lsr r10, r10, #16\n\t"
  68939. "mul r6, r10, r6\n\t"
  68940. "lsr r10, r6, #16\n\t"
  68941. "lsl r6, r6, #16\n\t"
  68942. "adds lr, lr, r6\n\t"
  68943. "adc r5, r5, r10\n\t"
  68944. "lsl r6, r8, #16\n\t"
  68945. "lsl r10, r7, #16\n\t"
  68946. "lsr r6, r6, #16\n\t"
  68947. "lsr r10, r10, #16\n\t"
  68948. "mul r10, r6, r10\n\t"
  68949. "adds lr, lr, r10\n\t"
  68950. "adc r5, r5, #0\n\t"
  68951. "lsr r10, r7, #16\n\t"
  68952. "mul r6, r10, r6\n\t"
  68953. "lsr r10, r6, #16\n\t"
  68954. "lsl r6, r6, #16\n\t"
  68955. "adds lr, lr, r6\n\t"
  68956. "adc r5, r5, r10\n\t"
  68957. #else
  68958. "umull r6, r10, r8, r7\n\t"
  68959. "adds lr, lr, r6\n\t"
  68960. "adc r5, r10, #0\n\t"
  68961. #endif
  68962. "adds lr, lr, r4\n\t"
  68963. "adc r5, r5, #0\n\t"
  68964. /* a[i+3] += m[3] * mu */
  68965. "ldr r7, [%[m], #12]\n\t"
  68966. "ldr r10, [%[a], #12]\n\t"
  68967. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  68968. "lsr r11, r7, #16\n\t"
  68969. "lsr r6, r8, #16\n\t"
  68970. "mul r4, r6, r11\n\t"
  68971. "lsl r11, r7, #16\n\t"
  68972. "lsr r11, r11, #16\n\t"
  68973. "mul r6, r11, r6\n\t"
  68974. "lsr r11, r6, #16\n\t"
  68975. "lsl r6, r6, #16\n\t"
  68976. "adds r10, r10, r6\n\t"
  68977. "adc r4, r4, r11\n\t"
  68978. "lsl r6, r8, #16\n\t"
  68979. "lsl r11, r7, #16\n\t"
  68980. "lsr r6, r6, #16\n\t"
  68981. "lsr r11, r11, #16\n\t"
  68982. "mul r11, r6, r11\n\t"
  68983. "adds r10, r10, r11\n\t"
  68984. "adc r4, r4, #0\n\t"
  68985. "lsr r11, r7, #16\n\t"
  68986. "mul r6, r11, r6\n\t"
  68987. "lsr r11, r6, #16\n\t"
  68988. "lsl r6, r6, #16\n\t"
  68989. "adds r10, r10, r6\n\t"
  68990. "adc r4, r4, r11\n\t"
  68991. #else
  68992. "umull r6, r7, r8, r7\n\t"
  68993. "adds r10, r10, r6\n\t"
  68994. "adc r4, r7, #0\n\t"
  68995. #endif
  68996. "adds r10, r10, r5\n\t"
  68997. "str r10, [%[a], #12]\n\t"
  68998. "adc r4, r4, #0\n\t"
  68999. /* a[i+4] += m[4] * mu */
  69000. "ldr r7, [%[m], #16]\n\t"
  69001. "ldr r10, [%[a], #16]\n\t"
  69002. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69003. "lsr r11, r7, #16\n\t"
  69004. "lsr r6, r8, #16\n\t"
  69005. "mul r5, r6, r11\n\t"
  69006. "lsl r11, r7, #16\n\t"
  69007. "lsr r11, r11, #16\n\t"
  69008. "mul r6, r11, r6\n\t"
  69009. "lsr r11, r6, #16\n\t"
  69010. "lsl r6, r6, #16\n\t"
  69011. "adds r10, r10, r6\n\t"
  69012. "adc r5, r5, r11\n\t"
  69013. "lsl r6, r8, #16\n\t"
  69014. "lsl r11, r7, #16\n\t"
  69015. "lsr r6, r6, #16\n\t"
  69016. "lsr r11, r11, #16\n\t"
  69017. "mul r11, r6, r11\n\t"
  69018. "adds r10, r10, r11\n\t"
  69019. "adc r5, r5, #0\n\t"
  69020. "lsr r11, r7, #16\n\t"
  69021. "mul r6, r11, r6\n\t"
  69022. "lsr r11, r6, #16\n\t"
  69023. "lsl r6, r6, #16\n\t"
  69024. "adds r10, r10, r6\n\t"
  69025. "adc r5, r5, r11\n\t"
  69026. #else
  69027. "umull r6, r7, r8, r7\n\t"
  69028. "adds r10, r10, r6\n\t"
  69029. "adc r5, r7, #0\n\t"
  69030. #endif
  69031. "adds r10, r10, r4\n\t"
  69032. "str r10, [%[a], #16]\n\t"
  69033. "adc r5, r5, #0\n\t"
  69034. /* a[i+5] += m[5] * mu */
  69035. "ldr r7, [%[m], #20]\n\t"
  69036. "ldr r10, [%[a], #20]\n\t"
  69037. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69038. "lsr r11, r7, #16\n\t"
  69039. "lsr r6, r8, #16\n\t"
  69040. "mul r4, r6, r11\n\t"
  69041. "lsl r11, r7, #16\n\t"
  69042. "lsr r11, r11, #16\n\t"
  69043. "mul r6, r11, r6\n\t"
  69044. "lsr r11, r6, #16\n\t"
  69045. "lsl r6, r6, #16\n\t"
  69046. "adds r10, r10, r6\n\t"
  69047. "adc r4, r4, r11\n\t"
  69048. "lsl r6, r8, #16\n\t"
  69049. "lsl r11, r7, #16\n\t"
  69050. "lsr r6, r6, #16\n\t"
  69051. "lsr r11, r11, #16\n\t"
  69052. "mul r11, r6, r11\n\t"
  69053. "adds r10, r10, r11\n\t"
  69054. "adc r4, r4, #0\n\t"
  69055. "lsr r11, r7, #16\n\t"
  69056. "mul r6, r11, r6\n\t"
  69057. "lsr r11, r6, #16\n\t"
  69058. "lsl r6, r6, #16\n\t"
  69059. "adds r10, r10, r6\n\t"
  69060. "adc r4, r4, r11\n\t"
  69061. #else
  69062. "umull r6, r7, r8, r7\n\t"
  69063. "adds r10, r10, r6\n\t"
  69064. "adc r4, r7, #0\n\t"
  69065. #endif
  69066. "adds r10, r10, r5\n\t"
  69067. "str r10, [%[a], #20]\n\t"
  69068. "adc r4, r4, #0\n\t"
  69069. /* a[i+6] += m[6] * mu */
  69070. "ldr r7, [%[m], #24]\n\t"
  69071. "ldr r10, [%[a], #24]\n\t"
  69072. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69073. "lsr r11, r7, #16\n\t"
  69074. "lsr r6, r8, #16\n\t"
  69075. "mul r5, r6, r11\n\t"
  69076. "lsl r11, r7, #16\n\t"
  69077. "lsr r11, r11, #16\n\t"
  69078. "mul r6, r11, r6\n\t"
  69079. "lsr r11, r6, #16\n\t"
  69080. "lsl r6, r6, #16\n\t"
  69081. "adds r10, r10, r6\n\t"
  69082. "adc r5, r5, r11\n\t"
  69083. "lsl r6, r8, #16\n\t"
  69084. "lsl r11, r7, #16\n\t"
  69085. "lsr r6, r6, #16\n\t"
  69086. "lsr r11, r11, #16\n\t"
  69087. "mul r11, r6, r11\n\t"
  69088. "adds r10, r10, r11\n\t"
  69089. "adc r5, r5, #0\n\t"
  69090. "lsr r11, r7, #16\n\t"
  69091. "mul r6, r11, r6\n\t"
  69092. "lsr r11, r6, #16\n\t"
  69093. "lsl r6, r6, #16\n\t"
  69094. "adds r10, r10, r6\n\t"
  69095. "adc r5, r5, r11\n\t"
  69096. #else
  69097. "umull r6, r7, r8, r7\n\t"
  69098. "adds r10, r10, r6\n\t"
  69099. "adc r5, r7, #0\n\t"
  69100. #endif
  69101. "adds r10, r10, r4\n\t"
  69102. "str r10, [%[a], #24]\n\t"
  69103. "adc r5, r5, #0\n\t"
  69104. /* a[i+7] += m[7] * mu */
  69105. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  69106. "ldr r7, [%[m], #28]\n\t"
  69107. #else
  69108. "ldr r11, [%[m], #28]\n\t"
  69109. #endif
  69110. "ldr r10, [%[a], #28]\n\t"
  69111. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69112. "lsl r6, r8, #16\n\t"
  69113. "lsl r7, r11, #16\n\t"
  69114. "lsr r6, r6, #16\n\t"
  69115. "lsr r7, r7, #16\n\t"
  69116. "mul r7, r6, r7\n\t"
  69117. "adds r5, r5, r7\n\t"
  69118. "adcs r4, r3, #0\n\t"
  69119. "mov r3, #0\n\t"
  69120. "adc r3, r3, r3\n\t"
  69121. "lsr r7, r11, #16\n\t"
  69122. "mul r6, r7, r6\n\t"
  69123. "lsr r7, r6, #16\n\t"
  69124. "lsl r6, r6, #16\n\t"
  69125. "adds r5, r5, r6\n\t"
  69126. "adcs r4, r4, r7\n\t"
  69127. "adc r3, r3, #0\n\t"
  69128. "mov r6, r8\n\t"
  69129. "lsr r7, r11, #16\n\t"
  69130. "lsr r6, r6, #16\n\t"
  69131. "mul r7, r6, r7\n\t"
  69132. "adds r4, r4, r7\n\t"
  69133. "lsl r7, r11, #16\n\t"
  69134. "adc r3, r3, #0\n\t"
  69135. "lsr r7, r7, #16\n\t"
  69136. "mul r6, r7, r6\n\t"
  69137. "lsr r7, r6, #16\n\t"
  69138. "lsl r6, r6, #16\n\t"
  69139. "adds r5, r5, r6\n\t"
  69140. "adcs r4, r4, r7\n\t"
  69141. "adc r3, r3, #0\n\t"
  69142. #else
  69143. "umull r6, r7, r8, r7\n\t"
  69144. "adds r5, r5, r6\n\t"
  69145. "adcs r4, r7, r3\n\t"
  69146. "mov r3, #0\n\t"
  69147. "adc r3, r3, r3\n\t"
  69148. #endif
  69149. "adds r10, r10, r5\n\t"
  69150. "str r10, [%[a], #28]\n\t"
  69151. "ldr r10, [%[a], #32]\n\t"
  69152. "adcs r10, r10, r4\n\t"
  69153. "str r10, [%[a], #32]\n\t"
  69154. "adc r3, r3, #0\n\t"
  69155. /* i += 1 */
  69156. "add r9, r9, #4\n\t"
  69157. "add %[a], %[a], #4\n\t"
  69158. "cmp r9, #32\n\t"
  69159. "blt L_sp_256_mont_reduce_8_word_%=\n\t"
  69160. "str r12, [%[a]]\n\t"
  69161. "str lr, [%[a], #4]\n\t"
  69162. "mov %[mp], r3\n\t"
  69163. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  69164. :
  69165. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  69166. );
  69167. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  69168. }
  69169. #else
  69170. /* Reduce the number back to 256 bits using Montgomery reduction.
  69171. *
  69172. * a A single precision number to reduce in place.
  69173. * m The single precision number representing the modulus.
  69174. * mp The digit representing the negative inverse of m mod 2^n.
  69175. */
  69176. static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  69177. {
  69178. register sp_digit* a asm ("r0") = a_p;
  69179. __asm__ __volatile__ (
  69180. "mov r1, #0\n\t"
  69181. /* # i = 0 */
  69182. "mov r8, #0\n\t"
  69183. "\n"
  69184. "L_sp_256_mont_reduce_8_word_%=: \n\t"
  69185. "mov r4, #0\n\t"
  69186. /* mu = a[i] * 1 (mp) = a[i] */
  69187. "ldr r2, [%[a]]\n\t"
  69188. /* a[i+0] += -1 * mu */
  69189. "mov r5, r2\n\t"
  69190. "str r4, [%[a]]\n\t"
  69191. /* a[i+1] += -1 * mu */
  69192. "ldr r6, [%[a], #4]\n\t"
  69193. "mov r4, r2\n\t"
  69194. "subs r5, r5, r2\n\t"
  69195. "sbc r4, r4, #0\n\t"
  69196. "adds r5, r5, r6\n\t"
  69197. "adc r4, r4, #0\n\t"
  69198. "str r5, [%[a], #4]\n\t"
  69199. /* a[i+2] += -1 * mu */
  69200. "ldr r6, [%[a], #8]\n\t"
  69201. "mov r5, r2\n\t"
  69202. "subs r4, r4, r2\n\t"
  69203. "sbc r5, r5, #0\n\t"
  69204. "adds r4, r4, r6\n\t"
  69205. "adc r5, r5, #0\n\t"
  69206. "str r4, [%[a], #8]\n\t"
  69207. /* a[i+3] += 0 * mu */
  69208. "ldr r6, [%[a], #12]\n\t"
  69209. "mov r4, #0\n\t"
  69210. "adds r5, r5, r6\n\t"
  69211. "adc r4, r4, #0\n\t"
  69212. "str r5, [%[a], #12]\n\t"
  69213. /* a[i+4] += 0 * mu */
  69214. "ldr r6, [%[a], #16]\n\t"
  69215. "mov r5, #0\n\t"
  69216. "adds r4, r4, r6\n\t"
  69217. "adc r5, r5, #0\n\t"
  69218. "str r4, [%[a], #16]\n\t"
  69219. /* a[i+5] += 0 * mu */
  69220. "ldr r6, [%[a], #20]\n\t"
  69221. "mov r4, #0\n\t"
  69222. "adds r5, r5, r6\n\t"
  69223. "adc r4, r4, #0\n\t"
  69224. "str r5, [%[a], #20]\n\t"
  69225. /* a[i+6] += 1 * mu */
  69226. "ldr r6, [%[a], #24]\n\t"
  69227. "mov r5, #0\n\t"
  69228. "adds r4, r4, r2\n\t"
  69229. "adc r5, r5, #0\n\t"
  69230. "adds r4, r4, r6\n\t"
  69231. "adc r5, r5, #0\n\t"
  69232. "str r4, [%[a], #24]\n\t"
  69233. /* a[i+7] += -1 * mu */
  69234. "ldr r6, [%[a], #28]\n\t"
  69235. "ldr r7, [%[a], #32]\n\t"
  69236. "adds r4, r1, r2\n\t"
  69237. "mov r1, #0\n\t"
  69238. "adc r1, r1, r1\n\t"
  69239. "subs r5, r5, r2\n\t"
  69240. "sbcs r4, r4, #0\n\t"
  69241. "sbc r1, r1, #0\n\t"
  69242. "adds r5, r5, r6\n\t"
  69243. "adcs r4, r4, r7\n\t"
  69244. "adc r1, r1, #0\n\t"
  69245. "str r5, [%[a], #28]\n\t"
  69246. "str r4, [%[a], #32]\n\t"
  69247. /* i += 1 */
  69248. "add r8, r8, #4\n\t"
  69249. "add %[a], %[a], #4\n\t"
  69250. "cmp r8, #32\n\t"
  69251. "blt L_sp_256_mont_reduce_8_word_%=\n\t"
  69252. "mov r2, r1\n\t"
  69253. "sub r1, r1, #1\n\t"
  69254. "mvn r1, r1\n\t"
  69255. "ldm %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  69256. "sub %[a], %[a], #32\n\t"
  69257. "subs r4, r4, r1\n\t"
  69258. "sbcs r5, r5, r1\n\t"
  69259. "sbcs r6, r6, r1\n\t"
  69260. "sbcs r7, r7, #0\n\t"
  69261. "sbcs r8, r8, #0\n\t"
  69262. "sbcs r9, r9, #0\n\t"
  69263. "sbcs r10, r10, r2\n\t"
  69264. "sbc r11, r11, r1\n\t"
  69265. "stm %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  69266. : [a] "+r" (a)
  69267. :
  69268. : "memory", "r1", "r2", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  69269. );
  69270. (void)m_p;
  69271. (void)mp_p;
  69272. }
  69273. /* Reduce the number back to 256 bits using Montgomery reduction.
  69274. *
  69275. * a A single precision number to reduce in place.
  69276. * m The single precision number representing the modulus.
  69277. * mp The digit representing the negative inverse of m mod 2^n.
  69278. */
  69279. static SP_NOINLINE void sp_256_mont_reduce_order_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  69280. {
  69281. register sp_digit* a asm ("r0") = a_p;
  69282. register const sp_digit* m asm ("r1") = m_p;
  69283. register sp_digit mp asm ("r2") = mp_p;
  69284. __asm__ __volatile__ (
  69285. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  69286. "ldr r11, [%[m]]\n\t"
  69287. #endif
  69288. /* i = 0 */
  69289. "mov r9, #0\n\t"
  69290. "mov r3, #0\n\t"
  69291. "ldr r12, [%[a]]\n\t"
  69292. "ldr lr, [%[a], #4]\n\t"
  69293. "\n"
  69294. "L_sp_256_mont_reduce_order_8_word_%=: \n\t"
  69295. /* mu = a[i] * mp */
  69296. "mul r8, %[mp], r12\n\t"
  69297. /* a[i+0] += m[0] * mu */
  69298. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69299. "ldr r11, [%[m]]\n\t"
  69300. #endif
  69301. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69302. "lsr r7, r11, #16\n\t"
  69303. "lsr r6, r8, #16\n\t"
  69304. "mul r5, r6, r7\n\t"
  69305. "lsl r7, r11, #16\n\t"
  69306. "lsr r7, r7, #16\n\t"
  69307. "mul r6, r7, r6\n\t"
  69308. "lsr r7, r6, #16\n\t"
  69309. "lsl r6, r6, #16\n\t"
  69310. "adds r12, r12, r6\n\t"
  69311. "adc r5, r5, r7\n\t"
  69312. "lsl r6, r8, #16\n\t"
  69313. "lsl r7, r11, #16\n\t"
  69314. "lsr r6, r6, #16\n\t"
  69315. "lsr r7, r7, #16\n\t"
  69316. "mul r7, r6, r7\n\t"
  69317. "adds r12, r12, r7\n\t"
  69318. "adc r5, r5, #0\n\t"
  69319. "lsr r7, r11, #16\n\t"
  69320. "mul r6, r7, r6\n\t"
  69321. "lsr r7, r6, #16\n\t"
  69322. "lsl r6, r6, #16\n\t"
  69323. "adds r12, r12, r6\n\t"
  69324. "adc r5, r5, r7\n\t"
  69325. #else
  69326. "umull r6, r7, r8, r11\n\t"
  69327. "adds r12, r12, r6\n\t"
  69328. "adc r5, r7, #0\n\t"
  69329. #endif
  69330. /* a[i+1] += m[1] * mu */
  69331. "ldr r7, [%[m], #4]\n\t"
  69332. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69333. "lsr r10, r7, #16\n\t"
  69334. "lsr r6, r8, #16\n\t"
  69335. "mul r4, r6, r10\n\t"
  69336. "lsl r10, r7, #16\n\t"
  69337. "lsr r10, r10, #16\n\t"
  69338. "mul r6, r10, r6\n\t"
  69339. "lsr r10, r6, #16\n\t"
  69340. "lsl r6, r6, #16\n\t"
  69341. "adds lr, lr, r6\n\t"
  69342. "adc r4, r4, r10\n\t"
  69343. "lsl r6, r8, #16\n\t"
  69344. "lsl r10, r7, #16\n\t"
  69345. "lsr r6, r6, #16\n\t"
  69346. "lsr r10, r10, #16\n\t"
  69347. "mul r10, r6, r10\n\t"
  69348. "adds lr, lr, r10\n\t"
  69349. "adc r4, r4, #0\n\t"
  69350. "lsr r10, r7, #16\n\t"
  69351. "mul r6, r10, r6\n\t"
  69352. "lsr r10, r6, #16\n\t"
  69353. "lsl r6, r6, #16\n\t"
  69354. "adds lr, lr, r6\n\t"
  69355. "adc r4, r4, r10\n\t"
  69356. #else
  69357. "umull r6, r10, r8, r7\n\t"
  69358. "adds lr, lr, r6\n\t"
  69359. "adc r4, r10, #0\n\t"
  69360. #endif
  69361. "mov r12, lr\n\t"
  69362. "adds r12, r12, r5\n\t"
  69363. "adc r4, r4, #0\n\t"
  69364. /* a[i+2] += m[2] * mu */
  69365. "ldr r7, [%[m], #8]\n\t"
  69366. "ldr lr, [%[a], #8]\n\t"
  69367. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69368. "lsr r10, r7, #16\n\t"
  69369. "lsr r6, r8, #16\n\t"
  69370. "mul r5, r6, r10\n\t"
  69371. "lsl r10, r7, #16\n\t"
  69372. "lsr r10, r10, #16\n\t"
  69373. "mul r6, r10, r6\n\t"
  69374. "lsr r10, r6, #16\n\t"
  69375. "lsl r6, r6, #16\n\t"
  69376. "adds lr, lr, r6\n\t"
  69377. "adc r5, r5, r10\n\t"
  69378. "lsl r6, r8, #16\n\t"
  69379. "lsl r10, r7, #16\n\t"
  69380. "lsr r6, r6, #16\n\t"
  69381. "lsr r10, r10, #16\n\t"
  69382. "mul r10, r6, r10\n\t"
  69383. "adds lr, lr, r10\n\t"
  69384. "adc r5, r5, #0\n\t"
  69385. "lsr r10, r7, #16\n\t"
  69386. "mul r6, r10, r6\n\t"
  69387. "lsr r10, r6, #16\n\t"
  69388. "lsl r6, r6, #16\n\t"
  69389. "adds lr, lr, r6\n\t"
  69390. "adc r5, r5, r10\n\t"
  69391. #else
  69392. "umull r6, r10, r8, r7\n\t"
  69393. "adds lr, lr, r6\n\t"
  69394. "adc r5, r10, #0\n\t"
  69395. #endif
  69396. "adds lr, lr, r4\n\t"
  69397. "adc r5, r5, #0\n\t"
  69398. /* a[i+3] += m[3] * mu */
  69399. "ldr r7, [%[m], #12]\n\t"
  69400. "ldr r10, [%[a], #12]\n\t"
  69401. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69402. "lsr r11, r7, #16\n\t"
  69403. "lsr r6, r8, #16\n\t"
  69404. "mul r4, r6, r11\n\t"
  69405. "lsl r11, r7, #16\n\t"
  69406. "lsr r11, r11, #16\n\t"
  69407. "mul r6, r11, r6\n\t"
  69408. "lsr r11, r6, #16\n\t"
  69409. "lsl r6, r6, #16\n\t"
  69410. "adds r10, r10, r6\n\t"
  69411. "adc r4, r4, r11\n\t"
  69412. "lsl r6, r8, #16\n\t"
  69413. "lsl r11, r7, #16\n\t"
  69414. "lsr r6, r6, #16\n\t"
  69415. "lsr r11, r11, #16\n\t"
  69416. "mul r11, r6, r11\n\t"
  69417. "adds r10, r10, r11\n\t"
  69418. "adc r4, r4, #0\n\t"
  69419. "lsr r11, r7, #16\n\t"
  69420. "mul r6, r11, r6\n\t"
  69421. "lsr r11, r6, #16\n\t"
  69422. "lsl r6, r6, #16\n\t"
  69423. "adds r10, r10, r6\n\t"
  69424. "adc r4, r4, r11\n\t"
  69425. #else
  69426. "umull r6, r7, r8, r7\n\t"
  69427. "adds r10, r10, r6\n\t"
  69428. "adc r4, r7, #0\n\t"
  69429. #endif
  69430. "adds r10, r10, r5\n\t"
  69431. "str r10, [%[a], #12]\n\t"
  69432. "adc r4, r4, #0\n\t"
  69433. /* a[i+4] += m[4] * mu */
  69434. "ldr r7, [%[m], #16]\n\t"
  69435. "ldr r10, [%[a], #16]\n\t"
  69436. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69437. "lsr r11, r7, #16\n\t"
  69438. "lsr r6, r8, #16\n\t"
  69439. "mul r5, r6, r11\n\t"
  69440. "lsl r11, r7, #16\n\t"
  69441. "lsr r11, r11, #16\n\t"
  69442. "mul r6, r11, r6\n\t"
  69443. "lsr r11, r6, #16\n\t"
  69444. "lsl r6, r6, #16\n\t"
  69445. "adds r10, r10, r6\n\t"
  69446. "adc r5, r5, r11\n\t"
  69447. "lsl r6, r8, #16\n\t"
  69448. "lsl r11, r7, #16\n\t"
  69449. "lsr r6, r6, #16\n\t"
  69450. "lsr r11, r11, #16\n\t"
  69451. "mul r11, r6, r11\n\t"
  69452. "adds r10, r10, r11\n\t"
  69453. "adc r5, r5, #0\n\t"
  69454. "lsr r11, r7, #16\n\t"
  69455. "mul r6, r11, r6\n\t"
  69456. "lsr r11, r6, #16\n\t"
  69457. "lsl r6, r6, #16\n\t"
  69458. "adds r10, r10, r6\n\t"
  69459. "adc r5, r5, r11\n\t"
  69460. #else
  69461. "umull r6, r7, r8, r7\n\t"
  69462. "adds r10, r10, r6\n\t"
  69463. "adc r5, r7, #0\n\t"
  69464. #endif
  69465. "adds r10, r10, r4\n\t"
  69466. "str r10, [%[a], #16]\n\t"
  69467. "adc r5, r5, #0\n\t"
  69468. /* a[i+5] += m[5] * mu */
  69469. "ldr r7, [%[m], #20]\n\t"
  69470. "ldr r10, [%[a], #20]\n\t"
  69471. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69472. "lsr r11, r7, #16\n\t"
  69473. "lsr r6, r8, #16\n\t"
  69474. "mul r4, r6, r11\n\t"
  69475. "lsl r11, r7, #16\n\t"
  69476. "lsr r11, r11, #16\n\t"
  69477. "mul r6, r11, r6\n\t"
  69478. "lsr r11, r6, #16\n\t"
  69479. "lsl r6, r6, #16\n\t"
  69480. "adds r10, r10, r6\n\t"
  69481. "adc r4, r4, r11\n\t"
  69482. "lsl r6, r8, #16\n\t"
  69483. "lsl r11, r7, #16\n\t"
  69484. "lsr r6, r6, #16\n\t"
  69485. "lsr r11, r11, #16\n\t"
  69486. "mul r11, r6, r11\n\t"
  69487. "adds r10, r10, r11\n\t"
  69488. "adc r4, r4, #0\n\t"
  69489. "lsr r11, r7, #16\n\t"
  69490. "mul r6, r11, r6\n\t"
  69491. "lsr r11, r6, #16\n\t"
  69492. "lsl r6, r6, #16\n\t"
  69493. "adds r10, r10, r6\n\t"
  69494. "adc r4, r4, r11\n\t"
  69495. #else
  69496. "umull r6, r7, r8, r7\n\t"
  69497. "adds r10, r10, r6\n\t"
  69498. "adc r4, r7, #0\n\t"
  69499. #endif
  69500. "adds r10, r10, r5\n\t"
  69501. "str r10, [%[a], #20]\n\t"
  69502. "adc r4, r4, #0\n\t"
  69503. /* a[i+6] += m[6] * mu */
  69504. "ldr r7, [%[m], #24]\n\t"
  69505. "ldr r10, [%[a], #24]\n\t"
  69506. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69507. "lsr r11, r7, #16\n\t"
  69508. "lsr r6, r8, #16\n\t"
  69509. "mul r5, r6, r11\n\t"
  69510. "lsl r11, r7, #16\n\t"
  69511. "lsr r11, r11, #16\n\t"
  69512. "mul r6, r11, r6\n\t"
  69513. "lsr r11, r6, #16\n\t"
  69514. "lsl r6, r6, #16\n\t"
  69515. "adds r10, r10, r6\n\t"
  69516. "adc r5, r5, r11\n\t"
  69517. "lsl r6, r8, #16\n\t"
  69518. "lsl r11, r7, #16\n\t"
  69519. "lsr r6, r6, #16\n\t"
  69520. "lsr r11, r11, #16\n\t"
  69521. "mul r11, r6, r11\n\t"
  69522. "adds r10, r10, r11\n\t"
  69523. "adc r5, r5, #0\n\t"
  69524. "lsr r11, r7, #16\n\t"
  69525. "mul r6, r11, r6\n\t"
  69526. "lsr r11, r6, #16\n\t"
  69527. "lsl r6, r6, #16\n\t"
  69528. "adds r10, r10, r6\n\t"
  69529. "adc r5, r5, r11\n\t"
  69530. #else
  69531. "umull r6, r7, r8, r7\n\t"
  69532. "adds r10, r10, r6\n\t"
  69533. "adc r5, r7, #0\n\t"
  69534. #endif
  69535. "adds r10, r10, r4\n\t"
  69536. "str r10, [%[a], #24]\n\t"
  69537. "adc r5, r5, #0\n\t"
  69538. /* a[i+7] += m[7] * mu */
  69539. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  69540. "ldr r7, [%[m], #28]\n\t"
  69541. #else
  69542. "ldr r11, [%[m], #28]\n\t"
  69543. #endif
  69544. "ldr r10, [%[a], #28]\n\t"
  69545. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  69546. "lsl r6, r8, #16\n\t"
  69547. "lsl r7, r11, #16\n\t"
  69548. "lsr r6, r6, #16\n\t"
  69549. "lsr r7, r7, #16\n\t"
  69550. "mul r7, r6, r7\n\t"
  69551. "adds r5, r5, r7\n\t"
  69552. "adcs r4, r3, #0\n\t"
  69553. "mov r3, #0\n\t"
  69554. "adc r3, r3, r3\n\t"
  69555. "lsr r7, r11, #16\n\t"
  69556. "mul r6, r7, r6\n\t"
  69557. "lsr r7, r6, #16\n\t"
  69558. "lsl r6, r6, #16\n\t"
  69559. "adds r5, r5, r6\n\t"
  69560. "adcs r4, r4, r7\n\t"
  69561. "adc r3, r3, #0\n\t"
  69562. "mov r6, r8\n\t"
  69563. "lsr r7, r11, #16\n\t"
  69564. "lsr r6, r6, #16\n\t"
  69565. "mul r7, r6, r7\n\t"
  69566. "adds r4, r4, r7\n\t"
  69567. "lsl r7, r11, #16\n\t"
  69568. "adc r3, r3, #0\n\t"
  69569. "lsr r7, r7, #16\n\t"
  69570. "mul r6, r7, r6\n\t"
  69571. "lsr r7, r6, #16\n\t"
  69572. "lsl r6, r6, #16\n\t"
  69573. "adds r5, r5, r6\n\t"
  69574. "adcs r4, r4, r7\n\t"
  69575. "adc r3, r3, #0\n\t"
  69576. #else
  69577. "umull r6, r7, r8, r7\n\t"
  69578. "adds r5, r5, r6\n\t"
  69579. "adcs r4, r7, r3\n\t"
  69580. "mov r3, #0\n\t"
  69581. "adc r3, r3, r3\n\t"
  69582. #endif
  69583. "adds r10, r10, r5\n\t"
  69584. "str r10, [%[a], #28]\n\t"
  69585. "ldr r10, [%[a], #32]\n\t"
  69586. "adcs r10, r10, r4\n\t"
  69587. "str r10, [%[a], #32]\n\t"
  69588. "adc r3, r3, #0\n\t"
  69589. /* i += 1 */
  69590. "add r9, r9, #4\n\t"
  69591. "add %[a], %[a], #4\n\t"
  69592. "cmp r9, #32\n\t"
  69593. "blt L_sp_256_mont_reduce_order_8_word_%=\n\t"
  69594. "str r12, [%[a]]\n\t"
  69595. "str lr, [%[a], #4]\n\t"
  69596. "mov %[mp], r3\n\t"
  69597. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  69598. :
  69599. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  69600. );
  69601. sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp);
  69602. }
  69603. #endif /* WOLFSSL_SP_SMALL */
  69604. /* Map the Montgomery form projective coordinate point to an affine point.
  69605. *
  69606. * r Resulting affine coordinate point.
  69607. * p Montgomery form projective coordinate point.
  69608. * t Temporary ordinate data.
  69609. */
  69610. static void sp_256_map_8(sp_point_256* r, const sp_point_256* p,
  69611. sp_digit* t)
  69612. {
  69613. sp_digit* t1 = t;
  69614. sp_digit* t2 = t + 2*8;
  69615. sp_int32 n;
  69616. sp_256_mont_inv_8(t1, p->z, t + 2*8);
  69617. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  69618. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  69619. /* x /= z^2 */
  69620. sp_256_mont_mul_8(r->x, p->x, t2, p256_mod, p256_mp_mod);
  69621. XMEMSET(r->x + 8, 0, sizeof(r->x) / 2U);
  69622. sp_256_mont_reduce_8(r->x, p256_mod, p256_mp_mod);
  69623. /* Reduce x to less than modulus */
  69624. n = sp_256_cmp_8(r->x, p256_mod);
  69625. sp_256_cond_sub_8(r->x, r->x, p256_mod, ~(n >> 31));
  69626. sp_256_norm_8(r->x);
  69627. /* y /= z^3 */
  69628. sp_256_mont_mul_8(r->y, p->y, t1, p256_mod, p256_mp_mod);
  69629. XMEMSET(r->y + 8, 0, sizeof(r->y) / 2U);
  69630. sp_256_mont_reduce_8(r->y, p256_mod, p256_mp_mod);
  69631. /* Reduce y to less than modulus */
  69632. n = sp_256_cmp_8(r->y, p256_mod);
  69633. sp_256_cond_sub_8(r->y, r->y, p256_mod, ~(n >> 31));
  69634. sp_256_norm_8(r->y);
  69635. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  69636. r->z[0] = 1;
  69637. }
  69638. /* Add two Montgomery form numbers (r = a + b % m).
  69639. *
  69640. * r Result of addition.
  69641. * a First number to add in Montgomery form.
  69642. * b Second number to add in Montgomery form.
  69643. * m Modulus (prime).
  69644. */
  69645. static void sp_256_mont_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p)
  69646. {
  69647. register sp_digit* r asm ("r0") = r_p;
  69648. register const sp_digit* a asm ("r1") = a_p;
  69649. register const sp_digit* b asm ("r2") = b_p;
  69650. __asm__ __volatile__ (
  69651. "mov r12, #0\n\t"
  69652. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  69653. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  69654. "adds r8, r8, r4\n\t"
  69655. "adcs r9, r9, r5\n\t"
  69656. "adcs r10, r10, r6\n\t"
  69657. "adcs r11, r11, r7\n\t"
  69658. "stm %[r], {r8, r9, r10, r11}\n\t"
  69659. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  69660. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  69661. "adcs r8, r8, r4\n\t"
  69662. "adcs r9, r9, r5\n\t"
  69663. "adcs r10, r10, r6\n\t"
  69664. "adcs r11, r11, r7\n\t"
  69665. "adc r3, r12, #0\n\t"
  69666. "sub r3, r12, r3\n\t"
  69667. "and r12, r3, #1\n\t"
  69668. "ldm %[r], {r4, r5, r6, r7}\n\t"
  69669. "subs r4, r4, r3\n\t"
  69670. "sbcs r5, r5, r3\n\t"
  69671. "sbcs r6, r6, r3\n\t"
  69672. "sbcs r7, r7, #0\n\t"
  69673. "sbcs r8, r8, #0\n\t"
  69674. "sbcs r9, r9, #0\n\t"
  69675. "sbcs r10, r10, r12\n\t"
  69676. "sbc r11, r11, r3\n\t"
  69677. "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  69678. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  69679. :
  69680. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  69681. );
  69682. (void)m_p;
  69683. }
  69684. /* Double a Montgomery form number (r = a + a % m).
  69685. *
  69686. * r Result of doubling.
  69687. * a Number to double in Montgomery form.
  69688. * m Modulus (prime).
  69689. */
  69690. static void sp_256_mont_dbl_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  69691. {
  69692. register sp_digit* r asm ("r0") = r_p;
  69693. register const sp_digit* a asm ("r1") = a_p;
  69694. __asm__ __volatile__ (
  69695. "mov r3, #0\n\t"
  69696. "ldm %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  69697. "adds r4, r4, r4\n\t"
  69698. "adcs r5, r5, r5\n\t"
  69699. "adcs r6, r6, r6\n\t"
  69700. "adcs r7, r7, r7\n\t"
  69701. "adcs r8, r8, r8\n\t"
  69702. "adcs r9, r9, r9\n\t"
  69703. "adcs r10, r10, r10\n\t"
  69704. "adcs r11, r11, r11\n\t"
  69705. "adc r2, r3, #0\n\t"
  69706. "sub r2, r3, r2\n\t"
  69707. "and r3, r2, #1\n\t"
  69708. "subs r4, r4, r2\n\t"
  69709. "sbcs r5, r5, r2\n\t"
  69710. "sbcs r6, r6, r2\n\t"
  69711. "sbcs r7, r7, #0\n\t"
  69712. "sbcs r8, r8, #0\n\t"
  69713. "sbcs r9, r9, #0\n\t"
  69714. "sbcs r10, r10, r3\n\t"
  69715. "sbc r11, r11, r2\n\t"
  69716. "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  69717. : [r] "+r" (r), [a] "+r" (a)
  69718. :
  69719. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3"
  69720. );
  69721. (void)m_p;
  69722. }
  69723. /* Triple a Montgomery form number (r = a + a + a % m).
  69724. *
  69725. * r Result of Tripling.
  69726. * a Number to triple in Montgomery form.
  69727. * m Modulus (prime).
  69728. */
  69729. static void sp_256_mont_tpl_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  69730. {
  69731. register sp_digit* r asm ("r0") = r_p;
  69732. register const sp_digit* a asm ("r1") = a_p;
  69733. __asm__ __volatile__ (
  69734. "mov r3, #0\n\t"
  69735. "ldm %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  69736. "adds r4, r4, r4\n\t"
  69737. "adcs r5, r5, r5\n\t"
  69738. "adcs r6, r6, r6\n\t"
  69739. "adcs r7, r7, r7\n\t"
  69740. "adcs r8, r8, r8\n\t"
  69741. "adcs r9, r9, r9\n\t"
  69742. "adcs r10, r10, r10\n\t"
  69743. "adcs r11, r11, r11\n\t"
  69744. "adc r2, r3, #0\n\t"
  69745. "sub r2, r3, r2\n\t"
  69746. "and r3, r2, #1\n\t"
  69747. "subs r4, r4, r2\n\t"
  69748. "sbcs r5, r5, r2\n\t"
  69749. "sbcs r6, r6, r2\n\t"
  69750. "sbcs r7, r7, #0\n\t"
  69751. "sbcs r8, r8, #0\n\t"
  69752. "sbcs r9, r9, #0\n\t"
  69753. "sbcs r10, r10, r3\n\t"
  69754. "sbc r11, r11, r2\n\t"
  69755. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  69756. "str r8, [%[r], #16]\n\t"
  69757. "str r9, [%[r], #20]\n\t"
  69758. #else
  69759. "strd r8, r9, [%[r], #16]\n\t"
  69760. #endif
  69761. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  69762. "str r10, [%[r], #24]\n\t"
  69763. "str r11, [%[r], #28]\n\t"
  69764. #else
  69765. "strd r10, r11, [%[r], #24]\n\t"
  69766. #endif
  69767. "mov r3, #0\n\t"
  69768. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  69769. "adds r8, r8, r4\n\t"
  69770. "adcs r9, r9, r5\n\t"
  69771. "adcs r10, r10, r6\n\t"
  69772. "adcs r11, r11, r7\n\t"
  69773. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  69774. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  69775. "ldm %[r], {r4, r5, r6, r7}\n\t"
  69776. "adcs r8, r8, r4\n\t"
  69777. "adcs r9, r9, r5\n\t"
  69778. "adcs r10, r10, r6\n\t"
  69779. "adcs r11, r11, r7\n\t"
  69780. "sub %[r], %[r], #16\n\t"
  69781. "adc r2, r3, #0\n\t"
  69782. "sub r2, r3, r2\n\t"
  69783. "and r3, r2, #1\n\t"
  69784. "ldm %[r], {r4, r5, r6, r7}\n\t"
  69785. "subs r4, r4, r2\n\t"
  69786. "sbcs r5, r5, r2\n\t"
  69787. "sbcs r6, r6, r2\n\t"
  69788. "sbcs r7, r7, #0\n\t"
  69789. "sbcs r8, r8, #0\n\t"
  69790. "sbcs r9, r9, #0\n\t"
  69791. "sbcs r10, r10, r3\n\t"
  69792. "sbc r11, r11, r2\n\t"
  69793. "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  69794. : [r] "+r" (r), [a] "+r" (a)
  69795. :
  69796. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3"
  69797. );
  69798. (void)m_p;
  69799. }
  69800. /* Subtract two Montgomery form numbers (r = a - b % m).
  69801. *
  69802. * r Result of subtration.
  69803. * a Number to subtract from in Montgomery form.
  69804. * b Number to subtract with in Montgomery form.
  69805. * m Modulus (prime).
  69806. */
  69807. static void sp_256_mont_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p)
  69808. {
  69809. register sp_digit* r asm ("r0") = r_p;
  69810. register const sp_digit* a asm ("r1") = a_p;
  69811. register const sp_digit* b asm ("r2") = b_p;
  69812. __asm__ __volatile__ (
  69813. "mov r12, #0\n\t"
  69814. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  69815. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  69816. "subs r8, r8, r4\n\t"
  69817. "sbcs r9, r9, r5\n\t"
  69818. "sbcs r10, r10, r6\n\t"
  69819. "sbcs r11, r11, r7\n\t"
  69820. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  69821. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  69822. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  69823. "sbcs r8, r8, r4\n\t"
  69824. "sbcs r9, r9, r5\n\t"
  69825. "sbcs r10, r10, r6\n\t"
  69826. "sbcs r11, r11, r7\n\t"
  69827. "sbc r3, r12, #0\n\t"
  69828. "sub %[r], %[r], #16\n\t"
  69829. "and r12, r3, #1\n\t"
  69830. "ldm %[r], {r4, r5, r6, r7}\n\t"
  69831. "adds r4, r4, r3\n\t"
  69832. "adcs r5, r5, r3\n\t"
  69833. "adcs r6, r6, r3\n\t"
  69834. "adcs r7, r7, #0\n\t"
  69835. "adcs r8, r8, #0\n\t"
  69836. "adcs r9, r9, #0\n\t"
  69837. "adcs r10, r10, r12\n\t"
  69838. "adc r11, r11, r3\n\t"
  69839. "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  69840. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  69841. :
  69842. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  69843. );
  69844. (void)m_p;
  69845. }
  69846. #define sp_256_mont_sub_lower_8 sp_256_mont_sub_8
  69847. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  69848. *
  69849. * r Result of division by 2.
  69850. * a Number to divide.
  69851. * m Modulus (prime).
  69852. */
  69853. static void sp_256_div2_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  69854. {
  69855. register sp_digit* r asm ("r0") = r_p;
  69856. register const sp_digit* a asm ("r1") = a_p;
  69857. register const sp_digit* m asm ("r2") = m_p;
  69858. __asm__ __volatile__ (
  69859. "mov r10, #0\n\t"
  69860. "ldm %[a], {r4, r5, r6, r7}\n\t"
  69861. "and r3, r4, #1\n\t"
  69862. "sub r8, r10, r3\n\t"
  69863. "and r9, r8, #1\n\t"
  69864. "adds r4, r4, r8\n\t"
  69865. "adcs r5, r5, r8\n\t"
  69866. "adcs r6, r6, r8\n\t"
  69867. "adcs r7, r7, r10\n\t"
  69868. "stm %[r], {r4, r5, r6, r7}\n\t"
  69869. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  69870. "ldr r4, [%[a], #16]\n\t"
  69871. "ldr r5, [%[a], #20]\n\t"
  69872. #else
  69873. "ldrd r4, r5, [%[a], #16]\n\t"
  69874. #endif
  69875. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  69876. "ldr r6, [%[a], #24]\n\t"
  69877. "ldr r7, [%[a], #28]\n\t"
  69878. #else
  69879. "ldrd r6, r7, [%[a], #24]\n\t"
  69880. #endif
  69881. "adcs r4, r4, r10\n\t"
  69882. "adcs r5, r5, r10\n\t"
  69883. "adcs r6, r6, r9\n\t"
  69884. "adcs r7, r7, r8\n\t"
  69885. "adc r3, r10, r10\n\t"
  69886. "lsr r8, r4, #1\n\t"
  69887. "lsr r9, r5, #1\n\t"
  69888. "lsr r10, r6, #1\n\t"
  69889. "lsr r11, r7, #1\n\t"
  69890. "orr r8, r8, r5, lsl #31\n\t"
  69891. "orr r9, r9, r6, lsl #31\n\t"
  69892. "orr r10, r10, r7, lsl #31\n\t"
  69893. "orr r11, r11, r3, lsl #31\n\t"
  69894. "mov r3, r4\n\t"
  69895. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  69896. "str r8, [%[r], #16]\n\t"
  69897. "str r9, [%[r], #20]\n\t"
  69898. #else
  69899. "strd r8, r9, [%[r], #16]\n\t"
  69900. #endif
  69901. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  69902. "str r10, [%[r], #24]\n\t"
  69903. "str r11, [%[r], #28]\n\t"
  69904. #else
  69905. "strd r10, r11, [%[r], #24]\n\t"
  69906. #endif
  69907. "ldm %[r], {r4, r5, r6, r7}\n\t"
  69908. "lsr r8, r4, #1\n\t"
  69909. "lsr r9, r5, #1\n\t"
  69910. "lsr r10, r6, #1\n\t"
  69911. "lsr r11, r7, #1\n\t"
  69912. "orr r8, r8, r5, lsl #31\n\t"
  69913. "orr r9, r9, r6, lsl #31\n\t"
  69914. "orr r10, r10, r7, lsl #31\n\t"
  69915. "orr r11, r11, r3, lsl #31\n\t"
  69916. "stm %[r], {r8, r9, r10, r11}\n\t"
  69917. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  69918. :
  69919. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3"
  69920. );
  69921. }
  69922. /* Double the Montgomery form projective point p.
  69923. *
  69924. * r Result of doubling point.
  69925. * p Point to double.
  69926. * t Temporary ordinate data.
  69927. */
  69928. #ifdef WOLFSSL_SP_NONBLOCK
  69929. typedef struct sp_256_proj_point_dbl_8_ctx {
  69930. int state;
  69931. sp_digit* t1;
  69932. sp_digit* t2;
  69933. sp_digit* x;
  69934. sp_digit* y;
  69935. sp_digit* z;
  69936. } sp_256_proj_point_dbl_8_ctx;
  69937. static int sp_256_proj_point_dbl_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, const sp_point_256* p, sp_digit* t)
  69938. {
  69939. int err = FP_WOULDBLOCK;
  69940. sp_256_proj_point_dbl_8_ctx* ctx = (sp_256_proj_point_dbl_8_ctx*)sp_ctx->data;
  69941. typedef char ctx_size_test[sizeof(sp_256_proj_point_dbl_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  69942. (void)sizeof(ctx_size_test);
  69943. switch (ctx->state) {
  69944. case 0:
  69945. ctx->t1 = t;
  69946. ctx->t2 = t + 2*8;
  69947. ctx->x = r->x;
  69948. ctx->y = r->y;
  69949. ctx->z = r->z;
  69950. /* Put infinity into result. */
  69951. if (r != p) {
  69952. r->infinity = p->infinity;
  69953. }
  69954. ctx->state = 1;
  69955. break;
  69956. case 1:
  69957. /* T1 = Z * Z */
  69958. sp_256_mont_sqr_8(ctx->t1, p->z, p256_mod, p256_mp_mod);
  69959. ctx->state = 2;
  69960. break;
  69961. case 2:
  69962. /* Z = Y * Z */
  69963. sp_256_mont_mul_8(ctx->z, p->y, p->z, p256_mod, p256_mp_mod);
  69964. ctx->state = 3;
  69965. break;
  69966. case 3:
  69967. /* Z = 2Z */
  69968. sp_256_mont_dbl_8(ctx->z, ctx->z, p256_mod);
  69969. ctx->state = 4;
  69970. break;
  69971. case 4:
  69972. /* T2 = X - T1 */
  69973. sp_256_mont_sub_8(ctx->t2, p->x, ctx->t1, p256_mod);
  69974. ctx->state = 5;
  69975. break;
  69976. case 5:
  69977. /* T1 = X + T1 */
  69978. sp_256_mont_add_8(ctx->t1, p->x, ctx->t1, p256_mod);
  69979. ctx->state = 6;
  69980. break;
  69981. case 6:
  69982. /* T2 = T1 * T2 */
  69983. sp_256_mont_mul_8(ctx->t2, ctx->t1, ctx->t2, p256_mod, p256_mp_mod);
  69984. ctx->state = 7;
  69985. break;
  69986. case 7:
  69987. /* T1 = 3T2 */
  69988. sp_256_mont_tpl_8(ctx->t1, ctx->t2, p256_mod);
  69989. ctx->state = 8;
  69990. break;
  69991. case 8:
  69992. /* Y = 2Y */
  69993. sp_256_mont_dbl_8(ctx->y, p->y, p256_mod);
  69994. ctx->state = 9;
  69995. break;
  69996. case 9:
  69997. /* Y = Y * Y */
  69998. sp_256_mont_sqr_8(ctx->y, ctx->y, p256_mod, p256_mp_mod);
  69999. ctx->state = 10;
  70000. break;
  70001. case 10:
  70002. /* T2 = Y * Y */
  70003. sp_256_mont_sqr_8(ctx->t2, ctx->y, p256_mod, p256_mp_mod);
  70004. ctx->state = 11;
  70005. break;
  70006. case 11:
  70007. /* T2 = T2/2 */
  70008. sp_256_div2_8(ctx->t2, ctx->t2, p256_mod);
  70009. ctx->state = 12;
  70010. break;
  70011. case 12:
  70012. /* Y = Y * X */
  70013. sp_256_mont_mul_8(ctx->y, ctx->y, p->x, p256_mod, p256_mp_mod);
  70014. ctx->state = 13;
  70015. break;
  70016. case 13:
  70017. /* X = T1 * T1 */
  70018. sp_256_mont_sqr_8(ctx->x, ctx->t1, p256_mod, p256_mp_mod);
  70019. ctx->state = 14;
  70020. break;
  70021. case 14:
  70022. /* X = X - Y */
  70023. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  70024. ctx->state = 15;
  70025. break;
  70026. case 15:
  70027. /* X = X - Y */
  70028. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  70029. ctx->state = 16;
  70030. break;
  70031. case 16:
  70032. /* Y = Y - X */
  70033. sp_256_mont_sub_lower_8(ctx->y, ctx->y, ctx->x, p256_mod);
  70034. ctx->state = 17;
  70035. break;
  70036. case 17:
  70037. /* Y = Y * T1 */
  70038. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t1, p256_mod, p256_mp_mod);
  70039. ctx->state = 18;
  70040. break;
  70041. case 18:
  70042. /* Y = Y - T2 */
  70043. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t2, p256_mod);
  70044. ctx->state = 19;
  70045. /* fall-through */
  70046. case 19:
  70047. err = MP_OKAY;
  70048. break;
  70049. }
  70050. if (err == MP_OKAY && ctx->state != 19) {
  70051. err = FP_WOULDBLOCK;
  70052. }
  70053. return err;
  70054. }
  70055. #endif /* WOLFSSL_SP_NONBLOCK */
  70056. static void sp_256_proj_point_dbl_8(sp_point_256* r, const sp_point_256* p,
  70057. sp_digit* t)
  70058. {
  70059. sp_digit* t1 = t;
  70060. sp_digit* t2 = t + 2*8;
  70061. sp_digit* x;
  70062. sp_digit* y;
  70063. sp_digit* z;
  70064. x = r->x;
  70065. y = r->y;
  70066. z = r->z;
  70067. /* Put infinity into result. */
  70068. if (r != p) {
  70069. r->infinity = p->infinity;
  70070. }
  70071. /* T1 = Z * Z */
  70072. sp_256_mont_sqr_8(t1, p->z, p256_mod, p256_mp_mod);
  70073. /* Z = Y * Z */
  70074. sp_256_mont_mul_8(z, p->y, p->z, p256_mod, p256_mp_mod);
  70075. /* Z = 2Z */
  70076. sp_256_mont_dbl_8(z, z, p256_mod);
  70077. /* T2 = X - T1 */
  70078. sp_256_mont_sub_8(t2, p->x, t1, p256_mod);
  70079. /* T1 = X + T1 */
  70080. sp_256_mont_add_8(t1, p->x, t1, p256_mod);
  70081. /* T2 = T1 * T2 */
  70082. sp_256_mont_mul_8(t2, t1, t2, p256_mod, p256_mp_mod);
  70083. /* T1 = 3T2 */
  70084. sp_256_mont_tpl_8(t1, t2, p256_mod);
  70085. /* Y = 2Y */
  70086. sp_256_mont_dbl_8(y, p->y, p256_mod);
  70087. /* Y = Y * Y */
  70088. sp_256_mont_sqr_8(y, y, p256_mod, p256_mp_mod);
  70089. /* T2 = Y * Y */
  70090. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  70091. /* T2 = T2/2 */
  70092. sp_256_div2_8(t2, t2, p256_mod);
  70093. /* Y = Y * X */
  70094. sp_256_mont_mul_8(y, y, p->x, p256_mod, p256_mp_mod);
  70095. /* X = T1 * T1 */
  70096. sp_256_mont_sqr_8(x, t1, p256_mod, p256_mp_mod);
  70097. /* X = X - Y */
  70098. sp_256_mont_sub_8(x, x, y, p256_mod);
  70099. /* X = X - Y */
  70100. sp_256_mont_sub_8(x, x, y, p256_mod);
  70101. /* Y = Y - X */
  70102. sp_256_mont_sub_lower_8(y, y, x, p256_mod);
  70103. /* Y = Y * T1 */
  70104. sp_256_mont_mul_8(y, y, t1, p256_mod, p256_mp_mod);
  70105. /* Y = Y - T2 */
  70106. sp_256_mont_sub_8(y, y, t2, p256_mod);
  70107. }
  70108. /* Compare two numbers to determine if they are equal.
  70109. * Constant time implementation.
  70110. *
  70111. * a First number to compare.
  70112. * b Second number to compare.
  70113. * returns 1 when equal and 0 otherwise.
  70114. */
  70115. static int sp_256_cmp_equal_8(const sp_digit* a, const sp_digit* b)
  70116. {
  70117. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  70118. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  70119. (a[6] ^ b[6]) | (a[7] ^ b[7])) == 0;
  70120. }
  70121. /* Returns 1 if the number of zero.
  70122. * Implementation is constant time.
  70123. *
  70124. * a Number to check.
  70125. * returns 1 if the number is zero and 0 otherwise.
  70126. */
  70127. static int sp_256_iszero_8(const sp_digit* a)
  70128. {
  70129. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7]) == 0;
  70130. }
  70131. /* Add two Montgomery form projective points.
  70132. *
  70133. * r Result of addition.
  70134. * p First point to add.
  70135. * q Second point to add.
  70136. * t Temporary ordinate data.
  70137. */
  70138. #ifdef WOLFSSL_SP_NONBLOCK
  70139. typedef struct sp_256_proj_point_add_8_ctx {
  70140. int state;
  70141. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  70142. const sp_point_256* ap[2];
  70143. sp_point_256* rp[2];
  70144. sp_digit* t1;
  70145. sp_digit* t2;
  70146. sp_digit* t3;
  70147. sp_digit* t4;
  70148. sp_digit* t5;
  70149. sp_digit* t6;
  70150. sp_digit* x;
  70151. sp_digit* y;
  70152. sp_digit* z;
  70153. } sp_256_proj_point_add_8_ctx;
  70154. static int sp_256_proj_point_add_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r,
  70155. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  70156. {
  70157. int err = FP_WOULDBLOCK;
  70158. sp_256_proj_point_add_8_ctx* ctx = (sp_256_proj_point_add_8_ctx*)sp_ctx->data;
  70159. /* Ensure only the first point is the same as the result. */
  70160. if (q == r) {
  70161. const sp_point_256* a = p;
  70162. p = q;
  70163. q = a;
  70164. }
  70165. typedef char ctx_size_test[sizeof(sp_256_proj_point_add_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  70166. (void)sizeof(ctx_size_test);
  70167. switch (ctx->state) {
  70168. case 0: /* INIT */
  70169. ctx->t1 = t;
  70170. ctx->t2 = t + 2*8;
  70171. ctx->t3 = t + 4*8;
  70172. ctx->t4 = t + 6*8;
  70173. ctx->t5 = t + 8*8;
  70174. ctx->t6 = t + 10*8;
  70175. ctx->x = ctx->t6;
  70176. ctx->y = ctx->t1;
  70177. ctx->z = ctx->t2;
  70178. ctx->state = 1;
  70179. break;
  70180. case 1:
  70181. /* Check double */
  70182. (void)sp_256_sub_8(ctx->t1, p256_mod, q->y);
  70183. sp_256_norm_8(ctx->t1);
  70184. if ((~p->infinity & ~q->infinity &
  70185. sp_256_cmp_equal_8(p->x, q->x) & sp_256_cmp_equal_8(p->z, q->z) &
  70186. (sp_256_cmp_equal_8(p->y, q->y) | sp_256_cmp_equal_8(p->y, ctx->t1))) != 0)
  70187. {
  70188. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  70189. ctx->state = 2;
  70190. }
  70191. else {
  70192. ctx->state = 3;
  70193. }
  70194. break;
  70195. case 2:
  70196. err = sp_256_proj_point_dbl_8_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  70197. if (err == MP_OKAY)
  70198. ctx->state = 27; /* done */
  70199. break;
  70200. case 3:
  70201. {
  70202. ctx->state = 4;
  70203. break;
  70204. }
  70205. case 4:
  70206. /* U1 = X1*Z2^2 */
  70207. sp_256_mont_sqr_8(ctx->t1, q->z, p256_mod, p256_mp_mod);
  70208. ctx->state = 5;
  70209. break;
  70210. case 5:
  70211. sp_256_mont_mul_8(ctx->t3, ctx->t1, q->z, p256_mod, p256_mp_mod);
  70212. ctx->state = 6;
  70213. break;
  70214. case 6:
  70215. sp_256_mont_mul_8(ctx->t1, ctx->t1, p->x, p256_mod, p256_mp_mod);
  70216. ctx->state = 7;
  70217. break;
  70218. case 7:
  70219. /* U2 = X2*Z1^2 */
  70220. sp_256_mont_sqr_8(ctx->t2, p->z, p256_mod, p256_mp_mod);
  70221. ctx->state = 8;
  70222. break;
  70223. case 8:
  70224. sp_256_mont_mul_8(ctx->t4, ctx->t2, p->z, p256_mod, p256_mp_mod);
  70225. ctx->state = 9;
  70226. break;
  70227. case 9:
  70228. sp_256_mont_mul_8(ctx->t2, ctx->t2, q->x, p256_mod, p256_mp_mod);
  70229. ctx->state = 10;
  70230. break;
  70231. case 10:
  70232. /* S1 = Y1*Z2^3 */
  70233. sp_256_mont_mul_8(ctx->t3, ctx->t3, p->y, p256_mod, p256_mp_mod);
  70234. ctx->state = 11;
  70235. break;
  70236. case 11:
  70237. /* S2 = Y2*Z1^3 */
  70238. sp_256_mont_mul_8(ctx->t4, ctx->t4, q->y, p256_mod, p256_mp_mod);
  70239. ctx->state = 12;
  70240. break;
  70241. case 12:
  70242. /* H = U2 - U1 */
  70243. sp_256_mont_sub_8(ctx->t2, ctx->t2, ctx->t1, p256_mod);
  70244. ctx->state = 13;
  70245. break;
  70246. case 13:
  70247. /* R = S2 - S1 */
  70248. sp_256_mont_sub_8(ctx->t4, ctx->t4, ctx->t3, p256_mod);
  70249. ctx->state = 14;
  70250. break;
  70251. case 14:
  70252. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  70253. sp_256_mont_sqr_8(ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  70254. ctx->state = 15;
  70255. break;
  70256. case 15:
  70257. sp_256_mont_mul_8(ctx->y, ctx->t1, ctx->t5, p256_mod, p256_mp_mod);
  70258. ctx->state = 16;
  70259. break;
  70260. case 16:
  70261. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  70262. ctx->state = 17;
  70263. break;
  70264. case 17:
  70265. /* Z3 = H*Z1*Z2 */
  70266. sp_256_mont_mul_8(ctx->z, p->z, ctx->t2, p256_mod, p256_mp_mod);
  70267. ctx->state = 18;
  70268. break;
  70269. case 18:
  70270. sp_256_mont_mul_8(ctx->z, ctx->z, q->z, p256_mod, p256_mp_mod);
  70271. ctx->state = 19;
  70272. break;
  70273. case 19:
  70274. sp_256_mont_sqr_8(ctx->x, ctx->t4, p256_mod, p256_mp_mod);
  70275. ctx->state = 20;
  70276. break;
  70277. case 20:
  70278. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t5, p256_mod);
  70279. ctx->state = 21;
  70280. break;
  70281. case 21:
  70282. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t3, p256_mod, p256_mp_mod);
  70283. ctx->state = 22;
  70284. break;
  70285. case 22:
  70286. sp_256_mont_dbl_8(ctx->t3, ctx->y, p256_mod);
  70287. ctx->state = 23;
  70288. break;
  70289. case 23:
  70290. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t3, p256_mod);
  70291. ctx->state = 24;
  70292. break;
  70293. case 24:
  70294. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  70295. sp_256_mont_sub_lower_8(ctx->y, ctx->y, ctx->x, p256_mod);
  70296. ctx->state = 25;
  70297. break;
  70298. case 25:
  70299. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t4, p256_mod, p256_mp_mod);
  70300. ctx->state = 26;
  70301. break;
  70302. case 26:
  70303. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t5, p256_mod);
  70304. ctx->state = 27;
  70305. /* fall-through */
  70306. case 27:
  70307. {
  70308. int i;
  70309. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  70310. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  70311. sp_digit maskt = ~(maskp | maskq);
  70312. for (i = 0; i < 8; i++) {
  70313. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  70314. (ctx->x[i] & maskt);
  70315. }
  70316. for (i = 0; i < 8; i++) {
  70317. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  70318. (ctx->y[i] & maskt);
  70319. }
  70320. for (i = 0; i < 8; i++) {
  70321. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  70322. (ctx->z[i] & maskt);
  70323. }
  70324. r->z[0] |= p->infinity & q->infinity;
  70325. r->infinity = p->infinity & q->infinity;
  70326. err = MP_OKAY;
  70327. break;
  70328. }
  70329. }
  70330. if (err == MP_OKAY && ctx->state != 27) {
  70331. err = FP_WOULDBLOCK;
  70332. }
  70333. return err;
  70334. }
  70335. #endif /* WOLFSSL_SP_NONBLOCK */
  70336. static void sp_256_proj_point_add_8(sp_point_256* r,
  70337. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  70338. {
  70339. sp_digit* t1 = t;
  70340. sp_digit* t2 = t + 2*8;
  70341. sp_digit* t3 = t + 4*8;
  70342. sp_digit* t4 = t + 6*8;
  70343. sp_digit* t5 = t + 8*8;
  70344. sp_digit* t6 = t + 10*8;
  70345. /* Check double */
  70346. (void)sp_256_sub_8(t1, p256_mod, q->y);
  70347. sp_256_norm_8(t1);
  70348. if ((~p->infinity & ~q->infinity &
  70349. sp_256_cmp_equal_8(p->x, q->x) & sp_256_cmp_equal_8(p->z, q->z) &
  70350. (sp_256_cmp_equal_8(p->y, q->y) | sp_256_cmp_equal_8(p->y, t1))) != 0) {
  70351. sp_256_proj_point_dbl_8(r, p, t);
  70352. }
  70353. else {
  70354. sp_digit maskp;
  70355. sp_digit maskq;
  70356. sp_digit maskt;
  70357. sp_digit* x = t6;
  70358. sp_digit* y = t1;
  70359. sp_digit* z = t2;
  70360. int i;
  70361. maskp = 0 - (q->infinity & (!p->infinity));
  70362. maskq = 0 - (p->infinity & (!q->infinity));
  70363. maskt = ~(maskp | maskq);
  70364. /* U1 = X1*Z2^2 */
  70365. sp_256_mont_sqr_8(t1, q->z, p256_mod, p256_mp_mod);
  70366. sp_256_mont_mul_8(t3, t1, q->z, p256_mod, p256_mp_mod);
  70367. sp_256_mont_mul_8(t1, t1, p->x, p256_mod, p256_mp_mod);
  70368. /* U2 = X2*Z1^2 */
  70369. sp_256_mont_sqr_8(t2, p->z, p256_mod, p256_mp_mod);
  70370. sp_256_mont_mul_8(t4, t2, p->z, p256_mod, p256_mp_mod);
  70371. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  70372. /* S1 = Y1*Z2^3 */
  70373. sp_256_mont_mul_8(t3, t3, p->y, p256_mod, p256_mp_mod);
  70374. /* S2 = Y2*Z1^3 */
  70375. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  70376. /* H = U2 - U1 */
  70377. sp_256_mont_sub_8(t2, t2, t1, p256_mod);
  70378. /* R = S2 - S1 */
  70379. sp_256_mont_sub_8(t4, t4, t3, p256_mod);
  70380. if (~p->infinity & ~q->infinity &
  70381. sp_256_iszero_8(t2) & sp_256_iszero_8(t4) & maskt) {
  70382. sp_256_proj_point_dbl_8(r, p, t);
  70383. }
  70384. else {
  70385. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  70386. sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod);
  70387. sp_256_mont_mul_8(y, t1, t5, p256_mod, p256_mp_mod);
  70388. sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod);
  70389. /* Z3 = H*Z1*Z2 */
  70390. sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod);
  70391. sp_256_mont_mul_8(z, z, q->z, p256_mod, p256_mp_mod);
  70392. sp_256_mont_sqr_8(x, t4, p256_mod, p256_mp_mod);
  70393. sp_256_mont_sub_8(x, x, t5, p256_mod);
  70394. sp_256_mont_mul_8(t5, t5, t3, p256_mod, p256_mp_mod);
  70395. sp_256_mont_dbl_8(t3, y, p256_mod);
  70396. sp_256_mont_sub_8(x, x, t3, p256_mod);
  70397. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  70398. sp_256_mont_sub_lower_8(y, y, x, p256_mod);
  70399. sp_256_mont_mul_8(y, y, t4, p256_mod, p256_mp_mod);
  70400. sp_256_mont_sub_8(y, y, t5, p256_mod);
  70401. for (i = 0; i < 8; i++) {
  70402. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  70403. (x[i] & maskt);
  70404. }
  70405. for (i = 0; i < 8; i++) {
  70406. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  70407. (y[i] & maskt);
  70408. }
  70409. for (i = 0; i < 8; i++) {
  70410. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  70411. (z[i] & maskt);
  70412. }
  70413. r->z[0] |= p->infinity & q->infinity;
  70414. r->infinity = p->infinity & q->infinity;
  70415. }
  70416. }
  70417. }
  70418. #ifndef WC_NO_CACHE_RESISTANT
  70419. /* Touch each possible point that could be being copied.
  70420. *
  70421. * r Point to copy into.
  70422. * table Table - start of the entires to access
  70423. * idx Index of entry to retrieve.
  70424. */
  70425. static void sp_256_get_point_16_8(sp_point_256* r, const sp_point_256* table,
  70426. int idx)
  70427. {
  70428. int i;
  70429. sp_digit mask;
  70430. r->x[0] = 0;
  70431. r->x[1] = 0;
  70432. r->x[2] = 0;
  70433. r->x[3] = 0;
  70434. r->x[4] = 0;
  70435. r->x[5] = 0;
  70436. r->x[6] = 0;
  70437. r->x[7] = 0;
  70438. r->y[0] = 0;
  70439. r->y[1] = 0;
  70440. r->y[2] = 0;
  70441. r->y[3] = 0;
  70442. r->y[4] = 0;
  70443. r->y[5] = 0;
  70444. r->y[6] = 0;
  70445. r->y[7] = 0;
  70446. r->z[0] = 0;
  70447. r->z[1] = 0;
  70448. r->z[2] = 0;
  70449. r->z[3] = 0;
  70450. r->z[4] = 0;
  70451. r->z[5] = 0;
  70452. r->z[6] = 0;
  70453. r->z[7] = 0;
  70454. for (i = 1; i < 16; i++) {
  70455. mask = 0 - (i == idx);
  70456. r->x[0] |= mask & table[i].x[0];
  70457. r->x[1] |= mask & table[i].x[1];
  70458. r->x[2] |= mask & table[i].x[2];
  70459. r->x[3] |= mask & table[i].x[3];
  70460. r->x[4] |= mask & table[i].x[4];
  70461. r->x[5] |= mask & table[i].x[5];
  70462. r->x[6] |= mask & table[i].x[6];
  70463. r->x[7] |= mask & table[i].x[7];
  70464. r->y[0] |= mask & table[i].y[0];
  70465. r->y[1] |= mask & table[i].y[1];
  70466. r->y[2] |= mask & table[i].y[2];
  70467. r->y[3] |= mask & table[i].y[3];
  70468. r->y[4] |= mask & table[i].y[4];
  70469. r->y[5] |= mask & table[i].y[5];
  70470. r->y[6] |= mask & table[i].y[6];
  70471. r->y[7] |= mask & table[i].y[7];
  70472. r->z[0] |= mask & table[i].z[0];
  70473. r->z[1] |= mask & table[i].z[1];
  70474. r->z[2] |= mask & table[i].z[2];
  70475. r->z[3] |= mask & table[i].z[3];
  70476. r->z[4] |= mask & table[i].z[4];
  70477. r->z[5] |= mask & table[i].z[5];
  70478. r->z[6] |= mask & table[i].z[6];
  70479. r->z[7] |= mask & table[i].z[7];
  70480. }
  70481. }
  70482. #endif /* !WC_NO_CACHE_RESISTANT */
  70483. /* Multiply the point by the scalar and return the result.
  70484. * If map is true then convert result to affine coordinates.
  70485. *
  70486. * Fast implementation that generates a pre-computation table.
  70487. * 4 bits of window (no sliding!).
  70488. * Uses add and double for calculating table.
  70489. * 256 doubles.
  70490. * 76 adds.
  70491. *
  70492. * r Resulting point.
  70493. * g Point to multiply.
  70494. * k Scalar to multiply by.
  70495. * map Indicates whether to convert result to affine.
  70496. * ct Constant time required.
  70497. * heap Heap to use for allocation.
  70498. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  70499. */
  70500. static int sp_256_ecc_mulmod_fast_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  70501. int map, int ct, void* heap)
  70502. {
  70503. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  70504. sp_point_256* t = NULL;
  70505. sp_digit* tmp = NULL;
  70506. #else
  70507. sp_point_256 t[16 + 1];
  70508. sp_digit tmp[2 * 8 * 6];
  70509. #endif
  70510. sp_point_256* rt = NULL;
  70511. #ifndef WC_NO_CACHE_RESISTANT
  70512. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  70513. sp_point_256* p = NULL;
  70514. #else
  70515. sp_point_256 p[1];
  70516. #endif
  70517. #endif /* !WC_NO_CACHE_RESISTANT */
  70518. sp_digit n;
  70519. int i;
  70520. int c;
  70521. int y;
  70522. int err = MP_OKAY;
  70523. /* Constant time used for cache attack resistance implementation. */
  70524. (void)ct;
  70525. (void)heap;
  70526. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  70527. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * (16 + 1),
  70528. heap, DYNAMIC_TYPE_ECC);
  70529. if (t == NULL)
  70530. err = MEMORY_E;
  70531. #ifndef WC_NO_CACHE_RESISTANT
  70532. if (err == MP_OKAY) {
  70533. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256),
  70534. heap, DYNAMIC_TYPE_ECC);
  70535. if (p == NULL)
  70536. err = MEMORY_E;
  70537. }
  70538. #endif
  70539. if (err == MP_OKAY) {
  70540. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  70541. DYNAMIC_TYPE_ECC);
  70542. if (tmp == NULL)
  70543. err = MEMORY_E;
  70544. }
  70545. #endif
  70546. if (err == MP_OKAY) {
  70547. rt = t + 16;
  70548. /* t[0] = {0, 0, 1} * norm */
  70549. XMEMSET(&t[0], 0, sizeof(t[0]));
  70550. t[0].infinity = 1;
  70551. /* t[1] = {g->x, g->y, g->z} * norm */
  70552. (void)sp_256_mod_mul_norm_8(t[1].x, g->x, p256_mod);
  70553. (void)sp_256_mod_mul_norm_8(t[1].y, g->y, p256_mod);
  70554. (void)sp_256_mod_mul_norm_8(t[1].z, g->z, p256_mod);
  70555. t[1].infinity = 0;
  70556. sp_256_proj_point_dbl_8(&t[ 2], &t[ 1], tmp);
  70557. t[ 2].infinity = 0;
  70558. sp_256_proj_point_add_8(&t[ 3], &t[ 2], &t[ 1], tmp);
  70559. t[ 3].infinity = 0;
  70560. sp_256_proj_point_dbl_8(&t[ 4], &t[ 2], tmp);
  70561. t[ 4].infinity = 0;
  70562. sp_256_proj_point_add_8(&t[ 5], &t[ 3], &t[ 2], tmp);
  70563. t[ 5].infinity = 0;
  70564. sp_256_proj_point_dbl_8(&t[ 6], &t[ 3], tmp);
  70565. t[ 6].infinity = 0;
  70566. sp_256_proj_point_add_8(&t[ 7], &t[ 4], &t[ 3], tmp);
  70567. t[ 7].infinity = 0;
  70568. sp_256_proj_point_dbl_8(&t[ 8], &t[ 4], tmp);
  70569. t[ 8].infinity = 0;
  70570. sp_256_proj_point_add_8(&t[ 9], &t[ 5], &t[ 4], tmp);
  70571. t[ 9].infinity = 0;
  70572. sp_256_proj_point_dbl_8(&t[10], &t[ 5], tmp);
  70573. t[10].infinity = 0;
  70574. sp_256_proj_point_add_8(&t[11], &t[ 6], &t[ 5], tmp);
  70575. t[11].infinity = 0;
  70576. sp_256_proj_point_dbl_8(&t[12], &t[ 6], tmp);
  70577. t[12].infinity = 0;
  70578. sp_256_proj_point_add_8(&t[13], &t[ 7], &t[ 6], tmp);
  70579. t[13].infinity = 0;
  70580. sp_256_proj_point_dbl_8(&t[14], &t[ 7], tmp);
  70581. t[14].infinity = 0;
  70582. sp_256_proj_point_add_8(&t[15], &t[ 8], &t[ 7], tmp);
  70583. t[15].infinity = 0;
  70584. i = 6;
  70585. n = k[i+1] << 0;
  70586. c = 28;
  70587. y = (int)(n >> 28);
  70588. #ifndef WC_NO_CACHE_RESISTANT
  70589. if (ct) {
  70590. sp_256_get_point_16_8(rt, t, y);
  70591. rt->infinity = !y;
  70592. }
  70593. else
  70594. #endif
  70595. {
  70596. XMEMCPY(rt, &t[y], sizeof(sp_point_256));
  70597. }
  70598. n <<= 4;
  70599. for (; i>=0 || c>=4; ) {
  70600. if (c < 4) {
  70601. n |= k[i--];
  70602. c += 32;
  70603. }
  70604. y = (n >> 28) & 0xf;
  70605. n <<= 4;
  70606. c -= 4;
  70607. sp_256_proj_point_dbl_8(rt, rt, tmp);
  70608. sp_256_proj_point_dbl_8(rt, rt, tmp);
  70609. sp_256_proj_point_dbl_8(rt, rt, tmp);
  70610. sp_256_proj_point_dbl_8(rt, rt, tmp);
  70611. #ifndef WC_NO_CACHE_RESISTANT
  70612. if (ct) {
  70613. sp_256_get_point_16_8(p, t, y);
  70614. p->infinity = !y;
  70615. sp_256_proj_point_add_8(rt, rt, p, tmp);
  70616. }
  70617. else
  70618. #endif
  70619. {
  70620. sp_256_proj_point_add_8(rt, rt, &t[y], tmp);
  70621. }
  70622. }
  70623. if (map != 0) {
  70624. sp_256_map_8(r, rt, tmp);
  70625. }
  70626. else {
  70627. XMEMCPY(r, rt, sizeof(sp_point_256));
  70628. }
  70629. }
  70630. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  70631. if (tmp != NULL)
  70632. #endif
  70633. {
  70634. ForceZero(tmp, sizeof(sp_digit) * 2 * 8 * 6);
  70635. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  70636. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  70637. #endif
  70638. }
  70639. #ifndef WC_NO_CACHE_RESISTANT
  70640. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  70641. if (p != NULL)
  70642. #endif
  70643. {
  70644. ForceZero(p, sizeof(sp_point_256));
  70645. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  70646. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  70647. #endif
  70648. }
  70649. #endif /* !WC_NO_CACHE_RESISTANT */
  70650. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  70651. if (t != NULL)
  70652. #endif
  70653. {
  70654. ForceZero(t, sizeof(sp_point_256) * 17);
  70655. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  70656. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  70657. #endif
  70658. }
  70659. return err;
  70660. }
  70661. #ifdef FP_ECC
  70662. #define sp_256_mont_dbl_lower_8 sp_256_mont_dbl_8
  70663. #define sp_256_mont_tpl_lower_8 sp_256_mont_tpl_8
  70664. /* Double the Montgomery form projective point p a number of times.
  70665. *
  70666. * r Result of repeated doubling of point.
  70667. * p Point to double.
  70668. * n Number of times to double
  70669. * t Temporary ordinate data.
  70670. */
  70671. static void sp_256_proj_point_dbl_n_8(sp_point_256* p, int i,
  70672. sp_digit* t)
  70673. {
  70674. sp_digit* w = t;
  70675. sp_digit* a = t + 2*8;
  70676. sp_digit* b = t + 4*8;
  70677. sp_digit* t1 = t + 6*8;
  70678. sp_digit* t2 = t + 8*8;
  70679. sp_digit* x;
  70680. sp_digit* y;
  70681. sp_digit* z;
  70682. volatile int n = i;
  70683. x = p->x;
  70684. y = p->y;
  70685. z = p->z;
  70686. /* Y = 2*Y */
  70687. sp_256_mont_dbl_8(y, y, p256_mod);
  70688. /* W = Z^4 */
  70689. sp_256_mont_sqr_8(w, z, p256_mod, p256_mp_mod);
  70690. sp_256_mont_sqr_8(w, w, p256_mod, p256_mp_mod);
  70691. #ifndef WOLFSSL_SP_SMALL
  70692. while (--n > 0)
  70693. #else
  70694. while (--n >= 0)
  70695. #endif
  70696. {
  70697. /* A = 3*(X^2 - W) */
  70698. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  70699. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  70700. sp_256_mont_tpl_lower_8(a, t1, p256_mod);
  70701. /* B = X*Y^2 */
  70702. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  70703. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  70704. /* X = A^2 - 2B */
  70705. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  70706. sp_256_mont_dbl_8(t2, b, p256_mod);
  70707. sp_256_mont_sub_8(x, x, t2, p256_mod);
  70708. /* b = 2.(B - X) */
  70709. sp_256_mont_sub_lower_8(t2, b, x, p256_mod);
  70710. sp_256_mont_dbl_lower_8(b, t2, p256_mod);
  70711. /* Z = Z*Y */
  70712. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  70713. /* t1 = Y^4 */
  70714. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  70715. #ifdef WOLFSSL_SP_SMALL
  70716. if (n != 0)
  70717. #endif
  70718. {
  70719. /* W = W*Y^4 */
  70720. sp_256_mont_mul_8(w, w, t1, p256_mod, p256_mp_mod);
  70721. }
  70722. /* y = 2*A*(B - X) - Y^4 */
  70723. sp_256_mont_mul_8(y, b, a, p256_mod, p256_mp_mod);
  70724. sp_256_mont_sub_8(y, y, t1, p256_mod);
  70725. }
  70726. #ifndef WOLFSSL_SP_SMALL
  70727. /* A = 3*(X^2 - W) */
  70728. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  70729. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  70730. sp_256_mont_tpl_lower_8(a, t1, p256_mod);
  70731. /* B = X*Y^2 */
  70732. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  70733. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  70734. /* X = A^2 - 2B */
  70735. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  70736. sp_256_mont_dbl_8(t2, b, p256_mod);
  70737. sp_256_mont_sub_8(x, x, t2, p256_mod);
  70738. /* b = 2.(B - X) */
  70739. sp_256_mont_sub_lower_8(t2, b, x, p256_mod);
  70740. sp_256_mont_dbl_lower_8(b, t2, p256_mod);
  70741. /* Z = Z*Y */
  70742. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  70743. /* t1 = Y^4 */
  70744. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  70745. /* y = 2*A*(B - X) - Y^4 */
  70746. sp_256_mont_mul_8(y, b, a, p256_mod, p256_mp_mod);
  70747. sp_256_mont_sub_8(y, y, t1, p256_mod);
  70748. #endif
  70749. /* Y = Y/2 */
  70750. sp_256_div2_8(y, y, p256_mod);
  70751. }
  70752. /* Convert the projective point to affine.
  70753. * Ordinates are in Montgomery form.
  70754. *
  70755. * a Point to convert.
  70756. * t Temporary data.
  70757. */
  70758. static void sp_256_proj_to_affine_8(sp_point_256* a, sp_digit* t)
  70759. {
  70760. sp_digit* t1 = t;
  70761. sp_digit* t2 = t + 2 * 8;
  70762. sp_digit* tmp = t + 4 * 8;
  70763. sp_256_mont_inv_8(t1, a->z, tmp);
  70764. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  70765. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  70766. sp_256_mont_mul_8(a->x, a->x, t2, p256_mod, p256_mp_mod);
  70767. sp_256_mont_mul_8(a->y, a->y, t1, p256_mod, p256_mp_mod);
  70768. XMEMCPY(a->z, p256_norm_mod, sizeof(p256_norm_mod));
  70769. }
  70770. #endif /* FP_ECC */
  70771. /* A table entry for pre-computed points. */
  70772. typedef struct sp_table_entry_256 {
  70773. sp_digit x[8];
  70774. sp_digit y[8];
  70775. } sp_table_entry_256;
  70776. #ifdef FP_ECC
  70777. #endif /* FP_ECC */
  70778. /* Add two Montgomery form projective points. The second point has a q value of
  70779. * one.
  70780. * Only the first point can be the same pointer as the result point.
  70781. *
  70782. * r Result of addition.
  70783. * p First point to add.
  70784. * q Second point to add.
  70785. * t Temporary ordinate data.
  70786. */
  70787. static void sp_256_proj_point_add_qz1_8(sp_point_256* r, const sp_point_256* p,
  70788. const sp_point_256* q, sp_digit* t)
  70789. {
  70790. sp_digit* t1 = t;
  70791. sp_digit* t2 = t + 2*8;
  70792. sp_digit* t3 = t + 4*8;
  70793. sp_digit* t4 = t + 6*8;
  70794. sp_digit* t5 = t + 8*8;
  70795. sp_digit* t6 = t + 10*8;
  70796. /* Check double */
  70797. (void)sp_256_sub_8(t1, p256_mod, q->y);
  70798. sp_256_norm_8(t1);
  70799. if ((~p->infinity & ~q->infinity &
  70800. sp_256_cmp_equal_8(p->x, q->x) & sp_256_cmp_equal_8(p->z, q->z) &
  70801. (sp_256_cmp_equal_8(p->y, q->y) | sp_256_cmp_equal_8(p->y, t1))) != 0) {
  70802. sp_256_proj_point_dbl_8(r, p, t);
  70803. }
  70804. else {
  70805. sp_digit maskp;
  70806. sp_digit maskq;
  70807. sp_digit maskt;
  70808. sp_digit* x = t2;
  70809. sp_digit* y = t5;
  70810. sp_digit* z = t6;
  70811. int i;
  70812. /* U2 = X2*Z1^2 */
  70813. sp_256_mont_sqr_8(t2, p->z, p256_mod, p256_mp_mod);
  70814. sp_256_mont_mul_8(t4, t2, p->z, p256_mod, p256_mp_mod);
  70815. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  70816. /* S2 = Y2*Z1^3 */
  70817. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  70818. /* H = U2 - X1 */
  70819. sp_256_mont_sub_8(t2, t2, p->x, p256_mod);
  70820. /* R = S2 - Y1 */
  70821. sp_256_mont_sub_8(t4, t4, p->y, p256_mod);
  70822. /* Z3 = H*Z1 */
  70823. sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod);
  70824. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  70825. sp_256_mont_sqr_8(t1, t4, p256_mod, p256_mp_mod);
  70826. sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod);
  70827. sp_256_mont_mul_8(t3, p->x, t5, p256_mod, p256_mp_mod);
  70828. sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod);
  70829. sp_256_mont_sub_8(x, t1, t5, p256_mod);
  70830. sp_256_mont_dbl_8(t1, t3, p256_mod);
  70831. sp_256_mont_sub_8(x, x, t1, p256_mod);
  70832. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  70833. sp_256_mont_sub_lower_8(t3, t3, x, p256_mod);
  70834. sp_256_mont_mul_8(t3, t3, t4, p256_mod, p256_mp_mod);
  70835. sp_256_mont_mul_8(t5, t5, p->y, p256_mod, p256_mp_mod);
  70836. sp_256_mont_sub_8(y, t3, t5, p256_mod);
  70837. maskp = 0 - (q->infinity & (!p->infinity));
  70838. maskq = 0 - (p->infinity & (!q->infinity));
  70839. maskt = ~(maskp | maskq);
  70840. for (i = 0; i < 8; i++) {
  70841. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt);
  70842. }
  70843. for (i = 0; i < 8; i++) {
  70844. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt);
  70845. }
  70846. for (i = 0; i < 8; i++) {
  70847. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt);
  70848. }
  70849. r->z[0] |= p->infinity & q->infinity;
  70850. r->infinity = p->infinity & q->infinity;
  70851. }
  70852. }
  70853. #ifdef WOLFSSL_SP_SMALL
  70854. #ifdef FP_ECC
  70855. /* Generate the pre-computed table of points for the base point.
  70856. *
  70857. * width = 4
  70858. * 16 entries
  70859. * 64 bits between
  70860. *
  70861. * a The base point.
  70862. * table Place to store generated point data.
  70863. * tmp Temporary data.
  70864. * heap Heap to use for allocation.
  70865. */
  70866. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  70867. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  70868. {
  70869. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  70870. sp_point_256* t = NULL;
  70871. #else
  70872. sp_point_256 t[3];
  70873. #endif
  70874. sp_point_256* s1 = NULL;
  70875. sp_point_256* s2 = NULL;
  70876. int i;
  70877. int j;
  70878. int err = MP_OKAY;
  70879. (void)heap;
  70880. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  70881. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  70882. DYNAMIC_TYPE_ECC);
  70883. if (t == NULL)
  70884. err = MEMORY_E;
  70885. #endif
  70886. if (err == MP_OKAY) {
  70887. s1 = t + 1;
  70888. s2 = t + 2;
  70889. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  70890. }
  70891. if (err == MP_OKAY) {
  70892. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  70893. }
  70894. if (err == MP_OKAY) {
  70895. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  70896. }
  70897. if (err == MP_OKAY) {
  70898. t->infinity = 0;
  70899. sp_256_proj_to_affine_8(t, tmp);
  70900. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  70901. s1->infinity = 0;
  70902. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  70903. s2->infinity = 0;
  70904. /* table[0] = {0, 0, infinity} */
  70905. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  70906. /* table[1] = Affine version of 'a' in Montgomery form */
  70907. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  70908. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  70909. for (i=1; i<4; i++) {
  70910. sp_256_proj_point_dbl_n_8(t, 64, tmp);
  70911. sp_256_proj_to_affine_8(t, tmp);
  70912. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  70913. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  70914. }
  70915. for (i=1; i<4; i++) {
  70916. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  70917. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  70918. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  70919. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  70920. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  70921. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  70922. sp_256_proj_to_affine_8(t, tmp);
  70923. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  70924. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  70925. }
  70926. }
  70927. }
  70928. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  70929. if (t != NULL)
  70930. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  70931. #endif
  70932. return err;
  70933. }
  70934. #endif /* FP_ECC */
  70935. #ifndef WC_NO_CACHE_RESISTANT
  70936. /* Touch each possible entry that could be being copied.
  70937. *
  70938. * r Point to copy into.
  70939. * table Table - start of the entires to access
  70940. * idx Index of entry to retrieve.
  70941. */
  70942. static void sp_256_get_entry_16_8(sp_point_256* r,
  70943. const sp_table_entry_256* table, int idx)
  70944. {
  70945. int i;
  70946. sp_digit mask;
  70947. r->x[0] = 0;
  70948. r->x[1] = 0;
  70949. r->x[2] = 0;
  70950. r->x[3] = 0;
  70951. r->x[4] = 0;
  70952. r->x[5] = 0;
  70953. r->x[6] = 0;
  70954. r->x[7] = 0;
  70955. r->y[0] = 0;
  70956. r->y[1] = 0;
  70957. r->y[2] = 0;
  70958. r->y[3] = 0;
  70959. r->y[4] = 0;
  70960. r->y[5] = 0;
  70961. r->y[6] = 0;
  70962. r->y[7] = 0;
  70963. for (i = 1; i < 16; i++) {
  70964. mask = 0 - (i == idx);
  70965. r->x[0] |= mask & table[i].x[0];
  70966. r->x[1] |= mask & table[i].x[1];
  70967. r->x[2] |= mask & table[i].x[2];
  70968. r->x[3] |= mask & table[i].x[3];
  70969. r->x[4] |= mask & table[i].x[4];
  70970. r->x[5] |= mask & table[i].x[5];
  70971. r->x[6] |= mask & table[i].x[6];
  70972. r->x[7] |= mask & table[i].x[7];
  70973. r->y[0] |= mask & table[i].y[0];
  70974. r->y[1] |= mask & table[i].y[1];
  70975. r->y[2] |= mask & table[i].y[2];
  70976. r->y[3] |= mask & table[i].y[3];
  70977. r->y[4] |= mask & table[i].y[4];
  70978. r->y[5] |= mask & table[i].y[5];
  70979. r->y[6] |= mask & table[i].y[6];
  70980. r->y[7] |= mask & table[i].y[7];
  70981. }
  70982. }
  70983. #endif /* !WC_NO_CACHE_RESISTANT */
  70984. /* Multiply the point by the scalar and return the result.
  70985. * If map is true then convert result to affine coordinates.
  70986. *
  70987. * Stripe implementation.
  70988. * Pre-generated: 2^0, 2^64, ...
  70989. * Pre-generated: products of all combinations of above.
  70990. * 4 doubles and adds (with qz=1)
  70991. *
  70992. * r Resulting point.
  70993. * k Scalar to multiply by.
  70994. * table Pre-computed table.
  70995. * map Indicates whether to convert result to affine.
  70996. * ct Constant time required.
  70997. * heap Heap to use for allocation.
  70998. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  70999. */
  71000. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  71001. const sp_table_entry_256* table, const sp_digit* k, int map,
  71002. int ct, void* heap)
  71003. {
  71004. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71005. sp_point_256* rt = NULL;
  71006. sp_digit* t = NULL;
  71007. #else
  71008. sp_point_256 rt[2];
  71009. sp_digit t[2 * 8 * 6];
  71010. #endif
  71011. sp_point_256* p = NULL;
  71012. int i;
  71013. int j;
  71014. int y;
  71015. int x;
  71016. int err = MP_OKAY;
  71017. (void)g;
  71018. /* Constant time used for cache attack resistance implementation. */
  71019. (void)ct;
  71020. (void)heap;
  71021. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71022. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  71023. DYNAMIC_TYPE_ECC);
  71024. if (rt == NULL)
  71025. err = MEMORY_E;
  71026. if (err == MP_OKAY) {
  71027. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  71028. DYNAMIC_TYPE_ECC);
  71029. if (t == NULL)
  71030. err = MEMORY_E;
  71031. }
  71032. #endif
  71033. if (err == MP_OKAY) {
  71034. p = rt + 1;
  71035. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  71036. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  71037. y = 0;
  71038. x = 63;
  71039. for (j=0; j<4; j++) {
  71040. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  71041. x += 64;
  71042. }
  71043. #ifndef WC_NO_CACHE_RESISTANT
  71044. if (ct) {
  71045. sp_256_get_entry_16_8(rt, table, y);
  71046. } else
  71047. #endif
  71048. {
  71049. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  71050. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  71051. }
  71052. rt->infinity = !y;
  71053. for (i=62; i>=0; i--) {
  71054. y = 0;
  71055. x = i;
  71056. for (j=0; j<4; j++) {
  71057. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  71058. x += 64;
  71059. }
  71060. sp_256_proj_point_dbl_8(rt, rt, t);
  71061. #ifndef WC_NO_CACHE_RESISTANT
  71062. if (ct) {
  71063. sp_256_get_entry_16_8(p, table, y);
  71064. }
  71065. else
  71066. #endif
  71067. {
  71068. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  71069. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  71070. }
  71071. p->infinity = !y;
  71072. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  71073. }
  71074. if (map != 0) {
  71075. sp_256_map_8(r, rt, t);
  71076. }
  71077. else {
  71078. XMEMCPY(r, rt, sizeof(sp_point_256));
  71079. }
  71080. }
  71081. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71082. if (t != NULL)
  71083. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  71084. if (rt != NULL)
  71085. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  71086. #endif
  71087. return err;
  71088. }
  71089. #ifdef FP_ECC
  71090. #ifndef FP_ENTRIES
  71091. #define FP_ENTRIES 16
  71092. #endif
  71093. /* Cache entry - holds precomputation tables for a point. */
  71094. typedef struct sp_cache_256_t {
  71095. /* X ordinate of point that table was generated from. */
  71096. sp_digit x[8];
  71097. /* Y ordinate of point that table was generated from. */
  71098. sp_digit y[8];
  71099. /* Precomputation table for point. */
  71100. sp_table_entry_256 table[16];
  71101. /* Count of entries in table. */
  71102. uint32_t cnt;
  71103. /* Point and table set in entry. */
  71104. int set;
  71105. } sp_cache_256_t;
  71106. /* Cache of tables. */
  71107. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  71108. /* Index of last entry in cache. */
  71109. static THREAD_LS_T int sp_cache_256_last = -1;
  71110. /* Cache has been initialized. */
  71111. static THREAD_LS_T int sp_cache_256_inited = 0;
  71112. #ifndef HAVE_THREAD_LS
  71113. static volatile int initCacheMutex_256 = 0;
  71114. static wolfSSL_Mutex sp_cache_256_lock;
  71115. #endif
  71116. /* Get the cache entry for the point.
  71117. *
  71118. * g [in] Point scalar multipling.
  71119. * cache [out] Cache table to use.
  71120. */
  71121. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  71122. {
  71123. int i;
  71124. int j;
  71125. uint32_t least;
  71126. if (sp_cache_256_inited == 0) {
  71127. for (i=0; i<FP_ENTRIES; i++) {
  71128. sp_cache_256[i].set = 0;
  71129. }
  71130. sp_cache_256_inited = 1;
  71131. }
  71132. /* Compare point with those in cache. */
  71133. for (i=0; i<FP_ENTRIES; i++) {
  71134. if (!sp_cache_256[i].set)
  71135. continue;
  71136. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  71137. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  71138. sp_cache_256[i].cnt++;
  71139. break;
  71140. }
  71141. }
  71142. /* No match. */
  71143. if (i == FP_ENTRIES) {
  71144. /* Find empty entry. */
  71145. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  71146. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  71147. if (!sp_cache_256[i].set) {
  71148. break;
  71149. }
  71150. }
  71151. /* Evict least used. */
  71152. if (i == sp_cache_256_last) {
  71153. least = sp_cache_256[0].cnt;
  71154. for (j=1; j<FP_ENTRIES; j++) {
  71155. if (sp_cache_256[j].cnt < least) {
  71156. i = j;
  71157. least = sp_cache_256[i].cnt;
  71158. }
  71159. }
  71160. }
  71161. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  71162. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  71163. sp_cache_256[i].set = 1;
  71164. sp_cache_256[i].cnt = 1;
  71165. }
  71166. *cache = &sp_cache_256[i];
  71167. sp_cache_256_last = i;
  71168. }
  71169. #endif /* FP_ECC */
  71170. /* Multiply the base point of P256 by the scalar and return the result.
  71171. * If map is true then convert result to affine coordinates.
  71172. *
  71173. * r Resulting point.
  71174. * g Point to multiply.
  71175. * k Scalar to multiply by.
  71176. * map Indicates whether to convert result to affine.
  71177. * ct Constant time required.
  71178. * heap Heap to use for allocation.
  71179. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  71180. */
  71181. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  71182. int map, int ct, void* heap)
  71183. {
  71184. #ifndef FP_ECC
  71185. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  71186. #else
  71187. sp_digit tmp[2 * 8 * 6];
  71188. sp_cache_256_t* cache;
  71189. int err = MP_OKAY;
  71190. #ifndef HAVE_THREAD_LS
  71191. if (initCacheMutex_256 == 0) {
  71192. wc_InitMutex(&sp_cache_256_lock);
  71193. initCacheMutex_256 = 1;
  71194. }
  71195. if (wc_LockMutex(&sp_cache_256_lock) != 0)
  71196. err = BAD_MUTEX_E;
  71197. #endif /* HAVE_THREAD_LS */
  71198. if (err == MP_OKAY) {
  71199. sp_ecc_get_cache_256(g, &cache);
  71200. if (cache->cnt == 2)
  71201. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  71202. #ifndef HAVE_THREAD_LS
  71203. wc_UnLockMutex(&sp_cache_256_lock);
  71204. #endif /* HAVE_THREAD_LS */
  71205. if (cache->cnt < 2) {
  71206. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  71207. }
  71208. else {
  71209. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  71210. map, ct, heap);
  71211. }
  71212. }
  71213. return err;
  71214. #endif
  71215. }
  71216. #else
  71217. #ifdef FP_ECC
  71218. /* Generate the pre-computed table of points for the base point.
  71219. *
  71220. * width = 8
  71221. * 256 entries
  71222. * 32 bits between
  71223. *
  71224. * a The base point.
  71225. * table Place to store generated point data.
  71226. * tmp Temporary data.
  71227. * heap Heap to use for allocation.
  71228. */
  71229. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  71230. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  71231. {
  71232. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71233. sp_point_256* t = NULL;
  71234. #else
  71235. sp_point_256 t[3];
  71236. #endif
  71237. sp_point_256* s1 = NULL;
  71238. sp_point_256* s2 = NULL;
  71239. int i;
  71240. int j;
  71241. int err = MP_OKAY;
  71242. (void)heap;
  71243. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71244. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  71245. DYNAMIC_TYPE_ECC);
  71246. if (t == NULL)
  71247. err = MEMORY_E;
  71248. #endif
  71249. if (err == MP_OKAY) {
  71250. s1 = t + 1;
  71251. s2 = t + 2;
  71252. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  71253. }
  71254. if (err == MP_OKAY) {
  71255. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  71256. }
  71257. if (err == MP_OKAY) {
  71258. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  71259. }
  71260. if (err == MP_OKAY) {
  71261. t->infinity = 0;
  71262. sp_256_proj_to_affine_8(t, tmp);
  71263. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  71264. s1->infinity = 0;
  71265. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  71266. s2->infinity = 0;
  71267. /* table[0] = {0, 0, infinity} */
  71268. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  71269. /* table[1] = Affine version of 'a' in Montgomery form */
  71270. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  71271. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  71272. for (i=1; i<8; i++) {
  71273. sp_256_proj_point_dbl_n_8(t, 32, tmp);
  71274. sp_256_proj_to_affine_8(t, tmp);
  71275. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  71276. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  71277. }
  71278. for (i=1; i<8; i++) {
  71279. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  71280. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  71281. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  71282. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  71283. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  71284. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  71285. sp_256_proj_to_affine_8(t, tmp);
  71286. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  71287. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  71288. }
  71289. }
  71290. }
  71291. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71292. if (t != NULL)
  71293. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  71294. #endif
  71295. return err;
  71296. }
  71297. #endif /* FP_ECC */
  71298. #ifndef WC_NO_CACHE_RESISTANT
  71299. /* Touch each possible entry that could be being copied.
  71300. *
  71301. * r Point to copy into.
  71302. * table Table - start of the entires to access
  71303. * idx Index of entry to retrieve.
  71304. */
  71305. static void sp_256_get_entry_256_8(sp_point_256* r,
  71306. const sp_table_entry_256* table, int idx)
  71307. {
  71308. int i;
  71309. sp_digit mask;
  71310. r->x[0] = 0;
  71311. r->x[1] = 0;
  71312. r->x[2] = 0;
  71313. r->x[3] = 0;
  71314. r->x[4] = 0;
  71315. r->x[5] = 0;
  71316. r->x[6] = 0;
  71317. r->x[7] = 0;
  71318. r->y[0] = 0;
  71319. r->y[1] = 0;
  71320. r->y[2] = 0;
  71321. r->y[3] = 0;
  71322. r->y[4] = 0;
  71323. r->y[5] = 0;
  71324. r->y[6] = 0;
  71325. r->y[7] = 0;
  71326. for (i = 1; i < 256; i++) {
  71327. mask = 0 - (i == idx);
  71328. r->x[0] |= mask & table[i].x[0];
  71329. r->x[1] |= mask & table[i].x[1];
  71330. r->x[2] |= mask & table[i].x[2];
  71331. r->x[3] |= mask & table[i].x[3];
  71332. r->x[4] |= mask & table[i].x[4];
  71333. r->x[5] |= mask & table[i].x[5];
  71334. r->x[6] |= mask & table[i].x[6];
  71335. r->x[7] |= mask & table[i].x[7];
  71336. r->y[0] |= mask & table[i].y[0];
  71337. r->y[1] |= mask & table[i].y[1];
  71338. r->y[2] |= mask & table[i].y[2];
  71339. r->y[3] |= mask & table[i].y[3];
  71340. r->y[4] |= mask & table[i].y[4];
  71341. r->y[5] |= mask & table[i].y[5];
  71342. r->y[6] |= mask & table[i].y[6];
  71343. r->y[7] |= mask & table[i].y[7];
  71344. }
  71345. }
  71346. #endif /* !WC_NO_CACHE_RESISTANT */
  71347. /* Multiply the point by the scalar and return the result.
  71348. * If map is true then convert result to affine coordinates.
  71349. *
  71350. * Stripe implementation.
  71351. * Pre-generated: 2^0, 2^32, ...
  71352. * Pre-generated: products of all combinations of above.
  71353. * 8 doubles and adds (with qz=1)
  71354. *
  71355. * r Resulting point.
  71356. * k Scalar to multiply by.
  71357. * table Pre-computed table.
  71358. * map Indicates whether to convert result to affine.
  71359. * ct Constant time required.
  71360. * heap Heap to use for allocation.
  71361. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  71362. */
  71363. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  71364. const sp_table_entry_256* table, const sp_digit* k, int map,
  71365. int ct, void* heap)
  71366. {
  71367. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71368. sp_point_256* rt = NULL;
  71369. sp_digit* t = NULL;
  71370. #else
  71371. sp_point_256 rt[2];
  71372. sp_digit t[2 * 8 * 6];
  71373. #endif
  71374. sp_point_256* p = NULL;
  71375. int i;
  71376. int j;
  71377. int y;
  71378. int x;
  71379. int err = MP_OKAY;
  71380. (void)g;
  71381. /* Constant time used for cache attack resistance implementation. */
  71382. (void)ct;
  71383. (void)heap;
  71384. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71385. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  71386. DYNAMIC_TYPE_ECC);
  71387. if (rt == NULL)
  71388. err = MEMORY_E;
  71389. if (err == MP_OKAY) {
  71390. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  71391. DYNAMIC_TYPE_ECC);
  71392. if (t == NULL)
  71393. err = MEMORY_E;
  71394. }
  71395. #endif
  71396. if (err == MP_OKAY) {
  71397. p = rt + 1;
  71398. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  71399. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  71400. y = 0;
  71401. x = 31;
  71402. for (j=0; j<8; j++) {
  71403. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  71404. x += 32;
  71405. }
  71406. #ifndef WC_NO_CACHE_RESISTANT
  71407. if (ct) {
  71408. sp_256_get_entry_256_8(rt, table, y);
  71409. } else
  71410. #endif
  71411. {
  71412. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  71413. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  71414. }
  71415. rt->infinity = !y;
  71416. for (i=30; i>=0; i--) {
  71417. y = 0;
  71418. x = i;
  71419. for (j=0; j<8; j++) {
  71420. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  71421. x += 32;
  71422. }
  71423. sp_256_proj_point_dbl_8(rt, rt, t);
  71424. #ifndef WC_NO_CACHE_RESISTANT
  71425. if (ct) {
  71426. sp_256_get_entry_256_8(p, table, y);
  71427. }
  71428. else
  71429. #endif
  71430. {
  71431. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  71432. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  71433. }
  71434. p->infinity = !y;
  71435. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  71436. }
  71437. if (map != 0) {
  71438. sp_256_map_8(r, rt, t);
  71439. }
  71440. else {
  71441. XMEMCPY(r, rt, sizeof(sp_point_256));
  71442. }
  71443. }
  71444. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71445. if (t != NULL)
  71446. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  71447. if (rt != NULL)
  71448. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  71449. #endif
  71450. return err;
  71451. }
  71452. #ifdef FP_ECC
  71453. #ifndef FP_ENTRIES
  71454. #define FP_ENTRIES 16
  71455. #endif
  71456. /* Cache entry - holds precomputation tables for a point. */
  71457. typedef struct sp_cache_256_t {
  71458. /* X ordinate of point that table was generated from. */
  71459. sp_digit x[8];
  71460. /* Y ordinate of point that table was generated from. */
  71461. sp_digit y[8];
  71462. /* Precomputation table for point. */
  71463. sp_table_entry_256 table[256];
  71464. /* Count of entries in table. */
  71465. uint32_t cnt;
  71466. /* Point and table set in entry. */
  71467. int set;
  71468. } sp_cache_256_t;
  71469. /* Cache of tables. */
  71470. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  71471. /* Index of last entry in cache. */
  71472. static THREAD_LS_T int sp_cache_256_last = -1;
  71473. /* Cache has been initialized. */
  71474. static THREAD_LS_T int sp_cache_256_inited = 0;
  71475. #ifndef HAVE_THREAD_LS
  71476. static volatile int initCacheMutex_256 = 0;
  71477. static wolfSSL_Mutex sp_cache_256_lock;
  71478. #endif
  71479. /* Get the cache entry for the point.
  71480. *
  71481. * g [in] Point scalar multipling.
  71482. * cache [out] Cache table to use.
  71483. */
  71484. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  71485. {
  71486. int i;
  71487. int j;
  71488. uint32_t least;
  71489. if (sp_cache_256_inited == 0) {
  71490. for (i=0; i<FP_ENTRIES; i++) {
  71491. sp_cache_256[i].set = 0;
  71492. }
  71493. sp_cache_256_inited = 1;
  71494. }
  71495. /* Compare point with those in cache. */
  71496. for (i=0; i<FP_ENTRIES; i++) {
  71497. if (!sp_cache_256[i].set)
  71498. continue;
  71499. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  71500. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  71501. sp_cache_256[i].cnt++;
  71502. break;
  71503. }
  71504. }
  71505. /* No match. */
  71506. if (i == FP_ENTRIES) {
  71507. /* Find empty entry. */
  71508. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  71509. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  71510. if (!sp_cache_256[i].set) {
  71511. break;
  71512. }
  71513. }
  71514. /* Evict least used. */
  71515. if (i == sp_cache_256_last) {
  71516. least = sp_cache_256[0].cnt;
  71517. for (j=1; j<FP_ENTRIES; j++) {
  71518. if (sp_cache_256[j].cnt < least) {
  71519. i = j;
  71520. least = sp_cache_256[i].cnt;
  71521. }
  71522. }
  71523. }
  71524. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  71525. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  71526. sp_cache_256[i].set = 1;
  71527. sp_cache_256[i].cnt = 1;
  71528. }
  71529. *cache = &sp_cache_256[i];
  71530. sp_cache_256_last = i;
  71531. }
  71532. #endif /* FP_ECC */
  71533. /* Multiply the base point of P256 by the scalar and return the result.
  71534. * If map is true then convert result to affine coordinates.
  71535. *
  71536. * r Resulting point.
  71537. * g Point to multiply.
  71538. * k Scalar to multiply by.
  71539. * map Indicates whether to convert result to affine.
  71540. * ct Constant time required.
  71541. * heap Heap to use for allocation.
  71542. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  71543. */
  71544. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  71545. int map, int ct, void* heap)
  71546. {
  71547. #ifndef FP_ECC
  71548. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  71549. #else
  71550. sp_digit tmp[2 * 8 * 6];
  71551. sp_cache_256_t* cache;
  71552. int err = MP_OKAY;
  71553. #ifndef HAVE_THREAD_LS
  71554. if (initCacheMutex_256 == 0) {
  71555. wc_InitMutex(&sp_cache_256_lock);
  71556. initCacheMutex_256 = 1;
  71557. }
  71558. if (wc_LockMutex(&sp_cache_256_lock) != 0)
  71559. err = BAD_MUTEX_E;
  71560. #endif /* HAVE_THREAD_LS */
  71561. if (err == MP_OKAY) {
  71562. sp_ecc_get_cache_256(g, &cache);
  71563. if (cache->cnt == 2)
  71564. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  71565. #ifndef HAVE_THREAD_LS
  71566. wc_UnLockMutex(&sp_cache_256_lock);
  71567. #endif /* HAVE_THREAD_LS */
  71568. if (cache->cnt < 2) {
  71569. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  71570. }
  71571. else {
  71572. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  71573. map, ct, heap);
  71574. }
  71575. }
  71576. return err;
  71577. #endif
  71578. }
  71579. #endif /* WOLFSSL_SP_SMALL */
  71580. /* Multiply the point by the scalar and return the result.
  71581. * If map is true then convert result to affine coordinates.
  71582. *
  71583. * km Scalar to multiply by.
  71584. * p Point to multiply.
  71585. * r Resulting point.
  71586. * map Indicates whether to convert result to affine.
  71587. * heap Heap to use for allocation.
  71588. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  71589. */
  71590. int sp_ecc_mulmod_256(const mp_int* km, const ecc_point* gm, ecc_point* r,
  71591. int map, void* heap)
  71592. {
  71593. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71594. sp_point_256* point = NULL;
  71595. sp_digit* k = NULL;
  71596. #else
  71597. sp_point_256 point[1];
  71598. sp_digit k[8];
  71599. #endif
  71600. int err = MP_OKAY;
  71601. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71602. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  71603. DYNAMIC_TYPE_ECC);
  71604. if (point == NULL)
  71605. err = MEMORY_E;
  71606. if (err == MP_OKAY) {
  71607. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  71608. DYNAMIC_TYPE_ECC);
  71609. if (k == NULL)
  71610. err = MEMORY_E;
  71611. }
  71612. #endif
  71613. if (err == MP_OKAY) {
  71614. sp_256_from_mp(k, 8, km);
  71615. sp_256_point_from_ecc_point_8(point, gm);
  71616. err = sp_256_ecc_mulmod_8(point, point, k, map, 1, heap);
  71617. }
  71618. if (err == MP_OKAY) {
  71619. err = sp_256_point_to_ecc_point_8(point, r);
  71620. }
  71621. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71622. if (k != NULL)
  71623. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  71624. if (point != NULL)
  71625. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  71626. #endif
  71627. return err;
  71628. }
  71629. /* Multiply the point by the scalar, add point a and return the result.
  71630. * If map is true then convert result to affine coordinates.
  71631. *
  71632. * km Scalar to multiply by.
  71633. * p Point to multiply.
  71634. * am Point to add to scalar mulitply result.
  71635. * inMont Point to add is in montgomery form.
  71636. * r Resulting point.
  71637. * map Indicates whether to convert result to affine.
  71638. * heap Heap to use for allocation.
  71639. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  71640. */
  71641. int sp_ecc_mulmod_add_256(const mp_int* km, const ecc_point* gm,
  71642. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  71643. {
  71644. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71645. sp_point_256* point = NULL;
  71646. sp_digit* k = NULL;
  71647. #else
  71648. sp_point_256 point[2];
  71649. sp_digit k[8 + 8 * 2 * 6];
  71650. #endif
  71651. sp_point_256* addP = NULL;
  71652. sp_digit* tmp = NULL;
  71653. int err = MP_OKAY;
  71654. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71655. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  71656. DYNAMIC_TYPE_ECC);
  71657. if (point == NULL)
  71658. err = MEMORY_E;
  71659. if (err == MP_OKAY) {
  71660. k = (sp_digit*)XMALLOC(
  71661. sizeof(sp_digit) * (8 + 8 * 2 * 6), heap,
  71662. DYNAMIC_TYPE_ECC);
  71663. if (k == NULL)
  71664. err = MEMORY_E;
  71665. }
  71666. #endif
  71667. if (err == MP_OKAY) {
  71668. addP = point + 1;
  71669. tmp = k + 8;
  71670. sp_256_from_mp(k, 8, km);
  71671. sp_256_point_from_ecc_point_8(point, gm);
  71672. sp_256_point_from_ecc_point_8(addP, am);
  71673. }
  71674. if ((err == MP_OKAY) && (!inMont)) {
  71675. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  71676. }
  71677. if ((err == MP_OKAY) && (!inMont)) {
  71678. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  71679. }
  71680. if ((err == MP_OKAY) && (!inMont)) {
  71681. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  71682. }
  71683. if (err == MP_OKAY) {
  71684. err = sp_256_ecc_mulmod_8(point, point, k, 0, 0, heap);
  71685. }
  71686. if (err == MP_OKAY) {
  71687. sp_256_proj_point_add_8(point, point, addP, tmp);
  71688. if (map) {
  71689. sp_256_map_8(point, point, tmp);
  71690. }
  71691. err = sp_256_point_to_ecc_point_8(point, r);
  71692. }
  71693. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  71694. if (k != NULL)
  71695. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  71696. if (point != NULL)
  71697. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  71698. #endif
  71699. return err;
  71700. }
  71701. #ifdef WOLFSSL_SP_SMALL
  71702. /* Striping precomputation table.
  71703. * 4 points combined into a table of 16 points.
  71704. * Distance of 64 between points.
  71705. */
  71706. static const sp_table_entry_256 p256_table[16] = {
  71707. /* 0 */
  71708. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  71709. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  71710. /* 1 */
  71711. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  71712. 0xa53755c6,0x18905f76 },
  71713. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  71714. 0x25885d85,0x8571ff18 } },
  71715. /* 2 */
  71716. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  71717. 0xfd1b667f,0x2f5e6961 },
  71718. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  71719. 0x8d6f0f7b,0xf648f916 } },
  71720. /* 3 */
  71721. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  71722. 0x133d0015,0x5abe0285 },
  71723. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  71724. 0x6b6f7383,0x94bb725b } },
  71725. /* 4 */
  71726. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  71727. 0x21d324f6,0x61d587d4 },
  71728. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  71729. 0x4621efbe,0xfa11fe12 } },
  71730. /* 5 */
  71731. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  71732. 0x1f13bedc,0x586eb04c },
  71733. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  71734. 0x70864f11,0x19d5ac08 } },
  71735. /* 6 */
  71736. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  71737. 0xc3b266b1,0xbb6de651 },
  71738. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  71739. 0x5d18b99b,0x60b4619a } },
  71740. /* 7 */
  71741. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  71742. 0xaeebffcd,0x9d0f27b2 },
  71743. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  71744. 0x356ec48d,0x244a566d } },
  71745. /* 8 */
  71746. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  71747. 0xcd42ab1b,0x803f3e02 },
  71748. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  71749. 0x5067adc1,0xc097440e } },
  71750. /* 9 */
  71751. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  71752. 0x915f1f30,0xf1af32d5 },
  71753. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  71754. 0xe2d41c8b,0x23d0f130 } },
  71755. /* 10 */
  71756. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  71757. 0x7990216a,0x50bbb4d9 },
  71758. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  71759. 0x01fe49c3,0x2b100118 } },
  71760. /* 11 */
  71761. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  71762. 0x83fbae0c,0xdd558999 },
  71763. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  71764. 0x149d6041,0xe6e4c551 } },
  71765. /* 12 */
  71766. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  71767. 0xdb7e63af,0xfad27148 },
  71768. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  71769. 0x9f0e1a84,0x77387de3 } },
  71770. /* 13 */
  71771. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  71772. 0xbef0c47e,0xb37b85c0 },
  71773. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  71774. 0xf9f628d5,0x9c135ac8 } },
  71775. /* 14 */
  71776. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  71777. 0x91ece900,0xc109f9cb },
  71778. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  71779. 0x2eee1ee1,0x9bc3344f } },
  71780. /* 15 */
  71781. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  71782. 0x5f1a4cc1,0x29591d52 },
  71783. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  71784. 0x18ef332c,0x6376551f } },
  71785. };
  71786. /* Multiply the base point of P256 by the scalar and return the result.
  71787. * If map is true then convert result to affine coordinates.
  71788. *
  71789. * Stripe implementation.
  71790. * Pre-generated: 2^0, 2^64, ...
  71791. * Pre-generated: products of all combinations of above.
  71792. * 4 doubles and adds (with qz=1)
  71793. *
  71794. * r Resulting point.
  71795. * k Scalar to multiply by.
  71796. * map Indicates whether to convert result to affine.
  71797. * ct Constant time required.
  71798. * heap Heap to use for allocation.
  71799. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  71800. */
  71801. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  71802. int map, int ct, void* heap)
  71803. {
  71804. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  71805. k, map, ct, heap);
  71806. }
  71807. #else
  71808. /* Striping precomputation table.
  71809. * 8 points combined into a table of 256 points.
  71810. * Distance of 32 between points.
  71811. */
  71812. static const sp_table_entry_256 p256_table[256] = {
  71813. /* 0 */
  71814. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  71815. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  71816. /* 1 */
  71817. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  71818. 0xa53755c6,0x18905f76 },
  71819. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  71820. 0x25885d85,0x8571ff18 } },
  71821. /* 2 */
  71822. { { 0x4147519a,0x20288602,0x26b372f0,0xd0981eac,0xa785ebc8,0xa9d4a7ca,
  71823. 0xdbdf58e9,0xd953c50d },
  71824. { 0xfd590f8f,0x9d6361cc,0x44e6c917,0x72e9626b,0x22eb64cf,0x7fd96110,
  71825. 0x9eb288f3,0x863ebb7e } },
  71826. /* 3 */
  71827. { { 0x5cdb6485,0x7856b623,0x2f0a2f97,0x808f0ea2,0x4f7e300b,0x3e68d954,
  71828. 0xb5ff80a0,0x00076055 },
  71829. { 0x838d2010,0x7634eb9b,0x3243708a,0x54014fbb,0x842a6606,0xe0e47d39,
  71830. 0x34373ee0,0x83087761 } },
  71831. /* 4 */
  71832. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  71833. 0xfd1b667f,0x2f5e6961 },
  71834. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  71835. 0x8d6f0f7b,0xf648f916 } },
  71836. /* 5 */
  71837. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  71838. 0x133d0015,0x5abe0285 },
  71839. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  71840. 0x6b6f7383,0x94bb725b } },
  71841. /* 6 */
  71842. { { 0x720f141c,0xbbf9b48f,0x2df5bc74,0x6199b3cd,0x411045c4,0xdc3f6129,
  71843. 0x2f7dc4ef,0xcdd6bbcb },
  71844. { 0xeaf436fd,0xcca6700b,0xb99326be,0x6f647f6d,0x014f2522,0x0c0fa792,
  71845. 0x4bdae5f6,0xa361bebd } },
  71846. /* 7 */
  71847. { { 0x597c13c7,0x28aa2558,0x50b7c3e1,0xc38d635f,0xf3c09d1d,0x07039aec,
  71848. 0xc4b5292c,0xba12ca09 },
  71849. { 0x59f91dfd,0x9e408fa4,0xceea07fb,0x3af43b66,0x9d780b29,0x1eceb089,
  71850. 0x701fef4b,0x53ebb99d } },
  71851. /* 8 */
  71852. { { 0xb0e63d34,0x4fe7ee31,0xa9e54fab,0xf4600572,0xd5e7b5a4,0xc0493334,
  71853. 0x06d54831,0x8589fb92 },
  71854. { 0x6583553a,0xaa70f5cc,0xe25649e5,0x0879094a,0x10044652,0xcc904507,
  71855. 0x02541c4f,0xebb0696d } },
  71856. /* 9 */
  71857. { { 0xac1647c5,0x4616ca15,0xc4cf5799,0xb8127d47,0x764dfbac,0xdc666aa3,
  71858. 0xd1b27da3,0xeb2820cb },
  71859. { 0x6a87e008,0x9406f8d8,0x922378f3,0xd87dfa9d,0x80ccecb2,0x56ed2e42,
  71860. 0x55a7da1d,0x1f28289b } },
  71861. /* 10 */
  71862. { { 0x3b89da99,0xabbaa0c0,0xb8284022,0xa6f2d79e,0xb81c05e8,0x27847862,
  71863. 0x05e54d63,0x337a4b59 },
  71864. { 0x21f7794a,0x3c67500d,0x7d6d7f61,0x207005b7,0x04cfd6e8,0x0a5a3781,
  71865. 0xf4c2fbd6,0x0d65e0d5 } },
  71866. /* 11 */
  71867. { { 0xb5275d38,0xd9d09bbe,0x0be0a358,0x4268a745,0x973eb265,0xf0762ff4,
  71868. 0x52f4a232,0xc23da242 },
  71869. { 0x0b94520c,0x5da1b84f,0xb05bd78e,0x09666763,0x94d29ea1,0x3a4dcb86,
  71870. 0xc790cff1,0x19de3b8c } },
  71871. /* 12 */
  71872. { { 0x26c5fe04,0x183a716c,0x3bba1bdb,0x3b28de0b,0xa4cb712c,0x7432c586,
  71873. 0x91fccbfd,0xe34dcbd4 },
  71874. { 0xaaa58403,0xb408d46b,0x82e97a53,0x9a697486,0x36aaa8af,0x9e390127,
  71875. 0x7b4e0f7f,0xe7641f44 } },
  71876. /* 13 */
  71877. { { 0xdf64ba59,0x7d753941,0x0b0242fc,0xd33f10ec,0xa1581859,0x4f06dfc6,
  71878. 0x052a57bf,0x4a12df57 },
  71879. { 0x9439dbd0,0xbfa6338f,0xbde53e1f,0xd3c24bd4,0x21f1b314,0xfd5e4ffa,
  71880. 0xbb5bea46,0x6af5aa93 } },
  71881. /* 14 */
  71882. { { 0x10c91999,0xda10b699,0x2a580491,0x0a24b440,0xb8cc2090,0x3e0094b4,
  71883. 0x66a44013,0x5fe3475a },
  71884. { 0xf93e7b4b,0xb0f8cabd,0x7c23f91a,0x292b501a,0xcd1e6263,0x42e889ae,
  71885. 0xecfea916,0xb544e308 } },
  71886. /* 15 */
  71887. { { 0x16ddfdce,0x6478c6e9,0xf89179e6,0x2c329166,0x4d4e67e1,0x4e8d6e76,
  71888. 0xa6b0c20b,0xe0b6b2bd },
  71889. { 0xbb7efb57,0x0d312df2,0x790c4007,0x1aac0dde,0x679bc944,0xf90336ad,
  71890. 0x25a63774,0x71c023de } },
  71891. /* 16 */
  71892. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  71893. 0x21d324f6,0x61d587d4 },
  71894. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  71895. 0x4621efbe,0xfa11fe12 } },
  71896. /* 17 */
  71897. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  71898. 0x1f13bedc,0x586eb04c },
  71899. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  71900. 0x70864f11,0x19d5ac08 } },
  71901. /* 18 */
  71902. { { 0x309a4e1f,0x1e99f581,0xe9270074,0xab7de71b,0xefd28d20,0x26a5ef0b,
  71903. 0x7f9c563f,0xe7c0073f },
  71904. { 0x0ef59f76,0x1f6d663a,0x20fcb050,0x669b3b54,0x7a6602d4,0xc08c1f7a,
  71905. 0xc65b3c0a,0xe08504fe } },
  71906. /* 19 */
  71907. { { 0xa031b3ca,0xf098f68d,0xe6da6d66,0x6d1cab9e,0x94f246e8,0x5bfd81fa,
  71908. 0x5b0996b4,0x78f01882 },
  71909. { 0x3a25787f,0xb7eefde4,0x1dccac9b,0x8016f80d,0xb35bfc36,0x0cea4877,
  71910. 0x7e94747a,0x43a773b8 } },
  71911. /* 20 */
  71912. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  71913. 0xc3b266b1,0xbb6de651 },
  71914. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  71915. 0x5d18b99b,0x60b4619a } },
  71916. /* 21 */
  71917. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  71918. 0xaeebffcd,0x9d0f27b2 },
  71919. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  71920. 0x356ec48d,0x244a566d } },
  71921. /* 22 */
  71922. { { 0xeacf1f96,0x6db0394a,0x024c271c,0x9f2122a9,0x82cbd3b9,0x2626ac1b,
  71923. 0x3581ef69,0x45e58c87 },
  71924. { 0xa38f9dbc,0xd3ff479d,0xe888a040,0xa8aaf146,0x46e0bed7,0x945adfb2,
  71925. 0xc1e4b7a4,0xc040e21c } },
  71926. /* 23 */
  71927. { { 0x6f8117b6,0x847af000,0x73a35433,0x651969ff,0x1d9475eb,0x482b3576,
  71928. 0x682c6ec7,0x1cdf5c97 },
  71929. { 0x11f04839,0x7db775b4,0x48de1698,0x7dbeacf4,0xb70b3219,0xb2921dd1,
  71930. 0xa92dff3d,0x046755f8 } },
  71931. /* 24 */
  71932. { { 0xbce8ffcd,0xcc8ac5d2,0x2fe61a82,0x0d53c48b,0x7202d6c7,0xf6f16172,
  71933. 0x3b83a5f3,0x046e5e11 },
  71934. { 0xd8007f01,0xe7b8ff64,0x5af43183,0x7fb1ef12,0x35e1a03c,0x045c5ea6,
  71935. 0x303d005b,0x6e0106c3 } },
  71936. /* 25 */
  71937. { { 0x88dd73b1,0x48c73584,0x995ed0d9,0x7670708f,0xc56a2ab7,0x38385ea8,
  71938. 0xe901cf1f,0x442594ed },
  71939. { 0x12d4b65b,0xf8faa2c9,0x96c90c37,0x94c2343b,0x5e978d1f,0xd326e4a1,
  71940. 0x4c2ee68e,0xa796fa51 } },
  71941. /* 26 */
  71942. { { 0x823addd7,0x359fb604,0xe56693b3,0x9e2a6183,0x3cbf3c80,0xf885b78e,
  71943. 0xc69766e9,0xe4ad2da9 },
  71944. { 0x8e048a61,0x357f7f42,0xc092d9a0,0x082d198c,0xc03ed8ef,0xfc3a1af4,
  71945. 0xc37b5143,0xc5e94046 } },
  71946. /* 27 */
  71947. { { 0x2be75f9e,0x476a538c,0xcb123a78,0x6fd1a9e8,0xb109c04b,0xd85e4df0,
  71948. 0xdb464747,0x63283daf },
  71949. { 0xbaf2df15,0xce728cf7,0x0ad9a7f4,0xe592c455,0xe834bcc3,0xfab226ad,
  71950. 0x1981a938,0x68bd19ab } },
  71951. /* 28 */
  71952. { { 0x1887d659,0xc08ead51,0xb359305a,0x3374d5f4,0xcfe74fe3,0x96986981,
  71953. 0x3c6fdfd6,0x495292f5 },
  71954. { 0x1acec896,0x4a878c9e,0xec5b4484,0xd964b210,0x664d60a7,0x6696f7e2,
  71955. 0x26036837,0x0ec7530d } },
  71956. /* 29 */
  71957. { { 0xad2687bb,0x2da13a05,0xf32e21fa,0xa1f83b6a,0x1dd4607b,0x390f5ef5,
  71958. 0x64863f0b,0x0f6207a6 },
  71959. { 0x0f138233,0xbd67e3bb,0x272aa718,0xdd66b96c,0x26ec88ae,0x8ed00407,
  71960. 0x08ed6dcf,0xff0db072 } },
  71961. /* 30 */
  71962. { { 0x4c95d553,0x749fa101,0x5d680a8a,0xa44052fd,0xff3b566f,0x183b4317,
  71963. 0x88740ea3,0x313b513c },
  71964. { 0x08d11549,0xb402e2ac,0xb4dee21c,0x071ee10b,0x47f2320e,0x26b987dd,
  71965. 0x86f19f81,0x2d3abcf9 } },
  71966. /* 31 */
  71967. { { 0x815581a2,0x4c288501,0x632211af,0x9a0a6d56,0x0cab2e99,0x19ba7a0f,
  71968. 0xded98cdf,0xc036fa10 },
  71969. { 0xc1fbd009,0x29ae08ba,0x06d15816,0x0b68b190,0x9b9e0d8f,0xc2eb3277,
  71970. 0xb6d40194,0xa6b2a2c4 } },
  71971. /* 32 */
  71972. { { 0x6d3549cf,0xd433e50f,0xfacd665e,0x6f33696f,0xce11fcb4,0x695bfdac,
  71973. 0xaf7c9860,0x810ee252 },
  71974. { 0x7159bb2c,0x65450fe1,0x758b357b,0xf7dfbebe,0xd69fea72,0x2b057e74,
  71975. 0x92731745,0xd485717a } },
  71976. /* 33 */
  71977. { { 0xf0cb5a98,0x11741a8a,0x1f3110bf,0xd3da8f93,0xab382adf,0x1994e2cb,
  71978. 0x2f9a604e,0x6a6045a7 },
  71979. { 0xa2b2411d,0x170c0d3f,0x510e96e0,0xbe0eb83e,0x8865b3cc,0x3bcc9f73,
  71980. 0xf9e15790,0xd3e45cfa } },
  71981. /* 34 */
  71982. { { 0xe83f7669,0xce1f69bb,0x72877d6b,0x09f8ae82,0x3244278d,0x9548ae54,
  71983. 0xe3c2c19c,0x207755de },
  71984. { 0x6fef1945,0x87bd61d9,0xb12d28c3,0x18813cef,0x72df64aa,0x9fbcd1d6,
  71985. 0x7154b00d,0x48dc5ee5 } },
  71986. /* 35 */
  71987. { { 0xf7e5a199,0x123790bf,0x989ccbb7,0xe0efb8cf,0x0a519c79,0xc27a2bfe,
  71988. 0xdff6f445,0xf2fb0aed },
  71989. { 0xf0b5025f,0x41c09575,0x40fa9f22,0x550543d7,0x380bfbd0,0x8fa3c8ad,
  71990. 0xdb28d525,0xa13e9015 } },
  71991. /* 36 */
  71992. { { 0xa2b65cbc,0xf9f7a350,0x2a464226,0x0b04b972,0xe23f07a1,0x265ce241,
  71993. 0x1497526f,0x2bf0d6b0 },
  71994. { 0x4b216fb7,0xd3d4dd3f,0xfbdda26a,0xf7d7b867,0x6708505c,0xaeb7b83f,
  71995. 0x162fe89f,0x42a94a5a } },
  71996. /* 37 */
  71997. { { 0xeaadf191,0x5846ad0b,0x25a268d7,0x0f8a4890,0x494dc1f6,0xe8603050,
  71998. 0xc65ede3d,0x2c2dd969 },
  71999. { 0x93849c17,0x6d02171d,0x1da250dd,0x460488ba,0x3c3a5485,0x4810c706,
  72000. 0x42c56dbc,0xf437fa1f } },
  72001. /* 38 */
  72002. { { 0x4a0f7dab,0x6aa0d714,0x1776e9ac,0x0f049793,0xf5f39786,0x52c0a050,
  72003. 0x54707aa8,0xaaf45b33 },
  72004. { 0xc18d364a,0x85e37c33,0x3e497165,0xd40b9b06,0x15ec5444,0xf4171681,
  72005. 0xf4f272bc,0xcdf6310d } },
  72006. /* 39 */
  72007. { { 0x8ea8b7ef,0x7473c623,0x85bc2287,0x08e93518,0x2bda8e34,0x41956772,
  72008. 0xda9e2ff2,0xf0d008ba },
  72009. { 0x2414d3b1,0x2912671d,0xb019ea76,0xb3754985,0x453bcbdb,0x5c61b96d,
  72010. 0xca887b8b,0x5bd5c2f5 } },
  72011. /* 40 */
  72012. { { 0xf49a3154,0xef0f469e,0x6e2b2e9a,0x3e85a595,0xaa924a9c,0x45aaec1e,
  72013. 0xa09e4719,0xaa12dfc8 },
  72014. { 0x4df69f1d,0x26f27227,0xa2ff5e73,0xe0e4c82c,0xb7a9dd44,0xb9d8ce73,
  72015. 0xe48ca901,0x6c036e73 } },
  72016. /* 41 */
  72017. { { 0x0f6e3138,0x5cfae12a,0x25ad345a,0x6966ef00,0x45672bc5,0x8993c64b,
  72018. 0x96afbe24,0x292ff658 },
  72019. { 0x5e213402,0xd5250d44,0x4392c9fe,0xf6580e27,0xda1c72e8,0x097b397f,
  72020. 0x311b7276,0x644e0c90 } },
  72021. /* 42 */
  72022. { { 0xa47153f0,0xe1e421e1,0x920418c9,0xb86c3b79,0x705d7672,0x93bdce87,
  72023. 0xcab79a77,0xf25ae793 },
  72024. { 0x6d869d0c,0x1f3194a3,0x4986c264,0x9d55c882,0x096e945e,0x49fb5ea3,
  72025. 0x13db0a3e,0x39b8e653 } },
  72026. /* 43 */
  72027. { { 0xb6fd2e59,0x37754200,0x9255c98f,0x35e2c066,0x0e2a5739,0xd9dab21a,
  72028. 0x0f19db06,0x39122f2f },
  72029. { 0x03cad53c,0xcfbce1e0,0xe65c17e3,0x225b2c0f,0x9aa13877,0x72baf1d2,
  72030. 0xce80ff8d,0x8de80af8 } },
  72031. /* 44 */
  72032. { { 0x207bbb76,0xafbea8d9,0x21782758,0x921c7e7c,0x1c0436b1,0xdfa2b74b,
  72033. 0x2e368c04,0x87194906 },
  72034. { 0xa3993df5,0xb5f928bb,0xf3b3d26a,0x639d75b5,0x85b55050,0x011aa78a,
  72035. 0x5b74fde1,0xfc315e6a } },
  72036. /* 45 */
  72037. { { 0xe8d6ecfa,0x561fd41a,0x1aec7f86,0x5f8c44f6,0x4924741d,0x98452a7b,
  72038. 0xee389088,0xe6d4a7ad },
  72039. { 0x4593c75d,0x60552ed1,0xdd271162,0x70a70da4,0x7ba2c7db,0xd2aede93,
  72040. 0x9be2ae57,0x35dfaf9a } },
  72041. /* 46 */
  72042. { { 0xaa736636,0x6b956fcd,0xae2cab7e,0x09f51d97,0x0f349966,0xfb10bf41,
  72043. 0x1c830d2b,0x1da5c7d7 },
  72044. { 0x3cce6825,0x5c41e483,0xf9573c3b,0x15ad118f,0xf23036b8,0xa28552c7,
  72045. 0xdbf4b9d6,0x7077c0fd } },
  72046. /* 47 */
  72047. { { 0x46b9661c,0xbf63ff8d,0x0d2cfd71,0xa1dfd36b,0xa847f8f7,0x0373e140,
  72048. 0xe50efe44,0x53a8632e },
  72049. { 0x696d8051,0x0976ff68,0xc74f468a,0xdaec0c95,0x5e4e26bd,0x62994dc3,
  72050. 0x34e1fcc1,0x028ca76d } },
  72051. /* 48 */
  72052. { { 0xfc9877ee,0xd11d47dc,0x801d0002,0xc8b36210,0x54c260b6,0xd002c117,
  72053. 0x6962f046,0x04c17cd8 },
  72054. { 0xb0daddf5,0x6d9bd094,0x24ce55c0,0xbea23575,0x72da03b5,0x663356e6,
  72055. 0xfed97474,0xf7ba4de9 } },
  72056. /* 49 */
  72057. { { 0xebe1263f,0xd0dbfa34,0x71ae7ce6,0x55763735,0x82a6f523,0xd2440553,
  72058. 0x52131c41,0xe31f9600 },
  72059. { 0xea6b6ec6,0xd1bb9216,0x73c2fc44,0x37a1d12e,0x89d0a294,0xc10e7eac,
  72060. 0xce34d47b,0xaa3a6259 } },
  72061. /* 50 */
  72062. { { 0x36f3dcd3,0xfbcf9df5,0xd2bf7360,0x6ceded50,0xdf504f5b,0x491710fa,
  72063. 0x7e79daee,0x2398dd62 },
  72064. { 0x6d09569e,0xcf4705a3,0x5149f769,0xea0619bb,0x35f6034c,0xff9c0377,
  72065. 0x1c046210,0x5717f5b2 } },
  72066. /* 51 */
  72067. { { 0x21dd895e,0x9fe229c9,0x40c28451,0x8e518500,0x1d637ecd,0xfa13d239,
  72068. 0x0e3c28de,0x660a2c56 },
  72069. { 0xd67fcbd0,0x9cca88ae,0x0ea9f096,0xc8472478,0x72e92b4d,0x32b2f481,
  72070. 0x4f522453,0x624ee54c } },
  72071. /* 52 */
  72072. { { 0xd897eccc,0x09549ce4,0x3f9880aa,0x4d49d1d9,0x043a7c20,0x723c2423,
  72073. 0x92bdfbc0,0x4f392afb },
  72074. { 0x7de44fd9,0x6969f8fa,0x57b32156,0xb66cfbe4,0x368ebc3c,0xdb2fa803,
  72075. 0xccdb399c,0x8a3e7977 } },
  72076. /* 53 */
  72077. { { 0x06c4b125,0xdde1881f,0xf6e3ca8c,0xae34e300,0x5c7a13e9,0xef6999de,
  72078. 0x70c24404,0x3888d023 },
  72079. { 0x44f91081,0x76280356,0x5f015504,0x3d9fcf61,0x632cd36e,0x1827edc8,
  72080. 0x18102336,0xa5e62e47 } },
  72081. /* 54 */
  72082. { { 0x2facd6c8,0x1a825ee3,0x54bcbc66,0x699c6354,0x98df9931,0x0ce3edf7,
  72083. 0x466a5adc,0x2c4768e6 },
  72084. { 0x90a64bc9,0xb346ff8c,0xe4779f5c,0x630a6020,0xbc05e884,0xd949d064,
  72085. 0xf9e652a0,0x7b5e6441 } },
  72086. /* 55 */
  72087. { { 0x1d28444a,0x2169422c,0xbe136a39,0xe996c5d8,0xfb0c7fce,0x2387afe5,
  72088. 0x0c8d744a,0xb8af73cb },
  72089. { 0x338b86fd,0x5fde83aa,0xa58a5cff,0xfee3f158,0x20ac9433,0xc9ee8f6f,
  72090. 0x7f3f0895,0xa036395f } },
  72091. /* 56 */
  72092. { { 0xa10f7770,0x8c73c6bb,0xa12a0e24,0xa6f16d81,0x51bc2b9f,0x100df682,
  72093. 0x875fb533,0x4be36b01 },
  72094. { 0x9fb56dbb,0x9226086e,0x07e7a4f8,0x306fef8b,0x66d52f20,0xeeaccc05,
  72095. 0x1bdc00c0,0x8cbc9a87 } },
  72096. /* 57 */
  72097. { { 0xc0dac4ab,0xe131895c,0x712ff112,0xa874a440,0x6a1cee57,0x6332ae7c,
  72098. 0x0c0835f8,0x44e7553e },
  72099. { 0x7734002d,0x6d503fff,0x0b34425c,0x9d35cb8b,0x0e8738b5,0x95f70276,
  72100. 0x5eb8fc18,0x470a683a } },
  72101. /* 58 */
  72102. { { 0x90513482,0x81b761dc,0x01e9276a,0x0287202a,0x0ce73083,0xcda441ee,
  72103. 0xc63dc6ef,0x16410690 },
  72104. { 0x6d06a2ed,0xf5034a06,0x189b100b,0xdd4d7745,0xab8218c9,0xd914ae72,
  72105. 0x7abcbb4f,0xd73479fd } },
  72106. /* 59 */
  72107. { { 0x5ad4c6e5,0x7edefb16,0x5b06d04d,0x262cf08f,0x8575cb14,0x12ed5bb1,
  72108. 0x0771666b,0x816469e3 },
  72109. { 0x561e291e,0xd7ab9d79,0xc1de1661,0xeb9daf22,0x135e0513,0xf49827eb,
  72110. 0xf0dd3f9c,0x0a36dd23 } },
  72111. /* 60 */
  72112. { { 0x41d5533c,0x098d32c7,0x8684628f,0x7c5f5a9e,0xe349bd11,0x39a228ad,
  72113. 0xfdbab118,0xe331dfd6 },
  72114. { 0x6bcc6ed8,0x5100ab68,0xef7a260e,0x7160c3bd,0xbce850d7,0x9063d9a7,
  72115. 0x492e3389,0xd3b4782a } },
  72116. /* 61 */
  72117. { { 0xf3821f90,0xa149b6e8,0x66eb7aad,0x92edd9ed,0x1a013116,0x0bb66953,
  72118. 0x4c86a5bd,0x7281275a },
  72119. { 0xd3ff47e5,0x503858f7,0x61016441,0x5e1616bc,0x7dfd9bb1,0x62b0f11a,
  72120. 0xce145059,0x2c062e7e } },
  72121. /* 62 */
  72122. { { 0x0159ac2e,0xa76f996f,0xcbdb2713,0x281e7736,0x08e46047,0x2ad6d288,
  72123. 0x2c4e7ef1,0x282a35f9 },
  72124. { 0xc0ce5cd2,0x9c354b1e,0x1379c229,0xcf99efc9,0x3e82c11e,0x992caf38,
  72125. 0x554d2abd,0xc71cd513 } },
  72126. /* 63 */
  72127. { { 0x09b578f4,0x4885de9c,0xe3affa7a,0x1884e258,0x59182f1f,0x8f76b1b7,
  72128. 0xcf47f3a3,0xc50f6740 },
  72129. { 0x374b68ea,0xa9c4adf3,0x69965fe2,0xa406f323,0x85a53050,0x2f86a222,
  72130. 0x212958dc,0xb9ecb3a7 } },
  72131. /* 64 */
  72132. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  72133. 0xcd42ab1b,0x803f3e02 },
  72134. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  72135. 0x5067adc1,0xc097440e } },
  72136. /* 65 */
  72137. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  72138. 0x915f1f30,0xf1af32d5 },
  72139. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  72140. 0xe2d41c8b,0x23d0f130 } },
  72141. /* 66 */
  72142. { { 0xf41500d9,0x857ab6ed,0xfcbeada8,0x0d890ae5,0x89725951,0x52fe8648,
  72143. 0xc0a3fadd,0xb0288dd6 },
  72144. { 0x650bcb08,0x85320f30,0x695d6e16,0x71af6313,0xb989aa76,0x31f520a7,
  72145. 0xf408c8d2,0xffd3724f } },
  72146. /* 67 */
  72147. { { 0xb458e6cb,0x53968e64,0x317a5d28,0x992dad20,0x7aa75f56,0x3814ae0b,
  72148. 0xd78c26df,0xf5590f4a },
  72149. { 0xcf0ba55a,0x0fc24bd3,0x0c778bae,0x0fc4724a,0x683b674a,0x1ce9864f,
  72150. 0xf6f74a20,0x18d6da54 } },
  72151. /* 68 */
  72152. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  72153. 0x7990216a,0x50bbb4d9 },
  72154. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  72155. 0x01fe49c3,0x2b100118 } },
  72156. /* 69 */
  72157. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  72158. 0x83fbae0c,0xdd558999 },
  72159. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  72160. 0x149d6041,0xe6e4c551 } },
  72161. /* 70 */
  72162. { { 0x1e9af288,0x55f655bb,0xf7ada931,0x647e1a64,0xcb2820e5,0x43697e4b,
  72163. 0x07ed56ff,0x51e00db1 },
  72164. { 0x771c327e,0x43d169b8,0x4a96c2ad,0x29cdb20b,0x3deb4779,0xc07d51f5,
  72165. 0x49829177,0xe22f4241 } },
  72166. /* 71 */
  72167. { { 0x635f1abb,0xcd45e8f4,0x68538874,0x7edc0cb5,0xb5a8034d,0xc9472c1f,
  72168. 0x52dc48c9,0xf709373d },
  72169. { 0xa8af30d6,0x401966bb,0xf137b69c,0x95bf5f4a,0x9361c47e,0x3966162a,
  72170. 0xe7275b11,0xbd52d288 } },
  72171. /* 72 */
  72172. { { 0x9c5fa877,0xab155c7a,0x7d3a3d48,0x17dad672,0x73d189d8,0x43f43f9e,
  72173. 0xc8aa77a6,0xa0d0f8e4 },
  72174. { 0xcc94f92d,0x0bbeafd8,0x0c4ddb3a,0xd818c8be,0xb82eba14,0x22cc65f8,
  72175. 0x946d6a00,0xa56c78c7 } },
  72176. /* 73 */
  72177. { { 0x0dd09529,0x2962391b,0x3daddfcf,0x803e0ea6,0x5b5bf481,0x2c77351f,
  72178. 0x731a367a,0xd8befdf8 },
  72179. { 0xfc0157f4,0xab919d42,0xfec8e650,0xf51caed7,0x02d48b0a,0xcdf9cb40,
  72180. 0xce9f6478,0x854a68a5 } },
  72181. /* 74 */
  72182. { { 0x63506ea5,0xdc35f67b,0xa4fe0d66,0x9286c489,0xfe95cd4d,0x3f101d3b,
  72183. 0x98846a95,0x5cacea0b },
  72184. { 0x9ceac44d,0xa90df60c,0x354d1c3a,0x3db29af4,0xad5dbabe,0x08dd3de8,
  72185. 0x35e4efa9,0xe4982d12 } },
  72186. /* 75 */
  72187. { { 0xc34cd55e,0x23104a22,0x2680d132,0x58695bb3,0x1fa1d943,0xfb345afa,
  72188. 0x16b20499,0x8046b7f6 },
  72189. { 0x38e7d098,0xb533581e,0xf46f0b70,0xd7f61e8d,0x44cb78c4,0x30dea9ea,
  72190. 0x9082af55,0xeb17ca7b } },
  72191. /* 76 */
  72192. { { 0x76a145b9,0x1751b598,0xc1bc71ec,0xa5cf6b0f,0x392715bb,0xd3e03565,
  72193. 0xfab5e131,0x097b00ba },
  72194. { 0x565f69e1,0xaa66c8e9,0xb5be5199,0x77e8f75a,0xda4fd984,0x6033ba11,
  72195. 0xafdbcc9e,0xf95c747b } },
  72196. /* 77 */
  72197. { { 0xbebae45e,0x558f01d3,0xc4bc6955,0xa8ebe9f0,0xdbc64fc6,0xaeb705b1,
  72198. 0x566ed837,0x3512601e },
  72199. { 0xfa1161cd,0x9336f1e1,0x4c65ef87,0x328ab8d5,0x724f21e5,0x4757eee2,
  72200. 0x6068ab6b,0x0ef97123 } },
  72201. /* 78 */
  72202. { { 0x54ca4226,0x02598cf7,0xf8642c8e,0x5eede138,0x468e1790,0x48963f74,
  72203. 0x3b4fbc95,0xfc16d933 },
  72204. { 0xe7c800ca,0xbe96fb31,0x2678adaa,0x13806331,0x6ff3e8b5,0x3d624497,
  72205. 0xb95d7a17,0x14ca4af1 } },
  72206. /* 79 */
  72207. { { 0xbd2f81d5,0x7a4771ba,0x01f7d196,0x1a5f9d69,0xcad9c907,0xd898bef7,
  72208. 0xf59c231d,0x4057b063 },
  72209. { 0x89c05c0a,0xbffd82fe,0x1dc0df85,0xe4911c6f,0xa35a16db,0x3befccae,
  72210. 0xf1330b13,0x1c3b5d64 } },
  72211. /* 80 */
  72212. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  72213. 0xdb7e63af,0xfad27148 },
  72214. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  72215. 0x9f0e1a84,0x77387de3 } },
  72216. /* 81 */
  72217. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  72218. 0xbef0c47e,0xb37b85c0 },
  72219. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  72220. 0xf9f628d5,0x9c135ac8 } },
  72221. /* 82 */
  72222. { { 0x84e35743,0x32aa3202,0x85a3cdef,0x320d6ab1,0x1df19819,0xb821b176,
  72223. 0xc433851f,0x5721361f },
  72224. { 0x71fc9168,0x1f0db36a,0x5e5c403c,0x5f98ba73,0x37bcd8f5,0xf64ca87e,
  72225. 0xe6bb11bd,0xdcbac3c9 } },
  72226. /* 83 */
  72227. { { 0x4518cbe2,0xf01d9968,0x9c9eb04e,0xd242fc18,0xe47feebf,0x727663c7,
  72228. 0x2d626862,0xb8c1c89e },
  72229. { 0xc8e1d569,0x51a58bdd,0xb7d88cd0,0x563809c8,0xf11f31eb,0x26c27fd9,
  72230. 0x2f9422d4,0x5d23bbda } },
  72231. /* 84 */
  72232. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  72233. 0x91ece900,0xc109f9cb },
  72234. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  72235. 0x2eee1ee1,0x9bc3344f } },
  72236. /* 85 */
  72237. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  72238. 0x5f1a4cc1,0x29591d52 },
  72239. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  72240. 0x18ef332c,0x6376551f } },
  72241. /* 86 */
  72242. { { 0x562976cc,0xbda5f14e,0x0ef12c38,0x22bca3e6,0x6cca9852,0xbbfa3064,
  72243. 0x08e2987a,0xbdb79dc8 },
  72244. { 0xcb06a772,0xfd2cb5c9,0xfe536dce,0x38f475aa,0x7c2b5db8,0xc2a3e022,
  72245. 0xadd3c14a,0x8ee86001 } },
  72246. /* 87 */
  72247. { { 0xa4ade873,0xcbe96981,0xc4fba48c,0x7ee9aa4d,0x5a054ba5,0x2cee2899,
  72248. 0x6f77aa4b,0x92e51d7a },
  72249. { 0x7190a34d,0x948bafa8,0xf6bd1ed1,0xd698f75b,0x0caf1144,0xd00ee6e3,
  72250. 0x0a56aaaa,0x5182f86f } },
  72251. /* 88 */
  72252. { { 0x7a4cc99c,0xfba6212c,0x3e6d9ca1,0xff609b68,0x5ac98c5a,0x5dbb27cb,
  72253. 0x4073a6f2,0x91dcab5d },
  72254. { 0x5f575a70,0x01b6cc3d,0x6f8d87fa,0x0cb36139,0x89981736,0x165d4e8c,
  72255. 0x97974f2b,0x17a0cedb } },
  72256. /* 89 */
  72257. { { 0x076c8d3a,0x38861e2a,0x210f924b,0x701aad39,0x13a835d9,0x94d0eae4,
  72258. 0x7f4cdf41,0x2e8ce36c },
  72259. { 0x037a862b,0x91273dab,0x60e4c8fa,0x01ba9bb7,0x33baf2dd,0xf9645388,
  72260. 0x34f668f3,0xf4ccc6cb } },
  72261. /* 90 */
  72262. { { 0xf1f79687,0x44ef525c,0x92efa815,0x7c595495,0xa5c78d29,0xe1231741,
  72263. 0x9a0df3c9,0xac0db488 },
  72264. { 0xdf01747f,0x86bfc711,0xef17df13,0x592b9358,0x5ccb6bb5,0xe5880e4f,
  72265. 0x94c974a2,0x95a64a61 } },
  72266. /* 91 */
  72267. { { 0xc15a4c93,0x72c1efda,0x82585141,0x40269b73,0x16cb0bad,0x6a8dfb1c,
  72268. 0x29210677,0x231e54ba },
  72269. { 0x8ae6d2dc,0xa70df917,0x39112918,0x4d6aa63f,0x5e5b7223,0xf627726b,
  72270. 0xd8a731e1,0xab0be032 } },
  72271. /* 92 */
  72272. { { 0x8d131f2d,0x097ad0e9,0x3b04f101,0x637f09e3,0xd5e9a748,0x1ac86196,
  72273. 0x2cf6a679,0xf1bcc880 },
  72274. { 0xe8daacb4,0x25c69140,0x60f65009,0x3c4e4055,0x477937a6,0x591cc8fc,
  72275. 0x5aebb271,0x85169469 } },
  72276. /* 93 */
  72277. { { 0xf1dcf593,0xde35c143,0xb018be3b,0x78202b29,0x9bdd9d3d,0xe9cdadc2,
  72278. 0xdaad55d8,0x8f67d9d2 },
  72279. { 0x7481ea5f,0x84111656,0xe34c590c,0xe7d2dde9,0x05053fa8,0xffdd43f4,
  72280. 0xc0728b5d,0xf84572b9 } },
  72281. /* 94 */
  72282. { { 0x97af71c9,0x5e1a7a71,0x7a736565,0xa1449444,0x0e1d5063,0xa1b4ae07,
  72283. 0x616b2c19,0xedee2710 },
  72284. { 0x11734121,0xb2f034f5,0x4a25e9f0,0x1cac6e55,0xa40c2ecf,0x8dc148f3,
  72285. 0x44ebd7f4,0x9fd27e9b } },
  72286. /* 95 */
  72287. { { 0xf6e2cb16,0x3cc7658a,0xfe5919b6,0xe3eb7d2c,0x168d5583,0x5a8c5816,
  72288. 0x958ff387,0xa40c2fb6 },
  72289. { 0xfedcc158,0x8c9ec560,0x55f23056,0x7ad804c6,0x9a307e12,0xd9396704,
  72290. 0x7dc6decf,0x99bc9bb8 } },
  72291. /* 96 */
  72292. { { 0x927dafc6,0x84a9521d,0x5c09cd19,0x52c1fb69,0xf9366dde,0x9d9581a0,
  72293. 0xa16d7e64,0x9abe210b },
  72294. { 0x48915220,0x480af84a,0x4dd816c6,0xfa73176a,0x1681ca5a,0xc7d53987,
  72295. 0x87f344b0,0x7881c257 } },
  72296. /* 97 */
  72297. { { 0xe0bcf3ff,0x93399b51,0x127f74f6,0x0d02cbc5,0xdd01d968,0x8fb465a2,
  72298. 0xa30e8940,0x15e6e319 },
  72299. { 0x3e0e05f4,0x646d6e0d,0x43588404,0xfad7bddc,0xc4f850d3,0xbe61c7d1,
  72300. 0x191172ce,0x0e55facf } },
  72301. /* 98 */
  72302. { { 0xf8787564,0x7e9d9806,0x31e85ce6,0x1a331721,0xb819e8d6,0x6b0158ca,
  72303. 0x6fe96577,0xd73d0976 },
  72304. { 0x1eb7206e,0x42483425,0xc618bb42,0xa519290f,0x5e30a520,0x5dcbb859,
  72305. 0x8f15a50b,0x9250a374 } },
  72306. /* 99 */
  72307. { { 0xbe577410,0xcaff08f8,0x5077a8c6,0xfd408a03,0xec0a63a4,0xf1f63289,
  72308. 0xc1cc8c0b,0x77414082 },
  72309. { 0xeb0991cd,0x05a40fa6,0x49fdc296,0xc1ca0866,0xb324fd40,0x3a68a3c7,
  72310. 0x12eb20b9,0x8cb04f4d } },
  72311. /* 100 */
  72312. { { 0x6906171c,0xb1c2d055,0xb0240c3f,0x9073e9cd,0xd8906841,0xdb8e6b4f,
  72313. 0x47123b51,0xe4e429ef },
  72314. { 0x38ec36f4,0x0b8dd53c,0xff4b6a27,0xf9d2dc01,0x879a9a48,0x5d066e07,
  72315. 0x3c6e6552,0x37bca2ff } },
  72316. /* 101 */
  72317. { { 0xdf562470,0x4cd2e3c7,0xc0964ac9,0x44f272a2,0x80c793be,0x7c6d5df9,
  72318. 0x3002b22a,0x59913edc },
  72319. { 0x5750592a,0x7a139a83,0xe783de02,0x99e01d80,0xea05d64f,0xcf8c0375,
  72320. 0xb013e226,0x43786e4a } },
  72321. /* 102 */
  72322. { { 0x9e56b5a6,0xff32b0ed,0xd9fc68f9,0x0750d9a6,0x597846a7,0xec15e845,
  72323. 0xb7e79e7a,0x8638ca98 },
  72324. { 0x0afc24b2,0x2f5ae096,0x4dace8f2,0x05398eaf,0xaecba78f,0x3b765dd0,
  72325. 0x7b3aa6f0,0x1ecdd36a } },
  72326. /* 103 */
  72327. { { 0x6c5ff2f3,0x5d3acd62,0x2873a978,0xa2d516c0,0xd2110d54,0xad94c9fa,
  72328. 0xd459f32d,0xd85d0f85 },
  72329. { 0x10b11da3,0x9f700b8d,0xa78318c4,0xd2c22c30,0x9208decd,0x556988f4,
  72330. 0xb4ed3c62,0xa04f19c3 } },
  72331. /* 104 */
  72332. { { 0xed7f93bd,0x087924c8,0x392f51f6,0xcb64ac5d,0x821b71af,0x7cae330a,
  72333. 0x5c0950b0,0x92b2eeea },
  72334. { 0x85b6e235,0x85ac4c94,0x2936c0f0,0xab2ca4a9,0xe0508891,0x80faa6b3,
  72335. 0x5834276c,0x1ee78221 } },
  72336. /* 105 */
  72337. { { 0xe63e79f7,0xa60a2e00,0xf399d906,0xf590e7b2,0x6607c09d,0x9021054a,
  72338. 0x57a6e150,0xf3f2ced8 },
  72339. { 0xf10d9b55,0x200510f3,0xd8642648,0x9d2fcfac,0xe8bd0e7c,0xe5631aa7,
  72340. 0x3da3e210,0x0f56a454 } },
  72341. /* 106 */
  72342. { { 0x1043e0df,0x5b21bffa,0x9c007e6d,0x6c74b6cc,0xd4a8517a,0x1a656ec0,
  72343. 0x1969e263,0xbd8f1741 },
  72344. { 0xbeb7494a,0x8a9bbb86,0x45f3b838,0x1567d46f,0xa4e5a79a,0xdf7a12a7,
  72345. 0x30ccfa09,0x2d1a1c35 } },
  72346. /* 107 */
  72347. { { 0x506508da,0x192e3813,0xa1d795a7,0x336180c4,0x7a9944b3,0xcddb5949,
  72348. 0xb91fba46,0xa107a65e },
  72349. { 0x0f94d639,0xe6d1d1c5,0x8a58b7d7,0x8b4af375,0xbd37ca1c,0x1a7c5584,
  72350. 0xf87a9af2,0x183d760a } },
  72351. /* 108 */
  72352. { { 0x0dde59a4,0x29d69711,0x0e8bef87,0xf1ad8d07,0x4f2ebe78,0x229b4963,
  72353. 0xc269d754,0x1d44179d },
  72354. { 0x8390d30e,0xb32dc0cf,0x0de8110c,0x0a3b2753,0x2bc0339a,0x31af1dc5,
  72355. 0x9606d262,0x771f9cc2 } },
  72356. /* 109 */
  72357. { { 0x85040739,0x99993e77,0x8026a939,0x44539db9,0xf5f8fc26,0xcf40f6f2,
  72358. 0x0362718e,0x64427a31 },
  72359. { 0x85428aa8,0x4f4f2d87,0xebfb49a8,0x7b7adc3f,0xf23d01ac,0x201b2c6d,
  72360. 0x6ae90d6d,0x49d9b749 } },
  72361. /* 110 */
  72362. { { 0x435d1099,0xcc78d8bc,0x8e8d1a08,0x2adbcd4e,0x2cb68a41,0x02c2e2a0,
  72363. 0x3f605445,0x9037d81b },
  72364. { 0x074c7b61,0x7cdbac27,0x57bfd72e,0xfe2031ab,0x596d5352,0x61ccec96,
  72365. 0x7cc0639c,0x08c3de6a } },
  72366. /* 111 */
  72367. { { 0xf6d552ab,0x20fdd020,0x05cd81f1,0x56baff98,0x91351291,0x06fb7c3e,
  72368. 0x45796b2f,0xc6909442 },
  72369. { 0x41231bd1,0x17b3ae9c,0x5cc58205,0x1eac6e87,0xf9d6a122,0x208837ab,
  72370. 0xcafe3ac0,0x3fa3db02 } },
  72371. /* 112 */
  72372. { { 0x05058880,0xd75a3e65,0x643943f2,0x7da365ef,0xfab24925,0x4147861c,
  72373. 0xfdb808ff,0xc5c4bdb0 },
  72374. { 0xb272b56b,0x73513e34,0x11b9043a,0xc8327e95,0xf8844969,0xfd8ce37d,
  72375. 0x46c2b6b5,0x2d56db94 } },
  72376. /* 113 */
  72377. { { 0xff46ac6b,0x2461782f,0x07a2e425,0xd19f7926,0x09a48de1,0xfafea3c4,
  72378. 0xe503ba42,0x0f56bd9d },
  72379. { 0x345cda49,0x137d4ed1,0x816f299d,0x821158fc,0xaeb43402,0xe7c6a54a,
  72380. 0x1173b5f1,0x4003bb9d } },
  72381. /* 114 */
  72382. { { 0xa0803387,0x3b8e8189,0x39cbd404,0xece115f5,0xd2877f21,0x4297208d,
  72383. 0xa07f2f9e,0x53765522 },
  72384. { 0xa8a4182d,0xa4980a21,0x3219df79,0xa2bbd07a,0x1a19a2d4,0x674d0a2e,
  72385. 0x6c5d4549,0x7a056f58 } },
  72386. /* 115 */
  72387. { { 0x9d8a2a47,0x646b2558,0xc3df2773,0x5b582948,0xabf0d539,0x51ec000e,
  72388. 0x7a1a2675,0x77d482f1 },
  72389. { 0x87853948,0xb8a1bd95,0x6cfbffee,0xa6f817bd,0x80681e47,0xab6ec057,
  72390. 0x2b38b0e4,0x4115012b } },
  72391. /* 116 */
  72392. { { 0x6de28ced,0x3c73f0f4,0x9b13ec47,0x1d5da760,0x6e5c6392,0x61b8ce9e,
  72393. 0xfbea0946,0xcdf04572 },
  72394. { 0x6c53c3b0,0x1cb3c58b,0x447b843c,0x97fe3c10,0x2cb9780e,0xfb2b8ae1,
  72395. 0x97383109,0xee703dda } },
  72396. /* 117 */
  72397. { { 0xff57e43a,0x34515140,0xb1b811b8,0xd44660d3,0x8f42b986,0x2b3b5dff,
  72398. 0xa162ce21,0x2a0ad89d },
  72399. { 0x6bc277ba,0x64e4a694,0xc141c276,0xc788c954,0xcabf6274,0x141aa64c,
  72400. 0xac2b4659,0xd62d0b67 } },
  72401. /* 118 */
  72402. { { 0x2c054ac4,0x39c5d87b,0xf27df788,0x57005859,0xb18128d6,0xedf7cbf3,
  72403. 0x991c2426,0xb39a23f2 },
  72404. { 0xf0b16ae5,0x95284a15,0xa136f51b,0x0c6a05b1,0xf2700783,0x1d63c137,
  72405. 0xc0674cc5,0x04ed0092 } },
  72406. /* 119 */
  72407. { { 0x9ae90393,0x1f4185d1,0x4a3d64e6,0x3047b429,0x9854fc14,0xae0001a6,
  72408. 0x0177c387,0xa0a91fc1 },
  72409. { 0xae2c831e,0xff0a3f01,0x2b727e16,0xbb76ae82,0x5a3075b4,0x8f12c8a1,
  72410. 0x9ed20c41,0x084cf988 } },
  72411. /* 120 */
  72412. { { 0xfca6becf,0xd98509de,0x7dffb328,0x2fceae80,0x4778e8b9,0x5d8a15c4,
  72413. 0x73abf77e,0xd57955b2 },
  72414. { 0x31b5d4f1,0x210da79e,0x3cfa7a1c,0xaa52f04b,0xdc27c20b,0xd4d12089,
  72415. 0x02d141f1,0x8e14ea42 } },
  72416. /* 121 */
  72417. { { 0xf2897042,0xeed50345,0x43402c4a,0x8d05331f,0xc8bdfb21,0xc8d9c194,
  72418. 0x2aa4d158,0x597e1a37 },
  72419. { 0xcf0bd68c,0x0327ec1a,0xab024945,0x6d4be0dc,0xc9fe3e84,0x5b9c8d7a,
  72420. 0x199b4dea,0xca3f0236 } },
  72421. /* 122 */
  72422. { { 0x6170bd20,0x592a10b5,0x6d3f5de7,0x0ea897f1,0x44b2ade2,0xa3363ff1,
  72423. 0x309c07e4,0xbde7fd7e },
  72424. { 0xb8f5432c,0x516bb6d2,0xe043444b,0x210dc1cb,0xf8f95b5a,0x3db01e6f,
  72425. 0x0a7dd198,0xb623ad0e } },
  72426. /* 123 */
  72427. { { 0x60c7b65b,0xa75bd675,0x23a4a289,0xab8c5590,0xd7b26795,0xf8220fd0,
  72428. 0x58ec137b,0xd6aa2e46 },
  72429. { 0x5138bb85,0x10abc00b,0xd833a95c,0x8c31d121,0x1702a32e,0xb24ff00b,
  72430. 0x2dcc513a,0x111662e0 } },
  72431. /* 124 */
  72432. { { 0xefb42b87,0x78114015,0x1b6c4dff,0xbd9f5d70,0xa7d7c129,0x66ecccd7,
  72433. 0x94b750f8,0xdb3ee1cb },
  72434. { 0xf34837cf,0xb26f3db0,0xb9578d4f,0xe7eed18b,0x7c56657d,0x5d2cdf93,
  72435. 0x52206a59,0x886a6442 } },
  72436. /* 125 */
  72437. { { 0x65b569ea,0x3c234cfb,0xf72119c1,0x20011141,0xa15a619e,0x8badc85d,
  72438. 0x018a17bc,0xa70cf4eb },
  72439. { 0x8c4a6a65,0x224f97ae,0x0134378f,0x36e5cf27,0x4f7e0960,0xbe3a609e,
  72440. 0xd1747b77,0xaa4772ab } },
  72441. /* 126 */
  72442. { { 0x7aa60cc0,0x67676131,0x0368115f,0xc7916361,0xbbc1bb5a,0xded98bb4,
  72443. 0x30faf974,0x611a6ddc },
  72444. { 0xc15ee47a,0x30e78cbc,0x4e0d96a5,0x2e896282,0x3dd9ed88,0x36f35adf,
  72445. 0x16429c88,0x5cfffaf8 } },
  72446. /* 127 */
  72447. { { 0x9b7a99cd,0xc0d54cff,0x843c45a1,0x7bf3b99d,0x62c739e1,0x038a908f,
  72448. 0x7dc1994c,0x6e5a6b23 },
  72449. { 0x0ba5db77,0xef8b454e,0xacf60d63,0xb7b8807f,0x76608378,0xe591c0c6,
  72450. 0x242dabcc,0x481a238d } },
  72451. /* 128 */
  72452. { { 0x35d0b34a,0xe3417bc0,0x8327c0a7,0x440b386b,0xac0362d1,0x8fb7262d,
  72453. 0xe0cdf943,0x2c41114c },
  72454. { 0xad95a0b1,0x2ba5cef1,0x67d54362,0xc09b37a8,0x01e486c9,0x26d6cdd2,
  72455. 0x42ff9297,0x20477abf } },
  72456. /* 129 */
  72457. { { 0x18d65dbf,0x2f75173c,0x339edad8,0x77bf940e,0xdcf1001c,0x7022d26b,
  72458. 0xc77396b6,0xac66409a },
  72459. { 0xc6261cc3,0x8b0bb36f,0x190e7e90,0x213f7bc9,0xa45e6c10,0x6541ceba,
  72460. 0xcc122f85,0xce8e6975 } },
  72461. /* 130 */
  72462. { { 0xbc0a67d2,0x0f121b41,0x444d248a,0x62d4760a,0x659b4737,0x0e044f1d,
  72463. 0x250bb4a8,0x08fde365 },
  72464. { 0x848bf287,0xaceec3da,0xd3369d6e,0xc2a62182,0x92449482,0x3582dfdc,
  72465. 0x565d6cd7,0x2f7e2fd2 } },
  72466. /* 131 */
  72467. { { 0xc3770fa7,0xae4b92db,0x379043f9,0x095e8d5c,0x17761171,0x54f34e9d,
  72468. 0x907702ae,0xc65be92e },
  72469. { 0xf6fd0a40,0x2758a303,0xbcce784b,0xe7d822e3,0x4f9767bf,0x7ae4f585,
  72470. 0xd1193b3a,0x4bff8e47 } },
  72471. /* 132 */
  72472. { { 0x00ff1480,0xcd41d21f,0x0754db16,0x2ab8fb7d,0xbbe0f3ea,0xac81d2ef,
  72473. 0x5772967d,0x3e4e4ae6 },
  72474. { 0x3c5303e6,0x7e18f36d,0x92262397,0x3bd9994b,0x1324c3c0,0x9ed70e26,
  72475. 0x58ec6028,0x5388aefd } },
  72476. /* 133 */
  72477. { { 0x5e5d7713,0xad1317eb,0x75de49da,0x09b985ee,0xc74fb261,0x32f5bc4f,
  72478. 0x4f75be0e,0x5cf908d1 },
  72479. { 0x8e657b12,0x76043510,0xb96ed9e6,0xbfd421a5,0x8970ccc2,0x0e29f51f,
  72480. 0x60f00ce2,0xa698ba40 } },
  72481. /* 134 */
  72482. { { 0xef748fec,0x73db1686,0x7e9d2cf9,0xe6e755a2,0xce265eff,0x630b6544,
  72483. 0x7aebad8d,0xb142ef8a },
  72484. { 0x17d5770a,0xad31af9f,0x2cb3412f,0x66af3b67,0xdf3359de,0x6bd60d1b,
  72485. 0x58515075,0xd1896a96 } },
  72486. /* 135 */
  72487. { { 0x33c41c08,0xec5957ab,0x5468e2e1,0x87de94ac,0xac472f6c,0x18816b73,
  72488. 0x7981da39,0x267b0e0b },
  72489. { 0x8e62b988,0x6e554e5d,0x116d21e7,0xd8ddc755,0x3d2a6f99,0x4610faf0,
  72490. 0xa1119393,0xb54e287a } },
  72491. /* 136 */
  72492. { { 0x178a876b,0x0a0122b5,0x085104b4,0x51ff96ff,0x14f29f76,0x050b31ab,
  72493. 0x5f87d4e6,0x84abb28b },
  72494. { 0x8270790a,0xd5ed439f,0x85e3f46b,0x2d6cb59d,0x6c1e2212,0x75f55c1b,
  72495. 0x17655640,0xe5436f67 } },
  72496. /* 137 */
  72497. { { 0x2286e8d5,0x53f9025e,0x864453be,0x353c95b4,0xe408e3a0,0xd832f5bd,
  72498. 0x5b9ce99e,0x0404f68b },
  72499. { 0xa781e8e5,0xcad33bde,0x163c2f5b,0x3cdf5018,0x0119caa3,0x57576960,
  72500. 0x0ac1c701,0x3a4263df } },
  72501. /* 138 */
  72502. { { 0x9aeb596d,0xc2965ecc,0x023c92b4,0x01ea03e7,0x2e013961,0x4704b4b6,
  72503. 0x905ea367,0x0ca8fd3f },
  72504. { 0x551b2b61,0x92523a42,0x390fcd06,0x1eb7a89c,0x0392a63e,0xe7f1d2be,
  72505. 0x4ddb0c33,0x96dca264 } },
  72506. /* 139 */
  72507. { { 0x387510af,0x203bb43a,0xa9a36a01,0x846feaa8,0x2f950378,0xd23a5770,
  72508. 0x3aad59dc,0x4363e212 },
  72509. { 0x40246a47,0xca43a1c7,0xe55dd24d,0xb362b8d2,0x5d8faf96,0xf9b08604,
  72510. 0xd8bb98c4,0x840e115c } },
  72511. /* 140 */
  72512. { { 0x1023e8a7,0xf12205e2,0xd8dc7a0b,0xc808a8cd,0x163a5ddf,0xe292a272,
  72513. 0x30ded6d4,0x5e0d6abd },
  72514. { 0x7cfc0f64,0x07a721c2,0x0e55ed88,0x42eec01d,0x1d1f9db2,0x26a7bef9,
  72515. 0x2945a25a,0x7dea48f4 } },
  72516. /* 141 */
  72517. { { 0xe5060a81,0xabdf6f1c,0xf8f95615,0xe79f9c72,0x06ac268b,0xcfd36c54,
  72518. 0xebfd16d1,0xabc2a2be },
  72519. { 0xd3e2eac7,0x8ac66f91,0xd2dd0466,0x6f10ba63,0x0282d31b,0x6790e377,
  72520. 0x6c7eefc1,0x4ea35394 } },
  72521. /* 142 */
  72522. { { 0x5266309d,0xed8a2f8d,0x81945a3e,0x0a51c6c0,0x578c5dc1,0xcecaf45a,
  72523. 0x1c94ffc3,0x3a76e689 },
  72524. { 0x7d7b0d0f,0x9aace8a4,0x8f584a5f,0x963ace96,0x4e697fbe,0x51a30c72,
  72525. 0x465e6464,0x8212a10a } },
  72526. /* 143 */
  72527. { { 0xcfab8caa,0xef7c61c3,0x0e142390,0x18eb8e84,0x7e9733ca,0xcd1dff67,
  72528. 0x599cb164,0xaa7cab71 },
  72529. { 0xbc837bd1,0x02fc9273,0xc36af5d7,0xc06407d0,0xf423da49,0x17621292,
  72530. 0xfe0617c3,0x40e38073 } },
  72531. /* 144 */
  72532. { { 0xa7bf9b7c,0xf4f80824,0x3fbe30d0,0x365d2320,0x97cf9ce3,0xbfbe5320,
  72533. 0xb3055526,0xe3604700 },
  72534. { 0x6cc6c2c7,0x4dcb9911,0xba4cbee6,0x72683708,0x637ad9ec,0xdcded434,
  72535. 0xa3dee15f,0x6542d677 } },
  72536. /* 145 */
  72537. { { 0x7b6c377a,0x3f32b6d0,0x903448be,0x6cb03847,0x20da8af7,0xd6fdd3a8,
  72538. 0x09bb6f21,0xa6534aee },
  72539. { 0x1035facf,0x30a1780d,0x9dcb47e6,0x35e55a33,0xc447f393,0x6ea50fe1,
  72540. 0xdc9aef22,0xf3cb672f } },
  72541. /* 146 */
  72542. { { 0x3b55fd83,0xeb3719fe,0x875ddd10,0xe0d7a46c,0x05cea784,0x33ac9fa9,
  72543. 0xaae870e7,0x7cafaa2e },
  72544. { 0x1d53b338,0x9b814d04,0xef87e6c6,0xe0acc0a0,0x11672b0f,0xfb93d108,
  72545. 0xb9bd522e,0x0aab13c1 } },
  72546. /* 147 */
  72547. { { 0xd2681297,0xddcce278,0xb509546a,0xcb350eb1,0x7661aaf2,0x2dc43173,
  72548. 0x847012e9,0x4b91a602 },
  72549. { 0x72f8ddcf,0xdcff1095,0x9a911af4,0x08ebf61e,0xc372430e,0x48f4360a,
  72550. 0x72321cab,0x49534c53 } },
  72551. /* 148 */
  72552. { { 0xf07b7e9d,0x83df7d71,0x13cd516f,0xa478efa3,0x6c047ee3,0x78ef264b,
  72553. 0xd65ac5ee,0xcaf46c4f },
  72554. { 0x92aa8266,0xa04d0c77,0x913684bb,0xedf45466,0xae4b16b0,0x56e65168,
  72555. 0x04c6770f,0x14ce9e57 } },
  72556. /* 149 */
  72557. { { 0x965e8f91,0x99445e3e,0xcb0f2492,0xd3aca1ba,0x90c8a0a0,0xd31cc70f,
  72558. 0x3e4c9a71,0x1bb708a5 },
  72559. { 0x558bdd7a,0xd5ca9e69,0x018a26b1,0x734a0508,0x4c9cf1ec,0xb093aa71,
  72560. 0xda300102,0xf9d126f2 } },
  72561. /* 150 */
  72562. { { 0xaff9563e,0x749bca7a,0xb49914a0,0xdd077afe,0xbf5f1671,0xe27a0311,
  72563. 0x729ecc69,0x807afcb9 },
  72564. { 0xc9b08b77,0x7f8a9337,0x443c7e38,0x86c3a785,0x476fd8ba,0x85fafa59,
  72565. 0x6568cd8c,0x751adcd1 } },
  72566. /* 151 */
  72567. { { 0x10715c0d,0x8aea38b4,0x8f7697f7,0xd113ea71,0x93fbf06d,0x665eab14,
  72568. 0x2537743f,0x29ec4468 },
  72569. { 0xb50bebbc,0x3d94719c,0xe4505422,0x399ee5bf,0x8d2dedb1,0x90cd5b3a,
  72570. 0x92a4077d,0xff9370e3 } },
  72571. /* 152 */
  72572. { { 0xc6b75b65,0x59a2d69b,0x266651c5,0x4188f8d5,0x3de9d7d2,0x28a9f33e,
  72573. 0xa2a9d01a,0x9776478b },
  72574. { 0x929af2c7,0x8852622d,0x4e690923,0x334f5d6d,0xa89a51e9,0xce6cc7e5,
  72575. 0xac2f82fa,0x74a6313f } },
  72576. /* 153 */
  72577. { { 0xb75f079c,0xb2f4dfdd,0x18e36fbb,0x85b07c95,0xe7cd36dd,0x1b6cfcf0,
  72578. 0x0ff4863d,0xab75be15 },
  72579. { 0x173fc9b7,0x81b367c0,0xd2594fd0,0xb90a7420,0xc4091236,0x15fdbf03,
  72580. 0x0b4459f6,0x4ebeac2e } },
  72581. /* 154 */
  72582. { { 0x5c9f2c53,0xeb6c5fe7,0x8eae9411,0xd2522011,0xf95ac5d8,0xc8887633,
  72583. 0x2c1baffc,0xdf99887b },
  72584. { 0x850aaecb,0xbb78eed2,0x01d6a272,0x9d49181b,0xb1cdbcac,0x978dd511,
  72585. 0x779f4058,0x27b040a7 } },
  72586. /* 155 */
  72587. { { 0xf73b2eb2,0x90405db7,0x8e1b2118,0xe0df8508,0x5962327e,0x501b7152,
  72588. 0xe4cfa3f5,0xb393dd37 },
  72589. { 0x3fd75165,0xa1230e7b,0xbcd33554,0xd66344c2,0x0f7b5022,0x6c36f1be,
  72590. 0xd0463419,0x09588c12 } },
  72591. /* 156 */
  72592. { { 0x02601c3b,0xe086093f,0xcf5c335f,0xfb0252f8,0x894aff28,0x955cf280,
  72593. 0xdb9f648b,0x81c879a9 },
  72594. { 0xc6f56c51,0x040e687c,0x3f17618c,0xfed47169,0x9059353b,0x44f88a41,
  72595. 0x5fc11bc4,0xfa0d48f5 } },
  72596. /* 157 */
  72597. { { 0xe1608e4d,0xbc6e1c9d,0x3582822c,0x010dda11,0x157ec2d7,0xf6b7ddc1,
  72598. 0xb6a367d6,0x8ea0e156 },
  72599. { 0x2383b3b4,0xa354e02f,0x3f01f53c,0x69966b94,0x2de03ca5,0x4ff6632b,
  72600. 0xfa00b5ac,0x3f5ab924 } },
  72601. /* 158 */
  72602. { { 0x59739efb,0x337bb0d9,0xe7ebec0d,0xc751b0f4,0x411a67d1,0x2da52dd6,
  72603. 0x2b74256e,0x8bc76887 },
  72604. { 0x82d3d253,0xa5be3b72,0xf58d779f,0xa9f679a1,0xe16767bb,0xa1cac168,
  72605. 0x60fcf34f,0xb386f190 } },
  72606. /* 159 */
  72607. { { 0x2fedcfc2,0x31f3c135,0x62f8af0d,0x5396bf62,0xe57288c2,0x9a02b4ea,
  72608. 0x1b069c4d,0x4cb460f7 },
  72609. { 0x5b8095ea,0xae67b4d3,0x6fc07603,0x92bbf859,0xb614a165,0xe1475f66,
  72610. 0x95ef5223,0x52c0d508 } },
  72611. /* 160 */
  72612. { { 0x15339848,0x231c210e,0x70778c8d,0xe87a28e8,0x6956e170,0x9d1de661,
  72613. 0x2bb09c0b,0x4ac3c938 },
  72614. { 0x6998987d,0x19be0551,0xae09f4d6,0x8b2376c4,0x1a3f933d,0x1de0b765,
  72615. 0xe39705f4,0x380d94c7 } },
  72616. /* 161 */
  72617. { { 0x81542e75,0x01a355aa,0xee01b9b7,0x96c724a1,0x624d7087,0x6b3a2977,
  72618. 0xde2637af,0x2ce3e171 },
  72619. { 0xf5d5bc1a,0xcfefeb49,0x2777e2b5,0xa655607e,0x9513756c,0x4feaac2f,
  72620. 0x0b624e4d,0x2e6cd852 } },
  72621. /* 162 */
  72622. { { 0x8c31c31d,0x3685954b,0x5bf21a0c,0x68533d00,0x75c79ec9,0x0bd7626e,
  72623. 0x42c69d54,0xca177547 },
  72624. { 0xf6d2dbb2,0xcc6edaff,0x174a9d18,0xfd0d8cbd,0xaa4578e8,0x875e8793,
  72625. 0x9cab2ce6,0xa976a713 } },
  72626. /* 163 */
  72627. { { 0x93fb353d,0x0a651f1b,0x57fcfa72,0xd75cab8b,0x31b15281,0xaa88cfa7,
  72628. 0x0a1f4999,0x8720a717 },
  72629. { 0x693e1b90,0x8c3e8d37,0x16f6dfc3,0xd345dc0b,0xb52a8742,0x8ea8d00a,
  72630. 0xc769893c,0x9719ef29 } },
  72631. /* 164 */
  72632. { { 0x58e35909,0x820eed8d,0x33ddc116,0x9366d8dc,0x6e205026,0xd7f999d0,
  72633. 0xe15704c1,0xa5072976 },
  72634. { 0xc4e70b2e,0x002a37ea,0x6890aa8a,0x84dcf657,0x645b2a5c,0xcd71bf18,
  72635. 0xf7b77725,0x99389c9d } },
  72636. /* 165 */
  72637. { { 0x7ada7a4b,0x238c08f2,0xfd389366,0x3abe9d03,0x766f512c,0x6b672e89,
  72638. 0x202c82e4,0xa88806aa },
  72639. { 0xd380184e,0x6602044a,0x126a8b85,0xa8cb78c4,0xad844f17,0x79d670c0,
  72640. 0x4738dcfe,0x0043bffb } },
  72641. /* 166 */
  72642. { { 0x36d5192e,0x8d59b5dc,0x4590b2af,0xacf885d3,0x11601781,0x83566d0a,
  72643. 0xba6c4866,0x52f3ef01 },
  72644. { 0x0edcb64d,0x3986732a,0x8068379f,0x0a482c23,0x7040f309,0x16cbe5fa,
  72645. 0x9ef27e75,0x3296bd89 } },
  72646. /* 167 */
  72647. { { 0x454d81d7,0x476aba89,0x51eb9b3c,0x9eade7ef,0x81c57986,0x619a21cd,
  72648. 0xaee571e9,0x3b90febf },
  72649. { 0x5496f7cb,0x9393023e,0x7fb51bc4,0x55be41d8,0x99beb5ce,0x03f1dd48,
  72650. 0x9f810b18,0x6e88069d } },
  72651. /* 168 */
  72652. { { 0xb43ea1db,0xce37ab11,0x5259d292,0x0a7ff1a9,0x8f84f186,0x851b0221,
  72653. 0xdefaad13,0xa7222bea },
  72654. { 0x2b0a9144,0xa2ac78ec,0xf2fa59c5,0x5a024051,0x6147ce38,0x91d1eca5,
  72655. 0xbc2ac690,0xbe94d523 } },
  72656. /* 169 */
  72657. { { 0x0b226ce7,0x72f4945e,0x967e8b70,0xb8afd747,0x85a6c63e,0xedea46f1,
  72658. 0x9be8c766,0x7782defe },
  72659. { 0x3db38626,0x760d2aa4,0x76f67ad1,0x460ae787,0x54499cdb,0x341b86fc,
  72660. 0xa2892e4b,0x03838567 } },
  72661. /* 170 */
  72662. { { 0x79ec1a0f,0x2d8daefd,0xceb39c97,0x3bbcd6fd,0x58f61a95,0xf5575ffc,
  72663. 0xadf7b420,0xdbd986c4 },
  72664. { 0x15f39eb7,0x81aa8814,0xb98d976c,0x6ee2fcf5,0xcf2f717d,0x5465475d,
  72665. 0x6860bbd0,0x8e24d3c4 } },
  72666. /* 171 */
  72667. { { 0x9a587390,0x749d8e54,0x0cbec588,0x12bb194f,0xb25983c6,0x46e07da4,
  72668. 0x407bafc8,0x541a99c4 },
  72669. { 0x624c8842,0xdb241692,0xd86c05ff,0x6044c12a,0x4f7fcf62,0xc59d14b4,
  72670. 0xf57d35d1,0xc0092c49 } },
  72671. /* 172 */
  72672. { { 0xdf2e61ef,0xd3cc75c3,0x2e1b35ca,0x7e8841c8,0x909f29f4,0xc62d30d1,
  72673. 0x7286944d,0x75e40634 },
  72674. { 0xbbc237d0,0xe7d41fc5,0xec4f01c9,0xc9537bf0,0x282bd534,0x91c51a16,
  72675. 0xc7848586,0x5b7cb658 } },
  72676. /* 173 */
  72677. { { 0x8a28ead1,0x964a7084,0xfd3b47f6,0x802dc508,0x767e5b39,0x9ae4bfd1,
  72678. 0x8df097a1,0x7ae13eba },
  72679. { 0xeadd384e,0xfd216ef8,0xb6b2ff06,0x0361a2d9,0x4bcdb5f3,0x204b9878,
  72680. 0xe2a8e3fd,0x787d8074 } },
  72681. /* 174 */
  72682. { { 0x757fbb1c,0xc5e25d6b,0xca201deb,0xe47bddb2,0x6d2233ff,0x4a55e9a3,
  72683. 0x9ef28484,0x5c222819 },
  72684. { 0x88315250,0x773d4a85,0x827097c1,0x21b21a2b,0xdef5d33f,0xab7c4ea1,
  72685. 0xbaf0f2b0,0xe45d37ab } },
  72686. /* 175 */
  72687. { { 0x28511c8a,0xd2df1e34,0xbdca6cd3,0xebb229c8,0x627c39a7,0x578a71a7,
  72688. 0x84dfb9d3,0xed7bc122 },
  72689. { 0x93dea561,0xcf22a6df,0xd48f0ed1,0x5443f18d,0x5bad23e8,0xd8b86140,
  72690. 0x45ca6d27,0xaac97cc9 } },
  72691. /* 176 */
  72692. { { 0xa16bd00a,0xeb54ea74,0xf5c0bcc1,0xd839e9ad,0x1f9bfc06,0x092bb7f1,
  72693. 0x1163dc4e,0x318f97b3 },
  72694. { 0xc30d7138,0xecc0c5be,0xabc30220,0x44e8df23,0xb0223606,0x2bb7972f,
  72695. 0x9a84ff4d,0xfa41faa1 } },
  72696. /* 177 */
  72697. { { 0xa6642269,0x4402d974,0x9bb783bd,0xc81814ce,0x7941e60b,0x398d38e4,
  72698. 0x1d26e9e2,0x38bb6b2c },
  72699. { 0x6a577f87,0xc64e4a25,0xdc11fe1c,0x8b52d253,0x62280728,0xff336abf,
  72700. 0xce7601a5,0x94dd0905 } },
  72701. /* 178 */
  72702. { { 0xde93f92a,0x156cf7dc,0x89b5f315,0xa01333cb,0xc995e750,0x02404df9,
  72703. 0xd25c2ae9,0x92077867 },
  72704. { 0x0bf39d44,0xe2471e01,0x96bb53d7,0x5f2c9020,0x5c9c3d8f,0x4c44b7b3,
  72705. 0xd29beb51,0x81e8428b } },
  72706. /* 179 */
  72707. { { 0xc477199f,0x6dd9c2ba,0x6b5ecdd9,0x8cb8eeee,0xee40fd0e,0x8af7db3f,
  72708. 0xdbbfa4b1,0x1b94ab62 },
  72709. { 0xce47f143,0x44f0d8b3,0x63f46163,0x51e623fc,0xcc599383,0xf18f270f,
  72710. 0x055590ee,0x06a38e28 } },
  72711. /* 180 */
  72712. { { 0xb3355b49,0x2e5b0139,0xb4ebf99b,0x20e26560,0xd269f3dc,0xc08ffa6b,
  72713. 0x83d9d4f8,0xa7b36c20 },
  72714. { 0x1b3e8830,0x64d15c3a,0xa89f9c0b,0xd5fceae1,0xe2d16930,0xcfeee4a2,
  72715. 0xa2822a20,0xbe54c6b4 } },
  72716. /* 181 */
  72717. { { 0x8d91167c,0xd6cdb3df,0xe7a6625e,0x517c3f79,0x346ac7f4,0x7105648f,
  72718. 0xeae022bb,0xbf30a5ab },
  72719. { 0x93828a68,0x8e7785be,0x7f3ef036,0x5161c332,0x592146b2,0xe11b5feb,
  72720. 0x2732d13a,0xd1c820de } },
  72721. /* 182 */
  72722. { { 0x9038b363,0x043e1347,0x6b05e519,0x58c11f54,0x6026cad1,0x4fe57abe,
  72723. 0x68a18da3,0xb7d17bed },
  72724. { 0xe29c2559,0x44ca5891,0x5bfffd84,0x4f7a0376,0x74e46948,0x498de4af,
  72725. 0x6412cc64,0x3997fd5e } },
  72726. /* 183 */
  72727. { { 0x8bd61507,0xf2074682,0x34a64d2a,0x29e132d5,0x8a8a15e3,0xffeddfb0,
  72728. 0x3c6c13e8,0x0eeb8929 },
  72729. { 0xa7e259f8,0xe9b69a3e,0xd13e7e67,0xce1db7e6,0xad1fa685,0x277318f6,
  72730. 0xc922b6ef,0x228916f8 } },
  72731. /* 184 */
  72732. { { 0x0a12ab5b,0x959ae25b,0x957bc136,0xcc11171f,0xd16e2b0c,0x8058429e,
  72733. 0x6e93097e,0xec05ad1d },
  72734. { 0xac3f3708,0x157ba5be,0x30b59d77,0x31baf935,0x118234e5,0x47b55237,
  72735. 0x7ff11b37,0x7d314156 } },
  72736. /* 185 */
  72737. { { 0xf6dfefab,0x7bd9c05c,0xdcb37707,0xbe2f2268,0x3a38bb95,0xe53ead97,
  72738. 0x9bc1d7a3,0xe9ce66fc },
  72739. { 0x6f6a02a1,0x75aa1576,0x60e600ed,0x38c087df,0x68cdc1b9,0xf8947f34,
  72740. 0x72280651,0xd9650b01 } },
  72741. /* 186 */
  72742. { { 0x5a057e60,0x504b4c4a,0x8def25e4,0xcbccc3be,0x17c1ccbd,0xa6353208,
  72743. 0x804eb7a2,0x14d6699a },
  72744. { 0xdb1f411a,0x2c8a8415,0xf80d769c,0x09fbaf0b,0x1c2f77ad,0xb4deef90,
  72745. 0x0d43598a,0x6f4c6841 } },
  72746. /* 187 */
  72747. { { 0x96c24a96,0x8726df4e,0xfcbd99a3,0x534dbc85,0x8b2ae30a,0x3c466ef2,
  72748. 0x61189abb,0x4c4350fd },
  72749. { 0xf855b8da,0x2967f716,0x463c38a1,0x41a42394,0xeae93343,0xc37e1413,
  72750. 0x5a3118b5,0xa726d242 } },
  72751. /* 188 */
  72752. { { 0x948c1086,0xdae6b3ee,0xcbd3a2e1,0xf1de503d,0x03d022f3,0x3f35ed3f,
  72753. 0xcc6cf392,0x13639e82 },
  72754. { 0xcdafaa86,0x9ac938fb,0x2654a258,0xf45bc5fb,0x45051329,0x1963b26e,
  72755. 0xc1a335a3,0xca9365e1 } },
  72756. /* 189 */
  72757. { { 0x4c3b2d20,0x3615ac75,0x904e241b,0x742a5417,0xcc9d071d,0xb08521c4,
  72758. 0x970b72a5,0x9ce29c34 },
  72759. { 0x6d3e0ad6,0x8cc81f73,0xf2f8434c,0x8060da9e,0x6ce862d9,0x35ed1d1a,
  72760. 0xab42af98,0x48c4abd7 } },
  72761. /* 190 */
  72762. { { 0x40c7485a,0xd221b0cc,0xe5274dbf,0xead455bb,0x9263d2e8,0x493c7698,
  72763. 0xf67b33cb,0x78017c32 },
  72764. { 0x930cb5ee,0xb9d35769,0x0c408ed2,0xc0d14e94,0x272f1a4d,0xf8b7bf55,
  72765. 0xde5c1c04,0x53cd0454 } },
  72766. /* 191 */
  72767. { { 0x5d28ccac,0xbcd585fa,0x005b746e,0x5f823e56,0xcd0123aa,0x7c79f0a1,
  72768. 0xd3d7fa8f,0xeea465c1 },
  72769. { 0x0551803b,0x7810659f,0x7ce6af70,0x6c0b599f,0x29288e70,0x4195a770,
  72770. 0x7ae69193,0x1b6e42a4 } },
  72771. /* 192 */
  72772. { { 0xf67d04c3,0x2e80937c,0x89eeb811,0x1e312be2,0x92594d60,0x56b5d887,
  72773. 0x187fbd3d,0x0224da14 },
  72774. { 0x0c5fe36f,0x87abb863,0x4ef51f5f,0x580f3c60,0xb3b429ec,0x964fb1bf,
  72775. 0x42bfff33,0x60838ef0 } },
  72776. /* 193 */
  72777. { { 0x7e0bbe99,0x432cb2f2,0x04aa39ee,0x7bda44f3,0x9fa93903,0x5f497c7a,
  72778. 0x2d331643,0x636eb202 },
  72779. { 0x93ae00aa,0xfcfd0e61,0x31ae6d2f,0x875a00fe,0x9f93901c,0xf43658a2,
  72780. 0x39218bac,0x8844eeb6 } },
  72781. /* 194 */
  72782. { { 0x6b3bae58,0x114171d2,0x17e39f3e,0x7db3df71,0x81a8eada,0xcd37bc7f,
  72783. 0x51fb789e,0x27ba83dc },
  72784. { 0xfbf54de5,0xa7df439f,0xb5fe1a71,0x7277030b,0xdb297a48,0x42ee8e35,
  72785. 0x87f3a4ab,0xadb62d34 } },
  72786. /* 195 */
  72787. { { 0xa175df2a,0x9b1168a2,0x618c32e9,0x082aa04f,0x146b0916,0xc9e4f2e7,
  72788. 0x75e7c8b2,0xb990fd76 },
  72789. { 0x4df37313,0x0829d96b,0xd0b40789,0x1c205579,0x78087711,0x66c9ae4a,
  72790. 0x4d10d18d,0x81707ef9 } },
  72791. /* 196 */
  72792. { { 0x03d6ff96,0x97d7cab2,0x0d843360,0x5b851bfc,0xd042db4b,0x268823c4,
  72793. 0xd5a8aa5c,0x3792daea },
  72794. { 0x941afa0b,0x52818865,0x42d83671,0xf3e9e741,0x5be4e0a7,0x17c82527,
  72795. 0x94b001ba,0x5abd635e } },
  72796. /* 197 */
  72797. { { 0x0ac4927c,0x727fa84e,0xa7c8cf23,0xe3886035,0x4adca0df,0xa4bcd5ea,
  72798. 0x846ab610,0x5995bf21 },
  72799. { 0x829dfa33,0xe90f860b,0x958fc18b,0xcaafe2ae,0x78630366,0x9b3baf44,
  72800. 0xd483411e,0x44c32ca2 } },
  72801. /* 198 */
  72802. { { 0xe40ed80c,0xa74a97f1,0x31d2ca82,0x5f938cb1,0x7c2d6ad9,0x53f2124b,
  72803. 0x8082a54c,0x1f2162fb },
  72804. { 0x720b173e,0x7e467cc5,0x085f12f9,0x40e8a666,0x4c9d65dc,0x8cebc20e,
  72805. 0xc3e907c9,0x8f1d402b } },
  72806. /* 199 */
  72807. { { 0xfbc4058a,0x4f592f9c,0x292f5670,0xb15e14b6,0xbc1d8c57,0xc55cfe37,
  72808. 0x926edbf9,0xb1980f43 },
  72809. { 0x32c76b09,0x98c33e09,0x33b07f78,0x1df5279d,0x863bb461,0x6f08ead4,
  72810. 0x37448e45,0x2828ad9b } },
  72811. /* 200 */
  72812. { { 0xc4cf4ac5,0x696722c4,0xdde64afb,0xf5ac1a3f,0xe0890832,0x0551baa2,
  72813. 0x5a14b390,0x4973f127 },
  72814. { 0x322eac5d,0xe59d8335,0x0bd9b568,0x5e07eef5,0xa2588393,0xab36720f,
  72815. 0xdb168ac7,0x6dac8ed0 } },
  72816. /* 201 */
  72817. { { 0xeda835ef,0xf7b545ae,0x1d10ed51,0x4aa113d2,0x13741b09,0x035a65e0,
  72818. 0x20b9de4c,0x4b23ef59 },
  72819. { 0x3c4c7341,0xe82bb680,0x3f58bc37,0xd457706d,0xa51e3ee8,0x73527863,
  72820. 0xddf49a4e,0x4dd71534 } },
  72821. /* 202 */
  72822. { { 0x95476cd9,0xbf944672,0xe31a725b,0x648d072f,0xfc4b67e0,0x1441c8b8,
  72823. 0x2f4a4dbb,0xfd317000 },
  72824. { 0x8995d0e1,0x1cb43ff4,0x0ef729aa,0x76e695d1,0x41798982,0xe0d5f976,
  72825. 0x9569f365,0x14fac58c } },
  72826. /* 203 */
  72827. { { 0xf312ae18,0xad9a0065,0xfcc93fc9,0x51958dc0,0x8a7d2846,0xd9a14240,
  72828. 0x36abda50,0xed7c7651 },
  72829. { 0x25d4abbc,0x46270f1a,0xf1a113ea,0x9b5dd8f3,0x5b51952f,0xc609b075,
  72830. 0x4d2e9f53,0xfefcb7f7 } },
  72831. /* 204 */
  72832. { { 0xba119185,0xbd09497a,0xaac45ba4,0xd54e8c30,0xaa521179,0x492479de,
  72833. 0x87e0d80b,0x1801a57e },
  72834. { 0xfcafffb0,0x073d3f8d,0xae255240,0x6cf33c0b,0x5b5fdfbc,0x781d763b,
  72835. 0x1ead1064,0x9f8fc11e } },
  72836. /* 205 */
  72837. { { 0x5e69544c,0x1583a171,0xf04b7813,0x0eaf8567,0x278a4c32,0x1e22a8fd,
  72838. 0x3d3a69a9,0xa9d3809d },
  72839. { 0x59a2da3b,0x936c2c2c,0x1895c847,0x38ccbcf6,0x63d50869,0x5e65244e,
  72840. 0xe1178ef7,0x3006b9ae } },
  72841. /* 206 */
  72842. { { 0xc9eead28,0x0bb1f2b0,0x89f4dfbc,0x7eef635d,0xb2ce8939,0x074757fd,
  72843. 0x45f8f761,0x0ab85fd7 },
  72844. { 0x3e5b4549,0xecda7c93,0x97922f21,0x4be2bb5c,0xb43b8040,0x261a1274,
  72845. 0x11e942c2,0xb122d675 } },
  72846. /* 207 */
  72847. { { 0x66a5ae7a,0x3be607be,0x76adcbe3,0x01e703fa,0x4eb6e5c5,0xaf904301,
  72848. 0x097dbaec,0x9f599dc1 },
  72849. { 0x0ff250ed,0x6d75b718,0x349a20dc,0x8eb91574,0x10b227a3,0x425605a4,
  72850. 0x8a294b78,0x7d5528e0 } },
  72851. /* 208 */
  72852. { { 0x20c26def,0xf0f58f66,0x582b2d1e,0x025585ea,0x01ce3881,0xfbe7d79b,
  72853. 0x303f1730,0x28ccea01 },
  72854. { 0x79644ba5,0xd1dabcd1,0x06fff0b8,0x1fc643e8,0x66b3e17b,0xa60a76fc,
  72855. 0xa1d013bf,0xc18baf48 } },
  72856. /* 209 */
  72857. { { 0x5dc4216d,0x34e638c8,0x206142ac,0x00c01067,0x95f5064a,0xd453a171,
  72858. 0xb7a9596b,0x9def809d },
  72859. { 0x67ab8d2c,0x41e8642e,0x6237a2b6,0xb4240433,0x64c4218b,0x7d506a6d,
  72860. 0x68808ce5,0x0357f8b0 } },
  72861. /* 210 */
  72862. { { 0x4cd2cc88,0x8e9dbe64,0xf0b8f39d,0xcc61c28d,0xcd30a0c8,0x4a309874,
  72863. 0x1b489887,0xe4a01add },
  72864. { 0xf57cd8f9,0x2ed1eeac,0xbd594c48,0x1b767d3e,0x7bd2f787,0xa7295c71,
  72865. 0xce10cc30,0x466d7d79 } },
  72866. /* 211 */
  72867. { { 0x9dada2c7,0x47d31892,0x8f9aa27d,0x4fa0a6c3,0x820a59e1,0x90e4fd28,
  72868. 0x451ead1a,0xc672a522 },
  72869. { 0x5d86b655,0x30607cc8,0xf9ad4af1,0xf0235d3b,0x571172a6,0x99a08680,
  72870. 0xf2a67513,0x5e3d64fa } },
  72871. /* 212 */
  72872. { { 0x9b3b4416,0xaa6410c7,0xeab26d99,0xcd8fcf85,0xdb656a74,0x5ebff74a,
  72873. 0xeb8e42fc,0x6c8a7a95 },
  72874. { 0xb02a63bd,0x10c60ba7,0x8b8f0047,0x6b2f2303,0x312d90b0,0x8c6c3738,
  72875. 0xad82ca91,0x348ae422 } },
  72876. /* 213 */
  72877. { { 0x5ccda2fb,0x7f474663,0x8e0726d2,0x22accaa1,0x492b1f20,0x85adf782,
  72878. 0xd9ef2d2e,0xc1074de0 },
  72879. { 0xae9a65b3,0xfcf3ce44,0x05d7151b,0xfd71e4ac,0xce6a9788,0xd4711f50,
  72880. 0xc9e54ffc,0xfbadfbdb } },
  72881. /* 214 */
  72882. { { 0x20a99363,0x1713f1cd,0x6cf22775,0xb915658f,0x24d359b2,0x968175cd,
  72883. 0x83716fcd,0xb7f976b4 },
  72884. { 0x5d6dbf74,0x5758e24d,0x71c3af36,0x8d23bafd,0x0243dfe3,0x48f47760,
  72885. 0xcafcc805,0xf4d41b2e } },
  72886. /* 215 */
  72887. { { 0xfdabd48d,0x51f1cf28,0x32c078a4,0xce81be36,0x117146e9,0x6ace2974,
  72888. 0xe0160f10,0x180824ea },
  72889. { 0x66e58358,0x0387698b,0xce6ca358,0x63568752,0x5e41e6c5,0x82380e34,
  72890. 0x83cf6d25,0x67e5f639 } },
  72891. /* 216 */
  72892. { { 0xcf4899ef,0xf89ccb8d,0x9ebb44c0,0x949015f0,0xb2598ec9,0x546f9276,
  72893. 0x04c11fc6,0x9fef789a },
  72894. { 0x53d2a071,0x6d367ecf,0xa4519b09,0xb10e1a7f,0x611e2eef,0xca6b3fb0,
  72895. 0xa99c4e20,0xbc80c181 } },
  72896. /* 217 */
  72897. { { 0xe5eb82e6,0x972536f8,0xf56cb920,0x1a484fc7,0x50b5da5e,0xc78e2171,
  72898. 0x9f8cdf10,0x49270e62 },
  72899. { 0xea6b50ad,0x1a39b7bb,0xa2388ffc,0x9a0284c1,0x8107197b,0x5403eb17,
  72900. 0x61372f7f,0xd2ee52f9 } },
  72901. /* 218 */
  72902. { { 0x88e0362a,0xd37cd285,0x8fa5d94d,0x442fa8a7,0xa434a526,0xaff836e5,
  72903. 0xe5abb733,0xdfb478be },
  72904. { 0x673eede6,0xa91f1ce7,0x2b5b2f04,0xa5390ad4,0x5530da2f,0x5e66f7bf,
  72905. 0x08df473a,0xd9a140b4 } },
  72906. /* 219 */
  72907. { { 0x6e8ea498,0x0e0221b5,0x3563ee09,0x62347829,0x335d2ade,0xe06b8391,
  72908. 0x623f4b1a,0x760c058d },
  72909. { 0xc198aa79,0x0b89b58c,0xf07aba7f,0xf74890d2,0xfde2556a,0x4e204110,
  72910. 0x8f190409,0x7141982d } },
  72911. /* 220 */
  72912. { { 0x4d4b0f45,0x6f0a0e33,0x392a94e1,0xd9280b38,0xb3c61d5e,0x3af324c6,
  72913. 0x89d54e47,0x3af9d1ce },
  72914. { 0x20930371,0xfd8f7981,0x21c17097,0xeda2664c,0xdc42309b,0x0e9545dc,
  72915. 0x73957dd6,0xb1f815c3 } },
  72916. /* 221 */
  72917. { { 0x89fec44a,0x84faa78e,0x3caa4caf,0xc8c2ae47,0xc1b6a624,0x691c807d,
  72918. 0x1543f052,0xa41aed14 },
  72919. { 0x7d5ffe04,0x42435399,0x625b6e20,0x8bacb2df,0x87817775,0x85d660be,
  72920. 0x86fb60ef,0xd6e9c1dd } },
  72921. /* 222 */
  72922. { { 0xc6853264,0x3aa2e97e,0xe2304a0b,0x771533b7,0xb8eae9be,0x1b912bb7,
  72923. 0xae9bf8c2,0x9c9c6e10 },
  72924. { 0xe030b74c,0xa2309a59,0x6a631e90,0x4ed7494d,0xa49b79f2,0x89f44b23,
  72925. 0x40fa61b6,0x566bd596 } },
  72926. /* 223 */
  72927. { { 0xc18061f3,0x066c0118,0x7c83fc70,0x190b25d3,0x27273245,0xf05fc8e0,
  72928. 0xf525345e,0xcf2c7390 },
  72929. { 0x10eb30cf,0xa09bceb4,0x0d77703a,0xcfd2ebba,0x150ff255,0xe842c43a,
  72930. 0x8aa20979,0x02f51755 } },
  72931. /* 224 */
  72932. { { 0xaddb7d07,0x396ef794,0x24455500,0x0b4fc742,0xc78aa3ce,0xfaff8eac,
  72933. 0xe8d4d97d,0x14e9ada5 },
  72934. { 0x2f7079e2,0xdaa480a1,0xe4b0800e,0x45baa3cd,0x7838157d,0x01765e2d,
  72935. 0x8e9d9ae8,0xa0ad4fab } },
  72936. /* 225 */
  72937. { { 0x4a653618,0x0bfb7621,0x31eaaa5f,0x1872813c,0x44949d5e,0x1553e737,
  72938. 0x6e56ed1e,0xbcd530b8 },
  72939. { 0x32e9c47b,0x169be853,0xb50059ab,0xdc2776fe,0x192bfbb4,0xcdba9761,
  72940. 0x6979341d,0x909283cf } },
  72941. /* 226 */
  72942. { { 0x76e81a13,0x67b00324,0x62171239,0x9bee1a99,0xd32e19d6,0x08ed361b,
  72943. 0xace1549a,0x35eeb7c9 },
  72944. { 0x7e4e5bdc,0x1280ae5a,0xb6ceec6e,0x2dcd2cd3,0x6e266bc1,0x52e4224c,
  72945. 0x448ae864,0x9a8b2cf4 } },
  72946. /* 227 */
  72947. { { 0x09d03b59,0xf6471bf2,0xb65af2ab,0xc90e62a3,0xebd5eec9,0xff7ff168,
  72948. 0xd4491379,0x6bdb60f4 },
  72949. { 0x8a55bc30,0xdadafebc,0x10097fe0,0xc79ead16,0x4c1e3bdd,0x42e19741,
  72950. 0x94ba08a9,0x01ec3cfd } },
  72951. /* 228 */
  72952. { { 0xdc9485c2,0xba6277eb,0x22fb10c7,0x48cc9a79,0x70a28d8a,0x4f61d60f,
  72953. 0x475464f6,0xd1acb1c0 },
  72954. { 0x26f36612,0xd26902b1,0xe0618d8b,0x59c3a44e,0x308357ee,0x4df8a813,
  72955. 0x405626c2,0x7dcd079d } },
  72956. /* 229 */
  72957. { { 0xf05a4b48,0x5ce7d4d3,0x37230772,0xadcd2952,0x812a915a,0xd18f7971,
  72958. 0x377d19b8,0x0bf53589 },
  72959. { 0x6c68ea73,0x35ecd95a,0x823a584d,0xc7f3bbca,0xf473a723,0x9fb674c6,
  72960. 0xe16686fc,0xd28be4d9 } },
  72961. /* 230 */
  72962. { { 0x38fa8e4b,0x5d2b9906,0x893fd8fc,0x559f186e,0x436fb6fc,0x3a6de2aa,
  72963. 0x510f88ce,0xd76007aa },
  72964. { 0x523a4988,0x2d10aab6,0x74dd0273,0xb455cf44,0xa3407278,0x7f467082,
  72965. 0xb303bb01,0xf2b52f68 } },
  72966. /* 231 */
  72967. { { 0x9835b4ca,0x0d57eafa,0xbb669cbc,0x2d2232fc,0xc6643198,0x8eeeb680,
  72968. 0xcc5aed3a,0xd8dbe98e },
  72969. { 0xc5a02709,0xcba9be3f,0xf5ba1fa8,0x30be68e5,0xf10ea852,0xfebd43cd,
  72970. 0xee559705,0xe01593a3 } },
  72971. /* 232 */
  72972. { { 0xea75a0a6,0xd3e5af50,0x57858033,0x512226ac,0xd0176406,0x6fe6d50f,
  72973. 0xaeb8ef06,0xafec07b1 },
  72974. { 0x80bb0a31,0x7fb99567,0x37309aae,0x6f1af3cc,0x01abf389,0x9153a15a,
  72975. 0x6e2dbfdd,0xa71b9354 } },
  72976. /* 233 */
  72977. { { 0x18f593d2,0xbf8e12e0,0xa078122b,0xd1a90428,0x0ba4f2ad,0x150505db,
  72978. 0x628523d9,0x53a2005c },
  72979. { 0xe7f2b935,0x07c8b639,0xc182961a,0x2bff975a,0x7518ca2c,0x86bceea7,
  72980. 0x3d588e3d,0xbf47d19b } },
  72981. /* 234 */
  72982. { { 0xdd7665d5,0x672967a7,0x2f2f4de5,0x4e303057,0x80d4903f,0x144005ae,
  72983. 0x39c9a1b6,0x001c2c7f },
  72984. { 0x69efc6d6,0x143a8014,0x7bc7a724,0xc810bdaa,0xa78150a4,0x5f65670b,
  72985. 0x86ffb99b,0xfdadf8e7 } },
  72986. /* 235 */
  72987. { { 0xffc00785,0xfd38cb88,0x3b48eb67,0x77fa7591,0xbf368fbc,0x0454d055,
  72988. 0x5aa43c94,0x3a838e4d },
  72989. { 0x3e97bb9a,0x56166329,0x441d94d9,0x9eb93363,0x0adb2a83,0x515591a6,
  72990. 0x873e1da3,0x3cdb8257 } },
  72991. /* 236 */
  72992. { { 0x7de77eab,0x137140a9,0x41648109,0xf7e1c50d,0xceb1d0df,0x762dcad2,
  72993. 0xf1f57fba,0x5a60cc89 },
  72994. { 0x40d45673,0x80b36382,0x5913c655,0x1b82be19,0xdd64b741,0x057284b8,
  72995. 0xdbfd8fc0,0x922ff56f } },
  72996. /* 237 */
  72997. { { 0xc9a129a1,0x1b265dee,0xcc284e04,0xa5b1ce57,0xcebfbe3c,0x04380c46,
  72998. 0xf6c5cd62,0x72919a7d },
  72999. { 0x8fb90f9a,0x298f453a,0x88e4031b,0xd719c00b,0x796f1856,0xe32c0e77,
  73000. 0x3624089a,0x5e791780 } },
  73001. /* 238 */
  73002. { { 0x7f63cdfb,0x5c16ec55,0xf1cae4fd,0x8e6a3571,0x560597ca,0xfce26bea,
  73003. 0xe24c2fab,0x4e0a5371 },
  73004. { 0xa5765357,0x276a40d3,0x0d73a2b4,0x3c89af44,0x41d11a32,0xb8f370ae,
  73005. 0xd56604ee,0xf5ff7818 } },
  73006. /* 239 */
  73007. { { 0x1a09df21,0xfbf3e3fe,0xe66e8e47,0x26d5d28e,0x29c89015,0x2096bd0a,
  73008. 0x533f5e64,0xe41df0e9 },
  73009. { 0xb3ba9e3f,0x305fda40,0x2604d895,0xf2340ceb,0x7f0367c7,0x0866e192,
  73010. 0xac4f155f,0x8edd7d6e } },
  73011. /* 240 */
  73012. { { 0x0bfc8ff3,0xc9a1dc0e,0xe936f42f,0x14efd82b,0xcca381ef,0x67016f7c,
  73013. 0xed8aee96,0x1432c1ca },
  73014. { 0x70b23c26,0xec684829,0x0735b273,0xa64fe873,0xeaef0f5a,0xe389f6e5,
  73015. 0x5ac8d2c6,0xcaef480b } },
  73016. /* 241 */
  73017. { { 0x75315922,0x5245c978,0x3063cca5,0xd8295171,0xb64ef2cb,0xf3ce60d0,
  73018. 0x8efae236,0xd0ba177e },
  73019. { 0xb1b3af60,0x53a9ae8f,0x3d2da20e,0x1a796ae5,0xdf9eef28,0x01d63605,
  73020. 0x1c54ae16,0xf31c957c } },
  73021. /* 242 */
  73022. { { 0x49cc4597,0xc0f58d52,0xbae0a028,0xdc5015b0,0x734a814a,0xefc5fc55,
  73023. 0x96e17c3a,0x013404cb },
  73024. { 0xc9a824bf,0xb29e2585,0x001eaed7,0xd593185e,0x61ef68ac,0x8d6ee682,
  73025. 0x91933e6c,0x6f377c4b } },
  73026. /* 243 */
  73027. { { 0xa8333fd2,0x9f93bad1,0x5a2a95b8,0xa8930202,0xeaf75ace,0x211e5037,
  73028. 0xd2d09506,0x6dba3e4e },
  73029. { 0xd04399cd,0xa48ef98c,0xe6b73ade,0x1811c66e,0xc17ecaf3,0x72f60752,
  73030. 0x3becf4a7,0xf13cf342 } },
  73031. /* 244 */
  73032. { { 0xa919e2eb,0xceeb9ec0,0xf62c0f68,0x83a9a195,0x7aba2299,0xcfba3bb6,
  73033. 0x274bbad3,0xc83fa9a9 },
  73034. { 0x62fa1ce0,0x0d7d1b0b,0x3418efbf,0xe58b60f5,0x52706f04,0xbfa8ef9e,
  73035. 0x5d702683,0xb49d70f4 } },
  73036. /* 245 */
  73037. { { 0xfad5513b,0x914c7510,0xb1751e2d,0x05f32eec,0xd9fb9d59,0x6d850418,
  73038. 0x0c30f1cf,0x59cfadbb },
  73039. { 0x55cb7fd6,0xe167ac23,0x820426a3,0x249367b8,0x90a78864,0xeaeec58c,
  73040. 0x354a4b67,0x5babf362 } },
  73041. /* 246 */
  73042. { { 0xee424865,0x37c981d1,0xf2e5577f,0x8b002878,0xb9e0c058,0x702970f1,
  73043. 0x9026c8f0,0x6188c6a7 },
  73044. { 0xd0f244da,0x06f9a19b,0xfb080873,0x1ecced5c,0x9f213637,0x35470f9b,
  73045. 0xdf50b9d9,0x993fe475 } },
  73046. /* 247 */
  73047. { { 0x9b2c3609,0x68e31cdf,0x2c46d4ea,0x84eb19c0,0x9a775101,0x7ac9ec1a,
  73048. 0x4c80616b,0x81f76466 },
  73049. { 0x75fbe978,0x1d7c2a5a,0xf183b356,0x6743fed3,0x501dd2bf,0x838d1f04,
  73050. 0x5fe9060d,0x564a812a } },
  73051. /* 248 */
  73052. { { 0xfa817d1d,0x7a5a64f4,0xbea82e0f,0x55f96844,0xcd57f9aa,0xb5ff5a0f,
  73053. 0x00e51d6c,0x226bf3cf },
  73054. { 0x2f2833cf,0xd6d1a9f9,0x4f4f89a8,0x20a0a35a,0x8f3f7f77,0x11536c49,
  73055. 0xff257836,0x68779f47 } },
  73056. /* 249 */
  73057. { { 0x73043d08,0x79b0c1c1,0x1fc020fa,0xa5446774,0x9a6d26d0,0xd3767e28,
  73058. 0xeb092e0b,0x97bcb0d1 },
  73059. { 0xf32ed3c3,0x2ab6eaa8,0xb281bc48,0xc8a4f151,0xbfa178f3,0x4d1bf4f3,
  73060. 0x0a784655,0xa872ffe8 } },
  73061. /* 250 */
  73062. { { 0xa32b2086,0xb1ab7935,0x8160f486,0xe1eb710e,0x3b6ae6be,0x9bd0cd91,
  73063. 0xb732a36a,0x02812bfc },
  73064. { 0xcf605318,0xa63fd7ca,0xfdfd6d1d,0x646e5d50,0x2102d619,0xa1d68398,
  73065. 0xfe5396af,0x07391cc9 } },
  73066. /* 251 */
  73067. { { 0x8b80d02b,0xc50157f0,0x62877f7f,0x6b8333d1,0x78d542ae,0x7aca1af8,
  73068. 0x7e6d2a08,0x355d2adc },
  73069. { 0x287386e1,0xb41f335a,0xf8e43275,0xfd272a94,0xe79989ea,0x286ca2cd,
  73070. 0x7c2a3a79,0x3dc2b1e3 } },
  73071. /* 252 */
  73072. { { 0x04581352,0xd689d21c,0x376782be,0x0a00c825,0x9fed701f,0x203bd590,
  73073. 0x3ccd846b,0xc4786910 },
  73074. { 0x24c768ed,0x5dba7708,0x6841f657,0x72feea02,0x6accce0e,0x73313ed5,
  73075. 0xd5bb4d32,0xccc42968 } },
  73076. /* 253 */
  73077. { { 0x3d7620b9,0x94e50de1,0x5992a56a,0xd89a5c8a,0x675487c9,0xdc007640,
  73078. 0xaa4871cf,0xe147eb42 },
  73079. { 0xacf3ae46,0x274ab4ee,0x50350fbe,0xfd4936fb,0x48c840ea,0xdf2afe47,
  73080. 0x080e96e3,0x239ac047 } },
  73081. /* 254 */
  73082. { { 0x2bfee8d4,0x481d1f35,0xfa7b0fec,0xce80b5cf,0x2ce9af3c,0x105c4c9e,
  73083. 0xf5f7e59d,0xc55fa1a3 },
  73084. { 0x8257c227,0x3186f14e,0x342be00b,0xc5b1653f,0xaa904fb2,0x09afc998,
  73085. 0xd4f4b699,0x094cd99c } },
  73086. /* 255 */
  73087. { { 0xd703beba,0x8a981c84,0x32ceb291,0x8631d150,0xe3bd49ec,0xa445f2c9,
  73088. 0x42abad33,0xb90a30b6 },
  73089. { 0xb4a5abf9,0xb465404f,0x75db7603,0x004750c3,0xca35d89f,0x6f9a42cc,
  73090. 0x1b7924f7,0x019f8b9a } },
  73091. };
  73092. /* Multiply the base point of P256 by the scalar and return the result.
  73093. * If map is true then convert result to affine coordinates.
  73094. *
  73095. * Stripe implementation.
  73096. * Pre-generated: 2^0, 2^32, ...
  73097. * Pre-generated: products of all combinations of above.
  73098. * 8 doubles and adds (with qz=1)
  73099. *
  73100. * r Resulting point.
  73101. * k Scalar to multiply by.
  73102. * map Indicates whether to convert result to affine.
  73103. * ct Constant time required.
  73104. * heap Heap to use for allocation.
  73105. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73106. */
  73107. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  73108. int map, int ct, void* heap)
  73109. {
  73110. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  73111. k, map, ct, heap);
  73112. }
  73113. #endif
  73114. /* Multiply the base point of P256 by the scalar and return the result.
  73115. * If map is true then convert result to affine coordinates.
  73116. *
  73117. * km Scalar to multiply by.
  73118. * r Resulting point.
  73119. * map Indicates whether to convert result to affine.
  73120. * heap Heap to use for allocation.
  73121. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73122. */
  73123. int sp_ecc_mulmod_base_256(const mp_int* km, ecc_point* r, int map, void* heap)
  73124. {
  73125. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  73126. sp_point_256* point = NULL;
  73127. sp_digit* k = NULL;
  73128. #else
  73129. sp_point_256 point[1];
  73130. sp_digit k[8];
  73131. #endif
  73132. int err = MP_OKAY;
  73133. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  73134. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  73135. DYNAMIC_TYPE_ECC);
  73136. if (point == NULL)
  73137. err = MEMORY_E;
  73138. if (err == MP_OKAY) {
  73139. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  73140. DYNAMIC_TYPE_ECC);
  73141. if (k == NULL)
  73142. err = MEMORY_E;
  73143. }
  73144. #endif
  73145. if (err == MP_OKAY) {
  73146. sp_256_from_mp(k, 8, km);
  73147. err = sp_256_ecc_mulmod_base_8(point, k, map, 1, heap);
  73148. }
  73149. if (err == MP_OKAY) {
  73150. err = sp_256_point_to_ecc_point_8(point, r);
  73151. }
  73152. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  73153. if (k != NULL)
  73154. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  73155. if (point != NULL)
  73156. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  73157. #endif
  73158. return err;
  73159. }
  73160. /* Multiply the base point of P256 by the scalar, add point a and return
  73161. * the result. If map is true then convert result to affine coordinates.
  73162. *
  73163. * km Scalar to multiply by.
  73164. * am Point to add to scalar mulitply result.
  73165. * inMont Point to add is in montgomery form.
  73166. * r Resulting point.
  73167. * map Indicates whether to convert result to affine.
  73168. * heap Heap to use for allocation.
  73169. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  73170. */
  73171. int sp_ecc_mulmod_base_add_256(const mp_int* km, const ecc_point* am,
  73172. int inMont, ecc_point* r, int map, void* heap)
  73173. {
  73174. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  73175. sp_point_256* point = NULL;
  73176. sp_digit* k = NULL;
  73177. #else
  73178. sp_point_256 point[2];
  73179. sp_digit k[8 + 8 * 2 * 6];
  73180. #endif
  73181. sp_point_256* addP = NULL;
  73182. sp_digit* tmp = NULL;
  73183. int err = MP_OKAY;
  73184. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  73185. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  73186. DYNAMIC_TYPE_ECC);
  73187. if (point == NULL)
  73188. err = MEMORY_E;
  73189. if (err == MP_OKAY) {
  73190. k = (sp_digit*)XMALLOC(
  73191. sizeof(sp_digit) * (8 + 8 * 2 * 6),
  73192. heap, DYNAMIC_TYPE_ECC);
  73193. if (k == NULL)
  73194. err = MEMORY_E;
  73195. }
  73196. #endif
  73197. if (err == MP_OKAY) {
  73198. addP = point + 1;
  73199. tmp = k + 8;
  73200. sp_256_from_mp(k, 8, km);
  73201. sp_256_point_from_ecc_point_8(addP, am);
  73202. }
  73203. if ((err == MP_OKAY) && (!inMont)) {
  73204. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  73205. }
  73206. if ((err == MP_OKAY) && (!inMont)) {
  73207. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  73208. }
  73209. if ((err == MP_OKAY) && (!inMont)) {
  73210. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  73211. }
  73212. if (err == MP_OKAY) {
  73213. err = sp_256_ecc_mulmod_base_8(point, k, 0, 0, heap);
  73214. }
  73215. if (err == MP_OKAY) {
  73216. sp_256_proj_point_add_8(point, point, addP, tmp);
  73217. if (map) {
  73218. sp_256_map_8(point, point, tmp);
  73219. }
  73220. err = sp_256_point_to_ecc_point_8(point, r);
  73221. }
  73222. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  73223. if (k != NULL)
  73224. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  73225. if (point)
  73226. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  73227. #endif
  73228. return err;
  73229. }
  73230. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  73231. defined(HAVE_ECC_VERIFY)
  73232. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  73233. /* Add 1 to a. (a = a + 1)
  73234. *
  73235. * a A single precision integer.
  73236. */
  73237. static void sp_256_add_one_8(sp_digit* a_p)
  73238. {
  73239. register sp_digit* a asm ("r0") = a_p;
  73240. __asm__ __volatile__ (
  73241. "ldm %[a], {r1, r2, r3, r4}\n\t"
  73242. "adds r1, r1, #1\n\t"
  73243. "adcs r2, r2, #0\n\t"
  73244. "adcs r3, r3, #0\n\t"
  73245. "adcs r4, r4, #0\n\t"
  73246. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  73247. "ldm %[a], {r1, r2, r3, r4}\n\t"
  73248. "adcs r1, r1, #0\n\t"
  73249. "adcs r2, r2, #0\n\t"
  73250. "adcs r3, r3, #0\n\t"
  73251. "adcs r4, r4, #0\n\t"
  73252. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  73253. : [a] "+r" (a)
  73254. :
  73255. : "memory", "r1", "r2", "r3", "r4"
  73256. );
  73257. }
  73258. /* Read big endian unsigned byte array into r.
  73259. *
  73260. * r A single precision integer.
  73261. * size Maximum number of bytes to convert
  73262. * a Byte array.
  73263. * n Number of bytes in array to read.
  73264. */
  73265. static void sp_256_from_bin(sp_digit* r, int size, const byte* a, int n)
  73266. {
  73267. int i;
  73268. int j;
  73269. byte* d;
  73270. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  73271. r[j] = ((sp_digit)a[i - 0] << 0) |
  73272. ((sp_digit)a[i - 1] << 8) |
  73273. ((sp_digit)a[i - 2] << 16) |
  73274. ((sp_digit)a[i - 3] << 24);
  73275. j++;
  73276. }
  73277. if (i >= 0) {
  73278. r[j] = 0;
  73279. d = (byte*)r;
  73280. switch (i) {
  73281. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  73282. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  73283. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  73284. }
  73285. j++;
  73286. }
  73287. for (; j < size; j++) {
  73288. r[j] = 0;
  73289. }
  73290. }
  73291. /* Generates a scalar that is in the range 1..order-1.
  73292. *
  73293. * rng Random number generator.
  73294. * k Scalar value.
  73295. * returns RNG failures, MEMORY_E when memory allocation fails and
  73296. * MP_OKAY on success.
  73297. */
  73298. static int sp_256_ecc_gen_k_8(WC_RNG* rng, sp_digit* k)
  73299. {
  73300. int err;
  73301. byte buf[32];
  73302. do {
  73303. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  73304. if (err == 0) {
  73305. sp_256_from_bin(k, 8, buf, (int)sizeof(buf));
  73306. if (sp_256_cmp_8(k, p256_order2) <= 0) {
  73307. sp_256_add_one_8(k);
  73308. break;
  73309. }
  73310. }
  73311. }
  73312. while (err == 0);
  73313. return err;
  73314. }
  73315. /* Makes a random EC key pair.
  73316. *
  73317. * rng Random number generator.
  73318. * priv Generated private value.
  73319. * pub Generated public point.
  73320. * heap Heap to use for allocation.
  73321. * returns ECC_INF_E when the point does not have the correct order, RNG
  73322. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  73323. */
  73324. int sp_ecc_make_key_256(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  73325. {
  73326. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  73327. sp_point_256* point = NULL;
  73328. sp_digit* k = NULL;
  73329. #else
  73330. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  73331. sp_point_256 point[2];
  73332. #else
  73333. sp_point_256 point[1];
  73334. #endif
  73335. sp_digit k[8];
  73336. #endif
  73337. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  73338. sp_point_256* infinity = NULL;
  73339. #endif
  73340. int err = MP_OKAY;
  73341. (void)heap;
  73342. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  73343. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  73344. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC);
  73345. #else
  73346. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC);
  73347. #endif
  73348. if (point == NULL)
  73349. err = MEMORY_E;
  73350. if (err == MP_OKAY) {
  73351. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  73352. DYNAMIC_TYPE_ECC);
  73353. if (k == NULL)
  73354. err = MEMORY_E;
  73355. }
  73356. #endif
  73357. if (err == MP_OKAY) {
  73358. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  73359. infinity = point + 1;
  73360. #endif
  73361. err = sp_256_ecc_gen_k_8(rng, k);
  73362. }
  73363. if (err == MP_OKAY) {
  73364. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, NULL);
  73365. }
  73366. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  73367. if (err == MP_OKAY) {
  73368. err = sp_256_ecc_mulmod_8(infinity, point, p256_order, 1, 1, NULL);
  73369. }
  73370. if (err == MP_OKAY) {
  73371. if (sp_256_iszero_8(point->x) || sp_256_iszero_8(point->y)) {
  73372. err = ECC_INF_E;
  73373. }
  73374. }
  73375. #endif
  73376. if (err == MP_OKAY) {
  73377. err = sp_256_to_mp(k, priv);
  73378. }
  73379. if (err == MP_OKAY) {
  73380. err = sp_256_point_to_ecc_point_8(point, pub);
  73381. }
  73382. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  73383. if (k != NULL)
  73384. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  73385. if (point != NULL) {
  73386. /* point is not sensitive, so no need to zeroize */
  73387. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  73388. }
  73389. #endif
  73390. return err;
  73391. }
  73392. #ifdef WOLFSSL_SP_NONBLOCK
  73393. typedef struct sp_ecc_key_gen_256_ctx {
  73394. int state;
  73395. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  73396. sp_digit k[8];
  73397. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  73398. sp_point_256 point[2];
  73399. #else
  73400. sp_point_256 point[1];
  73401. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  73402. } sp_ecc_key_gen_256_ctx;
  73403. int sp_ecc_make_key_256_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  73404. ecc_point* pub, void* heap)
  73405. {
  73406. int err = FP_WOULDBLOCK;
  73407. sp_ecc_key_gen_256_ctx* ctx = (sp_ecc_key_gen_256_ctx*)sp_ctx->data;
  73408. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  73409. sp_point_256* infinity = ctx->point + 1;
  73410. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  73411. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_256_ctx)
  73412. >= sizeof(*sp_ctx) ? -1 : 1];
  73413. (void)sizeof(ctx_size_test);
  73414. switch (ctx->state) {
  73415. case 0:
  73416. err = sp_256_ecc_gen_k_8(rng, ctx->k);
  73417. if (err == MP_OKAY) {
  73418. err = FP_WOULDBLOCK;
  73419. ctx->state = 1;
  73420. }
  73421. break;
  73422. case 1:
  73423. err = sp_256_ecc_mulmod_base_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  73424. ctx->point, ctx->k, 1, 1, heap);
  73425. if (err == MP_OKAY) {
  73426. err = FP_WOULDBLOCK;
  73427. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  73428. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  73429. ctx->state = 2;
  73430. #else
  73431. ctx->state = 3;
  73432. #endif
  73433. }
  73434. break;
  73435. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  73436. case 2:
  73437. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  73438. infinity, ctx->point, p256_order, 1, 1);
  73439. if (err == MP_OKAY) {
  73440. if (sp_256_iszero_8(ctx->point->x) ||
  73441. sp_256_iszero_8(ctx->point->y)) {
  73442. err = ECC_INF_E;
  73443. }
  73444. else {
  73445. err = FP_WOULDBLOCK;
  73446. ctx->state = 3;
  73447. }
  73448. }
  73449. break;
  73450. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  73451. case 3:
  73452. err = sp_256_to_mp(ctx->k, priv);
  73453. if (err == MP_OKAY) {
  73454. err = sp_256_point_to_ecc_point_8(ctx->point, pub);
  73455. }
  73456. break;
  73457. }
  73458. if (err != FP_WOULDBLOCK) {
  73459. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_256_ctx));
  73460. }
  73461. return err;
  73462. }
  73463. #endif /* WOLFSSL_SP_NONBLOCK */
  73464. #ifdef HAVE_ECC_DHE
  73465. /* Write r as big endian to byte array.
  73466. * Fixed length number of bytes written: 32
  73467. *
  73468. * r A single precision integer.
  73469. * a Byte array.
  73470. */
  73471. static void sp_256_to_bin_8(sp_digit* r, byte* a)
  73472. {
  73473. int i;
  73474. int j = 0;
  73475. for (i = 7; i >= 0; i--) {
  73476. a[j++] = r[i] >> 24;
  73477. a[j++] = r[i] >> 16;
  73478. a[j++] = r[i] >> 8;
  73479. a[j++] = r[i] >> 0;
  73480. }
  73481. }
  73482. /* Multiply the point by the scalar and serialize the X ordinate.
  73483. * The number is 0 padded to maximum size on output.
  73484. *
  73485. * priv Scalar to multiply the point by.
  73486. * pub Point to multiply.
  73487. * out Buffer to hold X ordinate.
  73488. * outLen On entry, size of the buffer in bytes.
  73489. * On exit, length of data in buffer in bytes.
  73490. * heap Heap to use for allocation.
  73491. * returns BUFFER_E if the buffer is to small for output size,
  73492. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  73493. */
  73494. int sp_ecc_secret_gen_256(const mp_int* priv, const ecc_point* pub, byte* out,
  73495. word32* outLen, void* heap)
  73496. {
  73497. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  73498. sp_point_256* point = NULL;
  73499. sp_digit* k = NULL;
  73500. #else
  73501. sp_point_256 point[1];
  73502. sp_digit k[8];
  73503. #endif
  73504. int err = MP_OKAY;
  73505. if (*outLen < 32U) {
  73506. err = BUFFER_E;
  73507. }
  73508. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  73509. if (err == MP_OKAY) {
  73510. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  73511. DYNAMIC_TYPE_ECC);
  73512. if (point == NULL)
  73513. err = MEMORY_E;
  73514. }
  73515. if (err == MP_OKAY) {
  73516. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  73517. DYNAMIC_TYPE_ECC);
  73518. if (k == NULL)
  73519. err = MEMORY_E;
  73520. }
  73521. #endif
  73522. if (err == MP_OKAY) {
  73523. sp_256_from_mp(k, 8, priv);
  73524. sp_256_point_from_ecc_point_8(point, pub);
  73525. err = sp_256_ecc_mulmod_8(point, point, k, 1, 1, heap);
  73526. }
  73527. if (err == MP_OKAY) {
  73528. sp_256_to_bin_8(point->x, out);
  73529. *outLen = 32;
  73530. }
  73531. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  73532. if (k != NULL)
  73533. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  73534. if (point != NULL)
  73535. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  73536. #endif
  73537. return err;
  73538. }
  73539. #ifdef WOLFSSL_SP_NONBLOCK
  73540. typedef struct sp_ecc_sec_gen_256_ctx {
  73541. int state;
  73542. union {
  73543. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  73544. };
  73545. sp_digit k[8];
  73546. sp_point_256 point;
  73547. } sp_ecc_sec_gen_256_ctx;
  73548. int sp_ecc_secret_gen_256_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  73549. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  73550. {
  73551. int err = FP_WOULDBLOCK;
  73552. sp_ecc_sec_gen_256_ctx* ctx = (sp_ecc_sec_gen_256_ctx*)sp_ctx->data;
  73553. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  73554. (void)sizeof(ctx_size_test);
  73555. if (*outLen < 32U) {
  73556. err = BUFFER_E;
  73557. }
  73558. switch (ctx->state) {
  73559. case 0:
  73560. sp_256_from_mp(ctx->k, 8, priv);
  73561. sp_256_point_from_ecc_point_8(&ctx->point, pub);
  73562. ctx->state = 1;
  73563. break;
  73564. case 1:
  73565. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  73566. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  73567. if (err == MP_OKAY) {
  73568. sp_256_to_bin_8(ctx->point.x, out);
  73569. *outLen = 32;
  73570. }
  73571. break;
  73572. }
  73573. if (err == MP_OKAY && ctx->state != 1) {
  73574. err = FP_WOULDBLOCK;
  73575. }
  73576. if (err != FP_WOULDBLOCK) {
  73577. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_256_ctx));
  73578. }
  73579. return err;
  73580. }
  73581. #endif /* WOLFSSL_SP_NONBLOCK */
  73582. #endif /* HAVE_ECC_DHE */
  73583. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  73584. #endif
  73585. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  73586. #endif
  73587. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  73588. #ifdef WOLFSSL_SP_SMALL
  73589. /* Sub b from a into a. (a -= b)
  73590. *
  73591. * a A single precision integer.
  73592. * b A single precision integer.
  73593. */
  73594. static sp_digit sp_256_sub_in_place_8(sp_digit* a_p, const sp_digit* b_p)
  73595. {
  73596. register sp_digit* a asm ("r0") = a_p;
  73597. register const sp_digit* b asm ("r1") = b_p;
  73598. __asm__ __volatile__ (
  73599. "mov r10, #0\n\t"
  73600. "mov r12, #0\n\t"
  73601. "add lr, %[a], #32\n\t"
  73602. "\n"
  73603. "L_sp_256_sub_in_pkace_8_word_%=: \n\t"
  73604. "subs r12, r10, r12\n\t"
  73605. "ldm %[a], {r2, r3, r4, r5}\n\t"
  73606. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  73607. "sbcs r2, r2, r6\n\t"
  73608. "sbcs r3, r3, r7\n\t"
  73609. "sbcs r4, r4, r8\n\t"
  73610. "sbcs r5, r5, r9\n\t"
  73611. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  73612. "sbc r12, r10, r10\n\t"
  73613. "cmp %[a], lr\n\t"
  73614. "bne L_sp_256_sub_in_pkace_8_word_%=\n\t"
  73615. "mov %[a], r12\n\t"
  73616. : [a] "+r" (a), [b] "+r" (b)
  73617. :
  73618. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10"
  73619. );
  73620. return (uint32_t)(size_t)a;
  73621. }
  73622. #else
  73623. /* Sub b from a into a. (a -= b)
  73624. *
  73625. * a A single precision integer and result.
  73626. * b A single precision integer.
  73627. */
  73628. static sp_digit sp_256_sub_in_place_8(sp_digit* a_p, const sp_digit* b_p)
  73629. {
  73630. register sp_digit* a asm ("r0") = a_p;
  73631. register const sp_digit* b asm ("r1") = b_p;
  73632. __asm__ __volatile__ (
  73633. "ldm %[a], {r2, r3, r4, r5}\n\t"
  73634. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  73635. "subs r2, r2, r6\n\t"
  73636. "sbcs r3, r3, r7\n\t"
  73637. "sbcs r4, r4, r8\n\t"
  73638. "sbcs r5, r5, r9\n\t"
  73639. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  73640. "ldm %[a], {r2, r3, r4, r5}\n\t"
  73641. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  73642. "sbcs r2, r2, r6\n\t"
  73643. "sbcs r3, r3, r7\n\t"
  73644. "sbcs r4, r4, r8\n\t"
  73645. "sbcs r5, r5, r9\n\t"
  73646. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  73647. "sbc %[a], r9, r9\n\t"
  73648. : [a] "+r" (a), [b] "+r" (b)
  73649. :
  73650. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  73651. );
  73652. return (uint32_t)(size_t)a;
  73653. }
  73654. #endif /* WOLFSSL_SP_SMALL */
  73655. #ifdef WOLFSSL_SP_SMALL
  73656. /* Mul a by digit b into r. (r = a * b)
  73657. *
  73658. * r A single precision integer.
  73659. * a A single precision integer.
  73660. * b A single precision digit.
  73661. */
  73662. static void sp_256_mul_d_8(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  73663. {
  73664. register sp_digit* r asm ("r0") = r_p;
  73665. register const sp_digit* a asm ("r1") = a_p;
  73666. register sp_digit b asm ("r2") = b_p;
  73667. __asm__ __volatile__ (
  73668. "mov r10, #0\n\t"
  73669. /* A[0] * B */
  73670. "ldr r8, [%[a]]\n\t"
  73671. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  73672. "lsl r6, %[b], #16\n\t"
  73673. "lsl r5, r8, #16\n\t"
  73674. "lsr r6, r6, #16\n\t"
  73675. "lsr r5, r5, #16\n\t"
  73676. "mul r5, r6, r5\n\t"
  73677. "lsr r7, r8, #16\n\t"
  73678. "mul r6, r7, r6\n\t"
  73679. "lsr r3, r6, #16\n\t"
  73680. "lsl r6, r6, #16\n\t"
  73681. "adds r5, r5, r6\n\t"
  73682. "adc r3, r3, #0\n\t"
  73683. "lsr r6, %[b], #16\n\t"
  73684. "mul r7, r6, r7\n\t"
  73685. "add r3, r3, r7\n\t"
  73686. "lsl r7, r8, #16\n\t"
  73687. "lsr r7, r7, #16\n\t"
  73688. "mul r6, r7, r6\n\t"
  73689. "lsr r7, r6, #16\n\t"
  73690. "lsl r6, r6, #16\n\t"
  73691. "adds r5, r5, r6\n\t"
  73692. "adc r3, r3, r7\n\t"
  73693. #else
  73694. "umull r5, r3, %[b], r8\n\t"
  73695. #endif
  73696. "mov r4, #0\n\t"
  73697. "str r5, [%[r]]\n\t"
  73698. "mov r5, #0\n\t"
  73699. "mov r9, #4\n\t"
  73700. "\n"
  73701. "L_sp_256_mul_d_8_word_%=: \n\t"
  73702. /* A[i] * B */
  73703. "ldr r8, [%[a], r9]\n\t"
  73704. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  73705. "lsl r6, %[b], #16\n\t"
  73706. "lsl r7, r8, #16\n\t"
  73707. "lsr r6, r6, #16\n\t"
  73708. "lsr r7, r7, #16\n\t"
  73709. "mul r7, r6, r7\n\t"
  73710. "adds r3, r3, r7\n\t"
  73711. "adcs r4, r4, #0\n\t"
  73712. "adc r5, r5, #0\n\t"
  73713. "lsr r7, r8, #16\n\t"
  73714. "mul r6, r7, r6\n\t"
  73715. "lsr r7, r6, #16\n\t"
  73716. "lsl r6, r6, #16\n\t"
  73717. "adds r3, r3, r6\n\t"
  73718. "adcs r4, r4, r7\n\t"
  73719. "adc r5, r5, #0\n\t"
  73720. "lsr r6, %[b], #16\n\t"
  73721. "lsr r7, r8, #16\n\t"
  73722. "mul r7, r6, r7\n\t"
  73723. "adds r4, r4, r7\n\t"
  73724. "adc r5, r5, #0\n\t"
  73725. "lsl r7, r8, #16\n\t"
  73726. "lsr r7, r7, #16\n\t"
  73727. "mul r6, r7, r6\n\t"
  73728. "lsr r7, r6, #16\n\t"
  73729. "lsl r6, r6, #16\n\t"
  73730. "adds r3, r3, r6\n\t"
  73731. "adcs r4, r4, r7\n\t"
  73732. "adc r5, r5, #0\n\t"
  73733. #else
  73734. "umull r6, r7, %[b], r8\n\t"
  73735. "adds r3, r3, r6\n\t"
  73736. "adcs r4, r4, r7\n\t"
  73737. "adc r5, r5, #0\n\t"
  73738. #endif
  73739. "str r3, [%[r], r9]\n\t"
  73740. "mov r3, r4\n\t"
  73741. "mov r4, r5\n\t"
  73742. "mov r5, #0\n\t"
  73743. "add r9, r9, #4\n\t"
  73744. "cmp r9, #32\n\t"
  73745. "blt L_sp_256_mul_d_8_word_%=\n\t"
  73746. "str r3, [%[r], #32]\n\t"
  73747. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  73748. :
  73749. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  73750. );
  73751. }
  73752. #else
  73753. /* Mul a by digit b into r. (r = a * b)
  73754. *
  73755. * r A single precision integer.
  73756. * a A single precision integer.
  73757. * b A single precision digit.
  73758. */
  73759. static void sp_256_mul_d_8(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  73760. {
  73761. register sp_digit* r asm ("r0") = r_p;
  73762. register const sp_digit* a asm ("r1") = a_p;
  73763. register sp_digit b asm ("r2") = b_p;
  73764. __asm__ __volatile__ (
  73765. "mov r10, #0\n\t"
  73766. /* A[0] * B */
  73767. "ldr r8, [%[a]], #4\n\t"
  73768. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  73769. "lsl r6, %[b], #16\n\t"
  73770. "lsl r3, r8, #16\n\t"
  73771. "lsr r6, r6, #16\n\t"
  73772. "lsr r3, r3, #16\n\t"
  73773. "mul r3, r6, r3\n\t"
  73774. "lsr r7, r8, #16\n\t"
  73775. "mul r6, r7, r6\n\t"
  73776. "lsr r4, r6, #16\n\t"
  73777. "lsl r6, r6, #16\n\t"
  73778. "adds r3, r3, r6\n\t"
  73779. "adc r4, r4, #0\n\t"
  73780. "lsr r6, %[b], #16\n\t"
  73781. "mul r7, r6, r7\n\t"
  73782. "add r4, r4, r7\n\t"
  73783. "lsl r7, r8, #16\n\t"
  73784. "lsr r7, r7, #16\n\t"
  73785. "mul r6, r7, r6\n\t"
  73786. "lsr r7, r6, #16\n\t"
  73787. "lsl r6, r6, #16\n\t"
  73788. "adds r3, r3, r6\n\t"
  73789. "adc r4, r4, r7\n\t"
  73790. #else
  73791. "umull r3, r4, %[b], r8\n\t"
  73792. #endif
  73793. "mov r5, #0\n\t"
  73794. "str r3, [%[r]], #4\n\t"
  73795. /* A[1] * B */
  73796. "ldr r8, [%[a]], #4\n\t"
  73797. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  73798. "lsl r6, %[b], #16\n\t"
  73799. "lsl r7, r8, #16\n\t"
  73800. "lsr r6, r6, #16\n\t"
  73801. "lsr r7, r7, #16\n\t"
  73802. "mul r7, r6, r7\n\t"
  73803. "adds r4, r4, r7\n\t"
  73804. "adcs r5, r5, #0\n\t"
  73805. "mov r3, #0\n\t"
  73806. "adc r3, r3, #0\n\t"
  73807. "lsr r7, r8, #16\n\t"
  73808. "mul r6, r7, r6\n\t"
  73809. "lsr r7, r6, #16\n\t"
  73810. "lsl r6, r6, #16\n\t"
  73811. "adds r4, r4, r6\n\t"
  73812. "adcs r5, r5, r7\n\t"
  73813. "adc r3, r3, #0\n\t"
  73814. "lsr r6, %[b], #16\n\t"
  73815. "lsr r7, r8, #16\n\t"
  73816. "mul r7, r6, r7\n\t"
  73817. "adds r5, r5, r7\n\t"
  73818. "adc r3, r3, #0\n\t"
  73819. "lsl r7, r8, #16\n\t"
  73820. "lsr r7, r7, #16\n\t"
  73821. "mul r6, r7, r6\n\t"
  73822. "lsr r7, r6, #16\n\t"
  73823. "lsl r6, r6, #16\n\t"
  73824. "adds r4, r4, r6\n\t"
  73825. "adcs r5, r5, r7\n\t"
  73826. "adc r3, r3, #0\n\t"
  73827. #else
  73828. "umull r6, r7, %[b], r8\n\t"
  73829. "adds r4, r4, r6\n\t"
  73830. "adcs r5, r5, r7\n\t"
  73831. "mov r3, #0\n\t"
  73832. "adc r3, r3, #0\n\t"
  73833. #endif
  73834. "str r4, [%[r]], #4\n\t"
  73835. /* A[2] * B */
  73836. "ldr r8, [%[a]], #4\n\t"
  73837. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  73838. "lsl r6, %[b], #16\n\t"
  73839. "lsl r7, r8, #16\n\t"
  73840. "lsr r6, r6, #16\n\t"
  73841. "lsr r7, r7, #16\n\t"
  73842. "mul r7, r6, r7\n\t"
  73843. "adds r5, r5, r7\n\t"
  73844. "adcs r3, r3, #0\n\t"
  73845. "mov r4, #0\n\t"
  73846. "adc r4, r4, #0\n\t"
  73847. "lsr r7, r8, #16\n\t"
  73848. "mul r6, r7, r6\n\t"
  73849. "lsr r7, r6, #16\n\t"
  73850. "lsl r6, r6, #16\n\t"
  73851. "adds r5, r5, r6\n\t"
  73852. "adcs r3, r3, r7\n\t"
  73853. "adc r4, r4, #0\n\t"
  73854. "lsr r6, %[b], #16\n\t"
  73855. "lsr r7, r8, #16\n\t"
  73856. "mul r7, r6, r7\n\t"
  73857. "adds r3, r3, r7\n\t"
  73858. "adc r4, r4, #0\n\t"
  73859. "lsl r7, r8, #16\n\t"
  73860. "lsr r7, r7, #16\n\t"
  73861. "mul r6, r7, r6\n\t"
  73862. "lsr r7, r6, #16\n\t"
  73863. "lsl r6, r6, #16\n\t"
  73864. "adds r5, r5, r6\n\t"
  73865. "adcs r3, r3, r7\n\t"
  73866. "adc r4, r4, #0\n\t"
  73867. #else
  73868. "umull r6, r7, %[b], r8\n\t"
  73869. "adds r5, r5, r6\n\t"
  73870. "adcs r3, r3, r7\n\t"
  73871. "mov r4, #0\n\t"
  73872. "adc r4, r4, #0\n\t"
  73873. #endif
  73874. "str r5, [%[r]], #4\n\t"
  73875. /* A[3] * B */
  73876. "ldr r8, [%[a]], #4\n\t"
  73877. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  73878. "lsl r6, %[b], #16\n\t"
  73879. "lsl r7, r8, #16\n\t"
  73880. "lsr r6, r6, #16\n\t"
  73881. "lsr r7, r7, #16\n\t"
  73882. "mul r7, r6, r7\n\t"
  73883. "adds r3, r3, r7\n\t"
  73884. "adcs r4, r4, #0\n\t"
  73885. "mov r5, #0\n\t"
  73886. "adc r5, r5, #0\n\t"
  73887. "lsr r7, r8, #16\n\t"
  73888. "mul r6, r7, r6\n\t"
  73889. "lsr r7, r6, #16\n\t"
  73890. "lsl r6, r6, #16\n\t"
  73891. "adds r3, r3, r6\n\t"
  73892. "adcs r4, r4, r7\n\t"
  73893. "adc r5, r5, #0\n\t"
  73894. "lsr r6, %[b], #16\n\t"
  73895. "lsr r7, r8, #16\n\t"
  73896. "mul r7, r6, r7\n\t"
  73897. "adds r4, r4, r7\n\t"
  73898. "adc r5, r5, #0\n\t"
  73899. "lsl r7, r8, #16\n\t"
  73900. "lsr r7, r7, #16\n\t"
  73901. "mul r6, r7, r6\n\t"
  73902. "lsr r7, r6, #16\n\t"
  73903. "lsl r6, r6, #16\n\t"
  73904. "adds r3, r3, r6\n\t"
  73905. "adcs r4, r4, r7\n\t"
  73906. "adc r5, r5, #0\n\t"
  73907. #else
  73908. "umull r6, r7, %[b], r8\n\t"
  73909. "adds r3, r3, r6\n\t"
  73910. "adcs r4, r4, r7\n\t"
  73911. "mov r5, #0\n\t"
  73912. "adc r5, r5, #0\n\t"
  73913. #endif
  73914. "str r3, [%[r]], #4\n\t"
  73915. /* A[4] * B */
  73916. "ldr r8, [%[a]], #4\n\t"
  73917. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  73918. "lsl r6, %[b], #16\n\t"
  73919. "lsl r7, r8, #16\n\t"
  73920. "lsr r6, r6, #16\n\t"
  73921. "lsr r7, r7, #16\n\t"
  73922. "mul r7, r6, r7\n\t"
  73923. "adds r4, r4, r7\n\t"
  73924. "adcs r5, r5, #0\n\t"
  73925. "mov r3, #0\n\t"
  73926. "adc r3, r3, #0\n\t"
  73927. "lsr r7, r8, #16\n\t"
  73928. "mul r6, r7, r6\n\t"
  73929. "lsr r7, r6, #16\n\t"
  73930. "lsl r6, r6, #16\n\t"
  73931. "adds r4, r4, r6\n\t"
  73932. "adcs r5, r5, r7\n\t"
  73933. "adc r3, r3, #0\n\t"
  73934. "lsr r6, %[b], #16\n\t"
  73935. "lsr r7, r8, #16\n\t"
  73936. "mul r7, r6, r7\n\t"
  73937. "adds r5, r5, r7\n\t"
  73938. "adc r3, r3, #0\n\t"
  73939. "lsl r7, r8, #16\n\t"
  73940. "lsr r7, r7, #16\n\t"
  73941. "mul r6, r7, r6\n\t"
  73942. "lsr r7, r6, #16\n\t"
  73943. "lsl r6, r6, #16\n\t"
  73944. "adds r4, r4, r6\n\t"
  73945. "adcs r5, r5, r7\n\t"
  73946. "adc r3, r3, #0\n\t"
  73947. #else
  73948. "umull r6, r7, %[b], r8\n\t"
  73949. "adds r4, r4, r6\n\t"
  73950. "adcs r5, r5, r7\n\t"
  73951. "mov r3, #0\n\t"
  73952. "adc r3, r3, #0\n\t"
  73953. #endif
  73954. "str r4, [%[r]], #4\n\t"
  73955. /* A[5] * B */
  73956. "ldr r8, [%[a]], #4\n\t"
  73957. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  73958. "lsl r6, %[b], #16\n\t"
  73959. "lsl r7, r8, #16\n\t"
  73960. "lsr r6, r6, #16\n\t"
  73961. "lsr r7, r7, #16\n\t"
  73962. "mul r7, r6, r7\n\t"
  73963. "adds r5, r5, r7\n\t"
  73964. "adcs r3, r3, #0\n\t"
  73965. "mov r4, #0\n\t"
  73966. "adc r4, r4, #0\n\t"
  73967. "lsr r7, r8, #16\n\t"
  73968. "mul r6, r7, r6\n\t"
  73969. "lsr r7, r6, #16\n\t"
  73970. "lsl r6, r6, #16\n\t"
  73971. "adds r5, r5, r6\n\t"
  73972. "adcs r3, r3, r7\n\t"
  73973. "adc r4, r4, #0\n\t"
  73974. "lsr r6, %[b], #16\n\t"
  73975. "lsr r7, r8, #16\n\t"
  73976. "mul r7, r6, r7\n\t"
  73977. "adds r3, r3, r7\n\t"
  73978. "adc r4, r4, #0\n\t"
  73979. "lsl r7, r8, #16\n\t"
  73980. "lsr r7, r7, #16\n\t"
  73981. "mul r6, r7, r6\n\t"
  73982. "lsr r7, r6, #16\n\t"
  73983. "lsl r6, r6, #16\n\t"
  73984. "adds r5, r5, r6\n\t"
  73985. "adcs r3, r3, r7\n\t"
  73986. "adc r4, r4, #0\n\t"
  73987. #else
  73988. "umull r6, r7, %[b], r8\n\t"
  73989. "adds r5, r5, r6\n\t"
  73990. "adcs r3, r3, r7\n\t"
  73991. "mov r4, #0\n\t"
  73992. "adc r4, r4, #0\n\t"
  73993. #endif
  73994. "str r5, [%[r]], #4\n\t"
  73995. /* A[6] * B */
  73996. "ldr r8, [%[a]], #4\n\t"
  73997. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  73998. "lsl r6, %[b], #16\n\t"
  73999. "lsl r7, r8, #16\n\t"
  74000. "lsr r6, r6, #16\n\t"
  74001. "lsr r7, r7, #16\n\t"
  74002. "mul r7, r6, r7\n\t"
  74003. "adds r3, r3, r7\n\t"
  74004. "adcs r4, r4, #0\n\t"
  74005. "mov r5, #0\n\t"
  74006. "adc r5, r5, #0\n\t"
  74007. "lsr r7, r8, #16\n\t"
  74008. "mul r6, r7, r6\n\t"
  74009. "lsr r7, r6, #16\n\t"
  74010. "lsl r6, r6, #16\n\t"
  74011. "adds r3, r3, r6\n\t"
  74012. "adcs r4, r4, r7\n\t"
  74013. "adc r5, r5, #0\n\t"
  74014. "lsr r6, %[b], #16\n\t"
  74015. "lsr r7, r8, #16\n\t"
  74016. "mul r7, r6, r7\n\t"
  74017. "adds r4, r4, r7\n\t"
  74018. "adc r5, r5, #0\n\t"
  74019. "lsl r7, r8, #16\n\t"
  74020. "lsr r7, r7, #16\n\t"
  74021. "mul r6, r7, r6\n\t"
  74022. "lsr r7, r6, #16\n\t"
  74023. "lsl r6, r6, #16\n\t"
  74024. "adds r3, r3, r6\n\t"
  74025. "adcs r4, r4, r7\n\t"
  74026. "adc r5, r5, #0\n\t"
  74027. #else
  74028. "umull r6, r7, %[b], r8\n\t"
  74029. "adds r3, r3, r6\n\t"
  74030. "adcs r4, r4, r7\n\t"
  74031. "mov r5, #0\n\t"
  74032. "adc r5, r5, #0\n\t"
  74033. #endif
  74034. "str r3, [%[r]], #4\n\t"
  74035. /* A[7] * B */
  74036. "ldr r8, [%[a]], #4\n\t"
  74037. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  74038. "lsl r6, %[b], #16\n\t"
  74039. "lsl r7, r8, #16\n\t"
  74040. "lsr r6, r6, #16\n\t"
  74041. "lsr r7, r7, #16\n\t"
  74042. "mul r7, r6, r7\n\t"
  74043. "adds r4, r4, r7\n\t"
  74044. "adc r5, r5, #0\n\t"
  74045. "lsr r7, r8, #16\n\t"
  74046. "mul r6, r7, r6\n\t"
  74047. "lsr r7, r6, #16\n\t"
  74048. "lsl r6, r6, #16\n\t"
  74049. "adds r4, r4, r6\n\t"
  74050. "adc r5, r5, r7\n\t"
  74051. "lsr r6, %[b], #16\n\t"
  74052. "lsr r7, r8, #16\n\t"
  74053. "mul r7, r6, r7\n\t"
  74054. "add r5, r5, r7\n\t"
  74055. "lsl r7, r8, #16\n\t"
  74056. "lsr r7, r7, #16\n\t"
  74057. "mul r6, r7, r6\n\t"
  74058. "lsr r7, r6, #16\n\t"
  74059. "lsl r6, r6, #16\n\t"
  74060. "adds r4, r4, r6\n\t"
  74061. "adc r5, r5, r7\n\t"
  74062. #else
  74063. "umull r6, r7, %[b], r8\n\t"
  74064. "adds r4, r4, r6\n\t"
  74065. "adc r5, r5, r7\n\t"
  74066. #endif
  74067. "str r4, [%[r]], #4\n\t"
  74068. "str r5, [%[r]]\n\t"
  74069. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  74070. :
  74071. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10"
  74072. );
  74073. }
  74074. #endif /* WOLFSSL_SP_SMALL */
  74075. #ifdef WOLFSSL_SP_USE_UDIV
  74076. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  74077. *
  74078. * d1 The high order half of the number to divide.
  74079. * d0 The low order half of the number to divide.
  74080. * div The divisor.
  74081. * returns the result of the division.
  74082. *
  74083. * Note that this is an approximate div. It may give an answer 1 larger.
  74084. */
  74085. static sp_digit div_256_word_8(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  74086. {
  74087. register sp_digit d1 asm ("r0") = d1_p;
  74088. register sp_digit d0 asm ("r1") = d0_p;
  74089. register sp_digit div asm ("r2") = div_p;
  74090. __asm__ __volatile__ (
  74091. "lsr r6, %[div], #16\n\t"
  74092. "add lr, r6, #1\n\t"
  74093. "udiv r4, %[d1], lr\n\t"
  74094. "lsl r5, %[div], #16\n\t"
  74095. "lsl r4, r4, #16\n\t"
  74096. "umull r3, r12, %[div], r4\n\t"
  74097. "subs %[d0], %[d0], r3\n\t"
  74098. "sbc %[d1], %[d1], r12\n\t"
  74099. "subs r3, %[d1], lr\n\t"
  74100. "sbc r7, r7, r7\n\t"
  74101. "add r7, r7, #1\n\t"
  74102. "rsb r8, r7, #0\n\t"
  74103. "lsl r7, r7, #16\n\t"
  74104. "and r5, r5, r8\n\t"
  74105. "and r6, r6, r8\n\t"
  74106. "subs %[d0], %[d0], r5\n\t"
  74107. "add r4, r4, r7\n\t"
  74108. "sbc %[d1], %[d1], r6\n\t"
  74109. "lsl r12, %[d1], #16\n\t"
  74110. "lsr r3, %[d0], #16\n\t"
  74111. "orr r3, r3, r12\n\t"
  74112. "udiv r3, r3, lr\n\t"
  74113. "add r4, r4, r3\n\t"
  74114. "umull r3, r12, %[div], r3\n\t"
  74115. "subs %[d0], %[d0], r3\n\t"
  74116. "sbc %[d1], %[d1], r12\n\t"
  74117. "lsl r12, %[d1], #16\n\t"
  74118. "lsr r3, %[d0], #16\n\t"
  74119. "orr r3, r3, r12\n\t"
  74120. "udiv r3, r3, lr\n\t"
  74121. "add r4, r4, r3\n\t"
  74122. "mul r3, %[div], r3\n\t"
  74123. "sub %[d0], %[d0], r3\n\t"
  74124. "udiv r3, %[d0], %[div]\n\t"
  74125. "add %[d1], r4, r3\n\t"
  74126. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  74127. :
  74128. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  74129. );
  74130. return (uint32_t)(size_t)d1;
  74131. }
  74132. #else
  74133. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  74134. *
  74135. * d1 The high order half of the number to divide.
  74136. * d0 The low order half of the number to divide.
  74137. * div The divisor.
  74138. * returns the result of the division.
  74139. *
  74140. * Note that this is an approximate div. It may give an answer 1 larger.
  74141. */
  74142. static sp_digit div_256_word_8(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  74143. {
  74144. register sp_digit d1 asm ("r0") = d1_p;
  74145. register sp_digit d0 asm ("r1") = d0_p;
  74146. register sp_digit div asm ("r2") = div_p;
  74147. __asm__ __volatile__ (
  74148. "lsr lr, %[div], #1\n\t"
  74149. "add lr, lr, #1\n\t"
  74150. "mov r4, %[d0]\n\t"
  74151. "mov r5, %[d1]\n\t"
  74152. /* Do top 32 */
  74153. "subs r6, lr, r5\n\t"
  74154. "sbc r6, r6, r6\n\t"
  74155. "mov r3, #0\n\t"
  74156. "sub r3, r3, r6\n\t"
  74157. "and r6, r6, lr\n\t"
  74158. "subs r5, r5, r6\n\t"
  74159. /* Next 30 bits */
  74160. "mov r12, #29\n\t"
  74161. "\n"
  74162. "L_div_256_word_8_bit_%=: \n\t"
  74163. "lsls r4, r4, #1\n\t"
  74164. "adc r5, r5, r5\n\t"
  74165. "subs r6, lr, r5\n\t"
  74166. "sbc r6, r6, r6\n\t"
  74167. "add r3, r3, r3\n\t"
  74168. "sub r3, r3, r6\n\t"
  74169. "and r6, r6, lr\n\t"
  74170. "subs r5, r5, r6\n\t"
  74171. "subs r12, r12, #1\n\t"
  74172. "bpl L_div_256_word_8_bit_%=\n\t"
  74173. "add r3, r3, r3\n\t"
  74174. "add r3, r3, #1\n\t"
  74175. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  74176. "lsl r7, r3, #16\n\t"
  74177. "lsl r4, %[div], #16\n\t"
  74178. "lsr r7, r7, #16\n\t"
  74179. "lsr r4, r4, #16\n\t"
  74180. "mul r4, r7, r4\n\t"
  74181. "lsr r8, %[div], #16\n\t"
  74182. "mul r7, r8, r7\n\t"
  74183. "lsr r5, r7, #16\n\t"
  74184. "lsl r7, r7, #16\n\t"
  74185. "adds r4, r4, r7\n\t"
  74186. "adc r5, r5, #0\n\t"
  74187. "lsr r7, r3, #16\n\t"
  74188. "mul r8, r7, r8\n\t"
  74189. "add r5, r5, r8\n\t"
  74190. "lsl r8, %[div], #16\n\t"
  74191. "lsr r8, r8, #16\n\t"
  74192. "mul r7, r8, r7\n\t"
  74193. "lsr r8, r7, #16\n\t"
  74194. "lsl r7, r7, #16\n\t"
  74195. "adds r4, r4, r7\n\t"
  74196. "adc r5, r5, r8\n\t"
  74197. #else
  74198. "umull r4, r5, r3, %[div]\n\t"
  74199. #endif
  74200. "subs r7, %[d0], r4\n\t"
  74201. "sbc r8, %[d1], r5\n\t"
  74202. "add r3, r3, r8\n\t"
  74203. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  74204. "lsl r7, r3, #16\n\t"
  74205. "lsl r4, %[div], #16\n\t"
  74206. "lsr r7, r7, #16\n\t"
  74207. "lsr r4, r4, #16\n\t"
  74208. "mul r4, r7, r4\n\t"
  74209. "lsr r8, %[div], #16\n\t"
  74210. "mul r7, r8, r7\n\t"
  74211. "lsr r5, r7, #16\n\t"
  74212. "lsl r7, r7, #16\n\t"
  74213. "adds r4, r4, r7\n\t"
  74214. "adc r5, r5, #0\n\t"
  74215. "lsr r7, r3, #16\n\t"
  74216. "mul r8, r7, r8\n\t"
  74217. "add r5, r5, r8\n\t"
  74218. "lsl r8, %[div], #16\n\t"
  74219. "lsr r8, r8, #16\n\t"
  74220. "mul r7, r8, r7\n\t"
  74221. "lsr r8, r7, #16\n\t"
  74222. "lsl r7, r7, #16\n\t"
  74223. "adds r4, r4, r7\n\t"
  74224. "adc r5, r5, r8\n\t"
  74225. #else
  74226. "umull r4, r5, r3, %[div]\n\t"
  74227. #endif
  74228. "subs r7, %[d0], r4\n\t"
  74229. "sbc r8, %[d1], r5\n\t"
  74230. "add r3, r3, r8\n\t"
  74231. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  74232. "lsl r7, r3, #16\n\t"
  74233. "lsl r4, %[div], #16\n\t"
  74234. "lsr r7, r7, #16\n\t"
  74235. "lsr r4, r4, #16\n\t"
  74236. "mul r4, r7, r4\n\t"
  74237. "lsr r8, %[div], #16\n\t"
  74238. "mul r7, r8, r7\n\t"
  74239. "lsr r5, r7, #16\n\t"
  74240. "lsl r7, r7, #16\n\t"
  74241. "adds r4, r4, r7\n\t"
  74242. "adc r5, r5, #0\n\t"
  74243. "lsr r7, r3, #16\n\t"
  74244. "mul r8, r7, r8\n\t"
  74245. "add r5, r5, r8\n\t"
  74246. "lsl r8, %[div], #16\n\t"
  74247. "lsr r8, r8, #16\n\t"
  74248. "mul r7, r8, r7\n\t"
  74249. "lsr r8, r7, #16\n\t"
  74250. "lsl r7, r7, #16\n\t"
  74251. "adds r4, r4, r7\n\t"
  74252. "adc r5, r5, r8\n\t"
  74253. #else
  74254. "umull r4, r5, r3, %[div]\n\t"
  74255. #endif
  74256. "subs r7, %[d0], r4\n\t"
  74257. "sbc r8, %[d1], r5\n\t"
  74258. "add r3, r3, r8\n\t"
  74259. "subs r6, %[div], r7\n\t"
  74260. "sbc r6, r6, r6\n\t"
  74261. "sub %[d1], r3, r6\n\t"
  74262. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  74263. :
  74264. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  74265. );
  74266. return (uint32_t)(size_t)d1;
  74267. }
  74268. #endif
  74269. /* AND m into each word of a and store in r.
  74270. *
  74271. * r A single precision integer.
  74272. * a A single precision integer.
  74273. * m Mask to AND against each digit.
  74274. */
  74275. static void sp_256_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  74276. {
  74277. #ifdef WOLFSSL_SP_SMALL
  74278. int i;
  74279. for (i=0; i<8; i++) {
  74280. r[i] = a[i] & m;
  74281. }
  74282. #else
  74283. r[0] = a[0] & m;
  74284. r[1] = a[1] & m;
  74285. r[2] = a[2] & m;
  74286. r[3] = a[3] & m;
  74287. r[4] = a[4] & m;
  74288. r[5] = a[5] & m;
  74289. r[6] = a[6] & m;
  74290. r[7] = a[7] & m;
  74291. #endif
  74292. }
  74293. /* Divide d in a and put remainder into r (m*d + r = a)
  74294. * m is not calculated as it is not needed at this time.
  74295. *
  74296. * a Number to be divided.
  74297. * d Number to divide with.
  74298. * m Multiplier result.
  74299. * r Remainder from the division.
  74300. * returns MP_OKAY indicating success.
  74301. */
  74302. static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d, sp_digit* m,
  74303. sp_digit* r)
  74304. {
  74305. sp_digit t1[16], t2[9];
  74306. sp_digit div, r1;
  74307. int i;
  74308. (void)m;
  74309. div = d[7];
  74310. XMEMCPY(t1, a, sizeof(*t1) * 2 * 8);
  74311. r1 = sp_256_cmp_8(&t1[8], d) >= 0;
  74312. sp_256_cond_sub_8(&t1[8], &t1[8], d, (sp_digit)0 - r1);
  74313. for (i = 7; i >= 0; i--) {
  74314. volatile sp_digit mask = (sp_digit)0 - (t1[8 + i] == div);
  74315. sp_digit hi = t1[8 + i] + mask;
  74316. r1 = div_256_word_8(hi, t1[8 + i - 1], div);
  74317. r1 |= mask;
  74318. sp_256_mul_d_8(t2, d, r1);
  74319. t1[8 + i] += sp_256_sub_in_place_8(&t1[i], t2);
  74320. t1[8 + i] -= t2[8];
  74321. sp_256_mask_8(t2, d, t1[8 + i]);
  74322. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  74323. sp_256_mask_8(t2, d, t1[8 + i]);
  74324. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  74325. }
  74326. r1 = sp_256_cmp_8(t1, d) >= 0;
  74327. sp_256_cond_sub_8(r, t1, d, (sp_digit)0 - r1);
  74328. return MP_OKAY;
  74329. }
  74330. /* Reduce a modulo m into r. (r = a mod m)
  74331. *
  74332. * r A single precision number that is the reduced result.
  74333. * a A single precision number that is to be reduced.
  74334. * m A single precision number that is the modulus to reduce with.
  74335. * returns MP_OKAY indicating success.
  74336. */
  74337. static WC_INLINE int sp_256_mod_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  74338. {
  74339. return sp_256_div_8(a, m, NULL, r);
  74340. }
  74341. #endif
  74342. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  74343. /* Multiply two number mod the order of P256 curve. (r = a * b mod order)
  74344. *
  74345. * r Result of the multiplication.
  74346. * a First operand of the multiplication.
  74347. * b Second operand of the multiplication.
  74348. */
  74349. static void sp_256_mont_mul_order_8(sp_digit* r, const sp_digit* a, const sp_digit* b)
  74350. {
  74351. sp_256_mul_8(r, a, b);
  74352. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  74353. }
  74354. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  74355. #ifdef WOLFSSL_SP_SMALL
  74356. /* Order-2 for the P256 curve. */
  74357. static const uint32_t p256_order_minus_2[8] = {
  74358. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU,0xffffffffU,0xffffffffU,
  74359. 0x00000000U,0xffffffffU
  74360. };
  74361. #else
  74362. /* The low half of the order-2 of the P256 curve. */
  74363. static const sp_int_digit p256_order_low[4] = {
  74364. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU
  74365. };
  74366. #endif /* WOLFSSL_SP_SMALL */
  74367. /* Square number mod the order of P256 curve. (r = a * a mod order)
  74368. *
  74369. * r Result of the squaring.
  74370. * a Number to square.
  74371. */
  74372. static void sp_256_mont_sqr_order_8(sp_digit* r, const sp_digit* a)
  74373. {
  74374. sp_256_sqr_8(r, a);
  74375. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  74376. }
  74377. #ifndef WOLFSSL_SP_SMALL
  74378. /* Square number mod the order of P256 curve a number of times.
  74379. * (r = a ^ n mod order)
  74380. *
  74381. * r Result of the squaring.
  74382. * a Number to square.
  74383. */
  74384. static void sp_256_mont_sqr_n_order_8(sp_digit* r, const sp_digit* a, int n)
  74385. {
  74386. int i;
  74387. sp_256_mont_sqr_order_8(r, a);
  74388. for (i=1; i<n; i++) {
  74389. sp_256_mont_sqr_order_8(r, r);
  74390. }
  74391. }
  74392. #endif /* !WOLFSSL_SP_SMALL */
  74393. /* Invert the number, in Montgomery form, modulo the order of the P256 curve.
  74394. * (r = 1 / a mod order)
  74395. *
  74396. * r Inverse result.
  74397. * a Number to invert.
  74398. * td Temporary data.
  74399. */
  74400. #ifdef WOLFSSL_SP_NONBLOCK
  74401. typedef struct sp_256_mont_inv_order_8_ctx {
  74402. int state;
  74403. int i;
  74404. } sp_256_mont_inv_order_8_ctx;
  74405. static int sp_256_mont_inv_order_8_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  74406. sp_digit* t)
  74407. {
  74408. int err = FP_WOULDBLOCK;
  74409. sp_256_mont_inv_order_8_ctx* ctx = (sp_256_mont_inv_order_8_ctx*)sp_ctx;
  74410. typedef char ctx_size_test[sizeof(sp_256_mont_inv_order_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  74411. (void)sizeof(ctx_size_test);
  74412. switch (ctx->state) {
  74413. case 0:
  74414. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  74415. ctx->i = 254;
  74416. ctx->state = 1;
  74417. break;
  74418. case 1:
  74419. sp_256_mont_sqr_order_8(t, t);
  74420. ctx->state = 2;
  74421. break;
  74422. case 2:
  74423. if ((p256_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  74424. sp_256_mont_mul_order_8(t, t, a);
  74425. }
  74426. ctx->i--;
  74427. ctx->state = (ctx->i == 0) ? 3 : 1;
  74428. break;
  74429. case 3:
  74430. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  74431. err = MP_OKAY;
  74432. break;
  74433. }
  74434. return err;
  74435. }
  74436. #endif /* WOLFSSL_SP_NONBLOCK */
  74437. static void sp_256_mont_inv_order_8(sp_digit* r, const sp_digit* a,
  74438. sp_digit* td)
  74439. {
  74440. #ifdef WOLFSSL_SP_SMALL
  74441. sp_digit* t = td;
  74442. int i;
  74443. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  74444. for (i=254; i>=0; i--) {
  74445. sp_256_mont_sqr_order_8(t, t);
  74446. if ((p256_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  74447. sp_256_mont_mul_order_8(t, t, a);
  74448. }
  74449. }
  74450. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  74451. #else
  74452. sp_digit* t = td;
  74453. sp_digit* t2 = td + 2 * 8;
  74454. sp_digit* t3 = td + 4 * 8;
  74455. int i;
  74456. /* t = a^2 */
  74457. sp_256_mont_sqr_order_8(t, a);
  74458. /* t = a^3 = t * a */
  74459. sp_256_mont_mul_order_8(t, t, a);
  74460. /* t2= a^c = t ^ 2 ^ 2 */
  74461. sp_256_mont_sqr_n_order_8(t2, t, 2);
  74462. /* t3= a^f = t2 * t */
  74463. sp_256_mont_mul_order_8(t3, t2, t);
  74464. /* t2= a^f0 = t3 ^ 2 ^ 4 */
  74465. sp_256_mont_sqr_n_order_8(t2, t3, 4);
  74466. /* t = a^ff = t2 * t3 */
  74467. sp_256_mont_mul_order_8(t, t2, t3);
  74468. /* t3= a^ff00 = t ^ 2 ^ 8 */
  74469. sp_256_mont_sqr_n_order_8(t2, t, 8);
  74470. /* t = a^ffff = t2 * t */
  74471. sp_256_mont_mul_order_8(t, t2, t);
  74472. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  74473. sp_256_mont_sqr_n_order_8(t2, t, 16);
  74474. /* t = a^ffffffff = t2 * t */
  74475. sp_256_mont_mul_order_8(t, t2, t);
  74476. /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64 */
  74477. sp_256_mont_sqr_n_order_8(t2, t, 64);
  74478. /* t2= a^ffffffff00000000ffffffff = t2 * t */
  74479. sp_256_mont_mul_order_8(t2, t2, t);
  74480. /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32 */
  74481. sp_256_mont_sqr_n_order_8(t2, t2, 32);
  74482. /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */
  74483. sp_256_mont_mul_order_8(t2, t2, t);
  74484. /* t2= a^ffffffff00000000ffffffffffffffffbce6 */
  74485. for (i=127; i>=112; i--) {
  74486. sp_256_mont_sqr_order_8(t2, t2);
  74487. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  74488. sp_256_mont_mul_order_8(t2, t2, a);
  74489. }
  74490. }
  74491. /* t2= a^ffffffff00000000ffffffffffffffffbce6f */
  74492. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  74493. sp_256_mont_mul_order_8(t2, t2, t3);
  74494. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */
  74495. for (i=107; i>=64; i--) {
  74496. sp_256_mont_sqr_order_8(t2, t2);
  74497. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  74498. sp_256_mont_mul_order_8(t2, t2, a);
  74499. }
  74500. }
  74501. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */
  74502. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  74503. sp_256_mont_mul_order_8(t2, t2, t3);
  74504. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */
  74505. for (i=59; i>=32; i--) {
  74506. sp_256_mont_sqr_order_8(t2, t2);
  74507. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  74508. sp_256_mont_mul_order_8(t2, t2, a);
  74509. }
  74510. }
  74511. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */
  74512. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  74513. sp_256_mont_mul_order_8(t2, t2, t3);
  74514. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */
  74515. for (i=27; i>=0; i--) {
  74516. sp_256_mont_sqr_order_8(t2, t2);
  74517. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  74518. sp_256_mont_mul_order_8(t2, t2, a);
  74519. }
  74520. }
  74521. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */
  74522. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  74523. /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */
  74524. sp_256_mont_mul_order_8(r, t2, t3);
  74525. #endif /* WOLFSSL_SP_SMALL */
  74526. }
  74527. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  74528. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  74529. #ifdef HAVE_ECC_SIGN
  74530. #ifndef SP_ECC_MAX_SIG_GEN
  74531. #define SP_ECC_MAX_SIG_GEN 64
  74532. #endif
  74533. /* Calculate second signature value S from R, k and private value.
  74534. *
  74535. * s = (r * x + e) / k
  74536. *
  74537. * s Signature value.
  74538. * r First signature value.
  74539. * k Ephemeral private key.
  74540. * x Private key as a number.
  74541. * e Hash of message as a number.
  74542. * tmp Temporary storage for intermediate numbers.
  74543. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  74544. */
  74545. static int sp_256_calc_s_8(sp_digit* s, const sp_digit* r, sp_digit* k,
  74546. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  74547. {
  74548. int err;
  74549. sp_digit carry;
  74550. sp_int32 c;
  74551. sp_digit* kInv = k;
  74552. /* Conv k to Montgomery form (mod order) */
  74553. sp_256_mul_8(k, k, p256_norm_order);
  74554. err = sp_256_mod_8(k, k, p256_order);
  74555. if (err == MP_OKAY) {
  74556. sp_256_norm_8(k);
  74557. /* kInv = 1/k mod order */
  74558. sp_256_mont_inv_order_8(kInv, k, tmp);
  74559. sp_256_norm_8(kInv);
  74560. /* s = r * x + e */
  74561. sp_256_mul_8(x, x, r);
  74562. err = sp_256_mod_8(x, x, p256_order);
  74563. }
  74564. if (err == MP_OKAY) {
  74565. sp_256_norm_8(x);
  74566. carry = sp_256_add_8(s, e, x);
  74567. sp_256_cond_sub_8(s, s, p256_order, 0 - carry);
  74568. sp_256_norm_8(s);
  74569. c = sp_256_cmp_8(s, p256_order);
  74570. sp_256_cond_sub_8(s, s, p256_order,
  74571. (sp_digit)0 - (sp_digit)(c >= 0));
  74572. sp_256_norm_8(s);
  74573. /* s = s * k^-1 mod order */
  74574. sp_256_mont_mul_order_8(s, s, kInv);
  74575. sp_256_norm_8(s);
  74576. }
  74577. return err;
  74578. }
  74579. /* Sign the hash using the private key.
  74580. * e = [hash, 256 bits] from binary
  74581. * r = (k.G)->x mod order
  74582. * s = (r * x + e) / k mod order
  74583. * The hash is truncated to the first 256 bits.
  74584. *
  74585. * hash Hash to sign.
  74586. * hashLen Length of the hash data.
  74587. * rng Random number generator.
  74588. * priv Private part of key - scalar.
  74589. * rm First part of result as an mp_int.
  74590. * sm Sirst part of result as an mp_int.
  74591. * heap Heap to use for allocation.
  74592. * returns RNG failures, MEMORY_E when memory allocation fails and
  74593. * MP_OKAY on success.
  74594. */
  74595. int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng,
  74596. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  74597. {
  74598. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  74599. sp_digit* e = NULL;
  74600. sp_point_256* point = NULL;
  74601. #else
  74602. sp_digit e[7 * 2 * 8];
  74603. sp_point_256 point[1];
  74604. #endif
  74605. sp_digit* x = NULL;
  74606. sp_digit* k = NULL;
  74607. sp_digit* r = NULL;
  74608. sp_digit* tmp = NULL;
  74609. sp_digit* s = NULL;
  74610. sp_int32 c;
  74611. int err = MP_OKAY;
  74612. int i;
  74613. (void)heap;
  74614. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  74615. if (err == MP_OKAY) {
  74616. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  74617. DYNAMIC_TYPE_ECC);
  74618. if (point == NULL)
  74619. err = MEMORY_E;
  74620. }
  74621. if (err == MP_OKAY) {
  74622. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 8, heap,
  74623. DYNAMIC_TYPE_ECC);
  74624. if (e == NULL)
  74625. err = MEMORY_E;
  74626. }
  74627. #endif
  74628. if (err == MP_OKAY) {
  74629. x = e + 2 * 8;
  74630. k = e + 4 * 8;
  74631. r = e + 6 * 8;
  74632. tmp = e + 8 * 8;
  74633. s = e;
  74634. if (hashLen > 32U) {
  74635. hashLen = 32U;
  74636. }
  74637. }
  74638. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  74639. /* New random point. */
  74640. if (km == NULL || mp_iszero(km)) {
  74641. err = sp_256_ecc_gen_k_8(rng, k);
  74642. }
  74643. else {
  74644. sp_256_from_mp(k, 8, km);
  74645. mp_zero(km);
  74646. }
  74647. if (err == MP_OKAY) {
  74648. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, heap);
  74649. }
  74650. if (err == MP_OKAY) {
  74651. /* r = point->x mod order */
  74652. XMEMCPY(r, point->x, sizeof(sp_digit) * 8U);
  74653. sp_256_norm_8(r);
  74654. c = sp_256_cmp_8(r, p256_order);
  74655. sp_256_cond_sub_8(r, r, p256_order,
  74656. (sp_digit)0 - (sp_digit)(c >= 0));
  74657. sp_256_norm_8(r);
  74658. sp_256_from_mp(x, 8, priv);
  74659. sp_256_from_bin(e, 8, hash, (int)hashLen);
  74660. err = sp_256_calc_s_8(s, r, k, x, e, tmp);
  74661. }
  74662. /* Check that signature is usable. */
  74663. if ((err == MP_OKAY) && (sp_256_iszero_8(s) == 0)) {
  74664. break;
  74665. }
  74666. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  74667. i = 1;
  74668. #endif
  74669. }
  74670. if (i == 0) {
  74671. err = RNG_FAILURE_E;
  74672. }
  74673. if (err == MP_OKAY) {
  74674. err = sp_256_to_mp(r, rm);
  74675. }
  74676. if (err == MP_OKAY) {
  74677. err = sp_256_to_mp(s, sm);
  74678. }
  74679. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  74680. if (e != NULL)
  74681. #endif
  74682. {
  74683. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 8);
  74684. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  74685. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  74686. #endif
  74687. }
  74688. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  74689. if (point != NULL)
  74690. #endif
  74691. {
  74692. ForceZero(point, sizeof(sp_point_256));
  74693. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  74694. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  74695. #endif
  74696. }
  74697. return err;
  74698. }
  74699. #ifdef WOLFSSL_SP_NONBLOCK
  74700. typedef struct sp_ecc_sign_256_ctx {
  74701. int state;
  74702. union {
  74703. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  74704. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  74705. };
  74706. sp_digit e[2*8];
  74707. sp_digit x[2*8];
  74708. sp_digit k[2*8];
  74709. sp_digit r[2*8];
  74710. sp_digit tmp[3 * 2*8];
  74711. sp_point_256 point;
  74712. sp_digit* s;
  74713. sp_digit* kInv;
  74714. int i;
  74715. } sp_ecc_sign_256_ctx;
  74716. int sp_ecc_sign_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  74717. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  74718. {
  74719. int err = FP_WOULDBLOCK;
  74720. sp_ecc_sign_256_ctx* ctx = (sp_ecc_sign_256_ctx*)sp_ctx->data;
  74721. typedef char ctx_size_test[sizeof(sp_ecc_sign_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  74722. (void)sizeof(ctx_size_test);
  74723. switch (ctx->state) {
  74724. case 0: /* INIT */
  74725. ctx->s = ctx->e;
  74726. ctx->kInv = ctx->k;
  74727. ctx->i = SP_ECC_MAX_SIG_GEN;
  74728. ctx->state = 1;
  74729. break;
  74730. case 1: /* GEN */
  74731. /* New random point. */
  74732. if (km == NULL || mp_iszero(km)) {
  74733. err = sp_256_ecc_gen_k_8(rng, ctx->k);
  74734. }
  74735. else {
  74736. sp_256_from_mp(ctx->k, 8, km);
  74737. mp_zero(km);
  74738. }
  74739. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  74740. ctx->state = 2;
  74741. break;
  74742. case 2: /* MULMOD */
  74743. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  74744. &ctx->point, &p256_base, ctx->k, 1, 1, heap);
  74745. if (err == MP_OKAY) {
  74746. ctx->state = 3;
  74747. }
  74748. break;
  74749. case 3: /* MODORDER */
  74750. {
  74751. sp_int32 c;
  74752. /* r = point->x mod order */
  74753. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 8U);
  74754. sp_256_norm_8(ctx->r);
  74755. c = sp_256_cmp_8(ctx->r, p256_order);
  74756. sp_256_cond_sub_8(ctx->r, ctx->r, p256_order,
  74757. (sp_digit)0 - (sp_digit)(c >= 0));
  74758. sp_256_norm_8(ctx->r);
  74759. if (hashLen > 32U) {
  74760. hashLen = 32U;
  74761. }
  74762. sp_256_from_mp(ctx->x, 8, priv);
  74763. sp_256_from_bin(ctx->e, 8, hash, (int)hashLen);
  74764. ctx->state = 4;
  74765. break;
  74766. }
  74767. case 4: /* KMODORDER */
  74768. /* Conv k to Montgomery form (mod order) */
  74769. sp_256_mul_8(ctx->k, ctx->k, p256_norm_order);
  74770. err = sp_256_mod_8(ctx->k, ctx->k, p256_order);
  74771. if (err == MP_OKAY) {
  74772. sp_256_norm_8(ctx->k);
  74773. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  74774. ctx->state = 5;
  74775. }
  74776. break;
  74777. case 5: /* KINV */
  74778. /* kInv = 1/k mod order */
  74779. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  74780. if (err == MP_OKAY) {
  74781. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  74782. ctx->state = 6;
  74783. }
  74784. break;
  74785. case 6: /* KINVNORM */
  74786. sp_256_norm_8(ctx->kInv);
  74787. ctx->state = 7;
  74788. break;
  74789. case 7: /* R */
  74790. /* s = r * x + e */
  74791. sp_256_mul_8(ctx->x, ctx->x, ctx->r);
  74792. ctx->state = 8;
  74793. break;
  74794. case 8: /* S1 */
  74795. err = sp_256_mod_8(ctx->x, ctx->x, p256_order);
  74796. if (err == MP_OKAY)
  74797. ctx->state = 9;
  74798. break;
  74799. case 9: /* S2 */
  74800. {
  74801. sp_digit carry;
  74802. sp_int32 c;
  74803. sp_256_norm_8(ctx->x);
  74804. carry = sp_256_add_8(ctx->s, ctx->e, ctx->x);
  74805. sp_256_cond_sub_8(ctx->s, ctx->s,
  74806. p256_order, 0 - carry);
  74807. sp_256_norm_8(ctx->s);
  74808. c = sp_256_cmp_8(ctx->s, p256_order);
  74809. sp_256_cond_sub_8(ctx->s, ctx->s, p256_order,
  74810. (sp_digit)0 - (sp_digit)(c >= 0));
  74811. sp_256_norm_8(ctx->s);
  74812. /* s = s * k^-1 mod order */
  74813. sp_256_mont_mul_order_8(ctx->s, ctx->s, ctx->kInv);
  74814. sp_256_norm_8(ctx->s);
  74815. /* Check that signature is usable. */
  74816. if (sp_256_iszero_8(ctx->s) == 0) {
  74817. ctx->state = 10;
  74818. break;
  74819. }
  74820. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  74821. ctx->i = 1;
  74822. #endif
  74823. /* not usable gen, try again */
  74824. ctx->i--;
  74825. if (ctx->i == 0) {
  74826. err = RNG_FAILURE_E;
  74827. }
  74828. ctx->state = 1;
  74829. break;
  74830. }
  74831. case 10: /* RES */
  74832. err = sp_256_to_mp(ctx->r, rm);
  74833. if (err == MP_OKAY) {
  74834. err = sp_256_to_mp(ctx->s, sm);
  74835. }
  74836. break;
  74837. }
  74838. if (err == MP_OKAY && ctx->state != 10) {
  74839. err = FP_WOULDBLOCK;
  74840. }
  74841. if (err != FP_WOULDBLOCK) {
  74842. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 8U);
  74843. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 8U);
  74844. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 8U);
  74845. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 8U);
  74846. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 8U);
  74847. }
  74848. return err;
  74849. }
  74850. #endif /* WOLFSSL_SP_NONBLOCK */
  74851. #endif /* HAVE_ECC_SIGN */
  74852. #ifndef WOLFSSL_SP_SMALL
  74853. static void sp_256_rshift1_8(sp_digit* r_p, const sp_digit* a_p)
  74854. {
  74855. register sp_digit* r asm ("r0") = r_p;
  74856. register const sp_digit* a asm ("r1") = a_p;
  74857. __asm__ __volatile__ (
  74858. "mov r11, #0\n\t"
  74859. "mov r12, #0\n\t"
  74860. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  74861. "ldr r2, [%[a], #16]\n\t"
  74862. "ldr r3, [%[a], #20]\n\t"
  74863. #else
  74864. "ldrd r2, r3, [%[a], #16]\n\t"
  74865. #endif
  74866. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  74867. "ldr r4, [%[a], #24]\n\t"
  74868. "ldr r5, [%[a], #28]\n\t"
  74869. #else
  74870. "ldrd r4, r5, [%[a], #24]\n\t"
  74871. #endif
  74872. "lsr r6, r2, #1\n\t"
  74873. "lsr r7, r3, #1\n\t"
  74874. "lsr r8, r4, #1\n\t"
  74875. "lsr r9, r5, #1\n\t"
  74876. "orr r6, r6, r3, lsl #31\n\t"
  74877. "orr r7, r7, r4, lsl #31\n\t"
  74878. "orr r8, r8, r5, lsl #31\n\t"
  74879. "orr r9, r9, r12, lsl #31\n\t"
  74880. "mov r12, r2\n\t"
  74881. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  74882. "str r6, [%[r], #16]\n\t"
  74883. "str r7, [%[r], #20]\n\t"
  74884. #else
  74885. "strd r6, r7, [%[r], #16]\n\t"
  74886. #endif
  74887. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  74888. "str r8, [%[r], #24]\n\t"
  74889. "str r9, [%[r], #28]\n\t"
  74890. #else
  74891. "strd r8, r9, [%[r], #24]\n\t"
  74892. #endif
  74893. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  74894. "ldr r2, [%[a]]\n\t"
  74895. "ldr r3, [%[a], #4]\n\t"
  74896. #else
  74897. "ldrd r2, r3, [%[a]]\n\t"
  74898. #endif
  74899. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  74900. "ldr r4, [%[a], #8]\n\t"
  74901. "ldr r5, [%[a], #12]\n\t"
  74902. #else
  74903. "ldrd r4, r5, [%[a], #8]\n\t"
  74904. #endif
  74905. "lsr r6, r2, #1\n\t"
  74906. "lsr r7, r3, #1\n\t"
  74907. "lsr r8, r4, #1\n\t"
  74908. "lsr r9, r5, #1\n\t"
  74909. "orr r6, r6, r3, lsl #31\n\t"
  74910. "orr r7, r7, r4, lsl #31\n\t"
  74911. "orr r8, r8, r5, lsl #31\n\t"
  74912. "orr r9, r9, r12, lsl #31\n\t"
  74913. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  74914. "str r6, [%[r]]\n\t"
  74915. "str r7, [%[r], #4]\n\t"
  74916. #else
  74917. "strd r6, r7, [%[r]]\n\t"
  74918. #endif
  74919. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  74920. "str r8, [%[r], #8]\n\t"
  74921. "str r9, [%[r], #12]\n\t"
  74922. #else
  74923. "strd r8, r9, [%[r], #8]\n\t"
  74924. #endif
  74925. : [r] "+r" (r), [a] "+r" (a)
  74926. :
  74927. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "r11"
  74928. );
  74929. }
  74930. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  74931. *
  74932. * r Result of division by 2.
  74933. * a Number to divide.
  74934. * m Modulus.
  74935. */
  74936. static void sp_256_div2_mod_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  74937. {
  74938. register sp_digit* r asm ("r0") = r_p;
  74939. register const sp_digit* a asm ("r1") = a_p;
  74940. register const sp_digit* m asm ("r2") = m_p;
  74941. __asm__ __volatile__ (
  74942. "mov r12, #0\n\t"
  74943. "ldr r4, [%[a]], #4\n\t"
  74944. "ands r3, r4, #1\n\t"
  74945. "beq L_sp_256_div2_mod_8_even_%=\n\t"
  74946. "ldm %[a]!, {r5, r6, r7}\n\t"
  74947. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  74948. "adds r4, r4, r8\n\t"
  74949. "adcs r5, r5, r9\n\t"
  74950. "adcs r6, r6, r10\n\t"
  74951. "adcs r7, r7, r11\n\t"
  74952. "stm %[r], {r4, r5, r6, r7}\n\t"
  74953. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  74954. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  74955. "adcs r4, r4, r8\n\t"
  74956. "adcs r5, r5, r9\n\t"
  74957. "adcs r6, r6, r10\n\t"
  74958. "adcs r7, r7, r11\n\t"
  74959. "adc r3, r12, r12\n\t"
  74960. "b L_sp_256_div2_mod_8_div2_%=\n\t"
  74961. "\n"
  74962. "L_sp_256_div2_mod_8_even_%=: \n\t"
  74963. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  74964. "ldr r4, [%[a], #12]\n\t"
  74965. "ldr r5, [%[a], #16]\n\t"
  74966. #else
  74967. "ldrd r4, r5, [%[a], #12]\n\t"
  74968. #endif
  74969. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  74970. "ldr r6, [%[a], #20]\n\t"
  74971. "ldr r7, [%[a], #24]\n\t"
  74972. #else
  74973. "ldrd r6, r7, [%[a], #20]\n\t"
  74974. #endif
  74975. "\n"
  74976. "L_sp_256_div2_mod_8_div2_%=: \n\t"
  74977. "lsr r8, r4, #1\n\t"
  74978. "and r4, r4, #1\n\t"
  74979. "lsr r9, r5, #1\n\t"
  74980. "lsr r10, r6, #1\n\t"
  74981. "lsr r11, r7, #1\n\t"
  74982. "orr r8, r8, r5, lsl #31\n\t"
  74983. "orr r9, r9, r6, lsl #31\n\t"
  74984. "orr r10, r10, r7, lsl #31\n\t"
  74985. "orr r11, r11, r3, lsl #31\n\t"
  74986. "mov r3, r4\n\t"
  74987. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  74988. "str r8, [%[r], #16]\n\t"
  74989. "str r9, [%[r], #20]\n\t"
  74990. #else
  74991. "strd r8, r9, [%[r], #16]\n\t"
  74992. #endif
  74993. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  74994. "str r10, [%[r], #24]\n\t"
  74995. "str r11, [%[r], #28]\n\t"
  74996. #else
  74997. "strd r10, r11, [%[r], #24]\n\t"
  74998. #endif
  74999. "ldm %[r], {r4, r5, r6, r7}\n\t"
  75000. "lsr r8, r4, #1\n\t"
  75001. "lsr r9, r5, #1\n\t"
  75002. "lsr r10, r6, #1\n\t"
  75003. "lsr r11, r7, #1\n\t"
  75004. "orr r8, r8, r5, lsl #31\n\t"
  75005. "orr r9, r9, r6, lsl #31\n\t"
  75006. "orr r10, r10, r7, lsl #31\n\t"
  75007. "orr r11, r11, r3, lsl #31\n\t"
  75008. "stm %[r], {r8, r9, r10, r11}\n\t"
  75009. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  75010. :
  75011. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  75012. );
  75013. }
  75014. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  75015. static const unsigned char L_sp_256_num_bits_8_table[] = {
  75016. 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03,
  75017. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  75018. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  75019. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  75020. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  75021. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  75022. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  75023. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  75024. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  75025. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  75026. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  75027. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  75028. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  75029. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  75030. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  75031. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  75032. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75033. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75034. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75035. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75036. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75037. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75038. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75039. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75040. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75041. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75042. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75043. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75044. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75045. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75046. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75047. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  75048. };
  75049. static int sp_256_num_bits_8(const sp_digit* a_p)
  75050. {
  75051. register const sp_digit* a asm ("r0") = a_p;
  75052. __asm__ __volatile__ (
  75053. "mov lr, %[L_sp_256_num_bits_8_table]\n\t"
  75054. "ldr r1, [%[a], #28]\n\t"
  75055. "cmp r1, #0\n\t"
  75056. "beq L_sp_256_num_bits_8_7_%=\n\t"
  75057. "lsr r3, r1, #24\n\t"
  75058. "cmp r3, #0\n\t"
  75059. "beq L_sp_256_num_bits_8_7_3_%=\n\t"
  75060. "mov r2, #0xf8\n\t"
  75061. "ldrb r12, [lr, r3]\n\t"
  75062. "add r12, r2, r12\n\t"
  75063. "b L_sp_256_num_bits_8_9_%=\n\t"
  75064. "\n"
  75065. "L_sp_256_num_bits_8_7_3_%=: \n\t"
  75066. "lsr r3, r1, #16\n\t"
  75067. "and r3, r3, #0xff\n\t"
  75068. "cmp r3, #0\n\t"
  75069. "beq L_sp_256_num_bits_8_7_2_%=\n\t"
  75070. "mov r2, #0xf0\n\t"
  75071. "ldrb r12, [lr, r3]\n\t"
  75072. "add r12, r2, r12\n\t"
  75073. "b L_sp_256_num_bits_8_9_%=\n\t"
  75074. "\n"
  75075. "L_sp_256_num_bits_8_7_2_%=: \n\t"
  75076. "lsr r3, r1, #8\n\t"
  75077. "and r3, r3, #0xff\n\t"
  75078. "cmp r3, #0\n\t"
  75079. "beq L_sp_256_num_bits_8_7_1_%=\n\t"
  75080. "mov r2, #0xe8\n\t"
  75081. "ldrb r12, [lr, r3]\n\t"
  75082. "add r12, r2, r12\n\t"
  75083. "b L_sp_256_num_bits_8_9_%=\n\t"
  75084. "\n"
  75085. "L_sp_256_num_bits_8_7_1_%=: \n\t"
  75086. "and r3, r1, #0xff\n\t"
  75087. "mov r2, #0xe0\n\t"
  75088. "ldrb r12, [lr, r3]\n\t"
  75089. "add r12, r2, r12\n\t"
  75090. "b L_sp_256_num_bits_8_9_%=\n\t"
  75091. "\n"
  75092. "L_sp_256_num_bits_8_7_%=: \n\t"
  75093. "ldr r1, [%[a], #24]\n\t"
  75094. "cmp r1, #0\n\t"
  75095. "beq L_sp_256_num_bits_8_6_%=\n\t"
  75096. "lsr r3, r1, #24\n\t"
  75097. "cmp r3, #0\n\t"
  75098. "beq L_sp_256_num_bits_8_6_3_%=\n\t"
  75099. "mov r2, #0xd8\n\t"
  75100. "ldrb r12, [lr, r3]\n\t"
  75101. "add r12, r2, r12\n\t"
  75102. "b L_sp_256_num_bits_8_9_%=\n\t"
  75103. "\n"
  75104. "L_sp_256_num_bits_8_6_3_%=: \n\t"
  75105. "lsr r3, r1, #16\n\t"
  75106. "and r3, r3, #0xff\n\t"
  75107. "cmp r3, #0\n\t"
  75108. "beq L_sp_256_num_bits_8_6_2_%=\n\t"
  75109. "mov r2, #0xd0\n\t"
  75110. "ldrb r12, [lr, r3]\n\t"
  75111. "add r12, r2, r12\n\t"
  75112. "b L_sp_256_num_bits_8_9_%=\n\t"
  75113. "\n"
  75114. "L_sp_256_num_bits_8_6_2_%=: \n\t"
  75115. "lsr r3, r1, #8\n\t"
  75116. "and r3, r3, #0xff\n\t"
  75117. "cmp r3, #0\n\t"
  75118. "beq L_sp_256_num_bits_8_6_1_%=\n\t"
  75119. "mov r2, #0xc8\n\t"
  75120. "ldrb r12, [lr, r3]\n\t"
  75121. "add r12, r2, r12\n\t"
  75122. "b L_sp_256_num_bits_8_9_%=\n\t"
  75123. "\n"
  75124. "L_sp_256_num_bits_8_6_1_%=: \n\t"
  75125. "and r3, r1, #0xff\n\t"
  75126. "mov r2, #0xc0\n\t"
  75127. "ldrb r12, [lr, r3]\n\t"
  75128. "add r12, r2, r12\n\t"
  75129. "b L_sp_256_num_bits_8_9_%=\n\t"
  75130. "\n"
  75131. "L_sp_256_num_bits_8_6_%=: \n\t"
  75132. "ldr r1, [%[a], #20]\n\t"
  75133. "cmp r1, #0\n\t"
  75134. "beq L_sp_256_num_bits_8_5_%=\n\t"
  75135. "lsr r3, r1, #24\n\t"
  75136. "cmp r3, #0\n\t"
  75137. "beq L_sp_256_num_bits_8_5_3_%=\n\t"
  75138. "mov r2, #0xb8\n\t"
  75139. "ldrb r12, [lr, r3]\n\t"
  75140. "add r12, r2, r12\n\t"
  75141. "b L_sp_256_num_bits_8_9_%=\n\t"
  75142. "\n"
  75143. "L_sp_256_num_bits_8_5_3_%=: \n\t"
  75144. "lsr r3, r1, #16\n\t"
  75145. "and r3, r3, #0xff\n\t"
  75146. "cmp r3, #0\n\t"
  75147. "beq L_sp_256_num_bits_8_5_2_%=\n\t"
  75148. "mov r2, #0xb0\n\t"
  75149. "ldrb r12, [lr, r3]\n\t"
  75150. "add r12, r2, r12\n\t"
  75151. "b L_sp_256_num_bits_8_9_%=\n\t"
  75152. "\n"
  75153. "L_sp_256_num_bits_8_5_2_%=: \n\t"
  75154. "lsr r3, r1, #8\n\t"
  75155. "and r3, r3, #0xff\n\t"
  75156. "cmp r3, #0\n\t"
  75157. "beq L_sp_256_num_bits_8_5_1_%=\n\t"
  75158. "mov r2, #0xa8\n\t"
  75159. "ldrb r12, [lr, r3]\n\t"
  75160. "add r12, r2, r12\n\t"
  75161. "b L_sp_256_num_bits_8_9_%=\n\t"
  75162. "\n"
  75163. "L_sp_256_num_bits_8_5_1_%=: \n\t"
  75164. "and r3, r1, #0xff\n\t"
  75165. "mov r2, #0xa0\n\t"
  75166. "ldrb r12, [lr, r3]\n\t"
  75167. "add r12, r2, r12\n\t"
  75168. "b L_sp_256_num_bits_8_9_%=\n\t"
  75169. "\n"
  75170. "L_sp_256_num_bits_8_5_%=: \n\t"
  75171. "ldr r1, [%[a], #16]\n\t"
  75172. "cmp r1, #0\n\t"
  75173. "beq L_sp_256_num_bits_8_4_%=\n\t"
  75174. "lsr r3, r1, #24\n\t"
  75175. "cmp r3, #0\n\t"
  75176. "beq L_sp_256_num_bits_8_4_3_%=\n\t"
  75177. "mov r2, #0x98\n\t"
  75178. "ldrb r12, [lr, r3]\n\t"
  75179. "add r12, r2, r12\n\t"
  75180. "b L_sp_256_num_bits_8_9_%=\n\t"
  75181. "\n"
  75182. "L_sp_256_num_bits_8_4_3_%=: \n\t"
  75183. "lsr r3, r1, #16\n\t"
  75184. "and r3, r3, #0xff\n\t"
  75185. "cmp r3, #0\n\t"
  75186. "beq L_sp_256_num_bits_8_4_2_%=\n\t"
  75187. "mov r2, #0x90\n\t"
  75188. "ldrb r12, [lr, r3]\n\t"
  75189. "add r12, r2, r12\n\t"
  75190. "b L_sp_256_num_bits_8_9_%=\n\t"
  75191. "\n"
  75192. "L_sp_256_num_bits_8_4_2_%=: \n\t"
  75193. "lsr r3, r1, #8\n\t"
  75194. "and r3, r3, #0xff\n\t"
  75195. "cmp r3, #0\n\t"
  75196. "beq L_sp_256_num_bits_8_4_1_%=\n\t"
  75197. "mov r2, #0x88\n\t"
  75198. "ldrb r12, [lr, r3]\n\t"
  75199. "add r12, r2, r12\n\t"
  75200. "b L_sp_256_num_bits_8_9_%=\n\t"
  75201. "\n"
  75202. "L_sp_256_num_bits_8_4_1_%=: \n\t"
  75203. "and r3, r1, #0xff\n\t"
  75204. "mov r2, #0x80\n\t"
  75205. "ldrb r12, [lr, r3]\n\t"
  75206. "add r12, r2, r12\n\t"
  75207. "b L_sp_256_num_bits_8_9_%=\n\t"
  75208. "\n"
  75209. "L_sp_256_num_bits_8_4_%=: \n\t"
  75210. "ldr r1, [%[a], #12]\n\t"
  75211. "cmp r1, #0\n\t"
  75212. "beq L_sp_256_num_bits_8_3_%=\n\t"
  75213. "lsr r3, r1, #24\n\t"
  75214. "cmp r3, #0\n\t"
  75215. "beq L_sp_256_num_bits_8_3_3_%=\n\t"
  75216. "mov r2, #0x78\n\t"
  75217. "ldrb r12, [lr, r3]\n\t"
  75218. "add r12, r2, r12\n\t"
  75219. "b L_sp_256_num_bits_8_9_%=\n\t"
  75220. "\n"
  75221. "L_sp_256_num_bits_8_3_3_%=: \n\t"
  75222. "lsr r3, r1, #16\n\t"
  75223. "and r3, r3, #0xff\n\t"
  75224. "cmp r3, #0\n\t"
  75225. "beq L_sp_256_num_bits_8_3_2_%=\n\t"
  75226. "mov r2, #0x70\n\t"
  75227. "ldrb r12, [lr, r3]\n\t"
  75228. "add r12, r2, r12\n\t"
  75229. "b L_sp_256_num_bits_8_9_%=\n\t"
  75230. "\n"
  75231. "L_sp_256_num_bits_8_3_2_%=: \n\t"
  75232. "lsr r3, r1, #8\n\t"
  75233. "and r3, r3, #0xff\n\t"
  75234. "cmp r3, #0\n\t"
  75235. "beq L_sp_256_num_bits_8_3_1_%=\n\t"
  75236. "mov r2, #0x68\n\t"
  75237. "ldrb r12, [lr, r3]\n\t"
  75238. "add r12, r2, r12\n\t"
  75239. "b L_sp_256_num_bits_8_9_%=\n\t"
  75240. "\n"
  75241. "L_sp_256_num_bits_8_3_1_%=: \n\t"
  75242. "and r3, r1, #0xff\n\t"
  75243. "mov r2, #0x60\n\t"
  75244. "ldrb r12, [lr, r3]\n\t"
  75245. "add r12, r2, r12\n\t"
  75246. "b L_sp_256_num_bits_8_9_%=\n\t"
  75247. "\n"
  75248. "L_sp_256_num_bits_8_3_%=: \n\t"
  75249. "ldr r1, [%[a], #8]\n\t"
  75250. "cmp r1, #0\n\t"
  75251. "beq L_sp_256_num_bits_8_2_%=\n\t"
  75252. "lsr r3, r1, #24\n\t"
  75253. "cmp r3, #0\n\t"
  75254. "beq L_sp_256_num_bits_8_2_3_%=\n\t"
  75255. "mov r2, #0x58\n\t"
  75256. "ldrb r12, [lr, r3]\n\t"
  75257. "add r12, r2, r12\n\t"
  75258. "b L_sp_256_num_bits_8_9_%=\n\t"
  75259. "\n"
  75260. "L_sp_256_num_bits_8_2_3_%=: \n\t"
  75261. "lsr r3, r1, #16\n\t"
  75262. "and r3, r3, #0xff\n\t"
  75263. "cmp r3, #0\n\t"
  75264. "beq L_sp_256_num_bits_8_2_2_%=\n\t"
  75265. "mov r2, #0x50\n\t"
  75266. "ldrb r12, [lr, r3]\n\t"
  75267. "add r12, r2, r12\n\t"
  75268. "b L_sp_256_num_bits_8_9_%=\n\t"
  75269. "\n"
  75270. "L_sp_256_num_bits_8_2_2_%=: \n\t"
  75271. "lsr r3, r1, #8\n\t"
  75272. "and r3, r3, #0xff\n\t"
  75273. "cmp r3, #0\n\t"
  75274. "beq L_sp_256_num_bits_8_2_1_%=\n\t"
  75275. "mov r2, #0x48\n\t"
  75276. "ldrb r12, [lr, r3]\n\t"
  75277. "add r12, r2, r12\n\t"
  75278. "b L_sp_256_num_bits_8_9_%=\n\t"
  75279. "\n"
  75280. "L_sp_256_num_bits_8_2_1_%=: \n\t"
  75281. "and r3, r1, #0xff\n\t"
  75282. "mov r2, #0x40\n\t"
  75283. "ldrb r12, [lr, r3]\n\t"
  75284. "add r12, r2, r12\n\t"
  75285. "b L_sp_256_num_bits_8_9_%=\n\t"
  75286. "\n"
  75287. "L_sp_256_num_bits_8_2_%=: \n\t"
  75288. "ldr r1, [%[a], #4]\n\t"
  75289. "cmp r1, #0\n\t"
  75290. "beq L_sp_256_num_bits_8_1_%=\n\t"
  75291. "lsr r3, r1, #24\n\t"
  75292. "cmp r3, #0\n\t"
  75293. "beq L_sp_256_num_bits_8_1_3_%=\n\t"
  75294. "mov r2, #56\n\t"
  75295. "ldrb r12, [lr, r3]\n\t"
  75296. "add r12, r2, r12\n\t"
  75297. "b L_sp_256_num_bits_8_9_%=\n\t"
  75298. "\n"
  75299. "L_sp_256_num_bits_8_1_3_%=: \n\t"
  75300. "lsr r3, r1, #16\n\t"
  75301. "and r3, r3, #0xff\n\t"
  75302. "cmp r3, #0\n\t"
  75303. "beq L_sp_256_num_bits_8_1_2_%=\n\t"
  75304. "mov r2, #48\n\t"
  75305. "ldrb r12, [lr, r3]\n\t"
  75306. "add r12, r2, r12\n\t"
  75307. "b L_sp_256_num_bits_8_9_%=\n\t"
  75308. "\n"
  75309. "L_sp_256_num_bits_8_1_2_%=: \n\t"
  75310. "lsr r3, r1, #8\n\t"
  75311. "and r3, r3, #0xff\n\t"
  75312. "cmp r3, #0\n\t"
  75313. "beq L_sp_256_num_bits_8_1_1_%=\n\t"
  75314. "mov r2, #40\n\t"
  75315. "ldrb r12, [lr, r3]\n\t"
  75316. "add r12, r2, r12\n\t"
  75317. "b L_sp_256_num_bits_8_9_%=\n\t"
  75318. "\n"
  75319. "L_sp_256_num_bits_8_1_1_%=: \n\t"
  75320. "and r3, r1, #0xff\n\t"
  75321. "mov r2, #32\n\t"
  75322. "ldrb r12, [lr, r3]\n\t"
  75323. "add r12, r2, r12\n\t"
  75324. "b L_sp_256_num_bits_8_9_%=\n\t"
  75325. "\n"
  75326. "L_sp_256_num_bits_8_1_%=: \n\t"
  75327. "ldr r1, [%[a]]\n\t"
  75328. "lsr r3, r1, #24\n\t"
  75329. "cmp r3, #0\n\t"
  75330. "beq L_sp_256_num_bits_8_0_3_%=\n\t"
  75331. "mov r2, #24\n\t"
  75332. "ldrb r12, [lr, r3]\n\t"
  75333. "add r12, r2, r12\n\t"
  75334. "b L_sp_256_num_bits_8_9_%=\n\t"
  75335. "\n"
  75336. "L_sp_256_num_bits_8_0_3_%=: \n\t"
  75337. "lsr r3, r1, #16\n\t"
  75338. "and r3, r3, #0xff\n\t"
  75339. "cmp r3, #0\n\t"
  75340. "beq L_sp_256_num_bits_8_0_2_%=\n\t"
  75341. "mov r2, #16\n\t"
  75342. "ldrb r12, [lr, r3]\n\t"
  75343. "add r12, r2, r12\n\t"
  75344. "b L_sp_256_num_bits_8_9_%=\n\t"
  75345. "\n"
  75346. "L_sp_256_num_bits_8_0_2_%=: \n\t"
  75347. "lsr r3, r1, #8\n\t"
  75348. "and r3, r3, #0xff\n\t"
  75349. "cmp r3, #0\n\t"
  75350. "beq L_sp_256_num_bits_8_0_1_%=\n\t"
  75351. "mov r2, #8\n\t"
  75352. "ldrb r12, [lr, r3]\n\t"
  75353. "add r12, r2, r12\n\t"
  75354. "b L_sp_256_num_bits_8_9_%=\n\t"
  75355. "\n"
  75356. "L_sp_256_num_bits_8_0_1_%=: \n\t"
  75357. "and r3, r1, #0xff\n\t"
  75358. "ldrb r12, [lr, r3]\n\t"
  75359. "\n"
  75360. "L_sp_256_num_bits_8_9_%=: \n\t"
  75361. "mov %[a], r12\n\t"
  75362. : [a] "+r" (a)
  75363. : [L_sp_256_num_bits_8_table] "r" (L_sp_256_num_bits_8_table)
  75364. : "memory", "r1", "r2", "r3", "r12", "lr"
  75365. );
  75366. return (uint32_t)(size_t)a;
  75367. }
  75368. #else
  75369. static int sp_256_num_bits_8(const sp_digit* a_p)
  75370. {
  75371. register const sp_digit* a asm ("r0") = a_p;
  75372. __asm__ __volatile__ (
  75373. "ldr r1, [%[a], #28]\n\t"
  75374. "cmp r1, #0\n\t"
  75375. "beq L_sp_256_num_bits_8_7_%=\n\t"
  75376. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  75377. "mov r2, #0x1\n\t"
  75378. "lsl r2, r2, #8\n\t"
  75379. "add r2, r2, #0x0\n\t"
  75380. #else
  75381. "mov r2, #0x100\n\t"
  75382. #endif
  75383. "clz r12, r1\n\t"
  75384. "sub r12, r2, r12\n\t"
  75385. "b L_sp_256_num_bits_8_9_%=\n\t"
  75386. "\n"
  75387. "L_sp_256_num_bits_8_7_%=: \n\t"
  75388. "ldr r1, [%[a], #24]\n\t"
  75389. "cmp r1, #0\n\t"
  75390. "beq L_sp_256_num_bits_8_6_%=\n\t"
  75391. "mov r2, #0xe0\n\t"
  75392. "clz r12, r1\n\t"
  75393. "sub r12, r2, r12\n\t"
  75394. "b L_sp_256_num_bits_8_9_%=\n\t"
  75395. "\n"
  75396. "L_sp_256_num_bits_8_6_%=: \n\t"
  75397. "ldr r1, [%[a], #20]\n\t"
  75398. "cmp r1, #0\n\t"
  75399. "beq L_sp_256_num_bits_8_5_%=\n\t"
  75400. "mov r2, #0xc0\n\t"
  75401. "clz r12, r1\n\t"
  75402. "sub r12, r2, r12\n\t"
  75403. "b L_sp_256_num_bits_8_9_%=\n\t"
  75404. "\n"
  75405. "L_sp_256_num_bits_8_5_%=: \n\t"
  75406. "ldr r1, [%[a], #16]\n\t"
  75407. "cmp r1, #0\n\t"
  75408. "beq L_sp_256_num_bits_8_4_%=\n\t"
  75409. "mov r2, #0xa0\n\t"
  75410. "clz r12, r1\n\t"
  75411. "sub r12, r2, r12\n\t"
  75412. "b L_sp_256_num_bits_8_9_%=\n\t"
  75413. "\n"
  75414. "L_sp_256_num_bits_8_4_%=: \n\t"
  75415. "ldr r1, [%[a], #12]\n\t"
  75416. "cmp r1, #0\n\t"
  75417. "beq L_sp_256_num_bits_8_3_%=\n\t"
  75418. "mov r2, #0x80\n\t"
  75419. "clz r12, r1\n\t"
  75420. "sub r12, r2, r12\n\t"
  75421. "b L_sp_256_num_bits_8_9_%=\n\t"
  75422. "\n"
  75423. "L_sp_256_num_bits_8_3_%=: \n\t"
  75424. "ldr r1, [%[a], #8]\n\t"
  75425. "cmp r1, #0\n\t"
  75426. "beq L_sp_256_num_bits_8_2_%=\n\t"
  75427. "mov r2, #0x60\n\t"
  75428. "clz r12, r1\n\t"
  75429. "sub r12, r2, r12\n\t"
  75430. "b L_sp_256_num_bits_8_9_%=\n\t"
  75431. "\n"
  75432. "L_sp_256_num_bits_8_2_%=: \n\t"
  75433. "ldr r1, [%[a], #4]\n\t"
  75434. "cmp r1, #0\n\t"
  75435. "beq L_sp_256_num_bits_8_1_%=\n\t"
  75436. "mov r2, #0x40\n\t"
  75437. "clz r12, r1\n\t"
  75438. "sub r12, r2, r12\n\t"
  75439. "b L_sp_256_num_bits_8_9_%=\n\t"
  75440. "\n"
  75441. "L_sp_256_num_bits_8_1_%=: \n\t"
  75442. "ldr r1, [%[a]]\n\t"
  75443. "mov r2, #32\n\t"
  75444. "clz r12, r1\n\t"
  75445. "sub r12, r2, r12\n\t"
  75446. "\n"
  75447. "L_sp_256_num_bits_8_9_%=: \n\t"
  75448. "mov %[a], r12\n\t"
  75449. : [a] "+r" (a)
  75450. :
  75451. : "memory", "r1", "r2", "r3", "r12", "lr"
  75452. );
  75453. return (uint32_t)(size_t)a;
  75454. }
  75455. #endif /* WOLFSSL_SP_ARM_ARCH && (WOLFSSL_SP_ARM_ARCH < 7) */
  75456. /* Non-constant time modular inversion.
  75457. *
  75458. * @param [out] r Resulting number.
  75459. * @param [in] a Number to invert.
  75460. * @param [in] m Modulus.
  75461. * @return MP_OKAY on success.
  75462. */
  75463. static int sp_256_mod_inv_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  75464. {
  75465. sp_digit u[8];
  75466. sp_digit v[8];
  75467. sp_digit b[8];
  75468. sp_digit d[8];
  75469. int ut, vt;
  75470. sp_digit o;
  75471. XMEMCPY(u, m, sizeof(u));
  75472. XMEMCPY(v, a, sizeof(v));
  75473. ut = sp_256_num_bits_8(u);
  75474. vt = sp_256_num_bits_8(v);
  75475. XMEMSET(b, 0, sizeof(b));
  75476. if ((v[0] & 1) == 0) {
  75477. sp_256_rshift1_8(v, v);
  75478. XMEMCPY(d, m, sizeof(u));
  75479. d[0] += 1;
  75480. sp_256_rshift1_8(d, d);
  75481. vt--;
  75482. while ((v[0] & 1) == 0) {
  75483. sp_256_rshift1_8(v, v);
  75484. sp_256_div2_mod_8(d, d, m);
  75485. vt--;
  75486. }
  75487. }
  75488. else {
  75489. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  75490. d[0] = 1;
  75491. }
  75492. while (ut > 1 && vt > 1) {
  75493. if (ut > vt || (ut == vt && sp_256_cmp_8(u, v) >= 0)) {
  75494. sp_256_sub_8(u, u, v);
  75495. o = sp_256_sub_8(b, b, d);
  75496. if (o != 0)
  75497. sp_256_add_8(b, b, m);
  75498. ut = sp_256_num_bits_8(u);
  75499. do {
  75500. sp_256_rshift1_8(u, u);
  75501. sp_256_div2_mod_8(b, b, m);
  75502. ut--;
  75503. }
  75504. while (ut > 0 && (u[0] & 1) == 0);
  75505. }
  75506. else {
  75507. sp_256_sub_8(v, v, u);
  75508. o = sp_256_sub_8(d, d, b);
  75509. if (o != 0)
  75510. sp_256_add_8(d, d, m);
  75511. vt = sp_256_num_bits_8(v);
  75512. do {
  75513. sp_256_rshift1_8(v, v);
  75514. sp_256_div2_mod_8(d, d, m);
  75515. vt--;
  75516. }
  75517. while (vt > 0 && (v[0] & 1) == 0);
  75518. }
  75519. }
  75520. if (ut == 1)
  75521. XMEMCPY(r, b, sizeof(b));
  75522. else
  75523. XMEMCPY(r, d, sizeof(d));
  75524. return MP_OKAY;
  75525. }
  75526. #endif /* WOLFSSL_SP_SMALL */
  75527. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  75528. *
  75529. * p1 First point to add and holds result.
  75530. * p2 Second point to add.
  75531. * tmp Temporary storage for intermediate numbers.
  75532. */
  75533. static void sp_256_add_points_8(sp_point_256* p1, const sp_point_256* p2,
  75534. sp_digit* tmp)
  75535. {
  75536. sp_256_proj_point_add_8(p1, p1, p2, tmp);
  75537. if (sp_256_iszero_8(p1->z)) {
  75538. if (sp_256_iszero_8(p1->x) && sp_256_iszero_8(p1->y)) {
  75539. sp_256_proj_point_dbl_8(p1, p2, tmp);
  75540. }
  75541. else {
  75542. /* Y ordinate is not used from here - don't set. */
  75543. p1->x[0] = 0;
  75544. p1->x[1] = 0;
  75545. p1->x[2] = 0;
  75546. p1->x[3] = 0;
  75547. p1->x[4] = 0;
  75548. p1->x[5] = 0;
  75549. p1->x[6] = 0;
  75550. p1->x[7] = 0;
  75551. XMEMCPY(p1->z, p256_norm_mod, sizeof(p256_norm_mod));
  75552. }
  75553. }
  75554. }
  75555. /* Calculate the verification point: [e/s]G + [r/s]Q
  75556. *
  75557. * p1 Calculated point.
  75558. * p2 Public point and temporary.
  75559. * s Second part of signature as a number.
  75560. * u1 Temporary number.
  75561. * u2 Temproray number.
  75562. * heap Heap to use for allocation.
  75563. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  75564. */
  75565. static int sp_256_calc_vfy_point_8(sp_point_256* p1, sp_point_256* p2,
  75566. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  75567. {
  75568. int err;
  75569. #ifndef WOLFSSL_SP_SMALL
  75570. err = sp_256_mod_inv_8(s, s, p256_order);
  75571. if (err == MP_OKAY)
  75572. #endif /* !WOLFSSL_SP_SMALL */
  75573. {
  75574. sp_256_mul_8(s, s, p256_norm_order);
  75575. err = sp_256_mod_8(s, s, p256_order);
  75576. }
  75577. if (err == MP_OKAY) {
  75578. sp_256_norm_8(s);
  75579. #ifdef WOLFSSL_SP_SMALL
  75580. {
  75581. sp_256_mont_inv_order_8(s, s, tmp);
  75582. sp_256_mont_mul_order_8(u1, u1, s);
  75583. sp_256_mont_mul_order_8(u2, u2, s);
  75584. }
  75585. #else
  75586. {
  75587. sp_256_mont_mul_order_8(u1, u1, s);
  75588. sp_256_mont_mul_order_8(u2, u2, s);
  75589. }
  75590. #endif /* WOLFSSL_SP_SMALL */
  75591. {
  75592. err = sp_256_ecc_mulmod_base_8(p1, u1, 0, 0, heap);
  75593. }
  75594. }
  75595. if ((err == MP_OKAY) && sp_256_iszero_8(p1->z)) {
  75596. p1->infinity = 1;
  75597. }
  75598. if (err == MP_OKAY) {
  75599. err = sp_256_ecc_mulmod_8(p2, p2, u2, 0, 0, heap);
  75600. }
  75601. if ((err == MP_OKAY) && sp_256_iszero_8(p2->z)) {
  75602. p2->infinity = 1;
  75603. }
  75604. if (err == MP_OKAY) {
  75605. sp_256_add_points_8(p1, p2, tmp);
  75606. }
  75607. return err;
  75608. }
  75609. #ifdef HAVE_ECC_VERIFY
  75610. /* Verify the signature values with the hash and public key.
  75611. * e = Truncate(hash, 256)
  75612. * u1 = e/s mod order
  75613. * u2 = r/s mod order
  75614. * r == (u1.G + u2.Q)->x mod order
  75615. * Optimization: Leave point in projective form.
  75616. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  75617. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  75618. * The hash is truncated to the first 256 bits.
  75619. *
  75620. * hash Hash to sign.
  75621. * hashLen Length of the hash data.
  75622. * rng Random number generator.
  75623. * priv Private part of key - scalar.
  75624. * rm First part of result as an mp_int.
  75625. * sm Sirst part of result as an mp_int.
  75626. * heap Heap to use for allocation.
  75627. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  75628. */
  75629. int sp_ecc_verify_256(const byte* hash, word32 hashLen, const mp_int* pX,
  75630. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  75631. int* res, void* heap)
  75632. {
  75633. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75634. sp_digit* u1 = NULL;
  75635. sp_point_256* p1 = NULL;
  75636. #else
  75637. sp_digit u1[18 * 8];
  75638. sp_point_256 p1[2];
  75639. #endif
  75640. sp_digit* u2 = NULL;
  75641. sp_digit* s = NULL;
  75642. sp_digit* tmp = NULL;
  75643. sp_point_256* p2 = NULL;
  75644. sp_digit carry;
  75645. sp_int32 c = 0;
  75646. int err = MP_OKAY;
  75647. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75648. if (err == MP_OKAY) {
  75649. p1 = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  75650. DYNAMIC_TYPE_ECC);
  75651. if (p1 == NULL)
  75652. err = MEMORY_E;
  75653. }
  75654. if (err == MP_OKAY) {
  75655. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 8, heap,
  75656. DYNAMIC_TYPE_ECC);
  75657. if (u1 == NULL)
  75658. err = MEMORY_E;
  75659. }
  75660. #endif
  75661. if (err == MP_OKAY) {
  75662. u2 = u1 + 2 * 8;
  75663. s = u1 + 4 * 8;
  75664. tmp = u1 + 6 * 8;
  75665. p2 = p1 + 1;
  75666. if (hashLen > 32U) {
  75667. hashLen = 32U;
  75668. }
  75669. sp_256_from_bin(u1, 8, hash, (int)hashLen);
  75670. sp_256_from_mp(u2, 8, rm);
  75671. sp_256_from_mp(s, 8, sm);
  75672. sp_256_from_mp(p2->x, 8, pX);
  75673. sp_256_from_mp(p2->y, 8, pY);
  75674. sp_256_from_mp(p2->z, 8, pZ);
  75675. err = sp_256_calc_vfy_point_8(p1, p2, s, u1, u2, tmp, heap);
  75676. }
  75677. if (err == MP_OKAY) {
  75678. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  75679. /* Reload r and convert to Montgomery form. */
  75680. sp_256_from_mp(u2, 8, rm);
  75681. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  75682. }
  75683. if (err == MP_OKAY) {
  75684. /* u1 = r.z'.z' mod prime */
  75685. sp_256_mont_sqr_8(p1->z, p1->z, p256_mod, p256_mp_mod);
  75686. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  75687. *res = (int)(sp_256_cmp_8(p1->x, u1) == 0);
  75688. if (*res == 0) {
  75689. /* Reload r and add order. */
  75690. sp_256_from_mp(u2, 8, rm);
  75691. carry = sp_256_add_8(u2, u2, p256_order);
  75692. /* Carry means result is greater than mod and is not valid. */
  75693. if (carry == 0) {
  75694. sp_256_norm_8(u2);
  75695. /* Compare with mod and if greater or equal then not valid. */
  75696. c = sp_256_cmp_8(u2, p256_mod);
  75697. }
  75698. }
  75699. if ((*res == 0) && (c < 0)) {
  75700. /* Convert to Montogomery form */
  75701. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  75702. if (err == MP_OKAY) {
  75703. /* u1 = (r + 1*order).z'.z' mod prime */
  75704. {
  75705. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  75706. }
  75707. *res = (sp_256_cmp_8(p1->x, u1) == 0);
  75708. }
  75709. }
  75710. }
  75711. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75712. if (u1 != NULL)
  75713. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  75714. if (p1 != NULL)
  75715. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  75716. #endif
  75717. return err;
  75718. }
  75719. #ifdef WOLFSSL_SP_NONBLOCK
  75720. typedef struct sp_ecc_verify_256_ctx {
  75721. int state;
  75722. union {
  75723. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  75724. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  75725. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  75726. sp_256_proj_point_add_8_ctx add_ctx;
  75727. };
  75728. sp_digit u1[2*8];
  75729. sp_digit u2[2*8];
  75730. sp_digit s[2*8];
  75731. sp_digit tmp[2*8 * 6];
  75732. sp_point_256 p1;
  75733. sp_point_256 p2;
  75734. } sp_ecc_verify_256_ctx;
  75735. int sp_ecc_verify_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  75736. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  75737. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  75738. {
  75739. int err = FP_WOULDBLOCK;
  75740. sp_ecc_verify_256_ctx* ctx = (sp_ecc_verify_256_ctx*)sp_ctx->data;
  75741. typedef char ctx_size_test[sizeof(sp_ecc_verify_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  75742. (void)sizeof(ctx_size_test);
  75743. switch (ctx->state) {
  75744. case 0: /* INIT */
  75745. if (hashLen > 32U) {
  75746. hashLen = 32U;
  75747. }
  75748. sp_256_from_bin(ctx->u1, 8, hash, (int)hashLen);
  75749. sp_256_from_mp(ctx->u2, 8, rm);
  75750. sp_256_from_mp(ctx->s, 8, sm);
  75751. sp_256_from_mp(ctx->p2.x, 8, pX);
  75752. sp_256_from_mp(ctx->p2.y, 8, pY);
  75753. sp_256_from_mp(ctx->p2.z, 8, pZ);
  75754. ctx->state = 1;
  75755. break;
  75756. case 1: /* NORMS0 */
  75757. sp_256_mul_8(ctx->s, ctx->s, p256_norm_order);
  75758. err = sp_256_mod_8(ctx->s, ctx->s, p256_order);
  75759. if (err == MP_OKAY)
  75760. ctx->state = 2;
  75761. break;
  75762. case 2: /* NORMS1 */
  75763. sp_256_norm_8(ctx->s);
  75764. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  75765. ctx->state = 3;
  75766. break;
  75767. case 3: /* NORMS2 */
  75768. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  75769. if (err == MP_OKAY) {
  75770. ctx->state = 4;
  75771. }
  75772. break;
  75773. case 4: /* NORMS3 */
  75774. sp_256_mont_mul_order_8(ctx->u1, ctx->u1, ctx->s);
  75775. ctx->state = 5;
  75776. break;
  75777. case 5: /* NORMS4 */
  75778. sp_256_mont_mul_order_8(ctx->u2, ctx->u2, ctx->s);
  75779. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  75780. ctx->state = 6;
  75781. break;
  75782. case 6: /* MULBASE */
  75783. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p256_base, ctx->u1, 0, 0, heap);
  75784. if (err == MP_OKAY) {
  75785. if (sp_256_iszero_8(ctx->p1.z)) {
  75786. ctx->p1.infinity = 1;
  75787. }
  75788. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  75789. ctx->state = 7;
  75790. }
  75791. break;
  75792. case 7: /* MULMOD */
  75793. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  75794. if (err == MP_OKAY) {
  75795. if (sp_256_iszero_8(ctx->p2.z)) {
  75796. ctx->p2.infinity = 1;
  75797. }
  75798. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  75799. ctx->state = 8;
  75800. }
  75801. break;
  75802. case 8: /* ADD */
  75803. err = sp_256_proj_point_add_8_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  75804. if (err == MP_OKAY)
  75805. ctx->state = 9;
  75806. break;
  75807. case 9: /* MONT */
  75808. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  75809. /* Reload r and convert to Montgomery form. */
  75810. sp_256_from_mp(ctx->u2, 8, rm);
  75811. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  75812. if (err == MP_OKAY)
  75813. ctx->state = 10;
  75814. break;
  75815. case 10: /* SQR */
  75816. /* u1 = r.z'.z' mod prime */
  75817. sp_256_mont_sqr_8(ctx->p1.z, ctx->p1.z, p256_mod, p256_mp_mod);
  75818. ctx->state = 11;
  75819. break;
  75820. case 11: /* MUL */
  75821. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod, p256_mp_mod);
  75822. ctx->state = 12;
  75823. break;
  75824. case 12: /* RES */
  75825. {
  75826. sp_int32 c = 0;
  75827. err = MP_OKAY; /* math okay, now check result */
  75828. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  75829. if (*res == 0) {
  75830. sp_digit carry;
  75831. /* Reload r and add order. */
  75832. sp_256_from_mp(ctx->u2, 8, rm);
  75833. carry = sp_256_add_8(ctx->u2, ctx->u2, p256_order);
  75834. /* Carry means result is greater than mod and is not valid. */
  75835. if (carry == 0) {
  75836. sp_256_norm_8(ctx->u2);
  75837. /* Compare with mod and if greater or equal then not valid. */
  75838. c = sp_256_cmp_8(ctx->u2, p256_mod);
  75839. }
  75840. }
  75841. if ((*res == 0) && (c < 0)) {
  75842. /* Convert to Montogomery form */
  75843. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  75844. if (err == MP_OKAY) {
  75845. /* u1 = (r + 1*order).z'.z' mod prime */
  75846. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod,
  75847. p256_mp_mod);
  75848. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  75849. }
  75850. }
  75851. break;
  75852. }
  75853. } /* switch */
  75854. if (err == MP_OKAY && ctx->state != 12) {
  75855. err = FP_WOULDBLOCK;
  75856. }
  75857. return err;
  75858. }
  75859. #endif /* WOLFSSL_SP_NONBLOCK */
  75860. #endif /* HAVE_ECC_VERIFY */
  75861. #ifdef HAVE_ECC_CHECK_KEY
  75862. /* Check that the x and y oridinates are a valid point on the curve.
  75863. *
  75864. * point EC point.
  75865. * heap Heap to use if dynamically allocating.
  75866. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  75867. * not on the curve and MP_OKAY otherwise.
  75868. */
  75869. static int sp_256_ecc_is_point_8(const sp_point_256* point,
  75870. void* heap)
  75871. {
  75872. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75873. sp_digit* t1 = NULL;
  75874. #else
  75875. sp_digit t1[8 * 4];
  75876. #endif
  75877. sp_digit* t2 = NULL;
  75878. int err = MP_OKAY;
  75879. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75880. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8 * 4, heap, DYNAMIC_TYPE_ECC);
  75881. if (t1 == NULL)
  75882. err = MEMORY_E;
  75883. #endif
  75884. (void)heap;
  75885. if (err == MP_OKAY) {
  75886. t2 = t1 + 2 * 8;
  75887. sp_256_sqr_8(t1, point->y);
  75888. (void)sp_256_mod_8(t1, t1, p256_mod);
  75889. sp_256_sqr_8(t2, point->x);
  75890. (void)sp_256_mod_8(t2, t2, p256_mod);
  75891. sp_256_mul_8(t2, t2, point->x);
  75892. (void)sp_256_mod_8(t2, t2, p256_mod);
  75893. (void)sp_256_sub_8(t2, p256_mod, t2);
  75894. sp_256_mont_add_8(t1, t1, t2, p256_mod);
  75895. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  75896. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  75897. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  75898. if (sp_256_cmp_8(t1, p256_b) != 0) {
  75899. err = MP_VAL;
  75900. }
  75901. }
  75902. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75903. if (t1 != NULL)
  75904. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  75905. #endif
  75906. return err;
  75907. }
  75908. /* Check that the x and y oridinates are a valid point on the curve.
  75909. *
  75910. * pX X ordinate of EC point.
  75911. * pY Y ordinate of EC point.
  75912. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  75913. * not on the curve and MP_OKAY otherwise.
  75914. */
  75915. int sp_ecc_is_point_256(const mp_int* pX, const mp_int* pY)
  75916. {
  75917. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75918. sp_point_256* pub = NULL;
  75919. #else
  75920. sp_point_256 pub[1];
  75921. #endif
  75922. const byte one[1] = { 1 };
  75923. int err = MP_OKAY;
  75924. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75925. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  75926. DYNAMIC_TYPE_ECC);
  75927. if (pub == NULL)
  75928. err = MEMORY_E;
  75929. #endif
  75930. if (err == MP_OKAY) {
  75931. sp_256_from_mp(pub->x, 8, pX);
  75932. sp_256_from_mp(pub->y, 8, pY);
  75933. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  75934. err = sp_256_ecc_is_point_8(pub, NULL);
  75935. }
  75936. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75937. if (pub != NULL)
  75938. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  75939. #endif
  75940. return err;
  75941. }
  75942. /* Check that the private scalar generates the EC point (px, py), the point is
  75943. * on the curve and the point has the correct order.
  75944. *
  75945. * pX X ordinate of EC point.
  75946. * pY Y ordinate of EC point.
  75947. * privm Private scalar that generates EC point.
  75948. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  75949. * not on the curve, ECC_INF_E if the point does not have the correct order,
  75950. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  75951. * MP_OKAY otherwise.
  75952. */
  75953. int sp_ecc_check_key_256(const mp_int* pX, const mp_int* pY,
  75954. const mp_int* privm, void* heap)
  75955. {
  75956. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75957. sp_digit* priv = NULL;
  75958. sp_point_256* pub = NULL;
  75959. #else
  75960. sp_digit priv[8];
  75961. sp_point_256 pub[2];
  75962. #endif
  75963. sp_point_256* p = NULL;
  75964. const byte one[1] = { 1 };
  75965. int err = MP_OKAY;
  75966. /* Quick check the lengs of public key ordinates and private key are in
  75967. * range. Proper check later.
  75968. */
  75969. if (((mp_count_bits(pX) > 256) ||
  75970. (mp_count_bits(pY) > 256) ||
  75971. ((privm != NULL) && (mp_count_bits(privm) > 256)))) {
  75972. err = ECC_OUT_OF_RANGE_E;
  75973. }
  75974. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75975. if (err == MP_OKAY) {
  75976. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  75977. DYNAMIC_TYPE_ECC);
  75978. if (pub == NULL)
  75979. err = MEMORY_E;
  75980. }
  75981. if (err == MP_OKAY && privm) {
  75982. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  75983. DYNAMIC_TYPE_ECC);
  75984. if (priv == NULL)
  75985. err = MEMORY_E;
  75986. }
  75987. #endif
  75988. if (err == MP_OKAY) {
  75989. p = pub + 1;
  75990. sp_256_from_mp(pub->x, 8, pX);
  75991. sp_256_from_mp(pub->y, 8, pY);
  75992. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  75993. if (privm)
  75994. sp_256_from_mp(priv, 8, privm);
  75995. /* Check point at infinitiy. */
  75996. if ((sp_256_iszero_8(pub->x) != 0) &&
  75997. (sp_256_iszero_8(pub->y) != 0)) {
  75998. err = ECC_INF_E;
  75999. }
  76000. }
  76001. /* Check range of X and Y */
  76002. if ((err == MP_OKAY) &&
  76003. ((sp_256_cmp_8(pub->x, p256_mod) >= 0) ||
  76004. (sp_256_cmp_8(pub->y, p256_mod) >= 0))) {
  76005. err = ECC_OUT_OF_RANGE_E;
  76006. }
  76007. if (err == MP_OKAY) {
  76008. /* Check point is on curve */
  76009. err = sp_256_ecc_is_point_8(pub, heap);
  76010. }
  76011. if (err == MP_OKAY) {
  76012. /* Point * order = infinity */
  76013. err = sp_256_ecc_mulmod_8(p, pub, p256_order, 1, 1, heap);
  76014. }
  76015. /* Check result is infinity */
  76016. if ((err == MP_OKAY) && ((sp_256_iszero_8(p->x) == 0) ||
  76017. (sp_256_iszero_8(p->y) == 0))) {
  76018. err = ECC_INF_E;
  76019. }
  76020. if (privm) {
  76021. if (err == MP_OKAY) {
  76022. /* Base * private = point */
  76023. err = sp_256_ecc_mulmod_base_8(p, priv, 1, 1, heap);
  76024. }
  76025. /* Check result is public key */
  76026. if ((err == MP_OKAY) &&
  76027. ((sp_256_cmp_8(p->x, pub->x) != 0) ||
  76028. (sp_256_cmp_8(p->y, pub->y) != 0))) {
  76029. err = ECC_PRIV_KEY_E;
  76030. }
  76031. }
  76032. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76033. if (pub != NULL)
  76034. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  76035. if (priv != NULL)
  76036. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  76037. #endif
  76038. return err;
  76039. }
  76040. #endif
  76041. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  76042. /* Add two projective EC points together.
  76043. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  76044. *
  76045. * pX First EC point's X ordinate.
  76046. * pY First EC point's Y ordinate.
  76047. * pZ First EC point's Z ordinate.
  76048. * qX Second EC point's X ordinate.
  76049. * qY Second EC point's Y ordinate.
  76050. * qZ Second EC point's Z ordinate.
  76051. * rX Resultant EC point's X ordinate.
  76052. * rY Resultant EC point's Y ordinate.
  76053. * rZ Resultant EC point's Z ordinate.
  76054. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  76055. */
  76056. int sp_ecc_proj_add_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  76057. mp_int* qX, mp_int* qY, mp_int* qZ,
  76058. mp_int* rX, mp_int* rY, mp_int* rZ)
  76059. {
  76060. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76061. sp_digit* tmp = NULL;
  76062. sp_point_256* p = NULL;
  76063. #else
  76064. sp_digit tmp[2 * 8 * 6];
  76065. sp_point_256 p[2];
  76066. #endif
  76067. sp_point_256* q = NULL;
  76068. int err = MP_OKAY;
  76069. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76070. if (err == MP_OKAY) {
  76071. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, NULL,
  76072. DYNAMIC_TYPE_ECC);
  76073. if (p == NULL)
  76074. err = MEMORY_E;
  76075. }
  76076. if (err == MP_OKAY) {
  76077. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, NULL,
  76078. DYNAMIC_TYPE_ECC);
  76079. if (tmp == NULL) {
  76080. err = MEMORY_E;
  76081. }
  76082. }
  76083. #endif
  76084. if (err == MP_OKAY) {
  76085. q = p + 1;
  76086. sp_256_from_mp(p->x, 8, pX);
  76087. sp_256_from_mp(p->y, 8, pY);
  76088. sp_256_from_mp(p->z, 8, pZ);
  76089. sp_256_from_mp(q->x, 8, qX);
  76090. sp_256_from_mp(q->y, 8, qY);
  76091. sp_256_from_mp(q->z, 8, qZ);
  76092. p->infinity = sp_256_iszero_8(p->x) &
  76093. sp_256_iszero_8(p->y);
  76094. q->infinity = sp_256_iszero_8(q->x) &
  76095. sp_256_iszero_8(q->y);
  76096. sp_256_proj_point_add_8(p, p, q, tmp);
  76097. }
  76098. if (err == MP_OKAY) {
  76099. err = sp_256_to_mp(p->x, rX);
  76100. }
  76101. if (err == MP_OKAY) {
  76102. err = sp_256_to_mp(p->y, rY);
  76103. }
  76104. if (err == MP_OKAY) {
  76105. err = sp_256_to_mp(p->z, rZ);
  76106. }
  76107. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76108. if (tmp != NULL)
  76109. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  76110. if (p != NULL)
  76111. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  76112. #endif
  76113. return err;
  76114. }
  76115. /* Double a projective EC point.
  76116. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  76117. *
  76118. * pX EC point's X ordinate.
  76119. * pY EC point's Y ordinate.
  76120. * pZ EC point's Z ordinate.
  76121. * rX Resultant EC point's X ordinate.
  76122. * rY Resultant EC point's Y ordinate.
  76123. * rZ Resultant EC point's Z ordinate.
  76124. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  76125. */
  76126. int sp_ecc_proj_dbl_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  76127. mp_int* rX, mp_int* rY, mp_int* rZ)
  76128. {
  76129. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76130. sp_digit* tmp = NULL;
  76131. sp_point_256* p = NULL;
  76132. #else
  76133. sp_digit tmp[2 * 8 * 2];
  76134. sp_point_256 p[1];
  76135. #endif
  76136. int err = MP_OKAY;
  76137. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76138. if (err == MP_OKAY) {
  76139. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  76140. DYNAMIC_TYPE_ECC);
  76141. if (p == NULL)
  76142. err = MEMORY_E;
  76143. }
  76144. if (err == MP_OKAY) {
  76145. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 2, NULL,
  76146. DYNAMIC_TYPE_ECC);
  76147. if (tmp == NULL)
  76148. err = MEMORY_E;
  76149. }
  76150. #endif
  76151. if (err == MP_OKAY) {
  76152. sp_256_from_mp(p->x, 8, pX);
  76153. sp_256_from_mp(p->y, 8, pY);
  76154. sp_256_from_mp(p->z, 8, pZ);
  76155. p->infinity = sp_256_iszero_8(p->x) &
  76156. sp_256_iszero_8(p->y);
  76157. sp_256_proj_point_dbl_8(p, p, tmp);
  76158. }
  76159. if (err == MP_OKAY) {
  76160. err = sp_256_to_mp(p->x, rX);
  76161. }
  76162. if (err == MP_OKAY) {
  76163. err = sp_256_to_mp(p->y, rY);
  76164. }
  76165. if (err == MP_OKAY) {
  76166. err = sp_256_to_mp(p->z, rZ);
  76167. }
  76168. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76169. if (tmp != NULL)
  76170. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  76171. if (p != NULL)
  76172. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  76173. #endif
  76174. return err;
  76175. }
  76176. /* Map a projective EC point to affine in place.
  76177. * pZ will be one.
  76178. *
  76179. * pX EC point's X ordinate.
  76180. * pY EC point's Y ordinate.
  76181. * pZ EC point's Z ordinate.
  76182. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  76183. */
  76184. int sp_ecc_map_256(mp_int* pX, mp_int* pY, mp_int* pZ)
  76185. {
  76186. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76187. sp_digit* tmp = NULL;
  76188. sp_point_256* p = NULL;
  76189. #else
  76190. sp_digit tmp[2 * 8 * 4];
  76191. sp_point_256 p[1];
  76192. #endif
  76193. int err = MP_OKAY;
  76194. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76195. if (err == MP_OKAY) {
  76196. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  76197. DYNAMIC_TYPE_ECC);
  76198. if (p == NULL)
  76199. err = MEMORY_E;
  76200. }
  76201. if (err == MP_OKAY) {
  76202. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 4, NULL,
  76203. DYNAMIC_TYPE_ECC);
  76204. if (tmp == NULL)
  76205. err = MEMORY_E;
  76206. }
  76207. #endif
  76208. if (err == MP_OKAY) {
  76209. sp_256_from_mp(p->x, 8, pX);
  76210. sp_256_from_mp(p->y, 8, pY);
  76211. sp_256_from_mp(p->z, 8, pZ);
  76212. p->infinity = sp_256_iszero_8(p->x) &
  76213. sp_256_iszero_8(p->y);
  76214. sp_256_map_8(p, p, tmp);
  76215. }
  76216. if (err == MP_OKAY) {
  76217. err = sp_256_to_mp(p->x, pX);
  76218. }
  76219. if (err == MP_OKAY) {
  76220. err = sp_256_to_mp(p->y, pY);
  76221. }
  76222. if (err == MP_OKAY) {
  76223. err = sp_256_to_mp(p->z, pZ);
  76224. }
  76225. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76226. if (tmp != NULL)
  76227. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  76228. if (p != NULL)
  76229. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  76230. #endif
  76231. return err;
  76232. }
  76233. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  76234. #ifdef HAVE_COMP_KEY
  76235. /* Find the square root of a number mod the prime of the curve.
  76236. *
  76237. * y The number to operate on and the result.
  76238. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  76239. */
  76240. static int sp_256_mont_sqrt_8(sp_digit* y)
  76241. {
  76242. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76243. sp_digit* t1 = NULL;
  76244. #else
  76245. sp_digit t1[4 * 8];
  76246. #endif
  76247. sp_digit* t2 = NULL;
  76248. int err = MP_OKAY;
  76249. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76250. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  76251. if (t1 == NULL) {
  76252. err = MEMORY_E;
  76253. }
  76254. #endif
  76255. if (err == MP_OKAY) {
  76256. t2 = t1 + 2 * 8;
  76257. {
  76258. /* t2 = y ^ 0x2 */
  76259. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  76260. /* t1 = y ^ 0x3 */
  76261. sp_256_mont_mul_8(t1, t2, y, p256_mod, p256_mp_mod);
  76262. /* t2 = y ^ 0xc */
  76263. sp_256_mont_sqr_n_8(t2, t1, 2, p256_mod, p256_mp_mod);
  76264. /* t1 = y ^ 0xf */
  76265. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  76266. /* t2 = y ^ 0xf0 */
  76267. sp_256_mont_sqr_n_8(t2, t1, 4, p256_mod, p256_mp_mod);
  76268. /* t1 = y ^ 0xff */
  76269. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  76270. /* t2 = y ^ 0xff00 */
  76271. sp_256_mont_sqr_n_8(t2, t1, 8, p256_mod, p256_mp_mod);
  76272. /* t1 = y ^ 0xffff */
  76273. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  76274. /* t2 = y ^ 0xffff0000 */
  76275. sp_256_mont_sqr_n_8(t2, t1, 16, p256_mod, p256_mp_mod);
  76276. /* t1 = y ^ 0xffffffff */
  76277. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  76278. /* t1 = y ^ 0xffffffff00000000 */
  76279. sp_256_mont_sqr_n_8(t1, t1, 32, p256_mod, p256_mp_mod);
  76280. /* t1 = y ^ 0xffffffff00000001 */
  76281. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  76282. /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */
  76283. sp_256_mont_sqr_n_8(t1, t1, 96, p256_mod, p256_mp_mod);
  76284. /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */
  76285. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  76286. sp_256_mont_sqr_n_8(y, t1, 94, p256_mod, p256_mp_mod);
  76287. }
  76288. }
  76289. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76290. if (t1 != NULL)
  76291. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  76292. #endif
  76293. return err;
  76294. }
  76295. /* Uncompress the point given the X ordinate.
  76296. *
  76297. * xm X ordinate.
  76298. * odd Whether the Y ordinate is odd.
  76299. * ym Calculated Y ordinate.
  76300. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  76301. */
  76302. int sp_ecc_uncompress_256(mp_int* xm, int odd, mp_int* ym)
  76303. {
  76304. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76305. sp_digit* x = NULL;
  76306. #else
  76307. sp_digit x[4 * 8];
  76308. #endif
  76309. sp_digit* y = NULL;
  76310. int err = MP_OKAY;
  76311. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76312. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  76313. if (x == NULL)
  76314. err = MEMORY_E;
  76315. #endif
  76316. if (err == MP_OKAY) {
  76317. y = x + 2 * 8;
  76318. sp_256_from_mp(x, 8, xm);
  76319. err = sp_256_mod_mul_norm_8(x, x, p256_mod);
  76320. }
  76321. if (err == MP_OKAY) {
  76322. /* y = x^3 */
  76323. {
  76324. sp_256_mont_sqr_8(y, x, p256_mod, p256_mp_mod);
  76325. sp_256_mont_mul_8(y, y, x, p256_mod, p256_mp_mod);
  76326. }
  76327. /* y = x^3 - 3x */
  76328. sp_256_mont_sub_8(y, y, x, p256_mod);
  76329. sp_256_mont_sub_8(y, y, x, p256_mod);
  76330. sp_256_mont_sub_8(y, y, x, p256_mod);
  76331. /* y = x^3 - 3x + b */
  76332. err = sp_256_mod_mul_norm_8(x, p256_b, p256_mod);
  76333. }
  76334. if (err == MP_OKAY) {
  76335. sp_256_mont_add_8(y, y, x, p256_mod);
  76336. /* y = sqrt(x^3 - 3x + b) */
  76337. err = sp_256_mont_sqrt_8(y);
  76338. }
  76339. if (err == MP_OKAY) {
  76340. XMEMSET(y + 8, 0, 8U * sizeof(sp_digit));
  76341. sp_256_mont_reduce_8(y, p256_mod, p256_mp_mod);
  76342. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  76343. sp_256_mont_sub_8(y, p256_mod, y, p256_mod);
  76344. }
  76345. err = sp_256_to_mp(y, ym);
  76346. }
  76347. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  76348. if (x != NULL)
  76349. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  76350. #endif
  76351. return err;
  76352. }
  76353. #endif
  76354. #endif /* !WOLFSSL_SP_NO_256 */
  76355. #ifdef WOLFSSL_SP_384
  76356. /* Point structure to use. */
  76357. typedef struct sp_point_384 {
  76358. /* X ordinate of point. */
  76359. sp_digit x[2 * 12];
  76360. /* Y ordinate of point. */
  76361. sp_digit y[2 * 12];
  76362. /* Z ordinate of point. */
  76363. sp_digit z[2 * 12];
  76364. /* Indicates point is at infinity. */
  76365. int infinity;
  76366. } sp_point_384;
  76367. /* The modulus (prime) of the curve P384. */
  76368. static const sp_digit p384_mod[12] = {
  76369. 0xffffffff,0x00000000,0x00000000,0xffffffff,0xfffffffe,0xffffffff,
  76370. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  76371. };
  76372. /* The Montgomery normalizer for modulus of the curve P384. */
  76373. static const sp_digit p384_norm_mod[12] = {
  76374. 0x00000001,0xffffffff,0xffffffff,0x00000000,0x00000001,0x00000000,
  76375. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  76376. };
  76377. /* The Montgomery multiplier for modulus of the curve P384. */
  76378. static sp_digit p384_mp_mod = 0x00000001;
  76379. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  76380. defined(HAVE_ECC_VERIFY)
  76381. /* The order of the curve P384. */
  76382. static const sp_digit p384_order[12] = {
  76383. 0xccc52973,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  76384. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  76385. };
  76386. #endif
  76387. /* The order of the curve P384 minus 2. */
  76388. static const sp_digit p384_order2[12] = {
  76389. 0xccc52971,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  76390. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  76391. };
  76392. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  76393. /* The Montgomery normalizer for order of the curve P384. */
  76394. static const sp_digit p384_norm_order[12] = {
  76395. 0x333ad68d,0x1313e695,0xb74f5885,0xa7e5f24d,0x0bc8d220,0x389cb27e,
  76396. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  76397. };
  76398. #endif
  76399. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  76400. /* The Montgomery multiplier for order of the curve P384. */
  76401. static sp_digit p384_mp_order = 0xe88fdc45;
  76402. #endif
  76403. /* The base point of curve P384. */
  76404. static const sp_point_384 p384_base = {
  76405. /* X ordinate */
  76406. {
  76407. 0x72760ab7,0x3a545e38,0xbf55296c,0x5502f25d,0x82542a38,0x59f741e0,
  76408. 0x8ba79b98,0x6e1d3b62,0xf320ad74,0x8eb1c71e,0xbe8b0537,0xaa87ca22,
  76409. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  76410. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  76411. (sp_digit)0, (sp_digit)0
  76412. },
  76413. /* Y ordinate */
  76414. {
  76415. 0x90ea0e5f,0x7a431d7c,0x1d7e819d,0x0a60b1ce,0xb5f0b8c0,0xe9da3113,
  76416. 0x289a147c,0xf8f41dbd,0x9292dc29,0x5d9e98bf,0x96262c6f,0x3617de4a,
  76417. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  76418. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  76419. (sp_digit)0, (sp_digit)0
  76420. },
  76421. /* Z ordinate */
  76422. {
  76423. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  76424. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  76425. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  76426. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  76427. (sp_digit)0, (sp_digit)0
  76428. },
  76429. /* infinity */
  76430. 0
  76431. };
  76432. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  76433. static const sp_digit p384_b[12] = {
  76434. 0xd3ec2aef,0x2a85c8ed,0x8a2ed19d,0xc656398d,0x5013875a,0x0314088f,
  76435. 0xfe814112,0x181d9c6e,0xe3f82d19,0x988e056b,0xe23ee7e4,0xb3312fa7
  76436. };
  76437. #endif
  76438. #ifdef WOLFSSL_SP_SMALL
  76439. /* Multiply a and b into r. (r = a * b)
  76440. *
  76441. * r A single precision integer.
  76442. * a A single precision integer.
  76443. * b A single precision integer.
  76444. */
  76445. static void sp_384_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  76446. {
  76447. register sp_digit* r asm ("r0") = r_p;
  76448. register const sp_digit* a asm ("r1") = a_p;
  76449. register const sp_digit* b asm ("r2") = b_p;
  76450. __asm__ __volatile__ (
  76451. "sub sp, sp, #0x60\n\t"
  76452. "mov r5, #0\n\t"
  76453. "mov r6, #0\n\t"
  76454. "mov r7, #0\n\t"
  76455. "mov r8, #0\n\t"
  76456. "\n"
  76457. "L_sp_384_mul_12_outer_%=: \n\t"
  76458. "subs r3, r5, #44\n\t"
  76459. "it cc\n\t"
  76460. "movcc r3, #0\n\t"
  76461. "sub r4, r5, r3\n\t"
  76462. "\n"
  76463. "L_sp_384_mul_12_inner_%=: \n\t"
  76464. "ldr lr, [%[a], r3]\n\t"
  76465. "ldr r11, [%[b], r4]\n\t"
  76466. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76467. "lsl r9, lr, #16\n\t"
  76468. "lsl r10, r11, #16\n\t"
  76469. "lsr r9, r9, #16\n\t"
  76470. "lsr r10, r10, #16\n\t"
  76471. "mul r10, r9, r10\n\t"
  76472. "adds r6, r6, r10\n\t"
  76473. "adcs r7, r7, #0\n\t"
  76474. "adc r8, r8, #0\n\t"
  76475. "lsr r10, r11, #16\n\t"
  76476. "mul r9, r10, r9\n\t"
  76477. "lsr r10, r9, #16\n\t"
  76478. "lsl r9, r9, #16\n\t"
  76479. "adds r6, r6, r9\n\t"
  76480. "adcs r7, r7, r10\n\t"
  76481. "adc r8, r8, #0\n\t"
  76482. "lsr r9, lr, #16\n\t"
  76483. "lsr r10, r11, #16\n\t"
  76484. "mul r10, r9, r10\n\t"
  76485. "adds r7, r7, r10\n\t"
  76486. "adc r8, r8, #0\n\t"
  76487. "lsl r10, r11, #16\n\t"
  76488. "lsr r10, r10, #16\n\t"
  76489. "mul r9, r10, r9\n\t"
  76490. "lsr r10, r9, #16\n\t"
  76491. "lsl r9, r9, #16\n\t"
  76492. "adds r6, r6, r9\n\t"
  76493. "adcs r7, r7, r10\n\t"
  76494. "adc r8, r8, #0\n\t"
  76495. #else
  76496. "umull r9, r10, lr, r11\n\t"
  76497. "adds r6, r6, r9\n\t"
  76498. "adcs r7, r7, r10\n\t"
  76499. "adc r8, r8, #0\n\t"
  76500. #endif
  76501. "add r3, r3, #4\n\t"
  76502. "sub r4, r4, #4\n\t"
  76503. "cmp r3, #48\n\t"
  76504. "beq L_sp_384_mul_12_inner_done_%=\n\t"
  76505. "cmp r3, r5\n\t"
  76506. "ble L_sp_384_mul_12_inner_%=\n\t"
  76507. "\n"
  76508. "L_sp_384_mul_12_inner_done_%=: \n\t"
  76509. "str r6, [sp, r5]\n\t"
  76510. "mov r6, r7\n\t"
  76511. "mov r7, r8\n\t"
  76512. "mov r8, #0\n\t"
  76513. "add r5, r5, #4\n\t"
  76514. "cmp r5, #0x58\n\t"
  76515. "ble L_sp_384_mul_12_outer_%=\n\t"
  76516. "str r6, [sp, r5]\n\t"
  76517. "\n"
  76518. "L_sp_384_mul_12_store_%=: \n\t"
  76519. "ldm sp!, {r6, r7, r8, r9}\n\t"
  76520. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  76521. "subs r5, r5, #16\n\t"
  76522. "bgt L_sp_384_mul_12_store_%=\n\t"
  76523. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  76524. :
  76525. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11"
  76526. );
  76527. }
  76528. #else
  76529. /* Multiply a and b into r. (r = a * b)
  76530. *
  76531. * r A single precision integer.
  76532. * a A single precision integer.
  76533. * b A single precision integer.
  76534. */
  76535. static void sp_384_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  76536. {
  76537. register sp_digit* r asm ("r0") = r_p;
  76538. register const sp_digit* a asm ("r1") = a_p;
  76539. register const sp_digit* b asm ("r2") = b_p;
  76540. __asm__ __volatile__ (
  76541. "sub sp, sp, #48\n\t"
  76542. "mov r10, #0\n\t"
  76543. /* A[0] * B[0] */
  76544. "ldr r11, [%[a]]\n\t"
  76545. "ldr r12, [%[b]]\n\t"
  76546. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76547. "lsl r6, r11, #16\n\t"
  76548. "lsl r3, r12, #16\n\t"
  76549. "lsr r6, r6, #16\n\t"
  76550. "lsr r3, r3, #16\n\t"
  76551. "mul r3, r6, r3\n\t"
  76552. "lsr r7, r12, #16\n\t"
  76553. "mul r6, r7, r6\n\t"
  76554. "lsr r4, r6, #16\n\t"
  76555. "lsl r6, r6, #16\n\t"
  76556. "adds r3, r3, r6\n\t"
  76557. "adc r4, r4, #0\n\t"
  76558. "lsr r6, r11, #16\n\t"
  76559. "mul r7, r6, r7\n\t"
  76560. "add r4, r4, r7\n\t"
  76561. "lsl r7, r12, #16\n\t"
  76562. "lsr r7, r7, #16\n\t"
  76563. "mul r6, r7, r6\n\t"
  76564. "lsr r7, r6, #16\n\t"
  76565. "lsl r6, r6, #16\n\t"
  76566. "adds r3, r3, r6\n\t"
  76567. "adc r4, r4, r7\n\t"
  76568. "mov r5, #0\n\t"
  76569. #else
  76570. "umull r3, r4, r11, r12\n\t"
  76571. "mov r5, #0\n\t"
  76572. #endif
  76573. "str r3, [sp]\n\t"
  76574. /* A[0] * B[1] */
  76575. "ldr r9, [%[b], #4]\n\t"
  76576. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76577. "lsl r6, r11, #16\n\t"
  76578. "lsl r7, r9, #16\n\t"
  76579. "lsr r6, r6, #16\n\t"
  76580. "lsr r7, r7, #16\n\t"
  76581. "mul r7, r6, r7\n\t"
  76582. "adds r4, r4, r7\n\t"
  76583. "adcs r5, r5, #0\n\t"
  76584. "mov r3, #0\n\t"
  76585. "adc r3, r3, #0\n\t"
  76586. "lsr r7, r9, #16\n\t"
  76587. "mul r6, r7, r6\n\t"
  76588. "lsr r7, r6, #16\n\t"
  76589. "lsl r6, r6, #16\n\t"
  76590. "adds r4, r4, r6\n\t"
  76591. "adcs r5, r5, r7\n\t"
  76592. "adc r3, r3, #0\n\t"
  76593. "lsr r6, r11, #16\n\t"
  76594. "lsr r7, r9, #16\n\t"
  76595. "mul r7, r6, r7\n\t"
  76596. "adds r5, r5, r7\n\t"
  76597. "adc r3, r3, #0\n\t"
  76598. "lsl r7, r9, #16\n\t"
  76599. "lsr r7, r7, #16\n\t"
  76600. "mul r6, r7, r6\n\t"
  76601. "lsr r7, r6, #16\n\t"
  76602. "lsl r6, r6, #16\n\t"
  76603. "adds r4, r4, r6\n\t"
  76604. "adcs r5, r5, r7\n\t"
  76605. "adc r3, r3, #0\n\t"
  76606. #else
  76607. "umull r6, r7, r11, r9\n\t"
  76608. "adds r4, r4, r6\n\t"
  76609. "adcs r5, r5, r7\n\t"
  76610. "mov r3, #0\n\t"
  76611. "adc r3, r3, #0\n\t"
  76612. #endif
  76613. /* A[1] * B[0] */
  76614. "ldr r8, [%[a], #4]\n\t"
  76615. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76616. "lsl r6, r8, #16\n\t"
  76617. "lsl r7, r12, #16\n\t"
  76618. "lsr r6, r6, #16\n\t"
  76619. "lsr r7, r7, #16\n\t"
  76620. "mul r7, r6, r7\n\t"
  76621. "adds r4, r4, r7\n\t"
  76622. "adcs r5, r5, #0\n\t"
  76623. "adc r3, r3, #0\n\t"
  76624. "lsr r7, r12, #16\n\t"
  76625. "mul r6, r7, r6\n\t"
  76626. "lsr r7, r6, #16\n\t"
  76627. "lsl r6, r6, #16\n\t"
  76628. "adds r4, r4, r6\n\t"
  76629. "adcs r5, r5, r7\n\t"
  76630. "adc r3, r3, #0\n\t"
  76631. "lsr r6, r8, #16\n\t"
  76632. "lsr r7, r12, #16\n\t"
  76633. "mul r7, r6, r7\n\t"
  76634. "adds r5, r5, r7\n\t"
  76635. "adc r3, r3, #0\n\t"
  76636. "lsl r7, r12, #16\n\t"
  76637. "lsr r7, r7, #16\n\t"
  76638. "mul r6, r7, r6\n\t"
  76639. "lsr r7, r6, #16\n\t"
  76640. "lsl r6, r6, #16\n\t"
  76641. "adds r4, r4, r6\n\t"
  76642. "adcs r5, r5, r7\n\t"
  76643. "adc r3, r3, #0\n\t"
  76644. #else
  76645. "umull r6, r7, r8, r12\n\t"
  76646. "adds r4, r4, r6\n\t"
  76647. "adcs r5, r5, r7\n\t"
  76648. "adc r3, r3, #0\n\t"
  76649. #endif
  76650. "str r4, [sp, #4]\n\t"
  76651. /* A[2] * B[0] */
  76652. "ldr r8, [%[a], #8]\n\t"
  76653. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76654. "lsl r6, r8, #16\n\t"
  76655. "lsl r7, r12, #16\n\t"
  76656. "lsr r6, r6, #16\n\t"
  76657. "lsr r7, r7, #16\n\t"
  76658. "mul r7, r6, r7\n\t"
  76659. "adds r5, r5, r7\n\t"
  76660. "adcs r3, r3, #0\n\t"
  76661. "mov r4, #0\n\t"
  76662. "adc r4, r4, #0\n\t"
  76663. "lsr r7, r12, #16\n\t"
  76664. "mul r6, r7, r6\n\t"
  76665. "lsr r7, r6, #16\n\t"
  76666. "lsl r6, r6, #16\n\t"
  76667. "adds r5, r5, r6\n\t"
  76668. "adcs r3, r3, r7\n\t"
  76669. "adc r4, r4, #0\n\t"
  76670. "lsr r6, r8, #16\n\t"
  76671. "lsr r7, r12, #16\n\t"
  76672. "mul r7, r6, r7\n\t"
  76673. "adds r3, r3, r7\n\t"
  76674. "adc r4, r4, #0\n\t"
  76675. "lsl r7, r12, #16\n\t"
  76676. "lsr r7, r7, #16\n\t"
  76677. "mul r6, r7, r6\n\t"
  76678. "lsr r7, r6, #16\n\t"
  76679. "lsl r6, r6, #16\n\t"
  76680. "adds r5, r5, r6\n\t"
  76681. "adcs r3, r3, r7\n\t"
  76682. "adc r4, r4, #0\n\t"
  76683. #else
  76684. "umull r6, r7, r8, r12\n\t"
  76685. "adds r5, r5, r6\n\t"
  76686. "adcs r3, r3, r7\n\t"
  76687. "mov r4, #0\n\t"
  76688. "adc r4, r4, #0\n\t"
  76689. #endif
  76690. /* A[1] * B[1] */
  76691. "ldr r11, [%[a], #4]\n\t"
  76692. "ldr r12, [%[b], #4]\n\t"
  76693. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76694. "lsl r6, r11, #16\n\t"
  76695. "lsl r7, r12, #16\n\t"
  76696. "lsr r6, r6, #16\n\t"
  76697. "lsr r7, r7, #16\n\t"
  76698. "mul r7, r6, r7\n\t"
  76699. "adds r5, r5, r7\n\t"
  76700. "adcs r3, r3, #0\n\t"
  76701. "adc r4, r4, #0\n\t"
  76702. "lsr r7, r12, #16\n\t"
  76703. "mul r6, r7, r6\n\t"
  76704. "lsr r7, r6, #16\n\t"
  76705. "lsl r6, r6, #16\n\t"
  76706. "adds r5, r5, r6\n\t"
  76707. "adcs r3, r3, r7\n\t"
  76708. "adc r4, r4, #0\n\t"
  76709. "lsr r6, r11, #16\n\t"
  76710. "lsr r7, r12, #16\n\t"
  76711. "mul r7, r6, r7\n\t"
  76712. "adds r3, r3, r7\n\t"
  76713. "adc r4, r4, #0\n\t"
  76714. "lsl r7, r12, #16\n\t"
  76715. "lsr r7, r7, #16\n\t"
  76716. "mul r6, r7, r6\n\t"
  76717. "lsr r7, r6, #16\n\t"
  76718. "lsl r6, r6, #16\n\t"
  76719. "adds r5, r5, r6\n\t"
  76720. "adcs r3, r3, r7\n\t"
  76721. "adc r4, r4, #0\n\t"
  76722. #else
  76723. "umull r6, r7, r11, r12\n\t"
  76724. "adds r5, r5, r6\n\t"
  76725. "adcs r3, r3, r7\n\t"
  76726. "adc r4, r4, #0\n\t"
  76727. #endif
  76728. /* A[0] * B[2] */
  76729. "ldr r8, [%[a]]\n\t"
  76730. "ldr r9, [%[b], #8]\n\t"
  76731. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76732. "lsl r6, r8, #16\n\t"
  76733. "lsl r7, r9, #16\n\t"
  76734. "lsr r6, r6, #16\n\t"
  76735. "lsr r7, r7, #16\n\t"
  76736. "mul r7, r6, r7\n\t"
  76737. "adds r5, r5, r7\n\t"
  76738. "adcs r3, r3, #0\n\t"
  76739. "adc r4, r4, #0\n\t"
  76740. "lsr r7, r9, #16\n\t"
  76741. "mul r6, r7, r6\n\t"
  76742. "lsr r7, r6, #16\n\t"
  76743. "lsl r6, r6, #16\n\t"
  76744. "adds r5, r5, r6\n\t"
  76745. "adcs r3, r3, r7\n\t"
  76746. "adc r4, r4, #0\n\t"
  76747. "lsr r6, r8, #16\n\t"
  76748. "lsr r7, r9, #16\n\t"
  76749. "mul r7, r6, r7\n\t"
  76750. "adds r3, r3, r7\n\t"
  76751. "adc r4, r4, #0\n\t"
  76752. "lsl r7, r9, #16\n\t"
  76753. "lsr r7, r7, #16\n\t"
  76754. "mul r6, r7, r6\n\t"
  76755. "lsr r7, r6, #16\n\t"
  76756. "lsl r6, r6, #16\n\t"
  76757. "adds r5, r5, r6\n\t"
  76758. "adcs r3, r3, r7\n\t"
  76759. "adc r4, r4, #0\n\t"
  76760. #else
  76761. "umull r6, r7, r8, r9\n\t"
  76762. "adds r5, r5, r6\n\t"
  76763. "adcs r3, r3, r7\n\t"
  76764. "adc r4, r4, #0\n\t"
  76765. #endif
  76766. "str r5, [sp, #8]\n\t"
  76767. /* A[0] * B[3] */
  76768. "ldr r9, [%[b], #12]\n\t"
  76769. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76770. "lsl r6, r8, #16\n\t"
  76771. "lsl r7, r9, #16\n\t"
  76772. "lsr r6, r6, #16\n\t"
  76773. "lsr r7, r7, #16\n\t"
  76774. "mul r7, r6, r7\n\t"
  76775. "adds r3, r3, r7\n\t"
  76776. "adcs r4, r4, #0\n\t"
  76777. "mov r5, #0\n\t"
  76778. "adc r5, r5, #0\n\t"
  76779. "lsr r7, r9, #16\n\t"
  76780. "mul r6, r7, r6\n\t"
  76781. "lsr r7, r6, #16\n\t"
  76782. "lsl r6, r6, #16\n\t"
  76783. "adds r3, r3, r6\n\t"
  76784. "adcs r4, r4, r7\n\t"
  76785. "adc r5, r5, #0\n\t"
  76786. "lsr r6, r8, #16\n\t"
  76787. "lsr r7, r9, #16\n\t"
  76788. "mul r7, r6, r7\n\t"
  76789. "adds r4, r4, r7\n\t"
  76790. "adc r5, r5, #0\n\t"
  76791. "lsl r7, r9, #16\n\t"
  76792. "lsr r7, r7, #16\n\t"
  76793. "mul r6, r7, r6\n\t"
  76794. "lsr r7, r6, #16\n\t"
  76795. "lsl r6, r6, #16\n\t"
  76796. "adds r3, r3, r6\n\t"
  76797. "adcs r4, r4, r7\n\t"
  76798. "adc r5, r5, #0\n\t"
  76799. #else
  76800. "umull r6, r7, r8, r9\n\t"
  76801. "adds r3, r3, r6\n\t"
  76802. "adcs r4, r4, r7\n\t"
  76803. "mov r5, #0\n\t"
  76804. "adc r5, r5, #0\n\t"
  76805. #endif
  76806. /* A[1] * B[2] */
  76807. "ldr r9, [%[b], #8]\n\t"
  76808. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76809. "lsl r6, r11, #16\n\t"
  76810. "lsl r7, r9, #16\n\t"
  76811. "lsr r6, r6, #16\n\t"
  76812. "lsr r7, r7, #16\n\t"
  76813. "mul r7, r6, r7\n\t"
  76814. "adds r3, r3, r7\n\t"
  76815. "adcs r4, r4, #0\n\t"
  76816. "adc r5, r5, #0\n\t"
  76817. "lsr r7, r9, #16\n\t"
  76818. "mul r6, r7, r6\n\t"
  76819. "lsr r7, r6, #16\n\t"
  76820. "lsl r6, r6, #16\n\t"
  76821. "adds r3, r3, r6\n\t"
  76822. "adcs r4, r4, r7\n\t"
  76823. "adc r5, r5, #0\n\t"
  76824. "lsr r6, r11, #16\n\t"
  76825. "lsr r7, r9, #16\n\t"
  76826. "mul r7, r6, r7\n\t"
  76827. "adds r4, r4, r7\n\t"
  76828. "adc r5, r5, #0\n\t"
  76829. "lsl r7, r9, #16\n\t"
  76830. "lsr r7, r7, #16\n\t"
  76831. "mul r6, r7, r6\n\t"
  76832. "lsr r7, r6, #16\n\t"
  76833. "lsl r6, r6, #16\n\t"
  76834. "adds r3, r3, r6\n\t"
  76835. "adcs r4, r4, r7\n\t"
  76836. "adc r5, r5, #0\n\t"
  76837. #else
  76838. "umull r6, r7, r11, r9\n\t"
  76839. "adds r3, r3, r6\n\t"
  76840. "adcs r4, r4, r7\n\t"
  76841. "adc r5, r5, #0\n\t"
  76842. #endif
  76843. /* A[2] * B[1] */
  76844. "ldr r8, [%[a], #8]\n\t"
  76845. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76846. "lsl r6, r8, #16\n\t"
  76847. "lsl r7, r12, #16\n\t"
  76848. "lsr r6, r6, #16\n\t"
  76849. "lsr r7, r7, #16\n\t"
  76850. "mul r7, r6, r7\n\t"
  76851. "adds r3, r3, r7\n\t"
  76852. "adcs r4, r4, #0\n\t"
  76853. "adc r5, r5, #0\n\t"
  76854. "lsr r7, r12, #16\n\t"
  76855. "mul r6, r7, r6\n\t"
  76856. "lsr r7, r6, #16\n\t"
  76857. "lsl r6, r6, #16\n\t"
  76858. "adds r3, r3, r6\n\t"
  76859. "adcs r4, r4, r7\n\t"
  76860. "adc r5, r5, #0\n\t"
  76861. "lsr r6, r8, #16\n\t"
  76862. "lsr r7, r12, #16\n\t"
  76863. "mul r7, r6, r7\n\t"
  76864. "adds r4, r4, r7\n\t"
  76865. "adc r5, r5, #0\n\t"
  76866. "lsl r7, r12, #16\n\t"
  76867. "lsr r7, r7, #16\n\t"
  76868. "mul r6, r7, r6\n\t"
  76869. "lsr r7, r6, #16\n\t"
  76870. "lsl r6, r6, #16\n\t"
  76871. "adds r3, r3, r6\n\t"
  76872. "adcs r4, r4, r7\n\t"
  76873. "adc r5, r5, #0\n\t"
  76874. #else
  76875. "umull r6, r7, r8, r12\n\t"
  76876. "adds r3, r3, r6\n\t"
  76877. "adcs r4, r4, r7\n\t"
  76878. "adc r5, r5, #0\n\t"
  76879. #endif
  76880. /* A[3] * B[0] */
  76881. "ldr r8, [%[a], #12]\n\t"
  76882. "ldr r9, [%[b]]\n\t"
  76883. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76884. "lsl r6, r8, #16\n\t"
  76885. "lsl r7, r9, #16\n\t"
  76886. "lsr r6, r6, #16\n\t"
  76887. "lsr r7, r7, #16\n\t"
  76888. "mul r7, r6, r7\n\t"
  76889. "adds r3, r3, r7\n\t"
  76890. "adcs r4, r4, #0\n\t"
  76891. "adc r5, r5, #0\n\t"
  76892. "lsr r7, r9, #16\n\t"
  76893. "mul r6, r7, r6\n\t"
  76894. "lsr r7, r6, #16\n\t"
  76895. "lsl r6, r6, #16\n\t"
  76896. "adds r3, r3, r6\n\t"
  76897. "adcs r4, r4, r7\n\t"
  76898. "adc r5, r5, #0\n\t"
  76899. "lsr r6, r8, #16\n\t"
  76900. "lsr r7, r9, #16\n\t"
  76901. "mul r7, r6, r7\n\t"
  76902. "adds r4, r4, r7\n\t"
  76903. "adc r5, r5, #0\n\t"
  76904. "lsl r7, r9, #16\n\t"
  76905. "lsr r7, r7, #16\n\t"
  76906. "mul r6, r7, r6\n\t"
  76907. "lsr r7, r6, #16\n\t"
  76908. "lsl r6, r6, #16\n\t"
  76909. "adds r3, r3, r6\n\t"
  76910. "adcs r4, r4, r7\n\t"
  76911. "adc r5, r5, #0\n\t"
  76912. #else
  76913. "umull r6, r7, r8, r9\n\t"
  76914. "adds r3, r3, r6\n\t"
  76915. "adcs r4, r4, r7\n\t"
  76916. "adc r5, r5, #0\n\t"
  76917. #endif
  76918. "str r3, [sp, #12]\n\t"
  76919. /* A[4] * B[0] */
  76920. "ldr r8, [%[a], #16]\n\t"
  76921. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76922. "lsl r6, r8, #16\n\t"
  76923. "lsl r7, r9, #16\n\t"
  76924. "lsr r6, r6, #16\n\t"
  76925. "lsr r7, r7, #16\n\t"
  76926. "mul r7, r6, r7\n\t"
  76927. "adds r4, r4, r7\n\t"
  76928. "adcs r5, r5, #0\n\t"
  76929. "mov r3, #0\n\t"
  76930. "adc r3, r3, #0\n\t"
  76931. "lsr r7, r9, #16\n\t"
  76932. "mul r6, r7, r6\n\t"
  76933. "lsr r7, r6, #16\n\t"
  76934. "lsl r6, r6, #16\n\t"
  76935. "adds r4, r4, r6\n\t"
  76936. "adcs r5, r5, r7\n\t"
  76937. "adc r3, r3, #0\n\t"
  76938. "lsr r6, r8, #16\n\t"
  76939. "lsr r7, r9, #16\n\t"
  76940. "mul r7, r6, r7\n\t"
  76941. "adds r5, r5, r7\n\t"
  76942. "adc r3, r3, #0\n\t"
  76943. "lsl r7, r9, #16\n\t"
  76944. "lsr r7, r7, #16\n\t"
  76945. "mul r6, r7, r6\n\t"
  76946. "lsr r7, r6, #16\n\t"
  76947. "lsl r6, r6, #16\n\t"
  76948. "adds r4, r4, r6\n\t"
  76949. "adcs r5, r5, r7\n\t"
  76950. "adc r3, r3, #0\n\t"
  76951. #else
  76952. "umull r6, r7, r8, r9\n\t"
  76953. "adds r4, r4, r6\n\t"
  76954. "adcs r5, r5, r7\n\t"
  76955. "mov r3, #0\n\t"
  76956. "adc r3, r3, #0\n\t"
  76957. #endif
  76958. /* A[3] * B[1] */
  76959. "ldr r8, [%[a], #12]\n\t"
  76960. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76961. "lsl r6, r8, #16\n\t"
  76962. "lsl r7, r12, #16\n\t"
  76963. "lsr r6, r6, #16\n\t"
  76964. "lsr r7, r7, #16\n\t"
  76965. "mul r7, r6, r7\n\t"
  76966. "adds r4, r4, r7\n\t"
  76967. "adcs r5, r5, #0\n\t"
  76968. "adc r3, r3, #0\n\t"
  76969. "lsr r7, r12, #16\n\t"
  76970. "mul r6, r7, r6\n\t"
  76971. "lsr r7, r6, #16\n\t"
  76972. "lsl r6, r6, #16\n\t"
  76973. "adds r4, r4, r6\n\t"
  76974. "adcs r5, r5, r7\n\t"
  76975. "adc r3, r3, #0\n\t"
  76976. "lsr r6, r8, #16\n\t"
  76977. "lsr r7, r12, #16\n\t"
  76978. "mul r7, r6, r7\n\t"
  76979. "adds r5, r5, r7\n\t"
  76980. "adc r3, r3, #0\n\t"
  76981. "lsl r7, r12, #16\n\t"
  76982. "lsr r7, r7, #16\n\t"
  76983. "mul r6, r7, r6\n\t"
  76984. "lsr r7, r6, #16\n\t"
  76985. "lsl r6, r6, #16\n\t"
  76986. "adds r4, r4, r6\n\t"
  76987. "adcs r5, r5, r7\n\t"
  76988. "adc r3, r3, #0\n\t"
  76989. #else
  76990. "umull r6, r7, r8, r12\n\t"
  76991. "adds r4, r4, r6\n\t"
  76992. "adcs r5, r5, r7\n\t"
  76993. "adc r3, r3, #0\n\t"
  76994. #endif
  76995. /* A[2] * B[2] */
  76996. "ldr r11, [%[a], #8]\n\t"
  76997. "ldr r12, [%[b], #8]\n\t"
  76998. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  76999. "lsl r6, r11, #16\n\t"
  77000. "lsl r7, r12, #16\n\t"
  77001. "lsr r6, r6, #16\n\t"
  77002. "lsr r7, r7, #16\n\t"
  77003. "mul r7, r6, r7\n\t"
  77004. "adds r4, r4, r7\n\t"
  77005. "adcs r5, r5, #0\n\t"
  77006. "adc r3, r3, #0\n\t"
  77007. "lsr r7, r12, #16\n\t"
  77008. "mul r6, r7, r6\n\t"
  77009. "lsr r7, r6, #16\n\t"
  77010. "lsl r6, r6, #16\n\t"
  77011. "adds r4, r4, r6\n\t"
  77012. "adcs r5, r5, r7\n\t"
  77013. "adc r3, r3, #0\n\t"
  77014. "lsr r6, r11, #16\n\t"
  77015. "lsr r7, r12, #16\n\t"
  77016. "mul r7, r6, r7\n\t"
  77017. "adds r5, r5, r7\n\t"
  77018. "adc r3, r3, #0\n\t"
  77019. "lsl r7, r12, #16\n\t"
  77020. "lsr r7, r7, #16\n\t"
  77021. "mul r6, r7, r6\n\t"
  77022. "lsr r7, r6, #16\n\t"
  77023. "lsl r6, r6, #16\n\t"
  77024. "adds r4, r4, r6\n\t"
  77025. "adcs r5, r5, r7\n\t"
  77026. "adc r3, r3, #0\n\t"
  77027. #else
  77028. "umull r6, r7, r11, r12\n\t"
  77029. "adds r4, r4, r6\n\t"
  77030. "adcs r5, r5, r7\n\t"
  77031. "adc r3, r3, #0\n\t"
  77032. #endif
  77033. /* A[1] * B[3] */
  77034. "ldr r8, [%[a], #4]\n\t"
  77035. "ldr r9, [%[b], #12]\n\t"
  77036. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77037. "lsl r6, r8, #16\n\t"
  77038. "lsl r7, r9, #16\n\t"
  77039. "lsr r6, r6, #16\n\t"
  77040. "lsr r7, r7, #16\n\t"
  77041. "mul r7, r6, r7\n\t"
  77042. "adds r4, r4, r7\n\t"
  77043. "adcs r5, r5, #0\n\t"
  77044. "adc r3, r3, #0\n\t"
  77045. "lsr r7, r9, #16\n\t"
  77046. "mul r6, r7, r6\n\t"
  77047. "lsr r7, r6, #16\n\t"
  77048. "lsl r6, r6, #16\n\t"
  77049. "adds r4, r4, r6\n\t"
  77050. "adcs r5, r5, r7\n\t"
  77051. "adc r3, r3, #0\n\t"
  77052. "lsr r6, r8, #16\n\t"
  77053. "lsr r7, r9, #16\n\t"
  77054. "mul r7, r6, r7\n\t"
  77055. "adds r5, r5, r7\n\t"
  77056. "adc r3, r3, #0\n\t"
  77057. "lsl r7, r9, #16\n\t"
  77058. "lsr r7, r7, #16\n\t"
  77059. "mul r6, r7, r6\n\t"
  77060. "lsr r7, r6, #16\n\t"
  77061. "lsl r6, r6, #16\n\t"
  77062. "adds r4, r4, r6\n\t"
  77063. "adcs r5, r5, r7\n\t"
  77064. "adc r3, r3, #0\n\t"
  77065. #else
  77066. "umull r6, r7, r8, r9\n\t"
  77067. "adds r4, r4, r6\n\t"
  77068. "adcs r5, r5, r7\n\t"
  77069. "adc r3, r3, #0\n\t"
  77070. #endif
  77071. /* A[0] * B[4] */
  77072. "ldr r8, [%[a]]\n\t"
  77073. "ldr r9, [%[b], #16]\n\t"
  77074. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77075. "lsl r6, r8, #16\n\t"
  77076. "lsl r7, r9, #16\n\t"
  77077. "lsr r6, r6, #16\n\t"
  77078. "lsr r7, r7, #16\n\t"
  77079. "mul r7, r6, r7\n\t"
  77080. "adds r4, r4, r7\n\t"
  77081. "adcs r5, r5, #0\n\t"
  77082. "adc r3, r3, #0\n\t"
  77083. "lsr r7, r9, #16\n\t"
  77084. "mul r6, r7, r6\n\t"
  77085. "lsr r7, r6, #16\n\t"
  77086. "lsl r6, r6, #16\n\t"
  77087. "adds r4, r4, r6\n\t"
  77088. "adcs r5, r5, r7\n\t"
  77089. "adc r3, r3, #0\n\t"
  77090. "lsr r6, r8, #16\n\t"
  77091. "lsr r7, r9, #16\n\t"
  77092. "mul r7, r6, r7\n\t"
  77093. "adds r5, r5, r7\n\t"
  77094. "adc r3, r3, #0\n\t"
  77095. "lsl r7, r9, #16\n\t"
  77096. "lsr r7, r7, #16\n\t"
  77097. "mul r6, r7, r6\n\t"
  77098. "lsr r7, r6, #16\n\t"
  77099. "lsl r6, r6, #16\n\t"
  77100. "adds r4, r4, r6\n\t"
  77101. "adcs r5, r5, r7\n\t"
  77102. "adc r3, r3, #0\n\t"
  77103. #else
  77104. "umull r6, r7, r8, r9\n\t"
  77105. "adds r4, r4, r6\n\t"
  77106. "adcs r5, r5, r7\n\t"
  77107. "adc r3, r3, #0\n\t"
  77108. #endif
  77109. "str r4, [sp, #16]\n\t"
  77110. /* A[0] * B[5] */
  77111. "ldr r9, [%[b], #20]\n\t"
  77112. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77113. "lsl r6, r8, #16\n\t"
  77114. "lsl r7, r9, #16\n\t"
  77115. "lsr r6, r6, #16\n\t"
  77116. "lsr r7, r7, #16\n\t"
  77117. "mul r7, r6, r7\n\t"
  77118. "adds r5, r5, r7\n\t"
  77119. "adcs r3, r3, #0\n\t"
  77120. "mov r4, #0\n\t"
  77121. "adc r4, r4, #0\n\t"
  77122. "lsr r7, r9, #16\n\t"
  77123. "mul r6, r7, r6\n\t"
  77124. "lsr r7, r6, #16\n\t"
  77125. "lsl r6, r6, #16\n\t"
  77126. "adds r5, r5, r6\n\t"
  77127. "adcs r3, r3, r7\n\t"
  77128. "adc r4, r4, #0\n\t"
  77129. "lsr r6, r8, #16\n\t"
  77130. "lsr r7, r9, #16\n\t"
  77131. "mul r7, r6, r7\n\t"
  77132. "adds r3, r3, r7\n\t"
  77133. "adc r4, r4, #0\n\t"
  77134. "lsl r7, r9, #16\n\t"
  77135. "lsr r7, r7, #16\n\t"
  77136. "mul r6, r7, r6\n\t"
  77137. "lsr r7, r6, #16\n\t"
  77138. "lsl r6, r6, #16\n\t"
  77139. "adds r5, r5, r6\n\t"
  77140. "adcs r3, r3, r7\n\t"
  77141. "adc r4, r4, #0\n\t"
  77142. #else
  77143. "umull r6, r7, r8, r9\n\t"
  77144. "adds r5, r5, r6\n\t"
  77145. "adcs r3, r3, r7\n\t"
  77146. "mov r4, #0\n\t"
  77147. "adc r4, r4, #0\n\t"
  77148. #endif
  77149. /* A[1] * B[4] */
  77150. "ldr r8, [%[a], #4]\n\t"
  77151. "ldr r9, [%[b], #16]\n\t"
  77152. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77153. "lsl r6, r8, #16\n\t"
  77154. "lsl r7, r9, #16\n\t"
  77155. "lsr r6, r6, #16\n\t"
  77156. "lsr r7, r7, #16\n\t"
  77157. "mul r7, r6, r7\n\t"
  77158. "adds r5, r5, r7\n\t"
  77159. "adcs r3, r3, #0\n\t"
  77160. "adc r4, r4, #0\n\t"
  77161. "lsr r7, r9, #16\n\t"
  77162. "mul r6, r7, r6\n\t"
  77163. "lsr r7, r6, #16\n\t"
  77164. "lsl r6, r6, #16\n\t"
  77165. "adds r5, r5, r6\n\t"
  77166. "adcs r3, r3, r7\n\t"
  77167. "adc r4, r4, #0\n\t"
  77168. "lsr r6, r8, #16\n\t"
  77169. "lsr r7, r9, #16\n\t"
  77170. "mul r7, r6, r7\n\t"
  77171. "adds r3, r3, r7\n\t"
  77172. "adc r4, r4, #0\n\t"
  77173. "lsl r7, r9, #16\n\t"
  77174. "lsr r7, r7, #16\n\t"
  77175. "mul r6, r7, r6\n\t"
  77176. "lsr r7, r6, #16\n\t"
  77177. "lsl r6, r6, #16\n\t"
  77178. "adds r5, r5, r6\n\t"
  77179. "adcs r3, r3, r7\n\t"
  77180. "adc r4, r4, #0\n\t"
  77181. #else
  77182. "umull r6, r7, r8, r9\n\t"
  77183. "adds r5, r5, r6\n\t"
  77184. "adcs r3, r3, r7\n\t"
  77185. "adc r4, r4, #0\n\t"
  77186. #endif
  77187. /* A[2] * B[3] */
  77188. "ldr r9, [%[b], #12]\n\t"
  77189. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77190. "lsl r6, r11, #16\n\t"
  77191. "lsl r7, r9, #16\n\t"
  77192. "lsr r6, r6, #16\n\t"
  77193. "lsr r7, r7, #16\n\t"
  77194. "mul r7, r6, r7\n\t"
  77195. "adds r5, r5, r7\n\t"
  77196. "adcs r3, r3, #0\n\t"
  77197. "adc r4, r4, #0\n\t"
  77198. "lsr r7, r9, #16\n\t"
  77199. "mul r6, r7, r6\n\t"
  77200. "lsr r7, r6, #16\n\t"
  77201. "lsl r6, r6, #16\n\t"
  77202. "adds r5, r5, r6\n\t"
  77203. "adcs r3, r3, r7\n\t"
  77204. "adc r4, r4, #0\n\t"
  77205. "lsr r6, r11, #16\n\t"
  77206. "lsr r7, r9, #16\n\t"
  77207. "mul r7, r6, r7\n\t"
  77208. "adds r3, r3, r7\n\t"
  77209. "adc r4, r4, #0\n\t"
  77210. "lsl r7, r9, #16\n\t"
  77211. "lsr r7, r7, #16\n\t"
  77212. "mul r6, r7, r6\n\t"
  77213. "lsr r7, r6, #16\n\t"
  77214. "lsl r6, r6, #16\n\t"
  77215. "adds r5, r5, r6\n\t"
  77216. "adcs r3, r3, r7\n\t"
  77217. "adc r4, r4, #0\n\t"
  77218. #else
  77219. "umull r6, r7, r11, r9\n\t"
  77220. "adds r5, r5, r6\n\t"
  77221. "adcs r3, r3, r7\n\t"
  77222. "adc r4, r4, #0\n\t"
  77223. #endif
  77224. /* A[3] * B[2] */
  77225. "ldr r8, [%[a], #12]\n\t"
  77226. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77227. "lsl r6, r8, #16\n\t"
  77228. "lsl r7, r12, #16\n\t"
  77229. "lsr r6, r6, #16\n\t"
  77230. "lsr r7, r7, #16\n\t"
  77231. "mul r7, r6, r7\n\t"
  77232. "adds r5, r5, r7\n\t"
  77233. "adcs r3, r3, #0\n\t"
  77234. "adc r4, r4, #0\n\t"
  77235. "lsr r7, r12, #16\n\t"
  77236. "mul r6, r7, r6\n\t"
  77237. "lsr r7, r6, #16\n\t"
  77238. "lsl r6, r6, #16\n\t"
  77239. "adds r5, r5, r6\n\t"
  77240. "adcs r3, r3, r7\n\t"
  77241. "adc r4, r4, #0\n\t"
  77242. "lsr r6, r8, #16\n\t"
  77243. "lsr r7, r12, #16\n\t"
  77244. "mul r7, r6, r7\n\t"
  77245. "adds r3, r3, r7\n\t"
  77246. "adc r4, r4, #0\n\t"
  77247. "lsl r7, r12, #16\n\t"
  77248. "lsr r7, r7, #16\n\t"
  77249. "mul r6, r7, r6\n\t"
  77250. "lsr r7, r6, #16\n\t"
  77251. "lsl r6, r6, #16\n\t"
  77252. "adds r5, r5, r6\n\t"
  77253. "adcs r3, r3, r7\n\t"
  77254. "adc r4, r4, #0\n\t"
  77255. #else
  77256. "umull r6, r7, r8, r12\n\t"
  77257. "adds r5, r5, r6\n\t"
  77258. "adcs r3, r3, r7\n\t"
  77259. "adc r4, r4, #0\n\t"
  77260. #endif
  77261. /* A[4] * B[1] */
  77262. "ldr r8, [%[a], #16]\n\t"
  77263. "ldr r9, [%[b], #4]\n\t"
  77264. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77265. "lsl r6, r8, #16\n\t"
  77266. "lsl r7, r9, #16\n\t"
  77267. "lsr r6, r6, #16\n\t"
  77268. "lsr r7, r7, #16\n\t"
  77269. "mul r7, r6, r7\n\t"
  77270. "adds r5, r5, r7\n\t"
  77271. "adcs r3, r3, #0\n\t"
  77272. "adc r4, r4, #0\n\t"
  77273. "lsr r7, r9, #16\n\t"
  77274. "mul r6, r7, r6\n\t"
  77275. "lsr r7, r6, #16\n\t"
  77276. "lsl r6, r6, #16\n\t"
  77277. "adds r5, r5, r6\n\t"
  77278. "adcs r3, r3, r7\n\t"
  77279. "adc r4, r4, #0\n\t"
  77280. "lsr r6, r8, #16\n\t"
  77281. "lsr r7, r9, #16\n\t"
  77282. "mul r7, r6, r7\n\t"
  77283. "adds r3, r3, r7\n\t"
  77284. "adc r4, r4, #0\n\t"
  77285. "lsl r7, r9, #16\n\t"
  77286. "lsr r7, r7, #16\n\t"
  77287. "mul r6, r7, r6\n\t"
  77288. "lsr r7, r6, #16\n\t"
  77289. "lsl r6, r6, #16\n\t"
  77290. "adds r5, r5, r6\n\t"
  77291. "adcs r3, r3, r7\n\t"
  77292. "adc r4, r4, #0\n\t"
  77293. #else
  77294. "umull r6, r7, r8, r9\n\t"
  77295. "adds r5, r5, r6\n\t"
  77296. "adcs r3, r3, r7\n\t"
  77297. "adc r4, r4, #0\n\t"
  77298. #endif
  77299. /* A[5] * B[0] */
  77300. "ldr r8, [%[a], #20]\n\t"
  77301. "ldr r9, [%[b]]\n\t"
  77302. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77303. "lsl r6, r8, #16\n\t"
  77304. "lsl r7, r9, #16\n\t"
  77305. "lsr r6, r6, #16\n\t"
  77306. "lsr r7, r7, #16\n\t"
  77307. "mul r7, r6, r7\n\t"
  77308. "adds r5, r5, r7\n\t"
  77309. "adcs r3, r3, #0\n\t"
  77310. "adc r4, r4, #0\n\t"
  77311. "lsr r7, r9, #16\n\t"
  77312. "mul r6, r7, r6\n\t"
  77313. "lsr r7, r6, #16\n\t"
  77314. "lsl r6, r6, #16\n\t"
  77315. "adds r5, r5, r6\n\t"
  77316. "adcs r3, r3, r7\n\t"
  77317. "adc r4, r4, #0\n\t"
  77318. "lsr r6, r8, #16\n\t"
  77319. "lsr r7, r9, #16\n\t"
  77320. "mul r7, r6, r7\n\t"
  77321. "adds r3, r3, r7\n\t"
  77322. "adc r4, r4, #0\n\t"
  77323. "lsl r7, r9, #16\n\t"
  77324. "lsr r7, r7, #16\n\t"
  77325. "mul r6, r7, r6\n\t"
  77326. "lsr r7, r6, #16\n\t"
  77327. "lsl r6, r6, #16\n\t"
  77328. "adds r5, r5, r6\n\t"
  77329. "adcs r3, r3, r7\n\t"
  77330. "adc r4, r4, #0\n\t"
  77331. #else
  77332. "umull r6, r7, r8, r9\n\t"
  77333. "adds r5, r5, r6\n\t"
  77334. "adcs r3, r3, r7\n\t"
  77335. "adc r4, r4, #0\n\t"
  77336. #endif
  77337. "str r5, [sp, #20]\n\t"
  77338. /* A[6] * B[0] */
  77339. "ldr r8, [%[a], #24]\n\t"
  77340. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77341. "lsl r6, r8, #16\n\t"
  77342. "lsl r7, r9, #16\n\t"
  77343. "lsr r6, r6, #16\n\t"
  77344. "lsr r7, r7, #16\n\t"
  77345. "mul r7, r6, r7\n\t"
  77346. "adds r3, r3, r7\n\t"
  77347. "adcs r4, r4, #0\n\t"
  77348. "mov r5, #0\n\t"
  77349. "adc r5, r5, #0\n\t"
  77350. "lsr r7, r9, #16\n\t"
  77351. "mul r6, r7, r6\n\t"
  77352. "lsr r7, r6, #16\n\t"
  77353. "lsl r6, r6, #16\n\t"
  77354. "adds r3, r3, r6\n\t"
  77355. "adcs r4, r4, r7\n\t"
  77356. "adc r5, r5, #0\n\t"
  77357. "lsr r6, r8, #16\n\t"
  77358. "lsr r7, r9, #16\n\t"
  77359. "mul r7, r6, r7\n\t"
  77360. "adds r4, r4, r7\n\t"
  77361. "adc r5, r5, #0\n\t"
  77362. "lsl r7, r9, #16\n\t"
  77363. "lsr r7, r7, #16\n\t"
  77364. "mul r6, r7, r6\n\t"
  77365. "lsr r7, r6, #16\n\t"
  77366. "lsl r6, r6, #16\n\t"
  77367. "adds r3, r3, r6\n\t"
  77368. "adcs r4, r4, r7\n\t"
  77369. "adc r5, r5, #0\n\t"
  77370. #else
  77371. "umull r6, r7, r8, r9\n\t"
  77372. "adds r3, r3, r6\n\t"
  77373. "adcs r4, r4, r7\n\t"
  77374. "mov r5, #0\n\t"
  77375. "adc r5, r5, #0\n\t"
  77376. #endif
  77377. /* A[5] * B[1] */
  77378. "ldr r8, [%[a], #20]\n\t"
  77379. "ldr r9, [%[b], #4]\n\t"
  77380. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77381. "lsl r6, r8, #16\n\t"
  77382. "lsl r7, r9, #16\n\t"
  77383. "lsr r6, r6, #16\n\t"
  77384. "lsr r7, r7, #16\n\t"
  77385. "mul r7, r6, r7\n\t"
  77386. "adds r3, r3, r7\n\t"
  77387. "adcs r4, r4, #0\n\t"
  77388. "adc r5, r5, #0\n\t"
  77389. "lsr r7, r9, #16\n\t"
  77390. "mul r6, r7, r6\n\t"
  77391. "lsr r7, r6, #16\n\t"
  77392. "lsl r6, r6, #16\n\t"
  77393. "adds r3, r3, r6\n\t"
  77394. "adcs r4, r4, r7\n\t"
  77395. "adc r5, r5, #0\n\t"
  77396. "lsr r6, r8, #16\n\t"
  77397. "lsr r7, r9, #16\n\t"
  77398. "mul r7, r6, r7\n\t"
  77399. "adds r4, r4, r7\n\t"
  77400. "adc r5, r5, #0\n\t"
  77401. "lsl r7, r9, #16\n\t"
  77402. "lsr r7, r7, #16\n\t"
  77403. "mul r6, r7, r6\n\t"
  77404. "lsr r7, r6, #16\n\t"
  77405. "lsl r6, r6, #16\n\t"
  77406. "adds r3, r3, r6\n\t"
  77407. "adcs r4, r4, r7\n\t"
  77408. "adc r5, r5, #0\n\t"
  77409. #else
  77410. "umull r6, r7, r8, r9\n\t"
  77411. "adds r3, r3, r6\n\t"
  77412. "adcs r4, r4, r7\n\t"
  77413. "adc r5, r5, #0\n\t"
  77414. #endif
  77415. /* A[4] * B[2] */
  77416. "ldr r8, [%[a], #16]\n\t"
  77417. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77418. "lsl r6, r8, #16\n\t"
  77419. "lsl r7, r12, #16\n\t"
  77420. "lsr r6, r6, #16\n\t"
  77421. "lsr r7, r7, #16\n\t"
  77422. "mul r7, r6, r7\n\t"
  77423. "adds r3, r3, r7\n\t"
  77424. "adcs r4, r4, #0\n\t"
  77425. "adc r5, r5, #0\n\t"
  77426. "lsr r7, r12, #16\n\t"
  77427. "mul r6, r7, r6\n\t"
  77428. "lsr r7, r6, #16\n\t"
  77429. "lsl r6, r6, #16\n\t"
  77430. "adds r3, r3, r6\n\t"
  77431. "adcs r4, r4, r7\n\t"
  77432. "adc r5, r5, #0\n\t"
  77433. "lsr r6, r8, #16\n\t"
  77434. "lsr r7, r12, #16\n\t"
  77435. "mul r7, r6, r7\n\t"
  77436. "adds r4, r4, r7\n\t"
  77437. "adc r5, r5, #0\n\t"
  77438. "lsl r7, r12, #16\n\t"
  77439. "lsr r7, r7, #16\n\t"
  77440. "mul r6, r7, r6\n\t"
  77441. "lsr r7, r6, #16\n\t"
  77442. "lsl r6, r6, #16\n\t"
  77443. "adds r3, r3, r6\n\t"
  77444. "adcs r4, r4, r7\n\t"
  77445. "adc r5, r5, #0\n\t"
  77446. #else
  77447. "umull r6, r7, r8, r12\n\t"
  77448. "adds r3, r3, r6\n\t"
  77449. "adcs r4, r4, r7\n\t"
  77450. "adc r5, r5, #0\n\t"
  77451. #endif
  77452. /* A[3] * B[3] */
  77453. "ldr r11, [%[a], #12]\n\t"
  77454. "ldr r12, [%[b], #12]\n\t"
  77455. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77456. "lsl r6, r11, #16\n\t"
  77457. "lsl r7, r12, #16\n\t"
  77458. "lsr r6, r6, #16\n\t"
  77459. "lsr r7, r7, #16\n\t"
  77460. "mul r7, r6, r7\n\t"
  77461. "adds r3, r3, r7\n\t"
  77462. "adcs r4, r4, #0\n\t"
  77463. "adc r5, r5, #0\n\t"
  77464. "lsr r7, r12, #16\n\t"
  77465. "mul r6, r7, r6\n\t"
  77466. "lsr r7, r6, #16\n\t"
  77467. "lsl r6, r6, #16\n\t"
  77468. "adds r3, r3, r6\n\t"
  77469. "adcs r4, r4, r7\n\t"
  77470. "adc r5, r5, #0\n\t"
  77471. "lsr r6, r11, #16\n\t"
  77472. "lsr r7, r12, #16\n\t"
  77473. "mul r7, r6, r7\n\t"
  77474. "adds r4, r4, r7\n\t"
  77475. "adc r5, r5, #0\n\t"
  77476. "lsl r7, r12, #16\n\t"
  77477. "lsr r7, r7, #16\n\t"
  77478. "mul r6, r7, r6\n\t"
  77479. "lsr r7, r6, #16\n\t"
  77480. "lsl r6, r6, #16\n\t"
  77481. "adds r3, r3, r6\n\t"
  77482. "adcs r4, r4, r7\n\t"
  77483. "adc r5, r5, #0\n\t"
  77484. #else
  77485. "umull r6, r7, r11, r12\n\t"
  77486. "adds r3, r3, r6\n\t"
  77487. "adcs r4, r4, r7\n\t"
  77488. "adc r5, r5, #0\n\t"
  77489. #endif
  77490. /* A[2] * B[4] */
  77491. "ldr r8, [%[a], #8]\n\t"
  77492. "ldr r9, [%[b], #16]\n\t"
  77493. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77494. "lsl r6, r8, #16\n\t"
  77495. "lsl r7, r9, #16\n\t"
  77496. "lsr r6, r6, #16\n\t"
  77497. "lsr r7, r7, #16\n\t"
  77498. "mul r7, r6, r7\n\t"
  77499. "adds r3, r3, r7\n\t"
  77500. "adcs r4, r4, #0\n\t"
  77501. "adc r5, r5, #0\n\t"
  77502. "lsr r7, r9, #16\n\t"
  77503. "mul r6, r7, r6\n\t"
  77504. "lsr r7, r6, #16\n\t"
  77505. "lsl r6, r6, #16\n\t"
  77506. "adds r3, r3, r6\n\t"
  77507. "adcs r4, r4, r7\n\t"
  77508. "adc r5, r5, #0\n\t"
  77509. "lsr r6, r8, #16\n\t"
  77510. "lsr r7, r9, #16\n\t"
  77511. "mul r7, r6, r7\n\t"
  77512. "adds r4, r4, r7\n\t"
  77513. "adc r5, r5, #0\n\t"
  77514. "lsl r7, r9, #16\n\t"
  77515. "lsr r7, r7, #16\n\t"
  77516. "mul r6, r7, r6\n\t"
  77517. "lsr r7, r6, #16\n\t"
  77518. "lsl r6, r6, #16\n\t"
  77519. "adds r3, r3, r6\n\t"
  77520. "adcs r4, r4, r7\n\t"
  77521. "adc r5, r5, #0\n\t"
  77522. #else
  77523. "umull r6, r7, r8, r9\n\t"
  77524. "adds r3, r3, r6\n\t"
  77525. "adcs r4, r4, r7\n\t"
  77526. "adc r5, r5, #0\n\t"
  77527. #endif
  77528. /* A[1] * B[5] */
  77529. "ldr r8, [%[a], #4]\n\t"
  77530. "ldr r9, [%[b], #20]\n\t"
  77531. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77532. "lsl r6, r8, #16\n\t"
  77533. "lsl r7, r9, #16\n\t"
  77534. "lsr r6, r6, #16\n\t"
  77535. "lsr r7, r7, #16\n\t"
  77536. "mul r7, r6, r7\n\t"
  77537. "adds r3, r3, r7\n\t"
  77538. "adcs r4, r4, #0\n\t"
  77539. "adc r5, r5, #0\n\t"
  77540. "lsr r7, r9, #16\n\t"
  77541. "mul r6, r7, r6\n\t"
  77542. "lsr r7, r6, #16\n\t"
  77543. "lsl r6, r6, #16\n\t"
  77544. "adds r3, r3, r6\n\t"
  77545. "adcs r4, r4, r7\n\t"
  77546. "adc r5, r5, #0\n\t"
  77547. "lsr r6, r8, #16\n\t"
  77548. "lsr r7, r9, #16\n\t"
  77549. "mul r7, r6, r7\n\t"
  77550. "adds r4, r4, r7\n\t"
  77551. "adc r5, r5, #0\n\t"
  77552. "lsl r7, r9, #16\n\t"
  77553. "lsr r7, r7, #16\n\t"
  77554. "mul r6, r7, r6\n\t"
  77555. "lsr r7, r6, #16\n\t"
  77556. "lsl r6, r6, #16\n\t"
  77557. "adds r3, r3, r6\n\t"
  77558. "adcs r4, r4, r7\n\t"
  77559. "adc r5, r5, #0\n\t"
  77560. #else
  77561. "umull r6, r7, r8, r9\n\t"
  77562. "adds r3, r3, r6\n\t"
  77563. "adcs r4, r4, r7\n\t"
  77564. "adc r5, r5, #0\n\t"
  77565. #endif
  77566. /* A[0] * B[6] */
  77567. "ldr r8, [%[a]]\n\t"
  77568. "ldr r9, [%[b], #24]\n\t"
  77569. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77570. "lsl r6, r8, #16\n\t"
  77571. "lsl r7, r9, #16\n\t"
  77572. "lsr r6, r6, #16\n\t"
  77573. "lsr r7, r7, #16\n\t"
  77574. "mul r7, r6, r7\n\t"
  77575. "adds r3, r3, r7\n\t"
  77576. "adcs r4, r4, #0\n\t"
  77577. "adc r5, r5, #0\n\t"
  77578. "lsr r7, r9, #16\n\t"
  77579. "mul r6, r7, r6\n\t"
  77580. "lsr r7, r6, #16\n\t"
  77581. "lsl r6, r6, #16\n\t"
  77582. "adds r3, r3, r6\n\t"
  77583. "adcs r4, r4, r7\n\t"
  77584. "adc r5, r5, #0\n\t"
  77585. "lsr r6, r8, #16\n\t"
  77586. "lsr r7, r9, #16\n\t"
  77587. "mul r7, r6, r7\n\t"
  77588. "adds r4, r4, r7\n\t"
  77589. "adc r5, r5, #0\n\t"
  77590. "lsl r7, r9, #16\n\t"
  77591. "lsr r7, r7, #16\n\t"
  77592. "mul r6, r7, r6\n\t"
  77593. "lsr r7, r6, #16\n\t"
  77594. "lsl r6, r6, #16\n\t"
  77595. "adds r3, r3, r6\n\t"
  77596. "adcs r4, r4, r7\n\t"
  77597. "adc r5, r5, #0\n\t"
  77598. #else
  77599. "umull r6, r7, r8, r9\n\t"
  77600. "adds r3, r3, r6\n\t"
  77601. "adcs r4, r4, r7\n\t"
  77602. "adc r5, r5, #0\n\t"
  77603. #endif
  77604. "str r3, [sp, #24]\n\t"
  77605. /* A[0] * B[7] */
  77606. "ldr r9, [%[b], #28]\n\t"
  77607. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77608. "lsl r6, r8, #16\n\t"
  77609. "lsl r7, r9, #16\n\t"
  77610. "lsr r6, r6, #16\n\t"
  77611. "lsr r7, r7, #16\n\t"
  77612. "mul r7, r6, r7\n\t"
  77613. "adds r4, r4, r7\n\t"
  77614. "adcs r5, r5, #0\n\t"
  77615. "mov r3, #0\n\t"
  77616. "adc r3, r3, #0\n\t"
  77617. "lsr r7, r9, #16\n\t"
  77618. "mul r6, r7, r6\n\t"
  77619. "lsr r7, r6, #16\n\t"
  77620. "lsl r6, r6, #16\n\t"
  77621. "adds r4, r4, r6\n\t"
  77622. "adcs r5, r5, r7\n\t"
  77623. "adc r3, r3, #0\n\t"
  77624. "lsr r6, r8, #16\n\t"
  77625. "lsr r7, r9, #16\n\t"
  77626. "mul r7, r6, r7\n\t"
  77627. "adds r5, r5, r7\n\t"
  77628. "adc r3, r3, #0\n\t"
  77629. "lsl r7, r9, #16\n\t"
  77630. "lsr r7, r7, #16\n\t"
  77631. "mul r6, r7, r6\n\t"
  77632. "lsr r7, r6, #16\n\t"
  77633. "lsl r6, r6, #16\n\t"
  77634. "adds r4, r4, r6\n\t"
  77635. "adcs r5, r5, r7\n\t"
  77636. "adc r3, r3, #0\n\t"
  77637. #else
  77638. "umull r6, r7, r8, r9\n\t"
  77639. "adds r4, r4, r6\n\t"
  77640. "adcs r5, r5, r7\n\t"
  77641. "mov r3, #0\n\t"
  77642. "adc r3, r3, #0\n\t"
  77643. #endif
  77644. /* A[1] * B[6] */
  77645. "ldr r8, [%[a], #4]\n\t"
  77646. "ldr r9, [%[b], #24]\n\t"
  77647. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77648. "lsl r6, r8, #16\n\t"
  77649. "lsl r7, r9, #16\n\t"
  77650. "lsr r6, r6, #16\n\t"
  77651. "lsr r7, r7, #16\n\t"
  77652. "mul r7, r6, r7\n\t"
  77653. "adds r4, r4, r7\n\t"
  77654. "adcs r5, r5, #0\n\t"
  77655. "adc r3, r3, #0\n\t"
  77656. "lsr r7, r9, #16\n\t"
  77657. "mul r6, r7, r6\n\t"
  77658. "lsr r7, r6, #16\n\t"
  77659. "lsl r6, r6, #16\n\t"
  77660. "adds r4, r4, r6\n\t"
  77661. "adcs r5, r5, r7\n\t"
  77662. "adc r3, r3, #0\n\t"
  77663. "lsr r6, r8, #16\n\t"
  77664. "lsr r7, r9, #16\n\t"
  77665. "mul r7, r6, r7\n\t"
  77666. "adds r5, r5, r7\n\t"
  77667. "adc r3, r3, #0\n\t"
  77668. "lsl r7, r9, #16\n\t"
  77669. "lsr r7, r7, #16\n\t"
  77670. "mul r6, r7, r6\n\t"
  77671. "lsr r7, r6, #16\n\t"
  77672. "lsl r6, r6, #16\n\t"
  77673. "adds r4, r4, r6\n\t"
  77674. "adcs r5, r5, r7\n\t"
  77675. "adc r3, r3, #0\n\t"
  77676. #else
  77677. "umull r6, r7, r8, r9\n\t"
  77678. "adds r4, r4, r6\n\t"
  77679. "adcs r5, r5, r7\n\t"
  77680. "adc r3, r3, #0\n\t"
  77681. #endif
  77682. /* A[2] * B[5] */
  77683. "ldr r8, [%[a], #8]\n\t"
  77684. "ldr r9, [%[b], #20]\n\t"
  77685. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77686. "lsl r6, r8, #16\n\t"
  77687. "lsl r7, r9, #16\n\t"
  77688. "lsr r6, r6, #16\n\t"
  77689. "lsr r7, r7, #16\n\t"
  77690. "mul r7, r6, r7\n\t"
  77691. "adds r4, r4, r7\n\t"
  77692. "adcs r5, r5, #0\n\t"
  77693. "adc r3, r3, #0\n\t"
  77694. "lsr r7, r9, #16\n\t"
  77695. "mul r6, r7, r6\n\t"
  77696. "lsr r7, r6, #16\n\t"
  77697. "lsl r6, r6, #16\n\t"
  77698. "adds r4, r4, r6\n\t"
  77699. "adcs r5, r5, r7\n\t"
  77700. "adc r3, r3, #0\n\t"
  77701. "lsr r6, r8, #16\n\t"
  77702. "lsr r7, r9, #16\n\t"
  77703. "mul r7, r6, r7\n\t"
  77704. "adds r5, r5, r7\n\t"
  77705. "adc r3, r3, #0\n\t"
  77706. "lsl r7, r9, #16\n\t"
  77707. "lsr r7, r7, #16\n\t"
  77708. "mul r6, r7, r6\n\t"
  77709. "lsr r7, r6, #16\n\t"
  77710. "lsl r6, r6, #16\n\t"
  77711. "adds r4, r4, r6\n\t"
  77712. "adcs r5, r5, r7\n\t"
  77713. "adc r3, r3, #0\n\t"
  77714. #else
  77715. "umull r6, r7, r8, r9\n\t"
  77716. "adds r4, r4, r6\n\t"
  77717. "adcs r5, r5, r7\n\t"
  77718. "adc r3, r3, #0\n\t"
  77719. #endif
  77720. /* A[3] * B[4] */
  77721. "ldr r9, [%[b], #16]\n\t"
  77722. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77723. "lsl r6, r11, #16\n\t"
  77724. "lsl r7, r9, #16\n\t"
  77725. "lsr r6, r6, #16\n\t"
  77726. "lsr r7, r7, #16\n\t"
  77727. "mul r7, r6, r7\n\t"
  77728. "adds r4, r4, r7\n\t"
  77729. "adcs r5, r5, #0\n\t"
  77730. "adc r3, r3, #0\n\t"
  77731. "lsr r7, r9, #16\n\t"
  77732. "mul r6, r7, r6\n\t"
  77733. "lsr r7, r6, #16\n\t"
  77734. "lsl r6, r6, #16\n\t"
  77735. "adds r4, r4, r6\n\t"
  77736. "adcs r5, r5, r7\n\t"
  77737. "adc r3, r3, #0\n\t"
  77738. "lsr r6, r11, #16\n\t"
  77739. "lsr r7, r9, #16\n\t"
  77740. "mul r7, r6, r7\n\t"
  77741. "adds r5, r5, r7\n\t"
  77742. "adc r3, r3, #0\n\t"
  77743. "lsl r7, r9, #16\n\t"
  77744. "lsr r7, r7, #16\n\t"
  77745. "mul r6, r7, r6\n\t"
  77746. "lsr r7, r6, #16\n\t"
  77747. "lsl r6, r6, #16\n\t"
  77748. "adds r4, r4, r6\n\t"
  77749. "adcs r5, r5, r7\n\t"
  77750. "adc r3, r3, #0\n\t"
  77751. #else
  77752. "umull r6, r7, r11, r9\n\t"
  77753. "adds r4, r4, r6\n\t"
  77754. "adcs r5, r5, r7\n\t"
  77755. "adc r3, r3, #0\n\t"
  77756. #endif
  77757. /* A[4] * B[3] */
  77758. "ldr r8, [%[a], #16]\n\t"
  77759. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77760. "lsl r6, r8, #16\n\t"
  77761. "lsl r7, r12, #16\n\t"
  77762. "lsr r6, r6, #16\n\t"
  77763. "lsr r7, r7, #16\n\t"
  77764. "mul r7, r6, r7\n\t"
  77765. "adds r4, r4, r7\n\t"
  77766. "adcs r5, r5, #0\n\t"
  77767. "adc r3, r3, #0\n\t"
  77768. "lsr r7, r12, #16\n\t"
  77769. "mul r6, r7, r6\n\t"
  77770. "lsr r7, r6, #16\n\t"
  77771. "lsl r6, r6, #16\n\t"
  77772. "adds r4, r4, r6\n\t"
  77773. "adcs r5, r5, r7\n\t"
  77774. "adc r3, r3, #0\n\t"
  77775. "lsr r6, r8, #16\n\t"
  77776. "lsr r7, r12, #16\n\t"
  77777. "mul r7, r6, r7\n\t"
  77778. "adds r5, r5, r7\n\t"
  77779. "adc r3, r3, #0\n\t"
  77780. "lsl r7, r12, #16\n\t"
  77781. "lsr r7, r7, #16\n\t"
  77782. "mul r6, r7, r6\n\t"
  77783. "lsr r7, r6, #16\n\t"
  77784. "lsl r6, r6, #16\n\t"
  77785. "adds r4, r4, r6\n\t"
  77786. "adcs r5, r5, r7\n\t"
  77787. "adc r3, r3, #0\n\t"
  77788. #else
  77789. "umull r6, r7, r8, r12\n\t"
  77790. "adds r4, r4, r6\n\t"
  77791. "adcs r5, r5, r7\n\t"
  77792. "adc r3, r3, #0\n\t"
  77793. #endif
  77794. /* A[5] * B[2] */
  77795. "ldr r8, [%[a], #20]\n\t"
  77796. "ldr r9, [%[b], #8]\n\t"
  77797. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77798. "lsl r6, r8, #16\n\t"
  77799. "lsl r7, r9, #16\n\t"
  77800. "lsr r6, r6, #16\n\t"
  77801. "lsr r7, r7, #16\n\t"
  77802. "mul r7, r6, r7\n\t"
  77803. "adds r4, r4, r7\n\t"
  77804. "adcs r5, r5, #0\n\t"
  77805. "adc r3, r3, #0\n\t"
  77806. "lsr r7, r9, #16\n\t"
  77807. "mul r6, r7, r6\n\t"
  77808. "lsr r7, r6, #16\n\t"
  77809. "lsl r6, r6, #16\n\t"
  77810. "adds r4, r4, r6\n\t"
  77811. "adcs r5, r5, r7\n\t"
  77812. "adc r3, r3, #0\n\t"
  77813. "lsr r6, r8, #16\n\t"
  77814. "lsr r7, r9, #16\n\t"
  77815. "mul r7, r6, r7\n\t"
  77816. "adds r5, r5, r7\n\t"
  77817. "adc r3, r3, #0\n\t"
  77818. "lsl r7, r9, #16\n\t"
  77819. "lsr r7, r7, #16\n\t"
  77820. "mul r6, r7, r6\n\t"
  77821. "lsr r7, r6, #16\n\t"
  77822. "lsl r6, r6, #16\n\t"
  77823. "adds r4, r4, r6\n\t"
  77824. "adcs r5, r5, r7\n\t"
  77825. "adc r3, r3, #0\n\t"
  77826. #else
  77827. "umull r6, r7, r8, r9\n\t"
  77828. "adds r4, r4, r6\n\t"
  77829. "adcs r5, r5, r7\n\t"
  77830. "adc r3, r3, #0\n\t"
  77831. #endif
  77832. /* A[6] * B[1] */
  77833. "ldr r8, [%[a], #24]\n\t"
  77834. "ldr r9, [%[b], #4]\n\t"
  77835. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77836. "lsl r6, r8, #16\n\t"
  77837. "lsl r7, r9, #16\n\t"
  77838. "lsr r6, r6, #16\n\t"
  77839. "lsr r7, r7, #16\n\t"
  77840. "mul r7, r6, r7\n\t"
  77841. "adds r4, r4, r7\n\t"
  77842. "adcs r5, r5, #0\n\t"
  77843. "adc r3, r3, #0\n\t"
  77844. "lsr r7, r9, #16\n\t"
  77845. "mul r6, r7, r6\n\t"
  77846. "lsr r7, r6, #16\n\t"
  77847. "lsl r6, r6, #16\n\t"
  77848. "adds r4, r4, r6\n\t"
  77849. "adcs r5, r5, r7\n\t"
  77850. "adc r3, r3, #0\n\t"
  77851. "lsr r6, r8, #16\n\t"
  77852. "lsr r7, r9, #16\n\t"
  77853. "mul r7, r6, r7\n\t"
  77854. "adds r5, r5, r7\n\t"
  77855. "adc r3, r3, #0\n\t"
  77856. "lsl r7, r9, #16\n\t"
  77857. "lsr r7, r7, #16\n\t"
  77858. "mul r6, r7, r6\n\t"
  77859. "lsr r7, r6, #16\n\t"
  77860. "lsl r6, r6, #16\n\t"
  77861. "adds r4, r4, r6\n\t"
  77862. "adcs r5, r5, r7\n\t"
  77863. "adc r3, r3, #0\n\t"
  77864. #else
  77865. "umull r6, r7, r8, r9\n\t"
  77866. "adds r4, r4, r6\n\t"
  77867. "adcs r5, r5, r7\n\t"
  77868. "adc r3, r3, #0\n\t"
  77869. #endif
  77870. /* A[7] * B[0] */
  77871. "ldr r8, [%[a], #28]\n\t"
  77872. "ldr r9, [%[b]]\n\t"
  77873. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77874. "lsl r6, r8, #16\n\t"
  77875. "lsl r7, r9, #16\n\t"
  77876. "lsr r6, r6, #16\n\t"
  77877. "lsr r7, r7, #16\n\t"
  77878. "mul r7, r6, r7\n\t"
  77879. "adds r4, r4, r7\n\t"
  77880. "adcs r5, r5, #0\n\t"
  77881. "adc r3, r3, #0\n\t"
  77882. "lsr r7, r9, #16\n\t"
  77883. "mul r6, r7, r6\n\t"
  77884. "lsr r7, r6, #16\n\t"
  77885. "lsl r6, r6, #16\n\t"
  77886. "adds r4, r4, r6\n\t"
  77887. "adcs r5, r5, r7\n\t"
  77888. "adc r3, r3, #0\n\t"
  77889. "lsr r6, r8, #16\n\t"
  77890. "lsr r7, r9, #16\n\t"
  77891. "mul r7, r6, r7\n\t"
  77892. "adds r5, r5, r7\n\t"
  77893. "adc r3, r3, #0\n\t"
  77894. "lsl r7, r9, #16\n\t"
  77895. "lsr r7, r7, #16\n\t"
  77896. "mul r6, r7, r6\n\t"
  77897. "lsr r7, r6, #16\n\t"
  77898. "lsl r6, r6, #16\n\t"
  77899. "adds r4, r4, r6\n\t"
  77900. "adcs r5, r5, r7\n\t"
  77901. "adc r3, r3, #0\n\t"
  77902. #else
  77903. "umull r6, r7, r8, r9\n\t"
  77904. "adds r4, r4, r6\n\t"
  77905. "adcs r5, r5, r7\n\t"
  77906. "adc r3, r3, #0\n\t"
  77907. #endif
  77908. "str r4, [sp, #28]\n\t"
  77909. /* A[8] * B[0] */
  77910. "ldr r8, [%[a], #32]\n\t"
  77911. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77912. "lsl r6, r8, #16\n\t"
  77913. "lsl r7, r9, #16\n\t"
  77914. "lsr r6, r6, #16\n\t"
  77915. "lsr r7, r7, #16\n\t"
  77916. "mul r7, r6, r7\n\t"
  77917. "adds r5, r5, r7\n\t"
  77918. "adcs r3, r3, #0\n\t"
  77919. "mov r4, #0\n\t"
  77920. "adc r4, r4, #0\n\t"
  77921. "lsr r7, r9, #16\n\t"
  77922. "mul r6, r7, r6\n\t"
  77923. "lsr r7, r6, #16\n\t"
  77924. "lsl r6, r6, #16\n\t"
  77925. "adds r5, r5, r6\n\t"
  77926. "adcs r3, r3, r7\n\t"
  77927. "adc r4, r4, #0\n\t"
  77928. "lsr r6, r8, #16\n\t"
  77929. "lsr r7, r9, #16\n\t"
  77930. "mul r7, r6, r7\n\t"
  77931. "adds r3, r3, r7\n\t"
  77932. "adc r4, r4, #0\n\t"
  77933. "lsl r7, r9, #16\n\t"
  77934. "lsr r7, r7, #16\n\t"
  77935. "mul r6, r7, r6\n\t"
  77936. "lsr r7, r6, #16\n\t"
  77937. "lsl r6, r6, #16\n\t"
  77938. "adds r5, r5, r6\n\t"
  77939. "adcs r3, r3, r7\n\t"
  77940. "adc r4, r4, #0\n\t"
  77941. #else
  77942. "umull r6, r7, r8, r9\n\t"
  77943. "adds r5, r5, r6\n\t"
  77944. "adcs r3, r3, r7\n\t"
  77945. "mov r4, #0\n\t"
  77946. "adc r4, r4, #0\n\t"
  77947. #endif
  77948. /* A[7] * B[1] */
  77949. "ldr r8, [%[a], #28]\n\t"
  77950. "ldr r9, [%[b], #4]\n\t"
  77951. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77952. "lsl r6, r8, #16\n\t"
  77953. "lsl r7, r9, #16\n\t"
  77954. "lsr r6, r6, #16\n\t"
  77955. "lsr r7, r7, #16\n\t"
  77956. "mul r7, r6, r7\n\t"
  77957. "adds r5, r5, r7\n\t"
  77958. "adcs r3, r3, #0\n\t"
  77959. "adc r4, r4, #0\n\t"
  77960. "lsr r7, r9, #16\n\t"
  77961. "mul r6, r7, r6\n\t"
  77962. "lsr r7, r6, #16\n\t"
  77963. "lsl r6, r6, #16\n\t"
  77964. "adds r5, r5, r6\n\t"
  77965. "adcs r3, r3, r7\n\t"
  77966. "adc r4, r4, #0\n\t"
  77967. "lsr r6, r8, #16\n\t"
  77968. "lsr r7, r9, #16\n\t"
  77969. "mul r7, r6, r7\n\t"
  77970. "adds r3, r3, r7\n\t"
  77971. "adc r4, r4, #0\n\t"
  77972. "lsl r7, r9, #16\n\t"
  77973. "lsr r7, r7, #16\n\t"
  77974. "mul r6, r7, r6\n\t"
  77975. "lsr r7, r6, #16\n\t"
  77976. "lsl r6, r6, #16\n\t"
  77977. "adds r5, r5, r6\n\t"
  77978. "adcs r3, r3, r7\n\t"
  77979. "adc r4, r4, #0\n\t"
  77980. #else
  77981. "umull r6, r7, r8, r9\n\t"
  77982. "adds r5, r5, r6\n\t"
  77983. "adcs r3, r3, r7\n\t"
  77984. "adc r4, r4, #0\n\t"
  77985. #endif
  77986. /* A[6] * B[2] */
  77987. "ldr r8, [%[a], #24]\n\t"
  77988. "ldr r9, [%[b], #8]\n\t"
  77989. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  77990. "lsl r6, r8, #16\n\t"
  77991. "lsl r7, r9, #16\n\t"
  77992. "lsr r6, r6, #16\n\t"
  77993. "lsr r7, r7, #16\n\t"
  77994. "mul r7, r6, r7\n\t"
  77995. "adds r5, r5, r7\n\t"
  77996. "adcs r3, r3, #0\n\t"
  77997. "adc r4, r4, #0\n\t"
  77998. "lsr r7, r9, #16\n\t"
  77999. "mul r6, r7, r6\n\t"
  78000. "lsr r7, r6, #16\n\t"
  78001. "lsl r6, r6, #16\n\t"
  78002. "adds r5, r5, r6\n\t"
  78003. "adcs r3, r3, r7\n\t"
  78004. "adc r4, r4, #0\n\t"
  78005. "lsr r6, r8, #16\n\t"
  78006. "lsr r7, r9, #16\n\t"
  78007. "mul r7, r6, r7\n\t"
  78008. "adds r3, r3, r7\n\t"
  78009. "adc r4, r4, #0\n\t"
  78010. "lsl r7, r9, #16\n\t"
  78011. "lsr r7, r7, #16\n\t"
  78012. "mul r6, r7, r6\n\t"
  78013. "lsr r7, r6, #16\n\t"
  78014. "lsl r6, r6, #16\n\t"
  78015. "adds r5, r5, r6\n\t"
  78016. "adcs r3, r3, r7\n\t"
  78017. "adc r4, r4, #0\n\t"
  78018. #else
  78019. "umull r6, r7, r8, r9\n\t"
  78020. "adds r5, r5, r6\n\t"
  78021. "adcs r3, r3, r7\n\t"
  78022. "adc r4, r4, #0\n\t"
  78023. #endif
  78024. /* A[5] * B[3] */
  78025. "ldr r8, [%[a], #20]\n\t"
  78026. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78027. "lsl r6, r8, #16\n\t"
  78028. "lsl r7, r12, #16\n\t"
  78029. "lsr r6, r6, #16\n\t"
  78030. "lsr r7, r7, #16\n\t"
  78031. "mul r7, r6, r7\n\t"
  78032. "adds r5, r5, r7\n\t"
  78033. "adcs r3, r3, #0\n\t"
  78034. "adc r4, r4, #0\n\t"
  78035. "lsr r7, r12, #16\n\t"
  78036. "mul r6, r7, r6\n\t"
  78037. "lsr r7, r6, #16\n\t"
  78038. "lsl r6, r6, #16\n\t"
  78039. "adds r5, r5, r6\n\t"
  78040. "adcs r3, r3, r7\n\t"
  78041. "adc r4, r4, #0\n\t"
  78042. "lsr r6, r8, #16\n\t"
  78043. "lsr r7, r12, #16\n\t"
  78044. "mul r7, r6, r7\n\t"
  78045. "adds r3, r3, r7\n\t"
  78046. "adc r4, r4, #0\n\t"
  78047. "lsl r7, r12, #16\n\t"
  78048. "lsr r7, r7, #16\n\t"
  78049. "mul r6, r7, r6\n\t"
  78050. "lsr r7, r6, #16\n\t"
  78051. "lsl r6, r6, #16\n\t"
  78052. "adds r5, r5, r6\n\t"
  78053. "adcs r3, r3, r7\n\t"
  78054. "adc r4, r4, #0\n\t"
  78055. #else
  78056. "umull r6, r7, r8, r12\n\t"
  78057. "adds r5, r5, r6\n\t"
  78058. "adcs r3, r3, r7\n\t"
  78059. "adc r4, r4, #0\n\t"
  78060. #endif
  78061. /* A[4] * B[4] */
  78062. "ldr r11, [%[a], #16]\n\t"
  78063. "ldr r12, [%[b], #16]\n\t"
  78064. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78065. "lsl r6, r11, #16\n\t"
  78066. "lsl r7, r12, #16\n\t"
  78067. "lsr r6, r6, #16\n\t"
  78068. "lsr r7, r7, #16\n\t"
  78069. "mul r7, r6, r7\n\t"
  78070. "adds r5, r5, r7\n\t"
  78071. "adcs r3, r3, #0\n\t"
  78072. "adc r4, r4, #0\n\t"
  78073. "lsr r7, r12, #16\n\t"
  78074. "mul r6, r7, r6\n\t"
  78075. "lsr r7, r6, #16\n\t"
  78076. "lsl r6, r6, #16\n\t"
  78077. "adds r5, r5, r6\n\t"
  78078. "adcs r3, r3, r7\n\t"
  78079. "adc r4, r4, #0\n\t"
  78080. "lsr r6, r11, #16\n\t"
  78081. "lsr r7, r12, #16\n\t"
  78082. "mul r7, r6, r7\n\t"
  78083. "adds r3, r3, r7\n\t"
  78084. "adc r4, r4, #0\n\t"
  78085. "lsl r7, r12, #16\n\t"
  78086. "lsr r7, r7, #16\n\t"
  78087. "mul r6, r7, r6\n\t"
  78088. "lsr r7, r6, #16\n\t"
  78089. "lsl r6, r6, #16\n\t"
  78090. "adds r5, r5, r6\n\t"
  78091. "adcs r3, r3, r7\n\t"
  78092. "adc r4, r4, #0\n\t"
  78093. #else
  78094. "umull r6, r7, r11, r12\n\t"
  78095. "adds r5, r5, r6\n\t"
  78096. "adcs r3, r3, r7\n\t"
  78097. "adc r4, r4, #0\n\t"
  78098. #endif
  78099. /* A[3] * B[5] */
  78100. "ldr r8, [%[a], #12]\n\t"
  78101. "ldr r9, [%[b], #20]\n\t"
  78102. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78103. "lsl r6, r8, #16\n\t"
  78104. "lsl r7, r9, #16\n\t"
  78105. "lsr r6, r6, #16\n\t"
  78106. "lsr r7, r7, #16\n\t"
  78107. "mul r7, r6, r7\n\t"
  78108. "adds r5, r5, r7\n\t"
  78109. "adcs r3, r3, #0\n\t"
  78110. "adc r4, r4, #0\n\t"
  78111. "lsr r7, r9, #16\n\t"
  78112. "mul r6, r7, r6\n\t"
  78113. "lsr r7, r6, #16\n\t"
  78114. "lsl r6, r6, #16\n\t"
  78115. "adds r5, r5, r6\n\t"
  78116. "adcs r3, r3, r7\n\t"
  78117. "adc r4, r4, #0\n\t"
  78118. "lsr r6, r8, #16\n\t"
  78119. "lsr r7, r9, #16\n\t"
  78120. "mul r7, r6, r7\n\t"
  78121. "adds r3, r3, r7\n\t"
  78122. "adc r4, r4, #0\n\t"
  78123. "lsl r7, r9, #16\n\t"
  78124. "lsr r7, r7, #16\n\t"
  78125. "mul r6, r7, r6\n\t"
  78126. "lsr r7, r6, #16\n\t"
  78127. "lsl r6, r6, #16\n\t"
  78128. "adds r5, r5, r6\n\t"
  78129. "adcs r3, r3, r7\n\t"
  78130. "adc r4, r4, #0\n\t"
  78131. #else
  78132. "umull r6, r7, r8, r9\n\t"
  78133. "adds r5, r5, r6\n\t"
  78134. "adcs r3, r3, r7\n\t"
  78135. "adc r4, r4, #0\n\t"
  78136. #endif
  78137. /* A[2] * B[6] */
  78138. "ldr r8, [%[a], #8]\n\t"
  78139. "ldr r9, [%[b], #24]\n\t"
  78140. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78141. "lsl r6, r8, #16\n\t"
  78142. "lsl r7, r9, #16\n\t"
  78143. "lsr r6, r6, #16\n\t"
  78144. "lsr r7, r7, #16\n\t"
  78145. "mul r7, r6, r7\n\t"
  78146. "adds r5, r5, r7\n\t"
  78147. "adcs r3, r3, #0\n\t"
  78148. "adc r4, r4, #0\n\t"
  78149. "lsr r7, r9, #16\n\t"
  78150. "mul r6, r7, r6\n\t"
  78151. "lsr r7, r6, #16\n\t"
  78152. "lsl r6, r6, #16\n\t"
  78153. "adds r5, r5, r6\n\t"
  78154. "adcs r3, r3, r7\n\t"
  78155. "adc r4, r4, #0\n\t"
  78156. "lsr r6, r8, #16\n\t"
  78157. "lsr r7, r9, #16\n\t"
  78158. "mul r7, r6, r7\n\t"
  78159. "adds r3, r3, r7\n\t"
  78160. "adc r4, r4, #0\n\t"
  78161. "lsl r7, r9, #16\n\t"
  78162. "lsr r7, r7, #16\n\t"
  78163. "mul r6, r7, r6\n\t"
  78164. "lsr r7, r6, #16\n\t"
  78165. "lsl r6, r6, #16\n\t"
  78166. "adds r5, r5, r6\n\t"
  78167. "adcs r3, r3, r7\n\t"
  78168. "adc r4, r4, #0\n\t"
  78169. #else
  78170. "umull r6, r7, r8, r9\n\t"
  78171. "adds r5, r5, r6\n\t"
  78172. "adcs r3, r3, r7\n\t"
  78173. "adc r4, r4, #0\n\t"
  78174. #endif
  78175. /* A[1] * B[7] */
  78176. "ldr r8, [%[a], #4]\n\t"
  78177. "ldr r9, [%[b], #28]\n\t"
  78178. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78179. "lsl r6, r8, #16\n\t"
  78180. "lsl r7, r9, #16\n\t"
  78181. "lsr r6, r6, #16\n\t"
  78182. "lsr r7, r7, #16\n\t"
  78183. "mul r7, r6, r7\n\t"
  78184. "adds r5, r5, r7\n\t"
  78185. "adcs r3, r3, #0\n\t"
  78186. "adc r4, r4, #0\n\t"
  78187. "lsr r7, r9, #16\n\t"
  78188. "mul r6, r7, r6\n\t"
  78189. "lsr r7, r6, #16\n\t"
  78190. "lsl r6, r6, #16\n\t"
  78191. "adds r5, r5, r6\n\t"
  78192. "adcs r3, r3, r7\n\t"
  78193. "adc r4, r4, #0\n\t"
  78194. "lsr r6, r8, #16\n\t"
  78195. "lsr r7, r9, #16\n\t"
  78196. "mul r7, r6, r7\n\t"
  78197. "adds r3, r3, r7\n\t"
  78198. "adc r4, r4, #0\n\t"
  78199. "lsl r7, r9, #16\n\t"
  78200. "lsr r7, r7, #16\n\t"
  78201. "mul r6, r7, r6\n\t"
  78202. "lsr r7, r6, #16\n\t"
  78203. "lsl r6, r6, #16\n\t"
  78204. "adds r5, r5, r6\n\t"
  78205. "adcs r3, r3, r7\n\t"
  78206. "adc r4, r4, #0\n\t"
  78207. #else
  78208. "umull r6, r7, r8, r9\n\t"
  78209. "adds r5, r5, r6\n\t"
  78210. "adcs r3, r3, r7\n\t"
  78211. "adc r4, r4, #0\n\t"
  78212. #endif
  78213. /* A[0] * B[8] */
  78214. "ldr r8, [%[a]]\n\t"
  78215. "ldr r9, [%[b], #32]\n\t"
  78216. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78217. "lsl r6, r8, #16\n\t"
  78218. "lsl r7, r9, #16\n\t"
  78219. "lsr r6, r6, #16\n\t"
  78220. "lsr r7, r7, #16\n\t"
  78221. "mul r7, r6, r7\n\t"
  78222. "adds r5, r5, r7\n\t"
  78223. "adcs r3, r3, #0\n\t"
  78224. "adc r4, r4, #0\n\t"
  78225. "lsr r7, r9, #16\n\t"
  78226. "mul r6, r7, r6\n\t"
  78227. "lsr r7, r6, #16\n\t"
  78228. "lsl r6, r6, #16\n\t"
  78229. "adds r5, r5, r6\n\t"
  78230. "adcs r3, r3, r7\n\t"
  78231. "adc r4, r4, #0\n\t"
  78232. "lsr r6, r8, #16\n\t"
  78233. "lsr r7, r9, #16\n\t"
  78234. "mul r7, r6, r7\n\t"
  78235. "adds r3, r3, r7\n\t"
  78236. "adc r4, r4, #0\n\t"
  78237. "lsl r7, r9, #16\n\t"
  78238. "lsr r7, r7, #16\n\t"
  78239. "mul r6, r7, r6\n\t"
  78240. "lsr r7, r6, #16\n\t"
  78241. "lsl r6, r6, #16\n\t"
  78242. "adds r5, r5, r6\n\t"
  78243. "adcs r3, r3, r7\n\t"
  78244. "adc r4, r4, #0\n\t"
  78245. #else
  78246. "umull r6, r7, r8, r9\n\t"
  78247. "adds r5, r5, r6\n\t"
  78248. "adcs r3, r3, r7\n\t"
  78249. "adc r4, r4, #0\n\t"
  78250. #endif
  78251. "str r5, [sp, #32]\n\t"
  78252. /* A[0] * B[9] */
  78253. "ldr r9, [%[b], #36]\n\t"
  78254. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78255. "lsl r6, r8, #16\n\t"
  78256. "lsl r7, r9, #16\n\t"
  78257. "lsr r6, r6, #16\n\t"
  78258. "lsr r7, r7, #16\n\t"
  78259. "mul r7, r6, r7\n\t"
  78260. "adds r3, r3, r7\n\t"
  78261. "adcs r4, r4, #0\n\t"
  78262. "mov r5, #0\n\t"
  78263. "adc r5, r5, #0\n\t"
  78264. "lsr r7, r9, #16\n\t"
  78265. "mul r6, r7, r6\n\t"
  78266. "lsr r7, r6, #16\n\t"
  78267. "lsl r6, r6, #16\n\t"
  78268. "adds r3, r3, r6\n\t"
  78269. "adcs r4, r4, r7\n\t"
  78270. "adc r5, r5, #0\n\t"
  78271. "lsr r6, r8, #16\n\t"
  78272. "lsr r7, r9, #16\n\t"
  78273. "mul r7, r6, r7\n\t"
  78274. "adds r4, r4, r7\n\t"
  78275. "adc r5, r5, #0\n\t"
  78276. "lsl r7, r9, #16\n\t"
  78277. "lsr r7, r7, #16\n\t"
  78278. "mul r6, r7, r6\n\t"
  78279. "lsr r7, r6, #16\n\t"
  78280. "lsl r6, r6, #16\n\t"
  78281. "adds r3, r3, r6\n\t"
  78282. "adcs r4, r4, r7\n\t"
  78283. "adc r5, r5, #0\n\t"
  78284. #else
  78285. "umull r6, r7, r8, r9\n\t"
  78286. "adds r3, r3, r6\n\t"
  78287. "adcs r4, r4, r7\n\t"
  78288. "mov r5, #0\n\t"
  78289. "adc r5, r5, #0\n\t"
  78290. #endif
  78291. /* A[1] * B[8] */
  78292. "ldr r8, [%[a], #4]\n\t"
  78293. "ldr r9, [%[b], #32]\n\t"
  78294. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78295. "lsl r6, r8, #16\n\t"
  78296. "lsl r7, r9, #16\n\t"
  78297. "lsr r6, r6, #16\n\t"
  78298. "lsr r7, r7, #16\n\t"
  78299. "mul r7, r6, r7\n\t"
  78300. "adds r3, r3, r7\n\t"
  78301. "adcs r4, r4, #0\n\t"
  78302. "adc r5, r5, #0\n\t"
  78303. "lsr r7, r9, #16\n\t"
  78304. "mul r6, r7, r6\n\t"
  78305. "lsr r7, r6, #16\n\t"
  78306. "lsl r6, r6, #16\n\t"
  78307. "adds r3, r3, r6\n\t"
  78308. "adcs r4, r4, r7\n\t"
  78309. "adc r5, r5, #0\n\t"
  78310. "lsr r6, r8, #16\n\t"
  78311. "lsr r7, r9, #16\n\t"
  78312. "mul r7, r6, r7\n\t"
  78313. "adds r4, r4, r7\n\t"
  78314. "adc r5, r5, #0\n\t"
  78315. "lsl r7, r9, #16\n\t"
  78316. "lsr r7, r7, #16\n\t"
  78317. "mul r6, r7, r6\n\t"
  78318. "lsr r7, r6, #16\n\t"
  78319. "lsl r6, r6, #16\n\t"
  78320. "adds r3, r3, r6\n\t"
  78321. "adcs r4, r4, r7\n\t"
  78322. "adc r5, r5, #0\n\t"
  78323. #else
  78324. "umull r6, r7, r8, r9\n\t"
  78325. "adds r3, r3, r6\n\t"
  78326. "adcs r4, r4, r7\n\t"
  78327. "adc r5, r5, #0\n\t"
  78328. #endif
  78329. /* A[2] * B[7] */
  78330. "ldr r8, [%[a], #8]\n\t"
  78331. "ldr r9, [%[b], #28]\n\t"
  78332. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78333. "lsl r6, r8, #16\n\t"
  78334. "lsl r7, r9, #16\n\t"
  78335. "lsr r6, r6, #16\n\t"
  78336. "lsr r7, r7, #16\n\t"
  78337. "mul r7, r6, r7\n\t"
  78338. "adds r3, r3, r7\n\t"
  78339. "adcs r4, r4, #0\n\t"
  78340. "adc r5, r5, #0\n\t"
  78341. "lsr r7, r9, #16\n\t"
  78342. "mul r6, r7, r6\n\t"
  78343. "lsr r7, r6, #16\n\t"
  78344. "lsl r6, r6, #16\n\t"
  78345. "adds r3, r3, r6\n\t"
  78346. "adcs r4, r4, r7\n\t"
  78347. "adc r5, r5, #0\n\t"
  78348. "lsr r6, r8, #16\n\t"
  78349. "lsr r7, r9, #16\n\t"
  78350. "mul r7, r6, r7\n\t"
  78351. "adds r4, r4, r7\n\t"
  78352. "adc r5, r5, #0\n\t"
  78353. "lsl r7, r9, #16\n\t"
  78354. "lsr r7, r7, #16\n\t"
  78355. "mul r6, r7, r6\n\t"
  78356. "lsr r7, r6, #16\n\t"
  78357. "lsl r6, r6, #16\n\t"
  78358. "adds r3, r3, r6\n\t"
  78359. "adcs r4, r4, r7\n\t"
  78360. "adc r5, r5, #0\n\t"
  78361. #else
  78362. "umull r6, r7, r8, r9\n\t"
  78363. "adds r3, r3, r6\n\t"
  78364. "adcs r4, r4, r7\n\t"
  78365. "adc r5, r5, #0\n\t"
  78366. #endif
  78367. /* A[3] * B[6] */
  78368. "ldr r8, [%[a], #12]\n\t"
  78369. "ldr r9, [%[b], #24]\n\t"
  78370. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78371. "lsl r6, r8, #16\n\t"
  78372. "lsl r7, r9, #16\n\t"
  78373. "lsr r6, r6, #16\n\t"
  78374. "lsr r7, r7, #16\n\t"
  78375. "mul r7, r6, r7\n\t"
  78376. "adds r3, r3, r7\n\t"
  78377. "adcs r4, r4, #0\n\t"
  78378. "adc r5, r5, #0\n\t"
  78379. "lsr r7, r9, #16\n\t"
  78380. "mul r6, r7, r6\n\t"
  78381. "lsr r7, r6, #16\n\t"
  78382. "lsl r6, r6, #16\n\t"
  78383. "adds r3, r3, r6\n\t"
  78384. "adcs r4, r4, r7\n\t"
  78385. "adc r5, r5, #0\n\t"
  78386. "lsr r6, r8, #16\n\t"
  78387. "lsr r7, r9, #16\n\t"
  78388. "mul r7, r6, r7\n\t"
  78389. "adds r4, r4, r7\n\t"
  78390. "adc r5, r5, #0\n\t"
  78391. "lsl r7, r9, #16\n\t"
  78392. "lsr r7, r7, #16\n\t"
  78393. "mul r6, r7, r6\n\t"
  78394. "lsr r7, r6, #16\n\t"
  78395. "lsl r6, r6, #16\n\t"
  78396. "adds r3, r3, r6\n\t"
  78397. "adcs r4, r4, r7\n\t"
  78398. "adc r5, r5, #0\n\t"
  78399. #else
  78400. "umull r6, r7, r8, r9\n\t"
  78401. "adds r3, r3, r6\n\t"
  78402. "adcs r4, r4, r7\n\t"
  78403. "adc r5, r5, #0\n\t"
  78404. #endif
  78405. /* A[4] * B[5] */
  78406. "ldr r9, [%[b], #20]\n\t"
  78407. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78408. "lsl r6, r11, #16\n\t"
  78409. "lsl r7, r9, #16\n\t"
  78410. "lsr r6, r6, #16\n\t"
  78411. "lsr r7, r7, #16\n\t"
  78412. "mul r7, r6, r7\n\t"
  78413. "adds r3, r3, r7\n\t"
  78414. "adcs r4, r4, #0\n\t"
  78415. "adc r5, r5, #0\n\t"
  78416. "lsr r7, r9, #16\n\t"
  78417. "mul r6, r7, r6\n\t"
  78418. "lsr r7, r6, #16\n\t"
  78419. "lsl r6, r6, #16\n\t"
  78420. "adds r3, r3, r6\n\t"
  78421. "adcs r4, r4, r7\n\t"
  78422. "adc r5, r5, #0\n\t"
  78423. "lsr r6, r11, #16\n\t"
  78424. "lsr r7, r9, #16\n\t"
  78425. "mul r7, r6, r7\n\t"
  78426. "adds r4, r4, r7\n\t"
  78427. "adc r5, r5, #0\n\t"
  78428. "lsl r7, r9, #16\n\t"
  78429. "lsr r7, r7, #16\n\t"
  78430. "mul r6, r7, r6\n\t"
  78431. "lsr r7, r6, #16\n\t"
  78432. "lsl r6, r6, #16\n\t"
  78433. "adds r3, r3, r6\n\t"
  78434. "adcs r4, r4, r7\n\t"
  78435. "adc r5, r5, #0\n\t"
  78436. #else
  78437. "umull r6, r7, r11, r9\n\t"
  78438. "adds r3, r3, r6\n\t"
  78439. "adcs r4, r4, r7\n\t"
  78440. "adc r5, r5, #0\n\t"
  78441. #endif
  78442. /* A[5] * B[4] */
  78443. "ldr r8, [%[a], #20]\n\t"
  78444. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78445. "lsl r6, r8, #16\n\t"
  78446. "lsl r7, r12, #16\n\t"
  78447. "lsr r6, r6, #16\n\t"
  78448. "lsr r7, r7, #16\n\t"
  78449. "mul r7, r6, r7\n\t"
  78450. "adds r3, r3, r7\n\t"
  78451. "adcs r4, r4, #0\n\t"
  78452. "adc r5, r5, #0\n\t"
  78453. "lsr r7, r12, #16\n\t"
  78454. "mul r6, r7, r6\n\t"
  78455. "lsr r7, r6, #16\n\t"
  78456. "lsl r6, r6, #16\n\t"
  78457. "adds r3, r3, r6\n\t"
  78458. "adcs r4, r4, r7\n\t"
  78459. "adc r5, r5, #0\n\t"
  78460. "lsr r6, r8, #16\n\t"
  78461. "lsr r7, r12, #16\n\t"
  78462. "mul r7, r6, r7\n\t"
  78463. "adds r4, r4, r7\n\t"
  78464. "adc r5, r5, #0\n\t"
  78465. "lsl r7, r12, #16\n\t"
  78466. "lsr r7, r7, #16\n\t"
  78467. "mul r6, r7, r6\n\t"
  78468. "lsr r7, r6, #16\n\t"
  78469. "lsl r6, r6, #16\n\t"
  78470. "adds r3, r3, r6\n\t"
  78471. "adcs r4, r4, r7\n\t"
  78472. "adc r5, r5, #0\n\t"
  78473. #else
  78474. "umull r6, r7, r8, r12\n\t"
  78475. "adds r3, r3, r6\n\t"
  78476. "adcs r4, r4, r7\n\t"
  78477. "adc r5, r5, #0\n\t"
  78478. #endif
  78479. /* A[6] * B[3] */
  78480. "ldr r8, [%[a], #24]\n\t"
  78481. "ldr r9, [%[b], #12]\n\t"
  78482. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78483. "lsl r6, r8, #16\n\t"
  78484. "lsl r7, r9, #16\n\t"
  78485. "lsr r6, r6, #16\n\t"
  78486. "lsr r7, r7, #16\n\t"
  78487. "mul r7, r6, r7\n\t"
  78488. "adds r3, r3, r7\n\t"
  78489. "adcs r4, r4, #0\n\t"
  78490. "adc r5, r5, #0\n\t"
  78491. "lsr r7, r9, #16\n\t"
  78492. "mul r6, r7, r6\n\t"
  78493. "lsr r7, r6, #16\n\t"
  78494. "lsl r6, r6, #16\n\t"
  78495. "adds r3, r3, r6\n\t"
  78496. "adcs r4, r4, r7\n\t"
  78497. "adc r5, r5, #0\n\t"
  78498. "lsr r6, r8, #16\n\t"
  78499. "lsr r7, r9, #16\n\t"
  78500. "mul r7, r6, r7\n\t"
  78501. "adds r4, r4, r7\n\t"
  78502. "adc r5, r5, #0\n\t"
  78503. "lsl r7, r9, #16\n\t"
  78504. "lsr r7, r7, #16\n\t"
  78505. "mul r6, r7, r6\n\t"
  78506. "lsr r7, r6, #16\n\t"
  78507. "lsl r6, r6, #16\n\t"
  78508. "adds r3, r3, r6\n\t"
  78509. "adcs r4, r4, r7\n\t"
  78510. "adc r5, r5, #0\n\t"
  78511. #else
  78512. "umull r6, r7, r8, r9\n\t"
  78513. "adds r3, r3, r6\n\t"
  78514. "adcs r4, r4, r7\n\t"
  78515. "adc r5, r5, #0\n\t"
  78516. #endif
  78517. /* A[7] * B[2] */
  78518. "ldr r8, [%[a], #28]\n\t"
  78519. "ldr r9, [%[b], #8]\n\t"
  78520. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78521. "lsl r6, r8, #16\n\t"
  78522. "lsl r7, r9, #16\n\t"
  78523. "lsr r6, r6, #16\n\t"
  78524. "lsr r7, r7, #16\n\t"
  78525. "mul r7, r6, r7\n\t"
  78526. "adds r3, r3, r7\n\t"
  78527. "adcs r4, r4, #0\n\t"
  78528. "adc r5, r5, #0\n\t"
  78529. "lsr r7, r9, #16\n\t"
  78530. "mul r6, r7, r6\n\t"
  78531. "lsr r7, r6, #16\n\t"
  78532. "lsl r6, r6, #16\n\t"
  78533. "adds r3, r3, r6\n\t"
  78534. "adcs r4, r4, r7\n\t"
  78535. "adc r5, r5, #0\n\t"
  78536. "lsr r6, r8, #16\n\t"
  78537. "lsr r7, r9, #16\n\t"
  78538. "mul r7, r6, r7\n\t"
  78539. "adds r4, r4, r7\n\t"
  78540. "adc r5, r5, #0\n\t"
  78541. "lsl r7, r9, #16\n\t"
  78542. "lsr r7, r7, #16\n\t"
  78543. "mul r6, r7, r6\n\t"
  78544. "lsr r7, r6, #16\n\t"
  78545. "lsl r6, r6, #16\n\t"
  78546. "adds r3, r3, r6\n\t"
  78547. "adcs r4, r4, r7\n\t"
  78548. "adc r5, r5, #0\n\t"
  78549. #else
  78550. "umull r6, r7, r8, r9\n\t"
  78551. "adds r3, r3, r6\n\t"
  78552. "adcs r4, r4, r7\n\t"
  78553. "adc r5, r5, #0\n\t"
  78554. #endif
  78555. /* A[8] * B[1] */
  78556. "ldr r8, [%[a], #32]\n\t"
  78557. "ldr r9, [%[b], #4]\n\t"
  78558. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78559. "lsl r6, r8, #16\n\t"
  78560. "lsl r7, r9, #16\n\t"
  78561. "lsr r6, r6, #16\n\t"
  78562. "lsr r7, r7, #16\n\t"
  78563. "mul r7, r6, r7\n\t"
  78564. "adds r3, r3, r7\n\t"
  78565. "adcs r4, r4, #0\n\t"
  78566. "adc r5, r5, #0\n\t"
  78567. "lsr r7, r9, #16\n\t"
  78568. "mul r6, r7, r6\n\t"
  78569. "lsr r7, r6, #16\n\t"
  78570. "lsl r6, r6, #16\n\t"
  78571. "adds r3, r3, r6\n\t"
  78572. "adcs r4, r4, r7\n\t"
  78573. "adc r5, r5, #0\n\t"
  78574. "lsr r6, r8, #16\n\t"
  78575. "lsr r7, r9, #16\n\t"
  78576. "mul r7, r6, r7\n\t"
  78577. "adds r4, r4, r7\n\t"
  78578. "adc r5, r5, #0\n\t"
  78579. "lsl r7, r9, #16\n\t"
  78580. "lsr r7, r7, #16\n\t"
  78581. "mul r6, r7, r6\n\t"
  78582. "lsr r7, r6, #16\n\t"
  78583. "lsl r6, r6, #16\n\t"
  78584. "adds r3, r3, r6\n\t"
  78585. "adcs r4, r4, r7\n\t"
  78586. "adc r5, r5, #0\n\t"
  78587. #else
  78588. "umull r6, r7, r8, r9\n\t"
  78589. "adds r3, r3, r6\n\t"
  78590. "adcs r4, r4, r7\n\t"
  78591. "adc r5, r5, #0\n\t"
  78592. #endif
  78593. /* A[9] * B[0] */
  78594. "ldr r8, [%[a], #36]\n\t"
  78595. "ldr r9, [%[b]]\n\t"
  78596. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78597. "lsl r6, r8, #16\n\t"
  78598. "lsl r7, r9, #16\n\t"
  78599. "lsr r6, r6, #16\n\t"
  78600. "lsr r7, r7, #16\n\t"
  78601. "mul r7, r6, r7\n\t"
  78602. "adds r3, r3, r7\n\t"
  78603. "adcs r4, r4, #0\n\t"
  78604. "adc r5, r5, #0\n\t"
  78605. "lsr r7, r9, #16\n\t"
  78606. "mul r6, r7, r6\n\t"
  78607. "lsr r7, r6, #16\n\t"
  78608. "lsl r6, r6, #16\n\t"
  78609. "adds r3, r3, r6\n\t"
  78610. "adcs r4, r4, r7\n\t"
  78611. "adc r5, r5, #0\n\t"
  78612. "lsr r6, r8, #16\n\t"
  78613. "lsr r7, r9, #16\n\t"
  78614. "mul r7, r6, r7\n\t"
  78615. "adds r4, r4, r7\n\t"
  78616. "adc r5, r5, #0\n\t"
  78617. "lsl r7, r9, #16\n\t"
  78618. "lsr r7, r7, #16\n\t"
  78619. "mul r6, r7, r6\n\t"
  78620. "lsr r7, r6, #16\n\t"
  78621. "lsl r6, r6, #16\n\t"
  78622. "adds r3, r3, r6\n\t"
  78623. "adcs r4, r4, r7\n\t"
  78624. "adc r5, r5, #0\n\t"
  78625. #else
  78626. "umull r6, r7, r8, r9\n\t"
  78627. "adds r3, r3, r6\n\t"
  78628. "adcs r4, r4, r7\n\t"
  78629. "adc r5, r5, #0\n\t"
  78630. #endif
  78631. "str r3, [sp, #36]\n\t"
  78632. /* A[10] * B[0] */
  78633. "ldr r8, [%[a], #40]\n\t"
  78634. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78635. "lsl r6, r8, #16\n\t"
  78636. "lsl r7, r9, #16\n\t"
  78637. "lsr r6, r6, #16\n\t"
  78638. "lsr r7, r7, #16\n\t"
  78639. "mul r7, r6, r7\n\t"
  78640. "adds r4, r4, r7\n\t"
  78641. "adcs r5, r5, #0\n\t"
  78642. "mov r3, #0\n\t"
  78643. "adc r3, r3, #0\n\t"
  78644. "lsr r7, r9, #16\n\t"
  78645. "mul r6, r7, r6\n\t"
  78646. "lsr r7, r6, #16\n\t"
  78647. "lsl r6, r6, #16\n\t"
  78648. "adds r4, r4, r6\n\t"
  78649. "adcs r5, r5, r7\n\t"
  78650. "adc r3, r3, #0\n\t"
  78651. "lsr r6, r8, #16\n\t"
  78652. "lsr r7, r9, #16\n\t"
  78653. "mul r7, r6, r7\n\t"
  78654. "adds r5, r5, r7\n\t"
  78655. "adc r3, r3, #0\n\t"
  78656. "lsl r7, r9, #16\n\t"
  78657. "lsr r7, r7, #16\n\t"
  78658. "mul r6, r7, r6\n\t"
  78659. "lsr r7, r6, #16\n\t"
  78660. "lsl r6, r6, #16\n\t"
  78661. "adds r4, r4, r6\n\t"
  78662. "adcs r5, r5, r7\n\t"
  78663. "adc r3, r3, #0\n\t"
  78664. #else
  78665. "umull r6, r7, r8, r9\n\t"
  78666. "adds r4, r4, r6\n\t"
  78667. "adcs r5, r5, r7\n\t"
  78668. "mov r3, #0\n\t"
  78669. "adc r3, r3, #0\n\t"
  78670. #endif
  78671. /* A[9] * B[1] */
  78672. "ldr r8, [%[a], #36]\n\t"
  78673. "ldr r9, [%[b], #4]\n\t"
  78674. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78675. "lsl r6, r8, #16\n\t"
  78676. "lsl r7, r9, #16\n\t"
  78677. "lsr r6, r6, #16\n\t"
  78678. "lsr r7, r7, #16\n\t"
  78679. "mul r7, r6, r7\n\t"
  78680. "adds r4, r4, r7\n\t"
  78681. "adcs r5, r5, #0\n\t"
  78682. "adc r3, r3, #0\n\t"
  78683. "lsr r7, r9, #16\n\t"
  78684. "mul r6, r7, r6\n\t"
  78685. "lsr r7, r6, #16\n\t"
  78686. "lsl r6, r6, #16\n\t"
  78687. "adds r4, r4, r6\n\t"
  78688. "adcs r5, r5, r7\n\t"
  78689. "adc r3, r3, #0\n\t"
  78690. "lsr r6, r8, #16\n\t"
  78691. "lsr r7, r9, #16\n\t"
  78692. "mul r7, r6, r7\n\t"
  78693. "adds r5, r5, r7\n\t"
  78694. "adc r3, r3, #0\n\t"
  78695. "lsl r7, r9, #16\n\t"
  78696. "lsr r7, r7, #16\n\t"
  78697. "mul r6, r7, r6\n\t"
  78698. "lsr r7, r6, #16\n\t"
  78699. "lsl r6, r6, #16\n\t"
  78700. "adds r4, r4, r6\n\t"
  78701. "adcs r5, r5, r7\n\t"
  78702. "adc r3, r3, #0\n\t"
  78703. #else
  78704. "umull r6, r7, r8, r9\n\t"
  78705. "adds r4, r4, r6\n\t"
  78706. "adcs r5, r5, r7\n\t"
  78707. "adc r3, r3, #0\n\t"
  78708. #endif
  78709. /* A[8] * B[2] */
  78710. "ldr r8, [%[a], #32]\n\t"
  78711. "ldr r9, [%[b], #8]\n\t"
  78712. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78713. "lsl r6, r8, #16\n\t"
  78714. "lsl r7, r9, #16\n\t"
  78715. "lsr r6, r6, #16\n\t"
  78716. "lsr r7, r7, #16\n\t"
  78717. "mul r7, r6, r7\n\t"
  78718. "adds r4, r4, r7\n\t"
  78719. "adcs r5, r5, #0\n\t"
  78720. "adc r3, r3, #0\n\t"
  78721. "lsr r7, r9, #16\n\t"
  78722. "mul r6, r7, r6\n\t"
  78723. "lsr r7, r6, #16\n\t"
  78724. "lsl r6, r6, #16\n\t"
  78725. "adds r4, r4, r6\n\t"
  78726. "adcs r5, r5, r7\n\t"
  78727. "adc r3, r3, #0\n\t"
  78728. "lsr r6, r8, #16\n\t"
  78729. "lsr r7, r9, #16\n\t"
  78730. "mul r7, r6, r7\n\t"
  78731. "adds r5, r5, r7\n\t"
  78732. "adc r3, r3, #0\n\t"
  78733. "lsl r7, r9, #16\n\t"
  78734. "lsr r7, r7, #16\n\t"
  78735. "mul r6, r7, r6\n\t"
  78736. "lsr r7, r6, #16\n\t"
  78737. "lsl r6, r6, #16\n\t"
  78738. "adds r4, r4, r6\n\t"
  78739. "adcs r5, r5, r7\n\t"
  78740. "adc r3, r3, #0\n\t"
  78741. #else
  78742. "umull r6, r7, r8, r9\n\t"
  78743. "adds r4, r4, r6\n\t"
  78744. "adcs r5, r5, r7\n\t"
  78745. "adc r3, r3, #0\n\t"
  78746. #endif
  78747. /* A[7] * B[3] */
  78748. "ldr r8, [%[a], #28]\n\t"
  78749. "ldr r9, [%[b], #12]\n\t"
  78750. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78751. "lsl r6, r8, #16\n\t"
  78752. "lsl r7, r9, #16\n\t"
  78753. "lsr r6, r6, #16\n\t"
  78754. "lsr r7, r7, #16\n\t"
  78755. "mul r7, r6, r7\n\t"
  78756. "adds r4, r4, r7\n\t"
  78757. "adcs r5, r5, #0\n\t"
  78758. "adc r3, r3, #0\n\t"
  78759. "lsr r7, r9, #16\n\t"
  78760. "mul r6, r7, r6\n\t"
  78761. "lsr r7, r6, #16\n\t"
  78762. "lsl r6, r6, #16\n\t"
  78763. "adds r4, r4, r6\n\t"
  78764. "adcs r5, r5, r7\n\t"
  78765. "adc r3, r3, #0\n\t"
  78766. "lsr r6, r8, #16\n\t"
  78767. "lsr r7, r9, #16\n\t"
  78768. "mul r7, r6, r7\n\t"
  78769. "adds r5, r5, r7\n\t"
  78770. "adc r3, r3, #0\n\t"
  78771. "lsl r7, r9, #16\n\t"
  78772. "lsr r7, r7, #16\n\t"
  78773. "mul r6, r7, r6\n\t"
  78774. "lsr r7, r6, #16\n\t"
  78775. "lsl r6, r6, #16\n\t"
  78776. "adds r4, r4, r6\n\t"
  78777. "adcs r5, r5, r7\n\t"
  78778. "adc r3, r3, #0\n\t"
  78779. #else
  78780. "umull r6, r7, r8, r9\n\t"
  78781. "adds r4, r4, r6\n\t"
  78782. "adcs r5, r5, r7\n\t"
  78783. "adc r3, r3, #0\n\t"
  78784. #endif
  78785. /* A[6] * B[4] */
  78786. "ldr r8, [%[a], #24]\n\t"
  78787. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78788. "lsl r6, r8, #16\n\t"
  78789. "lsl r7, r12, #16\n\t"
  78790. "lsr r6, r6, #16\n\t"
  78791. "lsr r7, r7, #16\n\t"
  78792. "mul r7, r6, r7\n\t"
  78793. "adds r4, r4, r7\n\t"
  78794. "adcs r5, r5, #0\n\t"
  78795. "adc r3, r3, #0\n\t"
  78796. "lsr r7, r12, #16\n\t"
  78797. "mul r6, r7, r6\n\t"
  78798. "lsr r7, r6, #16\n\t"
  78799. "lsl r6, r6, #16\n\t"
  78800. "adds r4, r4, r6\n\t"
  78801. "adcs r5, r5, r7\n\t"
  78802. "adc r3, r3, #0\n\t"
  78803. "lsr r6, r8, #16\n\t"
  78804. "lsr r7, r12, #16\n\t"
  78805. "mul r7, r6, r7\n\t"
  78806. "adds r5, r5, r7\n\t"
  78807. "adc r3, r3, #0\n\t"
  78808. "lsl r7, r12, #16\n\t"
  78809. "lsr r7, r7, #16\n\t"
  78810. "mul r6, r7, r6\n\t"
  78811. "lsr r7, r6, #16\n\t"
  78812. "lsl r6, r6, #16\n\t"
  78813. "adds r4, r4, r6\n\t"
  78814. "adcs r5, r5, r7\n\t"
  78815. "adc r3, r3, #0\n\t"
  78816. #else
  78817. "umull r6, r7, r8, r12\n\t"
  78818. "adds r4, r4, r6\n\t"
  78819. "adcs r5, r5, r7\n\t"
  78820. "adc r3, r3, #0\n\t"
  78821. #endif
  78822. /* A[5] * B[5] */
  78823. "ldr r11, [%[a], #20]\n\t"
  78824. "ldr r12, [%[b], #20]\n\t"
  78825. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78826. "lsl r6, r11, #16\n\t"
  78827. "lsl r7, r12, #16\n\t"
  78828. "lsr r6, r6, #16\n\t"
  78829. "lsr r7, r7, #16\n\t"
  78830. "mul r7, r6, r7\n\t"
  78831. "adds r4, r4, r7\n\t"
  78832. "adcs r5, r5, #0\n\t"
  78833. "adc r3, r3, #0\n\t"
  78834. "lsr r7, r12, #16\n\t"
  78835. "mul r6, r7, r6\n\t"
  78836. "lsr r7, r6, #16\n\t"
  78837. "lsl r6, r6, #16\n\t"
  78838. "adds r4, r4, r6\n\t"
  78839. "adcs r5, r5, r7\n\t"
  78840. "adc r3, r3, #0\n\t"
  78841. "lsr r6, r11, #16\n\t"
  78842. "lsr r7, r12, #16\n\t"
  78843. "mul r7, r6, r7\n\t"
  78844. "adds r5, r5, r7\n\t"
  78845. "adc r3, r3, #0\n\t"
  78846. "lsl r7, r12, #16\n\t"
  78847. "lsr r7, r7, #16\n\t"
  78848. "mul r6, r7, r6\n\t"
  78849. "lsr r7, r6, #16\n\t"
  78850. "lsl r6, r6, #16\n\t"
  78851. "adds r4, r4, r6\n\t"
  78852. "adcs r5, r5, r7\n\t"
  78853. "adc r3, r3, #0\n\t"
  78854. #else
  78855. "umull r6, r7, r11, r12\n\t"
  78856. "adds r4, r4, r6\n\t"
  78857. "adcs r5, r5, r7\n\t"
  78858. "adc r3, r3, #0\n\t"
  78859. #endif
  78860. /* A[4] * B[6] */
  78861. "ldr r8, [%[a], #16]\n\t"
  78862. "ldr r9, [%[b], #24]\n\t"
  78863. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78864. "lsl r6, r8, #16\n\t"
  78865. "lsl r7, r9, #16\n\t"
  78866. "lsr r6, r6, #16\n\t"
  78867. "lsr r7, r7, #16\n\t"
  78868. "mul r7, r6, r7\n\t"
  78869. "adds r4, r4, r7\n\t"
  78870. "adcs r5, r5, #0\n\t"
  78871. "adc r3, r3, #0\n\t"
  78872. "lsr r7, r9, #16\n\t"
  78873. "mul r6, r7, r6\n\t"
  78874. "lsr r7, r6, #16\n\t"
  78875. "lsl r6, r6, #16\n\t"
  78876. "adds r4, r4, r6\n\t"
  78877. "adcs r5, r5, r7\n\t"
  78878. "adc r3, r3, #0\n\t"
  78879. "lsr r6, r8, #16\n\t"
  78880. "lsr r7, r9, #16\n\t"
  78881. "mul r7, r6, r7\n\t"
  78882. "adds r5, r5, r7\n\t"
  78883. "adc r3, r3, #0\n\t"
  78884. "lsl r7, r9, #16\n\t"
  78885. "lsr r7, r7, #16\n\t"
  78886. "mul r6, r7, r6\n\t"
  78887. "lsr r7, r6, #16\n\t"
  78888. "lsl r6, r6, #16\n\t"
  78889. "adds r4, r4, r6\n\t"
  78890. "adcs r5, r5, r7\n\t"
  78891. "adc r3, r3, #0\n\t"
  78892. #else
  78893. "umull r6, r7, r8, r9\n\t"
  78894. "adds r4, r4, r6\n\t"
  78895. "adcs r5, r5, r7\n\t"
  78896. "adc r3, r3, #0\n\t"
  78897. #endif
  78898. /* A[3] * B[7] */
  78899. "ldr r8, [%[a], #12]\n\t"
  78900. "ldr r9, [%[b], #28]\n\t"
  78901. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78902. "lsl r6, r8, #16\n\t"
  78903. "lsl r7, r9, #16\n\t"
  78904. "lsr r6, r6, #16\n\t"
  78905. "lsr r7, r7, #16\n\t"
  78906. "mul r7, r6, r7\n\t"
  78907. "adds r4, r4, r7\n\t"
  78908. "adcs r5, r5, #0\n\t"
  78909. "adc r3, r3, #0\n\t"
  78910. "lsr r7, r9, #16\n\t"
  78911. "mul r6, r7, r6\n\t"
  78912. "lsr r7, r6, #16\n\t"
  78913. "lsl r6, r6, #16\n\t"
  78914. "adds r4, r4, r6\n\t"
  78915. "adcs r5, r5, r7\n\t"
  78916. "adc r3, r3, #0\n\t"
  78917. "lsr r6, r8, #16\n\t"
  78918. "lsr r7, r9, #16\n\t"
  78919. "mul r7, r6, r7\n\t"
  78920. "adds r5, r5, r7\n\t"
  78921. "adc r3, r3, #0\n\t"
  78922. "lsl r7, r9, #16\n\t"
  78923. "lsr r7, r7, #16\n\t"
  78924. "mul r6, r7, r6\n\t"
  78925. "lsr r7, r6, #16\n\t"
  78926. "lsl r6, r6, #16\n\t"
  78927. "adds r4, r4, r6\n\t"
  78928. "adcs r5, r5, r7\n\t"
  78929. "adc r3, r3, #0\n\t"
  78930. #else
  78931. "umull r6, r7, r8, r9\n\t"
  78932. "adds r4, r4, r6\n\t"
  78933. "adcs r5, r5, r7\n\t"
  78934. "adc r3, r3, #0\n\t"
  78935. #endif
  78936. /* A[2] * B[8] */
  78937. "ldr r8, [%[a], #8]\n\t"
  78938. "ldr r9, [%[b], #32]\n\t"
  78939. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78940. "lsl r6, r8, #16\n\t"
  78941. "lsl r7, r9, #16\n\t"
  78942. "lsr r6, r6, #16\n\t"
  78943. "lsr r7, r7, #16\n\t"
  78944. "mul r7, r6, r7\n\t"
  78945. "adds r4, r4, r7\n\t"
  78946. "adcs r5, r5, #0\n\t"
  78947. "adc r3, r3, #0\n\t"
  78948. "lsr r7, r9, #16\n\t"
  78949. "mul r6, r7, r6\n\t"
  78950. "lsr r7, r6, #16\n\t"
  78951. "lsl r6, r6, #16\n\t"
  78952. "adds r4, r4, r6\n\t"
  78953. "adcs r5, r5, r7\n\t"
  78954. "adc r3, r3, #0\n\t"
  78955. "lsr r6, r8, #16\n\t"
  78956. "lsr r7, r9, #16\n\t"
  78957. "mul r7, r6, r7\n\t"
  78958. "adds r5, r5, r7\n\t"
  78959. "adc r3, r3, #0\n\t"
  78960. "lsl r7, r9, #16\n\t"
  78961. "lsr r7, r7, #16\n\t"
  78962. "mul r6, r7, r6\n\t"
  78963. "lsr r7, r6, #16\n\t"
  78964. "lsl r6, r6, #16\n\t"
  78965. "adds r4, r4, r6\n\t"
  78966. "adcs r5, r5, r7\n\t"
  78967. "adc r3, r3, #0\n\t"
  78968. #else
  78969. "umull r6, r7, r8, r9\n\t"
  78970. "adds r4, r4, r6\n\t"
  78971. "adcs r5, r5, r7\n\t"
  78972. "adc r3, r3, #0\n\t"
  78973. #endif
  78974. /* A[1] * B[9] */
  78975. "ldr r8, [%[a], #4]\n\t"
  78976. "ldr r9, [%[b], #36]\n\t"
  78977. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  78978. "lsl r6, r8, #16\n\t"
  78979. "lsl r7, r9, #16\n\t"
  78980. "lsr r6, r6, #16\n\t"
  78981. "lsr r7, r7, #16\n\t"
  78982. "mul r7, r6, r7\n\t"
  78983. "adds r4, r4, r7\n\t"
  78984. "adcs r5, r5, #0\n\t"
  78985. "adc r3, r3, #0\n\t"
  78986. "lsr r7, r9, #16\n\t"
  78987. "mul r6, r7, r6\n\t"
  78988. "lsr r7, r6, #16\n\t"
  78989. "lsl r6, r6, #16\n\t"
  78990. "adds r4, r4, r6\n\t"
  78991. "adcs r5, r5, r7\n\t"
  78992. "adc r3, r3, #0\n\t"
  78993. "lsr r6, r8, #16\n\t"
  78994. "lsr r7, r9, #16\n\t"
  78995. "mul r7, r6, r7\n\t"
  78996. "adds r5, r5, r7\n\t"
  78997. "adc r3, r3, #0\n\t"
  78998. "lsl r7, r9, #16\n\t"
  78999. "lsr r7, r7, #16\n\t"
  79000. "mul r6, r7, r6\n\t"
  79001. "lsr r7, r6, #16\n\t"
  79002. "lsl r6, r6, #16\n\t"
  79003. "adds r4, r4, r6\n\t"
  79004. "adcs r5, r5, r7\n\t"
  79005. "adc r3, r3, #0\n\t"
  79006. #else
  79007. "umull r6, r7, r8, r9\n\t"
  79008. "adds r4, r4, r6\n\t"
  79009. "adcs r5, r5, r7\n\t"
  79010. "adc r3, r3, #0\n\t"
  79011. #endif
  79012. /* A[0] * B[10] */
  79013. "ldr r8, [%[a]]\n\t"
  79014. "ldr r9, [%[b], #40]\n\t"
  79015. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79016. "lsl r6, r8, #16\n\t"
  79017. "lsl r7, r9, #16\n\t"
  79018. "lsr r6, r6, #16\n\t"
  79019. "lsr r7, r7, #16\n\t"
  79020. "mul r7, r6, r7\n\t"
  79021. "adds r4, r4, r7\n\t"
  79022. "adcs r5, r5, #0\n\t"
  79023. "adc r3, r3, #0\n\t"
  79024. "lsr r7, r9, #16\n\t"
  79025. "mul r6, r7, r6\n\t"
  79026. "lsr r7, r6, #16\n\t"
  79027. "lsl r6, r6, #16\n\t"
  79028. "adds r4, r4, r6\n\t"
  79029. "adcs r5, r5, r7\n\t"
  79030. "adc r3, r3, #0\n\t"
  79031. "lsr r6, r8, #16\n\t"
  79032. "lsr r7, r9, #16\n\t"
  79033. "mul r7, r6, r7\n\t"
  79034. "adds r5, r5, r7\n\t"
  79035. "adc r3, r3, #0\n\t"
  79036. "lsl r7, r9, #16\n\t"
  79037. "lsr r7, r7, #16\n\t"
  79038. "mul r6, r7, r6\n\t"
  79039. "lsr r7, r6, #16\n\t"
  79040. "lsl r6, r6, #16\n\t"
  79041. "adds r4, r4, r6\n\t"
  79042. "adcs r5, r5, r7\n\t"
  79043. "adc r3, r3, #0\n\t"
  79044. #else
  79045. "umull r6, r7, r8, r9\n\t"
  79046. "adds r4, r4, r6\n\t"
  79047. "adcs r5, r5, r7\n\t"
  79048. "adc r3, r3, #0\n\t"
  79049. #endif
  79050. "str r4, [sp, #40]\n\t"
  79051. /* A[0] * B[11] */
  79052. "ldr r9, [%[b], #44]\n\t"
  79053. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79054. "lsl r6, r8, #16\n\t"
  79055. "lsl r7, r9, #16\n\t"
  79056. "lsr r6, r6, #16\n\t"
  79057. "lsr r7, r7, #16\n\t"
  79058. "mul r7, r6, r7\n\t"
  79059. "adds r5, r5, r7\n\t"
  79060. "adcs r3, r3, #0\n\t"
  79061. "mov r4, #0\n\t"
  79062. "adc r4, r4, #0\n\t"
  79063. "lsr r7, r9, #16\n\t"
  79064. "mul r6, r7, r6\n\t"
  79065. "lsr r7, r6, #16\n\t"
  79066. "lsl r6, r6, #16\n\t"
  79067. "adds r5, r5, r6\n\t"
  79068. "adcs r3, r3, r7\n\t"
  79069. "adc r4, r4, #0\n\t"
  79070. "lsr r6, r8, #16\n\t"
  79071. "lsr r7, r9, #16\n\t"
  79072. "mul r7, r6, r7\n\t"
  79073. "adds r3, r3, r7\n\t"
  79074. "adc r4, r4, #0\n\t"
  79075. "lsl r7, r9, #16\n\t"
  79076. "lsr r7, r7, #16\n\t"
  79077. "mul r6, r7, r6\n\t"
  79078. "lsr r7, r6, #16\n\t"
  79079. "lsl r6, r6, #16\n\t"
  79080. "adds r5, r5, r6\n\t"
  79081. "adcs r3, r3, r7\n\t"
  79082. "adc r4, r4, #0\n\t"
  79083. #else
  79084. "umull r6, r7, r8, r9\n\t"
  79085. "adds r5, r5, r6\n\t"
  79086. "adcs r3, r3, r7\n\t"
  79087. "mov r4, #0\n\t"
  79088. "adc r4, r4, #0\n\t"
  79089. #endif
  79090. /* A[1] * B[10] */
  79091. "ldr r8, [%[a], #4]\n\t"
  79092. "ldr r9, [%[b], #40]\n\t"
  79093. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79094. "lsl r6, r8, #16\n\t"
  79095. "lsl r7, r9, #16\n\t"
  79096. "lsr r6, r6, #16\n\t"
  79097. "lsr r7, r7, #16\n\t"
  79098. "mul r7, r6, r7\n\t"
  79099. "adds r5, r5, r7\n\t"
  79100. "adcs r3, r3, #0\n\t"
  79101. "adc r4, r4, #0\n\t"
  79102. "lsr r7, r9, #16\n\t"
  79103. "mul r6, r7, r6\n\t"
  79104. "lsr r7, r6, #16\n\t"
  79105. "lsl r6, r6, #16\n\t"
  79106. "adds r5, r5, r6\n\t"
  79107. "adcs r3, r3, r7\n\t"
  79108. "adc r4, r4, #0\n\t"
  79109. "lsr r6, r8, #16\n\t"
  79110. "lsr r7, r9, #16\n\t"
  79111. "mul r7, r6, r7\n\t"
  79112. "adds r3, r3, r7\n\t"
  79113. "adc r4, r4, #0\n\t"
  79114. "lsl r7, r9, #16\n\t"
  79115. "lsr r7, r7, #16\n\t"
  79116. "mul r6, r7, r6\n\t"
  79117. "lsr r7, r6, #16\n\t"
  79118. "lsl r6, r6, #16\n\t"
  79119. "adds r5, r5, r6\n\t"
  79120. "adcs r3, r3, r7\n\t"
  79121. "adc r4, r4, #0\n\t"
  79122. #else
  79123. "umull r6, r7, r8, r9\n\t"
  79124. "adds r5, r5, r6\n\t"
  79125. "adcs r3, r3, r7\n\t"
  79126. "adc r4, r4, #0\n\t"
  79127. #endif
  79128. /* A[2] * B[9] */
  79129. "ldr r8, [%[a], #8]\n\t"
  79130. "ldr r9, [%[b], #36]\n\t"
  79131. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79132. "lsl r6, r8, #16\n\t"
  79133. "lsl r7, r9, #16\n\t"
  79134. "lsr r6, r6, #16\n\t"
  79135. "lsr r7, r7, #16\n\t"
  79136. "mul r7, r6, r7\n\t"
  79137. "adds r5, r5, r7\n\t"
  79138. "adcs r3, r3, #0\n\t"
  79139. "adc r4, r4, #0\n\t"
  79140. "lsr r7, r9, #16\n\t"
  79141. "mul r6, r7, r6\n\t"
  79142. "lsr r7, r6, #16\n\t"
  79143. "lsl r6, r6, #16\n\t"
  79144. "adds r5, r5, r6\n\t"
  79145. "adcs r3, r3, r7\n\t"
  79146. "adc r4, r4, #0\n\t"
  79147. "lsr r6, r8, #16\n\t"
  79148. "lsr r7, r9, #16\n\t"
  79149. "mul r7, r6, r7\n\t"
  79150. "adds r3, r3, r7\n\t"
  79151. "adc r4, r4, #0\n\t"
  79152. "lsl r7, r9, #16\n\t"
  79153. "lsr r7, r7, #16\n\t"
  79154. "mul r6, r7, r6\n\t"
  79155. "lsr r7, r6, #16\n\t"
  79156. "lsl r6, r6, #16\n\t"
  79157. "adds r5, r5, r6\n\t"
  79158. "adcs r3, r3, r7\n\t"
  79159. "adc r4, r4, #0\n\t"
  79160. #else
  79161. "umull r6, r7, r8, r9\n\t"
  79162. "adds r5, r5, r6\n\t"
  79163. "adcs r3, r3, r7\n\t"
  79164. "adc r4, r4, #0\n\t"
  79165. #endif
  79166. /* A[3] * B[8] */
  79167. "ldr r8, [%[a], #12]\n\t"
  79168. "ldr r9, [%[b], #32]\n\t"
  79169. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79170. "lsl r6, r8, #16\n\t"
  79171. "lsl r7, r9, #16\n\t"
  79172. "lsr r6, r6, #16\n\t"
  79173. "lsr r7, r7, #16\n\t"
  79174. "mul r7, r6, r7\n\t"
  79175. "adds r5, r5, r7\n\t"
  79176. "adcs r3, r3, #0\n\t"
  79177. "adc r4, r4, #0\n\t"
  79178. "lsr r7, r9, #16\n\t"
  79179. "mul r6, r7, r6\n\t"
  79180. "lsr r7, r6, #16\n\t"
  79181. "lsl r6, r6, #16\n\t"
  79182. "adds r5, r5, r6\n\t"
  79183. "adcs r3, r3, r7\n\t"
  79184. "adc r4, r4, #0\n\t"
  79185. "lsr r6, r8, #16\n\t"
  79186. "lsr r7, r9, #16\n\t"
  79187. "mul r7, r6, r7\n\t"
  79188. "adds r3, r3, r7\n\t"
  79189. "adc r4, r4, #0\n\t"
  79190. "lsl r7, r9, #16\n\t"
  79191. "lsr r7, r7, #16\n\t"
  79192. "mul r6, r7, r6\n\t"
  79193. "lsr r7, r6, #16\n\t"
  79194. "lsl r6, r6, #16\n\t"
  79195. "adds r5, r5, r6\n\t"
  79196. "adcs r3, r3, r7\n\t"
  79197. "adc r4, r4, #0\n\t"
  79198. #else
  79199. "umull r6, r7, r8, r9\n\t"
  79200. "adds r5, r5, r6\n\t"
  79201. "adcs r3, r3, r7\n\t"
  79202. "adc r4, r4, #0\n\t"
  79203. #endif
  79204. /* A[4] * B[7] */
  79205. "ldr r8, [%[a], #16]\n\t"
  79206. "ldr r9, [%[b], #28]\n\t"
  79207. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79208. "lsl r6, r8, #16\n\t"
  79209. "lsl r7, r9, #16\n\t"
  79210. "lsr r6, r6, #16\n\t"
  79211. "lsr r7, r7, #16\n\t"
  79212. "mul r7, r6, r7\n\t"
  79213. "adds r5, r5, r7\n\t"
  79214. "adcs r3, r3, #0\n\t"
  79215. "adc r4, r4, #0\n\t"
  79216. "lsr r7, r9, #16\n\t"
  79217. "mul r6, r7, r6\n\t"
  79218. "lsr r7, r6, #16\n\t"
  79219. "lsl r6, r6, #16\n\t"
  79220. "adds r5, r5, r6\n\t"
  79221. "adcs r3, r3, r7\n\t"
  79222. "adc r4, r4, #0\n\t"
  79223. "lsr r6, r8, #16\n\t"
  79224. "lsr r7, r9, #16\n\t"
  79225. "mul r7, r6, r7\n\t"
  79226. "adds r3, r3, r7\n\t"
  79227. "adc r4, r4, #0\n\t"
  79228. "lsl r7, r9, #16\n\t"
  79229. "lsr r7, r7, #16\n\t"
  79230. "mul r6, r7, r6\n\t"
  79231. "lsr r7, r6, #16\n\t"
  79232. "lsl r6, r6, #16\n\t"
  79233. "adds r5, r5, r6\n\t"
  79234. "adcs r3, r3, r7\n\t"
  79235. "adc r4, r4, #0\n\t"
  79236. #else
  79237. "umull r6, r7, r8, r9\n\t"
  79238. "adds r5, r5, r6\n\t"
  79239. "adcs r3, r3, r7\n\t"
  79240. "adc r4, r4, #0\n\t"
  79241. #endif
  79242. /* A[5] * B[6] */
  79243. "ldr r9, [%[b], #24]\n\t"
  79244. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79245. "lsl r6, r11, #16\n\t"
  79246. "lsl r7, r9, #16\n\t"
  79247. "lsr r6, r6, #16\n\t"
  79248. "lsr r7, r7, #16\n\t"
  79249. "mul r7, r6, r7\n\t"
  79250. "adds r5, r5, r7\n\t"
  79251. "adcs r3, r3, #0\n\t"
  79252. "adc r4, r4, #0\n\t"
  79253. "lsr r7, r9, #16\n\t"
  79254. "mul r6, r7, r6\n\t"
  79255. "lsr r7, r6, #16\n\t"
  79256. "lsl r6, r6, #16\n\t"
  79257. "adds r5, r5, r6\n\t"
  79258. "adcs r3, r3, r7\n\t"
  79259. "adc r4, r4, #0\n\t"
  79260. "lsr r6, r11, #16\n\t"
  79261. "lsr r7, r9, #16\n\t"
  79262. "mul r7, r6, r7\n\t"
  79263. "adds r3, r3, r7\n\t"
  79264. "adc r4, r4, #0\n\t"
  79265. "lsl r7, r9, #16\n\t"
  79266. "lsr r7, r7, #16\n\t"
  79267. "mul r6, r7, r6\n\t"
  79268. "lsr r7, r6, #16\n\t"
  79269. "lsl r6, r6, #16\n\t"
  79270. "adds r5, r5, r6\n\t"
  79271. "adcs r3, r3, r7\n\t"
  79272. "adc r4, r4, #0\n\t"
  79273. #else
  79274. "umull r6, r7, r11, r9\n\t"
  79275. "adds r5, r5, r6\n\t"
  79276. "adcs r3, r3, r7\n\t"
  79277. "adc r4, r4, #0\n\t"
  79278. #endif
  79279. /* A[6] * B[5] */
  79280. "ldr r8, [%[a], #24]\n\t"
  79281. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79282. "lsl r6, r8, #16\n\t"
  79283. "lsl r7, r12, #16\n\t"
  79284. "lsr r6, r6, #16\n\t"
  79285. "lsr r7, r7, #16\n\t"
  79286. "mul r7, r6, r7\n\t"
  79287. "adds r5, r5, r7\n\t"
  79288. "adcs r3, r3, #0\n\t"
  79289. "adc r4, r4, #0\n\t"
  79290. "lsr r7, r12, #16\n\t"
  79291. "mul r6, r7, r6\n\t"
  79292. "lsr r7, r6, #16\n\t"
  79293. "lsl r6, r6, #16\n\t"
  79294. "adds r5, r5, r6\n\t"
  79295. "adcs r3, r3, r7\n\t"
  79296. "adc r4, r4, #0\n\t"
  79297. "lsr r6, r8, #16\n\t"
  79298. "lsr r7, r12, #16\n\t"
  79299. "mul r7, r6, r7\n\t"
  79300. "adds r3, r3, r7\n\t"
  79301. "adc r4, r4, #0\n\t"
  79302. "lsl r7, r12, #16\n\t"
  79303. "lsr r7, r7, #16\n\t"
  79304. "mul r6, r7, r6\n\t"
  79305. "lsr r7, r6, #16\n\t"
  79306. "lsl r6, r6, #16\n\t"
  79307. "adds r5, r5, r6\n\t"
  79308. "adcs r3, r3, r7\n\t"
  79309. "adc r4, r4, #0\n\t"
  79310. #else
  79311. "umull r6, r7, r8, r12\n\t"
  79312. "adds r5, r5, r6\n\t"
  79313. "adcs r3, r3, r7\n\t"
  79314. "adc r4, r4, #0\n\t"
  79315. #endif
  79316. /* A[7] * B[4] */
  79317. "ldr r8, [%[a], #28]\n\t"
  79318. "ldr r9, [%[b], #16]\n\t"
  79319. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79320. "lsl r6, r8, #16\n\t"
  79321. "lsl r7, r9, #16\n\t"
  79322. "lsr r6, r6, #16\n\t"
  79323. "lsr r7, r7, #16\n\t"
  79324. "mul r7, r6, r7\n\t"
  79325. "adds r5, r5, r7\n\t"
  79326. "adcs r3, r3, #0\n\t"
  79327. "adc r4, r4, #0\n\t"
  79328. "lsr r7, r9, #16\n\t"
  79329. "mul r6, r7, r6\n\t"
  79330. "lsr r7, r6, #16\n\t"
  79331. "lsl r6, r6, #16\n\t"
  79332. "adds r5, r5, r6\n\t"
  79333. "adcs r3, r3, r7\n\t"
  79334. "adc r4, r4, #0\n\t"
  79335. "lsr r6, r8, #16\n\t"
  79336. "lsr r7, r9, #16\n\t"
  79337. "mul r7, r6, r7\n\t"
  79338. "adds r3, r3, r7\n\t"
  79339. "adc r4, r4, #0\n\t"
  79340. "lsl r7, r9, #16\n\t"
  79341. "lsr r7, r7, #16\n\t"
  79342. "mul r6, r7, r6\n\t"
  79343. "lsr r7, r6, #16\n\t"
  79344. "lsl r6, r6, #16\n\t"
  79345. "adds r5, r5, r6\n\t"
  79346. "adcs r3, r3, r7\n\t"
  79347. "adc r4, r4, #0\n\t"
  79348. #else
  79349. "umull r6, r7, r8, r9\n\t"
  79350. "adds r5, r5, r6\n\t"
  79351. "adcs r3, r3, r7\n\t"
  79352. "adc r4, r4, #0\n\t"
  79353. #endif
  79354. /* A[8] * B[3] */
  79355. "ldr r8, [%[a], #32]\n\t"
  79356. "ldr r9, [%[b], #12]\n\t"
  79357. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79358. "lsl r6, r8, #16\n\t"
  79359. "lsl r7, r9, #16\n\t"
  79360. "lsr r6, r6, #16\n\t"
  79361. "lsr r7, r7, #16\n\t"
  79362. "mul r7, r6, r7\n\t"
  79363. "adds r5, r5, r7\n\t"
  79364. "adcs r3, r3, #0\n\t"
  79365. "adc r4, r4, #0\n\t"
  79366. "lsr r7, r9, #16\n\t"
  79367. "mul r6, r7, r6\n\t"
  79368. "lsr r7, r6, #16\n\t"
  79369. "lsl r6, r6, #16\n\t"
  79370. "adds r5, r5, r6\n\t"
  79371. "adcs r3, r3, r7\n\t"
  79372. "adc r4, r4, #0\n\t"
  79373. "lsr r6, r8, #16\n\t"
  79374. "lsr r7, r9, #16\n\t"
  79375. "mul r7, r6, r7\n\t"
  79376. "adds r3, r3, r7\n\t"
  79377. "adc r4, r4, #0\n\t"
  79378. "lsl r7, r9, #16\n\t"
  79379. "lsr r7, r7, #16\n\t"
  79380. "mul r6, r7, r6\n\t"
  79381. "lsr r7, r6, #16\n\t"
  79382. "lsl r6, r6, #16\n\t"
  79383. "adds r5, r5, r6\n\t"
  79384. "adcs r3, r3, r7\n\t"
  79385. "adc r4, r4, #0\n\t"
  79386. #else
  79387. "umull r6, r7, r8, r9\n\t"
  79388. "adds r5, r5, r6\n\t"
  79389. "adcs r3, r3, r7\n\t"
  79390. "adc r4, r4, #0\n\t"
  79391. #endif
  79392. /* A[9] * B[2] */
  79393. "ldr r8, [%[a], #36]\n\t"
  79394. "ldr r9, [%[b], #8]\n\t"
  79395. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79396. "lsl r6, r8, #16\n\t"
  79397. "lsl r7, r9, #16\n\t"
  79398. "lsr r6, r6, #16\n\t"
  79399. "lsr r7, r7, #16\n\t"
  79400. "mul r7, r6, r7\n\t"
  79401. "adds r5, r5, r7\n\t"
  79402. "adcs r3, r3, #0\n\t"
  79403. "adc r4, r4, #0\n\t"
  79404. "lsr r7, r9, #16\n\t"
  79405. "mul r6, r7, r6\n\t"
  79406. "lsr r7, r6, #16\n\t"
  79407. "lsl r6, r6, #16\n\t"
  79408. "adds r5, r5, r6\n\t"
  79409. "adcs r3, r3, r7\n\t"
  79410. "adc r4, r4, #0\n\t"
  79411. "lsr r6, r8, #16\n\t"
  79412. "lsr r7, r9, #16\n\t"
  79413. "mul r7, r6, r7\n\t"
  79414. "adds r3, r3, r7\n\t"
  79415. "adc r4, r4, #0\n\t"
  79416. "lsl r7, r9, #16\n\t"
  79417. "lsr r7, r7, #16\n\t"
  79418. "mul r6, r7, r6\n\t"
  79419. "lsr r7, r6, #16\n\t"
  79420. "lsl r6, r6, #16\n\t"
  79421. "adds r5, r5, r6\n\t"
  79422. "adcs r3, r3, r7\n\t"
  79423. "adc r4, r4, #0\n\t"
  79424. #else
  79425. "umull r6, r7, r8, r9\n\t"
  79426. "adds r5, r5, r6\n\t"
  79427. "adcs r3, r3, r7\n\t"
  79428. "adc r4, r4, #0\n\t"
  79429. #endif
  79430. /* A[10] * B[1] */
  79431. "ldr r8, [%[a], #40]\n\t"
  79432. "ldr r9, [%[b], #4]\n\t"
  79433. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79434. "lsl r6, r8, #16\n\t"
  79435. "lsl r7, r9, #16\n\t"
  79436. "lsr r6, r6, #16\n\t"
  79437. "lsr r7, r7, #16\n\t"
  79438. "mul r7, r6, r7\n\t"
  79439. "adds r5, r5, r7\n\t"
  79440. "adcs r3, r3, #0\n\t"
  79441. "adc r4, r4, #0\n\t"
  79442. "lsr r7, r9, #16\n\t"
  79443. "mul r6, r7, r6\n\t"
  79444. "lsr r7, r6, #16\n\t"
  79445. "lsl r6, r6, #16\n\t"
  79446. "adds r5, r5, r6\n\t"
  79447. "adcs r3, r3, r7\n\t"
  79448. "adc r4, r4, #0\n\t"
  79449. "lsr r6, r8, #16\n\t"
  79450. "lsr r7, r9, #16\n\t"
  79451. "mul r7, r6, r7\n\t"
  79452. "adds r3, r3, r7\n\t"
  79453. "adc r4, r4, #0\n\t"
  79454. "lsl r7, r9, #16\n\t"
  79455. "lsr r7, r7, #16\n\t"
  79456. "mul r6, r7, r6\n\t"
  79457. "lsr r7, r6, #16\n\t"
  79458. "lsl r6, r6, #16\n\t"
  79459. "adds r5, r5, r6\n\t"
  79460. "adcs r3, r3, r7\n\t"
  79461. "adc r4, r4, #0\n\t"
  79462. #else
  79463. "umull r6, r7, r8, r9\n\t"
  79464. "adds r5, r5, r6\n\t"
  79465. "adcs r3, r3, r7\n\t"
  79466. "adc r4, r4, #0\n\t"
  79467. #endif
  79468. /* A[11] * B[0] */
  79469. "ldr r8, [%[a], #44]\n\t"
  79470. "ldr r9, [%[b]]\n\t"
  79471. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79472. "lsl r6, r8, #16\n\t"
  79473. "lsl r7, r9, #16\n\t"
  79474. "lsr r6, r6, #16\n\t"
  79475. "lsr r7, r7, #16\n\t"
  79476. "mul r7, r6, r7\n\t"
  79477. "adds r5, r5, r7\n\t"
  79478. "adcs r3, r3, #0\n\t"
  79479. "adc r4, r4, #0\n\t"
  79480. "lsr r7, r9, #16\n\t"
  79481. "mul r6, r7, r6\n\t"
  79482. "lsr r7, r6, #16\n\t"
  79483. "lsl r6, r6, #16\n\t"
  79484. "adds r5, r5, r6\n\t"
  79485. "adcs r3, r3, r7\n\t"
  79486. "adc r4, r4, #0\n\t"
  79487. "lsr r6, r8, #16\n\t"
  79488. "lsr r7, r9, #16\n\t"
  79489. "mul r7, r6, r7\n\t"
  79490. "adds r3, r3, r7\n\t"
  79491. "adc r4, r4, #0\n\t"
  79492. "lsl r7, r9, #16\n\t"
  79493. "lsr r7, r7, #16\n\t"
  79494. "mul r6, r7, r6\n\t"
  79495. "lsr r7, r6, #16\n\t"
  79496. "lsl r6, r6, #16\n\t"
  79497. "adds r5, r5, r6\n\t"
  79498. "adcs r3, r3, r7\n\t"
  79499. "adc r4, r4, #0\n\t"
  79500. #else
  79501. "umull r6, r7, r8, r9\n\t"
  79502. "adds r5, r5, r6\n\t"
  79503. "adcs r3, r3, r7\n\t"
  79504. "adc r4, r4, #0\n\t"
  79505. #endif
  79506. "str r5, [sp, #44]\n\t"
  79507. /* A[11] * B[1] */
  79508. "ldr r9, [%[b], #4]\n\t"
  79509. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79510. "lsl r6, r8, #16\n\t"
  79511. "lsl r7, r9, #16\n\t"
  79512. "lsr r6, r6, #16\n\t"
  79513. "lsr r7, r7, #16\n\t"
  79514. "mul r7, r6, r7\n\t"
  79515. "adds r3, r3, r7\n\t"
  79516. "adcs r4, r4, #0\n\t"
  79517. "mov r5, #0\n\t"
  79518. "adc r5, r5, #0\n\t"
  79519. "lsr r7, r9, #16\n\t"
  79520. "mul r6, r7, r6\n\t"
  79521. "lsr r7, r6, #16\n\t"
  79522. "lsl r6, r6, #16\n\t"
  79523. "adds r3, r3, r6\n\t"
  79524. "adcs r4, r4, r7\n\t"
  79525. "adc r5, r5, #0\n\t"
  79526. "lsr r6, r8, #16\n\t"
  79527. "lsr r7, r9, #16\n\t"
  79528. "mul r7, r6, r7\n\t"
  79529. "adds r4, r4, r7\n\t"
  79530. "adc r5, r5, #0\n\t"
  79531. "lsl r7, r9, #16\n\t"
  79532. "lsr r7, r7, #16\n\t"
  79533. "mul r6, r7, r6\n\t"
  79534. "lsr r7, r6, #16\n\t"
  79535. "lsl r6, r6, #16\n\t"
  79536. "adds r3, r3, r6\n\t"
  79537. "adcs r4, r4, r7\n\t"
  79538. "adc r5, r5, #0\n\t"
  79539. #else
  79540. "umull r6, r7, r8, r9\n\t"
  79541. "adds r3, r3, r6\n\t"
  79542. "adcs r4, r4, r7\n\t"
  79543. "mov r5, #0\n\t"
  79544. "adc r5, r5, #0\n\t"
  79545. #endif
  79546. /* A[10] * B[2] */
  79547. "ldr r8, [%[a], #40]\n\t"
  79548. "ldr r9, [%[b], #8]\n\t"
  79549. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79550. "lsl r6, r8, #16\n\t"
  79551. "lsl r7, r9, #16\n\t"
  79552. "lsr r6, r6, #16\n\t"
  79553. "lsr r7, r7, #16\n\t"
  79554. "mul r7, r6, r7\n\t"
  79555. "adds r3, r3, r7\n\t"
  79556. "adcs r4, r4, #0\n\t"
  79557. "adc r5, r5, #0\n\t"
  79558. "lsr r7, r9, #16\n\t"
  79559. "mul r6, r7, r6\n\t"
  79560. "lsr r7, r6, #16\n\t"
  79561. "lsl r6, r6, #16\n\t"
  79562. "adds r3, r3, r6\n\t"
  79563. "adcs r4, r4, r7\n\t"
  79564. "adc r5, r5, #0\n\t"
  79565. "lsr r6, r8, #16\n\t"
  79566. "lsr r7, r9, #16\n\t"
  79567. "mul r7, r6, r7\n\t"
  79568. "adds r4, r4, r7\n\t"
  79569. "adc r5, r5, #0\n\t"
  79570. "lsl r7, r9, #16\n\t"
  79571. "lsr r7, r7, #16\n\t"
  79572. "mul r6, r7, r6\n\t"
  79573. "lsr r7, r6, #16\n\t"
  79574. "lsl r6, r6, #16\n\t"
  79575. "adds r3, r3, r6\n\t"
  79576. "adcs r4, r4, r7\n\t"
  79577. "adc r5, r5, #0\n\t"
  79578. #else
  79579. "umull r6, r7, r8, r9\n\t"
  79580. "adds r3, r3, r6\n\t"
  79581. "adcs r4, r4, r7\n\t"
  79582. "adc r5, r5, #0\n\t"
  79583. #endif
  79584. /* A[9] * B[3] */
  79585. "ldr r8, [%[a], #36]\n\t"
  79586. "ldr r9, [%[b], #12]\n\t"
  79587. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79588. "lsl r6, r8, #16\n\t"
  79589. "lsl r7, r9, #16\n\t"
  79590. "lsr r6, r6, #16\n\t"
  79591. "lsr r7, r7, #16\n\t"
  79592. "mul r7, r6, r7\n\t"
  79593. "adds r3, r3, r7\n\t"
  79594. "adcs r4, r4, #0\n\t"
  79595. "adc r5, r5, #0\n\t"
  79596. "lsr r7, r9, #16\n\t"
  79597. "mul r6, r7, r6\n\t"
  79598. "lsr r7, r6, #16\n\t"
  79599. "lsl r6, r6, #16\n\t"
  79600. "adds r3, r3, r6\n\t"
  79601. "adcs r4, r4, r7\n\t"
  79602. "adc r5, r5, #0\n\t"
  79603. "lsr r6, r8, #16\n\t"
  79604. "lsr r7, r9, #16\n\t"
  79605. "mul r7, r6, r7\n\t"
  79606. "adds r4, r4, r7\n\t"
  79607. "adc r5, r5, #0\n\t"
  79608. "lsl r7, r9, #16\n\t"
  79609. "lsr r7, r7, #16\n\t"
  79610. "mul r6, r7, r6\n\t"
  79611. "lsr r7, r6, #16\n\t"
  79612. "lsl r6, r6, #16\n\t"
  79613. "adds r3, r3, r6\n\t"
  79614. "adcs r4, r4, r7\n\t"
  79615. "adc r5, r5, #0\n\t"
  79616. #else
  79617. "umull r6, r7, r8, r9\n\t"
  79618. "adds r3, r3, r6\n\t"
  79619. "adcs r4, r4, r7\n\t"
  79620. "adc r5, r5, #0\n\t"
  79621. #endif
  79622. /* A[8] * B[4] */
  79623. "ldr r8, [%[a], #32]\n\t"
  79624. "ldr r9, [%[b], #16]\n\t"
  79625. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79626. "lsl r6, r8, #16\n\t"
  79627. "lsl r7, r9, #16\n\t"
  79628. "lsr r6, r6, #16\n\t"
  79629. "lsr r7, r7, #16\n\t"
  79630. "mul r7, r6, r7\n\t"
  79631. "adds r3, r3, r7\n\t"
  79632. "adcs r4, r4, #0\n\t"
  79633. "adc r5, r5, #0\n\t"
  79634. "lsr r7, r9, #16\n\t"
  79635. "mul r6, r7, r6\n\t"
  79636. "lsr r7, r6, #16\n\t"
  79637. "lsl r6, r6, #16\n\t"
  79638. "adds r3, r3, r6\n\t"
  79639. "adcs r4, r4, r7\n\t"
  79640. "adc r5, r5, #0\n\t"
  79641. "lsr r6, r8, #16\n\t"
  79642. "lsr r7, r9, #16\n\t"
  79643. "mul r7, r6, r7\n\t"
  79644. "adds r4, r4, r7\n\t"
  79645. "adc r5, r5, #0\n\t"
  79646. "lsl r7, r9, #16\n\t"
  79647. "lsr r7, r7, #16\n\t"
  79648. "mul r6, r7, r6\n\t"
  79649. "lsr r7, r6, #16\n\t"
  79650. "lsl r6, r6, #16\n\t"
  79651. "adds r3, r3, r6\n\t"
  79652. "adcs r4, r4, r7\n\t"
  79653. "adc r5, r5, #0\n\t"
  79654. #else
  79655. "umull r6, r7, r8, r9\n\t"
  79656. "adds r3, r3, r6\n\t"
  79657. "adcs r4, r4, r7\n\t"
  79658. "adc r5, r5, #0\n\t"
  79659. #endif
  79660. /* A[7] * B[5] */
  79661. "ldr r8, [%[a], #28]\n\t"
  79662. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79663. "lsl r6, r8, #16\n\t"
  79664. "lsl r7, r12, #16\n\t"
  79665. "lsr r6, r6, #16\n\t"
  79666. "lsr r7, r7, #16\n\t"
  79667. "mul r7, r6, r7\n\t"
  79668. "adds r3, r3, r7\n\t"
  79669. "adcs r4, r4, #0\n\t"
  79670. "adc r5, r5, #0\n\t"
  79671. "lsr r7, r12, #16\n\t"
  79672. "mul r6, r7, r6\n\t"
  79673. "lsr r7, r6, #16\n\t"
  79674. "lsl r6, r6, #16\n\t"
  79675. "adds r3, r3, r6\n\t"
  79676. "adcs r4, r4, r7\n\t"
  79677. "adc r5, r5, #0\n\t"
  79678. "lsr r6, r8, #16\n\t"
  79679. "lsr r7, r12, #16\n\t"
  79680. "mul r7, r6, r7\n\t"
  79681. "adds r4, r4, r7\n\t"
  79682. "adc r5, r5, #0\n\t"
  79683. "lsl r7, r12, #16\n\t"
  79684. "lsr r7, r7, #16\n\t"
  79685. "mul r6, r7, r6\n\t"
  79686. "lsr r7, r6, #16\n\t"
  79687. "lsl r6, r6, #16\n\t"
  79688. "adds r3, r3, r6\n\t"
  79689. "adcs r4, r4, r7\n\t"
  79690. "adc r5, r5, #0\n\t"
  79691. #else
  79692. "umull r6, r7, r8, r12\n\t"
  79693. "adds r3, r3, r6\n\t"
  79694. "adcs r4, r4, r7\n\t"
  79695. "adc r5, r5, #0\n\t"
  79696. #endif
  79697. /* A[6] * B[6] */
  79698. "ldr r11, [%[a], #24]\n\t"
  79699. "ldr r12, [%[b], #24]\n\t"
  79700. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79701. "lsl r6, r11, #16\n\t"
  79702. "lsl r7, r12, #16\n\t"
  79703. "lsr r6, r6, #16\n\t"
  79704. "lsr r7, r7, #16\n\t"
  79705. "mul r7, r6, r7\n\t"
  79706. "adds r3, r3, r7\n\t"
  79707. "adcs r4, r4, #0\n\t"
  79708. "adc r5, r5, #0\n\t"
  79709. "lsr r7, r12, #16\n\t"
  79710. "mul r6, r7, r6\n\t"
  79711. "lsr r7, r6, #16\n\t"
  79712. "lsl r6, r6, #16\n\t"
  79713. "adds r3, r3, r6\n\t"
  79714. "adcs r4, r4, r7\n\t"
  79715. "adc r5, r5, #0\n\t"
  79716. "lsr r6, r11, #16\n\t"
  79717. "lsr r7, r12, #16\n\t"
  79718. "mul r7, r6, r7\n\t"
  79719. "adds r4, r4, r7\n\t"
  79720. "adc r5, r5, #0\n\t"
  79721. "lsl r7, r12, #16\n\t"
  79722. "lsr r7, r7, #16\n\t"
  79723. "mul r6, r7, r6\n\t"
  79724. "lsr r7, r6, #16\n\t"
  79725. "lsl r6, r6, #16\n\t"
  79726. "adds r3, r3, r6\n\t"
  79727. "adcs r4, r4, r7\n\t"
  79728. "adc r5, r5, #0\n\t"
  79729. #else
  79730. "umull r6, r7, r11, r12\n\t"
  79731. "adds r3, r3, r6\n\t"
  79732. "adcs r4, r4, r7\n\t"
  79733. "adc r5, r5, #0\n\t"
  79734. #endif
  79735. /* A[5] * B[7] */
  79736. "ldr r8, [%[a], #20]\n\t"
  79737. "ldr r9, [%[b], #28]\n\t"
  79738. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79739. "lsl r6, r8, #16\n\t"
  79740. "lsl r7, r9, #16\n\t"
  79741. "lsr r6, r6, #16\n\t"
  79742. "lsr r7, r7, #16\n\t"
  79743. "mul r7, r6, r7\n\t"
  79744. "adds r3, r3, r7\n\t"
  79745. "adcs r4, r4, #0\n\t"
  79746. "adc r5, r5, #0\n\t"
  79747. "lsr r7, r9, #16\n\t"
  79748. "mul r6, r7, r6\n\t"
  79749. "lsr r7, r6, #16\n\t"
  79750. "lsl r6, r6, #16\n\t"
  79751. "adds r3, r3, r6\n\t"
  79752. "adcs r4, r4, r7\n\t"
  79753. "adc r5, r5, #0\n\t"
  79754. "lsr r6, r8, #16\n\t"
  79755. "lsr r7, r9, #16\n\t"
  79756. "mul r7, r6, r7\n\t"
  79757. "adds r4, r4, r7\n\t"
  79758. "adc r5, r5, #0\n\t"
  79759. "lsl r7, r9, #16\n\t"
  79760. "lsr r7, r7, #16\n\t"
  79761. "mul r6, r7, r6\n\t"
  79762. "lsr r7, r6, #16\n\t"
  79763. "lsl r6, r6, #16\n\t"
  79764. "adds r3, r3, r6\n\t"
  79765. "adcs r4, r4, r7\n\t"
  79766. "adc r5, r5, #0\n\t"
  79767. #else
  79768. "umull r6, r7, r8, r9\n\t"
  79769. "adds r3, r3, r6\n\t"
  79770. "adcs r4, r4, r7\n\t"
  79771. "adc r5, r5, #0\n\t"
  79772. #endif
  79773. /* A[4] * B[8] */
  79774. "ldr r8, [%[a], #16]\n\t"
  79775. "ldr r9, [%[b], #32]\n\t"
  79776. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79777. "lsl r6, r8, #16\n\t"
  79778. "lsl r7, r9, #16\n\t"
  79779. "lsr r6, r6, #16\n\t"
  79780. "lsr r7, r7, #16\n\t"
  79781. "mul r7, r6, r7\n\t"
  79782. "adds r3, r3, r7\n\t"
  79783. "adcs r4, r4, #0\n\t"
  79784. "adc r5, r5, #0\n\t"
  79785. "lsr r7, r9, #16\n\t"
  79786. "mul r6, r7, r6\n\t"
  79787. "lsr r7, r6, #16\n\t"
  79788. "lsl r6, r6, #16\n\t"
  79789. "adds r3, r3, r6\n\t"
  79790. "adcs r4, r4, r7\n\t"
  79791. "adc r5, r5, #0\n\t"
  79792. "lsr r6, r8, #16\n\t"
  79793. "lsr r7, r9, #16\n\t"
  79794. "mul r7, r6, r7\n\t"
  79795. "adds r4, r4, r7\n\t"
  79796. "adc r5, r5, #0\n\t"
  79797. "lsl r7, r9, #16\n\t"
  79798. "lsr r7, r7, #16\n\t"
  79799. "mul r6, r7, r6\n\t"
  79800. "lsr r7, r6, #16\n\t"
  79801. "lsl r6, r6, #16\n\t"
  79802. "adds r3, r3, r6\n\t"
  79803. "adcs r4, r4, r7\n\t"
  79804. "adc r5, r5, #0\n\t"
  79805. #else
  79806. "umull r6, r7, r8, r9\n\t"
  79807. "adds r3, r3, r6\n\t"
  79808. "adcs r4, r4, r7\n\t"
  79809. "adc r5, r5, #0\n\t"
  79810. #endif
  79811. /* A[3] * B[9] */
  79812. "ldr r8, [%[a], #12]\n\t"
  79813. "ldr r9, [%[b], #36]\n\t"
  79814. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79815. "lsl r6, r8, #16\n\t"
  79816. "lsl r7, r9, #16\n\t"
  79817. "lsr r6, r6, #16\n\t"
  79818. "lsr r7, r7, #16\n\t"
  79819. "mul r7, r6, r7\n\t"
  79820. "adds r3, r3, r7\n\t"
  79821. "adcs r4, r4, #0\n\t"
  79822. "adc r5, r5, #0\n\t"
  79823. "lsr r7, r9, #16\n\t"
  79824. "mul r6, r7, r6\n\t"
  79825. "lsr r7, r6, #16\n\t"
  79826. "lsl r6, r6, #16\n\t"
  79827. "adds r3, r3, r6\n\t"
  79828. "adcs r4, r4, r7\n\t"
  79829. "adc r5, r5, #0\n\t"
  79830. "lsr r6, r8, #16\n\t"
  79831. "lsr r7, r9, #16\n\t"
  79832. "mul r7, r6, r7\n\t"
  79833. "adds r4, r4, r7\n\t"
  79834. "adc r5, r5, #0\n\t"
  79835. "lsl r7, r9, #16\n\t"
  79836. "lsr r7, r7, #16\n\t"
  79837. "mul r6, r7, r6\n\t"
  79838. "lsr r7, r6, #16\n\t"
  79839. "lsl r6, r6, #16\n\t"
  79840. "adds r3, r3, r6\n\t"
  79841. "adcs r4, r4, r7\n\t"
  79842. "adc r5, r5, #0\n\t"
  79843. #else
  79844. "umull r6, r7, r8, r9\n\t"
  79845. "adds r3, r3, r6\n\t"
  79846. "adcs r4, r4, r7\n\t"
  79847. "adc r5, r5, #0\n\t"
  79848. #endif
  79849. /* A[2] * B[10] */
  79850. "ldr r8, [%[a], #8]\n\t"
  79851. "ldr r9, [%[b], #40]\n\t"
  79852. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79853. "lsl r6, r8, #16\n\t"
  79854. "lsl r7, r9, #16\n\t"
  79855. "lsr r6, r6, #16\n\t"
  79856. "lsr r7, r7, #16\n\t"
  79857. "mul r7, r6, r7\n\t"
  79858. "adds r3, r3, r7\n\t"
  79859. "adcs r4, r4, #0\n\t"
  79860. "adc r5, r5, #0\n\t"
  79861. "lsr r7, r9, #16\n\t"
  79862. "mul r6, r7, r6\n\t"
  79863. "lsr r7, r6, #16\n\t"
  79864. "lsl r6, r6, #16\n\t"
  79865. "adds r3, r3, r6\n\t"
  79866. "adcs r4, r4, r7\n\t"
  79867. "adc r5, r5, #0\n\t"
  79868. "lsr r6, r8, #16\n\t"
  79869. "lsr r7, r9, #16\n\t"
  79870. "mul r7, r6, r7\n\t"
  79871. "adds r4, r4, r7\n\t"
  79872. "adc r5, r5, #0\n\t"
  79873. "lsl r7, r9, #16\n\t"
  79874. "lsr r7, r7, #16\n\t"
  79875. "mul r6, r7, r6\n\t"
  79876. "lsr r7, r6, #16\n\t"
  79877. "lsl r6, r6, #16\n\t"
  79878. "adds r3, r3, r6\n\t"
  79879. "adcs r4, r4, r7\n\t"
  79880. "adc r5, r5, #0\n\t"
  79881. #else
  79882. "umull r6, r7, r8, r9\n\t"
  79883. "adds r3, r3, r6\n\t"
  79884. "adcs r4, r4, r7\n\t"
  79885. "adc r5, r5, #0\n\t"
  79886. #endif
  79887. /* A[1] * B[11] */
  79888. "ldr r8, [%[a], #4]\n\t"
  79889. "ldr r9, [%[b], #44]\n\t"
  79890. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79891. "lsl r6, r8, #16\n\t"
  79892. "lsl r7, r9, #16\n\t"
  79893. "lsr r6, r6, #16\n\t"
  79894. "lsr r7, r7, #16\n\t"
  79895. "mul r7, r6, r7\n\t"
  79896. "adds r3, r3, r7\n\t"
  79897. "adcs r4, r4, #0\n\t"
  79898. "adc r5, r5, #0\n\t"
  79899. "lsr r7, r9, #16\n\t"
  79900. "mul r6, r7, r6\n\t"
  79901. "lsr r7, r6, #16\n\t"
  79902. "lsl r6, r6, #16\n\t"
  79903. "adds r3, r3, r6\n\t"
  79904. "adcs r4, r4, r7\n\t"
  79905. "adc r5, r5, #0\n\t"
  79906. "lsr r6, r8, #16\n\t"
  79907. "lsr r7, r9, #16\n\t"
  79908. "mul r7, r6, r7\n\t"
  79909. "adds r4, r4, r7\n\t"
  79910. "adc r5, r5, #0\n\t"
  79911. "lsl r7, r9, #16\n\t"
  79912. "lsr r7, r7, #16\n\t"
  79913. "mul r6, r7, r6\n\t"
  79914. "lsr r7, r6, #16\n\t"
  79915. "lsl r6, r6, #16\n\t"
  79916. "adds r3, r3, r6\n\t"
  79917. "adcs r4, r4, r7\n\t"
  79918. "adc r5, r5, #0\n\t"
  79919. #else
  79920. "umull r6, r7, r8, r9\n\t"
  79921. "adds r3, r3, r6\n\t"
  79922. "adcs r4, r4, r7\n\t"
  79923. "adc r5, r5, #0\n\t"
  79924. #endif
  79925. "str r3, [%[r], #48]\n\t"
  79926. /* A[2] * B[11] */
  79927. "ldr r8, [%[a], #8]\n\t"
  79928. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79929. "lsl r6, r8, #16\n\t"
  79930. "lsl r7, r9, #16\n\t"
  79931. "lsr r6, r6, #16\n\t"
  79932. "lsr r7, r7, #16\n\t"
  79933. "mul r7, r6, r7\n\t"
  79934. "adds r4, r4, r7\n\t"
  79935. "adcs r5, r5, #0\n\t"
  79936. "mov r3, #0\n\t"
  79937. "adc r3, r3, #0\n\t"
  79938. "lsr r7, r9, #16\n\t"
  79939. "mul r6, r7, r6\n\t"
  79940. "lsr r7, r6, #16\n\t"
  79941. "lsl r6, r6, #16\n\t"
  79942. "adds r4, r4, r6\n\t"
  79943. "adcs r5, r5, r7\n\t"
  79944. "adc r3, r3, #0\n\t"
  79945. "lsr r6, r8, #16\n\t"
  79946. "lsr r7, r9, #16\n\t"
  79947. "mul r7, r6, r7\n\t"
  79948. "adds r5, r5, r7\n\t"
  79949. "adc r3, r3, #0\n\t"
  79950. "lsl r7, r9, #16\n\t"
  79951. "lsr r7, r7, #16\n\t"
  79952. "mul r6, r7, r6\n\t"
  79953. "lsr r7, r6, #16\n\t"
  79954. "lsl r6, r6, #16\n\t"
  79955. "adds r4, r4, r6\n\t"
  79956. "adcs r5, r5, r7\n\t"
  79957. "adc r3, r3, #0\n\t"
  79958. #else
  79959. "umull r6, r7, r8, r9\n\t"
  79960. "adds r4, r4, r6\n\t"
  79961. "adcs r5, r5, r7\n\t"
  79962. "mov r3, #0\n\t"
  79963. "adc r3, r3, #0\n\t"
  79964. #endif
  79965. /* A[3] * B[10] */
  79966. "ldr r8, [%[a], #12]\n\t"
  79967. "ldr r9, [%[b], #40]\n\t"
  79968. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  79969. "lsl r6, r8, #16\n\t"
  79970. "lsl r7, r9, #16\n\t"
  79971. "lsr r6, r6, #16\n\t"
  79972. "lsr r7, r7, #16\n\t"
  79973. "mul r7, r6, r7\n\t"
  79974. "adds r4, r4, r7\n\t"
  79975. "adcs r5, r5, #0\n\t"
  79976. "adc r3, r3, #0\n\t"
  79977. "lsr r7, r9, #16\n\t"
  79978. "mul r6, r7, r6\n\t"
  79979. "lsr r7, r6, #16\n\t"
  79980. "lsl r6, r6, #16\n\t"
  79981. "adds r4, r4, r6\n\t"
  79982. "adcs r5, r5, r7\n\t"
  79983. "adc r3, r3, #0\n\t"
  79984. "lsr r6, r8, #16\n\t"
  79985. "lsr r7, r9, #16\n\t"
  79986. "mul r7, r6, r7\n\t"
  79987. "adds r5, r5, r7\n\t"
  79988. "adc r3, r3, #0\n\t"
  79989. "lsl r7, r9, #16\n\t"
  79990. "lsr r7, r7, #16\n\t"
  79991. "mul r6, r7, r6\n\t"
  79992. "lsr r7, r6, #16\n\t"
  79993. "lsl r6, r6, #16\n\t"
  79994. "adds r4, r4, r6\n\t"
  79995. "adcs r5, r5, r7\n\t"
  79996. "adc r3, r3, #0\n\t"
  79997. #else
  79998. "umull r6, r7, r8, r9\n\t"
  79999. "adds r4, r4, r6\n\t"
  80000. "adcs r5, r5, r7\n\t"
  80001. "adc r3, r3, #0\n\t"
  80002. #endif
  80003. /* A[4] * B[9] */
  80004. "ldr r8, [%[a], #16]\n\t"
  80005. "ldr r9, [%[b], #36]\n\t"
  80006. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80007. "lsl r6, r8, #16\n\t"
  80008. "lsl r7, r9, #16\n\t"
  80009. "lsr r6, r6, #16\n\t"
  80010. "lsr r7, r7, #16\n\t"
  80011. "mul r7, r6, r7\n\t"
  80012. "adds r4, r4, r7\n\t"
  80013. "adcs r5, r5, #0\n\t"
  80014. "adc r3, r3, #0\n\t"
  80015. "lsr r7, r9, #16\n\t"
  80016. "mul r6, r7, r6\n\t"
  80017. "lsr r7, r6, #16\n\t"
  80018. "lsl r6, r6, #16\n\t"
  80019. "adds r4, r4, r6\n\t"
  80020. "adcs r5, r5, r7\n\t"
  80021. "adc r3, r3, #0\n\t"
  80022. "lsr r6, r8, #16\n\t"
  80023. "lsr r7, r9, #16\n\t"
  80024. "mul r7, r6, r7\n\t"
  80025. "adds r5, r5, r7\n\t"
  80026. "adc r3, r3, #0\n\t"
  80027. "lsl r7, r9, #16\n\t"
  80028. "lsr r7, r7, #16\n\t"
  80029. "mul r6, r7, r6\n\t"
  80030. "lsr r7, r6, #16\n\t"
  80031. "lsl r6, r6, #16\n\t"
  80032. "adds r4, r4, r6\n\t"
  80033. "adcs r5, r5, r7\n\t"
  80034. "adc r3, r3, #0\n\t"
  80035. #else
  80036. "umull r6, r7, r8, r9\n\t"
  80037. "adds r4, r4, r6\n\t"
  80038. "adcs r5, r5, r7\n\t"
  80039. "adc r3, r3, #0\n\t"
  80040. #endif
  80041. /* A[5] * B[8] */
  80042. "ldr r8, [%[a], #20]\n\t"
  80043. "ldr r9, [%[b], #32]\n\t"
  80044. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80045. "lsl r6, r8, #16\n\t"
  80046. "lsl r7, r9, #16\n\t"
  80047. "lsr r6, r6, #16\n\t"
  80048. "lsr r7, r7, #16\n\t"
  80049. "mul r7, r6, r7\n\t"
  80050. "adds r4, r4, r7\n\t"
  80051. "adcs r5, r5, #0\n\t"
  80052. "adc r3, r3, #0\n\t"
  80053. "lsr r7, r9, #16\n\t"
  80054. "mul r6, r7, r6\n\t"
  80055. "lsr r7, r6, #16\n\t"
  80056. "lsl r6, r6, #16\n\t"
  80057. "adds r4, r4, r6\n\t"
  80058. "adcs r5, r5, r7\n\t"
  80059. "adc r3, r3, #0\n\t"
  80060. "lsr r6, r8, #16\n\t"
  80061. "lsr r7, r9, #16\n\t"
  80062. "mul r7, r6, r7\n\t"
  80063. "adds r5, r5, r7\n\t"
  80064. "adc r3, r3, #0\n\t"
  80065. "lsl r7, r9, #16\n\t"
  80066. "lsr r7, r7, #16\n\t"
  80067. "mul r6, r7, r6\n\t"
  80068. "lsr r7, r6, #16\n\t"
  80069. "lsl r6, r6, #16\n\t"
  80070. "adds r4, r4, r6\n\t"
  80071. "adcs r5, r5, r7\n\t"
  80072. "adc r3, r3, #0\n\t"
  80073. #else
  80074. "umull r6, r7, r8, r9\n\t"
  80075. "adds r4, r4, r6\n\t"
  80076. "adcs r5, r5, r7\n\t"
  80077. "adc r3, r3, #0\n\t"
  80078. #endif
  80079. /* A[6] * B[7] */
  80080. "ldr r9, [%[b], #28]\n\t"
  80081. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80082. "lsl r6, r11, #16\n\t"
  80083. "lsl r7, r9, #16\n\t"
  80084. "lsr r6, r6, #16\n\t"
  80085. "lsr r7, r7, #16\n\t"
  80086. "mul r7, r6, r7\n\t"
  80087. "adds r4, r4, r7\n\t"
  80088. "adcs r5, r5, #0\n\t"
  80089. "adc r3, r3, #0\n\t"
  80090. "lsr r7, r9, #16\n\t"
  80091. "mul r6, r7, r6\n\t"
  80092. "lsr r7, r6, #16\n\t"
  80093. "lsl r6, r6, #16\n\t"
  80094. "adds r4, r4, r6\n\t"
  80095. "adcs r5, r5, r7\n\t"
  80096. "adc r3, r3, #0\n\t"
  80097. "lsr r6, r11, #16\n\t"
  80098. "lsr r7, r9, #16\n\t"
  80099. "mul r7, r6, r7\n\t"
  80100. "adds r5, r5, r7\n\t"
  80101. "adc r3, r3, #0\n\t"
  80102. "lsl r7, r9, #16\n\t"
  80103. "lsr r7, r7, #16\n\t"
  80104. "mul r6, r7, r6\n\t"
  80105. "lsr r7, r6, #16\n\t"
  80106. "lsl r6, r6, #16\n\t"
  80107. "adds r4, r4, r6\n\t"
  80108. "adcs r5, r5, r7\n\t"
  80109. "adc r3, r3, #0\n\t"
  80110. #else
  80111. "umull r6, r7, r11, r9\n\t"
  80112. "adds r4, r4, r6\n\t"
  80113. "adcs r5, r5, r7\n\t"
  80114. "adc r3, r3, #0\n\t"
  80115. #endif
  80116. /* A[7] * B[6] */
  80117. "ldr r8, [%[a], #28]\n\t"
  80118. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80119. "lsl r6, r8, #16\n\t"
  80120. "lsl r7, r12, #16\n\t"
  80121. "lsr r6, r6, #16\n\t"
  80122. "lsr r7, r7, #16\n\t"
  80123. "mul r7, r6, r7\n\t"
  80124. "adds r4, r4, r7\n\t"
  80125. "adcs r5, r5, #0\n\t"
  80126. "adc r3, r3, #0\n\t"
  80127. "lsr r7, r12, #16\n\t"
  80128. "mul r6, r7, r6\n\t"
  80129. "lsr r7, r6, #16\n\t"
  80130. "lsl r6, r6, #16\n\t"
  80131. "adds r4, r4, r6\n\t"
  80132. "adcs r5, r5, r7\n\t"
  80133. "adc r3, r3, #0\n\t"
  80134. "lsr r6, r8, #16\n\t"
  80135. "lsr r7, r12, #16\n\t"
  80136. "mul r7, r6, r7\n\t"
  80137. "adds r5, r5, r7\n\t"
  80138. "adc r3, r3, #0\n\t"
  80139. "lsl r7, r12, #16\n\t"
  80140. "lsr r7, r7, #16\n\t"
  80141. "mul r6, r7, r6\n\t"
  80142. "lsr r7, r6, #16\n\t"
  80143. "lsl r6, r6, #16\n\t"
  80144. "adds r4, r4, r6\n\t"
  80145. "adcs r5, r5, r7\n\t"
  80146. "adc r3, r3, #0\n\t"
  80147. #else
  80148. "umull r6, r7, r8, r12\n\t"
  80149. "adds r4, r4, r6\n\t"
  80150. "adcs r5, r5, r7\n\t"
  80151. "adc r3, r3, #0\n\t"
  80152. #endif
  80153. /* A[8] * B[5] */
  80154. "ldr r8, [%[a], #32]\n\t"
  80155. "ldr r9, [%[b], #20]\n\t"
  80156. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80157. "lsl r6, r8, #16\n\t"
  80158. "lsl r7, r9, #16\n\t"
  80159. "lsr r6, r6, #16\n\t"
  80160. "lsr r7, r7, #16\n\t"
  80161. "mul r7, r6, r7\n\t"
  80162. "adds r4, r4, r7\n\t"
  80163. "adcs r5, r5, #0\n\t"
  80164. "adc r3, r3, #0\n\t"
  80165. "lsr r7, r9, #16\n\t"
  80166. "mul r6, r7, r6\n\t"
  80167. "lsr r7, r6, #16\n\t"
  80168. "lsl r6, r6, #16\n\t"
  80169. "adds r4, r4, r6\n\t"
  80170. "adcs r5, r5, r7\n\t"
  80171. "adc r3, r3, #0\n\t"
  80172. "lsr r6, r8, #16\n\t"
  80173. "lsr r7, r9, #16\n\t"
  80174. "mul r7, r6, r7\n\t"
  80175. "adds r5, r5, r7\n\t"
  80176. "adc r3, r3, #0\n\t"
  80177. "lsl r7, r9, #16\n\t"
  80178. "lsr r7, r7, #16\n\t"
  80179. "mul r6, r7, r6\n\t"
  80180. "lsr r7, r6, #16\n\t"
  80181. "lsl r6, r6, #16\n\t"
  80182. "adds r4, r4, r6\n\t"
  80183. "adcs r5, r5, r7\n\t"
  80184. "adc r3, r3, #0\n\t"
  80185. #else
  80186. "umull r6, r7, r8, r9\n\t"
  80187. "adds r4, r4, r6\n\t"
  80188. "adcs r5, r5, r7\n\t"
  80189. "adc r3, r3, #0\n\t"
  80190. #endif
  80191. /* A[9] * B[4] */
  80192. "ldr r8, [%[a], #36]\n\t"
  80193. "ldr r9, [%[b], #16]\n\t"
  80194. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80195. "lsl r6, r8, #16\n\t"
  80196. "lsl r7, r9, #16\n\t"
  80197. "lsr r6, r6, #16\n\t"
  80198. "lsr r7, r7, #16\n\t"
  80199. "mul r7, r6, r7\n\t"
  80200. "adds r4, r4, r7\n\t"
  80201. "adcs r5, r5, #0\n\t"
  80202. "adc r3, r3, #0\n\t"
  80203. "lsr r7, r9, #16\n\t"
  80204. "mul r6, r7, r6\n\t"
  80205. "lsr r7, r6, #16\n\t"
  80206. "lsl r6, r6, #16\n\t"
  80207. "adds r4, r4, r6\n\t"
  80208. "adcs r5, r5, r7\n\t"
  80209. "adc r3, r3, #0\n\t"
  80210. "lsr r6, r8, #16\n\t"
  80211. "lsr r7, r9, #16\n\t"
  80212. "mul r7, r6, r7\n\t"
  80213. "adds r5, r5, r7\n\t"
  80214. "adc r3, r3, #0\n\t"
  80215. "lsl r7, r9, #16\n\t"
  80216. "lsr r7, r7, #16\n\t"
  80217. "mul r6, r7, r6\n\t"
  80218. "lsr r7, r6, #16\n\t"
  80219. "lsl r6, r6, #16\n\t"
  80220. "adds r4, r4, r6\n\t"
  80221. "adcs r5, r5, r7\n\t"
  80222. "adc r3, r3, #0\n\t"
  80223. #else
  80224. "umull r6, r7, r8, r9\n\t"
  80225. "adds r4, r4, r6\n\t"
  80226. "adcs r5, r5, r7\n\t"
  80227. "adc r3, r3, #0\n\t"
  80228. #endif
  80229. /* A[10] * B[3] */
  80230. "ldr r8, [%[a], #40]\n\t"
  80231. "ldr r9, [%[b], #12]\n\t"
  80232. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80233. "lsl r6, r8, #16\n\t"
  80234. "lsl r7, r9, #16\n\t"
  80235. "lsr r6, r6, #16\n\t"
  80236. "lsr r7, r7, #16\n\t"
  80237. "mul r7, r6, r7\n\t"
  80238. "adds r4, r4, r7\n\t"
  80239. "adcs r5, r5, #0\n\t"
  80240. "adc r3, r3, #0\n\t"
  80241. "lsr r7, r9, #16\n\t"
  80242. "mul r6, r7, r6\n\t"
  80243. "lsr r7, r6, #16\n\t"
  80244. "lsl r6, r6, #16\n\t"
  80245. "adds r4, r4, r6\n\t"
  80246. "adcs r5, r5, r7\n\t"
  80247. "adc r3, r3, #0\n\t"
  80248. "lsr r6, r8, #16\n\t"
  80249. "lsr r7, r9, #16\n\t"
  80250. "mul r7, r6, r7\n\t"
  80251. "adds r5, r5, r7\n\t"
  80252. "adc r3, r3, #0\n\t"
  80253. "lsl r7, r9, #16\n\t"
  80254. "lsr r7, r7, #16\n\t"
  80255. "mul r6, r7, r6\n\t"
  80256. "lsr r7, r6, #16\n\t"
  80257. "lsl r6, r6, #16\n\t"
  80258. "adds r4, r4, r6\n\t"
  80259. "adcs r5, r5, r7\n\t"
  80260. "adc r3, r3, #0\n\t"
  80261. #else
  80262. "umull r6, r7, r8, r9\n\t"
  80263. "adds r4, r4, r6\n\t"
  80264. "adcs r5, r5, r7\n\t"
  80265. "adc r3, r3, #0\n\t"
  80266. #endif
  80267. /* A[11] * B[2] */
  80268. "ldr r8, [%[a], #44]\n\t"
  80269. "ldr r9, [%[b], #8]\n\t"
  80270. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80271. "lsl r6, r8, #16\n\t"
  80272. "lsl r7, r9, #16\n\t"
  80273. "lsr r6, r6, #16\n\t"
  80274. "lsr r7, r7, #16\n\t"
  80275. "mul r7, r6, r7\n\t"
  80276. "adds r4, r4, r7\n\t"
  80277. "adcs r5, r5, #0\n\t"
  80278. "adc r3, r3, #0\n\t"
  80279. "lsr r7, r9, #16\n\t"
  80280. "mul r6, r7, r6\n\t"
  80281. "lsr r7, r6, #16\n\t"
  80282. "lsl r6, r6, #16\n\t"
  80283. "adds r4, r4, r6\n\t"
  80284. "adcs r5, r5, r7\n\t"
  80285. "adc r3, r3, #0\n\t"
  80286. "lsr r6, r8, #16\n\t"
  80287. "lsr r7, r9, #16\n\t"
  80288. "mul r7, r6, r7\n\t"
  80289. "adds r5, r5, r7\n\t"
  80290. "adc r3, r3, #0\n\t"
  80291. "lsl r7, r9, #16\n\t"
  80292. "lsr r7, r7, #16\n\t"
  80293. "mul r6, r7, r6\n\t"
  80294. "lsr r7, r6, #16\n\t"
  80295. "lsl r6, r6, #16\n\t"
  80296. "adds r4, r4, r6\n\t"
  80297. "adcs r5, r5, r7\n\t"
  80298. "adc r3, r3, #0\n\t"
  80299. #else
  80300. "umull r6, r7, r8, r9\n\t"
  80301. "adds r4, r4, r6\n\t"
  80302. "adcs r5, r5, r7\n\t"
  80303. "adc r3, r3, #0\n\t"
  80304. #endif
  80305. "str r4, [%[r], #52]\n\t"
  80306. /* A[11] * B[3] */
  80307. "ldr r9, [%[b], #12]\n\t"
  80308. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80309. "lsl r6, r8, #16\n\t"
  80310. "lsl r7, r9, #16\n\t"
  80311. "lsr r6, r6, #16\n\t"
  80312. "lsr r7, r7, #16\n\t"
  80313. "mul r7, r6, r7\n\t"
  80314. "adds r5, r5, r7\n\t"
  80315. "adcs r3, r3, #0\n\t"
  80316. "mov r4, #0\n\t"
  80317. "adc r4, r4, #0\n\t"
  80318. "lsr r7, r9, #16\n\t"
  80319. "mul r6, r7, r6\n\t"
  80320. "lsr r7, r6, #16\n\t"
  80321. "lsl r6, r6, #16\n\t"
  80322. "adds r5, r5, r6\n\t"
  80323. "adcs r3, r3, r7\n\t"
  80324. "adc r4, r4, #0\n\t"
  80325. "lsr r6, r8, #16\n\t"
  80326. "lsr r7, r9, #16\n\t"
  80327. "mul r7, r6, r7\n\t"
  80328. "adds r3, r3, r7\n\t"
  80329. "adc r4, r4, #0\n\t"
  80330. "lsl r7, r9, #16\n\t"
  80331. "lsr r7, r7, #16\n\t"
  80332. "mul r6, r7, r6\n\t"
  80333. "lsr r7, r6, #16\n\t"
  80334. "lsl r6, r6, #16\n\t"
  80335. "adds r5, r5, r6\n\t"
  80336. "adcs r3, r3, r7\n\t"
  80337. "adc r4, r4, #0\n\t"
  80338. #else
  80339. "umull r6, r7, r8, r9\n\t"
  80340. "adds r5, r5, r6\n\t"
  80341. "adcs r3, r3, r7\n\t"
  80342. "mov r4, #0\n\t"
  80343. "adc r4, r4, #0\n\t"
  80344. #endif
  80345. /* A[10] * B[4] */
  80346. "ldr r8, [%[a], #40]\n\t"
  80347. "ldr r9, [%[b], #16]\n\t"
  80348. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80349. "lsl r6, r8, #16\n\t"
  80350. "lsl r7, r9, #16\n\t"
  80351. "lsr r6, r6, #16\n\t"
  80352. "lsr r7, r7, #16\n\t"
  80353. "mul r7, r6, r7\n\t"
  80354. "adds r5, r5, r7\n\t"
  80355. "adcs r3, r3, #0\n\t"
  80356. "adc r4, r4, #0\n\t"
  80357. "lsr r7, r9, #16\n\t"
  80358. "mul r6, r7, r6\n\t"
  80359. "lsr r7, r6, #16\n\t"
  80360. "lsl r6, r6, #16\n\t"
  80361. "adds r5, r5, r6\n\t"
  80362. "adcs r3, r3, r7\n\t"
  80363. "adc r4, r4, #0\n\t"
  80364. "lsr r6, r8, #16\n\t"
  80365. "lsr r7, r9, #16\n\t"
  80366. "mul r7, r6, r7\n\t"
  80367. "adds r3, r3, r7\n\t"
  80368. "adc r4, r4, #0\n\t"
  80369. "lsl r7, r9, #16\n\t"
  80370. "lsr r7, r7, #16\n\t"
  80371. "mul r6, r7, r6\n\t"
  80372. "lsr r7, r6, #16\n\t"
  80373. "lsl r6, r6, #16\n\t"
  80374. "adds r5, r5, r6\n\t"
  80375. "adcs r3, r3, r7\n\t"
  80376. "adc r4, r4, #0\n\t"
  80377. #else
  80378. "umull r6, r7, r8, r9\n\t"
  80379. "adds r5, r5, r6\n\t"
  80380. "adcs r3, r3, r7\n\t"
  80381. "adc r4, r4, #0\n\t"
  80382. #endif
  80383. /* A[9] * B[5] */
  80384. "ldr r8, [%[a], #36]\n\t"
  80385. "ldr r9, [%[b], #20]\n\t"
  80386. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80387. "lsl r6, r8, #16\n\t"
  80388. "lsl r7, r9, #16\n\t"
  80389. "lsr r6, r6, #16\n\t"
  80390. "lsr r7, r7, #16\n\t"
  80391. "mul r7, r6, r7\n\t"
  80392. "adds r5, r5, r7\n\t"
  80393. "adcs r3, r3, #0\n\t"
  80394. "adc r4, r4, #0\n\t"
  80395. "lsr r7, r9, #16\n\t"
  80396. "mul r6, r7, r6\n\t"
  80397. "lsr r7, r6, #16\n\t"
  80398. "lsl r6, r6, #16\n\t"
  80399. "adds r5, r5, r6\n\t"
  80400. "adcs r3, r3, r7\n\t"
  80401. "adc r4, r4, #0\n\t"
  80402. "lsr r6, r8, #16\n\t"
  80403. "lsr r7, r9, #16\n\t"
  80404. "mul r7, r6, r7\n\t"
  80405. "adds r3, r3, r7\n\t"
  80406. "adc r4, r4, #0\n\t"
  80407. "lsl r7, r9, #16\n\t"
  80408. "lsr r7, r7, #16\n\t"
  80409. "mul r6, r7, r6\n\t"
  80410. "lsr r7, r6, #16\n\t"
  80411. "lsl r6, r6, #16\n\t"
  80412. "adds r5, r5, r6\n\t"
  80413. "adcs r3, r3, r7\n\t"
  80414. "adc r4, r4, #0\n\t"
  80415. #else
  80416. "umull r6, r7, r8, r9\n\t"
  80417. "adds r5, r5, r6\n\t"
  80418. "adcs r3, r3, r7\n\t"
  80419. "adc r4, r4, #0\n\t"
  80420. #endif
  80421. /* A[8] * B[6] */
  80422. "ldr r8, [%[a], #32]\n\t"
  80423. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80424. "lsl r6, r8, #16\n\t"
  80425. "lsl r7, r12, #16\n\t"
  80426. "lsr r6, r6, #16\n\t"
  80427. "lsr r7, r7, #16\n\t"
  80428. "mul r7, r6, r7\n\t"
  80429. "adds r5, r5, r7\n\t"
  80430. "adcs r3, r3, #0\n\t"
  80431. "adc r4, r4, #0\n\t"
  80432. "lsr r7, r12, #16\n\t"
  80433. "mul r6, r7, r6\n\t"
  80434. "lsr r7, r6, #16\n\t"
  80435. "lsl r6, r6, #16\n\t"
  80436. "adds r5, r5, r6\n\t"
  80437. "adcs r3, r3, r7\n\t"
  80438. "adc r4, r4, #0\n\t"
  80439. "lsr r6, r8, #16\n\t"
  80440. "lsr r7, r12, #16\n\t"
  80441. "mul r7, r6, r7\n\t"
  80442. "adds r3, r3, r7\n\t"
  80443. "adc r4, r4, #0\n\t"
  80444. "lsl r7, r12, #16\n\t"
  80445. "lsr r7, r7, #16\n\t"
  80446. "mul r6, r7, r6\n\t"
  80447. "lsr r7, r6, #16\n\t"
  80448. "lsl r6, r6, #16\n\t"
  80449. "adds r5, r5, r6\n\t"
  80450. "adcs r3, r3, r7\n\t"
  80451. "adc r4, r4, #0\n\t"
  80452. #else
  80453. "umull r6, r7, r8, r12\n\t"
  80454. "adds r5, r5, r6\n\t"
  80455. "adcs r3, r3, r7\n\t"
  80456. "adc r4, r4, #0\n\t"
  80457. #endif
  80458. /* A[7] * B[7] */
  80459. "ldr r11, [%[a], #28]\n\t"
  80460. "ldr r12, [%[b], #28]\n\t"
  80461. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80462. "lsl r6, r11, #16\n\t"
  80463. "lsl r7, r12, #16\n\t"
  80464. "lsr r6, r6, #16\n\t"
  80465. "lsr r7, r7, #16\n\t"
  80466. "mul r7, r6, r7\n\t"
  80467. "adds r5, r5, r7\n\t"
  80468. "adcs r3, r3, #0\n\t"
  80469. "adc r4, r4, #0\n\t"
  80470. "lsr r7, r12, #16\n\t"
  80471. "mul r6, r7, r6\n\t"
  80472. "lsr r7, r6, #16\n\t"
  80473. "lsl r6, r6, #16\n\t"
  80474. "adds r5, r5, r6\n\t"
  80475. "adcs r3, r3, r7\n\t"
  80476. "adc r4, r4, #0\n\t"
  80477. "lsr r6, r11, #16\n\t"
  80478. "lsr r7, r12, #16\n\t"
  80479. "mul r7, r6, r7\n\t"
  80480. "adds r3, r3, r7\n\t"
  80481. "adc r4, r4, #0\n\t"
  80482. "lsl r7, r12, #16\n\t"
  80483. "lsr r7, r7, #16\n\t"
  80484. "mul r6, r7, r6\n\t"
  80485. "lsr r7, r6, #16\n\t"
  80486. "lsl r6, r6, #16\n\t"
  80487. "adds r5, r5, r6\n\t"
  80488. "adcs r3, r3, r7\n\t"
  80489. "adc r4, r4, #0\n\t"
  80490. #else
  80491. "umull r6, r7, r11, r12\n\t"
  80492. "adds r5, r5, r6\n\t"
  80493. "adcs r3, r3, r7\n\t"
  80494. "adc r4, r4, #0\n\t"
  80495. #endif
  80496. /* A[6] * B[8] */
  80497. "ldr r8, [%[a], #24]\n\t"
  80498. "ldr r9, [%[b], #32]\n\t"
  80499. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80500. "lsl r6, r8, #16\n\t"
  80501. "lsl r7, r9, #16\n\t"
  80502. "lsr r6, r6, #16\n\t"
  80503. "lsr r7, r7, #16\n\t"
  80504. "mul r7, r6, r7\n\t"
  80505. "adds r5, r5, r7\n\t"
  80506. "adcs r3, r3, #0\n\t"
  80507. "adc r4, r4, #0\n\t"
  80508. "lsr r7, r9, #16\n\t"
  80509. "mul r6, r7, r6\n\t"
  80510. "lsr r7, r6, #16\n\t"
  80511. "lsl r6, r6, #16\n\t"
  80512. "adds r5, r5, r6\n\t"
  80513. "adcs r3, r3, r7\n\t"
  80514. "adc r4, r4, #0\n\t"
  80515. "lsr r6, r8, #16\n\t"
  80516. "lsr r7, r9, #16\n\t"
  80517. "mul r7, r6, r7\n\t"
  80518. "adds r3, r3, r7\n\t"
  80519. "adc r4, r4, #0\n\t"
  80520. "lsl r7, r9, #16\n\t"
  80521. "lsr r7, r7, #16\n\t"
  80522. "mul r6, r7, r6\n\t"
  80523. "lsr r7, r6, #16\n\t"
  80524. "lsl r6, r6, #16\n\t"
  80525. "adds r5, r5, r6\n\t"
  80526. "adcs r3, r3, r7\n\t"
  80527. "adc r4, r4, #0\n\t"
  80528. #else
  80529. "umull r6, r7, r8, r9\n\t"
  80530. "adds r5, r5, r6\n\t"
  80531. "adcs r3, r3, r7\n\t"
  80532. "adc r4, r4, #0\n\t"
  80533. #endif
  80534. /* A[5] * B[9] */
  80535. "ldr r8, [%[a], #20]\n\t"
  80536. "ldr r9, [%[b], #36]\n\t"
  80537. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80538. "lsl r6, r8, #16\n\t"
  80539. "lsl r7, r9, #16\n\t"
  80540. "lsr r6, r6, #16\n\t"
  80541. "lsr r7, r7, #16\n\t"
  80542. "mul r7, r6, r7\n\t"
  80543. "adds r5, r5, r7\n\t"
  80544. "adcs r3, r3, #0\n\t"
  80545. "adc r4, r4, #0\n\t"
  80546. "lsr r7, r9, #16\n\t"
  80547. "mul r6, r7, r6\n\t"
  80548. "lsr r7, r6, #16\n\t"
  80549. "lsl r6, r6, #16\n\t"
  80550. "adds r5, r5, r6\n\t"
  80551. "adcs r3, r3, r7\n\t"
  80552. "adc r4, r4, #0\n\t"
  80553. "lsr r6, r8, #16\n\t"
  80554. "lsr r7, r9, #16\n\t"
  80555. "mul r7, r6, r7\n\t"
  80556. "adds r3, r3, r7\n\t"
  80557. "adc r4, r4, #0\n\t"
  80558. "lsl r7, r9, #16\n\t"
  80559. "lsr r7, r7, #16\n\t"
  80560. "mul r6, r7, r6\n\t"
  80561. "lsr r7, r6, #16\n\t"
  80562. "lsl r6, r6, #16\n\t"
  80563. "adds r5, r5, r6\n\t"
  80564. "adcs r3, r3, r7\n\t"
  80565. "adc r4, r4, #0\n\t"
  80566. #else
  80567. "umull r6, r7, r8, r9\n\t"
  80568. "adds r5, r5, r6\n\t"
  80569. "adcs r3, r3, r7\n\t"
  80570. "adc r4, r4, #0\n\t"
  80571. #endif
  80572. /* A[4] * B[10] */
  80573. "ldr r8, [%[a], #16]\n\t"
  80574. "ldr r9, [%[b], #40]\n\t"
  80575. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80576. "lsl r6, r8, #16\n\t"
  80577. "lsl r7, r9, #16\n\t"
  80578. "lsr r6, r6, #16\n\t"
  80579. "lsr r7, r7, #16\n\t"
  80580. "mul r7, r6, r7\n\t"
  80581. "adds r5, r5, r7\n\t"
  80582. "adcs r3, r3, #0\n\t"
  80583. "adc r4, r4, #0\n\t"
  80584. "lsr r7, r9, #16\n\t"
  80585. "mul r6, r7, r6\n\t"
  80586. "lsr r7, r6, #16\n\t"
  80587. "lsl r6, r6, #16\n\t"
  80588. "adds r5, r5, r6\n\t"
  80589. "adcs r3, r3, r7\n\t"
  80590. "adc r4, r4, #0\n\t"
  80591. "lsr r6, r8, #16\n\t"
  80592. "lsr r7, r9, #16\n\t"
  80593. "mul r7, r6, r7\n\t"
  80594. "adds r3, r3, r7\n\t"
  80595. "adc r4, r4, #0\n\t"
  80596. "lsl r7, r9, #16\n\t"
  80597. "lsr r7, r7, #16\n\t"
  80598. "mul r6, r7, r6\n\t"
  80599. "lsr r7, r6, #16\n\t"
  80600. "lsl r6, r6, #16\n\t"
  80601. "adds r5, r5, r6\n\t"
  80602. "adcs r3, r3, r7\n\t"
  80603. "adc r4, r4, #0\n\t"
  80604. #else
  80605. "umull r6, r7, r8, r9\n\t"
  80606. "adds r5, r5, r6\n\t"
  80607. "adcs r3, r3, r7\n\t"
  80608. "adc r4, r4, #0\n\t"
  80609. #endif
  80610. /* A[3] * B[11] */
  80611. "ldr r8, [%[a], #12]\n\t"
  80612. "ldr r9, [%[b], #44]\n\t"
  80613. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80614. "lsl r6, r8, #16\n\t"
  80615. "lsl r7, r9, #16\n\t"
  80616. "lsr r6, r6, #16\n\t"
  80617. "lsr r7, r7, #16\n\t"
  80618. "mul r7, r6, r7\n\t"
  80619. "adds r5, r5, r7\n\t"
  80620. "adcs r3, r3, #0\n\t"
  80621. "adc r4, r4, #0\n\t"
  80622. "lsr r7, r9, #16\n\t"
  80623. "mul r6, r7, r6\n\t"
  80624. "lsr r7, r6, #16\n\t"
  80625. "lsl r6, r6, #16\n\t"
  80626. "adds r5, r5, r6\n\t"
  80627. "adcs r3, r3, r7\n\t"
  80628. "adc r4, r4, #0\n\t"
  80629. "lsr r6, r8, #16\n\t"
  80630. "lsr r7, r9, #16\n\t"
  80631. "mul r7, r6, r7\n\t"
  80632. "adds r3, r3, r7\n\t"
  80633. "adc r4, r4, #0\n\t"
  80634. "lsl r7, r9, #16\n\t"
  80635. "lsr r7, r7, #16\n\t"
  80636. "mul r6, r7, r6\n\t"
  80637. "lsr r7, r6, #16\n\t"
  80638. "lsl r6, r6, #16\n\t"
  80639. "adds r5, r5, r6\n\t"
  80640. "adcs r3, r3, r7\n\t"
  80641. "adc r4, r4, #0\n\t"
  80642. #else
  80643. "umull r6, r7, r8, r9\n\t"
  80644. "adds r5, r5, r6\n\t"
  80645. "adcs r3, r3, r7\n\t"
  80646. "adc r4, r4, #0\n\t"
  80647. #endif
  80648. "str r5, [%[r], #56]\n\t"
  80649. /* A[4] * B[11] */
  80650. "ldr r8, [%[a], #16]\n\t"
  80651. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80652. "lsl r6, r8, #16\n\t"
  80653. "lsl r7, r9, #16\n\t"
  80654. "lsr r6, r6, #16\n\t"
  80655. "lsr r7, r7, #16\n\t"
  80656. "mul r7, r6, r7\n\t"
  80657. "adds r3, r3, r7\n\t"
  80658. "adcs r4, r4, #0\n\t"
  80659. "mov r5, #0\n\t"
  80660. "adc r5, r5, #0\n\t"
  80661. "lsr r7, r9, #16\n\t"
  80662. "mul r6, r7, r6\n\t"
  80663. "lsr r7, r6, #16\n\t"
  80664. "lsl r6, r6, #16\n\t"
  80665. "adds r3, r3, r6\n\t"
  80666. "adcs r4, r4, r7\n\t"
  80667. "adc r5, r5, #0\n\t"
  80668. "lsr r6, r8, #16\n\t"
  80669. "lsr r7, r9, #16\n\t"
  80670. "mul r7, r6, r7\n\t"
  80671. "adds r4, r4, r7\n\t"
  80672. "adc r5, r5, #0\n\t"
  80673. "lsl r7, r9, #16\n\t"
  80674. "lsr r7, r7, #16\n\t"
  80675. "mul r6, r7, r6\n\t"
  80676. "lsr r7, r6, #16\n\t"
  80677. "lsl r6, r6, #16\n\t"
  80678. "adds r3, r3, r6\n\t"
  80679. "adcs r4, r4, r7\n\t"
  80680. "adc r5, r5, #0\n\t"
  80681. #else
  80682. "umull r6, r7, r8, r9\n\t"
  80683. "adds r3, r3, r6\n\t"
  80684. "adcs r4, r4, r7\n\t"
  80685. "mov r5, #0\n\t"
  80686. "adc r5, r5, #0\n\t"
  80687. #endif
  80688. /* A[5] * B[10] */
  80689. "ldr r8, [%[a], #20]\n\t"
  80690. "ldr r9, [%[b], #40]\n\t"
  80691. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80692. "lsl r6, r8, #16\n\t"
  80693. "lsl r7, r9, #16\n\t"
  80694. "lsr r6, r6, #16\n\t"
  80695. "lsr r7, r7, #16\n\t"
  80696. "mul r7, r6, r7\n\t"
  80697. "adds r3, r3, r7\n\t"
  80698. "adcs r4, r4, #0\n\t"
  80699. "adc r5, r5, #0\n\t"
  80700. "lsr r7, r9, #16\n\t"
  80701. "mul r6, r7, r6\n\t"
  80702. "lsr r7, r6, #16\n\t"
  80703. "lsl r6, r6, #16\n\t"
  80704. "adds r3, r3, r6\n\t"
  80705. "adcs r4, r4, r7\n\t"
  80706. "adc r5, r5, #0\n\t"
  80707. "lsr r6, r8, #16\n\t"
  80708. "lsr r7, r9, #16\n\t"
  80709. "mul r7, r6, r7\n\t"
  80710. "adds r4, r4, r7\n\t"
  80711. "adc r5, r5, #0\n\t"
  80712. "lsl r7, r9, #16\n\t"
  80713. "lsr r7, r7, #16\n\t"
  80714. "mul r6, r7, r6\n\t"
  80715. "lsr r7, r6, #16\n\t"
  80716. "lsl r6, r6, #16\n\t"
  80717. "adds r3, r3, r6\n\t"
  80718. "adcs r4, r4, r7\n\t"
  80719. "adc r5, r5, #0\n\t"
  80720. #else
  80721. "umull r6, r7, r8, r9\n\t"
  80722. "adds r3, r3, r6\n\t"
  80723. "adcs r4, r4, r7\n\t"
  80724. "adc r5, r5, #0\n\t"
  80725. #endif
  80726. /* A[6] * B[9] */
  80727. "ldr r8, [%[a], #24]\n\t"
  80728. "ldr r9, [%[b], #36]\n\t"
  80729. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80730. "lsl r6, r8, #16\n\t"
  80731. "lsl r7, r9, #16\n\t"
  80732. "lsr r6, r6, #16\n\t"
  80733. "lsr r7, r7, #16\n\t"
  80734. "mul r7, r6, r7\n\t"
  80735. "adds r3, r3, r7\n\t"
  80736. "adcs r4, r4, #0\n\t"
  80737. "adc r5, r5, #0\n\t"
  80738. "lsr r7, r9, #16\n\t"
  80739. "mul r6, r7, r6\n\t"
  80740. "lsr r7, r6, #16\n\t"
  80741. "lsl r6, r6, #16\n\t"
  80742. "adds r3, r3, r6\n\t"
  80743. "adcs r4, r4, r7\n\t"
  80744. "adc r5, r5, #0\n\t"
  80745. "lsr r6, r8, #16\n\t"
  80746. "lsr r7, r9, #16\n\t"
  80747. "mul r7, r6, r7\n\t"
  80748. "adds r4, r4, r7\n\t"
  80749. "adc r5, r5, #0\n\t"
  80750. "lsl r7, r9, #16\n\t"
  80751. "lsr r7, r7, #16\n\t"
  80752. "mul r6, r7, r6\n\t"
  80753. "lsr r7, r6, #16\n\t"
  80754. "lsl r6, r6, #16\n\t"
  80755. "adds r3, r3, r6\n\t"
  80756. "adcs r4, r4, r7\n\t"
  80757. "adc r5, r5, #0\n\t"
  80758. #else
  80759. "umull r6, r7, r8, r9\n\t"
  80760. "adds r3, r3, r6\n\t"
  80761. "adcs r4, r4, r7\n\t"
  80762. "adc r5, r5, #0\n\t"
  80763. #endif
  80764. /* A[7] * B[8] */
  80765. "ldr r9, [%[b], #32]\n\t"
  80766. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80767. "lsl r6, r11, #16\n\t"
  80768. "lsl r7, r9, #16\n\t"
  80769. "lsr r6, r6, #16\n\t"
  80770. "lsr r7, r7, #16\n\t"
  80771. "mul r7, r6, r7\n\t"
  80772. "adds r3, r3, r7\n\t"
  80773. "adcs r4, r4, #0\n\t"
  80774. "adc r5, r5, #0\n\t"
  80775. "lsr r7, r9, #16\n\t"
  80776. "mul r6, r7, r6\n\t"
  80777. "lsr r7, r6, #16\n\t"
  80778. "lsl r6, r6, #16\n\t"
  80779. "adds r3, r3, r6\n\t"
  80780. "adcs r4, r4, r7\n\t"
  80781. "adc r5, r5, #0\n\t"
  80782. "lsr r6, r11, #16\n\t"
  80783. "lsr r7, r9, #16\n\t"
  80784. "mul r7, r6, r7\n\t"
  80785. "adds r4, r4, r7\n\t"
  80786. "adc r5, r5, #0\n\t"
  80787. "lsl r7, r9, #16\n\t"
  80788. "lsr r7, r7, #16\n\t"
  80789. "mul r6, r7, r6\n\t"
  80790. "lsr r7, r6, #16\n\t"
  80791. "lsl r6, r6, #16\n\t"
  80792. "adds r3, r3, r6\n\t"
  80793. "adcs r4, r4, r7\n\t"
  80794. "adc r5, r5, #0\n\t"
  80795. #else
  80796. "umull r6, r7, r11, r9\n\t"
  80797. "adds r3, r3, r6\n\t"
  80798. "adcs r4, r4, r7\n\t"
  80799. "adc r5, r5, #0\n\t"
  80800. #endif
  80801. /* A[8] * B[7] */
  80802. "ldr r8, [%[a], #32]\n\t"
  80803. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80804. "lsl r6, r8, #16\n\t"
  80805. "lsl r7, r12, #16\n\t"
  80806. "lsr r6, r6, #16\n\t"
  80807. "lsr r7, r7, #16\n\t"
  80808. "mul r7, r6, r7\n\t"
  80809. "adds r3, r3, r7\n\t"
  80810. "adcs r4, r4, #0\n\t"
  80811. "adc r5, r5, #0\n\t"
  80812. "lsr r7, r12, #16\n\t"
  80813. "mul r6, r7, r6\n\t"
  80814. "lsr r7, r6, #16\n\t"
  80815. "lsl r6, r6, #16\n\t"
  80816. "adds r3, r3, r6\n\t"
  80817. "adcs r4, r4, r7\n\t"
  80818. "adc r5, r5, #0\n\t"
  80819. "lsr r6, r8, #16\n\t"
  80820. "lsr r7, r12, #16\n\t"
  80821. "mul r7, r6, r7\n\t"
  80822. "adds r4, r4, r7\n\t"
  80823. "adc r5, r5, #0\n\t"
  80824. "lsl r7, r12, #16\n\t"
  80825. "lsr r7, r7, #16\n\t"
  80826. "mul r6, r7, r6\n\t"
  80827. "lsr r7, r6, #16\n\t"
  80828. "lsl r6, r6, #16\n\t"
  80829. "adds r3, r3, r6\n\t"
  80830. "adcs r4, r4, r7\n\t"
  80831. "adc r5, r5, #0\n\t"
  80832. #else
  80833. "umull r6, r7, r8, r12\n\t"
  80834. "adds r3, r3, r6\n\t"
  80835. "adcs r4, r4, r7\n\t"
  80836. "adc r5, r5, #0\n\t"
  80837. #endif
  80838. /* A[9] * B[6] */
  80839. "ldr r8, [%[a], #36]\n\t"
  80840. "ldr r9, [%[b], #24]\n\t"
  80841. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80842. "lsl r6, r8, #16\n\t"
  80843. "lsl r7, r9, #16\n\t"
  80844. "lsr r6, r6, #16\n\t"
  80845. "lsr r7, r7, #16\n\t"
  80846. "mul r7, r6, r7\n\t"
  80847. "adds r3, r3, r7\n\t"
  80848. "adcs r4, r4, #0\n\t"
  80849. "adc r5, r5, #0\n\t"
  80850. "lsr r7, r9, #16\n\t"
  80851. "mul r6, r7, r6\n\t"
  80852. "lsr r7, r6, #16\n\t"
  80853. "lsl r6, r6, #16\n\t"
  80854. "adds r3, r3, r6\n\t"
  80855. "adcs r4, r4, r7\n\t"
  80856. "adc r5, r5, #0\n\t"
  80857. "lsr r6, r8, #16\n\t"
  80858. "lsr r7, r9, #16\n\t"
  80859. "mul r7, r6, r7\n\t"
  80860. "adds r4, r4, r7\n\t"
  80861. "adc r5, r5, #0\n\t"
  80862. "lsl r7, r9, #16\n\t"
  80863. "lsr r7, r7, #16\n\t"
  80864. "mul r6, r7, r6\n\t"
  80865. "lsr r7, r6, #16\n\t"
  80866. "lsl r6, r6, #16\n\t"
  80867. "adds r3, r3, r6\n\t"
  80868. "adcs r4, r4, r7\n\t"
  80869. "adc r5, r5, #0\n\t"
  80870. #else
  80871. "umull r6, r7, r8, r9\n\t"
  80872. "adds r3, r3, r6\n\t"
  80873. "adcs r4, r4, r7\n\t"
  80874. "adc r5, r5, #0\n\t"
  80875. #endif
  80876. /* A[10] * B[5] */
  80877. "ldr r8, [%[a], #40]\n\t"
  80878. "ldr r9, [%[b], #20]\n\t"
  80879. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80880. "lsl r6, r8, #16\n\t"
  80881. "lsl r7, r9, #16\n\t"
  80882. "lsr r6, r6, #16\n\t"
  80883. "lsr r7, r7, #16\n\t"
  80884. "mul r7, r6, r7\n\t"
  80885. "adds r3, r3, r7\n\t"
  80886. "adcs r4, r4, #0\n\t"
  80887. "adc r5, r5, #0\n\t"
  80888. "lsr r7, r9, #16\n\t"
  80889. "mul r6, r7, r6\n\t"
  80890. "lsr r7, r6, #16\n\t"
  80891. "lsl r6, r6, #16\n\t"
  80892. "adds r3, r3, r6\n\t"
  80893. "adcs r4, r4, r7\n\t"
  80894. "adc r5, r5, #0\n\t"
  80895. "lsr r6, r8, #16\n\t"
  80896. "lsr r7, r9, #16\n\t"
  80897. "mul r7, r6, r7\n\t"
  80898. "adds r4, r4, r7\n\t"
  80899. "adc r5, r5, #0\n\t"
  80900. "lsl r7, r9, #16\n\t"
  80901. "lsr r7, r7, #16\n\t"
  80902. "mul r6, r7, r6\n\t"
  80903. "lsr r7, r6, #16\n\t"
  80904. "lsl r6, r6, #16\n\t"
  80905. "adds r3, r3, r6\n\t"
  80906. "adcs r4, r4, r7\n\t"
  80907. "adc r5, r5, #0\n\t"
  80908. #else
  80909. "umull r6, r7, r8, r9\n\t"
  80910. "adds r3, r3, r6\n\t"
  80911. "adcs r4, r4, r7\n\t"
  80912. "adc r5, r5, #0\n\t"
  80913. #endif
  80914. /* A[11] * B[4] */
  80915. "ldr r8, [%[a], #44]\n\t"
  80916. "ldr r9, [%[b], #16]\n\t"
  80917. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80918. "lsl r6, r8, #16\n\t"
  80919. "lsl r7, r9, #16\n\t"
  80920. "lsr r6, r6, #16\n\t"
  80921. "lsr r7, r7, #16\n\t"
  80922. "mul r7, r6, r7\n\t"
  80923. "adds r3, r3, r7\n\t"
  80924. "adcs r4, r4, #0\n\t"
  80925. "adc r5, r5, #0\n\t"
  80926. "lsr r7, r9, #16\n\t"
  80927. "mul r6, r7, r6\n\t"
  80928. "lsr r7, r6, #16\n\t"
  80929. "lsl r6, r6, #16\n\t"
  80930. "adds r3, r3, r6\n\t"
  80931. "adcs r4, r4, r7\n\t"
  80932. "adc r5, r5, #0\n\t"
  80933. "lsr r6, r8, #16\n\t"
  80934. "lsr r7, r9, #16\n\t"
  80935. "mul r7, r6, r7\n\t"
  80936. "adds r4, r4, r7\n\t"
  80937. "adc r5, r5, #0\n\t"
  80938. "lsl r7, r9, #16\n\t"
  80939. "lsr r7, r7, #16\n\t"
  80940. "mul r6, r7, r6\n\t"
  80941. "lsr r7, r6, #16\n\t"
  80942. "lsl r6, r6, #16\n\t"
  80943. "adds r3, r3, r6\n\t"
  80944. "adcs r4, r4, r7\n\t"
  80945. "adc r5, r5, #0\n\t"
  80946. #else
  80947. "umull r6, r7, r8, r9\n\t"
  80948. "adds r3, r3, r6\n\t"
  80949. "adcs r4, r4, r7\n\t"
  80950. "adc r5, r5, #0\n\t"
  80951. #endif
  80952. "str r3, [%[r], #60]\n\t"
  80953. /* A[11] * B[5] */
  80954. "ldr r9, [%[b], #20]\n\t"
  80955. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80956. "lsl r6, r8, #16\n\t"
  80957. "lsl r7, r9, #16\n\t"
  80958. "lsr r6, r6, #16\n\t"
  80959. "lsr r7, r7, #16\n\t"
  80960. "mul r7, r6, r7\n\t"
  80961. "adds r4, r4, r7\n\t"
  80962. "adcs r5, r5, #0\n\t"
  80963. "mov r3, #0\n\t"
  80964. "adc r3, r3, #0\n\t"
  80965. "lsr r7, r9, #16\n\t"
  80966. "mul r6, r7, r6\n\t"
  80967. "lsr r7, r6, #16\n\t"
  80968. "lsl r6, r6, #16\n\t"
  80969. "adds r4, r4, r6\n\t"
  80970. "adcs r5, r5, r7\n\t"
  80971. "adc r3, r3, #0\n\t"
  80972. "lsr r6, r8, #16\n\t"
  80973. "lsr r7, r9, #16\n\t"
  80974. "mul r7, r6, r7\n\t"
  80975. "adds r5, r5, r7\n\t"
  80976. "adc r3, r3, #0\n\t"
  80977. "lsl r7, r9, #16\n\t"
  80978. "lsr r7, r7, #16\n\t"
  80979. "mul r6, r7, r6\n\t"
  80980. "lsr r7, r6, #16\n\t"
  80981. "lsl r6, r6, #16\n\t"
  80982. "adds r4, r4, r6\n\t"
  80983. "adcs r5, r5, r7\n\t"
  80984. "adc r3, r3, #0\n\t"
  80985. #else
  80986. "umull r6, r7, r8, r9\n\t"
  80987. "adds r4, r4, r6\n\t"
  80988. "adcs r5, r5, r7\n\t"
  80989. "mov r3, #0\n\t"
  80990. "adc r3, r3, #0\n\t"
  80991. #endif
  80992. /* A[10] * B[6] */
  80993. "ldr r8, [%[a], #40]\n\t"
  80994. "ldr r9, [%[b], #24]\n\t"
  80995. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  80996. "lsl r6, r8, #16\n\t"
  80997. "lsl r7, r9, #16\n\t"
  80998. "lsr r6, r6, #16\n\t"
  80999. "lsr r7, r7, #16\n\t"
  81000. "mul r7, r6, r7\n\t"
  81001. "adds r4, r4, r7\n\t"
  81002. "adcs r5, r5, #0\n\t"
  81003. "adc r3, r3, #0\n\t"
  81004. "lsr r7, r9, #16\n\t"
  81005. "mul r6, r7, r6\n\t"
  81006. "lsr r7, r6, #16\n\t"
  81007. "lsl r6, r6, #16\n\t"
  81008. "adds r4, r4, r6\n\t"
  81009. "adcs r5, r5, r7\n\t"
  81010. "adc r3, r3, #0\n\t"
  81011. "lsr r6, r8, #16\n\t"
  81012. "lsr r7, r9, #16\n\t"
  81013. "mul r7, r6, r7\n\t"
  81014. "adds r5, r5, r7\n\t"
  81015. "adc r3, r3, #0\n\t"
  81016. "lsl r7, r9, #16\n\t"
  81017. "lsr r7, r7, #16\n\t"
  81018. "mul r6, r7, r6\n\t"
  81019. "lsr r7, r6, #16\n\t"
  81020. "lsl r6, r6, #16\n\t"
  81021. "adds r4, r4, r6\n\t"
  81022. "adcs r5, r5, r7\n\t"
  81023. "adc r3, r3, #0\n\t"
  81024. #else
  81025. "umull r6, r7, r8, r9\n\t"
  81026. "adds r4, r4, r6\n\t"
  81027. "adcs r5, r5, r7\n\t"
  81028. "adc r3, r3, #0\n\t"
  81029. #endif
  81030. /* A[9] * B[7] */
  81031. "ldr r8, [%[a], #36]\n\t"
  81032. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81033. "lsl r6, r8, #16\n\t"
  81034. "lsl r7, r12, #16\n\t"
  81035. "lsr r6, r6, #16\n\t"
  81036. "lsr r7, r7, #16\n\t"
  81037. "mul r7, r6, r7\n\t"
  81038. "adds r4, r4, r7\n\t"
  81039. "adcs r5, r5, #0\n\t"
  81040. "adc r3, r3, #0\n\t"
  81041. "lsr r7, r12, #16\n\t"
  81042. "mul r6, r7, r6\n\t"
  81043. "lsr r7, r6, #16\n\t"
  81044. "lsl r6, r6, #16\n\t"
  81045. "adds r4, r4, r6\n\t"
  81046. "adcs r5, r5, r7\n\t"
  81047. "adc r3, r3, #0\n\t"
  81048. "lsr r6, r8, #16\n\t"
  81049. "lsr r7, r12, #16\n\t"
  81050. "mul r7, r6, r7\n\t"
  81051. "adds r5, r5, r7\n\t"
  81052. "adc r3, r3, #0\n\t"
  81053. "lsl r7, r12, #16\n\t"
  81054. "lsr r7, r7, #16\n\t"
  81055. "mul r6, r7, r6\n\t"
  81056. "lsr r7, r6, #16\n\t"
  81057. "lsl r6, r6, #16\n\t"
  81058. "adds r4, r4, r6\n\t"
  81059. "adcs r5, r5, r7\n\t"
  81060. "adc r3, r3, #0\n\t"
  81061. #else
  81062. "umull r6, r7, r8, r12\n\t"
  81063. "adds r4, r4, r6\n\t"
  81064. "adcs r5, r5, r7\n\t"
  81065. "adc r3, r3, #0\n\t"
  81066. #endif
  81067. /* A[8] * B[8] */
  81068. "ldr r11, [%[a], #32]\n\t"
  81069. "ldr r12, [%[b], #32]\n\t"
  81070. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81071. "lsl r6, r11, #16\n\t"
  81072. "lsl r7, r12, #16\n\t"
  81073. "lsr r6, r6, #16\n\t"
  81074. "lsr r7, r7, #16\n\t"
  81075. "mul r7, r6, r7\n\t"
  81076. "adds r4, r4, r7\n\t"
  81077. "adcs r5, r5, #0\n\t"
  81078. "adc r3, r3, #0\n\t"
  81079. "lsr r7, r12, #16\n\t"
  81080. "mul r6, r7, r6\n\t"
  81081. "lsr r7, r6, #16\n\t"
  81082. "lsl r6, r6, #16\n\t"
  81083. "adds r4, r4, r6\n\t"
  81084. "adcs r5, r5, r7\n\t"
  81085. "adc r3, r3, #0\n\t"
  81086. "lsr r6, r11, #16\n\t"
  81087. "lsr r7, r12, #16\n\t"
  81088. "mul r7, r6, r7\n\t"
  81089. "adds r5, r5, r7\n\t"
  81090. "adc r3, r3, #0\n\t"
  81091. "lsl r7, r12, #16\n\t"
  81092. "lsr r7, r7, #16\n\t"
  81093. "mul r6, r7, r6\n\t"
  81094. "lsr r7, r6, #16\n\t"
  81095. "lsl r6, r6, #16\n\t"
  81096. "adds r4, r4, r6\n\t"
  81097. "adcs r5, r5, r7\n\t"
  81098. "adc r3, r3, #0\n\t"
  81099. #else
  81100. "umull r6, r7, r11, r12\n\t"
  81101. "adds r4, r4, r6\n\t"
  81102. "adcs r5, r5, r7\n\t"
  81103. "adc r3, r3, #0\n\t"
  81104. #endif
  81105. /* A[7] * B[9] */
  81106. "ldr r8, [%[a], #28]\n\t"
  81107. "ldr r9, [%[b], #36]\n\t"
  81108. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81109. "lsl r6, r8, #16\n\t"
  81110. "lsl r7, r9, #16\n\t"
  81111. "lsr r6, r6, #16\n\t"
  81112. "lsr r7, r7, #16\n\t"
  81113. "mul r7, r6, r7\n\t"
  81114. "adds r4, r4, r7\n\t"
  81115. "adcs r5, r5, #0\n\t"
  81116. "adc r3, r3, #0\n\t"
  81117. "lsr r7, r9, #16\n\t"
  81118. "mul r6, r7, r6\n\t"
  81119. "lsr r7, r6, #16\n\t"
  81120. "lsl r6, r6, #16\n\t"
  81121. "adds r4, r4, r6\n\t"
  81122. "adcs r5, r5, r7\n\t"
  81123. "adc r3, r3, #0\n\t"
  81124. "lsr r6, r8, #16\n\t"
  81125. "lsr r7, r9, #16\n\t"
  81126. "mul r7, r6, r7\n\t"
  81127. "adds r5, r5, r7\n\t"
  81128. "adc r3, r3, #0\n\t"
  81129. "lsl r7, r9, #16\n\t"
  81130. "lsr r7, r7, #16\n\t"
  81131. "mul r6, r7, r6\n\t"
  81132. "lsr r7, r6, #16\n\t"
  81133. "lsl r6, r6, #16\n\t"
  81134. "adds r4, r4, r6\n\t"
  81135. "adcs r5, r5, r7\n\t"
  81136. "adc r3, r3, #0\n\t"
  81137. #else
  81138. "umull r6, r7, r8, r9\n\t"
  81139. "adds r4, r4, r6\n\t"
  81140. "adcs r5, r5, r7\n\t"
  81141. "adc r3, r3, #0\n\t"
  81142. #endif
  81143. /* A[6] * B[10] */
  81144. "ldr r8, [%[a], #24]\n\t"
  81145. "ldr r9, [%[b], #40]\n\t"
  81146. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81147. "lsl r6, r8, #16\n\t"
  81148. "lsl r7, r9, #16\n\t"
  81149. "lsr r6, r6, #16\n\t"
  81150. "lsr r7, r7, #16\n\t"
  81151. "mul r7, r6, r7\n\t"
  81152. "adds r4, r4, r7\n\t"
  81153. "adcs r5, r5, #0\n\t"
  81154. "adc r3, r3, #0\n\t"
  81155. "lsr r7, r9, #16\n\t"
  81156. "mul r6, r7, r6\n\t"
  81157. "lsr r7, r6, #16\n\t"
  81158. "lsl r6, r6, #16\n\t"
  81159. "adds r4, r4, r6\n\t"
  81160. "adcs r5, r5, r7\n\t"
  81161. "adc r3, r3, #0\n\t"
  81162. "lsr r6, r8, #16\n\t"
  81163. "lsr r7, r9, #16\n\t"
  81164. "mul r7, r6, r7\n\t"
  81165. "adds r5, r5, r7\n\t"
  81166. "adc r3, r3, #0\n\t"
  81167. "lsl r7, r9, #16\n\t"
  81168. "lsr r7, r7, #16\n\t"
  81169. "mul r6, r7, r6\n\t"
  81170. "lsr r7, r6, #16\n\t"
  81171. "lsl r6, r6, #16\n\t"
  81172. "adds r4, r4, r6\n\t"
  81173. "adcs r5, r5, r7\n\t"
  81174. "adc r3, r3, #0\n\t"
  81175. #else
  81176. "umull r6, r7, r8, r9\n\t"
  81177. "adds r4, r4, r6\n\t"
  81178. "adcs r5, r5, r7\n\t"
  81179. "adc r3, r3, #0\n\t"
  81180. #endif
  81181. /* A[5] * B[11] */
  81182. "ldr r8, [%[a], #20]\n\t"
  81183. "ldr r9, [%[b], #44]\n\t"
  81184. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81185. "lsl r6, r8, #16\n\t"
  81186. "lsl r7, r9, #16\n\t"
  81187. "lsr r6, r6, #16\n\t"
  81188. "lsr r7, r7, #16\n\t"
  81189. "mul r7, r6, r7\n\t"
  81190. "adds r4, r4, r7\n\t"
  81191. "adcs r5, r5, #0\n\t"
  81192. "adc r3, r3, #0\n\t"
  81193. "lsr r7, r9, #16\n\t"
  81194. "mul r6, r7, r6\n\t"
  81195. "lsr r7, r6, #16\n\t"
  81196. "lsl r6, r6, #16\n\t"
  81197. "adds r4, r4, r6\n\t"
  81198. "adcs r5, r5, r7\n\t"
  81199. "adc r3, r3, #0\n\t"
  81200. "lsr r6, r8, #16\n\t"
  81201. "lsr r7, r9, #16\n\t"
  81202. "mul r7, r6, r7\n\t"
  81203. "adds r5, r5, r7\n\t"
  81204. "adc r3, r3, #0\n\t"
  81205. "lsl r7, r9, #16\n\t"
  81206. "lsr r7, r7, #16\n\t"
  81207. "mul r6, r7, r6\n\t"
  81208. "lsr r7, r6, #16\n\t"
  81209. "lsl r6, r6, #16\n\t"
  81210. "adds r4, r4, r6\n\t"
  81211. "adcs r5, r5, r7\n\t"
  81212. "adc r3, r3, #0\n\t"
  81213. #else
  81214. "umull r6, r7, r8, r9\n\t"
  81215. "adds r4, r4, r6\n\t"
  81216. "adcs r5, r5, r7\n\t"
  81217. "adc r3, r3, #0\n\t"
  81218. #endif
  81219. "str r4, [%[r], #64]\n\t"
  81220. /* A[6] * B[11] */
  81221. "ldr r8, [%[a], #24]\n\t"
  81222. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81223. "lsl r6, r8, #16\n\t"
  81224. "lsl r7, r9, #16\n\t"
  81225. "lsr r6, r6, #16\n\t"
  81226. "lsr r7, r7, #16\n\t"
  81227. "mul r7, r6, r7\n\t"
  81228. "adds r5, r5, r7\n\t"
  81229. "adcs r3, r3, #0\n\t"
  81230. "mov r4, #0\n\t"
  81231. "adc r4, r4, #0\n\t"
  81232. "lsr r7, r9, #16\n\t"
  81233. "mul r6, r7, r6\n\t"
  81234. "lsr r7, r6, #16\n\t"
  81235. "lsl r6, r6, #16\n\t"
  81236. "adds r5, r5, r6\n\t"
  81237. "adcs r3, r3, r7\n\t"
  81238. "adc r4, r4, #0\n\t"
  81239. "lsr r6, r8, #16\n\t"
  81240. "lsr r7, r9, #16\n\t"
  81241. "mul r7, r6, r7\n\t"
  81242. "adds r3, r3, r7\n\t"
  81243. "adc r4, r4, #0\n\t"
  81244. "lsl r7, r9, #16\n\t"
  81245. "lsr r7, r7, #16\n\t"
  81246. "mul r6, r7, r6\n\t"
  81247. "lsr r7, r6, #16\n\t"
  81248. "lsl r6, r6, #16\n\t"
  81249. "adds r5, r5, r6\n\t"
  81250. "adcs r3, r3, r7\n\t"
  81251. "adc r4, r4, #0\n\t"
  81252. #else
  81253. "umull r6, r7, r8, r9\n\t"
  81254. "adds r5, r5, r6\n\t"
  81255. "adcs r3, r3, r7\n\t"
  81256. "mov r4, #0\n\t"
  81257. "adc r4, r4, #0\n\t"
  81258. #endif
  81259. /* A[7] * B[10] */
  81260. "ldr r8, [%[a], #28]\n\t"
  81261. "ldr r9, [%[b], #40]\n\t"
  81262. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81263. "lsl r6, r8, #16\n\t"
  81264. "lsl r7, r9, #16\n\t"
  81265. "lsr r6, r6, #16\n\t"
  81266. "lsr r7, r7, #16\n\t"
  81267. "mul r7, r6, r7\n\t"
  81268. "adds r5, r5, r7\n\t"
  81269. "adcs r3, r3, #0\n\t"
  81270. "adc r4, r4, #0\n\t"
  81271. "lsr r7, r9, #16\n\t"
  81272. "mul r6, r7, r6\n\t"
  81273. "lsr r7, r6, #16\n\t"
  81274. "lsl r6, r6, #16\n\t"
  81275. "adds r5, r5, r6\n\t"
  81276. "adcs r3, r3, r7\n\t"
  81277. "adc r4, r4, #0\n\t"
  81278. "lsr r6, r8, #16\n\t"
  81279. "lsr r7, r9, #16\n\t"
  81280. "mul r7, r6, r7\n\t"
  81281. "adds r3, r3, r7\n\t"
  81282. "adc r4, r4, #0\n\t"
  81283. "lsl r7, r9, #16\n\t"
  81284. "lsr r7, r7, #16\n\t"
  81285. "mul r6, r7, r6\n\t"
  81286. "lsr r7, r6, #16\n\t"
  81287. "lsl r6, r6, #16\n\t"
  81288. "adds r5, r5, r6\n\t"
  81289. "adcs r3, r3, r7\n\t"
  81290. "adc r4, r4, #0\n\t"
  81291. #else
  81292. "umull r6, r7, r8, r9\n\t"
  81293. "adds r5, r5, r6\n\t"
  81294. "adcs r3, r3, r7\n\t"
  81295. "adc r4, r4, #0\n\t"
  81296. #endif
  81297. /* A[8] * B[9] */
  81298. "ldr r9, [%[b], #36]\n\t"
  81299. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81300. "lsl r6, r11, #16\n\t"
  81301. "lsl r7, r9, #16\n\t"
  81302. "lsr r6, r6, #16\n\t"
  81303. "lsr r7, r7, #16\n\t"
  81304. "mul r7, r6, r7\n\t"
  81305. "adds r5, r5, r7\n\t"
  81306. "adcs r3, r3, #0\n\t"
  81307. "adc r4, r4, #0\n\t"
  81308. "lsr r7, r9, #16\n\t"
  81309. "mul r6, r7, r6\n\t"
  81310. "lsr r7, r6, #16\n\t"
  81311. "lsl r6, r6, #16\n\t"
  81312. "adds r5, r5, r6\n\t"
  81313. "adcs r3, r3, r7\n\t"
  81314. "adc r4, r4, #0\n\t"
  81315. "lsr r6, r11, #16\n\t"
  81316. "lsr r7, r9, #16\n\t"
  81317. "mul r7, r6, r7\n\t"
  81318. "adds r3, r3, r7\n\t"
  81319. "adc r4, r4, #0\n\t"
  81320. "lsl r7, r9, #16\n\t"
  81321. "lsr r7, r7, #16\n\t"
  81322. "mul r6, r7, r6\n\t"
  81323. "lsr r7, r6, #16\n\t"
  81324. "lsl r6, r6, #16\n\t"
  81325. "adds r5, r5, r6\n\t"
  81326. "adcs r3, r3, r7\n\t"
  81327. "adc r4, r4, #0\n\t"
  81328. #else
  81329. "umull r6, r7, r11, r9\n\t"
  81330. "adds r5, r5, r6\n\t"
  81331. "adcs r3, r3, r7\n\t"
  81332. "adc r4, r4, #0\n\t"
  81333. #endif
  81334. /* A[9] * B[8] */
  81335. "ldr r8, [%[a], #36]\n\t"
  81336. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81337. "lsl r6, r8, #16\n\t"
  81338. "lsl r7, r12, #16\n\t"
  81339. "lsr r6, r6, #16\n\t"
  81340. "lsr r7, r7, #16\n\t"
  81341. "mul r7, r6, r7\n\t"
  81342. "adds r5, r5, r7\n\t"
  81343. "adcs r3, r3, #0\n\t"
  81344. "adc r4, r4, #0\n\t"
  81345. "lsr r7, r12, #16\n\t"
  81346. "mul r6, r7, r6\n\t"
  81347. "lsr r7, r6, #16\n\t"
  81348. "lsl r6, r6, #16\n\t"
  81349. "adds r5, r5, r6\n\t"
  81350. "adcs r3, r3, r7\n\t"
  81351. "adc r4, r4, #0\n\t"
  81352. "lsr r6, r8, #16\n\t"
  81353. "lsr r7, r12, #16\n\t"
  81354. "mul r7, r6, r7\n\t"
  81355. "adds r3, r3, r7\n\t"
  81356. "adc r4, r4, #0\n\t"
  81357. "lsl r7, r12, #16\n\t"
  81358. "lsr r7, r7, #16\n\t"
  81359. "mul r6, r7, r6\n\t"
  81360. "lsr r7, r6, #16\n\t"
  81361. "lsl r6, r6, #16\n\t"
  81362. "adds r5, r5, r6\n\t"
  81363. "adcs r3, r3, r7\n\t"
  81364. "adc r4, r4, #0\n\t"
  81365. #else
  81366. "umull r6, r7, r8, r12\n\t"
  81367. "adds r5, r5, r6\n\t"
  81368. "adcs r3, r3, r7\n\t"
  81369. "adc r4, r4, #0\n\t"
  81370. #endif
  81371. /* A[10] * B[7] */
  81372. "ldr r8, [%[a], #40]\n\t"
  81373. "ldr r9, [%[b], #28]\n\t"
  81374. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81375. "lsl r6, r8, #16\n\t"
  81376. "lsl r7, r9, #16\n\t"
  81377. "lsr r6, r6, #16\n\t"
  81378. "lsr r7, r7, #16\n\t"
  81379. "mul r7, r6, r7\n\t"
  81380. "adds r5, r5, r7\n\t"
  81381. "adcs r3, r3, #0\n\t"
  81382. "adc r4, r4, #0\n\t"
  81383. "lsr r7, r9, #16\n\t"
  81384. "mul r6, r7, r6\n\t"
  81385. "lsr r7, r6, #16\n\t"
  81386. "lsl r6, r6, #16\n\t"
  81387. "adds r5, r5, r6\n\t"
  81388. "adcs r3, r3, r7\n\t"
  81389. "adc r4, r4, #0\n\t"
  81390. "lsr r6, r8, #16\n\t"
  81391. "lsr r7, r9, #16\n\t"
  81392. "mul r7, r6, r7\n\t"
  81393. "adds r3, r3, r7\n\t"
  81394. "adc r4, r4, #0\n\t"
  81395. "lsl r7, r9, #16\n\t"
  81396. "lsr r7, r7, #16\n\t"
  81397. "mul r6, r7, r6\n\t"
  81398. "lsr r7, r6, #16\n\t"
  81399. "lsl r6, r6, #16\n\t"
  81400. "adds r5, r5, r6\n\t"
  81401. "adcs r3, r3, r7\n\t"
  81402. "adc r4, r4, #0\n\t"
  81403. #else
  81404. "umull r6, r7, r8, r9\n\t"
  81405. "adds r5, r5, r6\n\t"
  81406. "adcs r3, r3, r7\n\t"
  81407. "adc r4, r4, #0\n\t"
  81408. #endif
  81409. /* A[11] * B[6] */
  81410. "ldr r8, [%[a], #44]\n\t"
  81411. "ldr r9, [%[b], #24]\n\t"
  81412. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81413. "lsl r6, r8, #16\n\t"
  81414. "lsl r7, r9, #16\n\t"
  81415. "lsr r6, r6, #16\n\t"
  81416. "lsr r7, r7, #16\n\t"
  81417. "mul r7, r6, r7\n\t"
  81418. "adds r5, r5, r7\n\t"
  81419. "adcs r3, r3, #0\n\t"
  81420. "adc r4, r4, #0\n\t"
  81421. "lsr r7, r9, #16\n\t"
  81422. "mul r6, r7, r6\n\t"
  81423. "lsr r7, r6, #16\n\t"
  81424. "lsl r6, r6, #16\n\t"
  81425. "adds r5, r5, r6\n\t"
  81426. "adcs r3, r3, r7\n\t"
  81427. "adc r4, r4, #0\n\t"
  81428. "lsr r6, r8, #16\n\t"
  81429. "lsr r7, r9, #16\n\t"
  81430. "mul r7, r6, r7\n\t"
  81431. "adds r3, r3, r7\n\t"
  81432. "adc r4, r4, #0\n\t"
  81433. "lsl r7, r9, #16\n\t"
  81434. "lsr r7, r7, #16\n\t"
  81435. "mul r6, r7, r6\n\t"
  81436. "lsr r7, r6, #16\n\t"
  81437. "lsl r6, r6, #16\n\t"
  81438. "adds r5, r5, r6\n\t"
  81439. "adcs r3, r3, r7\n\t"
  81440. "adc r4, r4, #0\n\t"
  81441. #else
  81442. "umull r6, r7, r8, r9\n\t"
  81443. "adds r5, r5, r6\n\t"
  81444. "adcs r3, r3, r7\n\t"
  81445. "adc r4, r4, #0\n\t"
  81446. #endif
  81447. "str r5, [%[r], #68]\n\t"
  81448. /* A[11] * B[7] */
  81449. "ldr r9, [%[b], #28]\n\t"
  81450. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81451. "lsl r6, r8, #16\n\t"
  81452. "lsl r7, r9, #16\n\t"
  81453. "lsr r6, r6, #16\n\t"
  81454. "lsr r7, r7, #16\n\t"
  81455. "mul r7, r6, r7\n\t"
  81456. "adds r3, r3, r7\n\t"
  81457. "adcs r4, r4, #0\n\t"
  81458. "mov r5, #0\n\t"
  81459. "adc r5, r5, #0\n\t"
  81460. "lsr r7, r9, #16\n\t"
  81461. "mul r6, r7, r6\n\t"
  81462. "lsr r7, r6, #16\n\t"
  81463. "lsl r6, r6, #16\n\t"
  81464. "adds r3, r3, r6\n\t"
  81465. "adcs r4, r4, r7\n\t"
  81466. "adc r5, r5, #0\n\t"
  81467. "lsr r6, r8, #16\n\t"
  81468. "lsr r7, r9, #16\n\t"
  81469. "mul r7, r6, r7\n\t"
  81470. "adds r4, r4, r7\n\t"
  81471. "adc r5, r5, #0\n\t"
  81472. "lsl r7, r9, #16\n\t"
  81473. "lsr r7, r7, #16\n\t"
  81474. "mul r6, r7, r6\n\t"
  81475. "lsr r7, r6, #16\n\t"
  81476. "lsl r6, r6, #16\n\t"
  81477. "adds r3, r3, r6\n\t"
  81478. "adcs r4, r4, r7\n\t"
  81479. "adc r5, r5, #0\n\t"
  81480. #else
  81481. "umull r6, r7, r8, r9\n\t"
  81482. "adds r3, r3, r6\n\t"
  81483. "adcs r4, r4, r7\n\t"
  81484. "mov r5, #0\n\t"
  81485. "adc r5, r5, #0\n\t"
  81486. #endif
  81487. /* A[10] * B[8] */
  81488. "ldr r8, [%[a], #40]\n\t"
  81489. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81490. "lsl r6, r8, #16\n\t"
  81491. "lsl r7, r12, #16\n\t"
  81492. "lsr r6, r6, #16\n\t"
  81493. "lsr r7, r7, #16\n\t"
  81494. "mul r7, r6, r7\n\t"
  81495. "adds r3, r3, r7\n\t"
  81496. "adcs r4, r4, #0\n\t"
  81497. "adc r5, r5, #0\n\t"
  81498. "lsr r7, r12, #16\n\t"
  81499. "mul r6, r7, r6\n\t"
  81500. "lsr r7, r6, #16\n\t"
  81501. "lsl r6, r6, #16\n\t"
  81502. "adds r3, r3, r6\n\t"
  81503. "adcs r4, r4, r7\n\t"
  81504. "adc r5, r5, #0\n\t"
  81505. "lsr r6, r8, #16\n\t"
  81506. "lsr r7, r12, #16\n\t"
  81507. "mul r7, r6, r7\n\t"
  81508. "adds r4, r4, r7\n\t"
  81509. "adc r5, r5, #0\n\t"
  81510. "lsl r7, r12, #16\n\t"
  81511. "lsr r7, r7, #16\n\t"
  81512. "mul r6, r7, r6\n\t"
  81513. "lsr r7, r6, #16\n\t"
  81514. "lsl r6, r6, #16\n\t"
  81515. "adds r3, r3, r6\n\t"
  81516. "adcs r4, r4, r7\n\t"
  81517. "adc r5, r5, #0\n\t"
  81518. #else
  81519. "umull r6, r7, r8, r12\n\t"
  81520. "adds r3, r3, r6\n\t"
  81521. "adcs r4, r4, r7\n\t"
  81522. "adc r5, r5, #0\n\t"
  81523. #endif
  81524. /* A[9] * B[9] */
  81525. "ldr r11, [%[a], #36]\n\t"
  81526. "ldr r12, [%[b], #36]\n\t"
  81527. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81528. "lsl r6, r11, #16\n\t"
  81529. "lsl r7, r12, #16\n\t"
  81530. "lsr r6, r6, #16\n\t"
  81531. "lsr r7, r7, #16\n\t"
  81532. "mul r7, r6, r7\n\t"
  81533. "adds r3, r3, r7\n\t"
  81534. "adcs r4, r4, #0\n\t"
  81535. "adc r5, r5, #0\n\t"
  81536. "lsr r7, r12, #16\n\t"
  81537. "mul r6, r7, r6\n\t"
  81538. "lsr r7, r6, #16\n\t"
  81539. "lsl r6, r6, #16\n\t"
  81540. "adds r3, r3, r6\n\t"
  81541. "adcs r4, r4, r7\n\t"
  81542. "adc r5, r5, #0\n\t"
  81543. "lsr r6, r11, #16\n\t"
  81544. "lsr r7, r12, #16\n\t"
  81545. "mul r7, r6, r7\n\t"
  81546. "adds r4, r4, r7\n\t"
  81547. "adc r5, r5, #0\n\t"
  81548. "lsl r7, r12, #16\n\t"
  81549. "lsr r7, r7, #16\n\t"
  81550. "mul r6, r7, r6\n\t"
  81551. "lsr r7, r6, #16\n\t"
  81552. "lsl r6, r6, #16\n\t"
  81553. "adds r3, r3, r6\n\t"
  81554. "adcs r4, r4, r7\n\t"
  81555. "adc r5, r5, #0\n\t"
  81556. #else
  81557. "umull r6, r7, r11, r12\n\t"
  81558. "adds r3, r3, r6\n\t"
  81559. "adcs r4, r4, r7\n\t"
  81560. "adc r5, r5, #0\n\t"
  81561. #endif
  81562. /* A[8] * B[10] */
  81563. "ldr r8, [%[a], #32]\n\t"
  81564. "ldr r9, [%[b], #40]\n\t"
  81565. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81566. "lsl r6, r8, #16\n\t"
  81567. "lsl r7, r9, #16\n\t"
  81568. "lsr r6, r6, #16\n\t"
  81569. "lsr r7, r7, #16\n\t"
  81570. "mul r7, r6, r7\n\t"
  81571. "adds r3, r3, r7\n\t"
  81572. "adcs r4, r4, #0\n\t"
  81573. "adc r5, r5, #0\n\t"
  81574. "lsr r7, r9, #16\n\t"
  81575. "mul r6, r7, r6\n\t"
  81576. "lsr r7, r6, #16\n\t"
  81577. "lsl r6, r6, #16\n\t"
  81578. "adds r3, r3, r6\n\t"
  81579. "adcs r4, r4, r7\n\t"
  81580. "adc r5, r5, #0\n\t"
  81581. "lsr r6, r8, #16\n\t"
  81582. "lsr r7, r9, #16\n\t"
  81583. "mul r7, r6, r7\n\t"
  81584. "adds r4, r4, r7\n\t"
  81585. "adc r5, r5, #0\n\t"
  81586. "lsl r7, r9, #16\n\t"
  81587. "lsr r7, r7, #16\n\t"
  81588. "mul r6, r7, r6\n\t"
  81589. "lsr r7, r6, #16\n\t"
  81590. "lsl r6, r6, #16\n\t"
  81591. "adds r3, r3, r6\n\t"
  81592. "adcs r4, r4, r7\n\t"
  81593. "adc r5, r5, #0\n\t"
  81594. #else
  81595. "umull r6, r7, r8, r9\n\t"
  81596. "adds r3, r3, r6\n\t"
  81597. "adcs r4, r4, r7\n\t"
  81598. "adc r5, r5, #0\n\t"
  81599. #endif
  81600. /* A[7] * B[11] */
  81601. "ldr r8, [%[a], #28]\n\t"
  81602. "ldr r9, [%[b], #44]\n\t"
  81603. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81604. "lsl r6, r8, #16\n\t"
  81605. "lsl r7, r9, #16\n\t"
  81606. "lsr r6, r6, #16\n\t"
  81607. "lsr r7, r7, #16\n\t"
  81608. "mul r7, r6, r7\n\t"
  81609. "adds r3, r3, r7\n\t"
  81610. "adcs r4, r4, #0\n\t"
  81611. "adc r5, r5, #0\n\t"
  81612. "lsr r7, r9, #16\n\t"
  81613. "mul r6, r7, r6\n\t"
  81614. "lsr r7, r6, #16\n\t"
  81615. "lsl r6, r6, #16\n\t"
  81616. "adds r3, r3, r6\n\t"
  81617. "adcs r4, r4, r7\n\t"
  81618. "adc r5, r5, #0\n\t"
  81619. "lsr r6, r8, #16\n\t"
  81620. "lsr r7, r9, #16\n\t"
  81621. "mul r7, r6, r7\n\t"
  81622. "adds r4, r4, r7\n\t"
  81623. "adc r5, r5, #0\n\t"
  81624. "lsl r7, r9, #16\n\t"
  81625. "lsr r7, r7, #16\n\t"
  81626. "mul r6, r7, r6\n\t"
  81627. "lsr r7, r6, #16\n\t"
  81628. "lsl r6, r6, #16\n\t"
  81629. "adds r3, r3, r6\n\t"
  81630. "adcs r4, r4, r7\n\t"
  81631. "adc r5, r5, #0\n\t"
  81632. #else
  81633. "umull r6, r7, r8, r9\n\t"
  81634. "adds r3, r3, r6\n\t"
  81635. "adcs r4, r4, r7\n\t"
  81636. "adc r5, r5, #0\n\t"
  81637. #endif
  81638. "str r3, [%[r], #72]\n\t"
  81639. /* A[8] * B[11] */
  81640. "ldr r8, [%[a], #32]\n\t"
  81641. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81642. "lsl r6, r8, #16\n\t"
  81643. "lsl r7, r9, #16\n\t"
  81644. "lsr r6, r6, #16\n\t"
  81645. "lsr r7, r7, #16\n\t"
  81646. "mul r7, r6, r7\n\t"
  81647. "adds r4, r4, r7\n\t"
  81648. "adcs r5, r5, #0\n\t"
  81649. "mov r3, #0\n\t"
  81650. "adc r3, r3, #0\n\t"
  81651. "lsr r7, r9, #16\n\t"
  81652. "mul r6, r7, r6\n\t"
  81653. "lsr r7, r6, #16\n\t"
  81654. "lsl r6, r6, #16\n\t"
  81655. "adds r4, r4, r6\n\t"
  81656. "adcs r5, r5, r7\n\t"
  81657. "adc r3, r3, #0\n\t"
  81658. "lsr r6, r8, #16\n\t"
  81659. "lsr r7, r9, #16\n\t"
  81660. "mul r7, r6, r7\n\t"
  81661. "adds r5, r5, r7\n\t"
  81662. "adc r3, r3, #0\n\t"
  81663. "lsl r7, r9, #16\n\t"
  81664. "lsr r7, r7, #16\n\t"
  81665. "mul r6, r7, r6\n\t"
  81666. "lsr r7, r6, #16\n\t"
  81667. "lsl r6, r6, #16\n\t"
  81668. "adds r4, r4, r6\n\t"
  81669. "adcs r5, r5, r7\n\t"
  81670. "adc r3, r3, #0\n\t"
  81671. #else
  81672. "umull r6, r7, r8, r9\n\t"
  81673. "adds r4, r4, r6\n\t"
  81674. "adcs r5, r5, r7\n\t"
  81675. "mov r3, #0\n\t"
  81676. "adc r3, r3, #0\n\t"
  81677. #endif
  81678. /* A[9] * B[10] */
  81679. "ldr r9, [%[b], #40]\n\t"
  81680. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81681. "lsl r6, r11, #16\n\t"
  81682. "lsl r7, r9, #16\n\t"
  81683. "lsr r6, r6, #16\n\t"
  81684. "lsr r7, r7, #16\n\t"
  81685. "mul r7, r6, r7\n\t"
  81686. "adds r4, r4, r7\n\t"
  81687. "adcs r5, r5, #0\n\t"
  81688. "adc r3, r3, #0\n\t"
  81689. "lsr r7, r9, #16\n\t"
  81690. "mul r6, r7, r6\n\t"
  81691. "lsr r7, r6, #16\n\t"
  81692. "lsl r6, r6, #16\n\t"
  81693. "adds r4, r4, r6\n\t"
  81694. "adcs r5, r5, r7\n\t"
  81695. "adc r3, r3, #0\n\t"
  81696. "lsr r6, r11, #16\n\t"
  81697. "lsr r7, r9, #16\n\t"
  81698. "mul r7, r6, r7\n\t"
  81699. "adds r5, r5, r7\n\t"
  81700. "adc r3, r3, #0\n\t"
  81701. "lsl r7, r9, #16\n\t"
  81702. "lsr r7, r7, #16\n\t"
  81703. "mul r6, r7, r6\n\t"
  81704. "lsr r7, r6, #16\n\t"
  81705. "lsl r6, r6, #16\n\t"
  81706. "adds r4, r4, r6\n\t"
  81707. "adcs r5, r5, r7\n\t"
  81708. "adc r3, r3, #0\n\t"
  81709. #else
  81710. "umull r6, r7, r11, r9\n\t"
  81711. "adds r4, r4, r6\n\t"
  81712. "adcs r5, r5, r7\n\t"
  81713. "adc r3, r3, #0\n\t"
  81714. #endif
  81715. /* A[10] * B[9] */
  81716. "ldr r8, [%[a], #40]\n\t"
  81717. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81718. "lsl r6, r8, #16\n\t"
  81719. "lsl r7, r12, #16\n\t"
  81720. "lsr r6, r6, #16\n\t"
  81721. "lsr r7, r7, #16\n\t"
  81722. "mul r7, r6, r7\n\t"
  81723. "adds r4, r4, r7\n\t"
  81724. "adcs r5, r5, #0\n\t"
  81725. "adc r3, r3, #0\n\t"
  81726. "lsr r7, r12, #16\n\t"
  81727. "mul r6, r7, r6\n\t"
  81728. "lsr r7, r6, #16\n\t"
  81729. "lsl r6, r6, #16\n\t"
  81730. "adds r4, r4, r6\n\t"
  81731. "adcs r5, r5, r7\n\t"
  81732. "adc r3, r3, #0\n\t"
  81733. "lsr r6, r8, #16\n\t"
  81734. "lsr r7, r12, #16\n\t"
  81735. "mul r7, r6, r7\n\t"
  81736. "adds r5, r5, r7\n\t"
  81737. "adc r3, r3, #0\n\t"
  81738. "lsl r7, r12, #16\n\t"
  81739. "lsr r7, r7, #16\n\t"
  81740. "mul r6, r7, r6\n\t"
  81741. "lsr r7, r6, #16\n\t"
  81742. "lsl r6, r6, #16\n\t"
  81743. "adds r4, r4, r6\n\t"
  81744. "adcs r5, r5, r7\n\t"
  81745. "adc r3, r3, #0\n\t"
  81746. #else
  81747. "umull r6, r7, r8, r12\n\t"
  81748. "adds r4, r4, r6\n\t"
  81749. "adcs r5, r5, r7\n\t"
  81750. "adc r3, r3, #0\n\t"
  81751. #endif
  81752. /* A[11] * B[8] */
  81753. "ldr r8, [%[a], #44]\n\t"
  81754. "ldr r9, [%[b], #32]\n\t"
  81755. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81756. "lsl r6, r8, #16\n\t"
  81757. "lsl r7, r9, #16\n\t"
  81758. "lsr r6, r6, #16\n\t"
  81759. "lsr r7, r7, #16\n\t"
  81760. "mul r7, r6, r7\n\t"
  81761. "adds r4, r4, r7\n\t"
  81762. "adcs r5, r5, #0\n\t"
  81763. "adc r3, r3, #0\n\t"
  81764. "lsr r7, r9, #16\n\t"
  81765. "mul r6, r7, r6\n\t"
  81766. "lsr r7, r6, #16\n\t"
  81767. "lsl r6, r6, #16\n\t"
  81768. "adds r4, r4, r6\n\t"
  81769. "adcs r5, r5, r7\n\t"
  81770. "adc r3, r3, #0\n\t"
  81771. "lsr r6, r8, #16\n\t"
  81772. "lsr r7, r9, #16\n\t"
  81773. "mul r7, r6, r7\n\t"
  81774. "adds r5, r5, r7\n\t"
  81775. "adc r3, r3, #0\n\t"
  81776. "lsl r7, r9, #16\n\t"
  81777. "lsr r7, r7, #16\n\t"
  81778. "mul r6, r7, r6\n\t"
  81779. "lsr r7, r6, #16\n\t"
  81780. "lsl r6, r6, #16\n\t"
  81781. "adds r4, r4, r6\n\t"
  81782. "adcs r5, r5, r7\n\t"
  81783. "adc r3, r3, #0\n\t"
  81784. #else
  81785. "umull r6, r7, r8, r9\n\t"
  81786. "adds r4, r4, r6\n\t"
  81787. "adcs r5, r5, r7\n\t"
  81788. "adc r3, r3, #0\n\t"
  81789. #endif
  81790. "str r4, [%[r], #76]\n\t"
  81791. /* A[11] * B[9] */
  81792. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81793. "lsl r6, r8, #16\n\t"
  81794. "lsl r7, r12, #16\n\t"
  81795. "lsr r6, r6, #16\n\t"
  81796. "lsr r7, r7, #16\n\t"
  81797. "mul r7, r6, r7\n\t"
  81798. "adds r5, r5, r7\n\t"
  81799. "adcs r3, r3, #0\n\t"
  81800. "mov r4, #0\n\t"
  81801. "adc r4, r4, #0\n\t"
  81802. "lsr r7, r12, #16\n\t"
  81803. "mul r6, r7, r6\n\t"
  81804. "lsr r7, r6, #16\n\t"
  81805. "lsl r6, r6, #16\n\t"
  81806. "adds r5, r5, r6\n\t"
  81807. "adcs r3, r3, r7\n\t"
  81808. "adc r4, r4, #0\n\t"
  81809. "lsr r6, r8, #16\n\t"
  81810. "lsr r7, r12, #16\n\t"
  81811. "mul r7, r6, r7\n\t"
  81812. "adds r3, r3, r7\n\t"
  81813. "adc r4, r4, #0\n\t"
  81814. "lsl r7, r12, #16\n\t"
  81815. "lsr r7, r7, #16\n\t"
  81816. "mul r6, r7, r6\n\t"
  81817. "lsr r7, r6, #16\n\t"
  81818. "lsl r6, r6, #16\n\t"
  81819. "adds r5, r5, r6\n\t"
  81820. "adcs r3, r3, r7\n\t"
  81821. "adc r4, r4, #0\n\t"
  81822. #else
  81823. "umull r6, r7, r8, r12\n\t"
  81824. "adds r5, r5, r6\n\t"
  81825. "adcs r3, r3, r7\n\t"
  81826. "mov r4, #0\n\t"
  81827. "adc r4, r4, #0\n\t"
  81828. #endif
  81829. /* A[10] * B[10] */
  81830. "ldr r11, [%[a], #40]\n\t"
  81831. "ldr r12, [%[b], #40]\n\t"
  81832. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81833. "lsl r6, r11, #16\n\t"
  81834. "lsl r7, r12, #16\n\t"
  81835. "lsr r6, r6, #16\n\t"
  81836. "lsr r7, r7, #16\n\t"
  81837. "mul r7, r6, r7\n\t"
  81838. "adds r5, r5, r7\n\t"
  81839. "adcs r3, r3, #0\n\t"
  81840. "adc r4, r4, #0\n\t"
  81841. "lsr r7, r12, #16\n\t"
  81842. "mul r6, r7, r6\n\t"
  81843. "lsr r7, r6, #16\n\t"
  81844. "lsl r6, r6, #16\n\t"
  81845. "adds r5, r5, r6\n\t"
  81846. "adcs r3, r3, r7\n\t"
  81847. "adc r4, r4, #0\n\t"
  81848. "lsr r6, r11, #16\n\t"
  81849. "lsr r7, r12, #16\n\t"
  81850. "mul r7, r6, r7\n\t"
  81851. "adds r3, r3, r7\n\t"
  81852. "adc r4, r4, #0\n\t"
  81853. "lsl r7, r12, #16\n\t"
  81854. "lsr r7, r7, #16\n\t"
  81855. "mul r6, r7, r6\n\t"
  81856. "lsr r7, r6, #16\n\t"
  81857. "lsl r6, r6, #16\n\t"
  81858. "adds r5, r5, r6\n\t"
  81859. "adcs r3, r3, r7\n\t"
  81860. "adc r4, r4, #0\n\t"
  81861. #else
  81862. "umull r6, r7, r11, r12\n\t"
  81863. "adds r5, r5, r6\n\t"
  81864. "adcs r3, r3, r7\n\t"
  81865. "adc r4, r4, #0\n\t"
  81866. #endif
  81867. /* A[9] * B[11] */
  81868. "ldr r8, [%[a], #36]\n\t"
  81869. "ldr r9, [%[b], #44]\n\t"
  81870. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81871. "lsl r6, r8, #16\n\t"
  81872. "lsl r7, r9, #16\n\t"
  81873. "lsr r6, r6, #16\n\t"
  81874. "lsr r7, r7, #16\n\t"
  81875. "mul r7, r6, r7\n\t"
  81876. "adds r5, r5, r7\n\t"
  81877. "adcs r3, r3, #0\n\t"
  81878. "adc r4, r4, #0\n\t"
  81879. "lsr r7, r9, #16\n\t"
  81880. "mul r6, r7, r6\n\t"
  81881. "lsr r7, r6, #16\n\t"
  81882. "lsl r6, r6, #16\n\t"
  81883. "adds r5, r5, r6\n\t"
  81884. "adcs r3, r3, r7\n\t"
  81885. "adc r4, r4, #0\n\t"
  81886. "lsr r6, r8, #16\n\t"
  81887. "lsr r7, r9, #16\n\t"
  81888. "mul r7, r6, r7\n\t"
  81889. "adds r3, r3, r7\n\t"
  81890. "adc r4, r4, #0\n\t"
  81891. "lsl r7, r9, #16\n\t"
  81892. "lsr r7, r7, #16\n\t"
  81893. "mul r6, r7, r6\n\t"
  81894. "lsr r7, r6, #16\n\t"
  81895. "lsl r6, r6, #16\n\t"
  81896. "adds r5, r5, r6\n\t"
  81897. "adcs r3, r3, r7\n\t"
  81898. "adc r4, r4, #0\n\t"
  81899. #else
  81900. "umull r6, r7, r8, r9\n\t"
  81901. "adds r5, r5, r6\n\t"
  81902. "adcs r3, r3, r7\n\t"
  81903. "adc r4, r4, #0\n\t"
  81904. #endif
  81905. "str r5, [%[r], #80]\n\t"
  81906. /* A[10] * B[11] */
  81907. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81908. "lsl r6, r11, #16\n\t"
  81909. "lsl r7, r9, #16\n\t"
  81910. "lsr r6, r6, #16\n\t"
  81911. "lsr r7, r7, #16\n\t"
  81912. "mul r7, r6, r7\n\t"
  81913. "adds r3, r3, r7\n\t"
  81914. "adcs r4, r4, #0\n\t"
  81915. "mov r5, #0\n\t"
  81916. "adc r5, r5, #0\n\t"
  81917. "lsr r7, r9, #16\n\t"
  81918. "mul r6, r7, r6\n\t"
  81919. "lsr r7, r6, #16\n\t"
  81920. "lsl r6, r6, #16\n\t"
  81921. "adds r3, r3, r6\n\t"
  81922. "adcs r4, r4, r7\n\t"
  81923. "adc r5, r5, #0\n\t"
  81924. "lsr r6, r11, #16\n\t"
  81925. "lsr r7, r9, #16\n\t"
  81926. "mul r7, r6, r7\n\t"
  81927. "adds r4, r4, r7\n\t"
  81928. "adc r5, r5, #0\n\t"
  81929. "lsl r7, r9, #16\n\t"
  81930. "lsr r7, r7, #16\n\t"
  81931. "mul r6, r7, r6\n\t"
  81932. "lsr r7, r6, #16\n\t"
  81933. "lsl r6, r6, #16\n\t"
  81934. "adds r3, r3, r6\n\t"
  81935. "adcs r4, r4, r7\n\t"
  81936. "adc r5, r5, #0\n\t"
  81937. #else
  81938. "umull r6, r7, r11, r9\n\t"
  81939. "adds r3, r3, r6\n\t"
  81940. "adcs r4, r4, r7\n\t"
  81941. "mov r5, #0\n\t"
  81942. "adc r5, r5, #0\n\t"
  81943. #endif
  81944. /* A[11] * B[10] */
  81945. "ldr r8, [%[a], #44]\n\t"
  81946. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81947. "lsl r6, r8, #16\n\t"
  81948. "lsl r7, r12, #16\n\t"
  81949. "lsr r6, r6, #16\n\t"
  81950. "lsr r7, r7, #16\n\t"
  81951. "mul r7, r6, r7\n\t"
  81952. "adds r3, r3, r7\n\t"
  81953. "adcs r4, r4, #0\n\t"
  81954. "adc r5, r5, #0\n\t"
  81955. "lsr r7, r12, #16\n\t"
  81956. "mul r6, r7, r6\n\t"
  81957. "lsr r7, r6, #16\n\t"
  81958. "lsl r6, r6, #16\n\t"
  81959. "adds r3, r3, r6\n\t"
  81960. "adcs r4, r4, r7\n\t"
  81961. "adc r5, r5, #0\n\t"
  81962. "lsr r6, r8, #16\n\t"
  81963. "lsr r7, r12, #16\n\t"
  81964. "mul r7, r6, r7\n\t"
  81965. "adds r4, r4, r7\n\t"
  81966. "adc r5, r5, #0\n\t"
  81967. "lsl r7, r12, #16\n\t"
  81968. "lsr r7, r7, #16\n\t"
  81969. "mul r6, r7, r6\n\t"
  81970. "lsr r7, r6, #16\n\t"
  81971. "lsl r6, r6, #16\n\t"
  81972. "adds r3, r3, r6\n\t"
  81973. "adcs r4, r4, r7\n\t"
  81974. "adc r5, r5, #0\n\t"
  81975. #else
  81976. "umull r6, r7, r8, r12\n\t"
  81977. "adds r3, r3, r6\n\t"
  81978. "adcs r4, r4, r7\n\t"
  81979. "adc r5, r5, #0\n\t"
  81980. #endif
  81981. "str r3, [%[r], #84]\n\t"
  81982. /* A[11] * B[11] */
  81983. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  81984. "lsl r6, r8, #16\n\t"
  81985. "lsl r7, r9, #16\n\t"
  81986. "lsr r6, r6, #16\n\t"
  81987. "lsr r7, r7, #16\n\t"
  81988. "mul r7, r6, r7\n\t"
  81989. "adds r4, r4, r7\n\t"
  81990. "adc r5, r5, #0\n\t"
  81991. "lsr r7, r9, #16\n\t"
  81992. "mul r6, r7, r6\n\t"
  81993. "lsr r7, r6, #16\n\t"
  81994. "lsl r6, r6, #16\n\t"
  81995. "adds r4, r4, r6\n\t"
  81996. "adc r5, r5, r7\n\t"
  81997. "lsr r6, r8, #16\n\t"
  81998. "lsr r7, r9, #16\n\t"
  81999. "mul r7, r6, r7\n\t"
  82000. "add r5, r5, r7\n\t"
  82001. "lsl r7, r9, #16\n\t"
  82002. "lsr r7, r7, #16\n\t"
  82003. "mul r6, r7, r6\n\t"
  82004. "lsr r7, r6, #16\n\t"
  82005. "lsl r6, r6, #16\n\t"
  82006. "adds r4, r4, r6\n\t"
  82007. "adc r5, r5, r7\n\t"
  82008. #else
  82009. "umull r6, r7, r8, r9\n\t"
  82010. "adds r4, r4, r6\n\t"
  82011. "adc r5, r5, r7\n\t"
  82012. #endif
  82013. "str r4, [%[r], #88]\n\t"
  82014. "str r5, [%[r], #92]\n\t"
  82015. "ldm sp!, {r3, r4, r5, r6}\n\t"
  82016. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  82017. "ldm sp!, {r3, r4, r5, r6}\n\t"
  82018. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  82019. "ldm sp!, {r3, r4, r5, r6}\n\t"
  82020. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  82021. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  82022. :
  82023. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  82024. );
  82025. }
  82026. #endif /* WOLFSSL_SP_SMALL */
  82027. #ifdef WOLFSSL_SP_SMALL
  82028. /* Square a and put result in r. (r = a * a)
  82029. *
  82030. * r A single precision integer.
  82031. * a A single precision integer.
  82032. */
  82033. static void sp_384_sqr_12(sp_digit* r_p, const sp_digit* a_p)
  82034. {
  82035. register sp_digit* r asm ("r0") = r_p;
  82036. register const sp_digit* a asm ("r1") = a_p;
  82037. __asm__ __volatile__ (
  82038. "sub sp, sp, #0x60\n\t"
  82039. "mov r12, #0\n\t"
  82040. "mov r6, #0\n\t"
  82041. "mov r7, #0\n\t"
  82042. "mov r8, #0\n\t"
  82043. "mov r5, #0\n\t"
  82044. "\n"
  82045. "L_sp_384_sqr_12_outer_%=: \n\t"
  82046. "subs r3, r5, #44\n\t"
  82047. "it cc\n\t"
  82048. "movcc r3, r12\n\t"
  82049. "sub r4, r5, r3\n\t"
  82050. "\n"
  82051. "L_sp_384_sqr_12_inner_%=: \n\t"
  82052. "cmp r4, r3\n\t"
  82053. "beq L_sp_384_sqr_12_op_sqr_%=\n\t"
  82054. "ldr lr, [%[a], r3]\n\t"
  82055. "ldr r11, [%[a], r4]\n\t"
  82056. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82057. "lsl r9, lr, #16\n\t"
  82058. "lsl r10, r11, #16\n\t"
  82059. "lsr r9, r9, #16\n\t"
  82060. "lsr r10, r10, #16\n\t"
  82061. "mul r10, r9, r10\n\t"
  82062. "adds r6, r6, r10\n\t"
  82063. "adcs r7, r7, #0\n\t"
  82064. "adc r8, r8, #0\n\t"
  82065. "adds r6, r6, r10\n\t"
  82066. "adcs r7, r7, #0\n\t"
  82067. "adc r8, r8, #0\n\t"
  82068. "lsr r10, r11, #16\n\t"
  82069. "mul r9, r10, r9\n\t"
  82070. "lsr r10, r9, #16\n\t"
  82071. "lsl r9, r9, #16\n\t"
  82072. "adds r6, r6, r9\n\t"
  82073. "adcs r7, r7, r10\n\t"
  82074. "adc r8, r8, #0\n\t"
  82075. "adds r6, r6, r9\n\t"
  82076. "adcs r7, r7, r10\n\t"
  82077. "adc r8, r8, #0\n\t"
  82078. "lsr r9, lr, #16\n\t"
  82079. "lsr r10, r11, #16\n\t"
  82080. "mul r10, r9, r10\n\t"
  82081. "adds r7, r7, r10\n\t"
  82082. "adc r8, r8, #0\n\t"
  82083. "adds r7, r7, r10\n\t"
  82084. "adc r8, r8, #0\n\t"
  82085. "lsl r10, r11, #16\n\t"
  82086. "lsr r10, r10, #16\n\t"
  82087. "mul r9, r10, r9\n\t"
  82088. "lsr r10, r9, #16\n\t"
  82089. "lsl r9, r9, #16\n\t"
  82090. "adds r6, r6, r9\n\t"
  82091. "adcs r7, r7, r10\n\t"
  82092. "adc r8, r8, #0\n\t"
  82093. "adds r6, r6, r9\n\t"
  82094. "adcs r7, r7, r10\n\t"
  82095. "adc r8, r8, #0\n\t"
  82096. #else
  82097. "umull r9, r10, lr, r11\n\t"
  82098. "adds r6, r6, r9\n\t"
  82099. "adcs r7, r7, r10\n\t"
  82100. "adc r8, r8, #0\n\t"
  82101. "adds r6, r6, r9\n\t"
  82102. "adcs r7, r7, r10\n\t"
  82103. "adc r8, r8, #0\n\t"
  82104. #endif
  82105. "bal L_sp_384_sqr_12_op_done_%=\n\t"
  82106. "\n"
  82107. "L_sp_384_sqr_12_op_sqr_%=: \n\t"
  82108. "ldr lr, [%[a], r3]\n\t"
  82109. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82110. "lsl r9, lr, #16\n\t"
  82111. "lsr r10, lr, #16\n\t"
  82112. "lsr r9, r9, #16\n\t"
  82113. "mov r11, r9\n\t"
  82114. "mul r9, r11, r9\n\t"
  82115. "mov r11, r10\n\t"
  82116. "mul r10, r11, r10\n\t"
  82117. "adds r6, r6, r9\n\t"
  82118. "adcs r7, r7, r10\n\t"
  82119. "adc r8, r8, #0\n\t"
  82120. "lsr r10, lr, #16\n\t"
  82121. "lsl r9, lr, #16\n\t"
  82122. "lsr r9, r9, #16\n\t"
  82123. "mul r9, r10, r9\n\t"
  82124. "lsr r10, r9, #15\n\t"
  82125. "lsl r9, r9, #17\n\t"
  82126. "adds r6, r6, r9\n\t"
  82127. "adcs r7, r7, r10\n\t"
  82128. "adc r8, r8, #0\n\t"
  82129. #else
  82130. "umull r9, r10, lr, lr\n\t"
  82131. "adds r6, r6, r9\n\t"
  82132. "adcs r7, r7, r10\n\t"
  82133. "adc r8, r8, #0\n\t"
  82134. #endif
  82135. "\n"
  82136. "L_sp_384_sqr_12_op_done_%=: \n\t"
  82137. "add r3, r3, #4\n\t"
  82138. "sub r4, r4, #4\n\t"
  82139. "cmp r3, #48\n\t"
  82140. "beq L_sp_384_sqr_12_inner_done_%=\n\t"
  82141. "cmp r3, r4\n\t"
  82142. "bgt L_sp_384_sqr_12_inner_done_%=\n\t"
  82143. "cmp r3, r5\n\t"
  82144. "ble L_sp_384_sqr_12_inner_%=\n\t"
  82145. "\n"
  82146. "L_sp_384_sqr_12_inner_done_%=: \n\t"
  82147. "str r6, [sp, r5]\n\t"
  82148. "mov r6, r7\n\t"
  82149. "mov r7, r8\n\t"
  82150. "mov r8, #0\n\t"
  82151. "add r5, r5, #4\n\t"
  82152. "cmp r5, #0x58\n\t"
  82153. "ble L_sp_384_sqr_12_outer_%=\n\t"
  82154. "str r6, [sp, r5]\n\t"
  82155. "\n"
  82156. "L_sp_384_sqr_12_store_%=: \n\t"
  82157. "ldm sp!, {r6, r7, r8, r9}\n\t"
  82158. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  82159. "subs r5, r5, #16\n\t"
  82160. "bgt L_sp_384_sqr_12_store_%=\n\t"
  82161. : [r] "+r" (r), [a] "+r" (a)
  82162. :
  82163. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12"
  82164. );
  82165. }
  82166. #else
  82167. /* Square a and put result in r. (r = a * a)
  82168. *
  82169. * r A single precision integer.
  82170. * a A single precision integer.
  82171. */
  82172. static void sp_384_sqr_12(sp_digit* r_p, const sp_digit* a_p)
  82173. {
  82174. register sp_digit* r asm ("r0") = r_p;
  82175. register const sp_digit* a asm ("r1") = a_p;
  82176. __asm__ __volatile__ (
  82177. "sub sp, sp, #48\n\t"
  82178. /* A[0] * A[0] */
  82179. "ldr r10, [%[a]]\n\t"
  82180. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82181. "lsr r9, r10, #16\n\t"
  82182. "lsl r2, r10, #16\n\t"
  82183. "lsr r2, r2, #16\n\t"
  82184. "mul r8, r2, r2\n\t"
  82185. "mul r3, r9, r9\n\t"
  82186. "mul r2, r9, r2\n\t"
  82187. "lsr r9, r2, #15\n\t"
  82188. "lsl r2, r2, #17\n\t"
  82189. "adds r8, r8, r2\n\t"
  82190. "adc r3, r3, r9\n\t"
  82191. #else
  82192. "umull r8, r3, r10, r10\n\t"
  82193. #endif
  82194. "mov r4, #0\n\t"
  82195. "str r8, [sp]\n\t"
  82196. /* A[0] * A[1] */
  82197. "ldr r10, [%[a], #4]\n\t"
  82198. "ldr r12, [%[a]]\n\t"
  82199. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82200. "lsl r8, r10, #16\n\t"
  82201. "lsl r9, r12, #16\n\t"
  82202. "lsr r8, r8, #16\n\t"
  82203. "lsr r9, r9, #16\n\t"
  82204. "mul r9, r8, r9\n\t"
  82205. "adds r3, r3, r9\n\t"
  82206. "adcs r4, r4, #0\n\t"
  82207. "mov r2, #0\n\t"
  82208. "adc r2, r2, #0\n\t"
  82209. "adds r3, r3, r9\n\t"
  82210. "adcs r4, r4, #0\n\t"
  82211. "adc r2, r2, #0\n\t"
  82212. "lsr r9, r12, #16\n\t"
  82213. "mul r8, r9, r8\n\t"
  82214. "lsr r9, r8, #16\n\t"
  82215. "lsl r8, r8, #16\n\t"
  82216. "adds r3, r3, r8\n\t"
  82217. "adcs r4, r4, r9\n\t"
  82218. "adc r2, r2, #0\n\t"
  82219. "adds r3, r3, r8\n\t"
  82220. "adcs r4, r4, r9\n\t"
  82221. "adc r2, r2, #0\n\t"
  82222. "lsr r8, r10, #16\n\t"
  82223. "lsr r9, r12, #16\n\t"
  82224. "mul r9, r8, r9\n\t"
  82225. "adds r4, r4, r9\n\t"
  82226. "adc r2, r2, #0\n\t"
  82227. "adds r4, r4, r9\n\t"
  82228. "adc r2, r2, #0\n\t"
  82229. "lsl r9, r12, #16\n\t"
  82230. "lsr r9, r9, #16\n\t"
  82231. "mul r8, r9, r8\n\t"
  82232. "lsr r9, r8, #16\n\t"
  82233. "lsl r8, r8, #16\n\t"
  82234. "adds r3, r3, r8\n\t"
  82235. "adcs r4, r4, r9\n\t"
  82236. "adc r2, r2, #0\n\t"
  82237. "adds r3, r3, r8\n\t"
  82238. "adcs r4, r4, r9\n\t"
  82239. "adc r2, r2, #0\n\t"
  82240. #else
  82241. "umull r8, r9, r10, r12\n\t"
  82242. "adds r3, r3, r8\n\t"
  82243. "adcs r4, r4, r9\n\t"
  82244. "mov r2, #0\n\t"
  82245. "adc r2, r2, #0\n\t"
  82246. "adds r3, r3, r8\n\t"
  82247. "adcs r4, r4, r9\n\t"
  82248. "mov r2, #0\n\t"
  82249. "adc r2, r2, #0\n\t"
  82250. #endif
  82251. "str r3, [sp, #4]\n\t"
  82252. /* A[0] * A[2] */
  82253. "ldr r10, [%[a], #8]\n\t"
  82254. "ldr r12, [%[a]]\n\t"
  82255. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82256. "lsl r8, r10, #16\n\t"
  82257. "lsl r9, r12, #16\n\t"
  82258. "lsr r8, r8, #16\n\t"
  82259. "lsr r9, r9, #16\n\t"
  82260. "mul r9, r8, r9\n\t"
  82261. "adds r4, r4, r9\n\t"
  82262. "adcs r2, r2, #0\n\t"
  82263. "mov r3, #0\n\t"
  82264. "adc r3, r3, #0\n\t"
  82265. "adds r4, r4, r9\n\t"
  82266. "adcs r2, r2, #0\n\t"
  82267. "adc r3, r3, #0\n\t"
  82268. "lsr r9, r12, #16\n\t"
  82269. "mul r8, r9, r8\n\t"
  82270. "lsr r9, r8, #16\n\t"
  82271. "lsl r8, r8, #16\n\t"
  82272. "adds r4, r4, r8\n\t"
  82273. "adcs r2, r2, r9\n\t"
  82274. "adc r3, r3, #0\n\t"
  82275. "adds r4, r4, r8\n\t"
  82276. "adcs r2, r2, r9\n\t"
  82277. "adc r3, r3, #0\n\t"
  82278. "lsr r8, r10, #16\n\t"
  82279. "lsr r9, r12, #16\n\t"
  82280. "mul r9, r8, r9\n\t"
  82281. "adds r2, r2, r9\n\t"
  82282. "adc r3, r3, #0\n\t"
  82283. "adds r2, r2, r9\n\t"
  82284. "adc r3, r3, #0\n\t"
  82285. "lsl r9, r12, #16\n\t"
  82286. "lsr r9, r9, #16\n\t"
  82287. "mul r8, r9, r8\n\t"
  82288. "lsr r9, r8, #16\n\t"
  82289. "lsl r8, r8, #16\n\t"
  82290. "adds r4, r4, r8\n\t"
  82291. "adcs r2, r2, r9\n\t"
  82292. "adc r3, r3, #0\n\t"
  82293. "adds r4, r4, r8\n\t"
  82294. "adcs r2, r2, r9\n\t"
  82295. "adc r3, r3, #0\n\t"
  82296. #else
  82297. "umull r8, r9, r10, r12\n\t"
  82298. "adds r4, r4, r8\n\t"
  82299. "adcs r2, r2, r9\n\t"
  82300. "mov r3, #0\n\t"
  82301. "adc r3, r3, #0\n\t"
  82302. "adds r4, r4, r8\n\t"
  82303. "adcs r2, r2, r9\n\t"
  82304. "mov r3, #0\n\t"
  82305. "adc r3, r3, #0\n\t"
  82306. #endif
  82307. /* A[1] * A[1] */
  82308. "ldr r10, [%[a], #4]\n\t"
  82309. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82310. "lsl r8, r10, #16\n\t"
  82311. "lsr r9, r10, #16\n\t"
  82312. "lsr r8, r8, #16\n\t"
  82313. "mov r12, r8\n\t"
  82314. "mul r8, r12, r8\n\t"
  82315. "mov r12, r9\n\t"
  82316. "mul r9, r12, r9\n\t"
  82317. "adds r4, r4, r8\n\t"
  82318. "adcs r2, r2, r9\n\t"
  82319. "adc r3, r3, #0\n\t"
  82320. "lsr r9, r10, #16\n\t"
  82321. "lsl r8, r10, #16\n\t"
  82322. "lsr r8, r8, #16\n\t"
  82323. "mul r8, r9, r8\n\t"
  82324. "lsr r9, r8, #15\n\t"
  82325. "lsl r8, r8, #17\n\t"
  82326. "adds r4, r4, r8\n\t"
  82327. "adcs r2, r2, r9\n\t"
  82328. "adc r3, r3, #0\n\t"
  82329. #else
  82330. "umull r8, r9, r10, r10\n\t"
  82331. "adds r4, r4, r8\n\t"
  82332. "adcs r2, r2, r9\n\t"
  82333. "adc r3, r3, #0\n\t"
  82334. #endif
  82335. "str r4, [sp, #8]\n\t"
  82336. /* A[0] * A[3] */
  82337. "ldr r10, [%[a], #12]\n\t"
  82338. "ldr r12, [%[a]]\n\t"
  82339. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82340. "lsl r8, r10, #16\n\t"
  82341. "lsl r9, r12, #16\n\t"
  82342. "lsr r8, r8, #16\n\t"
  82343. "lsr r9, r9, #16\n\t"
  82344. "mul r9, r8, r9\n\t"
  82345. "adds r2, r2, r9\n\t"
  82346. "adcs r3, r3, #0\n\t"
  82347. "mov r4, #0\n\t"
  82348. "adc r4, r4, #0\n\t"
  82349. "adds r2, r2, r9\n\t"
  82350. "adcs r3, r3, #0\n\t"
  82351. "adc r4, r4, #0\n\t"
  82352. "lsr r9, r12, #16\n\t"
  82353. "mul r8, r9, r8\n\t"
  82354. "lsr r9, r8, #16\n\t"
  82355. "lsl r8, r8, #16\n\t"
  82356. "adds r2, r2, r8\n\t"
  82357. "adcs r3, r3, r9\n\t"
  82358. "adc r4, r4, #0\n\t"
  82359. "adds r2, r2, r8\n\t"
  82360. "adcs r3, r3, r9\n\t"
  82361. "adc r4, r4, #0\n\t"
  82362. "lsr r8, r10, #16\n\t"
  82363. "lsr r9, r12, #16\n\t"
  82364. "mul r9, r8, r9\n\t"
  82365. "adds r3, r3, r9\n\t"
  82366. "adc r4, r4, #0\n\t"
  82367. "adds r3, r3, r9\n\t"
  82368. "adc r4, r4, #0\n\t"
  82369. "lsl r9, r12, #16\n\t"
  82370. "lsr r9, r9, #16\n\t"
  82371. "mul r8, r9, r8\n\t"
  82372. "lsr r9, r8, #16\n\t"
  82373. "lsl r8, r8, #16\n\t"
  82374. "adds r2, r2, r8\n\t"
  82375. "adcs r3, r3, r9\n\t"
  82376. "adc r4, r4, #0\n\t"
  82377. "adds r2, r2, r8\n\t"
  82378. "adcs r3, r3, r9\n\t"
  82379. "adc r4, r4, #0\n\t"
  82380. #else
  82381. "umull r8, r9, r10, r12\n\t"
  82382. "adds r2, r2, r8\n\t"
  82383. "adcs r3, r3, r9\n\t"
  82384. "mov r4, #0\n\t"
  82385. "adc r4, r4, #0\n\t"
  82386. "adds r2, r2, r8\n\t"
  82387. "adcs r3, r3, r9\n\t"
  82388. "mov r4, #0\n\t"
  82389. "adc r4, r4, #0\n\t"
  82390. #endif
  82391. /* A[1] * A[2] */
  82392. "ldr r10, [%[a], #8]\n\t"
  82393. "ldr r12, [%[a], #4]\n\t"
  82394. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82395. "lsl r8, r10, #16\n\t"
  82396. "lsl r9, r12, #16\n\t"
  82397. "lsr r8, r8, #16\n\t"
  82398. "lsr r9, r9, #16\n\t"
  82399. "mul r9, r8, r9\n\t"
  82400. "adds r2, r2, r9\n\t"
  82401. "adcs r3, r3, #0\n\t"
  82402. "adc r4, r4, #0\n\t"
  82403. "adds r2, r2, r9\n\t"
  82404. "adcs r3, r3, #0\n\t"
  82405. "adc r4, r4, #0\n\t"
  82406. "lsr r9, r12, #16\n\t"
  82407. "mul r8, r9, r8\n\t"
  82408. "lsr r9, r8, #16\n\t"
  82409. "lsl r8, r8, #16\n\t"
  82410. "adds r2, r2, r8\n\t"
  82411. "adcs r3, r3, r9\n\t"
  82412. "adc r4, r4, #0\n\t"
  82413. "adds r2, r2, r8\n\t"
  82414. "adcs r3, r3, r9\n\t"
  82415. "adc r4, r4, #0\n\t"
  82416. "lsr r8, r10, #16\n\t"
  82417. "lsr r9, r12, #16\n\t"
  82418. "mul r9, r8, r9\n\t"
  82419. "adds r3, r3, r9\n\t"
  82420. "adc r4, r4, #0\n\t"
  82421. "adds r3, r3, r9\n\t"
  82422. "adc r4, r4, #0\n\t"
  82423. "lsl r9, r12, #16\n\t"
  82424. "lsr r9, r9, #16\n\t"
  82425. "mul r8, r9, r8\n\t"
  82426. "lsr r9, r8, #16\n\t"
  82427. "lsl r8, r8, #16\n\t"
  82428. "adds r2, r2, r8\n\t"
  82429. "adcs r3, r3, r9\n\t"
  82430. "adc r4, r4, #0\n\t"
  82431. "adds r2, r2, r8\n\t"
  82432. "adcs r3, r3, r9\n\t"
  82433. "adc r4, r4, #0\n\t"
  82434. #else
  82435. "umull r8, r9, r10, r12\n\t"
  82436. "adds r2, r2, r8\n\t"
  82437. "adcs r3, r3, r9\n\t"
  82438. "adc r4, r4, #0\n\t"
  82439. "adds r2, r2, r8\n\t"
  82440. "adcs r3, r3, r9\n\t"
  82441. "adc r4, r4, #0\n\t"
  82442. #endif
  82443. "str r2, [sp, #12]\n\t"
  82444. /* A[0] * A[4] */
  82445. "ldr r10, [%[a], #16]\n\t"
  82446. "ldr r12, [%[a]]\n\t"
  82447. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82448. "lsl r8, r10, #16\n\t"
  82449. "lsl r9, r12, #16\n\t"
  82450. "lsr r8, r8, #16\n\t"
  82451. "lsr r9, r9, #16\n\t"
  82452. "mul r9, r8, r9\n\t"
  82453. "adds r3, r3, r9\n\t"
  82454. "adcs r4, r4, #0\n\t"
  82455. "mov r2, #0\n\t"
  82456. "adc r2, r2, #0\n\t"
  82457. "adds r3, r3, r9\n\t"
  82458. "adcs r4, r4, #0\n\t"
  82459. "adc r2, r2, #0\n\t"
  82460. "lsr r9, r12, #16\n\t"
  82461. "mul r8, r9, r8\n\t"
  82462. "lsr r9, r8, #16\n\t"
  82463. "lsl r8, r8, #16\n\t"
  82464. "adds r3, r3, r8\n\t"
  82465. "adcs r4, r4, r9\n\t"
  82466. "adc r2, r2, #0\n\t"
  82467. "adds r3, r3, r8\n\t"
  82468. "adcs r4, r4, r9\n\t"
  82469. "adc r2, r2, #0\n\t"
  82470. "lsr r8, r10, #16\n\t"
  82471. "lsr r9, r12, #16\n\t"
  82472. "mul r9, r8, r9\n\t"
  82473. "adds r4, r4, r9\n\t"
  82474. "adc r2, r2, #0\n\t"
  82475. "adds r4, r4, r9\n\t"
  82476. "adc r2, r2, #0\n\t"
  82477. "lsl r9, r12, #16\n\t"
  82478. "lsr r9, r9, #16\n\t"
  82479. "mul r8, r9, r8\n\t"
  82480. "lsr r9, r8, #16\n\t"
  82481. "lsl r8, r8, #16\n\t"
  82482. "adds r3, r3, r8\n\t"
  82483. "adcs r4, r4, r9\n\t"
  82484. "adc r2, r2, #0\n\t"
  82485. "adds r3, r3, r8\n\t"
  82486. "adcs r4, r4, r9\n\t"
  82487. "adc r2, r2, #0\n\t"
  82488. #else
  82489. "umull r8, r9, r10, r12\n\t"
  82490. "adds r3, r3, r8\n\t"
  82491. "adcs r4, r4, r9\n\t"
  82492. "mov r2, #0\n\t"
  82493. "adc r2, r2, #0\n\t"
  82494. "adds r3, r3, r8\n\t"
  82495. "adcs r4, r4, r9\n\t"
  82496. "mov r2, #0\n\t"
  82497. "adc r2, r2, #0\n\t"
  82498. #endif
  82499. /* A[1] * A[3] */
  82500. "ldr r10, [%[a], #12]\n\t"
  82501. "ldr r12, [%[a], #4]\n\t"
  82502. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82503. "lsl r8, r10, #16\n\t"
  82504. "lsl r9, r12, #16\n\t"
  82505. "lsr r8, r8, #16\n\t"
  82506. "lsr r9, r9, #16\n\t"
  82507. "mul r9, r8, r9\n\t"
  82508. "adds r3, r3, r9\n\t"
  82509. "adcs r4, r4, #0\n\t"
  82510. "adc r2, r2, #0\n\t"
  82511. "adds r3, r3, r9\n\t"
  82512. "adcs r4, r4, #0\n\t"
  82513. "adc r2, r2, #0\n\t"
  82514. "lsr r9, r12, #16\n\t"
  82515. "mul r8, r9, r8\n\t"
  82516. "lsr r9, r8, #16\n\t"
  82517. "lsl r8, r8, #16\n\t"
  82518. "adds r3, r3, r8\n\t"
  82519. "adcs r4, r4, r9\n\t"
  82520. "adc r2, r2, #0\n\t"
  82521. "adds r3, r3, r8\n\t"
  82522. "adcs r4, r4, r9\n\t"
  82523. "adc r2, r2, #0\n\t"
  82524. "lsr r8, r10, #16\n\t"
  82525. "lsr r9, r12, #16\n\t"
  82526. "mul r9, r8, r9\n\t"
  82527. "adds r4, r4, r9\n\t"
  82528. "adc r2, r2, #0\n\t"
  82529. "adds r4, r4, r9\n\t"
  82530. "adc r2, r2, #0\n\t"
  82531. "lsl r9, r12, #16\n\t"
  82532. "lsr r9, r9, #16\n\t"
  82533. "mul r8, r9, r8\n\t"
  82534. "lsr r9, r8, #16\n\t"
  82535. "lsl r8, r8, #16\n\t"
  82536. "adds r3, r3, r8\n\t"
  82537. "adcs r4, r4, r9\n\t"
  82538. "adc r2, r2, #0\n\t"
  82539. "adds r3, r3, r8\n\t"
  82540. "adcs r4, r4, r9\n\t"
  82541. "adc r2, r2, #0\n\t"
  82542. #else
  82543. "umull r8, r9, r10, r12\n\t"
  82544. "adds r3, r3, r8\n\t"
  82545. "adcs r4, r4, r9\n\t"
  82546. "adc r2, r2, #0\n\t"
  82547. "adds r3, r3, r8\n\t"
  82548. "adcs r4, r4, r9\n\t"
  82549. "adc r2, r2, #0\n\t"
  82550. #endif
  82551. /* A[2] * A[2] */
  82552. "ldr r10, [%[a], #8]\n\t"
  82553. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82554. "lsl r8, r10, #16\n\t"
  82555. "lsr r9, r10, #16\n\t"
  82556. "lsr r8, r8, #16\n\t"
  82557. "mov r12, r8\n\t"
  82558. "mul r8, r12, r8\n\t"
  82559. "mov r12, r9\n\t"
  82560. "mul r9, r12, r9\n\t"
  82561. "adds r3, r3, r8\n\t"
  82562. "adcs r4, r4, r9\n\t"
  82563. "adc r2, r2, #0\n\t"
  82564. "lsr r9, r10, #16\n\t"
  82565. "lsl r8, r10, #16\n\t"
  82566. "lsr r8, r8, #16\n\t"
  82567. "mul r8, r9, r8\n\t"
  82568. "lsr r9, r8, #15\n\t"
  82569. "lsl r8, r8, #17\n\t"
  82570. "adds r3, r3, r8\n\t"
  82571. "adcs r4, r4, r9\n\t"
  82572. "adc r2, r2, #0\n\t"
  82573. #else
  82574. "umull r8, r9, r10, r10\n\t"
  82575. "adds r3, r3, r8\n\t"
  82576. "adcs r4, r4, r9\n\t"
  82577. "adc r2, r2, #0\n\t"
  82578. #endif
  82579. "str r3, [sp, #16]\n\t"
  82580. /* A[0] * A[5] */
  82581. "ldr r10, [%[a], #20]\n\t"
  82582. "ldr r12, [%[a]]\n\t"
  82583. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82584. "lsl r8, r10, #16\n\t"
  82585. "lsl r5, r12, #16\n\t"
  82586. "lsr r8, r8, #16\n\t"
  82587. "lsr r5, r5, #16\n\t"
  82588. "mul r5, r8, r5\n\t"
  82589. "lsr r9, r12, #16\n\t"
  82590. "mul r8, r9, r8\n\t"
  82591. "lsr r6, r8, #16\n\t"
  82592. "lsl r8, r8, #16\n\t"
  82593. "adds r5, r5, r8\n\t"
  82594. "adc r6, r6, #0\n\t"
  82595. "lsr r8, r10, #16\n\t"
  82596. "mul r9, r8, r9\n\t"
  82597. "add r6, r6, r9\n\t"
  82598. "lsl r9, r12, #16\n\t"
  82599. "lsr r9, r9, #16\n\t"
  82600. "mul r8, r9, r8\n\t"
  82601. "lsr r9, r8, #16\n\t"
  82602. "lsl r8, r8, #16\n\t"
  82603. "adds r5, r5, r8\n\t"
  82604. "adc r6, r6, r9\n\t"
  82605. #else
  82606. "umull r5, r6, r10, r12\n\t"
  82607. #endif
  82608. "mov r3, #0\n\t"
  82609. "mov r7, #0\n\t"
  82610. /* A[1] * A[4] */
  82611. "ldr r10, [%[a], #16]\n\t"
  82612. "ldr r12, [%[a], #4]\n\t"
  82613. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82614. "lsl r8, r10, #16\n\t"
  82615. "lsl r9, r12, #16\n\t"
  82616. "lsr r8, r8, #16\n\t"
  82617. "lsr r9, r9, #16\n\t"
  82618. "mul r9, r8, r9\n\t"
  82619. "adds r5, r5, r9\n\t"
  82620. "adcs r6, r6, #0\n\t"
  82621. "adc r7, r7, #0\n\t"
  82622. "lsr r9, r12, #16\n\t"
  82623. "mul r8, r9, r8\n\t"
  82624. "lsr r9, r8, #16\n\t"
  82625. "lsl r8, r8, #16\n\t"
  82626. "adds r5, r5, r8\n\t"
  82627. "adcs r6, r6, r9\n\t"
  82628. "adc r7, r7, #0\n\t"
  82629. "lsr r8, r10, #16\n\t"
  82630. "lsr r9, r12, #16\n\t"
  82631. "mul r9, r8, r9\n\t"
  82632. "adds r6, r6, r9\n\t"
  82633. "adc r7, r7, #0\n\t"
  82634. "lsl r9, r12, #16\n\t"
  82635. "lsr r9, r9, #16\n\t"
  82636. "mul r8, r9, r8\n\t"
  82637. "lsr r9, r8, #16\n\t"
  82638. "lsl r8, r8, #16\n\t"
  82639. "adds r5, r5, r8\n\t"
  82640. "adcs r6, r6, r9\n\t"
  82641. "adc r7, r7, #0\n\t"
  82642. #else
  82643. "umull r8, r9, r10, r12\n\t"
  82644. "adds r5, r5, r8\n\t"
  82645. "adcs r6, r6, r9\n\t"
  82646. "adc r7, r7, #0\n\t"
  82647. #endif
  82648. /* A[2] * A[3] */
  82649. "ldr r10, [%[a], #12]\n\t"
  82650. "ldr r12, [%[a], #8]\n\t"
  82651. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82652. "lsl r8, r10, #16\n\t"
  82653. "lsl r9, r12, #16\n\t"
  82654. "lsr r8, r8, #16\n\t"
  82655. "lsr r9, r9, #16\n\t"
  82656. "mul r9, r8, r9\n\t"
  82657. "adds r5, r5, r9\n\t"
  82658. "adcs r6, r6, #0\n\t"
  82659. "adc r7, r7, #0\n\t"
  82660. "lsr r9, r12, #16\n\t"
  82661. "mul r8, r9, r8\n\t"
  82662. "lsr r9, r8, #16\n\t"
  82663. "lsl r8, r8, #16\n\t"
  82664. "adds r5, r5, r8\n\t"
  82665. "adcs r6, r6, r9\n\t"
  82666. "adc r7, r7, #0\n\t"
  82667. "lsr r8, r10, #16\n\t"
  82668. "lsr r9, r12, #16\n\t"
  82669. "mul r9, r8, r9\n\t"
  82670. "adds r6, r6, r9\n\t"
  82671. "adc r7, r7, #0\n\t"
  82672. "lsl r9, r12, #16\n\t"
  82673. "lsr r9, r9, #16\n\t"
  82674. "mul r8, r9, r8\n\t"
  82675. "lsr r9, r8, #16\n\t"
  82676. "lsl r8, r8, #16\n\t"
  82677. "adds r5, r5, r8\n\t"
  82678. "adcs r6, r6, r9\n\t"
  82679. "adc r7, r7, #0\n\t"
  82680. #else
  82681. "umull r8, r9, r10, r12\n\t"
  82682. "adds r5, r5, r8\n\t"
  82683. "adcs r6, r6, r9\n\t"
  82684. "adc r7, r7, #0\n\t"
  82685. #endif
  82686. "adds r5, r5, r5\n\t"
  82687. "adcs r6, r6, r6\n\t"
  82688. "adc r7, r7, r7\n\t"
  82689. "adds r4, r4, r5\n\t"
  82690. "adcs r2, r2, r6\n\t"
  82691. "adc r3, r3, r7\n\t"
  82692. "str r4, [sp, #20]\n\t"
  82693. /* A[0] * A[6] */
  82694. "ldr r10, [%[a], #24]\n\t"
  82695. "ldr r12, [%[a]]\n\t"
  82696. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82697. "lsl r8, r10, #16\n\t"
  82698. "lsl r5, r12, #16\n\t"
  82699. "lsr r8, r8, #16\n\t"
  82700. "lsr r5, r5, #16\n\t"
  82701. "mul r5, r8, r5\n\t"
  82702. "lsr r9, r12, #16\n\t"
  82703. "mul r8, r9, r8\n\t"
  82704. "lsr r6, r8, #16\n\t"
  82705. "lsl r8, r8, #16\n\t"
  82706. "adds r5, r5, r8\n\t"
  82707. "adc r6, r6, #0\n\t"
  82708. "lsr r8, r10, #16\n\t"
  82709. "mul r9, r8, r9\n\t"
  82710. "add r6, r6, r9\n\t"
  82711. "lsl r9, r12, #16\n\t"
  82712. "lsr r9, r9, #16\n\t"
  82713. "mul r8, r9, r8\n\t"
  82714. "lsr r9, r8, #16\n\t"
  82715. "lsl r8, r8, #16\n\t"
  82716. "adds r5, r5, r8\n\t"
  82717. "adc r6, r6, r9\n\t"
  82718. #else
  82719. "umull r5, r6, r10, r12\n\t"
  82720. #endif
  82721. "mov r4, #0\n\t"
  82722. "mov r7, #0\n\t"
  82723. /* A[1] * A[5] */
  82724. "ldr r10, [%[a], #20]\n\t"
  82725. "ldr r12, [%[a], #4]\n\t"
  82726. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82727. "lsl r8, r10, #16\n\t"
  82728. "lsl r9, r12, #16\n\t"
  82729. "lsr r8, r8, #16\n\t"
  82730. "lsr r9, r9, #16\n\t"
  82731. "mul r9, r8, r9\n\t"
  82732. "adds r5, r5, r9\n\t"
  82733. "adcs r6, r6, #0\n\t"
  82734. "adc r7, r7, #0\n\t"
  82735. "lsr r9, r12, #16\n\t"
  82736. "mul r8, r9, r8\n\t"
  82737. "lsr r9, r8, #16\n\t"
  82738. "lsl r8, r8, #16\n\t"
  82739. "adds r5, r5, r8\n\t"
  82740. "adcs r6, r6, r9\n\t"
  82741. "adc r7, r7, #0\n\t"
  82742. "lsr r8, r10, #16\n\t"
  82743. "lsr r9, r12, #16\n\t"
  82744. "mul r9, r8, r9\n\t"
  82745. "adds r6, r6, r9\n\t"
  82746. "adc r7, r7, #0\n\t"
  82747. "lsl r9, r12, #16\n\t"
  82748. "lsr r9, r9, #16\n\t"
  82749. "mul r8, r9, r8\n\t"
  82750. "lsr r9, r8, #16\n\t"
  82751. "lsl r8, r8, #16\n\t"
  82752. "adds r5, r5, r8\n\t"
  82753. "adcs r6, r6, r9\n\t"
  82754. "adc r7, r7, #0\n\t"
  82755. #else
  82756. "umull r8, r9, r10, r12\n\t"
  82757. "adds r5, r5, r8\n\t"
  82758. "adcs r6, r6, r9\n\t"
  82759. "adc r7, r7, #0\n\t"
  82760. #endif
  82761. /* A[2] * A[4] */
  82762. "ldr r10, [%[a], #16]\n\t"
  82763. "ldr r12, [%[a], #8]\n\t"
  82764. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82765. "lsl r8, r10, #16\n\t"
  82766. "lsl r9, r12, #16\n\t"
  82767. "lsr r8, r8, #16\n\t"
  82768. "lsr r9, r9, #16\n\t"
  82769. "mul r9, r8, r9\n\t"
  82770. "adds r5, r5, r9\n\t"
  82771. "adcs r6, r6, #0\n\t"
  82772. "adc r7, r7, #0\n\t"
  82773. "lsr r9, r12, #16\n\t"
  82774. "mul r8, r9, r8\n\t"
  82775. "lsr r9, r8, #16\n\t"
  82776. "lsl r8, r8, #16\n\t"
  82777. "adds r5, r5, r8\n\t"
  82778. "adcs r6, r6, r9\n\t"
  82779. "adc r7, r7, #0\n\t"
  82780. "lsr r8, r10, #16\n\t"
  82781. "lsr r9, r12, #16\n\t"
  82782. "mul r9, r8, r9\n\t"
  82783. "adds r6, r6, r9\n\t"
  82784. "adc r7, r7, #0\n\t"
  82785. "lsl r9, r12, #16\n\t"
  82786. "lsr r9, r9, #16\n\t"
  82787. "mul r8, r9, r8\n\t"
  82788. "lsr r9, r8, #16\n\t"
  82789. "lsl r8, r8, #16\n\t"
  82790. "adds r5, r5, r8\n\t"
  82791. "adcs r6, r6, r9\n\t"
  82792. "adc r7, r7, #0\n\t"
  82793. #else
  82794. "umull r8, r9, r10, r12\n\t"
  82795. "adds r5, r5, r8\n\t"
  82796. "adcs r6, r6, r9\n\t"
  82797. "adc r7, r7, #0\n\t"
  82798. #endif
  82799. /* A[3] * A[3] */
  82800. "ldr r10, [%[a], #12]\n\t"
  82801. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82802. "lsl r8, r10, #16\n\t"
  82803. "lsr r9, r10, #16\n\t"
  82804. "lsr r8, r8, #16\n\t"
  82805. "mov r12, r8\n\t"
  82806. "mul r8, r12, r8\n\t"
  82807. "mov r12, r9\n\t"
  82808. "mul r9, r12, r9\n\t"
  82809. "adds r2, r2, r8\n\t"
  82810. "adcs r3, r3, r9\n\t"
  82811. "adc r4, r4, #0\n\t"
  82812. "lsr r9, r10, #16\n\t"
  82813. "lsl r8, r10, #16\n\t"
  82814. "lsr r8, r8, #16\n\t"
  82815. "mul r8, r9, r8\n\t"
  82816. "lsr r9, r8, #15\n\t"
  82817. "lsl r8, r8, #17\n\t"
  82818. "adds r2, r2, r8\n\t"
  82819. "adcs r3, r3, r9\n\t"
  82820. "adc r4, r4, #0\n\t"
  82821. "adds r5, r5, r5\n\t"
  82822. "adcs r6, r6, r6\n\t"
  82823. "adc r7, r7, r7\n\t"
  82824. #else
  82825. "umull r8, r9, r10, r10\n\t"
  82826. "adds r5, r5, r5\n\t"
  82827. "adcs r6, r6, r6\n\t"
  82828. "adc r7, r7, r7\n\t"
  82829. "adds r2, r2, r8\n\t"
  82830. "adcs r3, r3, r9\n\t"
  82831. "adc r4, r4, #0\n\t"
  82832. #endif
  82833. "adds r2, r2, r5\n\t"
  82834. "adcs r3, r3, r6\n\t"
  82835. "adc r4, r4, r7\n\t"
  82836. "str r2, [sp, #24]\n\t"
  82837. /* A[0] * A[7] */
  82838. "ldr r10, [%[a], #28]\n\t"
  82839. "ldr r12, [%[a]]\n\t"
  82840. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82841. "lsl r8, r10, #16\n\t"
  82842. "lsl r5, r12, #16\n\t"
  82843. "lsr r8, r8, #16\n\t"
  82844. "lsr r5, r5, #16\n\t"
  82845. "mul r5, r8, r5\n\t"
  82846. "lsr r9, r12, #16\n\t"
  82847. "mul r8, r9, r8\n\t"
  82848. "lsr r6, r8, #16\n\t"
  82849. "lsl r8, r8, #16\n\t"
  82850. "adds r5, r5, r8\n\t"
  82851. "adc r6, r6, #0\n\t"
  82852. "lsr r8, r10, #16\n\t"
  82853. "mul r9, r8, r9\n\t"
  82854. "add r6, r6, r9\n\t"
  82855. "lsl r9, r12, #16\n\t"
  82856. "lsr r9, r9, #16\n\t"
  82857. "mul r8, r9, r8\n\t"
  82858. "lsr r9, r8, #16\n\t"
  82859. "lsl r8, r8, #16\n\t"
  82860. "adds r5, r5, r8\n\t"
  82861. "adc r6, r6, r9\n\t"
  82862. #else
  82863. "umull r5, r6, r10, r12\n\t"
  82864. #endif
  82865. "mov r2, #0\n\t"
  82866. "mov r7, #0\n\t"
  82867. /* A[1] * A[6] */
  82868. "ldr r10, [%[a], #24]\n\t"
  82869. "ldr r12, [%[a], #4]\n\t"
  82870. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82871. "lsl r8, r10, #16\n\t"
  82872. "lsl r9, r12, #16\n\t"
  82873. "lsr r8, r8, #16\n\t"
  82874. "lsr r9, r9, #16\n\t"
  82875. "mul r9, r8, r9\n\t"
  82876. "adds r5, r5, r9\n\t"
  82877. "adcs r6, r6, #0\n\t"
  82878. "adc r7, r7, #0\n\t"
  82879. "lsr r9, r12, #16\n\t"
  82880. "mul r8, r9, r8\n\t"
  82881. "lsr r9, r8, #16\n\t"
  82882. "lsl r8, r8, #16\n\t"
  82883. "adds r5, r5, r8\n\t"
  82884. "adcs r6, r6, r9\n\t"
  82885. "adc r7, r7, #0\n\t"
  82886. "lsr r8, r10, #16\n\t"
  82887. "lsr r9, r12, #16\n\t"
  82888. "mul r9, r8, r9\n\t"
  82889. "adds r6, r6, r9\n\t"
  82890. "adc r7, r7, #0\n\t"
  82891. "lsl r9, r12, #16\n\t"
  82892. "lsr r9, r9, #16\n\t"
  82893. "mul r8, r9, r8\n\t"
  82894. "lsr r9, r8, #16\n\t"
  82895. "lsl r8, r8, #16\n\t"
  82896. "adds r5, r5, r8\n\t"
  82897. "adcs r6, r6, r9\n\t"
  82898. "adc r7, r7, #0\n\t"
  82899. #else
  82900. "umull r8, r9, r10, r12\n\t"
  82901. "adds r5, r5, r8\n\t"
  82902. "adcs r6, r6, r9\n\t"
  82903. "adc r7, r7, #0\n\t"
  82904. #endif
  82905. /* A[2] * A[5] */
  82906. "ldr r10, [%[a], #20]\n\t"
  82907. "ldr r12, [%[a], #8]\n\t"
  82908. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82909. "lsl r8, r10, #16\n\t"
  82910. "lsl r9, r12, #16\n\t"
  82911. "lsr r8, r8, #16\n\t"
  82912. "lsr r9, r9, #16\n\t"
  82913. "mul r9, r8, r9\n\t"
  82914. "adds r5, r5, r9\n\t"
  82915. "adcs r6, r6, #0\n\t"
  82916. "adc r7, r7, #0\n\t"
  82917. "lsr r9, r12, #16\n\t"
  82918. "mul r8, r9, r8\n\t"
  82919. "lsr r9, r8, #16\n\t"
  82920. "lsl r8, r8, #16\n\t"
  82921. "adds r5, r5, r8\n\t"
  82922. "adcs r6, r6, r9\n\t"
  82923. "adc r7, r7, #0\n\t"
  82924. "lsr r8, r10, #16\n\t"
  82925. "lsr r9, r12, #16\n\t"
  82926. "mul r9, r8, r9\n\t"
  82927. "adds r6, r6, r9\n\t"
  82928. "adc r7, r7, #0\n\t"
  82929. "lsl r9, r12, #16\n\t"
  82930. "lsr r9, r9, #16\n\t"
  82931. "mul r8, r9, r8\n\t"
  82932. "lsr r9, r8, #16\n\t"
  82933. "lsl r8, r8, #16\n\t"
  82934. "adds r5, r5, r8\n\t"
  82935. "adcs r6, r6, r9\n\t"
  82936. "adc r7, r7, #0\n\t"
  82937. #else
  82938. "umull r8, r9, r10, r12\n\t"
  82939. "adds r5, r5, r8\n\t"
  82940. "adcs r6, r6, r9\n\t"
  82941. "adc r7, r7, #0\n\t"
  82942. #endif
  82943. /* A[3] * A[4] */
  82944. "ldr r10, [%[a], #16]\n\t"
  82945. "ldr r12, [%[a], #12]\n\t"
  82946. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82947. "lsl r8, r10, #16\n\t"
  82948. "lsl r9, r12, #16\n\t"
  82949. "lsr r8, r8, #16\n\t"
  82950. "lsr r9, r9, #16\n\t"
  82951. "mul r9, r8, r9\n\t"
  82952. "adds r5, r5, r9\n\t"
  82953. "adcs r6, r6, #0\n\t"
  82954. "adc r7, r7, #0\n\t"
  82955. "lsr r9, r12, #16\n\t"
  82956. "mul r8, r9, r8\n\t"
  82957. "lsr r9, r8, #16\n\t"
  82958. "lsl r8, r8, #16\n\t"
  82959. "adds r5, r5, r8\n\t"
  82960. "adcs r6, r6, r9\n\t"
  82961. "adc r7, r7, #0\n\t"
  82962. "lsr r8, r10, #16\n\t"
  82963. "lsr r9, r12, #16\n\t"
  82964. "mul r9, r8, r9\n\t"
  82965. "adds r6, r6, r9\n\t"
  82966. "adc r7, r7, #0\n\t"
  82967. "lsl r9, r12, #16\n\t"
  82968. "lsr r9, r9, #16\n\t"
  82969. "mul r8, r9, r8\n\t"
  82970. "lsr r9, r8, #16\n\t"
  82971. "lsl r8, r8, #16\n\t"
  82972. "adds r5, r5, r8\n\t"
  82973. "adcs r6, r6, r9\n\t"
  82974. "adc r7, r7, #0\n\t"
  82975. #else
  82976. "umull r8, r9, r10, r12\n\t"
  82977. "adds r5, r5, r8\n\t"
  82978. "adcs r6, r6, r9\n\t"
  82979. "adc r7, r7, #0\n\t"
  82980. #endif
  82981. "adds r5, r5, r5\n\t"
  82982. "adcs r6, r6, r6\n\t"
  82983. "adc r7, r7, r7\n\t"
  82984. "adds r3, r3, r5\n\t"
  82985. "adcs r4, r4, r6\n\t"
  82986. "adc r2, r2, r7\n\t"
  82987. "str r3, [sp, #28]\n\t"
  82988. /* A[0] * A[8] */
  82989. "ldr r10, [%[a], #32]\n\t"
  82990. "ldr r12, [%[a]]\n\t"
  82991. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  82992. "lsl r8, r10, #16\n\t"
  82993. "lsl r5, r12, #16\n\t"
  82994. "lsr r8, r8, #16\n\t"
  82995. "lsr r5, r5, #16\n\t"
  82996. "mul r5, r8, r5\n\t"
  82997. "lsr r9, r12, #16\n\t"
  82998. "mul r8, r9, r8\n\t"
  82999. "lsr r6, r8, #16\n\t"
  83000. "lsl r8, r8, #16\n\t"
  83001. "adds r5, r5, r8\n\t"
  83002. "adc r6, r6, #0\n\t"
  83003. "lsr r8, r10, #16\n\t"
  83004. "mul r9, r8, r9\n\t"
  83005. "add r6, r6, r9\n\t"
  83006. "lsl r9, r12, #16\n\t"
  83007. "lsr r9, r9, #16\n\t"
  83008. "mul r8, r9, r8\n\t"
  83009. "lsr r9, r8, #16\n\t"
  83010. "lsl r8, r8, #16\n\t"
  83011. "adds r5, r5, r8\n\t"
  83012. "adc r6, r6, r9\n\t"
  83013. #else
  83014. "umull r5, r6, r10, r12\n\t"
  83015. #endif
  83016. "mov r3, #0\n\t"
  83017. "mov r7, #0\n\t"
  83018. /* A[1] * A[7] */
  83019. "ldr r10, [%[a], #28]\n\t"
  83020. "ldr r12, [%[a], #4]\n\t"
  83021. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83022. "lsl r8, r10, #16\n\t"
  83023. "lsl r9, r12, #16\n\t"
  83024. "lsr r8, r8, #16\n\t"
  83025. "lsr r9, r9, #16\n\t"
  83026. "mul r9, r8, r9\n\t"
  83027. "adds r5, r5, r9\n\t"
  83028. "adcs r6, r6, #0\n\t"
  83029. "adc r7, r7, #0\n\t"
  83030. "lsr r9, r12, #16\n\t"
  83031. "mul r8, r9, r8\n\t"
  83032. "lsr r9, r8, #16\n\t"
  83033. "lsl r8, r8, #16\n\t"
  83034. "adds r5, r5, r8\n\t"
  83035. "adcs r6, r6, r9\n\t"
  83036. "adc r7, r7, #0\n\t"
  83037. "lsr r8, r10, #16\n\t"
  83038. "lsr r9, r12, #16\n\t"
  83039. "mul r9, r8, r9\n\t"
  83040. "adds r6, r6, r9\n\t"
  83041. "adc r7, r7, #0\n\t"
  83042. "lsl r9, r12, #16\n\t"
  83043. "lsr r9, r9, #16\n\t"
  83044. "mul r8, r9, r8\n\t"
  83045. "lsr r9, r8, #16\n\t"
  83046. "lsl r8, r8, #16\n\t"
  83047. "adds r5, r5, r8\n\t"
  83048. "adcs r6, r6, r9\n\t"
  83049. "adc r7, r7, #0\n\t"
  83050. #else
  83051. "umull r8, r9, r10, r12\n\t"
  83052. "adds r5, r5, r8\n\t"
  83053. "adcs r6, r6, r9\n\t"
  83054. "adc r7, r7, #0\n\t"
  83055. #endif
  83056. /* A[2] * A[6] */
  83057. "ldr r10, [%[a], #24]\n\t"
  83058. "ldr r12, [%[a], #8]\n\t"
  83059. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83060. "lsl r8, r10, #16\n\t"
  83061. "lsl r9, r12, #16\n\t"
  83062. "lsr r8, r8, #16\n\t"
  83063. "lsr r9, r9, #16\n\t"
  83064. "mul r9, r8, r9\n\t"
  83065. "adds r5, r5, r9\n\t"
  83066. "adcs r6, r6, #0\n\t"
  83067. "adc r7, r7, #0\n\t"
  83068. "lsr r9, r12, #16\n\t"
  83069. "mul r8, r9, r8\n\t"
  83070. "lsr r9, r8, #16\n\t"
  83071. "lsl r8, r8, #16\n\t"
  83072. "adds r5, r5, r8\n\t"
  83073. "adcs r6, r6, r9\n\t"
  83074. "adc r7, r7, #0\n\t"
  83075. "lsr r8, r10, #16\n\t"
  83076. "lsr r9, r12, #16\n\t"
  83077. "mul r9, r8, r9\n\t"
  83078. "adds r6, r6, r9\n\t"
  83079. "adc r7, r7, #0\n\t"
  83080. "lsl r9, r12, #16\n\t"
  83081. "lsr r9, r9, #16\n\t"
  83082. "mul r8, r9, r8\n\t"
  83083. "lsr r9, r8, #16\n\t"
  83084. "lsl r8, r8, #16\n\t"
  83085. "adds r5, r5, r8\n\t"
  83086. "adcs r6, r6, r9\n\t"
  83087. "adc r7, r7, #0\n\t"
  83088. #else
  83089. "umull r8, r9, r10, r12\n\t"
  83090. "adds r5, r5, r8\n\t"
  83091. "adcs r6, r6, r9\n\t"
  83092. "adc r7, r7, #0\n\t"
  83093. #endif
  83094. /* A[3] * A[5] */
  83095. "ldr r10, [%[a], #20]\n\t"
  83096. "ldr r12, [%[a], #12]\n\t"
  83097. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83098. "lsl r8, r10, #16\n\t"
  83099. "lsl r9, r12, #16\n\t"
  83100. "lsr r8, r8, #16\n\t"
  83101. "lsr r9, r9, #16\n\t"
  83102. "mul r9, r8, r9\n\t"
  83103. "adds r5, r5, r9\n\t"
  83104. "adcs r6, r6, #0\n\t"
  83105. "adc r7, r7, #0\n\t"
  83106. "lsr r9, r12, #16\n\t"
  83107. "mul r8, r9, r8\n\t"
  83108. "lsr r9, r8, #16\n\t"
  83109. "lsl r8, r8, #16\n\t"
  83110. "adds r5, r5, r8\n\t"
  83111. "adcs r6, r6, r9\n\t"
  83112. "adc r7, r7, #0\n\t"
  83113. "lsr r8, r10, #16\n\t"
  83114. "lsr r9, r12, #16\n\t"
  83115. "mul r9, r8, r9\n\t"
  83116. "adds r6, r6, r9\n\t"
  83117. "adc r7, r7, #0\n\t"
  83118. "lsl r9, r12, #16\n\t"
  83119. "lsr r9, r9, #16\n\t"
  83120. "mul r8, r9, r8\n\t"
  83121. "lsr r9, r8, #16\n\t"
  83122. "lsl r8, r8, #16\n\t"
  83123. "adds r5, r5, r8\n\t"
  83124. "adcs r6, r6, r9\n\t"
  83125. "adc r7, r7, #0\n\t"
  83126. #else
  83127. "umull r8, r9, r10, r12\n\t"
  83128. "adds r5, r5, r8\n\t"
  83129. "adcs r6, r6, r9\n\t"
  83130. "adc r7, r7, #0\n\t"
  83131. #endif
  83132. /* A[4] * A[4] */
  83133. "ldr r10, [%[a], #16]\n\t"
  83134. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83135. "lsl r8, r10, #16\n\t"
  83136. "lsr r9, r10, #16\n\t"
  83137. "lsr r8, r8, #16\n\t"
  83138. "mov r12, r8\n\t"
  83139. "mul r8, r12, r8\n\t"
  83140. "mov r12, r9\n\t"
  83141. "mul r9, r12, r9\n\t"
  83142. "adds r4, r4, r8\n\t"
  83143. "adcs r2, r2, r9\n\t"
  83144. "adc r3, r3, #0\n\t"
  83145. "lsr r9, r10, #16\n\t"
  83146. "lsl r8, r10, #16\n\t"
  83147. "lsr r8, r8, #16\n\t"
  83148. "mul r8, r9, r8\n\t"
  83149. "lsr r9, r8, #15\n\t"
  83150. "lsl r8, r8, #17\n\t"
  83151. "adds r4, r4, r8\n\t"
  83152. "adcs r2, r2, r9\n\t"
  83153. "adc r3, r3, #0\n\t"
  83154. "adds r5, r5, r5\n\t"
  83155. "adcs r6, r6, r6\n\t"
  83156. "adc r7, r7, r7\n\t"
  83157. #else
  83158. "umull r8, r9, r10, r10\n\t"
  83159. "adds r5, r5, r5\n\t"
  83160. "adcs r6, r6, r6\n\t"
  83161. "adc r7, r7, r7\n\t"
  83162. "adds r4, r4, r8\n\t"
  83163. "adcs r2, r2, r9\n\t"
  83164. "adc r3, r3, #0\n\t"
  83165. #endif
  83166. "adds r4, r4, r5\n\t"
  83167. "adcs r2, r2, r6\n\t"
  83168. "adc r3, r3, r7\n\t"
  83169. "str r4, [sp, #32]\n\t"
  83170. /* A[0] * A[9] */
  83171. "ldr r10, [%[a], #36]\n\t"
  83172. "ldr r12, [%[a]]\n\t"
  83173. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83174. "lsl r8, r10, #16\n\t"
  83175. "lsl r5, r12, #16\n\t"
  83176. "lsr r8, r8, #16\n\t"
  83177. "lsr r5, r5, #16\n\t"
  83178. "mul r5, r8, r5\n\t"
  83179. "lsr r9, r12, #16\n\t"
  83180. "mul r8, r9, r8\n\t"
  83181. "lsr r6, r8, #16\n\t"
  83182. "lsl r8, r8, #16\n\t"
  83183. "adds r5, r5, r8\n\t"
  83184. "adc r6, r6, #0\n\t"
  83185. "lsr r8, r10, #16\n\t"
  83186. "mul r9, r8, r9\n\t"
  83187. "add r6, r6, r9\n\t"
  83188. "lsl r9, r12, #16\n\t"
  83189. "lsr r9, r9, #16\n\t"
  83190. "mul r8, r9, r8\n\t"
  83191. "lsr r9, r8, #16\n\t"
  83192. "lsl r8, r8, #16\n\t"
  83193. "adds r5, r5, r8\n\t"
  83194. "adc r6, r6, r9\n\t"
  83195. #else
  83196. "umull r5, r6, r10, r12\n\t"
  83197. #endif
  83198. "mov r4, #0\n\t"
  83199. "mov r7, #0\n\t"
  83200. /* A[1] * A[8] */
  83201. "ldr r10, [%[a], #32]\n\t"
  83202. "ldr r12, [%[a], #4]\n\t"
  83203. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83204. "lsl r8, r10, #16\n\t"
  83205. "lsl r9, r12, #16\n\t"
  83206. "lsr r8, r8, #16\n\t"
  83207. "lsr r9, r9, #16\n\t"
  83208. "mul r9, r8, r9\n\t"
  83209. "adds r5, r5, r9\n\t"
  83210. "adcs r6, r6, #0\n\t"
  83211. "adc r7, r7, #0\n\t"
  83212. "lsr r9, r12, #16\n\t"
  83213. "mul r8, r9, r8\n\t"
  83214. "lsr r9, r8, #16\n\t"
  83215. "lsl r8, r8, #16\n\t"
  83216. "adds r5, r5, r8\n\t"
  83217. "adcs r6, r6, r9\n\t"
  83218. "adc r7, r7, #0\n\t"
  83219. "lsr r8, r10, #16\n\t"
  83220. "lsr r9, r12, #16\n\t"
  83221. "mul r9, r8, r9\n\t"
  83222. "adds r6, r6, r9\n\t"
  83223. "adc r7, r7, #0\n\t"
  83224. "lsl r9, r12, #16\n\t"
  83225. "lsr r9, r9, #16\n\t"
  83226. "mul r8, r9, r8\n\t"
  83227. "lsr r9, r8, #16\n\t"
  83228. "lsl r8, r8, #16\n\t"
  83229. "adds r5, r5, r8\n\t"
  83230. "adcs r6, r6, r9\n\t"
  83231. "adc r7, r7, #0\n\t"
  83232. #else
  83233. "umull r8, r9, r10, r12\n\t"
  83234. "adds r5, r5, r8\n\t"
  83235. "adcs r6, r6, r9\n\t"
  83236. "adc r7, r7, #0\n\t"
  83237. #endif
  83238. /* A[2] * A[7] */
  83239. "ldr r10, [%[a], #28]\n\t"
  83240. "ldr r12, [%[a], #8]\n\t"
  83241. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83242. "lsl r8, r10, #16\n\t"
  83243. "lsl r9, r12, #16\n\t"
  83244. "lsr r8, r8, #16\n\t"
  83245. "lsr r9, r9, #16\n\t"
  83246. "mul r9, r8, r9\n\t"
  83247. "adds r5, r5, r9\n\t"
  83248. "adcs r6, r6, #0\n\t"
  83249. "adc r7, r7, #0\n\t"
  83250. "lsr r9, r12, #16\n\t"
  83251. "mul r8, r9, r8\n\t"
  83252. "lsr r9, r8, #16\n\t"
  83253. "lsl r8, r8, #16\n\t"
  83254. "adds r5, r5, r8\n\t"
  83255. "adcs r6, r6, r9\n\t"
  83256. "adc r7, r7, #0\n\t"
  83257. "lsr r8, r10, #16\n\t"
  83258. "lsr r9, r12, #16\n\t"
  83259. "mul r9, r8, r9\n\t"
  83260. "adds r6, r6, r9\n\t"
  83261. "adc r7, r7, #0\n\t"
  83262. "lsl r9, r12, #16\n\t"
  83263. "lsr r9, r9, #16\n\t"
  83264. "mul r8, r9, r8\n\t"
  83265. "lsr r9, r8, #16\n\t"
  83266. "lsl r8, r8, #16\n\t"
  83267. "adds r5, r5, r8\n\t"
  83268. "adcs r6, r6, r9\n\t"
  83269. "adc r7, r7, #0\n\t"
  83270. #else
  83271. "umull r8, r9, r10, r12\n\t"
  83272. "adds r5, r5, r8\n\t"
  83273. "adcs r6, r6, r9\n\t"
  83274. "adc r7, r7, #0\n\t"
  83275. #endif
  83276. /* A[3] * A[6] */
  83277. "ldr r10, [%[a], #24]\n\t"
  83278. "ldr r12, [%[a], #12]\n\t"
  83279. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83280. "lsl r8, r10, #16\n\t"
  83281. "lsl r9, r12, #16\n\t"
  83282. "lsr r8, r8, #16\n\t"
  83283. "lsr r9, r9, #16\n\t"
  83284. "mul r9, r8, r9\n\t"
  83285. "adds r5, r5, r9\n\t"
  83286. "adcs r6, r6, #0\n\t"
  83287. "adc r7, r7, #0\n\t"
  83288. "lsr r9, r12, #16\n\t"
  83289. "mul r8, r9, r8\n\t"
  83290. "lsr r9, r8, #16\n\t"
  83291. "lsl r8, r8, #16\n\t"
  83292. "adds r5, r5, r8\n\t"
  83293. "adcs r6, r6, r9\n\t"
  83294. "adc r7, r7, #0\n\t"
  83295. "lsr r8, r10, #16\n\t"
  83296. "lsr r9, r12, #16\n\t"
  83297. "mul r9, r8, r9\n\t"
  83298. "adds r6, r6, r9\n\t"
  83299. "adc r7, r7, #0\n\t"
  83300. "lsl r9, r12, #16\n\t"
  83301. "lsr r9, r9, #16\n\t"
  83302. "mul r8, r9, r8\n\t"
  83303. "lsr r9, r8, #16\n\t"
  83304. "lsl r8, r8, #16\n\t"
  83305. "adds r5, r5, r8\n\t"
  83306. "adcs r6, r6, r9\n\t"
  83307. "adc r7, r7, #0\n\t"
  83308. #else
  83309. "umull r8, r9, r10, r12\n\t"
  83310. "adds r5, r5, r8\n\t"
  83311. "adcs r6, r6, r9\n\t"
  83312. "adc r7, r7, #0\n\t"
  83313. #endif
  83314. /* A[4] * A[5] */
  83315. "ldr r10, [%[a], #20]\n\t"
  83316. "ldr r12, [%[a], #16]\n\t"
  83317. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83318. "lsl r8, r10, #16\n\t"
  83319. "lsl r9, r12, #16\n\t"
  83320. "lsr r8, r8, #16\n\t"
  83321. "lsr r9, r9, #16\n\t"
  83322. "mul r9, r8, r9\n\t"
  83323. "adds r5, r5, r9\n\t"
  83324. "adcs r6, r6, #0\n\t"
  83325. "adc r7, r7, #0\n\t"
  83326. "lsr r9, r12, #16\n\t"
  83327. "mul r8, r9, r8\n\t"
  83328. "lsr r9, r8, #16\n\t"
  83329. "lsl r8, r8, #16\n\t"
  83330. "adds r5, r5, r8\n\t"
  83331. "adcs r6, r6, r9\n\t"
  83332. "adc r7, r7, #0\n\t"
  83333. "lsr r8, r10, #16\n\t"
  83334. "lsr r9, r12, #16\n\t"
  83335. "mul r9, r8, r9\n\t"
  83336. "adds r6, r6, r9\n\t"
  83337. "adc r7, r7, #0\n\t"
  83338. "lsl r9, r12, #16\n\t"
  83339. "lsr r9, r9, #16\n\t"
  83340. "mul r8, r9, r8\n\t"
  83341. "lsr r9, r8, #16\n\t"
  83342. "lsl r8, r8, #16\n\t"
  83343. "adds r5, r5, r8\n\t"
  83344. "adcs r6, r6, r9\n\t"
  83345. "adc r7, r7, #0\n\t"
  83346. #else
  83347. "umull r8, r9, r10, r12\n\t"
  83348. "adds r5, r5, r8\n\t"
  83349. "adcs r6, r6, r9\n\t"
  83350. "adc r7, r7, #0\n\t"
  83351. #endif
  83352. "adds r5, r5, r5\n\t"
  83353. "adcs r6, r6, r6\n\t"
  83354. "adc r7, r7, r7\n\t"
  83355. "adds r2, r2, r5\n\t"
  83356. "adcs r3, r3, r6\n\t"
  83357. "adc r4, r4, r7\n\t"
  83358. "str r2, [sp, #36]\n\t"
  83359. /* A[0] * A[10] */
  83360. "ldr r10, [%[a], #40]\n\t"
  83361. "ldr r12, [%[a]]\n\t"
  83362. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83363. "lsl r8, r10, #16\n\t"
  83364. "lsl r5, r12, #16\n\t"
  83365. "lsr r8, r8, #16\n\t"
  83366. "lsr r5, r5, #16\n\t"
  83367. "mul r5, r8, r5\n\t"
  83368. "lsr r9, r12, #16\n\t"
  83369. "mul r8, r9, r8\n\t"
  83370. "lsr r6, r8, #16\n\t"
  83371. "lsl r8, r8, #16\n\t"
  83372. "adds r5, r5, r8\n\t"
  83373. "adc r6, r6, #0\n\t"
  83374. "lsr r8, r10, #16\n\t"
  83375. "mul r9, r8, r9\n\t"
  83376. "add r6, r6, r9\n\t"
  83377. "lsl r9, r12, #16\n\t"
  83378. "lsr r9, r9, #16\n\t"
  83379. "mul r8, r9, r8\n\t"
  83380. "lsr r9, r8, #16\n\t"
  83381. "lsl r8, r8, #16\n\t"
  83382. "adds r5, r5, r8\n\t"
  83383. "adc r6, r6, r9\n\t"
  83384. #else
  83385. "umull r5, r6, r10, r12\n\t"
  83386. #endif
  83387. "mov r2, #0\n\t"
  83388. "mov r7, #0\n\t"
  83389. /* A[1] * A[9] */
  83390. "ldr r10, [%[a], #36]\n\t"
  83391. "ldr r12, [%[a], #4]\n\t"
  83392. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83393. "lsl r8, r10, #16\n\t"
  83394. "lsl r9, r12, #16\n\t"
  83395. "lsr r8, r8, #16\n\t"
  83396. "lsr r9, r9, #16\n\t"
  83397. "mul r9, r8, r9\n\t"
  83398. "adds r5, r5, r9\n\t"
  83399. "adcs r6, r6, #0\n\t"
  83400. "adc r7, r7, #0\n\t"
  83401. "lsr r9, r12, #16\n\t"
  83402. "mul r8, r9, r8\n\t"
  83403. "lsr r9, r8, #16\n\t"
  83404. "lsl r8, r8, #16\n\t"
  83405. "adds r5, r5, r8\n\t"
  83406. "adcs r6, r6, r9\n\t"
  83407. "adc r7, r7, #0\n\t"
  83408. "lsr r8, r10, #16\n\t"
  83409. "lsr r9, r12, #16\n\t"
  83410. "mul r9, r8, r9\n\t"
  83411. "adds r6, r6, r9\n\t"
  83412. "adc r7, r7, #0\n\t"
  83413. "lsl r9, r12, #16\n\t"
  83414. "lsr r9, r9, #16\n\t"
  83415. "mul r8, r9, r8\n\t"
  83416. "lsr r9, r8, #16\n\t"
  83417. "lsl r8, r8, #16\n\t"
  83418. "adds r5, r5, r8\n\t"
  83419. "adcs r6, r6, r9\n\t"
  83420. "adc r7, r7, #0\n\t"
  83421. #else
  83422. "umull r8, r9, r10, r12\n\t"
  83423. "adds r5, r5, r8\n\t"
  83424. "adcs r6, r6, r9\n\t"
  83425. "adc r7, r7, #0\n\t"
  83426. #endif
  83427. /* A[2] * A[8] */
  83428. "ldr r10, [%[a], #32]\n\t"
  83429. "ldr r12, [%[a], #8]\n\t"
  83430. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83431. "lsl r8, r10, #16\n\t"
  83432. "lsl r9, r12, #16\n\t"
  83433. "lsr r8, r8, #16\n\t"
  83434. "lsr r9, r9, #16\n\t"
  83435. "mul r9, r8, r9\n\t"
  83436. "adds r5, r5, r9\n\t"
  83437. "adcs r6, r6, #0\n\t"
  83438. "adc r7, r7, #0\n\t"
  83439. "lsr r9, r12, #16\n\t"
  83440. "mul r8, r9, r8\n\t"
  83441. "lsr r9, r8, #16\n\t"
  83442. "lsl r8, r8, #16\n\t"
  83443. "adds r5, r5, r8\n\t"
  83444. "adcs r6, r6, r9\n\t"
  83445. "adc r7, r7, #0\n\t"
  83446. "lsr r8, r10, #16\n\t"
  83447. "lsr r9, r12, #16\n\t"
  83448. "mul r9, r8, r9\n\t"
  83449. "adds r6, r6, r9\n\t"
  83450. "adc r7, r7, #0\n\t"
  83451. "lsl r9, r12, #16\n\t"
  83452. "lsr r9, r9, #16\n\t"
  83453. "mul r8, r9, r8\n\t"
  83454. "lsr r9, r8, #16\n\t"
  83455. "lsl r8, r8, #16\n\t"
  83456. "adds r5, r5, r8\n\t"
  83457. "adcs r6, r6, r9\n\t"
  83458. "adc r7, r7, #0\n\t"
  83459. #else
  83460. "umull r8, r9, r10, r12\n\t"
  83461. "adds r5, r5, r8\n\t"
  83462. "adcs r6, r6, r9\n\t"
  83463. "adc r7, r7, #0\n\t"
  83464. #endif
  83465. /* A[3] * A[7] */
  83466. "ldr r10, [%[a], #28]\n\t"
  83467. "ldr r12, [%[a], #12]\n\t"
  83468. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83469. "lsl r8, r10, #16\n\t"
  83470. "lsl r9, r12, #16\n\t"
  83471. "lsr r8, r8, #16\n\t"
  83472. "lsr r9, r9, #16\n\t"
  83473. "mul r9, r8, r9\n\t"
  83474. "adds r5, r5, r9\n\t"
  83475. "adcs r6, r6, #0\n\t"
  83476. "adc r7, r7, #0\n\t"
  83477. "lsr r9, r12, #16\n\t"
  83478. "mul r8, r9, r8\n\t"
  83479. "lsr r9, r8, #16\n\t"
  83480. "lsl r8, r8, #16\n\t"
  83481. "adds r5, r5, r8\n\t"
  83482. "adcs r6, r6, r9\n\t"
  83483. "adc r7, r7, #0\n\t"
  83484. "lsr r8, r10, #16\n\t"
  83485. "lsr r9, r12, #16\n\t"
  83486. "mul r9, r8, r9\n\t"
  83487. "adds r6, r6, r9\n\t"
  83488. "adc r7, r7, #0\n\t"
  83489. "lsl r9, r12, #16\n\t"
  83490. "lsr r9, r9, #16\n\t"
  83491. "mul r8, r9, r8\n\t"
  83492. "lsr r9, r8, #16\n\t"
  83493. "lsl r8, r8, #16\n\t"
  83494. "adds r5, r5, r8\n\t"
  83495. "adcs r6, r6, r9\n\t"
  83496. "adc r7, r7, #0\n\t"
  83497. #else
  83498. "umull r8, r9, r10, r12\n\t"
  83499. "adds r5, r5, r8\n\t"
  83500. "adcs r6, r6, r9\n\t"
  83501. "adc r7, r7, #0\n\t"
  83502. #endif
  83503. /* A[4] * A[6] */
  83504. "ldr r10, [%[a], #24]\n\t"
  83505. "ldr r12, [%[a], #16]\n\t"
  83506. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83507. "lsl r8, r10, #16\n\t"
  83508. "lsl r9, r12, #16\n\t"
  83509. "lsr r8, r8, #16\n\t"
  83510. "lsr r9, r9, #16\n\t"
  83511. "mul r9, r8, r9\n\t"
  83512. "adds r5, r5, r9\n\t"
  83513. "adcs r6, r6, #0\n\t"
  83514. "adc r7, r7, #0\n\t"
  83515. "lsr r9, r12, #16\n\t"
  83516. "mul r8, r9, r8\n\t"
  83517. "lsr r9, r8, #16\n\t"
  83518. "lsl r8, r8, #16\n\t"
  83519. "adds r5, r5, r8\n\t"
  83520. "adcs r6, r6, r9\n\t"
  83521. "adc r7, r7, #0\n\t"
  83522. "lsr r8, r10, #16\n\t"
  83523. "lsr r9, r12, #16\n\t"
  83524. "mul r9, r8, r9\n\t"
  83525. "adds r6, r6, r9\n\t"
  83526. "adc r7, r7, #0\n\t"
  83527. "lsl r9, r12, #16\n\t"
  83528. "lsr r9, r9, #16\n\t"
  83529. "mul r8, r9, r8\n\t"
  83530. "lsr r9, r8, #16\n\t"
  83531. "lsl r8, r8, #16\n\t"
  83532. "adds r5, r5, r8\n\t"
  83533. "adcs r6, r6, r9\n\t"
  83534. "adc r7, r7, #0\n\t"
  83535. #else
  83536. "umull r8, r9, r10, r12\n\t"
  83537. "adds r5, r5, r8\n\t"
  83538. "adcs r6, r6, r9\n\t"
  83539. "adc r7, r7, #0\n\t"
  83540. #endif
  83541. /* A[5] * A[5] */
  83542. "ldr r10, [%[a], #20]\n\t"
  83543. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83544. "lsl r8, r10, #16\n\t"
  83545. "lsr r9, r10, #16\n\t"
  83546. "lsr r8, r8, #16\n\t"
  83547. "mov r12, r8\n\t"
  83548. "mul r8, r12, r8\n\t"
  83549. "mov r12, r9\n\t"
  83550. "mul r9, r12, r9\n\t"
  83551. "adds r3, r3, r8\n\t"
  83552. "adcs r4, r4, r9\n\t"
  83553. "adc r2, r2, #0\n\t"
  83554. "lsr r9, r10, #16\n\t"
  83555. "lsl r8, r10, #16\n\t"
  83556. "lsr r8, r8, #16\n\t"
  83557. "mul r8, r9, r8\n\t"
  83558. "lsr r9, r8, #15\n\t"
  83559. "lsl r8, r8, #17\n\t"
  83560. "adds r3, r3, r8\n\t"
  83561. "adcs r4, r4, r9\n\t"
  83562. "adc r2, r2, #0\n\t"
  83563. "adds r5, r5, r5\n\t"
  83564. "adcs r6, r6, r6\n\t"
  83565. "adc r7, r7, r7\n\t"
  83566. #else
  83567. "umull r8, r9, r10, r10\n\t"
  83568. "adds r5, r5, r5\n\t"
  83569. "adcs r6, r6, r6\n\t"
  83570. "adc r7, r7, r7\n\t"
  83571. "adds r3, r3, r8\n\t"
  83572. "adcs r4, r4, r9\n\t"
  83573. "adc r2, r2, #0\n\t"
  83574. #endif
  83575. "adds r3, r3, r5\n\t"
  83576. "adcs r4, r4, r6\n\t"
  83577. "adc r2, r2, r7\n\t"
  83578. "str r3, [sp, #40]\n\t"
  83579. /* A[0] * A[11] */
  83580. "ldr r10, [%[a], #44]\n\t"
  83581. "ldr r12, [%[a]]\n\t"
  83582. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83583. "lsl r8, r10, #16\n\t"
  83584. "lsl r5, r12, #16\n\t"
  83585. "lsr r8, r8, #16\n\t"
  83586. "lsr r5, r5, #16\n\t"
  83587. "mul r5, r8, r5\n\t"
  83588. "lsr r9, r12, #16\n\t"
  83589. "mul r8, r9, r8\n\t"
  83590. "lsr r6, r8, #16\n\t"
  83591. "lsl r8, r8, #16\n\t"
  83592. "adds r5, r5, r8\n\t"
  83593. "adc r6, r6, #0\n\t"
  83594. "lsr r8, r10, #16\n\t"
  83595. "mul r9, r8, r9\n\t"
  83596. "add r6, r6, r9\n\t"
  83597. "lsl r9, r12, #16\n\t"
  83598. "lsr r9, r9, #16\n\t"
  83599. "mul r8, r9, r8\n\t"
  83600. "lsr r9, r8, #16\n\t"
  83601. "lsl r8, r8, #16\n\t"
  83602. "adds r5, r5, r8\n\t"
  83603. "adc r6, r6, r9\n\t"
  83604. #else
  83605. "umull r5, r6, r10, r12\n\t"
  83606. #endif
  83607. "mov r3, #0\n\t"
  83608. "mov r7, #0\n\t"
  83609. /* A[1] * A[10] */
  83610. "ldr r10, [%[a], #40]\n\t"
  83611. "ldr r12, [%[a], #4]\n\t"
  83612. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83613. "lsl r8, r10, #16\n\t"
  83614. "lsl r9, r12, #16\n\t"
  83615. "lsr r8, r8, #16\n\t"
  83616. "lsr r9, r9, #16\n\t"
  83617. "mul r9, r8, r9\n\t"
  83618. "adds r5, r5, r9\n\t"
  83619. "adcs r6, r6, #0\n\t"
  83620. "adc r7, r7, #0\n\t"
  83621. "lsr r9, r12, #16\n\t"
  83622. "mul r8, r9, r8\n\t"
  83623. "lsr r9, r8, #16\n\t"
  83624. "lsl r8, r8, #16\n\t"
  83625. "adds r5, r5, r8\n\t"
  83626. "adcs r6, r6, r9\n\t"
  83627. "adc r7, r7, #0\n\t"
  83628. "lsr r8, r10, #16\n\t"
  83629. "lsr r9, r12, #16\n\t"
  83630. "mul r9, r8, r9\n\t"
  83631. "adds r6, r6, r9\n\t"
  83632. "adc r7, r7, #0\n\t"
  83633. "lsl r9, r12, #16\n\t"
  83634. "lsr r9, r9, #16\n\t"
  83635. "mul r8, r9, r8\n\t"
  83636. "lsr r9, r8, #16\n\t"
  83637. "lsl r8, r8, #16\n\t"
  83638. "adds r5, r5, r8\n\t"
  83639. "adcs r6, r6, r9\n\t"
  83640. "adc r7, r7, #0\n\t"
  83641. #else
  83642. "umull r8, r9, r10, r12\n\t"
  83643. "adds r5, r5, r8\n\t"
  83644. "adcs r6, r6, r9\n\t"
  83645. "adc r7, r7, #0\n\t"
  83646. #endif
  83647. /* A[2] * A[9] */
  83648. "ldr r10, [%[a], #36]\n\t"
  83649. "ldr r12, [%[a], #8]\n\t"
  83650. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83651. "lsl r8, r10, #16\n\t"
  83652. "lsl r9, r12, #16\n\t"
  83653. "lsr r8, r8, #16\n\t"
  83654. "lsr r9, r9, #16\n\t"
  83655. "mul r9, r8, r9\n\t"
  83656. "adds r5, r5, r9\n\t"
  83657. "adcs r6, r6, #0\n\t"
  83658. "adc r7, r7, #0\n\t"
  83659. "lsr r9, r12, #16\n\t"
  83660. "mul r8, r9, r8\n\t"
  83661. "lsr r9, r8, #16\n\t"
  83662. "lsl r8, r8, #16\n\t"
  83663. "adds r5, r5, r8\n\t"
  83664. "adcs r6, r6, r9\n\t"
  83665. "adc r7, r7, #0\n\t"
  83666. "lsr r8, r10, #16\n\t"
  83667. "lsr r9, r12, #16\n\t"
  83668. "mul r9, r8, r9\n\t"
  83669. "adds r6, r6, r9\n\t"
  83670. "adc r7, r7, #0\n\t"
  83671. "lsl r9, r12, #16\n\t"
  83672. "lsr r9, r9, #16\n\t"
  83673. "mul r8, r9, r8\n\t"
  83674. "lsr r9, r8, #16\n\t"
  83675. "lsl r8, r8, #16\n\t"
  83676. "adds r5, r5, r8\n\t"
  83677. "adcs r6, r6, r9\n\t"
  83678. "adc r7, r7, #0\n\t"
  83679. #else
  83680. "umull r8, r9, r10, r12\n\t"
  83681. "adds r5, r5, r8\n\t"
  83682. "adcs r6, r6, r9\n\t"
  83683. "adc r7, r7, #0\n\t"
  83684. #endif
  83685. /* A[3] * A[8] */
  83686. "ldr r10, [%[a], #32]\n\t"
  83687. "ldr r12, [%[a], #12]\n\t"
  83688. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83689. "lsl r8, r10, #16\n\t"
  83690. "lsl r9, r12, #16\n\t"
  83691. "lsr r8, r8, #16\n\t"
  83692. "lsr r9, r9, #16\n\t"
  83693. "mul r9, r8, r9\n\t"
  83694. "adds r5, r5, r9\n\t"
  83695. "adcs r6, r6, #0\n\t"
  83696. "adc r7, r7, #0\n\t"
  83697. "lsr r9, r12, #16\n\t"
  83698. "mul r8, r9, r8\n\t"
  83699. "lsr r9, r8, #16\n\t"
  83700. "lsl r8, r8, #16\n\t"
  83701. "adds r5, r5, r8\n\t"
  83702. "adcs r6, r6, r9\n\t"
  83703. "adc r7, r7, #0\n\t"
  83704. "lsr r8, r10, #16\n\t"
  83705. "lsr r9, r12, #16\n\t"
  83706. "mul r9, r8, r9\n\t"
  83707. "adds r6, r6, r9\n\t"
  83708. "adc r7, r7, #0\n\t"
  83709. "lsl r9, r12, #16\n\t"
  83710. "lsr r9, r9, #16\n\t"
  83711. "mul r8, r9, r8\n\t"
  83712. "lsr r9, r8, #16\n\t"
  83713. "lsl r8, r8, #16\n\t"
  83714. "adds r5, r5, r8\n\t"
  83715. "adcs r6, r6, r9\n\t"
  83716. "adc r7, r7, #0\n\t"
  83717. #else
  83718. "umull r8, r9, r10, r12\n\t"
  83719. "adds r5, r5, r8\n\t"
  83720. "adcs r6, r6, r9\n\t"
  83721. "adc r7, r7, #0\n\t"
  83722. #endif
  83723. /* A[4] * A[7] */
  83724. "ldr r10, [%[a], #28]\n\t"
  83725. "ldr r12, [%[a], #16]\n\t"
  83726. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83727. "lsl r8, r10, #16\n\t"
  83728. "lsl r9, r12, #16\n\t"
  83729. "lsr r8, r8, #16\n\t"
  83730. "lsr r9, r9, #16\n\t"
  83731. "mul r9, r8, r9\n\t"
  83732. "adds r5, r5, r9\n\t"
  83733. "adcs r6, r6, #0\n\t"
  83734. "adc r7, r7, #0\n\t"
  83735. "lsr r9, r12, #16\n\t"
  83736. "mul r8, r9, r8\n\t"
  83737. "lsr r9, r8, #16\n\t"
  83738. "lsl r8, r8, #16\n\t"
  83739. "adds r5, r5, r8\n\t"
  83740. "adcs r6, r6, r9\n\t"
  83741. "adc r7, r7, #0\n\t"
  83742. "lsr r8, r10, #16\n\t"
  83743. "lsr r9, r12, #16\n\t"
  83744. "mul r9, r8, r9\n\t"
  83745. "adds r6, r6, r9\n\t"
  83746. "adc r7, r7, #0\n\t"
  83747. "lsl r9, r12, #16\n\t"
  83748. "lsr r9, r9, #16\n\t"
  83749. "mul r8, r9, r8\n\t"
  83750. "lsr r9, r8, #16\n\t"
  83751. "lsl r8, r8, #16\n\t"
  83752. "adds r5, r5, r8\n\t"
  83753. "adcs r6, r6, r9\n\t"
  83754. "adc r7, r7, #0\n\t"
  83755. #else
  83756. "umull r8, r9, r10, r12\n\t"
  83757. "adds r5, r5, r8\n\t"
  83758. "adcs r6, r6, r9\n\t"
  83759. "adc r7, r7, #0\n\t"
  83760. #endif
  83761. /* A[5] * A[6] */
  83762. "ldr r10, [%[a], #24]\n\t"
  83763. "ldr r12, [%[a], #20]\n\t"
  83764. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83765. "lsl r8, r10, #16\n\t"
  83766. "lsl r9, r12, #16\n\t"
  83767. "lsr r8, r8, #16\n\t"
  83768. "lsr r9, r9, #16\n\t"
  83769. "mul r9, r8, r9\n\t"
  83770. "adds r5, r5, r9\n\t"
  83771. "adcs r6, r6, #0\n\t"
  83772. "adc r7, r7, #0\n\t"
  83773. "lsr r9, r12, #16\n\t"
  83774. "mul r8, r9, r8\n\t"
  83775. "lsr r9, r8, #16\n\t"
  83776. "lsl r8, r8, #16\n\t"
  83777. "adds r5, r5, r8\n\t"
  83778. "adcs r6, r6, r9\n\t"
  83779. "adc r7, r7, #0\n\t"
  83780. "lsr r8, r10, #16\n\t"
  83781. "lsr r9, r12, #16\n\t"
  83782. "mul r9, r8, r9\n\t"
  83783. "adds r6, r6, r9\n\t"
  83784. "adc r7, r7, #0\n\t"
  83785. "lsl r9, r12, #16\n\t"
  83786. "lsr r9, r9, #16\n\t"
  83787. "mul r8, r9, r8\n\t"
  83788. "lsr r9, r8, #16\n\t"
  83789. "lsl r8, r8, #16\n\t"
  83790. "adds r5, r5, r8\n\t"
  83791. "adcs r6, r6, r9\n\t"
  83792. "adc r7, r7, #0\n\t"
  83793. #else
  83794. "umull r8, r9, r10, r12\n\t"
  83795. "adds r5, r5, r8\n\t"
  83796. "adcs r6, r6, r9\n\t"
  83797. "adc r7, r7, #0\n\t"
  83798. #endif
  83799. "adds r5, r5, r5\n\t"
  83800. "adcs r6, r6, r6\n\t"
  83801. "adc r7, r7, r7\n\t"
  83802. "adds r4, r4, r5\n\t"
  83803. "adcs r2, r2, r6\n\t"
  83804. "adc r3, r3, r7\n\t"
  83805. "str r4, [sp, #44]\n\t"
  83806. /* A[1] * A[11] */
  83807. "ldr r10, [%[a], #44]\n\t"
  83808. "ldr r12, [%[a], #4]\n\t"
  83809. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83810. "lsl r8, r10, #16\n\t"
  83811. "lsl r5, r12, #16\n\t"
  83812. "lsr r8, r8, #16\n\t"
  83813. "lsr r5, r5, #16\n\t"
  83814. "mul r5, r8, r5\n\t"
  83815. "lsr r9, r12, #16\n\t"
  83816. "mul r8, r9, r8\n\t"
  83817. "lsr r6, r8, #16\n\t"
  83818. "lsl r8, r8, #16\n\t"
  83819. "adds r5, r5, r8\n\t"
  83820. "adc r6, r6, #0\n\t"
  83821. "lsr r8, r10, #16\n\t"
  83822. "mul r9, r8, r9\n\t"
  83823. "add r6, r6, r9\n\t"
  83824. "lsl r9, r12, #16\n\t"
  83825. "lsr r9, r9, #16\n\t"
  83826. "mul r8, r9, r8\n\t"
  83827. "lsr r9, r8, #16\n\t"
  83828. "lsl r8, r8, #16\n\t"
  83829. "adds r5, r5, r8\n\t"
  83830. "adc r6, r6, r9\n\t"
  83831. #else
  83832. "umull r5, r6, r10, r12\n\t"
  83833. #endif
  83834. "mov r4, #0\n\t"
  83835. "mov r7, #0\n\t"
  83836. /* A[2] * A[10] */
  83837. "ldr r10, [%[a], #40]\n\t"
  83838. "ldr r12, [%[a], #8]\n\t"
  83839. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83840. "lsl r8, r10, #16\n\t"
  83841. "lsl r9, r12, #16\n\t"
  83842. "lsr r8, r8, #16\n\t"
  83843. "lsr r9, r9, #16\n\t"
  83844. "mul r9, r8, r9\n\t"
  83845. "adds r5, r5, r9\n\t"
  83846. "adcs r6, r6, #0\n\t"
  83847. "adc r7, r7, #0\n\t"
  83848. "lsr r9, r12, #16\n\t"
  83849. "mul r8, r9, r8\n\t"
  83850. "lsr r9, r8, #16\n\t"
  83851. "lsl r8, r8, #16\n\t"
  83852. "adds r5, r5, r8\n\t"
  83853. "adcs r6, r6, r9\n\t"
  83854. "adc r7, r7, #0\n\t"
  83855. "lsr r8, r10, #16\n\t"
  83856. "lsr r9, r12, #16\n\t"
  83857. "mul r9, r8, r9\n\t"
  83858. "adds r6, r6, r9\n\t"
  83859. "adc r7, r7, #0\n\t"
  83860. "lsl r9, r12, #16\n\t"
  83861. "lsr r9, r9, #16\n\t"
  83862. "mul r8, r9, r8\n\t"
  83863. "lsr r9, r8, #16\n\t"
  83864. "lsl r8, r8, #16\n\t"
  83865. "adds r5, r5, r8\n\t"
  83866. "adcs r6, r6, r9\n\t"
  83867. "adc r7, r7, #0\n\t"
  83868. #else
  83869. "umull r8, r9, r10, r12\n\t"
  83870. "adds r5, r5, r8\n\t"
  83871. "adcs r6, r6, r9\n\t"
  83872. "adc r7, r7, #0\n\t"
  83873. #endif
  83874. /* A[3] * A[9] */
  83875. "ldr r10, [%[a], #36]\n\t"
  83876. "ldr r12, [%[a], #12]\n\t"
  83877. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83878. "lsl r8, r10, #16\n\t"
  83879. "lsl r9, r12, #16\n\t"
  83880. "lsr r8, r8, #16\n\t"
  83881. "lsr r9, r9, #16\n\t"
  83882. "mul r9, r8, r9\n\t"
  83883. "adds r5, r5, r9\n\t"
  83884. "adcs r6, r6, #0\n\t"
  83885. "adc r7, r7, #0\n\t"
  83886. "lsr r9, r12, #16\n\t"
  83887. "mul r8, r9, r8\n\t"
  83888. "lsr r9, r8, #16\n\t"
  83889. "lsl r8, r8, #16\n\t"
  83890. "adds r5, r5, r8\n\t"
  83891. "adcs r6, r6, r9\n\t"
  83892. "adc r7, r7, #0\n\t"
  83893. "lsr r8, r10, #16\n\t"
  83894. "lsr r9, r12, #16\n\t"
  83895. "mul r9, r8, r9\n\t"
  83896. "adds r6, r6, r9\n\t"
  83897. "adc r7, r7, #0\n\t"
  83898. "lsl r9, r12, #16\n\t"
  83899. "lsr r9, r9, #16\n\t"
  83900. "mul r8, r9, r8\n\t"
  83901. "lsr r9, r8, #16\n\t"
  83902. "lsl r8, r8, #16\n\t"
  83903. "adds r5, r5, r8\n\t"
  83904. "adcs r6, r6, r9\n\t"
  83905. "adc r7, r7, #0\n\t"
  83906. #else
  83907. "umull r8, r9, r10, r12\n\t"
  83908. "adds r5, r5, r8\n\t"
  83909. "adcs r6, r6, r9\n\t"
  83910. "adc r7, r7, #0\n\t"
  83911. #endif
  83912. /* A[4] * A[8] */
  83913. "ldr r10, [%[a], #32]\n\t"
  83914. "ldr r12, [%[a], #16]\n\t"
  83915. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83916. "lsl r8, r10, #16\n\t"
  83917. "lsl r9, r12, #16\n\t"
  83918. "lsr r8, r8, #16\n\t"
  83919. "lsr r9, r9, #16\n\t"
  83920. "mul r9, r8, r9\n\t"
  83921. "adds r5, r5, r9\n\t"
  83922. "adcs r6, r6, #0\n\t"
  83923. "adc r7, r7, #0\n\t"
  83924. "lsr r9, r12, #16\n\t"
  83925. "mul r8, r9, r8\n\t"
  83926. "lsr r9, r8, #16\n\t"
  83927. "lsl r8, r8, #16\n\t"
  83928. "adds r5, r5, r8\n\t"
  83929. "adcs r6, r6, r9\n\t"
  83930. "adc r7, r7, #0\n\t"
  83931. "lsr r8, r10, #16\n\t"
  83932. "lsr r9, r12, #16\n\t"
  83933. "mul r9, r8, r9\n\t"
  83934. "adds r6, r6, r9\n\t"
  83935. "adc r7, r7, #0\n\t"
  83936. "lsl r9, r12, #16\n\t"
  83937. "lsr r9, r9, #16\n\t"
  83938. "mul r8, r9, r8\n\t"
  83939. "lsr r9, r8, #16\n\t"
  83940. "lsl r8, r8, #16\n\t"
  83941. "adds r5, r5, r8\n\t"
  83942. "adcs r6, r6, r9\n\t"
  83943. "adc r7, r7, #0\n\t"
  83944. #else
  83945. "umull r8, r9, r10, r12\n\t"
  83946. "adds r5, r5, r8\n\t"
  83947. "adcs r6, r6, r9\n\t"
  83948. "adc r7, r7, #0\n\t"
  83949. #endif
  83950. /* A[5] * A[7] */
  83951. "ldr r10, [%[a], #28]\n\t"
  83952. "ldr r12, [%[a], #20]\n\t"
  83953. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83954. "lsl r8, r10, #16\n\t"
  83955. "lsl r9, r12, #16\n\t"
  83956. "lsr r8, r8, #16\n\t"
  83957. "lsr r9, r9, #16\n\t"
  83958. "mul r9, r8, r9\n\t"
  83959. "adds r5, r5, r9\n\t"
  83960. "adcs r6, r6, #0\n\t"
  83961. "adc r7, r7, #0\n\t"
  83962. "lsr r9, r12, #16\n\t"
  83963. "mul r8, r9, r8\n\t"
  83964. "lsr r9, r8, #16\n\t"
  83965. "lsl r8, r8, #16\n\t"
  83966. "adds r5, r5, r8\n\t"
  83967. "adcs r6, r6, r9\n\t"
  83968. "adc r7, r7, #0\n\t"
  83969. "lsr r8, r10, #16\n\t"
  83970. "lsr r9, r12, #16\n\t"
  83971. "mul r9, r8, r9\n\t"
  83972. "adds r6, r6, r9\n\t"
  83973. "adc r7, r7, #0\n\t"
  83974. "lsl r9, r12, #16\n\t"
  83975. "lsr r9, r9, #16\n\t"
  83976. "mul r8, r9, r8\n\t"
  83977. "lsr r9, r8, #16\n\t"
  83978. "lsl r8, r8, #16\n\t"
  83979. "adds r5, r5, r8\n\t"
  83980. "adcs r6, r6, r9\n\t"
  83981. "adc r7, r7, #0\n\t"
  83982. #else
  83983. "umull r8, r9, r10, r12\n\t"
  83984. "adds r5, r5, r8\n\t"
  83985. "adcs r6, r6, r9\n\t"
  83986. "adc r7, r7, #0\n\t"
  83987. #endif
  83988. /* A[6] * A[6] */
  83989. "ldr r10, [%[a], #24]\n\t"
  83990. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  83991. "lsl r8, r10, #16\n\t"
  83992. "lsr r9, r10, #16\n\t"
  83993. "lsr r8, r8, #16\n\t"
  83994. "mov r12, r8\n\t"
  83995. "mul r8, r12, r8\n\t"
  83996. "mov r12, r9\n\t"
  83997. "mul r9, r12, r9\n\t"
  83998. "adds r2, r2, r8\n\t"
  83999. "adcs r3, r3, r9\n\t"
  84000. "adc r4, r4, #0\n\t"
  84001. "lsr r9, r10, #16\n\t"
  84002. "lsl r8, r10, #16\n\t"
  84003. "lsr r8, r8, #16\n\t"
  84004. "mul r8, r9, r8\n\t"
  84005. "lsr r9, r8, #15\n\t"
  84006. "lsl r8, r8, #17\n\t"
  84007. "adds r2, r2, r8\n\t"
  84008. "adcs r3, r3, r9\n\t"
  84009. "adc r4, r4, #0\n\t"
  84010. "adds r5, r5, r5\n\t"
  84011. "adcs r6, r6, r6\n\t"
  84012. "adc r7, r7, r7\n\t"
  84013. #else
  84014. "umull r8, r9, r10, r10\n\t"
  84015. "adds r5, r5, r5\n\t"
  84016. "adcs r6, r6, r6\n\t"
  84017. "adc r7, r7, r7\n\t"
  84018. "adds r2, r2, r8\n\t"
  84019. "adcs r3, r3, r9\n\t"
  84020. "adc r4, r4, #0\n\t"
  84021. #endif
  84022. "adds r2, r2, r5\n\t"
  84023. "adcs r3, r3, r6\n\t"
  84024. "adc r4, r4, r7\n\t"
  84025. "str r2, [%[r], #48]\n\t"
  84026. /* A[2] * A[11] */
  84027. "ldr r10, [%[a], #44]\n\t"
  84028. "ldr r12, [%[a], #8]\n\t"
  84029. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84030. "lsl r8, r10, #16\n\t"
  84031. "lsl r5, r12, #16\n\t"
  84032. "lsr r8, r8, #16\n\t"
  84033. "lsr r5, r5, #16\n\t"
  84034. "mul r5, r8, r5\n\t"
  84035. "lsr r9, r12, #16\n\t"
  84036. "mul r8, r9, r8\n\t"
  84037. "lsr r6, r8, #16\n\t"
  84038. "lsl r8, r8, #16\n\t"
  84039. "adds r5, r5, r8\n\t"
  84040. "adc r6, r6, #0\n\t"
  84041. "lsr r8, r10, #16\n\t"
  84042. "mul r9, r8, r9\n\t"
  84043. "add r6, r6, r9\n\t"
  84044. "lsl r9, r12, #16\n\t"
  84045. "lsr r9, r9, #16\n\t"
  84046. "mul r8, r9, r8\n\t"
  84047. "lsr r9, r8, #16\n\t"
  84048. "lsl r8, r8, #16\n\t"
  84049. "adds r5, r5, r8\n\t"
  84050. "adc r6, r6, r9\n\t"
  84051. #else
  84052. "umull r5, r6, r10, r12\n\t"
  84053. #endif
  84054. "mov r2, #0\n\t"
  84055. "mov r7, #0\n\t"
  84056. /* A[3] * A[10] */
  84057. "ldr r10, [%[a], #40]\n\t"
  84058. "ldr r12, [%[a], #12]\n\t"
  84059. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84060. "lsl r8, r10, #16\n\t"
  84061. "lsl r9, r12, #16\n\t"
  84062. "lsr r8, r8, #16\n\t"
  84063. "lsr r9, r9, #16\n\t"
  84064. "mul r9, r8, r9\n\t"
  84065. "adds r5, r5, r9\n\t"
  84066. "adcs r6, r6, #0\n\t"
  84067. "adc r7, r7, #0\n\t"
  84068. "lsr r9, r12, #16\n\t"
  84069. "mul r8, r9, r8\n\t"
  84070. "lsr r9, r8, #16\n\t"
  84071. "lsl r8, r8, #16\n\t"
  84072. "adds r5, r5, r8\n\t"
  84073. "adcs r6, r6, r9\n\t"
  84074. "adc r7, r7, #0\n\t"
  84075. "lsr r8, r10, #16\n\t"
  84076. "lsr r9, r12, #16\n\t"
  84077. "mul r9, r8, r9\n\t"
  84078. "adds r6, r6, r9\n\t"
  84079. "adc r7, r7, #0\n\t"
  84080. "lsl r9, r12, #16\n\t"
  84081. "lsr r9, r9, #16\n\t"
  84082. "mul r8, r9, r8\n\t"
  84083. "lsr r9, r8, #16\n\t"
  84084. "lsl r8, r8, #16\n\t"
  84085. "adds r5, r5, r8\n\t"
  84086. "adcs r6, r6, r9\n\t"
  84087. "adc r7, r7, #0\n\t"
  84088. #else
  84089. "umull r8, r9, r10, r12\n\t"
  84090. "adds r5, r5, r8\n\t"
  84091. "adcs r6, r6, r9\n\t"
  84092. "adc r7, r7, #0\n\t"
  84093. #endif
  84094. /* A[4] * A[9] */
  84095. "ldr r10, [%[a], #36]\n\t"
  84096. "ldr r12, [%[a], #16]\n\t"
  84097. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84098. "lsl r8, r10, #16\n\t"
  84099. "lsl r9, r12, #16\n\t"
  84100. "lsr r8, r8, #16\n\t"
  84101. "lsr r9, r9, #16\n\t"
  84102. "mul r9, r8, r9\n\t"
  84103. "adds r5, r5, r9\n\t"
  84104. "adcs r6, r6, #0\n\t"
  84105. "adc r7, r7, #0\n\t"
  84106. "lsr r9, r12, #16\n\t"
  84107. "mul r8, r9, r8\n\t"
  84108. "lsr r9, r8, #16\n\t"
  84109. "lsl r8, r8, #16\n\t"
  84110. "adds r5, r5, r8\n\t"
  84111. "adcs r6, r6, r9\n\t"
  84112. "adc r7, r7, #0\n\t"
  84113. "lsr r8, r10, #16\n\t"
  84114. "lsr r9, r12, #16\n\t"
  84115. "mul r9, r8, r9\n\t"
  84116. "adds r6, r6, r9\n\t"
  84117. "adc r7, r7, #0\n\t"
  84118. "lsl r9, r12, #16\n\t"
  84119. "lsr r9, r9, #16\n\t"
  84120. "mul r8, r9, r8\n\t"
  84121. "lsr r9, r8, #16\n\t"
  84122. "lsl r8, r8, #16\n\t"
  84123. "adds r5, r5, r8\n\t"
  84124. "adcs r6, r6, r9\n\t"
  84125. "adc r7, r7, #0\n\t"
  84126. #else
  84127. "umull r8, r9, r10, r12\n\t"
  84128. "adds r5, r5, r8\n\t"
  84129. "adcs r6, r6, r9\n\t"
  84130. "adc r7, r7, #0\n\t"
  84131. #endif
  84132. /* A[5] * A[8] */
  84133. "ldr r10, [%[a], #32]\n\t"
  84134. "ldr r12, [%[a], #20]\n\t"
  84135. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84136. "lsl r8, r10, #16\n\t"
  84137. "lsl r9, r12, #16\n\t"
  84138. "lsr r8, r8, #16\n\t"
  84139. "lsr r9, r9, #16\n\t"
  84140. "mul r9, r8, r9\n\t"
  84141. "adds r5, r5, r9\n\t"
  84142. "adcs r6, r6, #0\n\t"
  84143. "adc r7, r7, #0\n\t"
  84144. "lsr r9, r12, #16\n\t"
  84145. "mul r8, r9, r8\n\t"
  84146. "lsr r9, r8, #16\n\t"
  84147. "lsl r8, r8, #16\n\t"
  84148. "adds r5, r5, r8\n\t"
  84149. "adcs r6, r6, r9\n\t"
  84150. "adc r7, r7, #0\n\t"
  84151. "lsr r8, r10, #16\n\t"
  84152. "lsr r9, r12, #16\n\t"
  84153. "mul r9, r8, r9\n\t"
  84154. "adds r6, r6, r9\n\t"
  84155. "adc r7, r7, #0\n\t"
  84156. "lsl r9, r12, #16\n\t"
  84157. "lsr r9, r9, #16\n\t"
  84158. "mul r8, r9, r8\n\t"
  84159. "lsr r9, r8, #16\n\t"
  84160. "lsl r8, r8, #16\n\t"
  84161. "adds r5, r5, r8\n\t"
  84162. "adcs r6, r6, r9\n\t"
  84163. "adc r7, r7, #0\n\t"
  84164. #else
  84165. "umull r8, r9, r10, r12\n\t"
  84166. "adds r5, r5, r8\n\t"
  84167. "adcs r6, r6, r9\n\t"
  84168. "adc r7, r7, #0\n\t"
  84169. #endif
  84170. /* A[6] * A[7] */
  84171. "ldr r10, [%[a], #28]\n\t"
  84172. "ldr r12, [%[a], #24]\n\t"
  84173. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84174. "lsl r8, r10, #16\n\t"
  84175. "lsl r9, r12, #16\n\t"
  84176. "lsr r8, r8, #16\n\t"
  84177. "lsr r9, r9, #16\n\t"
  84178. "mul r9, r8, r9\n\t"
  84179. "adds r5, r5, r9\n\t"
  84180. "adcs r6, r6, #0\n\t"
  84181. "adc r7, r7, #0\n\t"
  84182. "lsr r9, r12, #16\n\t"
  84183. "mul r8, r9, r8\n\t"
  84184. "lsr r9, r8, #16\n\t"
  84185. "lsl r8, r8, #16\n\t"
  84186. "adds r5, r5, r8\n\t"
  84187. "adcs r6, r6, r9\n\t"
  84188. "adc r7, r7, #0\n\t"
  84189. "lsr r8, r10, #16\n\t"
  84190. "lsr r9, r12, #16\n\t"
  84191. "mul r9, r8, r9\n\t"
  84192. "adds r6, r6, r9\n\t"
  84193. "adc r7, r7, #0\n\t"
  84194. "lsl r9, r12, #16\n\t"
  84195. "lsr r9, r9, #16\n\t"
  84196. "mul r8, r9, r8\n\t"
  84197. "lsr r9, r8, #16\n\t"
  84198. "lsl r8, r8, #16\n\t"
  84199. "adds r5, r5, r8\n\t"
  84200. "adcs r6, r6, r9\n\t"
  84201. "adc r7, r7, #0\n\t"
  84202. #else
  84203. "umull r8, r9, r10, r12\n\t"
  84204. "adds r5, r5, r8\n\t"
  84205. "adcs r6, r6, r9\n\t"
  84206. "adc r7, r7, #0\n\t"
  84207. #endif
  84208. "adds r5, r5, r5\n\t"
  84209. "adcs r6, r6, r6\n\t"
  84210. "adc r7, r7, r7\n\t"
  84211. "adds r3, r3, r5\n\t"
  84212. "adcs r4, r4, r6\n\t"
  84213. "adc r2, r2, r7\n\t"
  84214. "str r3, [%[r], #52]\n\t"
  84215. /* A[3] * A[11] */
  84216. "ldr r10, [%[a], #44]\n\t"
  84217. "ldr r12, [%[a], #12]\n\t"
  84218. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84219. "lsl r8, r10, #16\n\t"
  84220. "lsl r5, r12, #16\n\t"
  84221. "lsr r8, r8, #16\n\t"
  84222. "lsr r5, r5, #16\n\t"
  84223. "mul r5, r8, r5\n\t"
  84224. "lsr r9, r12, #16\n\t"
  84225. "mul r8, r9, r8\n\t"
  84226. "lsr r6, r8, #16\n\t"
  84227. "lsl r8, r8, #16\n\t"
  84228. "adds r5, r5, r8\n\t"
  84229. "adc r6, r6, #0\n\t"
  84230. "lsr r8, r10, #16\n\t"
  84231. "mul r9, r8, r9\n\t"
  84232. "add r6, r6, r9\n\t"
  84233. "lsl r9, r12, #16\n\t"
  84234. "lsr r9, r9, #16\n\t"
  84235. "mul r8, r9, r8\n\t"
  84236. "lsr r9, r8, #16\n\t"
  84237. "lsl r8, r8, #16\n\t"
  84238. "adds r5, r5, r8\n\t"
  84239. "adc r6, r6, r9\n\t"
  84240. #else
  84241. "umull r5, r6, r10, r12\n\t"
  84242. #endif
  84243. "mov r3, #0\n\t"
  84244. "mov r7, #0\n\t"
  84245. /* A[4] * A[10] */
  84246. "ldr r10, [%[a], #40]\n\t"
  84247. "ldr r12, [%[a], #16]\n\t"
  84248. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84249. "lsl r8, r10, #16\n\t"
  84250. "lsl r9, r12, #16\n\t"
  84251. "lsr r8, r8, #16\n\t"
  84252. "lsr r9, r9, #16\n\t"
  84253. "mul r9, r8, r9\n\t"
  84254. "adds r5, r5, r9\n\t"
  84255. "adcs r6, r6, #0\n\t"
  84256. "adc r7, r7, #0\n\t"
  84257. "lsr r9, r12, #16\n\t"
  84258. "mul r8, r9, r8\n\t"
  84259. "lsr r9, r8, #16\n\t"
  84260. "lsl r8, r8, #16\n\t"
  84261. "adds r5, r5, r8\n\t"
  84262. "adcs r6, r6, r9\n\t"
  84263. "adc r7, r7, #0\n\t"
  84264. "lsr r8, r10, #16\n\t"
  84265. "lsr r9, r12, #16\n\t"
  84266. "mul r9, r8, r9\n\t"
  84267. "adds r6, r6, r9\n\t"
  84268. "adc r7, r7, #0\n\t"
  84269. "lsl r9, r12, #16\n\t"
  84270. "lsr r9, r9, #16\n\t"
  84271. "mul r8, r9, r8\n\t"
  84272. "lsr r9, r8, #16\n\t"
  84273. "lsl r8, r8, #16\n\t"
  84274. "adds r5, r5, r8\n\t"
  84275. "adcs r6, r6, r9\n\t"
  84276. "adc r7, r7, #0\n\t"
  84277. #else
  84278. "umull r8, r9, r10, r12\n\t"
  84279. "adds r5, r5, r8\n\t"
  84280. "adcs r6, r6, r9\n\t"
  84281. "adc r7, r7, #0\n\t"
  84282. #endif
  84283. /* A[5] * A[9] */
  84284. "ldr r10, [%[a], #36]\n\t"
  84285. "ldr r12, [%[a], #20]\n\t"
  84286. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84287. "lsl r8, r10, #16\n\t"
  84288. "lsl r9, r12, #16\n\t"
  84289. "lsr r8, r8, #16\n\t"
  84290. "lsr r9, r9, #16\n\t"
  84291. "mul r9, r8, r9\n\t"
  84292. "adds r5, r5, r9\n\t"
  84293. "adcs r6, r6, #0\n\t"
  84294. "adc r7, r7, #0\n\t"
  84295. "lsr r9, r12, #16\n\t"
  84296. "mul r8, r9, r8\n\t"
  84297. "lsr r9, r8, #16\n\t"
  84298. "lsl r8, r8, #16\n\t"
  84299. "adds r5, r5, r8\n\t"
  84300. "adcs r6, r6, r9\n\t"
  84301. "adc r7, r7, #0\n\t"
  84302. "lsr r8, r10, #16\n\t"
  84303. "lsr r9, r12, #16\n\t"
  84304. "mul r9, r8, r9\n\t"
  84305. "adds r6, r6, r9\n\t"
  84306. "adc r7, r7, #0\n\t"
  84307. "lsl r9, r12, #16\n\t"
  84308. "lsr r9, r9, #16\n\t"
  84309. "mul r8, r9, r8\n\t"
  84310. "lsr r9, r8, #16\n\t"
  84311. "lsl r8, r8, #16\n\t"
  84312. "adds r5, r5, r8\n\t"
  84313. "adcs r6, r6, r9\n\t"
  84314. "adc r7, r7, #0\n\t"
  84315. #else
  84316. "umull r8, r9, r10, r12\n\t"
  84317. "adds r5, r5, r8\n\t"
  84318. "adcs r6, r6, r9\n\t"
  84319. "adc r7, r7, #0\n\t"
  84320. #endif
  84321. /* A[6] * A[8] */
  84322. "ldr r10, [%[a], #32]\n\t"
  84323. "ldr r12, [%[a], #24]\n\t"
  84324. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84325. "lsl r8, r10, #16\n\t"
  84326. "lsl r9, r12, #16\n\t"
  84327. "lsr r8, r8, #16\n\t"
  84328. "lsr r9, r9, #16\n\t"
  84329. "mul r9, r8, r9\n\t"
  84330. "adds r5, r5, r9\n\t"
  84331. "adcs r6, r6, #0\n\t"
  84332. "adc r7, r7, #0\n\t"
  84333. "lsr r9, r12, #16\n\t"
  84334. "mul r8, r9, r8\n\t"
  84335. "lsr r9, r8, #16\n\t"
  84336. "lsl r8, r8, #16\n\t"
  84337. "adds r5, r5, r8\n\t"
  84338. "adcs r6, r6, r9\n\t"
  84339. "adc r7, r7, #0\n\t"
  84340. "lsr r8, r10, #16\n\t"
  84341. "lsr r9, r12, #16\n\t"
  84342. "mul r9, r8, r9\n\t"
  84343. "adds r6, r6, r9\n\t"
  84344. "adc r7, r7, #0\n\t"
  84345. "lsl r9, r12, #16\n\t"
  84346. "lsr r9, r9, #16\n\t"
  84347. "mul r8, r9, r8\n\t"
  84348. "lsr r9, r8, #16\n\t"
  84349. "lsl r8, r8, #16\n\t"
  84350. "adds r5, r5, r8\n\t"
  84351. "adcs r6, r6, r9\n\t"
  84352. "adc r7, r7, #0\n\t"
  84353. #else
  84354. "umull r8, r9, r10, r12\n\t"
  84355. "adds r5, r5, r8\n\t"
  84356. "adcs r6, r6, r9\n\t"
  84357. "adc r7, r7, #0\n\t"
  84358. #endif
  84359. /* A[7] * A[7] */
  84360. "ldr r10, [%[a], #28]\n\t"
  84361. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84362. "lsl r8, r10, #16\n\t"
  84363. "lsr r9, r10, #16\n\t"
  84364. "lsr r8, r8, #16\n\t"
  84365. "mov r12, r8\n\t"
  84366. "mul r8, r12, r8\n\t"
  84367. "mov r12, r9\n\t"
  84368. "mul r9, r12, r9\n\t"
  84369. "adds r4, r4, r8\n\t"
  84370. "adcs r2, r2, r9\n\t"
  84371. "adc r3, r3, #0\n\t"
  84372. "lsr r9, r10, #16\n\t"
  84373. "lsl r8, r10, #16\n\t"
  84374. "lsr r8, r8, #16\n\t"
  84375. "mul r8, r9, r8\n\t"
  84376. "lsr r9, r8, #15\n\t"
  84377. "lsl r8, r8, #17\n\t"
  84378. "adds r4, r4, r8\n\t"
  84379. "adcs r2, r2, r9\n\t"
  84380. "adc r3, r3, #0\n\t"
  84381. "adds r5, r5, r5\n\t"
  84382. "adcs r6, r6, r6\n\t"
  84383. "adc r7, r7, r7\n\t"
  84384. #else
  84385. "umull r8, r9, r10, r10\n\t"
  84386. "adds r5, r5, r5\n\t"
  84387. "adcs r6, r6, r6\n\t"
  84388. "adc r7, r7, r7\n\t"
  84389. "adds r4, r4, r8\n\t"
  84390. "adcs r2, r2, r9\n\t"
  84391. "adc r3, r3, #0\n\t"
  84392. #endif
  84393. "adds r4, r4, r5\n\t"
  84394. "adcs r2, r2, r6\n\t"
  84395. "adc r3, r3, r7\n\t"
  84396. "str r4, [%[r], #56]\n\t"
  84397. /* A[4] * A[11] */
  84398. "ldr r10, [%[a], #44]\n\t"
  84399. "ldr r12, [%[a], #16]\n\t"
  84400. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84401. "lsl r8, r10, #16\n\t"
  84402. "lsl r5, r12, #16\n\t"
  84403. "lsr r8, r8, #16\n\t"
  84404. "lsr r5, r5, #16\n\t"
  84405. "mul r5, r8, r5\n\t"
  84406. "lsr r9, r12, #16\n\t"
  84407. "mul r8, r9, r8\n\t"
  84408. "lsr r6, r8, #16\n\t"
  84409. "lsl r8, r8, #16\n\t"
  84410. "adds r5, r5, r8\n\t"
  84411. "adc r6, r6, #0\n\t"
  84412. "lsr r8, r10, #16\n\t"
  84413. "mul r9, r8, r9\n\t"
  84414. "add r6, r6, r9\n\t"
  84415. "lsl r9, r12, #16\n\t"
  84416. "lsr r9, r9, #16\n\t"
  84417. "mul r8, r9, r8\n\t"
  84418. "lsr r9, r8, #16\n\t"
  84419. "lsl r8, r8, #16\n\t"
  84420. "adds r5, r5, r8\n\t"
  84421. "adc r6, r6, r9\n\t"
  84422. #else
  84423. "umull r5, r6, r10, r12\n\t"
  84424. #endif
  84425. "mov r4, #0\n\t"
  84426. "mov r7, #0\n\t"
  84427. /* A[5] * A[10] */
  84428. "ldr r10, [%[a], #40]\n\t"
  84429. "ldr r12, [%[a], #20]\n\t"
  84430. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84431. "lsl r8, r10, #16\n\t"
  84432. "lsl r9, r12, #16\n\t"
  84433. "lsr r8, r8, #16\n\t"
  84434. "lsr r9, r9, #16\n\t"
  84435. "mul r9, r8, r9\n\t"
  84436. "adds r5, r5, r9\n\t"
  84437. "adcs r6, r6, #0\n\t"
  84438. "adc r7, r7, #0\n\t"
  84439. "lsr r9, r12, #16\n\t"
  84440. "mul r8, r9, r8\n\t"
  84441. "lsr r9, r8, #16\n\t"
  84442. "lsl r8, r8, #16\n\t"
  84443. "adds r5, r5, r8\n\t"
  84444. "adcs r6, r6, r9\n\t"
  84445. "adc r7, r7, #0\n\t"
  84446. "lsr r8, r10, #16\n\t"
  84447. "lsr r9, r12, #16\n\t"
  84448. "mul r9, r8, r9\n\t"
  84449. "adds r6, r6, r9\n\t"
  84450. "adc r7, r7, #0\n\t"
  84451. "lsl r9, r12, #16\n\t"
  84452. "lsr r9, r9, #16\n\t"
  84453. "mul r8, r9, r8\n\t"
  84454. "lsr r9, r8, #16\n\t"
  84455. "lsl r8, r8, #16\n\t"
  84456. "adds r5, r5, r8\n\t"
  84457. "adcs r6, r6, r9\n\t"
  84458. "adc r7, r7, #0\n\t"
  84459. #else
  84460. "umull r8, r9, r10, r12\n\t"
  84461. "adds r5, r5, r8\n\t"
  84462. "adcs r6, r6, r9\n\t"
  84463. "adc r7, r7, #0\n\t"
  84464. #endif
  84465. /* A[6] * A[9] */
  84466. "ldr r10, [%[a], #36]\n\t"
  84467. "ldr r12, [%[a], #24]\n\t"
  84468. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84469. "lsl r8, r10, #16\n\t"
  84470. "lsl r9, r12, #16\n\t"
  84471. "lsr r8, r8, #16\n\t"
  84472. "lsr r9, r9, #16\n\t"
  84473. "mul r9, r8, r9\n\t"
  84474. "adds r5, r5, r9\n\t"
  84475. "adcs r6, r6, #0\n\t"
  84476. "adc r7, r7, #0\n\t"
  84477. "lsr r9, r12, #16\n\t"
  84478. "mul r8, r9, r8\n\t"
  84479. "lsr r9, r8, #16\n\t"
  84480. "lsl r8, r8, #16\n\t"
  84481. "adds r5, r5, r8\n\t"
  84482. "adcs r6, r6, r9\n\t"
  84483. "adc r7, r7, #0\n\t"
  84484. "lsr r8, r10, #16\n\t"
  84485. "lsr r9, r12, #16\n\t"
  84486. "mul r9, r8, r9\n\t"
  84487. "adds r6, r6, r9\n\t"
  84488. "adc r7, r7, #0\n\t"
  84489. "lsl r9, r12, #16\n\t"
  84490. "lsr r9, r9, #16\n\t"
  84491. "mul r8, r9, r8\n\t"
  84492. "lsr r9, r8, #16\n\t"
  84493. "lsl r8, r8, #16\n\t"
  84494. "adds r5, r5, r8\n\t"
  84495. "adcs r6, r6, r9\n\t"
  84496. "adc r7, r7, #0\n\t"
  84497. #else
  84498. "umull r8, r9, r10, r12\n\t"
  84499. "adds r5, r5, r8\n\t"
  84500. "adcs r6, r6, r9\n\t"
  84501. "adc r7, r7, #0\n\t"
  84502. #endif
  84503. /* A[7] * A[8] */
  84504. "ldr r10, [%[a], #32]\n\t"
  84505. "ldr r12, [%[a], #28]\n\t"
  84506. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84507. "lsl r8, r10, #16\n\t"
  84508. "lsl r9, r12, #16\n\t"
  84509. "lsr r8, r8, #16\n\t"
  84510. "lsr r9, r9, #16\n\t"
  84511. "mul r9, r8, r9\n\t"
  84512. "adds r5, r5, r9\n\t"
  84513. "adcs r6, r6, #0\n\t"
  84514. "adc r7, r7, #0\n\t"
  84515. "lsr r9, r12, #16\n\t"
  84516. "mul r8, r9, r8\n\t"
  84517. "lsr r9, r8, #16\n\t"
  84518. "lsl r8, r8, #16\n\t"
  84519. "adds r5, r5, r8\n\t"
  84520. "adcs r6, r6, r9\n\t"
  84521. "adc r7, r7, #0\n\t"
  84522. "lsr r8, r10, #16\n\t"
  84523. "lsr r9, r12, #16\n\t"
  84524. "mul r9, r8, r9\n\t"
  84525. "adds r6, r6, r9\n\t"
  84526. "adc r7, r7, #0\n\t"
  84527. "lsl r9, r12, #16\n\t"
  84528. "lsr r9, r9, #16\n\t"
  84529. "mul r8, r9, r8\n\t"
  84530. "lsr r9, r8, #16\n\t"
  84531. "lsl r8, r8, #16\n\t"
  84532. "adds r5, r5, r8\n\t"
  84533. "adcs r6, r6, r9\n\t"
  84534. "adc r7, r7, #0\n\t"
  84535. #else
  84536. "umull r8, r9, r10, r12\n\t"
  84537. "adds r5, r5, r8\n\t"
  84538. "adcs r6, r6, r9\n\t"
  84539. "adc r7, r7, #0\n\t"
  84540. #endif
  84541. "adds r5, r5, r5\n\t"
  84542. "adcs r6, r6, r6\n\t"
  84543. "adc r7, r7, r7\n\t"
  84544. "adds r2, r2, r5\n\t"
  84545. "adcs r3, r3, r6\n\t"
  84546. "adc r4, r4, r7\n\t"
  84547. "str r2, [%[r], #60]\n\t"
  84548. /* A[5] * A[11] */
  84549. "ldr r10, [%[a], #44]\n\t"
  84550. "ldr r12, [%[a], #20]\n\t"
  84551. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84552. "lsl r8, r10, #16\n\t"
  84553. "lsl r5, r12, #16\n\t"
  84554. "lsr r8, r8, #16\n\t"
  84555. "lsr r5, r5, #16\n\t"
  84556. "mul r5, r8, r5\n\t"
  84557. "lsr r9, r12, #16\n\t"
  84558. "mul r8, r9, r8\n\t"
  84559. "lsr r6, r8, #16\n\t"
  84560. "lsl r8, r8, #16\n\t"
  84561. "adds r5, r5, r8\n\t"
  84562. "adc r6, r6, #0\n\t"
  84563. "lsr r8, r10, #16\n\t"
  84564. "mul r9, r8, r9\n\t"
  84565. "add r6, r6, r9\n\t"
  84566. "lsl r9, r12, #16\n\t"
  84567. "lsr r9, r9, #16\n\t"
  84568. "mul r8, r9, r8\n\t"
  84569. "lsr r9, r8, #16\n\t"
  84570. "lsl r8, r8, #16\n\t"
  84571. "adds r5, r5, r8\n\t"
  84572. "adc r6, r6, r9\n\t"
  84573. #else
  84574. "umull r5, r6, r10, r12\n\t"
  84575. #endif
  84576. "mov r2, #0\n\t"
  84577. "mov r7, #0\n\t"
  84578. /* A[6] * A[10] */
  84579. "ldr r10, [%[a], #40]\n\t"
  84580. "ldr r12, [%[a], #24]\n\t"
  84581. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84582. "lsl r8, r10, #16\n\t"
  84583. "lsl r9, r12, #16\n\t"
  84584. "lsr r8, r8, #16\n\t"
  84585. "lsr r9, r9, #16\n\t"
  84586. "mul r9, r8, r9\n\t"
  84587. "adds r5, r5, r9\n\t"
  84588. "adcs r6, r6, #0\n\t"
  84589. "adc r7, r7, #0\n\t"
  84590. "lsr r9, r12, #16\n\t"
  84591. "mul r8, r9, r8\n\t"
  84592. "lsr r9, r8, #16\n\t"
  84593. "lsl r8, r8, #16\n\t"
  84594. "adds r5, r5, r8\n\t"
  84595. "adcs r6, r6, r9\n\t"
  84596. "adc r7, r7, #0\n\t"
  84597. "lsr r8, r10, #16\n\t"
  84598. "lsr r9, r12, #16\n\t"
  84599. "mul r9, r8, r9\n\t"
  84600. "adds r6, r6, r9\n\t"
  84601. "adc r7, r7, #0\n\t"
  84602. "lsl r9, r12, #16\n\t"
  84603. "lsr r9, r9, #16\n\t"
  84604. "mul r8, r9, r8\n\t"
  84605. "lsr r9, r8, #16\n\t"
  84606. "lsl r8, r8, #16\n\t"
  84607. "adds r5, r5, r8\n\t"
  84608. "adcs r6, r6, r9\n\t"
  84609. "adc r7, r7, #0\n\t"
  84610. #else
  84611. "umull r8, r9, r10, r12\n\t"
  84612. "adds r5, r5, r8\n\t"
  84613. "adcs r6, r6, r9\n\t"
  84614. "adc r7, r7, #0\n\t"
  84615. #endif
  84616. /* A[7] * A[9] */
  84617. "ldr r10, [%[a], #36]\n\t"
  84618. "ldr r12, [%[a], #28]\n\t"
  84619. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84620. "lsl r8, r10, #16\n\t"
  84621. "lsl r9, r12, #16\n\t"
  84622. "lsr r8, r8, #16\n\t"
  84623. "lsr r9, r9, #16\n\t"
  84624. "mul r9, r8, r9\n\t"
  84625. "adds r5, r5, r9\n\t"
  84626. "adcs r6, r6, #0\n\t"
  84627. "adc r7, r7, #0\n\t"
  84628. "lsr r9, r12, #16\n\t"
  84629. "mul r8, r9, r8\n\t"
  84630. "lsr r9, r8, #16\n\t"
  84631. "lsl r8, r8, #16\n\t"
  84632. "adds r5, r5, r8\n\t"
  84633. "adcs r6, r6, r9\n\t"
  84634. "adc r7, r7, #0\n\t"
  84635. "lsr r8, r10, #16\n\t"
  84636. "lsr r9, r12, #16\n\t"
  84637. "mul r9, r8, r9\n\t"
  84638. "adds r6, r6, r9\n\t"
  84639. "adc r7, r7, #0\n\t"
  84640. "lsl r9, r12, #16\n\t"
  84641. "lsr r9, r9, #16\n\t"
  84642. "mul r8, r9, r8\n\t"
  84643. "lsr r9, r8, #16\n\t"
  84644. "lsl r8, r8, #16\n\t"
  84645. "adds r5, r5, r8\n\t"
  84646. "adcs r6, r6, r9\n\t"
  84647. "adc r7, r7, #0\n\t"
  84648. #else
  84649. "umull r8, r9, r10, r12\n\t"
  84650. "adds r5, r5, r8\n\t"
  84651. "adcs r6, r6, r9\n\t"
  84652. "adc r7, r7, #0\n\t"
  84653. #endif
  84654. /* A[8] * A[8] */
  84655. "ldr r10, [%[a], #32]\n\t"
  84656. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84657. "lsl r8, r10, #16\n\t"
  84658. "lsr r9, r10, #16\n\t"
  84659. "lsr r8, r8, #16\n\t"
  84660. "mov r12, r8\n\t"
  84661. "mul r8, r12, r8\n\t"
  84662. "mov r12, r9\n\t"
  84663. "mul r9, r12, r9\n\t"
  84664. "adds r3, r3, r8\n\t"
  84665. "adcs r4, r4, r9\n\t"
  84666. "adc r2, r2, #0\n\t"
  84667. "lsr r9, r10, #16\n\t"
  84668. "lsl r8, r10, #16\n\t"
  84669. "lsr r8, r8, #16\n\t"
  84670. "mul r8, r9, r8\n\t"
  84671. "lsr r9, r8, #15\n\t"
  84672. "lsl r8, r8, #17\n\t"
  84673. "adds r3, r3, r8\n\t"
  84674. "adcs r4, r4, r9\n\t"
  84675. "adc r2, r2, #0\n\t"
  84676. "adds r5, r5, r5\n\t"
  84677. "adcs r6, r6, r6\n\t"
  84678. "adc r7, r7, r7\n\t"
  84679. #else
  84680. "umull r8, r9, r10, r10\n\t"
  84681. "adds r5, r5, r5\n\t"
  84682. "adcs r6, r6, r6\n\t"
  84683. "adc r7, r7, r7\n\t"
  84684. "adds r3, r3, r8\n\t"
  84685. "adcs r4, r4, r9\n\t"
  84686. "adc r2, r2, #0\n\t"
  84687. #endif
  84688. "adds r3, r3, r5\n\t"
  84689. "adcs r4, r4, r6\n\t"
  84690. "adc r2, r2, r7\n\t"
  84691. "str r3, [%[r], #64]\n\t"
  84692. /* A[6] * A[11] */
  84693. "ldr r10, [%[a], #44]\n\t"
  84694. "ldr r12, [%[a], #24]\n\t"
  84695. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84696. "lsl r8, r10, #16\n\t"
  84697. "lsl r5, r12, #16\n\t"
  84698. "lsr r8, r8, #16\n\t"
  84699. "lsr r5, r5, #16\n\t"
  84700. "mul r5, r8, r5\n\t"
  84701. "lsr r9, r12, #16\n\t"
  84702. "mul r8, r9, r8\n\t"
  84703. "lsr r6, r8, #16\n\t"
  84704. "lsl r8, r8, #16\n\t"
  84705. "adds r5, r5, r8\n\t"
  84706. "adc r6, r6, #0\n\t"
  84707. "lsr r8, r10, #16\n\t"
  84708. "mul r9, r8, r9\n\t"
  84709. "add r6, r6, r9\n\t"
  84710. "lsl r9, r12, #16\n\t"
  84711. "lsr r9, r9, #16\n\t"
  84712. "mul r8, r9, r8\n\t"
  84713. "lsr r9, r8, #16\n\t"
  84714. "lsl r8, r8, #16\n\t"
  84715. "adds r5, r5, r8\n\t"
  84716. "adc r6, r6, r9\n\t"
  84717. #else
  84718. "umull r5, r6, r10, r12\n\t"
  84719. #endif
  84720. "mov r3, #0\n\t"
  84721. "mov r7, #0\n\t"
  84722. /* A[7] * A[10] */
  84723. "ldr r10, [%[a], #40]\n\t"
  84724. "ldr r12, [%[a], #28]\n\t"
  84725. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84726. "lsl r8, r10, #16\n\t"
  84727. "lsl r9, r12, #16\n\t"
  84728. "lsr r8, r8, #16\n\t"
  84729. "lsr r9, r9, #16\n\t"
  84730. "mul r9, r8, r9\n\t"
  84731. "adds r5, r5, r9\n\t"
  84732. "adcs r6, r6, #0\n\t"
  84733. "adc r7, r7, #0\n\t"
  84734. "lsr r9, r12, #16\n\t"
  84735. "mul r8, r9, r8\n\t"
  84736. "lsr r9, r8, #16\n\t"
  84737. "lsl r8, r8, #16\n\t"
  84738. "adds r5, r5, r8\n\t"
  84739. "adcs r6, r6, r9\n\t"
  84740. "adc r7, r7, #0\n\t"
  84741. "lsr r8, r10, #16\n\t"
  84742. "lsr r9, r12, #16\n\t"
  84743. "mul r9, r8, r9\n\t"
  84744. "adds r6, r6, r9\n\t"
  84745. "adc r7, r7, #0\n\t"
  84746. "lsl r9, r12, #16\n\t"
  84747. "lsr r9, r9, #16\n\t"
  84748. "mul r8, r9, r8\n\t"
  84749. "lsr r9, r8, #16\n\t"
  84750. "lsl r8, r8, #16\n\t"
  84751. "adds r5, r5, r8\n\t"
  84752. "adcs r6, r6, r9\n\t"
  84753. "adc r7, r7, #0\n\t"
  84754. #else
  84755. "umull r8, r9, r10, r12\n\t"
  84756. "adds r5, r5, r8\n\t"
  84757. "adcs r6, r6, r9\n\t"
  84758. "adc r7, r7, #0\n\t"
  84759. #endif
  84760. /* A[8] * A[9] */
  84761. "ldr r10, [%[a], #36]\n\t"
  84762. "ldr r12, [%[a], #32]\n\t"
  84763. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84764. "lsl r8, r10, #16\n\t"
  84765. "lsl r9, r12, #16\n\t"
  84766. "lsr r8, r8, #16\n\t"
  84767. "lsr r9, r9, #16\n\t"
  84768. "mul r9, r8, r9\n\t"
  84769. "adds r5, r5, r9\n\t"
  84770. "adcs r6, r6, #0\n\t"
  84771. "adc r7, r7, #0\n\t"
  84772. "lsr r9, r12, #16\n\t"
  84773. "mul r8, r9, r8\n\t"
  84774. "lsr r9, r8, #16\n\t"
  84775. "lsl r8, r8, #16\n\t"
  84776. "adds r5, r5, r8\n\t"
  84777. "adcs r6, r6, r9\n\t"
  84778. "adc r7, r7, #0\n\t"
  84779. "lsr r8, r10, #16\n\t"
  84780. "lsr r9, r12, #16\n\t"
  84781. "mul r9, r8, r9\n\t"
  84782. "adds r6, r6, r9\n\t"
  84783. "adc r7, r7, #0\n\t"
  84784. "lsl r9, r12, #16\n\t"
  84785. "lsr r9, r9, #16\n\t"
  84786. "mul r8, r9, r8\n\t"
  84787. "lsr r9, r8, #16\n\t"
  84788. "lsl r8, r8, #16\n\t"
  84789. "adds r5, r5, r8\n\t"
  84790. "adcs r6, r6, r9\n\t"
  84791. "adc r7, r7, #0\n\t"
  84792. #else
  84793. "umull r8, r9, r10, r12\n\t"
  84794. "adds r5, r5, r8\n\t"
  84795. "adcs r6, r6, r9\n\t"
  84796. "adc r7, r7, #0\n\t"
  84797. #endif
  84798. "adds r5, r5, r5\n\t"
  84799. "adcs r6, r6, r6\n\t"
  84800. "adc r7, r7, r7\n\t"
  84801. "adds r4, r4, r5\n\t"
  84802. "adcs r2, r2, r6\n\t"
  84803. "adc r3, r3, r7\n\t"
  84804. "str r4, [%[r], #68]\n\t"
  84805. /* A[7] * A[11] */
  84806. "ldr r10, [%[a], #44]\n\t"
  84807. "ldr r12, [%[a], #28]\n\t"
  84808. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84809. "lsl r8, r10, #16\n\t"
  84810. "lsl r9, r12, #16\n\t"
  84811. "lsr r8, r8, #16\n\t"
  84812. "lsr r9, r9, #16\n\t"
  84813. "mul r9, r8, r9\n\t"
  84814. "adds r2, r2, r9\n\t"
  84815. "adcs r3, r3, #0\n\t"
  84816. "mov r4, #0\n\t"
  84817. "adc r4, r4, #0\n\t"
  84818. "adds r2, r2, r9\n\t"
  84819. "adcs r3, r3, #0\n\t"
  84820. "adc r4, r4, #0\n\t"
  84821. "lsr r9, r12, #16\n\t"
  84822. "mul r8, r9, r8\n\t"
  84823. "lsr r9, r8, #16\n\t"
  84824. "lsl r8, r8, #16\n\t"
  84825. "adds r2, r2, r8\n\t"
  84826. "adcs r3, r3, r9\n\t"
  84827. "adc r4, r4, #0\n\t"
  84828. "adds r2, r2, r8\n\t"
  84829. "adcs r3, r3, r9\n\t"
  84830. "adc r4, r4, #0\n\t"
  84831. "lsr r8, r10, #16\n\t"
  84832. "lsr r9, r12, #16\n\t"
  84833. "mul r9, r8, r9\n\t"
  84834. "adds r3, r3, r9\n\t"
  84835. "adc r4, r4, #0\n\t"
  84836. "adds r3, r3, r9\n\t"
  84837. "adc r4, r4, #0\n\t"
  84838. "lsl r9, r12, #16\n\t"
  84839. "lsr r9, r9, #16\n\t"
  84840. "mul r8, r9, r8\n\t"
  84841. "lsr r9, r8, #16\n\t"
  84842. "lsl r8, r8, #16\n\t"
  84843. "adds r2, r2, r8\n\t"
  84844. "adcs r3, r3, r9\n\t"
  84845. "adc r4, r4, #0\n\t"
  84846. "adds r2, r2, r8\n\t"
  84847. "adcs r3, r3, r9\n\t"
  84848. "adc r4, r4, #0\n\t"
  84849. #else
  84850. "umull r8, r9, r10, r12\n\t"
  84851. "adds r2, r2, r8\n\t"
  84852. "adcs r3, r3, r9\n\t"
  84853. "mov r4, #0\n\t"
  84854. "adc r4, r4, #0\n\t"
  84855. "adds r2, r2, r8\n\t"
  84856. "adcs r3, r3, r9\n\t"
  84857. "mov r4, #0\n\t"
  84858. "adc r4, r4, #0\n\t"
  84859. #endif
  84860. /* A[8] * A[10] */
  84861. "ldr r10, [%[a], #40]\n\t"
  84862. "ldr r12, [%[a], #32]\n\t"
  84863. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84864. "lsl r8, r10, #16\n\t"
  84865. "lsl r9, r12, #16\n\t"
  84866. "lsr r8, r8, #16\n\t"
  84867. "lsr r9, r9, #16\n\t"
  84868. "mul r9, r8, r9\n\t"
  84869. "adds r2, r2, r9\n\t"
  84870. "adcs r3, r3, #0\n\t"
  84871. "adc r4, r4, #0\n\t"
  84872. "adds r2, r2, r9\n\t"
  84873. "adcs r3, r3, #0\n\t"
  84874. "adc r4, r4, #0\n\t"
  84875. "lsr r9, r12, #16\n\t"
  84876. "mul r8, r9, r8\n\t"
  84877. "lsr r9, r8, #16\n\t"
  84878. "lsl r8, r8, #16\n\t"
  84879. "adds r2, r2, r8\n\t"
  84880. "adcs r3, r3, r9\n\t"
  84881. "adc r4, r4, #0\n\t"
  84882. "adds r2, r2, r8\n\t"
  84883. "adcs r3, r3, r9\n\t"
  84884. "adc r4, r4, #0\n\t"
  84885. "lsr r8, r10, #16\n\t"
  84886. "lsr r9, r12, #16\n\t"
  84887. "mul r9, r8, r9\n\t"
  84888. "adds r3, r3, r9\n\t"
  84889. "adc r4, r4, #0\n\t"
  84890. "adds r3, r3, r9\n\t"
  84891. "adc r4, r4, #0\n\t"
  84892. "lsl r9, r12, #16\n\t"
  84893. "lsr r9, r9, #16\n\t"
  84894. "mul r8, r9, r8\n\t"
  84895. "lsr r9, r8, #16\n\t"
  84896. "lsl r8, r8, #16\n\t"
  84897. "adds r2, r2, r8\n\t"
  84898. "adcs r3, r3, r9\n\t"
  84899. "adc r4, r4, #0\n\t"
  84900. "adds r2, r2, r8\n\t"
  84901. "adcs r3, r3, r9\n\t"
  84902. "adc r4, r4, #0\n\t"
  84903. #else
  84904. "umull r8, r9, r10, r12\n\t"
  84905. "adds r2, r2, r8\n\t"
  84906. "adcs r3, r3, r9\n\t"
  84907. "adc r4, r4, #0\n\t"
  84908. "adds r2, r2, r8\n\t"
  84909. "adcs r3, r3, r9\n\t"
  84910. "adc r4, r4, #0\n\t"
  84911. #endif
  84912. /* A[9] * A[9] */
  84913. "ldr r10, [%[a], #36]\n\t"
  84914. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84915. "lsl r8, r10, #16\n\t"
  84916. "lsr r9, r10, #16\n\t"
  84917. "lsr r8, r8, #16\n\t"
  84918. "mov r12, r8\n\t"
  84919. "mul r8, r12, r8\n\t"
  84920. "mov r12, r9\n\t"
  84921. "mul r9, r12, r9\n\t"
  84922. "adds r2, r2, r8\n\t"
  84923. "adcs r3, r3, r9\n\t"
  84924. "adc r4, r4, #0\n\t"
  84925. "lsr r9, r10, #16\n\t"
  84926. "lsl r8, r10, #16\n\t"
  84927. "lsr r8, r8, #16\n\t"
  84928. "mul r8, r9, r8\n\t"
  84929. "lsr r9, r8, #15\n\t"
  84930. "lsl r8, r8, #17\n\t"
  84931. "adds r2, r2, r8\n\t"
  84932. "adcs r3, r3, r9\n\t"
  84933. "adc r4, r4, #0\n\t"
  84934. #else
  84935. "umull r8, r9, r10, r10\n\t"
  84936. "adds r2, r2, r8\n\t"
  84937. "adcs r3, r3, r9\n\t"
  84938. "adc r4, r4, #0\n\t"
  84939. #endif
  84940. "str r2, [%[r], #72]\n\t"
  84941. /* A[8] * A[11] */
  84942. "ldr r10, [%[a], #44]\n\t"
  84943. "ldr r12, [%[a], #32]\n\t"
  84944. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  84945. "lsl r8, r10, #16\n\t"
  84946. "lsl r9, r12, #16\n\t"
  84947. "lsr r8, r8, #16\n\t"
  84948. "lsr r9, r9, #16\n\t"
  84949. "mul r9, r8, r9\n\t"
  84950. "adds r3, r3, r9\n\t"
  84951. "adcs r4, r4, #0\n\t"
  84952. "mov r2, #0\n\t"
  84953. "adc r2, r2, #0\n\t"
  84954. "adds r3, r3, r9\n\t"
  84955. "adcs r4, r4, #0\n\t"
  84956. "adc r2, r2, #0\n\t"
  84957. "lsr r9, r12, #16\n\t"
  84958. "mul r8, r9, r8\n\t"
  84959. "lsr r9, r8, #16\n\t"
  84960. "lsl r8, r8, #16\n\t"
  84961. "adds r3, r3, r8\n\t"
  84962. "adcs r4, r4, r9\n\t"
  84963. "adc r2, r2, #0\n\t"
  84964. "adds r3, r3, r8\n\t"
  84965. "adcs r4, r4, r9\n\t"
  84966. "adc r2, r2, #0\n\t"
  84967. "lsr r8, r10, #16\n\t"
  84968. "lsr r9, r12, #16\n\t"
  84969. "mul r9, r8, r9\n\t"
  84970. "adds r4, r4, r9\n\t"
  84971. "adc r2, r2, #0\n\t"
  84972. "adds r4, r4, r9\n\t"
  84973. "adc r2, r2, #0\n\t"
  84974. "lsl r9, r12, #16\n\t"
  84975. "lsr r9, r9, #16\n\t"
  84976. "mul r8, r9, r8\n\t"
  84977. "lsr r9, r8, #16\n\t"
  84978. "lsl r8, r8, #16\n\t"
  84979. "adds r3, r3, r8\n\t"
  84980. "adcs r4, r4, r9\n\t"
  84981. "adc r2, r2, #0\n\t"
  84982. "adds r3, r3, r8\n\t"
  84983. "adcs r4, r4, r9\n\t"
  84984. "adc r2, r2, #0\n\t"
  84985. #else
  84986. "umull r8, r9, r10, r12\n\t"
  84987. "adds r3, r3, r8\n\t"
  84988. "adcs r4, r4, r9\n\t"
  84989. "mov r2, #0\n\t"
  84990. "adc r2, r2, #0\n\t"
  84991. "adds r3, r3, r8\n\t"
  84992. "adcs r4, r4, r9\n\t"
  84993. "mov r2, #0\n\t"
  84994. "adc r2, r2, #0\n\t"
  84995. #endif
  84996. /* A[9] * A[10] */
  84997. "ldr r10, [%[a], #40]\n\t"
  84998. "ldr r12, [%[a], #36]\n\t"
  84999. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85000. "lsl r8, r10, #16\n\t"
  85001. "lsl r9, r12, #16\n\t"
  85002. "lsr r8, r8, #16\n\t"
  85003. "lsr r9, r9, #16\n\t"
  85004. "mul r9, r8, r9\n\t"
  85005. "adds r3, r3, r9\n\t"
  85006. "adcs r4, r4, #0\n\t"
  85007. "adc r2, r2, #0\n\t"
  85008. "adds r3, r3, r9\n\t"
  85009. "adcs r4, r4, #0\n\t"
  85010. "adc r2, r2, #0\n\t"
  85011. "lsr r9, r12, #16\n\t"
  85012. "mul r8, r9, r8\n\t"
  85013. "lsr r9, r8, #16\n\t"
  85014. "lsl r8, r8, #16\n\t"
  85015. "adds r3, r3, r8\n\t"
  85016. "adcs r4, r4, r9\n\t"
  85017. "adc r2, r2, #0\n\t"
  85018. "adds r3, r3, r8\n\t"
  85019. "adcs r4, r4, r9\n\t"
  85020. "adc r2, r2, #0\n\t"
  85021. "lsr r8, r10, #16\n\t"
  85022. "lsr r9, r12, #16\n\t"
  85023. "mul r9, r8, r9\n\t"
  85024. "adds r4, r4, r9\n\t"
  85025. "adc r2, r2, #0\n\t"
  85026. "adds r4, r4, r9\n\t"
  85027. "adc r2, r2, #0\n\t"
  85028. "lsl r9, r12, #16\n\t"
  85029. "lsr r9, r9, #16\n\t"
  85030. "mul r8, r9, r8\n\t"
  85031. "lsr r9, r8, #16\n\t"
  85032. "lsl r8, r8, #16\n\t"
  85033. "adds r3, r3, r8\n\t"
  85034. "adcs r4, r4, r9\n\t"
  85035. "adc r2, r2, #0\n\t"
  85036. "adds r3, r3, r8\n\t"
  85037. "adcs r4, r4, r9\n\t"
  85038. "adc r2, r2, #0\n\t"
  85039. #else
  85040. "umull r8, r9, r10, r12\n\t"
  85041. "adds r3, r3, r8\n\t"
  85042. "adcs r4, r4, r9\n\t"
  85043. "adc r2, r2, #0\n\t"
  85044. "adds r3, r3, r8\n\t"
  85045. "adcs r4, r4, r9\n\t"
  85046. "adc r2, r2, #0\n\t"
  85047. #endif
  85048. "str r3, [%[r], #76]\n\t"
  85049. /* A[9] * A[11] */
  85050. "ldr r10, [%[a], #44]\n\t"
  85051. "ldr r12, [%[a], #36]\n\t"
  85052. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85053. "lsl r8, r10, #16\n\t"
  85054. "lsl r9, r12, #16\n\t"
  85055. "lsr r8, r8, #16\n\t"
  85056. "lsr r9, r9, #16\n\t"
  85057. "mul r9, r8, r9\n\t"
  85058. "adds r4, r4, r9\n\t"
  85059. "adcs r2, r2, #0\n\t"
  85060. "mov r3, #0\n\t"
  85061. "adc r3, r3, #0\n\t"
  85062. "adds r4, r4, r9\n\t"
  85063. "adcs r2, r2, #0\n\t"
  85064. "adc r3, r3, #0\n\t"
  85065. "lsr r9, r12, #16\n\t"
  85066. "mul r8, r9, r8\n\t"
  85067. "lsr r9, r8, #16\n\t"
  85068. "lsl r8, r8, #16\n\t"
  85069. "adds r4, r4, r8\n\t"
  85070. "adcs r2, r2, r9\n\t"
  85071. "adc r3, r3, #0\n\t"
  85072. "adds r4, r4, r8\n\t"
  85073. "adcs r2, r2, r9\n\t"
  85074. "adc r3, r3, #0\n\t"
  85075. "lsr r8, r10, #16\n\t"
  85076. "lsr r9, r12, #16\n\t"
  85077. "mul r9, r8, r9\n\t"
  85078. "adds r2, r2, r9\n\t"
  85079. "adc r3, r3, #0\n\t"
  85080. "adds r2, r2, r9\n\t"
  85081. "adc r3, r3, #0\n\t"
  85082. "lsl r9, r12, #16\n\t"
  85083. "lsr r9, r9, #16\n\t"
  85084. "mul r8, r9, r8\n\t"
  85085. "lsr r9, r8, #16\n\t"
  85086. "lsl r8, r8, #16\n\t"
  85087. "adds r4, r4, r8\n\t"
  85088. "adcs r2, r2, r9\n\t"
  85089. "adc r3, r3, #0\n\t"
  85090. "adds r4, r4, r8\n\t"
  85091. "adcs r2, r2, r9\n\t"
  85092. "adc r3, r3, #0\n\t"
  85093. #else
  85094. "umull r8, r9, r10, r12\n\t"
  85095. "adds r4, r4, r8\n\t"
  85096. "adcs r2, r2, r9\n\t"
  85097. "mov r3, #0\n\t"
  85098. "adc r3, r3, #0\n\t"
  85099. "adds r4, r4, r8\n\t"
  85100. "adcs r2, r2, r9\n\t"
  85101. "mov r3, #0\n\t"
  85102. "adc r3, r3, #0\n\t"
  85103. #endif
  85104. /* A[10] * A[10] */
  85105. "ldr r10, [%[a], #40]\n\t"
  85106. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85107. "lsl r8, r10, #16\n\t"
  85108. "lsr r9, r10, #16\n\t"
  85109. "lsr r8, r8, #16\n\t"
  85110. "mov r12, r8\n\t"
  85111. "mul r8, r12, r8\n\t"
  85112. "mov r12, r9\n\t"
  85113. "mul r9, r12, r9\n\t"
  85114. "adds r4, r4, r8\n\t"
  85115. "adcs r2, r2, r9\n\t"
  85116. "adc r3, r3, #0\n\t"
  85117. "lsr r9, r10, #16\n\t"
  85118. "lsl r8, r10, #16\n\t"
  85119. "lsr r8, r8, #16\n\t"
  85120. "mul r8, r9, r8\n\t"
  85121. "lsr r9, r8, #15\n\t"
  85122. "lsl r8, r8, #17\n\t"
  85123. "adds r4, r4, r8\n\t"
  85124. "adcs r2, r2, r9\n\t"
  85125. "adc r3, r3, #0\n\t"
  85126. #else
  85127. "umull r8, r9, r10, r10\n\t"
  85128. "adds r4, r4, r8\n\t"
  85129. "adcs r2, r2, r9\n\t"
  85130. "adc r3, r3, #0\n\t"
  85131. #endif
  85132. "str r4, [%[r], #80]\n\t"
  85133. /* A[10] * A[11] */
  85134. "ldr r10, [%[a], #44]\n\t"
  85135. "ldr r12, [%[a], #40]\n\t"
  85136. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85137. "lsl r8, r10, #16\n\t"
  85138. "lsl r9, r12, #16\n\t"
  85139. "lsr r8, r8, #16\n\t"
  85140. "lsr r9, r9, #16\n\t"
  85141. "mul r9, r8, r9\n\t"
  85142. "adds r2, r2, r9\n\t"
  85143. "adcs r3, r3, #0\n\t"
  85144. "mov r4, #0\n\t"
  85145. "adc r4, r4, #0\n\t"
  85146. "adds r2, r2, r9\n\t"
  85147. "adcs r3, r3, #0\n\t"
  85148. "adc r4, r4, #0\n\t"
  85149. "lsr r9, r12, #16\n\t"
  85150. "mul r8, r9, r8\n\t"
  85151. "lsr r9, r8, #16\n\t"
  85152. "lsl r8, r8, #16\n\t"
  85153. "adds r2, r2, r8\n\t"
  85154. "adcs r3, r3, r9\n\t"
  85155. "adc r4, r4, #0\n\t"
  85156. "adds r2, r2, r8\n\t"
  85157. "adcs r3, r3, r9\n\t"
  85158. "adc r4, r4, #0\n\t"
  85159. "lsr r8, r10, #16\n\t"
  85160. "lsr r9, r12, #16\n\t"
  85161. "mul r9, r8, r9\n\t"
  85162. "adds r3, r3, r9\n\t"
  85163. "adc r4, r4, #0\n\t"
  85164. "adds r3, r3, r9\n\t"
  85165. "adc r4, r4, #0\n\t"
  85166. "lsl r9, r12, #16\n\t"
  85167. "lsr r9, r9, #16\n\t"
  85168. "mul r8, r9, r8\n\t"
  85169. "lsr r9, r8, #16\n\t"
  85170. "lsl r8, r8, #16\n\t"
  85171. "adds r2, r2, r8\n\t"
  85172. "adcs r3, r3, r9\n\t"
  85173. "adc r4, r4, #0\n\t"
  85174. "adds r2, r2, r8\n\t"
  85175. "adcs r3, r3, r9\n\t"
  85176. "adc r4, r4, #0\n\t"
  85177. #else
  85178. "umull r8, r9, r10, r12\n\t"
  85179. "adds r2, r2, r8\n\t"
  85180. "adcs r3, r3, r9\n\t"
  85181. "mov r4, #0\n\t"
  85182. "adc r4, r4, #0\n\t"
  85183. "adds r2, r2, r8\n\t"
  85184. "adcs r3, r3, r9\n\t"
  85185. "mov r4, #0\n\t"
  85186. "adc r4, r4, #0\n\t"
  85187. #endif
  85188. "str r2, [%[r], #84]\n\t"
  85189. /* A[11] * A[11] */
  85190. "ldr r10, [%[a], #44]\n\t"
  85191. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85192. "lsl r8, r10, #16\n\t"
  85193. "lsr r9, r10, #16\n\t"
  85194. "lsr r8, r8, #16\n\t"
  85195. "mov r12, r8\n\t"
  85196. "mul r8, r12, r8\n\t"
  85197. "mov r12, r9\n\t"
  85198. "mul r9, r12, r9\n\t"
  85199. "adds r3, r3, r8\n\t"
  85200. "adc r4, r4, r9\n\t"
  85201. "lsr r9, r10, #16\n\t"
  85202. "lsl r8, r10, #16\n\t"
  85203. "lsr r8, r8, #16\n\t"
  85204. "mul r8, r9, r8\n\t"
  85205. "lsr r9, r8, #15\n\t"
  85206. "lsl r8, r8, #17\n\t"
  85207. "adds r3, r3, r8\n\t"
  85208. "adc r4, r4, r9\n\t"
  85209. #else
  85210. "umull r8, r9, r10, r10\n\t"
  85211. "adds r3, r3, r8\n\t"
  85212. "adc r4, r4, r9\n\t"
  85213. #endif
  85214. "str r3, [%[r], #88]\n\t"
  85215. "str r4, [%[r], #92]\n\t"
  85216. "ldm sp!, {r2, r3, r4, r8}\n\t"
  85217. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  85218. "ldm sp!, {r2, r3, r4, r8}\n\t"
  85219. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  85220. "ldm sp!, {r2, r3, r4, r8}\n\t"
  85221. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  85222. : [r] "+r" (r), [a] "+r" (a)
  85223. :
  85224. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  85225. );
  85226. }
  85227. #endif /* WOLFSSL_SP_SMALL */
  85228. #ifdef WOLFSSL_SP_SMALL
  85229. /* Add b to a into r. (r = a + b)
  85230. *
  85231. * r A single precision integer.
  85232. * a A single precision integer.
  85233. * b A single precision integer.
  85234. */
  85235. static sp_digit sp_384_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  85236. {
  85237. register sp_digit* r asm ("r0") = r_p;
  85238. register const sp_digit* a asm ("r1") = a_p;
  85239. register const sp_digit* b asm ("r2") = b_p;
  85240. __asm__ __volatile__ (
  85241. "mov r3, #0\n\t"
  85242. "add r12, %[a], #48\n\t"
  85243. "\n"
  85244. "L_sp_384_add_12_word_%=: \n\t"
  85245. "adds r3, r3, #-1\n\t"
  85246. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  85247. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  85248. "adcs r4, r4, r8\n\t"
  85249. "adcs r5, r5, r9\n\t"
  85250. "adcs r6, r6, r10\n\t"
  85251. "adcs r7, r7, r11\n\t"
  85252. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  85253. "mov r4, #0\n\t"
  85254. "adc r3, r4, #0\n\t"
  85255. "cmp %[a], r12\n\t"
  85256. "bne L_sp_384_add_12_word_%=\n\t"
  85257. "mov %[r], r3\n\t"
  85258. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  85259. :
  85260. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  85261. );
  85262. return (uint32_t)(size_t)r;
  85263. }
  85264. #else
  85265. /* Add b to a into r. (r = a + b)
  85266. *
  85267. * r A single precision integer.
  85268. * a A single precision integer.
  85269. * b A single precision integer.
  85270. */
  85271. static sp_digit sp_384_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  85272. {
  85273. register sp_digit* r asm ("r0") = r_p;
  85274. register const sp_digit* a asm ("r1") = a_p;
  85275. register const sp_digit* b asm ("r2") = b_p;
  85276. __asm__ __volatile__ (
  85277. "mov r12, #0\n\t"
  85278. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  85279. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  85280. "adds r3, r3, r7\n\t"
  85281. "adcs r4, r4, r8\n\t"
  85282. "adcs r5, r5, r9\n\t"
  85283. "adcs r6, r6, r10\n\t"
  85284. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  85285. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  85286. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  85287. "adcs r3, r3, r7\n\t"
  85288. "adcs r4, r4, r8\n\t"
  85289. "adcs r5, r5, r9\n\t"
  85290. "adcs r6, r6, r10\n\t"
  85291. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  85292. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  85293. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  85294. "adcs r3, r3, r7\n\t"
  85295. "adcs r4, r4, r8\n\t"
  85296. "adcs r5, r5, r9\n\t"
  85297. "adcs r6, r6, r10\n\t"
  85298. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  85299. "adc %[r], r12, r12\n\t"
  85300. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  85301. :
  85302. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  85303. );
  85304. return (uint32_t)(size_t)r;
  85305. }
  85306. #endif /* WOLFSSL_SP_SMALL */
  85307. #ifdef WOLFSSL_SP_SMALL
  85308. /* Sub b from a into r. (r = a - b)
  85309. *
  85310. * r A single precision integer.
  85311. * a A single precision integer.
  85312. * b A single precision integer.
  85313. */
  85314. static sp_digit sp_384_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  85315. {
  85316. register sp_digit* r asm ("r0") = r_p;
  85317. register const sp_digit* a asm ("r1") = a_p;
  85318. register const sp_digit* b asm ("r2") = b_p;
  85319. __asm__ __volatile__ (
  85320. "mov r12, #0\n\t"
  85321. "add lr, %[a], #48\n\t"
  85322. "\n"
  85323. "L_sp_384_sub_12_word_%=: \n\t"
  85324. "rsbs r12, r12, #0\n\t"
  85325. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  85326. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  85327. "sbcs r3, r3, r7\n\t"
  85328. "sbcs r4, r4, r8\n\t"
  85329. "sbcs r5, r5, r9\n\t"
  85330. "sbcs r6, r6, r10\n\t"
  85331. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  85332. "sbc r12, r3, r3\n\t"
  85333. "cmp %[a], lr\n\t"
  85334. "bne L_sp_384_sub_12_word_%=\n\t"
  85335. "mov %[r], r12\n\t"
  85336. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  85337. :
  85338. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr"
  85339. );
  85340. return (uint32_t)(size_t)r;
  85341. }
  85342. #else
  85343. /* Sub b from a into r. (r = a - b)
  85344. *
  85345. * r A single precision integer.
  85346. * a A single precision integer.
  85347. * b A single precision integer.
  85348. */
  85349. static sp_digit sp_384_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  85350. {
  85351. register sp_digit* r asm ("r0") = r_p;
  85352. register const sp_digit* a asm ("r1") = a_p;
  85353. register const sp_digit* b asm ("r2") = b_p;
  85354. __asm__ __volatile__ (
  85355. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  85356. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  85357. "subs r3, r3, r7\n\t"
  85358. "sbcs r4, r4, r8\n\t"
  85359. "sbcs r5, r5, r9\n\t"
  85360. "sbcs r6, r6, r10\n\t"
  85361. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  85362. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  85363. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  85364. "sbcs r3, r3, r7\n\t"
  85365. "sbcs r4, r4, r8\n\t"
  85366. "sbcs r5, r5, r9\n\t"
  85367. "sbcs r6, r6, r10\n\t"
  85368. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  85369. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  85370. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  85371. "sbcs r3, r3, r7\n\t"
  85372. "sbcs r4, r4, r8\n\t"
  85373. "sbcs r5, r5, r9\n\t"
  85374. "sbcs r6, r6, r10\n\t"
  85375. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  85376. "sbc %[r], r6, r6\n\t"
  85377. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  85378. :
  85379. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  85380. );
  85381. return (uint32_t)(size_t)r;
  85382. }
  85383. #endif /* WOLFSSL_SP_SMALL */
  85384. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  85385. *
  85386. * r The resulting Montgomery form number.
  85387. * a The number to convert.
  85388. * m The modulus (prime).
  85389. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  85390. */
  85391. static int sp_384_mod_mul_norm_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  85392. {
  85393. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  85394. int64_t* t = NULL;
  85395. #else
  85396. int64_t t[12];
  85397. #endif
  85398. int64_t o;
  85399. int err = MP_OKAY;
  85400. (void)m;
  85401. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  85402. t = (int64_t*)XMALLOC(sizeof(int64_t) * 12, NULL, DYNAMIC_TYPE_ECC);
  85403. if (t == NULL) {
  85404. err = MEMORY_E;
  85405. }
  85406. #endif
  85407. if (err == MP_OKAY) {
  85408. /* 1 0 0 0 0 0 0 0 1 1 0 -1 */
  85409. t[0] = 0 + (int64_t)a[0] + (int64_t)a[8] + (int64_t)a[9] - (int64_t)a[11];
  85410. /* -1 1 0 0 0 0 0 0 -1 0 1 1 */
  85411. t[1] = 0 - (int64_t)a[0] + (int64_t)a[1] - (int64_t)a[8] + (int64_t)a[10] + (int64_t)a[11];
  85412. /* 0 -1 1 0 0 0 0 0 0 -1 0 1 */
  85413. t[2] = 0 - (int64_t)a[1] + (int64_t)a[2] - (int64_t)a[9] + (int64_t)a[11];
  85414. /* 1 0 -1 1 0 0 0 0 1 1 -1 -1 */
  85415. t[3] = 0 + (int64_t)a[0] - (int64_t)a[2] + (int64_t)a[3] + (int64_t)a[8] + (int64_t)a[9] - (int64_t)a[10] - (int64_t)a[11];
  85416. /* 1 1 0 -1 1 0 0 0 1 2 1 -2 */
  85417. t[4] = 0 + (int64_t)a[0] + (int64_t)a[1] - (int64_t)a[3] + (int64_t)a[4] + (int64_t)a[8] + 2 * (int64_t)a[9] + (int64_t)a[10] - 2 * (int64_t)a[11];
  85418. /* 0 1 1 0 -1 1 0 0 0 1 2 1 */
  85419. t[5] = 0 + (int64_t)a[1] + (int64_t)a[2] - (int64_t)a[4] + (int64_t)a[5] + (int64_t)a[9] + 2 * (int64_t)a[10] + (int64_t)a[11];
  85420. /* 0 0 1 1 0 -1 1 0 0 0 1 2 */
  85421. t[6] = 0 + (int64_t)a[2] + (int64_t)a[3] - (int64_t)a[5] + (int64_t)a[6] + (int64_t)a[10] + 2 * (int64_t)a[11];
  85422. /* 0 0 0 1 1 0 -1 1 0 0 0 1 */
  85423. t[7] = 0 + (int64_t)a[3] + (int64_t)a[4] - (int64_t)a[6] + (int64_t)a[7] + (int64_t)a[11];
  85424. /* 0 0 0 0 1 1 0 -1 1 0 0 0 */
  85425. t[8] = 0 + (int64_t)a[4] + (int64_t)a[5] - (int64_t)a[7] + (int64_t)a[8];
  85426. /* 0 0 0 0 0 1 1 0 -1 1 0 0 */
  85427. t[9] = 0 + (int64_t)a[5] + (int64_t)a[6] - (int64_t)a[8] + (int64_t)a[9];
  85428. /* 0 0 0 0 0 0 1 1 0 -1 1 0 */
  85429. t[10] = 0 + (int64_t)a[6] + (int64_t)a[7] - (int64_t)a[9] + (int64_t)a[10];
  85430. /* 0 0 0 0 0 0 0 1 1 0 -1 1 */
  85431. t[11] = 0 + (int64_t)a[7] + (int64_t)a[8] - (int64_t)a[10] + (int64_t)a[11];
  85432. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  85433. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  85434. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  85435. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  85436. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  85437. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  85438. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  85439. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  85440. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  85441. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  85442. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  85443. o = t[11] >> 32; t[11] &= 0xffffffff;
  85444. t[0] += o;
  85445. t[1] -= o;
  85446. t[3] += o;
  85447. t[4] += o;
  85448. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  85449. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  85450. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  85451. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  85452. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  85453. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  85454. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  85455. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  85456. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  85457. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  85458. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  85459. r[0] = t[0];
  85460. r[1] = t[1];
  85461. r[2] = t[2];
  85462. r[3] = t[3];
  85463. r[4] = t[4];
  85464. r[5] = t[5];
  85465. r[6] = t[6];
  85466. r[7] = t[7];
  85467. r[8] = t[8];
  85468. r[9] = t[9];
  85469. r[10] = t[10];
  85470. r[11] = t[11];
  85471. }
  85472. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  85473. if (t != NULL)
  85474. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  85475. #endif
  85476. return err;
  85477. }
  85478. /* Convert an mp_int to an array of sp_digit.
  85479. *
  85480. * r A single precision integer.
  85481. * size Maximum number of bytes to convert
  85482. * a A multi-precision integer.
  85483. */
  85484. static void sp_384_from_mp(sp_digit* r, int size, const mp_int* a)
  85485. {
  85486. #if DIGIT_BIT == 32
  85487. int i;
  85488. int j = 0;
  85489. for (i = 0; i < size; i++) {
  85490. sp_digit mask =
  85491. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  85492. r[i] = a->dp[j] & mask;
  85493. j += (int)(((sp_digit)1) -
  85494. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  85495. }
  85496. #elif DIGIT_BIT > 32
  85497. int i;
  85498. int j = 0;
  85499. word32 s = 0;
  85500. r[0] = 0;
  85501. for (i = 0; i < a->used && j < size; i++) {
  85502. r[j] |= ((sp_digit)a->dp[i] << s);
  85503. r[j] &= 0xffffffff;
  85504. s = 32U - s;
  85505. if (j + 1 >= size) {
  85506. break;
  85507. }
  85508. /* lint allow cast of mismatch word32 and mp_digit */
  85509. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  85510. while ((s + 32U) <= (word32)DIGIT_BIT) {
  85511. s += 32U;
  85512. r[j] &= 0xffffffff;
  85513. if (j + 1 >= size) {
  85514. break;
  85515. }
  85516. if (s < (word32)DIGIT_BIT) {
  85517. /* lint allow cast of mismatch word32 and mp_digit */
  85518. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  85519. }
  85520. else {
  85521. r[++j] = (sp_digit)0;
  85522. }
  85523. }
  85524. s = (word32)DIGIT_BIT - s;
  85525. }
  85526. for (j++; j < size; j++) {
  85527. r[j] = 0;
  85528. }
  85529. #else
  85530. int i;
  85531. int j = 0;
  85532. int s = 0;
  85533. r[0] = 0;
  85534. for (i = 0; i < a->used && j < size; i++) {
  85535. r[j] |= ((sp_digit)a->dp[i]) << s;
  85536. if (s + DIGIT_BIT >= 32) {
  85537. r[j] &= 0xffffffff;
  85538. if (j + 1 >= size) {
  85539. break;
  85540. }
  85541. s = 32 - s;
  85542. if (s == DIGIT_BIT) {
  85543. r[++j] = 0;
  85544. s = 0;
  85545. }
  85546. else {
  85547. r[++j] = a->dp[i] >> s;
  85548. s = DIGIT_BIT - s;
  85549. }
  85550. }
  85551. else {
  85552. s += DIGIT_BIT;
  85553. }
  85554. }
  85555. for (j++; j < size; j++) {
  85556. r[j] = 0;
  85557. }
  85558. #endif
  85559. }
  85560. /* Convert a point of type ecc_point to type sp_point_384.
  85561. *
  85562. * p Point of type sp_point_384 (result).
  85563. * pm Point of type ecc_point.
  85564. */
  85565. static void sp_384_point_from_ecc_point_12(sp_point_384* p,
  85566. const ecc_point* pm)
  85567. {
  85568. XMEMSET(p->x, 0, sizeof(p->x));
  85569. XMEMSET(p->y, 0, sizeof(p->y));
  85570. XMEMSET(p->z, 0, sizeof(p->z));
  85571. sp_384_from_mp(p->x, 12, pm->x);
  85572. sp_384_from_mp(p->y, 12, pm->y);
  85573. sp_384_from_mp(p->z, 12, pm->z);
  85574. p->infinity = 0;
  85575. }
  85576. /* Convert an array of sp_digit to an mp_int.
  85577. *
  85578. * a A single precision integer.
  85579. * r A multi-precision integer.
  85580. */
  85581. static int sp_384_to_mp(const sp_digit* a, mp_int* r)
  85582. {
  85583. int err;
  85584. err = mp_grow(r, (384 + DIGIT_BIT - 1) / DIGIT_BIT);
  85585. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  85586. #if DIGIT_BIT == 32
  85587. XMEMCPY(r->dp, a, sizeof(sp_digit) * 12);
  85588. r->used = 12;
  85589. mp_clamp(r);
  85590. #elif DIGIT_BIT < 32
  85591. int i;
  85592. int j = 0;
  85593. int s = 0;
  85594. r->dp[0] = 0;
  85595. for (i = 0; i < 12; i++) {
  85596. r->dp[j] |= (mp_digit)(a[i] << s);
  85597. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  85598. s = DIGIT_BIT - s;
  85599. r->dp[++j] = (mp_digit)(a[i] >> s);
  85600. while (s + DIGIT_BIT <= 32) {
  85601. s += DIGIT_BIT;
  85602. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  85603. if (s == SP_WORD_SIZE) {
  85604. r->dp[j] = 0;
  85605. }
  85606. else {
  85607. r->dp[j] = (mp_digit)(a[i] >> s);
  85608. }
  85609. }
  85610. s = 32 - s;
  85611. }
  85612. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  85613. mp_clamp(r);
  85614. #else
  85615. int i;
  85616. int j = 0;
  85617. int s = 0;
  85618. r->dp[0] = 0;
  85619. for (i = 0; i < 12; i++) {
  85620. r->dp[j] |= ((mp_digit)a[i]) << s;
  85621. if (s + 32 >= DIGIT_BIT) {
  85622. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  85623. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  85624. #endif
  85625. s = DIGIT_BIT - s;
  85626. r->dp[++j] = a[i] >> s;
  85627. s = 32 - s;
  85628. }
  85629. else {
  85630. s += 32;
  85631. }
  85632. }
  85633. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  85634. mp_clamp(r);
  85635. #endif
  85636. }
  85637. return err;
  85638. }
  85639. /* Convert a point of type sp_point_384 to type ecc_point.
  85640. *
  85641. * p Point of type sp_point_384.
  85642. * pm Point of type ecc_point (result).
  85643. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  85644. * MP_OKAY.
  85645. */
  85646. static int sp_384_point_to_ecc_point_12(const sp_point_384* p, ecc_point* pm)
  85647. {
  85648. int err;
  85649. err = sp_384_to_mp(p->x, pm->x);
  85650. if (err == MP_OKAY) {
  85651. err = sp_384_to_mp(p->y, pm->y);
  85652. }
  85653. if (err == MP_OKAY) {
  85654. err = sp_384_to_mp(p->z, pm->z);
  85655. }
  85656. return err;
  85657. }
  85658. #ifdef WOLFSSL_SP_SMALL
  85659. /* Conditionally subtract b from a using the mask m.
  85660. * m is -1 to subtract and 0 when not copying.
  85661. *
  85662. * r A single precision number representing condition subtract result.
  85663. * a A single precision number to subtract from.
  85664. * b A single precision number to subtract.
  85665. * m Mask value to apply.
  85666. */
  85667. static sp_digit sp_384_cond_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  85668. {
  85669. register sp_digit* r asm ("r0") = r_p;
  85670. register const sp_digit* a asm ("r1") = a_p;
  85671. register const sp_digit* b asm ("r2") = b_p;
  85672. register sp_digit m asm ("r3") = m_p;
  85673. __asm__ __volatile__ (
  85674. "mov r6, #0\n\t"
  85675. "mov r12, #0\n\t"
  85676. "mov lr, #0\n\t"
  85677. "\n"
  85678. "L_sp_384_cond_sub_12_words_%=: \n\t"
  85679. "subs r12, r6, r12\n\t"
  85680. "ldr r4, [%[a], lr]\n\t"
  85681. "ldr r5, [%[b], lr]\n\t"
  85682. "and r5, r5, %[m]\n\t"
  85683. "sbcs r4, r4, r5\n\t"
  85684. "sbc r12, r6, r6\n\t"
  85685. "str r4, [%[r], lr]\n\t"
  85686. "add lr, lr, #4\n\t"
  85687. "cmp lr, #48\n\t"
  85688. "blt L_sp_384_cond_sub_12_words_%=\n\t"
  85689. "mov %[r], r12\n\t"
  85690. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  85691. :
  85692. : "memory", "r12", "lr", "r4", "r5", "r6"
  85693. );
  85694. return (uint32_t)(size_t)r;
  85695. }
  85696. #else
  85697. /* Conditionally subtract b from a using the mask m.
  85698. * m is -1 to subtract and 0 when not copying.
  85699. *
  85700. * r A single precision number representing condition subtract result.
  85701. * a A single precision number to subtract from.
  85702. * b A single precision number to subtract.
  85703. * m Mask value to apply.
  85704. */
  85705. static sp_digit sp_384_cond_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  85706. {
  85707. register sp_digit* r asm ("r0") = r_p;
  85708. register const sp_digit* a asm ("r1") = a_p;
  85709. register const sp_digit* b asm ("r2") = b_p;
  85710. register sp_digit m asm ("r3") = m_p;
  85711. __asm__ __volatile__ (
  85712. "mov lr, #0\n\t"
  85713. "ldm %[a]!, {r4, r5}\n\t"
  85714. "ldm %[b]!, {r6, r7}\n\t"
  85715. "and r6, r6, %[m]\n\t"
  85716. "and r7, r7, %[m]\n\t"
  85717. "subs r4, r4, r6\n\t"
  85718. "sbcs r5, r5, r7\n\t"
  85719. "stm %[r]!, {r4, r5}\n\t"
  85720. "ldm %[a]!, {r4, r5}\n\t"
  85721. "ldm %[b]!, {r6, r7}\n\t"
  85722. "and r6, r6, %[m]\n\t"
  85723. "and r7, r7, %[m]\n\t"
  85724. "sbcs r4, r4, r6\n\t"
  85725. "sbcs r5, r5, r7\n\t"
  85726. "stm %[r]!, {r4, r5}\n\t"
  85727. "ldm %[a]!, {r4, r5}\n\t"
  85728. "ldm %[b]!, {r6, r7}\n\t"
  85729. "and r6, r6, %[m]\n\t"
  85730. "and r7, r7, %[m]\n\t"
  85731. "sbcs r4, r4, r6\n\t"
  85732. "sbcs r5, r5, r7\n\t"
  85733. "stm %[r]!, {r4, r5}\n\t"
  85734. "ldm %[a]!, {r4, r5}\n\t"
  85735. "ldm %[b]!, {r6, r7}\n\t"
  85736. "and r6, r6, %[m]\n\t"
  85737. "and r7, r7, %[m]\n\t"
  85738. "sbcs r4, r4, r6\n\t"
  85739. "sbcs r5, r5, r7\n\t"
  85740. "stm %[r]!, {r4, r5}\n\t"
  85741. "ldm %[a]!, {r4, r5}\n\t"
  85742. "ldm %[b]!, {r6, r7}\n\t"
  85743. "and r6, r6, %[m]\n\t"
  85744. "and r7, r7, %[m]\n\t"
  85745. "sbcs r4, r4, r6\n\t"
  85746. "sbcs r5, r5, r7\n\t"
  85747. "stm %[r]!, {r4, r5}\n\t"
  85748. "ldm %[a]!, {r4, r5}\n\t"
  85749. "ldm %[b]!, {r6, r7}\n\t"
  85750. "and r6, r6, %[m]\n\t"
  85751. "and r7, r7, %[m]\n\t"
  85752. "sbcs r4, r4, r6\n\t"
  85753. "sbcs r5, r5, r7\n\t"
  85754. "stm %[r]!, {r4, r5}\n\t"
  85755. "sbc %[r], lr, lr\n\t"
  85756. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  85757. :
  85758. : "memory", "r12", "lr", "r4", "r5", "r6", "r7"
  85759. );
  85760. return (uint32_t)(size_t)r;
  85761. }
  85762. #endif /* WOLFSSL_SP_SMALL */
  85763. #define sp_384_mont_reduce_order_12 sp_384_mont_reduce_12
  85764. /* Reduce the number back to 384 bits using Montgomery reduction.
  85765. *
  85766. * a A single precision number to reduce in place.
  85767. * m The single precision number representing the modulus.
  85768. * mp The digit representing the negative inverse of m mod 2^n.
  85769. */
  85770. static SP_NOINLINE void sp_384_mont_reduce_12(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  85771. {
  85772. register sp_digit* a asm ("r0") = a_p;
  85773. register const sp_digit* m asm ("r1") = m_p;
  85774. register sp_digit mp asm ("r2") = mp_p;
  85775. __asm__ __volatile__ (
  85776. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  85777. "ldr r11, [%[m]]\n\t"
  85778. #endif
  85779. /* i = 0 */
  85780. "mov r9, #0\n\t"
  85781. "mov r3, #0\n\t"
  85782. "ldr r12, [%[a]]\n\t"
  85783. "ldr lr, [%[a], #4]\n\t"
  85784. "\n"
  85785. "L_sp_384_mont_reduce_12_word_%=: \n\t"
  85786. /* mu = a[i] * mp */
  85787. "mul r8, %[mp], r12\n\t"
  85788. /* a[i+0] += m[0] * mu */
  85789. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85790. "ldr r11, [%[m]]\n\t"
  85791. #endif
  85792. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85793. "lsr r7, r11, #16\n\t"
  85794. "lsr r6, r8, #16\n\t"
  85795. "mul r5, r6, r7\n\t"
  85796. "lsl r7, r11, #16\n\t"
  85797. "lsr r7, r7, #16\n\t"
  85798. "mul r6, r7, r6\n\t"
  85799. "lsr r7, r6, #16\n\t"
  85800. "lsl r6, r6, #16\n\t"
  85801. "adds r12, r12, r6\n\t"
  85802. "adc r5, r5, r7\n\t"
  85803. "lsl r6, r8, #16\n\t"
  85804. "lsl r7, r11, #16\n\t"
  85805. "lsr r6, r6, #16\n\t"
  85806. "lsr r7, r7, #16\n\t"
  85807. "mul r7, r6, r7\n\t"
  85808. "adds r12, r12, r7\n\t"
  85809. "adc r5, r5, #0\n\t"
  85810. "lsr r7, r11, #16\n\t"
  85811. "mul r6, r7, r6\n\t"
  85812. "lsr r7, r6, #16\n\t"
  85813. "lsl r6, r6, #16\n\t"
  85814. "adds r12, r12, r6\n\t"
  85815. "adc r5, r5, r7\n\t"
  85816. #else
  85817. "umull r6, r7, r8, r11\n\t"
  85818. "adds r12, r12, r6\n\t"
  85819. "adc r5, r7, #0\n\t"
  85820. #endif
  85821. /* a[i+1] += m[1] * mu */
  85822. "ldr r7, [%[m], #4]\n\t"
  85823. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85824. "lsr r10, r7, #16\n\t"
  85825. "lsr r6, r8, #16\n\t"
  85826. "mul r4, r6, r10\n\t"
  85827. "lsl r10, r7, #16\n\t"
  85828. "lsr r10, r10, #16\n\t"
  85829. "mul r6, r10, r6\n\t"
  85830. "lsr r10, r6, #16\n\t"
  85831. "lsl r6, r6, #16\n\t"
  85832. "adds lr, lr, r6\n\t"
  85833. "adc r4, r4, r10\n\t"
  85834. "lsl r6, r8, #16\n\t"
  85835. "lsl r10, r7, #16\n\t"
  85836. "lsr r6, r6, #16\n\t"
  85837. "lsr r10, r10, #16\n\t"
  85838. "mul r10, r6, r10\n\t"
  85839. "adds lr, lr, r10\n\t"
  85840. "adc r4, r4, #0\n\t"
  85841. "lsr r10, r7, #16\n\t"
  85842. "mul r6, r10, r6\n\t"
  85843. "lsr r10, r6, #16\n\t"
  85844. "lsl r6, r6, #16\n\t"
  85845. "adds lr, lr, r6\n\t"
  85846. "adc r4, r4, r10\n\t"
  85847. #else
  85848. "umull r6, r10, r8, r7\n\t"
  85849. "adds lr, lr, r6\n\t"
  85850. "adc r4, r10, #0\n\t"
  85851. #endif
  85852. "mov r12, lr\n\t"
  85853. "adds r12, r12, r5\n\t"
  85854. "adc r4, r4, #0\n\t"
  85855. /* a[i+2] += m[2] * mu */
  85856. "ldr r7, [%[m], #8]\n\t"
  85857. "ldr lr, [%[a], #8]\n\t"
  85858. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85859. "lsr r10, r7, #16\n\t"
  85860. "lsr r6, r8, #16\n\t"
  85861. "mul r5, r6, r10\n\t"
  85862. "lsl r10, r7, #16\n\t"
  85863. "lsr r10, r10, #16\n\t"
  85864. "mul r6, r10, r6\n\t"
  85865. "lsr r10, r6, #16\n\t"
  85866. "lsl r6, r6, #16\n\t"
  85867. "adds lr, lr, r6\n\t"
  85868. "adc r5, r5, r10\n\t"
  85869. "lsl r6, r8, #16\n\t"
  85870. "lsl r10, r7, #16\n\t"
  85871. "lsr r6, r6, #16\n\t"
  85872. "lsr r10, r10, #16\n\t"
  85873. "mul r10, r6, r10\n\t"
  85874. "adds lr, lr, r10\n\t"
  85875. "adc r5, r5, #0\n\t"
  85876. "lsr r10, r7, #16\n\t"
  85877. "mul r6, r10, r6\n\t"
  85878. "lsr r10, r6, #16\n\t"
  85879. "lsl r6, r6, #16\n\t"
  85880. "adds lr, lr, r6\n\t"
  85881. "adc r5, r5, r10\n\t"
  85882. #else
  85883. "umull r6, r10, r8, r7\n\t"
  85884. "adds lr, lr, r6\n\t"
  85885. "adc r5, r10, #0\n\t"
  85886. #endif
  85887. "adds lr, lr, r4\n\t"
  85888. "adc r5, r5, #0\n\t"
  85889. /* a[i+3] += m[3] * mu */
  85890. "ldr r7, [%[m], #12]\n\t"
  85891. "ldr r10, [%[a], #12]\n\t"
  85892. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85893. "lsr r11, r7, #16\n\t"
  85894. "lsr r6, r8, #16\n\t"
  85895. "mul r4, r6, r11\n\t"
  85896. "lsl r11, r7, #16\n\t"
  85897. "lsr r11, r11, #16\n\t"
  85898. "mul r6, r11, r6\n\t"
  85899. "lsr r11, r6, #16\n\t"
  85900. "lsl r6, r6, #16\n\t"
  85901. "adds r10, r10, r6\n\t"
  85902. "adc r4, r4, r11\n\t"
  85903. "lsl r6, r8, #16\n\t"
  85904. "lsl r11, r7, #16\n\t"
  85905. "lsr r6, r6, #16\n\t"
  85906. "lsr r11, r11, #16\n\t"
  85907. "mul r11, r6, r11\n\t"
  85908. "adds r10, r10, r11\n\t"
  85909. "adc r4, r4, #0\n\t"
  85910. "lsr r11, r7, #16\n\t"
  85911. "mul r6, r11, r6\n\t"
  85912. "lsr r11, r6, #16\n\t"
  85913. "lsl r6, r6, #16\n\t"
  85914. "adds r10, r10, r6\n\t"
  85915. "adc r4, r4, r11\n\t"
  85916. #else
  85917. "umull r6, r7, r8, r7\n\t"
  85918. "adds r10, r10, r6\n\t"
  85919. "adc r4, r7, #0\n\t"
  85920. #endif
  85921. "adds r10, r10, r5\n\t"
  85922. "str r10, [%[a], #12]\n\t"
  85923. "adc r4, r4, #0\n\t"
  85924. /* a[i+4] += m[4] * mu */
  85925. "ldr r7, [%[m], #16]\n\t"
  85926. "ldr r10, [%[a], #16]\n\t"
  85927. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85928. "lsr r11, r7, #16\n\t"
  85929. "lsr r6, r8, #16\n\t"
  85930. "mul r5, r6, r11\n\t"
  85931. "lsl r11, r7, #16\n\t"
  85932. "lsr r11, r11, #16\n\t"
  85933. "mul r6, r11, r6\n\t"
  85934. "lsr r11, r6, #16\n\t"
  85935. "lsl r6, r6, #16\n\t"
  85936. "adds r10, r10, r6\n\t"
  85937. "adc r5, r5, r11\n\t"
  85938. "lsl r6, r8, #16\n\t"
  85939. "lsl r11, r7, #16\n\t"
  85940. "lsr r6, r6, #16\n\t"
  85941. "lsr r11, r11, #16\n\t"
  85942. "mul r11, r6, r11\n\t"
  85943. "adds r10, r10, r11\n\t"
  85944. "adc r5, r5, #0\n\t"
  85945. "lsr r11, r7, #16\n\t"
  85946. "mul r6, r11, r6\n\t"
  85947. "lsr r11, r6, #16\n\t"
  85948. "lsl r6, r6, #16\n\t"
  85949. "adds r10, r10, r6\n\t"
  85950. "adc r5, r5, r11\n\t"
  85951. #else
  85952. "umull r6, r7, r8, r7\n\t"
  85953. "adds r10, r10, r6\n\t"
  85954. "adc r5, r7, #0\n\t"
  85955. #endif
  85956. "adds r10, r10, r4\n\t"
  85957. "str r10, [%[a], #16]\n\t"
  85958. "adc r5, r5, #0\n\t"
  85959. /* a[i+5] += m[5] * mu */
  85960. "ldr r7, [%[m], #20]\n\t"
  85961. "ldr r10, [%[a], #20]\n\t"
  85962. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85963. "lsr r11, r7, #16\n\t"
  85964. "lsr r6, r8, #16\n\t"
  85965. "mul r4, r6, r11\n\t"
  85966. "lsl r11, r7, #16\n\t"
  85967. "lsr r11, r11, #16\n\t"
  85968. "mul r6, r11, r6\n\t"
  85969. "lsr r11, r6, #16\n\t"
  85970. "lsl r6, r6, #16\n\t"
  85971. "adds r10, r10, r6\n\t"
  85972. "adc r4, r4, r11\n\t"
  85973. "lsl r6, r8, #16\n\t"
  85974. "lsl r11, r7, #16\n\t"
  85975. "lsr r6, r6, #16\n\t"
  85976. "lsr r11, r11, #16\n\t"
  85977. "mul r11, r6, r11\n\t"
  85978. "adds r10, r10, r11\n\t"
  85979. "adc r4, r4, #0\n\t"
  85980. "lsr r11, r7, #16\n\t"
  85981. "mul r6, r11, r6\n\t"
  85982. "lsr r11, r6, #16\n\t"
  85983. "lsl r6, r6, #16\n\t"
  85984. "adds r10, r10, r6\n\t"
  85985. "adc r4, r4, r11\n\t"
  85986. #else
  85987. "umull r6, r7, r8, r7\n\t"
  85988. "adds r10, r10, r6\n\t"
  85989. "adc r4, r7, #0\n\t"
  85990. #endif
  85991. "adds r10, r10, r5\n\t"
  85992. "str r10, [%[a], #20]\n\t"
  85993. "adc r4, r4, #0\n\t"
  85994. /* a[i+6] += m[6] * mu */
  85995. "ldr r7, [%[m], #24]\n\t"
  85996. "ldr r10, [%[a], #24]\n\t"
  85997. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  85998. "lsr r11, r7, #16\n\t"
  85999. "lsr r6, r8, #16\n\t"
  86000. "mul r5, r6, r11\n\t"
  86001. "lsl r11, r7, #16\n\t"
  86002. "lsr r11, r11, #16\n\t"
  86003. "mul r6, r11, r6\n\t"
  86004. "lsr r11, r6, #16\n\t"
  86005. "lsl r6, r6, #16\n\t"
  86006. "adds r10, r10, r6\n\t"
  86007. "adc r5, r5, r11\n\t"
  86008. "lsl r6, r8, #16\n\t"
  86009. "lsl r11, r7, #16\n\t"
  86010. "lsr r6, r6, #16\n\t"
  86011. "lsr r11, r11, #16\n\t"
  86012. "mul r11, r6, r11\n\t"
  86013. "adds r10, r10, r11\n\t"
  86014. "adc r5, r5, #0\n\t"
  86015. "lsr r11, r7, #16\n\t"
  86016. "mul r6, r11, r6\n\t"
  86017. "lsr r11, r6, #16\n\t"
  86018. "lsl r6, r6, #16\n\t"
  86019. "adds r10, r10, r6\n\t"
  86020. "adc r5, r5, r11\n\t"
  86021. #else
  86022. "umull r6, r7, r8, r7\n\t"
  86023. "adds r10, r10, r6\n\t"
  86024. "adc r5, r7, #0\n\t"
  86025. #endif
  86026. "adds r10, r10, r4\n\t"
  86027. "str r10, [%[a], #24]\n\t"
  86028. "adc r5, r5, #0\n\t"
  86029. /* a[i+7] += m[7] * mu */
  86030. "ldr r7, [%[m], #28]\n\t"
  86031. "ldr r10, [%[a], #28]\n\t"
  86032. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  86033. "lsr r11, r7, #16\n\t"
  86034. "lsr r6, r8, #16\n\t"
  86035. "mul r4, r6, r11\n\t"
  86036. "lsl r11, r7, #16\n\t"
  86037. "lsr r11, r11, #16\n\t"
  86038. "mul r6, r11, r6\n\t"
  86039. "lsr r11, r6, #16\n\t"
  86040. "lsl r6, r6, #16\n\t"
  86041. "adds r10, r10, r6\n\t"
  86042. "adc r4, r4, r11\n\t"
  86043. "lsl r6, r8, #16\n\t"
  86044. "lsl r11, r7, #16\n\t"
  86045. "lsr r6, r6, #16\n\t"
  86046. "lsr r11, r11, #16\n\t"
  86047. "mul r11, r6, r11\n\t"
  86048. "adds r10, r10, r11\n\t"
  86049. "adc r4, r4, #0\n\t"
  86050. "lsr r11, r7, #16\n\t"
  86051. "mul r6, r11, r6\n\t"
  86052. "lsr r11, r6, #16\n\t"
  86053. "lsl r6, r6, #16\n\t"
  86054. "adds r10, r10, r6\n\t"
  86055. "adc r4, r4, r11\n\t"
  86056. #else
  86057. "umull r6, r7, r8, r7\n\t"
  86058. "adds r10, r10, r6\n\t"
  86059. "adc r4, r7, #0\n\t"
  86060. #endif
  86061. "adds r10, r10, r5\n\t"
  86062. "str r10, [%[a], #28]\n\t"
  86063. "adc r4, r4, #0\n\t"
  86064. /* a[i+8] += m[8] * mu */
  86065. "ldr r7, [%[m], #32]\n\t"
  86066. "ldr r10, [%[a], #32]\n\t"
  86067. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  86068. "lsr r11, r7, #16\n\t"
  86069. "lsr r6, r8, #16\n\t"
  86070. "mul r5, r6, r11\n\t"
  86071. "lsl r11, r7, #16\n\t"
  86072. "lsr r11, r11, #16\n\t"
  86073. "mul r6, r11, r6\n\t"
  86074. "lsr r11, r6, #16\n\t"
  86075. "lsl r6, r6, #16\n\t"
  86076. "adds r10, r10, r6\n\t"
  86077. "adc r5, r5, r11\n\t"
  86078. "lsl r6, r8, #16\n\t"
  86079. "lsl r11, r7, #16\n\t"
  86080. "lsr r6, r6, #16\n\t"
  86081. "lsr r11, r11, #16\n\t"
  86082. "mul r11, r6, r11\n\t"
  86083. "adds r10, r10, r11\n\t"
  86084. "adc r5, r5, #0\n\t"
  86085. "lsr r11, r7, #16\n\t"
  86086. "mul r6, r11, r6\n\t"
  86087. "lsr r11, r6, #16\n\t"
  86088. "lsl r6, r6, #16\n\t"
  86089. "adds r10, r10, r6\n\t"
  86090. "adc r5, r5, r11\n\t"
  86091. #else
  86092. "umull r6, r7, r8, r7\n\t"
  86093. "adds r10, r10, r6\n\t"
  86094. "adc r5, r7, #0\n\t"
  86095. #endif
  86096. "adds r10, r10, r4\n\t"
  86097. "str r10, [%[a], #32]\n\t"
  86098. "adc r5, r5, #0\n\t"
  86099. /* a[i+9] += m[9] * mu */
  86100. "ldr r7, [%[m], #36]\n\t"
  86101. "ldr r10, [%[a], #36]\n\t"
  86102. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  86103. "lsr r11, r7, #16\n\t"
  86104. "lsr r6, r8, #16\n\t"
  86105. "mul r4, r6, r11\n\t"
  86106. "lsl r11, r7, #16\n\t"
  86107. "lsr r11, r11, #16\n\t"
  86108. "mul r6, r11, r6\n\t"
  86109. "lsr r11, r6, #16\n\t"
  86110. "lsl r6, r6, #16\n\t"
  86111. "adds r10, r10, r6\n\t"
  86112. "adc r4, r4, r11\n\t"
  86113. "lsl r6, r8, #16\n\t"
  86114. "lsl r11, r7, #16\n\t"
  86115. "lsr r6, r6, #16\n\t"
  86116. "lsr r11, r11, #16\n\t"
  86117. "mul r11, r6, r11\n\t"
  86118. "adds r10, r10, r11\n\t"
  86119. "adc r4, r4, #0\n\t"
  86120. "lsr r11, r7, #16\n\t"
  86121. "mul r6, r11, r6\n\t"
  86122. "lsr r11, r6, #16\n\t"
  86123. "lsl r6, r6, #16\n\t"
  86124. "adds r10, r10, r6\n\t"
  86125. "adc r4, r4, r11\n\t"
  86126. #else
  86127. "umull r6, r7, r8, r7\n\t"
  86128. "adds r10, r10, r6\n\t"
  86129. "adc r4, r7, #0\n\t"
  86130. #endif
  86131. "adds r10, r10, r5\n\t"
  86132. "str r10, [%[a], #36]\n\t"
  86133. "adc r4, r4, #0\n\t"
  86134. /* a[i+10] += m[10] * mu */
  86135. "ldr r7, [%[m], #40]\n\t"
  86136. "ldr r10, [%[a], #40]\n\t"
  86137. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  86138. "lsr r11, r7, #16\n\t"
  86139. "lsr r6, r8, #16\n\t"
  86140. "mul r5, r6, r11\n\t"
  86141. "lsl r11, r7, #16\n\t"
  86142. "lsr r11, r11, #16\n\t"
  86143. "mul r6, r11, r6\n\t"
  86144. "lsr r11, r6, #16\n\t"
  86145. "lsl r6, r6, #16\n\t"
  86146. "adds r10, r10, r6\n\t"
  86147. "adc r5, r5, r11\n\t"
  86148. "lsl r6, r8, #16\n\t"
  86149. "lsl r11, r7, #16\n\t"
  86150. "lsr r6, r6, #16\n\t"
  86151. "lsr r11, r11, #16\n\t"
  86152. "mul r11, r6, r11\n\t"
  86153. "adds r10, r10, r11\n\t"
  86154. "adc r5, r5, #0\n\t"
  86155. "lsr r11, r7, #16\n\t"
  86156. "mul r6, r11, r6\n\t"
  86157. "lsr r11, r6, #16\n\t"
  86158. "lsl r6, r6, #16\n\t"
  86159. "adds r10, r10, r6\n\t"
  86160. "adc r5, r5, r11\n\t"
  86161. #else
  86162. "umull r6, r7, r8, r7\n\t"
  86163. "adds r10, r10, r6\n\t"
  86164. "adc r5, r7, #0\n\t"
  86165. #endif
  86166. "adds r10, r10, r4\n\t"
  86167. "str r10, [%[a], #40]\n\t"
  86168. "adc r5, r5, #0\n\t"
  86169. /* a[i+11] += m[11] * mu */
  86170. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  86171. "ldr r7, [%[m], #44]\n\t"
  86172. #else
  86173. "ldr r11, [%[m], #44]\n\t"
  86174. #endif
  86175. "ldr r10, [%[a], #44]\n\t"
  86176. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  86177. "lsl r6, r8, #16\n\t"
  86178. "lsl r7, r11, #16\n\t"
  86179. "lsr r6, r6, #16\n\t"
  86180. "lsr r7, r7, #16\n\t"
  86181. "mul r7, r6, r7\n\t"
  86182. "adds r5, r5, r7\n\t"
  86183. "adcs r4, r3, #0\n\t"
  86184. "mov r3, #0\n\t"
  86185. "adc r3, r3, r3\n\t"
  86186. "lsr r7, r11, #16\n\t"
  86187. "mul r6, r7, r6\n\t"
  86188. "lsr r7, r6, #16\n\t"
  86189. "lsl r6, r6, #16\n\t"
  86190. "adds r5, r5, r6\n\t"
  86191. "adcs r4, r4, r7\n\t"
  86192. "adc r3, r3, #0\n\t"
  86193. "mov r6, r8\n\t"
  86194. "lsr r7, r11, #16\n\t"
  86195. "lsr r6, r6, #16\n\t"
  86196. "mul r7, r6, r7\n\t"
  86197. "adds r4, r4, r7\n\t"
  86198. "lsl r7, r11, #16\n\t"
  86199. "adc r3, r3, #0\n\t"
  86200. "lsr r7, r7, #16\n\t"
  86201. "mul r6, r7, r6\n\t"
  86202. "lsr r7, r6, #16\n\t"
  86203. "lsl r6, r6, #16\n\t"
  86204. "adds r5, r5, r6\n\t"
  86205. "adcs r4, r4, r7\n\t"
  86206. "adc r3, r3, #0\n\t"
  86207. #else
  86208. "umull r6, r7, r8, r7\n\t"
  86209. "adds r5, r5, r6\n\t"
  86210. "adcs r4, r7, r3\n\t"
  86211. "mov r3, #0\n\t"
  86212. "adc r3, r3, r3\n\t"
  86213. #endif
  86214. "adds r10, r10, r5\n\t"
  86215. "str r10, [%[a], #44]\n\t"
  86216. "ldr r10, [%[a], #48]\n\t"
  86217. "adcs r10, r10, r4\n\t"
  86218. "str r10, [%[a], #48]\n\t"
  86219. "adc r3, r3, #0\n\t"
  86220. /* i += 1 */
  86221. "add r9, r9, #4\n\t"
  86222. "add %[a], %[a], #4\n\t"
  86223. "cmp r9, #48\n\t"
  86224. "blt L_sp_384_mont_reduce_12_word_%=\n\t"
  86225. "str r12, [%[a]]\n\t"
  86226. "str lr, [%[a], #4]\n\t"
  86227. "mov %[mp], r3\n\t"
  86228. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  86229. :
  86230. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  86231. );
  86232. sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - mp);
  86233. }
  86234. /* Multiply two Montgomery form numbers mod the modulus (prime).
  86235. * (r = a * b mod m)
  86236. *
  86237. * r Result of multiplication.
  86238. * a First number to multiply in Montgomery form.
  86239. * b Second number to multiply in Montgomery form.
  86240. * m Modulus (prime).
  86241. * mp Montgomery mulitplier.
  86242. */
  86243. SP_NOINLINE static void sp_384_mont_mul_12(sp_digit* r, const sp_digit* a,
  86244. const sp_digit* b, const sp_digit* m, sp_digit mp)
  86245. {
  86246. sp_384_mul_12(r, a, b);
  86247. sp_384_mont_reduce_12(r, m, mp);
  86248. }
  86249. /* Square the Montgomery form number. (r = a * a mod m)
  86250. *
  86251. * r Result of squaring.
  86252. * a Number to square in Montgomery form.
  86253. * m Modulus (prime).
  86254. * mp Montgomery mulitplier.
  86255. */
  86256. SP_NOINLINE static void sp_384_mont_sqr_12(sp_digit* r, const sp_digit* a,
  86257. const sp_digit* m, sp_digit mp)
  86258. {
  86259. sp_384_sqr_12(r, a);
  86260. sp_384_mont_reduce_12(r, m, mp);
  86261. }
  86262. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  86263. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  86264. *
  86265. * r Result of squaring.
  86266. * a Number to square in Montgomery form.
  86267. * n Number of times to square.
  86268. * m Modulus (prime).
  86269. * mp Montgomery mulitplier.
  86270. */
  86271. static void sp_384_mont_sqr_n_12(sp_digit* r, const sp_digit* a, int n,
  86272. const sp_digit* m, sp_digit mp)
  86273. {
  86274. sp_384_mont_sqr_12(r, a, m, mp);
  86275. for (; n > 1; n--) {
  86276. sp_384_mont_sqr_12(r, r, m, mp);
  86277. }
  86278. }
  86279. #endif /* !WOLFSSL_SP_SMALL || HAVE_COMP_KEY */
  86280. #ifdef WOLFSSL_SP_SMALL
  86281. /* Mod-2 for the P384 curve. */
  86282. static const uint32_t p384_mod_minus_2[12] = {
  86283. 0xfffffffdU,0x00000000U,0x00000000U,0xffffffffU,0xfffffffeU,0xffffffffU,
  86284. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  86285. };
  86286. #endif /* !WOLFSSL_SP_SMALL */
  86287. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  86288. * P384 curve. (r = 1 / a mod m)
  86289. *
  86290. * r Inverse result.
  86291. * a Number to invert.
  86292. * td Temporary data.
  86293. */
  86294. static void sp_384_mont_inv_12(sp_digit* r, const sp_digit* a, sp_digit* td)
  86295. {
  86296. #ifdef WOLFSSL_SP_SMALL
  86297. sp_digit* t = td;
  86298. int i;
  86299. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  86300. for (i=382; i>=0; i--) {
  86301. sp_384_mont_sqr_12(t, t, p384_mod, p384_mp_mod);
  86302. if (p384_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  86303. sp_384_mont_mul_12(t, t, a, p384_mod, p384_mp_mod);
  86304. }
  86305. XMEMCPY(r, t, sizeof(sp_digit) * 12);
  86306. #else
  86307. sp_digit* t1 = td;
  86308. sp_digit* t2 = td + 2 * 12;
  86309. sp_digit* t3 = td + 4 * 12;
  86310. sp_digit* t4 = td + 6 * 12;
  86311. sp_digit* t5 = td + 8 * 12;
  86312. /* 0x2 */
  86313. sp_384_mont_sqr_12(t1, a, p384_mod, p384_mp_mod);
  86314. /* 0x3 */
  86315. sp_384_mont_mul_12(t5, t1, a, p384_mod, p384_mp_mod);
  86316. /* 0xc */
  86317. sp_384_mont_sqr_n_12(t1, t5, 2, p384_mod, p384_mp_mod);
  86318. /* 0xf */
  86319. sp_384_mont_mul_12(t2, t5, t1, p384_mod, p384_mp_mod);
  86320. /* 0x1e */
  86321. sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod);
  86322. /* 0x1f */
  86323. sp_384_mont_mul_12(t4, t1, a, p384_mod, p384_mp_mod);
  86324. /* 0x3e0 */
  86325. sp_384_mont_sqr_n_12(t1, t4, 5, p384_mod, p384_mp_mod);
  86326. /* 0x3ff */
  86327. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  86328. /* 0x7fe0 */
  86329. sp_384_mont_sqr_n_12(t1, t2, 5, p384_mod, p384_mp_mod);
  86330. /* 0x7fff */
  86331. sp_384_mont_mul_12(t4, t4, t1, p384_mod, p384_mp_mod);
  86332. /* 0x3fff8000 */
  86333. sp_384_mont_sqr_n_12(t1, t4, 15, p384_mod, p384_mp_mod);
  86334. /* 0x3fffffff */
  86335. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  86336. /* 0xfffffffc */
  86337. sp_384_mont_sqr_n_12(t3, t2, 2, p384_mod, p384_mp_mod);
  86338. /* 0xfffffffd */
  86339. sp_384_mont_mul_12(r, t3, a, p384_mod, p384_mp_mod);
  86340. /* 0xffffffff */
  86341. sp_384_mont_mul_12(t3, t5, t3, p384_mod, p384_mp_mod);
  86342. /* 0xfffffffc0000000 */
  86343. sp_384_mont_sqr_n_12(t1, t2, 30, p384_mod, p384_mp_mod);
  86344. /* 0xfffffffffffffff */
  86345. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  86346. /* 0xfffffffffffffff000000000000000 */
  86347. sp_384_mont_sqr_n_12(t1, t2, 60, p384_mod, p384_mp_mod);
  86348. /* 0xffffffffffffffffffffffffffffff */
  86349. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  86350. /* 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  86351. sp_384_mont_sqr_n_12(t1, t2, 120, p384_mod, p384_mp_mod);
  86352. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  86353. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  86354. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  86355. sp_384_mont_sqr_n_12(t1, t2, 15, p384_mod, p384_mp_mod);
  86356. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  86357. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  86358. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000 */
  86359. sp_384_mont_sqr_n_12(t1, t2, 33, p384_mod, p384_mp_mod);
  86360. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff */
  86361. sp_384_mont_mul_12(t2, t3, t1, p384_mod, p384_mp_mod);
  86362. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000000000000 */
  86363. sp_384_mont_sqr_n_12(t1, t2, 96, p384_mod, p384_mp_mod);
  86364. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffd */
  86365. sp_384_mont_mul_12(r, r, t1, p384_mod, p384_mp_mod);
  86366. #endif /* WOLFSSL_SP_SMALL */
  86367. }
  86368. /* Compare a with b in constant time.
  86369. *
  86370. * a A single precision integer.
  86371. * b A single precision integer.
  86372. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  86373. * respectively.
  86374. */
  86375. static sp_int32 sp_384_cmp_12(const sp_digit* a_p, const sp_digit* b_p)
  86376. {
  86377. register const sp_digit* a asm ("r0") = a_p;
  86378. register const sp_digit* b asm ("r1") = b_p;
  86379. __asm__ __volatile__ (
  86380. "mov r2, #-1\n\t"
  86381. "mov r6, #1\n\t"
  86382. "mov r5, #0\n\t"
  86383. "mov r3, #-1\n\t"
  86384. #ifdef WOLFSSL_SP_SMALL
  86385. "mov r4, #44\n\t"
  86386. "\n"
  86387. "L_sp_384_cmp_12_words_%=: \n\t"
  86388. "ldr r12, [%[a], r4]\n\t"
  86389. "ldr lr, [%[b], r4]\n\t"
  86390. "and r12, r12, r3\n\t"
  86391. "and lr, lr, r3\n\t"
  86392. "subs r12, r12, lr\n\t"
  86393. "it hi\n\t"
  86394. "movhi r2, r6\n\t"
  86395. "it lo\n\t"
  86396. "movlo r2, r3\n\t"
  86397. "it ne\n\t"
  86398. "movne r3, r5\n\t"
  86399. "subs r4, r4, #4\n\t"
  86400. "bcs L_sp_384_cmp_12_words_%=\n\t"
  86401. "eor r2, r2, r3\n\t"
  86402. #else
  86403. "ldr r12, [%[a], #44]\n\t"
  86404. "ldr lr, [%[b], #44]\n\t"
  86405. "and r12, r12, r3\n\t"
  86406. "and lr, lr, r3\n\t"
  86407. "subs r12, r12, lr\n\t"
  86408. "it hi\n\t"
  86409. "movhi r2, r6\n\t"
  86410. "it lo\n\t"
  86411. "movlo r2, r3\n\t"
  86412. "it ne\n\t"
  86413. "movne r3, r5\n\t"
  86414. "ldr r12, [%[a], #40]\n\t"
  86415. "ldr lr, [%[b], #40]\n\t"
  86416. "and r12, r12, r3\n\t"
  86417. "and lr, lr, r3\n\t"
  86418. "subs r12, r12, lr\n\t"
  86419. "it hi\n\t"
  86420. "movhi r2, r6\n\t"
  86421. "it lo\n\t"
  86422. "movlo r2, r3\n\t"
  86423. "it ne\n\t"
  86424. "movne r3, r5\n\t"
  86425. "ldr r12, [%[a], #36]\n\t"
  86426. "ldr lr, [%[b], #36]\n\t"
  86427. "and r12, r12, r3\n\t"
  86428. "and lr, lr, r3\n\t"
  86429. "subs r12, r12, lr\n\t"
  86430. "it hi\n\t"
  86431. "movhi r2, r6\n\t"
  86432. "it lo\n\t"
  86433. "movlo r2, r3\n\t"
  86434. "it ne\n\t"
  86435. "movne r3, r5\n\t"
  86436. "ldr r12, [%[a], #32]\n\t"
  86437. "ldr lr, [%[b], #32]\n\t"
  86438. "and r12, r12, r3\n\t"
  86439. "and lr, lr, r3\n\t"
  86440. "subs r12, r12, lr\n\t"
  86441. "it hi\n\t"
  86442. "movhi r2, r6\n\t"
  86443. "it lo\n\t"
  86444. "movlo r2, r3\n\t"
  86445. "it ne\n\t"
  86446. "movne r3, r5\n\t"
  86447. "ldr r12, [%[a], #28]\n\t"
  86448. "ldr lr, [%[b], #28]\n\t"
  86449. "and r12, r12, r3\n\t"
  86450. "and lr, lr, r3\n\t"
  86451. "subs r12, r12, lr\n\t"
  86452. "it hi\n\t"
  86453. "movhi r2, r6\n\t"
  86454. "it lo\n\t"
  86455. "movlo r2, r3\n\t"
  86456. "it ne\n\t"
  86457. "movne r3, r5\n\t"
  86458. "ldr r12, [%[a], #24]\n\t"
  86459. "ldr lr, [%[b], #24]\n\t"
  86460. "and r12, r12, r3\n\t"
  86461. "and lr, lr, r3\n\t"
  86462. "subs r12, r12, lr\n\t"
  86463. "it hi\n\t"
  86464. "movhi r2, r6\n\t"
  86465. "it lo\n\t"
  86466. "movlo r2, r3\n\t"
  86467. "it ne\n\t"
  86468. "movne r3, r5\n\t"
  86469. "ldr r12, [%[a], #20]\n\t"
  86470. "ldr lr, [%[b], #20]\n\t"
  86471. "and r12, r12, r3\n\t"
  86472. "and lr, lr, r3\n\t"
  86473. "subs r12, r12, lr\n\t"
  86474. "it hi\n\t"
  86475. "movhi r2, r6\n\t"
  86476. "it lo\n\t"
  86477. "movlo r2, r3\n\t"
  86478. "it ne\n\t"
  86479. "movne r3, r5\n\t"
  86480. "ldr r12, [%[a], #16]\n\t"
  86481. "ldr lr, [%[b], #16]\n\t"
  86482. "and r12, r12, r3\n\t"
  86483. "and lr, lr, r3\n\t"
  86484. "subs r12, r12, lr\n\t"
  86485. "it hi\n\t"
  86486. "movhi r2, r6\n\t"
  86487. "it lo\n\t"
  86488. "movlo r2, r3\n\t"
  86489. "it ne\n\t"
  86490. "movne r3, r5\n\t"
  86491. "ldr r12, [%[a], #12]\n\t"
  86492. "ldr lr, [%[b], #12]\n\t"
  86493. "and r12, r12, r3\n\t"
  86494. "and lr, lr, r3\n\t"
  86495. "subs r12, r12, lr\n\t"
  86496. "it hi\n\t"
  86497. "movhi r2, r6\n\t"
  86498. "it lo\n\t"
  86499. "movlo r2, r3\n\t"
  86500. "it ne\n\t"
  86501. "movne r3, r5\n\t"
  86502. "ldr r12, [%[a], #8]\n\t"
  86503. "ldr lr, [%[b], #8]\n\t"
  86504. "and r12, r12, r3\n\t"
  86505. "and lr, lr, r3\n\t"
  86506. "subs r12, r12, lr\n\t"
  86507. "it hi\n\t"
  86508. "movhi r2, r6\n\t"
  86509. "it lo\n\t"
  86510. "movlo r2, r3\n\t"
  86511. "it ne\n\t"
  86512. "movne r3, r5\n\t"
  86513. "ldr r12, [%[a], #4]\n\t"
  86514. "ldr lr, [%[b], #4]\n\t"
  86515. "and r12, r12, r3\n\t"
  86516. "and lr, lr, r3\n\t"
  86517. "subs r12, r12, lr\n\t"
  86518. "it hi\n\t"
  86519. "movhi r2, r6\n\t"
  86520. "it lo\n\t"
  86521. "movlo r2, r3\n\t"
  86522. "it ne\n\t"
  86523. "movne r3, r5\n\t"
  86524. "ldr r12, [%[a]]\n\t"
  86525. "ldr lr, [%[b]]\n\t"
  86526. "and r12, r12, r3\n\t"
  86527. "and lr, lr, r3\n\t"
  86528. "subs r12, r12, lr\n\t"
  86529. "it hi\n\t"
  86530. "movhi r2, r6\n\t"
  86531. "it lo\n\t"
  86532. "movlo r2, r3\n\t"
  86533. "it ne\n\t"
  86534. "movne r3, r5\n\t"
  86535. "eor r2, r2, r3\n\t"
  86536. #endif /*WOLFSSL_SP_SMALL */
  86537. "mov %[a], r2\n\t"
  86538. : [a] "+r" (a), [b] "+r" (b)
  86539. :
  86540. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6"
  86541. );
  86542. return (uint32_t)(size_t)a;
  86543. }
  86544. /* Normalize the values in each word to 32.
  86545. *
  86546. * a Array of sp_digit to normalize.
  86547. */
  86548. #define sp_384_norm_12(a)
  86549. /* Map the Montgomery form projective coordinate point to an affine point.
  86550. *
  86551. * r Resulting affine coordinate point.
  86552. * p Montgomery form projective coordinate point.
  86553. * t Temporary ordinate data.
  86554. */
  86555. static void sp_384_map_12(sp_point_384* r, const sp_point_384* p,
  86556. sp_digit* t)
  86557. {
  86558. sp_digit* t1 = t;
  86559. sp_digit* t2 = t + 2*12;
  86560. sp_int32 n;
  86561. sp_384_mont_inv_12(t1, p->z, t + 2*12);
  86562. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  86563. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  86564. /* x /= z^2 */
  86565. sp_384_mont_mul_12(r->x, p->x, t2, p384_mod, p384_mp_mod);
  86566. XMEMSET(r->x + 12, 0, sizeof(r->x) / 2U);
  86567. sp_384_mont_reduce_12(r->x, p384_mod, p384_mp_mod);
  86568. /* Reduce x to less than modulus */
  86569. n = sp_384_cmp_12(r->x, p384_mod);
  86570. sp_384_cond_sub_12(r->x, r->x, p384_mod, ~(n >> 31));
  86571. sp_384_norm_12(r->x);
  86572. /* y /= z^3 */
  86573. sp_384_mont_mul_12(r->y, p->y, t1, p384_mod, p384_mp_mod);
  86574. XMEMSET(r->y + 12, 0, sizeof(r->y) / 2U);
  86575. sp_384_mont_reduce_12(r->y, p384_mod, p384_mp_mod);
  86576. /* Reduce y to less than modulus */
  86577. n = sp_384_cmp_12(r->y, p384_mod);
  86578. sp_384_cond_sub_12(r->y, r->y, p384_mod, ~(n >> 31));
  86579. sp_384_norm_12(r->y);
  86580. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  86581. r->z[0] = 1;
  86582. }
  86583. /* Add two Montgomery form numbers (r = a + b % m).
  86584. *
  86585. * r Result of addition.
  86586. * a First number to add in Montgomery form.
  86587. * b Second number to add in Montgomery form.
  86588. * m Modulus (prime).
  86589. */
  86590. static void sp_384_mont_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p)
  86591. {
  86592. register sp_digit* r asm ("r0") = r_p;
  86593. register const sp_digit* a asm ("r1") = a_p;
  86594. register const sp_digit* b asm ("r2") = b_p;
  86595. register const sp_digit* m asm ("r3") = m_p;
  86596. sp_digit o;
  86597. o = sp_384_add_12(r, a, b);
  86598. sp_384_cond_sub_12(r, r, m, 0 - o);
  86599. }
  86600. /* Double a Montgomery form number (r = a + a % m).
  86601. *
  86602. * r Result of doubling.
  86603. * a Number to double in Montgomery form.
  86604. * m Modulus (prime).
  86605. */
  86606. static void sp_384_mont_dbl_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  86607. {
  86608. register sp_digit* r asm ("r0") = r_p;
  86609. register const sp_digit* a asm ("r1") = a_p;
  86610. register const sp_digit* m asm ("r2") = m_p;
  86611. sp_digit o;
  86612. o = sp_384_add_12(r, a, a);
  86613. sp_384_cond_sub_12(r, r, m, 0 - o);
  86614. }
  86615. /* Triple a Montgomery form number (r = a + a + a % m).
  86616. *
  86617. * r Result of Tripling.
  86618. * a Number to triple in Montgomery form.
  86619. * m Modulus (prime).
  86620. */
  86621. static void sp_384_mont_tpl_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  86622. {
  86623. register sp_digit* r asm ("r0") = r_p;
  86624. register const sp_digit* a asm ("r1") = a_p;
  86625. register const sp_digit* m asm ("r2") = m_p;
  86626. sp_digit o;
  86627. o = sp_384_add_12(r, a, a);
  86628. sp_384_cond_sub_12(r, r, m, 0 - o);
  86629. o = sp_384_add_12(r, r, a);
  86630. sp_384_cond_sub_12(r, r, m, 0 - o);
  86631. }
  86632. #ifdef WOLFSSL_SP_SMALL
  86633. /* Conditionally add a and b using the mask m.
  86634. * m is -1 to add and 0 when not.
  86635. *
  86636. * r A single precision number representing conditional add result.
  86637. * a A single precision number to add with.
  86638. * b A single precision number to add.
  86639. * m Mask value to apply.
  86640. */
  86641. static sp_digit sp_384_cond_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  86642. {
  86643. register sp_digit* r asm ("r0") = r_p;
  86644. register const sp_digit* a asm ("r1") = a_p;
  86645. register const sp_digit* b asm ("r2") = b_p;
  86646. register sp_digit m asm ("r3") = m_p;
  86647. __asm__ __volatile__ (
  86648. "mov lr, #0\n\t"
  86649. "mov r6, #0\n\t"
  86650. "mov r12, #0\n\t"
  86651. "\n"
  86652. "L_sp_384_cond_add_12_words_%=: \n\t"
  86653. "adds lr, lr, #-1\n\t"
  86654. "ldr r4, [%[a], r12]\n\t"
  86655. "ldr r5, [%[b], r12]\n\t"
  86656. "and r5, r5, %[m]\n\t"
  86657. "adcs r4, r4, r5\n\t"
  86658. "adc lr, r6, r6\n\t"
  86659. "str r4, [%[r], r12]\n\t"
  86660. "add r12, r12, #4\n\t"
  86661. "cmp r12, #48\n\t"
  86662. "blt L_sp_384_cond_add_12_words_%=\n\t"
  86663. "mov %[r], lr\n\t"
  86664. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  86665. :
  86666. : "memory", "r12", "lr", "r4", "r5", "r6"
  86667. );
  86668. return (uint32_t)(size_t)r;
  86669. }
  86670. #else
  86671. /* Conditionally add a and b using the mask m.
  86672. * m is -1 to add and 0 when not.
  86673. *
  86674. * r A single precision number representing conditional add result.
  86675. * a A single precision number to add with.
  86676. * b A single precision number to add.
  86677. * m Mask value to apply.
  86678. */
  86679. static sp_digit sp_384_cond_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  86680. {
  86681. register sp_digit* r asm ("r0") = r_p;
  86682. register const sp_digit* a asm ("r1") = a_p;
  86683. register const sp_digit* b asm ("r2") = b_p;
  86684. register sp_digit m asm ("r3") = m_p;
  86685. __asm__ __volatile__ (
  86686. "mov r8, #0\n\t"
  86687. "ldm %[a]!, {r4, r5}\n\t"
  86688. "ldm %[b]!, {r6, r7}\n\t"
  86689. "and r6, r6, %[m]\n\t"
  86690. "and r7, r7, %[m]\n\t"
  86691. "adds r4, r4, r6\n\t"
  86692. "adcs r5, r5, r7\n\t"
  86693. "stm %[r]!, {r4, r5}\n\t"
  86694. "ldm %[a]!, {r4, r5}\n\t"
  86695. "ldm %[b]!, {r6, r7}\n\t"
  86696. "and r6, r6, %[m]\n\t"
  86697. "and r7, r7, %[m]\n\t"
  86698. "adcs r4, r4, r6\n\t"
  86699. "adcs r5, r5, r7\n\t"
  86700. "stm %[r]!, {r4, r5}\n\t"
  86701. "ldm %[a]!, {r4, r5}\n\t"
  86702. "ldm %[b]!, {r6, r7}\n\t"
  86703. "and r6, r6, %[m]\n\t"
  86704. "and r7, r7, %[m]\n\t"
  86705. "adcs r4, r4, r6\n\t"
  86706. "adcs r5, r5, r7\n\t"
  86707. "stm %[r]!, {r4, r5}\n\t"
  86708. "ldm %[a]!, {r4, r5}\n\t"
  86709. "ldm %[b]!, {r6, r7}\n\t"
  86710. "and r6, r6, %[m]\n\t"
  86711. "and r7, r7, %[m]\n\t"
  86712. "adcs r4, r4, r6\n\t"
  86713. "adcs r5, r5, r7\n\t"
  86714. "stm %[r]!, {r4, r5}\n\t"
  86715. "ldm %[a]!, {r4, r5}\n\t"
  86716. "ldm %[b]!, {r6, r7}\n\t"
  86717. "and r6, r6, %[m]\n\t"
  86718. "and r7, r7, %[m]\n\t"
  86719. "adcs r4, r4, r6\n\t"
  86720. "adcs r5, r5, r7\n\t"
  86721. "stm %[r]!, {r4, r5}\n\t"
  86722. "ldm %[a]!, {r4, r5}\n\t"
  86723. "ldm %[b]!, {r6, r7}\n\t"
  86724. "and r6, r6, %[m]\n\t"
  86725. "and r7, r7, %[m]\n\t"
  86726. "adcs r4, r4, r6\n\t"
  86727. "adcs r5, r5, r7\n\t"
  86728. "stm %[r]!, {r4, r5}\n\t"
  86729. "adc %[r], r8, r8\n\t"
  86730. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  86731. :
  86732. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  86733. );
  86734. return (uint32_t)(size_t)r;
  86735. }
  86736. #endif /* WOLFSSL_SP_SMALL */
  86737. /* Subtract two Montgomery form numbers (r = a - b % m).
  86738. *
  86739. * r Result of subtration.
  86740. * a Number to subtract from in Montgomery form.
  86741. * b Number to subtract with in Montgomery form.
  86742. * m Modulus (prime).
  86743. */
  86744. static void sp_384_mont_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p)
  86745. {
  86746. register sp_digit* r asm ("r0") = r_p;
  86747. register const sp_digit* a asm ("r1") = a_p;
  86748. register const sp_digit* b asm ("r2") = b_p;
  86749. register const sp_digit* m asm ("r3") = m_p;
  86750. sp_digit o;
  86751. o = sp_384_sub_12(r, a, b);
  86752. sp_384_cond_add_12(r, r, m, o);
  86753. }
  86754. #define sp_384_mont_sub_lower_12 sp_384_mont_sub_12
  86755. #ifdef WOLFSSL_SP_SMALL
  86756. #else
  86757. #endif /* WOLFSSL_SP_SMALL */
  86758. static void sp_384_rshift1_12(sp_digit* r_p, const sp_digit* a_p)
  86759. {
  86760. register sp_digit* r asm ("r0") = r_p;
  86761. register const sp_digit* a asm ("r1") = a_p;
  86762. __asm__ __volatile__ (
  86763. "ldm %[a], {r2, r3}\n\t"
  86764. "lsr r2, r2, #1\n\t"
  86765. "orr r2, r2, r3, lsl #31\n\t"
  86766. "lsr r3, r3, #1\n\t"
  86767. "ldr r4, [%[a], #8]\n\t"
  86768. "str r2, [%[r]]\n\t"
  86769. "orr r3, r3, r4, lsl #31\n\t"
  86770. "lsr r4, r4, #1\n\t"
  86771. "ldr r2, [%[a], #12]\n\t"
  86772. "str r3, [%[r], #4]\n\t"
  86773. "orr r4, r4, r2, lsl #31\n\t"
  86774. "lsr r2, r2, #1\n\t"
  86775. "ldr r3, [%[a], #16]\n\t"
  86776. "str r4, [%[r], #8]\n\t"
  86777. "orr r2, r2, r3, lsl #31\n\t"
  86778. "lsr r3, r3, #1\n\t"
  86779. "ldr r4, [%[a], #20]\n\t"
  86780. "str r2, [%[r], #12]\n\t"
  86781. "orr r3, r3, r4, lsl #31\n\t"
  86782. "lsr r4, r4, #1\n\t"
  86783. "ldr r2, [%[a], #24]\n\t"
  86784. "str r3, [%[r], #16]\n\t"
  86785. "orr r4, r4, r2, lsl #31\n\t"
  86786. "lsr r2, r2, #1\n\t"
  86787. "ldr r3, [%[a], #28]\n\t"
  86788. "str r4, [%[r], #20]\n\t"
  86789. "orr r2, r2, r3, lsl #31\n\t"
  86790. "lsr r3, r3, #1\n\t"
  86791. "ldr r4, [%[a], #32]\n\t"
  86792. "str r2, [%[r], #24]\n\t"
  86793. "orr r3, r3, r4, lsl #31\n\t"
  86794. "lsr r4, r4, #1\n\t"
  86795. "ldr r2, [%[a], #36]\n\t"
  86796. "str r3, [%[r], #28]\n\t"
  86797. "orr r4, r4, r2, lsl #31\n\t"
  86798. "lsr r2, r2, #1\n\t"
  86799. "ldr r3, [%[a], #40]\n\t"
  86800. "str r4, [%[r], #32]\n\t"
  86801. "orr r2, r2, r3, lsl #31\n\t"
  86802. "lsr r3, r3, #1\n\t"
  86803. "ldr r4, [%[a], #44]\n\t"
  86804. "str r2, [%[r], #36]\n\t"
  86805. "orr r3, r3, r4, lsl #31\n\t"
  86806. "lsr r4, r4, #1\n\t"
  86807. "str r3, [%[r], #40]\n\t"
  86808. "str r4, [%[r], #44]\n\t"
  86809. : [r] "+r" (r), [a] "+r" (a)
  86810. :
  86811. : "memory", "r2", "r3", "r4"
  86812. );
  86813. }
  86814. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  86815. *
  86816. * r Result of division by 2.
  86817. * a Number to divide.
  86818. * m Modulus (prime).
  86819. */
  86820. static void sp_384_div2_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  86821. {
  86822. sp_digit o;
  86823. o = sp_384_cond_add_12(r, a, m, 0 - (a[0] & 1));
  86824. sp_384_rshift1_12(r, r);
  86825. r[11] |= o << 31;
  86826. }
  86827. /* Double the Montgomery form projective point p.
  86828. *
  86829. * r Result of doubling point.
  86830. * p Point to double.
  86831. * t Temporary ordinate data.
  86832. */
  86833. #ifdef WOLFSSL_SP_NONBLOCK
  86834. typedef struct sp_384_proj_point_dbl_12_ctx {
  86835. int state;
  86836. sp_digit* t1;
  86837. sp_digit* t2;
  86838. sp_digit* x;
  86839. sp_digit* y;
  86840. sp_digit* z;
  86841. } sp_384_proj_point_dbl_12_ctx;
  86842. static int sp_384_proj_point_dbl_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, const sp_point_384* p, sp_digit* t)
  86843. {
  86844. int err = FP_WOULDBLOCK;
  86845. sp_384_proj_point_dbl_12_ctx* ctx = (sp_384_proj_point_dbl_12_ctx*)sp_ctx->data;
  86846. typedef char ctx_size_test[sizeof(sp_384_proj_point_dbl_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  86847. (void)sizeof(ctx_size_test);
  86848. switch (ctx->state) {
  86849. case 0:
  86850. ctx->t1 = t;
  86851. ctx->t2 = t + 2*12;
  86852. ctx->x = r->x;
  86853. ctx->y = r->y;
  86854. ctx->z = r->z;
  86855. /* Put infinity into result. */
  86856. if (r != p) {
  86857. r->infinity = p->infinity;
  86858. }
  86859. ctx->state = 1;
  86860. break;
  86861. case 1:
  86862. /* T1 = Z * Z */
  86863. sp_384_mont_sqr_12(ctx->t1, p->z, p384_mod, p384_mp_mod);
  86864. ctx->state = 2;
  86865. break;
  86866. case 2:
  86867. /* Z = Y * Z */
  86868. sp_384_mont_mul_12(ctx->z, p->y, p->z, p384_mod, p384_mp_mod);
  86869. ctx->state = 3;
  86870. break;
  86871. case 3:
  86872. /* Z = 2Z */
  86873. sp_384_mont_dbl_12(ctx->z, ctx->z, p384_mod);
  86874. ctx->state = 4;
  86875. break;
  86876. case 4:
  86877. /* T2 = X - T1 */
  86878. sp_384_mont_sub_12(ctx->t2, p->x, ctx->t1, p384_mod);
  86879. ctx->state = 5;
  86880. break;
  86881. case 5:
  86882. /* T1 = X + T1 */
  86883. sp_384_mont_add_12(ctx->t1, p->x, ctx->t1, p384_mod);
  86884. ctx->state = 6;
  86885. break;
  86886. case 6:
  86887. /* T2 = T1 * T2 */
  86888. sp_384_mont_mul_12(ctx->t2, ctx->t1, ctx->t2, p384_mod, p384_mp_mod);
  86889. ctx->state = 7;
  86890. break;
  86891. case 7:
  86892. /* T1 = 3T2 */
  86893. sp_384_mont_tpl_12(ctx->t1, ctx->t2, p384_mod);
  86894. ctx->state = 8;
  86895. break;
  86896. case 8:
  86897. /* Y = 2Y */
  86898. sp_384_mont_dbl_12(ctx->y, p->y, p384_mod);
  86899. ctx->state = 9;
  86900. break;
  86901. case 9:
  86902. /* Y = Y * Y */
  86903. sp_384_mont_sqr_12(ctx->y, ctx->y, p384_mod, p384_mp_mod);
  86904. ctx->state = 10;
  86905. break;
  86906. case 10:
  86907. /* T2 = Y * Y */
  86908. sp_384_mont_sqr_12(ctx->t2, ctx->y, p384_mod, p384_mp_mod);
  86909. ctx->state = 11;
  86910. break;
  86911. case 11:
  86912. /* T2 = T2/2 */
  86913. sp_384_div2_12(ctx->t2, ctx->t2, p384_mod);
  86914. ctx->state = 12;
  86915. break;
  86916. case 12:
  86917. /* Y = Y * X */
  86918. sp_384_mont_mul_12(ctx->y, ctx->y, p->x, p384_mod, p384_mp_mod);
  86919. ctx->state = 13;
  86920. break;
  86921. case 13:
  86922. /* X = T1 * T1 */
  86923. sp_384_mont_sqr_12(ctx->x, ctx->t1, p384_mod, p384_mp_mod);
  86924. ctx->state = 14;
  86925. break;
  86926. case 14:
  86927. /* X = X - Y */
  86928. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  86929. ctx->state = 15;
  86930. break;
  86931. case 15:
  86932. /* X = X - Y */
  86933. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  86934. ctx->state = 16;
  86935. break;
  86936. case 16:
  86937. /* Y = Y - X */
  86938. sp_384_mont_sub_lower_12(ctx->y, ctx->y, ctx->x, p384_mod);
  86939. ctx->state = 17;
  86940. break;
  86941. case 17:
  86942. /* Y = Y * T1 */
  86943. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t1, p384_mod, p384_mp_mod);
  86944. ctx->state = 18;
  86945. break;
  86946. case 18:
  86947. /* Y = Y - T2 */
  86948. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t2, p384_mod);
  86949. ctx->state = 19;
  86950. /* fall-through */
  86951. case 19:
  86952. err = MP_OKAY;
  86953. break;
  86954. }
  86955. if (err == MP_OKAY && ctx->state != 19) {
  86956. err = FP_WOULDBLOCK;
  86957. }
  86958. return err;
  86959. }
  86960. #endif /* WOLFSSL_SP_NONBLOCK */
  86961. static void sp_384_proj_point_dbl_12(sp_point_384* r, const sp_point_384* p,
  86962. sp_digit* t)
  86963. {
  86964. sp_digit* t1 = t;
  86965. sp_digit* t2 = t + 2*12;
  86966. sp_digit* x;
  86967. sp_digit* y;
  86968. sp_digit* z;
  86969. x = r->x;
  86970. y = r->y;
  86971. z = r->z;
  86972. /* Put infinity into result. */
  86973. if (r != p) {
  86974. r->infinity = p->infinity;
  86975. }
  86976. /* T1 = Z * Z */
  86977. sp_384_mont_sqr_12(t1, p->z, p384_mod, p384_mp_mod);
  86978. /* Z = Y * Z */
  86979. sp_384_mont_mul_12(z, p->y, p->z, p384_mod, p384_mp_mod);
  86980. /* Z = 2Z */
  86981. sp_384_mont_dbl_12(z, z, p384_mod);
  86982. /* T2 = X - T1 */
  86983. sp_384_mont_sub_12(t2, p->x, t1, p384_mod);
  86984. /* T1 = X + T1 */
  86985. sp_384_mont_add_12(t1, p->x, t1, p384_mod);
  86986. /* T2 = T1 * T2 */
  86987. sp_384_mont_mul_12(t2, t1, t2, p384_mod, p384_mp_mod);
  86988. /* T1 = 3T2 */
  86989. sp_384_mont_tpl_12(t1, t2, p384_mod);
  86990. /* Y = 2Y */
  86991. sp_384_mont_dbl_12(y, p->y, p384_mod);
  86992. /* Y = Y * Y */
  86993. sp_384_mont_sqr_12(y, y, p384_mod, p384_mp_mod);
  86994. /* T2 = Y * Y */
  86995. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  86996. /* T2 = T2/2 */
  86997. sp_384_div2_12(t2, t2, p384_mod);
  86998. /* Y = Y * X */
  86999. sp_384_mont_mul_12(y, y, p->x, p384_mod, p384_mp_mod);
  87000. /* X = T1 * T1 */
  87001. sp_384_mont_sqr_12(x, t1, p384_mod, p384_mp_mod);
  87002. /* X = X - Y */
  87003. sp_384_mont_sub_12(x, x, y, p384_mod);
  87004. /* X = X - Y */
  87005. sp_384_mont_sub_12(x, x, y, p384_mod);
  87006. /* Y = Y - X */
  87007. sp_384_mont_sub_lower_12(y, y, x, p384_mod);
  87008. /* Y = Y * T1 */
  87009. sp_384_mont_mul_12(y, y, t1, p384_mod, p384_mp_mod);
  87010. /* Y = Y - T2 */
  87011. sp_384_mont_sub_12(y, y, t2, p384_mod);
  87012. }
  87013. /* Compare two numbers to determine if they are equal.
  87014. * Constant time implementation.
  87015. *
  87016. * a First number to compare.
  87017. * b Second number to compare.
  87018. * returns 1 when equal and 0 otherwise.
  87019. */
  87020. static int sp_384_cmp_equal_12(const sp_digit* a, const sp_digit* b)
  87021. {
  87022. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  87023. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  87024. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  87025. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11])) == 0;
  87026. }
  87027. /* Returns 1 if the number of zero.
  87028. * Implementation is constant time.
  87029. *
  87030. * a Number to check.
  87031. * returns 1 if the number is zero and 0 otherwise.
  87032. */
  87033. static int sp_384_iszero_12(const sp_digit* a)
  87034. {
  87035. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  87036. a[8] | a[9] | a[10] | a[11]) == 0;
  87037. }
  87038. /* Add two Montgomery form projective points.
  87039. *
  87040. * r Result of addition.
  87041. * p First point to add.
  87042. * q Second point to add.
  87043. * t Temporary ordinate data.
  87044. */
  87045. #ifdef WOLFSSL_SP_NONBLOCK
  87046. typedef struct sp_384_proj_point_add_12_ctx {
  87047. int state;
  87048. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  87049. const sp_point_384* ap[2];
  87050. sp_point_384* rp[2];
  87051. sp_digit* t1;
  87052. sp_digit* t2;
  87053. sp_digit* t3;
  87054. sp_digit* t4;
  87055. sp_digit* t5;
  87056. sp_digit* t6;
  87057. sp_digit* x;
  87058. sp_digit* y;
  87059. sp_digit* z;
  87060. } sp_384_proj_point_add_12_ctx;
  87061. static int sp_384_proj_point_add_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r,
  87062. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  87063. {
  87064. int err = FP_WOULDBLOCK;
  87065. sp_384_proj_point_add_12_ctx* ctx = (sp_384_proj_point_add_12_ctx*)sp_ctx->data;
  87066. /* Ensure only the first point is the same as the result. */
  87067. if (q == r) {
  87068. const sp_point_384* a = p;
  87069. p = q;
  87070. q = a;
  87071. }
  87072. typedef char ctx_size_test[sizeof(sp_384_proj_point_add_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  87073. (void)sizeof(ctx_size_test);
  87074. switch (ctx->state) {
  87075. case 0: /* INIT */
  87076. ctx->t1 = t;
  87077. ctx->t2 = t + 2*12;
  87078. ctx->t3 = t + 4*12;
  87079. ctx->t4 = t + 6*12;
  87080. ctx->t5 = t + 8*12;
  87081. ctx->t6 = t + 10*12;
  87082. ctx->x = ctx->t6;
  87083. ctx->y = ctx->t1;
  87084. ctx->z = ctx->t2;
  87085. ctx->state = 1;
  87086. break;
  87087. case 1:
  87088. /* Check double */
  87089. (void)sp_384_sub_12(ctx->t1, p384_mod, q->y);
  87090. sp_384_norm_12(ctx->t1);
  87091. if ((~p->infinity & ~q->infinity &
  87092. sp_384_cmp_equal_12(p->x, q->x) & sp_384_cmp_equal_12(p->z, q->z) &
  87093. (sp_384_cmp_equal_12(p->y, q->y) | sp_384_cmp_equal_12(p->y, ctx->t1))) != 0)
  87094. {
  87095. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  87096. ctx->state = 2;
  87097. }
  87098. else {
  87099. ctx->state = 3;
  87100. }
  87101. break;
  87102. case 2:
  87103. err = sp_384_proj_point_dbl_12_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  87104. if (err == MP_OKAY)
  87105. ctx->state = 27; /* done */
  87106. break;
  87107. case 3:
  87108. {
  87109. ctx->state = 4;
  87110. break;
  87111. }
  87112. case 4:
  87113. /* U1 = X1*Z2^2 */
  87114. sp_384_mont_sqr_12(ctx->t1, q->z, p384_mod, p384_mp_mod);
  87115. ctx->state = 5;
  87116. break;
  87117. case 5:
  87118. sp_384_mont_mul_12(ctx->t3, ctx->t1, q->z, p384_mod, p384_mp_mod);
  87119. ctx->state = 6;
  87120. break;
  87121. case 6:
  87122. sp_384_mont_mul_12(ctx->t1, ctx->t1, p->x, p384_mod, p384_mp_mod);
  87123. ctx->state = 7;
  87124. break;
  87125. case 7:
  87126. /* U2 = X2*Z1^2 */
  87127. sp_384_mont_sqr_12(ctx->t2, p->z, p384_mod, p384_mp_mod);
  87128. ctx->state = 8;
  87129. break;
  87130. case 8:
  87131. sp_384_mont_mul_12(ctx->t4, ctx->t2, p->z, p384_mod, p384_mp_mod);
  87132. ctx->state = 9;
  87133. break;
  87134. case 9:
  87135. sp_384_mont_mul_12(ctx->t2, ctx->t2, q->x, p384_mod, p384_mp_mod);
  87136. ctx->state = 10;
  87137. break;
  87138. case 10:
  87139. /* S1 = Y1*Z2^3 */
  87140. sp_384_mont_mul_12(ctx->t3, ctx->t3, p->y, p384_mod, p384_mp_mod);
  87141. ctx->state = 11;
  87142. break;
  87143. case 11:
  87144. /* S2 = Y2*Z1^3 */
  87145. sp_384_mont_mul_12(ctx->t4, ctx->t4, q->y, p384_mod, p384_mp_mod);
  87146. ctx->state = 12;
  87147. break;
  87148. case 12:
  87149. /* H = U2 - U1 */
  87150. sp_384_mont_sub_12(ctx->t2, ctx->t2, ctx->t1, p384_mod);
  87151. ctx->state = 13;
  87152. break;
  87153. case 13:
  87154. /* R = S2 - S1 */
  87155. sp_384_mont_sub_12(ctx->t4, ctx->t4, ctx->t3, p384_mod);
  87156. ctx->state = 14;
  87157. break;
  87158. case 14:
  87159. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  87160. sp_384_mont_sqr_12(ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  87161. ctx->state = 15;
  87162. break;
  87163. case 15:
  87164. sp_384_mont_mul_12(ctx->y, ctx->t1, ctx->t5, p384_mod, p384_mp_mod);
  87165. ctx->state = 16;
  87166. break;
  87167. case 16:
  87168. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  87169. ctx->state = 17;
  87170. break;
  87171. case 17:
  87172. /* Z3 = H*Z1*Z2 */
  87173. sp_384_mont_mul_12(ctx->z, p->z, ctx->t2, p384_mod, p384_mp_mod);
  87174. ctx->state = 18;
  87175. break;
  87176. case 18:
  87177. sp_384_mont_mul_12(ctx->z, ctx->z, q->z, p384_mod, p384_mp_mod);
  87178. ctx->state = 19;
  87179. break;
  87180. case 19:
  87181. sp_384_mont_sqr_12(ctx->x, ctx->t4, p384_mod, p384_mp_mod);
  87182. ctx->state = 20;
  87183. break;
  87184. case 20:
  87185. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t5, p384_mod);
  87186. ctx->state = 21;
  87187. break;
  87188. case 21:
  87189. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t3, p384_mod, p384_mp_mod);
  87190. ctx->state = 22;
  87191. break;
  87192. case 22:
  87193. sp_384_mont_dbl_12(ctx->t3, ctx->y, p384_mod);
  87194. ctx->state = 23;
  87195. break;
  87196. case 23:
  87197. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t3, p384_mod);
  87198. ctx->state = 24;
  87199. break;
  87200. case 24:
  87201. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  87202. sp_384_mont_sub_lower_12(ctx->y, ctx->y, ctx->x, p384_mod);
  87203. ctx->state = 25;
  87204. break;
  87205. case 25:
  87206. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t4, p384_mod, p384_mp_mod);
  87207. ctx->state = 26;
  87208. break;
  87209. case 26:
  87210. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t5, p384_mod);
  87211. ctx->state = 27;
  87212. /* fall-through */
  87213. case 27:
  87214. {
  87215. int i;
  87216. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  87217. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  87218. sp_digit maskt = ~(maskp | maskq);
  87219. for (i = 0; i < 12; i++) {
  87220. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  87221. (ctx->x[i] & maskt);
  87222. }
  87223. for (i = 0; i < 12; i++) {
  87224. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  87225. (ctx->y[i] & maskt);
  87226. }
  87227. for (i = 0; i < 12; i++) {
  87228. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  87229. (ctx->z[i] & maskt);
  87230. }
  87231. r->z[0] |= p->infinity & q->infinity;
  87232. r->infinity = p->infinity & q->infinity;
  87233. err = MP_OKAY;
  87234. break;
  87235. }
  87236. }
  87237. if (err == MP_OKAY && ctx->state != 27) {
  87238. err = FP_WOULDBLOCK;
  87239. }
  87240. return err;
  87241. }
  87242. #endif /* WOLFSSL_SP_NONBLOCK */
  87243. static void sp_384_proj_point_add_12(sp_point_384* r,
  87244. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  87245. {
  87246. sp_digit* t1 = t;
  87247. sp_digit* t2 = t + 2*12;
  87248. sp_digit* t3 = t + 4*12;
  87249. sp_digit* t4 = t + 6*12;
  87250. sp_digit* t5 = t + 8*12;
  87251. sp_digit* t6 = t + 10*12;
  87252. /* Check double */
  87253. (void)sp_384_sub_12(t1, p384_mod, q->y);
  87254. sp_384_norm_12(t1);
  87255. if ((~p->infinity & ~q->infinity &
  87256. sp_384_cmp_equal_12(p->x, q->x) & sp_384_cmp_equal_12(p->z, q->z) &
  87257. (sp_384_cmp_equal_12(p->y, q->y) | sp_384_cmp_equal_12(p->y, t1))) != 0) {
  87258. sp_384_proj_point_dbl_12(r, p, t);
  87259. }
  87260. else {
  87261. sp_digit maskp;
  87262. sp_digit maskq;
  87263. sp_digit maskt;
  87264. sp_digit* x = t6;
  87265. sp_digit* y = t1;
  87266. sp_digit* z = t2;
  87267. int i;
  87268. maskp = 0 - (q->infinity & (!p->infinity));
  87269. maskq = 0 - (p->infinity & (!q->infinity));
  87270. maskt = ~(maskp | maskq);
  87271. /* U1 = X1*Z2^2 */
  87272. sp_384_mont_sqr_12(t1, q->z, p384_mod, p384_mp_mod);
  87273. sp_384_mont_mul_12(t3, t1, q->z, p384_mod, p384_mp_mod);
  87274. sp_384_mont_mul_12(t1, t1, p->x, p384_mod, p384_mp_mod);
  87275. /* U2 = X2*Z1^2 */
  87276. sp_384_mont_sqr_12(t2, p->z, p384_mod, p384_mp_mod);
  87277. sp_384_mont_mul_12(t4, t2, p->z, p384_mod, p384_mp_mod);
  87278. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  87279. /* S1 = Y1*Z2^3 */
  87280. sp_384_mont_mul_12(t3, t3, p->y, p384_mod, p384_mp_mod);
  87281. /* S2 = Y2*Z1^3 */
  87282. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  87283. /* H = U2 - U1 */
  87284. sp_384_mont_sub_12(t2, t2, t1, p384_mod);
  87285. /* R = S2 - S1 */
  87286. sp_384_mont_sub_12(t4, t4, t3, p384_mod);
  87287. if (~p->infinity & ~q->infinity &
  87288. sp_384_iszero_12(t2) & sp_384_iszero_12(t4) & maskt) {
  87289. sp_384_proj_point_dbl_12(r, p, t);
  87290. }
  87291. else {
  87292. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  87293. sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod);
  87294. sp_384_mont_mul_12(y, t1, t5, p384_mod, p384_mp_mod);
  87295. sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod);
  87296. /* Z3 = H*Z1*Z2 */
  87297. sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod);
  87298. sp_384_mont_mul_12(z, z, q->z, p384_mod, p384_mp_mod);
  87299. sp_384_mont_sqr_12(x, t4, p384_mod, p384_mp_mod);
  87300. sp_384_mont_sub_12(x, x, t5, p384_mod);
  87301. sp_384_mont_mul_12(t5, t5, t3, p384_mod, p384_mp_mod);
  87302. sp_384_mont_dbl_12(t3, y, p384_mod);
  87303. sp_384_mont_sub_12(x, x, t3, p384_mod);
  87304. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  87305. sp_384_mont_sub_lower_12(y, y, x, p384_mod);
  87306. sp_384_mont_mul_12(y, y, t4, p384_mod, p384_mp_mod);
  87307. sp_384_mont_sub_12(y, y, t5, p384_mod);
  87308. for (i = 0; i < 12; i++) {
  87309. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  87310. (x[i] & maskt);
  87311. }
  87312. for (i = 0; i < 12; i++) {
  87313. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  87314. (y[i] & maskt);
  87315. }
  87316. for (i = 0; i < 12; i++) {
  87317. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  87318. (z[i] & maskt);
  87319. }
  87320. r->z[0] |= p->infinity & q->infinity;
  87321. r->infinity = p->infinity & q->infinity;
  87322. }
  87323. }
  87324. }
  87325. #ifndef WC_NO_CACHE_RESISTANT
  87326. /* Touch each possible point that could be being copied.
  87327. *
  87328. * r Point to copy into.
  87329. * table Table - start of the entires to access
  87330. * idx Index of entry to retrieve.
  87331. */
  87332. static void sp_384_get_point_16_12(sp_point_384* r, const sp_point_384* table,
  87333. int idx)
  87334. {
  87335. int i;
  87336. sp_digit mask;
  87337. r->x[0] = 0;
  87338. r->x[1] = 0;
  87339. r->x[2] = 0;
  87340. r->x[3] = 0;
  87341. r->x[4] = 0;
  87342. r->x[5] = 0;
  87343. r->x[6] = 0;
  87344. r->x[7] = 0;
  87345. r->x[8] = 0;
  87346. r->x[9] = 0;
  87347. r->x[10] = 0;
  87348. r->x[11] = 0;
  87349. r->y[0] = 0;
  87350. r->y[1] = 0;
  87351. r->y[2] = 0;
  87352. r->y[3] = 0;
  87353. r->y[4] = 0;
  87354. r->y[5] = 0;
  87355. r->y[6] = 0;
  87356. r->y[7] = 0;
  87357. r->y[8] = 0;
  87358. r->y[9] = 0;
  87359. r->y[10] = 0;
  87360. r->y[11] = 0;
  87361. r->z[0] = 0;
  87362. r->z[1] = 0;
  87363. r->z[2] = 0;
  87364. r->z[3] = 0;
  87365. r->z[4] = 0;
  87366. r->z[5] = 0;
  87367. r->z[6] = 0;
  87368. r->z[7] = 0;
  87369. r->z[8] = 0;
  87370. r->z[9] = 0;
  87371. r->z[10] = 0;
  87372. r->z[11] = 0;
  87373. for (i = 1; i < 16; i++) {
  87374. mask = 0 - (i == idx);
  87375. r->x[0] |= mask & table[i].x[0];
  87376. r->x[1] |= mask & table[i].x[1];
  87377. r->x[2] |= mask & table[i].x[2];
  87378. r->x[3] |= mask & table[i].x[3];
  87379. r->x[4] |= mask & table[i].x[4];
  87380. r->x[5] |= mask & table[i].x[5];
  87381. r->x[6] |= mask & table[i].x[6];
  87382. r->x[7] |= mask & table[i].x[7];
  87383. r->x[8] |= mask & table[i].x[8];
  87384. r->x[9] |= mask & table[i].x[9];
  87385. r->x[10] |= mask & table[i].x[10];
  87386. r->x[11] |= mask & table[i].x[11];
  87387. r->y[0] |= mask & table[i].y[0];
  87388. r->y[1] |= mask & table[i].y[1];
  87389. r->y[2] |= mask & table[i].y[2];
  87390. r->y[3] |= mask & table[i].y[3];
  87391. r->y[4] |= mask & table[i].y[4];
  87392. r->y[5] |= mask & table[i].y[5];
  87393. r->y[6] |= mask & table[i].y[6];
  87394. r->y[7] |= mask & table[i].y[7];
  87395. r->y[8] |= mask & table[i].y[8];
  87396. r->y[9] |= mask & table[i].y[9];
  87397. r->y[10] |= mask & table[i].y[10];
  87398. r->y[11] |= mask & table[i].y[11];
  87399. r->z[0] |= mask & table[i].z[0];
  87400. r->z[1] |= mask & table[i].z[1];
  87401. r->z[2] |= mask & table[i].z[2];
  87402. r->z[3] |= mask & table[i].z[3];
  87403. r->z[4] |= mask & table[i].z[4];
  87404. r->z[5] |= mask & table[i].z[5];
  87405. r->z[6] |= mask & table[i].z[6];
  87406. r->z[7] |= mask & table[i].z[7];
  87407. r->z[8] |= mask & table[i].z[8];
  87408. r->z[9] |= mask & table[i].z[9];
  87409. r->z[10] |= mask & table[i].z[10];
  87410. r->z[11] |= mask & table[i].z[11];
  87411. }
  87412. }
  87413. #endif /* !WC_NO_CACHE_RESISTANT */
  87414. /* Multiply the point by the scalar and return the result.
  87415. * If map is true then convert result to affine coordinates.
  87416. *
  87417. * Fast implementation that generates a pre-computation table.
  87418. * 4 bits of window (no sliding!).
  87419. * Uses add and double for calculating table.
  87420. * 384 doubles.
  87421. * 108 adds.
  87422. *
  87423. * r Resulting point.
  87424. * g Point to multiply.
  87425. * k Scalar to multiply by.
  87426. * map Indicates whether to convert result to affine.
  87427. * ct Constant time required.
  87428. * heap Heap to use for allocation.
  87429. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  87430. */
  87431. static int sp_384_ecc_mulmod_fast_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  87432. int map, int ct, void* heap)
  87433. {
  87434. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87435. sp_point_384* t = NULL;
  87436. sp_digit* tmp = NULL;
  87437. #else
  87438. sp_point_384 t[16 + 1];
  87439. sp_digit tmp[2 * 12 * 6];
  87440. #endif
  87441. sp_point_384* rt = NULL;
  87442. #ifndef WC_NO_CACHE_RESISTANT
  87443. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87444. sp_point_384* p = NULL;
  87445. #else
  87446. sp_point_384 p[1];
  87447. #endif
  87448. #endif /* !WC_NO_CACHE_RESISTANT */
  87449. sp_digit n;
  87450. int i;
  87451. int c;
  87452. int y;
  87453. int err = MP_OKAY;
  87454. /* Constant time used for cache attack resistance implementation. */
  87455. (void)ct;
  87456. (void)heap;
  87457. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87458. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * (16 + 1),
  87459. heap, DYNAMIC_TYPE_ECC);
  87460. if (t == NULL)
  87461. err = MEMORY_E;
  87462. #ifndef WC_NO_CACHE_RESISTANT
  87463. if (err == MP_OKAY) {
  87464. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384),
  87465. heap, DYNAMIC_TYPE_ECC);
  87466. if (p == NULL)
  87467. err = MEMORY_E;
  87468. }
  87469. #endif
  87470. if (err == MP_OKAY) {
  87471. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  87472. DYNAMIC_TYPE_ECC);
  87473. if (tmp == NULL)
  87474. err = MEMORY_E;
  87475. }
  87476. #endif
  87477. if (err == MP_OKAY) {
  87478. rt = t + 16;
  87479. /* t[0] = {0, 0, 1} * norm */
  87480. XMEMSET(&t[0], 0, sizeof(t[0]));
  87481. t[0].infinity = 1;
  87482. /* t[1] = {g->x, g->y, g->z} * norm */
  87483. (void)sp_384_mod_mul_norm_12(t[1].x, g->x, p384_mod);
  87484. (void)sp_384_mod_mul_norm_12(t[1].y, g->y, p384_mod);
  87485. (void)sp_384_mod_mul_norm_12(t[1].z, g->z, p384_mod);
  87486. t[1].infinity = 0;
  87487. sp_384_proj_point_dbl_12(&t[ 2], &t[ 1], tmp);
  87488. t[ 2].infinity = 0;
  87489. sp_384_proj_point_add_12(&t[ 3], &t[ 2], &t[ 1], tmp);
  87490. t[ 3].infinity = 0;
  87491. sp_384_proj_point_dbl_12(&t[ 4], &t[ 2], tmp);
  87492. t[ 4].infinity = 0;
  87493. sp_384_proj_point_add_12(&t[ 5], &t[ 3], &t[ 2], tmp);
  87494. t[ 5].infinity = 0;
  87495. sp_384_proj_point_dbl_12(&t[ 6], &t[ 3], tmp);
  87496. t[ 6].infinity = 0;
  87497. sp_384_proj_point_add_12(&t[ 7], &t[ 4], &t[ 3], tmp);
  87498. t[ 7].infinity = 0;
  87499. sp_384_proj_point_dbl_12(&t[ 8], &t[ 4], tmp);
  87500. t[ 8].infinity = 0;
  87501. sp_384_proj_point_add_12(&t[ 9], &t[ 5], &t[ 4], tmp);
  87502. t[ 9].infinity = 0;
  87503. sp_384_proj_point_dbl_12(&t[10], &t[ 5], tmp);
  87504. t[10].infinity = 0;
  87505. sp_384_proj_point_add_12(&t[11], &t[ 6], &t[ 5], tmp);
  87506. t[11].infinity = 0;
  87507. sp_384_proj_point_dbl_12(&t[12], &t[ 6], tmp);
  87508. t[12].infinity = 0;
  87509. sp_384_proj_point_add_12(&t[13], &t[ 7], &t[ 6], tmp);
  87510. t[13].infinity = 0;
  87511. sp_384_proj_point_dbl_12(&t[14], &t[ 7], tmp);
  87512. t[14].infinity = 0;
  87513. sp_384_proj_point_add_12(&t[15], &t[ 8], &t[ 7], tmp);
  87514. t[15].infinity = 0;
  87515. i = 10;
  87516. n = k[i+1] << 0;
  87517. c = 28;
  87518. y = (int)(n >> 28);
  87519. #ifndef WC_NO_CACHE_RESISTANT
  87520. if (ct) {
  87521. sp_384_get_point_16_12(rt, t, y);
  87522. rt->infinity = !y;
  87523. }
  87524. else
  87525. #endif
  87526. {
  87527. XMEMCPY(rt, &t[y], sizeof(sp_point_384));
  87528. }
  87529. n <<= 4;
  87530. for (; i>=0 || c>=4; ) {
  87531. if (c < 4) {
  87532. n |= k[i--];
  87533. c += 32;
  87534. }
  87535. y = (n >> 28) & 0xf;
  87536. n <<= 4;
  87537. c -= 4;
  87538. sp_384_proj_point_dbl_12(rt, rt, tmp);
  87539. sp_384_proj_point_dbl_12(rt, rt, tmp);
  87540. sp_384_proj_point_dbl_12(rt, rt, tmp);
  87541. sp_384_proj_point_dbl_12(rt, rt, tmp);
  87542. #ifndef WC_NO_CACHE_RESISTANT
  87543. if (ct) {
  87544. sp_384_get_point_16_12(p, t, y);
  87545. p->infinity = !y;
  87546. sp_384_proj_point_add_12(rt, rt, p, tmp);
  87547. }
  87548. else
  87549. #endif
  87550. {
  87551. sp_384_proj_point_add_12(rt, rt, &t[y], tmp);
  87552. }
  87553. }
  87554. if (map != 0) {
  87555. sp_384_map_12(r, rt, tmp);
  87556. }
  87557. else {
  87558. XMEMCPY(r, rt, sizeof(sp_point_384));
  87559. }
  87560. }
  87561. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87562. if (tmp != NULL)
  87563. #endif
  87564. {
  87565. ForceZero(tmp, sizeof(sp_digit) * 2 * 12 * 6);
  87566. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87567. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  87568. #endif
  87569. }
  87570. #ifndef WC_NO_CACHE_RESISTANT
  87571. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87572. if (p != NULL)
  87573. #endif
  87574. {
  87575. ForceZero(p, sizeof(sp_point_384));
  87576. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87577. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  87578. #endif
  87579. }
  87580. #endif /* !WC_NO_CACHE_RESISTANT */
  87581. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87582. if (t != NULL)
  87583. #endif
  87584. {
  87585. ForceZero(t, sizeof(sp_point_384) * 17);
  87586. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87587. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  87588. #endif
  87589. }
  87590. return err;
  87591. }
  87592. #ifdef FP_ECC
  87593. #define sp_384_mont_dbl_lower_12 sp_384_mont_dbl_12
  87594. #define sp_384_mont_tpl_lower_12 sp_384_mont_tpl_12
  87595. /* Double the Montgomery form projective point p a number of times.
  87596. *
  87597. * r Result of repeated doubling of point.
  87598. * p Point to double.
  87599. * n Number of times to double
  87600. * t Temporary ordinate data.
  87601. */
  87602. static void sp_384_proj_point_dbl_n_12(sp_point_384* p, int i,
  87603. sp_digit* t)
  87604. {
  87605. sp_digit* w = t;
  87606. sp_digit* a = t + 2*12;
  87607. sp_digit* b = t + 4*12;
  87608. sp_digit* t1 = t + 6*12;
  87609. sp_digit* t2 = t + 8*12;
  87610. sp_digit* x;
  87611. sp_digit* y;
  87612. sp_digit* z;
  87613. volatile int n = i;
  87614. x = p->x;
  87615. y = p->y;
  87616. z = p->z;
  87617. /* Y = 2*Y */
  87618. sp_384_mont_dbl_12(y, y, p384_mod);
  87619. /* W = Z^4 */
  87620. sp_384_mont_sqr_12(w, z, p384_mod, p384_mp_mod);
  87621. sp_384_mont_sqr_12(w, w, p384_mod, p384_mp_mod);
  87622. #ifndef WOLFSSL_SP_SMALL
  87623. while (--n > 0)
  87624. #else
  87625. while (--n >= 0)
  87626. #endif
  87627. {
  87628. /* A = 3*(X^2 - W) */
  87629. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  87630. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  87631. sp_384_mont_tpl_lower_12(a, t1, p384_mod);
  87632. /* B = X*Y^2 */
  87633. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  87634. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  87635. /* X = A^2 - 2B */
  87636. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  87637. sp_384_mont_dbl_12(t2, b, p384_mod);
  87638. sp_384_mont_sub_12(x, x, t2, p384_mod);
  87639. /* b = 2.(B - X) */
  87640. sp_384_mont_sub_lower_12(t2, b, x, p384_mod);
  87641. sp_384_mont_dbl_lower_12(b, t2, p384_mod);
  87642. /* Z = Z*Y */
  87643. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  87644. /* t1 = Y^4 */
  87645. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  87646. #ifdef WOLFSSL_SP_SMALL
  87647. if (n != 0)
  87648. #endif
  87649. {
  87650. /* W = W*Y^4 */
  87651. sp_384_mont_mul_12(w, w, t1, p384_mod, p384_mp_mod);
  87652. }
  87653. /* y = 2*A*(B - X) - Y^4 */
  87654. sp_384_mont_mul_12(y, b, a, p384_mod, p384_mp_mod);
  87655. sp_384_mont_sub_12(y, y, t1, p384_mod);
  87656. }
  87657. #ifndef WOLFSSL_SP_SMALL
  87658. /* A = 3*(X^2 - W) */
  87659. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  87660. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  87661. sp_384_mont_tpl_lower_12(a, t1, p384_mod);
  87662. /* B = X*Y^2 */
  87663. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  87664. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  87665. /* X = A^2 - 2B */
  87666. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  87667. sp_384_mont_dbl_12(t2, b, p384_mod);
  87668. sp_384_mont_sub_12(x, x, t2, p384_mod);
  87669. /* b = 2.(B - X) */
  87670. sp_384_mont_sub_lower_12(t2, b, x, p384_mod);
  87671. sp_384_mont_dbl_lower_12(b, t2, p384_mod);
  87672. /* Z = Z*Y */
  87673. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  87674. /* t1 = Y^4 */
  87675. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  87676. /* y = 2*A*(B - X) - Y^4 */
  87677. sp_384_mont_mul_12(y, b, a, p384_mod, p384_mp_mod);
  87678. sp_384_mont_sub_12(y, y, t1, p384_mod);
  87679. #endif
  87680. /* Y = Y/2 */
  87681. sp_384_div2_12(y, y, p384_mod);
  87682. }
  87683. /* Convert the projective point to affine.
  87684. * Ordinates are in Montgomery form.
  87685. *
  87686. * a Point to convert.
  87687. * t Temporary data.
  87688. */
  87689. static void sp_384_proj_to_affine_12(sp_point_384* a, sp_digit* t)
  87690. {
  87691. sp_digit* t1 = t;
  87692. sp_digit* t2 = t + 2 * 12;
  87693. sp_digit* tmp = t + 4 * 12;
  87694. sp_384_mont_inv_12(t1, a->z, tmp);
  87695. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  87696. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  87697. sp_384_mont_mul_12(a->x, a->x, t2, p384_mod, p384_mp_mod);
  87698. sp_384_mont_mul_12(a->y, a->y, t1, p384_mod, p384_mp_mod);
  87699. XMEMCPY(a->z, p384_norm_mod, sizeof(p384_norm_mod));
  87700. }
  87701. #endif /* FP_ECC */
  87702. /* A table entry for pre-computed points. */
  87703. typedef struct sp_table_entry_384 {
  87704. sp_digit x[12];
  87705. sp_digit y[12];
  87706. } sp_table_entry_384;
  87707. #ifdef FP_ECC
  87708. #endif /* FP_ECC */
  87709. /* Add two Montgomery form projective points. The second point has a q value of
  87710. * one.
  87711. * Only the first point can be the same pointer as the result point.
  87712. *
  87713. * r Result of addition.
  87714. * p First point to add.
  87715. * q Second point to add.
  87716. * t Temporary ordinate data.
  87717. */
  87718. static void sp_384_proj_point_add_qz1_12(sp_point_384* r, const sp_point_384* p,
  87719. const sp_point_384* q, sp_digit* t)
  87720. {
  87721. sp_digit* t1 = t;
  87722. sp_digit* t2 = t + 2*12;
  87723. sp_digit* t3 = t + 4*12;
  87724. sp_digit* t4 = t + 6*12;
  87725. sp_digit* t5 = t + 8*12;
  87726. sp_digit* t6 = t + 10*12;
  87727. /* Check double */
  87728. (void)sp_384_sub_12(t1, p384_mod, q->y);
  87729. sp_384_norm_12(t1);
  87730. if ((~p->infinity & ~q->infinity &
  87731. sp_384_cmp_equal_12(p->x, q->x) & sp_384_cmp_equal_12(p->z, q->z) &
  87732. (sp_384_cmp_equal_12(p->y, q->y) | sp_384_cmp_equal_12(p->y, t1))) != 0) {
  87733. sp_384_proj_point_dbl_12(r, p, t);
  87734. }
  87735. else {
  87736. sp_digit maskp;
  87737. sp_digit maskq;
  87738. sp_digit maskt;
  87739. sp_digit* x = t2;
  87740. sp_digit* y = t5;
  87741. sp_digit* z = t6;
  87742. int i;
  87743. /* U2 = X2*Z1^2 */
  87744. sp_384_mont_sqr_12(t2, p->z, p384_mod, p384_mp_mod);
  87745. sp_384_mont_mul_12(t4, t2, p->z, p384_mod, p384_mp_mod);
  87746. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  87747. /* S2 = Y2*Z1^3 */
  87748. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  87749. /* H = U2 - X1 */
  87750. sp_384_mont_sub_12(t2, t2, p->x, p384_mod);
  87751. /* R = S2 - Y1 */
  87752. sp_384_mont_sub_12(t4, t4, p->y, p384_mod);
  87753. /* Z3 = H*Z1 */
  87754. sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod);
  87755. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  87756. sp_384_mont_sqr_12(t1, t4, p384_mod, p384_mp_mod);
  87757. sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod);
  87758. sp_384_mont_mul_12(t3, p->x, t5, p384_mod, p384_mp_mod);
  87759. sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod);
  87760. sp_384_mont_sub_12(x, t1, t5, p384_mod);
  87761. sp_384_mont_dbl_12(t1, t3, p384_mod);
  87762. sp_384_mont_sub_12(x, x, t1, p384_mod);
  87763. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  87764. sp_384_mont_sub_lower_12(t3, t3, x, p384_mod);
  87765. sp_384_mont_mul_12(t3, t3, t4, p384_mod, p384_mp_mod);
  87766. sp_384_mont_mul_12(t5, t5, p->y, p384_mod, p384_mp_mod);
  87767. sp_384_mont_sub_12(y, t3, t5, p384_mod);
  87768. maskp = 0 - (q->infinity & (!p->infinity));
  87769. maskq = 0 - (p->infinity & (!q->infinity));
  87770. maskt = ~(maskp | maskq);
  87771. for (i = 0; i < 12; i++) {
  87772. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt);
  87773. }
  87774. for (i = 0; i < 12; i++) {
  87775. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt);
  87776. }
  87777. for (i = 0; i < 12; i++) {
  87778. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt);
  87779. }
  87780. r->z[0] |= p->infinity & q->infinity;
  87781. r->infinity = p->infinity & q->infinity;
  87782. }
  87783. }
  87784. #ifdef WOLFSSL_SP_SMALL
  87785. #ifdef FP_ECC
  87786. /* Generate the pre-computed table of points for the base point.
  87787. *
  87788. * width = 4
  87789. * 16 entries
  87790. * 96 bits between
  87791. *
  87792. * a The base point.
  87793. * table Place to store generated point data.
  87794. * tmp Temporary data.
  87795. * heap Heap to use for allocation.
  87796. */
  87797. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  87798. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  87799. {
  87800. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87801. sp_point_384* t = NULL;
  87802. #else
  87803. sp_point_384 t[3];
  87804. #endif
  87805. sp_point_384* s1 = NULL;
  87806. sp_point_384* s2 = NULL;
  87807. int i;
  87808. int j;
  87809. int err = MP_OKAY;
  87810. (void)heap;
  87811. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87812. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  87813. DYNAMIC_TYPE_ECC);
  87814. if (t == NULL)
  87815. err = MEMORY_E;
  87816. #endif
  87817. if (err == MP_OKAY) {
  87818. s1 = t + 1;
  87819. s2 = t + 2;
  87820. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  87821. }
  87822. if (err == MP_OKAY) {
  87823. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  87824. }
  87825. if (err == MP_OKAY) {
  87826. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  87827. }
  87828. if (err == MP_OKAY) {
  87829. t->infinity = 0;
  87830. sp_384_proj_to_affine_12(t, tmp);
  87831. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  87832. s1->infinity = 0;
  87833. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  87834. s2->infinity = 0;
  87835. /* table[0] = {0, 0, infinity} */
  87836. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  87837. /* table[1] = Affine version of 'a' in Montgomery form */
  87838. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  87839. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  87840. for (i=1; i<4; i++) {
  87841. sp_384_proj_point_dbl_n_12(t, 96, tmp);
  87842. sp_384_proj_to_affine_12(t, tmp);
  87843. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  87844. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  87845. }
  87846. for (i=1; i<4; i++) {
  87847. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  87848. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  87849. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  87850. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  87851. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  87852. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  87853. sp_384_proj_to_affine_12(t, tmp);
  87854. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  87855. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  87856. }
  87857. }
  87858. }
  87859. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87860. if (t != NULL)
  87861. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  87862. #endif
  87863. return err;
  87864. }
  87865. #endif /* FP_ECC */
  87866. #ifndef WC_NO_CACHE_RESISTANT
  87867. /* Touch each possible entry that could be being copied.
  87868. *
  87869. * r Point to copy into.
  87870. * table Table - start of the entires to access
  87871. * idx Index of entry to retrieve.
  87872. */
  87873. static void sp_384_get_entry_16_12(sp_point_384* r,
  87874. const sp_table_entry_384* table, int idx)
  87875. {
  87876. int i;
  87877. sp_digit mask;
  87878. r->x[0] = 0;
  87879. r->x[1] = 0;
  87880. r->x[2] = 0;
  87881. r->x[3] = 0;
  87882. r->x[4] = 0;
  87883. r->x[5] = 0;
  87884. r->x[6] = 0;
  87885. r->x[7] = 0;
  87886. r->x[8] = 0;
  87887. r->x[9] = 0;
  87888. r->x[10] = 0;
  87889. r->x[11] = 0;
  87890. r->y[0] = 0;
  87891. r->y[1] = 0;
  87892. r->y[2] = 0;
  87893. r->y[3] = 0;
  87894. r->y[4] = 0;
  87895. r->y[5] = 0;
  87896. r->y[6] = 0;
  87897. r->y[7] = 0;
  87898. r->y[8] = 0;
  87899. r->y[9] = 0;
  87900. r->y[10] = 0;
  87901. r->y[11] = 0;
  87902. for (i = 1; i < 16; i++) {
  87903. mask = 0 - (i == idx);
  87904. r->x[0] |= mask & table[i].x[0];
  87905. r->x[1] |= mask & table[i].x[1];
  87906. r->x[2] |= mask & table[i].x[2];
  87907. r->x[3] |= mask & table[i].x[3];
  87908. r->x[4] |= mask & table[i].x[4];
  87909. r->x[5] |= mask & table[i].x[5];
  87910. r->x[6] |= mask & table[i].x[6];
  87911. r->x[7] |= mask & table[i].x[7];
  87912. r->x[8] |= mask & table[i].x[8];
  87913. r->x[9] |= mask & table[i].x[9];
  87914. r->x[10] |= mask & table[i].x[10];
  87915. r->x[11] |= mask & table[i].x[11];
  87916. r->y[0] |= mask & table[i].y[0];
  87917. r->y[1] |= mask & table[i].y[1];
  87918. r->y[2] |= mask & table[i].y[2];
  87919. r->y[3] |= mask & table[i].y[3];
  87920. r->y[4] |= mask & table[i].y[4];
  87921. r->y[5] |= mask & table[i].y[5];
  87922. r->y[6] |= mask & table[i].y[6];
  87923. r->y[7] |= mask & table[i].y[7];
  87924. r->y[8] |= mask & table[i].y[8];
  87925. r->y[9] |= mask & table[i].y[9];
  87926. r->y[10] |= mask & table[i].y[10];
  87927. r->y[11] |= mask & table[i].y[11];
  87928. }
  87929. }
  87930. #endif /* !WC_NO_CACHE_RESISTANT */
  87931. /* Multiply the point by the scalar and return the result.
  87932. * If map is true then convert result to affine coordinates.
  87933. *
  87934. * Stripe implementation.
  87935. * Pre-generated: 2^0, 2^96, ...
  87936. * Pre-generated: products of all combinations of above.
  87937. * 4 doubles and adds (with qz=1)
  87938. *
  87939. * r Resulting point.
  87940. * k Scalar to multiply by.
  87941. * table Pre-computed table.
  87942. * map Indicates whether to convert result to affine.
  87943. * ct Constant time required.
  87944. * heap Heap to use for allocation.
  87945. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  87946. */
  87947. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  87948. const sp_table_entry_384* table, const sp_digit* k, int map,
  87949. int ct, void* heap)
  87950. {
  87951. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87952. sp_point_384* rt = NULL;
  87953. sp_digit* t = NULL;
  87954. #else
  87955. sp_point_384 rt[2];
  87956. sp_digit t[2 * 12 * 6];
  87957. #endif
  87958. sp_point_384* p = NULL;
  87959. int i;
  87960. int j;
  87961. int y;
  87962. int x;
  87963. int err = MP_OKAY;
  87964. (void)g;
  87965. /* Constant time used for cache attack resistance implementation. */
  87966. (void)ct;
  87967. (void)heap;
  87968. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  87969. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  87970. DYNAMIC_TYPE_ECC);
  87971. if (rt == NULL)
  87972. err = MEMORY_E;
  87973. if (err == MP_OKAY) {
  87974. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  87975. DYNAMIC_TYPE_ECC);
  87976. if (t == NULL)
  87977. err = MEMORY_E;
  87978. }
  87979. #endif
  87980. if (err == MP_OKAY) {
  87981. p = rt + 1;
  87982. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  87983. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  87984. y = 0;
  87985. x = 95;
  87986. for (j=0; j<4; j++) {
  87987. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  87988. x += 96;
  87989. }
  87990. #ifndef WC_NO_CACHE_RESISTANT
  87991. if (ct) {
  87992. sp_384_get_entry_16_12(rt, table, y);
  87993. } else
  87994. #endif
  87995. {
  87996. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  87997. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  87998. }
  87999. rt->infinity = !y;
  88000. for (i=94; i>=0; i--) {
  88001. y = 0;
  88002. x = i;
  88003. for (j=0; j<4; j++) {
  88004. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  88005. x += 96;
  88006. }
  88007. sp_384_proj_point_dbl_12(rt, rt, t);
  88008. #ifndef WC_NO_CACHE_RESISTANT
  88009. if (ct) {
  88010. sp_384_get_entry_16_12(p, table, y);
  88011. }
  88012. else
  88013. #endif
  88014. {
  88015. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  88016. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  88017. }
  88018. p->infinity = !y;
  88019. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  88020. }
  88021. if (map != 0) {
  88022. sp_384_map_12(r, rt, t);
  88023. }
  88024. else {
  88025. XMEMCPY(r, rt, sizeof(sp_point_384));
  88026. }
  88027. }
  88028. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88029. if (t != NULL)
  88030. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  88031. if (rt != NULL)
  88032. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  88033. #endif
  88034. return err;
  88035. }
  88036. #ifdef FP_ECC
  88037. #ifndef FP_ENTRIES
  88038. #define FP_ENTRIES 16
  88039. #endif
  88040. /* Cache entry - holds precomputation tables for a point. */
  88041. typedef struct sp_cache_384_t {
  88042. /* X ordinate of point that table was generated from. */
  88043. sp_digit x[12];
  88044. /* Y ordinate of point that table was generated from. */
  88045. sp_digit y[12];
  88046. /* Precomputation table for point. */
  88047. sp_table_entry_384 table[16];
  88048. /* Count of entries in table. */
  88049. uint32_t cnt;
  88050. /* Point and table set in entry. */
  88051. int set;
  88052. } sp_cache_384_t;
  88053. /* Cache of tables. */
  88054. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  88055. /* Index of last entry in cache. */
  88056. static THREAD_LS_T int sp_cache_384_last = -1;
  88057. /* Cache has been initialized. */
  88058. static THREAD_LS_T int sp_cache_384_inited = 0;
  88059. #ifndef HAVE_THREAD_LS
  88060. static volatile int initCacheMutex_384 = 0;
  88061. static wolfSSL_Mutex sp_cache_384_lock;
  88062. #endif
  88063. /* Get the cache entry for the point.
  88064. *
  88065. * g [in] Point scalar multipling.
  88066. * cache [out] Cache table to use.
  88067. */
  88068. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  88069. {
  88070. int i;
  88071. int j;
  88072. uint32_t least;
  88073. if (sp_cache_384_inited == 0) {
  88074. for (i=0; i<FP_ENTRIES; i++) {
  88075. sp_cache_384[i].set = 0;
  88076. }
  88077. sp_cache_384_inited = 1;
  88078. }
  88079. /* Compare point with those in cache. */
  88080. for (i=0; i<FP_ENTRIES; i++) {
  88081. if (!sp_cache_384[i].set)
  88082. continue;
  88083. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  88084. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  88085. sp_cache_384[i].cnt++;
  88086. break;
  88087. }
  88088. }
  88089. /* No match. */
  88090. if (i == FP_ENTRIES) {
  88091. /* Find empty entry. */
  88092. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  88093. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  88094. if (!sp_cache_384[i].set) {
  88095. break;
  88096. }
  88097. }
  88098. /* Evict least used. */
  88099. if (i == sp_cache_384_last) {
  88100. least = sp_cache_384[0].cnt;
  88101. for (j=1; j<FP_ENTRIES; j++) {
  88102. if (sp_cache_384[j].cnt < least) {
  88103. i = j;
  88104. least = sp_cache_384[i].cnt;
  88105. }
  88106. }
  88107. }
  88108. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  88109. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  88110. sp_cache_384[i].set = 1;
  88111. sp_cache_384[i].cnt = 1;
  88112. }
  88113. *cache = &sp_cache_384[i];
  88114. sp_cache_384_last = i;
  88115. }
  88116. #endif /* FP_ECC */
  88117. /* Multiply the base point of P384 by the scalar and return the result.
  88118. * If map is true then convert result to affine coordinates.
  88119. *
  88120. * r Resulting point.
  88121. * g Point to multiply.
  88122. * k Scalar to multiply by.
  88123. * map Indicates whether to convert result to affine.
  88124. * ct Constant time required.
  88125. * heap Heap to use for allocation.
  88126. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  88127. */
  88128. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  88129. int map, int ct, void* heap)
  88130. {
  88131. #ifndef FP_ECC
  88132. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  88133. #else
  88134. sp_digit tmp[2 * 12 * 7];
  88135. sp_cache_384_t* cache;
  88136. int err = MP_OKAY;
  88137. #ifndef HAVE_THREAD_LS
  88138. if (initCacheMutex_384 == 0) {
  88139. wc_InitMutex(&sp_cache_384_lock);
  88140. initCacheMutex_384 = 1;
  88141. }
  88142. if (wc_LockMutex(&sp_cache_384_lock) != 0)
  88143. err = BAD_MUTEX_E;
  88144. #endif /* HAVE_THREAD_LS */
  88145. if (err == MP_OKAY) {
  88146. sp_ecc_get_cache_384(g, &cache);
  88147. if (cache->cnt == 2)
  88148. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  88149. #ifndef HAVE_THREAD_LS
  88150. wc_UnLockMutex(&sp_cache_384_lock);
  88151. #endif /* HAVE_THREAD_LS */
  88152. if (cache->cnt < 2) {
  88153. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  88154. }
  88155. else {
  88156. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  88157. map, ct, heap);
  88158. }
  88159. }
  88160. return err;
  88161. #endif
  88162. }
  88163. #else
  88164. #ifdef FP_ECC
  88165. /* Generate the pre-computed table of points for the base point.
  88166. *
  88167. * width = 8
  88168. * 256 entries
  88169. * 48 bits between
  88170. *
  88171. * a The base point.
  88172. * table Place to store generated point data.
  88173. * tmp Temporary data.
  88174. * heap Heap to use for allocation.
  88175. */
  88176. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  88177. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  88178. {
  88179. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88180. sp_point_384* t = NULL;
  88181. #else
  88182. sp_point_384 t[3];
  88183. #endif
  88184. sp_point_384* s1 = NULL;
  88185. sp_point_384* s2 = NULL;
  88186. int i;
  88187. int j;
  88188. int err = MP_OKAY;
  88189. (void)heap;
  88190. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88191. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  88192. DYNAMIC_TYPE_ECC);
  88193. if (t == NULL)
  88194. err = MEMORY_E;
  88195. #endif
  88196. if (err == MP_OKAY) {
  88197. s1 = t + 1;
  88198. s2 = t + 2;
  88199. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  88200. }
  88201. if (err == MP_OKAY) {
  88202. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  88203. }
  88204. if (err == MP_OKAY) {
  88205. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  88206. }
  88207. if (err == MP_OKAY) {
  88208. t->infinity = 0;
  88209. sp_384_proj_to_affine_12(t, tmp);
  88210. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  88211. s1->infinity = 0;
  88212. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  88213. s2->infinity = 0;
  88214. /* table[0] = {0, 0, infinity} */
  88215. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  88216. /* table[1] = Affine version of 'a' in Montgomery form */
  88217. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  88218. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  88219. for (i=1; i<8; i++) {
  88220. sp_384_proj_point_dbl_n_12(t, 48, tmp);
  88221. sp_384_proj_to_affine_12(t, tmp);
  88222. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  88223. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  88224. }
  88225. for (i=1; i<8; i++) {
  88226. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  88227. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  88228. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  88229. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  88230. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  88231. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  88232. sp_384_proj_to_affine_12(t, tmp);
  88233. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  88234. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  88235. }
  88236. }
  88237. }
  88238. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88239. if (t != NULL)
  88240. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  88241. #endif
  88242. return err;
  88243. }
  88244. #endif /* FP_ECC */
  88245. #ifndef WC_NO_CACHE_RESISTANT
  88246. /* Touch each possible entry that could be being copied.
  88247. *
  88248. * r Point to copy into.
  88249. * table Table - start of the entires to access
  88250. * idx Index of entry to retrieve.
  88251. */
  88252. static void sp_384_get_entry_256_12(sp_point_384* r,
  88253. const sp_table_entry_384* table, int idx)
  88254. {
  88255. int i;
  88256. sp_digit mask;
  88257. r->x[0] = 0;
  88258. r->x[1] = 0;
  88259. r->x[2] = 0;
  88260. r->x[3] = 0;
  88261. r->x[4] = 0;
  88262. r->x[5] = 0;
  88263. r->x[6] = 0;
  88264. r->x[7] = 0;
  88265. r->x[8] = 0;
  88266. r->x[9] = 0;
  88267. r->x[10] = 0;
  88268. r->x[11] = 0;
  88269. r->y[0] = 0;
  88270. r->y[1] = 0;
  88271. r->y[2] = 0;
  88272. r->y[3] = 0;
  88273. r->y[4] = 0;
  88274. r->y[5] = 0;
  88275. r->y[6] = 0;
  88276. r->y[7] = 0;
  88277. r->y[8] = 0;
  88278. r->y[9] = 0;
  88279. r->y[10] = 0;
  88280. r->y[11] = 0;
  88281. for (i = 1; i < 256; i++) {
  88282. mask = 0 - (i == idx);
  88283. r->x[0] |= mask & table[i].x[0];
  88284. r->x[1] |= mask & table[i].x[1];
  88285. r->x[2] |= mask & table[i].x[2];
  88286. r->x[3] |= mask & table[i].x[3];
  88287. r->x[4] |= mask & table[i].x[4];
  88288. r->x[5] |= mask & table[i].x[5];
  88289. r->x[6] |= mask & table[i].x[6];
  88290. r->x[7] |= mask & table[i].x[7];
  88291. r->x[8] |= mask & table[i].x[8];
  88292. r->x[9] |= mask & table[i].x[9];
  88293. r->x[10] |= mask & table[i].x[10];
  88294. r->x[11] |= mask & table[i].x[11];
  88295. r->y[0] |= mask & table[i].y[0];
  88296. r->y[1] |= mask & table[i].y[1];
  88297. r->y[2] |= mask & table[i].y[2];
  88298. r->y[3] |= mask & table[i].y[3];
  88299. r->y[4] |= mask & table[i].y[4];
  88300. r->y[5] |= mask & table[i].y[5];
  88301. r->y[6] |= mask & table[i].y[6];
  88302. r->y[7] |= mask & table[i].y[7];
  88303. r->y[8] |= mask & table[i].y[8];
  88304. r->y[9] |= mask & table[i].y[9];
  88305. r->y[10] |= mask & table[i].y[10];
  88306. r->y[11] |= mask & table[i].y[11];
  88307. }
  88308. }
  88309. #endif /* !WC_NO_CACHE_RESISTANT */
  88310. /* Multiply the point by the scalar and return the result.
  88311. * If map is true then convert result to affine coordinates.
  88312. *
  88313. * Stripe implementation.
  88314. * Pre-generated: 2^0, 2^48, ...
  88315. * Pre-generated: products of all combinations of above.
  88316. * 8 doubles and adds (with qz=1)
  88317. *
  88318. * r Resulting point.
  88319. * k Scalar to multiply by.
  88320. * table Pre-computed table.
  88321. * map Indicates whether to convert result to affine.
  88322. * ct Constant time required.
  88323. * heap Heap to use for allocation.
  88324. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  88325. */
  88326. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  88327. const sp_table_entry_384* table, const sp_digit* k, int map,
  88328. int ct, void* heap)
  88329. {
  88330. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88331. sp_point_384* rt = NULL;
  88332. sp_digit* t = NULL;
  88333. #else
  88334. sp_point_384 rt[2];
  88335. sp_digit t[2 * 12 * 6];
  88336. #endif
  88337. sp_point_384* p = NULL;
  88338. int i;
  88339. int j;
  88340. int y;
  88341. int x;
  88342. int err = MP_OKAY;
  88343. (void)g;
  88344. /* Constant time used for cache attack resistance implementation. */
  88345. (void)ct;
  88346. (void)heap;
  88347. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88348. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  88349. DYNAMIC_TYPE_ECC);
  88350. if (rt == NULL)
  88351. err = MEMORY_E;
  88352. if (err == MP_OKAY) {
  88353. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  88354. DYNAMIC_TYPE_ECC);
  88355. if (t == NULL)
  88356. err = MEMORY_E;
  88357. }
  88358. #endif
  88359. if (err == MP_OKAY) {
  88360. p = rt + 1;
  88361. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  88362. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  88363. y = 0;
  88364. x = 47;
  88365. for (j=0; j<8; j++) {
  88366. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  88367. x += 48;
  88368. }
  88369. #ifndef WC_NO_CACHE_RESISTANT
  88370. if (ct) {
  88371. sp_384_get_entry_256_12(rt, table, y);
  88372. } else
  88373. #endif
  88374. {
  88375. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  88376. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  88377. }
  88378. rt->infinity = !y;
  88379. for (i=46; i>=0; i--) {
  88380. y = 0;
  88381. x = i;
  88382. for (j=0; j<8; j++) {
  88383. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  88384. x += 48;
  88385. }
  88386. sp_384_proj_point_dbl_12(rt, rt, t);
  88387. #ifndef WC_NO_CACHE_RESISTANT
  88388. if (ct) {
  88389. sp_384_get_entry_256_12(p, table, y);
  88390. }
  88391. else
  88392. #endif
  88393. {
  88394. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  88395. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  88396. }
  88397. p->infinity = !y;
  88398. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  88399. }
  88400. if (map != 0) {
  88401. sp_384_map_12(r, rt, t);
  88402. }
  88403. else {
  88404. XMEMCPY(r, rt, sizeof(sp_point_384));
  88405. }
  88406. }
  88407. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88408. if (t != NULL)
  88409. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  88410. if (rt != NULL)
  88411. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  88412. #endif
  88413. return err;
  88414. }
  88415. #ifdef FP_ECC
  88416. #ifndef FP_ENTRIES
  88417. #define FP_ENTRIES 16
  88418. #endif
  88419. /* Cache entry - holds precomputation tables for a point. */
  88420. typedef struct sp_cache_384_t {
  88421. /* X ordinate of point that table was generated from. */
  88422. sp_digit x[12];
  88423. /* Y ordinate of point that table was generated from. */
  88424. sp_digit y[12];
  88425. /* Precomputation table for point. */
  88426. sp_table_entry_384 table[256];
  88427. /* Count of entries in table. */
  88428. uint32_t cnt;
  88429. /* Point and table set in entry. */
  88430. int set;
  88431. } sp_cache_384_t;
  88432. /* Cache of tables. */
  88433. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  88434. /* Index of last entry in cache. */
  88435. static THREAD_LS_T int sp_cache_384_last = -1;
  88436. /* Cache has been initialized. */
  88437. static THREAD_LS_T int sp_cache_384_inited = 0;
  88438. #ifndef HAVE_THREAD_LS
  88439. static volatile int initCacheMutex_384 = 0;
  88440. static wolfSSL_Mutex sp_cache_384_lock;
  88441. #endif
  88442. /* Get the cache entry for the point.
  88443. *
  88444. * g [in] Point scalar multipling.
  88445. * cache [out] Cache table to use.
  88446. */
  88447. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  88448. {
  88449. int i;
  88450. int j;
  88451. uint32_t least;
  88452. if (sp_cache_384_inited == 0) {
  88453. for (i=0; i<FP_ENTRIES; i++) {
  88454. sp_cache_384[i].set = 0;
  88455. }
  88456. sp_cache_384_inited = 1;
  88457. }
  88458. /* Compare point with those in cache. */
  88459. for (i=0; i<FP_ENTRIES; i++) {
  88460. if (!sp_cache_384[i].set)
  88461. continue;
  88462. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  88463. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  88464. sp_cache_384[i].cnt++;
  88465. break;
  88466. }
  88467. }
  88468. /* No match. */
  88469. if (i == FP_ENTRIES) {
  88470. /* Find empty entry. */
  88471. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  88472. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  88473. if (!sp_cache_384[i].set) {
  88474. break;
  88475. }
  88476. }
  88477. /* Evict least used. */
  88478. if (i == sp_cache_384_last) {
  88479. least = sp_cache_384[0].cnt;
  88480. for (j=1; j<FP_ENTRIES; j++) {
  88481. if (sp_cache_384[j].cnt < least) {
  88482. i = j;
  88483. least = sp_cache_384[i].cnt;
  88484. }
  88485. }
  88486. }
  88487. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  88488. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  88489. sp_cache_384[i].set = 1;
  88490. sp_cache_384[i].cnt = 1;
  88491. }
  88492. *cache = &sp_cache_384[i];
  88493. sp_cache_384_last = i;
  88494. }
  88495. #endif /* FP_ECC */
  88496. /* Multiply the base point of P384 by the scalar and return the result.
  88497. * If map is true then convert result to affine coordinates.
  88498. *
  88499. * r Resulting point.
  88500. * g Point to multiply.
  88501. * k Scalar to multiply by.
  88502. * map Indicates whether to convert result to affine.
  88503. * ct Constant time required.
  88504. * heap Heap to use for allocation.
  88505. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  88506. */
  88507. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  88508. int map, int ct, void* heap)
  88509. {
  88510. #ifndef FP_ECC
  88511. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  88512. #else
  88513. sp_digit tmp[2 * 12 * 7];
  88514. sp_cache_384_t* cache;
  88515. int err = MP_OKAY;
  88516. #ifndef HAVE_THREAD_LS
  88517. if (initCacheMutex_384 == 0) {
  88518. wc_InitMutex(&sp_cache_384_lock);
  88519. initCacheMutex_384 = 1;
  88520. }
  88521. if (wc_LockMutex(&sp_cache_384_lock) != 0)
  88522. err = BAD_MUTEX_E;
  88523. #endif /* HAVE_THREAD_LS */
  88524. if (err == MP_OKAY) {
  88525. sp_ecc_get_cache_384(g, &cache);
  88526. if (cache->cnt == 2)
  88527. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  88528. #ifndef HAVE_THREAD_LS
  88529. wc_UnLockMutex(&sp_cache_384_lock);
  88530. #endif /* HAVE_THREAD_LS */
  88531. if (cache->cnt < 2) {
  88532. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  88533. }
  88534. else {
  88535. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  88536. map, ct, heap);
  88537. }
  88538. }
  88539. return err;
  88540. #endif
  88541. }
  88542. #endif /* WOLFSSL_SP_SMALL */
  88543. /* Multiply the point by the scalar and return the result.
  88544. * If map is true then convert result to affine coordinates.
  88545. *
  88546. * km Scalar to multiply by.
  88547. * p Point to multiply.
  88548. * r Resulting point.
  88549. * map Indicates whether to convert result to affine.
  88550. * heap Heap to use for allocation.
  88551. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  88552. */
  88553. int sp_ecc_mulmod_384(const mp_int* km, const ecc_point* gm, ecc_point* r,
  88554. int map, void* heap)
  88555. {
  88556. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88557. sp_point_384* point = NULL;
  88558. sp_digit* k = NULL;
  88559. #else
  88560. sp_point_384 point[1];
  88561. sp_digit k[12];
  88562. #endif
  88563. int err = MP_OKAY;
  88564. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88565. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  88566. DYNAMIC_TYPE_ECC);
  88567. if (point == NULL)
  88568. err = MEMORY_E;
  88569. if (err == MP_OKAY) {
  88570. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  88571. DYNAMIC_TYPE_ECC);
  88572. if (k == NULL)
  88573. err = MEMORY_E;
  88574. }
  88575. #endif
  88576. if (err == MP_OKAY) {
  88577. sp_384_from_mp(k, 12, km);
  88578. sp_384_point_from_ecc_point_12(point, gm);
  88579. err = sp_384_ecc_mulmod_12(point, point, k, map, 1, heap);
  88580. }
  88581. if (err == MP_OKAY) {
  88582. err = sp_384_point_to_ecc_point_12(point, r);
  88583. }
  88584. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88585. if (k != NULL)
  88586. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  88587. if (point != NULL)
  88588. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  88589. #endif
  88590. return err;
  88591. }
  88592. /* Multiply the point by the scalar, add point a and return the result.
  88593. * If map is true then convert result to affine coordinates.
  88594. *
  88595. * km Scalar to multiply by.
  88596. * p Point to multiply.
  88597. * am Point to add to scalar mulitply result.
  88598. * inMont Point to add is in montgomery form.
  88599. * r Resulting point.
  88600. * map Indicates whether to convert result to affine.
  88601. * heap Heap to use for allocation.
  88602. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  88603. */
  88604. int sp_ecc_mulmod_add_384(const mp_int* km, const ecc_point* gm,
  88605. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  88606. {
  88607. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88608. sp_point_384* point = NULL;
  88609. sp_digit* k = NULL;
  88610. #else
  88611. sp_point_384 point[2];
  88612. sp_digit k[12 + 12 * 2 * 6];
  88613. #endif
  88614. sp_point_384* addP = NULL;
  88615. sp_digit* tmp = NULL;
  88616. int err = MP_OKAY;
  88617. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88618. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  88619. DYNAMIC_TYPE_ECC);
  88620. if (point == NULL)
  88621. err = MEMORY_E;
  88622. if (err == MP_OKAY) {
  88623. k = (sp_digit*)XMALLOC(
  88624. sizeof(sp_digit) * (12 + 12 * 2 * 6), heap,
  88625. DYNAMIC_TYPE_ECC);
  88626. if (k == NULL)
  88627. err = MEMORY_E;
  88628. }
  88629. #endif
  88630. if (err == MP_OKAY) {
  88631. addP = point + 1;
  88632. tmp = k + 12;
  88633. sp_384_from_mp(k, 12, km);
  88634. sp_384_point_from_ecc_point_12(point, gm);
  88635. sp_384_point_from_ecc_point_12(addP, am);
  88636. }
  88637. if ((err == MP_OKAY) && (!inMont)) {
  88638. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  88639. }
  88640. if ((err == MP_OKAY) && (!inMont)) {
  88641. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  88642. }
  88643. if ((err == MP_OKAY) && (!inMont)) {
  88644. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  88645. }
  88646. if (err == MP_OKAY) {
  88647. err = sp_384_ecc_mulmod_12(point, point, k, 0, 0, heap);
  88648. }
  88649. if (err == MP_OKAY) {
  88650. sp_384_proj_point_add_12(point, point, addP, tmp);
  88651. if (map) {
  88652. sp_384_map_12(point, point, tmp);
  88653. }
  88654. err = sp_384_point_to_ecc_point_12(point, r);
  88655. }
  88656. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  88657. if (k != NULL)
  88658. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  88659. if (point != NULL)
  88660. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  88661. #endif
  88662. return err;
  88663. }
  88664. #ifdef WOLFSSL_SP_SMALL
  88665. /* Striping precomputation table.
  88666. * 4 points combined into a table of 16 points.
  88667. * Distance of 96 between points.
  88668. */
  88669. static const sp_table_entry_384 p384_table[16] = {
  88670. /* 0 */
  88671. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  88672. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  88673. /* 1 */
  88674. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  88675. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  88676. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  88677. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  88678. /* 2 */
  88679. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  88680. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  88681. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  88682. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  88683. /* 3 */
  88684. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  88685. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  88686. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  88687. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  88688. /* 4 */
  88689. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  88690. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  88691. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  88692. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  88693. /* 5 */
  88694. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  88695. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  88696. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  88697. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  88698. /* 6 */
  88699. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  88700. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  88701. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  88702. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  88703. /* 7 */
  88704. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  88705. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  88706. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  88707. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  88708. /* 8 */
  88709. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  88710. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  88711. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  88712. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  88713. /* 9 */
  88714. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  88715. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  88716. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  88717. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  88718. /* 10 */
  88719. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  88720. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  88721. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  88722. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  88723. /* 11 */
  88724. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  88725. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  88726. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  88727. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  88728. /* 12 */
  88729. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  88730. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  88731. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  88732. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  88733. /* 13 */
  88734. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  88735. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  88736. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  88737. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  88738. /* 14 */
  88739. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  88740. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  88741. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  88742. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  88743. /* 15 */
  88744. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  88745. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  88746. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  88747. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  88748. };
  88749. /* Multiply the base point of P384 by the scalar and return the result.
  88750. * If map is true then convert result to affine coordinates.
  88751. *
  88752. * Stripe implementation.
  88753. * Pre-generated: 2^0, 2^96, ...
  88754. * Pre-generated: products of all combinations of above.
  88755. * 4 doubles and adds (with qz=1)
  88756. *
  88757. * r Resulting point.
  88758. * k Scalar to multiply by.
  88759. * map Indicates whether to convert result to affine.
  88760. * ct Constant time required.
  88761. * heap Heap to use for allocation.
  88762. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  88763. */
  88764. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  88765. int map, int ct, void* heap)
  88766. {
  88767. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  88768. k, map, ct, heap);
  88769. }
  88770. #else
  88771. /* Striping precomputation table.
  88772. * 8 points combined into a table of 256 points.
  88773. * Distance of 48 between points.
  88774. */
  88775. static const sp_table_entry_384 p384_table[256] = {
  88776. /* 0 */
  88777. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  88778. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  88779. /* 1 */
  88780. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  88781. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  88782. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  88783. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  88784. /* 2 */
  88785. { { 0x2b0c535b,0x29864753,0x70506296,0x90dd6953,0x216ab9ac,0x038cd6b4,
  88786. 0xbe12d76a,0x3df9b7b7,0x5f347bdb,0x13f4d978,0x13e94489,0x222c5c9c },
  88787. { 0x2680dc64,0x5f8e796f,0x58352417,0x120e7cb7,0xd10740b8,0x254b5d8a,
  88788. 0x5337dee6,0xc38b8efb,0x94f02247,0xf688c2e1,0x6c25bc4c,0x7b5c75f3 } },
  88789. /* 3 */
  88790. { { 0x9edffea5,0xe26a3cc3,0x37d7e9fc,0x35bbfd1c,0x9bde3ef6,0xf0e7700d,
  88791. 0x1a538f5a,0x0380eb47,0x05bf9eb3,0x2e9da8bb,0x1a460c3e,0xdbb93c73 },
  88792. { 0xf526b605,0x37dba260,0xfd785537,0x95d4978e,0xed72a04a,0x24ed793a,
  88793. 0x76005b1a,0x26948377,0x9e681f82,0x99f557b9,0xd64954ef,0xae5f9557 } },
  88794. /* 4 */
  88795. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  88796. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  88797. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  88798. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  88799. /* 5 */
  88800. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  88801. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  88802. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  88803. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  88804. /* 6 */
  88805. { { 0x4fc52870,0x28f9c07a,0x1a53a961,0xce0b3748,0x0e1828d9,0xd550fa18,
  88806. 0x6adb225a,0xa24abaf7,0x6e58a348,0xd11ed0a5,0x948acb62,0xf3d811e6 },
  88807. { 0x4c61ed22,0x8618dd77,0x80b47c9d,0x0bb747f9,0xde6b8559,0x22bf796f,
  88808. 0x680a21e9,0xfdfd1c6d,0x2af2c9dd,0xc0db1577,0xc1e90f3d,0xa09379e6 } },
  88809. /* 7 */
  88810. { { 0xe085c629,0x386c66ef,0x095bc89a,0x5fc2a461,0x203f4b41,0x1353d631,
  88811. 0x7e4bd8f5,0x7ca1972b,0xa7df8ce9,0xb077380a,0xee7e4ea3,0xd8a90389 },
  88812. { 0xe7b14461,0x1bc74dc7,0x0c9c4f78,0xdc2cb014,0x84ef0a10,0x52b4b3a6,
  88813. 0x20327fe2,0xbde6ea5d,0x660f9615,0xb71ec435,0xb8ad8173,0xeede5a04 } },
  88814. /* 8 */
  88815. { { 0x893b9a2d,0x5584cbb3,0x00850c5d,0x820c660b,0x7df2d43d,0x4126d826,
  88816. 0x0109e801,0xdd5bbbf0,0x38172f1c,0x85b92ee3,0xf31430d9,0x609d4f93 },
  88817. { 0xeadaf9d6,0x1e059a07,0x0f125fb0,0x70e6536c,0x560f20e7,0xd6220751,
  88818. 0x7aaf3a9a,0xa59489ae,0x64bae14e,0x7b70e2f6,0x76d08249,0x0dd03701 } },
  88819. /* 9 */
  88820. { { 0x8510521f,0x4cc13be8,0xf724cc17,0x87315ba9,0x353dc263,0xb49d83bb,
  88821. 0x0c279257,0x8b677efe,0xc93c9537,0x510a1c1c,0xa4702c99,0x33e30cd8 },
  88822. { 0x2208353f,0xf0ffc89d,0xced42b2b,0x0170fa8d,0x26e2a5f5,0x090851ed,
  88823. 0xecb52c96,0x81276455,0x7fe1adf4,0x0646c4e1,0xb0868eab,0x513f047e } },
  88824. /* 10 */
  88825. { { 0xdf5bdf53,0xc07611f4,0x58b11a6d,0x45d331a7,0x1c4ee394,0x58965daf,
  88826. 0x5a5878d1,0xba8bebe7,0x82dd3025,0xaecc0a18,0xa923eb8b,0xcf2a3899 },
  88827. { 0xd24fd048,0xf98c9281,0x8bbb025d,0x841bfb59,0xc9ab9d53,0xb8ddf8ce,
  88828. 0x7fef044e,0x538a4cb6,0x23236662,0x092ac21f,0x0b66f065,0xa919d385 } },
  88829. /* 11 */
  88830. { { 0x85d480d8,0x3db03b40,0x1b287a7d,0x8cd9f479,0x4a8f3bae,0x8f24dc75,
  88831. 0x3db41892,0x482eb800,0x9c56e0f5,0x38bf9eb3,0x9a91dc6f,0x8b977320 },
  88832. { 0x7209cfc2,0xa31b05b2,0x05b2db70,0x4c49bf85,0xd619527b,0x56462498,
  88833. 0x1fac51ba,0x3fe51039,0xab4b8342,0xfb04f55e,0x04c6eabf,0xc07c10dc } },
  88834. /* 12 */
  88835. { { 0xdb32f048,0xad22fe4c,0x475ed6df,0x5f23bf91,0xaa66b6cb,0xa50ce0c0,
  88836. 0xf03405c0,0xdf627a89,0xf95e2d6a,0x3674837d,0xba42e64e,0x081c95b6 },
  88837. { 0xe71d6ceb,0xeba3e036,0x6c6b0271,0xb45bcccf,0x0684701d,0x67b47e63,
  88838. 0xe712523f,0x60f8f942,0x5cd47adc,0x82423472,0x87649cbb,0x83027d79 } },
  88839. /* 13 */
  88840. { { 0x3615b0b8,0xb3929ea6,0xa54dac41,0xb41441fd,0xb5b6a368,0x8995d556,
  88841. 0x167ef05e,0xa80d4529,0x6d25a27f,0xf6bcb4a1,0x7bd55b68,0x210d6a4c },
  88842. { 0x25351130,0xf3804abb,0x903e37eb,0x1d2df699,0x084c25c8,0x5f201efc,
  88843. 0xa1c68e91,0x31a28c87,0x563f62a5,0x81dad253,0xd6c415d4,0x5dd6de70 } },
  88844. /* 14 */
  88845. { { 0x846612ce,0x29f470fd,0xda18d997,0x986f3eec,0x2f34af86,0x6b84c161,
  88846. 0x46ddaf8b,0x5ef0a408,0xe49e795f,0x14405a00,0xaa2f7a37,0x5f491b16 },
  88847. { 0xdb41b38d,0xc7f07ae4,0x18fbfcaa,0xef7d119e,0x14443b19,0x3a18e076,
  88848. 0x79a19926,0x4356841a,0xe2226fbe,0x91f4a91c,0x3cc88721,0xdc77248c } },
  88849. /* 15 */
  88850. { { 0xe4b1ec9d,0xd570ff1a,0xe7eef706,0x21d23e0e,0xca19e086,0x3cde40f4,
  88851. 0xcd4bb270,0x7d6523c4,0xbf13aa6c,0x16c1f06c,0xd14c4b60,0x5aa7245a },
  88852. { 0x44b74de8,0x37f81467,0x620a934e,0x839e7a17,0xde8b1aa1,0xf74d14e8,
  88853. 0xf30d75e2,0x8789fa51,0xc81c261e,0x09b24052,0x33c565ee,0x654e2678 } },
  88854. /* 16 */
  88855. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  88856. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  88857. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  88858. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  88859. /* 17 */
  88860. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  88861. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  88862. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  88863. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  88864. /* 18 */
  88865. { { 0x7d8c1bba,0x7ecbac01,0x90b0f3d5,0x6058f9c3,0xf6197d0f,0xaee116e3,
  88866. 0x4033b128,0xc4dd7068,0xc209b983,0xf084dba6,0x831dbc4a,0x97c7c2cf },
  88867. { 0xf96010e8,0x2f4e61dd,0x529faa17,0xd97e4e20,0x69d37f20,0x4ee66660,
  88868. 0x3d366d72,0xccc139ed,0x13488e0f,0x690b6ee2,0xf3a6d533,0x7cad1dc5 } },
  88869. /* 19 */
  88870. { { 0xda57a41f,0x660a9a81,0xec0039b6,0xe74a0412,0x5e1dad15,0x42343c6b,
  88871. 0x46681d4c,0x284f3ff5,0x63749e89,0xb51087f1,0x6f9f2f13,0x070f23cc },
  88872. { 0x5d186e14,0x542211da,0xfddb0dff,0x84748f37,0xdb1f4180,0x41a3aab4,
  88873. 0xa6402d0e,0x25ed667b,0x02f58355,0x2f2924a9,0xfa44a689,0x5844ee7c } },
  88874. /* 20 */
  88875. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  88876. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  88877. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  88878. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  88879. /* 21 */
  88880. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  88881. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  88882. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  88883. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  88884. /* 22 */
  88885. { { 0x104cbba5,0xc023780d,0xfa35dd4c,0x6207e747,0x1ca9b6a3,0x35c23928,
  88886. 0x97987b10,0x4ff19be8,0x8022eee8,0xb8476bbf,0xd3bbe74d,0xaa0a4a14 },
  88887. { 0x187d4543,0x20f94331,0x79f6e066,0x32153870,0xac7e82e1,0x83b0f74e,
  88888. 0x828f06ab,0xa7748ba2,0xc26ef35f,0xc5f0298a,0x8e9a7dbd,0x0f0c5070 } },
  88889. /* 23 */
  88890. { { 0xdef029dd,0x0c5c244c,0x850661b8,0x3dabc687,0xfe11d981,0x9992b865,
  88891. 0x6274dbad,0xe9801b8f,0x098da242,0xe54e6319,0x91a53d08,0x9929a91a },
  88892. { 0x35285887,0x37bffd72,0xf1418102,0xbc759425,0xfd2e6e20,0x9280cc35,
  88893. 0xfbc42ee5,0x735c600c,0x8837619a,0xb7ad2864,0xa778c57b,0xa3627231 } },
  88894. /* 24 */
  88895. { { 0x91361ed8,0xae799b5c,0x6c63366c,0x47d71b75,0x1b265a6a,0x54cdd521,
  88896. 0x98d77b74,0xe0215a59,0xbab29db0,0x4424d9b7,0x7fd9e536,0x8b0ffacc },
  88897. { 0x37b5d9ef,0x46d85d12,0xbfa91747,0x5b106d62,0x5f99ba2d,0xed0479f8,
  88898. 0x1d104de4,0x0e6f3923,0x25e8983f,0x83a84c84,0xf8105a70,0xa9507e0a } },
  88899. /* 25 */
  88900. { { 0x14cf381c,0xf6c68a6e,0xc22e31cc,0xaf9d27bd,0xaa8a5ccb,0x23568d4d,
  88901. 0xe338e4d2,0xe431eec0,0x8f52ad1f,0xf1a828fe,0xe86acd80,0xdb6a0579 },
  88902. { 0x4507832a,0x2885672e,0x887e5289,0x73fc275f,0x05610d08,0x65f80278,
  88903. 0x075ff5b0,0x8d9b4554,0x09f712b5,0x3a8e8fb1,0x2ebe9cf2,0x39f0ac86 } },
  88904. /* 26 */
  88905. { { 0x4c52edf5,0xd8fabf78,0xa589ae53,0xdcd737e5,0xd791ab17,0x94918bf0,
  88906. 0xbcff06c9,0xb5fbd956,0xdca46d45,0xf6d3032e,0x41a3e486,0x2cdff7e1 },
  88907. { 0x61f47ec8,0x6674b3ba,0xeef84608,0x8a882163,0x4c687f90,0xa257c705,
  88908. 0xf6cdf227,0xe30cb2ed,0x7f6ea846,0x2c4c64ca,0xcc6bcd3c,0x186fa17c } },
  88909. /* 27 */
  88910. { { 0x1dfcb91e,0x48a3f536,0x646d358a,0x83595e13,0x91128798,0xbd15827b,
  88911. 0x2187757a,0x3ce612b8,0x61bd7372,0x873150a1,0xb662f568,0xf4684530 },
  88912. { 0x401896f6,0x8833950b,0x77f3e090,0xe11cb89a,0x48e7f4a5,0xb2f12cac,
  88913. 0xf606677e,0x313dd769,0x16579f93,0xfdcf08b3,0x46b8f22b,0x6429cec9 } },
  88914. /* 28 */
  88915. { { 0xbb75f9a4,0x4984dd54,0x29d3b570,0x4aef06b9,0x3d6e4c1e,0xb5f84ca2,
  88916. 0xb083ef35,0x24c61c11,0x392ca9ff,0xce4a7392,0x6730a800,0x865d6517 },
  88917. { 0x722b4a2b,0xca3dfe76,0x7b083e0e,0x12c04bf9,0x1b86b8a5,0x803ce5b5,
  88918. 0x6a7e3e0c,0x3fc7632d,0xc81adbe4,0xc89970c2,0x120e16b1,0x3cbcd3ad } },
  88919. /* 29 */
  88920. { { 0xec30ce93,0xfbfb4cc7,0xb72720a2,0x10ed6c7d,0x47b55500,0xec675bf7,
  88921. 0x333ff7c3,0x90725903,0x5075bfc0,0xc7c3973e,0x07acf31b,0xb049ecb0 },
  88922. { 0x4f58839c,0xb4076eaf,0xa2b05e4f,0x101896da,0xab40c66e,0x3f6033b0,
  88923. 0xc8d864ba,0x19ee9eeb,0x47bf6d2a,0xeb6cf155,0xf826477d,0x8e5a9663 } },
  88924. /* 30 */
  88925. { { 0xf7fbd5e1,0x69e62fdd,0x76912b1d,0x38ecfe54,0xd1da3bfb,0x845a3d56,
  88926. 0x1c86f0d4,0x0494950e,0x3bc36ce8,0x83cadbf9,0x4fccc8d1,0x41fce572 },
  88927. { 0x8332c144,0x05f939c2,0x0871e46e,0xb17f248b,0x66e8aff6,0x3d8534e2,
  88928. 0x3b85c629,0x1d06f1dc,0xa3131b73,0xdb06a32e,0x8b3f64e5,0xf295184d } },
  88929. /* 31 */
  88930. { { 0x36ddc103,0xd9653ff7,0x95ef606f,0x25f43e37,0xfe06dce8,0x09e301fc,
  88931. 0x30b6eebf,0x85af2341,0x0ff56b20,0x79b12b53,0xfe9a3c6b,0x9b4fb499 },
  88932. { 0x51d27ac2,0x0154f892,0x56ca5389,0xd33167e3,0xafc065a6,0x7828ec1f,
  88933. 0x7f746c9b,0x0959a258,0x0c44f837,0xb18f1be3,0xc4132fdb,0xa7946117 } },
  88934. /* 32 */
  88935. { { 0x5e3c647b,0xc0426b77,0x8cf05348,0xbfcbd939,0x172c0d3d,0x31d312e3,
  88936. 0xee754737,0x5f49fde6,0x6da7ee61,0x895530f0,0xe8b3a5fb,0xcf281b0a },
  88937. { 0x41b8a543,0xfd149735,0x3080dd30,0x41a625a7,0x653908cf,0xe2baae07,
  88938. 0xba02a278,0xc3d01436,0x7b21b8f8,0xa0d0222e,0xd7ec1297,0xfdc270e9 } },
  88939. /* 33 */
  88940. { { 0xbc7f41d6,0x00873c0c,0x1b7ad641,0xd976113e,0x238443fb,0x2a536ff4,
  88941. 0x41e62e45,0x030d00e2,0x5f545fc6,0x532e9867,0x8e91208c,0xcd033108 },
  88942. { 0x9797612c,0xd1a04c99,0xeea674e2,0xd4393e02,0xe19742a1,0xd56fa69e,
  88943. 0x85f0590e,0xdd2ab480,0x48a2243d,0xa5cefc52,0x54383f41,0x48cc67b6 } },
  88944. /* 34 */
  88945. { { 0xfc14ab48,0x4e50430e,0x26706a74,0x195b7f4f,0xcc881ff6,0x2fe8a228,
  88946. 0xd945013d,0xb1b968e2,0x4b92162b,0x936aa579,0x364e754a,0x4fb766b7 },
  88947. { 0x31e1ff7f,0x13f93bca,0xce4f2691,0x696eb5ca,0xa2b09e02,0xff754bf8,
  88948. 0xe58e3ff8,0x58f13c9c,0x1678c0b0,0xb757346f,0xa86692b3,0xd54200db } },
  88949. /* 35 */
  88950. { { 0x6dda1265,0x9a030bbd,0xe89718dd,0xf7b4f3fc,0x936065b8,0xa6a4931f,
  88951. 0x5f72241c,0xbce72d87,0x65775857,0x6cbb51cb,0x4e993675,0xc7161815 },
  88952. { 0x2ee32189,0xe81a0f79,0x277dc0b2,0xef2fab26,0xb71f469f,0x9e64f6fe,
  88953. 0xdfdaf859,0xb448ce33,0xbe6b5df1,0x3f5c1c4c,0x1de45f7b,0xfb8dfb00 } },
  88954. /* 36 */
  88955. { { 0x4d5bb921,0xc7345fa7,0x4d2b667e,0x5c7e04be,0x282d7a3e,0x47ed3a80,
  88956. 0x7e47b2a4,0x5c2777f8,0x08488e2e,0x89b3b100,0xb2eb5b45,0x9aad77c2 },
  88957. { 0xdaac34ae,0xd681bca7,0x26afb326,0x2452e4e5,0x41a1ee14,0x0c887924,
  88958. 0xc2407ade,0x743b04d4,0xfc17a2ac,0xcb5e999b,0x4a701a06,0x4dca2f82 } },
  88959. /* 37 */
  88960. { { 0x1127bc1a,0x68e31ca6,0x17ead3be,0xa3edd59b,0xe25f5a15,0x67b6b645,
  88961. 0xa420e15e,0x76221794,0x4b1e872e,0x794fd83b,0xb2dece1b,0x7cab3f03 },
  88962. { 0xca9b3586,0x7119bf15,0x4d250bd7,0xa5545924,0xcc6bcf24,0x173633ea,
  88963. 0xb1b6f884,0x9bd308c2,0x447d38c3,0x3bae06f5,0xf341fe1c,0x54dcc135 } },
  88964. /* 38 */
  88965. { { 0x943caf0d,0x56d3598d,0x225ff133,0xce044ea9,0x563fadea,0x9edf6a7c,
  88966. 0x73e8dc27,0x632eb944,0x3190dcab,0x814b467e,0x6dbb1e31,0x2d4f4f31 },
  88967. { 0xa143b7ca,0x8d69811c,0xde7cf950,0x4ec1ac32,0x37b5fe82,0x223ab5fd,
  88968. 0x9390f1d9,0xe82616e4,0x75804610,0xabff4b20,0x875b08f0,0x11b9be15 } },
  88969. /* 39 */
  88970. { { 0x3bbe682c,0x4ae31a3d,0x74eef2dd,0xbc7c5d26,0x3c47dd40,0x92afd10a,
  88971. 0xc14ab9e1,0xec7e0a3b,0xb2e495e4,0x6a6c3dd1,0x309bcd85,0x085ee5e9 },
  88972. { 0x8c2e67fd,0xf381a908,0xe261eaf2,0x32083a80,0x96deee15,0x0fcd6a49,
  88973. 0x5e524c79,0xe3b8fb03,0x1d5b08b9,0x8dc360d9,0x7f26719f,0x3a06e2c8 } },
  88974. /* 40 */
  88975. { { 0x7237cac0,0x5cd9f5a8,0x43586794,0x93f0b59d,0xe94f6c4e,0x4384a764,
  88976. 0xb62782d3,0x8304ed2b,0xcde06015,0x0b8db8b3,0x5dbe190f,0x4336dd53 },
  88977. { 0x92ab473a,0x57443553,0xbe5ed046,0x031c7275,0x21909aa4,0x3e78678c,
  88978. 0x99202ddb,0x4ab7e04f,0x6977e635,0x2648d206,0x093198be,0xd427d184 } },
  88979. /* 41 */
  88980. { { 0x0f9b5a31,0x822848f5,0xbaadb62a,0xbb003468,0x3357559c,0x233a0472,
  88981. 0x79aee843,0x49ef6880,0xaeb9e1e3,0xa89867a0,0x1f6f9a55,0xc151931b },
  88982. { 0xad74251e,0xd264eb0b,0x4abf295e,0x37b9b263,0x04960d10,0xb600921b,
  88983. 0x4da77dc0,0x0de53dbc,0xd2b18697,0x01d9bab3,0xf7156ddf,0xad54ec7a } },
  88984. /* 42 */
  88985. { { 0x79efdc58,0x8e74dc35,0x4ff68ddb,0x456bd369,0xd32096a5,0x724e74cc,
  88986. 0x386783d0,0xe41cff42,0x7c70d8a4,0xa04c7f21,0xe61a19a2,0x41199d2f },
  88987. { 0x29c05dd2,0xd389a3e0,0xe7e3fda9,0x535f2a6b,0x7c2b4df8,0x26ecf72d,
  88988. 0xfe745294,0x678275f4,0x9d23f519,0x6319c9cc,0x88048fc4,0x1e05a02d } },
  88989. /* 43 */
  88990. { { 0xd4d5ffe8,0x75cc8e2e,0xdbea17f2,0xf8bb4896,0xcee3cb4a,0x35059790,
  88991. 0xa47c6165,0x4c06ee85,0x92935d2f,0xf98fff25,0x32ffd7c7,0x34c4a572 },
  88992. { 0xea0376a2,0xc4b14806,0x4f115e02,0x2ea5e750,0x1e55d7c0,0x532d76e2,
  88993. 0xf31044da,0x68dc9411,0x71b77993,0x9272e465,0x93a8cfd5,0xadaa38bb } },
  88994. /* 44 */
  88995. { { 0x7d4ed72a,0x4bf0c712,0xba1f79a3,0xda0e9264,0xf4c39ea4,0x48c0258b,
  88996. 0x2a715138,0xa5394ed8,0xbf06c660,0x4af511ce,0xec5c37cd,0xfcebceef },
  88997. { 0x779ae8c1,0xf23b75aa,0xad1e606e,0xdeff59cc,0x22755c82,0xf3f526fd,
  88998. 0xbb32cefd,0x64c5ab44,0x915bdefd,0xa96e11a2,0x1143813e,0xab19746a } },
  88999. /* 45 */
  89000. { { 0xec837d7d,0x43c78585,0xb8ee0ba4,0xca5b6fbc,0xd5dbb5ee,0x34e924d9,
  89001. 0xbb4f1ca5,0x3f4fa104,0x398640f7,0x15458b72,0xd7f407ea,0x4231faa9 },
  89002. { 0xf96e6896,0x53e0661e,0xd03b0f9d,0x554e4c69,0x9c7858d1,0xd4fcb07b,
  89003. 0x52cb04fa,0x7e952793,0x8974e7f7,0x5f5f1574,0x6b6d57c8,0x2e3fa558 } },
  89004. /* 46 */
  89005. { { 0x6a9951a8,0x42cd4803,0x42792ad0,0xa8b15b88,0xabb29a73,0x18e8bcf9,
  89006. 0x409933e8,0xbfd9a092,0xefb88dc4,0x760a3594,0x40724458,0x14418863 },
  89007. { 0x99caedc7,0x162a56ee,0x91d101c9,0x8fb12ecd,0x393202da,0xea671967,
  89008. 0xa4ccd796,0x1aac8c4a,0x1cf185a8,0x7db05036,0x8cfd095a,0x0c9f86cd } },
  89009. /* 47 */
  89010. { { 0x10b2a556,0x9a728147,0x327b70b2,0x767ca964,0x5e3799b7,0x04ed9e12,
  89011. 0x22a3eb2a,0x6781d2dc,0x0d9450ac,0x5bd116eb,0xa7ebe08a,0xeccac1fc },
  89012. { 0xdc2d6e94,0xde68444f,0x35ecf21b,0x3621f429,0x29e03a2c,0x14e2d543,
  89013. 0x7d3e7f0a,0x53e42cd5,0x73ed00b9,0xbba26c09,0xc57d2272,0x00297c39 } },
  89014. /* 48 */
  89015. { { 0xb8243a7d,0x3aaaab10,0x8fa58c5b,0x6eeef93e,0x9ae7f764,0xf866fca3,
  89016. 0x61ab04d3,0x64105a26,0x03945d66,0xa3578d8a,0x791b848c,0xb08cd3e4 },
  89017. { 0x756d2411,0x45edc5f8,0xa755128c,0xd4a790d9,0x49e5f6a0,0xc2cf0963,
  89018. 0xf649beaa,0xc66d267d,0x8467039e,0x3ce6d968,0x42f7816f,0x50046c6b } },
  89019. /* 49 */
  89020. { { 0x66425043,0x92ae1602,0xf08db890,0x1ff66afd,0x8f162ce5,0x386f5a7f,
  89021. 0xfcf5598f,0x18d2dea0,0x1a8ca18e,0x78372b3a,0x8cd0e6f7,0xdf0d20eb },
  89022. { 0x75bb4045,0x7edd5e1d,0xb96d94b7,0x252a47ce,0x2c626776,0xbdb29358,
  89023. 0x40dd1031,0x853c3943,0x7d5f47fd,0x9dc9becf,0xbae4044a,0x27c2302f } },
  89024. /* 50 */
  89025. { { 0x8f2d49ce,0x2d1d208a,0x162df0a2,0x0d91aa02,0x09a07f65,0x9c5cce87,
  89026. 0x84339012,0xdf07238b,0x419442cd,0x5028e2c8,0x72062aba,0x2dcbd358 },
  89027. { 0xe4680967,0xb5fbc3cb,0x9f92d72c,0x2a7bc645,0x116c369d,0x806c76e1,
  89028. 0x3177e8d8,0x5c50677a,0x4569df57,0x753739eb,0x36c3f40b,0x2d481ef6 } },
  89029. /* 51 */
  89030. { { 0xfea1103e,0x1a2d39fd,0x95f81b17,0xeaae5592,0xf59b264a,0xdbd0aa18,
  89031. 0xcb592ee0,0x90c39c1a,0x9750cca3,0xdf62f80d,0xdf97cc6c,0xda4d8283 },
  89032. { 0x1e201067,0x0a6dd346,0x69fb1f6b,0x1531f859,0x1d60121f,0x4895e552,
  89033. 0x4c041c91,0x0b21aab0,0xbcc1ccf8,0x9d896c46,0x3141bde7,0xd24da3b3 } },
  89034. /* 52 */
  89035. { { 0x53b0a354,0x575a0537,0x0c6ddcd8,0x392ff2f4,0x56157b94,0x0b8e8cff,
  89036. 0x3b1b80d1,0x073e57bd,0x3fedee15,0x2a75e0f0,0xaa8e6f19,0x752380e4 },
  89037. { 0x6558ffe9,0x1f4e227c,0x19ec5415,0x3a348618,0xf7997085,0xab382d5e,
  89038. 0xddc46ac2,0x5e6deaff,0xfc8d094c,0xe5144078,0xf60e37c6,0xf674fe51 } },
  89039. /* 53 */
  89040. { { 0xaf63408f,0x6fb87ae5,0xcd75a737,0xa39c36a9,0xcf4c618d,0x7833313f,
  89041. 0xf034c88d,0xfbcd4482,0x39b35288,0x4469a761,0x66b5d9c9,0x77a711c5 },
  89042. { 0x944f8d65,0x4a695dc7,0x161aaba8,0xe6da5f65,0x24601669,0x8654e9c3,
  89043. 0x28ae7491,0xbc8b93f5,0x8f5580d8,0x5f1d1e83,0xcea32cc8,0x8ccf9a1a } },
  89044. /* 54 */
  89045. { { 0x7196fee2,0x28ab110c,0x874c8945,0x75799d63,0x29aedadd,0xa2629348,
  89046. 0x2be88ff4,0x9714cc7b,0xd58d60d6,0xf71293cf,0x32a564e9,0xda6b6cb3 },
  89047. { 0x3dd821c2,0xf43fddb1,0x90dd323d,0xf2f2785f,0x048489f8,0x91246419,
  89048. 0xd24c6749,0x61660f26,0xc803c15c,0x961d9e8c,0xfaadc4c9,0x631c6158 } },
  89049. /* 55 */
  89050. { { 0xfd752366,0xacf2ebe0,0x139be88b,0xb93c340e,0x0f20179e,0x98f66485,
  89051. 0xff1da785,0x14820254,0x4f85c16e,0x5278e276,0x7aab1913,0xa246ee45 },
  89052. { 0x53763b33,0x43861eb4,0x45c0bc0d,0xc49f03fc,0xad6b1ea1,0xafff16bc,
  89053. 0x6fd49c99,0xce33908b,0xf7fde8c3,0x5c51e9bf,0xff142c5e,0x076a7a39 } },
  89054. /* 56 */
  89055. { { 0x9e338d10,0x04639dfe,0xf42b411b,0x8ee6996f,0xa875cef2,0x960461d1,
  89056. 0x95b4d0ba,0x1057b6d6,0xa906e0bc,0x27639252,0xe1c20f8a,0x2c19f09a },
  89057. { 0xeef4c43d,0x5b8fc3f0,0x07a84aa9,0xe2e1b1a8,0x835d2bdb,0x5f455528,
  89058. 0x207132dd,0x0f4aee4d,0x3907f675,0xe9f8338c,0x0e0531f0,0x7a874dc9 } },
  89059. /* 57 */
  89060. { { 0x97c27050,0x84b22d45,0x59e70bf8,0xbd0b8df7,0x79738b9b,0xb4d67405,
  89061. 0xcd917c4f,0x47f4d5f5,0x13ce6e33,0x9099c4ce,0x521d0f8b,0x942bfd39 },
  89062. { 0xa43b566d,0x5028f0f6,0x21bff7de,0xaf6e8669,0xc44232cd,0x83f6f856,
  89063. 0xf915069a,0x65680579,0xecfecb85,0xd12095a2,0xdb01ba16,0xcf7f06ae } },
  89064. /* 58 */
  89065. { { 0x8ef96c80,0x0f56e3c4,0x3ddb609c,0xd521f2b3,0x7dc1450d,0x2be94102,
  89066. 0x02a91fe2,0x2d21a071,0x1efa37de,0x2e6f74fa,0x156c28a1,0x9a9a90b8 },
  89067. { 0x9dc7dfcb,0xc54ea9ea,0x2c2c1d62,0xc74e66fc,0x49d3e067,0x9f23f967,
  89068. 0x54dd38ad,0x1c7c3a46,0x5946cee3,0xc7005884,0x45cc045d,0x89856368 } },
  89069. /* 59 */
  89070. { { 0xfce73946,0x29da7cd4,0x23168563,0x8f697db5,0xcba92ec6,0x8e235e9c,
  89071. 0x9f91d3ea,0x55d4655f,0xaa50a6cd,0xf3689f23,0x21e6a1a0,0xdcf21c26 },
  89072. { 0x61b818bf,0xcffbc82e,0xda47a243,0xc74a2f96,0x8bc1a0cf,0x234e980a,
  89073. 0x7929cb6d,0xf35fd6b5,0xefe17d6c,0x81468e12,0x58b2dafb,0xddea6ae5 } },
  89074. /* 60 */
  89075. { { 0x7e787b2e,0x294de887,0x39a9310d,0x258acc1f,0xac14265d,0x92d9714a,
  89076. 0x708b48a0,0x18b5591c,0xe1abbf71,0x27cc6bb0,0x568307b9,0xc0581fa3 },
  89077. { 0xf24d4d58,0x9e0f58a3,0xe0ce2327,0xfebe9bb8,0x9d1be702,0x91fd6a41,
  89078. 0xfacac993,0x9a7d8a45,0x9e50d66d,0xabc0a08c,0x06498201,0x02c342f7 } },
  89079. /* 61 */
  89080. { { 0x157bdbc2,0xccd71407,0xad0e1605,0x72fa89c6,0xb92a015f,0xb1d3da2b,
  89081. 0xa0a3fe56,0x8ad9e7cd,0x24f06737,0x160edcbd,0x61275be6,0x79d4db33 },
  89082. { 0x5f3497c4,0xd3d31fd9,0x04192fb0,0x8cafeaee,0x13a50af3,0xe13ca745,
  89083. 0x8c85aae5,0x18826167,0x9eb556ff,0xce06cea8,0xbdb549f3,0x2eef1995 } },
  89084. /* 62 */
  89085. { { 0x50596edc,0x8ed7d3eb,0x905243a2,0xaa359362,0xa4b6d02b,0xa212c2c2,
  89086. 0xc4fbec68,0x611fd727,0xb84f733d,0x8a0b8ff7,0x5f0daf0e,0xd85a6b90 },
  89087. { 0xd4091cf7,0x60e899f5,0x2eff2768,0x4fef2b67,0x10c33964,0xc1f195cb,
  89088. 0x93626a8f,0x8275d369,0x0d6c840a,0xc77904f4,0x7a868acd,0x88d8b7fd } },
  89089. /* 63 */
  89090. { { 0x7bd98425,0x85f23723,0xc70b154e,0xd4463992,0x96687a2e,0xcbb00ee2,
  89091. 0xc83214fd,0x905fdbf7,0x13593684,0x2019d293,0xef51218e,0x0428c393 },
  89092. { 0x981e909a,0x40c7623f,0x7be192da,0x92513385,0x4010907e,0x48fe480f,
  89093. 0x3120b459,0xdd7a187c,0xa1fd8f3c,0xc9d7702d,0xe358efc5,0x66e4753b } },
  89094. /* 64 */
  89095. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  89096. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  89097. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  89098. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  89099. /* 65 */
  89100. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  89101. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  89102. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  89103. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  89104. /* 66 */
  89105. { { 0xc6a2123f,0xb1a358f5,0xfe28df6d,0x927b2d95,0xf199d2f9,0x89702753,
  89106. 0x1a3f82dc,0x0a73754c,0x777affe1,0x063d029d,0xdae6d34d,0x5439817e },
  89107. { 0x6b8b83c4,0xf7979eef,0x9d945682,0x615cb214,0xc5e57eae,0x8f0e4fac,
  89108. 0x113047dd,0x042b89b8,0x93f36508,0x888356dc,0x5fd1f32f,0xbf008d18 } },
  89109. /* 67 */
  89110. { { 0x4e8068db,0x8012aa24,0xa5729a47,0xc72cc641,0x43f0691d,0x3c33df2c,
  89111. 0x1d92145f,0xfa057347,0xb97f7946,0xaefc0f2f,0x2f8121bf,0x813d75cb },
  89112. { 0x4383bba6,0x05613c72,0xa4224b3f,0xa924ce70,0x5f2179a6,0xe59cecbe,
  89113. 0x79f62b61,0x78e2e8aa,0x53ad8079,0x3ac2cc3b,0xd8f4fa96,0x55518d71 } },
  89114. /* 68 */
  89115. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  89116. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  89117. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  89118. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  89119. /* 69 */
  89120. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  89121. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  89122. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  89123. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  89124. /* 70 */
  89125. { { 0xb0ab9645,0xb5e405d3,0xd5f1f711,0xaeec7f98,0x585c2a6e,0x8ad42311,
  89126. 0x512c6944,0x045acb9e,0xa90db1c6,0xae106c4e,0x898e6563,0xb89f33d5 },
  89127. { 0x7fed2ce4,0x43b07cd9,0xdd815b20,0xf9934e17,0x0a81a349,0x6778d4d5,
  89128. 0x52918061,0x9e616ade,0xd7e67112,0xfa06db06,0x88488091,0x1da23cf1 } },
  89129. /* 71 */
  89130. { { 0x42f2c4b5,0x821c46b3,0x66059e47,0x931513ef,0x66f50cd1,0x7030ae43,
  89131. 0x43e7b127,0x43b536c9,0x5fca5360,0x006258cf,0x6b557abf,0xe4e3ee79 },
  89132. { 0x24c8b22f,0xbb6b3900,0xfcbf1054,0x2eb5e2c1,0x567492af,0x937b18c9,
  89133. 0xacf53957,0xf09432e4,0x1dbf3a56,0x585f5a9d,0xbe0887cf,0xf86751fd } },
  89134. /* 72 */
  89135. { { 0x9d10e0b2,0x157399cb,0x60dc51b7,0x1c0d5956,0x1f583090,0x1d496b8a,
  89136. 0x88590484,0x6658bc26,0x03213f28,0x88c08ab7,0x7ae58de4,0x8d2e0f73 },
  89137. { 0x486cfee6,0x9b79bc95,0xe9e5bc57,0x036a26c7,0xcd8ae97a,0x1ad03601,
  89138. 0xff3a0494,0x06907f87,0x2c7eb584,0x078f4bbf,0x7e8d0a5a,0xe3731bf5 } },
  89139. /* 73 */
  89140. { { 0xe1cd0abe,0x72f2282b,0x87efefa2,0xd4f9015e,0x6c3834bd,0x9d189806,
  89141. 0xb8a29ced,0x9c8cdcc1,0xfee82ebc,0x0601b9f4,0x7206a756,0x371052bc },
  89142. { 0x46f32562,0x76fa1092,0x17351bb4,0xdaad534c,0xb3636bb5,0xc3d64c37,
  89143. 0x45d54e00,0x038a8c51,0x32c09e7c,0x301e6180,0x95735151,0x9764eae7 } },
  89144. /* 74 */
  89145. { { 0xcbd5256a,0x8791b19f,0x6ca13a3b,0x4007e0f2,0x4cf06904,0x03b79460,
  89146. 0xb6c17589,0xb18a9c22,0x81d45908,0xa1cb7d7d,0x21bb68f1,0x6e13fa9d },
  89147. { 0xa71e6e16,0x47183c62,0xe18749ed,0x5cf0ef8e,0x2e5ed409,0x2c9c7f9b,
  89148. 0xe6e117e1,0x042eeacc,0x13fb5a7f,0xb86d4816,0xc9e5feb1,0xea1cf0ed } },
  89149. /* 75 */
  89150. { { 0xcea4cc9b,0x6e6573c9,0xafcec8f3,0x5417961d,0xa438b6f6,0x804bf02a,
  89151. 0xdcd4ea88,0xb894b03c,0x3799571f,0xd0f807e9,0x862156e8,0x3466a7f5 },
  89152. { 0x56515664,0x51e59acd,0xa3c5eb0b,0x55b0f93c,0x6a4279db,0x84a06b02,
  89153. 0xc5fae08e,0x5c850579,0xa663a1a2,0xcf07b8db,0xf46ffc8d,0x49a36bbc } },
  89154. /* 76 */
  89155. { { 0x46d93106,0xe47f5acc,0xaa897c9c,0x65b7ade0,0x12d7e4be,0x37cf4c94,
  89156. 0xd4b2caa9,0xa2ae9b80,0xe60357a3,0x5e7ce09c,0xc8ecd5f9,0x29f77667 },
  89157. { 0xa8a0b1c5,0xdf6868f5,0x62978ad8,0x240858cf,0xdc0002a1,0x0f7ac101,
  89158. 0xffe9aa05,0x1d28a9d7,0x5b962c97,0x744984d6,0x3d28c8b2,0xa8a7c00b } },
  89159. /* 77 */
  89160. { { 0xae11a338,0x7c58a852,0xd1af96e7,0xa78613f1,0x5355cc73,0x7e9767d2,
  89161. 0x792a2de6,0x6ba37009,0x124386b2,0x7d60f618,0x11157674,0xab09b531 },
  89162. { 0x98eb9dd0,0x95a04841,0x15070328,0xe6c17acc,0x489c6e49,0xafc6da45,
  89163. 0xbb211530,0xab45a60a,0x7d7ea933,0xc58d6592,0x095642c6,0xa3ef3c65 } },
  89164. /* 78 */
  89165. { { 0xdf010879,0x89d420e9,0x39576179,0x9d25255d,0xe39513b6,0x9cdefd50,
  89166. 0xd5d1c313,0xe4efe45b,0x3f7af771,0xc0149de7,0x340ab06b,0x55a6b4f4 },
  89167. { 0xebeaf771,0xf1325251,0x878d4288,0x2ab44128,0x18e05afe,0xfcd5832e,
  89168. 0xcc1fb62b,0xef52a348,0xc1c4792a,0x2bd08274,0x877c6dc7,0x345c5846 } },
  89169. /* 79 */
  89170. { { 0xbea65e90,0xde15ceb0,0x2416d99c,0x0987f72b,0xfd863dec,0x44db578d,
  89171. 0xac6a3578,0xf617b74b,0xdb48e999,0x9e62bd7a,0xeab1a1be,0x877cae61 },
  89172. { 0x3a358610,0x23adddaa,0x325e2b07,0x2fc4d6d1,0x1585754e,0x897198f5,
  89173. 0xb392b584,0xf741852c,0xb55f7de1,0x9927804c,0x1aa8efae,0xe9e6c4ed } },
  89174. /* 80 */
  89175. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  89176. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  89177. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  89178. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  89179. /* 81 */
  89180. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  89181. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  89182. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  89183. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  89184. /* 82 */
  89185. { { 0xf8e60f5b,0x511188b4,0x48aa2ada,0x7fe67015,0x381abca2,0xdb333cb8,
  89186. 0xdaf3fc97,0xb15e6d9d,0x36aabc03,0x4b24f6eb,0x72a748b4,0xc59789df },
  89187. { 0x29cf5279,0x26fcb8a5,0x01ad9a6c,0x7a3c6bfc,0x4b8bac9b,0x866cf88d,
  89188. 0x9c80d041,0xf4c89989,0x70add148,0xf0a04241,0x45d81a41,0x5a02f479 } },
  89189. /* 83 */
  89190. { { 0xc1c90202,0xfa5c877c,0xf8ac7570,0xd099d440,0xd17881f7,0x428a5b1b,
  89191. 0x5b2501d7,0x61e267db,0xf2e4465b,0xf889bf04,0x76aa4cb8,0x4da3ae08 },
  89192. { 0xe3e66861,0x3ef0fe26,0x3318b86d,0x5e772953,0x747396df,0xc3c35fbc,
  89193. 0x439ffd37,0x5115a29c,0xb2d70374,0xbfc4bd97,0x56246b9d,0x088630ea } },
  89194. /* 84 */
  89195. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  89196. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  89197. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  89198. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  89199. /* 85 */
  89200. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  89201. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  89202. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  89203. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  89204. /* 86 */
  89205. { { 0xfecf5b9b,0x34e0f9d1,0xf206966a,0xa115b12b,0x1eaa0534,0x5591cf3b,
  89206. 0xfb1558f9,0x5f0293cb,0x1bc703a5,0x1c8507a4,0x862c1f81,0x92e6b81c },
  89207. { 0xcdaf24e3,0xcc9ebc66,0x72fcfc70,0x68917ecd,0x8157ba48,0x6dc9a930,
  89208. 0xb06ab2b2,0x5d425c08,0x36e929c4,0x362f8ce7,0x62e89324,0x09f6f57c } },
  89209. /* 87 */
  89210. { { 0xd29375fb,0x1c7d6b78,0xe35d1157,0xfabd851e,0x4243ea47,0xf6f62dcd,
  89211. 0x8fe30b0f,0x1dd92460,0xffc6e709,0x08166dfa,0x0881e6a7,0xc6c4c693 },
  89212. { 0xd6a53fb0,0x20368f87,0x9eb4d1f9,0x38718e9f,0xafd7e790,0x03f08acd,
  89213. 0x72fe2a1c,0x0835eb44,0x88076e5d,0x7e050903,0xa638e731,0x538f765e } },
  89214. /* 88 */
  89215. { { 0xc2663b4b,0x0e0249d9,0x47cd38dd,0xe700ab5b,0x2c46559f,0xb192559d,
  89216. 0x4bcde66d,0x8f9f74a8,0x3e2aced5,0xad161523,0x3dd03a5b,0xc155c047 },
  89217. { 0x3be454eb,0x346a8799,0x83b7dccd,0x66ee94db,0xab9d2abe,0x1f6d8378,
  89218. 0x7733f355,0x4a396dd2,0xf53553c2,0x419bd40a,0x731dd943,0xd0ead98d } },
  89219. /* 89 */
  89220. { { 0xec142408,0x908e0b0e,0x4114b310,0x98943cb9,0x1742b1d7,0x03dbf7d8,
  89221. 0x693412f4,0xd270df6b,0x8f69e20c,0xc5065494,0x697e43a1,0xa76a90c3 },
  89222. { 0x4624825a,0xe0fa3384,0x8acc34c2,0x82e48c0b,0xe9a14f2b,0x7b24bd14,
  89223. 0x4db30803,0x4f5dd5e2,0x932da0a3,0x0c77a9e7,0x74c653dc,0x20db90f2 } },
  89224. /* 90 */
  89225. { { 0x0e6c5fd9,0x261179b7,0x6c982eea,0xf8bec123,0xd4957b7e,0x47683338,
  89226. 0x0a72f66a,0xcc47e664,0x1bad9350,0xbd54bf6a,0xf454e95a,0xdfbf4c6a },
  89227. { 0x6907f4fa,0x3f7a7afa,0x865ca735,0x7311fae0,0x2a496ada,0x24737ab8,
  89228. 0x15feb79b,0x13e425f1,0xa1b93c21,0xe9e97c50,0x4ddd3eb5,0xb26b6eac } },
  89229. /* 91 */
  89230. { { 0x2a2e5f2b,0x81cab9f5,0xbf385ac4,0xf93caf29,0xc909963a,0xf4bf35c3,
  89231. 0x74c9143c,0x081e7300,0xc281b4c5,0x3ea57fa8,0x9b340741,0xe497905c },
  89232. { 0x55ab3cfb,0xf556dd8a,0x518db6ad,0xd444b96b,0x5ef4b955,0x34f5425a,
  89233. 0xecd26aa3,0xdda7a3ac,0xda655e97,0xb57da11b,0xc2024c70,0x02da3eff } },
  89234. /* 92 */
  89235. { { 0x6481d0d9,0xe24b0036,0x818fdfe2,0x3740dbe5,0x190fda00,0xc1fc1f45,
  89236. 0x3cf27fde,0x329c9280,0x6934f43e,0x7435cb53,0x7884e8fe,0x2b505a5d },
  89237. { 0x711adcc9,0x6cfcc6a6,0x531e21e1,0xf034325c,0x9b2a8a99,0xa2f4a967,
  89238. 0x3c21bdff,0x9d5f3842,0x31b57d66,0xb25c7811,0x0b8093b9,0xdb5344d8 } },
  89239. /* 93 */
  89240. { { 0xae50a2f5,0x0d72e667,0xe4a861d1,0x9b7f8d8a,0x330df1cb,0xa129f70f,
  89241. 0xe04fefc3,0xe90aa5d7,0xe72c3ae1,0xff561ecb,0xcdb955fa,0x0d8fb428 },
  89242. { 0xd7663784,0xd2235f73,0x7e2c456a,0xc05baec6,0x2adbfccc,0xe5c292e4,
  89243. 0xefb110d5,0x4fd17988,0xd19d49f3,0x27e57734,0x84f679fe,0x188ac4ce } },
  89244. /* 94 */
  89245. { { 0xa796c53e,0x7ee344cf,0x0868009b,0xbbf6074d,0x474a1295,0x1f1594f7,
  89246. 0xac11632d,0x66776edc,0x04e2fa5a,0x1862278b,0xc854a89a,0x52665cf2 },
  89247. { 0x8104ab58,0x7e376464,0x7204fd6d,0x16775913,0x44ea1199,0x86ca06a5,
  89248. 0x1c9240dd,0xaa3f765b,0x24746149,0x5f8501a9,0xdcd251d7,0x7b982e30 } },
  89249. /* 95 */
  89250. { { 0xc15f3060,0xe44e9efc,0xa87ebbe6,0x5ad62f2e,0xc79500d4,0x36499d41,
  89251. 0x336fa9d1,0xa66d6dc0,0x5afd3b1f,0xf8afc495,0xe5c9822b,0x1d8ccb24 },
  89252. { 0x79d7584b,0x4031422b,0xea3f20dd,0xc54a0580,0x958468c5,0x3f837c8f,
  89253. 0xfbea7735,0x3d82f110,0x7dffe2fc,0x679a8778,0x20704803,0x48eba63b } },
  89254. /* 96 */
  89255. { { 0xdf46e2f6,0x89b10d41,0x19514367,0x13ab57f8,0x1d469c87,0x067372b9,
  89256. 0x4f6c5798,0x0c195afa,0x272c9acf,0xea43a12a,0x678abdac,0x9dadd8cb },
  89257. { 0xe182579a,0xcce56c6b,0x2d26c2d8,0x86febadb,0x2a44745c,0x1c668ee1,
  89258. 0x98dc047a,0x580acd86,0x51b9ec2d,0x5a2b79cc,0x4054f6a0,0x007da608 } },
  89259. /* 97 */
  89260. { { 0x17b00dd0,0x9e3ca352,0x0e81a7a6,0x046779cb,0xd482d871,0xb999fef3,
  89261. 0xd9233fbc,0xe6f38134,0xf48cd0e0,0x112c3001,0x3c6c66ae,0x934e7576 },
  89262. { 0xd73234dc,0xb44d4fc3,0x864eafc1,0xfcae2062,0x26bef21a,0x843afe25,
  89263. 0xf3b75fdf,0x61355107,0x794c2e6b,0x8367a5aa,0x8548a372,0x3d2629b1 } },
  89264. /* 98 */
  89265. { { 0x437cfaf8,0x6230618f,0x2032c299,0x5b8742cb,0x2293643a,0x949f7247,
  89266. 0x09464f79,0xb8040f1a,0x4f254143,0x049462d2,0x366c7e76,0xabd6b522 },
  89267. { 0xd5338f55,0x119b392b,0x01495a0c,0x1a80a9ce,0xf8d7537e,0xf3118ca7,
  89268. 0x6bf4b762,0xb715adc2,0xa8482b6c,0x24506165,0x96a7c84d,0xd958d7c6 } },
  89269. /* 99 */
  89270. { { 0xbdc21f31,0x9ad8aa87,0x8063e58c,0xadb3cab4,0xb07dd7b8,0xefd86283,
  89271. 0x1be7c6b4,0xc7b9b762,0x015582de,0x2ef58741,0x299addf3,0xc970c52e },
  89272. { 0x22f24d66,0x78f02e2a,0x74cc100a,0xefec1d10,0x09316e1a,0xaf2a6a39,
  89273. 0x5849dd49,0xce7c2205,0x96bffc4c,0x9c1fe75c,0x7ba06ec0,0xcad98fd2 } },
  89274. /* 100 */
  89275. { { 0xb648b73e,0xed76e2d0,0x1cfd285e,0xa9f92ce5,0x2ed13de1,0xa8c86c06,
  89276. 0xa5191a93,0x1d3a574e,0x1ad1b8bf,0x385cdf8b,0x47d2cfe3,0xbbecc28a },
  89277. { 0x69cec548,0x98d326c0,0xf240a0b2,0x4f5bc1dd,0x29057236,0x241a7062,
  89278. 0xc68294a4,0x0fc6e9c5,0xa319f17a,0x4d04838b,0x9ffc1c6f,0x8b612cf1 } },
  89279. /* 101 */
  89280. { { 0x4c3830eb,0x9bb0b501,0x8ee0d0c5,0x3d08f83c,0x79ba9389,0xa4a62642,
  89281. 0x9cbc2914,0x5d5d4044,0x074c46f0,0xae9eb83e,0x74ead7d6,0x63bb758f },
  89282. { 0xc6bb29e0,0x1c40d2ea,0x4b02f41e,0x95aa2d87,0x53cb199a,0x92989175,
  89283. 0x51584f6d,0xdd91bafe,0x31a1aaec,0x3715efb9,0x46780f9e,0xc1b6ae5b } },
  89284. /* 102 */
  89285. { { 0x42772f41,0xcded3e4b,0x3bcb79d1,0x3a700d5d,0x80feee60,0x4430d50e,
  89286. 0xf5e5d4bb,0x444ef1fc,0xe6e358ff,0xc660194f,0x6a91b43c,0xe68a2f32 },
  89287. { 0x977fe4d2,0x5842775c,0x7e2a41eb,0x78fdef5c,0xff8df00e,0x5f3bec02,
  89288. 0x5852525d,0xf4b840cd,0x4e6988bd,0x0870483a,0xcc64b837,0x39499e39 } },
  89289. /* 103 */
  89290. { { 0xb08df5fe,0xfc05de80,0x63ba0362,0x0c12957c,0xd5cf1428,0xea379414,
  89291. 0x54ef6216,0xc559132a,0xb9e65cf8,0x33d5f12f,0x1695d663,0x09c60278 },
  89292. { 0x61f7a2fb,0x3ac1ced4,0xd4f5eeb8,0xdd838444,0x8318fcad,0x82a38c6c,
  89293. 0xe9f1a864,0x315be2e5,0x442daf47,0x317b5771,0x95aa5f9e,0x81b5904a } },
  89294. /* 104 */
  89295. { { 0x8b21d232,0x6b6b1c50,0x8c2cba75,0x87f3dbc0,0xae9f0faf,0xa7e74b46,
  89296. 0xbb7b8079,0x036a0985,0x8d974a25,0x4f185b90,0xd9af5ec9,0x5aa7cef0 },
  89297. { 0x57dcfffc,0xe0566a70,0xb8453225,0x6ea311da,0x23368aa9,0x72ea1a8d,
  89298. 0x48cd552d,0xed9b2083,0xc80ea435,0xb987967c,0x6c104173,0xad735c75 } },
  89299. /* 105 */
  89300. { { 0xcee76ef4,0xaea85ab3,0xaf1d2b93,0x44997444,0xeacb923f,0x0851929b,
  89301. 0x51e3bc0c,0xb080b590,0x59be68a2,0xc4ee1d86,0x64b26cda,0xf00de219 },
  89302. { 0xf2e90d4d,0x8d7fb5c0,0x77d9ec64,0x00e219a7,0x5d1c491c,0xc4e6febd,
  89303. 0x1a8f4585,0x080e3754,0x48d2af9c,0x4a9b86c8,0xb6679851,0x2ed70db6 } },
  89304. /* 106 */
  89305. { { 0x586f25cb,0xaee44116,0xa0fcf70f,0xf7b6861f,0x18a350e8,0x55d2cd20,
  89306. 0x92dc286f,0x861bf3e5,0x6226aba7,0x9ab18ffa,0xa9857b03,0xd15827be },
  89307. { 0x92e6acef,0x26c1f547,0xac1fbac3,0x422c63c8,0xfcbfd71d,0xa2d8760d,
  89308. 0xb2511224,0x35f6a539,0x048d1a21,0xbaa88fa1,0xebf999db,0x49f1abe9 } },
  89309. /* 107 */
  89310. { { 0xf7492b73,0x16f9f4f4,0xcb392b1a,0xcf28ec1e,0x69ca6ffc,0x45b130d4,
  89311. 0xb72efa58,0x28ba8d40,0x5ca066f5,0xace987c7,0x4ad022eb,0x3e399246 },
  89312. { 0x752555bb,0x63a2d84e,0x9c2ae394,0xaaa93b4a,0xc89539ca,0xcd80424e,
  89313. 0xaa119a99,0x6d6b5a6d,0x379f2629,0xbd50334c,0xef3cc7d3,0x899e925e } },
  89314. /* 108 */
  89315. { { 0xbf825dc4,0xb7ff3651,0x40b9c462,0x0f741cc4,0x5cc4fb5b,0x771ff5a9,
  89316. 0x47fd56fe,0xcb9e9c9b,0x5626c0d3,0xbdf053db,0xf7e14098,0xa97ce675 },
  89317. { 0x6c934f5e,0x68afe5a3,0xccefc46f,0x6cd5e148,0xd7a88586,0xc7758570,
  89318. 0xdd558d40,0x49978f5e,0x64ae00c1,0xa1d5088a,0xf1d65bb2,0x58f2a720 } },
  89319. /* 109 */
  89320. { { 0x3e4daedb,0x66fdda4a,0x65d1b052,0x38318c12,0x4c4bbf5c,0x28d910a2,
  89321. 0x78a9cd14,0x762fe5c4,0xd2cc0aee,0x08e5ebaa,0xca0c654c,0xd2cdf257 },
  89322. { 0x08b717d2,0x48f7c58b,0x386cd07a,0x3807184a,0xae7d0112,0x3240f626,
  89323. 0xc43917b0,0x03e9361b,0x20aea018,0xf261a876,0x7e1e6372,0x53f556a4 } },
  89324. /* 110 */
  89325. { { 0x2f512a90,0xc84cee56,0x1b0ea9f1,0x24b3c004,0xe26cc1ea,0x0ee15d2d,
  89326. 0xf0c9ef7d,0xd848762c,0xd5341435,0x1026e9c5,0xfdb16b31,0x8f5b73dc },
  89327. { 0xd2c75d95,0x1f69bef2,0xbe064dda,0x8d33d581,0x57ed35e6,0x8c024c12,
  89328. 0xc309c281,0xf8d435f9,0xd6960193,0xfd295061,0xe9e49541,0x66618d78 } },
  89329. /* 111 */
  89330. { { 0x8ce382de,0x571cfd45,0xde900dde,0x175806ee,0x34aba3b5,0x61849965,
  89331. 0xde7aec95,0xe899778a,0xff4aa97f,0xe8f00f6e,0x010b0c6d,0xae971cb5 },
  89332. { 0x3af788f1,0x1827eebc,0xe413fe2d,0xd46229ff,0x4741c9b4,0x8a15455b,
  89333. 0xf8e424eb,0x5f02e690,0xdae87712,0x40a1202e,0x64944f6d,0x49b3bda2 } },
  89334. /* 112 */
  89335. { { 0x035b2d69,0xd63c6067,0x6bed91b0,0xb507150d,0x7afb39b2,0x1f35f82f,
  89336. 0x16012b66,0xb9bd9c01,0xed0a5f50,0x00d97960,0x2716f7c9,0xed705451 },
  89337. { 0x127abdb4,0x1576eff4,0xf01e701c,0x6850d698,0x3fc87e2f,0x9fa7d749,
  89338. 0xb0ce3e48,0x0b6bcc6f,0xf7d8c1c0,0xf4fbe1f5,0x02719cc6,0xcf75230e } },
  89339. /* 113 */
  89340. { { 0x722d94ed,0x6761d6c2,0x3718820e,0xd1ec3f21,0x25d0e7c6,0x65a40b70,
  89341. 0xbaf3cf31,0xd67f830e,0xb93ea430,0x633b3807,0x0bc96c69,0x17faa0ea },
  89342. { 0xdf866b98,0xe6bf3482,0xa9db52d4,0x205c1ee9,0xff9ab869,0x51ef9bbd,
  89343. 0x75eeb985,0x3863dad1,0xd3cf442a,0xef216c3b,0xf9c8e321,0x3fb228e3 } },
  89344. /* 114 */
  89345. { { 0x0760ac07,0x94f9b70c,0x9d79bf4d,0xf3c9ccae,0xc5ffc83d,0x73cea084,
  89346. 0xdc49c38e,0xef50f943,0xbc9e7330,0xf467a2ae,0x44ea7fba,0x5ee534b6 },
  89347. { 0x03609e7f,0x20cb6272,0x62fdc9f0,0x09844355,0x0f1457f7,0xaf5c8e58,
  89348. 0xb4b25941,0xd1f50a6c,0x2ec82395,0x77cb247c,0xda3dca33,0xa5f3e1e5 } },
  89349. /* 115 */
  89350. { { 0x7d85fa94,0x023489d6,0x2db9ce47,0x0ba40537,0xaed7aad1,0x0fdf7a1f,
  89351. 0x9a4ccb40,0xa57b0d73,0x5b18967c,0x48fcec99,0xb7274d24,0xf30b5b6e },
  89352. { 0xc81c5338,0x7ccb4773,0xa3ed6bd0,0xb85639e6,0x1d56eada,0x7d9df95f,
  89353. 0x0a1607ad,0xe256d57f,0x957574d6,0x6da7ffdc,0x01c7a8c4,0x65f84046 } },
  89354. /* 116 */
  89355. { { 0xcba1e7f1,0x8d45d0cb,0x02b55f64,0xef0a08c0,0x17e19892,0x771ca31b,
  89356. 0x4885907e,0xe1843ecb,0x364ce16a,0x67797ebc,0x8df4b338,0x816d2b2d },
  89357. { 0x39aa8671,0xe870b0e5,0xc102b5f5,0x9f0db3e4,0x1720c697,0x34296659,
  89358. 0x613c0d2a,0x0ad4c89e,0x418ddd61,0x1af900b2,0xd336e20e,0xe087ca72 } },
  89359. /* 117 */
  89360. { { 0xaba10079,0x222831ff,0x6d64fff2,0x0dc5f87b,0x3e8cb330,0x44547907,
  89361. 0x702a33fb,0xe815aaa2,0x5fba3215,0x338d6b2e,0x79f549c8,0x0f7535cb },
  89362. { 0x2ee95923,0x471ecd97,0xc6d1c09f,0x1e868b37,0xc666ef4e,0x2bc7b8ec,
  89363. 0x808a4bfc,0xf5416589,0x3fbc4d2e,0xf23e9ee2,0x2d75125b,0x4357236c } },
  89364. /* 118 */
  89365. { { 0xba9cdb1b,0xfe176d95,0x2f82791e,0x45a1ca01,0x4de4cca2,0x97654af2,
  89366. 0x5cc4bcb9,0xbdbf9d0e,0xad97ac0a,0xf6a7df50,0x61359fd6,0xc52112b0 },
  89367. { 0x4f05eae3,0x696d9ce3,0xe943ac2b,0x903adc02,0x0848be17,0xa9075347,
  89368. 0x2a3973e5,0x1e20f170,0x6feb67e9,0xe1aacc1c,0xe16bc6b9,0x2ca0ac32 } },
  89369. /* 119 */
  89370. { { 0xef871eb5,0xffea12e4,0xa8bf0a7a,0x94c2f25d,0x78134eaa,0x4d1e4c2a,
  89371. 0x0360fb10,0x11ed16fb,0x85fc11be,0x4029b6db,0xf4d390fa,0x5e9f7ab7 },
  89372. { 0x30646612,0x5076d72f,0xdda1d0d8,0xa0afed1d,0x85a1d103,0x29022257,
  89373. 0x4e276bcd,0xcb499e17,0x51246c3d,0x16d1da71,0x589a0443,0xc72d56d3 } },
  89374. /* 120 */
  89375. { { 0xdae5bb45,0xdf5ffc74,0x261bd6dc,0x99068c4a,0xaa98ec7b,0xdc0afa7a,
  89376. 0xf121e96d,0xedd2ee00,0x1414045c,0x163cc7be,0x335af50e,0xb0b1bbce },
  89377. { 0x01a06293,0xd440d785,0x6552e644,0xcdebab7c,0x8c757e46,0x48cb8dbc,
  89378. 0x3cabe3cb,0x81f9cf78,0xb123f59a,0xddd02611,0xeeb3784d,0x3dc7b88e } },
  89379. /* 121 */
  89380. { { 0xc4741456,0xe1b8d398,0x6032a121,0xa9dfa902,0x1263245b,0x1cbfc86d,
  89381. 0x5244718c,0xf411c762,0x05b0fc54,0x96521d54,0xdbaa4985,0x1afab46e },
  89382. { 0x8674b4ad,0xa75902ba,0x5ad87d12,0x486b43ad,0x36e0d099,0x72b1c736,
  89383. 0xbb6cd6d6,0x39890e07,0x59bace4e,0x8128999c,0x7b535e33,0xd8da430b } },
  89384. /* 122 */
  89385. { { 0xc6b75791,0x39f65642,0x21806bfb,0x050947a6,0x1362ef84,0x0ca3e370,
  89386. 0x8c3d2391,0x9bc60aed,0x732e1ddc,0x9b488671,0xa98ee077,0x12d10d9e },
  89387. { 0x3651b7dc,0xb6f2822d,0x80abd138,0x6345a5ba,0x472d3c84,0x62033262,
  89388. 0xacc57527,0xd54a1d40,0x424447cb,0x6ea46b3a,0x2fb1a496,0x5bc41057 } },
  89389. /* 123 */
  89390. { { 0xa751cd0e,0xe70c57a3,0xeba3c7d6,0x190d8419,0x9d47d55a,0xb1c3bee7,
  89391. 0xf912c6d8,0xda941266,0x407a6ad6,0x12e9aacc,0x6e838911,0xd6ce5f11 },
  89392. { 0x70e1f2ce,0x063ca97b,0x8213d434,0xa3e47c72,0x84df810a,0xa016e241,
  89393. 0xdfd881a4,0x688ad7b0,0xa89bf0ad,0xa37d99fc,0xa23c2d23,0xd8e3f339 } },
  89394. /* 124 */
  89395. { { 0x750bed6f,0xbdf53163,0x83e68b0a,0x808abc32,0x5bb08a33,0x85a36627,
  89396. 0x6b0e4abe,0xf72a3a0f,0xfaf0c6ad,0xf7716d19,0x5379b25f,0x22dcc020 },
  89397. { 0xf9a56e11,0x7400bf8d,0x56a47f21,0x6cb8bad7,0x7a6eb644,0x7c97176f,
  89398. 0xd1f5b646,0xe8fd84f7,0x44ddb054,0x98320a94,0x1dde86f5,0x07071ba3 } },
  89399. /* 125 */
  89400. { { 0x98f8fcb9,0x6fdfa0e5,0x94d0d70c,0x89cec8e0,0x106d20a8,0xa0899397,
  89401. 0xba8acc9c,0x915bfb9a,0x5507e01c,0x1370c94b,0x8a821ffb,0x83246a60 },
  89402. { 0xbe3c378f,0xa8273a9f,0x35a25be9,0x7e544789,0x4dd929d7,0x6cfa4972,
  89403. 0x365bd878,0x987fed9d,0x5c29a7ae,0x4982ac94,0x5ddd7ec5,0x4589a5d7 } },
  89404. /* 126 */
  89405. { { 0xa95540a9,0x9fabb174,0x0162c5b0,0x7cfb886f,0xea3dee18,0x17be766b,
  89406. 0xe88e624c,0xff7da41f,0x8b919c38,0xad0b71eb,0xf31ff9a9,0x86a522e0 },
  89407. { 0x868bc259,0xbc8e6f72,0x3ccef9e4,0x6130c638,0x9a466555,0x09f1f454,
  89408. 0x19b2bfb4,0x8e6c0f09,0x0ca7bb22,0x945c46c9,0x4dafb67b,0xacd87168 } },
  89409. /* 127 */
  89410. { { 0x10c53841,0x090c72ca,0x55a4fced,0xc20ae01b,0xe10234ad,0x03f7ebd5,
  89411. 0x85892064,0xb3f42a6a,0xb4a14722,0xbdbc30c0,0x8ca124cc,0x971bc437 },
  89412. { 0x517ff2ff,0x6f79f46d,0xecba947b,0x6a9c96e2,0x62925122,0x5e79f2f4,
  89413. 0x6a4e91f1,0x30a96bb1,0x2d4c72da,0x1147c923,0x5811e4df,0x65bc311f } },
  89414. /* 128 */
  89415. { { 0x139b3239,0x87c7dd7d,0x4d833bae,0x8b57824e,0x9fff0015,0xbcbc4878,
  89416. 0x909eaf1a,0x8ffcef8b,0xf1443a78,0x9905f4ee,0xe15cbfed,0x020dd4a2 },
  89417. { 0xa306d695,0xca2969ec,0xb93caf60,0xdf940cad,0x87ea6e39,0x67f7fab7,
  89418. 0xf98c4fe5,0x0d0ee10f,0xc19cb91e,0xc646879a,0x7d1d7ab4,0x4b4ea50c } },
  89419. /* 129 */
  89420. { { 0x7a0db57e,0x19e40945,0x9a8c9702,0xe6017cad,0x1be5cff9,0xdbf739e5,
  89421. 0xa7a938a2,0x3646b3cd,0x68350dfc,0x04511085,0x56e098b5,0xad3bd6f3 },
  89422. { 0xee2e3e3e,0x935ebabf,0x473926cb,0xfbd01702,0x9e9fb5aa,0x7c735b02,
  89423. 0x2e3feff0,0xc52a1b85,0x046b405a,0x9199abd3,0x39039971,0xe306fcec } },
  89424. /* 130 */
  89425. { { 0x23e4712c,0xd6d9aec8,0xc3c198ee,0x7ca8376c,0x31bebd8a,0xe6d83187,
  89426. 0xd88bfef3,0xed57aff3,0xcf44edc7,0x72a645ee,0x5cbb1517,0xd4e63d0b },
  89427. { 0xceee0ecf,0x98ce7a1c,0x5383ee8e,0x8f012633,0xa6b455e8,0x3b879078,
  89428. 0xc7658c06,0xcbcd3d96,0x0783336a,0x721d6fe7,0x5a677136,0xf21a7263 } },
  89429. /* 131 */
  89430. { { 0x9586ba11,0x19d8b3cd,0x8a5c0480,0xd9e0aeb2,0x2230ef5c,0xe4261dbf,
  89431. 0x02e6bf09,0x095a9dee,0x80dc7784,0x8963723c,0x145157b1,0x5c97dbaf },
  89432. { 0x4bc4503e,0x97e74434,0x85a6b370,0x0fb1cb31,0xcd205d4b,0x3e8df2be,
  89433. 0xf8f765da,0x497dd1bc,0x6c988a1a,0x92ef95c7,0x64dc4cfa,0x3f924baa } },
  89434. /* 132 */
  89435. { { 0x7268b448,0x6bf1b8dd,0xefd79b94,0xd4c28ba1,0xe4e3551f,0x2fa1f8c8,
  89436. 0x5c9187a9,0x769e3ad4,0x40326c0d,0x28843b4d,0x50d5d669,0xfefc8094 },
  89437. { 0x90339366,0x30c85bfd,0x5ccf6c3a,0x4eeb56f1,0x28ccd1dc,0x0e72b149,
  89438. 0xf2ce978e,0x73ee85b5,0x3165bb23,0xcdeb2bf3,0x4e410abf,0x8106c923 } },
  89439. /* 133 */
  89440. { { 0x7d02f4ee,0xc8df0161,0x18e21225,0x8a781547,0x6acf9e40,0x4ea895eb,
  89441. 0x6e5a633d,0x8b000cb5,0x7e981ffb,0xf31d86d5,0x4475bc32,0xf5c8029c },
  89442. { 0x1b568973,0x764561ce,0xa62996ec,0x2f809b81,0xda085408,0x9e513d64,
  89443. 0xe61ce309,0xc27d815d,0x272999e0,0x0da6ff99,0xfead73f7,0xbd284779 } },
  89444. /* 134 */
  89445. { { 0x9b1cdf2b,0x6033c2f9,0xbc5fa151,0x2a99cf06,0x12177b3b,0x7d27d259,
  89446. 0xc4485483,0xb1f15273,0x102e2297,0x5fd57d81,0xc7f6acb7,0x3d43e017 },
  89447. { 0x3a70eb28,0x41a8bb0b,0x3e80b06b,0x67de2d8e,0x70c28de5,0x09245a41,
  89448. 0xa7b26023,0xad7dbcb1,0x2cbc6c1e,0x70b08a35,0x9b33041f,0xb504fb66 } },
  89449. /* 135 */
  89450. { { 0xf97a27c2,0xa8e85ab5,0xc10a011b,0x6ac5ec8b,0xffbcf161,0x55745533,
  89451. 0x65790a60,0x01780e85,0x99ee75b0,0xe451bf85,0x39c29881,0x8907a63b },
  89452. { 0x260189ed,0x76d46738,0x47bd35cb,0x284a4436,0x20cab61e,0xd74e8c40,
  89453. 0x416cf20a,0x6264bf8c,0x5fd820ce,0xfa5a6c95,0xf24bb5fc,0xfa7154d0 } },
  89454. /* 136 */
  89455. { { 0x9b3f5034,0x18482cec,0xcd9e68fd,0x962d445a,0x95746f23,0x266fb1d6,
  89456. 0x58c94a4b,0xc66ade5a,0xed68a5b6,0xdbbda826,0x7ab0d6ae,0x05664a4d },
  89457. { 0x025e32fc,0xbcd4fe51,0xa96df252,0x61a5aebf,0x31592a31,0xd88a07e2,
  89458. 0x98905517,0x5d9d94de,0x5fd440e7,0x96bb4010,0xe807db4c,0x1b0c47a2 } },
  89459. /* 137 */
  89460. { { 0x08223878,0x5c2a6ac8,0xe65a5558,0xba08c269,0x9bbc27fd,0xd22b1b9b,
  89461. 0x72b9607d,0x919171bf,0xe588dc58,0x9ab455f9,0x23662d93,0x6d54916e },
  89462. { 0x3b1de0c1,0x8da8e938,0x804f278f,0xa84d186a,0xd3461695,0xbf4988cc,
  89463. 0xe10eb0cb,0xf5eae3be,0xbf2a66ed,0x1ff8b68f,0xc305b570,0xa68daf67 } },
  89464. /* 138 */
  89465. { { 0x44b2e045,0xc1004cff,0x4b1c05d4,0x91b5e136,0x88a48a07,0x53ae4090,
  89466. 0xea11bb1a,0x73fb2995,0x3d93a4ea,0x32048570,0x3bfc8a5f,0xcce45de8 },
  89467. { 0xc2b3106e,0xaff4a97e,0xb6848b4f,0x9069c630,0xed76241c,0xeda837a6,
  89468. 0x6cc3f6cf,0x8a0daf13,0x3da018a8,0x199d049d,0xd9093ba3,0xf867c6b1 } },
  89469. /* 139 */
  89470. { { 0x56527296,0xe4d42a56,0xce71178d,0xae26c73d,0x6c251664,0x70a0adac,
  89471. 0x5dc0ae1d,0x813483ae,0xdaab2daf,0x7574eacd,0xc2d55f4f,0xc56b52dc },
  89472. { 0x95f32923,0x872bc167,0x5bdd2a89,0x4be17581,0xa7699f00,0x9b57f1e7,
  89473. 0x3ac2de02,0x5fcd9c72,0x92377739,0x83af3ba1,0xfc50b97f,0xa64d4e2b } },
  89474. /* 140 */
  89475. { { 0x0e552b40,0x2172dae2,0xd34d52e8,0x62f49725,0x07958f98,0x7930ee40,
  89476. 0x751fdd74,0x56da2a90,0xf53e48c3,0xf1192834,0x8e53c343,0x34d2ac26 },
  89477. { 0x13111286,0x1073c218,0xda9d9827,0x201dac14,0xee95d378,0xec2c29db,
  89478. 0x1f3ee0b1,0x9316f119,0x544ce71c,0x7890c9f0,0x27612127,0xd77138af } },
  89479. /* 141 */
  89480. { { 0x3b4ad1cd,0x78045e6d,0x4aa49bc1,0xcd86b94e,0xfd677a16,0x57e51f1d,
  89481. 0xfa613697,0xd9290935,0x34f4d893,0x7a3f9593,0x5d5fcf9b,0x8c9c248b },
  89482. { 0x6f70d4e9,0x9f23a482,0x63190ae9,0x17273454,0x5b081a48,0x4bdd7c13,
  89483. 0x28d65271,0x1e2de389,0xe5841d1f,0x0bbaaa25,0x746772e5,0xc4c18a79 } },
  89484. /* 142 */
  89485. { { 0x593375ac,0x10ee2681,0x7dd5e113,0x4f3288be,0x240f3538,0x9a97b2fb,
  89486. 0x1de6b1e2,0xfa11089f,0x1351bc58,0x516da562,0x2dfa85b5,0x573b6119 },
  89487. { 0x6cba7df5,0x89e96683,0x8c28ab40,0xf299be15,0xad43fcbf,0xe91c9348,
  89488. 0x9a1cefb3,0xe9bbc7cc,0x738b2775,0xc8add876,0x775eaa01,0x6e3b1f2e } },
  89489. /* 143 */
  89490. { { 0xb677788b,0x0365a888,0x3fd6173c,0x634ae8c4,0x9e498dbe,0x30498761,
  89491. 0xc8f779ab,0x08c43e6d,0x4c09aca9,0x068ae384,0x2018d170,0x2380c70b },
  89492. { 0xa297c5ec,0xcf77fbc3,0xca457948,0xdacbc853,0x336bec7e,0x3690de04,
  89493. 0x14eec461,0x26bbac64,0x1f713abf,0xd1c23c7e,0xe6fd569e,0xf08bbfcd } },
  89494. /* 144 */
  89495. { { 0x84770ee3,0x5f8163f4,0x744a1706,0x0e0c7f94,0xe1b2d46d,0x9c8f05f7,
  89496. 0xd01fd99a,0x417eafe7,0x11440e5b,0x2ba15df5,0x91a6fbcf,0xdc5c552a },
  89497. { 0xa270f721,0x86271d74,0xa004485b,0x32c0a075,0x8defa075,0x9d1a87e3,
  89498. 0xbf0d20fe,0xb590a7ac,0x8feda1f5,0x430c41c2,0x58f6ec24,0x454d2879 } },
  89499. /* 145 */
  89500. { { 0x7c525435,0x52b7a635,0x37c4bdbc,0x3d9ef57f,0xdffcc475,0x2bb93e9e,
  89501. 0x7710f3be,0xf7b8ba98,0x21b727de,0x42ee86da,0x2e490d01,0x55ac3f19 },
  89502. { 0xc0c1c390,0x487e3a6e,0x446cde7b,0x036fb345,0x496ae951,0x089eb276,
  89503. 0x71ed1234,0xedfed4d9,0x900f0b46,0x661b0dd5,0x8582f0d3,0x11bd6f1b } },
  89504. /* 146 */
  89505. { { 0x076bc9d1,0x5cf9350f,0xcf3cd2c3,0x15d903be,0x25af031c,0x21cfc8c2,
  89506. 0x8b1cc657,0xe0ad3248,0x70014e87,0xdd9fb963,0x297f1658,0xf0f3a5a1 },
  89507. { 0xf1f703aa,0xbb908fba,0x2f6760ba,0x2f9cc420,0x66a38b51,0x00ceec66,
  89508. 0x05d645da,0x4deda330,0xf7de3394,0xb9cf5c72,0x1ad4c906,0xaeef6502 } },
  89509. /* 147 */
  89510. { { 0x7a19045d,0x0583c8b1,0xd052824c,0xae7c3102,0xff6cfa58,0x2a234979,
  89511. 0x62c733c0,0xfe9dffc9,0x9c0c4b09,0x3a7fa250,0x4fe21805,0x516437bb },
  89512. { 0xc2a23ddb,0x9454e3d5,0x289c104e,0x0726d887,0x4fd15243,0x8977d918,
  89513. 0x6d7790ba,0xc559e73f,0x465af85f,0x8fd3e87d,0x5feee46b,0xa2615c74 } },
  89514. /* 148 */
  89515. { { 0x4335167d,0xc8d607a8,0xe0f5c887,0x8b42d804,0x398d11f9,0x5f9f13df,
  89516. 0x20740c67,0x5aaa5087,0xa3d9234b,0x83da9a6a,0x2a54bad1,0xbd3a5c4e },
  89517. { 0x2db0f658,0xdd13914c,0x5a3f373a,0x29dcb66e,0x5245a72b,0xbfd62df5,
  89518. 0x91e40847,0x19d18023,0xb136b1ae,0xd9df74db,0x3f93bc5b,0x72a06b6b } },
  89519. /* 149 */
  89520. { { 0xad19d96f,0x6da19ec3,0xfb2a4099,0xb342daa4,0x662271ea,0x0e61633a,
  89521. 0xce8c054b,0x3bcece81,0x8bd62dc6,0x7cc8e061,0xee578d8b,0xae189e19 },
  89522. { 0xdced1eed,0x73e7a25d,0x7875d3ab,0xc1257f0a,0x1cfef026,0x2cb2d5a2,
  89523. 0xb1fdf61c,0xd98ef39b,0x24e83e6c,0xcd8e6f69,0xc7b7088b,0xd71e7076 } },
  89524. /* 150 */
  89525. { { 0x9d4245bf,0x33936830,0x2ac2953b,0x22d96217,0x56c3c3cd,0xb3bf5a82,
  89526. 0x0d0699e8,0x50c9be91,0x8f366459,0xec094463,0x513b7c35,0x6c056dba },
  89527. { 0x045ab0e3,0x687a6a83,0x445c9295,0x8d40b57f,0xa16f5954,0x0f345048,
  89528. 0x3d8f0a87,0x64b5c639,0x9f71c5e2,0x106353a2,0x874f0dd4,0xdd58b475 } },
  89529. /* 151 */
  89530. { { 0x62230c72,0x67ec084f,0x481385e3,0xf14f6cca,0x4cda7774,0xf58bb407,
  89531. 0xaa2dbb6b,0xe15011b1,0x0c035ab1,0xd488369d,0x8245f2fd,0xef83c24a },
  89532. { 0x9fdc2538,0xfb57328f,0x191fe46a,0x79808293,0x32ede548,0xe28f5c44,
  89533. 0xea1a022c,0x1b3cda99,0x3df2ec7f,0x39e639b7,0x760e9a18,0x77b6272b } },
  89534. /* 152 */
  89535. { { 0xa65d56d5,0x2b1d51bd,0x7ea696e0,0x3a9b71f9,0x9904f4c4,0x95250ecc,
  89536. 0xe75774b7,0x8bc4d6eb,0xeaeeb9aa,0x0e343f8a,0x930e04cb,0xc473c1d1 },
  89537. { 0x064cd8ae,0x282321b1,0x5562221c,0xf4b4371e,0xd1bf1221,0xc1cc81ec,
  89538. 0xe2c8082f,0xa52a07a9,0xba64a958,0x350d8e59,0x6fb32c9a,0x29e4f3de } },
  89539. /* 153 */
  89540. { { 0xba89aaa5,0x0aa9d56c,0xc4c6059e,0xf0208ac0,0xbd6ddca4,0x7400d9c6,
  89541. 0xf2c2f74a,0xb384e475,0xb1562dd3,0x4c1061fc,0x2e153b8d,0x3924e248 },
  89542. { 0x849808ab,0xf38b8d98,0xa491aa36,0x29bf3260,0x88220ede,0x85159ada,
  89543. 0xbe5bc422,0x8b47915b,0xd7300967,0xa934d72e,0x2e515d0d,0xc4f30398 } },
  89544. /* 154 */
  89545. { { 0x1b1de38b,0xe3e9ee42,0x42636760,0xa124e25a,0x90165b1a,0x90bf73c0,
  89546. 0x146434c5,0x21802a34,0x2e1fa109,0x54aa83f2,0xed9c51e9,0x1d4bd03c },
  89547. { 0x798751e6,0xc2d96a38,0x8c3507f5,0xed27235f,0xc8c24f88,0xb5fb80e2,
  89548. 0xd37f4f78,0xf873eefa,0xf224ba96,0x7229fd74,0x9edd7149,0x9dcd9199 } },
  89549. /* 155 */
  89550. { { 0x4e94f22a,0xee9f81a6,0xf71ec341,0xe5609892,0xa998284e,0x6c818ddd,
  89551. 0x3b54b098,0x9fd47295,0x0e8a7cc9,0x47a6ac03,0xb207a382,0xde684e5e },
  89552. { 0x2b6b956b,0x4bdd1ecd,0xf01b3583,0x09084414,0x55233b14,0xe2f80b32,
  89553. 0xef5ebc5e,0x5a0fec54,0xbf8b29a2,0x74cf25e6,0x7f29e014,0x1c757fa0 } },
  89554. /* 156 */
  89555. { { 0xeb0fdfe4,0x1bcb5c4a,0xf0899367,0xd7c649b3,0x05bc083b,0xaef68e3f,
  89556. 0xa78aa607,0x57a06e46,0x21223a44,0xa2136ecc,0x52f5a50b,0x89bd6484 },
  89557. { 0x4455f15a,0x724411b9,0x08a9c0fd,0x23dfa970,0x6db63bef,0x7b0da4d1,
  89558. 0xfb162443,0x6f8a7ec1,0xe98284fb,0xc1ac9cee,0x33566022,0x085a582b } },
  89559. /* 157 */
  89560. { { 0xec1f138a,0x15cb61f9,0x668f0c28,0x11c9a230,0xdf93f38f,0xac829729,
  89561. 0x4048848d,0xcef25698,0x2bba8fbf,0x3f686da0,0x111c619a,0xed5fea78 },
  89562. { 0xd6d1c833,0x9b4f73bc,0x86e7bf80,0x50951606,0x042b1d51,0xa2a73508,
  89563. 0x5fb89ec2,0x9ef6ea49,0x5ef8b892,0xf1008ce9,0x9ae8568b,0x78a7e684 } },
  89564. /* 158 */
  89565. { { 0x10470cd8,0x3fe83a7c,0xf86df000,0x92734682,0xda9409b5,0xb5dac06b,
  89566. 0x94939c5f,0x1e7a9660,0x5cc116dc,0xdec6c150,0x66bac8cc,0x1a52b408 },
  89567. { 0x6e864045,0x5303a365,0x9139efc1,0x45eae72a,0x6f31d54f,0x83bec646,
  89568. 0x6e958a6d,0x2fb4a86f,0x4ff44030,0x6760718e,0xe91ae0df,0x008117e3 } },
  89569. /* 159 */
  89570. { { 0x384310a2,0x5d5833ba,0x1fd6c9fc,0xbdfb4edc,0x849c4fb8,0xb9a4f102,
  89571. 0x581c1e1f,0xe5fb239a,0xd0a9746d,0xba44b2e7,0x3bd942b9,0x78f7b768 },
  89572. { 0xc87607ae,0x076c8ca1,0xd5caaa7e,0x82b23c2e,0x2763e461,0x6a581f39,
  89573. 0x3886df11,0xca8a5e4a,0x264e7f22,0xc87e90cf,0x215cfcfc,0x04f74870 } },
  89574. /* 160 */
  89575. { { 0x141d161c,0x5285d116,0x93c4ed17,0x67cd2e0e,0x7c36187e,0x12c62a64,
  89576. 0xed2584ca,0xf5329539,0x42fbbd69,0xc4c777c4,0x1bdfc50a,0x107de776 },
  89577. { 0xe96beebd,0x9976dcc5,0xa865a151,0xbe2aff95,0x9d8872af,0x0e0a9da1,
  89578. 0xa63c17cc,0x5e357a3d,0xe15cc67c,0xd31fdfd8,0x7970c6d8,0xc44bbefd } },
  89579. /* 161 */
  89580. { { 0x4c0c62f1,0x703f83e2,0x4e195572,0x9b1e28ee,0xfe26cced,0x6a82858b,
  89581. 0xc43638fa,0xd381c84b,0xa5ba43d8,0x94f72867,0x10b82743,0x3b4a783d },
  89582. { 0x7576451e,0xee1ad7b5,0x14b6b5c8,0xc3d0b597,0xfcacc1b8,0x3dc30954,
  89583. 0x472c9d7b,0x55df110e,0x02f8a328,0x97c86ed7,0x88dc098f,0xd0433413 } },
  89584. /* 162 */
  89585. { { 0x2ca8f2fe,0x1a60d152,0x491bd41f,0x61640948,0x58dfe035,0x6dae29a5,
  89586. 0x278e4863,0x9a615bea,0x9ad7c8e5,0xbbdb4477,0x2ceac2fc,0x1c706630 },
  89587. { 0x99699b4b,0x5e2b54c6,0x239e17e8,0xb509ca6d,0xea063a82,0x728165fe,
  89588. 0xb6a22e02,0x6b5e609d,0xb26ee1df,0x12813905,0x439491fa,0x07b9f722 } },
  89589. /* 163 */
  89590. { { 0x48ff4e49,0x1592ec14,0x6d644129,0x3e4e9f17,0x1156acc0,0x7acf8288,
  89591. 0xbb092b0b,0x5aa34ba8,0x7d38393d,0xcd0f9022,0xea4f8187,0x416724dd },
  89592. { 0xc0139e73,0x3c4e641c,0x91e4d87d,0xe0fe46cf,0xcab61f8a,0xedb3c792,
  89593. 0xd3868753,0x4cb46de4,0x20f1098a,0xe449c21d,0xf5b8ea6e,0x5e5fd059 } },
  89594. /* 164 */
  89595. { { 0x75856031,0x7fcadd46,0xeaf2fbd0,0x89c7a4cd,0x7a87c480,0x1af523ce,
  89596. 0x61d9ae90,0xe5fc1095,0xbcdb95f5,0x3fb5864f,0xbb5b2c7d,0xbeb5188e },
  89597. { 0x3ae65825,0x3d1563c3,0x0e57d641,0x116854c4,0x1942ebd3,0x11f73d34,
  89598. 0xc06955b3,0x24dc5904,0x995a0a62,0x8a0d4c83,0x5d577b7d,0xfb26b86d } },
  89599. /* 165 */
  89600. { { 0xc686ae17,0xc53108e7,0xd1c1da56,0x9090d739,0x9aec50ae,0x4583b013,
  89601. 0xa49a6ab2,0xdd9a088b,0xf382f850,0x28192eea,0xf5fe910e,0xcc8df756 },
  89602. { 0x9cab7630,0x877823a3,0xfb8e7fc1,0x64984a9a,0x364bfc16,0x5448ef9c,
  89603. 0xc44e2a9a,0xbbb4f871,0x435c95e9,0x901a41ab,0xaaa50a06,0xc6c23e5f } },
  89604. /* 166 */
  89605. { { 0x9034d8dd,0xb78016c1,0x0b13e79b,0x856bb44b,0xb3241a05,0x85c6409a,
  89606. 0x2d78ed21,0x8d2fe19a,0x726eddf2,0xdcc7c26d,0x25104f04,0x3ccaff5f },
  89607. { 0x6b21f843,0x397d7edc,0xe975de4c,0xda88e4dd,0x4f5ab69e,0x5273d396,
  89608. 0x9aae6cc0,0x537680e3,0x3e6f9461,0xf749cce5,0x957bffd3,0x021ddbd9 } },
  89609. /* 167 */
  89610. { { 0x777233cf,0x7b64585f,0x0942a6f0,0xfe6771f6,0xdfe6eef0,0x636aba7a,
  89611. 0x86038029,0x63bbeb56,0xde8fcf36,0xacee5842,0xd4a20524,0x48d9aa99 },
  89612. { 0x0da5e57a,0xcff7a74c,0xe549d6c9,0xc232593c,0xf0f2287b,0x68504bcc,
  89613. 0xbc8360b5,0x6d7d098d,0x5b402f41,0xeac5f149,0xb87d1bf1,0x61936f11 } },
  89614. /* 168 */
  89615. { { 0xb8153a9d,0xaa9da167,0x9e83ecf0,0xa49fe3ac,0x1b661384,0x14c18f8e,
  89616. 0x38434de1,0x61c24dab,0x283dae96,0x3d973c3a,0x82754fc9,0xc99baa01 },
  89617. { 0x4c26b1e3,0x477d198f,0xa7516202,0x12e8e186,0x362addfa,0x386e52f6,
  89618. 0xc3962853,0x31e8f695,0x6aaedb60,0xdec2af13,0x29cf74ac,0xfcfdb4c6 } },
  89619. /* 169 */
  89620. { { 0xcca40298,0x6b3ee958,0xf2f5d195,0xc3878153,0xed2eae5b,0x0c565630,
  89621. 0x3a697cf2,0xd089b37e,0xad5029ea,0xc2ed2ac7,0x0f0dda6a,0x7e5cdfad },
  89622. { 0xd9b86202,0xf98426df,0x4335e054,0xed1960b1,0x3f14639e,0x1fdb0246,
  89623. 0x0db6c670,0x17f709c3,0x773421e1,0xbfc687ae,0x26c1a8ac,0x13fefc4a } },
  89624. /* 170 */
  89625. { { 0x7ffa0a5f,0xe361a198,0xc63fe109,0xf4b26102,0x6c74e111,0x264acbc5,
  89626. 0x77abebaf,0x4af445fa,0x24cddb75,0x448c4fdd,0x44506eea,0x0b13157d },
  89627. { 0x72e9993d,0x22a6b159,0x85e5ecbe,0x2c3c57e4,0xfd83e1a1,0xa673560b,
  89628. 0xc3b8c83b,0x6be23f82,0x40bbe38e,0x40b13a96,0xad17399b,0x66eea033 } },
  89629. /* 171 */
  89630. { { 0xb4c6c693,0x49fc6e95,0x36af7d38,0xefc735de,0x35fe42fc,0xe053343d,
  89631. 0x6a9ab7c3,0xf0aa427c,0x4a0fcb24,0xc79f0436,0x93ebbc50,0x16287243 },
  89632. { 0x16927e1e,0x5c3d6bd0,0x673b984c,0x40158ed2,0x4cd48b9a,0xa7f86fc8,
  89633. 0x60ea282d,0x1643eda6,0xe2a1beed,0x45b393ea,0x19571a94,0x664c839e } },
  89634. /* 172 */
  89635. { { 0x27eeaf94,0x57745750,0xea99e1e7,0x2875c925,0x5086adea,0xc127e7ba,
  89636. 0x86fe424f,0x765252a0,0x2b6c0281,0x1143cc6c,0xd671312d,0xc9bb2989 },
  89637. { 0x51acb0a5,0x880c337c,0xd3c60f78,0xa3710915,0x9262b6ed,0x496113c0,
  89638. 0x9ce48182,0x5d25d9f8,0xb3813586,0x53b6ad72,0x4c0e159c,0x0ea3bebc } },
  89639. /* 173 */
  89640. { { 0xc5e49bea,0xcaba450a,0x7c05da59,0x684e5415,0xde7ac36c,0xa2e9cab9,
  89641. 0x2e6f957b,0x4ca79b5f,0x09b817b1,0xef7b0247,0x7d89df0f,0xeb304990 },
  89642. { 0x46fe5096,0x508f7307,0x2e04eaaf,0x695810e8,0x3512f76c,0x88ef1bd9,
  89643. 0x3ebca06b,0x77661351,0xccf158b7,0xf7d4863a,0x94ee57da,0xb2a81e44 } },
  89644. /* 174 */
  89645. { { 0x6d53e6ba,0xff288e5b,0x14484ea2,0xa90de1a9,0xed33c8ec,0x2fadb60c,
  89646. 0x28b66a40,0x579d6ef3,0xec24372d,0x4f2dd6dd,0x1d66ec7d,0xe9e33fc9 },
  89647. { 0x039eab6e,0x110899d2,0x3e97bb5e,0xa31a667a,0xcfdce68e,0x6200166d,
  89648. 0x5137d54b,0xbe83ebae,0x4800acdf,0x085f7d87,0x0c6f8c86,0xcf4ab133 } },
  89649. /* 175 */
  89650. { { 0x931e08fb,0x03f65845,0x1506e2c0,0x6438551e,0x9c36961f,0x5791f0dc,
  89651. 0xe3dcc916,0x68107b29,0xf495d2ca,0x83242374,0x6ee5895b,0xd8cfb663 },
  89652. { 0xa0349b1b,0x525e0f16,0x4a0fab86,0x33cd2c6c,0x2af8dda9,0x46c12ee8,
  89653. 0x71e97ad3,0x7cc424ba,0x37621eb0,0x69766ddf,0xa5f0d390,0x95565f56 } },
  89654. /* 176 */
  89655. { { 0x1a0f5e94,0xe0e7bbf2,0x1d82d327,0xf771e115,0xceb111fa,0x10033e3d,
  89656. 0xd3426638,0xd269744d,0x00d01ef6,0xbdf2d9da,0xa049ceaf,0x1cb80c71 },
  89657. { 0x9e21c677,0x17f18328,0x19c8f98b,0x6452af05,0x80b67997,0x35b9c5f7,
  89658. 0x40f8f3d4,0x5c2e1cbe,0x66d667ca,0x43f91656,0xcf9d6e79,0x9faaa059 } },
  89659. /* 177 */
  89660. { { 0x0a078fe6,0x8ad24618,0x464fd1dd,0xf6cc73e6,0xc3e37448,0x4d2ce34d,
  89661. 0xe3271b5f,0x624950c5,0xefc5af72,0x62910f5e,0xaa132bc6,0x8b585bf8 },
  89662. { 0xa839327f,0x11723985,0x4aac252f,0x34e2d27d,0x6296cc4e,0x402f59ef,
  89663. 0x47053de9,0x00ae055c,0x28b4f09b,0xfc22a972,0xfa0c180e,0xa9e86264 } },
  89664. /* 178 */
  89665. { { 0xbc310ecc,0x0b7b6224,0x67fa14ed,0x8a1a74f1,0x7214395c,0x87dd0960,
  89666. 0xf5c91128,0xdf1b3d09,0x86b264a8,0x39ff23c6,0x3e58d4c5,0xdc2d49d0 },
  89667. { 0xa9d6f501,0x2152b7d3,0xc04094f7,0xf4c32e24,0xd938990f,0xc6366596,
  89668. 0x94fb207f,0x084d078f,0x328594cb,0xfd99f1d7,0xcb2d96b3,0x36defa64 } },
  89669. /* 179 */
  89670. { { 0x13ed7cbe,0x4619b781,0x9784bd0e,0x95e50015,0x2c7705fe,0x2a32251c,
  89671. 0x5f0dd083,0xa376af99,0x0361a45b,0x55425c6c,0x1f291e7b,0x812d2cef },
  89672. { 0x5fd94972,0xccf581a0,0xe56dc383,0x26e20e39,0x63dbfbf0,0x0093685d,
  89673. 0x36b8c575,0x1fc164cc,0x390ef5e7,0xb9c5ab81,0x26908c66,0x40086beb } },
  89674. /* 180 */
  89675. { { 0x37e3c115,0xe5e54f79,0xc1445a8a,0x69b8ee8c,0xb7659709,0x79aedff2,
  89676. 0x1b46fbe6,0xe288e163,0xd18d7bb7,0xdb4844f0,0x48aa6424,0xe0ea23d0 },
  89677. { 0xf3d80a73,0x714c0e4e,0x3bd64f98,0x87a0aa9e,0x2ec63080,0x8844b8a8,
  89678. 0x255d81a3,0xe0ac9c30,0x455397fc,0x86151237,0x2f820155,0x0b979464 } },
  89679. /* 181 */
  89680. { { 0x4ae03080,0x127a255a,0x580a89fb,0x232306b4,0x6416f539,0x04e8cd6a,
  89681. 0x13b02a0e,0xaeb70dee,0x4c09684a,0xa3038cf8,0x28e433ee,0xa710ec3c },
  89682. { 0x681b1f7d,0x77a72567,0x2fc28170,0x86fbce95,0xf5735ac8,0xd3408683,
  89683. 0x6bd68e93,0x3a324e2a,0xc027d155,0x7ec74353,0xd4427177,0xab60354c } },
  89684. /* 182 */
  89685. { { 0xef4c209d,0x32a5342a,0x08d62704,0x2ba75274,0xc825d5fe,0x4bb4af6f,
  89686. 0xd28e7ff1,0x1c3919ce,0xde0340f6,0x1dfc2fdc,0x29f33ba9,0xc6580baf },
  89687. { 0x41d442cb,0xae121e75,0x3a4724e4,0x4c7727fd,0x524f3474,0xe556d6a4,
  89688. 0x785642a2,0x87e13cc7,0xa17845fd,0x182efbb1,0x4e144857,0xdcec0cf1 } },
  89689. /* 183 */
  89690. { { 0xe9539819,0x1cb89541,0x9d94dbf1,0xc8cb3b4f,0x417da578,0x1d353f63,
  89691. 0x8053a09e,0xb7a697fb,0xc35d8b78,0x8d841731,0xb656a7a9,0x85748d6f },
  89692. { 0xc1859c5d,0x1fd03947,0x535d22a2,0x6ce965c1,0x0ca3aadc,0x1966a13e,
  89693. 0x4fb14eff,0x9802e41d,0x76dd3fcd,0xa9048cbb,0xe9455bba,0x89b182b5 } },
  89694. /* 184 */
  89695. { { 0x43360710,0xd777ad6a,0x55e9936b,0x841287ef,0x04a21b24,0xbaf5c670,
  89696. 0x35ad86f1,0xf2c0725f,0xc707e72e,0x338fa650,0xd8883e52,0x2bf8ed2e },
  89697. { 0xb56e0d6a,0xb0212cf4,0x6843290c,0x50537e12,0x98b3dc6f,0xd8b184a1,
  89698. 0x0210b722,0xd2be9a35,0x559781ee,0x407406db,0x0bc18534,0x5a78d591 } },
  89699. /* 185 */
  89700. { { 0xd748b02c,0x4d57aa2a,0xa12b3b95,0xbe5b3451,0x64711258,0xadca7a45,
  89701. 0x322153db,0x597e091a,0x32eb1eab,0xf3271006,0x2873f301,0xbd9adcba },
  89702. { 0x38543f7f,0xd1dc79d1,0x921b1fef,0x00022092,0x1e5df8ed,0x86db3ef5,
  89703. 0x9e6b944a,0x888cae04,0x791a32b4,0x71bd29ec,0xa6d1c13e,0xd3516206 } },
  89704. /* 186 */
  89705. { { 0x55924f43,0x2ef6b952,0x4f9de8d5,0xd2f401ae,0xadc68042,0xfc73e8d7,
  89706. 0x0d9d1bb4,0x627ea70c,0xbbf35679,0xc3bb3e3e,0xd882dee4,0x7e8a254a },
  89707. { 0xb5924407,0x08906f50,0xa1ad444a,0xf14a0e61,0x65f3738e,0xaa0efa21,
  89708. 0xae71f161,0xd60c7dd6,0xf175894d,0x9e8390fa,0x149f4c00,0xd115cd20 } },
  89709. /* 187 */
  89710. { { 0xa52abf77,0x2f2e2c1d,0x54232568,0xc2a0dca5,0x54966dcc,0xed423ea2,
  89711. 0xcd0dd039,0xe48c93c7,0x176405c7,0x1e54a225,0x70d58f2e,0x1efb5b16 },
  89712. { 0x94fb1471,0xa751f9d9,0x67d2941d,0xfdb31e1f,0x53733698,0xa6c74eb2,
  89713. 0x89a0f64a,0xd3155d11,0xa4b8d2b6,0x4414cfe4,0xf7a8e9e3,0x8d5a4be8 } },
  89714. /* 188 */
  89715. { { 0x52669e98,0x5c96b4d4,0x8fd42a03,0x4547f922,0xd285174e,0xcf5c1319,
  89716. 0x064bffa0,0x805cd1ae,0x246d27e7,0x50e8bc4f,0xd5781e11,0xf89ef98f },
  89717. { 0xdee0b63f,0xb4ff95f6,0x222663a4,0xad850047,0x4d23ce9c,0x02691860,
  89718. 0x50019f59,0x3e5309ce,0x69a508ae,0x27e6f722,0x267ba52c,0xe9376652 } },
  89719. /* 189 */
  89720. { { 0xc0368708,0xa04d289c,0x5e306e1d,0xc458872f,0x33112fea,0x76fa23de,
  89721. 0x6efde42e,0x718e3974,0x1d206091,0xf0c98cdc,0x14a71987,0x5fa3ca62 },
  89722. { 0xdcaa9f2a,0xeee8188b,0x589a860d,0x312cc732,0xc63aeb1f,0xf9808dd6,
  89723. 0x4ea62b53,0x70fd43db,0x890b6e97,0x2c2bfe34,0xfa426aa6,0x105f863c } },
  89724. /* 190 */
  89725. { { 0xb38059ad,0x0b29795d,0x90647ea0,0x5686b77e,0xdb473a3e,0xeff0470e,
  89726. 0xf9b6d1e2,0x278d2340,0xbd594ec7,0xebbff95b,0xd3a7f23d,0xf4b72334 },
  89727. { 0xa5a83f0b,0x2a285980,0x9716a8b3,0x0786c41a,0x22511812,0x138901bd,
  89728. 0xe2fede6e,0xd1b55221,0xdf4eb590,0x0806e264,0x762e462e,0x6c4c897e } },
  89729. /* 191 */
  89730. { { 0xb4b41d9d,0xd10b905f,0x4523a65b,0x826ca466,0xb699fa37,0x535bbd13,
  89731. 0x73bc8f90,0x5b9933d7,0xcd2118ad,0x9332d61f,0xd4a65fd0,0x158c693e },
  89732. { 0xe6806e63,0x4ddfb2a8,0xb5de651b,0xe31ed3ec,0x819bc69a,0xf9460e51,
  89733. 0x2c76b1f8,0x6229c0d6,0x901970a3,0xbb78f231,0x9cee72b8,0x31f3820f } },
  89734. /* 192 */
  89735. { { 0xc09e1c72,0xe931caf2,0x12990cf4,0x0715f298,0x943262d8,0x33aad81d,
  89736. 0x73048d3f,0x5d292b7a,0xdc7415f6,0xb152aaa4,0x0fd19587,0xc3d10fd9 },
  89737. { 0x75ddadd0,0xf76b35c5,0x1e7b694c,0x9f5f4a51,0xc0663025,0x2f1ab7eb,
  89738. 0x920260b0,0x01c9cc87,0x05d39da6,0xc4b1f61a,0xeb4a9c4e,0x6dcd76c4 } },
  89739. /* 193 */
  89740. { { 0xfdc83f01,0x0ba0916f,0x9553e4f9,0x354c8b44,0xffc5e622,0xa6cc511a,
  89741. 0xe95be787,0xb954726a,0x75b41a62,0xcb048115,0xebfde989,0xfa2ae6cd },
  89742. { 0x0f24659a,0x6376bbc7,0x4c289c43,0x13a999fd,0xec9abd8b,0xc7134184,
  89743. 0xa789ab04,0x28c02bf6,0xd3e526ec,0xff841ebc,0x640893a8,0x442b191e } },
  89744. /* 194 */
  89745. { { 0xfa2b6e20,0x4cac6c62,0xf6d69861,0x97f29e9b,0xbc96d12d,0x228ab1db,
  89746. 0x5e8e108d,0x6eb91327,0x40771245,0xd4b3d4d1,0xca8a803a,0x61b20623 },
  89747. { 0xa6a560b1,0x2c2f3b41,0x3859fcf4,0x879e1d40,0x024dbfc3,0x7cdb5145,
  89748. 0x3bfa5315,0x55d08f15,0xaa93823a,0x2f57d773,0xc6a2c9a2,0xa97f259c } },
  89749. /* 195 */
  89750. { { 0xe58edbbb,0xc306317b,0x79dfdf13,0x25ade51c,0x16d83dd6,0x6b5beaf1,
  89751. 0x1dd8f925,0xe8038a44,0xb2a87b6b,0x7f00143c,0xf5b438de,0xa885d00d },
  89752. { 0xcf9e48bd,0xe9f76790,0xa5162768,0xf0bdf9f0,0xad7b57cb,0x0436709f,
  89753. 0xf7c15db7,0x7e151c12,0x5d90ee3b,0x3514f022,0x2c361a8d,0x2e84e803 } },
  89754. /* 196 */
  89755. { { 0x563ec8d8,0x2277607d,0xe3934cb7,0xa661811f,0xf58fd5de,0x3ca72e7a,
  89756. 0x62294c6a,0x7989da04,0xf6bbefe9,0x88b3708b,0x53ed7c82,0x0d524cf7 },
  89757. { 0x2f30c073,0x69f699ca,0x9dc1dcf3,0xf0fa264b,0x05f0aaf6,0x44ca4568,
  89758. 0xd19b9baf,0x0f5b23c7,0xeabd1107,0x39193f41,0x2a7c9b83,0x9e3e10ad } },
  89759. /* 197 */
  89760. { { 0xd4ae972f,0xa90824f0,0xc6e846e7,0x43eef02b,0x29d2160a,0x7e460612,
  89761. 0xfe604e91,0x29a178ac,0x4eb184b2,0x23056f04,0xeb54cdf4,0x4fcad55f },
  89762. { 0xae728d15,0xa0ff96f3,0xc6a00331,0x8a2680c6,0x7ee52556,0x5f84cae0,
  89763. 0xc5a65dad,0x5e462c3a,0xe2d23f4f,0x5d2b81df,0xc5b1eb07,0x6e47301b } },
  89764. /* 198 */
  89765. { { 0xaf8219b9,0x77411d68,0x51b1907a,0xcb883ce6,0x101383b5,0x25c87e57,
  89766. 0x982f970d,0x9c7d9859,0x118305d2,0xaa6abca5,0x9013a5db,0x725fed2f },
  89767. { 0xababd109,0x487cdbaf,0x87586528,0xc0f8cf56,0x8ad58254,0xa02591e6,
  89768. 0xdebbd526,0xc071b1d1,0x961e7e31,0x927dfe8b,0x9263dfe1,0x55f895f9 } },
  89769. /* 199 */
  89770. { { 0xb175645b,0xf899b00d,0xb65b4b92,0x51f3a627,0xb67399ef,0xa2f3ac8d,
  89771. 0xe400bc20,0xe717867f,0x1967b952,0x42cc9020,0x3ecd1de1,0x3d596751 },
  89772. { 0xdb979775,0xd41ebcde,0x6a2e7e88,0x99ba61bc,0x321504f2,0x039149a5,
  89773. 0x27ba2fad,0xe7dc2314,0xb57d8368,0x9f556308,0x57da80a7,0x2b6d16c9 } },
  89774. /* 200 */
  89775. { { 0x279ad982,0x84af5e76,0x9c8b81a6,0x9bb4c92d,0x0e698e67,0xd79ad44e,
  89776. 0x265fc167,0xe8be9048,0x0c3a4ccc,0xf135f7e6,0xb8863a33,0xa0a10d38 },
  89777. { 0xd386efd9,0xe197247c,0xb52346c2,0x0eefd3f9,0x78607bc8,0xc22415f9,
  89778. 0x508674ce,0xa2a8f862,0xc8c9d607,0xa72ad09e,0x50fa764f,0xcd9f0ede } },
  89779. /* 201 */
  89780. { { 0xd1a46d4d,0x063391c7,0x9eb01693,0x2df51c11,0x849e83de,0xc5849800,
  89781. 0x8ad08382,0x48fd09aa,0xaa742736,0xa405d873,0xe1f9600c,0xee49e61e },
  89782. { 0x48c76f73,0xd76676be,0x01274b2a,0xd9c100f6,0x83f8718d,0x110bb67c,
  89783. 0x02fc0d73,0xec85a420,0x744656ad,0xc0449e1e,0x37d9939b,0x28ce7376 } },
  89784. /* 202 */
  89785. { { 0x44544ac7,0x97e9af72,0xba010426,0xf2c658d5,0xfb3adfbd,0x732dec39,
  89786. 0xa2df0b07,0xd12faf91,0x2171e208,0x8ac26725,0x5b24fa54,0xf820cdc8 },
  89787. { 0x94f4cf77,0x307a6eea,0x944a33c6,0x18c783d2,0x0b741ac5,0x4b939d4c,
  89788. 0x3ffbb6e4,0x1d7acd15,0x7a255e44,0x06a24858,0xce336d50,0x14fbc494 } },
  89789. /* 203 */
  89790. { { 0x51584e3c,0x9b920c0c,0xf7e54027,0xc7733c59,0x88422bbe,0xe24ce139,
  89791. 0x523bd6ab,0x11ada812,0xb88e6def,0xde068800,0xfe8c582d,0x7b872671 },
  89792. { 0x7de53510,0x4e746f28,0xf7971968,0x492f8b99,0x7d928ac2,0x1ec80bc7,
  89793. 0x432eb1b5,0xb3913e48,0x32028f6e,0xad084866,0x8fc2f38b,0x122bb835 } },
  89794. /* 204 */
  89795. { { 0x3b0b29c3,0x0a9f3b1e,0x4fa44151,0x837b6432,0x17b28ea7,0xb9905c92,
  89796. 0x98451750,0xf39bc937,0xce8b6da1,0xcd383c24,0x010620b2,0x299f57db },
  89797. { 0x58afdce3,0x7b6ac396,0x3d05ef47,0xa15206b3,0xb9bb02ff,0xa0ae37e2,
  89798. 0x9db3964c,0x107760ab,0x67954bea,0xe29de9a0,0x431c3f82,0x446a1ad8 } },
  89799. /* 205 */
  89800. { { 0x5c6b8195,0xc6fecea0,0xf49e71b9,0xd744a7c5,0x177a7ae7,0xa8e96acc,
  89801. 0x358773a7,0x1a05746c,0x37567369,0xa4162146,0x87d1c971,0xaa0217f7 },
  89802. { 0x77fd3226,0x61e9d158,0xe4f600be,0x0f6f2304,0x7a6dff07,0xa9c4cebc,
  89803. 0x09f12a24,0xd15afa01,0x8c863ee9,0x2bbadb22,0xe5eb8c78,0xa28290e4 } },
  89804. /* 206 */
  89805. { { 0x3e9de330,0x55b87fa0,0x195c145b,0x12b26066,0xa920bef0,0xe08536e0,
  89806. 0x4d195adc,0x7bff6f2c,0x945f4187,0x7f319e9d,0xf892ce47,0xf9848863 },
  89807. { 0x4fe37657,0xd0efc1d3,0x5cf0e45a,0x3c58de82,0x8b0ccbbe,0x626ad21a,
  89808. 0xaf952fc5,0xd2a31208,0xeb437357,0x81791995,0x98e95d4f,0x5f19d30f } },
  89809. /* 207 */
  89810. { { 0x0e6865bb,0x72e83d9a,0xf63456a6,0x22f5af3b,0x463c8d9e,0x409e9c73,
  89811. 0xdfe6970e,0x40e9e578,0x711b91ca,0x876b6efa,0x942625a3,0x895512cf },
  89812. { 0xcb4e462b,0x84c8eda8,0x4412e7c8,0x84c0154a,0xceb7b71f,0x04325db1,
  89813. 0x66f70877,0x1537dde3,0x1992b9ac,0xf3a09399,0xd498ae77,0xa7316606 } },
  89814. /* 208 */
  89815. { { 0xcad260f5,0x13990d2f,0xeec0e8c0,0x76c3be29,0x0f7bd7d5,0x7dc5bee0,
  89816. 0xefebda4b,0x9be167d2,0x9122b87e,0xcce3dde6,0x82b5415c,0x75a28b09 },
  89817. { 0xe84607a6,0xf6810bcd,0x6f4dbf0d,0xc6d58128,0x1b4dafeb,0xfead577d,
  89818. 0x066b28eb,0x9bc440b2,0x8b17e84b,0x53f1da97,0xcda9a575,0x0459504b } },
  89819. /* 209 */
  89820. { { 0x329e5836,0x13e39a02,0xf717269d,0x2c9e7d51,0xf26c963b,0xc5ac58d6,
  89821. 0x79967bf5,0x3b0c6c43,0x55908d9d,0x60bbea3f,0xf07c9ad1,0xd84811e7 },
  89822. { 0x5bd20e4a,0xfe7609a7,0x0a70baa8,0xe4325dd2,0xb3600386,0x3711f370,
  89823. 0xd0924302,0x97f9562f,0x4acc4436,0x040dc0c3,0xde79cdd4,0xfd6d725c } },
  89824. /* 210 */
  89825. { { 0xcf13eafb,0xb3efd0e3,0x5aa0ae5f,0x21009cbb,0x79022279,0xe480c553,
  89826. 0xb2fc9a6d,0x755cf334,0x07096ae7,0x8564a5bf,0xbd238139,0xddd649d0 },
  89827. { 0x8a045041,0xd0de10b1,0xc957d572,0x6e05b413,0x4e0fb25c,0x5c5ff806,
  89828. 0x641162fb,0xd933179b,0xe57439f9,0x42d48485,0x8a8d72aa,0x70c5bd0a } },
  89829. /* 211 */
  89830. { { 0x97bdf646,0xa7671738,0xab329f7c,0xaa1485b4,0xf8f25fdf,0xce3e11d6,
  89831. 0xc6221824,0x76a3fc7e,0xf3924740,0x045f281f,0x96d13a9a,0x24557d4e },
  89832. { 0xdd4c27cd,0x875c804b,0x0f5c7fea,0x11c5f0f4,0xdc55ff7e,0xac8c880b,
  89833. 0x1103f101,0x2acddec5,0xf99faa89,0x38341a21,0xce9d6b57,0xc7b67a2c } },
  89834. /* 212 */
  89835. { { 0x8e357586,0x9a0d724f,0xdf648da0,0x1d7f4ff5,0xfdee62a5,0x9c3e6c9b,
  89836. 0x0389b372,0x0499cef0,0x98eab879,0xe904050d,0x6c051617,0xe8eef1b6 },
  89837. { 0xc37e3ca9,0xebf5bfeb,0xa4e0b91d,0x7c5e946d,0x2c4bea28,0x79097314,
  89838. 0xee67b2b7,0x81f6c109,0xdafc5ede,0xaf237d9b,0x2abb04c7,0xd2e60201 } },
  89839. /* 213 */
  89840. { { 0x8a4f57bf,0x6156060c,0xff11182a,0xf9758696,0x6296ef00,0x8336773c,
  89841. 0xff666899,0x9c054bce,0x719cd11c,0xd6a11611,0xdbe1acfa,0x9824a641 },
  89842. { 0xba89fd01,0x0b7b7a5f,0x889f79d8,0xf8d3b809,0xf578285c,0xc5e1ea08,
  89843. 0xae6d8288,0x7ac74536,0x7521ef5f,0x5d37a200,0xb260a25d,0x5ecc4184 } },
  89844. /* 214 */
  89845. { { 0xa708c8d3,0xddcebb19,0xc63f81ec,0xe63ed04f,0x11873f95,0xd045f5a0,
  89846. 0x79f276d5,0x3b5ad544,0x425ae5b3,0x81272a3d,0x10ce1605,0x8bfeb501 },
  89847. { 0x888228bf,0x4233809c,0xb2aff7df,0x4bd82acf,0x0cbd4a7f,0x9c68f180,
  89848. 0x6b44323d,0xfcd77124,0x891db957,0x60c0fcf6,0x04da8f7f,0xcfbb4d89 } },
  89849. /* 215 */
  89850. { { 0x3b26139a,0x9a6a5df9,0xb2cc7eb8,0x3e076a83,0x5a964bcd,0x47a8e82d,
  89851. 0xb9278d6b,0x8a4e2a39,0xe4443549,0x93506c98,0xf1e0d566,0x06497a8f },
  89852. { 0x2b1efa05,0x3dee8d99,0x45393e33,0x2da63ca8,0xcf0579ad,0xa4af7277,
  89853. 0x3236d8ea,0xaf4b4639,0x32b617f5,0x6ccad95b,0xb88bb124,0xce76d8b8 } },
  89854. /* 216 */
  89855. { { 0x083843dc,0x63d2537a,0x1e4153b4,0x89eb3514,0xea9afc94,0x5175ebc4,
  89856. 0x8ed1aed7,0x7a652580,0xd85e8297,0x67295611,0xb584b73d,0x8dd2d68b },
  89857. { 0x0133c3a4,0x237139e6,0x4bd278ea,0x9de838ab,0xc062fcd9,0xe829b072,
  89858. 0x63ba8706,0x70730d4f,0xd3cd05ec,0x6080483f,0x0c85f84d,0x872ab5b8 } },
  89859. /* 217 */
  89860. { { 0x999d4d49,0xfc0776d3,0xec3f45e7,0xa3eb59de,0x0dae1fc1,0xbc990e44,
  89861. 0xa15371ff,0x33596b1e,0x9bc7ab25,0xd447dcb2,0x35979582,0xcd5b63e9 },
  89862. { 0x77d1ff11,0xae3366fa,0xedee6903,0x59f28f05,0xa4433bf2,0x6f43fed1,
  89863. 0xdf9ce00e,0x15409c9b,0xaca9c5dc,0x21b5cded,0x82d7bdb4,0xf9f33595 } },
  89864. /* 218 */
  89865. { { 0x9422c792,0x95944378,0xc958b8bf,0x239ea923,0xdf076541,0x4b61a247,
  89866. 0xbb9fc544,0x4d29ce85,0x0b424559,0x9a692a67,0x0e486900,0x6e0ca5a0 },
  89867. { 0x85b3bece,0x6b79a782,0xc61f9892,0x41f35e39,0xae747f82,0xff82099a,
  89868. 0xd0ca59d6,0x58c8ae3f,0x99406b5f,0x4ac930e2,0x9df24243,0x2ce04eb9 } },
  89869. /* 219 */
  89870. { { 0x1ac37b82,0x4366b994,0x25b04d83,0xff0c728d,0x19c47b7c,0x1f551361,
  89871. 0xbeff13e7,0xdbf2d5ed,0xe12a683d,0xf78efd51,0x989cf9c4,0x82cd85b9 },
  89872. { 0xe0cb5d37,0xe23c6db6,0x72ee1a15,0x818aeebd,0x28771b14,0x8212aafd,
  89873. 0x1def817d,0x7bc221d9,0x9445c51f,0xdac403a2,0x12c3746b,0x711b0517 } },
  89874. /* 220 */
  89875. { { 0x5ea99ecc,0x0ed9ed48,0xb8cab5e1,0xf799500d,0xb570cbdc,0xa8ec87dc,
  89876. 0xd35dfaec,0x52cfb2c2,0x6e4d80a4,0x8d31fae2,0xdcdeabe5,0xe6a37dc9 },
  89877. { 0x1deca452,0x5d365a34,0x0d68b44e,0x09a5f8a5,0xa60744b1,0x59238ea5,
  89878. 0xbb4249e9,0xf2fedc0d,0xa909b2e3,0xe395c74e,0x39388250,0xe156d1a5 } },
  89879. /* 221 */
  89880. { { 0x47181ae9,0xd796b3d0,0x44197808,0xbaf44ba8,0x34cf3fac,0xe6933094,
  89881. 0xc3bd5c46,0x41aa6ade,0xeed947c6,0x4fda75d8,0x9ea5a525,0xacd9d412 },
  89882. { 0xd430301b,0x65cc55a3,0x7b52ea49,0x3c9a5bcf,0x159507f0,0x22d319cf,
  89883. 0xde74a8dd,0x2ee0b9b5,0x877ac2b6,0x20c26a1e,0x92e7c314,0x387d73da } },
  89884. /* 222 */
  89885. { { 0x8cd3fdac,0x13c4833e,0x332e5b8e,0x76fcd473,0xe2fe1fd3,0xff671b4b,
  89886. 0x5d98d8ec,0x4d734e8b,0x514bbc11,0xb1ead3c6,0x7b390494,0xd14ca858 },
  89887. { 0x5d2d37e9,0x95a443af,0x00464622,0x73c6ea73,0x15755044,0xa44aeb4b,
  89888. 0xfab58fee,0xba3f8575,0xdc680a6f,0x9779dbc9,0x7b37ddfc,0xe1ee5f5a } },
  89889. /* 223 */
  89890. { { 0x12d29f46,0xcd0b4648,0x0ed53137,0x93295b0b,0x80bef6c9,0xbfe26094,
  89891. 0x54248b00,0xa6565788,0x80e7f9c4,0x69c43fca,0xbe141ea1,0x2190837b },
  89892. { 0xa1b26cfb,0x875e159a,0x7affe852,0x90ca9f87,0x92ca598e,0x15e6550d,
  89893. 0x1938ad11,0xe3e0945d,0x366ef937,0xef7636bb,0xb39869e5,0xb6034d0b } },
  89894. /* 224 */
  89895. { { 0x26d8356e,0x4d255e30,0xd314626f,0xf83666ed,0xd0c8ed64,0x421ddf61,
  89896. 0x26677b61,0x96e473c5,0x9e9b18b3,0xdad4af7e,0xa9393f75,0xfceffd4a },
  89897. { 0x11c731d5,0x843138a1,0xb2f141d9,0x05bcb3a1,0x617b7671,0x20e1fa95,
  89898. 0x88ccec7b,0xbefce812,0x90f1b568,0x582073dc,0x1f055cb7,0xf572261a } },
  89899. /* 225 */
  89900. { { 0x36973088,0xf3148277,0x86a9f980,0xc008e708,0xe046c261,0x1b795947,
  89901. 0xca76bca0,0xdf1e6a7d,0x71acddf0,0xabafd886,0x1364d8f4,0xff7054d9 },
  89902. { 0xe2260594,0x2cf63547,0xd73b277e,0x468a5372,0xef9bd35e,0xc7419e24,
  89903. 0x24043cc3,0x2b4a1c20,0x890b39cd,0xa28f047a,0x46f9a2e3,0xdca2cea1 } },
  89904. /* 226 */
  89905. { { 0x53277538,0xab788736,0xcf697738,0xa734e225,0x6b22e2c1,0x66ee1d1e,
  89906. 0xebe1d212,0x2c615389,0x02bb0766,0xf36cad40,0x3e64f207,0x120885c3 },
  89907. { 0x90fbfec2,0x59e77d56,0xd7a574ae,0xf9e781aa,0x5d045e53,0x801410b0,
  89908. 0xa91b5f0e,0xd3b5f0aa,0x7fbb3521,0xb3d1df00,0xc72bee9a,0x11c4b33e } },
  89909. /* 227 */
  89910. { { 0x83c3a7f3,0xd32b9832,0x88d8a354,0x8083abcf,0x50f4ec5a,0xdeb16404,
  89911. 0x641e2907,0x18d747f0,0xf1bbf03e,0x4e8978ae,0x88a0cd89,0x932447dc },
  89912. { 0xcf3d5897,0x561e0feb,0x13600e6d,0xfc3a682f,0xd16a6b73,0xc78b9d73,
  89913. 0xd29bf580,0xe713fede,0x08d69e5c,0x0a225223,0x1ff7fda4,0x3a924a57 } },
  89914. /* 228 */
  89915. { { 0xb4093bee,0xfb64554c,0xa58c6ec0,0xa6d65a25,0x43d0ed37,0x4126994d,
  89916. 0x55152d44,0xa5689a51,0x284caa8d,0xb8e5ea8c,0xd1f25538,0x33f05d4f },
  89917. { 0x1b615d6e,0xe0fdfe09,0x705507da,0x2ded7e8f,0x17bbcc80,0xdd5631e5,
  89918. 0x267fd11f,0x4f87453e,0xff89d62d,0xc6da723f,0xe3cda21d,0x55cbcae2 } },
  89919. /* 229 */
  89920. { { 0x6b4e84f3,0x336bc94e,0x4ef72c35,0x72863031,0xeeb57f99,0x6d85fdee,
  89921. 0xa42ece1b,0x7f4e3272,0x36f0320a,0x7f86cbb5,0x923331e6,0xf09b6a2b },
  89922. { 0x56778435,0x21d3ecf1,0x8323b2d2,0x2977ba99,0x1704bc0f,0x6a1b57fb,
  89923. 0x389f048a,0xd777cf8b,0xac6b42cd,0x9ce2174f,0x09e6c55a,0x404e2bff } },
  89924. /* 230 */
  89925. { { 0x204c5ddb,0x9b9b135e,0x3eff550e,0x9dbfe044,0xec3be0f6,0x35eab4bf,
  89926. 0x0a43e56f,0x8b4c3f0d,0x0e73f9b3,0x4c1c6673,0x2c78c905,0x92ed38bd },
  89927. { 0xa386e27c,0xc7003f6a,0xaced8507,0xb9c4f46f,0x59df5464,0xea024ec8,
  89928. 0x429572ea,0x4af96152,0xe1fc1194,0x279cd5e2,0x281e358c,0xaa376a03 } },
  89929. /* 231 */
  89930. { { 0x3cdbc95c,0x07859223,0xef2e337a,0xaae1aa6a,0x472a8544,0xc040108d,
  89931. 0x8d037b7d,0x80c853e6,0x8c7eee24,0xd221315c,0x8ee47752,0x195d3856 },
  89932. { 0xdacd7fbe,0xd4b1ba03,0xd3e0c52b,0x4b5ac61e,0x6aab7b52,0x68d3c052,
  89933. 0x660e3fea,0xf0d7248c,0x3145efb4,0xafdb3f89,0x8f40936d,0xa73fd9a3 } },
  89934. /* 232 */
  89935. { { 0xbb1b17ce,0x891b9ef3,0xc6127f31,0x14023667,0x305521fd,0x12b2e58d,
  89936. 0xe3508088,0x3a47e449,0xff751507,0xe49fc84b,0x5310d16e,0x4023f722 },
  89937. { 0xb73399fa,0xa608e5ed,0xd532aa3e,0xf12632d8,0x845e8415,0x13a2758e,
  89938. 0x1fc2d861,0xae4b6f85,0x339d02f2,0x3879f5b1,0x80d99ebd,0x446d22a6 } },
  89939. /* 233 */
  89940. { { 0x4be164f1,0x0f502302,0x88b81920,0x8d09d2d6,0x984aceff,0x514056f1,
  89941. 0x75e9e80d,0xa5c4ddf0,0xdf496a93,0x38cb47e6,0x38df6bf7,0x899e1d6b },
  89942. { 0xb59eb2a6,0x69e87e88,0x9b47f38b,0x280d9d63,0x3654e955,0x599411ea,
  89943. 0x969aa581,0xcf8dd4fd,0x530742a7,0xff5c2baf,0x1a373085,0xa4391536 } },
  89944. /* 234 */
  89945. { { 0xa8a4bdd2,0x6ace72a3,0xb68ef702,0xc656cdd1,0x90c4dad8,0xd4a33e7e,
  89946. 0x9d951c50,0x4aece08a,0x085d68e6,0xea8005ae,0x6f7502b8,0xfdd7a7d7 },
  89947. { 0x98d6fa45,0xce6fb0a6,0x1104eb8c,0x228f8672,0xda09d7dc,0xd23d8787,
  89948. 0x2ae93065,0x5521428b,0xea56c366,0x95faba3d,0x0a88aca5,0xedbe5039 } },
  89949. /* 235 */
  89950. { { 0xbfb26c82,0xd64da0ad,0x952c2f9c,0xe5d70b3c,0xf7e77f68,0xf5e8f365,
  89951. 0x08f2d695,0x7234e002,0xd12e7be6,0xfaf900ee,0x4acf734e,0x27dc6934 },
  89952. { 0xc260a46a,0x80e4ff5e,0x2dc31c28,0x7da5ebce,0xca69f552,0x485c5d73,
  89953. 0x69cc84c2,0xcdfb6b29,0xed6d4eca,0x031c5afe,0x22247637,0xc7bbf4c8 } },
  89954. /* 236 */
  89955. { { 0x49fe01b2,0x9d5b72c7,0x793a91b8,0x34785186,0xcf460438,0xa3ba3c54,
  89956. 0x3ab21b6f,0x73e8e43d,0xbe57b8ab,0x50cde8e0,0xdd204264,0x6488b3a7 },
  89957. { 0xdddc4582,0xa9e398b3,0x5bec46fe,0x1698c1a9,0x156d3843,0x7f1446ef,
  89958. 0x770329a2,0x3fd25dd8,0x2c710668,0x05b1221a,0xa72ee6cf,0x65b2dc2a } },
  89959. /* 237 */
  89960. { { 0xcd021d63,0x21a885f7,0xfea61f08,0x3f344b15,0xc5cf73e6,0xad5ba6dd,
  89961. 0x227a8b23,0x154d0d8f,0xdc559311,0x9b74373c,0x98620fa1,0x4feab715 },
  89962. { 0x7d9ec924,0x5098938e,0x6d47e550,0x84d54a5e,0x1b617506,0x1a2d1bdc,
  89963. 0x615868a4,0x99fe1782,0x3005a924,0x171da780,0x7d8f79b6,0xa70bf5ed } },
  89964. /* 238 */
  89965. { { 0xfe2216c5,0x0bc1250d,0x7601b351,0x2c37e250,0xd6f06b7e,0xb6300175,
  89966. 0x8bfeb9b7,0x4dde8ca1,0xb82f843d,0x4f210432,0xb1ac0afd,0x8d70e2f9 },
  89967. { 0xaae91abb,0x25c73b78,0x863028f2,0x0230dca3,0xe5cf30b7,0x8b923ecf,
  89968. 0x5506f265,0xed754ec2,0x729a5e39,0x8e41b88c,0xbabf889b,0xee67cec2 } },
  89969. /* 239 */
  89970. { { 0x1be46c65,0xe183acf5,0xe7565d7a,0x9789538f,0xd9627b4e,0x87873391,
  89971. 0x9f1d9187,0xbf4ac4c1,0x4691f5c8,0x5db99f63,0x74a1fb98,0xa68df803 },
  89972. { 0xbf92b5fa,0x3c448ed1,0x3e0bdc32,0xa098c841,0x79bf016c,0x8e74cd55,
  89973. 0x115e244d,0x5df0d09c,0x3410b66e,0x9418ad01,0x17a02130,0x8b6124cb } },
  89974. /* 240 */
  89975. { { 0xc26e3392,0x425ec3af,0xa1722e00,0xc07f8470,0xe2356b43,0xdcc28190,
  89976. 0xb1ef59a6,0x4ed97dff,0xc63028c1,0xc22b3ad1,0x68c18988,0x070723c2 },
  89977. { 0x4cf49e7d,0x70da302f,0x3f12a522,0xc5e87c93,0x18594148,0x74acdd1d,
  89978. 0xca74124c,0xad5f73ab,0xd69fd478,0xe72e4a3e,0x7b117cc3,0x61593868 } },
  89979. /* 241 */
  89980. { { 0xa9aa0486,0x7b7b9577,0xa063d557,0x6e41fb35,0xda9047d7,0xb017d5c7,
  89981. 0x68a87ba9,0x8c748280,0xdf08ad93,0xab45fa5c,0x4c288a28,0xcd9fb217 },
  89982. { 0x5747843d,0x59544642,0xa56111e3,0x34d64c6c,0x4bfce8d5,0x12e47ea1,
  89983. 0x6169267f,0x17740e05,0xeed03fb5,0x5c49438e,0x4fc3f513,0x9da30add } },
  89984. /* 242 */
  89985. { { 0xccfa5200,0xc4e85282,0x6a19b13d,0x2707608f,0xf5726e2f,0xdcb9a53d,
  89986. 0xe9427de5,0x612407c9,0xd54d582a,0x3e5a17e1,0x655ae118,0xb99877de },
  89987. { 0x015254de,0x6f0e972b,0xf0a6f7c5,0x92a56db1,0xa656f8b2,0xd297e4e1,
  89988. 0xad981983,0x99fe0052,0x07cfed84,0xd3652d2f,0x843c1738,0xc784352e } },
  89989. /* 243 */
  89990. { { 0x7e9b2d8a,0x6ee90af0,0x57cf1964,0xac8d7018,0x71f28efc,0xf6ed9031,
  89991. 0x6812b20e,0x7f70d5a9,0xf1c61eee,0x27b557f4,0xc6263758,0xf1c9bd57 },
  89992. { 0x2a1a6194,0x5cf7d014,0x1890ab84,0xdd614e0b,0x0e93c2a6,0x3ef9de10,
  89993. 0xe0cd91c5,0xf98cf575,0x14befc32,0x504ec0c6,0x6279d68c,0xd0513a66 } },
  89994. /* 244 */
  89995. { { 0xa859fb6a,0xa8eadbad,0xdb283666,0xcf8346e7,0x3e22e355,0x7b35e61a,
  89996. 0x99639c6b,0x293ece2c,0x56f241c8,0xfa0162e2,0xbf7a1dda,0xd2e6c7b9 },
  89997. { 0x40075e63,0xd0de6253,0xf9ec8286,0x2405aa61,0x8fe45494,0x2237830a,
  89998. 0x364e9c8c,0x4fd01ac7,0x904ba750,0x4d9c3d21,0xaf1b520b,0xd589be14 } },
  89999. /* 245 */
  90000. { { 0x4662e53b,0x13576a4f,0xf9077676,0x35ec2f51,0x97c0af97,0x66297d13,
  90001. 0x9e598b58,0xed3201fe,0x5e70f604,0x49bc752a,0xbb12d951,0xb54af535 },
  90002. { 0x212c1c76,0x36ea4c2b,0xeb250dfd,0x18f5bbc7,0x9a0a1a46,0xa0d466cc,
  90003. 0xdac2d917,0x52564da4,0x8e95fab5,0x206559f4,0x9ca67a33,0x7487c190 } },
  90004. /* 246 */
  90005. { { 0xdde98e9c,0x75abfe37,0x2a411199,0x99b90b26,0xdcdb1f7c,0x1b410996,
  90006. 0x8b3b5675,0xab346f11,0xf1f8ae1e,0x04852193,0x6b8b98c1,0x1ec4d227 },
  90007. { 0x45452baa,0xba3bc926,0xacc4a572,0x387d1858,0xe51f171e,0x9478eff6,
  90008. 0x931e1c00,0xf357077d,0xe54c8ca8,0xffee77cd,0x551dc9a4,0xfb4892ff } },
  90009. /* 247 */
  90010. { { 0x2db8dff8,0x5b1bdad0,0x5a2285a2,0xd462f4fd,0xda00b461,0x1d6aad8e,
  90011. 0x41306d1b,0x43fbefcf,0x6a13fe19,0x428e86f3,0x17f89404,0xc8b2f118 },
  90012. { 0xf0d51afb,0x762528aa,0x549b1d06,0xa3e2fea4,0xea3ddf66,0x86fad8f2,
  90013. 0x4fbdd206,0x0d9ccc4b,0xc189ff5a,0xcde97d4c,0x199f19a6,0xc36793d6 } },
  90014. /* 248 */
  90015. { { 0x51b85197,0xea38909b,0xb4c92895,0xffb17dd0,0x1ddb3f3f,0x0eb0878b,
  90016. 0xc57cf0f2,0xb05d28ff,0x1abd57e2,0xd8bde2e7,0xc40c1b20,0x7f2be28d },
  90017. { 0x299a2d48,0x6554dca2,0x8377982d,0x5130ba2e,0x1071971a,0x8863205f,
  90018. 0x7cf2825d,0x15ee6282,0x03748f2b,0xd4b6c57f,0x430385a0,0xa9e3f4da } },
  90019. /* 249 */
  90020. { { 0x83fbc9c6,0x33eb7cec,0x4541777e,0x24a311c7,0x4f0767fc,0xc81377f7,
  90021. 0x4ab702da,0x12adae36,0x2a779696,0xb7fcb6db,0x01cea6ad,0x4a6fb284 },
  90022. { 0xcdfc73de,0x5e8b1d2a,0x1b02fd32,0xd0efae8d,0xd81d8519,0x3f99c190,
  90023. 0xfc808971,0x3c18f7fa,0x51b7ae7b,0x41f713e7,0xf07fc3f8,0x0a4b3435 } },
  90024. /* 250 */
  90025. { { 0x019b7d2e,0x7dda3c4c,0xd4dc4b89,0x631c8d1a,0x1cdb313c,0x5489cd6e,
  90026. 0x4c07bb06,0xd44aed10,0x75f000d1,0x8f97e13a,0xdda5df4d,0x0e9ee64f },
  90027. { 0x3e346910,0xeaa99f3b,0xfa294ad7,0x622f6921,0x0d0b2fe9,0x22aaa20d,
  90028. 0x1e5881ba,0x4fed2f99,0xc1571802,0x9af3b2d6,0xdc7ee17c,0x919e67a8 } },
  90029. /* 251 */
  90030. { { 0x76250533,0xc724fe4c,0x7d817ef8,0x8a2080e5,0x172c9751,0xa2afb0f4,
  90031. 0x17c0702e,0x9b10cdeb,0xc9b7e3e9,0xbf3975e3,0x1cd0cdc5,0x206117df },
  90032. { 0xbe05ebd5,0xfb049e61,0x16c782c0,0xeb0bb55c,0xab7fed09,0x13a331b8,
  90033. 0x632863f0,0xf6c58b1d,0x4d3b6195,0x6264ef6e,0x9a53f116,0x92c51b63 } },
  90034. /* 252 */
  90035. { { 0x288b364d,0xa57c7bc8,0x7b41e5c4,0x4a562e08,0x698a9a11,0x699d21c6,
  90036. 0xf3f849b9,0xa4ed9581,0x9eb726ba,0xa223eef3,0xcc2884f9,0x13159c23 },
  90037. { 0x3a3f4963,0x73931e58,0x0ada6a81,0x96500389,0x5ab2950b,0x3ee8a1c6,
  90038. 0x775fab52,0xeedf4949,0x4f2671b6,0x63d652e1,0x3c4e2f55,0xfed4491c } },
  90039. /* 253 */
  90040. { { 0xf4eb453e,0x335eadc3,0xcadd1a5b,0x5ff74b63,0x5d84a91a,0x6933d0d7,
  90041. 0xb49ba337,0x9ca3eeb9,0xc04c15b8,0x1f6facce,0xdc09a7e4,0x4ef19326 },
  90042. { 0x3dca3233,0x53d2d324,0xa2259d4b,0x0ee40590,0x5546f002,0x18c22edb,
  90043. 0x09ea6b71,0x92429801,0xb0e91e61,0xaada0add,0x99963c50,0x5fe53ef4 } },
  90044. /* 254 */
  90045. { { 0x90c28c65,0x372dd06b,0x119ce47d,0x1765242c,0x6b22fc82,0xc041fb80,
  90046. 0xb0a7ccc1,0x667edf07,0x1261bece,0xc79599e7,0x19cff22a,0xbc69d9ba },
  90047. { 0x13c06819,0x009d77cd,0xe282b79d,0x635a66ae,0x225b1be8,0x4edac4a6,
  90048. 0x524008f9,0x57d4f4e4,0xb056af84,0xee299ac5,0x3a0bc386,0xcc38444c } },
  90049. /* 255 */
  90050. { { 0xcd4c2356,0x490643b1,0x750547be,0x740a4851,0xd4944c04,0x643eaf29,
  90051. 0x299a98a0,0xba572479,0xee05fdf9,0x48b29f16,0x089b2d7b,0x33fb4f61 },
  90052. { 0xa950f955,0x86704902,0xfedc3ddf,0x97e1034d,0x05fbb6a2,0x211320b6,
  90053. 0x432299bb,0x23d7b93f,0x8590e4a3,0x1fe1a057,0xf58c0ce6,0x8e1d0586 } },
  90054. };
  90055. /* Multiply the base point of P384 by the scalar and return the result.
  90056. * If map is true then convert result to affine coordinates.
  90057. *
  90058. * Stripe implementation.
  90059. * Pre-generated: 2^0, 2^48, ...
  90060. * Pre-generated: products of all combinations of above.
  90061. * 8 doubles and adds (with qz=1)
  90062. *
  90063. * r Resulting point.
  90064. * k Scalar to multiply by.
  90065. * map Indicates whether to convert result to affine.
  90066. * ct Constant time required.
  90067. * heap Heap to use for allocation.
  90068. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90069. */
  90070. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  90071. int map, int ct, void* heap)
  90072. {
  90073. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  90074. k, map, ct, heap);
  90075. }
  90076. #endif
  90077. /* Multiply the base point of P384 by the scalar and return the result.
  90078. * If map is true then convert result to affine coordinates.
  90079. *
  90080. * km Scalar to multiply by.
  90081. * r Resulting point.
  90082. * map Indicates whether to convert result to affine.
  90083. * heap Heap to use for allocation.
  90084. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90085. */
  90086. int sp_ecc_mulmod_base_384(const mp_int* km, ecc_point* r, int map, void* heap)
  90087. {
  90088. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90089. sp_point_384* point = NULL;
  90090. sp_digit* k = NULL;
  90091. #else
  90092. sp_point_384 point[1];
  90093. sp_digit k[12];
  90094. #endif
  90095. int err = MP_OKAY;
  90096. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90097. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  90098. DYNAMIC_TYPE_ECC);
  90099. if (point == NULL)
  90100. err = MEMORY_E;
  90101. if (err == MP_OKAY) {
  90102. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  90103. DYNAMIC_TYPE_ECC);
  90104. if (k == NULL)
  90105. err = MEMORY_E;
  90106. }
  90107. #endif
  90108. if (err == MP_OKAY) {
  90109. sp_384_from_mp(k, 12, km);
  90110. err = sp_384_ecc_mulmod_base_12(point, k, map, 1, heap);
  90111. }
  90112. if (err == MP_OKAY) {
  90113. err = sp_384_point_to_ecc_point_12(point, r);
  90114. }
  90115. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90116. if (k != NULL)
  90117. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  90118. if (point != NULL)
  90119. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  90120. #endif
  90121. return err;
  90122. }
  90123. /* Multiply the base point of P384 by the scalar, add point a and return
  90124. * the result. If map is true then convert result to affine coordinates.
  90125. *
  90126. * km Scalar to multiply by.
  90127. * am Point to add to scalar mulitply result.
  90128. * inMont Point to add is in montgomery form.
  90129. * r Resulting point.
  90130. * map Indicates whether to convert result to affine.
  90131. * heap Heap to use for allocation.
  90132. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  90133. */
  90134. int sp_ecc_mulmod_base_add_384(const mp_int* km, const ecc_point* am,
  90135. int inMont, ecc_point* r, int map, void* heap)
  90136. {
  90137. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90138. sp_point_384* point = NULL;
  90139. sp_digit* k = NULL;
  90140. #else
  90141. sp_point_384 point[2];
  90142. sp_digit k[12 + 12 * 2 * 6];
  90143. #endif
  90144. sp_point_384* addP = NULL;
  90145. sp_digit* tmp = NULL;
  90146. int err = MP_OKAY;
  90147. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90148. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  90149. DYNAMIC_TYPE_ECC);
  90150. if (point == NULL)
  90151. err = MEMORY_E;
  90152. if (err == MP_OKAY) {
  90153. k = (sp_digit*)XMALLOC(
  90154. sizeof(sp_digit) * (12 + 12 * 2 * 6),
  90155. heap, DYNAMIC_TYPE_ECC);
  90156. if (k == NULL)
  90157. err = MEMORY_E;
  90158. }
  90159. #endif
  90160. if (err == MP_OKAY) {
  90161. addP = point + 1;
  90162. tmp = k + 12;
  90163. sp_384_from_mp(k, 12, km);
  90164. sp_384_point_from_ecc_point_12(addP, am);
  90165. }
  90166. if ((err == MP_OKAY) && (!inMont)) {
  90167. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  90168. }
  90169. if ((err == MP_OKAY) && (!inMont)) {
  90170. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  90171. }
  90172. if ((err == MP_OKAY) && (!inMont)) {
  90173. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  90174. }
  90175. if (err == MP_OKAY) {
  90176. err = sp_384_ecc_mulmod_base_12(point, k, 0, 0, heap);
  90177. }
  90178. if (err == MP_OKAY) {
  90179. sp_384_proj_point_add_12(point, point, addP, tmp);
  90180. if (map) {
  90181. sp_384_map_12(point, point, tmp);
  90182. }
  90183. err = sp_384_point_to_ecc_point_12(point, r);
  90184. }
  90185. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90186. if (k != NULL)
  90187. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  90188. if (point)
  90189. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  90190. #endif
  90191. return err;
  90192. }
  90193. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  90194. defined(HAVE_ECC_VERIFY)
  90195. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  90196. /* Add 1 to a. (a = a + 1)
  90197. *
  90198. * a A single precision integer.
  90199. */
  90200. static void sp_384_add_one_12(sp_digit* a_p)
  90201. {
  90202. register sp_digit* a asm ("r0") = a_p;
  90203. __asm__ __volatile__ (
  90204. "ldm %[a], {r1, r2, r3, r4}\n\t"
  90205. "adds r1, r1, #1\n\t"
  90206. "adcs r2, r2, #0\n\t"
  90207. "adcs r3, r3, #0\n\t"
  90208. "adcs r4, r4, #0\n\t"
  90209. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  90210. "ldm %[a], {r1, r2, r3, r4}\n\t"
  90211. "adcs r1, r1, #0\n\t"
  90212. "adcs r2, r2, #0\n\t"
  90213. "adcs r3, r3, #0\n\t"
  90214. "adcs r4, r4, #0\n\t"
  90215. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  90216. "ldm %[a], {r1, r2, r3, r4}\n\t"
  90217. "adcs r1, r1, #0\n\t"
  90218. "adcs r2, r2, #0\n\t"
  90219. "adcs r3, r3, #0\n\t"
  90220. "adcs r4, r4, #0\n\t"
  90221. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  90222. : [a] "+r" (a)
  90223. :
  90224. : "memory", "r1", "r2", "r3", "r4"
  90225. );
  90226. }
  90227. /* Read big endian unsigned byte array into r.
  90228. *
  90229. * r A single precision integer.
  90230. * size Maximum number of bytes to convert
  90231. * a Byte array.
  90232. * n Number of bytes in array to read.
  90233. */
  90234. static void sp_384_from_bin(sp_digit* r, int size, const byte* a, int n)
  90235. {
  90236. int i;
  90237. int j;
  90238. byte* d;
  90239. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  90240. r[j] = ((sp_digit)a[i - 0] << 0) |
  90241. ((sp_digit)a[i - 1] << 8) |
  90242. ((sp_digit)a[i - 2] << 16) |
  90243. ((sp_digit)a[i - 3] << 24);
  90244. j++;
  90245. }
  90246. if (i >= 0) {
  90247. r[j] = 0;
  90248. d = (byte*)r;
  90249. switch (i) {
  90250. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  90251. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  90252. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  90253. }
  90254. j++;
  90255. }
  90256. for (; j < size; j++) {
  90257. r[j] = 0;
  90258. }
  90259. }
  90260. /* Generates a scalar that is in the range 1..order-1.
  90261. *
  90262. * rng Random number generator.
  90263. * k Scalar value.
  90264. * returns RNG failures, MEMORY_E when memory allocation fails and
  90265. * MP_OKAY on success.
  90266. */
  90267. static int sp_384_ecc_gen_k_12(WC_RNG* rng, sp_digit* k)
  90268. {
  90269. int err;
  90270. byte buf[48];
  90271. do {
  90272. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  90273. if (err == 0) {
  90274. sp_384_from_bin(k, 12, buf, (int)sizeof(buf));
  90275. if (sp_384_cmp_12(k, p384_order2) <= 0) {
  90276. sp_384_add_one_12(k);
  90277. break;
  90278. }
  90279. }
  90280. }
  90281. while (err == 0);
  90282. return err;
  90283. }
  90284. /* Makes a random EC key pair.
  90285. *
  90286. * rng Random number generator.
  90287. * priv Generated private value.
  90288. * pub Generated public point.
  90289. * heap Heap to use for allocation.
  90290. * returns ECC_INF_E when the point does not have the correct order, RNG
  90291. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  90292. */
  90293. int sp_ecc_make_key_384(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  90294. {
  90295. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90296. sp_point_384* point = NULL;
  90297. sp_digit* k = NULL;
  90298. #else
  90299. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  90300. sp_point_384 point[2];
  90301. #else
  90302. sp_point_384 point[1];
  90303. #endif
  90304. sp_digit k[12];
  90305. #endif
  90306. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  90307. sp_point_384* infinity = NULL;
  90308. #endif
  90309. int err = MP_OKAY;
  90310. (void)heap;
  90311. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90312. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  90313. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC);
  90314. #else
  90315. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC);
  90316. #endif
  90317. if (point == NULL)
  90318. err = MEMORY_E;
  90319. if (err == MP_OKAY) {
  90320. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  90321. DYNAMIC_TYPE_ECC);
  90322. if (k == NULL)
  90323. err = MEMORY_E;
  90324. }
  90325. #endif
  90326. if (err == MP_OKAY) {
  90327. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  90328. infinity = point + 1;
  90329. #endif
  90330. err = sp_384_ecc_gen_k_12(rng, k);
  90331. }
  90332. if (err == MP_OKAY) {
  90333. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, NULL);
  90334. }
  90335. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  90336. if (err == MP_OKAY) {
  90337. err = sp_384_ecc_mulmod_12(infinity, point, p384_order, 1, 1, NULL);
  90338. }
  90339. if (err == MP_OKAY) {
  90340. if (sp_384_iszero_12(point->x) || sp_384_iszero_12(point->y)) {
  90341. err = ECC_INF_E;
  90342. }
  90343. }
  90344. #endif
  90345. if (err == MP_OKAY) {
  90346. err = sp_384_to_mp(k, priv);
  90347. }
  90348. if (err == MP_OKAY) {
  90349. err = sp_384_point_to_ecc_point_12(point, pub);
  90350. }
  90351. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90352. if (k != NULL)
  90353. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  90354. if (point != NULL) {
  90355. /* point is not sensitive, so no need to zeroize */
  90356. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  90357. }
  90358. #endif
  90359. return err;
  90360. }
  90361. #ifdef WOLFSSL_SP_NONBLOCK
  90362. typedef struct sp_ecc_key_gen_384_ctx {
  90363. int state;
  90364. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  90365. sp_digit k[12];
  90366. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  90367. sp_point_384 point[2];
  90368. #else
  90369. sp_point_384 point[1];
  90370. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  90371. } sp_ecc_key_gen_384_ctx;
  90372. int sp_ecc_make_key_384_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  90373. ecc_point* pub, void* heap)
  90374. {
  90375. int err = FP_WOULDBLOCK;
  90376. sp_ecc_key_gen_384_ctx* ctx = (sp_ecc_key_gen_384_ctx*)sp_ctx->data;
  90377. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  90378. sp_point_384* infinity = ctx->point + 1;
  90379. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  90380. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_384_ctx)
  90381. >= sizeof(*sp_ctx) ? -1 : 1];
  90382. (void)sizeof(ctx_size_test);
  90383. switch (ctx->state) {
  90384. case 0:
  90385. err = sp_384_ecc_gen_k_12(rng, ctx->k);
  90386. if (err == MP_OKAY) {
  90387. err = FP_WOULDBLOCK;
  90388. ctx->state = 1;
  90389. }
  90390. break;
  90391. case 1:
  90392. err = sp_384_ecc_mulmod_base_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  90393. ctx->point, ctx->k, 1, 1, heap);
  90394. if (err == MP_OKAY) {
  90395. err = FP_WOULDBLOCK;
  90396. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  90397. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  90398. ctx->state = 2;
  90399. #else
  90400. ctx->state = 3;
  90401. #endif
  90402. }
  90403. break;
  90404. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  90405. case 2:
  90406. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  90407. infinity, ctx->point, p384_order, 1, 1);
  90408. if (err == MP_OKAY) {
  90409. if (sp_384_iszero_12(ctx->point->x) ||
  90410. sp_384_iszero_12(ctx->point->y)) {
  90411. err = ECC_INF_E;
  90412. }
  90413. else {
  90414. err = FP_WOULDBLOCK;
  90415. ctx->state = 3;
  90416. }
  90417. }
  90418. break;
  90419. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  90420. case 3:
  90421. err = sp_384_to_mp(ctx->k, priv);
  90422. if (err == MP_OKAY) {
  90423. err = sp_384_point_to_ecc_point_12(ctx->point, pub);
  90424. }
  90425. break;
  90426. }
  90427. if (err != FP_WOULDBLOCK) {
  90428. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_384_ctx));
  90429. }
  90430. return err;
  90431. }
  90432. #endif /* WOLFSSL_SP_NONBLOCK */
  90433. #ifdef HAVE_ECC_DHE
  90434. /* Write r as big endian to byte array.
  90435. * Fixed length number of bytes written: 48
  90436. *
  90437. * r A single precision integer.
  90438. * a Byte array.
  90439. */
  90440. static void sp_384_to_bin_12(sp_digit* r, byte* a)
  90441. {
  90442. int i;
  90443. int j = 0;
  90444. for (i = 11; i >= 0; i--) {
  90445. a[j++] = r[i] >> 24;
  90446. a[j++] = r[i] >> 16;
  90447. a[j++] = r[i] >> 8;
  90448. a[j++] = r[i] >> 0;
  90449. }
  90450. }
  90451. /* Multiply the point by the scalar and serialize the X ordinate.
  90452. * The number is 0 padded to maximum size on output.
  90453. *
  90454. * priv Scalar to multiply the point by.
  90455. * pub Point to multiply.
  90456. * out Buffer to hold X ordinate.
  90457. * outLen On entry, size of the buffer in bytes.
  90458. * On exit, length of data in buffer in bytes.
  90459. * heap Heap to use for allocation.
  90460. * returns BUFFER_E if the buffer is to small for output size,
  90461. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  90462. */
  90463. int sp_ecc_secret_gen_384(const mp_int* priv, const ecc_point* pub, byte* out,
  90464. word32* outLen, void* heap)
  90465. {
  90466. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90467. sp_point_384* point = NULL;
  90468. sp_digit* k = NULL;
  90469. #else
  90470. sp_point_384 point[1];
  90471. sp_digit k[12];
  90472. #endif
  90473. int err = MP_OKAY;
  90474. if (*outLen < 48U) {
  90475. err = BUFFER_E;
  90476. }
  90477. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90478. if (err == MP_OKAY) {
  90479. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  90480. DYNAMIC_TYPE_ECC);
  90481. if (point == NULL)
  90482. err = MEMORY_E;
  90483. }
  90484. if (err == MP_OKAY) {
  90485. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  90486. DYNAMIC_TYPE_ECC);
  90487. if (k == NULL)
  90488. err = MEMORY_E;
  90489. }
  90490. #endif
  90491. if (err == MP_OKAY) {
  90492. sp_384_from_mp(k, 12, priv);
  90493. sp_384_point_from_ecc_point_12(point, pub);
  90494. err = sp_384_ecc_mulmod_12(point, point, k, 1, 1, heap);
  90495. }
  90496. if (err == MP_OKAY) {
  90497. sp_384_to_bin_12(point->x, out);
  90498. *outLen = 48;
  90499. }
  90500. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  90501. if (k != NULL)
  90502. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  90503. if (point != NULL)
  90504. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  90505. #endif
  90506. return err;
  90507. }
  90508. #ifdef WOLFSSL_SP_NONBLOCK
  90509. typedef struct sp_ecc_sec_gen_384_ctx {
  90510. int state;
  90511. union {
  90512. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  90513. };
  90514. sp_digit k[12];
  90515. sp_point_384 point;
  90516. } sp_ecc_sec_gen_384_ctx;
  90517. int sp_ecc_secret_gen_384_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  90518. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  90519. {
  90520. int err = FP_WOULDBLOCK;
  90521. sp_ecc_sec_gen_384_ctx* ctx = (sp_ecc_sec_gen_384_ctx*)sp_ctx->data;
  90522. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  90523. (void)sizeof(ctx_size_test);
  90524. if (*outLen < 32U) {
  90525. err = BUFFER_E;
  90526. }
  90527. switch (ctx->state) {
  90528. case 0:
  90529. sp_384_from_mp(ctx->k, 12, priv);
  90530. sp_384_point_from_ecc_point_12(&ctx->point, pub);
  90531. ctx->state = 1;
  90532. break;
  90533. case 1:
  90534. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  90535. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  90536. if (err == MP_OKAY) {
  90537. sp_384_to_bin_12(ctx->point.x, out);
  90538. *outLen = 48;
  90539. }
  90540. break;
  90541. }
  90542. if (err == MP_OKAY && ctx->state != 1) {
  90543. err = FP_WOULDBLOCK;
  90544. }
  90545. if (err != FP_WOULDBLOCK) {
  90546. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_384_ctx));
  90547. }
  90548. return err;
  90549. }
  90550. #endif /* WOLFSSL_SP_NONBLOCK */
  90551. #endif /* HAVE_ECC_DHE */
  90552. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  90553. #endif
  90554. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  90555. #endif
  90556. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  90557. #ifdef WOLFSSL_SP_SMALL
  90558. /* Sub b from a into a. (a -= b)
  90559. *
  90560. * a A single precision integer.
  90561. * b A single precision integer.
  90562. */
  90563. static sp_digit sp_384_sub_in_place_12(sp_digit* a_p, const sp_digit* b_p)
  90564. {
  90565. register sp_digit* a asm ("r0") = a_p;
  90566. register const sp_digit* b asm ("r1") = b_p;
  90567. __asm__ __volatile__ (
  90568. "mov r10, #0\n\t"
  90569. "mov r12, #0\n\t"
  90570. "add lr, %[a], #48\n\t"
  90571. "\n"
  90572. "L_sp_384_sub_in_pkace_12_word_%=: \n\t"
  90573. "subs r12, r10, r12\n\t"
  90574. "ldm %[a], {r2, r3, r4, r5}\n\t"
  90575. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  90576. "sbcs r2, r2, r6\n\t"
  90577. "sbcs r3, r3, r7\n\t"
  90578. "sbcs r4, r4, r8\n\t"
  90579. "sbcs r5, r5, r9\n\t"
  90580. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  90581. "sbc r12, r10, r10\n\t"
  90582. "cmp %[a], lr\n\t"
  90583. "bne L_sp_384_sub_in_pkace_12_word_%=\n\t"
  90584. "mov %[a], r12\n\t"
  90585. : [a] "+r" (a), [b] "+r" (b)
  90586. :
  90587. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10"
  90588. );
  90589. return (uint32_t)(size_t)a;
  90590. }
  90591. #else
  90592. /* Sub b from a into a. (a -= b)
  90593. *
  90594. * a A single precision integer and result.
  90595. * b A single precision integer.
  90596. */
  90597. static sp_digit sp_384_sub_in_place_12(sp_digit* a_p, const sp_digit* b_p)
  90598. {
  90599. register sp_digit* a asm ("r0") = a_p;
  90600. register const sp_digit* b asm ("r1") = b_p;
  90601. __asm__ __volatile__ (
  90602. "ldm %[a], {r2, r3, r4, r5}\n\t"
  90603. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  90604. "subs r2, r2, r6\n\t"
  90605. "sbcs r3, r3, r7\n\t"
  90606. "sbcs r4, r4, r8\n\t"
  90607. "sbcs r5, r5, r9\n\t"
  90608. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  90609. "ldm %[a], {r2, r3, r4, r5}\n\t"
  90610. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  90611. "sbcs r2, r2, r6\n\t"
  90612. "sbcs r3, r3, r7\n\t"
  90613. "sbcs r4, r4, r8\n\t"
  90614. "sbcs r5, r5, r9\n\t"
  90615. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  90616. "ldm %[a], {r2, r3, r4, r5}\n\t"
  90617. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  90618. "sbcs r2, r2, r6\n\t"
  90619. "sbcs r3, r3, r7\n\t"
  90620. "sbcs r4, r4, r8\n\t"
  90621. "sbcs r5, r5, r9\n\t"
  90622. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  90623. "sbc %[a], r9, r9\n\t"
  90624. : [a] "+r" (a), [b] "+r" (b)
  90625. :
  90626. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  90627. );
  90628. return (uint32_t)(size_t)a;
  90629. }
  90630. #endif /* WOLFSSL_SP_SMALL */
  90631. #ifdef WOLFSSL_SP_SMALL
  90632. /* Mul a by digit b into r. (r = a * b)
  90633. *
  90634. * r A single precision integer.
  90635. * a A single precision integer.
  90636. * b A single precision digit.
  90637. */
  90638. static void sp_384_mul_d_12(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  90639. {
  90640. register sp_digit* r asm ("r0") = r_p;
  90641. register const sp_digit* a asm ("r1") = a_p;
  90642. register sp_digit b asm ("r2") = b_p;
  90643. __asm__ __volatile__ (
  90644. "mov r10, #0\n\t"
  90645. /* A[0] * B */
  90646. "ldr r8, [%[a]]\n\t"
  90647. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  90648. "lsl r6, %[b], #16\n\t"
  90649. "lsl r5, r8, #16\n\t"
  90650. "lsr r6, r6, #16\n\t"
  90651. "lsr r5, r5, #16\n\t"
  90652. "mul r5, r6, r5\n\t"
  90653. "lsr r7, r8, #16\n\t"
  90654. "mul r6, r7, r6\n\t"
  90655. "lsr r3, r6, #16\n\t"
  90656. "lsl r6, r6, #16\n\t"
  90657. "adds r5, r5, r6\n\t"
  90658. "adc r3, r3, #0\n\t"
  90659. "lsr r6, %[b], #16\n\t"
  90660. "mul r7, r6, r7\n\t"
  90661. "add r3, r3, r7\n\t"
  90662. "lsl r7, r8, #16\n\t"
  90663. "lsr r7, r7, #16\n\t"
  90664. "mul r6, r7, r6\n\t"
  90665. "lsr r7, r6, #16\n\t"
  90666. "lsl r6, r6, #16\n\t"
  90667. "adds r5, r5, r6\n\t"
  90668. "adc r3, r3, r7\n\t"
  90669. #else
  90670. "umull r5, r3, %[b], r8\n\t"
  90671. #endif
  90672. "mov r4, #0\n\t"
  90673. "str r5, [%[r]]\n\t"
  90674. "mov r5, #0\n\t"
  90675. "mov r9, #4\n\t"
  90676. "\n"
  90677. "L_sp_384_mul_d_12_word_%=: \n\t"
  90678. /* A[i] * B */
  90679. "ldr r8, [%[a], r9]\n\t"
  90680. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  90681. "lsl r6, %[b], #16\n\t"
  90682. "lsl r7, r8, #16\n\t"
  90683. "lsr r6, r6, #16\n\t"
  90684. "lsr r7, r7, #16\n\t"
  90685. "mul r7, r6, r7\n\t"
  90686. "adds r3, r3, r7\n\t"
  90687. "adcs r4, r4, #0\n\t"
  90688. "adc r5, r5, #0\n\t"
  90689. "lsr r7, r8, #16\n\t"
  90690. "mul r6, r7, r6\n\t"
  90691. "lsr r7, r6, #16\n\t"
  90692. "lsl r6, r6, #16\n\t"
  90693. "adds r3, r3, r6\n\t"
  90694. "adcs r4, r4, r7\n\t"
  90695. "adc r5, r5, #0\n\t"
  90696. "lsr r6, %[b], #16\n\t"
  90697. "lsr r7, r8, #16\n\t"
  90698. "mul r7, r6, r7\n\t"
  90699. "adds r4, r4, r7\n\t"
  90700. "adc r5, r5, #0\n\t"
  90701. "lsl r7, r8, #16\n\t"
  90702. "lsr r7, r7, #16\n\t"
  90703. "mul r6, r7, r6\n\t"
  90704. "lsr r7, r6, #16\n\t"
  90705. "lsl r6, r6, #16\n\t"
  90706. "adds r3, r3, r6\n\t"
  90707. "adcs r4, r4, r7\n\t"
  90708. "adc r5, r5, #0\n\t"
  90709. #else
  90710. "umull r6, r7, %[b], r8\n\t"
  90711. "adds r3, r3, r6\n\t"
  90712. "adcs r4, r4, r7\n\t"
  90713. "adc r5, r5, #0\n\t"
  90714. #endif
  90715. "str r3, [%[r], r9]\n\t"
  90716. "mov r3, r4\n\t"
  90717. "mov r4, r5\n\t"
  90718. "mov r5, #0\n\t"
  90719. "add r9, r9, #4\n\t"
  90720. "cmp r9, #48\n\t"
  90721. "blt L_sp_384_mul_d_12_word_%=\n\t"
  90722. "str r3, [%[r], #48]\n\t"
  90723. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  90724. :
  90725. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  90726. );
  90727. }
  90728. #else
  90729. /* Mul a by digit b into r. (r = a * b)
  90730. *
  90731. * r A single precision integer.
  90732. * a A single precision integer.
  90733. * b A single precision digit.
  90734. */
  90735. static void sp_384_mul_d_12(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  90736. {
  90737. register sp_digit* r asm ("r0") = r_p;
  90738. register const sp_digit* a asm ("r1") = a_p;
  90739. register sp_digit b asm ("r2") = b_p;
  90740. __asm__ __volatile__ (
  90741. "mov r10, #0\n\t"
  90742. /* A[0] * B */
  90743. "ldr r8, [%[a]], #4\n\t"
  90744. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  90745. "lsl r6, %[b], #16\n\t"
  90746. "lsl r3, r8, #16\n\t"
  90747. "lsr r6, r6, #16\n\t"
  90748. "lsr r3, r3, #16\n\t"
  90749. "mul r3, r6, r3\n\t"
  90750. "lsr r7, r8, #16\n\t"
  90751. "mul r6, r7, r6\n\t"
  90752. "lsr r4, r6, #16\n\t"
  90753. "lsl r6, r6, #16\n\t"
  90754. "adds r3, r3, r6\n\t"
  90755. "adc r4, r4, #0\n\t"
  90756. "lsr r6, %[b], #16\n\t"
  90757. "mul r7, r6, r7\n\t"
  90758. "add r4, r4, r7\n\t"
  90759. "lsl r7, r8, #16\n\t"
  90760. "lsr r7, r7, #16\n\t"
  90761. "mul r6, r7, r6\n\t"
  90762. "lsr r7, r6, #16\n\t"
  90763. "lsl r6, r6, #16\n\t"
  90764. "adds r3, r3, r6\n\t"
  90765. "adc r4, r4, r7\n\t"
  90766. #else
  90767. "umull r3, r4, %[b], r8\n\t"
  90768. #endif
  90769. "mov r5, #0\n\t"
  90770. "str r3, [%[r]], #4\n\t"
  90771. /* A[1] * B */
  90772. "ldr r8, [%[a]], #4\n\t"
  90773. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  90774. "lsl r6, %[b], #16\n\t"
  90775. "lsl r7, r8, #16\n\t"
  90776. "lsr r6, r6, #16\n\t"
  90777. "lsr r7, r7, #16\n\t"
  90778. "mul r7, r6, r7\n\t"
  90779. "adds r4, r4, r7\n\t"
  90780. "adcs r5, r5, #0\n\t"
  90781. "mov r3, #0\n\t"
  90782. "adc r3, r3, #0\n\t"
  90783. "lsr r7, r8, #16\n\t"
  90784. "mul r6, r7, r6\n\t"
  90785. "lsr r7, r6, #16\n\t"
  90786. "lsl r6, r6, #16\n\t"
  90787. "adds r4, r4, r6\n\t"
  90788. "adcs r5, r5, r7\n\t"
  90789. "adc r3, r3, #0\n\t"
  90790. "lsr r6, %[b], #16\n\t"
  90791. "lsr r7, r8, #16\n\t"
  90792. "mul r7, r6, r7\n\t"
  90793. "adds r5, r5, r7\n\t"
  90794. "adc r3, r3, #0\n\t"
  90795. "lsl r7, r8, #16\n\t"
  90796. "lsr r7, r7, #16\n\t"
  90797. "mul r6, r7, r6\n\t"
  90798. "lsr r7, r6, #16\n\t"
  90799. "lsl r6, r6, #16\n\t"
  90800. "adds r4, r4, r6\n\t"
  90801. "adcs r5, r5, r7\n\t"
  90802. "adc r3, r3, #0\n\t"
  90803. #else
  90804. "umull r6, r7, %[b], r8\n\t"
  90805. "adds r4, r4, r6\n\t"
  90806. "adcs r5, r5, r7\n\t"
  90807. "mov r3, #0\n\t"
  90808. "adc r3, r3, #0\n\t"
  90809. #endif
  90810. "str r4, [%[r]], #4\n\t"
  90811. /* A[2] * B */
  90812. "ldr r8, [%[a]], #4\n\t"
  90813. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  90814. "lsl r6, %[b], #16\n\t"
  90815. "lsl r7, r8, #16\n\t"
  90816. "lsr r6, r6, #16\n\t"
  90817. "lsr r7, r7, #16\n\t"
  90818. "mul r7, r6, r7\n\t"
  90819. "adds r5, r5, r7\n\t"
  90820. "adcs r3, r3, #0\n\t"
  90821. "mov r4, #0\n\t"
  90822. "adc r4, r4, #0\n\t"
  90823. "lsr r7, r8, #16\n\t"
  90824. "mul r6, r7, r6\n\t"
  90825. "lsr r7, r6, #16\n\t"
  90826. "lsl r6, r6, #16\n\t"
  90827. "adds r5, r5, r6\n\t"
  90828. "adcs r3, r3, r7\n\t"
  90829. "adc r4, r4, #0\n\t"
  90830. "lsr r6, %[b], #16\n\t"
  90831. "lsr r7, r8, #16\n\t"
  90832. "mul r7, r6, r7\n\t"
  90833. "adds r3, r3, r7\n\t"
  90834. "adc r4, r4, #0\n\t"
  90835. "lsl r7, r8, #16\n\t"
  90836. "lsr r7, r7, #16\n\t"
  90837. "mul r6, r7, r6\n\t"
  90838. "lsr r7, r6, #16\n\t"
  90839. "lsl r6, r6, #16\n\t"
  90840. "adds r5, r5, r6\n\t"
  90841. "adcs r3, r3, r7\n\t"
  90842. "adc r4, r4, #0\n\t"
  90843. #else
  90844. "umull r6, r7, %[b], r8\n\t"
  90845. "adds r5, r5, r6\n\t"
  90846. "adcs r3, r3, r7\n\t"
  90847. "mov r4, #0\n\t"
  90848. "adc r4, r4, #0\n\t"
  90849. #endif
  90850. "str r5, [%[r]], #4\n\t"
  90851. /* A[3] * B */
  90852. "ldr r8, [%[a]], #4\n\t"
  90853. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  90854. "lsl r6, %[b], #16\n\t"
  90855. "lsl r7, r8, #16\n\t"
  90856. "lsr r6, r6, #16\n\t"
  90857. "lsr r7, r7, #16\n\t"
  90858. "mul r7, r6, r7\n\t"
  90859. "adds r3, r3, r7\n\t"
  90860. "adcs r4, r4, #0\n\t"
  90861. "mov r5, #0\n\t"
  90862. "adc r5, r5, #0\n\t"
  90863. "lsr r7, r8, #16\n\t"
  90864. "mul r6, r7, r6\n\t"
  90865. "lsr r7, r6, #16\n\t"
  90866. "lsl r6, r6, #16\n\t"
  90867. "adds r3, r3, r6\n\t"
  90868. "adcs r4, r4, r7\n\t"
  90869. "adc r5, r5, #0\n\t"
  90870. "lsr r6, %[b], #16\n\t"
  90871. "lsr r7, r8, #16\n\t"
  90872. "mul r7, r6, r7\n\t"
  90873. "adds r4, r4, r7\n\t"
  90874. "adc r5, r5, #0\n\t"
  90875. "lsl r7, r8, #16\n\t"
  90876. "lsr r7, r7, #16\n\t"
  90877. "mul r6, r7, r6\n\t"
  90878. "lsr r7, r6, #16\n\t"
  90879. "lsl r6, r6, #16\n\t"
  90880. "adds r3, r3, r6\n\t"
  90881. "adcs r4, r4, r7\n\t"
  90882. "adc r5, r5, #0\n\t"
  90883. #else
  90884. "umull r6, r7, %[b], r8\n\t"
  90885. "adds r3, r3, r6\n\t"
  90886. "adcs r4, r4, r7\n\t"
  90887. "mov r5, #0\n\t"
  90888. "adc r5, r5, #0\n\t"
  90889. #endif
  90890. "str r3, [%[r]], #4\n\t"
  90891. /* A[4] * B */
  90892. "ldr r8, [%[a]], #4\n\t"
  90893. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  90894. "lsl r6, %[b], #16\n\t"
  90895. "lsl r7, r8, #16\n\t"
  90896. "lsr r6, r6, #16\n\t"
  90897. "lsr r7, r7, #16\n\t"
  90898. "mul r7, r6, r7\n\t"
  90899. "adds r4, r4, r7\n\t"
  90900. "adcs r5, r5, #0\n\t"
  90901. "mov r3, #0\n\t"
  90902. "adc r3, r3, #0\n\t"
  90903. "lsr r7, r8, #16\n\t"
  90904. "mul r6, r7, r6\n\t"
  90905. "lsr r7, r6, #16\n\t"
  90906. "lsl r6, r6, #16\n\t"
  90907. "adds r4, r4, r6\n\t"
  90908. "adcs r5, r5, r7\n\t"
  90909. "adc r3, r3, #0\n\t"
  90910. "lsr r6, %[b], #16\n\t"
  90911. "lsr r7, r8, #16\n\t"
  90912. "mul r7, r6, r7\n\t"
  90913. "adds r5, r5, r7\n\t"
  90914. "adc r3, r3, #0\n\t"
  90915. "lsl r7, r8, #16\n\t"
  90916. "lsr r7, r7, #16\n\t"
  90917. "mul r6, r7, r6\n\t"
  90918. "lsr r7, r6, #16\n\t"
  90919. "lsl r6, r6, #16\n\t"
  90920. "adds r4, r4, r6\n\t"
  90921. "adcs r5, r5, r7\n\t"
  90922. "adc r3, r3, #0\n\t"
  90923. #else
  90924. "umull r6, r7, %[b], r8\n\t"
  90925. "adds r4, r4, r6\n\t"
  90926. "adcs r5, r5, r7\n\t"
  90927. "mov r3, #0\n\t"
  90928. "adc r3, r3, #0\n\t"
  90929. #endif
  90930. "str r4, [%[r]], #4\n\t"
  90931. /* A[5] * B */
  90932. "ldr r8, [%[a]], #4\n\t"
  90933. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  90934. "lsl r6, %[b], #16\n\t"
  90935. "lsl r7, r8, #16\n\t"
  90936. "lsr r6, r6, #16\n\t"
  90937. "lsr r7, r7, #16\n\t"
  90938. "mul r7, r6, r7\n\t"
  90939. "adds r5, r5, r7\n\t"
  90940. "adcs r3, r3, #0\n\t"
  90941. "mov r4, #0\n\t"
  90942. "adc r4, r4, #0\n\t"
  90943. "lsr r7, r8, #16\n\t"
  90944. "mul r6, r7, r6\n\t"
  90945. "lsr r7, r6, #16\n\t"
  90946. "lsl r6, r6, #16\n\t"
  90947. "adds r5, r5, r6\n\t"
  90948. "adcs r3, r3, r7\n\t"
  90949. "adc r4, r4, #0\n\t"
  90950. "lsr r6, %[b], #16\n\t"
  90951. "lsr r7, r8, #16\n\t"
  90952. "mul r7, r6, r7\n\t"
  90953. "adds r3, r3, r7\n\t"
  90954. "adc r4, r4, #0\n\t"
  90955. "lsl r7, r8, #16\n\t"
  90956. "lsr r7, r7, #16\n\t"
  90957. "mul r6, r7, r6\n\t"
  90958. "lsr r7, r6, #16\n\t"
  90959. "lsl r6, r6, #16\n\t"
  90960. "adds r5, r5, r6\n\t"
  90961. "adcs r3, r3, r7\n\t"
  90962. "adc r4, r4, #0\n\t"
  90963. #else
  90964. "umull r6, r7, %[b], r8\n\t"
  90965. "adds r5, r5, r6\n\t"
  90966. "adcs r3, r3, r7\n\t"
  90967. "mov r4, #0\n\t"
  90968. "adc r4, r4, #0\n\t"
  90969. #endif
  90970. "str r5, [%[r]], #4\n\t"
  90971. /* A[6] * B */
  90972. "ldr r8, [%[a]], #4\n\t"
  90973. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  90974. "lsl r6, %[b], #16\n\t"
  90975. "lsl r7, r8, #16\n\t"
  90976. "lsr r6, r6, #16\n\t"
  90977. "lsr r7, r7, #16\n\t"
  90978. "mul r7, r6, r7\n\t"
  90979. "adds r3, r3, r7\n\t"
  90980. "adcs r4, r4, #0\n\t"
  90981. "mov r5, #0\n\t"
  90982. "adc r5, r5, #0\n\t"
  90983. "lsr r7, r8, #16\n\t"
  90984. "mul r6, r7, r6\n\t"
  90985. "lsr r7, r6, #16\n\t"
  90986. "lsl r6, r6, #16\n\t"
  90987. "adds r3, r3, r6\n\t"
  90988. "adcs r4, r4, r7\n\t"
  90989. "adc r5, r5, #0\n\t"
  90990. "lsr r6, %[b], #16\n\t"
  90991. "lsr r7, r8, #16\n\t"
  90992. "mul r7, r6, r7\n\t"
  90993. "adds r4, r4, r7\n\t"
  90994. "adc r5, r5, #0\n\t"
  90995. "lsl r7, r8, #16\n\t"
  90996. "lsr r7, r7, #16\n\t"
  90997. "mul r6, r7, r6\n\t"
  90998. "lsr r7, r6, #16\n\t"
  90999. "lsl r6, r6, #16\n\t"
  91000. "adds r3, r3, r6\n\t"
  91001. "adcs r4, r4, r7\n\t"
  91002. "adc r5, r5, #0\n\t"
  91003. #else
  91004. "umull r6, r7, %[b], r8\n\t"
  91005. "adds r3, r3, r6\n\t"
  91006. "adcs r4, r4, r7\n\t"
  91007. "mov r5, #0\n\t"
  91008. "adc r5, r5, #0\n\t"
  91009. #endif
  91010. "str r3, [%[r]], #4\n\t"
  91011. /* A[7] * B */
  91012. "ldr r8, [%[a]], #4\n\t"
  91013. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  91014. "lsl r6, %[b], #16\n\t"
  91015. "lsl r7, r8, #16\n\t"
  91016. "lsr r6, r6, #16\n\t"
  91017. "lsr r7, r7, #16\n\t"
  91018. "mul r7, r6, r7\n\t"
  91019. "adds r4, r4, r7\n\t"
  91020. "adcs r5, r5, #0\n\t"
  91021. "mov r3, #0\n\t"
  91022. "adc r3, r3, #0\n\t"
  91023. "lsr r7, r8, #16\n\t"
  91024. "mul r6, r7, r6\n\t"
  91025. "lsr r7, r6, #16\n\t"
  91026. "lsl r6, r6, #16\n\t"
  91027. "adds r4, r4, r6\n\t"
  91028. "adcs r5, r5, r7\n\t"
  91029. "adc r3, r3, #0\n\t"
  91030. "lsr r6, %[b], #16\n\t"
  91031. "lsr r7, r8, #16\n\t"
  91032. "mul r7, r6, r7\n\t"
  91033. "adds r5, r5, r7\n\t"
  91034. "adc r3, r3, #0\n\t"
  91035. "lsl r7, r8, #16\n\t"
  91036. "lsr r7, r7, #16\n\t"
  91037. "mul r6, r7, r6\n\t"
  91038. "lsr r7, r6, #16\n\t"
  91039. "lsl r6, r6, #16\n\t"
  91040. "adds r4, r4, r6\n\t"
  91041. "adcs r5, r5, r7\n\t"
  91042. "adc r3, r3, #0\n\t"
  91043. #else
  91044. "umull r6, r7, %[b], r8\n\t"
  91045. "adds r4, r4, r6\n\t"
  91046. "adcs r5, r5, r7\n\t"
  91047. "mov r3, #0\n\t"
  91048. "adc r3, r3, #0\n\t"
  91049. #endif
  91050. "str r4, [%[r]], #4\n\t"
  91051. /* A[8] * B */
  91052. "ldr r8, [%[a]], #4\n\t"
  91053. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  91054. "lsl r6, %[b], #16\n\t"
  91055. "lsl r7, r8, #16\n\t"
  91056. "lsr r6, r6, #16\n\t"
  91057. "lsr r7, r7, #16\n\t"
  91058. "mul r7, r6, r7\n\t"
  91059. "adds r5, r5, r7\n\t"
  91060. "adcs r3, r3, #0\n\t"
  91061. "mov r4, #0\n\t"
  91062. "adc r4, r4, #0\n\t"
  91063. "lsr r7, r8, #16\n\t"
  91064. "mul r6, r7, r6\n\t"
  91065. "lsr r7, r6, #16\n\t"
  91066. "lsl r6, r6, #16\n\t"
  91067. "adds r5, r5, r6\n\t"
  91068. "adcs r3, r3, r7\n\t"
  91069. "adc r4, r4, #0\n\t"
  91070. "lsr r6, %[b], #16\n\t"
  91071. "lsr r7, r8, #16\n\t"
  91072. "mul r7, r6, r7\n\t"
  91073. "adds r3, r3, r7\n\t"
  91074. "adc r4, r4, #0\n\t"
  91075. "lsl r7, r8, #16\n\t"
  91076. "lsr r7, r7, #16\n\t"
  91077. "mul r6, r7, r6\n\t"
  91078. "lsr r7, r6, #16\n\t"
  91079. "lsl r6, r6, #16\n\t"
  91080. "adds r5, r5, r6\n\t"
  91081. "adcs r3, r3, r7\n\t"
  91082. "adc r4, r4, #0\n\t"
  91083. #else
  91084. "umull r6, r7, %[b], r8\n\t"
  91085. "adds r5, r5, r6\n\t"
  91086. "adcs r3, r3, r7\n\t"
  91087. "mov r4, #0\n\t"
  91088. "adc r4, r4, #0\n\t"
  91089. #endif
  91090. "str r5, [%[r]], #4\n\t"
  91091. /* A[9] * B */
  91092. "ldr r8, [%[a]], #4\n\t"
  91093. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  91094. "lsl r6, %[b], #16\n\t"
  91095. "lsl r7, r8, #16\n\t"
  91096. "lsr r6, r6, #16\n\t"
  91097. "lsr r7, r7, #16\n\t"
  91098. "mul r7, r6, r7\n\t"
  91099. "adds r3, r3, r7\n\t"
  91100. "adcs r4, r4, #0\n\t"
  91101. "mov r5, #0\n\t"
  91102. "adc r5, r5, #0\n\t"
  91103. "lsr r7, r8, #16\n\t"
  91104. "mul r6, r7, r6\n\t"
  91105. "lsr r7, r6, #16\n\t"
  91106. "lsl r6, r6, #16\n\t"
  91107. "adds r3, r3, r6\n\t"
  91108. "adcs r4, r4, r7\n\t"
  91109. "adc r5, r5, #0\n\t"
  91110. "lsr r6, %[b], #16\n\t"
  91111. "lsr r7, r8, #16\n\t"
  91112. "mul r7, r6, r7\n\t"
  91113. "adds r4, r4, r7\n\t"
  91114. "adc r5, r5, #0\n\t"
  91115. "lsl r7, r8, #16\n\t"
  91116. "lsr r7, r7, #16\n\t"
  91117. "mul r6, r7, r6\n\t"
  91118. "lsr r7, r6, #16\n\t"
  91119. "lsl r6, r6, #16\n\t"
  91120. "adds r3, r3, r6\n\t"
  91121. "adcs r4, r4, r7\n\t"
  91122. "adc r5, r5, #0\n\t"
  91123. #else
  91124. "umull r6, r7, %[b], r8\n\t"
  91125. "adds r3, r3, r6\n\t"
  91126. "adcs r4, r4, r7\n\t"
  91127. "mov r5, #0\n\t"
  91128. "adc r5, r5, #0\n\t"
  91129. #endif
  91130. "str r3, [%[r]], #4\n\t"
  91131. /* A[10] * B */
  91132. "ldr r8, [%[a]], #4\n\t"
  91133. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  91134. "lsl r6, %[b], #16\n\t"
  91135. "lsl r7, r8, #16\n\t"
  91136. "lsr r6, r6, #16\n\t"
  91137. "lsr r7, r7, #16\n\t"
  91138. "mul r7, r6, r7\n\t"
  91139. "adds r4, r4, r7\n\t"
  91140. "adcs r5, r5, #0\n\t"
  91141. "mov r3, #0\n\t"
  91142. "adc r3, r3, #0\n\t"
  91143. "lsr r7, r8, #16\n\t"
  91144. "mul r6, r7, r6\n\t"
  91145. "lsr r7, r6, #16\n\t"
  91146. "lsl r6, r6, #16\n\t"
  91147. "adds r4, r4, r6\n\t"
  91148. "adcs r5, r5, r7\n\t"
  91149. "adc r3, r3, #0\n\t"
  91150. "lsr r6, %[b], #16\n\t"
  91151. "lsr r7, r8, #16\n\t"
  91152. "mul r7, r6, r7\n\t"
  91153. "adds r5, r5, r7\n\t"
  91154. "adc r3, r3, #0\n\t"
  91155. "lsl r7, r8, #16\n\t"
  91156. "lsr r7, r7, #16\n\t"
  91157. "mul r6, r7, r6\n\t"
  91158. "lsr r7, r6, #16\n\t"
  91159. "lsl r6, r6, #16\n\t"
  91160. "adds r4, r4, r6\n\t"
  91161. "adcs r5, r5, r7\n\t"
  91162. "adc r3, r3, #0\n\t"
  91163. #else
  91164. "umull r6, r7, %[b], r8\n\t"
  91165. "adds r4, r4, r6\n\t"
  91166. "adcs r5, r5, r7\n\t"
  91167. "mov r3, #0\n\t"
  91168. "adc r3, r3, #0\n\t"
  91169. #endif
  91170. "str r4, [%[r]], #4\n\t"
  91171. /* A[11] * B */
  91172. "ldr r8, [%[a]], #4\n\t"
  91173. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  91174. "lsl r6, %[b], #16\n\t"
  91175. "lsl r7, r8, #16\n\t"
  91176. "lsr r6, r6, #16\n\t"
  91177. "lsr r7, r7, #16\n\t"
  91178. "mul r7, r6, r7\n\t"
  91179. "adds r5, r5, r7\n\t"
  91180. "adc r3, r3, #0\n\t"
  91181. "lsr r7, r8, #16\n\t"
  91182. "mul r6, r7, r6\n\t"
  91183. "lsr r7, r6, #16\n\t"
  91184. "lsl r6, r6, #16\n\t"
  91185. "adds r5, r5, r6\n\t"
  91186. "adc r3, r3, r7\n\t"
  91187. "lsr r6, %[b], #16\n\t"
  91188. "lsr r7, r8, #16\n\t"
  91189. "mul r7, r6, r7\n\t"
  91190. "add r3, r3, r7\n\t"
  91191. "lsl r7, r8, #16\n\t"
  91192. "lsr r7, r7, #16\n\t"
  91193. "mul r6, r7, r6\n\t"
  91194. "lsr r7, r6, #16\n\t"
  91195. "lsl r6, r6, #16\n\t"
  91196. "adds r5, r5, r6\n\t"
  91197. "adc r3, r3, r7\n\t"
  91198. #else
  91199. "umull r6, r7, %[b], r8\n\t"
  91200. "adds r5, r5, r6\n\t"
  91201. "adc r3, r3, r7\n\t"
  91202. #endif
  91203. "str r5, [%[r]], #4\n\t"
  91204. "str r3, [%[r]]\n\t"
  91205. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  91206. :
  91207. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10"
  91208. );
  91209. }
  91210. #endif /* WOLFSSL_SP_SMALL */
  91211. #ifdef WOLFSSL_SP_USE_UDIV
  91212. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  91213. *
  91214. * d1 The high order half of the number to divide.
  91215. * d0 The low order half of the number to divide.
  91216. * div The divisor.
  91217. * returns the result of the division.
  91218. *
  91219. * Note that this is an approximate div. It may give an answer 1 larger.
  91220. */
  91221. static sp_digit div_384_word_12(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  91222. {
  91223. register sp_digit d1 asm ("r0") = d1_p;
  91224. register sp_digit d0 asm ("r1") = d0_p;
  91225. register sp_digit div asm ("r2") = div_p;
  91226. __asm__ __volatile__ (
  91227. "lsr r6, %[div], #16\n\t"
  91228. "add lr, r6, #1\n\t"
  91229. "udiv r4, %[d1], lr\n\t"
  91230. "lsl r5, %[div], #16\n\t"
  91231. "lsl r4, r4, #16\n\t"
  91232. "umull r3, r12, %[div], r4\n\t"
  91233. "subs %[d0], %[d0], r3\n\t"
  91234. "sbc %[d1], %[d1], r12\n\t"
  91235. "subs r3, %[d1], lr\n\t"
  91236. "sbc r7, r7, r7\n\t"
  91237. "add r7, r7, #1\n\t"
  91238. "rsb r8, r7, #0\n\t"
  91239. "lsl r7, r7, #16\n\t"
  91240. "and r5, r5, r8\n\t"
  91241. "and r6, r6, r8\n\t"
  91242. "subs %[d0], %[d0], r5\n\t"
  91243. "add r4, r4, r7\n\t"
  91244. "sbc %[d1], %[d1], r6\n\t"
  91245. "lsl r12, %[d1], #16\n\t"
  91246. "lsr r3, %[d0], #16\n\t"
  91247. "orr r3, r3, r12\n\t"
  91248. "udiv r3, r3, lr\n\t"
  91249. "add r4, r4, r3\n\t"
  91250. "umull r3, r12, %[div], r3\n\t"
  91251. "subs %[d0], %[d0], r3\n\t"
  91252. "sbc %[d1], %[d1], r12\n\t"
  91253. "lsl r12, %[d1], #16\n\t"
  91254. "lsr r3, %[d0], #16\n\t"
  91255. "orr r3, r3, r12\n\t"
  91256. "udiv r3, r3, lr\n\t"
  91257. "add r4, r4, r3\n\t"
  91258. "mul r3, %[div], r3\n\t"
  91259. "sub %[d0], %[d0], r3\n\t"
  91260. "udiv r3, %[d0], %[div]\n\t"
  91261. "add %[d1], r4, r3\n\t"
  91262. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  91263. :
  91264. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  91265. );
  91266. return (uint32_t)(size_t)d1;
  91267. }
  91268. #else
  91269. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  91270. *
  91271. * d1 The high order half of the number to divide.
  91272. * d0 The low order half of the number to divide.
  91273. * div The divisor.
  91274. * returns the result of the division.
  91275. *
  91276. * Note that this is an approximate div. It may give an answer 1 larger.
  91277. */
  91278. static sp_digit div_384_word_12(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  91279. {
  91280. register sp_digit d1 asm ("r0") = d1_p;
  91281. register sp_digit d0 asm ("r1") = d0_p;
  91282. register sp_digit div asm ("r2") = div_p;
  91283. __asm__ __volatile__ (
  91284. "lsr lr, %[div], #1\n\t"
  91285. "add lr, lr, #1\n\t"
  91286. "mov r4, %[d0]\n\t"
  91287. "mov r5, %[d1]\n\t"
  91288. /* Do top 32 */
  91289. "subs r6, lr, r5\n\t"
  91290. "sbc r6, r6, r6\n\t"
  91291. "mov r3, #0\n\t"
  91292. "sub r3, r3, r6\n\t"
  91293. "and r6, r6, lr\n\t"
  91294. "subs r5, r5, r6\n\t"
  91295. /* Next 30 bits */
  91296. "mov r12, #29\n\t"
  91297. "\n"
  91298. "L_div_384_word_12_bit_%=: \n\t"
  91299. "lsls r4, r4, #1\n\t"
  91300. "adc r5, r5, r5\n\t"
  91301. "subs r6, lr, r5\n\t"
  91302. "sbc r6, r6, r6\n\t"
  91303. "add r3, r3, r3\n\t"
  91304. "sub r3, r3, r6\n\t"
  91305. "and r6, r6, lr\n\t"
  91306. "subs r5, r5, r6\n\t"
  91307. "subs r12, r12, #1\n\t"
  91308. "bpl L_div_384_word_12_bit_%=\n\t"
  91309. "add r3, r3, r3\n\t"
  91310. "add r3, r3, #1\n\t"
  91311. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  91312. "lsl r7, r3, #16\n\t"
  91313. "lsl r4, %[div], #16\n\t"
  91314. "lsr r7, r7, #16\n\t"
  91315. "lsr r4, r4, #16\n\t"
  91316. "mul r4, r7, r4\n\t"
  91317. "lsr r8, %[div], #16\n\t"
  91318. "mul r7, r8, r7\n\t"
  91319. "lsr r5, r7, #16\n\t"
  91320. "lsl r7, r7, #16\n\t"
  91321. "adds r4, r4, r7\n\t"
  91322. "adc r5, r5, #0\n\t"
  91323. "lsr r7, r3, #16\n\t"
  91324. "mul r8, r7, r8\n\t"
  91325. "add r5, r5, r8\n\t"
  91326. "lsl r8, %[div], #16\n\t"
  91327. "lsr r8, r8, #16\n\t"
  91328. "mul r7, r8, r7\n\t"
  91329. "lsr r8, r7, #16\n\t"
  91330. "lsl r7, r7, #16\n\t"
  91331. "adds r4, r4, r7\n\t"
  91332. "adc r5, r5, r8\n\t"
  91333. #else
  91334. "umull r4, r5, r3, %[div]\n\t"
  91335. #endif
  91336. "subs r7, %[d0], r4\n\t"
  91337. "sbc r8, %[d1], r5\n\t"
  91338. "add r3, r3, r8\n\t"
  91339. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  91340. "lsl r7, r3, #16\n\t"
  91341. "lsl r4, %[div], #16\n\t"
  91342. "lsr r7, r7, #16\n\t"
  91343. "lsr r4, r4, #16\n\t"
  91344. "mul r4, r7, r4\n\t"
  91345. "lsr r8, %[div], #16\n\t"
  91346. "mul r7, r8, r7\n\t"
  91347. "lsr r5, r7, #16\n\t"
  91348. "lsl r7, r7, #16\n\t"
  91349. "adds r4, r4, r7\n\t"
  91350. "adc r5, r5, #0\n\t"
  91351. "lsr r7, r3, #16\n\t"
  91352. "mul r8, r7, r8\n\t"
  91353. "add r5, r5, r8\n\t"
  91354. "lsl r8, %[div], #16\n\t"
  91355. "lsr r8, r8, #16\n\t"
  91356. "mul r7, r8, r7\n\t"
  91357. "lsr r8, r7, #16\n\t"
  91358. "lsl r7, r7, #16\n\t"
  91359. "adds r4, r4, r7\n\t"
  91360. "adc r5, r5, r8\n\t"
  91361. #else
  91362. "umull r4, r5, r3, %[div]\n\t"
  91363. #endif
  91364. "subs r7, %[d0], r4\n\t"
  91365. "sbc r8, %[d1], r5\n\t"
  91366. "add r3, r3, r8\n\t"
  91367. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  91368. "lsl r7, r3, #16\n\t"
  91369. "lsl r4, %[div], #16\n\t"
  91370. "lsr r7, r7, #16\n\t"
  91371. "lsr r4, r4, #16\n\t"
  91372. "mul r4, r7, r4\n\t"
  91373. "lsr r8, %[div], #16\n\t"
  91374. "mul r7, r8, r7\n\t"
  91375. "lsr r5, r7, #16\n\t"
  91376. "lsl r7, r7, #16\n\t"
  91377. "adds r4, r4, r7\n\t"
  91378. "adc r5, r5, #0\n\t"
  91379. "lsr r7, r3, #16\n\t"
  91380. "mul r8, r7, r8\n\t"
  91381. "add r5, r5, r8\n\t"
  91382. "lsl r8, %[div], #16\n\t"
  91383. "lsr r8, r8, #16\n\t"
  91384. "mul r7, r8, r7\n\t"
  91385. "lsr r8, r7, #16\n\t"
  91386. "lsl r7, r7, #16\n\t"
  91387. "adds r4, r4, r7\n\t"
  91388. "adc r5, r5, r8\n\t"
  91389. #else
  91390. "umull r4, r5, r3, %[div]\n\t"
  91391. #endif
  91392. "subs r7, %[d0], r4\n\t"
  91393. "sbc r8, %[d1], r5\n\t"
  91394. "add r3, r3, r8\n\t"
  91395. "subs r6, %[div], r7\n\t"
  91396. "sbc r6, r6, r6\n\t"
  91397. "sub %[d1], r3, r6\n\t"
  91398. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  91399. :
  91400. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  91401. );
  91402. return (uint32_t)(size_t)d1;
  91403. }
  91404. #endif
  91405. /* AND m into each word of a and store in r.
  91406. *
  91407. * r A single precision integer.
  91408. * a A single precision integer.
  91409. * m Mask to AND against each digit.
  91410. */
  91411. static void sp_384_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  91412. {
  91413. #ifdef WOLFSSL_SP_SMALL
  91414. int i;
  91415. for (i=0; i<12; i++) {
  91416. r[i] = a[i] & m;
  91417. }
  91418. #else
  91419. r[0] = a[0] & m;
  91420. r[1] = a[1] & m;
  91421. r[2] = a[2] & m;
  91422. r[3] = a[3] & m;
  91423. r[4] = a[4] & m;
  91424. r[5] = a[5] & m;
  91425. r[6] = a[6] & m;
  91426. r[7] = a[7] & m;
  91427. r[8] = a[8] & m;
  91428. r[9] = a[9] & m;
  91429. r[10] = a[10] & m;
  91430. r[11] = a[11] & m;
  91431. #endif
  91432. }
  91433. /* Divide d in a and put remainder into r (m*d + r = a)
  91434. * m is not calculated as it is not needed at this time.
  91435. *
  91436. * a Number to be divided.
  91437. * d Number to divide with.
  91438. * m Multiplier result.
  91439. * r Remainder from the division.
  91440. * returns MP_OKAY indicating success.
  91441. */
  91442. static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d, sp_digit* m,
  91443. sp_digit* r)
  91444. {
  91445. sp_digit t1[24], t2[13];
  91446. sp_digit div, r1;
  91447. int i;
  91448. (void)m;
  91449. div = d[11];
  91450. XMEMCPY(t1, a, sizeof(*t1) * 2 * 12);
  91451. r1 = sp_384_cmp_12(&t1[12], d) >= 0;
  91452. sp_384_cond_sub_12(&t1[12], &t1[12], d, (sp_digit)0 - r1);
  91453. for (i = 11; i >= 0; i--) {
  91454. volatile sp_digit mask = (sp_digit)0 - (t1[12 + i] == div);
  91455. sp_digit hi = t1[12 + i] + mask;
  91456. r1 = div_384_word_12(hi, t1[12 + i - 1], div);
  91457. r1 |= mask;
  91458. sp_384_mul_d_12(t2, d, r1);
  91459. t1[12 + i] += sp_384_sub_in_place_12(&t1[i], t2);
  91460. t1[12 + i] -= t2[12];
  91461. sp_384_mask_12(t2, d, t1[12 + i]);
  91462. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  91463. sp_384_mask_12(t2, d, t1[12 + i]);
  91464. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  91465. }
  91466. r1 = sp_384_cmp_12(t1, d) >= 0;
  91467. sp_384_cond_sub_12(r, t1, d, (sp_digit)0 - r1);
  91468. return MP_OKAY;
  91469. }
  91470. /* Reduce a modulo m into r. (r = a mod m)
  91471. *
  91472. * r A single precision number that is the reduced result.
  91473. * a A single precision number that is to be reduced.
  91474. * m A single precision number that is the modulus to reduce with.
  91475. * returns MP_OKAY indicating success.
  91476. */
  91477. static WC_INLINE int sp_384_mod_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  91478. {
  91479. return sp_384_div_12(a, m, NULL, r);
  91480. }
  91481. #endif
  91482. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  91483. /* Multiply two number mod the order of P384 curve. (r = a * b mod order)
  91484. *
  91485. * r Result of the multiplication.
  91486. * a First operand of the multiplication.
  91487. * b Second operand of the multiplication.
  91488. */
  91489. static void sp_384_mont_mul_order_12(sp_digit* r, const sp_digit* a, const sp_digit* b)
  91490. {
  91491. sp_384_mul_12(r, a, b);
  91492. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  91493. }
  91494. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  91495. #ifdef WOLFSSL_SP_SMALL
  91496. /* Order-2 for the P384 curve. */
  91497. static const uint32_t p384_order_minus_2[12] = {
  91498. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U,
  91499. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  91500. };
  91501. #else
  91502. /* The low half of the order-2 of the P384 curve. */
  91503. static const uint32_t p384_order_low[6] = {
  91504. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U
  91505. };
  91506. #endif /* WOLFSSL_SP_SMALL */
  91507. /* Square number mod the order of P384 curve. (r = a * a mod order)
  91508. *
  91509. * r Result of the squaring.
  91510. * a Number to square.
  91511. */
  91512. static void sp_384_mont_sqr_order_12(sp_digit* r, const sp_digit* a)
  91513. {
  91514. sp_384_sqr_12(r, a);
  91515. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  91516. }
  91517. #ifndef WOLFSSL_SP_SMALL
  91518. /* Square number mod the order of P384 curve a number of times.
  91519. * (r = a ^ n mod order)
  91520. *
  91521. * r Result of the squaring.
  91522. * a Number to square.
  91523. */
  91524. static void sp_384_mont_sqr_n_order_12(sp_digit* r, const sp_digit* a, int n)
  91525. {
  91526. int i;
  91527. sp_384_mont_sqr_order_12(r, a);
  91528. for (i=1; i<n; i++) {
  91529. sp_384_mont_sqr_order_12(r, r);
  91530. }
  91531. }
  91532. #endif /* !WOLFSSL_SP_SMALL */
  91533. /* Invert the number, in Montgomery form, modulo the order of the P384 curve.
  91534. * (r = 1 / a mod order)
  91535. *
  91536. * r Inverse result.
  91537. * a Number to invert.
  91538. * td Temporary data.
  91539. */
  91540. #ifdef WOLFSSL_SP_NONBLOCK
  91541. typedef struct sp_384_mont_inv_order_12_ctx {
  91542. int state;
  91543. int i;
  91544. } sp_384_mont_inv_order_12_ctx;
  91545. static int sp_384_mont_inv_order_12_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  91546. sp_digit* t)
  91547. {
  91548. int err = FP_WOULDBLOCK;
  91549. sp_384_mont_inv_order_12_ctx* ctx = (sp_384_mont_inv_order_12_ctx*)sp_ctx;
  91550. typedef char ctx_size_test[sizeof(sp_384_mont_inv_order_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  91551. (void)sizeof(ctx_size_test);
  91552. switch (ctx->state) {
  91553. case 0:
  91554. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  91555. ctx->i = 382;
  91556. ctx->state = 1;
  91557. break;
  91558. case 1:
  91559. sp_384_mont_sqr_order_12(t, t);
  91560. ctx->state = 2;
  91561. break;
  91562. case 2:
  91563. if ((p384_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  91564. sp_384_mont_mul_order_12(t, t, a);
  91565. }
  91566. ctx->i--;
  91567. ctx->state = (ctx->i == 0) ? 3 : 1;
  91568. break;
  91569. case 3:
  91570. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  91571. err = MP_OKAY;
  91572. break;
  91573. }
  91574. return err;
  91575. }
  91576. #endif /* WOLFSSL_SP_NONBLOCK */
  91577. static void sp_384_mont_inv_order_12(sp_digit* r, const sp_digit* a,
  91578. sp_digit* td)
  91579. {
  91580. #ifdef WOLFSSL_SP_SMALL
  91581. sp_digit* t = td;
  91582. int i;
  91583. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  91584. for (i=382; i>=0; i--) {
  91585. sp_384_mont_sqr_order_12(t, t);
  91586. if ((p384_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  91587. sp_384_mont_mul_order_12(t, t, a);
  91588. }
  91589. }
  91590. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  91591. #else
  91592. sp_digit* t = td;
  91593. sp_digit* t2 = td + 2 * 12;
  91594. sp_digit* t3 = td + 4 * 12;
  91595. int i;
  91596. /* t = a^2 */
  91597. sp_384_mont_sqr_order_12(t, a);
  91598. /* t = a^3 = t * a */
  91599. sp_384_mont_mul_order_12(t, t, a);
  91600. /* t2= a^c = t ^ 2 ^ 2 */
  91601. sp_384_mont_sqr_n_order_12(t2, t, 2);
  91602. /* t = a^f = t2 * t */
  91603. sp_384_mont_mul_order_12(t, t2, t);
  91604. /* t2= a^f0 = t ^ 2 ^ 4 */
  91605. sp_384_mont_sqr_n_order_12(t2, t, 4);
  91606. /* t = a^ff = t2 * t */
  91607. sp_384_mont_mul_order_12(t, t2, t);
  91608. /* t2= a^ff00 = t ^ 2 ^ 8 */
  91609. sp_384_mont_sqr_n_order_12(t2, t, 8);
  91610. /* t3= a^ffff = t2 * t */
  91611. sp_384_mont_mul_order_12(t3, t2, t);
  91612. /* t2= a^ffff0000 = t3 ^ 2 ^ 16 */
  91613. sp_384_mont_sqr_n_order_12(t2, t3, 16);
  91614. /* t = a^ffffffff = t2 * t3 */
  91615. sp_384_mont_mul_order_12(t, t2, t3);
  91616. /* t2= a^ffffffff0000 = t ^ 2 ^ 16 */
  91617. sp_384_mont_sqr_n_order_12(t2, t, 16);
  91618. /* t = a^ffffffffffff = t2 * t3 */
  91619. sp_384_mont_mul_order_12(t, t2, t3);
  91620. /* t2= a^ffffffffffff000000000000 = t ^ 2 ^ 48 */
  91621. sp_384_mont_sqr_n_order_12(t2, t, 48);
  91622. /* t= a^fffffffffffffffffffffffff = t2 * t */
  91623. sp_384_mont_mul_order_12(t, t2, t);
  91624. /* t2= a^ffffffffffffffffffffffff000000000000000000000000 */
  91625. sp_384_mont_sqr_n_order_12(t2, t, 96);
  91626. /* t2= a^ffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  91627. sp_384_mont_mul_order_12(t2, t2, t);
  91628. for (i=191; i>=1; i--) {
  91629. sp_384_mont_sqr_order_12(t2, t2);
  91630. if ((p384_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  91631. sp_384_mont_mul_order_12(t2, t2, a);
  91632. }
  91633. }
  91634. sp_384_mont_sqr_order_12(t2, t2);
  91635. sp_384_mont_mul_order_12(r, t2, a);
  91636. #endif /* WOLFSSL_SP_SMALL */
  91637. }
  91638. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  91639. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  91640. #ifdef HAVE_ECC_SIGN
  91641. #ifndef SP_ECC_MAX_SIG_GEN
  91642. #define SP_ECC_MAX_SIG_GEN 64
  91643. #endif
  91644. /* Calculate second signature value S from R, k and private value.
  91645. *
  91646. * s = (r * x + e) / k
  91647. *
  91648. * s Signature value.
  91649. * r First signature value.
  91650. * k Ephemeral private key.
  91651. * x Private key as a number.
  91652. * e Hash of message as a number.
  91653. * tmp Temporary storage for intermediate numbers.
  91654. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  91655. */
  91656. static int sp_384_calc_s_12(sp_digit* s, const sp_digit* r, sp_digit* k,
  91657. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  91658. {
  91659. int err;
  91660. sp_digit carry;
  91661. sp_int32 c;
  91662. sp_digit* kInv = k;
  91663. /* Conv k to Montgomery form (mod order) */
  91664. sp_384_mul_12(k, k, p384_norm_order);
  91665. err = sp_384_mod_12(k, k, p384_order);
  91666. if (err == MP_OKAY) {
  91667. sp_384_norm_12(k);
  91668. /* kInv = 1/k mod order */
  91669. sp_384_mont_inv_order_12(kInv, k, tmp);
  91670. sp_384_norm_12(kInv);
  91671. /* s = r * x + e */
  91672. sp_384_mul_12(x, x, r);
  91673. err = sp_384_mod_12(x, x, p384_order);
  91674. }
  91675. if (err == MP_OKAY) {
  91676. sp_384_norm_12(x);
  91677. carry = sp_384_add_12(s, e, x);
  91678. sp_384_cond_sub_12(s, s, p384_order, 0 - carry);
  91679. sp_384_norm_12(s);
  91680. c = sp_384_cmp_12(s, p384_order);
  91681. sp_384_cond_sub_12(s, s, p384_order,
  91682. (sp_digit)0 - (sp_digit)(c >= 0));
  91683. sp_384_norm_12(s);
  91684. /* s = s * k^-1 mod order */
  91685. sp_384_mont_mul_order_12(s, s, kInv);
  91686. sp_384_norm_12(s);
  91687. }
  91688. return err;
  91689. }
  91690. /* Sign the hash using the private key.
  91691. * e = [hash, 384 bits] from binary
  91692. * r = (k.G)->x mod order
  91693. * s = (r * x + e) / k mod order
  91694. * The hash is truncated to the first 384 bits.
  91695. *
  91696. * hash Hash to sign.
  91697. * hashLen Length of the hash data.
  91698. * rng Random number generator.
  91699. * priv Private part of key - scalar.
  91700. * rm First part of result as an mp_int.
  91701. * sm Sirst part of result as an mp_int.
  91702. * heap Heap to use for allocation.
  91703. * returns RNG failures, MEMORY_E when memory allocation fails and
  91704. * MP_OKAY on success.
  91705. */
  91706. int sp_ecc_sign_384(const byte* hash, word32 hashLen, WC_RNG* rng,
  91707. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  91708. {
  91709. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91710. sp_digit* e = NULL;
  91711. sp_point_384* point = NULL;
  91712. #else
  91713. sp_digit e[7 * 2 * 12];
  91714. sp_point_384 point[1];
  91715. #endif
  91716. sp_digit* x = NULL;
  91717. sp_digit* k = NULL;
  91718. sp_digit* r = NULL;
  91719. sp_digit* tmp = NULL;
  91720. sp_digit* s = NULL;
  91721. sp_int32 c;
  91722. int err = MP_OKAY;
  91723. int i;
  91724. (void)heap;
  91725. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91726. if (err == MP_OKAY) {
  91727. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  91728. DYNAMIC_TYPE_ECC);
  91729. if (point == NULL)
  91730. err = MEMORY_E;
  91731. }
  91732. if (err == MP_OKAY) {
  91733. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 12, heap,
  91734. DYNAMIC_TYPE_ECC);
  91735. if (e == NULL)
  91736. err = MEMORY_E;
  91737. }
  91738. #endif
  91739. if (err == MP_OKAY) {
  91740. x = e + 2 * 12;
  91741. k = e + 4 * 12;
  91742. r = e + 6 * 12;
  91743. tmp = e + 8 * 12;
  91744. s = e;
  91745. if (hashLen > 48U) {
  91746. hashLen = 48U;
  91747. }
  91748. }
  91749. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  91750. /* New random point. */
  91751. if (km == NULL || mp_iszero(km)) {
  91752. err = sp_384_ecc_gen_k_12(rng, k);
  91753. }
  91754. else {
  91755. sp_384_from_mp(k, 12, km);
  91756. mp_zero(km);
  91757. }
  91758. if (err == MP_OKAY) {
  91759. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, heap);
  91760. }
  91761. if (err == MP_OKAY) {
  91762. /* r = point->x mod order */
  91763. XMEMCPY(r, point->x, sizeof(sp_digit) * 12U);
  91764. sp_384_norm_12(r);
  91765. c = sp_384_cmp_12(r, p384_order);
  91766. sp_384_cond_sub_12(r, r, p384_order,
  91767. (sp_digit)0 - (sp_digit)(c >= 0));
  91768. sp_384_norm_12(r);
  91769. sp_384_from_mp(x, 12, priv);
  91770. sp_384_from_bin(e, 12, hash, (int)hashLen);
  91771. err = sp_384_calc_s_12(s, r, k, x, e, tmp);
  91772. }
  91773. /* Check that signature is usable. */
  91774. if ((err == MP_OKAY) && (sp_384_iszero_12(s) == 0)) {
  91775. break;
  91776. }
  91777. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  91778. i = 1;
  91779. #endif
  91780. }
  91781. if (i == 0) {
  91782. err = RNG_FAILURE_E;
  91783. }
  91784. if (err == MP_OKAY) {
  91785. err = sp_384_to_mp(r, rm);
  91786. }
  91787. if (err == MP_OKAY) {
  91788. err = sp_384_to_mp(s, sm);
  91789. }
  91790. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91791. if (e != NULL)
  91792. #endif
  91793. {
  91794. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 12);
  91795. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91796. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  91797. #endif
  91798. }
  91799. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91800. if (point != NULL)
  91801. #endif
  91802. {
  91803. ForceZero(point, sizeof(sp_point_384));
  91804. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91805. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  91806. #endif
  91807. }
  91808. return err;
  91809. }
  91810. #ifdef WOLFSSL_SP_NONBLOCK
  91811. typedef struct sp_ecc_sign_384_ctx {
  91812. int state;
  91813. union {
  91814. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  91815. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  91816. };
  91817. sp_digit e[2*12];
  91818. sp_digit x[2*12];
  91819. sp_digit k[2*12];
  91820. sp_digit r[2*12];
  91821. sp_digit tmp[3 * 2*12];
  91822. sp_point_384 point;
  91823. sp_digit* s;
  91824. sp_digit* kInv;
  91825. int i;
  91826. } sp_ecc_sign_384_ctx;
  91827. int sp_ecc_sign_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  91828. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  91829. {
  91830. int err = FP_WOULDBLOCK;
  91831. sp_ecc_sign_384_ctx* ctx = (sp_ecc_sign_384_ctx*)sp_ctx->data;
  91832. typedef char ctx_size_test[sizeof(sp_ecc_sign_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  91833. (void)sizeof(ctx_size_test);
  91834. switch (ctx->state) {
  91835. case 0: /* INIT */
  91836. ctx->s = ctx->e;
  91837. ctx->kInv = ctx->k;
  91838. ctx->i = SP_ECC_MAX_SIG_GEN;
  91839. ctx->state = 1;
  91840. break;
  91841. case 1: /* GEN */
  91842. /* New random point. */
  91843. if (km == NULL || mp_iszero(km)) {
  91844. err = sp_384_ecc_gen_k_12(rng, ctx->k);
  91845. }
  91846. else {
  91847. sp_384_from_mp(ctx->k, 12, km);
  91848. mp_zero(km);
  91849. }
  91850. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  91851. ctx->state = 2;
  91852. break;
  91853. case 2: /* MULMOD */
  91854. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  91855. &ctx->point, &p384_base, ctx->k, 1, 1, heap);
  91856. if (err == MP_OKAY) {
  91857. ctx->state = 3;
  91858. }
  91859. break;
  91860. case 3: /* MODORDER */
  91861. {
  91862. sp_int32 c;
  91863. /* r = point->x mod order */
  91864. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 12U);
  91865. sp_384_norm_12(ctx->r);
  91866. c = sp_384_cmp_12(ctx->r, p384_order);
  91867. sp_384_cond_sub_12(ctx->r, ctx->r, p384_order,
  91868. (sp_digit)0 - (sp_digit)(c >= 0));
  91869. sp_384_norm_12(ctx->r);
  91870. if (hashLen > 48U) {
  91871. hashLen = 48U;
  91872. }
  91873. sp_384_from_mp(ctx->x, 12, priv);
  91874. sp_384_from_bin(ctx->e, 12, hash, (int)hashLen);
  91875. ctx->state = 4;
  91876. break;
  91877. }
  91878. case 4: /* KMODORDER */
  91879. /* Conv k to Montgomery form (mod order) */
  91880. sp_384_mul_12(ctx->k, ctx->k, p384_norm_order);
  91881. err = sp_384_mod_12(ctx->k, ctx->k, p384_order);
  91882. if (err == MP_OKAY) {
  91883. sp_384_norm_12(ctx->k);
  91884. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  91885. ctx->state = 5;
  91886. }
  91887. break;
  91888. case 5: /* KINV */
  91889. /* kInv = 1/k mod order */
  91890. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  91891. if (err == MP_OKAY) {
  91892. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  91893. ctx->state = 6;
  91894. }
  91895. break;
  91896. case 6: /* KINVNORM */
  91897. sp_384_norm_12(ctx->kInv);
  91898. ctx->state = 7;
  91899. break;
  91900. case 7: /* R */
  91901. /* s = r * x + e */
  91902. sp_384_mul_12(ctx->x, ctx->x, ctx->r);
  91903. ctx->state = 8;
  91904. break;
  91905. case 8: /* S1 */
  91906. err = sp_384_mod_12(ctx->x, ctx->x, p384_order);
  91907. if (err == MP_OKAY)
  91908. ctx->state = 9;
  91909. break;
  91910. case 9: /* S2 */
  91911. {
  91912. sp_digit carry;
  91913. sp_int32 c;
  91914. sp_384_norm_12(ctx->x);
  91915. carry = sp_384_add_12(ctx->s, ctx->e, ctx->x);
  91916. sp_384_cond_sub_12(ctx->s, ctx->s,
  91917. p384_order, 0 - carry);
  91918. sp_384_norm_12(ctx->s);
  91919. c = sp_384_cmp_12(ctx->s, p384_order);
  91920. sp_384_cond_sub_12(ctx->s, ctx->s, p384_order,
  91921. (sp_digit)0 - (sp_digit)(c >= 0));
  91922. sp_384_norm_12(ctx->s);
  91923. /* s = s * k^-1 mod order */
  91924. sp_384_mont_mul_order_12(ctx->s, ctx->s, ctx->kInv);
  91925. sp_384_norm_12(ctx->s);
  91926. /* Check that signature is usable. */
  91927. if (sp_384_iszero_12(ctx->s) == 0) {
  91928. ctx->state = 10;
  91929. break;
  91930. }
  91931. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  91932. ctx->i = 1;
  91933. #endif
  91934. /* not usable gen, try again */
  91935. ctx->i--;
  91936. if (ctx->i == 0) {
  91937. err = RNG_FAILURE_E;
  91938. }
  91939. ctx->state = 1;
  91940. break;
  91941. }
  91942. case 10: /* RES */
  91943. err = sp_384_to_mp(ctx->r, rm);
  91944. if (err == MP_OKAY) {
  91945. err = sp_384_to_mp(ctx->s, sm);
  91946. }
  91947. break;
  91948. }
  91949. if (err == MP_OKAY && ctx->state != 10) {
  91950. err = FP_WOULDBLOCK;
  91951. }
  91952. if (err != FP_WOULDBLOCK) {
  91953. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 12U);
  91954. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 12U);
  91955. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 12U);
  91956. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 12U);
  91957. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 12U);
  91958. }
  91959. return err;
  91960. }
  91961. #endif /* WOLFSSL_SP_NONBLOCK */
  91962. #endif /* HAVE_ECC_SIGN */
  91963. #ifndef WOLFSSL_SP_SMALL
  91964. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  91965. *
  91966. * r Result of division by 2.
  91967. * a Number to divide.
  91968. * m Modulus.
  91969. */
  91970. static void sp_384_div2_mod_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  91971. {
  91972. register sp_digit* r asm ("r0") = r_p;
  91973. register const sp_digit* a asm ("r1") = a_p;
  91974. register const sp_digit* m asm ("r2") = m_p;
  91975. __asm__ __volatile__ (
  91976. "ldr r4, [%[a]], #4\n\t"
  91977. "ands r3, r4, #1\n\t"
  91978. "beq L_sp_384_div2_mod_12_even_%=\n\t"
  91979. "mov r12, #0\n\t"
  91980. "ldm %[a]!, {r5, r6, r7}\n\t"
  91981. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  91982. "adds r4, r4, r8\n\t"
  91983. "adcs r5, r5, r9\n\t"
  91984. "adcs r6, r6, r10\n\t"
  91985. "adcs r7, r7, r11\n\t"
  91986. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  91987. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  91988. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  91989. "adcs r4, r4, r8\n\t"
  91990. "adcs r5, r5, r9\n\t"
  91991. "adcs r6, r6, r10\n\t"
  91992. "adcs r7, r7, r11\n\t"
  91993. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  91994. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  91995. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  91996. "adcs r4, r4, r8\n\t"
  91997. "adcs r5, r5, r9\n\t"
  91998. "adcs r6, r6, r10\n\t"
  91999. "adcs r7, r7, r11\n\t"
  92000. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  92001. "adc r3, r12, r12\n\t"
  92002. "b L_sp_384_div2_mod_12_div2_%=\n\t"
  92003. "\n"
  92004. "L_sp_384_div2_mod_12_even_%=: \n\t"
  92005. "ldm %[a]!, {r5, r6, r7}\n\t"
  92006. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  92007. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  92008. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  92009. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  92010. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  92011. "\n"
  92012. "L_sp_384_div2_mod_12_div2_%=: \n\t"
  92013. "sub %[r], #48\n\t"
  92014. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92015. "ldr r8, [%[r]]\n\t"
  92016. "ldr r9, [%[r], #4]\n\t"
  92017. #else
  92018. "ldrd r8, r9, [%[r]]\n\t"
  92019. #endif
  92020. "lsr r8, r8, #1\n\t"
  92021. "orr r8, r8, r9, lsl #31\n\t"
  92022. "lsr r9, r9, #1\n\t"
  92023. "ldr r10, [%[r], #8]\n\t"
  92024. "str r8, [%[r]]\n\t"
  92025. "orr r9, r9, r10, lsl #31\n\t"
  92026. "lsr r10, r10, #1\n\t"
  92027. "ldr r8, [%[r], #12]\n\t"
  92028. "str r9, [%[r], #4]\n\t"
  92029. "orr r10, r10, r8, lsl #31\n\t"
  92030. "lsr r8, r8, #1\n\t"
  92031. "ldr r9, [%[r], #16]\n\t"
  92032. "str r10, [%[r], #8]\n\t"
  92033. "orr r8, r8, r9, lsl #31\n\t"
  92034. "lsr r9, r9, #1\n\t"
  92035. "ldr r10, [%[r], #20]\n\t"
  92036. "str r8, [%[r], #12]\n\t"
  92037. "orr r9, r9, r10, lsl #31\n\t"
  92038. "lsr r10, r10, #1\n\t"
  92039. "ldr r8, [%[r], #24]\n\t"
  92040. "str r9, [%[r], #16]\n\t"
  92041. "orr r10, r10, r8, lsl #31\n\t"
  92042. "lsr r8, r8, #1\n\t"
  92043. "ldr r9, [%[r], #28]\n\t"
  92044. "str r10, [%[r], #20]\n\t"
  92045. "orr r8, r8, r9, lsl #31\n\t"
  92046. "lsr r9, r9, #1\n\t"
  92047. "ldr r10, [%[r], #32]\n\t"
  92048. "str r8, [%[r], #24]\n\t"
  92049. "orr r9, r9, r10, lsl #31\n\t"
  92050. "lsr r10, r10, #1\n\t"
  92051. "ldr r8, [%[r], #36]\n\t"
  92052. "str r9, [%[r], #28]\n\t"
  92053. "orr r10, r10, r8, lsl #31\n\t"
  92054. "lsr r8, r8, #1\n\t"
  92055. "ldr r9, [%[r], #40]\n\t"
  92056. "str r10, [%[r], #32]\n\t"
  92057. "orr r8, r8, r9, lsl #31\n\t"
  92058. "lsr r9, r9, #1\n\t"
  92059. "ldr r10, [%[r], #44]\n\t"
  92060. "str r8, [%[r], #36]\n\t"
  92061. "orr r9, r9, r10, lsl #31\n\t"
  92062. "lsr r10, r10, #1\n\t"
  92063. "orr r10, r10, r3, lsl #31\n\t"
  92064. "str r9, [%[r], #40]\n\t"
  92065. "str r10, [%[r], #44]\n\t"
  92066. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  92067. :
  92068. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  92069. );
  92070. }
  92071. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92072. static const unsigned char L_sp_384_num_bits_12_table[] = {
  92073. 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03,
  92074. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  92075. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  92076. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  92077. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  92078. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  92079. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  92080. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  92081. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  92082. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  92083. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  92084. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  92085. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  92086. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  92087. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  92088. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  92089. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92090. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92091. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92092. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92093. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92094. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92095. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92096. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92097. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92098. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92099. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92100. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92101. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92102. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92103. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92104. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  92105. };
  92106. static int sp_384_num_bits_12(const sp_digit* a_p)
  92107. {
  92108. register const sp_digit* a asm ("r0") = a_p;
  92109. __asm__ __volatile__ (
  92110. "mov lr, %[L_sp_384_num_bits_12_table]\n\t"
  92111. "ldr r1, [%[a], #44]\n\t"
  92112. "cmp r1, #0\n\t"
  92113. "beq L_sp_384_num_bits_12_11_%=\n\t"
  92114. "lsr r3, r1, #24\n\t"
  92115. "cmp r3, #0\n\t"
  92116. "beq L_sp_384_num_bits_12_11_3_%=\n\t"
  92117. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92118. "mov r2, #0x1\n\t"
  92119. "lsl r2, r2, #8\n\t"
  92120. "add r2, r2, #0x78\n\t"
  92121. #else
  92122. "mov r2, #0x178\n\t"
  92123. #endif
  92124. "ldrb r12, [lr, r3]\n\t"
  92125. "add r12, r2, r12\n\t"
  92126. "b L_sp_384_num_bits_12_13_%=\n\t"
  92127. "\n"
  92128. "L_sp_384_num_bits_12_11_3_%=: \n\t"
  92129. "lsr r3, r1, #16\n\t"
  92130. "and r3, r3, #0xff\n\t"
  92131. "cmp r3, #0\n\t"
  92132. "beq L_sp_384_num_bits_12_11_2_%=\n\t"
  92133. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92134. "mov r2, #0x1\n\t"
  92135. "lsl r2, r2, #8\n\t"
  92136. "add r2, r2, #0x70\n\t"
  92137. #else
  92138. "mov r2, #0x170\n\t"
  92139. #endif
  92140. "ldrb r12, [lr, r3]\n\t"
  92141. "add r12, r2, r12\n\t"
  92142. "b L_sp_384_num_bits_12_13_%=\n\t"
  92143. "\n"
  92144. "L_sp_384_num_bits_12_11_2_%=: \n\t"
  92145. "lsr r3, r1, #8\n\t"
  92146. "and r3, r3, #0xff\n\t"
  92147. "cmp r3, #0\n\t"
  92148. "beq L_sp_384_num_bits_12_11_1_%=\n\t"
  92149. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92150. "mov r2, #0x1\n\t"
  92151. "lsl r2, r2, #8\n\t"
  92152. "add r2, r2, #0x68\n\t"
  92153. #else
  92154. "mov r2, #0x168\n\t"
  92155. #endif
  92156. "ldrb r12, [lr, r3]\n\t"
  92157. "add r12, r2, r12\n\t"
  92158. "b L_sp_384_num_bits_12_13_%=\n\t"
  92159. "\n"
  92160. "L_sp_384_num_bits_12_11_1_%=: \n\t"
  92161. "and r3, r1, #0xff\n\t"
  92162. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92163. "mov r2, #0x1\n\t"
  92164. "lsl r2, r2, #8\n\t"
  92165. "add r2, r2, #0x60\n\t"
  92166. #else
  92167. "mov r2, #0x160\n\t"
  92168. #endif
  92169. "ldrb r12, [lr, r3]\n\t"
  92170. "add r12, r2, r12\n\t"
  92171. "b L_sp_384_num_bits_12_13_%=\n\t"
  92172. "\n"
  92173. "L_sp_384_num_bits_12_11_%=: \n\t"
  92174. "ldr r1, [%[a], #40]\n\t"
  92175. "cmp r1, #0\n\t"
  92176. "beq L_sp_384_num_bits_12_10_%=\n\t"
  92177. "lsr r3, r1, #24\n\t"
  92178. "cmp r3, #0\n\t"
  92179. "beq L_sp_384_num_bits_12_10_3_%=\n\t"
  92180. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92181. "mov r2, #0x1\n\t"
  92182. "lsl r2, r2, #8\n\t"
  92183. "add r2, r2, #0x58\n\t"
  92184. #else
  92185. "mov r2, #0x158\n\t"
  92186. #endif
  92187. "ldrb r12, [lr, r3]\n\t"
  92188. "add r12, r2, r12\n\t"
  92189. "b L_sp_384_num_bits_12_13_%=\n\t"
  92190. "\n"
  92191. "L_sp_384_num_bits_12_10_3_%=: \n\t"
  92192. "lsr r3, r1, #16\n\t"
  92193. "and r3, r3, #0xff\n\t"
  92194. "cmp r3, #0\n\t"
  92195. "beq L_sp_384_num_bits_12_10_2_%=\n\t"
  92196. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92197. "mov r2, #0x1\n\t"
  92198. "lsl r2, r2, #8\n\t"
  92199. "add r2, r2, #0x50\n\t"
  92200. #else
  92201. "mov r2, #0x150\n\t"
  92202. #endif
  92203. "ldrb r12, [lr, r3]\n\t"
  92204. "add r12, r2, r12\n\t"
  92205. "b L_sp_384_num_bits_12_13_%=\n\t"
  92206. "\n"
  92207. "L_sp_384_num_bits_12_10_2_%=: \n\t"
  92208. "lsr r3, r1, #8\n\t"
  92209. "and r3, r3, #0xff\n\t"
  92210. "cmp r3, #0\n\t"
  92211. "beq L_sp_384_num_bits_12_10_1_%=\n\t"
  92212. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92213. "mov r2, #0x1\n\t"
  92214. "lsl r2, r2, #8\n\t"
  92215. "add r2, r2, #0x48\n\t"
  92216. #else
  92217. "mov r2, #0x148\n\t"
  92218. #endif
  92219. "ldrb r12, [lr, r3]\n\t"
  92220. "add r12, r2, r12\n\t"
  92221. "b L_sp_384_num_bits_12_13_%=\n\t"
  92222. "\n"
  92223. "L_sp_384_num_bits_12_10_1_%=: \n\t"
  92224. "and r3, r1, #0xff\n\t"
  92225. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92226. "mov r2, #0x1\n\t"
  92227. "lsl r2, r2, #8\n\t"
  92228. "add r2, r2, #0x40\n\t"
  92229. #else
  92230. "mov r2, #0x140\n\t"
  92231. #endif
  92232. "ldrb r12, [lr, r3]\n\t"
  92233. "add r12, r2, r12\n\t"
  92234. "b L_sp_384_num_bits_12_13_%=\n\t"
  92235. "\n"
  92236. "L_sp_384_num_bits_12_10_%=: \n\t"
  92237. "ldr r1, [%[a], #36]\n\t"
  92238. "cmp r1, #0\n\t"
  92239. "beq L_sp_384_num_bits_12_9_%=\n\t"
  92240. "lsr r3, r1, #24\n\t"
  92241. "cmp r3, #0\n\t"
  92242. "beq L_sp_384_num_bits_12_9_3_%=\n\t"
  92243. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92244. "mov r2, #0x1\n\t"
  92245. "lsl r2, r2, #8\n\t"
  92246. "add r2, r2, #0x38\n\t"
  92247. #else
  92248. "mov r2, #0x138\n\t"
  92249. #endif
  92250. "ldrb r12, [lr, r3]\n\t"
  92251. "add r12, r2, r12\n\t"
  92252. "b L_sp_384_num_bits_12_13_%=\n\t"
  92253. "\n"
  92254. "L_sp_384_num_bits_12_9_3_%=: \n\t"
  92255. "lsr r3, r1, #16\n\t"
  92256. "and r3, r3, #0xff\n\t"
  92257. "cmp r3, #0\n\t"
  92258. "beq L_sp_384_num_bits_12_9_2_%=\n\t"
  92259. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92260. "mov r2, #0x1\n\t"
  92261. "lsl r2, r2, #8\n\t"
  92262. "add r2, r2, #0x30\n\t"
  92263. #else
  92264. "mov r2, #0x130\n\t"
  92265. #endif
  92266. "ldrb r12, [lr, r3]\n\t"
  92267. "add r12, r2, r12\n\t"
  92268. "b L_sp_384_num_bits_12_13_%=\n\t"
  92269. "\n"
  92270. "L_sp_384_num_bits_12_9_2_%=: \n\t"
  92271. "lsr r3, r1, #8\n\t"
  92272. "and r3, r3, #0xff\n\t"
  92273. "cmp r3, #0\n\t"
  92274. "beq L_sp_384_num_bits_12_9_1_%=\n\t"
  92275. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92276. "mov r2, #0x1\n\t"
  92277. "lsl r2, r2, #8\n\t"
  92278. "add r2, r2, #0x28\n\t"
  92279. #else
  92280. "mov r2, #0x128\n\t"
  92281. #endif
  92282. "ldrb r12, [lr, r3]\n\t"
  92283. "add r12, r2, r12\n\t"
  92284. "b L_sp_384_num_bits_12_13_%=\n\t"
  92285. "\n"
  92286. "L_sp_384_num_bits_12_9_1_%=: \n\t"
  92287. "and r3, r1, #0xff\n\t"
  92288. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92289. "mov r2, #0x1\n\t"
  92290. "lsl r2, r2, #8\n\t"
  92291. "add r2, r2, #0x20\n\t"
  92292. #else
  92293. "mov r2, #0x120\n\t"
  92294. #endif
  92295. "ldrb r12, [lr, r3]\n\t"
  92296. "add r12, r2, r12\n\t"
  92297. "b L_sp_384_num_bits_12_13_%=\n\t"
  92298. "\n"
  92299. "L_sp_384_num_bits_12_9_%=: \n\t"
  92300. "ldr r1, [%[a], #32]\n\t"
  92301. "cmp r1, #0\n\t"
  92302. "beq L_sp_384_num_bits_12_8_%=\n\t"
  92303. "lsr r3, r1, #24\n\t"
  92304. "cmp r3, #0\n\t"
  92305. "beq L_sp_384_num_bits_12_8_3_%=\n\t"
  92306. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92307. "mov r2, #0x1\n\t"
  92308. "lsl r2, r2, #8\n\t"
  92309. "add r2, r2, #0x18\n\t"
  92310. #else
  92311. "mov r2, #0x118\n\t"
  92312. #endif
  92313. "ldrb r12, [lr, r3]\n\t"
  92314. "add r12, r2, r12\n\t"
  92315. "b L_sp_384_num_bits_12_13_%=\n\t"
  92316. "\n"
  92317. "L_sp_384_num_bits_12_8_3_%=: \n\t"
  92318. "lsr r3, r1, #16\n\t"
  92319. "and r3, r3, #0xff\n\t"
  92320. "cmp r3, #0\n\t"
  92321. "beq L_sp_384_num_bits_12_8_2_%=\n\t"
  92322. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92323. "mov r2, #0x1\n\t"
  92324. "lsl r2, r2, #8\n\t"
  92325. "add r2, r2, #0x10\n\t"
  92326. #else
  92327. "mov r2, #0x110\n\t"
  92328. #endif
  92329. "ldrb r12, [lr, r3]\n\t"
  92330. "add r12, r2, r12\n\t"
  92331. "b L_sp_384_num_bits_12_13_%=\n\t"
  92332. "\n"
  92333. "L_sp_384_num_bits_12_8_2_%=: \n\t"
  92334. "lsr r3, r1, #8\n\t"
  92335. "and r3, r3, #0xff\n\t"
  92336. "cmp r3, #0\n\t"
  92337. "beq L_sp_384_num_bits_12_8_1_%=\n\t"
  92338. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92339. "mov r2, #0x1\n\t"
  92340. "lsl r2, r2, #8\n\t"
  92341. "add r2, r2, #0x8\n\t"
  92342. #else
  92343. "mov r2, #0x108\n\t"
  92344. #endif
  92345. "ldrb r12, [lr, r3]\n\t"
  92346. "add r12, r2, r12\n\t"
  92347. "b L_sp_384_num_bits_12_13_%=\n\t"
  92348. "\n"
  92349. "L_sp_384_num_bits_12_8_1_%=: \n\t"
  92350. "and r3, r1, #0xff\n\t"
  92351. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92352. "mov r2, #0x1\n\t"
  92353. "lsl r2, r2, #8\n\t"
  92354. "add r2, r2, #0x0\n\t"
  92355. #else
  92356. "mov r2, #0x100\n\t"
  92357. #endif
  92358. "ldrb r12, [lr, r3]\n\t"
  92359. "add r12, r2, r12\n\t"
  92360. "b L_sp_384_num_bits_12_13_%=\n\t"
  92361. "\n"
  92362. "L_sp_384_num_bits_12_8_%=: \n\t"
  92363. "ldr r1, [%[a], #28]\n\t"
  92364. "cmp r1, #0\n\t"
  92365. "beq L_sp_384_num_bits_12_7_%=\n\t"
  92366. "lsr r3, r1, #24\n\t"
  92367. "cmp r3, #0\n\t"
  92368. "beq L_sp_384_num_bits_12_7_3_%=\n\t"
  92369. "mov r2, #0xf8\n\t"
  92370. "ldrb r12, [lr, r3]\n\t"
  92371. "add r12, r2, r12\n\t"
  92372. "b L_sp_384_num_bits_12_13_%=\n\t"
  92373. "\n"
  92374. "L_sp_384_num_bits_12_7_3_%=: \n\t"
  92375. "lsr r3, r1, #16\n\t"
  92376. "and r3, r3, #0xff\n\t"
  92377. "cmp r3, #0\n\t"
  92378. "beq L_sp_384_num_bits_12_7_2_%=\n\t"
  92379. "mov r2, #0xf0\n\t"
  92380. "ldrb r12, [lr, r3]\n\t"
  92381. "add r12, r2, r12\n\t"
  92382. "b L_sp_384_num_bits_12_13_%=\n\t"
  92383. "\n"
  92384. "L_sp_384_num_bits_12_7_2_%=: \n\t"
  92385. "lsr r3, r1, #8\n\t"
  92386. "and r3, r3, #0xff\n\t"
  92387. "cmp r3, #0\n\t"
  92388. "beq L_sp_384_num_bits_12_7_1_%=\n\t"
  92389. "mov r2, #0xe8\n\t"
  92390. "ldrb r12, [lr, r3]\n\t"
  92391. "add r12, r2, r12\n\t"
  92392. "b L_sp_384_num_bits_12_13_%=\n\t"
  92393. "\n"
  92394. "L_sp_384_num_bits_12_7_1_%=: \n\t"
  92395. "and r3, r1, #0xff\n\t"
  92396. "mov r2, #0xe0\n\t"
  92397. "ldrb r12, [lr, r3]\n\t"
  92398. "add r12, r2, r12\n\t"
  92399. "b L_sp_384_num_bits_12_13_%=\n\t"
  92400. "\n"
  92401. "L_sp_384_num_bits_12_7_%=: \n\t"
  92402. "ldr r1, [%[a], #24]\n\t"
  92403. "cmp r1, #0\n\t"
  92404. "beq L_sp_384_num_bits_12_6_%=\n\t"
  92405. "lsr r3, r1, #24\n\t"
  92406. "cmp r3, #0\n\t"
  92407. "beq L_sp_384_num_bits_12_6_3_%=\n\t"
  92408. "mov r2, #0xd8\n\t"
  92409. "ldrb r12, [lr, r3]\n\t"
  92410. "add r12, r2, r12\n\t"
  92411. "b L_sp_384_num_bits_12_13_%=\n\t"
  92412. "\n"
  92413. "L_sp_384_num_bits_12_6_3_%=: \n\t"
  92414. "lsr r3, r1, #16\n\t"
  92415. "and r3, r3, #0xff\n\t"
  92416. "cmp r3, #0\n\t"
  92417. "beq L_sp_384_num_bits_12_6_2_%=\n\t"
  92418. "mov r2, #0xd0\n\t"
  92419. "ldrb r12, [lr, r3]\n\t"
  92420. "add r12, r2, r12\n\t"
  92421. "b L_sp_384_num_bits_12_13_%=\n\t"
  92422. "\n"
  92423. "L_sp_384_num_bits_12_6_2_%=: \n\t"
  92424. "lsr r3, r1, #8\n\t"
  92425. "and r3, r3, #0xff\n\t"
  92426. "cmp r3, #0\n\t"
  92427. "beq L_sp_384_num_bits_12_6_1_%=\n\t"
  92428. "mov r2, #0xc8\n\t"
  92429. "ldrb r12, [lr, r3]\n\t"
  92430. "add r12, r2, r12\n\t"
  92431. "b L_sp_384_num_bits_12_13_%=\n\t"
  92432. "\n"
  92433. "L_sp_384_num_bits_12_6_1_%=: \n\t"
  92434. "and r3, r1, #0xff\n\t"
  92435. "mov r2, #0xc0\n\t"
  92436. "ldrb r12, [lr, r3]\n\t"
  92437. "add r12, r2, r12\n\t"
  92438. "b L_sp_384_num_bits_12_13_%=\n\t"
  92439. "\n"
  92440. "L_sp_384_num_bits_12_6_%=: \n\t"
  92441. "ldr r1, [%[a], #20]\n\t"
  92442. "cmp r1, #0\n\t"
  92443. "beq L_sp_384_num_bits_12_5_%=\n\t"
  92444. "lsr r3, r1, #24\n\t"
  92445. "cmp r3, #0\n\t"
  92446. "beq L_sp_384_num_bits_12_5_3_%=\n\t"
  92447. "mov r2, #0xb8\n\t"
  92448. "ldrb r12, [lr, r3]\n\t"
  92449. "add r12, r2, r12\n\t"
  92450. "b L_sp_384_num_bits_12_13_%=\n\t"
  92451. "\n"
  92452. "L_sp_384_num_bits_12_5_3_%=: \n\t"
  92453. "lsr r3, r1, #16\n\t"
  92454. "and r3, r3, #0xff\n\t"
  92455. "cmp r3, #0\n\t"
  92456. "beq L_sp_384_num_bits_12_5_2_%=\n\t"
  92457. "mov r2, #0xb0\n\t"
  92458. "ldrb r12, [lr, r3]\n\t"
  92459. "add r12, r2, r12\n\t"
  92460. "b L_sp_384_num_bits_12_13_%=\n\t"
  92461. "\n"
  92462. "L_sp_384_num_bits_12_5_2_%=: \n\t"
  92463. "lsr r3, r1, #8\n\t"
  92464. "and r3, r3, #0xff\n\t"
  92465. "cmp r3, #0\n\t"
  92466. "beq L_sp_384_num_bits_12_5_1_%=\n\t"
  92467. "mov r2, #0xa8\n\t"
  92468. "ldrb r12, [lr, r3]\n\t"
  92469. "add r12, r2, r12\n\t"
  92470. "b L_sp_384_num_bits_12_13_%=\n\t"
  92471. "\n"
  92472. "L_sp_384_num_bits_12_5_1_%=: \n\t"
  92473. "and r3, r1, #0xff\n\t"
  92474. "mov r2, #0xa0\n\t"
  92475. "ldrb r12, [lr, r3]\n\t"
  92476. "add r12, r2, r12\n\t"
  92477. "b L_sp_384_num_bits_12_13_%=\n\t"
  92478. "\n"
  92479. "L_sp_384_num_bits_12_5_%=: \n\t"
  92480. "ldr r1, [%[a], #16]\n\t"
  92481. "cmp r1, #0\n\t"
  92482. "beq L_sp_384_num_bits_12_4_%=\n\t"
  92483. "lsr r3, r1, #24\n\t"
  92484. "cmp r3, #0\n\t"
  92485. "beq L_sp_384_num_bits_12_4_3_%=\n\t"
  92486. "mov r2, #0x98\n\t"
  92487. "ldrb r12, [lr, r3]\n\t"
  92488. "add r12, r2, r12\n\t"
  92489. "b L_sp_384_num_bits_12_13_%=\n\t"
  92490. "\n"
  92491. "L_sp_384_num_bits_12_4_3_%=: \n\t"
  92492. "lsr r3, r1, #16\n\t"
  92493. "and r3, r3, #0xff\n\t"
  92494. "cmp r3, #0\n\t"
  92495. "beq L_sp_384_num_bits_12_4_2_%=\n\t"
  92496. "mov r2, #0x90\n\t"
  92497. "ldrb r12, [lr, r3]\n\t"
  92498. "add r12, r2, r12\n\t"
  92499. "b L_sp_384_num_bits_12_13_%=\n\t"
  92500. "\n"
  92501. "L_sp_384_num_bits_12_4_2_%=: \n\t"
  92502. "lsr r3, r1, #8\n\t"
  92503. "and r3, r3, #0xff\n\t"
  92504. "cmp r3, #0\n\t"
  92505. "beq L_sp_384_num_bits_12_4_1_%=\n\t"
  92506. "mov r2, #0x88\n\t"
  92507. "ldrb r12, [lr, r3]\n\t"
  92508. "add r12, r2, r12\n\t"
  92509. "b L_sp_384_num_bits_12_13_%=\n\t"
  92510. "\n"
  92511. "L_sp_384_num_bits_12_4_1_%=: \n\t"
  92512. "and r3, r1, #0xff\n\t"
  92513. "mov r2, #0x80\n\t"
  92514. "ldrb r12, [lr, r3]\n\t"
  92515. "add r12, r2, r12\n\t"
  92516. "b L_sp_384_num_bits_12_13_%=\n\t"
  92517. "\n"
  92518. "L_sp_384_num_bits_12_4_%=: \n\t"
  92519. "ldr r1, [%[a], #12]\n\t"
  92520. "cmp r1, #0\n\t"
  92521. "beq L_sp_384_num_bits_12_3_%=\n\t"
  92522. "lsr r3, r1, #24\n\t"
  92523. "cmp r3, #0\n\t"
  92524. "beq L_sp_384_num_bits_12_3_3_%=\n\t"
  92525. "mov r2, #0x78\n\t"
  92526. "ldrb r12, [lr, r3]\n\t"
  92527. "add r12, r2, r12\n\t"
  92528. "b L_sp_384_num_bits_12_13_%=\n\t"
  92529. "\n"
  92530. "L_sp_384_num_bits_12_3_3_%=: \n\t"
  92531. "lsr r3, r1, #16\n\t"
  92532. "and r3, r3, #0xff\n\t"
  92533. "cmp r3, #0\n\t"
  92534. "beq L_sp_384_num_bits_12_3_2_%=\n\t"
  92535. "mov r2, #0x70\n\t"
  92536. "ldrb r12, [lr, r3]\n\t"
  92537. "add r12, r2, r12\n\t"
  92538. "b L_sp_384_num_bits_12_13_%=\n\t"
  92539. "\n"
  92540. "L_sp_384_num_bits_12_3_2_%=: \n\t"
  92541. "lsr r3, r1, #8\n\t"
  92542. "and r3, r3, #0xff\n\t"
  92543. "cmp r3, #0\n\t"
  92544. "beq L_sp_384_num_bits_12_3_1_%=\n\t"
  92545. "mov r2, #0x68\n\t"
  92546. "ldrb r12, [lr, r3]\n\t"
  92547. "add r12, r2, r12\n\t"
  92548. "b L_sp_384_num_bits_12_13_%=\n\t"
  92549. "\n"
  92550. "L_sp_384_num_bits_12_3_1_%=: \n\t"
  92551. "and r3, r1, #0xff\n\t"
  92552. "mov r2, #0x60\n\t"
  92553. "ldrb r12, [lr, r3]\n\t"
  92554. "add r12, r2, r12\n\t"
  92555. "b L_sp_384_num_bits_12_13_%=\n\t"
  92556. "\n"
  92557. "L_sp_384_num_bits_12_3_%=: \n\t"
  92558. "ldr r1, [%[a], #8]\n\t"
  92559. "cmp r1, #0\n\t"
  92560. "beq L_sp_384_num_bits_12_2_%=\n\t"
  92561. "lsr r3, r1, #24\n\t"
  92562. "cmp r3, #0\n\t"
  92563. "beq L_sp_384_num_bits_12_2_3_%=\n\t"
  92564. "mov r2, #0x58\n\t"
  92565. "ldrb r12, [lr, r3]\n\t"
  92566. "add r12, r2, r12\n\t"
  92567. "b L_sp_384_num_bits_12_13_%=\n\t"
  92568. "\n"
  92569. "L_sp_384_num_bits_12_2_3_%=: \n\t"
  92570. "lsr r3, r1, #16\n\t"
  92571. "and r3, r3, #0xff\n\t"
  92572. "cmp r3, #0\n\t"
  92573. "beq L_sp_384_num_bits_12_2_2_%=\n\t"
  92574. "mov r2, #0x50\n\t"
  92575. "ldrb r12, [lr, r3]\n\t"
  92576. "add r12, r2, r12\n\t"
  92577. "b L_sp_384_num_bits_12_13_%=\n\t"
  92578. "\n"
  92579. "L_sp_384_num_bits_12_2_2_%=: \n\t"
  92580. "lsr r3, r1, #8\n\t"
  92581. "and r3, r3, #0xff\n\t"
  92582. "cmp r3, #0\n\t"
  92583. "beq L_sp_384_num_bits_12_2_1_%=\n\t"
  92584. "mov r2, #0x48\n\t"
  92585. "ldrb r12, [lr, r3]\n\t"
  92586. "add r12, r2, r12\n\t"
  92587. "b L_sp_384_num_bits_12_13_%=\n\t"
  92588. "\n"
  92589. "L_sp_384_num_bits_12_2_1_%=: \n\t"
  92590. "and r3, r1, #0xff\n\t"
  92591. "mov r2, #0x40\n\t"
  92592. "ldrb r12, [lr, r3]\n\t"
  92593. "add r12, r2, r12\n\t"
  92594. "b L_sp_384_num_bits_12_13_%=\n\t"
  92595. "\n"
  92596. "L_sp_384_num_bits_12_2_%=: \n\t"
  92597. "ldr r1, [%[a], #4]\n\t"
  92598. "cmp r1, #0\n\t"
  92599. "beq L_sp_384_num_bits_12_1_%=\n\t"
  92600. "lsr r3, r1, #24\n\t"
  92601. "cmp r3, #0\n\t"
  92602. "beq L_sp_384_num_bits_12_1_3_%=\n\t"
  92603. "mov r2, #56\n\t"
  92604. "ldrb r12, [lr, r3]\n\t"
  92605. "add r12, r2, r12\n\t"
  92606. "b L_sp_384_num_bits_12_13_%=\n\t"
  92607. "\n"
  92608. "L_sp_384_num_bits_12_1_3_%=: \n\t"
  92609. "lsr r3, r1, #16\n\t"
  92610. "and r3, r3, #0xff\n\t"
  92611. "cmp r3, #0\n\t"
  92612. "beq L_sp_384_num_bits_12_1_2_%=\n\t"
  92613. "mov r2, #48\n\t"
  92614. "ldrb r12, [lr, r3]\n\t"
  92615. "add r12, r2, r12\n\t"
  92616. "b L_sp_384_num_bits_12_13_%=\n\t"
  92617. "\n"
  92618. "L_sp_384_num_bits_12_1_2_%=: \n\t"
  92619. "lsr r3, r1, #8\n\t"
  92620. "and r3, r3, #0xff\n\t"
  92621. "cmp r3, #0\n\t"
  92622. "beq L_sp_384_num_bits_12_1_1_%=\n\t"
  92623. "mov r2, #40\n\t"
  92624. "ldrb r12, [lr, r3]\n\t"
  92625. "add r12, r2, r12\n\t"
  92626. "b L_sp_384_num_bits_12_13_%=\n\t"
  92627. "\n"
  92628. "L_sp_384_num_bits_12_1_1_%=: \n\t"
  92629. "and r3, r1, #0xff\n\t"
  92630. "mov r2, #32\n\t"
  92631. "ldrb r12, [lr, r3]\n\t"
  92632. "add r12, r2, r12\n\t"
  92633. "b L_sp_384_num_bits_12_13_%=\n\t"
  92634. "\n"
  92635. "L_sp_384_num_bits_12_1_%=: \n\t"
  92636. "ldr r1, [%[a]]\n\t"
  92637. "lsr r3, r1, #24\n\t"
  92638. "cmp r3, #0\n\t"
  92639. "beq L_sp_384_num_bits_12_0_3_%=\n\t"
  92640. "mov r2, #24\n\t"
  92641. "ldrb r12, [lr, r3]\n\t"
  92642. "add r12, r2, r12\n\t"
  92643. "b L_sp_384_num_bits_12_13_%=\n\t"
  92644. "\n"
  92645. "L_sp_384_num_bits_12_0_3_%=: \n\t"
  92646. "lsr r3, r1, #16\n\t"
  92647. "and r3, r3, #0xff\n\t"
  92648. "cmp r3, #0\n\t"
  92649. "beq L_sp_384_num_bits_12_0_2_%=\n\t"
  92650. "mov r2, #16\n\t"
  92651. "ldrb r12, [lr, r3]\n\t"
  92652. "add r12, r2, r12\n\t"
  92653. "b L_sp_384_num_bits_12_13_%=\n\t"
  92654. "\n"
  92655. "L_sp_384_num_bits_12_0_2_%=: \n\t"
  92656. "lsr r3, r1, #8\n\t"
  92657. "and r3, r3, #0xff\n\t"
  92658. "cmp r3, #0\n\t"
  92659. "beq L_sp_384_num_bits_12_0_1_%=\n\t"
  92660. "mov r2, #8\n\t"
  92661. "ldrb r12, [lr, r3]\n\t"
  92662. "add r12, r2, r12\n\t"
  92663. "b L_sp_384_num_bits_12_13_%=\n\t"
  92664. "\n"
  92665. "L_sp_384_num_bits_12_0_1_%=: \n\t"
  92666. "and r3, r1, #0xff\n\t"
  92667. "ldrb r12, [lr, r3]\n\t"
  92668. "\n"
  92669. "L_sp_384_num_bits_12_13_%=: \n\t"
  92670. "mov %[a], r12\n\t"
  92671. : [a] "+r" (a)
  92672. : [L_sp_384_num_bits_12_table] "r" (L_sp_384_num_bits_12_table)
  92673. : "memory", "r1", "r2", "r3", "r12", "lr"
  92674. );
  92675. return (uint32_t)(size_t)a;
  92676. }
  92677. #else
  92678. static int sp_384_num_bits_12(const sp_digit* a_p)
  92679. {
  92680. register const sp_digit* a asm ("r0") = a_p;
  92681. __asm__ __volatile__ (
  92682. "ldr r1, [%[a], #44]\n\t"
  92683. "cmp r1, #0\n\t"
  92684. "beq L_sp_384_num_bits_12_11_%=\n\t"
  92685. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92686. "mov r2, #0x1\n\t"
  92687. "lsl r2, r2, #8\n\t"
  92688. "add r2, r2, #0x80\n\t"
  92689. #else
  92690. "mov r2, #0x180\n\t"
  92691. #endif
  92692. "clz r12, r1\n\t"
  92693. "sub r12, r2, r12\n\t"
  92694. "b L_sp_384_num_bits_12_13_%=\n\t"
  92695. "\n"
  92696. "L_sp_384_num_bits_12_11_%=: \n\t"
  92697. "ldr r1, [%[a], #40]\n\t"
  92698. "cmp r1, #0\n\t"
  92699. "beq L_sp_384_num_bits_12_10_%=\n\t"
  92700. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92701. "mov r2, #0x1\n\t"
  92702. "lsl r2, r2, #8\n\t"
  92703. "add r2, r2, #0x60\n\t"
  92704. #else
  92705. "mov r2, #0x160\n\t"
  92706. #endif
  92707. "clz r12, r1\n\t"
  92708. "sub r12, r2, r12\n\t"
  92709. "b L_sp_384_num_bits_12_13_%=\n\t"
  92710. "\n"
  92711. "L_sp_384_num_bits_12_10_%=: \n\t"
  92712. "ldr r1, [%[a], #36]\n\t"
  92713. "cmp r1, #0\n\t"
  92714. "beq L_sp_384_num_bits_12_9_%=\n\t"
  92715. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92716. "mov r2, #0x1\n\t"
  92717. "lsl r2, r2, #8\n\t"
  92718. "add r2, r2, #0x40\n\t"
  92719. #else
  92720. "mov r2, #0x140\n\t"
  92721. #endif
  92722. "clz r12, r1\n\t"
  92723. "sub r12, r2, r12\n\t"
  92724. "b L_sp_384_num_bits_12_13_%=\n\t"
  92725. "\n"
  92726. "L_sp_384_num_bits_12_9_%=: \n\t"
  92727. "ldr r1, [%[a], #32]\n\t"
  92728. "cmp r1, #0\n\t"
  92729. "beq L_sp_384_num_bits_12_8_%=\n\t"
  92730. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92731. "mov r2, #0x1\n\t"
  92732. "lsl r2, r2, #8\n\t"
  92733. "add r2, r2, #0x20\n\t"
  92734. #else
  92735. "mov r2, #0x120\n\t"
  92736. #endif
  92737. "clz r12, r1\n\t"
  92738. "sub r12, r2, r12\n\t"
  92739. "b L_sp_384_num_bits_12_13_%=\n\t"
  92740. "\n"
  92741. "L_sp_384_num_bits_12_8_%=: \n\t"
  92742. "ldr r1, [%[a], #28]\n\t"
  92743. "cmp r1, #0\n\t"
  92744. "beq L_sp_384_num_bits_12_7_%=\n\t"
  92745. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  92746. "mov r2, #0x1\n\t"
  92747. "lsl r2, r2, #8\n\t"
  92748. "add r2, r2, #0x0\n\t"
  92749. #else
  92750. "mov r2, #0x100\n\t"
  92751. #endif
  92752. "clz r12, r1\n\t"
  92753. "sub r12, r2, r12\n\t"
  92754. "b L_sp_384_num_bits_12_13_%=\n\t"
  92755. "\n"
  92756. "L_sp_384_num_bits_12_7_%=: \n\t"
  92757. "ldr r1, [%[a], #24]\n\t"
  92758. "cmp r1, #0\n\t"
  92759. "beq L_sp_384_num_bits_12_6_%=\n\t"
  92760. "mov r2, #0xe0\n\t"
  92761. "clz r12, r1\n\t"
  92762. "sub r12, r2, r12\n\t"
  92763. "b L_sp_384_num_bits_12_13_%=\n\t"
  92764. "\n"
  92765. "L_sp_384_num_bits_12_6_%=: \n\t"
  92766. "ldr r1, [%[a], #20]\n\t"
  92767. "cmp r1, #0\n\t"
  92768. "beq L_sp_384_num_bits_12_5_%=\n\t"
  92769. "mov r2, #0xc0\n\t"
  92770. "clz r12, r1\n\t"
  92771. "sub r12, r2, r12\n\t"
  92772. "b L_sp_384_num_bits_12_13_%=\n\t"
  92773. "\n"
  92774. "L_sp_384_num_bits_12_5_%=: \n\t"
  92775. "ldr r1, [%[a], #16]\n\t"
  92776. "cmp r1, #0\n\t"
  92777. "beq L_sp_384_num_bits_12_4_%=\n\t"
  92778. "mov r2, #0xa0\n\t"
  92779. "clz r12, r1\n\t"
  92780. "sub r12, r2, r12\n\t"
  92781. "b L_sp_384_num_bits_12_13_%=\n\t"
  92782. "\n"
  92783. "L_sp_384_num_bits_12_4_%=: \n\t"
  92784. "ldr r1, [%[a], #12]\n\t"
  92785. "cmp r1, #0\n\t"
  92786. "beq L_sp_384_num_bits_12_3_%=\n\t"
  92787. "mov r2, #0x80\n\t"
  92788. "clz r12, r1\n\t"
  92789. "sub r12, r2, r12\n\t"
  92790. "b L_sp_384_num_bits_12_13_%=\n\t"
  92791. "\n"
  92792. "L_sp_384_num_bits_12_3_%=: \n\t"
  92793. "ldr r1, [%[a], #8]\n\t"
  92794. "cmp r1, #0\n\t"
  92795. "beq L_sp_384_num_bits_12_2_%=\n\t"
  92796. "mov r2, #0x60\n\t"
  92797. "clz r12, r1\n\t"
  92798. "sub r12, r2, r12\n\t"
  92799. "b L_sp_384_num_bits_12_13_%=\n\t"
  92800. "\n"
  92801. "L_sp_384_num_bits_12_2_%=: \n\t"
  92802. "ldr r1, [%[a], #4]\n\t"
  92803. "cmp r1, #0\n\t"
  92804. "beq L_sp_384_num_bits_12_1_%=\n\t"
  92805. "mov r2, #0x40\n\t"
  92806. "clz r12, r1\n\t"
  92807. "sub r12, r2, r12\n\t"
  92808. "b L_sp_384_num_bits_12_13_%=\n\t"
  92809. "\n"
  92810. "L_sp_384_num_bits_12_1_%=: \n\t"
  92811. "ldr r1, [%[a]]\n\t"
  92812. "mov r2, #32\n\t"
  92813. "clz r12, r1\n\t"
  92814. "sub r12, r2, r12\n\t"
  92815. "\n"
  92816. "L_sp_384_num_bits_12_13_%=: \n\t"
  92817. "mov %[a], r12\n\t"
  92818. : [a] "+r" (a)
  92819. :
  92820. : "memory", "r1", "r2", "r3", "r12", "lr"
  92821. );
  92822. return (uint32_t)(size_t)a;
  92823. }
  92824. #endif /* WOLFSSL_SP_ARM_ARCH && (WOLFSSL_SP_ARM_ARCH < 7) */
  92825. /* Non-constant time modular inversion.
  92826. *
  92827. * @param [out] r Resulting number.
  92828. * @param [in] a Number to invert.
  92829. * @param [in] m Modulus.
  92830. * @return MP_OKAY on success.
  92831. */
  92832. static int sp_384_mod_inv_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  92833. {
  92834. sp_digit u[12];
  92835. sp_digit v[12];
  92836. sp_digit b[12];
  92837. sp_digit d[12];
  92838. int ut, vt;
  92839. sp_digit o;
  92840. XMEMCPY(u, m, sizeof(u));
  92841. XMEMCPY(v, a, sizeof(v));
  92842. ut = sp_384_num_bits_12(u);
  92843. vt = sp_384_num_bits_12(v);
  92844. XMEMSET(b, 0, sizeof(b));
  92845. if ((v[0] & 1) == 0) {
  92846. sp_384_rshift1_12(v, v);
  92847. XMEMCPY(d, m, sizeof(u));
  92848. d[0] += 1;
  92849. sp_384_rshift1_12(d, d);
  92850. vt--;
  92851. while ((v[0] & 1) == 0) {
  92852. sp_384_rshift1_12(v, v);
  92853. sp_384_div2_mod_12(d, d, m);
  92854. vt--;
  92855. }
  92856. }
  92857. else {
  92858. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  92859. d[0] = 1;
  92860. }
  92861. while (ut > 1 && vt > 1) {
  92862. if (ut > vt || (ut == vt && sp_384_cmp_12(u, v) >= 0)) {
  92863. sp_384_sub_12(u, u, v);
  92864. o = sp_384_sub_12(b, b, d);
  92865. if (o != 0)
  92866. sp_384_add_12(b, b, m);
  92867. ut = sp_384_num_bits_12(u);
  92868. do {
  92869. sp_384_rshift1_12(u, u);
  92870. sp_384_div2_mod_12(b, b, m);
  92871. ut--;
  92872. }
  92873. while (ut > 0 && (u[0] & 1) == 0);
  92874. }
  92875. else {
  92876. sp_384_sub_12(v, v, u);
  92877. o = sp_384_sub_12(d, d, b);
  92878. if (o != 0)
  92879. sp_384_add_12(d, d, m);
  92880. vt = sp_384_num_bits_12(v);
  92881. do {
  92882. sp_384_rshift1_12(v, v);
  92883. sp_384_div2_mod_12(d, d, m);
  92884. vt--;
  92885. }
  92886. while (vt > 0 && (v[0] & 1) == 0);
  92887. }
  92888. }
  92889. if (ut == 1)
  92890. XMEMCPY(r, b, sizeof(b));
  92891. else
  92892. XMEMCPY(r, d, sizeof(d));
  92893. return MP_OKAY;
  92894. }
  92895. #endif /* WOLFSSL_SP_SMALL */
  92896. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  92897. *
  92898. * p1 First point to add and holds result.
  92899. * p2 Second point to add.
  92900. * tmp Temporary storage for intermediate numbers.
  92901. */
  92902. static void sp_384_add_points_12(sp_point_384* p1, const sp_point_384* p2,
  92903. sp_digit* tmp)
  92904. {
  92905. sp_384_proj_point_add_12(p1, p1, p2, tmp);
  92906. if (sp_384_iszero_12(p1->z)) {
  92907. if (sp_384_iszero_12(p1->x) && sp_384_iszero_12(p1->y)) {
  92908. sp_384_proj_point_dbl_12(p1, p2, tmp);
  92909. }
  92910. else {
  92911. /* Y ordinate is not used from here - don't set. */
  92912. p1->x[0] = 0;
  92913. p1->x[1] = 0;
  92914. p1->x[2] = 0;
  92915. p1->x[3] = 0;
  92916. p1->x[4] = 0;
  92917. p1->x[5] = 0;
  92918. p1->x[6] = 0;
  92919. p1->x[7] = 0;
  92920. p1->x[8] = 0;
  92921. p1->x[9] = 0;
  92922. p1->x[10] = 0;
  92923. p1->x[11] = 0;
  92924. XMEMCPY(p1->z, p384_norm_mod, sizeof(p384_norm_mod));
  92925. }
  92926. }
  92927. }
  92928. /* Calculate the verification point: [e/s]G + [r/s]Q
  92929. *
  92930. * p1 Calculated point.
  92931. * p2 Public point and temporary.
  92932. * s Second part of signature as a number.
  92933. * u1 Temporary number.
  92934. * u2 Temproray number.
  92935. * heap Heap to use for allocation.
  92936. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  92937. */
  92938. static int sp_384_calc_vfy_point_12(sp_point_384* p1, sp_point_384* p2,
  92939. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  92940. {
  92941. int err;
  92942. #ifndef WOLFSSL_SP_SMALL
  92943. err = sp_384_mod_inv_12(s, s, p384_order);
  92944. if (err == MP_OKAY)
  92945. #endif /* !WOLFSSL_SP_SMALL */
  92946. {
  92947. sp_384_mul_12(s, s, p384_norm_order);
  92948. err = sp_384_mod_12(s, s, p384_order);
  92949. }
  92950. if (err == MP_OKAY) {
  92951. sp_384_norm_12(s);
  92952. #ifdef WOLFSSL_SP_SMALL
  92953. {
  92954. sp_384_mont_inv_order_12(s, s, tmp);
  92955. sp_384_mont_mul_order_12(u1, u1, s);
  92956. sp_384_mont_mul_order_12(u2, u2, s);
  92957. }
  92958. #else
  92959. {
  92960. sp_384_mont_mul_order_12(u1, u1, s);
  92961. sp_384_mont_mul_order_12(u2, u2, s);
  92962. }
  92963. #endif /* WOLFSSL_SP_SMALL */
  92964. {
  92965. err = sp_384_ecc_mulmod_base_12(p1, u1, 0, 0, heap);
  92966. }
  92967. }
  92968. if ((err == MP_OKAY) && sp_384_iszero_12(p1->z)) {
  92969. p1->infinity = 1;
  92970. }
  92971. if (err == MP_OKAY) {
  92972. err = sp_384_ecc_mulmod_12(p2, p2, u2, 0, 0, heap);
  92973. }
  92974. if ((err == MP_OKAY) && sp_384_iszero_12(p2->z)) {
  92975. p2->infinity = 1;
  92976. }
  92977. if (err == MP_OKAY) {
  92978. sp_384_add_points_12(p1, p2, tmp);
  92979. }
  92980. return err;
  92981. }
  92982. #ifdef HAVE_ECC_VERIFY
  92983. /* Verify the signature values with the hash and public key.
  92984. * e = Truncate(hash, 384)
  92985. * u1 = e/s mod order
  92986. * u2 = r/s mod order
  92987. * r == (u1.G + u2.Q)->x mod order
  92988. * Optimization: Leave point in projective form.
  92989. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  92990. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  92991. * The hash is truncated to the first 384 bits.
  92992. *
  92993. * hash Hash to sign.
  92994. * hashLen Length of the hash data.
  92995. * rng Random number generator.
  92996. * priv Private part of key - scalar.
  92997. * rm First part of result as an mp_int.
  92998. * sm Sirst part of result as an mp_int.
  92999. * heap Heap to use for allocation.
  93000. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  93001. */
  93002. int sp_ecc_verify_384(const byte* hash, word32 hashLen, const mp_int* pX,
  93003. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  93004. int* res, void* heap)
  93005. {
  93006. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93007. sp_digit* u1 = NULL;
  93008. sp_point_384* p1 = NULL;
  93009. #else
  93010. sp_digit u1[18 * 12];
  93011. sp_point_384 p1[2];
  93012. #endif
  93013. sp_digit* u2 = NULL;
  93014. sp_digit* s = NULL;
  93015. sp_digit* tmp = NULL;
  93016. sp_point_384* p2 = NULL;
  93017. sp_digit carry;
  93018. sp_int32 c = 0;
  93019. int err = MP_OKAY;
  93020. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93021. if (err == MP_OKAY) {
  93022. p1 = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  93023. DYNAMIC_TYPE_ECC);
  93024. if (p1 == NULL)
  93025. err = MEMORY_E;
  93026. }
  93027. if (err == MP_OKAY) {
  93028. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 12, heap,
  93029. DYNAMIC_TYPE_ECC);
  93030. if (u1 == NULL)
  93031. err = MEMORY_E;
  93032. }
  93033. #endif
  93034. if (err == MP_OKAY) {
  93035. u2 = u1 + 2 * 12;
  93036. s = u1 + 4 * 12;
  93037. tmp = u1 + 6 * 12;
  93038. p2 = p1 + 1;
  93039. if (hashLen > 48U) {
  93040. hashLen = 48U;
  93041. }
  93042. sp_384_from_bin(u1, 12, hash, (int)hashLen);
  93043. sp_384_from_mp(u2, 12, rm);
  93044. sp_384_from_mp(s, 12, sm);
  93045. sp_384_from_mp(p2->x, 12, pX);
  93046. sp_384_from_mp(p2->y, 12, pY);
  93047. sp_384_from_mp(p2->z, 12, pZ);
  93048. err = sp_384_calc_vfy_point_12(p1, p2, s, u1, u2, tmp, heap);
  93049. }
  93050. if (err == MP_OKAY) {
  93051. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  93052. /* Reload r and convert to Montgomery form. */
  93053. sp_384_from_mp(u2, 12, rm);
  93054. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  93055. }
  93056. if (err == MP_OKAY) {
  93057. /* u1 = r.z'.z' mod prime */
  93058. sp_384_mont_sqr_12(p1->z, p1->z, p384_mod, p384_mp_mod);
  93059. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  93060. *res = (int)(sp_384_cmp_12(p1->x, u1) == 0);
  93061. if (*res == 0) {
  93062. /* Reload r and add order. */
  93063. sp_384_from_mp(u2, 12, rm);
  93064. carry = sp_384_add_12(u2, u2, p384_order);
  93065. /* Carry means result is greater than mod and is not valid. */
  93066. if (carry == 0) {
  93067. sp_384_norm_12(u2);
  93068. /* Compare with mod and if greater or equal then not valid. */
  93069. c = sp_384_cmp_12(u2, p384_mod);
  93070. }
  93071. }
  93072. if ((*res == 0) && (c < 0)) {
  93073. /* Convert to Montogomery form */
  93074. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  93075. if (err == MP_OKAY) {
  93076. /* u1 = (r + 1*order).z'.z' mod prime */
  93077. {
  93078. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  93079. }
  93080. *res = (sp_384_cmp_12(p1->x, u1) == 0);
  93081. }
  93082. }
  93083. }
  93084. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93085. if (u1 != NULL)
  93086. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  93087. if (p1 != NULL)
  93088. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  93089. #endif
  93090. return err;
  93091. }
  93092. #ifdef WOLFSSL_SP_NONBLOCK
  93093. typedef struct sp_ecc_verify_384_ctx {
  93094. int state;
  93095. union {
  93096. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  93097. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  93098. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  93099. sp_384_proj_point_add_12_ctx add_ctx;
  93100. };
  93101. sp_digit u1[2*12];
  93102. sp_digit u2[2*12];
  93103. sp_digit s[2*12];
  93104. sp_digit tmp[2*12 * 6];
  93105. sp_point_384 p1;
  93106. sp_point_384 p2;
  93107. } sp_ecc_verify_384_ctx;
  93108. int sp_ecc_verify_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  93109. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  93110. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  93111. {
  93112. int err = FP_WOULDBLOCK;
  93113. sp_ecc_verify_384_ctx* ctx = (sp_ecc_verify_384_ctx*)sp_ctx->data;
  93114. typedef char ctx_size_test[sizeof(sp_ecc_verify_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  93115. (void)sizeof(ctx_size_test);
  93116. switch (ctx->state) {
  93117. case 0: /* INIT */
  93118. if (hashLen > 48U) {
  93119. hashLen = 48U;
  93120. }
  93121. sp_384_from_bin(ctx->u1, 12, hash, (int)hashLen);
  93122. sp_384_from_mp(ctx->u2, 12, rm);
  93123. sp_384_from_mp(ctx->s, 12, sm);
  93124. sp_384_from_mp(ctx->p2.x, 12, pX);
  93125. sp_384_from_mp(ctx->p2.y, 12, pY);
  93126. sp_384_from_mp(ctx->p2.z, 12, pZ);
  93127. ctx->state = 1;
  93128. break;
  93129. case 1: /* NORMS0 */
  93130. sp_384_mul_12(ctx->s, ctx->s, p384_norm_order);
  93131. err = sp_384_mod_12(ctx->s, ctx->s, p384_order);
  93132. if (err == MP_OKAY)
  93133. ctx->state = 2;
  93134. break;
  93135. case 2: /* NORMS1 */
  93136. sp_384_norm_12(ctx->s);
  93137. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  93138. ctx->state = 3;
  93139. break;
  93140. case 3: /* NORMS2 */
  93141. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  93142. if (err == MP_OKAY) {
  93143. ctx->state = 4;
  93144. }
  93145. break;
  93146. case 4: /* NORMS3 */
  93147. sp_384_mont_mul_order_12(ctx->u1, ctx->u1, ctx->s);
  93148. ctx->state = 5;
  93149. break;
  93150. case 5: /* NORMS4 */
  93151. sp_384_mont_mul_order_12(ctx->u2, ctx->u2, ctx->s);
  93152. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  93153. ctx->state = 6;
  93154. break;
  93155. case 6: /* MULBASE */
  93156. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p384_base, ctx->u1, 0, 0, heap);
  93157. if (err == MP_OKAY) {
  93158. if (sp_384_iszero_12(ctx->p1.z)) {
  93159. ctx->p1.infinity = 1;
  93160. }
  93161. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  93162. ctx->state = 7;
  93163. }
  93164. break;
  93165. case 7: /* MULMOD */
  93166. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  93167. if (err == MP_OKAY) {
  93168. if (sp_384_iszero_12(ctx->p2.z)) {
  93169. ctx->p2.infinity = 1;
  93170. }
  93171. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  93172. ctx->state = 8;
  93173. }
  93174. break;
  93175. case 8: /* ADD */
  93176. err = sp_384_proj_point_add_12_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  93177. if (err == MP_OKAY)
  93178. ctx->state = 9;
  93179. break;
  93180. case 9: /* MONT */
  93181. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  93182. /* Reload r and convert to Montgomery form. */
  93183. sp_384_from_mp(ctx->u2, 12, rm);
  93184. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  93185. if (err == MP_OKAY)
  93186. ctx->state = 10;
  93187. break;
  93188. case 10: /* SQR */
  93189. /* u1 = r.z'.z' mod prime */
  93190. sp_384_mont_sqr_12(ctx->p1.z, ctx->p1.z, p384_mod, p384_mp_mod);
  93191. ctx->state = 11;
  93192. break;
  93193. case 11: /* MUL */
  93194. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod, p384_mp_mod);
  93195. ctx->state = 12;
  93196. break;
  93197. case 12: /* RES */
  93198. {
  93199. sp_int32 c = 0;
  93200. err = MP_OKAY; /* math okay, now check result */
  93201. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  93202. if (*res == 0) {
  93203. sp_digit carry;
  93204. /* Reload r and add order. */
  93205. sp_384_from_mp(ctx->u2, 12, rm);
  93206. carry = sp_384_add_12(ctx->u2, ctx->u2, p384_order);
  93207. /* Carry means result is greater than mod and is not valid. */
  93208. if (carry == 0) {
  93209. sp_384_norm_12(ctx->u2);
  93210. /* Compare with mod and if greater or equal then not valid. */
  93211. c = sp_384_cmp_12(ctx->u2, p384_mod);
  93212. }
  93213. }
  93214. if ((*res == 0) && (c < 0)) {
  93215. /* Convert to Montogomery form */
  93216. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  93217. if (err == MP_OKAY) {
  93218. /* u1 = (r + 1*order).z'.z' mod prime */
  93219. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod,
  93220. p384_mp_mod);
  93221. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  93222. }
  93223. }
  93224. break;
  93225. }
  93226. } /* switch */
  93227. if (err == MP_OKAY && ctx->state != 12) {
  93228. err = FP_WOULDBLOCK;
  93229. }
  93230. return err;
  93231. }
  93232. #endif /* WOLFSSL_SP_NONBLOCK */
  93233. #endif /* HAVE_ECC_VERIFY */
  93234. #ifdef HAVE_ECC_CHECK_KEY
  93235. /* Check that the x and y oridinates are a valid point on the curve.
  93236. *
  93237. * point EC point.
  93238. * heap Heap to use if dynamically allocating.
  93239. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  93240. * not on the curve and MP_OKAY otherwise.
  93241. */
  93242. static int sp_384_ecc_is_point_12(const sp_point_384* point,
  93243. void* heap)
  93244. {
  93245. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93246. sp_digit* t1 = NULL;
  93247. #else
  93248. sp_digit t1[12 * 4];
  93249. #endif
  93250. sp_digit* t2 = NULL;
  93251. int err = MP_OKAY;
  93252. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93253. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12 * 4, heap, DYNAMIC_TYPE_ECC);
  93254. if (t1 == NULL)
  93255. err = MEMORY_E;
  93256. #endif
  93257. (void)heap;
  93258. if (err == MP_OKAY) {
  93259. t2 = t1 + 2 * 12;
  93260. sp_384_sqr_12(t1, point->y);
  93261. (void)sp_384_mod_12(t1, t1, p384_mod);
  93262. sp_384_sqr_12(t2, point->x);
  93263. (void)sp_384_mod_12(t2, t2, p384_mod);
  93264. sp_384_mul_12(t2, t2, point->x);
  93265. (void)sp_384_mod_12(t2, t2, p384_mod);
  93266. (void)sp_384_sub_12(t2, p384_mod, t2);
  93267. sp_384_mont_add_12(t1, t1, t2, p384_mod);
  93268. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  93269. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  93270. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  93271. if (sp_384_cmp_12(t1, p384_b) != 0) {
  93272. err = MP_VAL;
  93273. }
  93274. }
  93275. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93276. if (t1 != NULL)
  93277. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  93278. #endif
  93279. return err;
  93280. }
  93281. /* Check that the x and y oridinates are a valid point on the curve.
  93282. *
  93283. * pX X ordinate of EC point.
  93284. * pY Y ordinate of EC point.
  93285. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  93286. * not on the curve and MP_OKAY otherwise.
  93287. */
  93288. int sp_ecc_is_point_384(const mp_int* pX, const mp_int* pY)
  93289. {
  93290. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93291. sp_point_384* pub = NULL;
  93292. #else
  93293. sp_point_384 pub[1];
  93294. #endif
  93295. const byte one[1] = { 1 };
  93296. int err = MP_OKAY;
  93297. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93298. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  93299. DYNAMIC_TYPE_ECC);
  93300. if (pub == NULL)
  93301. err = MEMORY_E;
  93302. #endif
  93303. if (err == MP_OKAY) {
  93304. sp_384_from_mp(pub->x, 12, pX);
  93305. sp_384_from_mp(pub->y, 12, pY);
  93306. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  93307. err = sp_384_ecc_is_point_12(pub, NULL);
  93308. }
  93309. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93310. if (pub != NULL)
  93311. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  93312. #endif
  93313. return err;
  93314. }
  93315. /* Check that the private scalar generates the EC point (px, py), the point is
  93316. * on the curve and the point has the correct order.
  93317. *
  93318. * pX X ordinate of EC point.
  93319. * pY Y ordinate of EC point.
  93320. * privm Private scalar that generates EC point.
  93321. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  93322. * not on the curve, ECC_INF_E if the point does not have the correct order,
  93323. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  93324. * MP_OKAY otherwise.
  93325. */
  93326. int sp_ecc_check_key_384(const mp_int* pX, const mp_int* pY,
  93327. const mp_int* privm, void* heap)
  93328. {
  93329. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93330. sp_digit* priv = NULL;
  93331. sp_point_384* pub = NULL;
  93332. #else
  93333. sp_digit priv[12];
  93334. sp_point_384 pub[2];
  93335. #endif
  93336. sp_point_384* p = NULL;
  93337. const byte one[1] = { 1 };
  93338. int err = MP_OKAY;
  93339. /* Quick check the lengs of public key ordinates and private key are in
  93340. * range. Proper check later.
  93341. */
  93342. if (((mp_count_bits(pX) > 384) ||
  93343. (mp_count_bits(pY) > 384) ||
  93344. ((privm != NULL) && (mp_count_bits(privm) > 384)))) {
  93345. err = ECC_OUT_OF_RANGE_E;
  93346. }
  93347. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93348. if (err == MP_OKAY) {
  93349. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  93350. DYNAMIC_TYPE_ECC);
  93351. if (pub == NULL)
  93352. err = MEMORY_E;
  93353. }
  93354. if (err == MP_OKAY && privm) {
  93355. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  93356. DYNAMIC_TYPE_ECC);
  93357. if (priv == NULL)
  93358. err = MEMORY_E;
  93359. }
  93360. #endif
  93361. if (err == MP_OKAY) {
  93362. p = pub + 1;
  93363. sp_384_from_mp(pub->x, 12, pX);
  93364. sp_384_from_mp(pub->y, 12, pY);
  93365. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  93366. if (privm)
  93367. sp_384_from_mp(priv, 12, privm);
  93368. /* Check point at infinitiy. */
  93369. if ((sp_384_iszero_12(pub->x) != 0) &&
  93370. (sp_384_iszero_12(pub->y) != 0)) {
  93371. err = ECC_INF_E;
  93372. }
  93373. }
  93374. /* Check range of X and Y */
  93375. if ((err == MP_OKAY) &&
  93376. ((sp_384_cmp_12(pub->x, p384_mod) >= 0) ||
  93377. (sp_384_cmp_12(pub->y, p384_mod) >= 0))) {
  93378. err = ECC_OUT_OF_RANGE_E;
  93379. }
  93380. if (err == MP_OKAY) {
  93381. /* Check point is on curve */
  93382. err = sp_384_ecc_is_point_12(pub, heap);
  93383. }
  93384. if (err == MP_OKAY) {
  93385. /* Point * order = infinity */
  93386. err = sp_384_ecc_mulmod_12(p, pub, p384_order, 1, 1, heap);
  93387. }
  93388. /* Check result is infinity */
  93389. if ((err == MP_OKAY) && ((sp_384_iszero_12(p->x) == 0) ||
  93390. (sp_384_iszero_12(p->y) == 0))) {
  93391. err = ECC_INF_E;
  93392. }
  93393. if (privm) {
  93394. if (err == MP_OKAY) {
  93395. /* Base * private = point */
  93396. err = sp_384_ecc_mulmod_base_12(p, priv, 1, 1, heap);
  93397. }
  93398. /* Check result is public key */
  93399. if ((err == MP_OKAY) &&
  93400. ((sp_384_cmp_12(p->x, pub->x) != 0) ||
  93401. (sp_384_cmp_12(p->y, pub->y) != 0))) {
  93402. err = ECC_PRIV_KEY_E;
  93403. }
  93404. }
  93405. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93406. if (pub != NULL)
  93407. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  93408. if (priv != NULL)
  93409. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  93410. #endif
  93411. return err;
  93412. }
  93413. #endif
  93414. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  93415. /* Add two projective EC points together.
  93416. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  93417. *
  93418. * pX First EC point's X ordinate.
  93419. * pY First EC point's Y ordinate.
  93420. * pZ First EC point's Z ordinate.
  93421. * qX Second EC point's X ordinate.
  93422. * qY Second EC point's Y ordinate.
  93423. * qZ Second EC point's Z ordinate.
  93424. * rX Resultant EC point's X ordinate.
  93425. * rY Resultant EC point's Y ordinate.
  93426. * rZ Resultant EC point's Z ordinate.
  93427. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  93428. */
  93429. int sp_ecc_proj_add_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  93430. mp_int* qX, mp_int* qY, mp_int* qZ,
  93431. mp_int* rX, mp_int* rY, mp_int* rZ)
  93432. {
  93433. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93434. sp_digit* tmp = NULL;
  93435. sp_point_384* p = NULL;
  93436. #else
  93437. sp_digit tmp[2 * 12 * 6];
  93438. sp_point_384 p[2];
  93439. #endif
  93440. sp_point_384* q = NULL;
  93441. int err = MP_OKAY;
  93442. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93443. if (err == MP_OKAY) {
  93444. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, NULL,
  93445. DYNAMIC_TYPE_ECC);
  93446. if (p == NULL)
  93447. err = MEMORY_E;
  93448. }
  93449. if (err == MP_OKAY) {
  93450. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  93451. DYNAMIC_TYPE_ECC);
  93452. if (tmp == NULL) {
  93453. err = MEMORY_E;
  93454. }
  93455. }
  93456. #endif
  93457. if (err == MP_OKAY) {
  93458. q = p + 1;
  93459. sp_384_from_mp(p->x, 12, pX);
  93460. sp_384_from_mp(p->y, 12, pY);
  93461. sp_384_from_mp(p->z, 12, pZ);
  93462. sp_384_from_mp(q->x, 12, qX);
  93463. sp_384_from_mp(q->y, 12, qY);
  93464. sp_384_from_mp(q->z, 12, qZ);
  93465. p->infinity = sp_384_iszero_12(p->x) &
  93466. sp_384_iszero_12(p->y);
  93467. q->infinity = sp_384_iszero_12(q->x) &
  93468. sp_384_iszero_12(q->y);
  93469. sp_384_proj_point_add_12(p, p, q, tmp);
  93470. }
  93471. if (err == MP_OKAY) {
  93472. err = sp_384_to_mp(p->x, rX);
  93473. }
  93474. if (err == MP_OKAY) {
  93475. err = sp_384_to_mp(p->y, rY);
  93476. }
  93477. if (err == MP_OKAY) {
  93478. err = sp_384_to_mp(p->z, rZ);
  93479. }
  93480. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93481. if (tmp != NULL)
  93482. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  93483. if (p != NULL)
  93484. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  93485. #endif
  93486. return err;
  93487. }
  93488. /* Double a projective EC point.
  93489. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  93490. *
  93491. * pX EC point's X ordinate.
  93492. * pY EC point's Y ordinate.
  93493. * pZ EC point's Z ordinate.
  93494. * rX Resultant EC point's X ordinate.
  93495. * rY Resultant EC point's Y ordinate.
  93496. * rZ Resultant EC point's Z ordinate.
  93497. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  93498. */
  93499. int sp_ecc_proj_dbl_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  93500. mp_int* rX, mp_int* rY, mp_int* rZ)
  93501. {
  93502. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93503. sp_digit* tmp = NULL;
  93504. sp_point_384* p = NULL;
  93505. #else
  93506. sp_digit tmp[2 * 12 * 2];
  93507. sp_point_384 p[1];
  93508. #endif
  93509. int err = MP_OKAY;
  93510. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93511. if (err == MP_OKAY) {
  93512. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  93513. DYNAMIC_TYPE_ECC);
  93514. if (p == NULL)
  93515. err = MEMORY_E;
  93516. }
  93517. if (err == MP_OKAY) {
  93518. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 2, NULL,
  93519. DYNAMIC_TYPE_ECC);
  93520. if (tmp == NULL)
  93521. err = MEMORY_E;
  93522. }
  93523. #endif
  93524. if (err == MP_OKAY) {
  93525. sp_384_from_mp(p->x, 12, pX);
  93526. sp_384_from_mp(p->y, 12, pY);
  93527. sp_384_from_mp(p->z, 12, pZ);
  93528. p->infinity = sp_384_iszero_12(p->x) &
  93529. sp_384_iszero_12(p->y);
  93530. sp_384_proj_point_dbl_12(p, p, tmp);
  93531. }
  93532. if (err == MP_OKAY) {
  93533. err = sp_384_to_mp(p->x, rX);
  93534. }
  93535. if (err == MP_OKAY) {
  93536. err = sp_384_to_mp(p->y, rY);
  93537. }
  93538. if (err == MP_OKAY) {
  93539. err = sp_384_to_mp(p->z, rZ);
  93540. }
  93541. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93542. if (tmp != NULL)
  93543. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  93544. if (p != NULL)
  93545. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  93546. #endif
  93547. return err;
  93548. }
  93549. /* Map a projective EC point to affine in place.
  93550. * pZ will be one.
  93551. *
  93552. * pX EC point's X ordinate.
  93553. * pY EC point's Y ordinate.
  93554. * pZ EC point's Z ordinate.
  93555. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  93556. */
  93557. int sp_ecc_map_384(mp_int* pX, mp_int* pY, mp_int* pZ)
  93558. {
  93559. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93560. sp_digit* tmp = NULL;
  93561. sp_point_384* p = NULL;
  93562. #else
  93563. sp_digit tmp[2 * 12 * 6];
  93564. sp_point_384 p[1];
  93565. #endif
  93566. int err = MP_OKAY;
  93567. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93568. if (err == MP_OKAY) {
  93569. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  93570. DYNAMIC_TYPE_ECC);
  93571. if (p == NULL)
  93572. err = MEMORY_E;
  93573. }
  93574. if (err == MP_OKAY) {
  93575. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  93576. DYNAMIC_TYPE_ECC);
  93577. if (tmp == NULL)
  93578. err = MEMORY_E;
  93579. }
  93580. #endif
  93581. if (err == MP_OKAY) {
  93582. sp_384_from_mp(p->x, 12, pX);
  93583. sp_384_from_mp(p->y, 12, pY);
  93584. sp_384_from_mp(p->z, 12, pZ);
  93585. p->infinity = sp_384_iszero_12(p->x) &
  93586. sp_384_iszero_12(p->y);
  93587. sp_384_map_12(p, p, tmp);
  93588. }
  93589. if (err == MP_OKAY) {
  93590. err = sp_384_to_mp(p->x, pX);
  93591. }
  93592. if (err == MP_OKAY) {
  93593. err = sp_384_to_mp(p->y, pY);
  93594. }
  93595. if (err == MP_OKAY) {
  93596. err = sp_384_to_mp(p->z, pZ);
  93597. }
  93598. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93599. if (tmp != NULL)
  93600. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  93601. if (p != NULL)
  93602. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  93603. #endif
  93604. return err;
  93605. }
  93606. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  93607. #ifdef HAVE_COMP_KEY
  93608. /* Find the square root of a number mod the prime of the curve.
  93609. *
  93610. * y The number to operate on and the result.
  93611. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  93612. */
  93613. static int sp_384_mont_sqrt_12(sp_digit* y)
  93614. {
  93615. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93616. sp_digit* t1 = NULL;
  93617. #else
  93618. sp_digit t1[5 * 2 * 12];
  93619. #endif
  93620. sp_digit* t2 = NULL;
  93621. sp_digit* t3 = NULL;
  93622. sp_digit* t4 = NULL;
  93623. sp_digit* t5 = NULL;
  93624. int err = MP_OKAY;
  93625. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93626. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 5 * 2 * 12, NULL, DYNAMIC_TYPE_ECC);
  93627. if (t1 == NULL)
  93628. err = MEMORY_E;
  93629. #endif
  93630. if (err == MP_OKAY) {
  93631. t2 = t1 + 2 * 12;
  93632. t3 = t1 + 4 * 12;
  93633. t4 = t1 + 6 * 12;
  93634. t5 = t1 + 8 * 12;
  93635. {
  93636. /* t2 = y ^ 0x2 */
  93637. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  93638. /* t1 = y ^ 0x3 */
  93639. sp_384_mont_mul_12(t1, t2, y, p384_mod, p384_mp_mod);
  93640. /* t5 = y ^ 0xc */
  93641. sp_384_mont_sqr_n_12(t5, t1, 2, p384_mod, p384_mp_mod);
  93642. /* t1 = y ^ 0xf */
  93643. sp_384_mont_mul_12(t1, t1, t5, p384_mod, p384_mp_mod);
  93644. /* t2 = y ^ 0x1e */
  93645. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  93646. /* t3 = y ^ 0x1f */
  93647. sp_384_mont_mul_12(t3, t2, y, p384_mod, p384_mp_mod);
  93648. /* t2 = y ^ 0x3e0 */
  93649. sp_384_mont_sqr_n_12(t2, t3, 5, p384_mod, p384_mp_mod);
  93650. /* t1 = y ^ 0x3ff */
  93651. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  93652. /* t2 = y ^ 0x7fe0 */
  93653. sp_384_mont_sqr_n_12(t2, t1, 5, p384_mod, p384_mp_mod);
  93654. /* t3 = y ^ 0x7fff */
  93655. sp_384_mont_mul_12(t3, t3, t2, p384_mod, p384_mp_mod);
  93656. /* t2 = y ^ 0x3fff800 */
  93657. sp_384_mont_sqr_n_12(t2, t3, 15, p384_mod, p384_mp_mod);
  93658. /* t4 = y ^ 0x3ffffff */
  93659. sp_384_mont_mul_12(t4, t3, t2, p384_mod, p384_mp_mod);
  93660. /* t2 = y ^ 0xffffffc000000 */
  93661. sp_384_mont_sqr_n_12(t2, t4, 30, p384_mod, p384_mp_mod);
  93662. /* t1 = y ^ 0xfffffffffffff */
  93663. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  93664. /* t2 = y ^ 0xfffffffffffffff000000000000000 */
  93665. sp_384_mont_sqr_n_12(t2, t1, 60, p384_mod, p384_mp_mod);
  93666. /* t1 = y ^ 0xffffffffffffffffffffffffffffff */
  93667. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  93668. /* t2 = y ^ 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  93669. sp_384_mont_sqr_n_12(t2, t1, 120, p384_mod, p384_mp_mod);
  93670. /* t1 = y ^ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  93671. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  93672. /* t2 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  93673. sp_384_mont_sqr_n_12(t2, t1, 15, p384_mod, p384_mp_mod);
  93674. /* t1 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  93675. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  93676. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000 */
  93677. sp_384_mont_sqr_n_12(t2, t1, 31, p384_mod, p384_mp_mod);
  93678. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff */
  93679. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  93680. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff0 */
  93681. sp_384_mont_sqr_n_12(t2, t1, 4, p384_mod, p384_mp_mod);
  93682. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc */
  93683. sp_384_mont_mul_12(t1, t5, t2, p384_mod, p384_mp_mod);
  93684. /* t2 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000 */
  93685. sp_384_mont_sqr_n_12(t2, t1, 62, p384_mod, p384_mp_mod);
  93686. /* t1 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001 */
  93687. sp_384_mont_mul_12(t1, y, t2, p384_mod, p384_mp_mod);
  93688. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc00000000000000040000000 */
  93689. sp_384_mont_sqr_n_12(y, t1, 30, p384_mod, p384_mp_mod);
  93690. }
  93691. }
  93692. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93693. if (t1 != NULL)
  93694. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  93695. #endif
  93696. return err;
  93697. }
  93698. /* Uncompress the point given the X ordinate.
  93699. *
  93700. * xm X ordinate.
  93701. * odd Whether the Y ordinate is odd.
  93702. * ym Calculated Y ordinate.
  93703. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  93704. */
  93705. int sp_ecc_uncompress_384(mp_int* xm, int odd, mp_int* ym)
  93706. {
  93707. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93708. sp_digit* x = NULL;
  93709. #else
  93710. sp_digit x[4 * 12];
  93711. #endif
  93712. sp_digit* y = NULL;
  93713. int err = MP_OKAY;
  93714. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93715. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 12, NULL, DYNAMIC_TYPE_ECC);
  93716. if (x == NULL)
  93717. err = MEMORY_E;
  93718. #endif
  93719. if (err == MP_OKAY) {
  93720. y = x + 2 * 12;
  93721. sp_384_from_mp(x, 12, xm);
  93722. err = sp_384_mod_mul_norm_12(x, x, p384_mod);
  93723. }
  93724. if (err == MP_OKAY) {
  93725. /* y = x^3 */
  93726. {
  93727. sp_384_mont_sqr_12(y, x, p384_mod, p384_mp_mod);
  93728. sp_384_mont_mul_12(y, y, x, p384_mod, p384_mp_mod);
  93729. }
  93730. /* y = x^3 - 3x */
  93731. sp_384_mont_sub_12(y, y, x, p384_mod);
  93732. sp_384_mont_sub_12(y, y, x, p384_mod);
  93733. sp_384_mont_sub_12(y, y, x, p384_mod);
  93734. /* y = x^3 - 3x + b */
  93735. err = sp_384_mod_mul_norm_12(x, p384_b, p384_mod);
  93736. }
  93737. if (err == MP_OKAY) {
  93738. sp_384_mont_add_12(y, y, x, p384_mod);
  93739. /* y = sqrt(x^3 - 3x + b) */
  93740. err = sp_384_mont_sqrt_12(y);
  93741. }
  93742. if (err == MP_OKAY) {
  93743. XMEMSET(y + 12, 0, 12U * sizeof(sp_digit));
  93744. sp_384_mont_reduce_12(y, p384_mod, p384_mp_mod);
  93745. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  93746. sp_384_mont_sub_12(y, p384_mod, y, p384_mod);
  93747. }
  93748. err = sp_384_to_mp(y, ym);
  93749. }
  93750. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  93751. if (x != NULL)
  93752. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  93753. #endif
  93754. return err;
  93755. }
  93756. #endif
  93757. #endif /* WOLFSSL_SP_384 */
  93758. #ifdef WOLFSSL_SP_521
  93759. /* Point structure to use. */
  93760. typedef struct sp_point_521 {
  93761. /* X ordinate of point. */
  93762. sp_digit x[2 * 17];
  93763. /* Y ordinate of point. */
  93764. sp_digit y[2 * 17];
  93765. /* Z ordinate of point. */
  93766. sp_digit z[2 * 17];
  93767. /* Indicates point is at infinity. */
  93768. int infinity;
  93769. } sp_point_521;
  93770. /* The modulus (prime) of the curve P521. */
  93771. static const sp_digit p521_mod[17] = {
  93772. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  93773. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  93774. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  93775. };
  93776. /* The Montgomery normalizer for modulus of the curve P521. */
  93777. static const sp_digit p521_norm_mod[17] = {
  93778. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  93779. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  93780. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  93781. };
  93782. /* The Montgomery multiplier for modulus of the curve P521. */
  93783. static sp_digit p521_mp_mod = 0x00000001;
  93784. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  93785. defined(HAVE_ECC_VERIFY)
  93786. /* The order of the curve P521. */
  93787. static const sp_digit p521_order[17] = {
  93788. 0x91386409,0xbb6fb71e,0x899c47ae,0x3bb5c9b8,0xf709a5d0,0x7fcc0148,
  93789. 0xbf2f966b,0x51868783,0xfffffffa,0xffffffff,0xffffffff,0xffffffff,
  93790. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  93791. };
  93792. #endif
  93793. /* The order of the curve P521 minus 2. */
  93794. static const sp_digit p521_order2[17] = {
  93795. 0x91386407,0xbb6fb71e,0x899c47ae,0x3bb5c9b8,0xf709a5d0,0x7fcc0148,
  93796. 0xbf2f966b,0x51868783,0xfffffffa,0xffffffff,0xffffffff,0xffffffff,
  93797. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  93798. };
  93799. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  93800. /* The Montgomery normalizer for order of the curve P521. */
  93801. static const sp_digit p521_norm_order[17] = {
  93802. 0x6ec79bf7,0x449048e1,0x7663b851,0xc44a3647,0x08f65a2f,0x8033feb7,
  93803. 0x40d06994,0xae79787c,0x00000005,0x00000000,0x00000000,0x00000000,
  93804. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  93805. };
  93806. #endif
  93807. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  93808. /* The Montgomery multiplier for order of the curve P521. */
  93809. static sp_digit p521_mp_order = 0x79a995c7;
  93810. #endif
  93811. /* The base point of curve P521. */
  93812. static const sp_point_521 p521_base = {
  93813. /* X ordinate */
  93814. {
  93815. 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  93816. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  93817. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6,
  93818. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  93819. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  93820. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  93821. (sp_digit)0, (sp_digit)0
  93822. },
  93823. /* Y ordinate */
  93824. {
  93825. 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  93826. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  93827. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118,
  93828. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  93829. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  93830. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  93831. (sp_digit)0, (sp_digit)0
  93832. },
  93833. /* Z ordinate */
  93834. {
  93835. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  93836. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  93837. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  93838. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  93839. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  93840. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  93841. (sp_digit)0, (sp_digit)0
  93842. },
  93843. /* infinity */
  93844. 0
  93845. };
  93846. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  93847. static const sp_digit p521_b[17] = {
  93848. 0x6b503f00,0xef451fd4,0x3d2c34f1,0x3573df88,0x3bb1bf07,0x1652c0bd,
  93849. 0xec7e937b,0x56193951,0x8ef109e1,0xb8b48991,0x99b315f3,0xa2da725b,
  93850. 0xb68540ee,0x929a21a0,0x8e1c9a1f,0x953eb961,0x00000051
  93851. };
  93852. #endif
  93853. #ifdef WOLFSSL_SP_SMALL
  93854. /* Multiply a and b into r. (r = a * b)
  93855. *
  93856. * r A single precision integer.
  93857. * a A single precision integer.
  93858. * b A single precision integer.
  93859. */
  93860. static void sp_521_mul_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  93861. {
  93862. register sp_digit* r asm ("r0") = r_p;
  93863. register const sp_digit* a asm ("r1") = a_p;
  93864. register const sp_digit* b asm ("r2") = b_p;
  93865. __asm__ __volatile__ (
  93866. "sub sp, sp, #0x88\n\t"
  93867. "mov r5, #0\n\t"
  93868. "mov r6, #0\n\t"
  93869. "mov r7, #0\n\t"
  93870. "mov r8, #0\n\t"
  93871. "\n"
  93872. "L_sp_521_mul_17_outer_%=: \n\t"
  93873. "subs r3, r5, #0x40\n\t"
  93874. "it cc\n\t"
  93875. "movcc r3, #0\n\t"
  93876. "sub r4, r5, r3\n\t"
  93877. "\n"
  93878. "L_sp_521_mul_17_inner_%=: \n\t"
  93879. "ldr lr, [%[a], r3]\n\t"
  93880. "ldr r11, [%[b], r4]\n\t"
  93881. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  93882. "lsl r9, lr, #16\n\t"
  93883. "lsl r10, r11, #16\n\t"
  93884. "lsr r9, r9, #16\n\t"
  93885. "lsr r10, r10, #16\n\t"
  93886. "mul r10, r9, r10\n\t"
  93887. "adds r6, r6, r10\n\t"
  93888. "adcs r7, r7, #0\n\t"
  93889. "adc r8, r8, #0\n\t"
  93890. "lsr r10, r11, #16\n\t"
  93891. "mul r9, r10, r9\n\t"
  93892. "lsr r10, r9, #16\n\t"
  93893. "lsl r9, r9, #16\n\t"
  93894. "adds r6, r6, r9\n\t"
  93895. "adcs r7, r7, r10\n\t"
  93896. "adc r8, r8, #0\n\t"
  93897. "lsr r9, lr, #16\n\t"
  93898. "lsr r10, r11, #16\n\t"
  93899. "mul r10, r9, r10\n\t"
  93900. "adds r7, r7, r10\n\t"
  93901. "adc r8, r8, #0\n\t"
  93902. "lsl r10, r11, #16\n\t"
  93903. "lsr r10, r10, #16\n\t"
  93904. "mul r9, r10, r9\n\t"
  93905. "lsr r10, r9, #16\n\t"
  93906. "lsl r9, r9, #16\n\t"
  93907. "adds r6, r6, r9\n\t"
  93908. "adcs r7, r7, r10\n\t"
  93909. "adc r8, r8, #0\n\t"
  93910. #else
  93911. "umull r9, r10, lr, r11\n\t"
  93912. "adds r6, r6, r9\n\t"
  93913. "adcs r7, r7, r10\n\t"
  93914. "adc r8, r8, #0\n\t"
  93915. #endif
  93916. "add r3, r3, #4\n\t"
  93917. "sub r4, r4, #4\n\t"
  93918. "cmp r3, #0x44\n\t"
  93919. "beq L_sp_521_mul_17_inner_done_%=\n\t"
  93920. "cmp r3, r5\n\t"
  93921. "ble L_sp_521_mul_17_inner_%=\n\t"
  93922. "\n"
  93923. "L_sp_521_mul_17_inner_done_%=: \n\t"
  93924. "str r6, [sp, r5]\n\t"
  93925. "mov r6, r7\n\t"
  93926. "mov r7, r8\n\t"
  93927. "mov r8, #0\n\t"
  93928. "add r5, r5, #4\n\t"
  93929. "cmp r5, #0x80\n\t"
  93930. "ble L_sp_521_mul_17_outer_%=\n\t"
  93931. "str r6, [sp, r5]\n\t"
  93932. "ldm sp!, {r6, r7}\n\t"
  93933. "stm %[r]!, {r6, r7}\n\t"
  93934. "sub r5, r5, #8\n\t"
  93935. "\n"
  93936. "L_sp_521_mul_17_store_%=: \n\t"
  93937. "ldm sp!, {r6, r7, r8, r9}\n\t"
  93938. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  93939. "subs r5, r5, #16\n\t"
  93940. "bgt L_sp_521_mul_17_store_%=\n\t"
  93941. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  93942. :
  93943. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11"
  93944. );
  93945. }
  93946. #else
  93947. /* Multiply a and b into r. (r = a * b)
  93948. *
  93949. * r A single precision integer.
  93950. * a A single precision integer.
  93951. * b A single precision integer.
  93952. */
  93953. static void sp_521_mul_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  93954. {
  93955. register sp_digit* r asm ("r0") = r_p;
  93956. register const sp_digit* a asm ("r1") = a_p;
  93957. register const sp_digit* b asm ("r2") = b_p;
  93958. __asm__ __volatile__ (
  93959. "sub sp, sp, #0x44\n\t"
  93960. "mov r10, #0\n\t"
  93961. /* A[0] * B[0] */
  93962. "ldr r11, [%[a]]\n\t"
  93963. "ldr r12, [%[b]]\n\t"
  93964. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  93965. "lsl r6, r11, #16\n\t"
  93966. "lsl r3, r12, #16\n\t"
  93967. "lsr r6, r6, #16\n\t"
  93968. "lsr r3, r3, #16\n\t"
  93969. "mul r3, r6, r3\n\t"
  93970. "lsr r7, r12, #16\n\t"
  93971. "mul r6, r7, r6\n\t"
  93972. "lsr r4, r6, #16\n\t"
  93973. "lsl r6, r6, #16\n\t"
  93974. "adds r3, r3, r6\n\t"
  93975. "adc r4, r4, #0\n\t"
  93976. "lsr r6, r11, #16\n\t"
  93977. "mul r7, r6, r7\n\t"
  93978. "add r4, r4, r7\n\t"
  93979. "lsl r7, r12, #16\n\t"
  93980. "lsr r7, r7, #16\n\t"
  93981. "mul r6, r7, r6\n\t"
  93982. "lsr r7, r6, #16\n\t"
  93983. "lsl r6, r6, #16\n\t"
  93984. "adds r3, r3, r6\n\t"
  93985. "adc r4, r4, r7\n\t"
  93986. "mov r5, #0\n\t"
  93987. #else
  93988. "umull r3, r4, r11, r12\n\t"
  93989. "mov r5, #0\n\t"
  93990. #endif
  93991. "str r3, [sp]\n\t"
  93992. /* A[0] * B[1] */
  93993. "ldr r9, [%[b], #4]\n\t"
  93994. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  93995. "lsl r6, r11, #16\n\t"
  93996. "lsl r7, r9, #16\n\t"
  93997. "lsr r6, r6, #16\n\t"
  93998. "lsr r7, r7, #16\n\t"
  93999. "mul r7, r6, r7\n\t"
  94000. "adds r4, r4, r7\n\t"
  94001. "adcs r5, r5, #0\n\t"
  94002. "mov r3, #0\n\t"
  94003. "adc r3, r3, #0\n\t"
  94004. "lsr r7, r9, #16\n\t"
  94005. "mul r6, r7, r6\n\t"
  94006. "lsr r7, r6, #16\n\t"
  94007. "lsl r6, r6, #16\n\t"
  94008. "adds r4, r4, r6\n\t"
  94009. "adcs r5, r5, r7\n\t"
  94010. "adc r3, r3, #0\n\t"
  94011. "lsr r6, r11, #16\n\t"
  94012. "lsr r7, r9, #16\n\t"
  94013. "mul r7, r6, r7\n\t"
  94014. "adds r5, r5, r7\n\t"
  94015. "adc r3, r3, #0\n\t"
  94016. "lsl r7, r9, #16\n\t"
  94017. "lsr r7, r7, #16\n\t"
  94018. "mul r6, r7, r6\n\t"
  94019. "lsr r7, r6, #16\n\t"
  94020. "lsl r6, r6, #16\n\t"
  94021. "adds r4, r4, r6\n\t"
  94022. "adcs r5, r5, r7\n\t"
  94023. "adc r3, r3, #0\n\t"
  94024. #else
  94025. "umull r6, r7, r11, r9\n\t"
  94026. "adds r4, r4, r6\n\t"
  94027. "adcs r5, r5, r7\n\t"
  94028. "mov r3, #0\n\t"
  94029. "adc r3, r3, #0\n\t"
  94030. #endif
  94031. /* A[1] * B[0] */
  94032. "ldr r8, [%[a], #4]\n\t"
  94033. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94034. "lsl r6, r8, #16\n\t"
  94035. "lsl r7, r12, #16\n\t"
  94036. "lsr r6, r6, #16\n\t"
  94037. "lsr r7, r7, #16\n\t"
  94038. "mul r7, r6, r7\n\t"
  94039. "adds r4, r4, r7\n\t"
  94040. "adcs r5, r5, #0\n\t"
  94041. "adc r3, r3, #0\n\t"
  94042. "lsr r7, r12, #16\n\t"
  94043. "mul r6, r7, r6\n\t"
  94044. "lsr r7, r6, #16\n\t"
  94045. "lsl r6, r6, #16\n\t"
  94046. "adds r4, r4, r6\n\t"
  94047. "adcs r5, r5, r7\n\t"
  94048. "adc r3, r3, #0\n\t"
  94049. "lsr r6, r8, #16\n\t"
  94050. "lsr r7, r12, #16\n\t"
  94051. "mul r7, r6, r7\n\t"
  94052. "adds r5, r5, r7\n\t"
  94053. "adc r3, r3, #0\n\t"
  94054. "lsl r7, r12, #16\n\t"
  94055. "lsr r7, r7, #16\n\t"
  94056. "mul r6, r7, r6\n\t"
  94057. "lsr r7, r6, #16\n\t"
  94058. "lsl r6, r6, #16\n\t"
  94059. "adds r4, r4, r6\n\t"
  94060. "adcs r5, r5, r7\n\t"
  94061. "adc r3, r3, #0\n\t"
  94062. #else
  94063. "umull r6, r7, r8, r12\n\t"
  94064. "adds r4, r4, r6\n\t"
  94065. "adcs r5, r5, r7\n\t"
  94066. "adc r3, r3, #0\n\t"
  94067. #endif
  94068. "str r4, [sp, #4]\n\t"
  94069. /* A[2] * B[0] */
  94070. "ldr r8, [%[a], #8]\n\t"
  94071. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94072. "lsl r6, r8, #16\n\t"
  94073. "lsl r7, r12, #16\n\t"
  94074. "lsr r6, r6, #16\n\t"
  94075. "lsr r7, r7, #16\n\t"
  94076. "mul r7, r6, r7\n\t"
  94077. "adds r5, r5, r7\n\t"
  94078. "adcs r3, r3, #0\n\t"
  94079. "mov r4, #0\n\t"
  94080. "adc r4, r4, #0\n\t"
  94081. "lsr r7, r12, #16\n\t"
  94082. "mul r6, r7, r6\n\t"
  94083. "lsr r7, r6, #16\n\t"
  94084. "lsl r6, r6, #16\n\t"
  94085. "adds r5, r5, r6\n\t"
  94086. "adcs r3, r3, r7\n\t"
  94087. "adc r4, r4, #0\n\t"
  94088. "lsr r6, r8, #16\n\t"
  94089. "lsr r7, r12, #16\n\t"
  94090. "mul r7, r6, r7\n\t"
  94091. "adds r3, r3, r7\n\t"
  94092. "adc r4, r4, #0\n\t"
  94093. "lsl r7, r12, #16\n\t"
  94094. "lsr r7, r7, #16\n\t"
  94095. "mul r6, r7, r6\n\t"
  94096. "lsr r7, r6, #16\n\t"
  94097. "lsl r6, r6, #16\n\t"
  94098. "adds r5, r5, r6\n\t"
  94099. "adcs r3, r3, r7\n\t"
  94100. "adc r4, r4, #0\n\t"
  94101. #else
  94102. "umull r6, r7, r8, r12\n\t"
  94103. "adds r5, r5, r6\n\t"
  94104. "adcs r3, r3, r7\n\t"
  94105. "mov r4, #0\n\t"
  94106. "adc r4, r4, #0\n\t"
  94107. #endif
  94108. /* A[1] * B[1] */
  94109. "ldr r11, [%[a], #4]\n\t"
  94110. "ldr r12, [%[b], #4]\n\t"
  94111. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94112. "lsl r6, r11, #16\n\t"
  94113. "lsl r7, r12, #16\n\t"
  94114. "lsr r6, r6, #16\n\t"
  94115. "lsr r7, r7, #16\n\t"
  94116. "mul r7, r6, r7\n\t"
  94117. "adds r5, r5, r7\n\t"
  94118. "adcs r3, r3, #0\n\t"
  94119. "adc r4, r4, #0\n\t"
  94120. "lsr r7, r12, #16\n\t"
  94121. "mul r6, r7, r6\n\t"
  94122. "lsr r7, r6, #16\n\t"
  94123. "lsl r6, r6, #16\n\t"
  94124. "adds r5, r5, r6\n\t"
  94125. "adcs r3, r3, r7\n\t"
  94126. "adc r4, r4, #0\n\t"
  94127. "lsr r6, r11, #16\n\t"
  94128. "lsr r7, r12, #16\n\t"
  94129. "mul r7, r6, r7\n\t"
  94130. "adds r3, r3, r7\n\t"
  94131. "adc r4, r4, #0\n\t"
  94132. "lsl r7, r12, #16\n\t"
  94133. "lsr r7, r7, #16\n\t"
  94134. "mul r6, r7, r6\n\t"
  94135. "lsr r7, r6, #16\n\t"
  94136. "lsl r6, r6, #16\n\t"
  94137. "adds r5, r5, r6\n\t"
  94138. "adcs r3, r3, r7\n\t"
  94139. "adc r4, r4, #0\n\t"
  94140. #else
  94141. "umull r6, r7, r11, r12\n\t"
  94142. "adds r5, r5, r6\n\t"
  94143. "adcs r3, r3, r7\n\t"
  94144. "adc r4, r4, #0\n\t"
  94145. #endif
  94146. /* A[0] * B[2] */
  94147. "ldr r8, [%[a]]\n\t"
  94148. "ldr r9, [%[b], #8]\n\t"
  94149. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94150. "lsl r6, r8, #16\n\t"
  94151. "lsl r7, r9, #16\n\t"
  94152. "lsr r6, r6, #16\n\t"
  94153. "lsr r7, r7, #16\n\t"
  94154. "mul r7, r6, r7\n\t"
  94155. "adds r5, r5, r7\n\t"
  94156. "adcs r3, r3, #0\n\t"
  94157. "adc r4, r4, #0\n\t"
  94158. "lsr r7, r9, #16\n\t"
  94159. "mul r6, r7, r6\n\t"
  94160. "lsr r7, r6, #16\n\t"
  94161. "lsl r6, r6, #16\n\t"
  94162. "adds r5, r5, r6\n\t"
  94163. "adcs r3, r3, r7\n\t"
  94164. "adc r4, r4, #0\n\t"
  94165. "lsr r6, r8, #16\n\t"
  94166. "lsr r7, r9, #16\n\t"
  94167. "mul r7, r6, r7\n\t"
  94168. "adds r3, r3, r7\n\t"
  94169. "adc r4, r4, #0\n\t"
  94170. "lsl r7, r9, #16\n\t"
  94171. "lsr r7, r7, #16\n\t"
  94172. "mul r6, r7, r6\n\t"
  94173. "lsr r7, r6, #16\n\t"
  94174. "lsl r6, r6, #16\n\t"
  94175. "adds r5, r5, r6\n\t"
  94176. "adcs r3, r3, r7\n\t"
  94177. "adc r4, r4, #0\n\t"
  94178. #else
  94179. "umull r6, r7, r8, r9\n\t"
  94180. "adds r5, r5, r6\n\t"
  94181. "adcs r3, r3, r7\n\t"
  94182. "adc r4, r4, #0\n\t"
  94183. #endif
  94184. "str r5, [sp, #8]\n\t"
  94185. /* A[0] * B[3] */
  94186. "ldr r9, [%[b], #12]\n\t"
  94187. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94188. "lsl r6, r8, #16\n\t"
  94189. "lsl r7, r9, #16\n\t"
  94190. "lsr r6, r6, #16\n\t"
  94191. "lsr r7, r7, #16\n\t"
  94192. "mul r7, r6, r7\n\t"
  94193. "adds r3, r3, r7\n\t"
  94194. "adcs r4, r4, #0\n\t"
  94195. "mov r5, #0\n\t"
  94196. "adc r5, r5, #0\n\t"
  94197. "lsr r7, r9, #16\n\t"
  94198. "mul r6, r7, r6\n\t"
  94199. "lsr r7, r6, #16\n\t"
  94200. "lsl r6, r6, #16\n\t"
  94201. "adds r3, r3, r6\n\t"
  94202. "adcs r4, r4, r7\n\t"
  94203. "adc r5, r5, #0\n\t"
  94204. "lsr r6, r8, #16\n\t"
  94205. "lsr r7, r9, #16\n\t"
  94206. "mul r7, r6, r7\n\t"
  94207. "adds r4, r4, r7\n\t"
  94208. "adc r5, r5, #0\n\t"
  94209. "lsl r7, r9, #16\n\t"
  94210. "lsr r7, r7, #16\n\t"
  94211. "mul r6, r7, r6\n\t"
  94212. "lsr r7, r6, #16\n\t"
  94213. "lsl r6, r6, #16\n\t"
  94214. "adds r3, r3, r6\n\t"
  94215. "adcs r4, r4, r7\n\t"
  94216. "adc r5, r5, #0\n\t"
  94217. #else
  94218. "umull r6, r7, r8, r9\n\t"
  94219. "adds r3, r3, r6\n\t"
  94220. "adcs r4, r4, r7\n\t"
  94221. "mov r5, #0\n\t"
  94222. "adc r5, r5, #0\n\t"
  94223. #endif
  94224. /* A[1] * B[2] */
  94225. "ldr r9, [%[b], #8]\n\t"
  94226. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94227. "lsl r6, r11, #16\n\t"
  94228. "lsl r7, r9, #16\n\t"
  94229. "lsr r6, r6, #16\n\t"
  94230. "lsr r7, r7, #16\n\t"
  94231. "mul r7, r6, r7\n\t"
  94232. "adds r3, r3, r7\n\t"
  94233. "adcs r4, r4, #0\n\t"
  94234. "adc r5, r5, #0\n\t"
  94235. "lsr r7, r9, #16\n\t"
  94236. "mul r6, r7, r6\n\t"
  94237. "lsr r7, r6, #16\n\t"
  94238. "lsl r6, r6, #16\n\t"
  94239. "adds r3, r3, r6\n\t"
  94240. "adcs r4, r4, r7\n\t"
  94241. "adc r5, r5, #0\n\t"
  94242. "lsr r6, r11, #16\n\t"
  94243. "lsr r7, r9, #16\n\t"
  94244. "mul r7, r6, r7\n\t"
  94245. "adds r4, r4, r7\n\t"
  94246. "adc r5, r5, #0\n\t"
  94247. "lsl r7, r9, #16\n\t"
  94248. "lsr r7, r7, #16\n\t"
  94249. "mul r6, r7, r6\n\t"
  94250. "lsr r7, r6, #16\n\t"
  94251. "lsl r6, r6, #16\n\t"
  94252. "adds r3, r3, r6\n\t"
  94253. "adcs r4, r4, r7\n\t"
  94254. "adc r5, r5, #0\n\t"
  94255. #else
  94256. "umull r6, r7, r11, r9\n\t"
  94257. "adds r3, r3, r6\n\t"
  94258. "adcs r4, r4, r7\n\t"
  94259. "adc r5, r5, #0\n\t"
  94260. #endif
  94261. /* A[2] * B[1] */
  94262. "ldr r8, [%[a], #8]\n\t"
  94263. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94264. "lsl r6, r8, #16\n\t"
  94265. "lsl r7, r12, #16\n\t"
  94266. "lsr r6, r6, #16\n\t"
  94267. "lsr r7, r7, #16\n\t"
  94268. "mul r7, r6, r7\n\t"
  94269. "adds r3, r3, r7\n\t"
  94270. "adcs r4, r4, #0\n\t"
  94271. "adc r5, r5, #0\n\t"
  94272. "lsr r7, r12, #16\n\t"
  94273. "mul r6, r7, r6\n\t"
  94274. "lsr r7, r6, #16\n\t"
  94275. "lsl r6, r6, #16\n\t"
  94276. "adds r3, r3, r6\n\t"
  94277. "adcs r4, r4, r7\n\t"
  94278. "adc r5, r5, #0\n\t"
  94279. "lsr r6, r8, #16\n\t"
  94280. "lsr r7, r12, #16\n\t"
  94281. "mul r7, r6, r7\n\t"
  94282. "adds r4, r4, r7\n\t"
  94283. "adc r5, r5, #0\n\t"
  94284. "lsl r7, r12, #16\n\t"
  94285. "lsr r7, r7, #16\n\t"
  94286. "mul r6, r7, r6\n\t"
  94287. "lsr r7, r6, #16\n\t"
  94288. "lsl r6, r6, #16\n\t"
  94289. "adds r3, r3, r6\n\t"
  94290. "adcs r4, r4, r7\n\t"
  94291. "adc r5, r5, #0\n\t"
  94292. #else
  94293. "umull r6, r7, r8, r12\n\t"
  94294. "adds r3, r3, r6\n\t"
  94295. "adcs r4, r4, r7\n\t"
  94296. "adc r5, r5, #0\n\t"
  94297. #endif
  94298. /* A[3] * B[0] */
  94299. "ldr r8, [%[a], #12]\n\t"
  94300. "ldr r9, [%[b]]\n\t"
  94301. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94302. "lsl r6, r8, #16\n\t"
  94303. "lsl r7, r9, #16\n\t"
  94304. "lsr r6, r6, #16\n\t"
  94305. "lsr r7, r7, #16\n\t"
  94306. "mul r7, r6, r7\n\t"
  94307. "adds r3, r3, r7\n\t"
  94308. "adcs r4, r4, #0\n\t"
  94309. "adc r5, r5, #0\n\t"
  94310. "lsr r7, r9, #16\n\t"
  94311. "mul r6, r7, r6\n\t"
  94312. "lsr r7, r6, #16\n\t"
  94313. "lsl r6, r6, #16\n\t"
  94314. "adds r3, r3, r6\n\t"
  94315. "adcs r4, r4, r7\n\t"
  94316. "adc r5, r5, #0\n\t"
  94317. "lsr r6, r8, #16\n\t"
  94318. "lsr r7, r9, #16\n\t"
  94319. "mul r7, r6, r7\n\t"
  94320. "adds r4, r4, r7\n\t"
  94321. "adc r5, r5, #0\n\t"
  94322. "lsl r7, r9, #16\n\t"
  94323. "lsr r7, r7, #16\n\t"
  94324. "mul r6, r7, r6\n\t"
  94325. "lsr r7, r6, #16\n\t"
  94326. "lsl r6, r6, #16\n\t"
  94327. "adds r3, r3, r6\n\t"
  94328. "adcs r4, r4, r7\n\t"
  94329. "adc r5, r5, #0\n\t"
  94330. #else
  94331. "umull r6, r7, r8, r9\n\t"
  94332. "adds r3, r3, r6\n\t"
  94333. "adcs r4, r4, r7\n\t"
  94334. "adc r5, r5, #0\n\t"
  94335. #endif
  94336. "str r3, [sp, #12]\n\t"
  94337. /* A[4] * B[0] */
  94338. "ldr r8, [%[a], #16]\n\t"
  94339. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94340. "lsl r6, r8, #16\n\t"
  94341. "lsl r7, r9, #16\n\t"
  94342. "lsr r6, r6, #16\n\t"
  94343. "lsr r7, r7, #16\n\t"
  94344. "mul r7, r6, r7\n\t"
  94345. "adds r4, r4, r7\n\t"
  94346. "adcs r5, r5, #0\n\t"
  94347. "mov r3, #0\n\t"
  94348. "adc r3, r3, #0\n\t"
  94349. "lsr r7, r9, #16\n\t"
  94350. "mul r6, r7, r6\n\t"
  94351. "lsr r7, r6, #16\n\t"
  94352. "lsl r6, r6, #16\n\t"
  94353. "adds r4, r4, r6\n\t"
  94354. "adcs r5, r5, r7\n\t"
  94355. "adc r3, r3, #0\n\t"
  94356. "lsr r6, r8, #16\n\t"
  94357. "lsr r7, r9, #16\n\t"
  94358. "mul r7, r6, r7\n\t"
  94359. "adds r5, r5, r7\n\t"
  94360. "adc r3, r3, #0\n\t"
  94361. "lsl r7, r9, #16\n\t"
  94362. "lsr r7, r7, #16\n\t"
  94363. "mul r6, r7, r6\n\t"
  94364. "lsr r7, r6, #16\n\t"
  94365. "lsl r6, r6, #16\n\t"
  94366. "adds r4, r4, r6\n\t"
  94367. "adcs r5, r5, r7\n\t"
  94368. "adc r3, r3, #0\n\t"
  94369. #else
  94370. "umull r6, r7, r8, r9\n\t"
  94371. "adds r4, r4, r6\n\t"
  94372. "adcs r5, r5, r7\n\t"
  94373. "mov r3, #0\n\t"
  94374. "adc r3, r3, #0\n\t"
  94375. #endif
  94376. /* A[3] * B[1] */
  94377. "ldr r8, [%[a], #12]\n\t"
  94378. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94379. "lsl r6, r8, #16\n\t"
  94380. "lsl r7, r12, #16\n\t"
  94381. "lsr r6, r6, #16\n\t"
  94382. "lsr r7, r7, #16\n\t"
  94383. "mul r7, r6, r7\n\t"
  94384. "adds r4, r4, r7\n\t"
  94385. "adcs r5, r5, #0\n\t"
  94386. "adc r3, r3, #0\n\t"
  94387. "lsr r7, r12, #16\n\t"
  94388. "mul r6, r7, r6\n\t"
  94389. "lsr r7, r6, #16\n\t"
  94390. "lsl r6, r6, #16\n\t"
  94391. "adds r4, r4, r6\n\t"
  94392. "adcs r5, r5, r7\n\t"
  94393. "adc r3, r3, #0\n\t"
  94394. "lsr r6, r8, #16\n\t"
  94395. "lsr r7, r12, #16\n\t"
  94396. "mul r7, r6, r7\n\t"
  94397. "adds r5, r5, r7\n\t"
  94398. "adc r3, r3, #0\n\t"
  94399. "lsl r7, r12, #16\n\t"
  94400. "lsr r7, r7, #16\n\t"
  94401. "mul r6, r7, r6\n\t"
  94402. "lsr r7, r6, #16\n\t"
  94403. "lsl r6, r6, #16\n\t"
  94404. "adds r4, r4, r6\n\t"
  94405. "adcs r5, r5, r7\n\t"
  94406. "adc r3, r3, #0\n\t"
  94407. #else
  94408. "umull r6, r7, r8, r12\n\t"
  94409. "adds r4, r4, r6\n\t"
  94410. "adcs r5, r5, r7\n\t"
  94411. "adc r3, r3, #0\n\t"
  94412. #endif
  94413. /* A[2] * B[2] */
  94414. "ldr r11, [%[a], #8]\n\t"
  94415. "ldr r12, [%[b], #8]\n\t"
  94416. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94417. "lsl r6, r11, #16\n\t"
  94418. "lsl r7, r12, #16\n\t"
  94419. "lsr r6, r6, #16\n\t"
  94420. "lsr r7, r7, #16\n\t"
  94421. "mul r7, r6, r7\n\t"
  94422. "adds r4, r4, r7\n\t"
  94423. "adcs r5, r5, #0\n\t"
  94424. "adc r3, r3, #0\n\t"
  94425. "lsr r7, r12, #16\n\t"
  94426. "mul r6, r7, r6\n\t"
  94427. "lsr r7, r6, #16\n\t"
  94428. "lsl r6, r6, #16\n\t"
  94429. "adds r4, r4, r6\n\t"
  94430. "adcs r5, r5, r7\n\t"
  94431. "adc r3, r3, #0\n\t"
  94432. "lsr r6, r11, #16\n\t"
  94433. "lsr r7, r12, #16\n\t"
  94434. "mul r7, r6, r7\n\t"
  94435. "adds r5, r5, r7\n\t"
  94436. "adc r3, r3, #0\n\t"
  94437. "lsl r7, r12, #16\n\t"
  94438. "lsr r7, r7, #16\n\t"
  94439. "mul r6, r7, r6\n\t"
  94440. "lsr r7, r6, #16\n\t"
  94441. "lsl r6, r6, #16\n\t"
  94442. "adds r4, r4, r6\n\t"
  94443. "adcs r5, r5, r7\n\t"
  94444. "adc r3, r3, #0\n\t"
  94445. #else
  94446. "umull r6, r7, r11, r12\n\t"
  94447. "adds r4, r4, r6\n\t"
  94448. "adcs r5, r5, r7\n\t"
  94449. "adc r3, r3, #0\n\t"
  94450. #endif
  94451. /* A[1] * B[3] */
  94452. "ldr r8, [%[a], #4]\n\t"
  94453. "ldr r9, [%[b], #12]\n\t"
  94454. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94455. "lsl r6, r8, #16\n\t"
  94456. "lsl r7, r9, #16\n\t"
  94457. "lsr r6, r6, #16\n\t"
  94458. "lsr r7, r7, #16\n\t"
  94459. "mul r7, r6, r7\n\t"
  94460. "adds r4, r4, r7\n\t"
  94461. "adcs r5, r5, #0\n\t"
  94462. "adc r3, r3, #0\n\t"
  94463. "lsr r7, r9, #16\n\t"
  94464. "mul r6, r7, r6\n\t"
  94465. "lsr r7, r6, #16\n\t"
  94466. "lsl r6, r6, #16\n\t"
  94467. "adds r4, r4, r6\n\t"
  94468. "adcs r5, r5, r7\n\t"
  94469. "adc r3, r3, #0\n\t"
  94470. "lsr r6, r8, #16\n\t"
  94471. "lsr r7, r9, #16\n\t"
  94472. "mul r7, r6, r7\n\t"
  94473. "adds r5, r5, r7\n\t"
  94474. "adc r3, r3, #0\n\t"
  94475. "lsl r7, r9, #16\n\t"
  94476. "lsr r7, r7, #16\n\t"
  94477. "mul r6, r7, r6\n\t"
  94478. "lsr r7, r6, #16\n\t"
  94479. "lsl r6, r6, #16\n\t"
  94480. "adds r4, r4, r6\n\t"
  94481. "adcs r5, r5, r7\n\t"
  94482. "adc r3, r3, #0\n\t"
  94483. #else
  94484. "umull r6, r7, r8, r9\n\t"
  94485. "adds r4, r4, r6\n\t"
  94486. "adcs r5, r5, r7\n\t"
  94487. "adc r3, r3, #0\n\t"
  94488. #endif
  94489. /* A[0] * B[4] */
  94490. "ldr r8, [%[a]]\n\t"
  94491. "ldr r9, [%[b], #16]\n\t"
  94492. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94493. "lsl r6, r8, #16\n\t"
  94494. "lsl r7, r9, #16\n\t"
  94495. "lsr r6, r6, #16\n\t"
  94496. "lsr r7, r7, #16\n\t"
  94497. "mul r7, r6, r7\n\t"
  94498. "adds r4, r4, r7\n\t"
  94499. "adcs r5, r5, #0\n\t"
  94500. "adc r3, r3, #0\n\t"
  94501. "lsr r7, r9, #16\n\t"
  94502. "mul r6, r7, r6\n\t"
  94503. "lsr r7, r6, #16\n\t"
  94504. "lsl r6, r6, #16\n\t"
  94505. "adds r4, r4, r6\n\t"
  94506. "adcs r5, r5, r7\n\t"
  94507. "adc r3, r3, #0\n\t"
  94508. "lsr r6, r8, #16\n\t"
  94509. "lsr r7, r9, #16\n\t"
  94510. "mul r7, r6, r7\n\t"
  94511. "adds r5, r5, r7\n\t"
  94512. "adc r3, r3, #0\n\t"
  94513. "lsl r7, r9, #16\n\t"
  94514. "lsr r7, r7, #16\n\t"
  94515. "mul r6, r7, r6\n\t"
  94516. "lsr r7, r6, #16\n\t"
  94517. "lsl r6, r6, #16\n\t"
  94518. "adds r4, r4, r6\n\t"
  94519. "adcs r5, r5, r7\n\t"
  94520. "adc r3, r3, #0\n\t"
  94521. #else
  94522. "umull r6, r7, r8, r9\n\t"
  94523. "adds r4, r4, r6\n\t"
  94524. "adcs r5, r5, r7\n\t"
  94525. "adc r3, r3, #0\n\t"
  94526. #endif
  94527. "str r4, [sp, #16]\n\t"
  94528. /* A[0] * B[5] */
  94529. "ldr r9, [%[b], #20]\n\t"
  94530. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94531. "lsl r6, r8, #16\n\t"
  94532. "lsl r7, r9, #16\n\t"
  94533. "lsr r6, r6, #16\n\t"
  94534. "lsr r7, r7, #16\n\t"
  94535. "mul r7, r6, r7\n\t"
  94536. "adds r5, r5, r7\n\t"
  94537. "adcs r3, r3, #0\n\t"
  94538. "mov r4, #0\n\t"
  94539. "adc r4, r4, #0\n\t"
  94540. "lsr r7, r9, #16\n\t"
  94541. "mul r6, r7, r6\n\t"
  94542. "lsr r7, r6, #16\n\t"
  94543. "lsl r6, r6, #16\n\t"
  94544. "adds r5, r5, r6\n\t"
  94545. "adcs r3, r3, r7\n\t"
  94546. "adc r4, r4, #0\n\t"
  94547. "lsr r6, r8, #16\n\t"
  94548. "lsr r7, r9, #16\n\t"
  94549. "mul r7, r6, r7\n\t"
  94550. "adds r3, r3, r7\n\t"
  94551. "adc r4, r4, #0\n\t"
  94552. "lsl r7, r9, #16\n\t"
  94553. "lsr r7, r7, #16\n\t"
  94554. "mul r6, r7, r6\n\t"
  94555. "lsr r7, r6, #16\n\t"
  94556. "lsl r6, r6, #16\n\t"
  94557. "adds r5, r5, r6\n\t"
  94558. "adcs r3, r3, r7\n\t"
  94559. "adc r4, r4, #0\n\t"
  94560. #else
  94561. "umull r6, r7, r8, r9\n\t"
  94562. "adds r5, r5, r6\n\t"
  94563. "adcs r3, r3, r7\n\t"
  94564. "mov r4, #0\n\t"
  94565. "adc r4, r4, #0\n\t"
  94566. #endif
  94567. /* A[1] * B[4] */
  94568. "ldr r8, [%[a], #4]\n\t"
  94569. "ldr r9, [%[b], #16]\n\t"
  94570. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94571. "lsl r6, r8, #16\n\t"
  94572. "lsl r7, r9, #16\n\t"
  94573. "lsr r6, r6, #16\n\t"
  94574. "lsr r7, r7, #16\n\t"
  94575. "mul r7, r6, r7\n\t"
  94576. "adds r5, r5, r7\n\t"
  94577. "adcs r3, r3, #0\n\t"
  94578. "adc r4, r4, #0\n\t"
  94579. "lsr r7, r9, #16\n\t"
  94580. "mul r6, r7, r6\n\t"
  94581. "lsr r7, r6, #16\n\t"
  94582. "lsl r6, r6, #16\n\t"
  94583. "adds r5, r5, r6\n\t"
  94584. "adcs r3, r3, r7\n\t"
  94585. "adc r4, r4, #0\n\t"
  94586. "lsr r6, r8, #16\n\t"
  94587. "lsr r7, r9, #16\n\t"
  94588. "mul r7, r6, r7\n\t"
  94589. "adds r3, r3, r7\n\t"
  94590. "adc r4, r4, #0\n\t"
  94591. "lsl r7, r9, #16\n\t"
  94592. "lsr r7, r7, #16\n\t"
  94593. "mul r6, r7, r6\n\t"
  94594. "lsr r7, r6, #16\n\t"
  94595. "lsl r6, r6, #16\n\t"
  94596. "adds r5, r5, r6\n\t"
  94597. "adcs r3, r3, r7\n\t"
  94598. "adc r4, r4, #0\n\t"
  94599. #else
  94600. "umull r6, r7, r8, r9\n\t"
  94601. "adds r5, r5, r6\n\t"
  94602. "adcs r3, r3, r7\n\t"
  94603. "adc r4, r4, #0\n\t"
  94604. #endif
  94605. /* A[2] * B[3] */
  94606. "ldr r9, [%[b], #12]\n\t"
  94607. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94608. "lsl r6, r11, #16\n\t"
  94609. "lsl r7, r9, #16\n\t"
  94610. "lsr r6, r6, #16\n\t"
  94611. "lsr r7, r7, #16\n\t"
  94612. "mul r7, r6, r7\n\t"
  94613. "adds r5, r5, r7\n\t"
  94614. "adcs r3, r3, #0\n\t"
  94615. "adc r4, r4, #0\n\t"
  94616. "lsr r7, r9, #16\n\t"
  94617. "mul r6, r7, r6\n\t"
  94618. "lsr r7, r6, #16\n\t"
  94619. "lsl r6, r6, #16\n\t"
  94620. "adds r5, r5, r6\n\t"
  94621. "adcs r3, r3, r7\n\t"
  94622. "adc r4, r4, #0\n\t"
  94623. "lsr r6, r11, #16\n\t"
  94624. "lsr r7, r9, #16\n\t"
  94625. "mul r7, r6, r7\n\t"
  94626. "adds r3, r3, r7\n\t"
  94627. "adc r4, r4, #0\n\t"
  94628. "lsl r7, r9, #16\n\t"
  94629. "lsr r7, r7, #16\n\t"
  94630. "mul r6, r7, r6\n\t"
  94631. "lsr r7, r6, #16\n\t"
  94632. "lsl r6, r6, #16\n\t"
  94633. "adds r5, r5, r6\n\t"
  94634. "adcs r3, r3, r7\n\t"
  94635. "adc r4, r4, #0\n\t"
  94636. #else
  94637. "umull r6, r7, r11, r9\n\t"
  94638. "adds r5, r5, r6\n\t"
  94639. "adcs r3, r3, r7\n\t"
  94640. "adc r4, r4, #0\n\t"
  94641. #endif
  94642. /* A[3] * B[2] */
  94643. "ldr r8, [%[a], #12]\n\t"
  94644. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94645. "lsl r6, r8, #16\n\t"
  94646. "lsl r7, r12, #16\n\t"
  94647. "lsr r6, r6, #16\n\t"
  94648. "lsr r7, r7, #16\n\t"
  94649. "mul r7, r6, r7\n\t"
  94650. "adds r5, r5, r7\n\t"
  94651. "adcs r3, r3, #0\n\t"
  94652. "adc r4, r4, #0\n\t"
  94653. "lsr r7, r12, #16\n\t"
  94654. "mul r6, r7, r6\n\t"
  94655. "lsr r7, r6, #16\n\t"
  94656. "lsl r6, r6, #16\n\t"
  94657. "adds r5, r5, r6\n\t"
  94658. "adcs r3, r3, r7\n\t"
  94659. "adc r4, r4, #0\n\t"
  94660. "lsr r6, r8, #16\n\t"
  94661. "lsr r7, r12, #16\n\t"
  94662. "mul r7, r6, r7\n\t"
  94663. "adds r3, r3, r7\n\t"
  94664. "adc r4, r4, #0\n\t"
  94665. "lsl r7, r12, #16\n\t"
  94666. "lsr r7, r7, #16\n\t"
  94667. "mul r6, r7, r6\n\t"
  94668. "lsr r7, r6, #16\n\t"
  94669. "lsl r6, r6, #16\n\t"
  94670. "adds r5, r5, r6\n\t"
  94671. "adcs r3, r3, r7\n\t"
  94672. "adc r4, r4, #0\n\t"
  94673. #else
  94674. "umull r6, r7, r8, r12\n\t"
  94675. "adds r5, r5, r6\n\t"
  94676. "adcs r3, r3, r7\n\t"
  94677. "adc r4, r4, #0\n\t"
  94678. #endif
  94679. /* A[4] * B[1] */
  94680. "ldr r8, [%[a], #16]\n\t"
  94681. "ldr r9, [%[b], #4]\n\t"
  94682. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94683. "lsl r6, r8, #16\n\t"
  94684. "lsl r7, r9, #16\n\t"
  94685. "lsr r6, r6, #16\n\t"
  94686. "lsr r7, r7, #16\n\t"
  94687. "mul r7, r6, r7\n\t"
  94688. "adds r5, r5, r7\n\t"
  94689. "adcs r3, r3, #0\n\t"
  94690. "adc r4, r4, #0\n\t"
  94691. "lsr r7, r9, #16\n\t"
  94692. "mul r6, r7, r6\n\t"
  94693. "lsr r7, r6, #16\n\t"
  94694. "lsl r6, r6, #16\n\t"
  94695. "adds r5, r5, r6\n\t"
  94696. "adcs r3, r3, r7\n\t"
  94697. "adc r4, r4, #0\n\t"
  94698. "lsr r6, r8, #16\n\t"
  94699. "lsr r7, r9, #16\n\t"
  94700. "mul r7, r6, r7\n\t"
  94701. "adds r3, r3, r7\n\t"
  94702. "adc r4, r4, #0\n\t"
  94703. "lsl r7, r9, #16\n\t"
  94704. "lsr r7, r7, #16\n\t"
  94705. "mul r6, r7, r6\n\t"
  94706. "lsr r7, r6, #16\n\t"
  94707. "lsl r6, r6, #16\n\t"
  94708. "adds r5, r5, r6\n\t"
  94709. "adcs r3, r3, r7\n\t"
  94710. "adc r4, r4, #0\n\t"
  94711. #else
  94712. "umull r6, r7, r8, r9\n\t"
  94713. "adds r5, r5, r6\n\t"
  94714. "adcs r3, r3, r7\n\t"
  94715. "adc r4, r4, #0\n\t"
  94716. #endif
  94717. /* A[5] * B[0] */
  94718. "ldr r8, [%[a], #20]\n\t"
  94719. "ldr r9, [%[b]]\n\t"
  94720. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94721. "lsl r6, r8, #16\n\t"
  94722. "lsl r7, r9, #16\n\t"
  94723. "lsr r6, r6, #16\n\t"
  94724. "lsr r7, r7, #16\n\t"
  94725. "mul r7, r6, r7\n\t"
  94726. "adds r5, r5, r7\n\t"
  94727. "adcs r3, r3, #0\n\t"
  94728. "adc r4, r4, #0\n\t"
  94729. "lsr r7, r9, #16\n\t"
  94730. "mul r6, r7, r6\n\t"
  94731. "lsr r7, r6, #16\n\t"
  94732. "lsl r6, r6, #16\n\t"
  94733. "adds r5, r5, r6\n\t"
  94734. "adcs r3, r3, r7\n\t"
  94735. "adc r4, r4, #0\n\t"
  94736. "lsr r6, r8, #16\n\t"
  94737. "lsr r7, r9, #16\n\t"
  94738. "mul r7, r6, r7\n\t"
  94739. "adds r3, r3, r7\n\t"
  94740. "adc r4, r4, #0\n\t"
  94741. "lsl r7, r9, #16\n\t"
  94742. "lsr r7, r7, #16\n\t"
  94743. "mul r6, r7, r6\n\t"
  94744. "lsr r7, r6, #16\n\t"
  94745. "lsl r6, r6, #16\n\t"
  94746. "adds r5, r5, r6\n\t"
  94747. "adcs r3, r3, r7\n\t"
  94748. "adc r4, r4, #0\n\t"
  94749. #else
  94750. "umull r6, r7, r8, r9\n\t"
  94751. "adds r5, r5, r6\n\t"
  94752. "adcs r3, r3, r7\n\t"
  94753. "adc r4, r4, #0\n\t"
  94754. #endif
  94755. "str r5, [sp, #20]\n\t"
  94756. /* A[6] * B[0] */
  94757. "ldr r8, [%[a], #24]\n\t"
  94758. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94759. "lsl r6, r8, #16\n\t"
  94760. "lsl r7, r9, #16\n\t"
  94761. "lsr r6, r6, #16\n\t"
  94762. "lsr r7, r7, #16\n\t"
  94763. "mul r7, r6, r7\n\t"
  94764. "adds r3, r3, r7\n\t"
  94765. "adcs r4, r4, #0\n\t"
  94766. "mov r5, #0\n\t"
  94767. "adc r5, r5, #0\n\t"
  94768. "lsr r7, r9, #16\n\t"
  94769. "mul r6, r7, r6\n\t"
  94770. "lsr r7, r6, #16\n\t"
  94771. "lsl r6, r6, #16\n\t"
  94772. "adds r3, r3, r6\n\t"
  94773. "adcs r4, r4, r7\n\t"
  94774. "adc r5, r5, #0\n\t"
  94775. "lsr r6, r8, #16\n\t"
  94776. "lsr r7, r9, #16\n\t"
  94777. "mul r7, r6, r7\n\t"
  94778. "adds r4, r4, r7\n\t"
  94779. "adc r5, r5, #0\n\t"
  94780. "lsl r7, r9, #16\n\t"
  94781. "lsr r7, r7, #16\n\t"
  94782. "mul r6, r7, r6\n\t"
  94783. "lsr r7, r6, #16\n\t"
  94784. "lsl r6, r6, #16\n\t"
  94785. "adds r3, r3, r6\n\t"
  94786. "adcs r4, r4, r7\n\t"
  94787. "adc r5, r5, #0\n\t"
  94788. #else
  94789. "umull r6, r7, r8, r9\n\t"
  94790. "adds r3, r3, r6\n\t"
  94791. "adcs r4, r4, r7\n\t"
  94792. "mov r5, #0\n\t"
  94793. "adc r5, r5, #0\n\t"
  94794. #endif
  94795. /* A[5] * B[1] */
  94796. "ldr r8, [%[a], #20]\n\t"
  94797. "ldr r9, [%[b], #4]\n\t"
  94798. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94799. "lsl r6, r8, #16\n\t"
  94800. "lsl r7, r9, #16\n\t"
  94801. "lsr r6, r6, #16\n\t"
  94802. "lsr r7, r7, #16\n\t"
  94803. "mul r7, r6, r7\n\t"
  94804. "adds r3, r3, r7\n\t"
  94805. "adcs r4, r4, #0\n\t"
  94806. "adc r5, r5, #0\n\t"
  94807. "lsr r7, r9, #16\n\t"
  94808. "mul r6, r7, r6\n\t"
  94809. "lsr r7, r6, #16\n\t"
  94810. "lsl r6, r6, #16\n\t"
  94811. "adds r3, r3, r6\n\t"
  94812. "adcs r4, r4, r7\n\t"
  94813. "adc r5, r5, #0\n\t"
  94814. "lsr r6, r8, #16\n\t"
  94815. "lsr r7, r9, #16\n\t"
  94816. "mul r7, r6, r7\n\t"
  94817. "adds r4, r4, r7\n\t"
  94818. "adc r5, r5, #0\n\t"
  94819. "lsl r7, r9, #16\n\t"
  94820. "lsr r7, r7, #16\n\t"
  94821. "mul r6, r7, r6\n\t"
  94822. "lsr r7, r6, #16\n\t"
  94823. "lsl r6, r6, #16\n\t"
  94824. "adds r3, r3, r6\n\t"
  94825. "adcs r4, r4, r7\n\t"
  94826. "adc r5, r5, #0\n\t"
  94827. #else
  94828. "umull r6, r7, r8, r9\n\t"
  94829. "adds r3, r3, r6\n\t"
  94830. "adcs r4, r4, r7\n\t"
  94831. "adc r5, r5, #0\n\t"
  94832. #endif
  94833. /* A[4] * B[2] */
  94834. "ldr r8, [%[a], #16]\n\t"
  94835. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94836. "lsl r6, r8, #16\n\t"
  94837. "lsl r7, r12, #16\n\t"
  94838. "lsr r6, r6, #16\n\t"
  94839. "lsr r7, r7, #16\n\t"
  94840. "mul r7, r6, r7\n\t"
  94841. "adds r3, r3, r7\n\t"
  94842. "adcs r4, r4, #0\n\t"
  94843. "adc r5, r5, #0\n\t"
  94844. "lsr r7, r12, #16\n\t"
  94845. "mul r6, r7, r6\n\t"
  94846. "lsr r7, r6, #16\n\t"
  94847. "lsl r6, r6, #16\n\t"
  94848. "adds r3, r3, r6\n\t"
  94849. "adcs r4, r4, r7\n\t"
  94850. "adc r5, r5, #0\n\t"
  94851. "lsr r6, r8, #16\n\t"
  94852. "lsr r7, r12, #16\n\t"
  94853. "mul r7, r6, r7\n\t"
  94854. "adds r4, r4, r7\n\t"
  94855. "adc r5, r5, #0\n\t"
  94856. "lsl r7, r12, #16\n\t"
  94857. "lsr r7, r7, #16\n\t"
  94858. "mul r6, r7, r6\n\t"
  94859. "lsr r7, r6, #16\n\t"
  94860. "lsl r6, r6, #16\n\t"
  94861. "adds r3, r3, r6\n\t"
  94862. "adcs r4, r4, r7\n\t"
  94863. "adc r5, r5, #0\n\t"
  94864. #else
  94865. "umull r6, r7, r8, r12\n\t"
  94866. "adds r3, r3, r6\n\t"
  94867. "adcs r4, r4, r7\n\t"
  94868. "adc r5, r5, #0\n\t"
  94869. #endif
  94870. /* A[3] * B[3] */
  94871. "ldr r11, [%[a], #12]\n\t"
  94872. "ldr r12, [%[b], #12]\n\t"
  94873. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94874. "lsl r6, r11, #16\n\t"
  94875. "lsl r7, r12, #16\n\t"
  94876. "lsr r6, r6, #16\n\t"
  94877. "lsr r7, r7, #16\n\t"
  94878. "mul r7, r6, r7\n\t"
  94879. "adds r3, r3, r7\n\t"
  94880. "adcs r4, r4, #0\n\t"
  94881. "adc r5, r5, #0\n\t"
  94882. "lsr r7, r12, #16\n\t"
  94883. "mul r6, r7, r6\n\t"
  94884. "lsr r7, r6, #16\n\t"
  94885. "lsl r6, r6, #16\n\t"
  94886. "adds r3, r3, r6\n\t"
  94887. "adcs r4, r4, r7\n\t"
  94888. "adc r5, r5, #0\n\t"
  94889. "lsr r6, r11, #16\n\t"
  94890. "lsr r7, r12, #16\n\t"
  94891. "mul r7, r6, r7\n\t"
  94892. "adds r4, r4, r7\n\t"
  94893. "adc r5, r5, #0\n\t"
  94894. "lsl r7, r12, #16\n\t"
  94895. "lsr r7, r7, #16\n\t"
  94896. "mul r6, r7, r6\n\t"
  94897. "lsr r7, r6, #16\n\t"
  94898. "lsl r6, r6, #16\n\t"
  94899. "adds r3, r3, r6\n\t"
  94900. "adcs r4, r4, r7\n\t"
  94901. "adc r5, r5, #0\n\t"
  94902. #else
  94903. "umull r6, r7, r11, r12\n\t"
  94904. "adds r3, r3, r6\n\t"
  94905. "adcs r4, r4, r7\n\t"
  94906. "adc r5, r5, #0\n\t"
  94907. #endif
  94908. /* A[2] * B[4] */
  94909. "ldr r8, [%[a], #8]\n\t"
  94910. "ldr r9, [%[b], #16]\n\t"
  94911. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94912. "lsl r6, r8, #16\n\t"
  94913. "lsl r7, r9, #16\n\t"
  94914. "lsr r6, r6, #16\n\t"
  94915. "lsr r7, r7, #16\n\t"
  94916. "mul r7, r6, r7\n\t"
  94917. "adds r3, r3, r7\n\t"
  94918. "adcs r4, r4, #0\n\t"
  94919. "adc r5, r5, #0\n\t"
  94920. "lsr r7, r9, #16\n\t"
  94921. "mul r6, r7, r6\n\t"
  94922. "lsr r7, r6, #16\n\t"
  94923. "lsl r6, r6, #16\n\t"
  94924. "adds r3, r3, r6\n\t"
  94925. "adcs r4, r4, r7\n\t"
  94926. "adc r5, r5, #0\n\t"
  94927. "lsr r6, r8, #16\n\t"
  94928. "lsr r7, r9, #16\n\t"
  94929. "mul r7, r6, r7\n\t"
  94930. "adds r4, r4, r7\n\t"
  94931. "adc r5, r5, #0\n\t"
  94932. "lsl r7, r9, #16\n\t"
  94933. "lsr r7, r7, #16\n\t"
  94934. "mul r6, r7, r6\n\t"
  94935. "lsr r7, r6, #16\n\t"
  94936. "lsl r6, r6, #16\n\t"
  94937. "adds r3, r3, r6\n\t"
  94938. "adcs r4, r4, r7\n\t"
  94939. "adc r5, r5, #0\n\t"
  94940. #else
  94941. "umull r6, r7, r8, r9\n\t"
  94942. "adds r3, r3, r6\n\t"
  94943. "adcs r4, r4, r7\n\t"
  94944. "adc r5, r5, #0\n\t"
  94945. #endif
  94946. /* A[1] * B[5] */
  94947. "ldr r8, [%[a], #4]\n\t"
  94948. "ldr r9, [%[b], #20]\n\t"
  94949. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94950. "lsl r6, r8, #16\n\t"
  94951. "lsl r7, r9, #16\n\t"
  94952. "lsr r6, r6, #16\n\t"
  94953. "lsr r7, r7, #16\n\t"
  94954. "mul r7, r6, r7\n\t"
  94955. "adds r3, r3, r7\n\t"
  94956. "adcs r4, r4, #0\n\t"
  94957. "adc r5, r5, #0\n\t"
  94958. "lsr r7, r9, #16\n\t"
  94959. "mul r6, r7, r6\n\t"
  94960. "lsr r7, r6, #16\n\t"
  94961. "lsl r6, r6, #16\n\t"
  94962. "adds r3, r3, r6\n\t"
  94963. "adcs r4, r4, r7\n\t"
  94964. "adc r5, r5, #0\n\t"
  94965. "lsr r6, r8, #16\n\t"
  94966. "lsr r7, r9, #16\n\t"
  94967. "mul r7, r6, r7\n\t"
  94968. "adds r4, r4, r7\n\t"
  94969. "adc r5, r5, #0\n\t"
  94970. "lsl r7, r9, #16\n\t"
  94971. "lsr r7, r7, #16\n\t"
  94972. "mul r6, r7, r6\n\t"
  94973. "lsr r7, r6, #16\n\t"
  94974. "lsl r6, r6, #16\n\t"
  94975. "adds r3, r3, r6\n\t"
  94976. "adcs r4, r4, r7\n\t"
  94977. "adc r5, r5, #0\n\t"
  94978. #else
  94979. "umull r6, r7, r8, r9\n\t"
  94980. "adds r3, r3, r6\n\t"
  94981. "adcs r4, r4, r7\n\t"
  94982. "adc r5, r5, #0\n\t"
  94983. #endif
  94984. /* A[0] * B[6] */
  94985. "ldr r8, [%[a]]\n\t"
  94986. "ldr r9, [%[b], #24]\n\t"
  94987. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  94988. "lsl r6, r8, #16\n\t"
  94989. "lsl r7, r9, #16\n\t"
  94990. "lsr r6, r6, #16\n\t"
  94991. "lsr r7, r7, #16\n\t"
  94992. "mul r7, r6, r7\n\t"
  94993. "adds r3, r3, r7\n\t"
  94994. "adcs r4, r4, #0\n\t"
  94995. "adc r5, r5, #0\n\t"
  94996. "lsr r7, r9, #16\n\t"
  94997. "mul r6, r7, r6\n\t"
  94998. "lsr r7, r6, #16\n\t"
  94999. "lsl r6, r6, #16\n\t"
  95000. "adds r3, r3, r6\n\t"
  95001. "adcs r4, r4, r7\n\t"
  95002. "adc r5, r5, #0\n\t"
  95003. "lsr r6, r8, #16\n\t"
  95004. "lsr r7, r9, #16\n\t"
  95005. "mul r7, r6, r7\n\t"
  95006. "adds r4, r4, r7\n\t"
  95007. "adc r5, r5, #0\n\t"
  95008. "lsl r7, r9, #16\n\t"
  95009. "lsr r7, r7, #16\n\t"
  95010. "mul r6, r7, r6\n\t"
  95011. "lsr r7, r6, #16\n\t"
  95012. "lsl r6, r6, #16\n\t"
  95013. "adds r3, r3, r6\n\t"
  95014. "adcs r4, r4, r7\n\t"
  95015. "adc r5, r5, #0\n\t"
  95016. #else
  95017. "umull r6, r7, r8, r9\n\t"
  95018. "adds r3, r3, r6\n\t"
  95019. "adcs r4, r4, r7\n\t"
  95020. "adc r5, r5, #0\n\t"
  95021. #endif
  95022. "str r3, [sp, #24]\n\t"
  95023. /* A[0] * B[7] */
  95024. "ldr r9, [%[b], #28]\n\t"
  95025. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95026. "lsl r6, r8, #16\n\t"
  95027. "lsl r7, r9, #16\n\t"
  95028. "lsr r6, r6, #16\n\t"
  95029. "lsr r7, r7, #16\n\t"
  95030. "mul r7, r6, r7\n\t"
  95031. "adds r4, r4, r7\n\t"
  95032. "adcs r5, r5, #0\n\t"
  95033. "mov r3, #0\n\t"
  95034. "adc r3, r3, #0\n\t"
  95035. "lsr r7, r9, #16\n\t"
  95036. "mul r6, r7, r6\n\t"
  95037. "lsr r7, r6, #16\n\t"
  95038. "lsl r6, r6, #16\n\t"
  95039. "adds r4, r4, r6\n\t"
  95040. "adcs r5, r5, r7\n\t"
  95041. "adc r3, r3, #0\n\t"
  95042. "lsr r6, r8, #16\n\t"
  95043. "lsr r7, r9, #16\n\t"
  95044. "mul r7, r6, r7\n\t"
  95045. "adds r5, r5, r7\n\t"
  95046. "adc r3, r3, #0\n\t"
  95047. "lsl r7, r9, #16\n\t"
  95048. "lsr r7, r7, #16\n\t"
  95049. "mul r6, r7, r6\n\t"
  95050. "lsr r7, r6, #16\n\t"
  95051. "lsl r6, r6, #16\n\t"
  95052. "adds r4, r4, r6\n\t"
  95053. "adcs r5, r5, r7\n\t"
  95054. "adc r3, r3, #0\n\t"
  95055. #else
  95056. "umull r6, r7, r8, r9\n\t"
  95057. "adds r4, r4, r6\n\t"
  95058. "adcs r5, r5, r7\n\t"
  95059. "mov r3, #0\n\t"
  95060. "adc r3, r3, #0\n\t"
  95061. #endif
  95062. /* A[1] * B[6] */
  95063. "ldr r8, [%[a], #4]\n\t"
  95064. "ldr r9, [%[b], #24]\n\t"
  95065. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95066. "lsl r6, r8, #16\n\t"
  95067. "lsl r7, r9, #16\n\t"
  95068. "lsr r6, r6, #16\n\t"
  95069. "lsr r7, r7, #16\n\t"
  95070. "mul r7, r6, r7\n\t"
  95071. "adds r4, r4, r7\n\t"
  95072. "adcs r5, r5, #0\n\t"
  95073. "adc r3, r3, #0\n\t"
  95074. "lsr r7, r9, #16\n\t"
  95075. "mul r6, r7, r6\n\t"
  95076. "lsr r7, r6, #16\n\t"
  95077. "lsl r6, r6, #16\n\t"
  95078. "adds r4, r4, r6\n\t"
  95079. "adcs r5, r5, r7\n\t"
  95080. "adc r3, r3, #0\n\t"
  95081. "lsr r6, r8, #16\n\t"
  95082. "lsr r7, r9, #16\n\t"
  95083. "mul r7, r6, r7\n\t"
  95084. "adds r5, r5, r7\n\t"
  95085. "adc r3, r3, #0\n\t"
  95086. "lsl r7, r9, #16\n\t"
  95087. "lsr r7, r7, #16\n\t"
  95088. "mul r6, r7, r6\n\t"
  95089. "lsr r7, r6, #16\n\t"
  95090. "lsl r6, r6, #16\n\t"
  95091. "adds r4, r4, r6\n\t"
  95092. "adcs r5, r5, r7\n\t"
  95093. "adc r3, r3, #0\n\t"
  95094. #else
  95095. "umull r6, r7, r8, r9\n\t"
  95096. "adds r4, r4, r6\n\t"
  95097. "adcs r5, r5, r7\n\t"
  95098. "adc r3, r3, #0\n\t"
  95099. #endif
  95100. /* A[2] * B[5] */
  95101. "ldr r8, [%[a], #8]\n\t"
  95102. "ldr r9, [%[b], #20]\n\t"
  95103. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95104. "lsl r6, r8, #16\n\t"
  95105. "lsl r7, r9, #16\n\t"
  95106. "lsr r6, r6, #16\n\t"
  95107. "lsr r7, r7, #16\n\t"
  95108. "mul r7, r6, r7\n\t"
  95109. "adds r4, r4, r7\n\t"
  95110. "adcs r5, r5, #0\n\t"
  95111. "adc r3, r3, #0\n\t"
  95112. "lsr r7, r9, #16\n\t"
  95113. "mul r6, r7, r6\n\t"
  95114. "lsr r7, r6, #16\n\t"
  95115. "lsl r6, r6, #16\n\t"
  95116. "adds r4, r4, r6\n\t"
  95117. "adcs r5, r5, r7\n\t"
  95118. "adc r3, r3, #0\n\t"
  95119. "lsr r6, r8, #16\n\t"
  95120. "lsr r7, r9, #16\n\t"
  95121. "mul r7, r6, r7\n\t"
  95122. "adds r5, r5, r7\n\t"
  95123. "adc r3, r3, #0\n\t"
  95124. "lsl r7, r9, #16\n\t"
  95125. "lsr r7, r7, #16\n\t"
  95126. "mul r6, r7, r6\n\t"
  95127. "lsr r7, r6, #16\n\t"
  95128. "lsl r6, r6, #16\n\t"
  95129. "adds r4, r4, r6\n\t"
  95130. "adcs r5, r5, r7\n\t"
  95131. "adc r3, r3, #0\n\t"
  95132. #else
  95133. "umull r6, r7, r8, r9\n\t"
  95134. "adds r4, r4, r6\n\t"
  95135. "adcs r5, r5, r7\n\t"
  95136. "adc r3, r3, #0\n\t"
  95137. #endif
  95138. /* A[3] * B[4] */
  95139. "ldr r9, [%[b], #16]\n\t"
  95140. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95141. "lsl r6, r11, #16\n\t"
  95142. "lsl r7, r9, #16\n\t"
  95143. "lsr r6, r6, #16\n\t"
  95144. "lsr r7, r7, #16\n\t"
  95145. "mul r7, r6, r7\n\t"
  95146. "adds r4, r4, r7\n\t"
  95147. "adcs r5, r5, #0\n\t"
  95148. "adc r3, r3, #0\n\t"
  95149. "lsr r7, r9, #16\n\t"
  95150. "mul r6, r7, r6\n\t"
  95151. "lsr r7, r6, #16\n\t"
  95152. "lsl r6, r6, #16\n\t"
  95153. "adds r4, r4, r6\n\t"
  95154. "adcs r5, r5, r7\n\t"
  95155. "adc r3, r3, #0\n\t"
  95156. "lsr r6, r11, #16\n\t"
  95157. "lsr r7, r9, #16\n\t"
  95158. "mul r7, r6, r7\n\t"
  95159. "adds r5, r5, r7\n\t"
  95160. "adc r3, r3, #0\n\t"
  95161. "lsl r7, r9, #16\n\t"
  95162. "lsr r7, r7, #16\n\t"
  95163. "mul r6, r7, r6\n\t"
  95164. "lsr r7, r6, #16\n\t"
  95165. "lsl r6, r6, #16\n\t"
  95166. "adds r4, r4, r6\n\t"
  95167. "adcs r5, r5, r7\n\t"
  95168. "adc r3, r3, #0\n\t"
  95169. #else
  95170. "umull r6, r7, r11, r9\n\t"
  95171. "adds r4, r4, r6\n\t"
  95172. "adcs r5, r5, r7\n\t"
  95173. "adc r3, r3, #0\n\t"
  95174. #endif
  95175. /* A[4] * B[3] */
  95176. "ldr r8, [%[a], #16]\n\t"
  95177. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95178. "lsl r6, r8, #16\n\t"
  95179. "lsl r7, r12, #16\n\t"
  95180. "lsr r6, r6, #16\n\t"
  95181. "lsr r7, r7, #16\n\t"
  95182. "mul r7, r6, r7\n\t"
  95183. "adds r4, r4, r7\n\t"
  95184. "adcs r5, r5, #0\n\t"
  95185. "adc r3, r3, #0\n\t"
  95186. "lsr r7, r12, #16\n\t"
  95187. "mul r6, r7, r6\n\t"
  95188. "lsr r7, r6, #16\n\t"
  95189. "lsl r6, r6, #16\n\t"
  95190. "adds r4, r4, r6\n\t"
  95191. "adcs r5, r5, r7\n\t"
  95192. "adc r3, r3, #0\n\t"
  95193. "lsr r6, r8, #16\n\t"
  95194. "lsr r7, r12, #16\n\t"
  95195. "mul r7, r6, r7\n\t"
  95196. "adds r5, r5, r7\n\t"
  95197. "adc r3, r3, #0\n\t"
  95198. "lsl r7, r12, #16\n\t"
  95199. "lsr r7, r7, #16\n\t"
  95200. "mul r6, r7, r6\n\t"
  95201. "lsr r7, r6, #16\n\t"
  95202. "lsl r6, r6, #16\n\t"
  95203. "adds r4, r4, r6\n\t"
  95204. "adcs r5, r5, r7\n\t"
  95205. "adc r3, r3, #0\n\t"
  95206. #else
  95207. "umull r6, r7, r8, r12\n\t"
  95208. "adds r4, r4, r6\n\t"
  95209. "adcs r5, r5, r7\n\t"
  95210. "adc r3, r3, #0\n\t"
  95211. #endif
  95212. /* A[5] * B[2] */
  95213. "ldr r8, [%[a], #20]\n\t"
  95214. "ldr r9, [%[b], #8]\n\t"
  95215. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95216. "lsl r6, r8, #16\n\t"
  95217. "lsl r7, r9, #16\n\t"
  95218. "lsr r6, r6, #16\n\t"
  95219. "lsr r7, r7, #16\n\t"
  95220. "mul r7, r6, r7\n\t"
  95221. "adds r4, r4, r7\n\t"
  95222. "adcs r5, r5, #0\n\t"
  95223. "adc r3, r3, #0\n\t"
  95224. "lsr r7, r9, #16\n\t"
  95225. "mul r6, r7, r6\n\t"
  95226. "lsr r7, r6, #16\n\t"
  95227. "lsl r6, r6, #16\n\t"
  95228. "adds r4, r4, r6\n\t"
  95229. "adcs r5, r5, r7\n\t"
  95230. "adc r3, r3, #0\n\t"
  95231. "lsr r6, r8, #16\n\t"
  95232. "lsr r7, r9, #16\n\t"
  95233. "mul r7, r6, r7\n\t"
  95234. "adds r5, r5, r7\n\t"
  95235. "adc r3, r3, #0\n\t"
  95236. "lsl r7, r9, #16\n\t"
  95237. "lsr r7, r7, #16\n\t"
  95238. "mul r6, r7, r6\n\t"
  95239. "lsr r7, r6, #16\n\t"
  95240. "lsl r6, r6, #16\n\t"
  95241. "adds r4, r4, r6\n\t"
  95242. "adcs r5, r5, r7\n\t"
  95243. "adc r3, r3, #0\n\t"
  95244. #else
  95245. "umull r6, r7, r8, r9\n\t"
  95246. "adds r4, r4, r6\n\t"
  95247. "adcs r5, r5, r7\n\t"
  95248. "adc r3, r3, #0\n\t"
  95249. #endif
  95250. /* A[6] * B[1] */
  95251. "ldr r8, [%[a], #24]\n\t"
  95252. "ldr r9, [%[b], #4]\n\t"
  95253. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95254. "lsl r6, r8, #16\n\t"
  95255. "lsl r7, r9, #16\n\t"
  95256. "lsr r6, r6, #16\n\t"
  95257. "lsr r7, r7, #16\n\t"
  95258. "mul r7, r6, r7\n\t"
  95259. "adds r4, r4, r7\n\t"
  95260. "adcs r5, r5, #0\n\t"
  95261. "adc r3, r3, #0\n\t"
  95262. "lsr r7, r9, #16\n\t"
  95263. "mul r6, r7, r6\n\t"
  95264. "lsr r7, r6, #16\n\t"
  95265. "lsl r6, r6, #16\n\t"
  95266. "adds r4, r4, r6\n\t"
  95267. "adcs r5, r5, r7\n\t"
  95268. "adc r3, r3, #0\n\t"
  95269. "lsr r6, r8, #16\n\t"
  95270. "lsr r7, r9, #16\n\t"
  95271. "mul r7, r6, r7\n\t"
  95272. "adds r5, r5, r7\n\t"
  95273. "adc r3, r3, #0\n\t"
  95274. "lsl r7, r9, #16\n\t"
  95275. "lsr r7, r7, #16\n\t"
  95276. "mul r6, r7, r6\n\t"
  95277. "lsr r7, r6, #16\n\t"
  95278. "lsl r6, r6, #16\n\t"
  95279. "adds r4, r4, r6\n\t"
  95280. "adcs r5, r5, r7\n\t"
  95281. "adc r3, r3, #0\n\t"
  95282. #else
  95283. "umull r6, r7, r8, r9\n\t"
  95284. "adds r4, r4, r6\n\t"
  95285. "adcs r5, r5, r7\n\t"
  95286. "adc r3, r3, #0\n\t"
  95287. #endif
  95288. /* A[7] * B[0] */
  95289. "ldr r8, [%[a], #28]\n\t"
  95290. "ldr r9, [%[b]]\n\t"
  95291. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95292. "lsl r6, r8, #16\n\t"
  95293. "lsl r7, r9, #16\n\t"
  95294. "lsr r6, r6, #16\n\t"
  95295. "lsr r7, r7, #16\n\t"
  95296. "mul r7, r6, r7\n\t"
  95297. "adds r4, r4, r7\n\t"
  95298. "adcs r5, r5, #0\n\t"
  95299. "adc r3, r3, #0\n\t"
  95300. "lsr r7, r9, #16\n\t"
  95301. "mul r6, r7, r6\n\t"
  95302. "lsr r7, r6, #16\n\t"
  95303. "lsl r6, r6, #16\n\t"
  95304. "adds r4, r4, r6\n\t"
  95305. "adcs r5, r5, r7\n\t"
  95306. "adc r3, r3, #0\n\t"
  95307. "lsr r6, r8, #16\n\t"
  95308. "lsr r7, r9, #16\n\t"
  95309. "mul r7, r6, r7\n\t"
  95310. "adds r5, r5, r7\n\t"
  95311. "adc r3, r3, #0\n\t"
  95312. "lsl r7, r9, #16\n\t"
  95313. "lsr r7, r7, #16\n\t"
  95314. "mul r6, r7, r6\n\t"
  95315. "lsr r7, r6, #16\n\t"
  95316. "lsl r6, r6, #16\n\t"
  95317. "adds r4, r4, r6\n\t"
  95318. "adcs r5, r5, r7\n\t"
  95319. "adc r3, r3, #0\n\t"
  95320. #else
  95321. "umull r6, r7, r8, r9\n\t"
  95322. "adds r4, r4, r6\n\t"
  95323. "adcs r5, r5, r7\n\t"
  95324. "adc r3, r3, #0\n\t"
  95325. #endif
  95326. "str r4, [sp, #28]\n\t"
  95327. /* A[8] * B[0] */
  95328. "ldr r8, [%[a], #32]\n\t"
  95329. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95330. "lsl r6, r8, #16\n\t"
  95331. "lsl r7, r9, #16\n\t"
  95332. "lsr r6, r6, #16\n\t"
  95333. "lsr r7, r7, #16\n\t"
  95334. "mul r7, r6, r7\n\t"
  95335. "adds r5, r5, r7\n\t"
  95336. "adcs r3, r3, #0\n\t"
  95337. "mov r4, #0\n\t"
  95338. "adc r4, r4, #0\n\t"
  95339. "lsr r7, r9, #16\n\t"
  95340. "mul r6, r7, r6\n\t"
  95341. "lsr r7, r6, #16\n\t"
  95342. "lsl r6, r6, #16\n\t"
  95343. "adds r5, r5, r6\n\t"
  95344. "adcs r3, r3, r7\n\t"
  95345. "adc r4, r4, #0\n\t"
  95346. "lsr r6, r8, #16\n\t"
  95347. "lsr r7, r9, #16\n\t"
  95348. "mul r7, r6, r7\n\t"
  95349. "adds r3, r3, r7\n\t"
  95350. "adc r4, r4, #0\n\t"
  95351. "lsl r7, r9, #16\n\t"
  95352. "lsr r7, r7, #16\n\t"
  95353. "mul r6, r7, r6\n\t"
  95354. "lsr r7, r6, #16\n\t"
  95355. "lsl r6, r6, #16\n\t"
  95356. "adds r5, r5, r6\n\t"
  95357. "adcs r3, r3, r7\n\t"
  95358. "adc r4, r4, #0\n\t"
  95359. #else
  95360. "umull r6, r7, r8, r9\n\t"
  95361. "adds r5, r5, r6\n\t"
  95362. "adcs r3, r3, r7\n\t"
  95363. "mov r4, #0\n\t"
  95364. "adc r4, r4, #0\n\t"
  95365. #endif
  95366. /* A[7] * B[1] */
  95367. "ldr r8, [%[a], #28]\n\t"
  95368. "ldr r9, [%[b], #4]\n\t"
  95369. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95370. "lsl r6, r8, #16\n\t"
  95371. "lsl r7, r9, #16\n\t"
  95372. "lsr r6, r6, #16\n\t"
  95373. "lsr r7, r7, #16\n\t"
  95374. "mul r7, r6, r7\n\t"
  95375. "adds r5, r5, r7\n\t"
  95376. "adcs r3, r3, #0\n\t"
  95377. "adc r4, r4, #0\n\t"
  95378. "lsr r7, r9, #16\n\t"
  95379. "mul r6, r7, r6\n\t"
  95380. "lsr r7, r6, #16\n\t"
  95381. "lsl r6, r6, #16\n\t"
  95382. "adds r5, r5, r6\n\t"
  95383. "adcs r3, r3, r7\n\t"
  95384. "adc r4, r4, #0\n\t"
  95385. "lsr r6, r8, #16\n\t"
  95386. "lsr r7, r9, #16\n\t"
  95387. "mul r7, r6, r7\n\t"
  95388. "adds r3, r3, r7\n\t"
  95389. "adc r4, r4, #0\n\t"
  95390. "lsl r7, r9, #16\n\t"
  95391. "lsr r7, r7, #16\n\t"
  95392. "mul r6, r7, r6\n\t"
  95393. "lsr r7, r6, #16\n\t"
  95394. "lsl r6, r6, #16\n\t"
  95395. "adds r5, r5, r6\n\t"
  95396. "adcs r3, r3, r7\n\t"
  95397. "adc r4, r4, #0\n\t"
  95398. #else
  95399. "umull r6, r7, r8, r9\n\t"
  95400. "adds r5, r5, r6\n\t"
  95401. "adcs r3, r3, r7\n\t"
  95402. "adc r4, r4, #0\n\t"
  95403. #endif
  95404. /* A[6] * B[2] */
  95405. "ldr r8, [%[a], #24]\n\t"
  95406. "ldr r9, [%[b], #8]\n\t"
  95407. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95408. "lsl r6, r8, #16\n\t"
  95409. "lsl r7, r9, #16\n\t"
  95410. "lsr r6, r6, #16\n\t"
  95411. "lsr r7, r7, #16\n\t"
  95412. "mul r7, r6, r7\n\t"
  95413. "adds r5, r5, r7\n\t"
  95414. "adcs r3, r3, #0\n\t"
  95415. "adc r4, r4, #0\n\t"
  95416. "lsr r7, r9, #16\n\t"
  95417. "mul r6, r7, r6\n\t"
  95418. "lsr r7, r6, #16\n\t"
  95419. "lsl r6, r6, #16\n\t"
  95420. "adds r5, r5, r6\n\t"
  95421. "adcs r3, r3, r7\n\t"
  95422. "adc r4, r4, #0\n\t"
  95423. "lsr r6, r8, #16\n\t"
  95424. "lsr r7, r9, #16\n\t"
  95425. "mul r7, r6, r7\n\t"
  95426. "adds r3, r3, r7\n\t"
  95427. "adc r4, r4, #0\n\t"
  95428. "lsl r7, r9, #16\n\t"
  95429. "lsr r7, r7, #16\n\t"
  95430. "mul r6, r7, r6\n\t"
  95431. "lsr r7, r6, #16\n\t"
  95432. "lsl r6, r6, #16\n\t"
  95433. "adds r5, r5, r6\n\t"
  95434. "adcs r3, r3, r7\n\t"
  95435. "adc r4, r4, #0\n\t"
  95436. #else
  95437. "umull r6, r7, r8, r9\n\t"
  95438. "adds r5, r5, r6\n\t"
  95439. "adcs r3, r3, r7\n\t"
  95440. "adc r4, r4, #0\n\t"
  95441. #endif
  95442. /* A[5] * B[3] */
  95443. "ldr r8, [%[a], #20]\n\t"
  95444. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95445. "lsl r6, r8, #16\n\t"
  95446. "lsl r7, r12, #16\n\t"
  95447. "lsr r6, r6, #16\n\t"
  95448. "lsr r7, r7, #16\n\t"
  95449. "mul r7, r6, r7\n\t"
  95450. "adds r5, r5, r7\n\t"
  95451. "adcs r3, r3, #0\n\t"
  95452. "adc r4, r4, #0\n\t"
  95453. "lsr r7, r12, #16\n\t"
  95454. "mul r6, r7, r6\n\t"
  95455. "lsr r7, r6, #16\n\t"
  95456. "lsl r6, r6, #16\n\t"
  95457. "adds r5, r5, r6\n\t"
  95458. "adcs r3, r3, r7\n\t"
  95459. "adc r4, r4, #0\n\t"
  95460. "lsr r6, r8, #16\n\t"
  95461. "lsr r7, r12, #16\n\t"
  95462. "mul r7, r6, r7\n\t"
  95463. "adds r3, r3, r7\n\t"
  95464. "adc r4, r4, #0\n\t"
  95465. "lsl r7, r12, #16\n\t"
  95466. "lsr r7, r7, #16\n\t"
  95467. "mul r6, r7, r6\n\t"
  95468. "lsr r7, r6, #16\n\t"
  95469. "lsl r6, r6, #16\n\t"
  95470. "adds r5, r5, r6\n\t"
  95471. "adcs r3, r3, r7\n\t"
  95472. "adc r4, r4, #0\n\t"
  95473. #else
  95474. "umull r6, r7, r8, r12\n\t"
  95475. "adds r5, r5, r6\n\t"
  95476. "adcs r3, r3, r7\n\t"
  95477. "adc r4, r4, #0\n\t"
  95478. #endif
  95479. /* A[4] * B[4] */
  95480. "ldr r11, [%[a], #16]\n\t"
  95481. "ldr r12, [%[b], #16]\n\t"
  95482. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95483. "lsl r6, r11, #16\n\t"
  95484. "lsl r7, r12, #16\n\t"
  95485. "lsr r6, r6, #16\n\t"
  95486. "lsr r7, r7, #16\n\t"
  95487. "mul r7, r6, r7\n\t"
  95488. "adds r5, r5, r7\n\t"
  95489. "adcs r3, r3, #0\n\t"
  95490. "adc r4, r4, #0\n\t"
  95491. "lsr r7, r12, #16\n\t"
  95492. "mul r6, r7, r6\n\t"
  95493. "lsr r7, r6, #16\n\t"
  95494. "lsl r6, r6, #16\n\t"
  95495. "adds r5, r5, r6\n\t"
  95496. "adcs r3, r3, r7\n\t"
  95497. "adc r4, r4, #0\n\t"
  95498. "lsr r6, r11, #16\n\t"
  95499. "lsr r7, r12, #16\n\t"
  95500. "mul r7, r6, r7\n\t"
  95501. "adds r3, r3, r7\n\t"
  95502. "adc r4, r4, #0\n\t"
  95503. "lsl r7, r12, #16\n\t"
  95504. "lsr r7, r7, #16\n\t"
  95505. "mul r6, r7, r6\n\t"
  95506. "lsr r7, r6, #16\n\t"
  95507. "lsl r6, r6, #16\n\t"
  95508. "adds r5, r5, r6\n\t"
  95509. "adcs r3, r3, r7\n\t"
  95510. "adc r4, r4, #0\n\t"
  95511. #else
  95512. "umull r6, r7, r11, r12\n\t"
  95513. "adds r5, r5, r6\n\t"
  95514. "adcs r3, r3, r7\n\t"
  95515. "adc r4, r4, #0\n\t"
  95516. #endif
  95517. /* A[3] * B[5] */
  95518. "ldr r8, [%[a], #12]\n\t"
  95519. "ldr r9, [%[b], #20]\n\t"
  95520. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95521. "lsl r6, r8, #16\n\t"
  95522. "lsl r7, r9, #16\n\t"
  95523. "lsr r6, r6, #16\n\t"
  95524. "lsr r7, r7, #16\n\t"
  95525. "mul r7, r6, r7\n\t"
  95526. "adds r5, r5, r7\n\t"
  95527. "adcs r3, r3, #0\n\t"
  95528. "adc r4, r4, #0\n\t"
  95529. "lsr r7, r9, #16\n\t"
  95530. "mul r6, r7, r6\n\t"
  95531. "lsr r7, r6, #16\n\t"
  95532. "lsl r6, r6, #16\n\t"
  95533. "adds r5, r5, r6\n\t"
  95534. "adcs r3, r3, r7\n\t"
  95535. "adc r4, r4, #0\n\t"
  95536. "lsr r6, r8, #16\n\t"
  95537. "lsr r7, r9, #16\n\t"
  95538. "mul r7, r6, r7\n\t"
  95539. "adds r3, r3, r7\n\t"
  95540. "adc r4, r4, #0\n\t"
  95541. "lsl r7, r9, #16\n\t"
  95542. "lsr r7, r7, #16\n\t"
  95543. "mul r6, r7, r6\n\t"
  95544. "lsr r7, r6, #16\n\t"
  95545. "lsl r6, r6, #16\n\t"
  95546. "adds r5, r5, r6\n\t"
  95547. "adcs r3, r3, r7\n\t"
  95548. "adc r4, r4, #0\n\t"
  95549. #else
  95550. "umull r6, r7, r8, r9\n\t"
  95551. "adds r5, r5, r6\n\t"
  95552. "adcs r3, r3, r7\n\t"
  95553. "adc r4, r4, #0\n\t"
  95554. #endif
  95555. /* A[2] * B[6] */
  95556. "ldr r8, [%[a], #8]\n\t"
  95557. "ldr r9, [%[b], #24]\n\t"
  95558. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95559. "lsl r6, r8, #16\n\t"
  95560. "lsl r7, r9, #16\n\t"
  95561. "lsr r6, r6, #16\n\t"
  95562. "lsr r7, r7, #16\n\t"
  95563. "mul r7, r6, r7\n\t"
  95564. "adds r5, r5, r7\n\t"
  95565. "adcs r3, r3, #0\n\t"
  95566. "adc r4, r4, #0\n\t"
  95567. "lsr r7, r9, #16\n\t"
  95568. "mul r6, r7, r6\n\t"
  95569. "lsr r7, r6, #16\n\t"
  95570. "lsl r6, r6, #16\n\t"
  95571. "adds r5, r5, r6\n\t"
  95572. "adcs r3, r3, r7\n\t"
  95573. "adc r4, r4, #0\n\t"
  95574. "lsr r6, r8, #16\n\t"
  95575. "lsr r7, r9, #16\n\t"
  95576. "mul r7, r6, r7\n\t"
  95577. "adds r3, r3, r7\n\t"
  95578. "adc r4, r4, #0\n\t"
  95579. "lsl r7, r9, #16\n\t"
  95580. "lsr r7, r7, #16\n\t"
  95581. "mul r6, r7, r6\n\t"
  95582. "lsr r7, r6, #16\n\t"
  95583. "lsl r6, r6, #16\n\t"
  95584. "adds r5, r5, r6\n\t"
  95585. "adcs r3, r3, r7\n\t"
  95586. "adc r4, r4, #0\n\t"
  95587. #else
  95588. "umull r6, r7, r8, r9\n\t"
  95589. "adds r5, r5, r6\n\t"
  95590. "adcs r3, r3, r7\n\t"
  95591. "adc r4, r4, #0\n\t"
  95592. #endif
  95593. /* A[1] * B[7] */
  95594. "ldr r8, [%[a], #4]\n\t"
  95595. "ldr r9, [%[b], #28]\n\t"
  95596. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95597. "lsl r6, r8, #16\n\t"
  95598. "lsl r7, r9, #16\n\t"
  95599. "lsr r6, r6, #16\n\t"
  95600. "lsr r7, r7, #16\n\t"
  95601. "mul r7, r6, r7\n\t"
  95602. "adds r5, r5, r7\n\t"
  95603. "adcs r3, r3, #0\n\t"
  95604. "adc r4, r4, #0\n\t"
  95605. "lsr r7, r9, #16\n\t"
  95606. "mul r6, r7, r6\n\t"
  95607. "lsr r7, r6, #16\n\t"
  95608. "lsl r6, r6, #16\n\t"
  95609. "adds r5, r5, r6\n\t"
  95610. "adcs r3, r3, r7\n\t"
  95611. "adc r4, r4, #0\n\t"
  95612. "lsr r6, r8, #16\n\t"
  95613. "lsr r7, r9, #16\n\t"
  95614. "mul r7, r6, r7\n\t"
  95615. "adds r3, r3, r7\n\t"
  95616. "adc r4, r4, #0\n\t"
  95617. "lsl r7, r9, #16\n\t"
  95618. "lsr r7, r7, #16\n\t"
  95619. "mul r6, r7, r6\n\t"
  95620. "lsr r7, r6, #16\n\t"
  95621. "lsl r6, r6, #16\n\t"
  95622. "adds r5, r5, r6\n\t"
  95623. "adcs r3, r3, r7\n\t"
  95624. "adc r4, r4, #0\n\t"
  95625. #else
  95626. "umull r6, r7, r8, r9\n\t"
  95627. "adds r5, r5, r6\n\t"
  95628. "adcs r3, r3, r7\n\t"
  95629. "adc r4, r4, #0\n\t"
  95630. #endif
  95631. /* A[0] * B[8] */
  95632. "ldr r8, [%[a]]\n\t"
  95633. "ldr r9, [%[b], #32]\n\t"
  95634. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95635. "lsl r6, r8, #16\n\t"
  95636. "lsl r7, r9, #16\n\t"
  95637. "lsr r6, r6, #16\n\t"
  95638. "lsr r7, r7, #16\n\t"
  95639. "mul r7, r6, r7\n\t"
  95640. "adds r5, r5, r7\n\t"
  95641. "adcs r3, r3, #0\n\t"
  95642. "adc r4, r4, #0\n\t"
  95643. "lsr r7, r9, #16\n\t"
  95644. "mul r6, r7, r6\n\t"
  95645. "lsr r7, r6, #16\n\t"
  95646. "lsl r6, r6, #16\n\t"
  95647. "adds r5, r5, r6\n\t"
  95648. "adcs r3, r3, r7\n\t"
  95649. "adc r4, r4, #0\n\t"
  95650. "lsr r6, r8, #16\n\t"
  95651. "lsr r7, r9, #16\n\t"
  95652. "mul r7, r6, r7\n\t"
  95653. "adds r3, r3, r7\n\t"
  95654. "adc r4, r4, #0\n\t"
  95655. "lsl r7, r9, #16\n\t"
  95656. "lsr r7, r7, #16\n\t"
  95657. "mul r6, r7, r6\n\t"
  95658. "lsr r7, r6, #16\n\t"
  95659. "lsl r6, r6, #16\n\t"
  95660. "adds r5, r5, r6\n\t"
  95661. "adcs r3, r3, r7\n\t"
  95662. "adc r4, r4, #0\n\t"
  95663. #else
  95664. "umull r6, r7, r8, r9\n\t"
  95665. "adds r5, r5, r6\n\t"
  95666. "adcs r3, r3, r7\n\t"
  95667. "adc r4, r4, #0\n\t"
  95668. #endif
  95669. "str r5, [sp, #32]\n\t"
  95670. /* A[0] * B[9] */
  95671. "ldr r9, [%[b], #36]\n\t"
  95672. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95673. "lsl r6, r8, #16\n\t"
  95674. "lsl r7, r9, #16\n\t"
  95675. "lsr r6, r6, #16\n\t"
  95676. "lsr r7, r7, #16\n\t"
  95677. "mul r7, r6, r7\n\t"
  95678. "adds r3, r3, r7\n\t"
  95679. "adcs r4, r4, #0\n\t"
  95680. "mov r5, #0\n\t"
  95681. "adc r5, r5, #0\n\t"
  95682. "lsr r7, r9, #16\n\t"
  95683. "mul r6, r7, r6\n\t"
  95684. "lsr r7, r6, #16\n\t"
  95685. "lsl r6, r6, #16\n\t"
  95686. "adds r3, r3, r6\n\t"
  95687. "adcs r4, r4, r7\n\t"
  95688. "adc r5, r5, #0\n\t"
  95689. "lsr r6, r8, #16\n\t"
  95690. "lsr r7, r9, #16\n\t"
  95691. "mul r7, r6, r7\n\t"
  95692. "adds r4, r4, r7\n\t"
  95693. "adc r5, r5, #0\n\t"
  95694. "lsl r7, r9, #16\n\t"
  95695. "lsr r7, r7, #16\n\t"
  95696. "mul r6, r7, r6\n\t"
  95697. "lsr r7, r6, #16\n\t"
  95698. "lsl r6, r6, #16\n\t"
  95699. "adds r3, r3, r6\n\t"
  95700. "adcs r4, r4, r7\n\t"
  95701. "adc r5, r5, #0\n\t"
  95702. #else
  95703. "umull r6, r7, r8, r9\n\t"
  95704. "adds r3, r3, r6\n\t"
  95705. "adcs r4, r4, r7\n\t"
  95706. "mov r5, #0\n\t"
  95707. "adc r5, r5, #0\n\t"
  95708. #endif
  95709. /* A[1] * B[8] */
  95710. "ldr r8, [%[a], #4]\n\t"
  95711. "ldr r9, [%[b], #32]\n\t"
  95712. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95713. "lsl r6, r8, #16\n\t"
  95714. "lsl r7, r9, #16\n\t"
  95715. "lsr r6, r6, #16\n\t"
  95716. "lsr r7, r7, #16\n\t"
  95717. "mul r7, r6, r7\n\t"
  95718. "adds r3, r3, r7\n\t"
  95719. "adcs r4, r4, #0\n\t"
  95720. "adc r5, r5, #0\n\t"
  95721. "lsr r7, r9, #16\n\t"
  95722. "mul r6, r7, r6\n\t"
  95723. "lsr r7, r6, #16\n\t"
  95724. "lsl r6, r6, #16\n\t"
  95725. "adds r3, r3, r6\n\t"
  95726. "adcs r4, r4, r7\n\t"
  95727. "adc r5, r5, #0\n\t"
  95728. "lsr r6, r8, #16\n\t"
  95729. "lsr r7, r9, #16\n\t"
  95730. "mul r7, r6, r7\n\t"
  95731. "adds r4, r4, r7\n\t"
  95732. "adc r5, r5, #0\n\t"
  95733. "lsl r7, r9, #16\n\t"
  95734. "lsr r7, r7, #16\n\t"
  95735. "mul r6, r7, r6\n\t"
  95736. "lsr r7, r6, #16\n\t"
  95737. "lsl r6, r6, #16\n\t"
  95738. "adds r3, r3, r6\n\t"
  95739. "adcs r4, r4, r7\n\t"
  95740. "adc r5, r5, #0\n\t"
  95741. #else
  95742. "umull r6, r7, r8, r9\n\t"
  95743. "adds r3, r3, r6\n\t"
  95744. "adcs r4, r4, r7\n\t"
  95745. "adc r5, r5, #0\n\t"
  95746. #endif
  95747. /* A[2] * B[7] */
  95748. "ldr r8, [%[a], #8]\n\t"
  95749. "ldr r9, [%[b], #28]\n\t"
  95750. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95751. "lsl r6, r8, #16\n\t"
  95752. "lsl r7, r9, #16\n\t"
  95753. "lsr r6, r6, #16\n\t"
  95754. "lsr r7, r7, #16\n\t"
  95755. "mul r7, r6, r7\n\t"
  95756. "adds r3, r3, r7\n\t"
  95757. "adcs r4, r4, #0\n\t"
  95758. "adc r5, r5, #0\n\t"
  95759. "lsr r7, r9, #16\n\t"
  95760. "mul r6, r7, r6\n\t"
  95761. "lsr r7, r6, #16\n\t"
  95762. "lsl r6, r6, #16\n\t"
  95763. "adds r3, r3, r6\n\t"
  95764. "adcs r4, r4, r7\n\t"
  95765. "adc r5, r5, #0\n\t"
  95766. "lsr r6, r8, #16\n\t"
  95767. "lsr r7, r9, #16\n\t"
  95768. "mul r7, r6, r7\n\t"
  95769. "adds r4, r4, r7\n\t"
  95770. "adc r5, r5, #0\n\t"
  95771. "lsl r7, r9, #16\n\t"
  95772. "lsr r7, r7, #16\n\t"
  95773. "mul r6, r7, r6\n\t"
  95774. "lsr r7, r6, #16\n\t"
  95775. "lsl r6, r6, #16\n\t"
  95776. "adds r3, r3, r6\n\t"
  95777. "adcs r4, r4, r7\n\t"
  95778. "adc r5, r5, #0\n\t"
  95779. #else
  95780. "umull r6, r7, r8, r9\n\t"
  95781. "adds r3, r3, r6\n\t"
  95782. "adcs r4, r4, r7\n\t"
  95783. "adc r5, r5, #0\n\t"
  95784. #endif
  95785. /* A[3] * B[6] */
  95786. "ldr r8, [%[a], #12]\n\t"
  95787. "ldr r9, [%[b], #24]\n\t"
  95788. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95789. "lsl r6, r8, #16\n\t"
  95790. "lsl r7, r9, #16\n\t"
  95791. "lsr r6, r6, #16\n\t"
  95792. "lsr r7, r7, #16\n\t"
  95793. "mul r7, r6, r7\n\t"
  95794. "adds r3, r3, r7\n\t"
  95795. "adcs r4, r4, #0\n\t"
  95796. "adc r5, r5, #0\n\t"
  95797. "lsr r7, r9, #16\n\t"
  95798. "mul r6, r7, r6\n\t"
  95799. "lsr r7, r6, #16\n\t"
  95800. "lsl r6, r6, #16\n\t"
  95801. "adds r3, r3, r6\n\t"
  95802. "adcs r4, r4, r7\n\t"
  95803. "adc r5, r5, #0\n\t"
  95804. "lsr r6, r8, #16\n\t"
  95805. "lsr r7, r9, #16\n\t"
  95806. "mul r7, r6, r7\n\t"
  95807. "adds r4, r4, r7\n\t"
  95808. "adc r5, r5, #0\n\t"
  95809. "lsl r7, r9, #16\n\t"
  95810. "lsr r7, r7, #16\n\t"
  95811. "mul r6, r7, r6\n\t"
  95812. "lsr r7, r6, #16\n\t"
  95813. "lsl r6, r6, #16\n\t"
  95814. "adds r3, r3, r6\n\t"
  95815. "adcs r4, r4, r7\n\t"
  95816. "adc r5, r5, #0\n\t"
  95817. #else
  95818. "umull r6, r7, r8, r9\n\t"
  95819. "adds r3, r3, r6\n\t"
  95820. "adcs r4, r4, r7\n\t"
  95821. "adc r5, r5, #0\n\t"
  95822. #endif
  95823. /* A[4] * B[5] */
  95824. "ldr r9, [%[b], #20]\n\t"
  95825. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95826. "lsl r6, r11, #16\n\t"
  95827. "lsl r7, r9, #16\n\t"
  95828. "lsr r6, r6, #16\n\t"
  95829. "lsr r7, r7, #16\n\t"
  95830. "mul r7, r6, r7\n\t"
  95831. "adds r3, r3, r7\n\t"
  95832. "adcs r4, r4, #0\n\t"
  95833. "adc r5, r5, #0\n\t"
  95834. "lsr r7, r9, #16\n\t"
  95835. "mul r6, r7, r6\n\t"
  95836. "lsr r7, r6, #16\n\t"
  95837. "lsl r6, r6, #16\n\t"
  95838. "adds r3, r3, r6\n\t"
  95839. "adcs r4, r4, r7\n\t"
  95840. "adc r5, r5, #0\n\t"
  95841. "lsr r6, r11, #16\n\t"
  95842. "lsr r7, r9, #16\n\t"
  95843. "mul r7, r6, r7\n\t"
  95844. "adds r4, r4, r7\n\t"
  95845. "adc r5, r5, #0\n\t"
  95846. "lsl r7, r9, #16\n\t"
  95847. "lsr r7, r7, #16\n\t"
  95848. "mul r6, r7, r6\n\t"
  95849. "lsr r7, r6, #16\n\t"
  95850. "lsl r6, r6, #16\n\t"
  95851. "adds r3, r3, r6\n\t"
  95852. "adcs r4, r4, r7\n\t"
  95853. "adc r5, r5, #0\n\t"
  95854. #else
  95855. "umull r6, r7, r11, r9\n\t"
  95856. "adds r3, r3, r6\n\t"
  95857. "adcs r4, r4, r7\n\t"
  95858. "adc r5, r5, #0\n\t"
  95859. #endif
  95860. /* A[5] * B[4] */
  95861. "ldr r8, [%[a], #20]\n\t"
  95862. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95863. "lsl r6, r8, #16\n\t"
  95864. "lsl r7, r12, #16\n\t"
  95865. "lsr r6, r6, #16\n\t"
  95866. "lsr r7, r7, #16\n\t"
  95867. "mul r7, r6, r7\n\t"
  95868. "adds r3, r3, r7\n\t"
  95869. "adcs r4, r4, #0\n\t"
  95870. "adc r5, r5, #0\n\t"
  95871. "lsr r7, r12, #16\n\t"
  95872. "mul r6, r7, r6\n\t"
  95873. "lsr r7, r6, #16\n\t"
  95874. "lsl r6, r6, #16\n\t"
  95875. "adds r3, r3, r6\n\t"
  95876. "adcs r4, r4, r7\n\t"
  95877. "adc r5, r5, #0\n\t"
  95878. "lsr r6, r8, #16\n\t"
  95879. "lsr r7, r12, #16\n\t"
  95880. "mul r7, r6, r7\n\t"
  95881. "adds r4, r4, r7\n\t"
  95882. "adc r5, r5, #0\n\t"
  95883. "lsl r7, r12, #16\n\t"
  95884. "lsr r7, r7, #16\n\t"
  95885. "mul r6, r7, r6\n\t"
  95886. "lsr r7, r6, #16\n\t"
  95887. "lsl r6, r6, #16\n\t"
  95888. "adds r3, r3, r6\n\t"
  95889. "adcs r4, r4, r7\n\t"
  95890. "adc r5, r5, #0\n\t"
  95891. #else
  95892. "umull r6, r7, r8, r12\n\t"
  95893. "adds r3, r3, r6\n\t"
  95894. "adcs r4, r4, r7\n\t"
  95895. "adc r5, r5, #0\n\t"
  95896. #endif
  95897. /* A[6] * B[3] */
  95898. "ldr r8, [%[a], #24]\n\t"
  95899. "ldr r9, [%[b], #12]\n\t"
  95900. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95901. "lsl r6, r8, #16\n\t"
  95902. "lsl r7, r9, #16\n\t"
  95903. "lsr r6, r6, #16\n\t"
  95904. "lsr r7, r7, #16\n\t"
  95905. "mul r7, r6, r7\n\t"
  95906. "adds r3, r3, r7\n\t"
  95907. "adcs r4, r4, #0\n\t"
  95908. "adc r5, r5, #0\n\t"
  95909. "lsr r7, r9, #16\n\t"
  95910. "mul r6, r7, r6\n\t"
  95911. "lsr r7, r6, #16\n\t"
  95912. "lsl r6, r6, #16\n\t"
  95913. "adds r3, r3, r6\n\t"
  95914. "adcs r4, r4, r7\n\t"
  95915. "adc r5, r5, #0\n\t"
  95916. "lsr r6, r8, #16\n\t"
  95917. "lsr r7, r9, #16\n\t"
  95918. "mul r7, r6, r7\n\t"
  95919. "adds r4, r4, r7\n\t"
  95920. "adc r5, r5, #0\n\t"
  95921. "lsl r7, r9, #16\n\t"
  95922. "lsr r7, r7, #16\n\t"
  95923. "mul r6, r7, r6\n\t"
  95924. "lsr r7, r6, #16\n\t"
  95925. "lsl r6, r6, #16\n\t"
  95926. "adds r3, r3, r6\n\t"
  95927. "adcs r4, r4, r7\n\t"
  95928. "adc r5, r5, #0\n\t"
  95929. #else
  95930. "umull r6, r7, r8, r9\n\t"
  95931. "adds r3, r3, r6\n\t"
  95932. "adcs r4, r4, r7\n\t"
  95933. "adc r5, r5, #0\n\t"
  95934. #endif
  95935. /* A[7] * B[2] */
  95936. "ldr r8, [%[a], #28]\n\t"
  95937. "ldr r9, [%[b], #8]\n\t"
  95938. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95939. "lsl r6, r8, #16\n\t"
  95940. "lsl r7, r9, #16\n\t"
  95941. "lsr r6, r6, #16\n\t"
  95942. "lsr r7, r7, #16\n\t"
  95943. "mul r7, r6, r7\n\t"
  95944. "adds r3, r3, r7\n\t"
  95945. "adcs r4, r4, #0\n\t"
  95946. "adc r5, r5, #0\n\t"
  95947. "lsr r7, r9, #16\n\t"
  95948. "mul r6, r7, r6\n\t"
  95949. "lsr r7, r6, #16\n\t"
  95950. "lsl r6, r6, #16\n\t"
  95951. "adds r3, r3, r6\n\t"
  95952. "adcs r4, r4, r7\n\t"
  95953. "adc r5, r5, #0\n\t"
  95954. "lsr r6, r8, #16\n\t"
  95955. "lsr r7, r9, #16\n\t"
  95956. "mul r7, r6, r7\n\t"
  95957. "adds r4, r4, r7\n\t"
  95958. "adc r5, r5, #0\n\t"
  95959. "lsl r7, r9, #16\n\t"
  95960. "lsr r7, r7, #16\n\t"
  95961. "mul r6, r7, r6\n\t"
  95962. "lsr r7, r6, #16\n\t"
  95963. "lsl r6, r6, #16\n\t"
  95964. "adds r3, r3, r6\n\t"
  95965. "adcs r4, r4, r7\n\t"
  95966. "adc r5, r5, #0\n\t"
  95967. #else
  95968. "umull r6, r7, r8, r9\n\t"
  95969. "adds r3, r3, r6\n\t"
  95970. "adcs r4, r4, r7\n\t"
  95971. "adc r5, r5, #0\n\t"
  95972. #endif
  95973. /* A[8] * B[1] */
  95974. "ldr r8, [%[a], #32]\n\t"
  95975. "ldr r9, [%[b], #4]\n\t"
  95976. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  95977. "lsl r6, r8, #16\n\t"
  95978. "lsl r7, r9, #16\n\t"
  95979. "lsr r6, r6, #16\n\t"
  95980. "lsr r7, r7, #16\n\t"
  95981. "mul r7, r6, r7\n\t"
  95982. "adds r3, r3, r7\n\t"
  95983. "adcs r4, r4, #0\n\t"
  95984. "adc r5, r5, #0\n\t"
  95985. "lsr r7, r9, #16\n\t"
  95986. "mul r6, r7, r6\n\t"
  95987. "lsr r7, r6, #16\n\t"
  95988. "lsl r6, r6, #16\n\t"
  95989. "adds r3, r3, r6\n\t"
  95990. "adcs r4, r4, r7\n\t"
  95991. "adc r5, r5, #0\n\t"
  95992. "lsr r6, r8, #16\n\t"
  95993. "lsr r7, r9, #16\n\t"
  95994. "mul r7, r6, r7\n\t"
  95995. "adds r4, r4, r7\n\t"
  95996. "adc r5, r5, #0\n\t"
  95997. "lsl r7, r9, #16\n\t"
  95998. "lsr r7, r7, #16\n\t"
  95999. "mul r6, r7, r6\n\t"
  96000. "lsr r7, r6, #16\n\t"
  96001. "lsl r6, r6, #16\n\t"
  96002. "adds r3, r3, r6\n\t"
  96003. "adcs r4, r4, r7\n\t"
  96004. "adc r5, r5, #0\n\t"
  96005. #else
  96006. "umull r6, r7, r8, r9\n\t"
  96007. "adds r3, r3, r6\n\t"
  96008. "adcs r4, r4, r7\n\t"
  96009. "adc r5, r5, #0\n\t"
  96010. #endif
  96011. /* A[9] * B[0] */
  96012. "ldr r8, [%[a], #36]\n\t"
  96013. "ldr r9, [%[b]]\n\t"
  96014. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96015. "lsl r6, r8, #16\n\t"
  96016. "lsl r7, r9, #16\n\t"
  96017. "lsr r6, r6, #16\n\t"
  96018. "lsr r7, r7, #16\n\t"
  96019. "mul r7, r6, r7\n\t"
  96020. "adds r3, r3, r7\n\t"
  96021. "adcs r4, r4, #0\n\t"
  96022. "adc r5, r5, #0\n\t"
  96023. "lsr r7, r9, #16\n\t"
  96024. "mul r6, r7, r6\n\t"
  96025. "lsr r7, r6, #16\n\t"
  96026. "lsl r6, r6, #16\n\t"
  96027. "adds r3, r3, r6\n\t"
  96028. "adcs r4, r4, r7\n\t"
  96029. "adc r5, r5, #0\n\t"
  96030. "lsr r6, r8, #16\n\t"
  96031. "lsr r7, r9, #16\n\t"
  96032. "mul r7, r6, r7\n\t"
  96033. "adds r4, r4, r7\n\t"
  96034. "adc r5, r5, #0\n\t"
  96035. "lsl r7, r9, #16\n\t"
  96036. "lsr r7, r7, #16\n\t"
  96037. "mul r6, r7, r6\n\t"
  96038. "lsr r7, r6, #16\n\t"
  96039. "lsl r6, r6, #16\n\t"
  96040. "adds r3, r3, r6\n\t"
  96041. "adcs r4, r4, r7\n\t"
  96042. "adc r5, r5, #0\n\t"
  96043. #else
  96044. "umull r6, r7, r8, r9\n\t"
  96045. "adds r3, r3, r6\n\t"
  96046. "adcs r4, r4, r7\n\t"
  96047. "adc r5, r5, #0\n\t"
  96048. #endif
  96049. "str r3, [sp, #36]\n\t"
  96050. /* A[10] * B[0] */
  96051. "ldr r8, [%[a], #40]\n\t"
  96052. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96053. "lsl r6, r8, #16\n\t"
  96054. "lsl r7, r9, #16\n\t"
  96055. "lsr r6, r6, #16\n\t"
  96056. "lsr r7, r7, #16\n\t"
  96057. "mul r7, r6, r7\n\t"
  96058. "adds r4, r4, r7\n\t"
  96059. "adcs r5, r5, #0\n\t"
  96060. "mov r3, #0\n\t"
  96061. "adc r3, r3, #0\n\t"
  96062. "lsr r7, r9, #16\n\t"
  96063. "mul r6, r7, r6\n\t"
  96064. "lsr r7, r6, #16\n\t"
  96065. "lsl r6, r6, #16\n\t"
  96066. "adds r4, r4, r6\n\t"
  96067. "adcs r5, r5, r7\n\t"
  96068. "adc r3, r3, #0\n\t"
  96069. "lsr r6, r8, #16\n\t"
  96070. "lsr r7, r9, #16\n\t"
  96071. "mul r7, r6, r7\n\t"
  96072. "adds r5, r5, r7\n\t"
  96073. "adc r3, r3, #0\n\t"
  96074. "lsl r7, r9, #16\n\t"
  96075. "lsr r7, r7, #16\n\t"
  96076. "mul r6, r7, r6\n\t"
  96077. "lsr r7, r6, #16\n\t"
  96078. "lsl r6, r6, #16\n\t"
  96079. "adds r4, r4, r6\n\t"
  96080. "adcs r5, r5, r7\n\t"
  96081. "adc r3, r3, #0\n\t"
  96082. #else
  96083. "umull r6, r7, r8, r9\n\t"
  96084. "adds r4, r4, r6\n\t"
  96085. "adcs r5, r5, r7\n\t"
  96086. "mov r3, #0\n\t"
  96087. "adc r3, r3, #0\n\t"
  96088. #endif
  96089. /* A[9] * B[1] */
  96090. "ldr r8, [%[a], #36]\n\t"
  96091. "ldr r9, [%[b], #4]\n\t"
  96092. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96093. "lsl r6, r8, #16\n\t"
  96094. "lsl r7, r9, #16\n\t"
  96095. "lsr r6, r6, #16\n\t"
  96096. "lsr r7, r7, #16\n\t"
  96097. "mul r7, r6, r7\n\t"
  96098. "adds r4, r4, r7\n\t"
  96099. "adcs r5, r5, #0\n\t"
  96100. "adc r3, r3, #0\n\t"
  96101. "lsr r7, r9, #16\n\t"
  96102. "mul r6, r7, r6\n\t"
  96103. "lsr r7, r6, #16\n\t"
  96104. "lsl r6, r6, #16\n\t"
  96105. "adds r4, r4, r6\n\t"
  96106. "adcs r5, r5, r7\n\t"
  96107. "adc r3, r3, #0\n\t"
  96108. "lsr r6, r8, #16\n\t"
  96109. "lsr r7, r9, #16\n\t"
  96110. "mul r7, r6, r7\n\t"
  96111. "adds r5, r5, r7\n\t"
  96112. "adc r3, r3, #0\n\t"
  96113. "lsl r7, r9, #16\n\t"
  96114. "lsr r7, r7, #16\n\t"
  96115. "mul r6, r7, r6\n\t"
  96116. "lsr r7, r6, #16\n\t"
  96117. "lsl r6, r6, #16\n\t"
  96118. "adds r4, r4, r6\n\t"
  96119. "adcs r5, r5, r7\n\t"
  96120. "adc r3, r3, #0\n\t"
  96121. #else
  96122. "umull r6, r7, r8, r9\n\t"
  96123. "adds r4, r4, r6\n\t"
  96124. "adcs r5, r5, r7\n\t"
  96125. "adc r3, r3, #0\n\t"
  96126. #endif
  96127. /* A[8] * B[2] */
  96128. "ldr r8, [%[a], #32]\n\t"
  96129. "ldr r9, [%[b], #8]\n\t"
  96130. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96131. "lsl r6, r8, #16\n\t"
  96132. "lsl r7, r9, #16\n\t"
  96133. "lsr r6, r6, #16\n\t"
  96134. "lsr r7, r7, #16\n\t"
  96135. "mul r7, r6, r7\n\t"
  96136. "adds r4, r4, r7\n\t"
  96137. "adcs r5, r5, #0\n\t"
  96138. "adc r3, r3, #0\n\t"
  96139. "lsr r7, r9, #16\n\t"
  96140. "mul r6, r7, r6\n\t"
  96141. "lsr r7, r6, #16\n\t"
  96142. "lsl r6, r6, #16\n\t"
  96143. "adds r4, r4, r6\n\t"
  96144. "adcs r5, r5, r7\n\t"
  96145. "adc r3, r3, #0\n\t"
  96146. "lsr r6, r8, #16\n\t"
  96147. "lsr r7, r9, #16\n\t"
  96148. "mul r7, r6, r7\n\t"
  96149. "adds r5, r5, r7\n\t"
  96150. "adc r3, r3, #0\n\t"
  96151. "lsl r7, r9, #16\n\t"
  96152. "lsr r7, r7, #16\n\t"
  96153. "mul r6, r7, r6\n\t"
  96154. "lsr r7, r6, #16\n\t"
  96155. "lsl r6, r6, #16\n\t"
  96156. "adds r4, r4, r6\n\t"
  96157. "adcs r5, r5, r7\n\t"
  96158. "adc r3, r3, #0\n\t"
  96159. #else
  96160. "umull r6, r7, r8, r9\n\t"
  96161. "adds r4, r4, r6\n\t"
  96162. "adcs r5, r5, r7\n\t"
  96163. "adc r3, r3, #0\n\t"
  96164. #endif
  96165. /* A[7] * B[3] */
  96166. "ldr r8, [%[a], #28]\n\t"
  96167. "ldr r9, [%[b], #12]\n\t"
  96168. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96169. "lsl r6, r8, #16\n\t"
  96170. "lsl r7, r9, #16\n\t"
  96171. "lsr r6, r6, #16\n\t"
  96172. "lsr r7, r7, #16\n\t"
  96173. "mul r7, r6, r7\n\t"
  96174. "adds r4, r4, r7\n\t"
  96175. "adcs r5, r5, #0\n\t"
  96176. "adc r3, r3, #0\n\t"
  96177. "lsr r7, r9, #16\n\t"
  96178. "mul r6, r7, r6\n\t"
  96179. "lsr r7, r6, #16\n\t"
  96180. "lsl r6, r6, #16\n\t"
  96181. "adds r4, r4, r6\n\t"
  96182. "adcs r5, r5, r7\n\t"
  96183. "adc r3, r3, #0\n\t"
  96184. "lsr r6, r8, #16\n\t"
  96185. "lsr r7, r9, #16\n\t"
  96186. "mul r7, r6, r7\n\t"
  96187. "adds r5, r5, r7\n\t"
  96188. "adc r3, r3, #0\n\t"
  96189. "lsl r7, r9, #16\n\t"
  96190. "lsr r7, r7, #16\n\t"
  96191. "mul r6, r7, r6\n\t"
  96192. "lsr r7, r6, #16\n\t"
  96193. "lsl r6, r6, #16\n\t"
  96194. "adds r4, r4, r6\n\t"
  96195. "adcs r5, r5, r7\n\t"
  96196. "adc r3, r3, #0\n\t"
  96197. #else
  96198. "umull r6, r7, r8, r9\n\t"
  96199. "adds r4, r4, r6\n\t"
  96200. "adcs r5, r5, r7\n\t"
  96201. "adc r3, r3, #0\n\t"
  96202. #endif
  96203. /* A[6] * B[4] */
  96204. "ldr r8, [%[a], #24]\n\t"
  96205. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96206. "lsl r6, r8, #16\n\t"
  96207. "lsl r7, r12, #16\n\t"
  96208. "lsr r6, r6, #16\n\t"
  96209. "lsr r7, r7, #16\n\t"
  96210. "mul r7, r6, r7\n\t"
  96211. "adds r4, r4, r7\n\t"
  96212. "adcs r5, r5, #0\n\t"
  96213. "adc r3, r3, #0\n\t"
  96214. "lsr r7, r12, #16\n\t"
  96215. "mul r6, r7, r6\n\t"
  96216. "lsr r7, r6, #16\n\t"
  96217. "lsl r6, r6, #16\n\t"
  96218. "adds r4, r4, r6\n\t"
  96219. "adcs r5, r5, r7\n\t"
  96220. "adc r3, r3, #0\n\t"
  96221. "lsr r6, r8, #16\n\t"
  96222. "lsr r7, r12, #16\n\t"
  96223. "mul r7, r6, r7\n\t"
  96224. "adds r5, r5, r7\n\t"
  96225. "adc r3, r3, #0\n\t"
  96226. "lsl r7, r12, #16\n\t"
  96227. "lsr r7, r7, #16\n\t"
  96228. "mul r6, r7, r6\n\t"
  96229. "lsr r7, r6, #16\n\t"
  96230. "lsl r6, r6, #16\n\t"
  96231. "adds r4, r4, r6\n\t"
  96232. "adcs r5, r5, r7\n\t"
  96233. "adc r3, r3, #0\n\t"
  96234. #else
  96235. "umull r6, r7, r8, r12\n\t"
  96236. "adds r4, r4, r6\n\t"
  96237. "adcs r5, r5, r7\n\t"
  96238. "adc r3, r3, #0\n\t"
  96239. #endif
  96240. /* A[5] * B[5] */
  96241. "ldr r11, [%[a], #20]\n\t"
  96242. "ldr r12, [%[b], #20]\n\t"
  96243. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96244. "lsl r6, r11, #16\n\t"
  96245. "lsl r7, r12, #16\n\t"
  96246. "lsr r6, r6, #16\n\t"
  96247. "lsr r7, r7, #16\n\t"
  96248. "mul r7, r6, r7\n\t"
  96249. "adds r4, r4, r7\n\t"
  96250. "adcs r5, r5, #0\n\t"
  96251. "adc r3, r3, #0\n\t"
  96252. "lsr r7, r12, #16\n\t"
  96253. "mul r6, r7, r6\n\t"
  96254. "lsr r7, r6, #16\n\t"
  96255. "lsl r6, r6, #16\n\t"
  96256. "adds r4, r4, r6\n\t"
  96257. "adcs r5, r5, r7\n\t"
  96258. "adc r3, r3, #0\n\t"
  96259. "lsr r6, r11, #16\n\t"
  96260. "lsr r7, r12, #16\n\t"
  96261. "mul r7, r6, r7\n\t"
  96262. "adds r5, r5, r7\n\t"
  96263. "adc r3, r3, #0\n\t"
  96264. "lsl r7, r12, #16\n\t"
  96265. "lsr r7, r7, #16\n\t"
  96266. "mul r6, r7, r6\n\t"
  96267. "lsr r7, r6, #16\n\t"
  96268. "lsl r6, r6, #16\n\t"
  96269. "adds r4, r4, r6\n\t"
  96270. "adcs r5, r5, r7\n\t"
  96271. "adc r3, r3, #0\n\t"
  96272. #else
  96273. "umull r6, r7, r11, r12\n\t"
  96274. "adds r4, r4, r6\n\t"
  96275. "adcs r5, r5, r7\n\t"
  96276. "adc r3, r3, #0\n\t"
  96277. #endif
  96278. /* A[4] * B[6] */
  96279. "ldr r8, [%[a], #16]\n\t"
  96280. "ldr r9, [%[b], #24]\n\t"
  96281. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96282. "lsl r6, r8, #16\n\t"
  96283. "lsl r7, r9, #16\n\t"
  96284. "lsr r6, r6, #16\n\t"
  96285. "lsr r7, r7, #16\n\t"
  96286. "mul r7, r6, r7\n\t"
  96287. "adds r4, r4, r7\n\t"
  96288. "adcs r5, r5, #0\n\t"
  96289. "adc r3, r3, #0\n\t"
  96290. "lsr r7, r9, #16\n\t"
  96291. "mul r6, r7, r6\n\t"
  96292. "lsr r7, r6, #16\n\t"
  96293. "lsl r6, r6, #16\n\t"
  96294. "adds r4, r4, r6\n\t"
  96295. "adcs r5, r5, r7\n\t"
  96296. "adc r3, r3, #0\n\t"
  96297. "lsr r6, r8, #16\n\t"
  96298. "lsr r7, r9, #16\n\t"
  96299. "mul r7, r6, r7\n\t"
  96300. "adds r5, r5, r7\n\t"
  96301. "adc r3, r3, #0\n\t"
  96302. "lsl r7, r9, #16\n\t"
  96303. "lsr r7, r7, #16\n\t"
  96304. "mul r6, r7, r6\n\t"
  96305. "lsr r7, r6, #16\n\t"
  96306. "lsl r6, r6, #16\n\t"
  96307. "adds r4, r4, r6\n\t"
  96308. "adcs r5, r5, r7\n\t"
  96309. "adc r3, r3, #0\n\t"
  96310. #else
  96311. "umull r6, r7, r8, r9\n\t"
  96312. "adds r4, r4, r6\n\t"
  96313. "adcs r5, r5, r7\n\t"
  96314. "adc r3, r3, #0\n\t"
  96315. #endif
  96316. /* A[3] * B[7] */
  96317. "ldr r8, [%[a], #12]\n\t"
  96318. "ldr r9, [%[b], #28]\n\t"
  96319. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96320. "lsl r6, r8, #16\n\t"
  96321. "lsl r7, r9, #16\n\t"
  96322. "lsr r6, r6, #16\n\t"
  96323. "lsr r7, r7, #16\n\t"
  96324. "mul r7, r6, r7\n\t"
  96325. "adds r4, r4, r7\n\t"
  96326. "adcs r5, r5, #0\n\t"
  96327. "adc r3, r3, #0\n\t"
  96328. "lsr r7, r9, #16\n\t"
  96329. "mul r6, r7, r6\n\t"
  96330. "lsr r7, r6, #16\n\t"
  96331. "lsl r6, r6, #16\n\t"
  96332. "adds r4, r4, r6\n\t"
  96333. "adcs r5, r5, r7\n\t"
  96334. "adc r3, r3, #0\n\t"
  96335. "lsr r6, r8, #16\n\t"
  96336. "lsr r7, r9, #16\n\t"
  96337. "mul r7, r6, r7\n\t"
  96338. "adds r5, r5, r7\n\t"
  96339. "adc r3, r3, #0\n\t"
  96340. "lsl r7, r9, #16\n\t"
  96341. "lsr r7, r7, #16\n\t"
  96342. "mul r6, r7, r6\n\t"
  96343. "lsr r7, r6, #16\n\t"
  96344. "lsl r6, r6, #16\n\t"
  96345. "adds r4, r4, r6\n\t"
  96346. "adcs r5, r5, r7\n\t"
  96347. "adc r3, r3, #0\n\t"
  96348. #else
  96349. "umull r6, r7, r8, r9\n\t"
  96350. "adds r4, r4, r6\n\t"
  96351. "adcs r5, r5, r7\n\t"
  96352. "adc r3, r3, #0\n\t"
  96353. #endif
  96354. /* A[2] * B[8] */
  96355. "ldr r8, [%[a], #8]\n\t"
  96356. "ldr r9, [%[b], #32]\n\t"
  96357. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96358. "lsl r6, r8, #16\n\t"
  96359. "lsl r7, r9, #16\n\t"
  96360. "lsr r6, r6, #16\n\t"
  96361. "lsr r7, r7, #16\n\t"
  96362. "mul r7, r6, r7\n\t"
  96363. "adds r4, r4, r7\n\t"
  96364. "adcs r5, r5, #0\n\t"
  96365. "adc r3, r3, #0\n\t"
  96366. "lsr r7, r9, #16\n\t"
  96367. "mul r6, r7, r6\n\t"
  96368. "lsr r7, r6, #16\n\t"
  96369. "lsl r6, r6, #16\n\t"
  96370. "adds r4, r4, r6\n\t"
  96371. "adcs r5, r5, r7\n\t"
  96372. "adc r3, r3, #0\n\t"
  96373. "lsr r6, r8, #16\n\t"
  96374. "lsr r7, r9, #16\n\t"
  96375. "mul r7, r6, r7\n\t"
  96376. "adds r5, r5, r7\n\t"
  96377. "adc r3, r3, #0\n\t"
  96378. "lsl r7, r9, #16\n\t"
  96379. "lsr r7, r7, #16\n\t"
  96380. "mul r6, r7, r6\n\t"
  96381. "lsr r7, r6, #16\n\t"
  96382. "lsl r6, r6, #16\n\t"
  96383. "adds r4, r4, r6\n\t"
  96384. "adcs r5, r5, r7\n\t"
  96385. "adc r3, r3, #0\n\t"
  96386. #else
  96387. "umull r6, r7, r8, r9\n\t"
  96388. "adds r4, r4, r6\n\t"
  96389. "adcs r5, r5, r7\n\t"
  96390. "adc r3, r3, #0\n\t"
  96391. #endif
  96392. /* A[1] * B[9] */
  96393. "ldr r8, [%[a], #4]\n\t"
  96394. "ldr r9, [%[b], #36]\n\t"
  96395. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96396. "lsl r6, r8, #16\n\t"
  96397. "lsl r7, r9, #16\n\t"
  96398. "lsr r6, r6, #16\n\t"
  96399. "lsr r7, r7, #16\n\t"
  96400. "mul r7, r6, r7\n\t"
  96401. "adds r4, r4, r7\n\t"
  96402. "adcs r5, r5, #0\n\t"
  96403. "adc r3, r3, #0\n\t"
  96404. "lsr r7, r9, #16\n\t"
  96405. "mul r6, r7, r6\n\t"
  96406. "lsr r7, r6, #16\n\t"
  96407. "lsl r6, r6, #16\n\t"
  96408. "adds r4, r4, r6\n\t"
  96409. "adcs r5, r5, r7\n\t"
  96410. "adc r3, r3, #0\n\t"
  96411. "lsr r6, r8, #16\n\t"
  96412. "lsr r7, r9, #16\n\t"
  96413. "mul r7, r6, r7\n\t"
  96414. "adds r5, r5, r7\n\t"
  96415. "adc r3, r3, #0\n\t"
  96416. "lsl r7, r9, #16\n\t"
  96417. "lsr r7, r7, #16\n\t"
  96418. "mul r6, r7, r6\n\t"
  96419. "lsr r7, r6, #16\n\t"
  96420. "lsl r6, r6, #16\n\t"
  96421. "adds r4, r4, r6\n\t"
  96422. "adcs r5, r5, r7\n\t"
  96423. "adc r3, r3, #0\n\t"
  96424. #else
  96425. "umull r6, r7, r8, r9\n\t"
  96426. "adds r4, r4, r6\n\t"
  96427. "adcs r5, r5, r7\n\t"
  96428. "adc r3, r3, #0\n\t"
  96429. #endif
  96430. /* A[0] * B[10] */
  96431. "ldr r8, [%[a]]\n\t"
  96432. "ldr r9, [%[b], #40]\n\t"
  96433. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96434. "lsl r6, r8, #16\n\t"
  96435. "lsl r7, r9, #16\n\t"
  96436. "lsr r6, r6, #16\n\t"
  96437. "lsr r7, r7, #16\n\t"
  96438. "mul r7, r6, r7\n\t"
  96439. "adds r4, r4, r7\n\t"
  96440. "adcs r5, r5, #0\n\t"
  96441. "adc r3, r3, #0\n\t"
  96442. "lsr r7, r9, #16\n\t"
  96443. "mul r6, r7, r6\n\t"
  96444. "lsr r7, r6, #16\n\t"
  96445. "lsl r6, r6, #16\n\t"
  96446. "adds r4, r4, r6\n\t"
  96447. "adcs r5, r5, r7\n\t"
  96448. "adc r3, r3, #0\n\t"
  96449. "lsr r6, r8, #16\n\t"
  96450. "lsr r7, r9, #16\n\t"
  96451. "mul r7, r6, r7\n\t"
  96452. "adds r5, r5, r7\n\t"
  96453. "adc r3, r3, #0\n\t"
  96454. "lsl r7, r9, #16\n\t"
  96455. "lsr r7, r7, #16\n\t"
  96456. "mul r6, r7, r6\n\t"
  96457. "lsr r7, r6, #16\n\t"
  96458. "lsl r6, r6, #16\n\t"
  96459. "adds r4, r4, r6\n\t"
  96460. "adcs r5, r5, r7\n\t"
  96461. "adc r3, r3, #0\n\t"
  96462. #else
  96463. "umull r6, r7, r8, r9\n\t"
  96464. "adds r4, r4, r6\n\t"
  96465. "adcs r5, r5, r7\n\t"
  96466. "adc r3, r3, #0\n\t"
  96467. #endif
  96468. "str r4, [sp, #40]\n\t"
  96469. /* A[0] * B[11] */
  96470. "ldr r9, [%[b], #44]\n\t"
  96471. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96472. "lsl r6, r8, #16\n\t"
  96473. "lsl r7, r9, #16\n\t"
  96474. "lsr r6, r6, #16\n\t"
  96475. "lsr r7, r7, #16\n\t"
  96476. "mul r7, r6, r7\n\t"
  96477. "adds r5, r5, r7\n\t"
  96478. "adcs r3, r3, #0\n\t"
  96479. "mov r4, #0\n\t"
  96480. "adc r4, r4, #0\n\t"
  96481. "lsr r7, r9, #16\n\t"
  96482. "mul r6, r7, r6\n\t"
  96483. "lsr r7, r6, #16\n\t"
  96484. "lsl r6, r6, #16\n\t"
  96485. "adds r5, r5, r6\n\t"
  96486. "adcs r3, r3, r7\n\t"
  96487. "adc r4, r4, #0\n\t"
  96488. "lsr r6, r8, #16\n\t"
  96489. "lsr r7, r9, #16\n\t"
  96490. "mul r7, r6, r7\n\t"
  96491. "adds r3, r3, r7\n\t"
  96492. "adc r4, r4, #0\n\t"
  96493. "lsl r7, r9, #16\n\t"
  96494. "lsr r7, r7, #16\n\t"
  96495. "mul r6, r7, r6\n\t"
  96496. "lsr r7, r6, #16\n\t"
  96497. "lsl r6, r6, #16\n\t"
  96498. "adds r5, r5, r6\n\t"
  96499. "adcs r3, r3, r7\n\t"
  96500. "adc r4, r4, #0\n\t"
  96501. #else
  96502. "umull r6, r7, r8, r9\n\t"
  96503. "adds r5, r5, r6\n\t"
  96504. "adcs r3, r3, r7\n\t"
  96505. "mov r4, #0\n\t"
  96506. "adc r4, r4, #0\n\t"
  96507. #endif
  96508. /* A[1] * B[10] */
  96509. "ldr r8, [%[a], #4]\n\t"
  96510. "ldr r9, [%[b], #40]\n\t"
  96511. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96512. "lsl r6, r8, #16\n\t"
  96513. "lsl r7, r9, #16\n\t"
  96514. "lsr r6, r6, #16\n\t"
  96515. "lsr r7, r7, #16\n\t"
  96516. "mul r7, r6, r7\n\t"
  96517. "adds r5, r5, r7\n\t"
  96518. "adcs r3, r3, #0\n\t"
  96519. "adc r4, r4, #0\n\t"
  96520. "lsr r7, r9, #16\n\t"
  96521. "mul r6, r7, r6\n\t"
  96522. "lsr r7, r6, #16\n\t"
  96523. "lsl r6, r6, #16\n\t"
  96524. "adds r5, r5, r6\n\t"
  96525. "adcs r3, r3, r7\n\t"
  96526. "adc r4, r4, #0\n\t"
  96527. "lsr r6, r8, #16\n\t"
  96528. "lsr r7, r9, #16\n\t"
  96529. "mul r7, r6, r7\n\t"
  96530. "adds r3, r3, r7\n\t"
  96531. "adc r4, r4, #0\n\t"
  96532. "lsl r7, r9, #16\n\t"
  96533. "lsr r7, r7, #16\n\t"
  96534. "mul r6, r7, r6\n\t"
  96535. "lsr r7, r6, #16\n\t"
  96536. "lsl r6, r6, #16\n\t"
  96537. "adds r5, r5, r6\n\t"
  96538. "adcs r3, r3, r7\n\t"
  96539. "adc r4, r4, #0\n\t"
  96540. #else
  96541. "umull r6, r7, r8, r9\n\t"
  96542. "adds r5, r5, r6\n\t"
  96543. "adcs r3, r3, r7\n\t"
  96544. "adc r4, r4, #0\n\t"
  96545. #endif
  96546. /* A[2] * B[9] */
  96547. "ldr r8, [%[a], #8]\n\t"
  96548. "ldr r9, [%[b], #36]\n\t"
  96549. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96550. "lsl r6, r8, #16\n\t"
  96551. "lsl r7, r9, #16\n\t"
  96552. "lsr r6, r6, #16\n\t"
  96553. "lsr r7, r7, #16\n\t"
  96554. "mul r7, r6, r7\n\t"
  96555. "adds r5, r5, r7\n\t"
  96556. "adcs r3, r3, #0\n\t"
  96557. "adc r4, r4, #0\n\t"
  96558. "lsr r7, r9, #16\n\t"
  96559. "mul r6, r7, r6\n\t"
  96560. "lsr r7, r6, #16\n\t"
  96561. "lsl r6, r6, #16\n\t"
  96562. "adds r5, r5, r6\n\t"
  96563. "adcs r3, r3, r7\n\t"
  96564. "adc r4, r4, #0\n\t"
  96565. "lsr r6, r8, #16\n\t"
  96566. "lsr r7, r9, #16\n\t"
  96567. "mul r7, r6, r7\n\t"
  96568. "adds r3, r3, r7\n\t"
  96569. "adc r4, r4, #0\n\t"
  96570. "lsl r7, r9, #16\n\t"
  96571. "lsr r7, r7, #16\n\t"
  96572. "mul r6, r7, r6\n\t"
  96573. "lsr r7, r6, #16\n\t"
  96574. "lsl r6, r6, #16\n\t"
  96575. "adds r5, r5, r6\n\t"
  96576. "adcs r3, r3, r7\n\t"
  96577. "adc r4, r4, #0\n\t"
  96578. #else
  96579. "umull r6, r7, r8, r9\n\t"
  96580. "adds r5, r5, r6\n\t"
  96581. "adcs r3, r3, r7\n\t"
  96582. "adc r4, r4, #0\n\t"
  96583. #endif
  96584. /* A[3] * B[8] */
  96585. "ldr r8, [%[a], #12]\n\t"
  96586. "ldr r9, [%[b], #32]\n\t"
  96587. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96588. "lsl r6, r8, #16\n\t"
  96589. "lsl r7, r9, #16\n\t"
  96590. "lsr r6, r6, #16\n\t"
  96591. "lsr r7, r7, #16\n\t"
  96592. "mul r7, r6, r7\n\t"
  96593. "adds r5, r5, r7\n\t"
  96594. "adcs r3, r3, #0\n\t"
  96595. "adc r4, r4, #0\n\t"
  96596. "lsr r7, r9, #16\n\t"
  96597. "mul r6, r7, r6\n\t"
  96598. "lsr r7, r6, #16\n\t"
  96599. "lsl r6, r6, #16\n\t"
  96600. "adds r5, r5, r6\n\t"
  96601. "adcs r3, r3, r7\n\t"
  96602. "adc r4, r4, #0\n\t"
  96603. "lsr r6, r8, #16\n\t"
  96604. "lsr r7, r9, #16\n\t"
  96605. "mul r7, r6, r7\n\t"
  96606. "adds r3, r3, r7\n\t"
  96607. "adc r4, r4, #0\n\t"
  96608. "lsl r7, r9, #16\n\t"
  96609. "lsr r7, r7, #16\n\t"
  96610. "mul r6, r7, r6\n\t"
  96611. "lsr r7, r6, #16\n\t"
  96612. "lsl r6, r6, #16\n\t"
  96613. "adds r5, r5, r6\n\t"
  96614. "adcs r3, r3, r7\n\t"
  96615. "adc r4, r4, #0\n\t"
  96616. #else
  96617. "umull r6, r7, r8, r9\n\t"
  96618. "adds r5, r5, r6\n\t"
  96619. "adcs r3, r3, r7\n\t"
  96620. "adc r4, r4, #0\n\t"
  96621. #endif
  96622. /* A[4] * B[7] */
  96623. "ldr r8, [%[a], #16]\n\t"
  96624. "ldr r9, [%[b], #28]\n\t"
  96625. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96626. "lsl r6, r8, #16\n\t"
  96627. "lsl r7, r9, #16\n\t"
  96628. "lsr r6, r6, #16\n\t"
  96629. "lsr r7, r7, #16\n\t"
  96630. "mul r7, r6, r7\n\t"
  96631. "adds r5, r5, r7\n\t"
  96632. "adcs r3, r3, #0\n\t"
  96633. "adc r4, r4, #0\n\t"
  96634. "lsr r7, r9, #16\n\t"
  96635. "mul r6, r7, r6\n\t"
  96636. "lsr r7, r6, #16\n\t"
  96637. "lsl r6, r6, #16\n\t"
  96638. "adds r5, r5, r6\n\t"
  96639. "adcs r3, r3, r7\n\t"
  96640. "adc r4, r4, #0\n\t"
  96641. "lsr r6, r8, #16\n\t"
  96642. "lsr r7, r9, #16\n\t"
  96643. "mul r7, r6, r7\n\t"
  96644. "adds r3, r3, r7\n\t"
  96645. "adc r4, r4, #0\n\t"
  96646. "lsl r7, r9, #16\n\t"
  96647. "lsr r7, r7, #16\n\t"
  96648. "mul r6, r7, r6\n\t"
  96649. "lsr r7, r6, #16\n\t"
  96650. "lsl r6, r6, #16\n\t"
  96651. "adds r5, r5, r6\n\t"
  96652. "adcs r3, r3, r7\n\t"
  96653. "adc r4, r4, #0\n\t"
  96654. #else
  96655. "umull r6, r7, r8, r9\n\t"
  96656. "adds r5, r5, r6\n\t"
  96657. "adcs r3, r3, r7\n\t"
  96658. "adc r4, r4, #0\n\t"
  96659. #endif
  96660. /* A[5] * B[6] */
  96661. "ldr r9, [%[b], #24]\n\t"
  96662. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96663. "lsl r6, r11, #16\n\t"
  96664. "lsl r7, r9, #16\n\t"
  96665. "lsr r6, r6, #16\n\t"
  96666. "lsr r7, r7, #16\n\t"
  96667. "mul r7, r6, r7\n\t"
  96668. "adds r5, r5, r7\n\t"
  96669. "adcs r3, r3, #0\n\t"
  96670. "adc r4, r4, #0\n\t"
  96671. "lsr r7, r9, #16\n\t"
  96672. "mul r6, r7, r6\n\t"
  96673. "lsr r7, r6, #16\n\t"
  96674. "lsl r6, r6, #16\n\t"
  96675. "adds r5, r5, r6\n\t"
  96676. "adcs r3, r3, r7\n\t"
  96677. "adc r4, r4, #0\n\t"
  96678. "lsr r6, r11, #16\n\t"
  96679. "lsr r7, r9, #16\n\t"
  96680. "mul r7, r6, r7\n\t"
  96681. "adds r3, r3, r7\n\t"
  96682. "adc r4, r4, #0\n\t"
  96683. "lsl r7, r9, #16\n\t"
  96684. "lsr r7, r7, #16\n\t"
  96685. "mul r6, r7, r6\n\t"
  96686. "lsr r7, r6, #16\n\t"
  96687. "lsl r6, r6, #16\n\t"
  96688. "adds r5, r5, r6\n\t"
  96689. "adcs r3, r3, r7\n\t"
  96690. "adc r4, r4, #0\n\t"
  96691. #else
  96692. "umull r6, r7, r11, r9\n\t"
  96693. "adds r5, r5, r6\n\t"
  96694. "adcs r3, r3, r7\n\t"
  96695. "adc r4, r4, #0\n\t"
  96696. #endif
  96697. /* A[6] * B[5] */
  96698. "ldr r8, [%[a], #24]\n\t"
  96699. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96700. "lsl r6, r8, #16\n\t"
  96701. "lsl r7, r12, #16\n\t"
  96702. "lsr r6, r6, #16\n\t"
  96703. "lsr r7, r7, #16\n\t"
  96704. "mul r7, r6, r7\n\t"
  96705. "adds r5, r5, r7\n\t"
  96706. "adcs r3, r3, #0\n\t"
  96707. "adc r4, r4, #0\n\t"
  96708. "lsr r7, r12, #16\n\t"
  96709. "mul r6, r7, r6\n\t"
  96710. "lsr r7, r6, #16\n\t"
  96711. "lsl r6, r6, #16\n\t"
  96712. "adds r5, r5, r6\n\t"
  96713. "adcs r3, r3, r7\n\t"
  96714. "adc r4, r4, #0\n\t"
  96715. "lsr r6, r8, #16\n\t"
  96716. "lsr r7, r12, #16\n\t"
  96717. "mul r7, r6, r7\n\t"
  96718. "adds r3, r3, r7\n\t"
  96719. "adc r4, r4, #0\n\t"
  96720. "lsl r7, r12, #16\n\t"
  96721. "lsr r7, r7, #16\n\t"
  96722. "mul r6, r7, r6\n\t"
  96723. "lsr r7, r6, #16\n\t"
  96724. "lsl r6, r6, #16\n\t"
  96725. "adds r5, r5, r6\n\t"
  96726. "adcs r3, r3, r7\n\t"
  96727. "adc r4, r4, #0\n\t"
  96728. #else
  96729. "umull r6, r7, r8, r12\n\t"
  96730. "adds r5, r5, r6\n\t"
  96731. "adcs r3, r3, r7\n\t"
  96732. "adc r4, r4, #0\n\t"
  96733. #endif
  96734. /* A[7] * B[4] */
  96735. "ldr r8, [%[a], #28]\n\t"
  96736. "ldr r9, [%[b], #16]\n\t"
  96737. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96738. "lsl r6, r8, #16\n\t"
  96739. "lsl r7, r9, #16\n\t"
  96740. "lsr r6, r6, #16\n\t"
  96741. "lsr r7, r7, #16\n\t"
  96742. "mul r7, r6, r7\n\t"
  96743. "adds r5, r5, r7\n\t"
  96744. "adcs r3, r3, #0\n\t"
  96745. "adc r4, r4, #0\n\t"
  96746. "lsr r7, r9, #16\n\t"
  96747. "mul r6, r7, r6\n\t"
  96748. "lsr r7, r6, #16\n\t"
  96749. "lsl r6, r6, #16\n\t"
  96750. "adds r5, r5, r6\n\t"
  96751. "adcs r3, r3, r7\n\t"
  96752. "adc r4, r4, #0\n\t"
  96753. "lsr r6, r8, #16\n\t"
  96754. "lsr r7, r9, #16\n\t"
  96755. "mul r7, r6, r7\n\t"
  96756. "adds r3, r3, r7\n\t"
  96757. "adc r4, r4, #0\n\t"
  96758. "lsl r7, r9, #16\n\t"
  96759. "lsr r7, r7, #16\n\t"
  96760. "mul r6, r7, r6\n\t"
  96761. "lsr r7, r6, #16\n\t"
  96762. "lsl r6, r6, #16\n\t"
  96763. "adds r5, r5, r6\n\t"
  96764. "adcs r3, r3, r7\n\t"
  96765. "adc r4, r4, #0\n\t"
  96766. #else
  96767. "umull r6, r7, r8, r9\n\t"
  96768. "adds r5, r5, r6\n\t"
  96769. "adcs r3, r3, r7\n\t"
  96770. "adc r4, r4, #0\n\t"
  96771. #endif
  96772. /* A[8] * B[3] */
  96773. "ldr r8, [%[a], #32]\n\t"
  96774. "ldr r9, [%[b], #12]\n\t"
  96775. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96776. "lsl r6, r8, #16\n\t"
  96777. "lsl r7, r9, #16\n\t"
  96778. "lsr r6, r6, #16\n\t"
  96779. "lsr r7, r7, #16\n\t"
  96780. "mul r7, r6, r7\n\t"
  96781. "adds r5, r5, r7\n\t"
  96782. "adcs r3, r3, #0\n\t"
  96783. "adc r4, r4, #0\n\t"
  96784. "lsr r7, r9, #16\n\t"
  96785. "mul r6, r7, r6\n\t"
  96786. "lsr r7, r6, #16\n\t"
  96787. "lsl r6, r6, #16\n\t"
  96788. "adds r5, r5, r6\n\t"
  96789. "adcs r3, r3, r7\n\t"
  96790. "adc r4, r4, #0\n\t"
  96791. "lsr r6, r8, #16\n\t"
  96792. "lsr r7, r9, #16\n\t"
  96793. "mul r7, r6, r7\n\t"
  96794. "adds r3, r3, r7\n\t"
  96795. "adc r4, r4, #0\n\t"
  96796. "lsl r7, r9, #16\n\t"
  96797. "lsr r7, r7, #16\n\t"
  96798. "mul r6, r7, r6\n\t"
  96799. "lsr r7, r6, #16\n\t"
  96800. "lsl r6, r6, #16\n\t"
  96801. "adds r5, r5, r6\n\t"
  96802. "adcs r3, r3, r7\n\t"
  96803. "adc r4, r4, #0\n\t"
  96804. #else
  96805. "umull r6, r7, r8, r9\n\t"
  96806. "adds r5, r5, r6\n\t"
  96807. "adcs r3, r3, r7\n\t"
  96808. "adc r4, r4, #0\n\t"
  96809. #endif
  96810. /* A[9] * B[2] */
  96811. "ldr r8, [%[a], #36]\n\t"
  96812. "ldr r9, [%[b], #8]\n\t"
  96813. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96814. "lsl r6, r8, #16\n\t"
  96815. "lsl r7, r9, #16\n\t"
  96816. "lsr r6, r6, #16\n\t"
  96817. "lsr r7, r7, #16\n\t"
  96818. "mul r7, r6, r7\n\t"
  96819. "adds r5, r5, r7\n\t"
  96820. "adcs r3, r3, #0\n\t"
  96821. "adc r4, r4, #0\n\t"
  96822. "lsr r7, r9, #16\n\t"
  96823. "mul r6, r7, r6\n\t"
  96824. "lsr r7, r6, #16\n\t"
  96825. "lsl r6, r6, #16\n\t"
  96826. "adds r5, r5, r6\n\t"
  96827. "adcs r3, r3, r7\n\t"
  96828. "adc r4, r4, #0\n\t"
  96829. "lsr r6, r8, #16\n\t"
  96830. "lsr r7, r9, #16\n\t"
  96831. "mul r7, r6, r7\n\t"
  96832. "adds r3, r3, r7\n\t"
  96833. "adc r4, r4, #0\n\t"
  96834. "lsl r7, r9, #16\n\t"
  96835. "lsr r7, r7, #16\n\t"
  96836. "mul r6, r7, r6\n\t"
  96837. "lsr r7, r6, #16\n\t"
  96838. "lsl r6, r6, #16\n\t"
  96839. "adds r5, r5, r6\n\t"
  96840. "adcs r3, r3, r7\n\t"
  96841. "adc r4, r4, #0\n\t"
  96842. #else
  96843. "umull r6, r7, r8, r9\n\t"
  96844. "adds r5, r5, r6\n\t"
  96845. "adcs r3, r3, r7\n\t"
  96846. "adc r4, r4, #0\n\t"
  96847. #endif
  96848. /* A[10] * B[1] */
  96849. "ldr r8, [%[a], #40]\n\t"
  96850. "ldr r9, [%[b], #4]\n\t"
  96851. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96852. "lsl r6, r8, #16\n\t"
  96853. "lsl r7, r9, #16\n\t"
  96854. "lsr r6, r6, #16\n\t"
  96855. "lsr r7, r7, #16\n\t"
  96856. "mul r7, r6, r7\n\t"
  96857. "adds r5, r5, r7\n\t"
  96858. "adcs r3, r3, #0\n\t"
  96859. "adc r4, r4, #0\n\t"
  96860. "lsr r7, r9, #16\n\t"
  96861. "mul r6, r7, r6\n\t"
  96862. "lsr r7, r6, #16\n\t"
  96863. "lsl r6, r6, #16\n\t"
  96864. "adds r5, r5, r6\n\t"
  96865. "adcs r3, r3, r7\n\t"
  96866. "adc r4, r4, #0\n\t"
  96867. "lsr r6, r8, #16\n\t"
  96868. "lsr r7, r9, #16\n\t"
  96869. "mul r7, r6, r7\n\t"
  96870. "adds r3, r3, r7\n\t"
  96871. "adc r4, r4, #0\n\t"
  96872. "lsl r7, r9, #16\n\t"
  96873. "lsr r7, r7, #16\n\t"
  96874. "mul r6, r7, r6\n\t"
  96875. "lsr r7, r6, #16\n\t"
  96876. "lsl r6, r6, #16\n\t"
  96877. "adds r5, r5, r6\n\t"
  96878. "adcs r3, r3, r7\n\t"
  96879. "adc r4, r4, #0\n\t"
  96880. #else
  96881. "umull r6, r7, r8, r9\n\t"
  96882. "adds r5, r5, r6\n\t"
  96883. "adcs r3, r3, r7\n\t"
  96884. "adc r4, r4, #0\n\t"
  96885. #endif
  96886. /* A[11] * B[0] */
  96887. "ldr r8, [%[a], #44]\n\t"
  96888. "ldr r9, [%[b]]\n\t"
  96889. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96890. "lsl r6, r8, #16\n\t"
  96891. "lsl r7, r9, #16\n\t"
  96892. "lsr r6, r6, #16\n\t"
  96893. "lsr r7, r7, #16\n\t"
  96894. "mul r7, r6, r7\n\t"
  96895. "adds r5, r5, r7\n\t"
  96896. "adcs r3, r3, #0\n\t"
  96897. "adc r4, r4, #0\n\t"
  96898. "lsr r7, r9, #16\n\t"
  96899. "mul r6, r7, r6\n\t"
  96900. "lsr r7, r6, #16\n\t"
  96901. "lsl r6, r6, #16\n\t"
  96902. "adds r5, r5, r6\n\t"
  96903. "adcs r3, r3, r7\n\t"
  96904. "adc r4, r4, #0\n\t"
  96905. "lsr r6, r8, #16\n\t"
  96906. "lsr r7, r9, #16\n\t"
  96907. "mul r7, r6, r7\n\t"
  96908. "adds r3, r3, r7\n\t"
  96909. "adc r4, r4, #0\n\t"
  96910. "lsl r7, r9, #16\n\t"
  96911. "lsr r7, r7, #16\n\t"
  96912. "mul r6, r7, r6\n\t"
  96913. "lsr r7, r6, #16\n\t"
  96914. "lsl r6, r6, #16\n\t"
  96915. "adds r5, r5, r6\n\t"
  96916. "adcs r3, r3, r7\n\t"
  96917. "adc r4, r4, #0\n\t"
  96918. #else
  96919. "umull r6, r7, r8, r9\n\t"
  96920. "adds r5, r5, r6\n\t"
  96921. "adcs r3, r3, r7\n\t"
  96922. "adc r4, r4, #0\n\t"
  96923. #endif
  96924. "str r5, [sp, #44]\n\t"
  96925. /* A[12] * B[0] */
  96926. "ldr r8, [%[a], #48]\n\t"
  96927. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96928. "lsl r6, r8, #16\n\t"
  96929. "lsl r7, r9, #16\n\t"
  96930. "lsr r6, r6, #16\n\t"
  96931. "lsr r7, r7, #16\n\t"
  96932. "mul r7, r6, r7\n\t"
  96933. "adds r3, r3, r7\n\t"
  96934. "adcs r4, r4, #0\n\t"
  96935. "mov r5, #0\n\t"
  96936. "adc r5, r5, #0\n\t"
  96937. "lsr r7, r9, #16\n\t"
  96938. "mul r6, r7, r6\n\t"
  96939. "lsr r7, r6, #16\n\t"
  96940. "lsl r6, r6, #16\n\t"
  96941. "adds r3, r3, r6\n\t"
  96942. "adcs r4, r4, r7\n\t"
  96943. "adc r5, r5, #0\n\t"
  96944. "lsr r6, r8, #16\n\t"
  96945. "lsr r7, r9, #16\n\t"
  96946. "mul r7, r6, r7\n\t"
  96947. "adds r4, r4, r7\n\t"
  96948. "adc r5, r5, #0\n\t"
  96949. "lsl r7, r9, #16\n\t"
  96950. "lsr r7, r7, #16\n\t"
  96951. "mul r6, r7, r6\n\t"
  96952. "lsr r7, r6, #16\n\t"
  96953. "lsl r6, r6, #16\n\t"
  96954. "adds r3, r3, r6\n\t"
  96955. "adcs r4, r4, r7\n\t"
  96956. "adc r5, r5, #0\n\t"
  96957. #else
  96958. "umull r6, r7, r8, r9\n\t"
  96959. "adds r3, r3, r6\n\t"
  96960. "adcs r4, r4, r7\n\t"
  96961. "mov r5, #0\n\t"
  96962. "adc r5, r5, #0\n\t"
  96963. #endif
  96964. /* A[11] * B[1] */
  96965. "ldr r8, [%[a], #44]\n\t"
  96966. "ldr r9, [%[b], #4]\n\t"
  96967. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  96968. "lsl r6, r8, #16\n\t"
  96969. "lsl r7, r9, #16\n\t"
  96970. "lsr r6, r6, #16\n\t"
  96971. "lsr r7, r7, #16\n\t"
  96972. "mul r7, r6, r7\n\t"
  96973. "adds r3, r3, r7\n\t"
  96974. "adcs r4, r4, #0\n\t"
  96975. "adc r5, r5, #0\n\t"
  96976. "lsr r7, r9, #16\n\t"
  96977. "mul r6, r7, r6\n\t"
  96978. "lsr r7, r6, #16\n\t"
  96979. "lsl r6, r6, #16\n\t"
  96980. "adds r3, r3, r6\n\t"
  96981. "adcs r4, r4, r7\n\t"
  96982. "adc r5, r5, #0\n\t"
  96983. "lsr r6, r8, #16\n\t"
  96984. "lsr r7, r9, #16\n\t"
  96985. "mul r7, r6, r7\n\t"
  96986. "adds r4, r4, r7\n\t"
  96987. "adc r5, r5, #0\n\t"
  96988. "lsl r7, r9, #16\n\t"
  96989. "lsr r7, r7, #16\n\t"
  96990. "mul r6, r7, r6\n\t"
  96991. "lsr r7, r6, #16\n\t"
  96992. "lsl r6, r6, #16\n\t"
  96993. "adds r3, r3, r6\n\t"
  96994. "adcs r4, r4, r7\n\t"
  96995. "adc r5, r5, #0\n\t"
  96996. #else
  96997. "umull r6, r7, r8, r9\n\t"
  96998. "adds r3, r3, r6\n\t"
  96999. "adcs r4, r4, r7\n\t"
  97000. "adc r5, r5, #0\n\t"
  97001. #endif
  97002. /* A[10] * B[2] */
  97003. "ldr r8, [%[a], #40]\n\t"
  97004. "ldr r9, [%[b], #8]\n\t"
  97005. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97006. "lsl r6, r8, #16\n\t"
  97007. "lsl r7, r9, #16\n\t"
  97008. "lsr r6, r6, #16\n\t"
  97009. "lsr r7, r7, #16\n\t"
  97010. "mul r7, r6, r7\n\t"
  97011. "adds r3, r3, r7\n\t"
  97012. "adcs r4, r4, #0\n\t"
  97013. "adc r5, r5, #0\n\t"
  97014. "lsr r7, r9, #16\n\t"
  97015. "mul r6, r7, r6\n\t"
  97016. "lsr r7, r6, #16\n\t"
  97017. "lsl r6, r6, #16\n\t"
  97018. "adds r3, r3, r6\n\t"
  97019. "adcs r4, r4, r7\n\t"
  97020. "adc r5, r5, #0\n\t"
  97021. "lsr r6, r8, #16\n\t"
  97022. "lsr r7, r9, #16\n\t"
  97023. "mul r7, r6, r7\n\t"
  97024. "adds r4, r4, r7\n\t"
  97025. "adc r5, r5, #0\n\t"
  97026. "lsl r7, r9, #16\n\t"
  97027. "lsr r7, r7, #16\n\t"
  97028. "mul r6, r7, r6\n\t"
  97029. "lsr r7, r6, #16\n\t"
  97030. "lsl r6, r6, #16\n\t"
  97031. "adds r3, r3, r6\n\t"
  97032. "adcs r4, r4, r7\n\t"
  97033. "adc r5, r5, #0\n\t"
  97034. #else
  97035. "umull r6, r7, r8, r9\n\t"
  97036. "adds r3, r3, r6\n\t"
  97037. "adcs r4, r4, r7\n\t"
  97038. "adc r5, r5, #0\n\t"
  97039. #endif
  97040. /* A[9] * B[3] */
  97041. "ldr r8, [%[a], #36]\n\t"
  97042. "ldr r9, [%[b], #12]\n\t"
  97043. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97044. "lsl r6, r8, #16\n\t"
  97045. "lsl r7, r9, #16\n\t"
  97046. "lsr r6, r6, #16\n\t"
  97047. "lsr r7, r7, #16\n\t"
  97048. "mul r7, r6, r7\n\t"
  97049. "adds r3, r3, r7\n\t"
  97050. "adcs r4, r4, #0\n\t"
  97051. "adc r5, r5, #0\n\t"
  97052. "lsr r7, r9, #16\n\t"
  97053. "mul r6, r7, r6\n\t"
  97054. "lsr r7, r6, #16\n\t"
  97055. "lsl r6, r6, #16\n\t"
  97056. "adds r3, r3, r6\n\t"
  97057. "adcs r4, r4, r7\n\t"
  97058. "adc r5, r5, #0\n\t"
  97059. "lsr r6, r8, #16\n\t"
  97060. "lsr r7, r9, #16\n\t"
  97061. "mul r7, r6, r7\n\t"
  97062. "adds r4, r4, r7\n\t"
  97063. "adc r5, r5, #0\n\t"
  97064. "lsl r7, r9, #16\n\t"
  97065. "lsr r7, r7, #16\n\t"
  97066. "mul r6, r7, r6\n\t"
  97067. "lsr r7, r6, #16\n\t"
  97068. "lsl r6, r6, #16\n\t"
  97069. "adds r3, r3, r6\n\t"
  97070. "adcs r4, r4, r7\n\t"
  97071. "adc r5, r5, #0\n\t"
  97072. #else
  97073. "umull r6, r7, r8, r9\n\t"
  97074. "adds r3, r3, r6\n\t"
  97075. "adcs r4, r4, r7\n\t"
  97076. "adc r5, r5, #0\n\t"
  97077. #endif
  97078. /* A[8] * B[4] */
  97079. "ldr r8, [%[a], #32]\n\t"
  97080. "ldr r9, [%[b], #16]\n\t"
  97081. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97082. "lsl r6, r8, #16\n\t"
  97083. "lsl r7, r9, #16\n\t"
  97084. "lsr r6, r6, #16\n\t"
  97085. "lsr r7, r7, #16\n\t"
  97086. "mul r7, r6, r7\n\t"
  97087. "adds r3, r3, r7\n\t"
  97088. "adcs r4, r4, #0\n\t"
  97089. "adc r5, r5, #0\n\t"
  97090. "lsr r7, r9, #16\n\t"
  97091. "mul r6, r7, r6\n\t"
  97092. "lsr r7, r6, #16\n\t"
  97093. "lsl r6, r6, #16\n\t"
  97094. "adds r3, r3, r6\n\t"
  97095. "adcs r4, r4, r7\n\t"
  97096. "adc r5, r5, #0\n\t"
  97097. "lsr r6, r8, #16\n\t"
  97098. "lsr r7, r9, #16\n\t"
  97099. "mul r7, r6, r7\n\t"
  97100. "adds r4, r4, r7\n\t"
  97101. "adc r5, r5, #0\n\t"
  97102. "lsl r7, r9, #16\n\t"
  97103. "lsr r7, r7, #16\n\t"
  97104. "mul r6, r7, r6\n\t"
  97105. "lsr r7, r6, #16\n\t"
  97106. "lsl r6, r6, #16\n\t"
  97107. "adds r3, r3, r6\n\t"
  97108. "adcs r4, r4, r7\n\t"
  97109. "adc r5, r5, #0\n\t"
  97110. #else
  97111. "umull r6, r7, r8, r9\n\t"
  97112. "adds r3, r3, r6\n\t"
  97113. "adcs r4, r4, r7\n\t"
  97114. "adc r5, r5, #0\n\t"
  97115. #endif
  97116. /* A[7] * B[5] */
  97117. "ldr r8, [%[a], #28]\n\t"
  97118. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97119. "lsl r6, r8, #16\n\t"
  97120. "lsl r7, r12, #16\n\t"
  97121. "lsr r6, r6, #16\n\t"
  97122. "lsr r7, r7, #16\n\t"
  97123. "mul r7, r6, r7\n\t"
  97124. "adds r3, r3, r7\n\t"
  97125. "adcs r4, r4, #0\n\t"
  97126. "adc r5, r5, #0\n\t"
  97127. "lsr r7, r12, #16\n\t"
  97128. "mul r6, r7, r6\n\t"
  97129. "lsr r7, r6, #16\n\t"
  97130. "lsl r6, r6, #16\n\t"
  97131. "adds r3, r3, r6\n\t"
  97132. "adcs r4, r4, r7\n\t"
  97133. "adc r5, r5, #0\n\t"
  97134. "lsr r6, r8, #16\n\t"
  97135. "lsr r7, r12, #16\n\t"
  97136. "mul r7, r6, r7\n\t"
  97137. "adds r4, r4, r7\n\t"
  97138. "adc r5, r5, #0\n\t"
  97139. "lsl r7, r12, #16\n\t"
  97140. "lsr r7, r7, #16\n\t"
  97141. "mul r6, r7, r6\n\t"
  97142. "lsr r7, r6, #16\n\t"
  97143. "lsl r6, r6, #16\n\t"
  97144. "adds r3, r3, r6\n\t"
  97145. "adcs r4, r4, r7\n\t"
  97146. "adc r5, r5, #0\n\t"
  97147. #else
  97148. "umull r6, r7, r8, r12\n\t"
  97149. "adds r3, r3, r6\n\t"
  97150. "adcs r4, r4, r7\n\t"
  97151. "adc r5, r5, #0\n\t"
  97152. #endif
  97153. /* A[6] * B[6] */
  97154. "ldr r11, [%[a], #24]\n\t"
  97155. "ldr r12, [%[b], #24]\n\t"
  97156. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97157. "lsl r6, r11, #16\n\t"
  97158. "lsl r7, r12, #16\n\t"
  97159. "lsr r6, r6, #16\n\t"
  97160. "lsr r7, r7, #16\n\t"
  97161. "mul r7, r6, r7\n\t"
  97162. "adds r3, r3, r7\n\t"
  97163. "adcs r4, r4, #0\n\t"
  97164. "adc r5, r5, #0\n\t"
  97165. "lsr r7, r12, #16\n\t"
  97166. "mul r6, r7, r6\n\t"
  97167. "lsr r7, r6, #16\n\t"
  97168. "lsl r6, r6, #16\n\t"
  97169. "adds r3, r3, r6\n\t"
  97170. "adcs r4, r4, r7\n\t"
  97171. "adc r5, r5, #0\n\t"
  97172. "lsr r6, r11, #16\n\t"
  97173. "lsr r7, r12, #16\n\t"
  97174. "mul r7, r6, r7\n\t"
  97175. "adds r4, r4, r7\n\t"
  97176. "adc r5, r5, #0\n\t"
  97177. "lsl r7, r12, #16\n\t"
  97178. "lsr r7, r7, #16\n\t"
  97179. "mul r6, r7, r6\n\t"
  97180. "lsr r7, r6, #16\n\t"
  97181. "lsl r6, r6, #16\n\t"
  97182. "adds r3, r3, r6\n\t"
  97183. "adcs r4, r4, r7\n\t"
  97184. "adc r5, r5, #0\n\t"
  97185. #else
  97186. "umull r6, r7, r11, r12\n\t"
  97187. "adds r3, r3, r6\n\t"
  97188. "adcs r4, r4, r7\n\t"
  97189. "adc r5, r5, #0\n\t"
  97190. #endif
  97191. /* A[5] * B[7] */
  97192. "ldr r8, [%[a], #20]\n\t"
  97193. "ldr r9, [%[b], #28]\n\t"
  97194. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97195. "lsl r6, r8, #16\n\t"
  97196. "lsl r7, r9, #16\n\t"
  97197. "lsr r6, r6, #16\n\t"
  97198. "lsr r7, r7, #16\n\t"
  97199. "mul r7, r6, r7\n\t"
  97200. "adds r3, r3, r7\n\t"
  97201. "adcs r4, r4, #0\n\t"
  97202. "adc r5, r5, #0\n\t"
  97203. "lsr r7, r9, #16\n\t"
  97204. "mul r6, r7, r6\n\t"
  97205. "lsr r7, r6, #16\n\t"
  97206. "lsl r6, r6, #16\n\t"
  97207. "adds r3, r3, r6\n\t"
  97208. "adcs r4, r4, r7\n\t"
  97209. "adc r5, r5, #0\n\t"
  97210. "lsr r6, r8, #16\n\t"
  97211. "lsr r7, r9, #16\n\t"
  97212. "mul r7, r6, r7\n\t"
  97213. "adds r4, r4, r7\n\t"
  97214. "adc r5, r5, #0\n\t"
  97215. "lsl r7, r9, #16\n\t"
  97216. "lsr r7, r7, #16\n\t"
  97217. "mul r6, r7, r6\n\t"
  97218. "lsr r7, r6, #16\n\t"
  97219. "lsl r6, r6, #16\n\t"
  97220. "adds r3, r3, r6\n\t"
  97221. "adcs r4, r4, r7\n\t"
  97222. "adc r5, r5, #0\n\t"
  97223. #else
  97224. "umull r6, r7, r8, r9\n\t"
  97225. "adds r3, r3, r6\n\t"
  97226. "adcs r4, r4, r7\n\t"
  97227. "adc r5, r5, #0\n\t"
  97228. #endif
  97229. /* A[4] * B[8] */
  97230. "ldr r8, [%[a], #16]\n\t"
  97231. "ldr r9, [%[b], #32]\n\t"
  97232. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97233. "lsl r6, r8, #16\n\t"
  97234. "lsl r7, r9, #16\n\t"
  97235. "lsr r6, r6, #16\n\t"
  97236. "lsr r7, r7, #16\n\t"
  97237. "mul r7, r6, r7\n\t"
  97238. "adds r3, r3, r7\n\t"
  97239. "adcs r4, r4, #0\n\t"
  97240. "adc r5, r5, #0\n\t"
  97241. "lsr r7, r9, #16\n\t"
  97242. "mul r6, r7, r6\n\t"
  97243. "lsr r7, r6, #16\n\t"
  97244. "lsl r6, r6, #16\n\t"
  97245. "adds r3, r3, r6\n\t"
  97246. "adcs r4, r4, r7\n\t"
  97247. "adc r5, r5, #0\n\t"
  97248. "lsr r6, r8, #16\n\t"
  97249. "lsr r7, r9, #16\n\t"
  97250. "mul r7, r6, r7\n\t"
  97251. "adds r4, r4, r7\n\t"
  97252. "adc r5, r5, #0\n\t"
  97253. "lsl r7, r9, #16\n\t"
  97254. "lsr r7, r7, #16\n\t"
  97255. "mul r6, r7, r6\n\t"
  97256. "lsr r7, r6, #16\n\t"
  97257. "lsl r6, r6, #16\n\t"
  97258. "adds r3, r3, r6\n\t"
  97259. "adcs r4, r4, r7\n\t"
  97260. "adc r5, r5, #0\n\t"
  97261. #else
  97262. "umull r6, r7, r8, r9\n\t"
  97263. "adds r3, r3, r6\n\t"
  97264. "adcs r4, r4, r7\n\t"
  97265. "adc r5, r5, #0\n\t"
  97266. #endif
  97267. /* A[3] * B[9] */
  97268. "ldr r8, [%[a], #12]\n\t"
  97269. "ldr r9, [%[b], #36]\n\t"
  97270. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97271. "lsl r6, r8, #16\n\t"
  97272. "lsl r7, r9, #16\n\t"
  97273. "lsr r6, r6, #16\n\t"
  97274. "lsr r7, r7, #16\n\t"
  97275. "mul r7, r6, r7\n\t"
  97276. "adds r3, r3, r7\n\t"
  97277. "adcs r4, r4, #0\n\t"
  97278. "adc r5, r5, #0\n\t"
  97279. "lsr r7, r9, #16\n\t"
  97280. "mul r6, r7, r6\n\t"
  97281. "lsr r7, r6, #16\n\t"
  97282. "lsl r6, r6, #16\n\t"
  97283. "adds r3, r3, r6\n\t"
  97284. "adcs r4, r4, r7\n\t"
  97285. "adc r5, r5, #0\n\t"
  97286. "lsr r6, r8, #16\n\t"
  97287. "lsr r7, r9, #16\n\t"
  97288. "mul r7, r6, r7\n\t"
  97289. "adds r4, r4, r7\n\t"
  97290. "adc r5, r5, #0\n\t"
  97291. "lsl r7, r9, #16\n\t"
  97292. "lsr r7, r7, #16\n\t"
  97293. "mul r6, r7, r6\n\t"
  97294. "lsr r7, r6, #16\n\t"
  97295. "lsl r6, r6, #16\n\t"
  97296. "adds r3, r3, r6\n\t"
  97297. "adcs r4, r4, r7\n\t"
  97298. "adc r5, r5, #0\n\t"
  97299. #else
  97300. "umull r6, r7, r8, r9\n\t"
  97301. "adds r3, r3, r6\n\t"
  97302. "adcs r4, r4, r7\n\t"
  97303. "adc r5, r5, #0\n\t"
  97304. #endif
  97305. /* A[2] * B[10] */
  97306. "ldr r8, [%[a], #8]\n\t"
  97307. "ldr r9, [%[b], #40]\n\t"
  97308. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97309. "lsl r6, r8, #16\n\t"
  97310. "lsl r7, r9, #16\n\t"
  97311. "lsr r6, r6, #16\n\t"
  97312. "lsr r7, r7, #16\n\t"
  97313. "mul r7, r6, r7\n\t"
  97314. "adds r3, r3, r7\n\t"
  97315. "adcs r4, r4, #0\n\t"
  97316. "adc r5, r5, #0\n\t"
  97317. "lsr r7, r9, #16\n\t"
  97318. "mul r6, r7, r6\n\t"
  97319. "lsr r7, r6, #16\n\t"
  97320. "lsl r6, r6, #16\n\t"
  97321. "adds r3, r3, r6\n\t"
  97322. "adcs r4, r4, r7\n\t"
  97323. "adc r5, r5, #0\n\t"
  97324. "lsr r6, r8, #16\n\t"
  97325. "lsr r7, r9, #16\n\t"
  97326. "mul r7, r6, r7\n\t"
  97327. "adds r4, r4, r7\n\t"
  97328. "adc r5, r5, #0\n\t"
  97329. "lsl r7, r9, #16\n\t"
  97330. "lsr r7, r7, #16\n\t"
  97331. "mul r6, r7, r6\n\t"
  97332. "lsr r7, r6, #16\n\t"
  97333. "lsl r6, r6, #16\n\t"
  97334. "adds r3, r3, r6\n\t"
  97335. "adcs r4, r4, r7\n\t"
  97336. "adc r5, r5, #0\n\t"
  97337. #else
  97338. "umull r6, r7, r8, r9\n\t"
  97339. "adds r3, r3, r6\n\t"
  97340. "adcs r4, r4, r7\n\t"
  97341. "adc r5, r5, #0\n\t"
  97342. #endif
  97343. /* A[1] * B[11] */
  97344. "ldr r8, [%[a], #4]\n\t"
  97345. "ldr r9, [%[b], #44]\n\t"
  97346. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97347. "lsl r6, r8, #16\n\t"
  97348. "lsl r7, r9, #16\n\t"
  97349. "lsr r6, r6, #16\n\t"
  97350. "lsr r7, r7, #16\n\t"
  97351. "mul r7, r6, r7\n\t"
  97352. "adds r3, r3, r7\n\t"
  97353. "adcs r4, r4, #0\n\t"
  97354. "adc r5, r5, #0\n\t"
  97355. "lsr r7, r9, #16\n\t"
  97356. "mul r6, r7, r6\n\t"
  97357. "lsr r7, r6, #16\n\t"
  97358. "lsl r6, r6, #16\n\t"
  97359. "adds r3, r3, r6\n\t"
  97360. "adcs r4, r4, r7\n\t"
  97361. "adc r5, r5, #0\n\t"
  97362. "lsr r6, r8, #16\n\t"
  97363. "lsr r7, r9, #16\n\t"
  97364. "mul r7, r6, r7\n\t"
  97365. "adds r4, r4, r7\n\t"
  97366. "adc r5, r5, #0\n\t"
  97367. "lsl r7, r9, #16\n\t"
  97368. "lsr r7, r7, #16\n\t"
  97369. "mul r6, r7, r6\n\t"
  97370. "lsr r7, r6, #16\n\t"
  97371. "lsl r6, r6, #16\n\t"
  97372. "adds r3, r3, r6\n\t"
  97373. "adcs r4, r4, r7\n\t"
  97374. "adc r5, r5, #0\n\t"
  97375. #else
  97376. "umull r6, r7, r8, r9\n\t"
  97377. "adds r3, r3, r6\n\t"
  97378. "adcs r4, r4, r7\n\t"
  97379. "adc r5, r5, #0\n\t"
  97380. #endif
  97381. /* A[0] * B[12] */
  97382. "ldr r8, [%[a]]\n\t"
  97383. "ldr r9, [%[b], #48]\n\t"
  97384. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97385. "lsl r6, r8, #16\n\t"
  97386. "lsl r7, r9, #16\n\t"
  97387. "lsr r6, r6, #16\n\t"
  97388. "lsr r7, r7, #16\n\t"
  97389. "mul r7, r6, r7\n\t"
  97390. "adds r3, r3, r7\n\t"
  97391. "adcs r4, r4, #0\n\t"
  97392. "adc r5, r5, #0\n\t"
  97393. "lsr r7, r9, #16\n\t"
  97394. "mul r6, r7, r6\n\t"
  97395. "lsr r7, r6, #16\n\t"
  97396. "lsl r6, r6, #16\n\t"
  97397. "adds r3, r3, r6\n\t"
  97398. "adcs r4, r4, r7\n\t"
  97399. "adc r5, r5, #0\n\t"
  97400. "lsr r6, r8, #16\n\t"
  97401. "lsr r7, r9, #16\n\t"
  97402. "mul r7, r6, r7\n\t"
  97403. "adds r4, r4, r7\n\t"
  97404. "adc r5, r5, #0\n\t"
  97405. "lsl r7, r9, #16\n\t"
  97406. "lsr r7, r7, #16\n\t"
  97407. "mul r6, r7, r6\n\t"
  97408. "lsr r7, r6, #16\n\t"
  97409. "lsl r6, r6, #16\n\t"
  97410. "adds r3, r3, r6\n\t"
  97411. "adcs r4, r4, r7\n\t"
  97412. "adc r5, r5, #0\n\t"
  97413. #else
  97414. "umull r6, r7, r8, r9\n\t"
  97415. "adds r3, r3, r6\n\t"
  97416. "adcs r4, r4, r7\n\t"
  97417. "adc r5, r5, #0\n\t"
  97418. #endif
  97419. "str r3, [sp, #48]\n\t"
  97420. /* A[0] * B[13] */
  97421. "ldr r9, [%[b], #52]\n\t"
  97422. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97423. "lsl r6, r8, #16\n\t"
  97424. "lsl r7, r9, #16\n\t"
  97425. "lsr r6, r6, #16\n\t"
  97426. "lsr r7, r7, #16\n\t"
  97427. "mul r7, r6, r7\n\t"
  97428. "adds r4, r4, r7\n\t"
  97429. "adcs r5, r5, #0\n\t"
  97430. "mov r3, #0\n\t"
  97431. "adc r3, r3, #0\n\t"
  97432. "lsr r7, r9, #16\n\t"
  97433. "mul r6, r7, r6\n\t"
  97434. "lsr r7, r6, #16\n\t"
  97435. "lsl r6, r6, #16\n\t"
  97436. "adds r4, r4, r6\n\t"
  97437. "adcs r5, r5, r7\n\t"
  97438. "adc r3, r3, #0\n\t"
  97439. "lsr r6, r8, #16\n\t"
  97440. "lsr r7, r9, #16\n\t"
  97441. "mul r7, r6, r7\n\t"
  97442. "adds r5, r5, r7\n\t"
  97443. "adc r3, r3, #0\n\t"
  97444. "lsl r7, r9, #16\n\t"
  97445. "lsr r7, r7, #16\n\t"
  97446. "mul r6, r7, r6\n\t"
  97447. "lsr r7, r6, #16\n\t"
  97448. "lsl r6, r6, #16\n\t"
  97449. "adds r4, r4, r6\n\t"
  97450. "adcs r5, r5, r7\n\t"
  97451. "adc r3, r3, #0\n\t"
  97452. #else
  97453. "umull r6, r7, r8, r9\n\t"
  97454. "adds r4, r4, r6\n\t"
  97455. "adcs r5, r5, r7\n\t"
  97456. "mov r3, #0\n\t"
  97457. "adc r3, r3, #0\n\t"
  97458. #endif
  97459. /* A[1] * B[12] */
  97460. "ldr r8, [%[a], #4]\n\t"
  97461. "ldr r9, [%[b], #48]\n\t"
  97462. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97463. "lsl r6, r8, #16\n\t"
  97464. "lsl r7, r9, #16\n\t"
  97465. "lsr r6, r6, #16\n\t"
  97466. "lsr r7, r7, #16\n\t"
  97467. "mul r7, r6, r7\n\t"
  97468. "adds r4, r4, r7\n\t"
  97469. "adcs r5, r5, #0\n\t"
  97470. "adc r3, r3, #0\n\t"
  97471. "lsr r7, r9, #16\n\t"
  97472. "mul r6, r7, r6\n\t"
  97473. "lsr r7, r6, #16\n\t"
  97474. "lsl r6, r6, #16\n\t"
  97475. "adds r4, r4, r6\n\t"
  97476. "adcs r5, r5, r7\n\t"
  97477. "adc r3, r3, #0\n\t"
  97478. "lsr r6, r8, #16\n\t"
  97479. "lsr r7, r9, #16\n\t"
  97480. "mul r7, r6, r7\n\t"
  97481. "adds r5, r5, r7\n\t"
  97482. "adc r3, r3, #0\n\t"
  97483. "lsl r7, r9, #16\n\t"
  97484. "lsr r7, r7, #16\n\t"
  97485. "mul r6, r7, r6\n\t"
  97486. "lsr r7, r6, #16\n\t"
  97487. "lsl r6, r6, #16\n\t"
  97488. "adds r4, r4, r6\n\t"
  97489. "adcs r5, r5, r7\n\t"
  97490. "adc r3, r3, #0\n\t"
  97491. #else
  97492. "umull r6, r7, r8, r9\n\t"
  97493. "adds r4, r4, r6\n\t"
  97494. "adcs r5, r5, r7\n\t"
  97495. "adc r3, r3, #0\n\t"
  97496. #endif
  97497. /* A[2] * B[11] */
  97498. "ldr r8, [%[a], #8]\n\t"
  97499. "ldr r9, [%[b], #44]\n\t"
  97500. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97501. "lsl r6, r8, #16\n\t"
  97502. "lsl r7, r9, #16\n\t"
  97503. "lsr r6, r6, #16\n\t"
  97504. "lsr r7, r7, #16\n\t"
  97505. "mul r7, r6, r7\n\t"
  97506. "adds r4, r4, r7\n\t"
  97507. "adcs r5, r5, #0\n\t"
  97508. "adc r3, r3, #0\n\t"
  97509. "lsr r7, r9, #16\n\t"
  97510. "mul r6, r7, r6\n\t"
  97511. "lsr r7, r6, #16\n\t"
  97512. "lsl r6, r6, #16\n\t"
  97513. "adds r4, r4, r6\n\t"
  97514. "adcs r5, r5, r7\n\t"
  97515. "adc r3, r3, #0\n\t"
  97516. "lsr r6, r8, #16\n\t"
  97517. "lsr r7, r9, #16\n\t"
  97518. "mul r7, r6, r7\n\t"
  97519. "adds r5, r5, r7\n\t"
  97520. "adc r3, r3, #0\n\t"
  97521. "lsl r7, r9, #16\n\t"
  97522. "lsr r7, r7, #16\n\t"
  97523. "mul r6, r7, r6\n\t"
  97524. "lsr r7, r6, #16\n\t"
  97525. "lsl r6, r6, #16\n\t"
  97526. "adds r4, r4, r6\n\t"
  97527. "adcs r5, r5, r7\n\t"
  97528. "adc r3, r3, #0\n\t"
  97529. #else
  97530. "umull r6, r7, r8, r9\n\t"
  97531. "adds r4, r4, r6\n\t"
  97532. "adcs r5, r5, r7\n\t"
  97533. "adc r3, r3, #0\n\t"
  97534. #endif
  97535. /* A[3] * B[10] */
  97536. "ldr r8, [%[a], #12]\n\t"
  97537. "ldr r9, [%[b], #40]\n\t"
  97538. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97539. "lsl r6, r8, #16\n\t"
  97540. "lsl r7, r9, #16\n\t"
  97541. "lsr r6, r6, #16\n\t"
  97542. "lsr r7, r7, #16\n\t"
  97543. "mul r7, r6, r7\n\t"
  97544. "adds r4, r4, r7\n\t"
  97545. "adcs r5, r5, #0\n\t"
  97546. "adc r3, r3, #0\n\t"
  97547. "lsr r7, r9, #16\n\t"
  97548. "mul r6, r7, r6\n\t"
  97549. "lsr r7, r6, #16\n\t"
  97550. "lsl r6, r6, #16\n\t"
  97551. "adds r4, r4, r6\n\t"
  97552. "adcs r5, r5, r7\n\t"
  97553. "adc r3, r3, #0\n\t"
  97554. "lsr r6, r8, #16\n\t"
  97555. "lsr r7, r9, #16\n\t"
  97556. "mul r7, r6, r7\n\t"
  97557. "adds r5, r5, r7\n\t"
  97558. "adc r3, r3, #0\n\t"
  97559. "lsl r7, r9, #16\n\t"
  97560. "lsr r7, r7, #16\n\t"
  97561. "mul r6, r7, r6\n\t"
  97562. "lsr r7, r6, #16\n\t"
  97563. "lsl r6, r6, #16\n\t"
  97564. "adds r4, r4, r6\n\t"
  97565. "adcs r5, r5, r7\n\t"
  97566. "adc r3, r3, #0\n\t"
  97567. #else
  97568. "umull r6, r7, r8, r9\n\t"
  97569. "adds r4, r4, r6\n\t"
  97570. "adcs r5, r5, r7\n\t"
  97571. "adc r3, r3, #0\n\t"
  97572. #endif
  97573. /* A[4] * B[9] */
  97574. "ldr r8, [%[a], #16]\n\t"
  97575. "ldr r9, [%[b], #36]\n\t"
  97576. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97577. "lsl r6, r8, #16\n\t"
  97578. "lsl r7, r9, #16\n\t"
  97579. "lsr r6, r6, #16\n\t"
  97580. "lsr r7, r7, #16\n\t"
  97581. "mul r7, r6, r7\n\t"
  97582. "adds r4, r4, r7\n\t"
  97583. "adcs r5, r5, #0\n\t"
  97584. "adc r3, r3, #0\n\t"
  97585. "lsr r7, r9, #16\n\t"
  97586. "mul r6, r7, r6\n\t"
  97587. "lsr r7, r6, #16\n\t"
  97588. "lsl r6, r6, #16\n\t"
  97589. "adds r4, r4, r6\n\t"
  97590. "adcs r5, r5, r7\n\t"
  97591. "adc r3, r3, #0\n\t"
  97592. "lsr r6, r8, #16\n\t"
  97593. "lsr r7, r9, #16\n\t"
  97594. "mul r7, r6, r7\n\t"
  97595. "adds r5, r5, r7\n\t"
  97596. "adc r3, r3, #0\n\t"
  97597. "lsl r7, r9, #16\n\t"
  97598. "lsr r7, r7, #16\n\t"
  97599. "mul r6, r7, r6\n\t"
  97600. "lsr r7, r6, #16\n\t"
  97601. "lsl r6, r6, #16\n\t"
  97602. "adds r4, r4, r6\n\t"
  97603. "adcs r5, r5, r7\n\t"
  97604. "adc r3, r3, #0\n\t"
  97605. #else
  97606. "umull r6, r7, r8, r9\n\t"
  97607. "adds r4, r4, r6\n\t"
  97608. "adcs r5, r5, r7\n\t"
  97609. "adc r3, r3, #0\n\t"
  97610. #endif
  97611. /* A[5] * B[8] */
  97612. "ldr r8, [%[a], #20]\n\t"
  97613. "ldr r9, [%[b], #32]\n\t"
  97614. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97615. "lsl r6, r8, #16\n\t"
  97616. "lsl r7, r9, #16\n\t"
  97617. "lsr r6, r6, #16\n\t"
  97618. "lsr r7, r7, #16\n\t"
  97619. "mul r7, r6, r7\n\t"
  97620. "adds r4, r4, r7\n\t"
  97621. "adcs r5, r5, #0\n\t"
  97622. "adc r3, r3, #0\n\t"
  97623. "lsr r7, r9, #16\n\t"
  97624. "mul r6, r7, r6\n\t"
  97625. "lsr r7, r6, #16\n\t"
  97626. "lsl r6, r6, #16\n\t"
  97627. "adds r4, r4, r6\n\t"
  97628. "adcs r5, r5, r7\n\t"
  97629. "adc r3, r3, #0\n\t"
  97630. "lsr r6, r8, #16\n\t"
  97631. "lsr r7, r9, #16\n\t"
  97632. "mul r7, r6, r7\n\t"
  97633. "adds r5, r5, r7\n\t"
  97634. "adc r3, r3, #0\n\t"
  97635. "lsl r7, r9, #16\n\t"
  97636. "lsr r7, r7, #16\n\t"
  97637. "mul r6, r7, r6\n\t"
  97638. "lsr r7, r6, #16\n\t"
  97639. "lsl r6, r6, #16\n\t"
  97640. "adds r4, r4, r6\n\t"
  97641. "adcs r5, r5, r7\n\t"
  97642. "adc r3, r3, #0\n\t"
  97643. #else
  97644. "umull r6, r7, r8, r9\n\t"
  97645. "adds r4, r4, r6\n\t"
  97646. "adcs r5, r5, r7\n\t"
  97647. "adc r3, r3, #0\n\t"
  97648. #endif
  97649. /* A[6] * B[7] */
  97650. "ldr r9, [%[b], #28]\n\t"
  97651. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97652. "lsl r6, r11, #16\n\t"
  97653. "lsl r7, r9, #16\n\t"
  97654. "lsr r6, r6, #16\n\t"
  97655. "lsr r7, r7, #16\n\t"
  97656. "mul r7, r6, r7\n\t"
  97657. "adds r4, r4, r7\n\t"
  97658. "adcs r5, r5, #0\n\t"
  97659. "adc r3, r3, #0\n\t"
  97660. "lsr r7, r9, #16\n\t"
  97661. "mul r6, r7, r6\n\t"
  97662. "lsr r7, r6, #16\n\t"
  97663. "lsl r6, r6, #16\n\t"
  97664. "adds r4, r4, r6\n\t"
  97665. "adcs r5, r5, r7\n\t"
  97666. "adc r3, r3, #0\n\t"
  97667. "lsr r6, r11, #16\n\t"
  97668. "lsr r7, r9, #16\n\t"
  97669. "mul r7, r6, r7\n\t"
  97670. "adds r5, r5, r7\n\t"
  97671. "adc r3, r3, #0\n\t"
  97672. "lsl r7, r9, #16\n\t"
  97673. "lsr r7, r7, #16\n\t"
  97674. "mul r6, r7, r6\n\t"
  97675. "lsr r7, r6, #16\n\t"
  97676. "lsl r6, r6, #16\n\t"
  97677. "adds r4, r4, r6\n\t"
  97678. "adcs r5, r5, r7\n\t"
  97679. "adc r3, r3, #0\n\t"
  97680. #else
  97681. "umull r6, r7, r11, r9\n\t"
  97682. "adds r4, r4, r6\n\t"
  97683. "adcs r5, r5, r7\n\t"
  97684. "adc r3, r3, #0\n\t"
  97685. #endif
  97686. /* A[7] * B[6] */
  97687. "ldr r8, [%[a], #28]\n\t"
  97688. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97689. "lsl r6, r8, #16\n\t"
  97690. "lsl r7, r12, #16\n\t"
  97691. "lsr r6, r6, #16\n\t"
  97692. "lsr r7, r7, #16\n\t"
  97693. "mul r7, r6, r7\n\t"
  97694. "adds r4, r4, r7\n\t"
  97695. "adcs r5, r5, #0\n\t"
  97696. "adc r3, r3, #0\n\t"
  97697. "lsr r7, r12, #16\n\t"
  97698. "mul r6, r7, r6\n\t"
  97699. "lsr r7, r6, #16\n\t"
  97700. "lsl r6, r6, #16\n\t"
  97701. "adds r4, r4, r6\n\t"
  97702. "adcs r5, r5, r7\n\t"
  97703. "adc r3, r3, #0\n\t"
  97704. "lsr r6, r8, #16\n\t"
  97705. "lsr r7, r12, #16\n\t"
  97706. "mul r7, r6, r7\n\t"
  97707. "adds r5, r5, r7\n\t"
  97708. "adc r3, r3, #0\n\t"
  97709. "lsl r7, r12, #16\n\t"
  97710. "lsr r7, r7, #16\n\t"
  97711. "mul r6, r7, r6\n\t"
  97712. "lsr r7, r6, #16\n\t"
  97713. "lsl r6, r6, #16\n\t"
  97714. "adds r4, r4, r6\n\t"
  97715. "adcs r5, r5, r7\n\t"
  97716. "adc r3, r3, #0\n\t"
  97717. #else
  97718. "umull r6, r7, r8, r12\n\t"
  97719. "adds r4, r4, r6\n\t"
  97720. "adcs r5, r5, r7\n\t"
  97721. "adc r3, r3, #0\n\t"
  97722. #endif
  97723. /* A[8] * B[5] */
  97724. "ldr r8, [%[a], #32]\n\t"
  97725. "ldr r9, [%[b], #20]\n\t"
  97726. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97727. "lsl r6, r8, #16\n\t"
  97728. "lsl r7, r9, #16\n\t"
  97729. "lsr r6, r6, #16\n\t"
  97730. "lsr r7, r7, #16\n\t"
  97731. "mul r7, r6, r7\n\t"
  97732. "adds r4, r4, r7\n\t"
  97733. "adcs r5, r5, #0\n\t"
  97734. "adc r3, r3, #0\n\t"
  97735. "lsr r7, r9, #16\n\t"
  97736. "mul r6, r7, r6\n\t"
  97737. "lsr r7, r6, #16\n\t"
  97738. "lsl r6, r6, #16\n\t"
  97739. "adds r4, r4, r6\n\t"
  97740. "adcs r5, r5, r7\n\t"
  97741. "adc r3, r3, #0\n\t"
  97742. "lsr r6, r8, #16\n\t"
  97743. "lsr r7, r9, #16\n\t"
  97744. "mul r7, r6, r7\n\t"
  97745. "adds r5, r5, r7\n\t"
  97746. "adc r3, r3, #0\n\t"
  97747. "lsl r7, r9, #16\n\t"
  97748. "lsr r7, r7, #16\n\t"
  97749. "mul r6, r7, r6\n\t"
  97750. "lsr r7, r6, #16\n\t"
  97751. "lsl r6, r6, #16\n\t"
  97752. "adds r4, r4, r6\n\t"
  97753. "adcs r5, r5, r7\n\t"
  97754. "adc r3, r3, #0\n\t"
  97755. #else
  97756. "umull r6, r7, r8, r9\n\t"
  97757. "adds r4, r4, r6\n\t"
  97758. "adcs r5, r5, r7\n\t"
  97759. "adc r3, r3, #0\n\t"
  97760. #endif
  97761. /* A[9] * B[4] */
  97762. "ldr r8, [%[a], #36]\n\t"
  97763. "ldr r9, [%[b], #16]\n\t"
  97764. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97765. "lsl r6, r8, #16\n\t"
  97766. "lsl r7, r9, #16\n\t"
  97767. "lsr r6, r6, #16\n\t"
  97768. "lsr r7, r7, #16\n\t"
  97769. "mul r7, r6, r7\n\t"
  97770. "adds r4, r4, r7\n\t"
  97771. "adcs r5, r5, #0\n\t"
  97772. "adc r3, r3, #0\n\t"
  97773. "lsr r7, r9, #16\n\t"
  97774. "mul r6, r7, r6\n\t"
  97775. "lsr r7, r6, #16\n\t"
  97776. "lsl r6, r6, #16\n\t"
  97777. "adds r4, r4, r6\n\t"
  97778. "adcs r5, r5, r7\n\t"
  97779. "adc r3, r3, #0\n\t"
  97780. "lsr r6, r8, #16\n\t"
  97781. "lsr r7, r9, #16\n\t"
  97782. "mul r7, r6, r7\n\t"
  97783. "adds r5, r5, r7\n\t"
  97784. "adc r3, r3, #0\n\t"
  97785. "lsl r7, r9, #16\n\t"
  97786. "lsr r7, r7, #16\n\t"
  97787. "mul r6, r7, r6\n\t"
  97788. "lsr r7, r6, #16\n\t"
  97789. "lsl r6, r6, #16\n\t"
  97790. "adds r4, r4, r6\n\t"
  97791. "adcs r5, r5, r7\n\t"
  97792. "adc r3, r3, #0\n\t"
  97793. #else
  97794. "umull r6, r7, r8, r9\n\t"
  97795. "adds r4, r4, r6\n\t"
  97796. "adcs r5, r5, r7\n\t"
  97797. "adc r3, r3, #0\n\t"
  97798. #endif
  97799. /* A[10] * B[3] */
  97800. "ldr r8, [%[a], #40]\n\t"
  97801. "ldr r9, [%[b], #12]\n\t"
  97802. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97803. "lsl r6, r8, #16\n\t"
  97804. "lsl r7, r9, #16\n\t"
  97805. "lsr r6, r6, #16\n\t"
  97806. "lsr r7, r7, #16\n\t"
  97807. "mul r7, r6, r7\n\t"
  97808. "adds r4, r4, r7\n\t"
  97809. "adcs r5, r5, #0\n\t"
  97810. "adc r3, r3, #0\n\t"
  97811. "lsr r7, r9, #16\n\t"
  97812. "mul r6, r7, r6\n\t"
  97813. "lsr r7, r6, #16\n\t"
  97814. "lsl r6, r6, #16\n\t"
  97815. "adds r4, r4, r6\n\t"
  97816. "adcs r5, r5, r7\n\t"
  97817. "adc r3, r3, #0\n\t"
  97818. "lsr r6, r8, #16\n\t"
  97819. "lsr r7, r9, #16\n\t"
  97820. "mul r7, r6, r7\n\t"
  97821. "adds r5, r5, r7\n\t"
  97822. "adc r3, r3, #0\n\t"
  97823. "lsl r7, r9, #16\n\t"
  97824. "lsr r7, r7, #16\n\t"
  97825. "mul r6, r7, r6\n\t"
  97826. "lsr r7, r6, #16\n\t"
  97827. "lsl r6, r6, #16\n\t"
  97828. "adds r4, r4, r6\n\t"
  97829. "adcs r5, r5, r7\n\t"
  97830. "adc r3, r3, #0\n\t"
  97831. #else
  97832. "umull r6, r7, r8, r9\n\t"
  97833. "adds r4, r4, r6\n\t"
  97834. "adcs r5, r5, r7\n\t"
  97835. "adc r3, r3, #0\n\t"
  97836. #endif
  97837. /* A[11] * B[2] */
  97838. "ldr r8, [%[a], #44]\n\t"
  97839. "ldr r9, [%[b], #8]\n\t"
  97840. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97841. "lsl r6, r8, #16\n\t"
  97842. "lsl r7, r9, #16\n\t"
  97843. "lsr r6, r6, #16\n\t"
  97844. "lsr r7, r7, #16\n\t"
  97845. "mul r7, r6, r7\n\t"
  97846. "adds r4, r4, r7\n\t"
  97847. "adcs r5, r5, #0\n\t"
  97848. "adc r3, r3, #0\n\t"
  97849. "lsr r7, r9, #16\n\t"
  97850. "mul r6, r7, r6\n\t"
  97851. "lsr r7, r6, #16\n\t"
  97852. "lsl r6, r6, #16\n\t"
  97853. "adds r4, r4, r6\n\t"
  97854. "adcs r5, r5, r7\n\t"
  97855. "adc r3, r3, #0\n\t"
  97856. "lsr r6, r8, #16\n\t"
  97857. "lsr r7, r9, #16\n\t"
  97858. "mul r7, r6, r7\n\t"
  97859. "adds r5, r5, r7\n\t"
  97860. "adc r3, r3, #0\n\t"
  97861. "lsl r7, r9, #16\n\t"
  97862. "lsr r7, r7, #16\n\t"
  97863. "mul r6, r7, r6\n\t"
  97864. "lsr r7, r6, #16\n\t"
  97865. "lsl r6, r6, #16\n\t"
  97866. "adds r4, r4, r6\n\t"
  97867. "adcs r5, r5, r7\n\t"
  97868. "adc r3, r3, #0\n\t"
  97869. #else
  97870. "umull r6, r7, r8, r9\n\t"
  97871. "adds r4, r4, r6\n\t"
  97872. "adcs r5, r5, r7\n\t"
  97873. "adc r3, r3, #0\n\t"
  97874. #endif
  97875. /* A[12] * B[1] */
  97876. "ldr r8, [%[a], #48]\n\t"
  97877. "ldr r9, [%[b], #4]\n\t"
  97878. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97879. "lsl r6, r8, #16\n\t"
  97880. "lsl r7, r9, #16\n\t"
  97881. "lsr r6, r6, #16\n\t"
  97882. "lsr r7, r7, #16\n\t"
  97883. "mul r7, r6, r7\n\t"
  97884. "adds r4, r4, r7\n\t"
  97885. "adcs r5, r5, #0\n\t"
  97886. "adc r3, r3, #0\n\t"
  97887. "lsr r7, r9, #16\n\t"
  97888. "mul r6, r7, r6\n\t"
  97889. "lsr r7, r6, #16\n\t"
  97890. "lsl r6, r6, #16\n\t"
  97891. "adds r4, r4, r6\n\t"
  97892. "adcs r5, r5, r7\n\t"
  97893. "adc r3, r3, #0\n\t"
  97894. "lsr r6, r8, #16\n\t"
  97895. "lsr r7, r9, #16\n\t"
  97896. "mul r7, r6, r7\n\t"
  97897. "adds r5, r5, r7\n\t"
  97898. "adc r3, r3, #0\n\t"
  97899. "lsl r7, r9, #16\n\t"
  97900. "lsr r7, r7, #16\n\t"
  97901. "mul r6, r7, r6\n\t"
  97902. "lsr r7, r6, #16\n\t"
  97903. "lsl r6, r6, #16\n\t"
  97904. "adds r4, r4, r6\n\t"
  97905. "adcs r5, r5, r7\n\t"
  97906. "adc r3, r3, #0\n\t"
  97907. #else
  97908. "umull r6, r7, r8, r9\n\t"
  97909. "adds r4, r4, r6\n\t"
  97910. "adcs r5, r5, r7\n\t"
  97911. "adc r3, r3, #0\n\t"
  97912. #endif
  97913. /* A[13] * B[0] */
  97914. "ldr r8, [%[a], #52]\n\t"
  97915. "ldr r9, [%[b]]\n\t"
  97916. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97917. "lsl r6, r8, #16\n\t"
  97918. "lsl r7, r9, #16\n\t"
  97919. "lsr r6, r6, #16\n\t"
  97920. "lsr r7, r7, #16\n\t"
  97921. "mul r7, r6, r7\n\t"
  97922. "adds r4, r4, r7\n\t"
  97923. "adcs r5, r5, #0\n\t"
  97924. "adc r3, r3, #0\n\t"
  97925. "lsr r7, r9, #16\n\t"
  97926. "mul r6, r7, r6\n\t"
  97927. "lsr r7, r6, #16\n\t"
  97928. "lsl r6, r6, #16\n\t"
  97929. "adds r4, r4, r6\n\t"
  97930. "adcs r5, r5, r7\n\t"
  97931. "adc r3, r3, #0\n\t"
  97932. "lsr r6, r8, #16\n\t"
  97933. "lsr r7, r9, #16\n\t"
  97934. "mul r7, r6, r7\n\t"
  97935. "adds r5, r5, r7\n\t"
  97936. "adc r3, r3, #0\n\t"
  97937. "lsl r7, r9, #16\n\t"
  97938. "lsr r7, r7, #16\n\t"
  97939. "mul r6, r7, r6\n\t"
  97940. "lsr r7, r6, #16\n\t"
  97941. "lsl r6, r6, #16\n\t"
  97942. "adds r4, r4, r6\n\t"
  97943. "adcs r5, r5, r7\n\t"
  97944. "adc r3, r3, #0\n\t"
  97945. #else
  97946. "umull r6, r7, r8, r9\n\t"
  97947. "adds r4, r4, r6\n\t"
  97948. "adcs r5, r5, r7\n\t"
  97949. "adc r3, r3, #0\n\t"
  97950. #endif
  97951. "str r4, [sp, #52]\n\t"
  97952. /* A[14] * B[0] */
  97953. "ldr r8, [%[a], #56]\n\t"
  97954. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97955. "lsl r6, r8, #16\n\t"
  97956. "lsl r7, r9, #16\n\t"
  97957. "lsr r6, r6, #16\n\t"
  97958. "lsr r7, r7, #16\n\t"
  97959. "mul r7, r6, r7\n\t"
  97960. "adds r5, r5, r7\n\t"
  97961. "adcs r3, r3, #0\n\t"
  97962. "mov r4, #0\n\t"
  97963. "adc r4, r4, #0\n\t"
  97964. "lsr r7, r9, #16\n\t"
  97965. "mul r6, r7, r6\n\t"
  97966. "lsr r7, r6, #16\n\t"
  97967. "lsl r6, r6, #16\n\t"
  97968. "adds r5, r5, r6\n\t"
  97969. "adcs r3, r3, r7\n\t"
  97970. "adc r4, r4, #0\n\t"
  97971. "lsr r6, r8, #16\n\t"
  97972. "lsr r7, r9, #16\n\t"
  97973. "mul r7, r6, r7\n\t"
  97974. "adds r3, r3, r7\n\t"
  97975. "adc r4, r4, #0\n\t"
  97976. "lsl r7, r9, #16\n\t"
  97977. "lsr r7, r7, #16\n\t"
  97978. "mul r6, r7, r6\n\t"
  97979. "lsr r7, r6, #16\n\t"
  97980. "lsl r6, r6, #16\n\t"
  97981. "adds r5, r5, r6\n\t"
  97982. "adcs r3, r3, r7\n\t"
  97983. "adc r4, r4, #0\n\t"
  97984. #else
  97985. "umull r6, r7, r8, r9\n\t"
  97986. "adds r5, r5, r6\n\t"
  97987. "adcs r3, r3, r7\n\t"
  97988. "mov r4, #0\n\t"
  97989. "adc r4, r4, #0\n\t"
  97990. #endif
  97991. /* A[13] * B[1] */
  97992. "ldr r8, [%[a], #52]\n\t"
  97993. "ldr r9, [%[b], #4]\n\t"
  97994. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  97995. "lsl r6, r8, #16\n\t"
  97996. "lsl r7, r9, #16\n\t"
  97997. "lsr r6, r6, #16\n\t"
  97998. "lsr r7, r7, #16\n\t"
  97999. "mul r7, r6, r7\n\t"
  98000. "adds r5, r5, r7\n\t"
  98001. "adcs r3, r3, #0\n\t"
  98002. "adc r4, r4, #0\n\t"
  98003. "lsr r7, r9, #16\n\t"
  98004. "mul r6, r7, r6\n\t"
  98005. "lsr r7, r6, #16\n\t"
  98006. "lsl r6, r6, #16\n\t"
  98007. "adds r5, r5, r6\n\t"
  98008. "adcs r3, r3, r7\n\t"
  98009. "adc r4, r4, #0\n\t"
  98010. "lsr r6, r8, #16\n\t"
  98011. "lsr r7, r9, #16\n\t"
  98012. "mul r7, r6, r7\n\t"
  98013. "adds r3, r3, r7\n\t"
  98014. "adc r4, r4, #0\n\t"
  98015. "lsl r7, r9, #16\n\t"
  98016. "lsr r7, r7, #16\n\t"
  98017. "mul r6, r7, r6\n\t"
  98018. "lsr r7, r6, #16\n\t"
  98019. "lsl r6, r6, #16\n\t"
  98020. "adds r5, r5, r6\n\t"
  98021. "adcs r3, r3, r7\n\t"
  98022. "adc r4, r4, #0\n\t"
  98023. #else
  98024. "umull r6, r7, r8, r9\n\t"
  98025. "adds r5, r5, r6\n\t"
  98026. "adcs r3, r3, r7\n\t"
  98027. "adc r4, r4, #0\n\t"
  98028. #endif
  98029. /* A[12] * B[2] */
  98030. "ldr r8, [%[a], #48]\n\t"
  98031. "ldr r9, [%[b], #8]\n\t"
  98032. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98033. "lsl r6, r8, #16\n\t"
  98034. "lsl r7, r9, #16\n\t"
  98035. "lsr r6, r6, #16\n\t"
  98036. "lsr r7, r7, #16\n\t"
  98037. "mul r7, r6, r7\n\t"
  98038. "adds r5, r5, r7\n\t"
  98039. "adcs r3, r3, #0\n\t"
  98040. "adc r4, r4, #0\n\t"
  98041. "lsr r7, r9, #16\n\t"
  98042. "mul r6, r7, r6\n\t"
  98043. "lsr r7, r6, #16\n\t"
  98044. "lsl r6, r6, #16\n\t"
  98045. "adds r5, r5, r6\n\t"
  98046. "adcs r3, r3, r7\n\t"
  98047. "adc r4, r4, #0\n\t"
  98048. "lsr r6, r8, #16\n\t"
  98049. "lsr r7, r9, #16\n\t"
  98050. "mul r7, r6, r7\n\t"
  98051. "adds r3, r3, r7\n\t"
  98052. "adc r4, r4, #0\n\t"
  98053. "lsl r7, r9, #16\n\t"
  98054. "lsr r7, r7, #16\n\t"
  98055. "mul r6, r7, r6\n\t"
  98056. "lsr r7, r6, #16\n\t"
  98057. "lsl r6, r6, #16\n\t"
  98058. "adds r5, r5, r6\n\t"
  98059. "adcs r3, r3, r7\n\t"
  98060. "adc r4, r4, #0\n\t"
  98061. #else
  98062. "umull r6, r7, r8, r9\n\t"
  98063. "adds r5, r5, r6\n\t"
  98064. "adcs r3, r3, r7\n\t"
  98065. "adc r4, r4, #0\n\t"
  98066. #endif
  98067. /* A[11] * B[3] */
  98068. "ldr r8, [%[a], #44]\n\t"
  98069. "ldr r9, [%[b], #12]\n\t"
  98070. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98071. "lsl r6, r8, #16\n\t"
  98072. "lsl r7, r9, #16\n\t"
  98073. "lsr r6, r6, #16\n\t"
  98074. "lsr r7, r7, #16\n\t"
  98075. "mul r7, r6, r7\n\t"
  98076. "adds r5, r5, r7\n\t"
  98077. "adcs r3, r3, #0\n\t"
  98078. "adc r4, r4, #0\n\t"
  98079. "lsr r7, r9, #16\n\t"
  98080. "mul r6, r7, r6\n\t"
  98081. "lsr r7, r6, #16\n\t"
  98082. "lsl r6, r6, #16\n\t"
  98083. "adds r5, r5, r6\n\t"
  98084. "adcs r3, r3, r7\n\t"
  98085. "adc r4, r4, #0\n\t"
  98086. "lsr r6, r8, #16\n\t"
  98087. "lsr r7, r9, #16\n\t"
  98088. "mul r7, r6, r7\n\t"
  98089. "adds r3, r3, r7\n\t"
  98090. "adc r4, r4, #0\n\t"
  98091. "lsl r7, r9, #16\n\t"
  98092. "lsr r7, r7, #16\n\t"
  98093. "mul r6, r7, r6\n\t"
  98094. "lsr r7, r6, #16\n\t"
  98095. "lsl r6, r6, #16\n\t"
  98096. "adds r5, r5, r6\n\t"
  98097. "adcs r3, r3, r7\n\t"
  98098. "adc r4, r4, #0\n\t"
  98099. #else
  98100. "umull r6, r7, r8, r9\n\t"
  98101. "adds r5, r5, r6\n\t"
  98102. "adcs r3, r3, r7\n\t"
  98103. "adc r4, r4, #0\n\t"
  98104. #endif
  98105. /* A[10] * B[4] */
  98106. "ldr r8, [%[a], #40]\n\t"
  98107. "ldr r9, [%[b], #16]\n\t"
  98108. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98109. "lsl r6, r8, #16\n\t"
  98110. "lsl r7, r9, #16\n\t"
  98111. "lsr r6, r6, #16\n\t"
  98112. "lsr r7, r7, #16\n\t"
  98113. "mul r7, r6, r7\n\t"
  98114. "adds r5, r5, r7\n\t"
  98115. "adcs r3, r3, #0\n\t"
  98116. "adc r4, r4, #0\n\t"
  98117. "lsr r7, r9, #16\n\t"
  98118. "mul r6, r7, r6\n\t"
  98119. "lsr r7, r6, #16\n\t"
  98120. "lsl r6, r6, #16\n\t"
  98121. "adds r5, r5, r6\n\t"
  98122. "adcs r3, r3, r7\n\t"
  98123. "adc r4, r4, #0\n\t"
  98124. "lsr r6, r8, #16\n\t"
  98125. "lsr r7, r9, #16\n\t"
  98126. "mul r7, r6, r7\n\t"
  98127. "adds r3, r3, r7\n\t"
  98128. "adc r4, r4, #0\n\t"
  98129. "lsl r7, r9, #16\n\t"
  98130. "lsr r7, r7, #16\n\t"
  98131. "mul r6, r7, r6\n\t"
  98132. "lsr r7, r6, #16\n\t"
  98133. "lsl r6, r6, #16\n\t"
  98134. "adds r5, r5, r6\n\t"
  98135. "adcs r3, r3, r7\n\t"
  98136. "adc r4, r4, #0\n\t"
  98137. #else
  98138. "umull r6, r7, r8, r9\n\t"
  98139. "adds r5, r5, r6\n\t"
  98140. "adcs r3, r3, r7\n\t"
  98141. "adc r4, r4, #0\n\t"
  98142. #endif
  98143. /* A[9] * B[5] */
  98144. "ldr r8, [%[a], #36]\n\t"
  98145. "ldr r9, [%[b], #20]\n\t"
  98146. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98147. "lsl r6, r8, #16\n\t"
  98148. "lsl r7, r9, #16\n\t"
  98149. "lsr r6, r6, #16\n\t"
  98150. "lsr r7, r7, #16\n\t"
  98151. "mul r7, r6, r7\n\t"
  98152. "adds r5, r5, r7\n\t"
  98153. "adcs r3, r3, #0\n\t"
  98154. "adc r4, r4, #0\n\t"
  98155. "lsr r7, r9, #16\n\t"
  98156. "mul r6, r7, r6\n\t"
  98157. "lsr r7, r6, #16\n\t"
  98158. "lsl r6, r6, #16\n\t"
  98159. "adds r5, r5, r6\n\t"
  98160. "adcs r3, r3, r7\n\t"
  98161. "adc r4, r4, #0\n\t"
  98162. "lsr r6, r8, #16\n\t"
  98163. "lsr r7, r9, #16\n\t"
  98164. "mul r7, r6, r7\n\t"
  98165. "adds r3, r3, r7\n\t"
  98166. "adc r4, r4, #0\n\t"
  98167. "lsl r7, r9, #16\n\t"
  98168. "lsr r7, r7, #16\n\t"
  98169. "mul r6, r7, r6\n\t"
  98170. "lsr r7, r6, #16\n\t"
  98171. "lsl r6, r6, #16\n\t"
  98172. "adds r5, r5, r6\n\t"
  98173. "adcs r3, r3, r7\n\t"
  98174. "adc r4, r4, #0\n\t"
  98175. #else
  98176. "umull r6, r7, r8, r9\n\t"
  98177. "adds r5, r5, r6\n\t"
  98178. "adcs r3, r3, r7\n\t"
  98179. "adc r4, r4, #0\n\t"
  98180. #endif
  98181. /* A[8] * B[6] */
  98182. "ldr r8, [%[a], #32]\n\t"
  98183. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98184. "lsl r6, r8, #16\n\t"
  98185. "lsl r7, r12, #16\n\t"
  98186. "lsr r6, r6, #16\n\t"
  98187. "lsr r7, r7, #16\n\t"
  98188. "mul r7, r6, r7\n\t"
  98189. "adds r5, r5, r7\n\t"
  98190. "adcs r3, r3, #0\n\t"
  98191. "adc r4, r4, #0\n\t"
  98192. "lsr r7, r12, #16\n\t"
  98193. "mul r6, r7, r6\n\t"
  98194. "lsr r7, r6, #16\n\t"
  98195. "lsl r6, r6, #16\n\t"
  98196. "adds r5, r5, r6\n\t"
  98197. "adcs r3, r3, r7\n\t"
  98198. "adc r4, r4, #0\n\t"
  98199. "lsr r6, r8, #16\n\t"
  98200. "lsr r7, r12, #16\n\t"
  98201. "mul r7, r6, r7\n\t"
  98202. "adds r3, r3, r7\n\t"
  98203. "adc r4, r4, #0\n\t"
  98204. "lsl r7, r12, #16\n\t"
  98205. "lsr r7, r7, #16\n\t"
  98206. "mul r6, r7, r6\n\t"
  98207. "lsr r7, r6, #16\n\t"
  98208. "lsl r6, r6, #16\n\t"
  98209. "adds r5, r5, r6\n\t"
  98210. "adcs r3, r3, r7\n\t"
  98211. "adc r4, r4, #0\n\t"
  98212. #else
  98213. "umull r6, r7, r8, r12\n\t"
  98214. "adds r5, r5, r6\n\t"
  98215. "adcs r3, r3, r7\n\t"
  98216. "adc r4, r4, #0\n\t"
  98217. #endif
  98218. /* A[7] * B[7] */
  98219. "ldr r11, [%[a], #28]\n\t"
  98220. "ldr r12, [%[b], #28]\n\t"
  98221. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98222. "lsl r6, r11, #16\n\t"
  98223. "lsl r7, r12, #16\n\t"
  98224. "lsr r6, r6, #16\n\t"
  98225. "lsr r7, r7, #16\n\t"
  98226. "mul r7, r6, r7\n\t"
  98227. "adds r5, r5, r7\n\t"
  98228. "adcs r3, r3, #0\n\t"
  98229. "adc r4, r4, #0\n\t"
  98230. "lsr r7, r12, #16\n\t"
  98231. "mul r6, r7, r6\n\t"
  98232. "lsr r7, r6, #16\n\t"
  98233. "lsl r6, r6, #16\n\t"
  98234. "adds r5, r5, r6\n\t"
  98235. "adcs r3, r3, r7\n\t"
  98236. "adc r4, r4, #0\n\t"
  98237. "lsr r6, r11, #16\n\t"
  98238. "lsr r7, r12, #16\n\t"
  98239. "mul r7, r6, r7\n\t"
  98240. "adds r3, r3, r7\n\t"
  98241. "adc r4, r4, #0\n\t"
  98242. "lsl r7, r12, #16\n\t"
  98243. "lsr r7, r7, #16\n\t"
  98244. "mul r6, r7, r6\n\t"
  98245. "lsr r7, r6, #16\n\t"
  98246. "lsl r6, r6, #16\n\t"
  98247. "adds r5, r5, r6\n\t"
  98248. "adcs r3, r3, r7\n\t"
  98249. "adc r4, r4, #0\n\t"
  98250. #else
  98251. "umull r6, r7, r11, r12\n\t"
  98252. "adds r5, r5, r6\n\t"
  98253. "adcs r3, r3, r7\n\t"
  98254. "adc r4, r4, #0\n\t"
  98255. #endif
  98256. /* A[6] * B[8] */
  98257. "ldr r8, [%[a], #24]\n\t"
  98258. "ldr r9, [%[b], #32]\n\t"
  98259. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98260. "lsl r6, r8, #16\n\t"
  98261. "lsl r7, r9, #16\n\t"
  98262. "lsr r6, r6, #16\n\t"
  98263. "lsr r7, r7, #16\n\t"
  98264. "mul r7, r6, r7\n\t"
  98265. "adds r5, r5, r7\n\t"
  98266. "adcs r3, r3, #0\n\t"
  98267. "adc r4, r4, #0\n\t"
  98268. "lsr r7, r9, #16\n\t"
  98269. "mul r6, r7, r6\n\t"
  98270. "lsr r7, r6, #16\n\t"
  98271. "lsl r6, r6, #16\n\t"
  98272. "adds r5, r5, r6\n\t"
  98273. "adcs r3, r3, r7\n\t"
  98274. "adc r4, r4, #0\n\t"
  98275. "lsr r6, r8, #16\n\t"
  98276. "lsr r7, r9, #16\n\t"
  98277. "mul r7, r6, r7\n\t"
  98278. "adds r3, r3, r7\n\t"
  98279. "adc r4, r4, #0\n\t"
  98280. "lsl r7, r9, #16\n\t"
  98281. "lsr r7, r7, #16\n\t"
  98282. "mul r6, r7, r6\n\t"
  98283. "lsr r7, r6, #16\n\t"
  98284. "lsl r6, r6, #16\n\t"
  98285. "adds r5, r5, r6\n\t"
  98286. "adcs r3, r3, r7\n\t"
  98287. "adc r4, r4, #0\n\t"
  98288. #else
  98289. "umull r6, r7, r8, r9\n\t"
  98290. "adds r5, r5, r6\n\t"
  98291. "adcs r3, r3, r7\n\t"
  98292. "adc r4, r4, #0\n\t"
  98293. #endif
  98294. /* A[5] * B[9] */
  98295. "ldr r8, [%[a], #20]\n\t"
  98296. "ldr r9, [%[b], #36]\n\t"
  98297. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98298. "lsl r6, r8, #16\n\t"
  98299. "lsl r7, r9, #16\n\t"
  98300. "lsr r6, r6, #16\n\t"
  98301. "lsr r7, r7, #16\n\t"
  98302. "mul r7, r6, r7\n\t"
  98303. "adds r5, r5, r7\n\t"
  98304. "adcs r3, r3, #0\n\t"
  98305. "adc r4, r4, #0\n\t"
  98306. "lsr r7, r9, #16\n\t"
  98307. "mul r6, r7, r6\n\t"
  98308. "lsr r7, r6, #16\n\t"
  98309. "lsl r6, r6, #16\n\t"
  98310. "adds r5, r5, r6\n\t"
  98311. "adcs r3, r3, r7\n\t"
  98312. "adc r4, r4, #0\n\t"
  98313. "lsr r6, r8, #16\n\t"
  98314. "lsr r7, r9, #16\n\t"
  98315. "mul r7, r6, r7\n\t"
  98316. "adds r3, r3, r7\n\t"
  98317. "adc r4, r4, #0\n\t"
  98318. "lsl r7, r9, #16\n\t"
  98319. "lsr r7, r7, #16\n\t"
  98320. "mul r6, r7, r6\n\t"
  98321. "lsr r7, r6, #16\n\t"
  98322. "lsl r6, r6, #16\n\t"
  98323. "adds r5, r5, r6\n\t"
  98324. "adcs r3, r3, r7\n\t"
  98325. "adc r4, r4, #0\n\t"
  98326. #else
  98327. "umull r6, r7, r8, r9\n\t"
  98328. "adds r5, r5, r6\n\t"
  98329. "adcs r3, r3, r7\n\t"
  98330. "adc r4, r4, #0\n\t"
  98331. #endif
  98332. /* A[4] * B[10] */
  98333. "ldr r8, [%[a], #16]\n\t"
  98334. "ldr r9, [%[b], #40]\n\t"
  98335. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98336. "lsl r6, r8, #16\n\t"
  98337. "lsl r7, r9, #16\n\t"
  98338. "lsr r6, r6, #16\n\t"
  98339. "lsr r7, r7, #16\n\t"
  98340. "mul r7, r6, r7\n\t"
  98341. "adds r5, r5, r7\n\t"
  98342. "adcs r3, r3, #0\n\t"
  98343. "adc r4, r4, #0\n\t"
  98344. "lsr r7, r9, #16\n\t"
  98345. "mul r6, r7, r6\n\t"
  98346. "lsr r7, r6, #16\n\t"
  98347. "lsl r6, r6, #16\n\t"
  98348. "adds r5, r5, r6\n\t"
  98349. "adcs r3, r3, r7\n\t"
  98350. "adc r4, r4, #0\n\t"
  98351. "lsr r6, r8, #16\n\t"
  98352. "lsr r7, r9, #16\n\t"
  98353. "mul r7, r6, r7\n\t"
  98354. "adds r3, r3, r7\n\t"
  98355. "adc r4, r4, #0\n\t"
  98356. "lsl r7, r9, #16\n\t"
  98357. "lsr r7, r7, #16\n\t"
  98358. "mul r6, r7, r6\n\t"
  98359. "lsr r7, r6, #16\n\t"
  98360. "lsl r6, r6, #16\n\t"
  98361. "adds r5, r5, r6\n\t"
  98362. "adcs r3, r3, r7\n\t"
  98363. "adc r4, r4, #0\n\t"
  98364. #else
  98365. "umull r6, r7, r8, r9\n\t"
  98366. "adds r5, r5, r6\n\t"
  98367. "adcs r3, r3, r7\n\t"
  98368. "adc r4, r4, #0\n\t"
  98369. #endif
  98370. /* A[3] * B[11] */
  98371. "ldr r8, [%[a], #12]\n\t"
  98372. "ldr r9, [%[b], #44]\n\t"
  98373. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98374. "lsl r6, r8, #16\n\t"
  98375. "lsl r7, r9, #16\n\t"
  98376. "lsr r6, r6, #16\n\t"
  98377. "lsr r7, r7, #16\n\t"
  98378. "mul r7, r6, r7\n\t"
  98379. "adds r5, r5, r7\n\t"
  98380. "adcs r3, r3, #0\n\t"
  98381. "adc r4, r4, #0\n\t"
  98382. "lsr r7, r9, #16\n\t"
  98383. "mul r6, r7, r6\n\t"
  98384. "lsr r7, r6, #16\n\t"
  98385. "lsl r6, r6, #16\n\t"
  98386. "adds r5, r5, r6\n\t"
  98387. "adcs r3, r3, r7\n\t"
  98388. "adc r4, r4, #0\n\t"
  98389. "lsr r6, r8, #16\n\t"
  98390. "lsr r7, r9, #16\n\t"
  98391. "mul r7, r6, r7\n\t"
  98392. "adds r3, r3, r7\n\t"
  98393. "adc r4, r4, #0\n\t"
  98394. "lsl r7, r9, #16\n\t"
  98395. "lsr r7, r7, #16\n\t"
  98396. "mul r6, r7, r6\n\t"
  98397. "lsr r7, r6, #16\n\t"
  98398. "lsl r6, r6, #16\n\t"
  98399. "adds r5, r5, r6\n\t"
  98400. "adcs r3, r3, r7\n\t"
  98401. "adc r4, r4, #0\n\t"
  98402. #else
  98403. "umull r6, r7, r8, r9\n\t"
  98404. "adds r5, r5, r6\n\t"
  98405. "adcs r3, r3, r7\n\t"
  98406. "adc r4, r4, #0\n\t"
  98407. #endif
  98408. /* A[2] * B[12] */
  98409. "ldr r8, [%[a], #8]\n\t"
  98410. "ldr r9, [%[b], #48]\n\t"
  98411. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98412. "lsl r6, r8, #16\n\t"
  98413. "lsl r7, r9, #16\n\t"
  98414. "lsr r6, r6, #16\n\t"
  98415. "lsr r7, r7, #16\n\t"
  98416. "mul r7, r6, r7\n\t"
  98417. "adds r5, r5, r7\n\t"
  98418. "adcs r3, r3, #0\n\t"
  98419. "adc r4, r4, #0\n\t"
  98420. "lsr r7, r9, #16\n\t"
  98421. "mul r6, r7, r6\n\t"
  98422. "lsr r7, r6, #16\n\t"
  98423. "lsl r6, r6, #16\n\t"
  98424. "adds r5, r5, r6\n\t"
  98425. "adcs r3, r3, r7\n\t"
  98426. "adc r4, r4, #0\n\t"
  98427. "lsr r6, r8, #16\n\t"
  98428. "lsr r7, r9, #16\n\t"
  98429. "mul r7, r6, r7\n\t"
  98430. "adds r3, r3, r7\n\t"
  98431. "adc r4, r4, #0\n\t"
  98432. "lsl r7, r9, #16\n\t"
  98433. "lsr r7, r7, #16\n\t"
  98434. "mul r6, r7, r6\n\t"
  98435. "lsr r7, r6, #16\n\t"
  98436. "lsl r6, r6, #16\n\t"
  98437. "adds r5, r5, r6\n\t"
  98438. "adcs r3, r3, r7\n\t"
  98439. "adc r4, r4, #0\n\t"
  98440. #else
  98441. "umull r6, r7, r8, r9\n\t"
  98442. "adds r5, r5, r6\n\t"
  98443. "adcs r3, r3, r7\n\t"
  98444. "adc r4, r4, #0\n\t"
  98445. #endif
  98446. /* A[1] * B[13] */
  98447. "ldr r8, [%[a], #4]\n\t"
  98448. "ldr r9, [%[b], #52]\n\t"
  98449. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98450. "lsl r6, r8, #16\n\t"
  98451. "lsl r7, r9, #16\n\t"
  98452. "lsr r6, r6, #16\n\t"
  98453. "lsr r7, r7, #16\n\t"
  98454. "mul r7, r6, r7\n\t"
  98455. "adds r5, r5, r7\n\t"
  98456. "adcs r3, r3, #0\n\t"
  98457. "adc r4, r4, #0\n\t"
  98458. "lsr r7, r9, #16\n\t"
  98459. "mul r6, r7, r6\n\t"
  98460. "lsr r7, r6, #16\n\t"
  98461. "lsl r6, r6, #16\n\t"
  98462. "adds r5, r5, r6\n\t"
  98463. "adcs r3, r3, r7\n\t"
  98464. "adc r4, r4, #0\n\t"
  98465. "lsr r6, r8, #16\n\t"
  98466. "lsr r7, r9, #16\n\t"
  98467. "mul r7, r6, r7\n\t"
  98468. "adds r3, r3, r7\n\t"
  98469. "adc r4, r4, #0\n\t"
  98470. "lsl r7, r9, #16\n\t"
  98471. "lsr r7, r7, #16\n\t"
  98472. "mul r6, r7, r6\n\t"
  98473. "lsr r7, r6, #16\n\t"
  98474. "lsl r6, r6, #16\n\t"
  98475. "adds r5, r5, r6\n\t"
  98476. "adcs r3, r3, r7\n\t"
  98477. "adc r4, r4, #0\n\t"
  98478. #else
  98479. "umull r6, r7, r8, r9\n\t"
  98480. "adds r5, r5, r6\n\t"
  98481. "adcs r3, r3, r7\n\t"
  98482. "adc r4, r4, #0\n\t"
  98483. #endif
  98484. /* A[0] * B[14] */
  98485. "ldr r8, [%[a]]\n\t"
  98486. "ldr r9, [%[b], #56]\n\t"
  98487. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98488. "lsl r6, r8, #16\n\t"
  98489. "lsl r7, r9, #16\n\t"
  98490. "lsr r6, r6, #16\n\t"
  98491. "lsr r7, r7, #16\n\t"
  98492. "mul r7, r6, r7\n\t"
  98493. "adds r5, r5, r7\n\t"
  98494. "adcs r3, r3, #0\n\t"
  98495. "adc r4, r4, #0\n\t"
  98496. "lsr r7, r9, #16\n\t"
  98497. "mul r6, r7, r6\n\t"
  98498. "lsr r7, r6, #16\n\t"
  98499. "lsl r6, r6, #16\n\t"
  98500. "adds r5, r5, r6\n\t"
  98501. "adcs r3, r3, r7\n\t"
  98502. "adc r4, r4, #0\n\t"
  98503. "lsr r6, r8, #16\n\t"
  98504. "lsr r7, r9, #16\n\t"
  98505. "mul r7, r6, r7\n\t"
  98506. "adds r3, r3, r7\n\t"
  98507. "adc r4, r4, #0\n\t"
  98508. "lsl r7, r9, #16\n\t"
  98509. "lsr r7, r7, #16\n\t"
  98510. "mul r6, r7, r6\n\t"
  98511. "lsr r7, r6, #16\n\t"
  98512. "lsl r6, r6, #16\n\t"
  98513. "adds r5, r5, r6\n\t"
  98514. "adcs r3, r3, r7\n\t"
  98515. "adc r4, r4, #0\n\t"
  98516. #else
  98517. "umull r6, r7, r8, r9\n\t"
  98518. "adds r5, r5, r6\n\t"
  98519. "adcs r3, r3, r7\n\t"
  98520. "adc r4, r4, #0\n\t"
  98521. #endif
  98522. "str r5, [sp, #56]\n\t"
  98523. /* A[0] * B[15] */
  98524. "ldr r9, [%[b], #60]\n\t"
  98525. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98526. "lsl r6, r8, #16\n\t"
  98527. "lsl r7, r9, #16\n\t"
  98528. "lsr r6, r6, #16\n\t"
  98529. "lsr r7, r7, #16\n\t"
  98530. "mul r7, r6, r7\n\t"
  98531. "adds r3, r3, r7\n\t"
  98532. "adcs r4, r4, #0\n\t"
  98533. "mov r5, #0\n\t"
  98534. "adc r5, r5, #0\n\t"
  98535. "lsr r7, r9, #16\n\t"
  98536. "mul r6, r7, r6\n\t"
  98537. "lsr r7, r6, #16\n\t"
  98538. "lsl r6, r6, #16\n\t"
  98539. "adds r3, r3, r6\n\t"
  98540. "adcs r4, r4, r7\n\t"
  98541. "adc r5, r5, #0\n\t"
  98542. "lsr r6, r8, #16\n\t"
  98543. "lsr r7, r9, #16\n\t"
  98544. "mul r7, r6, r7\n\t"
  98545. "adds r4, r4, r7\n\t"
  98546. "adc r5, r5, #0\n\t"
  98547. "lsl r7, r9, #16\n\t"
  98548. "lsr r7, r7, #16\n\t"
  98549. "mul r6, r7, r6\n\t"
  98550. "lsr r7, r6, #16\n\t"
  98551. "lsl r6, r6, #16\n\t"
  98552. "adds r3, r3, r6\n\t"
  98553. "adcs r4, r4, r7\n\t"
  98554. "adc r5, r5, #0\n\t"
  98555. #else
  98556. "umull r6, r7, r8, r9\n\t"
  98557. "adds r3, r3, r6\n\t"
  98558. "adcs r4, r4, r7\n\t"
  98559. "mov r5, #0\n\t"
  98560. "adc r5, r5, #0\n\t"
  98561. #endif
  98562. /* A[1] * B[14] */
  98563. "ldr r8, [%[a], #4]\n\t"
  98564. "ldr r9, [%[b], #56]\n\t"
  98565. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98566. "lsl r6, r8, #16\n\t"
  98567. "lsl r7, r9, #16\n\t"
  98568. "lsr r6, r6, #16\n\t"
  98569. "lsr r7, r7, #16\n\t"
  98570. "mul r7, r6, r7\n\t"
  98571. "adds r3, r3, r7\n\t"
  98572. "adcs r4, r4, #0\n\t"
  98573. "adc r5, r5, #0\n\t"
  98574. "lsr r7, r9, #16\n\t"
  98575. "mul r6, r7, r6\n\t"
  98576. "lsr r7, r6, #16\n\t"
  98577. "lsl r6, r6, #16\n\t"
  98578. "adds r3, r3, r6\n\t"
  98579. "adcs r4, r4, r7\n\t"
  98580. "adc r5, r5, #0\n\t"
  98581. "lsr r6, r8, #16\n\t"
  98582. "lsr r7, r9, #16\n\t"
  98583. "mul r7, r6, r7\n\t"
  98584. "adds r4, r4, r7\n\t"
  98585. "adc r5, r5, #0\n\t"
  98586. "lsl r7, r9, #16\n\t"
  98587. "lsr r7, r7, #16\n\t"
  98588. "mul r6, r7, r6\n\t"
  98589. "lsr r7, r6, #16\n\t"
  98590. "lsl r6, r6, #16\n\t"
  98591. "adds r3, r3, r6\n\t"
  98592. "adcs r4, r4, r7\n\t"
  98593. "adc r5, r5, #0\n\t"
  98594. #else
  98595. "umull r6, r7, r8, r9\n\t"
  98596. "adds r3, r3, r6\n\t"
  98597. "adcs r4, r4, r7\n\t"
  98598. "adc r5, r5, #0\n\t"
  98599. #endif
  98600. /* A[2] * B[13] */
  98601. "ldr r8, [%[a], #8]\n\t"
  98602. "ldr r9, [%[b], #52]\n\t"
  98603. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98604. "lsl r6, r8, #16\n\t"
  98605. "lsl r7, r9, #16\n\t"
  98606. "lsr r6, r6, #16\n\t"
  98607. "lsr r7, r7, #16\n\t"
  98608. "mul r7, r6, r7\n\t"
  98609. "adds r3, r3, r7\n\t"
  98610. "adcs r4, r4, #0\n\t"
  98611. "adc r5, r5, #0\n\t"
  98612. "lsr r7, r9, #16\n\t"
  98613. "mul r6, r7, r6\n\t"
  98614. "lsr r7, r6, #16\n\t"
  98615. "lsl r6, r6, #16\n\t"
  98616. "adds r3, r3, r6\n\t"
  98617. "adcs r4, r4, r7\n\t"
  98618. "adc r5, r5, #0\n\t"
  98619. "lsr r6, r8, #16\n\t"
  98620. "lsr r7, r9, #16\n\t"
  98621. "mul r7, r6, r7\n\t"
  98622. "adds r4, r4, r7\n\t"
  98623. "adc r5, r5, #0\n\t"
  98624. "lsl r7, r9, #16\n\t"
  98625. "lsr r7, r7, #16\n\t"
  98626. "mul r6, r7, r6\n\t"
  98627. "lsr r7, r6, #16\n\t"
  98628. "lsl r6, r6, #16\n\t"
  98629. "adds r3, r3, r6\n\t"
  98630. "adcs r4, r4, r7\n\t"
  98631. "adc r5, r5, #0\n\t"
  98632. #else
  98633. "umull r6, r7, r8, r9\n\t"
  98634. "adds r3, r3, r6\n\t"
  98635. "adcs r4, r4, r7\n\t"
  98636. "adc r5, r5, #0\n\t"
  98637. #endif
  98638. /* A[3] * B[12] */
  98639. "ldr r8, [%[a], #12]\n\t"
  98640. "ldr r9, [%[b], #48]\n\t"
  98641. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98642. "lsl r6, r8, #16\n\t"
  98643. "lsl r7, r9, #16\n\t"
  98644. "lsr r6, r6, #16\n\t"
  98645. "lsr r7, r7, #16\n\t"
  98646. "mul r7, r6, r7\n\t"
  98647. "adds r3, r3, r7\n\t"
  98648. "adcs r4, r4, #0\n\t"
  98649. "adc r5, r5, #0\n\t"
  98650. "lsr r7, r9, #16\n\t"
  98651. "mul r6, r7, r6\n\t"
  98652. "lsr r7, r6, #16\n\t"
  98653. "lsl r6, r6, #16\n\t"
  98654. "adds r3, r3, r6\n\t"
  98655. "adcs r4, r4, r7\n\t"
  98656. "adc r5, r5, #0\n\t"
  98657. "lsr r6, r8, #16\n\t"
  98658. "lsr r7, r9, #16\n\t"
  98659. "mul r7, r6, r7\n\t"
  98660. "adds r4, r4, r7\n\t"
  98661. "adc r5, r5, #0\n\t"
  98662. "lsl r7, r9, #16\n\t"
  98663. "lsr r7, r7, #16\n\t"
  98664. "mul r6, r7, r6\n\t"
  98665. "lsr r7, r6, #16\n\t"
  98666. "lsl r6, r6, #16\n\t"
  98667. "adds r3, r3, r6\n\t"
  98668. "adcs r4, r4, r7\n\t"
  98669. "adc r5, r5, #0\n\t"
  98670. #else
  98671. "umull r6, r7, r8, r9\n\t"
  98672. "adds r3, r3, r6\n\t"
  98673. "adcs r4, r4, r7\n\t"
  98674. "adc r5, r5, #0\n\t"
  98675. #endif
  98676. /* A[4] * B[11] */
  98677. "ldr r8, [%[a], #16]\n\t"
  98678. "ldr r9, [%[b], #44]\n\t"
  98679. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98680. "lsl r6, r8, #16\n\t"
  98681. "lsl r7, r9, #16\n\t"
  98682. "lsr r6, r6, #16\n\t"
  98683. "lsr r7, r7, #16\n\t"
  98684. "mul r7, r6, r7\n\t"
  98685. "adds r3, r3, r7\n\t"
  98686. "adcs r4, r4, #0\n\t"
  98687. "adc r5, r5, #0\n\t"
  98688. "lsr r7, r9, #16\n\t"
  98689. "mul r6, r7, r6\n\t"
  98690. "lsr r7, r6, #16\n\t"
  98691. "lsl r6, r6, #16\n\t"
  98692. "adds r3, r3, r6\n\t"
  98693. "adcs r4, r4, r7\n\t"
  98694. "adc r5, r5, #0\n\t"
  98695. "lsr r6, r8, #16\n\t"
  98696. "lsr r7, r9, #16\n\t"
  98697. "mul r7, r6, r7\n\t"
  98698. "adds r4, r4, r7\n\t"
  98699. "adc r5, r5, #0\n\t"
  98700. "lsl r7, r9, #16\n\t"
  98701. "lsr r7, r7, #16\n\t"
  98702. "mul r6, r7, r6\n\t"
  98703. "lsr r7, r6, #16\n\t"
  98704. "lsl r6, r6, #16\n\t"
  98705. "adds r3, r3, r6\n\t"
  98706. "adcs r4, r4, r7\n\t"
  98707. "adc r5, r5, #0\n\t"
  98708. #else
  98709. "umull r6, r7, r8, r9\n\t"
  98710. "adds r3, r3, r6\n\t"
  98711. "adcs r4, r4, r7\n\t"
  98712. "adc r5, r5, #0\n\t"
  98713. #endif
  98714. /* A[5] * B[10] */
  98715. "ldr r8, [%[a], #20]\n\t"
  98716. "ldr r9, [%[b], #40]\n\t"
  98717. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98718. "lsl r6, r8, #16\n\t"
  98719. "lsl r7, r9, #16\n\t"
  98720. "lsr r6, r6, #16\n\t"
  98721. "lsr r7, r7, #16\n\t"
  98722. "mul r7, r6, r7\n\t"
  98723. "adds r3, r3, r7\n\t"
  98724. "adcs r4, r4, #0\n\t"
  98725. "adc r5, r5, #0\n\t"
  98726. "lsr r7, r9, #16\n\t"
  98727. "mul r6, r7, r6\n\t"
  98728. "lsr r7, r6, #16\n\t"
  98729. "lsl r6, r6, #16\n\t"
  98730. "adds r3, r3, r6\n\t"
  98731. "adcs r4, r4, r7\n\t"
  98732. "adc r5, r5, #0\n\t"
  98733. "lsr r6, r8, #16\n\t"
  98734. "lsr r7, r9, #16\n\t"
  98735. "mul r7, r6, r7\n\t"
  98736. "adds r4, r4, r7\n\t"
  98737. "adc r5, r5, #0\n\t"
  98738. "lsl r7, r9, #16\n\t"
  98739. "lsr r7, r7, #16\n\t"
  98740. "mul r6, r7, r6\n\t"
  98741. "lsr r7, r6, #16\n\t"
  98742. "lsl r6, r6, #16\n\t"
  98743. "adds r3, r3, r6\n\t"
  98744. "adcs r4, r4, r7\n\t"
  98745. "adc r5, r5, #0\n\t"
  98746. #else
  98747. "umull r6, r7, r8, r9\n\t"
  98748. "adds r3, r3, r6\n\t"
  98749. "adcs r4, r4, r7\n\t"
  98750. "adc r5, r5, #0\n\t"
  98751. #endif
  98752. /* A[6] * B[9] */
  98753. "ldr r8, [%[a], #24]\n\t"
  98754. "ldr r9, [%[b], #36]\n\t"
  98755. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98756. "lsl r6, r8, #16\n\t"
  98757. "lsl r7, r9, #16\n\t"
  98758. "lsr r6, r6, #16\n\t"
  98759. "lsr r7, r7, #16\n\t"
  98760. "mul r7, r6, r7\n\t"
  98761. "adds r3, r3, r7\n\t"
  98762. "adcs r4, r4, #0\n\t"
  98763. "adc r5, r5, #0\n\t"
  98764. "lsr r7, r9, #16\n\t"
  98765. "mul r6, r7, r6\n\t"
  98766. "lsr r7, r6, #16\n\t"
  98767. "lsl r6, r6, #16\n\t"
  98768. "adds r3, r3, r6\n\t"
  98769. "adcs r4, r4, r7\n\t"
  98770. "adc r5, r5, #0\n\t"
  98771. "lsr r6, r8, #16\n\t"
  98772. "lsr r7, r9, #16\n\t"
  98773. "mul r7, r6, r7\n\t"
  98774. "adds r4, r4, r7\n\t"
  98775. "adc r5, r5, #0\n\t"
  98776. "lsl r7, r9, #16\n\t"
  98777. "lsr r7, r7, #16\n\t"
  98778. "mul r6, r7, r6\n\t"
  98779. "lsr r7, r6, #16\n\t"
  98780. "lsl r6, r6, #16\n\t"
  98781. "adds r3, r3, r6\n\t"
  98782. "adcs r4, r4, r7\n\t"
  98783. "adc r5, r5, #0\n\t"
  98784. #else
  98785. "umull r6, r7, r8, r9\n\t"
  98786. "adds r3, r3, r6\n\t"
  98787. "adcs r4, r4, r7\n\t"
  98788. "adc r5, r5, #0\n\t"
  98789. #endif
  98790. /* A[7] * B[8] */
  98791. "ldr r9, [%[b], #32]\n\t"
  98792. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98793. "lsl r6, r11, #16\n\t"
  98794. "lsl r7, r9, #16\n\t"
  98795. "lsr r6, r6, #16\n\t"
  98796. "lsr r7, r7, #16\n\t"
  98797. "mul r7, r6, r7\n\t"
  98798. "adds r3, r3, r7\n\t"
  98799. "adcs r4, r4, #0\n\t"
  98800. "adc r5, r5, #0\n\t"
  98801. "lsr r7, r9, #16\n\t"
  98802. "mul r6, r7, r6\n\t"
  98803. "lsr r7, r6, #16\n\t"
  98804. "lsl r6, r6, #16\n\t"
  98805. "adds r3, r3, r6\n\t"
  98806. "adcs r4, r4, r7\n\t"
  98807. "adc r5, r5, #0\n\t"
  98808. "lsr r6, r11, #16\n\t"
  98809. "lsr r7, r9, #16\n\t"
  98810. "mul r7, r6, r7\n\t"
  98811. "adds r4, r4, r7\n\t"
  98812. "adc r5, r5, #0\n\t"
  98813. "lsl r7, r9, #16\n\t"
  98814. "lsr r7, r7, #16\n\t"
  98815. "mul r6, r7, r6\n\t"
  98816. "lsr r7, r6, #16\n\t"
  98817. "lsl r6, r6, #16\n\t"
  98818. "adds r3, r3, r6\n\t"
  98819. "adcs r4, r4, r7\n\t"
  98820. "adc r5, r5, #0\n\t"
  98821. #else
  98822. "umull r6, r7, r11, r9\n\t"
  98823. "adds r3, r3, r6\n\t"
  98824. "adcs r4, r4, r7\n\t"
  98825. "adc r5, r5, #0\n\t"
  98826. #endif
  98827. /* A[8] * B[7] */
  98828. "ldr r8, [%[a], #32]\n\t"
  98829. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98830. "lsl r6, r8, #16\n\t"
  98831. "lsl r7, r12, #16\n\t"
  98832. "lsr r6, r6, #16\n\t"
  98833. "lsr r7, r7, #16\n\t"
  98834. "mul r7, r6, r7\n\t"
  98835. "adds r3, r3, r7\n\t"
  98836. "adcs r4, r4, #0\n\t"
  98837. "adc r5, r5, #0\n\t"
  98838. "lsr r7, r12, #16\n\t"
  98839. "mul r6, r7, r6\n\t"
  98840. "lsr r7, r6, #16\n\t"
  98841. "lsl r6, r6, #16\n\t"
  98842. "adds r3, r3, r6\n\t"
  98843. "adcs r4, r4, r7\n\t"
  98844. "adc r5, r5, #0\n\t"
  98845. "lsr r6, r8, #16\n\t"
  98846. "lsr r7, r12, #16\n\t"
  98847. "mul r7, r6, r7\n\t"
  98848. "adds r4, r4, r7\n\t"
  98849. "adc r5, r5, #0\n\t"
  98850. "lsl r7, r12, #16\n\t"
  98851. "lsr r7, r7, #16\n\t"
  98852. "mul r6, r7, r6\n\t"
  98853. "lsr r7, r6, #16\n\t"
  98854. "lsl r6, r6, #16\n\t"
  98855. "adds r3, r3, r6\n\t"
  98856. "adcs r4, r4, r7\n\t"
  98857. "adc r5, r5, #0\n\t"
  98858. #else
  98859. "umull r6, r7, r8, r12\n\t"
  98860. "adds r3, r3, r6\n\t"
  98861. "adcs r4, r4, r7\n\t"
  98862. "adc r5, r5, #0\n\t"
  98863. #endif
  98864. /* A[9] * B[6] */
  98865. "ldr r8, [%[a], #36]\n\t"
  98866. "ldr r9, [%[b], #24]\n\t"
  98867. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98868. "lsl r6, r8, #16\n\t"
  98869. "lsl r7, r9, #16\n\t"
  98870. "lsr r6, r6, #16\n\t"
  98871. "lsr r7, r7, #16\n\t"
  98872. "mul r7, r6, r7\n\t"
  98873. "adds r3, r3, r7\n\t"
  98874. "adcs r4, r4, #0\n\t"
  98875. "adc r5, r5, #0\n\t"
  98876. "lsr r7, r9, #16\n\t"
  98877. "mul r6, r7, r6\n\t"
  98878. "lsr r7, r6, #16\n\t"
  98879. "lsl r6, r6, #16\n\t"
  98880. "adds r3, r3, r6\n\t"
  98881. "adcs r4, r4, r7\n\t"
  98882. "adc r5, r5, #0\n\t"
  98883. "lsr r6, r8, #16\n\t"
  98884. "lsr r7, r9, #16\n\t"
  98885. "mul r7, r6, r7\n\t"
  98886. "adds r4, r4, r7\n\t"
  98887. "adc r5, r5, #0\n\t"
  98888. "lsl r7, r9, #16\n\t"
  98889. "lsr r7, r7, #16\n\t"
  98890. "mul r6, r7, r6\n\t"
  98891. "lsr r7, r6, #16\n\t"
  98892. "lsl r6, r6, #16\n\t"
  98893. "adds r3, r3, r6\n\t"
  98894. "adcs r4, r4, r7\n\t"
  98895. "adc r5, r5, #0\n\t"
  98896. #else
  98897. "umull r6, r7, r8, r9\n\t"
  98898. "adds r3, r3, r6\n\t"
  98899. "adcs r4, r4, r7\n\t"
  98900. "adc r5, r5, #0\n\t"
  98901. #endif
  98902. /* A[10] * B[5] */
  98903. "ldr r8, [%[a], #40]\n\t"
  98904. "ldr r9, [%[b], #20]\n\t"
  98905. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98906. "lsl r6, r8, #16\n\t"
  98907. "lsl r7, r9, #16\n\t"
  98908. "lsr r6, r6, #16\n\t"
  98909. "lsr r7, r7, #16\n\t"
  98910. "mul r7, r6, r7\n\t"
  98911. "adds r3, r3, r7\n\t"
  98912. "adcs r4, r4, #0\n\t"
  98913. "adc r5, r5, #0\n\t"
  98914. "lsr r7, r9, #16\n\t"
  98915. "mul r6, r7, r6\n\t"
  98916. "lsr r7, r6, #16\n\t"
  98917. "lsl r6, r6, #16\n\t"
  98918. "adds r3, r3, r6\n\t"
  98919. "adcs r4, r4, r7\n\t"
  98920. "adc r5, r5, #0\n\t"
  98921. "lsr r6, r8, #16\n\t"
  98922. "lsr r7, r9, #16\n\t"
  98923. "mul r7, r6, r7\n\t"
  98924. "adds r4, r4, r7\n\t"
  98925. "adc r5, r5, #0\n\t"
  98926. "lsl r7, r9, #16\n\t"
  98927. "lsr r7, r7, #16\n\t"
  98928. "mul r6, r7, r6\n\t"
  98929. "lsr r7, r6, #16\n\t"
  98930. "lsl r6, r6, #16\n\t"
  98931. "adds r3, r3, r6\n\t"
  98932. "adcs r4, r4, r7\n\t"
  98933. "adc r5, r5, #0\n\t"
  98934. #else
  98935. "umull r6, r7, r8, r9\n\t"
  98936. "adds r3, r3, r6\n\t"
  98937. "adcs r4, r4, r7\n\t"
  98938. "adc r5, r5, #0\n\t"
  98939. #endif
  98940. /* A[11] * B[4] */
  98941. "ldr r8, [%[a], #44]\n\t"
  98942. "ldr r9, [%[b], #16]\n\t"
  98943. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98944. "lsl r6, r8, #16\n\t"
  98945. "lsl r7, r9, #16\n\t"
  98946. "lsr r6, r6, #16\n\t"
  98947. "lsr r7, r7, #16\n\t"
  98948. "mul r7, r6, r7\n\t"
  98949. "adds r3, r3, r7\n\t"
  98950. "adcs r4, r4, #0\n\t"
  98951. "adc r5, r5, #0\n\t"
  98952. "lsr r7, r9, #16\n\t"
  98953. "mul r6, r7, r6\n\t"
  98954. "lsr r7, r6, #16\n\t"
  98955. "lsl r6, r6, #16\n\t"
  98956. "adds r3, r3, r6\n\t"
  98957. "adcs r4, r4, r7\n\t"
  98958. "adc r5, r5, #0\n\t"
  98959. "lsr r6, r8, #16\n\t"
  98960. "lsr r7, r9, #16\n\t"
  98961. "mul r7, r6, r7\n\t"
  98962. "adds r4, r4, r7\n\t"
  98963. "adc r5, r5, #0\n\t"
  98964. "lsl r7, r9, #16\n\t"
  98965. "lsr r7, r7, #16\n\t"
  98966. "mul r6, r7, r6\n\t"
  98967. "lsr r7, r6, #16\n\t"
  98968. "lsl r6, r6, #16\n\t"
  98969. "adds r3, r3, r6\n\t"
  98970. "adcs r4, r4, r7\n\t"
  98971. "adc r5, r5, #0\n\t"
  98972. #else
  98973. "umull r6, r7, r8, r9\n\t"
  98974. "adds r3, r3, r6\n\t"
  98975. "adcs r4, r4, r7\n\t"
  98976. "adc r5, r5, #0\n\t"
  98977. #endif
  98978. /* A[12] * B[3] */
  98979. "ldr r8, [%[a], #48]\n\t"
  98980. "ldr r9, [%[b], #12]\n\t"
  98981. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  98982. "lsl r6, r8, #16\n\t"
  98983. "lsl r7, r9, #16\n\t"
  98984. "lsr r6, r6, #16\n\t"
  98985. "lsr r7, r7, #16\n\t"
  98986. "mul r7, r6, r7\n\t"
  98987. "adds r3, r3, r7\n\t"
  98988. "adcs r4, r4, #0\n\t"
  98989. "adc r5, r5, #0\n\t"
  98990. "lsr r7, r9, #16\n\t"
  98991. "mul r6, r7, r6\n\t"
  98992. "lsr r7, r6, #16\n\t"
  98993. "lsl r6, r6, #16\n\t"
  98994. "adds r3, r3, r6\n\t"
  98995. "adcs r4, r4, r7\n\t"
  98996. "adc r5, r5, #0\n\t"
  98997. "lsr r6, r8, #16\n\t"
  98998. "lsr r7, r9, #16\n\t"
  98999. "mul r7, r6, r7\n\t"
  99000. "adds r4, r4, r7\n\t"
  99001. "adc r5, r5, #0\n\t"
  99002. "lsl r7, r9, #16\n\t"
  99003. "lsr r7, r7, #16\n\t"
  99004. "mul r6, r7, r6\n\t"
  99005. "lsr r7, r6, #16\n\t"
  99006. "lsl r6, r6, #16\n\t"
  99007. "adds r3, r3, r6\n\t"
  99008. "adcs r4, r4, r7\n\t"
  99009. "adc r5, r5, #0\n\t"
  99010. #else
  99011. "umull r6, r7, r8, r9\n\t"
  99012. "adds r3, r3, r6\n\t"
  99013. "adcs r4, r4, r7\n\t"
  99014. "adc r5, r5, #0\n\t"
  99015. #endif
  99016. /* A[13] * B[2] */
  99017. "ldr r8, [%[a], #52]\n\t"
  99018. "ldr r9, [%[b], #8]\n\t"
  99019. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99020. "lsl r6, r8, #16\n\t"
  99021. "lsl r7, r9, #16\n\t"
  99022. "lsr r6, r6, #16\n\t"
  99023. "lsr r7, r7, #16\n\t"
  99024. "mul r7, r6, r7\n\t"
  99025. "adds r3, r3, r7\n\t"
  99026. "adcs r4, r4, #0\n\t"
  99027. "adc r5, r5, #0\n\t"
  99028. "lsr r7, r9, #16\n\t"
  99029. "mul r6, r7, r6\n\t"
  99030. "lsr r7, r6, #16\n\t"
  99031. "lsl r6, r6, #16\n\t"
  99032. "adds r3, r3, r6\n\t"
  99033. "adcs r4, r4, r7\n\t"
  99034. "adc r5, r5, #0\n\t"
  99035. "lsr r6, r8, #16\n\t"
  99036. "lsr r7, r9, #16\n\t"
  99037. "mul r7, r6, r7\n\t"
  99038. "adds r4, r4, r7\n\t"
  99039. "adc r5, r5, #0\n\t"
  99040. "lsl r7, r9, #16\n\t"
  99041. "lsr r7, r7, #16\n\t"
  99042. "mul r6, r7, r6\n\t"
  99043. "lsr r7, r6, #16\n\t"
  99044. "lsl r6, r6, #16\n\t"
  99045. "adds r3, r3, r6\n\t"
  99046. "adcs r4, r4, r7\n\t"
  99047. "adc r5, r5, #0\n\t"
  99048. #else
  99049. "umull r6, r7, r8, r9\n\t"
  99050. "adds r3, r3, r6\n\t"
  99051. "adcs r4, r4, r7\n\t"
  99052. "adc r5, r5, #0\n\t"
  99053. #endif
  99054. /* A[14] * B[1] */
  99055. "ldr r8, [%[a], #56]\n\t"
  99056. "ldr r9, [%[b], #4]\n\t"
  99057. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99058. "lsl r6, r8, #16\n\t"
  99059. "lsl r7, r9, #16\n\t"
  99060. "lsr r6, r6, #16\n\t"
  99061. "lsr r7, r7, #16\n\t"
  99062. "mul r7, r6, r7\n\t"
  99063. "adds r3, r3, r7\n\t"
  99064. "adcs r4, r4, #0\n\t"
  99065. "adc r5, r5, #0\n\t"
  99066. "lsr r7, r9, #16\n\t"
  99067. "mul r6, r7, r6\n\t"
  99068. "lsr r7, r6, #16\n\t"
  99069. "lsl r6, r6, #16\n\t"
  99070. "adds r3, r3, r6\n\t"
  99071. "adcs r4, r4, r7\n\t"
  99072. "adc r5, r5, #0\n\t"
  99073. "lsr r6, r8, #16\n\t"
  99074. "lsr r7, r9, #16\n\t"
  99075. "mul r7, r6, r7\n\t"
  99076. "adds r4, r4, r7\n\t"
  99077. "adc r5, r5, #0\n\t"
  99078. "lsl r7, r9, #16\n\t"
  99079. "lsr r7, r7, #16\n\t"
  99080. "mul r6, r7, r6\n\t"
  99081. "lsr r7, r6, #16\n\t"
  99082. "lsl r6, r6, #16\n\t"
  99083. "adds r3, r3, r6\n\t"
  99084. "adcs r4, r4, r7\n\t"
  99085. "adc r5, r5, #0\n\t"
  99086. #else
  99087. "umull r6, r7, r8, r9\n\t"
  99088. "adds r3, r3, r6\n\t"
  99089. "adcs r4, r4, r7\n\t"
  99090. "adc r5, r5, #0\n\t"
  99091. #endif
  99092. /* A[15] * B[0] */
  99093. "ldr r8, [%[a], #60]\n\t"
  99094. "ldr r9, [%[b]]\n\t"
  99095. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99096. "lsl r6, r8, #16\n\t"
  99097. "lsl r7, r9, #16\n\t"
  99098. "lsr r6, r6, #16\n\t"
  99099. "lsr r7, r7, #16\n\t"
  99100. "mul r7, r6, r7\n\t"
  99101. "adds r3, r3, r7\n\t"
  99102. "adcs r4, r4, #0\n\t"
  99103. "adc r5, r5, #0\n\t"
  99104. "lsr r7, r9, #16\n\t"
  99105. "mul r6, r7, r6\n\t"
  99106. "lsr r7, r6, #16\n\t"
  99107. "lsl r6, r6, #16\n\t"
  99108. "adds r3, r3, r6\n\t"
  99109. "adcs r4, r4, r7\n\t"
  99110. "adc r5, r5, #0\n\t"
  99111. "lsr r6, r8, #16\n\t"
  99112. "lsr r7, r9, #16\n\t"
  99113. "mul r7, r6, r7\n\t"
  99114. "adds r4, r4, r7\n\t"
  99115. "adc r5, r5, #0\n\t"
  99116. "lsl r7, r9, #16\n\t"
  99117. "lsr r7, r7, #16\n\t"
  99118. "mul r6, r7, r6\n\t"
  99119. "lsr r7, r6, #16\n\t"
  99120. "lsl r6, r6, #16\n\t"
  99121. "adds r3, r3, r6\n\t"
  99122. "adcs r4, r4, r7\n\t"
  99123. "adc r5, r5, #0\n\t"
  99124. #else
  99125. "umull r6, r7, r8, r9\n\t"
  99126. "adds r3, r3, r6\n\t"
  99127. "adcs r4, r4, r7\n\t"
  99128. "adc r5, r5, #0\n\t"
  99129. #endif
  99130. "str r3, [sp, #60]\n\t"
  99131. /* A[16] * B[0] */
  99132. "ldr r8, [%[a], #64]\n\t"
  99133. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99134. "lsl r6, r8, #16\n\t"
  99135. "lsl r7, r9, #16\n\t"
  99136. "lsr r6, r6, #16\n\t"
  99137. "lsr r7, r7, #16\n\t"
  99138. "mul r7, r6, r7\n\t"
  99139. "adds r4, r4, r7\n\t"
  99140. "adcs r5, r5, #0\n\t"
  99141. "mov r3, #0\n\t"
  99142. "adc r3, r3, #0\n\t"
  99143. "lsr r7, r9, #16\n\t"
  99144. "mul r6, r7, r6\n\t"
  99145. "lsr r7, r6, #16\n\t"
  99146. "lsl r6, r6, #16\n\t"
  99147. "adds r4, r4, r6\n\t"
  99148. "adcs r5, r5, r7\n\t"
  99149. "adc r3, r3, #0\n\t"
  99150. "lsr r6, r8, #16\n\t"
  99151. "lsr r7, r9, #16\n\t"
  99152. "mul r7, r6, r7\n\t"
  99153. "adds r5, r5, r7\n\t"
  99154. "adc r3, r3, #0\n\t"
  99155. "lsl r7, r9, #16\n\t"
  99156. "lsr r7, r7, #16\n\t"
  99157. "mul r6, r7, r6\n\t"
  99158. "lsr r7, r6, #16\n\t"
  99159. "lsl r6, r6, #16\n\t"
  99160. "adds r4, r4, r6\n\t"
  99161. "adcs r5, r5, r7\n\t"
  99162. "adc r3, r3, #0\n\t"
  99163. #else
  99164. "umull r6, r7, r8, r9\n\t"
  99165. "adds r4, r4, r6\n\t"
  99166. "adcs r5, r5, r7\n\t"
  99167. "mov r3, #0\n\t"
  99168. "adc r3, r3, #0\n\t"
  99169. #endif
  99170. /* A[15] * B[1] */
  99171. "ldr r8, [%[a], #60]\n\t"
  99172. "ldr r9, [%[b], #4]\n\t"
  99173. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99174. "lsl r6, r8, #16\n\t"
  99175. "lsl r7, r9, #16\n\t"
  99176. "lsr r6, r6, #16\n\t"
  99177. "lsr r7, r7, #16\n\t"
  99178. "mul r7, r6, r7\n\t"
  99179. "adds r4, r4, r7\n\t"
  99180. "adcs r5, r5, #0\n\t"
  99181. "adc r3, r3, #0\n\t"
  99182. "lsr r7, r9, #16\n\t"
  99183. "mul r6, r7, r6\n\t"
  99184. "lsr r7, r6, #16\n\t"
  99185. "lsl r6, r6, #16\n\t"
  99186. "adds r4, r4, r6\n\t"
  99187. "adcs r5, r5, r7\n\t"
  99188. "adc r3, r3, #0\n\t"
  99189. "lsr r6, r8, #16\n\t"
  99190. "lsr r7, r9, #16\n\t"
  99191. "mul r7, r6, r7\n\t"
  99192. "adds r5, r5, r7\n\t"
  99193. "adc r3, r3, #0\n\t"
  99194. "lsl r7, r9, #16\n\t"
  99195. "lsr r7, r7, #16\n\t"
  99196. "mul r6, r7, r6\n\t"
  99197. "lsr r7, r6, #16\n\t"
  99198. "lsl r6, r6, #16\n\t"
  99199. "adds r4, r4, r6\n\t"
  99200. "adcs r5, r5, r7\n\t"
  99201. "adc r3, r3, #0\n\t"
  99202. #else
  99203. "umull r6, r7, r8, r9\n\t"
  99204. "adds r4, r4, r6\n\t"
  99205. "adcs r5, r5, r7\n\t"
  99206. "adc r3, r3, #0\n\t"
  99207. #endif
  99208. /* A[14] * B[2] */
  99209. "ldr r8, [%[a], #56]\n\t"
  99210. "ldr r9, [%[b], #8]\n\t"
  99211. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99212. "lsl r6, r8, #16\n\t"
  99213. "lsl r7, r9, #16\n\t"
  99214. "lsr r6, r6, #16\n\t"
  99215. "lsr r7, r7, #16\n\t"
  99216. "mul r7, r6, r7\n\t"
  99217. "adds r4, r4, r7\n\t"
  99218. "adcs r5, r5, #0\n\t"
  99219. "adc r3, r3, #0\n\t"
  99220. "lsr r7, r9, #16\n\t"
  99221. "mul r6, r7, r6\n\t"
  99222. "lsr r7, r6, #16\n\t"
  99223. "lsl r6, r6, #16\n\t"
  99224. "adds r4, r4, r6\n\t"
  99225. "adcs r5, r5, r7\n\t"
  99226. "adc r3, r3, #0\n\t"
  99227. "lsr r6, r8, #16\n\t"
  99228. "lsr r7, r9, #16\n\t"
  99229. "mul r7, r6, r7\n\t"
  99230. "adds r5, r5, r7\n\t"
  99231. "adc r3, r3, #0\n\t"
  99232. "lsl r7, r9, #16\n\t"
  99233. "lsr r7, r7, #16\n\t"
  99234. "mul r6, r7, r6\n\t"
  99235. "lsr r7, r6, #16\n\t"
  99236. "lsl r6, r6, #16\n\t"
  99237. "adds r4, r4, r6\n\t"
  99238. "adcs r5, r5, r7\n\t"
  99239. "adc r3, r3, #0\n\t"
  99240. #else
  99241. "umull r6, r7, r8, r9\n\t"
  99242. "adds r4, r4, r6\n\t"
  99243. "adcs r5, r5, r7\n\t"
  99244. "adc r3, r3, #0\n\t"
  99245. #endif
  99246. /* A[13] * B[3] */
  99247. "ldr r8, [%[a], #52]\n\t"
  99248. "ldr r9, [%[b], #12]\n\t"
  99249. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99250. "lsl r6, r8, #16\n\t"
  99251. "lsl r7, r9, #16\n\t"
  99252. "lsr r6, r6, #16\n\t"
  99253. "lsr r7, r7, #16\n\t"
  99254. "mul r7, r6, r7\n\t"
  99255. "adds r4, r4, r7\n\t"
  99256. "adcs r5, r5, #0\n\t"
  99257. "adc r3, r3, #0\n\t"
  99258. "lsr r7, r9, #16\n\t"
  99259. "mul r6, r7, r6\n\t"
  99260. "lsr r7, r6, #16\n\t"
  99261. "lsl r6, r6, #16\n\t"
  99262. "adds r4, r4, r6\n\t"
  99263. "adcs r5, r5, r7\n\t"
  99264. "adc r3, r3, #0\n\t"
  99265. "lsr r6, r8, #16\n\t"
  99266. "lsr r7, r9, #16\n\t"
  99267. "mul r7, r6, r7\n\t"
  99268. "adds r5, r5, r7\n\t"
  99269. "adc r3, r3, #0\n\t"
  99270. "lsl r7, r9, #16\n\t"
  99271. "lsr r7, r7, #16\n\t"
  99272. "mul r6, r7, r6\n\t"
  99273. "lsr r7, r6, #16\n\t"
  99274. "lsl r6, r6, #16\n\t"
  99275. "adds r4, r4, r6\n\t"
  99276. "adcs r5, r5, r7\n\t"
  99277. "adc r3, r3, #0\n\t"
  99278. #else
  99279. "umull r6, r7, r8, r9\n\t"
  99280. "adds r4, r4, r6\n\t"
  99281. "adcs r5, r5, r7\n\t"
  99282. "adc r3, r3, #0\n\t"
  99283. #endif
  99284. /* A[12] * B[4] */
  99285. "ldr r8, [%[a], #48]\n\t"
  99286. "ldr r9, [%[b], #16]\n\t"
  99287. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99288. "lsl r6, r8, #16\n\t"
  99289. "lsl r7, r9, #16\n\t"
  99290. "lsr r6, r6, #16\n\t"
  99291. "lsr r7, r7, #16\n\t"
  99292. "mul r7, r6, r7\n\t"
  99293. "adds r4, r4, r7\n\t"
  99294. "adcs r5, r5, #0\n\t"
  99295. "adc r3, r3, #0\n\t"
  99296. "lsr r7, r9, #16\n\t"
  99297. "mul r6, r7, r6\n\t"
  99298. "lsr r7, r6, #16\n\t"
  99299. "lsl r6, r6, #16\n\t"
  99300. "adds r4, r4, r6\n\t"
  99301. "adcs r5, r5, r7\n\t"
  99302. "adc r3, r3, #0\n\t"
  99303. "lsr r6, r8, #16\n\t"
  99304. "lsr r7, r9, #16\n\t"
  99305. "mul r7, r6, r7\n\t"
  99306. "adds r5, r5, r7\n\t"
  99307. "adc r3, r3, #0\n\t"
  99308. "lsl r7, r9, #16\n\t"
  99309. "lsr r7, r7, #16\n\t"
  99310. "mul r6, r7, r6\n\t"
  99311. "lsr r7, r6, #16\n\t"
  99312. "lsl r6, r6, #16\n\t"
  99313. "adds r4, r4, r6\n\t"
  99314. "adcs r5, r5, r7\n\t"
  99315. "adc r3, r3, #0\n\t"
  99316. #else
  99317. "umull r6, r7, r8, r9\n\t"
  99318. "adds r4, r4, r6\n\t"
  99319. "adcs r5, r5, r7\n\t"
  99320. "adc r3, r3, #0\n\t"
  99321. #endif
  99322. /* A[11] * B[5] */
  99323. "ldr r8, [%[a], #44]\n\t"
  99324. "ldr r9, [%[b], #20]\n\t"
  99325. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99326. "lsl r6, r8, #16\n\t"
  99327. "lsl r7, r9, #16\n\t"
  99328. "lsr r6, r6, #16\n\t"
  99329. "lsr r7, r7, #16\n\t"
  99330. "mul r7, r6, r7\n\t"
  99331. "adds r4, r4, r7\n\t"
  99332. "adcs r5, r5, #0\n\t"
  99333. "adc r3, r3, #0\n\t"
  99334. "lsr r7, r9, #16\n\t"
  99335. "mul r6, r7, r6\n\t"
  99336. "lsr r7, r6, #16\n\t"
  99337. "lsl r6, r6, #16\n\t"
  99338. "adds r4, r4, r6\n\t"
  99339. "adcs r5, r5, r7\n\t"
  99340. "adc r3, r3, #0\n\t"
  99341. "lsr r6, r8, #16\n\t"
  99342. "lsr r7, r9, #16\n\t"
  99343. "mul r7, r6, r7\n\t"
  99344. "adds r5, r5, r7\n\t"
  99345. "adc r3, r3, #0\n\t"
  99346. "lsl r7, r9, #16\n\t"
  99347. "lsr r7, r7, #16\n\t"
  99348. "mul r6, r7, r6\n\t"
  99349. "lsr r7, r6, #16\n\t"
  99350. "lsl r6, r6, #16\n\t"
  99351. "adds r4, r4, r6\n\t"
  99352. "adcs r5, r5, r7\n\t"
  99353. "adc r3, r3, #0\n\t"
  99354. #else
  99355. "umull r6, r7, r8, r9\n\t"
  99356. "adds r4, r4, r6\n\t"
  99357. "adcs r5, r5, r7\n\t"
  99358. "adc r3, r3, #0\n\t"
  99359. #endif
  99360. /* A[10] * B[6] */
  99361. "ldr r8, [%[a], #40]\n\t"
  99362. "ldr r9, [%[b], #24]\n\t"
  99363. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99364. "lsl r6, r8, #16\n\t"
  99365. "lsl r7, r9, #16\n\t"
  99366. "lsr r6, r6, #16\n\t"
  99367. "lsr r7, r7, #16\n\t"
  99368. "mul r7, r6, r7\n\t"
  99369. "adds r4, r4, r7\n\t"
  99370. "adcs r5, r5, #0\n\t"
  99371. "adc r3, r3, #0\n\t"
  99372. "lsr r7, r9, #16\n\t"
  99373. "mul r6, r7, r6\n\t"
  99374. "lsr r7, r6, #16\n\t"
  99375. "lsl r6, r6, #16\n\t"
  99376. "adds r4, r4, r6\n\t"
  99377. "adcs r5, r5, r7\n\t"
  99378. "adc r3, r3, #0\n\t"
  99379. "lsr r6, r8, #16\n\t"
  99380. "lsr r7, r9, #16\n\t"
  99381. "mul r7, r6, r7\n\t"
  99382. "adds r5, r5, r7\n\t"
  99383. "adc r3, r3, #0\n\t"
  99384. "lsl r7, r9, #16\n\t"
  99385. "lsr r7, r7, #16\n\t"
  99386. "mul r6, r7, r6\n\t"
  99387. "lsr r7, r6, #16\n\t"
  99388. "lsl r6, r6, #16\n\t"
  99389. "adds r4, r4, r6\n\t"
  99390. "adcs r5, r5, r7\n\t"
  99391. "adc r3, r3, #0\n\t"
  99392. #else
  99393. "umull r6, r7, r8, r9\n\t"
  99394. "adds r4, r4, r6\n\t"
  99395. "adcs r5, r5, r7\n\t"
  99396. "adc r3, r3, #0\n\t"
  99397. #endif
  99398. /* A[9] * B[7] */
  99399. "ldr r8, [%[a], #36]\n\t"
  99400. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99401. "lsl r6, r8, #16\n\t"
  99402. "lsl r7, r12, #16\n\t"
  99403. "lsr r6, r6, #16\n\t"
  99404. "lsr r7, r7, #16\n\t"
  99405. "mul r7, r6, r7\n\t"
  99406. "adds r4, r4, r7\n\t"
  99407. "adcs r5, r5, #0\n\t"
  99408. "adc r3, r3, #0\n\t"
  99409. "lsr r7, r12, #16\n\t"
  99410. "mul r6, r7, r6\n\t"
  99411. "lsr r7, r6, #16\n\t"
  99412. "lsl r6, r6, #16\n\t"
  99413. "adds r4, r4, r6\n\t"
  99414. "adcs r5, r5, r7\n\t"
  99415. "adc r3, r3, #0\n\t"
  99416. "lsr r6, r8, #16\n\t"
  99417. "lsr r7, r12, #16\n\t"
  99418. "mul r7, r6, r7\n\t"
  99419. "adds r5, r5, r7\n\t"
  99420. "adc r3, r3, #0\n\t"
  99421. "lsl r7, r12, #16\n\t"
  99422. "lsr r7, r7, #16\n\t"
  99423. "mul r6, r7, r6\n\t"
  99424. "lsr r7, r6, #16\n\t"
  99425. "lsl r6, r6, #16\n\t"
  99426. "adds r4, r4, r6\n\t"
  99427. "adcs r5, r5, r7\n\t"
  99428. "adc r3, r3, #0\n\t"
  99429. #else
  99430. "umull r6, r7, r8, r12\n\t"
  99431. "adds r4, r4, r6\n\t"
  99432. "adcs r5, r5, r7\n\t"
  99433. "adc r3, r3, #0\n\t"
  99434. #endif
  99435. /* A[8] * B[8] */
  99436. "ldr r11, [%[a], #32]\n\t"
  99437. "ldr r12, [%[b], #32]\n\t"
  99438. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99439. "lsl r6, r11, #16\n\t"
  99440. "lsl r7, r12, #16\n\t"
  99441. "lsr r6, r6, #16\n\t"
  99442. "lsr r7, r7, #16\n\t"
  99443. "mul r7, r6, r7\n\t"
  99444. "adds r4, r4, r7\n\t"
  99445. "adcs r5, r5, #0\n\t"
  99446. "adc r3, r3, #0\n\t"
  99447. "lsr r7, r12, #16\n\t"
  99448. "mul r6, r7, r6\n\t"
  99449. "lsr r7, r6, #16\n\t"
  99450. "lsl r6, r6, #16\n\t"
  99451. "adds r4, r4, r6\n\t"
  99452. "adcs r5, r5, r7\n\t"
  99453. "adc r3, r3, #0\n\t"
  99454. "lsr r6, r11, #16\n\t"
  99455. "lsr r7, r12, #16\n\t"
  99456. "mul r7, r6, r7\n\t"
  99457. "adds r5, r5, r7\n\t"
  99458. "adc r3, r3, #0\n\t"
  99459. "lsl r7, r12, #16\n\t"
  99460. "lsr r7, r7, #16\n\t"
  99461. "mul r6, r7, r6\n\t"
  99462. "lsr r7, r6, #16\n\t"
  99463. "lsl r6, r6, #16\n\t"
  99464. "adds r4, r4, r6\n\t"
  99465. "adcs r5, r5, r7\n\t"
  99466. "adc r3, r3, #0\n\t"
  99467. #else
  99468. "umull r6, r7, r11, r12\n\t"
  99469. "adds r4, r4, r6\n\t"
  99470. "adcs r5, r5, r7\n\t"
  99471. "adc r3, r3, #0\n\t"
  99472. #endif
  99473. /* A[7] * B[9] */
  99474. "ldr r8, [%[a], #28]\n\t"
  99475. "ldr r9, [%[b], #36]\n\t"
  99476. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99477. "lsl r6, r8, #16\n\t"
  99478. "lsl r7, r9, #16\n\t"
  99479. "lsr r6, r6, #16\n\t"
  99480. "lsr r7, r7, #16\n\t"
  99481. "mul r7, r6, r7\n\t"
  99482. "adds r4, r4, r7\n\t"
  99483. "adcs r5, r5, #0\n\t"
  99484. "adc r3, r3, #0\n\t"
  99485. "lsr r7, r9, #16\n\t"
  99486. "mul r6, r7, r6\n\t"
  99487. "lsr r7, r6, #16\n\t"
  99488. "lsl r6, r6, #16\n\t"
  99489. "adds r4, r4, r6\n\t"
  99490. "adcs r5, r5, r7\n\t"
  99491. "adc r3, r3, #0\n\t"
  99492. "lsr r6, r8, #16\n\t"
  99493. "lsr r7, r9, #16\n\t"
  99494. "mul r7, r6, r7\n\t"
  99495. "adds r5, r5, r7\n\t"
  99496. "adc r3, r3, #0\n\t"
  99497. "lsl r7, r9, #16\n\t"
  99498. "lsr r7, r7, #16\n\t"
  99499. "mul r6, r7, r6\n\t"
  99500. "lsr r7, r6, #16\n\t"
  99501. "lsl r6, r6, #16\n\t"
  99502. "adds r4, r4, r6\n\t"
  99503. "adcs r5, r5, r7\n\t"
  99504. "adc r3, r3, #0\n\t"
  99505. #else
  99506. "umull r6, r7, r8, r9\n\t"
  99507. "adds r4, r4, r6\n\t"
  99508. "adcs r5, r5, r7\n\t"
  99509. "adc r3, r3, #0\n\t"
  99510. #endif
  99511. /* A[6] * B[10] */
  99512. "ldr r8, [%[a], #24]\n\t"
  99513. "ldr r9, [%[b], #40]\n\t"
  99514. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99515. "lsl r6, r8, #16\n\t"
  99516. "lsl r7, r9, #16\n\t"
  99517. "lsr r6, r6, #16\n\t"
  99518. "lsr r7, r7, #16\n\t"
  99519. "mul r7, r6, r7\n\t"
  99520. "adds r4, r4, r7\n\t"
  99521. "adcs r5, r5, #0\n\t"
  99522. "adc r3, r3, #0\n\t"
  99523. "lsr r7, r9, #16\n\t"
  99524. "mul r6, r7, r6\n\t"
  99525. "lsr r7, r6, #16\n\t"
  99526. "lsl r6, r6, #16\n\t"
  99527. "adds r4, r4, r6\n\t"
  99528. "adcs r5, r5, r7\n\t"
  99529. "adc r3, r3, #0\n\t"
  99530. "lsr r6, r8, #16\n\t"
  99531. "lsr r7, r9, #16\n\t"
  99532. "mul r7, r6, r7\n\t"
  99533. "adds r5, r5, r7\n\t"
  99534. "adc r3, r3, #0\n\t"
  99535. "lsl r7, r9, #16\n\t"
  99536. "lsr r7, r7, #16\n\t"
  99537. "mul r6, r7, r6\n\t"
  99538. "lsr r7, r6, #16\n\t"
  99539. "lsl r6, r6, #16\n\t"
  99540. "adds r4, r4, r6\n\t"
  99541. "adcs r5, r5, r7\n\t"
  99542. "adc r3, r3, #0\n\t"
  99543. #else
  99544. "umull r6, r7, r8, r9\n\t"
  99545. "adds r4, r4, r6\n\t"
  99546. "adcs r5, r5, r7\n\t"
  99547. "adc r3, r3, #0\n\t"
  99548. #endif
  99549. /* A[5] * B[11] */
  99550. "ldr r8, [%[a], #20]\n\t"
  99551. "ldr r9, [%[b], #44]\n\t"
  99552. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99553. "lsl r6, r8, #16\n\t"
  99554. "lsl r7, r9, #16\n\t"
  99555. "lsr r6, r6, #16\n\t"
  99556. "lsr r7, r7, #16\n\t"
  99557. "mul r7, r6, r7\n\t"
  99558. "adds r4, r4, r7\n\t"
  99559. "adcs r5, r5, #0\n\t"
  99560. "adc r3, r3, #0\n\t"
  99561. "lsr r7, r9, #16\n\t"
  99562. "mul r6, r7, r6\n\t"
  99563. "lsr r7, r6, #16\n\t"
  99564. "lsl r6, r6, #16\n\t"
  99565. "adds r4, r4, r6\n\t"
  99566. "adcs r5, r5, r7\n\t"
  99567. "adc r3, r3, #0\n\t"
  99568. "lsr r6, r8, #16\n\t"
  99569. "lsr r7, r9, #16\n\t"
  99570. "mul r7, r6, r7\n\t"
  99571. "adds r5, r5, r7\n\t"
  99572. "adc r3, r3, #0\n\t"
  99573. "lsl r7, r9, #16\n\t"
  99574. "lsr r7, r7, #16\n\t"
  99575. "mul r6, r7, r6\n\t"
  99576. "lsr r7, r6, #16\n\t"
  99577. "lsl r6, r6, #16\n\t"
  99578. "adds r4, r4, r6\n\t"
  99579. "adcs r5, r5, r7\n\t"
  99580. "adc r3, r3, #0\n\t"
  99581. #else
  99582. "umull r6, r7, r8, r9\n\t"
  99583. "adds r4, r4, r6\n\t"
  99584. "adcs r5, r5, r7\n\t"
  99585. "adc r3, r3, #0\n\t"
  99586. #endif
  99587. /* A[4] * B[12] */
  99588. "ldr r8, [%[a], #16]\n\t"
  99589. "ldr r9, [%[b], #48]\n\t"
  99590. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99591. "lsl r6, r8, #16\n\t"
  99592. "lsl r7, r9, #16\n\t"
  99593. "lsr r6, r6, #16\n\t"
  99594. "lsr r7, r7, #16\n\t"
  99595. "mul r7, r6, r7\n\t"
  99596. "adds r4, r4, r7\n\t"
  99597. "adcs r5, r5, #0\n\t"
  99598. "adc r3, r3, #0\n\t"
  99599. "lsr r7, r9, #16\n\t"
  99600. "mul r6, r7, r6\n\t"
  99601. "lsr r7, r6, #16\n\t"
  99602. "lsl r6, r6, #16\n\t"
  99603. "adds r4, r4, r6\n\t"
  99604. "adcs r5, r5, r7\n\t"
  99605. "adc r3, r3, #0\n\t"
  99606. "lsr r6, r8, #16\n\t"
  99607. "lsr r7, r9, #16\n\t"
  99608. "mul r7, r6, r7\n\t"
  99609. "adds r5, r5, r7\n\t"
  99610. "adc r3, r3, #0\n\t"
  99611. "lsl r7, r9, #16\n\t"
  99612. "lsr r7, r7, #16\n\t"
  99613. "mul r6, r7, r6\n\t"
  99614. "lsr r7, r6, #16\n\t"
  99615. "lsl r6, r6, #16\n\t"
  99616. "adds r4, r4, r6\n\t"
  99617. "adcs r5, r5, r7\n\t"
  99618. "adc r3, r3, #0\n\t"
  99619. #else
  99620. "umull r6, r7, r8, r9\n\t"
  99621. "adds r4, r4, r6\n\t"
  99622. "adcs r5, r5, r7\n\t"
  99623. "adc r3, r3, #0\n\t"
  99624. #endif
  99625. /* A[3] * B[13] */
  99626. "ldr r8, [%[a], #12]\n\t"
  99627. "ldr r9, [%[b], #52]\n\t"
  99628. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99629. "lsl r6, r8, #16\n\t"
  99630. "lsl r7, r9, #16\n\t"
  99631. "lsr r6, r6, #16\n\t"
  99632. "lsr r7, r7, #16\n\t"
  99633. "mul r7, r6, r7\n\t"
  99634. "adds r4, r4, r7\n\t"
  99635. "adcs r5, r5, #0\n\t"
  99636. "adc r3, r3, #0\n\t"
  99637. "lsr r7, r9, #16\n\t"
  99638. "mul r6, r7, r6\n\t"
  99639. "lsr r7, r6, #16\n\t"
  99640. "lsl r6, r6, #16\n\t"
  99641. "adds r4, r4, r6\n\t"
  99642. "adcs r5, r5, r7\n\t"
  99643. "adc r3, r3, #0\n\t"
  99644. "lsr r6, r8, #16\n\t"
  99645. "lsr r7, r9, #16\n\t"
  99646. "mul r7, r6, r7\n\t"
  99647. "adds r5, r5, r7\n\t"
  99648. "adc r3, r3, #0\n\t"
  99649. "lsl r7, r9, #16\n\t"
  99650. "lsr r7, r7, #16\n\t"
  99651. "mul r6, r7, r6\n\t"
  99652. "lsr r7, r6, #16\n\t"
  99653. "lsl r6, r6, #16\n\t"
  99654. "adds r4, r4, r6\n\t"
  99655. "adcs r5, r5, r7\n\t"
  99656. "adc r3, r3, #0\n\t"
  99657. #else
  99658. "umull r6, r7, r8, r9\n\t"
  99659. "adds r4, r4, r6\n\t"
  99660. "adcs r5, r5, r7\n\t"
  99661. "adc r3, r3, #0\n\t"
  99662. #endif
  99663. /* A[2] * B[14] */
  99664. "ldr r8, [%[a], #8]\n\t"
  99665. "ldr r9, [%[b], #56]\n\t"
  99666. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99667. "lsl r6, r8, #16\n\t"
  99668. "lsl r7, r9, #16\n\t"
  99669. "lsr r6, r6, #16\n\t"
  99670. "lsr r7, r7, #16\n\t"
  99671. "mul r7, r6, r7\n\t"
  99672. "adds r4, r4, r7\n\t"
  99673. "adcs r5, r5, #0\n\t"
  99674. "adc r3, r3, #0\n\t"
  99675. "lsr r7, r9, #16\n\t"
  99676. "mul r6, r7, r6\n\t"
  99677. "lsr r7, r6, #16\n\t"
  99678. "lsl r6, r6, #16\n\t"
  99679. "adds r4, r4, r6\n\t"
  99680. "adcs r5, r5, r7\n\t"
  99681. "adc r3, r3, #0\n\t"
  99682. "lsr r6, r8, #16\n\t"
  99683. "lsr r7, r9, #16\n\t"
  99684. "mul r7, r6, r7\n\t"
  99685. "adds r5, r5, r7\n\t"
  99686. "adc r3, r3, #0\n\t"
  99687. "lsl r7, r9, #16\n\t"
  99688. "lsr r7, r7, #16\n\t"
  99689. "mul r6, r7, r6\n\t"
  99690. "lsr r7, r6, #16\n\t"
  99691. "lsl r6, r6, #16\n\t"
  99692. "adds r4, r4, r6\n\t"
  99693. "adcs r5, r5, r7\n\t"
  99694. "adc r3, r3, #0\n\t"
  99695. #else
  99696. "umull r6, r7, r8, r9\n\t"
  99697. "adds r4, r4, r6\n\t"
  99698. "adcs r5, r5, r7\n\t"
  99699. "adc r3, r3, #0\n\t"
  99700. #endif
  99701. /* A[1] * B[15] */
  99702. "ldr r8, [%[a], #4]\n\t"
  99703. "ldr r9, [%[b], #60]\n\t"
  99704. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99705. "lsl r6, r8, #16\n\t"
  99706. "lsl r7, r9, #16\n\t"
  99707. "lsr r6, r6, #16\n\t"
  99708. "lsr r7, r7, #16\n\t"
  99709. "mul r7, r6, r7\n\t"
  99710. "adds r4, r4, r7\n\t"
  99711. "adcs r5, r5, #0\n\t"
  99712. "adc r3, r3, #0\n\t"
  99713. "lsr r7, r9, #16\n\t"
  99714. "mul r6, r7, r6\n\t"
  99715. "lsr r7, r6, #16\n\t"
  99716. "lsl r6, r6, #16\n\t"
  99717. "adds r4, r4, r6\n\t"
  99718. "adcs r5, r5, r7\n\t"
  99719. "adc r3, r3, #0\n\t"
  99720. "lsr r6, r8, #16\n\t"
  99721. "lsr r7, r9, #16\n\t"
  99722. "mul r7, r6, r7\n\t"
  99723. "adds r5, r5, r7\n\t"
  99724. "adc r3, r3, #0\n\t"
  99725. "lsl r7, r9, #16\n\t"
  99726. "lsr r7, r7, #16\n\t"
  99727. "mul r6, r7, r6\n\t"
  99728. "lsr r7, r6, #16\n\t"
  99729. "lsl r6, r6, #16\n\t"
  99730. "adds r4, r4, r6\n\t"
  99731. "adcs r5, r5, r7\n\t"
  99732. "adc r3, r3, #0\n\t"
  99733. #else
  99734. "umull r6, r7, r8, r9\n\t"
  99735. "adds r4, r4, r6\n\t"
  99736. "adcs r5, r5, r7\n\t"
  99737. "adc r3, r3, #0\n\t"
  99738. #endif
  99739. /* A[0] * B[16] */
  99740. "ldr r8, [%[a]]\n\t"
  99741. "ldr r9, [%[b], #64]\n\t"
  99742. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99743. "lsl r6, r8, #16\n\t"
  99744. "lsl r7, r9, #16\n\t"
  99745. "lsr r6, r6, #16\n\t"
  99746. "lsr r7, r7, #16\n\t"
  99747. "mul r7, r6, r7\n\t"
  99748. "adds r4, r4, r7\n\t"
  99749. "adcs r5, r5, #0\n\t"
  99750. "adc r3, r3, #0\n\t"
  99751. "lsr r7, r9, #16\n\t"
  99752. "mul r6, r7, r6\n\t"
  99753. "lsr r7, r6, #16\n\t"
  99754. "lsl r6, r6, #16\n\t"
  99755. "adds r4, r4, r6\n\t"
  99756. "adcs r5, r5, r7\n\t"
  99757. "adc r3, r3, #0\n\t"
  99758. "lsr r6, r8, #16\n\t"
  99759. "lsr r7, r9, #16\n\t"
  99760. "mul r7, r6, r7\n\t"
  99761. "adds r5, r5, r7\n\t"
  99762. "adc r3, r3, #0\n\t"
  99763. "lsl r7, r9, #16\n\t"
  99764. "lsr r7, r7, #16\n\t"
  99765. "mul r6, r7, r6\n\t"
  99766. "lsr r7, r6, #16\n\t"
  99767. "lsl r6, r6, #16\n\t"
  99768. "adds r4, r4, r6\n\t"
  99769. "adcs r5, r5, r7\n\t"
  99770. "adc r3, r3, #0\n\t"
  99771. #else
  99772. "umull r6, r7, r8, r9\n\t"
  99773. "adds r4, r4, r6\n\t"
  99774. "adcs r5, r5, r7\n\t"
  99775. "adc r3, r3, #0\n\t"
  99776. #endif
  99777. "str r4, [sp, #64]\n\t"
  99778. /* A[1] * B[16] */
  99779. "ldr r8, [%[a], #4]\n\t"
  99780. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99781. "lsl r6, r8, #16\n\t"
  99782. "lsl r7, r9, #16\n\t"
  99783. "lsr r6, r6, #16\n\t"
  99784. "lsr r7, r7, #16\n\t"
  99785. "mul r7, r6, r7\n\t"
  99786. "adds r5, r5, r7\n\t"
  99787. "adcs r3, r3, #0\n\t"
  99788. "mov r4, #0\n\t"
  99789. "adc r4, r4, #0\n\t"
  99790. "lsr r7, r9, #16\n\t"
  99791. "mul r6, r7, r6\n\t"
  99792. "lsr r7, r6, #16\n\t"
  99793. "lsl r6, r6, #16\n\t"
  99794. "adds r5, r5, r6\n\t"
  99795. "adcs r3, r3, r7\n\t"
  99796. "adc r4, r4, #0\n\t"
  99797. "lsr r6, r8, #16\n\t"
  99798. "lsr r7, r9, #16\n\t"
  99799. "mul r7, r6, r7\n\t"
  99800. "adds r3, r3, r7\n\t"
  99801. "adc r4, r4, #0\n\t"
  99802. "lsl r7, r9, #16\n\t"
  99803. "lsr r7, r7, #16\n\t"
  99804. "mul r6, r7, r6\n\t"
  99805. "lsr r7, r6, #16\n\t"
  99806. "lsl r6, r6, #16\n\t"
  99807. "adds r5, r5, r6\n\t"
  99808. "adcs r3, r3, r7\n\t"
  99809. "adc r4, r4, #0\n\t"
  99810. #else
  99811. "umull r6, r7, r8, r9\n\t"
  99812. "adds r5, r5, r6\n\t"
  99813. "adcs r3, r3, r7\n\t"
  99814. "mov r4, #0\n\t"
  99815. "adc r4, r4, #0\n\t"
  99816. #endif
  99817. /* A[2] * B[15] */
  99818. "ldr r8, [%[a], #8]\n\t"
  99819. "ldr r9, [%[b], #60]\n\t"
  99820. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99821. "lsl r6, r8, #16\n\t"
  99822. "lsl r7, r9, #16\n\t"
  99823. "lsr r6, r6, #16\n\t"
  99824. "lsr r7, r7, #16\n\t"
  99825. "mul r7, r6, r7\n\t"
  99826. "adds r5, r5, r7\n\t"
  99827. "adcs r3, r3, #0\n\t"
  99828. "adc r4, r4, #0\n\t"
  99829. "lsr r7, r9, #16\n\t"
  99830. "mul r6, r7, r6\n\t"
  99831. "lsr r7, r6, #16\n\t"
  99832. "lsl r6, r6, #16\n\t"
  99833. "adds r5, r5, r6\n\t"
  99834. "adcs r3, r3, r7\n\t"
  99835. "adc r4, r4, #0\n\t"
  99836. "lsr r6, r8, #16\n\t"
  99837. "lsr r7, r9, #16\n\t"
  99838. "mul r7, r6, r7\n\t"
  99839. "adds r3, r3, r7\n\t"
  99840. "adc r4, r4, #0\n\t"
  99841. "lsl r7, r9, #16\n\t"
  99842. "lsr r7, r7, #16\n\t"
  99843. "mul r6, r7, r6\n\t"
  99844. "lsr r7, r6, #16\n\t"
  99845. "lsl r6, r6, #16\n\t"
  99846. "adds r5, r5, r6\n\t"
  99847. "adcs r3, r3, r7\n\t"
  99848. "adc r4, r4, #0\n\t"
  99849. #else
  99850. "umull r6, r7, r8, r9\n\t"
  99851. "adds r5, r5, r6\n\t"
  99852. "adcs r3, r3, r7\n\t"
  99853. "adc r4, r4, #0\n\t"
  99854. #endif
  99855. /* A[3] * B[14] */
  99856. "ldr r8, [%[a], #12]\n\t"
  99857. "ldr r9, [%[b], #56]\n\t"
  99858. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99859. "lsl r6, r8, #16\n\t"
  99860. "lsl r7, r9, #16\n\t"
  99861. "lsr r6, r6, #16\n\t"
  99862. "lsr r7, r7, #16\n\t"
  99863. "mul r7, r6, r7\n\t"
  99864. "adds r5, r5, r7\n\t"
  99865. "adcs r3, r3, #0\n\t"
  99866. "adc r4, r4, #0\n\t"
  99867. "lsr r7, r9, #16\n\t"
  99868. "mul r6, r7, r6\n\t"
  99869. "lsr r7, r6, #16\n\t"
  99870. "lsl r6, r6, #16\n\t"
  99871. "adds r5, r5, r6\n\t"
  99872. "adcs r3, r3, r7\n\t"
  99873. "adc r4, r4, #0\n\t"
  99874. "lsr r6, r8, #16\n\t"
  99875. "lsr r7, r9, #16\n\t"
  99876. "mul r7, r6, r7\n\t"
  99877. "adds r3, r3, r7\n\t"
  99878. "adc r4, r4, #0\n\t"
  99879. "lsl r7, r9, #16\n\t"
  99880. "lsr r7, r7, #16\n\t"
  99881. "mul r6, r7, r6\n\t"
  99882. "lsr r7, r6, #16\n\t"
  99883. "lsl r6, r6, #16\n\t"
  99884. "adds r5, r5, r6\n\t"
  99885. "adcs r3, r3, r7\n\t"
  99886. "adc r4, r4, #0\n\t"
  99887. #else
  99888. "umull r6, r7, r8, r9\n\t"
  99889. "adds r5, r5, r6\n\t"
  99890. "adcs r3, r3, r7\n\t"
  99891. "adc r4, r4, #0\n\t"
  99892. #endif
  99893. /* A[4] * B[13] */
  99894. "ldr r8, [%[a], #16]\n\t"
  99895. "ldr r9, [%[b], #52]\n\t"
  99896. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99897. "lsl r6, r8, #16\n\t"
  99898. "lsl r7, r9, #16\n\t"
  99899. "lsr r6, r6, #16\n\t"
  99900. "lsr r7, r7, #16\n\t"
  99901. "mul r7, r6, r7\n\t"
  99902. "adds r5, r5, r7\n\t"
  99903. "adcs r3, r3, #0\n\t"
  99904. "adc r4, r4, #0\n\t"
  99905. "lsr r7, r9, #16\n\t"
  99906. "mul r6, r7, r6\n\t"
  99907. "lsr r7, r6, #16\n\t"
  99908. "lsl r6, r6, #16\n\t"
  99909. "adds r5, r5, r6\n\t"
  99910. "adcs r3, r3, r7\n\t"
  99911. "adc r4, r4, #0\n\t"
  99912. "lsr r6, r8, #16\n\t"
  99913. "lsr r7, r9, #16\n\t"
  99914. "mul r7, r6, r7\n\t"
  99915. "adds r3, r3, r7\n\t"
  99916. "adc r4, r4, #0\n\t"
  99917. "lsl r7, r9, #16\n\t"
  99918. "lsr r7, r7, #16\n\t"
  99919. "mul r6, r7, r6\n\t"
  99920. "lsr r7, r6, #16\n\t"
  99921. "lsl r6, r6, #16\n\t"
  99922. "adds r5, r5, r6\n\t"
  99923. "adcs r3, r3, r7\n\t"
  99924. "adc r4, r4, #0\n\t"
  99925. #else
  99926. "umull r6, r7, r8, r9\n\t"
  99927. "adds r5, r5, r6\n\t"
  99928. "adcs r3, r3, r7\n\t"
  99929. "adc r4, r4, #0\n\t"
  99930. #endif
  99931. /* A[5] * B[12] */
  99932. "ldr r8, [%[a], #20]\n\t"
  99933. "ldr r9, [%[b], #48]\n\t"
  99934. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99935. "lsl r6, r8, #16\n\t"
  99936. "lsl r7, r9, #16\n\t"
  99937. "lsr r6, r6, #16\n\t"
  99938. "lsr r7, r7, #16\n\t"
  99939. "mul r7, r6, r7\n\t"
  99940. "adds r5, r5, r7\n\t"
  99941. "adcs r3, r3, #0\n\t"
  99942. "adc r4, r4, #0\n\t"
  99943. "lsr r7, r9, #16\n\t"
  99944. "mul r6, r7, r6\n\t"
  99945. "lsr r7, r6, #16\n\t"
  99946. "lsl r6, r6, #16\n\t"
  99947. "adds r5, r5, r6\n\t"
  99948. "adcs r3, r3, r7\n\t"
  99949. "adc r4, r4, #0\n\t"
  99950. "lsr r6, r8, #16\n\t"
  99951. "lsr r7, r9, #16\n\t"
  99952. "mul r7, r6, r7\n\t"
  99953. "adds r3, r3, r7\n\t"
  99954. "adc r4, r4, #0\n\t"
  99955. "lsl r7, r9, #16\n\t"
  99956. "lsr r7, r7, #16\n\t"
  99957. "mul r6, r7, r6\n\t"
  99958. "lsr r7, r6, #16\n\t"
  99959. "lsl r6, r6, #16\n\t"
  99960. "adds r5, r5, r6\n\t"
  99961. "adcs r3, r3, r7\n\t"
  99962. "adc r4, r4, #0\n\t"
  99963. #else
  99964. "umull r6, r7, r8, r9\n\t"
  99965. "adds r5, r5, r6\n\t"
  99966. "adcs r3, r3, r7\n\t"
  99967. "adc r4, r4, #0\n\t"
  99968. #endif
  99969. /* A[6] * B[11] */
  99970. "ldr r8, [%[a], #24]\n\t"
  99971. "ldr r9, [%[b], #44]\n\t"
  99972. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  99973. "lsl r6, r8, #16\n\t"
  99974. "lsl r7, r9, #16\n\t"
  99975. "lsr r6, r6, #16\n\t"
  99976. "lsr r7, r7, #16\n\t"
  99977. "mul r7, r6, r7\n\t"
  99978. "adds r5, r5, r7\n\t"
  99979. "adcs r3, r3, #0\n\t"
  99980. "adc r4, r4, #0\n\t"
  99981. "lsr r7, r9, #16\n\t"
  99982. "mul r6, r7, r6\n\t"
  99983. "lsr r7, r6, #16\n\t"
  99984. "lsl r6, r6, #16\n\t"
  99985. "adds r5, r5, r6\n\t"
  99986. "adcs r3, r3, r7\n\t"
  99987. "adc r4, r4, #0\n\t"
  99988. "lsr r6, r8, #16\n\t"
  99989. "lsr r7, r9, #16\n\t"
  99990. "mul r7, r6, r7\n\t"
  99991. "adds r3, r3, r7\n\t"
  99992. "adc r4, r4, #0\n\t"
  99993. "lsl r7, r9, #16\n\t"
  99994. "lsr r7, r7, #16\n\t"
  99995. "mul r6, r7, r6\n\t"
  99996. "lsr r7, r6, #16\n\t"
  99997. "lsl r6, r6, #16\n\t"
  99998. "adds r5, r5, r6\n\t"
  99999. "adcs r3, r3, r7\n\t"
  100000. "adc r4, r4, #0\n\t"
  100001. #else
  100002. "umull r6, r7, r8, r9\n\t"
  100003. "adds r5, r5, r6\n\t"
  100004. "adcs r3, r3, r7\n\t"
  100005. "adc r4, r4, #0\n\t"
  100006. #endif
  100007. /* A[7] * B[10] */
  100008. "ldr r8, [%[a], #28]\n\t"
  100009. "ldr r9, [%[b], #40]\n\t"
  100010. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100011. "lsl r6, r8, #16\n\t"
  100012. "lsl r7, r9, #16\n\t"
  100013. "lsr r6, r6, #16\n\t"
  100014. "lsr r7, r7, #16\n\t"
  100015. "mul r7, r6, r7\n\t"
  100016. "adds r5, r5, r7\n\t"
  100017. "adcs r3, r3, #0\n\t"
  100018. "adc r4, r4, #0\n\t"
  100019. "lsr r7, r9, #16\n\t"
  100020. "mul r6, r7, r6\n\t"
  100021. "lsr r7, r6, #16\n\t"
  100022. "lsl r6, r6, #16\n\t"
  100023. "adds r5, r5, r6\n\t"
  100024. "adcs r3, r3, r7\n\t"
  100025. "adc r4, r4, #0\n\t"
  100026. "lsr r6, r8, #16\n\t"
  100027. "lsr r7, r9, #16\n\t"
  100028. "mul r7, r6, r7\n\t"
  100029. "adds r3, r3, r7\n\t"
  100030. "adc r4, r4, #0\n\t"
  100031. "lsl r7, r9, #16\n\t"
  100032. "lsr r7, r7, #16\n\t"
  100033. "mul r6, r7, r6\n\t"
  100034. "lsr r7, r6, #16\n\t"
  100035. "lsl r6, r6, #16\n\t"
  100036. "adds r5, r5, r6\n\t"
  100037. "adcs r3, r3, r7\n\t"
  100038. "adc r4, r4, #0\n\t"
  100039. #else
  100040. "umull r6, r7, r8, r9\n\t"
  100041. "adds r5, r5, r6\n\t"
  100042. "adcs r3, r3, r7\n\t"
  100043. "adc r4, r4, #0\n\t"
  100044. #endif
  100045. /* A[8] * B[9] */
  100046. "ldr r9, [%[b], #36]\n\t"
  100047. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100048. "lsl r6, r11, #16\n\t"
  100049. "lsl r7, r9, #16\n\t"
  100050. "lsr r6, r6, #16\n\t"
  100051. "lsr r7, r7, #16\n\t"
  100052. "mul r7, r6, r7\n\t"
  100053. "adds r5, r5, r7\n\t"
  100054. "adcs r3, r3, #0\n\t"
  100055. "adc r4, r4, #0\n\t"
  100056. "lsr r7, r9, #16\n\t"
  100057. "mul r6, r7, r6\n\t"
  100058. "lsr r7, r6, #16\n\t"
  100059. "lsl r6, r6, #16\n\t"
  100060. "adds r5, r5, r6\n\t"
  100061. "adcs r3, r3, r7\n\t"
  100062. "adc r4, r4, #0\n\t"
  100063. "lsr r6, r11, #16\n\t"
  100064. "lsr r7, r9, #16\n\t"
  100065. "mul r7, r6, r7\n\t"
  100066. "adds r3, r3, r7\n\t"
  100067. "adc r4, r4, #0\n\t"
  100068. "lsl r7, r9, #16\n\t"
  100069. "lsr r7, r7, #16\n\t"
  100070. "mul r6, r7, r6\n\t"
  100071. "lsr r7, r6, #16\n\t"
  100072. "lsl r6, r6, #16\n\t"
  100073. "adds r5, r5, r6\n\t"
  100074. "adcs r3, r3, r7\n\t"
  100075. "adc r4, r4, #0\n\t"
  100076. #else
  100077. "umull r6, r7, r11, r9\n\t"
  100078. "adds r5, r5, r6\n\t"
  100079. "adcs r3, r3, r7\n\t"
  100080. "adc r4, r4, #0\n\t"
  100081. #endif
  100082. /* A[9] * B[8] */
  100083. "ldr r8, [%[a], #36]\n\t"
  100084. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100085. "lsl r6, r8, #16\n\t"
  100086. "lsl r7, r12, #16\n\t"
  100087. "lsr r6, r6, #16\n\t"
  100088. "lsr r7, r7, #16\n\t"
  100089. "mul r7, r6, r7\n\t"
  100090. "adds r5, r5, r7\n\t"
  100091. "adcs r3, r3, #0\n\t"
  100092. "adc r4, r4, #0\n\t"
  100093. "lsr r7, r12, #16\n\t"
  100094. "mul r6, r7, r6\n\t"
  100095. "lsr r7, r6, #16\n\t"
  100096. "lsl r6, r6, #16\n\t"
  100097. "adds r5, r5, r6\n\t"
  100098. "adcs r3, r3, r7\n\t"
  100099. "adc r4, r4, #0\n\t"
  100100. "lsr r6, r8, #16\n\t"
  100101. "lsr r7, r12, #16\n\t"
  100102. "mul r7, r6, r7\n\t"
  100103. "adds r3, r3, r7\n\t"
  100104. "adc r4, r4, #0\n\t"
  100105. "lsl r7, r12, #16\n\t"
  100106. "lsr r7, r7, #16\n\t"
  100107. "mul r6, r7, r6\n\t"
  100108. "lsr r7, r6, #16\n\t"
  100109. "lsl r6, r6, #16\n\t"
  100110. "adds r5, r5, r6\n\t"
  100111. "adcs r3, r3, r7\n\t"
  100112. "adc r4, r4, #0\n\t"
  100113. #else
  100114. "umull r6, r7, r8, r12\n\t"
  100115. "adds r5, r5, r6\n\t"
  100116. "adcs r3, r3, r7\n\t"
  100117. "adc r4, r4, #0\n\t"
  100118. #endif
  100119. /* A[10] * B[7] */
  100120. "ldr r8, [%[a], #40]\n\t"
  100121. "ldr r9, [%[b], #28]\n\t"
  100122. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100123. "lsl r6, r8, #16\n\t"
  100124. "lsl r7, r9, #16\n\t"
  100125. "lsr r6, r6, #16\n\t"
  100126. "lsr r7, r7, #16\n\t"
  100127. "mul r7, r6, r7\n\t"
  100128. "adds r5, r5, r7\n\t"
  100129. "adcs r3, r3, #0\n\t"
  100130. "adc r4, r4, #0\n\t"
  100131. "lsr r7, r9, #16\n\t"
  100132. "mul r6, r7, r6\n\t"
  100133. "lsr r7, r6, #16\n\t"
  100134. "lsl r6, r6, #16\n\t"
  100135. "adds r5, r5, r6\n\t"
  100136. "adcs r3, r3, r7\n\t"
  100137. "adc r4, r4, #0\n\t"
  100138. "lsr r6, r8, #16\n\t"
  100139. "lsr r7, r9, #16\n\t"
  100140. "mul r7, r6, r7\n\t"
  100141. "adds r3, r3, r7\n\t"
  100142. "adc r4, r4, #0\n\t"
  100143. "lsl r7, r9, #16\n\t"
  100144. "lsr r7, r7, #16\n\t"
  100145. "mul r6, r7, r6\n\t"
  100146. "lsr r7, r6, #16\n\t"
  100147. "lsl r6, r6, #16\n\t"
  100148. "adds r5, r5, r6\n\t"
  100149. "adcs r3, r3, r7\n\t"
  100150. "adc r4, r4, #0\n\t"
  100151. #else
  100152. "umull r6, r7, r8, r9\n\t"
  100153. "adds r5, r5, r6\n\t"
  100154. "adcs r3, r3, r7\n\t"
  100155. "adc r4, r4, #0\n\t"
  100156. #endif
  100157. /* A[11] * B[6] */
  100158. "ldr r8, [%[a], #44]\n\t"
  100159. "ldr r9, [%[b], #24]\n\t"
  100160. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100161. "lsl r6, r8, #16\n\t"
  100162. "lsl r7, r9, #16\n\t"
  100163. "lsr r6, r6, #16\n\t"
  100164. "lsr r7, r7, #16\n\t"
  100165. "mul r7, r6, r7\n\t"
  100166. "adds r5, r5, r7\n\t"
  100167. "adcs r3, r3, #0\n\t"
  100168. "adc r4, r4, #0\n\t"
  100169. "lsr r7, r9, #16\n\t"
  100170. "mul r6, r7, r6\n\t"
  100171. "lsr r7, r6, #16\n\t"
  100172. "lsl r6, r6, #16\n\t"
  100173. "adds r5, r5, r6\n\t"
  100174. "adcs r3, r3, r7\n\t"
  100175. "adc r4, r4, #0\n\t"
  100176. "lsr r6, r8, #16\n\t"
  100177. "lsr r7, r9, #16\n\t"
  100178. "mul r7, r6, r7\n\t"
  100179. "adds r3, r3, r7\n\t"
  100180. "adc r4, r4, #0\n\t"
  100181. "lsl r7, r9, #16\n\t"
  100182. "lsr r7, r7, #16\n\t"
  100183. "mul r6, r7, r6\n\t"
  100184. "lsr r7, r6, #16\n\t"
  100185. "lsl r6, r6, #16\n\t"
  100186. "adds r5, r5, r6\n\t"
  100187. "adcs r3, r3, r7\n\t"
  100188. "adc r4, r4, #0\n\t"
  100189. #else
  100190. "umull r6, r7, r8, r9\n\t"
  100191. "adds r5, r5, r6\n\t"
  100192. "adcs r3, r3, r7\n\t"
  100193. "adc r4, r4, #0\n\t"
  100194. #endif
  100195. /* A[12] * B[5] */
  100196. "ldr r8, [%[a], #48]\n\t"
  100197. "ldr r9, [%[b], #20]\n\t"
  100198. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100199. "lsl r6, r8, #16\n\t"
  100200. "lsl r7, r9, #16\n\t"
  100201. "lsr r6, r6, #16\n\t"
  100202. "lsr r7, r7, #16\n\t"
  100203. "mul r7, r6, r7\n\t"
  100204. "adds r5, r5, r7\n\t"
  100205. "adcs r3, r3, #0\n\t"
  100206. "adc r4, r4, #0\n\t"
  100207. "lsr r7, r9, #16\n\t"
  100208. "mul r6, r7, r6\n\t"
  100209. "lsr r7, r6, #16\n\t"
  100210. "lsl r6, r6, #16\n\t"
  100211. "adds r5, r5, r6\n\t"
  100212. "adcs r3, r3, r7\n\t"
  100213. "adc r4, r4, #0\n\t"
  100214. "lsr r6, r8, #16\n\t"
  100215. "lsr r7, r9, #16\n\t"
  100216. "mul r7, r6, r7\n\t"
  100217. "adds r3, r3, r7\n\t"
  100218. "adc r4, r4, #0\n\t"
  100219. "lsl r7, r9, #16\n\t"
  100220. "lsr r7, r7, #16\n\t"
  100221. "mul r6, r7, r6\n\t"
  100222. "lsr r7, r6, #16\n\t"
  100223. "lsl r6, r6, #16\n\t"
  100224. "adds r5, r5, r6\n\t"
  100225. "adcs r3, r3, r7\n\t"
  100226. "adc r4, r4, #0\n\t"
  100227. #else
  100228. "umull r6, r7, r8, r9\n\t"
  100229. "adds r5, r5, r6\n\t"
  100230. "adcs r3, r3, r7\n\t"
  100231. "adc r4, r4, #0\n\t"
  100232. #endif
  100233. /* A[13] * B[4] */
  100234. "ldr r8, [%[a], #52]\n\t"
  100235. "ldr r9, [%[b], #16]\n\t"
  100236. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100237. "lsl r6, r8, #16\n\t"
  100238. "lsl r7, r9, #16\n\t"
  100239. "lsr r6, r6, #16\n\t"
  100240. "lsr r7, r7, #16\n\t"
  100241. "mul r7, r6, r7\n\t"
  100242. "adds r5, r5, r7\n\t"
  100243. "adcs r3, r3, #0\n\t"
  100244. "adc r4, r4, #0\n\t"
  100245. "lsr r7, r9, #16\n\t"
  100246. "mul r6, r7, r6\n\t"
  100247. "lsr r7, r6, #16\n\t"
  100248. "lsl r6, r6, #16\n\t"
  100249. "adds r5, r5, r6\n\t"
  100250. "adcs r3, r3, r7\n\t"
  100251. "adc r4, r4, #0\n\t"
  100252. "lsr r6, r8, #16\n\t"
  100253. "lsr r7, r9, #16\n\t"
  100254. "mul r7, r6, r7\n\t"
  100255. "adds r3, r3, r7\n\t"
  100256. "adc r4, r4, #0\n\t"
  100257. "lsl r7, r9, #16\n\t"
  100258. "lsr r7, r7, #16\n\t"
  100259. "mul r6, r7, r6\n\t"
  100260. "lsr r7, r6, #16\n\t"
  100261. "lsl r6, r6, #16\n\t"
  100262. "adds r5, r5, r6\n\t"
  100263. "adcs r3, r3, r7\n\t"
  100264. "adc r4, r4, #0\n\t"
  100265. #else
  100266. "umull r6, r7, r8, r9\n\t"
  100267. "adds r5, r5, r6\n\t"
  100268. "adcs r3, r3, r7\n\t"
  100269. "adc r4, r4, #0\n\t"
  100270. #endif
  100271. /* A[14] * B[3] */
  100272. "ldr r8, [%[a], #56]\n\t"
  100273. "ldr r9, [%[b], #12]\n\t"
  100274. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100275. "lsl r6, r8, #16\n\t"
  100276. "lsl r7, r9, #16\n\t"
  100277. "lsr r6, r6, #16\n\t"
  100278. "lsr r7, r7, #16\n\t"
  100279. "mul r7, r6, r7\n\t"
  100280. "adds r5, r5, r7\n\t"
  100281. "adcs r3, r3, #0\n\t"
  100282. "adc r4, r4, #0\n\t"
  100283. "lsr r7, r9, #16\n\t"
  100284. "mul r6, r7, r6\n\t"
  100285. "lsr r7, r6, #16\n\t"
  100286. "lsl r6, r6, #16\n\t"
  100287. "adds r5, r5, r6\n\t"
  100288. "adcs r3, r3, r7\n\t"
  100289. "adc r4, r4, #0\n\t"
  100290. "lsr r6, r8, #16\n\t"
  100291. "lsr r7, r9, #16\n\t"
  100292. "mul r7, r6, r7\n\t"
  100293. "adds r3, r3, r7\n\t"
  100294. "adc r4, r4, #0\n\t"
  100295. "lsl r7, r9, #16\n\t"
  100296. "lsr r7, r7, #16\n\t"
  100297. "mul r6, r7, r6\n\t"
  100298. "lsr r7, r6, #16\n\t"
  100299. "lsl r6, r6, #16\n\t"
  100300. "adds r5, r5, r6\n\t"
  100301. "adcs r3, r3, r7\n\t"
  100302. "adc r4, r4, #0\n\t"
  100303. #else
  100304. "umull r6, r7, r8, r9\n\t"
  100305. "adds r5, r5, r6\n\t"
  100306. "adcs r3, r3, r7\n\t"
  100307. "adc r4, r4, #0\n\t"
  100308. #endif
  100309. /* A[15] * B[2] */
  100310. "ldr r8, [%[a], #60]\n\t"
  100311. "ldr r9, [%[b], #8]\n\t"
  100312. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100313. "lsl r6, r8, #16\n\t"
  100314. "lsl r7, r9, #16\n\t"
  100315. "lsr r6, r6, #16\n\t"
  100316. "lsr r7, r7, #16\n\t"
  100317. "mul r7, r6, r7\n\t"
  100318. "adds r5, r5, r7\n\t"
  100319. "adcs r3, r3, #0\n\t"
  100320. "adc r4, r4, #0\n\t"
  100321. "lsr r7, r9, #16\n\t"
  100322. "mul r6, r7, r6\n\t"
  100323. "lsr r7, r6, #16\n\t"
  100324. "lsl r6, r6, #16\n\t"
  100325. "adds r5, r5, r6\n\t"
  100326. "adcs r3, r3, r7\n\t"
  100327. "adc r4, r4, #0\n\t"
  100328. "lsr r6, r8, #16\n\t"
  100329. "lsr r7, r9, #16\n\t"
  100330. "mul r7, r6, r7\n\t"
  100331. "adds r3, r3, r7\n\t"
  100332. "adc r4, r4, #0\n\t"
  100333. "lsl r7, r9, #16\n\t"
  100334. "lsr r7, r7, #16\n\t"
  100335. "mul r6, r7, r6\n\t"
  100336. "lsr r7, r6, #16\n\t"
  100337. "lsl r6, r6, #16\n\t"
  100338. "adds r5, r5, r6\n\t"
  100339. "adcs r3, r3, r7\n\t"
  100340. "adc r4, r4, #0\n\t"
  100341. #else
  100342. "umull r6, r7, r8, r9\n\t"
  100343. "adds r5, r5, r6\n\t"
  100344. "adcs r3, r3, r7\n\t"
  100345. "adc r4, r4, #0\n\t"
  100346. #endif
  100347. /* A[16] * B[1] */
  100348. "ldr r8, [%[a], #64]\n\t"
  100349. "ldr r9, [%[b], #4]\n\t"
  100350. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100351. "lsl r6, r8, #16\n\t"
  100352. "lsl r7, r9, #16\n\t"
  100353. "lsr r6, r6, #16\n\t"
  100354. "lsr r7, r7, #16\n\t"
  100355. "mul r7, r6, r7\n\t"
  100356. "adds r5, r5, r7\n\t"
  100357. "adcs r3, r3, #0\n\t"
  100358. "adc r4, r4, #0\n\t"
  100359. "lsr r7, r9, #16\n\t"
  100360. "mul r6, r7, r6\n\t"
  100361. "lsr r7, r6, #16\n\t"
  100362. "lsl r6, r6, #16\n\t"
  100363. "adds r5, r5, r6\n\t"
  100364. "adcs r3, r3, r7\n\t"
  100365. "adc r4, r4, #0\n\t"
  100366. "lsr r6, r8, #16\n\t"
  100367. "lsr r7, r9, #16\n\t"
  100368. "mul r7, r6, r7\n\t"
  100369. "adds r3, r3, r7\n\t"
  100370. "adc r4, r4, #0\n\t"
  100371. "lsl r7, r9, #16\n\t"
  100372. "lsr r7, r7, #16\n\t"
  100373. "mul r6, r7, r6\n\t"
  100374. "lsr r7, r6, #16\n\t"
  100375. "lsl r6, r6, #16\n\t"
  100376. "adds r5, r5, r6\n\t"
  100377. "adcs r3, r3, r7\n\t"
  100378. "adc r4, r4, #0\n\t"
  100379. #else
  100380. "umull r6, r7, r8, r9\n\t"
  100381. "adds r5, r5, r6\n\t"
  100382. "adcs r3, r3, r7\n\t"
  100383. "adc r4, r4, #0\n\t"
  100384. #endif
  100385. "str r5, [%[r], #68]\n\t"
  100386. /* A[16] * B[2] */
  100387. "ldr r9, [%[b], #8]\n\t"
  100388. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100389. "lsl r6, r8, #16\n\t"
  100390. "lsl r7, r9, #16\n\t"
  100391. "lsr r6, r6, #16\n\t"
  100392. "lsr r7, r7, #16\n\t"
  100393. "mul r7, r6, r7\n\t"
  100394. "adds r3, r3, r7\n\t"
  100395. "adcs r4, r4, #0\n\t"
  100396. "mov r5, #0\n\t"
  100397. "adc r5, r5, #0\n\t"
  100398. "lsr r7, r9, #16\n\t"
  100399. "mul r6, r7, r6\n\t"
  100400. "lsr r7, r6, #16\n\t"
  100401. "lsl r6, r6, #16\n\t"
  100402. "adds r3, r3, r6\n\t"
  100403. "adcs r4, r4, r7\n\t"
  100404. "adc r5, r5, #0\n\t"
  100405. "lsr r6, r8, #16\n\t"
  100406. "lsr r7, r9, #16\n\t"
  100407. "mul r7, r6, r7\n\t"
  100408. "adds r4, r4, r7\n\t"
  100409. "adc r5, r5, #0\n\t"
  100410. "lsl r7, r9, #16\n\t"
  100411. "lsr r7, r7, #16\n\t"
  100412. "mul r6, r7, r6\n\t"
  100413. "lsr r7, r6, #16\n\t"
  100414. "lsl r6, r6, #16\n\t"
  100415. "adds r3, r3, r6\n\t"
  100416. "adcs r4, r4, r7\n\t"
  100417. "adc r5, r5, #0\n\t"
  100418. #else
  100419. "umull r6, r7, r8, r9\n\t"
  100420. "adds r3, r3, r6\n\t"
  100421. "adcs r4, r4, r7\n\t"
  100422. "mov r5, #0\n\t"
  100423. "adc r5, r5, #0\n\t"
  100424. #endif
  100425. /* A[15] * B[3] */
  100426. "ldr r8, [%[a], #60]\n\t"
  100427. "ldr r9, [%[b], #12]\n\t"
  100428. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100429. "lsl r6, r8, #16\n\t"
  100430. "lsl r7, r9, #16\n\t"
  100431. "lsr r6, r6, #16\n\t"
  100432. "lsr r7, r7, #16\n\t"
  100433. "mul r7, r6, r7\n\t"
  100434. "adds r3, r3, r7\n\t"
  100435. "adcs r4, r4, #0\n\t"
  100436. "adc r5, r5, #0\n\t"
  100437. "lsr r7, r9, #16\n\t"
  100438. "mul r6, r7, r6\n\t"
  100439. "lsr r7, r6, #16\n\t"
  100440. "lsl r6, r6, #16\n\t"
  100441. "adds r3, r3, r6\n\t"
  100442. "adcs r4, r4, r7\n\t"
  100443. "adc r5, r5, #0\n\t"
  100444. "lsr r6, r8, #16\n\t"
  100445. "lsr r7, r9, #16\n\t"
  100446. "mul r7, r6, r7\n\t"
  100447. "adds r4, r4, r7\n\t"
  100448. "adc r5, r5, #0\n\t"
  100449. "lsl r7, r9, #16\n\t"
  100450. "lsr r7, r7, #16\n\t"
  100451. "mul r6, r7, r6\n\t"
  100452. "lsr r7, r6, #16\n\t"
  100453. "lsl r6, r6, #16\n\t"
  100454. "adds r3, r3, r6\n\t"
  100455. "adcs r4, r4, r7\n\t"
  100456. "adc r5, r5, #0\n\t"
  100457. #else
  100458. "umull r6, r7, r8, r9\n\t"
  100459. "adds r3, r3, r6\n\t"
  100460. "adcs r4, r4, r7\n\t"
  100461. "adc r5, r5, #0\n\t"
  100462. #endif
  100463. /* A[14] * B[4] */
  100464. "ldr r8, [%[a], #56]\n\t"
  100465. "ldr r9, [%[b], #16]\n\t"
  100466. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100467. "lsl r6, r8, #16\n\t"
  100468. "lsl r7, r9, #16\n\t"
  100469. "lsr r6, r6, #16\n\t"
  100470. "lsr r7, r7, #16\n\t"
  100471. "mul r7, r6, r7\n\t"
  100472. "adds r3, r3, r7\n\t"
  100473. "adcs r4, r4, #0\n\t"
  100474. "adc r5, r5, #0\n\t"
  100475. "lsr r7, r9, #16\n\t"
  100476. "mul r6, r7, r6\n\t"
  100477. "lsr r7, r6, #16\n\t"
  100478. "lsl r6, r6, #16\n\t"
  100479. "adds r3, r3, r6\n\t"
  100480. "adcs r4, r4, r7\n\t"
  100481. "adc r5, r5, #0\n\t"
  100482. "lsr r6, r8, #16\n\t"
  100483. "lsr r7, r9, #16\n\t"
  100484. "mul r7, r6, r7\n\t"
  100485. "adds r4, r4, r7\n\t"
  100486. "adc r5, r5, #0\n\t"
  100487. "lsl r7, r9, #16\n\t"
  100488. "lsr r7, r7, #16\n\t"
  100489. "mul r6, r7, r6\n\t"
  100490. "lsr r7, r6, #16\n\t"
  100491. "lsl r6, r6, #16\n\t"
  100492. "adds r3, r3, r6\n\t"
  100493. "adcs r4, r4, r7\n\t"
  100494. "adc r5, r5, #0\n\t"
  100495. #else
  100496. "umull r6, r7, r8, r9\n\t"
  100497. "adds r3, r3, r6\n\t"
  100498. "adcs r4, r4, r7\n\t"
  100499. "adc r5, r5, #0\n\t"
  100500. #endif
  100501. /* A[13] * B[5] */
  100502. "ldr r8, [%[a], #52]\n\t"
  100503. "ldr r9, [%[b], #20]\n\t"
  100504. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100505. "lsl r6, r8, #16\n\t"
  100506. "lsl r7, r9, #16\n\t"
  100507. "lsr r6, r6, #16\n\t"
  100508. "lsr r7, r7, #16\n\t"
  100509. "mul r7, r6, r7\n\t"
  100510. "adds r3, r3, r7\n\t"
  100511. "adcs r4, r4, #0\n\t"
  100512. "adc r5, r5, #0\n\t"
  100513. "lsr r7, r9, #16\n\t"
  100514. "mul r6, r7, r6\n\t"
  100515. "lsr r7, r6, #16\n\t"
  100516. "lsl r6, r6, #16\n\t"
  100517. "adds r3, r3, r6\n\t"
  100518. "adcs r4, r4, r7\n\t"
  100519. "adc r5, r5, #0\n\t"
  100520. "lsr r6, r8, #16\n\t"
  100521. "lsr r7, r9, #16\n\t"
  100522. "mul r7, r6, r7\n\t"
  100523. "adds r4, r4, r7\n\t"
  100524. "adc r5, r5, #0\n\t"
  100525. "lsl r7, r9, #16\n\t"
  100526. "lsr r7, r7, #16\n\t"
  100527. "mul r6, r7, r6\n\t"
  100528. "lsr r7, r6, #16\n\t"
  100529. "lsl r6, r6, #16\n\t"
  100530. "adds r3, r3, r6\n\t"
  100531. "adcs r4, r4, r7\n\t"
  100532. "adc r5, r5, #0\n\t"
  100533. #else
  100534. "umull r6, r7, r8, r9\n\t"
  100535. "adds r3, r3, r6\n\t"
  100536. "adcs r4, r4, r7\n\t"
  100537. "adc r5, r5, #0\n\t"
  100538. #endif
  100539. /* A[12] * B[6] */
  100540. "ldr r8, [%[a], #48]\n\t"
  100541. "ldr r9, [%[b], #24]\n\t"
  100542. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100543. "lsl r6, r8, #16\n\t"
  100544. "lsl r7, r9, #16\n\t"
  100545. "lsr r6, r6, #16\n\t"
  100546. "lsr r7, r7, #16\n\t"
  100547. "mul r7, r6, r7\n\t"
  100548. "adds r3, r3, r7\n\t"
  100549. "adcs r4, r4, #0\n\t"
  100550. "adc r5, r5, #0\n\t"
  100551. "lsr r7, r9, #16\n\t"
  100552. "mul r6, r7, r6\n\t"
  100553. "lsr r7, r6, #16\n\t"
  100554. "lsl r6, r6, #16\n\t"
  100555. "adds r3, r3, r6\n\t"
  100556. "adcs r4, r4, r7\n\t"
  100557. "adc r5, r5, #0\n\t"
  100558. "lsr r6, r8, #16\n\t"
  100559. "lsr r7, r9, #16\n\t"
  100560. "mul r7, r6, r7\n\t"
  100561. "adds r4, r4, r7\n\t"
  100562. "adc r5, r5, #0\n\t"
  100563. "lsl r7, r9, #16\n\t"
  100564. "lsr r7, r7, #16\n\t"
  100565. "mul r6, r7, r6\n\t"
  100566. "lsr r7, r6, #16\n\t"
  100567. "lsl r6, r6, #16\n\t"
  100568. "adds r3, r3, r6\n\t"
  100569. "adcs r4, r4, r7\n\t"
  100570. "adc r5, r5, #0\n\t"
  100571. #else
  100572. "umull r6, r7, r8, r9\n\t"
  100573. "adds r3, r3, r6\n\t"
  100574. "adcs r4, r4, r7\n\t"
  100575. "adc r5, r5, #0\n\t"
  100576. #endif
  100577. /* A[11] * B[7] */
  100578. "ldr r8, [%[a], #44]\n\t"
  100579. "ldr r9, [%[b], #28]\n\t"
  100580. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100581. "lsl r6, r8, #16\n\t"
  100582. "lsl r7, r9, #16\n\t"
  100583. "lsr r6, r6, #16\n\t"
  100584. "lsr r7, r7, #16\n\t"
  100585. "mul r7, r6, r7\n\t"
  100586. "adds r3, r3, r7\n\t"
  100587. "adcs r4, r4, #0\n\t"
  100588. "adc r5, r5, #0\n\t"
  100589. "lsr r7, r9, #16\n\t"
  100590. "mul r6, r7, r6\n\t"
  100591. "lsr r7, r6, #16\n\t"
  100592. "lsl r6, r6, #16\n\t"
  100593. "adds r3, r3, r6\n\t"
  100594. "adcs r4, r4, r7\n\t"
  100595. "adc r5, r5, #0\n\t"
  100596. "lsr r6, r8, #16\n\t"
  100597. "lsr r7, r9, #16\n\t"
  100598. "mul r7, r6, r7\n\t"
  100599. "adds r4, r4, r7\n\t"
  100600. "adc r5, r5, #0\n\t"
  100601. "lsl r7, r9, #16\n\t"
  100602. "lsr r7, r7, #16\n\t"
  100603. "mul r6, r7, r6\n\t"
  100604. "lsr r7, r6, #16\n\t"
  100605. "lsl r6, r6, #16\n\t"
  100606. "adds r3, r3, r6\n\t"
  100607. "adcs r4, r4, r7\n\t"
  100608. "adc r5, r5, #0\n\t"
  100609. #else
  100610. "umull r6, r7, r8, r9\n\t"
  100611. "adds r3, r3, r6\n\t"
  100612. "adcs r4, r4, r7\n\t"
  100613. "adc r5, r5, #0\n\t"
  100614. #endif
  100615. /* A[10] * B[8] */
  100616. "ldr r8, [%[a], #40]\n\t"
  100617. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100618. "lsl r6, r8, #16\n\t"
  100619. "lsl r7, r12, #16\n\t"
  100620. "lsr r6, r6, #16\n\t"
  100621. "lsr r7, r7, #16\n\t"
  100622. "mul r7, r6, r7\n\t"
  100623. "adds r3, r3, r7\n\t"
  100624. "adcs r4, r4, #0\n\t"
  100625. "adc r5, r5, #0\n\t"
  100626. "lsr r7, r12, #16\n\t"
  100627. "mul r6, r7, r6\n\t"
  100628. "lsr r7, r6, #16\n\t"
  100629. "lsl r6, r6, #16\n\t"
  100630. "adds r3, r3, r6\n\t"
  100631. "adcs r4, r4, r7\n\t"
  100632. "adc r5, r5, #0\n\t"
  100633. "lsr r6, r8, #16\n\t"
  100634. "lsr r7, r12, #16\n\t"
  100635. "mul r7, r6, r7\n\t"
  100636. "adds r4, r4, r7\n\t"
  100637. "adc r5, r5, #0\n\t"
  100638. "lsl r7, r12, #16\n\t"
  100639. "lsr r7, r7, #16\n\t"
  100640. "mul r6, r7, r6\n\t"
  100641. "lsr r7, r6, #16\n\t"
  100642. "lsl r6, r6, #16\n\t"
  100643. "adds r3, r3, r6\n\t"
  100644. "adcs r4, r4, r7\n\t"
  100645. "adc r5, r5, #0\n\t"
  100646. #else
  100647. "umull r6, r7, r8, r12\n\t"
  100648. "adds r3, r3, r6\n\t"
  100649. "adcs r4, r4, r7\n\t"
  100650. "adc r5, r5, #0\n\t"
  100651. #endif
  100652. /* A[9] * B[9] */
  100653. "ldr r11, [%[a], #36]\n\t"
  100654. "ldr r12, [%[b], #36]\n\t"
  100655. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100656. "lsl r6, r11, #16\n\t"
  100657. "lsl r7, r12, #16\n\t"
  100658. "lsr r6, r6, #16\n\t"
  100659. "lsr r7, r7, #16\n\t"
  100660. "mul r7, r6, r7\n\t"
  100661. "adds r3, r3, r7\n\t"
  100662. "adcs r4, r4, #0\n\t"
  100663. "adc r5, r5, #0\n\t"
  100664. "lsr r7, r12, #16\n\t"
  100665. "mul r6, r7, r6\n\t"
  100666. "lsr r7, r6, #16\n\t"
  100667. "lsl r6, r6, #16\n\t"
  100668. "adds r3, r3, r6\n\t"
  100669. "adcs r4, r4, r7\n\t"
  100670. "adc r5, r5, #0\n\t"
  100671. "lsr r6, r11, #16\n\t"
  100672. "lsr r7, r12, #16\n\t"
  100673. "mul r7, r6, r7\n\t"
  100674. "adds r4, r4, r7\n\t"
  100675. "adc r5, r5, #0\n\t"
  100676. "lsl r7, r12, #16\n\t"
  100677. "lsr r7, r7, #16\n\t"
  100678. "mul r6, r7, r6\n\t"
  100679. "lsr r7, r6, #16\n\t"
  100680. "lsl r6, r6, #16\n\t"
  100681. "adds r3, r3, r6\n\t"
  100682. "adcs r4, r4, r7\n\t"
  100683. "adc r5, r5, #0\n\t"
  100684. #else
  100685. "umull r6, r7, r11, r12\n\t"
  100686. "adds r3, r3, r6\n\t"
  100687. "adcs r4, r4, r7\n\t"
  100688. "adc r5, r5, #0\n\t"
  100689. #endif
  100690. /* A[8] * B[10] */
  100691. "ldr r8, [%[a], #32]\n\t"
  100692. "ldr r9, [%[b], #40]\n\t"
  100693. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100694. "lsl r6, r8, #16\n\t"
  100695. "lsl r7, r9, #16\n\t"
  100696. "lsr r6, r6, #16\n\t"
  100697. "lsr r7, r7, #16\n\t"
  100698. "mul r7, r6, r7\n\t"
  100699. "adds r3, r3, r7\n\t"
  100700. "adcs r4, r4, #0\n\t"
  100701. "adc r5, r5, #0\n\t"
  100702. "lsr r7, r9, #16\n\t"
  100703. "mul r6, r7, r6\n\t"
  100704. "lsr r7, r6, #16\n\t"
  100705. "lsl r6, r6, #16\n\t"
  100706. "adds r3, r3, r6\n\t"
  100707. "adcs r4, r4, r7\n\t"
  100708. "adc r5, r5, #0\n\t"
  100709. "lsr r6, r8, #16\n\t"
  100710. "lsr r7, r9, #16\n\t"
  100711. "mul r7, r6, r7\n\t"
  100712. "adds r4, r4, r7\n\t"
  100713. "adc r5, r5, #0\n\t"
  100714. "lsl r7, r9, #16\n\t"
  100715. "lsr r7, r7, #16\n\t"
  100716. "mul r6, r7, r6\n\t"
  100717. "lsr r7, r6, #16\n\t"
  100718. "lsl r6, r6, #16\n\t"
  100719. "adds r3, r3, r6\n\t"
  100720. "adcs r4, r4, r7\n\t"
  100721. "adc r5, r5, #0\n\t"
  100722. #else
  100723. "umull r6, r7, r8, r9\n\t"
  100724. "adds r3, r3, r6\n\t"
  100725. "adcs r4, r4, r7\n\t"
  100726. "adc r5, r5, #0\n\t"
  100727. #endif
  100728. /* A[7] * B[11] */
  100729. "ldr r8, [%[a], #28]\n\t"
  100730. "ldr r9, [%[b], #44]\n\t"
  100731. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100732. "lsl r6, r8, #16\n\t"
  100733. "lsl r7, r9, #16\n\t"
  100734. "lsr r6, r6, #16\n\t"
  100735. "lsr r7, r7, #16\n\t"
  100736. "mul r7, r6, r7\n\t"
  100737. "adds r3, r3, r7\n\t"
  100738. "adcs r4, r4, #0\n\t"
  100739. "adc r5, r5, #0\n\t"
  100740. "lsr r7, r9, #16\n\t"
  100741. "mul r6, r7, r6\n\t"
  100742. "lsr r7, r6, #16\n\t"
  100743. "lsl r6, r6, #16\n\t"
  100744. "adds r3, r3, r6\n\t"
  100745. "adcs r4, r4, r7\n\t"
  100746. "adc r5, r5, #0\n\t"
  100747. "lsr r6, r8, #16\n\t"
  100748. "lsr r7, r9, #16\n\t"
  100749. "mul r7, r6, r7\n\t"
  100750. "adds r4, r4, r7\n\t"
  100751. "adc r5, r5, #0\n\t"
  100752. "lsl r7, r9, #16\n\t"
  100753. "lsr r7, r7, #16\n\t"
  100754. "mul r6, r7, r6\n\t"
  100755. "lsr r7, r6, #16\n\t"
  100756. "lsl r6, r6, #16\n\t"
  100757. "adds r3, r3, r6\n\t"
  100758. "adcs r4, r4, r7\n\t"
  100759. "adc r5, r5, #0\n\t"
  100760. #else
  100761. "umull r6, r7, r8, r9\n\t"
  100762. "adds r3, r3, r6\n\t"
  100763. "adcs r4, r4, r7\n\t"
  100764. "adc r5, r5, #0\n\t"
  100765. #endif
  100766. /* A[6] * B[12] */
  100767. "ldr r8, [%[a], #24]\n\t"
  100768. "ldr r9, [%[b], #48]\n\t"
  100769. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100770. "lsl r6, r8, #16\n\t"
  100771. "lsl r7, r9, #16\n\t"
  100772. "lsr r6, r6, #16\n\t"
  100773. "lsr r7, r7, #16\n\t"
  100774. "mul r7, r6, r7\n\t"
  100775. "adds r3, r3, r7\n\t"
  100776. "adcs r4, r4, #0\n\t"
  100777. "adc r5, r5, #0\n\t"
  100778. "lsr r7, r9, #16\n\t"
  100779. "mul r6, r7, r6\n\t"
  100780. "lsr r7, r6, #16\n\t"
  100781. "lsl r6, r6, #16\n\t"
  100782. "adds r3, r3, r6\n\t"
  100783. "adcs r4, r4, r7\n\t"
  100784. "adc r5, r5, #0\n\t"
  100785. "lsr r6, r8, #16\n\t"
  100786. "lsr r7, r9, #16\n\t"
  100787. "mul r7, r6, r7\n\t"
  100788. "adds r4, r4, r7\n\t"
  100789. "adc r5, r5, #0\n\t"
  100790. "lsl r7, r9, #16\n\t"
  100791. "lsr r7, r7, #16\n\t"
  100792. "mul r6, r7, r6\n\t"
  100793. "lsr r7, r6, #16\n\t"
  100794. "lsl r6, r6, #16\n\t"
  100795. "adds r3, r3, r6\n\t"
  100796. "adcs r4, r4, r7\n\t"
  100797. "adc r5, r5, #0\n\t"
  100798. #else
  100799. "umull r6, r7, r8, r9\n\t"
  100800. "adds r3, r3, r6\n\t"
  100801. "adcs r4, r4, r7\n\t"
  100802. "adc r5, r5, #0\n\t"
  100803. #endif
  100804. /* A[5] * B[13] */
  100805. "ldr r8, [%[a], #20]\n\t"
  100806. "ldr r9, [%[b], #52]\n\t"
  100807. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100808. "lsl r6, r8, #16\n\t"
  100809. "lsl r7, r9, #16\n\t"
  100810. "lsr r6, r6, #16\n\t"
  100811. "lsr r7, r7, #16\n\t"
  100812. "mul r7, r6, r7\n\t"
  100813. "adds r3, r3, r7\n\t"
  100814. "adcs r4, r4, #0\n\t"
  100815. "adc r5, r5, #0\n\t"
  100816. "lsr r7, r9, #16\n\t"
  100817. "mul r6, r7, r6\n\t"
  100818. "lsr r7, r6, #16\n\t"
  100819. "lsl r6, r6, #16\n\t"
  100820. "adds r3, r3, r6\n\t"
  100821. "adcs r4, r4, r7\n\t"
  100822. "adc r5, r5, #0\n\t"
  100823. "lsr r6, r8, #16\n\t"
  100824. "lsr r7, r9, #16\n\t"
  100825. "mul r7, r6, r7\n\t"
  100826. "adds r4, r4, r7\n\t"
  100827. "adc r5, r5, #0\n\t"
  100828. "lsl r7, r9, #16\n\t"
  100829. "lsr r7, r7, #16\n\t"
  100830. "mul r6, r7, r6\n\t"
  100831. "lsr r7, r6, #16\n\t"
  100832. "lsl r6, r6, #16\n\t"
  100833. "adds r3, r3, r6\n\t"
  100834. "adcs r4, r4, r7\n\t"
  100835. "adc r5, r5, #0\n\t"
  100836. #else
  100837. "umull r6, r7, r8, r9\n\t"
  100838. "adds r3, r3, r6\n\t"
  100839. "adcs r4, r4, r7\n\t"
  100840. "adc r5, r5, #0\n\t"
  100841. #endif
  100842. /* A[4] * B[14] */
  100843. "ldr r8, [%[a], #16]\n\t"
  100844. "ldr r9, [%[b], #56]\n\t"
  100845. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100846. "lsl r6, r8, #16\n\t"
  100847. "lsl r7, r9, #16\n\t"
  100848. "lsr r6, r6, #16\n\t"
  100849. "lsr r7, r7, #16\n\t"
  100850. "mul r7, r6, r7\n\t"
  100851. "adds r3, r3, r7\n\t"
  100852. "adcs r4, r4, #0\n\t"
  100853. "adc r5, r5, #0\n\t"
  100854. "lsr r7, r9, #16\n\t"
  100855. "mul r6, r7, r6\n\t"
  100856. "lsr r7, r6, #16\n\t"
  100857. "lsl r6, r6, #16\n\t"
  100858. "adds r3, r3, r6\n\t"
  100859. "adcs r4, r4, r7\n\t"
  100860. "adc r5, r5, #0\n\t"
  100861. "lsr r6, r8, #16\n\t"
  100862. "lsr r7, r9, #16\n\t"
  100863. "mul r7, r6, r7\n\t"
  100864. "adds r4, r4, r7\n\t"
  100865. "adc r5, r5, #0\n\t"
  100866. "lsl r7, r9, #16\n\t"
  100867. "lsr r7, r7, #16\n\t"
  100868. "mul r6, r7, r6\n\t"
  100869. "lsr r7, r6, #16\n\t"
  100870. "lsl r6, r6, #16\n\t"
  100871. "adds r3, r3, r6\n\t"
  100872. "adcs r4, r4, r7\n\t"
  100873. "adc r5, r5, #0\n\t"
  100874. #else
  100875. "umull r6, r7, r8, r9\n\t"
  100876. "adds r3, r3, r6\n\t"
  100877. "adcs r4, r4, r7\n\t"
  100878. "adc r5, r5, #0\n\t"
  100879. #endif
  100880. /* A[3] * B[15] */
  100881. "ldr r8, [%[a], #12]\n\t"
  100882. "ldr r9, [%[b], #60]\n\t"
  100883. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100884. "lsl r6, r8, #16\n\t"
  100885. "lsl r7, r9, #16\n\t"
  100886. "lsr r6, r6, #16\n\t"
  100887. "lsr r7, r7, #16\n\t"
  100888. "mul r7, r6, r7\n\t"
  100889. "adds r3, r3, r7\n\t"
  100890. "adcs r4, r4, #0\n\t"
  100891. "adc r5, r5, #0\n\t"
  100892. "lsr r7, r9, #16\n\t"
  100893. "mul r6, r7, r6\n\t"
  100894. "lsr r7, r6, #16\n\t"
  100895. "lsl r6, r6, #16\n\t"
  100896. "adds r3, r3, r6\n\t"
  100897. "adcs r4, r4, r7\n\t"
  100898. "adc r5, r5, #0\n\t"
  100899. "lsr r6, r8, #16\n\t"
  100900. "lsr r7, r9, #16\n\t"
  100901. "mul r7, r6, r7\n\t"
  100902. "adds r4, r4, r7\n\t"
  100903. "adc r5, r5, #0\n\t"
  100904. "lsl r7, r9, #16\n\t"
  100905. "lsr r7, r7, #16\n\t"
  100906. "mul r6, r7, r6\n\t"
  100907. "lsr r7, r6, #16\n\t"
  100908. "lsl r6, r6, #16\n\t"
  100909. "adds r3, r3, r6\n\t"
  100910. "adcs r4, r4, r7\n\t"
  100911. "adc r5, r5, #0\n\t"
  100912. #else
  100913. "umull r6, r7, r8, r9\n\t"
  100914. "adds r3, r3, r6\n\t"
  100915. "adcs r4, r4, r7\n\t"
  100916. "adc r5, r5, #0\n\t"
  100917. #endif
  100918. /* A[2] * B[16] */
  100919. "ldr r8, [%[a], #8]\n\t"
  100920. "ldr r9, [%[b], #64]\n\t"
  100921. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100922. "lsl r6, r8, #16\n\t"
  100923. "lsl r7, r9, #16\n\t"
  100924. "lsr r6, r6, #16\n\t"
  100925. "lsr r7, r7, #16\n\t"
  100926. "mul r7, r6, r7\n\t"
  100927. "adds r3, r3, r7\n\t"
  100928. "adcs r4, r4, #0\n\t"
  100929. "adc r5, r5, #0\n\t"
  100930. "lsr r7, r9, #16\n\t"
  100931. "mul r6, r7, r6\n\t"
  100932. "lsr r7, r6, #16\n\t"
  100933. "lsl r6, r6, #16\n\t"
  100934. "adds r3, r3, r6\n\t"
  100935. "adcs r4, r4, r7\n\t"
  100936. "adc r5, r5, #0\n\t"
  100937. "lsr r6, r8, #16\n\t"
  100938. "lsr r7, r9, #16\n\t"
  100939. "mul r7, r6, r7\n\t"
  100940. "adds r4, r4, r7\n\t"
  100941. "adc r5, r5, #0\n\t"
  100942. "lsl r7, r9, #16\n\t"
  100943. "lsr r7, r7, #16\n\t"
  100944. "mul r6, r7, r6\n\t"
  100945. "lsr r7, r6, #16\n\t"
  100946. "lsl r6, r6, #16\n\t"
  100947. "adds r3, r3, r6\n\t"
  100948. "adcs r4, r4, r7\n\t"
  100949. "adc r5, r5, #0\n\t"
  100950. #else
  100951. "umull r6, r7, r8, r9\n\t"
  100952. "adds r3, r3, r6\n\t"
  100953. "adcs r4, r4, r7\n\t"
  100954. "adc r5, r5, #0\n\t"
  100955. #endif
  100956. "str r3, [%[r], #72]\n\t"
  100957. /* A[3] * B[16] */
  100958. "ldr r8, [%[a], #12]\n\t"
  100959. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  100960. "lsl r6, r8, #16\n\t"
  100961. "lsl r7, r9, #16\n\t"
  100962. "lsr r6, r6, #16\n\t"
  100963. "lsr r7, r7, #16\n\t"
  100964. "mul r7, r6, r7\n\t"
  100965. "adds r4, r4, r7\n\t"
  100966. "adcs r5, r5, #0\n\t"
  100967. "mov r3, #0\n\t"
  100968. "adc r3, r3, #0\n\t"
  100969. "lsr r7, r9, #16\n\t"
  100970. "mul r6, r7, r6\n\t"
  100971. "lsr r7, r6, #16\n\t"
  100972. "lsl r6, r6, #16\n\t"
  100973. "adds r4, r4, r6\n\t"
  100974. "adcs r5, r5, r7\n\t"
  100975. "adc r3, r3, #0\n\t"
  100976. "lsr r6, r8, #16\n\t"
  100977. "lsr r7, r9, #16\n\t"
  100978. "mul r7, r6, r7\n\t"
  100979. "adds r5, r5, r7\n\t"
  100980. "adc r3, r3, #0\n\t"
  100981. "lsl r7, r9, #16\n\t"
  100982. "lsr r7, r7, #16\n\t"
  100983. "mul r6, r7, r6\n\t"
  100984. "lsr r7, r6, #16\n\t"
  100985. "lsl r6, r6, #16\n\t"
  100986. "adds r4, r4, r6\n\t"
  100987. "adcs r5, r5, r7\n\t"
  100988. "adc r3, r3, #0\n\t"
  100989. #else
  100990. "umull r6, r7, r8, r9\n\t"
  100991. "adds r4, r4, r6\n\t"
  100992. "adcs r5, r5, r7\n\t"
  100993. "mov r3, #0\n\t"
  100994. "adc r3, r3, #0\n\t"
  100995. #endif
  100996. /* A[4] * B[15] */
  100997. "ldr r8, [%[a], #16]\n\t"
  100998. "ldr r9, [%[b], #60]\n\t"
  100999. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101000. "lsl r6, r8, #16\n\t"
  101001. "lsl r7, r9, #16\n\t"
  101002. "lsr r6, r6, #16\n\t"
  101003. "lsr r7, r7, #16\n\t"
  101004. "mul r7, r6, r7\n\t"
  101005. "adds r4, r4, r7\n\t"
  101006. "adcs r5, r5, #0\n\t"
  101007. "adc r3, r3, #0\n\t"
  101008. "lsr r7, r9, #16\n\t"
  101009. "mul r6, r7, r6\n\t"
  101010. "lsr r7, r6, #16\n\t"
  101011. "lsl r6, r6, #16\n\t"
  101012. "adds r4, r4, r6\n\t"
  101013. "adcs r5, r5, r7\n\t"
  101014. "adc r3, r3, #0\n\t"
  101015. "lsr r6, r8, #16\n\t"
  101016. "lsr r7, r9, #16\n\t"
  101017. "mul r7, r6, r7\n\t"
  101018. "adds r5, r5, r7\n\t"
  101019. "adc r3, r3, #0\n\t"
  101020. "lsl r7, r9, #16\n\t"
  101021. "lsr r7, r7, #16\n\t"
  101022. "mul r6, r7, r6\n\t"
  101023. "lsr r7, r6, #16\n\t"
  101024. "lsl r6, r6, #16\n\t"
  101025. "adds r4, r4, r6\n\t"
  101026. "adcs r5, r5, r7\n\t"
  101027. "adc r3, r3, #0\n\t"
  101028. #else
  101029. "umull r6, r7, r8, r9\n\t"
  101030. "adds r4, r4, r6\n\t"
  101031. "adcs r5, r5, r7\n\t"
  101032. "adc r3, r3, #0\n\t"
  101033. #endif
  101034. /* A[5] * B[14] */
  101035. "ldr r8, [%[a], #20]\n\t"
  101036. "ldr r9, [%[b], #56]\n\t"
  101037. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101038. "lsl r6, r8, #16\n\t"
  101039. "lsl r7, r9, #16\n\t"
  101040. "lsr r6, r6, #16\n\t"
  101041. "lsr r7, r7, #16\n\t"
  101042. "mul r7, r6, r7\n\t"
  101043. "adds r4, r4, r7\n\t"
  101044. "adcs r5, r5, #0\n\t"
  101045. "adc r3, r3, #0\n\t"
  101046. "lsr r7, r9, #16\n\t"
  101047. "mul r6, r7, r6\n\t"
  101048. "lsr r7, r6, #16\n\t"
  101049. "lsl r6, r6, #16\n\t"
  101050. "adds r4, r4, r6\n\t"
  101051. "adcs r5, r5, r7\n\t"
  101052. "adc r3, r3, #0\n\t"
  101053. "lsr r6, r8, #16\n\t"
  101054. "lsr r7, r9, #16\n\t"
  101055. "mul r7, r6, r7\n\t"
  101056. "adds r5, r5, r7\n\t"
  101057. "adc r3, r3, #0\n\t"
  101058. "lsl r7, r9, #16\n\t"
  101059. "lsr r7, r7, #16\n\t"
  101060. "mul r6, r7, r6\n\t"
  101061. "lsr r7, r6, #16\n\t"
  101062. "lsl r6, r6, #16\n\t"
  101063. "adds r4, r4, r6\n\t"
  101064. "adcs r5, r5, r7\n\t"
  101065. "adc r3, r3, #0\n\t"
  101066. #else
  101067. "umull r6, r7, r8, r9\n\t"
  101068. "adds r4, r4, r6\n\t"
  101069. "adcs r5, r5, r7\n\t"
  101070. "adc r3, r3, #0\n\t"
  101071. #endif
  101072. /* A[6] * B[13] */
  101073. "ldr r8, [%[a], #24]\n\t"
  101074. "ldr r9, [%[b], #52]\n\t"
  101075. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101076. "lsl r6, r8, #16\n\t"
  101077. "lsl r7, r9, #16\n\t"
  101078. "lsr r6, r6, #16\n\t"
  101079. "lsr r7, r7, #16\n\t"
  101080. "mul r7, r6, r7\n\t"
  101081. "adds r4, r4, r7\n\t"
  101082. "adcs r5, r5, #0\n\t"
  101083. "adc r3, r3, #0\n\t"
  101084. "lsr r7, r9, #16\n\t"
  101085. "mul r6, r7, r6\n\t"
  101086. "lsr r7, r6, #16\n\t"
  101087. "lsl r6, r6, #16\n\t"
  101088. "adds r4, r4, r6\n\t"
  101089. "adcs r5, r5, r7\n\t"
  101090. "adc r3, r3, #0\n\t"
  101091. "lsr r6, r8, #16\n\t"
  101092. "lsr r7, r9, #16\n\t"
  101093. "mul r7, r6, r7\n\t"
  101094. "adds r5, r5, r7\n\t"
  101095. "adc r3, r3, #0\n\t"
  101096. "lsl r7, r9, #16\n\t"
  101097. "lsr r7, r7, #16\n\t"
  101098. "mul r6, r7, r6\n\t"
  101099. "lsr r7, r6, #16\n\t"
  101100. "lsl r6, r6, #16\n\t"
  101101. "adds r4, r4, r6\n\t"
  101102. "adcs r5, r5, r7\n\t"
  101103. "adc r3, r3, #0\n\t"
  101104. #else
  101105. "umull r6, r7, r8, r9\n\t"
  101106. "adds r4, r4, r6\n\t"
  101107. "adcs r5, r5, r7\n\t"
  101108. "adc r3, r3, #0\n\t"
  101109. #endif
  101110. /* A[7] * B[12] */
  101111. "ldr r8, [%[a], #28]\n\t"
  101112. "ldr r9, [%[b], #48]\n\t"
  101113. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101114. "lsl r6, r8, #16\n\t"
  101115. "lsl r7, r9, #16\n\t"
  101116. "lsr r6, r6, #16\n\t"
  101117. "lsr r7, r7, #16\n\t"
  101118. "mul r7, r6, r7\n\t"
  101119. "adds r4, r4, r7\n\t"
  101120. "adcs r5, r5, #0\n\t"
  101121. "adc r3, r3, #0\n\t"
  101122. "lsr r7, r9, #16\n\t"
  101123. "mul r6, r7, r6\n\t"
  101124. "lsr r7, r6, #16\n\t"
  101125. "lsl r6, r6, #16\n\t"
  101126. "adds r4, r4, r6\n\t"
  101127. "adcs r5, r5, r7\n\t"
  101128. "adc r3, r3, #0\n\t"
  101129. "lsr r6, r8, #16\n\t"
  101130. "lsr r7, r9, #16\n\t"
  101131. "mul r7, r6, r7\n\t"
  101132. "adds r5, r5, r7\n\t"
  101133. "adc r3, r3, #0\n\t"
  101134. "lsl r7, r9, #16\n\t"
  101135. "lsr r7, r7, #16\n\t"
  101136. "mul r6, r7, r6\n\t"
  101137. "lsr r7, r6, #16\n\t"
  101138. "lsl r6, r6, #16\n\t"
  101139. "adds r4, r4, r6\n\t"
  101140. "adcs r5, r5, r7\n\t"
  101141. "adc r3, r3, #0\n\t"
  101142. #else
  101143. "umull r6, r7, r8, r9\n\t"
  101144. "adds r4, r4, r6\n\t"
  101145. "adcs r5, r5, r7\n\t"
  101146. "adc r3, r3, #0\n\t"
  101147. #endif
  101148. /* A[8] * B[11] */
  101149. "ldr r8, [%[a], #32]\n\t"
  101150. "ldr r9, [%[b], #44]\n\t"
  101151. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101152. "lsl r6, r8, #16\n\t"
  101153. "lsl r7, r9, #16\n\t"
  101154. "lsr r6, r6, #16\n\t"
  101155. "lsr r7, r7, #16\n\t"
  101156. "mul r7, r6, r7\n\t"
  101157. "adds r4, r4, r7\n\t"
  101158. "adcs r5, r5, #0\n\t"
  101159. "adc r3, r3, #0\n\t"
  101160. "lsr r7, r9, #16\n\t"
  101161. "mul r6, r7, r6\n\t"
  101162. "lsr r7, r6, #16\n\t"
  101163. "lsl r6, r6, #16\n\t"
  101164. "adds r4, r4, r6\n\t"
  101165. "adcs r5, r5, r7\n\t"
  101166. "adc r3, r3, #0\n\t"
  101167. "lsr r6, r8, #16\n\t"
  101168. "lsr r7, r9, #16\n\t"
  101169. "mul r7, r6, r7\n\t"
  101170. "adds r5, r5, r7\n\t"
  101171. "adc r3, r3, #0\n\t"
  101172. "lsl r7, r9, #16\n\t"
  101173. "lsr r7, r7, #16\n\t"
  101174. "mul r6, r7, r6\n\t"
  101175. "lsr r7, r6, #16\n\t"
  101176. "lsl r6, r6, #16\n\t"
  101177. "adds r4, r4, r6\n\t"
  101178. "adcs r5, r5, r7\n\t"
  101179. "adc r3, r3, #0\n\t"
  101180. #else
  101181. "umull r6, r7, r8, r9\n\t"
  101182. "adds r4, r4, r6\n\t"
  101183. "adcs r5, r5, r7\n\t"
  101184. "adc r3, r3, #0\n\t"
  101185. #endif
  101186. /* A[9] * B[10] */
  101187. "ldr r9, [%[b], #40]\n\t"
  101188. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101189. "lsl r6, r11, #16\n\t"
  101190. "lsl r7, r9, #16\n\t"
  101191. "lsr r6, r6, #16\n\t"
  101192. "lsr r7, r7, #16\n\t"
  101193. "mul r7, r6, r7\n\t"
  101194. "adds r4, r4, r7\n\t"
  101195. "adcs r5, r5, #0\n\t"
  101196. "adc r3, r3, #0\n\t"
  101197. "lsr r7, r9, #16\n\t"
  101198. "mul r6, r7, r6\n\t"
  101199. "lsr r7, r6, #16\n\t"
  101200. "lsl r6, r6, #16\n\t"
  101201. "adds r4, r4, r6\n\t"
  101202. "adcs r5, r5, r7\n\t"
  101203. "adc r3, r3, #0\n\t"
  101204. "lsr r6, r11, #16\n\t"
  101205. "lsr r7, r9, #16\n\t"
  101206. "mul r7, r6, r7\n\t"
  101207. "adds r5, r5, r7\n\t"
  101208. "adc r3, r3, #0\n\t"
  101209. "lsl r7, r9, #16\n\t"
  101210. "lsr r7, r7, #16\n\t"
  101211. "mul r6, r7, r6\n\t"
  101212. "lsr r7, r6, #16\n\t"
  101213. "lsl r6, r6, #16\n\t"
  101214. "adds r4, r4, r6\n\t"
  101215. "adcs r5, r5, r7\n\t"
  101216. "adc r3, r3, #0\n\t"
  101217. #else
  101218. "umull r6, r7, r11, r9\n\t"
  101219. "adds r4, r4, r6\n\t"
  101220. "adcs r5, r5, r7\n\t"
  101221. "adc r3, r3, #0\n\t"
  101222. #endif
  101223. /* A[10] * B[9] */
  101224. "ldr r8, [%[a], #40]\n\t"
  101225. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101226. "lsl r6, r8, #16\n\t"
  101227. "lsl r7, r12, #16\n\t"
  101228. "lsr r6, r6, #16\n\t"
  101229. "lsr r7, r7, #16\n\t"
  101230. "mul r7, r6, r7\n\t"
  101231. "adds r4, r4, r7\n\t"
  101232. "adcs r5, r5, #0\n\t"
  101233. "adc r3, r3, #0\n\t"
  101234. "lsr r7, r12, #16\n\t"
  101235. "mul r6, r7, r6\n\t"
  101236. "lsr r7, r6, #16\n\t"
  101237. "lsl r6, r6, #16\n\t"
  101238. "adds r4, r4, r6\n\t"
  101239. "adcs r5, r5, r7\n\t"
  101240. "adc r3, r3, #0\n\t"
  101241. "lsr r6, r8, #16\n\t"
  101242. "lsr r7, r12, #16\n\t"
  101243. "mul r7, r6, r7\n\t"
  101244. "adds r5, r5, r7\n\t"
  101245. "adc r3, r3, #0\n\t"
  101246. "lsl r7, r12, #16\n\t"
  101247. "lsr r7, r7, #16\n\t"
  101248. "mul r6, r7, r6\n\t"
  101249. "lsr r7, r6, #16\n\t"
  101250. "lsl r6, r6, #16\n\t"
  101251. "adds r4, r4, r6\n\t"
  101252. "adcs r5, r5, r7\n\t"
  101253. "adc r3, r3, #0\n\t"
  101254. #else
  101255. "umull r6, r7, r8, r12\n\t"
  101256. "adds r4, r4, r6\n\t"
  101257. "adcs r5, r5, r7\n\t"
  101258. "adc r3, r3, #0\n\t"
  101259. #endif
  101260. /* A[11] * B[8] */
  101261. "ldr r8, [%[a], #44]\n\t"
  101262. "ldr r9, [%[b], #32]\n\t"
  101263. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101264. "lsl r6, r8, #16\n\t"
  101265. "lsl r7, r9, #16\n\t"
  101266. "lsr r6, r6, #16\n\t"
  101267. "lsr r7, r7, #16\n\t"
  101268. "mul r7, r6, r7\n\t"
  101269. "adds r4, r4, r7\n\t"
  101270. "adcs r5, r5, #0\n\t"
  101271. "adc r3, r3, #0\n\t"
  101272. "lsr r7, r9, #16\n\t"
  101273. "mul r6, r7, r6\n\t"
  101274. "lsr r7, r6, #16\n\t"
  101275. "lsl r6, r6, #16\n\t"
  101276. "adds r4, r4, r6\n\t"
  101277. "adcs r5, r5, r7\n\t"
  101278. "adc r3, r3, #0\n\t"
  101279. "lsr r6, r8, #16\n\t"
  101280. "lsr r7, r9, #16\n\t"
  101281. "mul r7, r6, r7\n\t"
  101282. "adds r5, r5, r7\n\t"
  101283. "adc r3, r3, #0\n\t"
  101284. "lsl r7, r9, #16\n\t"
  101285. "lsr r7, r7, #16\n\t"
  101286. "mul r6, r7, r6\n\t"
  101287. "lsr r7, r6, #16\n\t"
  101288. "lsl r6, r6, #16\n\t"
  101289. "adds r4, r4, r6\n\t"
  101290. "adcs r5, r5, r7\n\t"
  101291. "adc r3, r3, #0\n\t"
  101292. #else
  101293. "umull r6, r7, r8, r9\n\t"
  101294. "adds r4, r4, r6\n\t"
  101295. "adcs r5, r5, r7\n\t"
  101296. "adc r3, r3, #0\n\t"
  101297. #endif
  101298. /* A[12] * B[7] */
  101299. "ldr r8, [%[a], #48]\n\t"
  101300. "ldr r9, [%[b], #28]\n\t"
  101301. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101302. "lsl r6, r8, #16\n\t"
  101303. "lsl r7, r9, #16\n\t"
  101304. "lsr r6, r6, #16\n\t"
  101305. "lsr r7, r7, #16\n\t"
  101306. "mul r7, r6, r7\n\t"
  101307. "adds r4, r4, r7\n\t"
  101308. "adcs r5, r5, #0\n\t"
  101309. "adc r3, r3, #0\n\t"
  101310. "lsr r7, r9, #16\n\t"
  101311. "mul r6, r7, r6\n\t"
  101312. "lsr r7, r6, #16\n\t"
  101313. "lsl r6, r6, #16\n\t"
  101314. "adds r4, r4, r6\n\t"
  101315. "adcs r5, r5, r7\n\t"
  101316. "adc r3, r3, #0\n\t"
  101317. "lsr r6, r8, #16\n\t"
  101318. "lsr r7, r9, #16\n\t"
  101319. "mul r7, r6, r7\n\t"
  101320. "adds r5, r5, r7\n\t"
  101321. "adc r3, r3, #0\n\t"
  101322. "lsl r7, r9, #16\n\t"
  101323. "lsr r7, r7, #16\n\t"
  101324. "mul r6, r7, r6\n\t"
  101325. "lsr r7, r6, #16\n\t"
  101326. "lsl r6, r6, #16\n\t"
  101327. "adds r4, r4, r6\n\t"
  101328. "adcs r5, r5, r7\n\t"
  101329. "adc r3, r3, #0\n\t"
  101330. #else
  101331. "umull r6, r7, r8, r9\n\t"
  101332. "adds r4, r4, r6\n\t"
  101333. "adcs r5, r5, r7\n\t"
  101334. "adc r3, r3, #0\n\t"
  101335. #endif
  101336. /* A[13] * B[6] */
  101337. "ldr r8, [%[a], #52]\n\t"
  101338. "ldr r9, [%[b], #24]\n\t"
  101339. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101340. "lsl r6, r8, #16\n\t"
  101341. "lsl r7, r9, #16\n\t"
  101342. "lsr r6, r6, #16\n\t"
  101343. "lsr r7, r7, #16\n\t"
  101344. "mul r7, r6, r7\n\t"
  101345. "adds r4, r4, r7\n\t"
  101346. "adcs r5, r5, #0\n\t"
  101347. "adc r3, r3, #0\n\t"
  101348. "lsr r7, r9, #16\n\t"
  101349. "mul r6, r7, r6\n\t"
  101350. "lsr r7, r6, #16\n\t"
  101351. "lsl r6, r6, #16\n\t"
  101352. "adds r4, r4, r6\n\t"
  101353. "adcs r5, r5, r7\n\t"
  101354. "adc r3, r3, #0\n\t"
  101355. "lsr r6, r8, #16\n\t"
  101356. "lsr r7, r9, #16\n\t"
  101357. "mul r7, r6, r7\n\t"
  101358. "adds r5, r5, r7\n\t"
  101359. "adc r3, r3, #0\n\t"
  101360. "lsl r7, r9, #16\n\t"
  101361. "lsr r7, r7, #16\n\t"
  101362. "mul r6, r7, r6\n\t"
  101363. "lsr r7, r6, #16\n\t"
  101364. "lsl r6, r6, #16\n\t"
  101365. "adds r4, r4, r6\n\t"
  101366. "adcs r5, r5, r7\n\t"
  101367. "adc r3, r3, #0\n\t"
  101368. #else
  101369. "umull r6, r7, r8, r9\n\t"
  101370. "adds r4, r4, r6\n\t"
  101371. "adcs r5, r5, r7\n\t"
  101372. "adc r3, r3, #0\n\t"
  101373. #endif
  101374. /* A[14] * B[5] */
  101375. "ldr r8, [%[a], #56]\n\t"
  101376. "ldr r9, [%[b], #20]\n\t"
  101377. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101378. "lsl r6, r8, #16\n\t"
  101379. "lsl r7, r9, #16\n\t"
  101380. "lsr r6, r6, #16\n\t"
  101381. "lsr r7, r7, #16\n\t"
  101382. "mul r7, r6, r7\n\t"
  101383. "adds r4, r4, r7\n\t"
  101384. "adcs r5, r5, #0\n\t"
  101385. "adc r3, r3, #0\n\t"
  101386. "lsr r7, r9, #16\n\t"
  101387. "mul r6, r7, r6\n\t"
  101388. "lsr r7, r6, #16\n\t"
  101389. "lsl r6, r6, #16\n\t"
  101390. "adds r4, r4, r6\n\t"
  101391. "adcs r5, r5, r7\n\t"
  101392. "adc r3, r3, #0\n\t"
  101393. "lsr r6, r8, #16\n\t"
  101394. "lsr r7, r9, #16\n\t"
  101395. "mul r7, r6, r7\n\t"
  101396. "adds r5, r5, r7\n\t"
  101397. "adc r3, r3, #0\n\t"
  101398. "lsl r7, r9, #16\n\t"
  101399. "lsr r7, r7, #16\n\t"
  101400. "mul r6, r7, r6\n\t"
  101401. "lsr r7, r6, #16\n\t"
  101402. "lsl r6, r6, #16\n\t"
  101403. "adds r4, r4, r6\n\t"
  101404. "adcs r5, r5, r7\n\t"
  101405. "adc r3, r3, #0\n\t"
  101406. #else
  101407. "umull r6, r7, r8, r9\n\t"
  101408. "adds r4, r4, r6\n\t"
  101409. "adcs r5, r5, r7\n\t"
  101410. "adc r3, r3, #0\n\t"
  101411. #endif
  101412. /* A[15] * B[4] */
  101413. "ldr r8, [%[a], #60]\n\t"
  101414. "ldr r9, [%[b], #16]\n\t"
  101415. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101416. "lsl r6, r8, #16\n\t"
  101417. "lsl r7, r9, #16\n\t"
  101418. "lsr r6, r6, #16\n\t"
  101419. "lsr r7, r7, #16\n\t"
  101420. "mul r7, r6, r7\n\t"
  101421. "adds r4, r4, r7\n\t"
  101422. "adcs r5, r5, #0\n\t"
  101423. "adc r3, r3, #0\n\t"
  101424. "lsr r7, r9, #16\n\t"
  101425. "mul r6, r7, r6\n\t"
  101426. "lsr r7, r6, #16\n\t"
  101427. "lsl r6, r6, #16\n\t"
  101428. "adds r4, r4, r6\n\t"
  101429. "adcs r5, r5, r7\n\t"
  101430. "adc r3, r3, #0\n\t"
  101431. "lsr r6, r8, #16\n\t"
  101432. "lsr r7, r9, #16\n\t"
  101433. "mul r7, r6, r7\n\t"
  101434. "adds r5, r5, r7\n\t"
  101435. "adc r3, r3, #0\n\t"
  101436. "lsl r7, r9, #16\n\t"
  101437. "lsr r7, r7, #16\n\t"
  101438. "mul r6, r7, r6\n\t"
  101439. "lsr r7, r6, #16\n\t"
  101440. "lsl r6, r6, #16\n\t"
  101441. "adds r4, r4, r6\n\t"
  101442. "adcs r5, r5, r7\n\t"
  101443. "adc r3, r3, #0\n\t"
  101444. #else
  101445. "umull r6, r7, r8, r9\n\t"
  101446. "adds r4, r4, r6\n\t"
  101447. "adcs r5, r5, r7\n\t"
  101448. "adc r3, r3, #0\n\t"
  101449. #endif
  101450. /* A[16] * B[3] */
  101451. "ldr r8, [%[a], #64]\n\t"
  101452. "ldr r9, [%[b], #12]\n\t"
  101453. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101454. "lsl r6, r8, #16\n\t"
  101455. "lsl r7, r9, #16\n\t"
  101456. "lsr r6, r6, #16\n\t"
  101457. "lsr r7, r7, #16\n\t"
  101458. "mul r7, r6, r7\n\t"
  101459. "adds r4, r4, r7\n\t"
  101460. "adcs r5, r5, #0\n\t"
  101461. "adc r3, r3, #0\n\t"
  101462. "lsr r7, r9, #16\n\t"
  101463. "mul r6, r7, r6\n\t"
  101464. "lsr r7, r6, #16\n\t"
  101465. "lsl r6, r6, #16\n\t"
  101466. "adds r4, r4, r6\n\t"
  101467. "adcs r5, r5, r7\n\t"
  101468. "adc r3, r3, #0\n\t"
  101469. "lsr r6, r8, #16\n\t"
  101470. "lsr r7, r9, #16\n\t"
  101471. "mul r7, r6, r7\n\t"
  101472. "adds r5, r5, r7\n\t"
  101473. "adc r3, r3, #0\n\t"
  101474. "lsl r7, r9, #16\n\t"
  101475. "lsr r7, r7, #16\n\t"
  101476. "mul r6, r7, r6\n\t"
  101477. "lsr r7, r6, #16\n\t"
  101478. "lsl r6, r6, #16\n\t"
  101479. "adds r4, r4, r6\n\t"
  101480. "adcs r5, r5, r7\n\t"
  101481. "adc r3, r3, #0\n\t"
  101482. #else
  101483. "umull r6, r7, r8, r9\n\t"
  101484. "adds r4, r4, r6\n\t"
  101485. "adcs r5, r5, r7\n\t"
  101486. "adc r3, r3, #0\n\t"
  101487. #endif
  101488. "str r4, [%[r], #76]\n\t"
  101489. /* A[16] * B[4] */
  101490. "ldr r9, [%[b], #16]\n\t"
  101491. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101492. "lsl r6, r8, #16\n\t"
  101493. "lsl r7, r9, #16\n\t"
  101494. "lsr r6, r6, #16\n\t"
  101495. "lsr r7, r7, #16\n\t"
  101496. "mul r7, r6, r7\n\t"
  101497. "adds r5, r5, r7\n\t"
  101498. "adcs r3, r3, #0\n\t"
  101499. "mov r4, #0\n\t"
  101500. "adc r4, r4, #0\n\t"
  101501. "lsr r7, r9, #16\n\t"
  101502. "mul r6, r7, r6\n\t"
  101503. "lsr r7, r6, #16\n\t"
  101504. "lsl r6, r6, #16\n\t"
  101505. "adds r5, r5, r6\n\t"
  101506. "adcs r3, r3, r7\n\t"
  101507. "adc r4, r4, #0\n\t"
  101508. "lsr r6, r8, #16\n\t"
  101509. "lsr r7, r9, #16\n\t"
  101510. "mul r7, r6, r7\n\t"
  101511. "adds r3, r3, r7\n\t"
  101512. "adc r4, r4, #0\n\t"
  101513. "lsl r7, r9, #16\n\t"
  101514. "lsr r7, r7, #16\n\t"
  101515. "mul r6, r7, r6\n\t"
  101516. "lsr r7, r6, #16\n\t"
  101517. "lsl r6, r6, #16\n\t"
  101518. "adds r5, r5, r6\n\t"
  101519. "adcs r3, r3, r7\n\t"
  101520. "adc r4, r4, #0\n\t"
  101521. #else
  101522. "umull r6, r7, r8, r9\n\t"
  101523. "adds r5, r5, r6\n\t"
  101524. "adcs r3, r3, r7\n\t"
  101525. "mov r4, #0\n\t"
  101526. "adc r4, r4, #0\n\t"
  101527. #endif
  101528. /* A[15] * B[5] */
  101529. "ldr r8, [%[a], #60]\n\t"
  101530. "ldr r9, [%[b], #20]\n\t"
  101531. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101532. "lsl r6, r8, #16\n\t"
  101533. "lsl r7, r9, #16\n\t"
  101534. "lsr r6, r6, #16\n\t"
  101535. "lsr r7, r7, #16\n\t"
  101536. "mul r7, r6, r7\n\t"
  101537. "adds r5, r5, r7\n\t"
  101538. "adcs r3, r3, #0\n\t"
  101539. "adc r4, r4, #0\n\t"
  101540. "lsr r7, r9, #16\n\t"
  101541. "mul r6, r7, r6\n\t"
  101542. "lsr r7, r6, #16\n\t"
  101543. "lsl r6, r6, #16\n\t"
  101544. "adds r5, r5, r6\n\t"
  101545. "adcs r3, r3, r7\n\t"
  101546. "adc r4, r4, #0\n\t"
  101547. "lsr r6, r8, #16\n\t"
  101548. "lsr r7, r9, #16\n\t"
  101549. "mul r7, r6, r7\n\t"
  101550. "adds r3, r3, r7\n\t"
  101551. "adc r4, r4, #0\n\t"
  101552. "lsl r7, r9, #16\n\t"
  101553. "lsr r7, r7, #16\n\t"
  101554. "mul r6, r7, r6\n\t"
  101555. "lsr r7, r6, #16\n\t"
  101556. "lsl r6, r6, #16\n\t"
  101557. "adds r5, r5, r6\n\t"
  101558. "adcs r3, r3, r7\n\t"
  101559. "adc r4, r4, #0\n\t"
  101560. #else
  101561. "umull r6, r7, r8, r9\n\t"
  101562. "adds r5, r5, r6\n\t"
  101563. "adcs r3, r3, r7\n\t"
  101564. "adc r4, r4, #0\n\t"
  101565. #endif
  101566. /* A[14] * B[6] */
  101567. "ldr r8, [%[a], #56]\n\t"
  101568. "ldr r9, [%[b], #24]\n\t"
  101569. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101570. "lsl r6, r8, #16\n\t"
  101571. "lsl r7, r9, #16\n\t"
  101572. "lsr r6, r6, #16\n\t"
  101573. "lsr r7, r7, #16\n\t"
  101574. "mul r7, r6, r7\n\t"
  101575. "adds r5, r5, r7\n\t"
  101576. "adcs r3, r3, #0\n\t"
  101577. "adc r4, r4, #0\n\t"
  101578. "lsr r7, r9, #16\n\t"
  101579. "mul r6, r7, r6\n\t"
  101580. "lsr r7, r6, #16\n\t"
  101581. "lsl r6, r6, #16\n\t"
  101582. "adds r5, r5, r6\n\t"
  101583. "adcs r3, r3, r7\n\t"
  101584. "adc r4, r4, #0\n\t"
  101585. "lsr r6, r8, #16\n\t"
  101586. "lsr r7, r9, #16\n\t"
  101587. "mul r7, r6, r7\n\t"
  101588. "adds r3, r3, r7\n\t"
  101589. "adc r4, r4, #0\n\t"
  101590. "lsl r7, r9, #16\n\t"
  101591. "lsr r7, r7, #16\n\t"
  101592. "mul r6, r7, r6\n\t"
  101593. "lsr r7, r6, #16\n\t"
  101594. "lsl r6, r6, #16\n\t"
  101595. "adds r5, r5, r6\n\t"
  101596. "adcs r3, r3, r7\n\t"
  101597. "adc r4, r4, #0\n\t"
  101598. #else
  101599. "umull r6, r7, r8, r9\n\t"
  101600. "adds r5, r5, r6\n\t"
  101601. "adcs r3, r3, r7\n\t"
  101602. "adc r4, r4, #0\n\t"
  101603. #endif
  101604. /* A[13] * B[7] */
  101605. "ldr r8, [%[a], #52]\n\t"
  101606. "ldr r9, [%[b], #28]\n\t"
  101607. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101608. "lsl r6, r8, #16\n\t"
  101609. "lsl r7, r9, #16\n\t"
  101610. "lsr r6, r6, #16\n\t"
  101611. "lsr r7, r7, #16\n\t"
  101612. "mul r7, r6, r7\n\t"
  101613. "adds r5, r5, r7\n\t"
  101614. "adcs r3, r3, #0\n\t"
  101615. "adc r4, r4, #0\n\t"
  101616. "lsr r7, r9, #16\n\t"
  101617. "mul r6, r7, r6\n\t"
  101618. "lsr r7, r6, #16\n\t"
  101619. "lsl r6, r6, #16\n\t"
  101620. "adds r5, r5, r6\n\t"
  101621. "adcs r3, r3, r7\n\t"
  101622. "adc r4, r4, #0\n\t"
  101623. "lsr r6, r8, #16\n\t"
  101624. "lsr r7, r9, #16\n\t"
  101625. "mul r7, r6, r7\n\t"
  101626. "adds r3, r3, r7\n\t"
  101627. "adc r4, r4, #0\n\t"
  101628. "lsl r7, r9, #16\n\t"
  101629. "lsr r7, r7, #16\n\t"
  101630. "mul r6, r7, r6\n\t"
  101631. "lsr r7, r6, #16\n\t"
  101632. "lsl r6, r6, #16\n\t"
  101633. "adds r5, r5, r6\n\t"
  101634. "adcs r3, r3, r7\n\t"
  101635. "adc r4, r4, #0\n\t"
  101636. #else
  101637. "umull r6, r7, r8, r9\n\t"
  101638. "adds r5, r5, r6\n\t"
  101639. "adcs r3, r3, r7\n\t"
  101640. "adc r4, r4, #0\n\t"
  101641. #endif
  101642. /* A[12] * B[8] */
  101643. "ldr r8, [%[a], #48]\n\t"
  101644. "ldr r9, [%[b], #32]\n\t"
  101645. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101646. "lsl r6, r8, #16\n\t"
  101647. "lsl r7, r9, #16\n\t"
  101648. "lsr r6, r6, #16\n\t"
  101649. "lsr r7, r7, #16\n\t"
  101650. "mul r7, r6, r7\n\t"
  101651. "adds r5, r5, r7\n\t"
  101652. "adcs r3, r3, #0\n\t"
  101653. "adc r4, r4, #0\n\t"
  101654. "lsr r7, r9, #16\n\t"
  101655. "mul r6, r7, r6\n\t"
  101656. "lsr r7, r6, #16\n\t"
  101657. "lsl r6, r6, #16\n\t"
  101658. "adds r5, r5, r6\n\t"
  101659. "adcs r3, r3, r7\n\t"
  101660. "adc r4, r4, #0\n\t"
  101661. "lsr r6, r8, #16\n\t"
  101662. "lsr r7, r9, #16\n\t"
  101663. "mul r7, r6, r7\n\t"
  101664. "adds r3, r3, r7\n\t"
  101665. "adc r4, r4, #0\n\t"
  101666. "lsl r7, r9, #16\n\t"
  101667. "lsr r7, r7, #16\n\t"
  101668. "mul r6, r7, r6\n\t"
  101669. "lsr r7, r6, #16\n\t"
  101670. "lsl r6, r6, #16\n\t"
  101671. "adds r5, r5, r6\n\t"
  101672. "adcs r3, r3, r7\n\t"
  101673. "adc r4, r4, #0\n\t"
  101674. #else
  101675. "umull r6, r7, r8, r9\n\t"
  101676. "adds r5, r5, r6\n\t"
  101677. "adcs r3, r3, r7\n\t"
  101678. "adc r4, r4, #0\n\t"
  101679. #endif
  101680. /* A[11] * B[9] */
  101681. "ldr r8, [%[a], #44]\n\t"
  101682. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101683. "lsl r6, r8, #16\n\t"
  101684. "lsl r7, r12, #16\n\t"
  101685. "lsr r6, r6, #16\n\t"
  101686. "lsr r7, r7, #16\n\t"
  101687. "mul r7, r6, r7\n\t"
  101688. "adds r5, r5, r7\n\t"
  101689. "adcs r3, r3, #0\n\t"
  101690. "adc r4, r4, #0\n\t"
  101691. "lsr r7, r12, #16\n\t"
  101692. "mul r6, r7, r6\n\t"
  101693. "lsr r7, r6, #16\n\t"
  101694. "lsl r6, r6, #16\n\t"
  101695. "adds r5, r5, r6\n\t"
  101696. "adcs r3, r3, r7\n\t"
  101697. "adc r4, r4, #0\n\t"
  101698. "lsr r6, r8, #16\n\t"
  101699. "lsr r7, r12, #16\n\t"
  101700. "mul r7, r6, r7\n\t"
  101701. "adds r3, r3, r7\n\t"
  101702. "adc r4, r4, #0\n\t"
  101703. "lsl r7, r12, #16\n\t"
  101704. "lsr r7, r7, #16\n\t"
  101705. "mul r6, r7, r6\n\t"
  101706. "lsr r7, r6, #16\n\t"
  101707. "lsl r6, r6, #16\n\t"
  101708. "adds r5, r5, r6\n\t"
  101709. "adcs r3, r3, r7\n\t"
  101710. "adc r4, r4, #0\n\t"
  101711. #else
  101712. "umull r6, r7, r8, r12\n\t"
  101713. "adds r5, r5, r6\n\t"
  101714. "adcs r3, r3, r7\n\t"
  101715. "adc r4, r4, #0\n\t"
  101716. #endif
  101717. /* A[10] * B[10] */
  101718. "ldr r11, [%[a], #40]\n\t"
  101719. "ldr r12, [%[b], #40]\n\t"
  101720. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101721. "lsl r6, r11, #16\n\t"
  101722. "lsl r7, r12, #16\n\t"
  101723. "lsr r6, r6, #16\n\t"
  101724. "lsr r7, r7, #16\n\t"
  101725. "mul r7, r6, r7\n\t"
  101726. "adds r5, r5, r7\n\t"
  101727. "adcs r3, r3, #0\n\t"
  101728. "adc r4, r4, #0\n\t"
  101729. "lsr r7, r12, #16\n\t"
  101730. "mul r6, r7, r6\n\t"
  101731. "lsr r7, r6, #16\n\t"
  101732. "lsl r6, r6, #16\n\t"
  101733. "adds r5, r5, r6\n\t"
  101734. "adcs r3, r3, r7\n\t"
  101735. "adc r4, r4, #0\n\t"
  101736. "lsr r6, r11, #16\n\t"
  101737. "lsr r7, r12, #16\n\t"
  101738. "mul r7, r6, r7\n\t"
  101739. "adds r3, r3, r7\n\t"
  101740. "adc r4, r4, #0\n\t"
  101741. "lsl r7, r12, #16\n\t"
  101742. "lsr r7, r7, #16\n\t"
  101743. "mul r6, r7, r6\n\t"
  101744. "lsr r7, r6, #16\n\t"
  101745. "lsl r6, r6, #16\n\t"
  101746. "adds r5, r5, r6\n\t"
  101747. "adcs r3, r3, r7\n\t"
  101748. "adc r4, r4, #0\n\t"
  101749. #else
  101750. "umull r6, r7, r11, r12\n\t"
  101751. "adds r5, r5, r6\n\t"
  101752. "adcs r3, r3, r7\n\t"
  101753. "adc r4, r4, #0\n\t"
  101754. #endif
  101755. /* A[9] * B[11] */
  101756. "ldr r8, [%[a], #36]\n\t"
  101757. "ldr r9, [%[b], #44]\n\t"
  101758. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101759. "lsl r6, r8, #16\n\t"
  101760. "lsl r7, r9, #16\n\t"
  101761. "lsr r6, r6, #16\n\t"
  101762. "lsr r7, r7, #16\n\t"
  101763. "mul r7, r6, r7\n\t"
  101764. "adds r5, r5, r7\n\t"
  101765. "adcs r3, r3, #0\n\t"
  101766. "adc r4, r4, #0\n\t"
  101767. "lsr r7, r9, #16\n\t"
  101768. "mul r6, r7, r6\n\t"
  101769. "lsr r7, r6, #16\n\t"
  101770. "lsl r6, r6, #16\n\t"
  101771. "adds r5, r5, r6\n\t"
  101772. "adcs r3, r3, r7\n\t"
  101773. "adc r4, r4, #0\n\t"
  101774. "lsr r6, r8, #16\n\t"
  101775. "lsr r7, r9, #16\n\t"
  101776. "mul r7, r6, r7\n\t"
  101777. "adds r3, r3, r7\n\t"
  101778. "adc r4, r4, #0\n\t"
  101779. "lsl r7, r9, #16\n\t"
  101780. "lsr r7, r7, #16\n\t"
  101781. "mul r6, r7, r6\n\t"
  101782. "lsr r7, r6, #16\n\t"
  101783. "lsl r6, r6, #16\n\t"
  101784. "adds r5, r5, r6\n\t"
  101785. "adcs r3, r3, r7\n\t"
  101786. "adc r4, r4, #0\n\t"
  101787. #else
  101788. "umull r6, r7, r8, r9\n\t"
  101789. "adds r5, r5, r6\n\t"
  101790. "adcs r3, r3, r7\n\t"
  101791. "adc r4, r4, #0\n\t"
  101792. #endif
  101793. /* A[8] * B[12] */
  101794. "ldr r8, [%[a], #32]\n\t"
  101795. "ldr r9, [%[b], #48]\n\t"
  101796. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101797. "lsl r6, r8, #16\n\t"
  101798. "lsl r7, r9, #16\n\t"
  101799. "lsr r6, r6, #16\n\t"
  101800. "lsr r7, r7, #16\n\t"
  101801. "mul r7, r6, r7\n\t"
  101802. "adds r5, r5, r7\n\t"
  101803. "adcs r3, r3, #0\n\t"
  101804. "adc r4, r4, #0\n\t"
  101805. "lsr r7, r9, #16\n\t"
  101806. "mul r6, r7, r6\n\t"
  101807. "lsr r7, r6, #16\n\t"
  101808. "lsl r6, r6, #16\n\t"
  101809. "adds r5, r5, r6\n\t"
  101810. "adcs r3, r3, r7\n\t"
  101811. "adc r4, r4, #0\n\t"
  101812. "lsr r6, r8, #16\n\t"
  101813. "lsr r7, r9, #16\n\t"
  101814. "mul r7, r6, r7\n\t"
  101815. "adds r3, r3, r7\n\t"
  101816. "adc r4, r4, #0\n\t"
  101817. "lsl r7, r9, #16\n\t"
  101818. "lsr r7, r7, #16\n\t"
  101819. "mul r6, r7, r6\n\t"
  101820. "lsr r7, r6, #16\n\t"
  101821. "lsl r6, r6, #16\n\t"
  101822. "adds r5, r5, r6\n\t"
  101823. "adcs r3, r3, r7\n\t"
  101824. "adc r4, r4, #0\n\t"
  101825. #else
  101826. "umull r6, r7, r8, r9\n\t"
  101827. "adds r5, r5, r6\n\t"
  101828. "adcs r3, r3, r7\n\t"
  101829. "adc r4, r4, #0\n\t"
  101830. #endif
  101831. /* A[7] * B[13] */
  101832. "ldr r8, [%[a], #28]\n\t"
  101833. "ldr r9, [%[b], #52]\n\t"
  101834. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101835. "lsl r6, r8, #16\n\t"
  101836. "lsl r7, r9, #16\n\t"
  101837. "lsr r6, r6, #16\n\t"
  101838. "lsr r7, r7, #16\n\t"
  101839. "mul r7, r6, r7\n\t"
  101840. "adds r5, r5, r7\n\t"
  101841. "adcs r3, r3, #0\n\t"
  101842. "adc r4, r4, #0\n\t"
  101843. "lsr r7, r9, #16\n\t"
  101844. "mul r6, r7, r6\n\t"
  101845. "lsr r7, r6, #16\n\t"
  101846. "lsl r6, r6, #16\n\t"
  101847. "adds r5, r5, r6\n\t"
  101848. "adcs r3, r3, r7\n\t"
  101849. "adc r4, r4, #0\n\t"
  101850. "lsr r6, r8, #16\n\t"
  101851. "lsr r7, r9, #16\n\t"
  101852. "mul r7, r6, r7\n\t"
  101853. "adds r3, r3, r7\n\t"
  101854. "adc r4, r4, #0\n\t"
  101855. "lsl r7, r9, #16\n\t"
  101856. "lsr r7, r7, #16\n\t"
  101857. "mul r6, r7, r6\n\t"
  101858. "lsr r7, r6, #16\n\t"
  101859. "lsl r6, r6, #16\n\t"
  101860. "adds r5, r5, r6\n\t"
  101861. "adcs r3, r3, r7\n\t"
  101862. "adc r4, r4, #0\n\t"
  101863. #else
  101864. "umull r6, r7, r8, r9\n\t"
  101865. "adds r5, r5, r6\n\t"
  101866. "adcs r3, r3, r7\n\t"
  101867. "adc r4, r4, #0\n\t"
  101868. #endif
  101869. /* A[6] * B[14] */
  101870. "ldr r8, [%[a], #24]\n\t"
  101871. "ldr r9, [%[b], #56]\n\t"
  101872. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101873. "lsl r6, r8, #16\n\t"
  101874. "lsl r7, r9, #16\n\t"
  101875. "lsr r6, r6, #16\n\t"
  101876. "lsr r7, r7, #16\n\t"
  101877. "mul r7, r6, r7\n\t"
  101878. "adds r5, r5, r7\n\t"
  101879. "adcs r3, r3, #0\n\t"
  101880. "adc r4, r4, #0\n\t"
  101881. "lsr r7, r9, #16\n\t"
  101882. "mul r6, r7, r6\n\t"
  101883. "lsr r7, r6, #16\n\t"
  101884. "lsl r6, r6, #16\n\t"
  101885. "adds r5, r5, r6\n\t"
  101886. "adcs r3, r3, r7\n\t"
  101887. "adc r4, r4, #0\n\t"
  101888. "lsr r6, r8, #16\n\t"
  101889. "lsr r7, r9, #16\n\t"
  101890. "mul r7, r6, r7\n\t"
  101891. "adds r3, r3, r7\n\t"
  101892. "adc r4, r4, #0\n\t"
  101893. "lsl r7, r9, #16\n\t"
  101894. "lsr r7, r7, #16\n\t"
  101895. "mul r6, r7, r6\n\t"
  101896. "lsr r7, r6, #16\n\t"
  101897. "lsl r6, r6, #16\n\t"
  101898. "adds r5, r5, r6\n\t"
  101899. "adcs r3, r3, r7\n\t"
  101900. "adc r4, r4, #0\n\t"
  101901. #else
  101902. "umull r6, r7, r8, r9\n\t"
  101903. "adds r5, r5, r6\n\t"
  101904. "adcs r3, r3, r7\n\t"
  101905. "adc r4, r4, #0\n\t"
  101906. #endif
  101907. /* A[5] * B[15] */
  101908. "ldr r8, [%[a], #20]\n\t"
  101909. "ldr r9, [%[b], #60]\n\t"
  101910. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101911. "lsl r6, r8, #16\n\t"
  101912. "lsl r7, r9, #16\n\t"
  101913. "lsr r6, r6, #16\n\t"
  101914. "lsr r7, r7, #16\n\t"
  101915. "mul r7, r6, r7\n\t"
  101916. "adds r5, r5, r7\n\t"
  101917. "adcs r3, r3, #0\n\t"
  101918. "adc r4, r4, #0\n\t"
  101919. "lsr r7, r9, #16\n\t"
  101920. "mul r6, r7, r6\n\t"
  101921. "lsr r7, r6, #16\n\t"
  101922. "lsl r6, r6, #16\n\t"
  101923. "adds r5, r5, r6\n\t"
  101924. "adcs r3, r3, r7\n\t"
  101925. "adc r4, r4, #0\n\t"
  101926. "lsr r6, r8, #16\n\t"
  101927. "lsr r7, r9, #16\n\t"
  101928. "mul r7, r6, r7\n\t"
  101929. "adds r3, r3, r7\n\t"
  101930. "adc r4, r4, #0\n\t"
  101931. "lsl r7, r9, #16\n\t"
  101932. "lsr r7, r7, #16\n\t"
  101933. "mul r6, r7, r6\n\t"
  101934. "lsr r7, r6, #16\n\t"
  101935. "lsl r6, r6, #16\n\t"
  101936. "adds r5, r5, r6\n\t"
  101937. "adcs r3, r3, r7\n\t"
  101938. "adc r4, r4, #0\n\t"
  101939. #else
  101940. "umull r6, r7, r8, r9\n\t"
  101941. "adds r5, r5, r6\n\t"
  101942. "adcs r3, r3, r7\n\t"
  101943. "adc r4, r4, #0\n\t"
  101944. #endif
  101945. /* A[4] * B[16] */
  101946. "ldr r8, [%[a], #16]\n\t"
  101947. "ldr r9, [%[b], #64]\n\t"
  101948. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101949. "lsl r6, r8, #16\n\t"
  101950. "lsl r7, r9, #16\n\t"
  101951. "lsr r6, r6, #16\n\t"
  101952. "lsr r7, r7, #16\n\t"
  101953. "mul r7, r6, r7\n\t"
  101954. "adds r5, r5, r7\n\t"
  101955. "adcs r3, r3, #0\n\t"
  101956. "adc r4, r4, #0\n\t"
  101957. "lsr r7, r9, #16\n\t"
  101958. "mul r6, r7, r6\n\t"
  101959. "lsr r7, r6, #16\n\t"
  101960. "lsl r6, r6, #16\n\t"
  101961. "adds r5, r5, r6\n\t"
  101962. "adcs r3, r3, r7\n\t"
  101963. "adc r4, r4, #0\n\t"
  101964. "lsr r6, r8, #16\n\t"
  101965. "lsr r7, r9, #16\n\t"
  101966. "mul r7, r6, r7\n\t"
  101967. "adds r3, r3, r7\n\t"
  101968. "adc r4, r4, #0\n\t"
  101969. "lsl r7, r9, #16\n\t"
  101970. "lsr r7, r7, #16\n\t"
  101971. "mul r6, r7, r6\n\t"
  101972. "lsr r7, r6, #16\n\t"
  101973. "lsl r6, r6, #16\n\t"
  101974. "adds r5, r5, r6\n\t"
  101975. "adcs r3, r3, r7\n\t"
  101976. "adc r4, r4, #0\n\t"
  101977. #else
  101978. "umull r6, r7, r8, r9\n\t"
  101979. "adds r5, r5, r6\n\t"
  101980. "adcs r3, r3, r7\n\t"
  101981. "adc r4, r4, #0\n\t"
  101982. #endif
  101983. "str r5, [%[r], #80]\n\t"
  101984. /* A[5] * B[16] */
  101985. "ldr r8, [%[a], #20]\n\t"
  101986. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  101987. "lsl r6, r8, #16\n\t"
  101988. "lsl r7, r9, #16\n\t"
  101989. "lsr r6, r6, #16\n\t"
  101990. "lsr r7, r7, #16\n\t"
  101991. "mul r7, r6, r7\n\t"
  101992. "adds r3, r3, r7\n\t"
  101993. "adcs r4, r4, #0\n\t"
  101994. "mov r5, #0\n\t"
  101995. "adc r5, r5, #0\n\t"
  101996. "lsr r7, r9, #16\n\t"
  101997. "mul r6, r7, r6\n\t"
  101998. "lsr r7, r6, #16\n\t"
  101999. "lsl r6, r6, #16\n\t"
  102000. "adds r3, r3, r6\n\t"
  102001. "adcs r4, r4, r7\n\t"
  102002. "adc r5, r5, #0\n\t"
  102003. "lsr r6, r8, #16\n\t"
  102004. "lsr r7, r9, #16\n\t"
  102005. "mul r7, r6, r7\n\t"
  102006. "adds r4, r4, r7\n\t"
  102007. "adc r5, r5, #0\n\t"
  102008. "lsl r7, r9, #16\n\t"
  102009. "lsr r7, r7, #16\n\t"
  102010. "mul r6, r7, r6\n\t"
  102011. "lsr r7, r6, #16\n\t"
  102012. "lsl r6, r6, #16\n\t"
  102013. "adds r3, r3, r6\n\t"
  102014. "adcs r4, r4, r7\n\t"
  102015. "adc r5, r5, #0\n\t"
  102016. #else
  102017. "umull r6, r7, r8, r9\n\t"
  102018. "adds r3, r3, r6\n\t"
  102019. "adcs r4, r4, r7\n\t"
  102020. "mov r5, #0\n\t"
  102021. "adc r5, r5, #0\n\t"
  102022. #endif
  102023. /* A[6] * B[15] */
  102024. "ldr r8, [%[a], #24]\n\t"
  102025. "ldr r9, [%[b], #60]\n\t"
  102026. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102027. "lsl r6, r8, #16\n\t"
  102028. "lsl r7, r9, #16\n\t"
  102029. "lsr r6, r6, #16\n\t"
  102030. "lsr r7, r7, #16\n\t"
  102031. "mul r7, r6, r7\n\t"
  102032. "adds r3, r3, r7\n\t"
  102033. "adcs r4, r4, #0\n\t"
  102034. "adc r5, r5, #0\n\t"
  102035. "lsr r7, r9, #16\n\t"
  102036. "mul r6, r7, r6\n\t"
  102037. "lsr r7, r6, #16\n\t"
  102038. "lsl r6, r6, #16\n\t"
  102039. "adds r3, r3, r6\n\t"
  102040. "adcs r4, r4, r7\n\t"
  102041. "adc r5, r5, #0\n\t"
  102042. "lsr r6, r8, #16\n\t"
  102043. "lsr r7, r9, #16\n\t"
  102044. "mul r7, r6, r7\n\t"
  102045. "adds r4, r4, r7\n\t"
  102046. "adc r5, r5, #0\n\t"
  102047. "lsl r7, r9, #16\n\t"
  102048. "lsr r7, r7, #16\n\t"
  102049. "mul r6, r7, r6\n\t"
  102050. "lsr r7, r6, #16\n\t"
  102051. "lsl r6, r6, #16\n\t"
  102052. "adds r3, r3, r6\n\t"
  102053. "adcs r4, r4, r7\n\t"
  102054. "adc r5, r5, #0\n\t"
  102055. #else
  102056. "umull r6, r7, r8, r9\n\t"
  102057. "adds r3, r3, r6\n\t"
  102058. "adcs r4, r4, r7\n\t"
  102059. "adc r5, r5, #0\n\t"
  102060. #endif
  102061. /* A[7] * B[14] */
  102062. "ldr r8, [%[a], #28]\n\t"
  102063. "ldr r9, [%[b], #56]\n\t"
  102064. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102065. "lsl r6, r8, #16\n\t"
  102066. "lsl r7, r9, #16\n\t"
  102067. "lsr r6, r6, #16\n\t"
  102068. "lsr r7, r7, #16\n\t"
  102069. "mul r7, r6, r7\n\t"
  102070. "adds r3, r3, r7\n\t"
  102071. "adcs r4, r4, #0\n\t"
  102072. "adc r5, r5, #0\n\t"
  102073. "lsr r7, r9, #16\n\t"
  102074. "mul r6, r7, r6\n\t"
  102075. "lsr r7, r6, #16\n\t"
  102076. "lsl r6, r6, #16\n\t"
  102077. "adds r3, r3, r6\n\t"
  102078. "adcs r4, r4, r7\n\t"
  102079. "adc r5, r5, #0\n\t"
  102080. "lsr r6, r8, #16\n\t"
  102081. "lsr r7, r9, #16\n\t"
  102082. "mul r7, r6, r7\n\t"
  102083. "adds r4, r4, r7\n\t"
  102084. "adc r5, r5, #0\n\t"
  102085. "lsl r7, r9, #16\n\t"
  102086. "lsr r7, r7, #16\n\t"
  102087. "mul r6, r7, r6\n\t"
  102088. "lsr r7, r6, #16\n\t"
  102089. "lsl r6, r6, #16\n\t"
  102090. "adds r3, r3, r6\n\t"
  102091. "adcs r4, r4, r7\n\t"
  102092. "adc r5, r5, #0\n\t"
  102093. #else
  102094. "umull r6, r7, r8, r9\n\t"
  102095. "adds r3, r3, r6\n\t"
  102096. "adcs r4, r4, r7\n\t"
  102097. "adc r5, r5, #0\n\t"
  102098. #endif
  102099. /* A[8] * B[13] */
  102100. "ldr r8, [%[a], #32]\n\t"
  102101. "ldr r9, [%[b], #52]\n\t"
  102102. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102103. "lsl r6, r8, #16\n\t"
  102104. "lsl r7, r9, #16\n\t"
  102105. "lsr r6, r6, #16\n\t"
  102106. "lsr r7, r7, #16\n\t"
  102107. "mul r7, r6, r7\n\t"
  102108. "adds r3, r3, r7\n\t"
  102109. "adcs r4, r4, #0\n\t"
  102110. "adc r5, r5, #0\n\t"
  102111. "lsr r7, r9, #16\n\t"
  102112. "mul r6, r7, r6\n\t"
  102113. "lsr r7, r6, #16\n\t"
  102114. "lsl r6, r6, #16\n\t"
  102115. "adds r3, r3, r6\n\t"
  102116. "adcs r4, r4, r7\n\t"
  102117. "adc r5, r5, #0\n\t"
  102118. "lsr r6, r8, #16\n\t"
  102119. "lsr r7, r9, #16\n\t"
  102120. "mul r7, r6, r7\n\t"
  102121. "adds r4, r4, r7\n\t"
  102122. "adc r5, r5, #0\n\t"
  102123. "lsl r7, r9, #16\n\t"
  102124. "lsr r7, r7, #16\n\t"
  102125. "mul r6, r7, r6\n\t"
  102126. "lsr r7, r6, #16\n\t"
  102127. "lsl r6, r6, #16\n\t"
  102128. "adds r3, r3, r6\n\t"
  102129. "adcs r4, r4, r7\n\t"
  102130. "adc r5, r5, #0\n\t"
  102131. #else
  102132. "umull r6, r7, r8, r9\n\t"
  102133. "adds r3, r3, r6\n\t"
  102134. "adcs r4, r4, r7\n\t"
  102135. "adc r5, r5, #0\n\t"
  102136. #endif
  102137. /* A[9] * B[12] */
  102138. "ldr r8, [%[a], #36]\n\t"
  102139. "ldr r9, [%[b], #48]\n\t"
  102140. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102141. "lsl r6, r8, #16\n\t"
  102142. "lsl r7, r9, #16\n\t"
  102143. "lsr r6, r6, #16\n\t"
  102144. "lsr r7, r7, #16\n\t"
  102145. "mul r7, r6, r7\n\t"
  102146. "adds r3, r3, r7\n\t"
  102147. "adcs r4, r4, #0\n\t"
  102148. "adc r5, r5, #0\n\t"
  102149. "lsr r7, r9, #16\n\t"
  102150. "mul r6, r7, r6\n\t"
  102151. "lsr r7, r6, #16\n\t"
  102152. "lsl r6, r6, #16\n\t"
  102153. "adds r3, r3, r6\n\t"
  102154. "adcs r4, r4, r7\n\t"
  102155. "adc r5, r5, #0\n\t"
  102156. "lsr r6, r8, #16\n\t"
  102157. "lsr r7, r9, #16\n\t"
  102158. "mul r7, r6, r7\n\t"
  102159. "adds r4, r4, r7\n\t"
  102160. "adc r5, r5, #0\n\t"
  102161. "lsl r7, r9, #16\n\t"
  102162. "lsr r7, r7, #16\n\t"
  102163. "mul r6, r7, r6\n\t"
  102164. "lsr r7, r6, #16\n\t"
  102165. "lsl r6, r6, #16\n\t"
  102166. "adds r3, r3, r6\n\t"
  102167. "adcs r4, r4, r7\n\t"
  102168. "adc r5, r5, #0\n\t"
  102169. #else
  102170. "umull r6, r7, r8, r9\n\t"
  102171. "adds r3, r3, r6\n\t"
  102172. "adcs r4, r4, r7\n\t"
  102173. "adc r5, r5, #0\n\t"
  102174. #endif
  102175. /* A[10] * B[11] */
  102176. "ldr r9, [%[b], #44]\n\t"
  102177. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102178. "lsl r6, r11, #16\n\t"
  102179. "lsl r7, r9, #16\n\t"
  102180. "lsr r6, r6, #16\n\t"
  102181. "lsr r7, r7, #16\n\t"
  102182. "mul r7, r6, r7\n\t"
  102183. "adds r3, r3, r7\n\t"
  102184. "adcs r4, r4, #0\n\t"
  102185. "adc r5, r5, #0\n\t"
  102186. "lsr r7, r9, #16\n\t"
  102187. "mul r6, r7, r6\n\t"
  102188. "lsr r7, r6, #16\n\t"
  102189. "lsl r6, r6, #16\n\t"
  102190. "adds r3, r3, r6\n\t"
  102191. "adcs r4, r4, r7\n\t"
  102192. "adc r5, r5, #0\n\t"
  102193. "lsr r6, r11, #16\n\t"
  102194. "lsr r7, r9, #16\n\t"
  102195. "mul r7, r6, r7\n\t"
  102196. "adds r4, r4, r7\n\t"
  102197. "adc r5, r5, #0\n\t"
  102198. "lsl r7, r9, #16\n\t"
  102199. "lsr r7, r7, #16\n\t"
  102200. "mul r6, r7, r6\n\t"
  102201. "lsr r7, r6, #16\n\t"
  102202. "lsl r6, r6, #16\n\t"
  102203. "adds r3, r3, r6\n\t"
  102204. "adcs r4, r4, r7\n\t"
  102205. "adc r5, r5, #0\n\t"
  102206. #else
  102207. "umull r6, r7, r11, r9\n\t"
  102208. "adds r3, r3, r6\n\t"
  102209. "adcs r4, r4, r7\n\t"
  102210. "adc r5, r5, #0\n\t"
  102211. #endif
  102212. /* A[11] * B[10] */
  102213. "ldr r8, [%[a], #44]\n\t"
  102214. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102215. "lsl r6, r8, #16\n\t"
  102216. "lsl r7, r12, #16\n\t"
  102217. "lsr r6, r6, #16\n\t"
  102218. "lsr r7, r7, #16\n\t"
  102219. "mul r7, r6, r7\n\t"
  102220. "adds r3, r3, r7\n\t"
  102221. "adcs r4, r4, #0\n\t"
  102222. "adc r5, r5, #0\n\t"
  102223. "lsr r7, r12, #16\n\t"
  102224. "mul r6, r7, r6\n\t"
  102225. "lsr r7, r6, #16\n\t"
  102226. "lsl r6, r6, #16\n\t"
  102227. "adds r3, r3, r6\n\t"
  102228. "adcs r4, r4, r7\n\t"
  102229. "adc r5, r5, #0\n\t"
  102230. "lsr r6, r8, #16\n\t"
  102231. "lsr r7, r12, #16\n\t"
  102232. "mul r7, r6, r7\n\t"
  102233. "adds r4, r4, r7\n\t"
  102234. "adc r5, r5, #0\n\t"
  102235. "lsl r7, r12, #16\n\t"
  102236. "lsr r7, r7, #16\n\t"
  102237. "mul r6, r7, r6\n\t"
  102238. "lsr r7, r6, #16\n\t"
  102239. "lsl r6, r6, #16\n\t"
  102240. "adds r3, r3, r6\n\t"
  102241. "adcs r4, r4, r7\n\t"
  102242. "adc r5, r5, #0\n\t"
  102243. #else
  102244. "umull r6, r7, r8, r12\n\t"
  102245. "adds r3, r3, r6\n\t"
  102246. "adcs r4, r4, r7\n\t"
  102247. "adc r5, r5, #0\n\t"
  102248. #endif
  102249. /* A[12] * B[9] */
  102250. "ldr r8, [%[a], #48]\n\t"
  102251. "ldr r9, [%[b], #36]\n\t"
  102252. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102253. "lsl r6, r8, #16\n\t"
  102254. "lsl r7, r9, #16\n\t"
  102255. "lsr r6, r6, #16\n\t"
  102256. "lsr r7, r7, #16\n\t"
  102257. "mul r7, r6, r7\n\t"
  102258. "adds r3, r3, r7\n\t"
  102259. "adcs r4, r4, #0\n\t"
  102260. "adc r5, r5, #0\n\t"
  102261. "lsr r7, r9, #16\n\t"
  102262. "mul r6, r7, r6\n\t"
  102263. "lsr r7, r6, #16\n\t"
  102264. "lsl r6, r6, #16\n\t"
  102265. "adds r3, r3, r6\n\t"
  102266. "adcs r4, r4, r7\n\t"
  102267. "adc r5, r5, #0\n\t"
  102268. "lsr r6, r8, #16\n\t"
  102269. "lsr r7, r9, #16\n\t"
  102270. "mul r7, r6, r7\n\t"
  102271. "adds r4, r4, r7\n\t"
  102272. "adc r5, r5, #0\n\t"
  102273. "lsl r7, r9, #16\n\t"
  102274. "lsr r7, r7, #16\n\t"
  102275. "mul r6, r7, r6\n\t"
  102276. "lsr r7, r6, #16\n\t"
  102277. "lsl r6, r6, #16\n\t"
  102278. "adds r3, r3, r6\n\t"
  102279. "adcs r4, r4, r7\n\t"
  102280. "adc r5, r5, #0\n\t"
  102281. #else
  102282. "umull r6, r7, r8, r9\n\t"
  102283. "adds r3, r3, r6\n\t"
  102284. "adcs r4, r4, r7\n\t"
  102285. "adc r5, r5, #0\n\t"
  102286. #endif
  102287. /* A[13] * B[8] */
  102288. "ldr r8, [%[a], #52]\n\t"
  102289. "ldr r9, [%[b], #32]\n\t"
  102290. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102291. "lsl r6, r8, #16\n\t"
  102292. "lsl r7, r9, #16\n\t"
  102293. "lsr r6, r6, #16\n\t"
  102294. "lsr r7, r7, #16\n\t"
  102295. "mul r7, r6, r7\n\t"
  102296. "adds r3, r3, r7\n\t"
  102297. "adcs r4, r4, #0\n\t"
  102298. "adc r5, r5, #0\n\t"
  102299. "lsr r7, r9, #16\n\t"
  102300. "mul r6, r7, r6\n\t"
  102301. "lsr r7, r6, #16\n\t"
  102302. "lsl r6, r6, #16\n\t"
  102303. "adds r3, r3, r6\n\t"
  102304. "adcs r4, r4, r7\n\t"
  102305. "adc r5, r5, #0\n\t"
  102306. "lsr r6, r8, #16\n\t"
  102307. "lsr r7, r9, #16\n\t"
  102308. "mul r7, r6, r7\n\t"
  102309. "adds r4, r4, r7\n\t"
  102310. "adc r5, r5, #0\n\t"
  102311. "lsl r7, r9, #16\n\t"
  102312. "lsr r7, r7, #16\n\t"
  102313. "mul r6, r7, r6\n\t"
  102314. "lsr r7, r6, #16\n\t"
  102315. "lsl r6, r6, #16\n\t"
  102316. "adds r3, r3, r6\n\t"
  102317. "adcs r4, r4, r7\n\t"
  102318. "adc r5, r5, #0\n\t"
  102319. #else
  102320. "umull r6, r7, r8, r9\n\t"
  102321. "adds r3, r3, r6\n\t"
  102322. "adcs r4, r4, r7\n\t"
  102323. "adc r5, r5, #0\n\t"
  102324. #endif
  102325. /* A[14] * B[7] */
  102326. "ldr r8, [%[a], #56]\n\t"
  102327. "ldr r9, [%[b], #28]\n\t"
  102328. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102329. "lsl r6, r8, #16\n\t"
  102330. "lsl r7, r9, #16\n\t"
  102331. "lsr r6, r6, #16\n\t"
  102332. "lsr r7, r7, #16\n\t"
  102333. "mul r7, r6, r7\n\t"
  102334. "adds r3, r3, r7\n\t"
  102335. "adcs r4, r4, #0\n\t"
  102336. "adc r5, r5, #0\n\t"
  102337. "lsr r7, r9, #16\n\t"
  102338. "mul r6, r7, r6\n\t"
  102339. "lsr r7, r6, #16\n\t"
  102340. "lsl r6, r6, #16\n\t"
  102341. "adds r3, r3, r6\n\t"
  102342. "adcs r4, r4, r7\n\t"
  102343. "adc r5, r5, #0\n\t"
  102344. "lsr r6, r8, #16\n\t"
  102345. "lsr r7, r9, #16\n\t"
  102346. "mul r7, r6, r7\n\t"
  102347. "adds r4, r4, r7\n\t"
  102348. "adc r5, r5, #0\n\t"
  102349. "lsl r7, r9, #16\n\t"
  102350. "lsr r7, r7, #16\n\t"
  102351. "mul r6, r7, r6\n\t"
  102352. "lsr r7, r6, #16\n\t"
  102353. "lsl r6, r6, #16\n\t"
  102354. "adds r3, r3, r6\n\t"
  102355. "adcs r4, r4, r7\n\t"
  102356. "adc r5, r5, #0\n\t"
  102357. #else
  102358. "umull r6, r7, r8, r9\n\t"
  102359. "adds r3, r3, r6\n\t"
  102360. "adcs r4, r4, r7\n\t"
  102361. "adc r5, r5, #0\n\t"
  102362. #endif
  102363. /* A[15] * B[6] */
  102364. "ldr r8, [%[a], #60]\n\t"
  102365. "ldr r9, [%[b], #24]\n\t"
  102366. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102367. "lsl r6, r8, #16\n\t"
  102368. "lsl r7, r9, #16\n\t"
  102369. "lsr r6, r6, #16\n\t"
  102370. "lsr r7, r7, #16\n\t"
  102371. "mul r7, r6, r7\n\t"
  102372. "adds r3, r3, r7\n\t"
  102373. "adcs r4, r4, #0\n\t"
  102374. "adc r5, r5, #0\n\t"
  102375. "lsr r7, r9, #16\n\t"
  102376. "mul r6, r7, r6\n\t"
  102377. "lsr r7, r6, #16\n\t"
  102378. "lsl r6, r6, #16\n\t"
  102379. "adds r3, r3, r6\n\t"
  102380. "adcs r4, r4, r7\n\t"
  102381. "adc r5, r5, #0\n\t"
  102382. "lsr r6, r8, #16\n\t"
  102383. "lsr r7, r9, #16\n\t"
  102384. "mul r7, r6, r7\n\t"
  102385. "adds r4, r4, r7\n\t"
  102386. "adc r5, r5, #0\n\t"
  102387. "lsl r7, r9, #16\n\t"
  102388. "lsr r7, r7, #16\n\t"
  102389. "mul r6, r7, r6\n\t"
  102390. "lsr r7, r6, #16\n\t"
  102391. "lsl r6, r6, #16\n\t"
  102392. "adds r3, r3, r6\n\t"
  102393. "adcs r4, r4, r7\n\t"
  102394. "adc r5, r5, #0\n\t"
  102395. #else
  102396. "umull r6, r7, r8, r9\n\t"
  102397. "adds r3, r3, r6\n\t"
  102398. "adcs r4, r4, r7\n\t"
  102399. "adc r5, r5, #0\n\t"
  102400. #endif
  102401. /* A[16] * B[5] */
  102402. "ldr r8, [%[a], #64]\n\t"
  102403. "ldr r9, [%[b], #20]\n\t"
  102404. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102405. "lsl r6, r8, #16\n\t"
  102406. "lsl r7, r9, #16\n\t"
  102407. "lsr r6, r6, #16\n\t"
  102408. "lsr r7, r7, #16\n\t"
  102409. "mul r7, r6, r7\n\t"
  102410. "adds r3, r3, r7\n\t"
  102411. "adcs r4, r4, #0\n\t"
  102412. "adc r5, r5, #0\n\t"
  102413. "lsr r7, r9, #16\n\t"
  102414. "mul r6, r7, r6\n\t"
  102415. "lsr r7, r6, #16\n\t"
  102416. "lsl r6, r6, #16\n\t"
  102417. "adds r3, r3, r6\n\t"
  102418. "adcs r4, r4, r7\n\t"
  102419. "adc r5, r5, #0\n\t"
  102420. "lsr r6, r8, #16\n\t"
  102421. "lsr r7, r9, #16\n\t"
  102422. "mul r7, r6, r7\n\t"
  102423. "adds r4, r4, r7\n\t"
  102424. "adc r5, r5, #0\n\t"
  102425. "lsl r7, r9, #16\n\t"
  102426. "lsr r7, r7, #16\n\t"
  102427. "mul r6, r7, r6\n\t"
  102428. "lsr r7, r6, #16\n\t"
  102429. "lsl r6, r6, #16\n\t"
  102430. "adds r3, r3, r6\n\t"
  102431. "adcs r4, r4, r7\n\t"
  102432. "adc r5, r5, #0\n\t"
  102433. #else
  102434. "umull r6, r7, r8, r9\n\t"
  102435. "adds r3, r3, r6\n\t"
  102436. "adcs r4, r4, r7\n\t"
  102437. "adc r5, r5, #0\n\t"
  102438. #endif
  102439. "str r3, [%[r], #84]\n\t"
  102440. /* A[16] * B[6] */
  102441. "ldr r9, [%[b], #24]\n\t"
  102442. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102443. "lsl r6, r8, #16\n\t"
  102444. "lsl r7, r9, #16\n\t"
  102445. "lsr r6, r6, #16\n\t"
  102446. "lsr r7, r7, #16\n\t"
  102447. "mul r7, r6, r7\n\t"
  102448. "adds r4, r4, r7\n\t"
  102449. "adcs r5, r5, #0\n\t"
  102450. "mov r3, #0\n\t"
  102451. "adc r3, r3, #0\n\t"
  102452. "lsr r7, r9, #16\n\t"
  102453. "mul r6, r7, r6\n\t"
  102454. "lsr r7, r6, #16\n\t"
  102455. "lsl r6, r6, #16\n\t"
  102456. "adds r4, r4, r6\n\t"
  102457. "adcs r5, r5, r7\n\t"
  102458. "adc r3, r3, #0\n\t"
  102459. "lsr r6, r8, #16\n\t"
  102460. "lsr r7, r9, #16\n\t"
  102461. "mul r7, r6, r7\n\t"
  102462. "adds r5, r5, r7\n\t"
  102463. "adc r3, r3, #0\n\t"
  102464. "lsl r7, r9, #16\n\t"
  102465. "lsr r7, r7, #16\n\t"
  102466. "mul r6, r7, r6\n\t"
  102467. "lsr r7, r6, #16\n\t"
  102468. "lsl r6, r6, #16\n\t"
  102469. "adds r4, r4, r6\n\t"
  102470. "adcs r5, r5, r7\n\t"
  102471. "adc r3, r3, #0\n\t"
  102472. #else
  102473. "umull r6, r7, r8, r9\n\t"
  102474. "adds r4, r4, r6\n\t"
  102475. "adcs r5, r5, r7\n\t"
  102476. "mov r3, #0\n\t"
  102477. "adc r3, r3, #0\n\t"
  102478. #endif
  102479. /* A[15] * B[7] */
  102480. "ldr r8, [%[a], #60]\n\t"
  102481. "ldr r9, [%[b], #28]\n\t"
  102482. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102483. "lsl r6, r8, #16\n\t"
  102484. "lsl r7, r9, #16\n\t"
  102485. "lsr r6, r6, #16\n\t"
  102486. "lsr r7, r7, #16\n\t"
  102487. "mul r7, r6, r7\n\t"
  102488. "adds r4, r4, r7\n\t"
  102489. "adcs r5, r5, #0\n\t"
  102490. "adc r3, r3, #0\n\t"
  102491. "lsr r7, r9, #16\n\t"
  102492. "mul r6, r7, r6\n\t"
  102493. "lsr r7, r6, #16\n\t"
  102494. "lsl r6, r6, #16\n\t"
  102495. "adds r4, r4, r6\n\t"
  102496. "adcs r5, r5, r7\n\t"
  102497. "adc r3, r3, #0\n\t"
  102498. "lsr r6, r8, #16\n\t"
  102499. "lsr r7, r9, #16\n\t"
  102500. "mul r7, r6, r7\n\t"
  102501. "adds r5, r5, r7\n\t"
  102502. "adc r3, r3, #0\n\t"
  102503. "lsl r7, r9, #16\n\t"
  102504. "lsr r7, r7, #16\n\t"
  102505. "mul r6, r7, r6\n\t"
  102506. "lsr r7, r6, #16\n\t"
  102507. "lsl r6, r6, #16\n\t"
  102508. "adds r4, r4, r6\n\t"
  102509. "adcs r5, r5, r7\n\t"
  102510. "adc r3, r3, #0\n\t"
  102511. #else
  102512. "umull r6, r7, r8, r9\n\t"
  102513. "adds r4, r4, r6\n\t"
  102514. "adcs r5, r5, r7\n\t"
  102515. "adc r3, r3, #0\n\t"
  102516. #endif
  102517. /* A[14] * B[8] */
  102518. "ldr r8, [%[a], #56]\n\t"
  102519. "ldr r9, [%[b], #32]\n\t"
  102520. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102521. "lsl r6, r8, #16\n\t"
  102522. "lsl r7, r9, #16\n\t"
  102523. "lsr r6, r6, #16\n\t"
  102524. "lsr r7, r7, #16\n\t"
  102525. "mul r7, r6, r7\n\t"
  102526. "adds r4, r4, r7\n\t"
  102527. "adcs r5, r5, #0\n\t"
  102528. "adc r3, r3, #0\n\t"
  102529. "lsr r7, r9, #16\n\t"
  102530. "mul r6, r7, r6\n\t"
  102531. "lsr r7, r6, #16\n\t"
  102532. "lsl r6, r6, #16\n\t"
  102533. "adds r4, r4, r6\n\t"
  102534. "adcs r5, r5, r7\n\t"
  102535. "adc r3, r3, #0\n\t"
  102536. "lsr r6, r8, #16\n\t"
  102537. "lsr r7, r9, #16\n\t"
  102538. "mul r7, r6, r7\n\t"
  102539. "adds r5, r5, r7\n\t"
  102540. "adc r3, r3, #0\n\t"
  102541. "lsl r7, r9, #16\n\t"
  102542. "lsr r7, r7, #16\n\t"
  102543. "mul r6, r7, r6\n\t"
  102544. "lsr r7, r6, #16\n\t"
  102545. "lsl r6, r6, #16\n\t"
  102546. "adds r4, r4, r6\n\t"
  102547. "adcs r5, r5, r7\n\t"
  102548. "adc r3, r3, #0\n\t"
  102549. #else
  102550. "umull r6, r7, r8, r9\n\t"
  102551. "adds r4, r4, r6\n\t"
  102552. "adcs r5, r5, r7\n\t"
  102553. "adc r3, r3, #0\n\t"
  102554. #endif
  102555. /* A[13] * B[9] */
  102556. "ldr r8, [%[a], #52]\n\t"
  102557. "ldr r9, [%[b], #36]\n\t"
  102558. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102559. "lsl r6, r8, #16\n\t"
  102560. "lsl r7, r9, #16\n\t"
  102561. "lsr r6, r6, #16\n\t"
  102562. "lsr r7, r7, #16\n\t"
  102563. "mul r7, r6, r7\n\t"
  102564. "adds r4, r4, r7\n\t"
  102565. "adcs r5, r5, #0\n\t"
  102566. "adc r3, r3, #0\n\t"
  102567. "lsr r7, r9, #16\n\t"
  102568. "mul r6, r7, r6\n\t"
  102569. "lsr r7, r6, #16\n\t"
  102570. "lsl r6, r6, #16\n\t"
  102571. "adds r4, r4, r6\n\t"
  102572. "adcs r5, r5, r7\n\t"
  102573. "adc r3, r3, #0\n\t"
  102574. "lsr r6, r8, #16\n\t"
  102575. "lsr r7, r9, #16\n\t"
  102576. "mul r7, r6, r7\n\t"
  102577. "adds r5, r5, r7\n\t"
  102578. "adc r3, r3, #0\n\t"
  102579. "lsl r7, r9, #16\n\t"
  102580. "lsr r7, r7, #16\n\t"
  102581. "mul r6, r7, r6\n\t"
  102582. "lsr r7, r6, #16\n\t"
  102583. "lsl r6, r6, #16\n\t"
  102584. "adds r4, r4, r6\n\t"
  102585. "adcs r5, r5, r7\n\t"
  102586. "adc r3, r3, #0\n\t"
  102587. #else
  102588. "umull r6, r7, r8, r9\n\t"
  102589. "adds r4, r4, r6\n\t"
  102590. "adcs r5, r5, r7\n\t"
  102591. "adc r3, r3, #0\n\t"
  102592. #endif
  102593. /* A[12] * B[10] */
  102594. "ldr r8, [%[a], #48]\n\t"
  102595. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102596. "lsl r6, r8, #16\n\t"
  102597. "lsl r7, r12, #16\n\t"
  102598. "lsr r6, r6, #16\n\t"
  102599. "lsr r7, r7, #16\n\t"
  102600. "mul r7, r6, r7\n\t"
  102601. "adds r4, r4, r7\n\t"
  102602. "adcs r5, r5, #0\n\t"
  102603. "adc r3, r3, #0\n\t"
  102604. "lsr r7, r12, #16\n\t"
  102605. "mul r6, r7, r6\n\t"
  102606. "lsr r7, r6, #16\n\t"
  102607. "lsl r6, r6, #16\n\t"
  102608. "adds r4, r4, r6\n\t"
  102609. "adcs r5, r5, r7\n\t"
  102610. "adc r3, r3, #0\n\t"
  102611. "lsr r6, r8, #16\n\t"
  102612. "lsr r7, r12, #16\n\t"
  102613. "mul r7, r6, r7\n\t"
  102614. "adds r5, r5, r7\n\t"
  102615. "adc r3, r3, #0\n\t"
  102616. "lsl r7, r12, #16\n\t"
  102617. "lsr r7, r7, #16\n\t"
  102618. "mul r6, r7, r6\n\t"
  102619. "lsr r7, r6, #16\n\t"
  102620. "lsl r6, r6, #16\n\t"
  102621. "adds r4, r4, r6\n\t"
  102622. "adcs r5, r5, r7\n\t"
  102623. "adc r3, r3, #0\n\t"
  102624. #else
  102625. "umull r6, r7, r8, r12\n\t"
  102626. "adds r4, r4, r6\n\t"
  102627. "adcs r5, r5, r7\n\t"
  102628. "adc r3, r3, #0\n\t"
  102629. #endif
  102630. /* A[11] * B[11] */
  102631. "ldr r11, [%[a], #44]\n\t"
  102632. "ldr r12, [%[b], #44]\n\t"
  102633. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102634. "lsl r6, r11, #16\n\t"
  102635. "lsl r7, r12, #16\n\t"
  102636. "lsr r6, r6, #16\n\t"
  102637. "lsr r7, r7, #16\n\t"
  102638. "mul r7, r6, r7\n\t"
  102639. "adds r4, r4, r7\n\t"
  102640. "adcs r5, r5, #0\n\t"
  102641. "adc r3, r3, #0\n\t"
  102642. "lsr r7, r12, #16\n\t"
  102643. "mul r6, r7, r6\n\t"
  102644. "lsr r7, r6, #16\n\t"
  102645. "lsl r6, r6, #16\n\t"
  102646. "adds r4, r4, r6\n\t"
  102647. "adcs r5, r5, r7\n\t"
  102648. "adc r3, r3, #0\n\t"
  102649. "lsr r6, r11, #16\n\t"
  102650. "lsr r7, r12, #16\n\t"
  102651. "mul r7, r6, r7\n\t"
  102652. "adds r5, r5, r7\n\t"
  102653. "adc r3, r3, #0\n\t"
  102654. "lsl r7, r12, #16\n\t"
  102655. "lsr r7, r7, #16\n\t"
  102656. "mul r6, r7, r6\n\t"
  102657. "lsr r7, r6, #16\n\t"
  102658. "lsl r6, r6, #16\n\t"
  102659. "adds r4, r4, r6\n\t"
  102660. "adcs r5, r5, r7\n\t"
  102661. "adc r3, r3, #0\n\t"
  102662. #else
  102663. "umull r6, r7, r11, r12\n\t"
  102664. "adds r4, r4, r6\n\t"
  102665. "adcs r5, r5, r7\n\t"
  102666. "adc r3, r3, #0\n\t"
  102667. #endif
  102668. /* A[10] * B[12] */
  102669. "ldr r8, [%[a], #40]\n\t"
  102670. "ldr r9, [%[b], #48]\n\t"
  102671. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102672. "lsl r6, r8, #16\n\t"
  102673. "lsl r7, r9, #16\n\t"
  102674. "lsr r6, r6, #16\n\t"
  102675. "lsr r7, r7, #16\n\t"
  102676. "mul r7, r6, r7\n\t"
  102677. "adds r4, r4, r7\n\t"
  102678. "adcs r5, r5, #0\n\t"
  102679. "adc r3, r3, #0\n\t"
  102680. "lsr r7, r9, #16\n\t"
  102681. "mul r6, r7, r6\n\t"
  102682. "lsr r7, r6, #16\n\t"
  102683. "lsl r6, r6, #16\n\t"
  102684. "adds r4, r4, r6\n\t"
  102685. "adcs r5, r5, r7\n\t"
  102686. "adc r3, r3, #0\n\t"
  102687. "lsr r6, r8, #16\n\t"
  102688. "lsr r7, r9, #16\n\t"
  102689. "mul r7, r6, r7\n\t"
  102690. "adds r5, r5, r7\n\t"
  102691. "adc r3, r3, #0\n\t"
  102692. "lsl r7, r9, #16\n\t"
  102693. "lsr r7, r7, #16\n\t"
  102694. "mul r6, r7, r6\n\t"
  102695. "lsr r7, r6, #16\n\t"
  102696. "lsl r6, r6, #16\n\t"
  102697. "adds r4, r4, r6\n\t"
  102698. "adcs r5, r5, r7\n\t"
  102699. "adc r3, r3, #0\n\t"
  102700. #else
  102701. "umull r6, r7, r8, r9\n\t"
  102702. "adds r4, r4, r6\n\t"
  102703. "adcs r5, r5, r7\n\t"
  102704. "adc r3, r3, #0\n\t"
  102705. #endif
  102706. /* A[9] * B[13] */
  102707. "ldr r8, [%[a], #36]\n\t"
  102708. "ldr r9, [%[b], #52]\n\t"
  102709. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102710. "lsl r6, r8, #16\n\t"
  102711. "lsl r7, r9, #16\n\t"
  102712. "lsr r6, r6, #16\n\t"
  102713. "lsr r7, r7, #16\n\t"
  102714. "mul r7, r6, r7\n\t"
  102715. "adds r4, r4, r7\n\t"
  102716. "adcs r5, r5, #0\n\t"
  102717. "adc r3, r3, #0\n\t"
  102718. "lsr r7, r9, #16\n\t"
  102719. "mul r6, r7, r6\n\t"
  102720. "lsr r7, r6, #16\n\t"
  102721. "lsl r6, r6, #16\n\t"
  102722. "adds r4, r4, r6\n\t"
  102723. "adcs r5, r5, r7\n\t"
  102724. "adc r3, r3, #0\n\t"
  102725. "lsr r6, r8, #16\n\t"
  102726. "lsr r7, r9, #16\n\t"
  102727. "mul r7, r6, r7\n\t"
  102728. "adds r5, r5, r7\n\t"
  102729. "adc r3, r3, #0\n\t"
  102730. "lsl r7, r9, #16\n\t"
  102731. "lsr r7, r7, #16\n\t"
  102732. "mul r6, r7, r6\n\t"
  102733. "lsr r7, r6, #16\n\t"
  102734. "lsl r6, r6, #16\n\t"
  102735. "adds r4, r4, r6\n\t"
  102736. "adcs r5, r5, r7\n\t"
  102737. "adc r3, r3, #0\n\t"
  102738. #else
  102739. "umull r6, r7, r8, r9\n\t"
  102740. "adds r4, r4, r6\n\t"
  102741. "adcs r5, r5, r7\n\t"
  102742. "adc r3, r3, #0\n\t"
  102743. #endif
  102744. /* A[8] * B[14] */
  102745. "ldr r8, [%[a], #32]\n\t"
  102746. "ldr r9, [%[b], #56]\n\t"
  102747. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102748. "lsl r6, r8, #16\n\t"
  102749. "lsl r7, r9, #16\n\t"
  102750. "lsr r6, r6, #16\n\t"
  102751. "lsr r7, r7, #16\n\t"
  102752. "mul r7, r6, r7\n\t"
  102753. "adds r4, r4, r7\n\t"
  102754. "adcs r5, r5, #0\n\t"
  102755. "adc r3, r3, #0\n\t"
  102756. "lsr r7, r9, #16\n\t"
  102757. "mul r6, r7, r6\n\t"
  102758. "lsr r7, r6, #16\n\t"
  102759. "lsl r6, r6, #16\n\t"
  102760. "adds r4, r4, r6\n\t"
  102761. "adcs r5, r5, r7\n\t"
  102762. "adc r3, r3, #0\n\t"
  102763. "lsr r6, r8, #16\n\t"
  102764. "lsr r7, r9, #16\n\t"
  102765. "mul r7, r6, r7\n\t"
  102766. "adds r5, r5, r7\n\t"
  102767. "adc r3, r3, #0\n\t"
  102768. "lsl r7, r9, #16\n\t"
  102769. "lsr r7, r7, #16\n\t"
  102770. "mul r6, r7, r6\n\t"
  102771. "lsr r7, r6, #16\n\t"
  102772. "lsl r6, r6, #16\n\t"
  102773. "adds r4, r4, r6\n\t"
  102774. "adcs r5, r5, r7\n\t"
  102775. "adc r3, r3, #0\n\t"
  102776. #else
  102777. "umull r6, r7, r8, r9\n\t"
  102778. "adds r4, r4, r6\n\t"
  102779. "adcs r5, r5, r7\n\t"
  102780. "adc r3, r3, #0\n\t"
  102781. #endif
  102782. /* A[7] * B[15] */
  102783. "ldr r8, [%[a], #28]\n\t"
  102784. "ldr r9, [%[b], #60]\n\t"
  102785. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102786. "lsl r6, r8, #16\n\t"
  102787. "lsl r7, r9, #16\n\t"
  102788. "lsr r6, r6, #16\n\t"
  102789. "lsr r7, r7, #16\n\t"
  102790. "mul r7, r6, r7\n\t"
  102791. "adds r4, r4, r7\n\t"
  102792. "adcs r5, r5, #0\n\t"
  102793. "adc r3, r3, #0\n\t"
  102794. "lsr r7, r9, #16\n\t"
  102795. "mul r6, r7, r6\n\t"
  102796. "lsr r7, r6, #16\n\t"
  102797. "lsl r6, r6, #16\n\t"
  102798. "adds r4, r4, r6\n\t"
  102799. "adcs r5, r5, r7\n\t"
  102800. "adc r3, r3, #0\n\t"
  102801. "lsr r6, r8, #16\n\t"
  102802. "lsr r7, r9, #16\n\t"
  102803. "mul r7, r6, r7\n\t"
  102804. "adds r5, r5, r7\n\t"
  102805. "adc r3, r3, #0\n\t"
  102806. "lsl r7, r9, #16\n\t"
  102807. "lsr r7, r7, #16\n\t"
  102808. "mul r6, r7, r6\n\t"
  102809. "lsr r7, r6, #16\n\t"
  102810. "lsl r6, r6, #16\n\t"
  102811. "adds r4, r4, r6\n\t"
  102812. "adcs r5, r5, r7\n\t"
  102813. "adc r3, r3, #0\n\t"
  102814. #else
  102815. "umull r6, r7, r8, r9\n\t"
  102816. "adds r4, r4, r6\n\t"
  102817. "adcs r5, r5, r7\n\t"
  102818. "adc r3, r3, #0\n\t"
  102819. #endif
  102820. /* A[6] * B[16] */
  102821. "ldr r8, [%[a], #24]\n\t"
  102822. "ldr r9, [%[b], #64]\n\t"
  102823. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102824. "lsl r6, r8, #16\n\t"
  102825. "lsl r7, r9, #16\n\t"
  102826. "lsr r6, r6, #16\n\t"
  102827. "lsr r7, r7, #16\n\t"
  102828. "mul r7, r6, r7\n\t"
  102829. "adds r4, r4, r7\n\t"
  102830. "adcs r5, r5, #0\n\t"
  102831. "adc r3, r3, #0\n\t"
  102832. "lsr r7, r9, #16\n\t"
  102833. "mul r6, r7, r6\n\t"
  102834. "lsr r7, r6, #16\n\t"
  102835. "lsl r6, r6, #16\n\t"
  102836. "adds r4, r4, r6\n\t"
  102837. "adcs r5, r5, r7\n\t"
  102838. "adc r3, r3, #0\n\t"
  102839. "lsr r6, r8, #16\n\t"
  102840. "lsr r7, r9, #16\n\t"
  102841. "mul r7, r6, r7\n\t"
  102842. "adds r5, r5, r7\n\t"
  102843. "adc r3, r3, #0\n\t"
  102844. "lsl r7, r9, #16\n\t"
  102845. "lsr r7, r7, #16\n\t"
  102846. "mul r6, r7, r6\n\t"
  102847. "lsr r7, r6, #16\n\t"
  102848. "lsl r6, r6, #16\n\t"
  102849. "adds r4, r4, r6\n\t"
  102850. "adcs r5, r5, r7\n\t"
  102851. "adc r3, r3, #0\n\t"
  102852. #else
  102853. "umull r6, r7, r8, r9\n\t"
  102854. "adds r4, r4, r6\n\t"
  102855. "adcs r5, r5, r7\n\t"
  102856. "adc r3, r3, #0\n\t"
  102857. #endif
  102858. "str r4, [%[r], #88]\n\t"
  102859. /* A[7] * B[16] */
  102860. "ldr r8, [%[a], #28]\n\t"
  102861. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102862. "lsl r6, r8, #16\n\t"
  102863. "lsl r7, r9, #16\n\t"
  102864. "lsr r6, r6, #16\n\t"
  102865. "lsr r7, r7, #16\n\t"
  102866. "mul r7, r6, r7\n\t"
  102867. "adds r5, r5, r7\n\t"
  102868. "adcs r3, r3, #0\n\t"
  102869. "mov r4, #0\n\t"
  102870. "adc r4, r4, #0\n\t"
  102871. "lsr r7, r9, #16\n\t"
  102872. "mul r6, r7, r6\n\t"
  102873. "lsr r7, r6, #16\n\t"
  102874. "lsl r6, r6, #16\n\t"
  102875. "adds r5, r5, r6\n\t"
  102876. "adcs r3, r3, r7\n\t"
  102877. "adc r4, r4, #0\n\t"
  102878. "lsr r6, r8, #16\n\t"
  102879. "lsr r7, r9, #16\n\t"
  102880. "mul r7, r6, r7\n\t"
  102881. "adds r3, r3, r7\n\t"
  102882. "adc r4, r4, #0\n\t"
  102883. "lsl r7, r9, #16\n\t"
  102884. "lsr r7, r7, #16\n\t"
  102885. "mul r6, r7, r6\n\t"
  102886. "lsr r7, r6, #16\n\t"
  102887. "lsl r6, r6, #16\n\t"
  102888. "adds r5, r5, r6\n\t"
  102889. "adcs r3, r3, r7\n\t"
  102890. "adc r4, r4, #0\n\t"
  102891. #else
  102892. "umull r6, r7, r8, r9\n\t"
  102893. "adds r5, r5, r6\n\t"
  102894. "adcs r3, r3, r7\n\t"
  102895. "mov r4, #0\n\t"
  102896. "adc r4, r4, #0\n\t"
  102897. #endif
  102898. /* A[8] * B[15] */
  102899. "ldr r8, [%[a], #32]\n\t"
  102900. "ldr r9, [%[b], #60]\n\t"
  102901. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102902. "lsl r6, r8, #16\n\t"
  102903. "lsl r7, r9, #16\n\t"
  102904. "lsr r6, r6, #16\n\t"
  102905. "lsr r7, r7, #16\n\t"
  102906. "mul r7, r6, r7\n\t"
  102907. "adds r5, r5, r7\n\t"
  102908. "adcs r3, r3, #0\n\t"
  102909. "adc r4, r4, #0\n\t"
  102910. "lsr r7, r9, #16\n\t"
  102911. "mul r6, r7, r6\n\t"
  102912. "lsr r7, r6, #16\n\t"
  102913. "lsl r6, r6, #16\n\t"
  102914. "adds r5, r5, r6\n\t"
  102915. "adcs r3, r3, r7\n\t"
  102916. "adc r4, r4, #0\n\t"
  102917. "lsr r6, r8, #16\n\t"
  102918. "lsr r7, r9, #16\n\t"
  102919. "mul r7, r6, r7\n\t"
  102920. "adds r3, r3, r7\n\t"
  102921. "adc r4, r4, #0\n\t"
  102922. "lsl r7, r9, #16\n\t"
  102923. "lsr r7, r7, #16\n\t"
  102924. "mul r6, r7, r6\n\t"
  102925. "lsr r7, r6, #16\n\t"
  102926. "lsl r6, r6, #16\n\t"
  102927. "adds r5, r5, r6\n\t"
  102928. "adcs r3, r3, r7\n\t"
  102929. "adc r4, r4, #0\n\t"
  102930. #else
  102931. "umull r6, r7, r8, r9\n\t"
  102932. "adds r5, r5, r6\n\t"
  102933. "adcs r3, r3, r7\n\t"
  102934. "adc r4, r4, #0\n\t"
  102935. #endif
  102936. /* A[9] * B[14] */
  102937. "ldr r8, [%[a], #36]\n\t"
  102938. "ldr r9, [%[b], #56]\n\t"
  102939. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102940. "lsl r6, r8, #16\n\t"
  102941. "lsl r7, r9, #16\n\t"
  102942. "lsr r6, r6, #16\n\t"
  102943. "lsr r7, r7, #16\n\t"
  102944. "mul r7, r6, r7\n\t"
  102945. "adds r5, r5, r7\n\t"
  102946. "adcs r3, r3, #0\n\t"
  102947. "adc r4, r4, #0\n\t"
  102948. "lsr r7, r9, #16\n\t"
  102949. "mul r6, r7, r6\n\t"
  102950. "lsr r7, r6, #16\n\t"
  102951. "lsl r6, r6, #16\n\t"
  102952. "adds r5, r5, r6\n\t"
  102953. "adcs r3, r3, r7\n\t"
  102954. "adc r4, r4, #0\n\t"
  102955. "lsr r6, r8, #16\n\t"
  102956. "lsr r7, r9, #16\n\t"
  102957. "mul r7, r6, r7\n\t"
  102958. "adds r3, r3, r7\n\t"
  102959. "adc r4, r4, #0\n\t"
  102960. "lsl r7, r9, #16\n\t"
  102961. "lsr r7, r7, #16\n\t"
  102962. "mul r6, r7, r6\n\t"
  102963. "lsr r7, r6, #16\n\t"
  102964. "lsl r6, r6, #16\n\t"
  102965. "adds r5, r5, r6\n\t"
  102966. "adcs r3, r3, r7\n\t"
  102967. "adc r4, r4, #0\n\t"
  102968. #else
  102969. "umull r6, r7, r8, r9\n\t"
  102970. "adds r5, r5, r6\n\t"
  102971. "adcs r3, r3, r7\n\t"
  102972. "adc r4, r4, #0\n\t"
  102973. #endif
  102974. /* A[10] * B[13] */
  102975. "ldr r8, [%[a], #40]\n\t"
  102976. "ldr r9, [%[b], #52]\n\t"
  102977. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  102978. "lsl r6, r8, #16\n\t"
  102979. "lsl r7, r9, #16\n\t"
  102980. "lsr r6, r6, #16\n\t"
  102981. "lsr r7, r7, #16\n\t"
  102982. "mul r7, r6, r7\n\t"
  102983. "adds r5, r5, r7\n\t"
  102984. "adcs r3, r3, #0\n\t"
  102985. "adc r4, r4, #0\n\t"
  102986. "lsr r7, r9, #16\n\t"
  102987. "mul r6, r7, r6\n\t"
  102988. "lsr r7, r6, #16\n\t"
  102989. "lsl r6, r6, #16\n\t"
  102990. "adds r5, r5, r6\n\t"
  102991. "adcs r3, r3, r7\n\t"
  102992. "adc r4, r4, #0\n\t"
  102993. "lsr r6, r8, #16\n\t"
  102994. "lsr r7, r9, #16\n\t"
  102995. "mul r7, r6, r7\n\t"
  102996. "adds r3, r3, r7\n\t"
  102997. "adc r4, r4, #0\n\t"
  102998. "lsl r7, r9, #16\n\t"
  102999. "lsr r7, r7, #16\n\t"
  103000. "mul r6, r7, r6\n\t"
  103001. "lsr r7, r6, #16\n\t"
  103002. "lsl r6, r6, #16\n\t"
  103003. "adds r5, r5, r6\n\t"
  103004. "adcs r3, r3, r7\n\t"
  103005. "adc r4, r4, #0\n\t"
  103006. #else
  103007. "umull r6, r7, r8, r9\n\t"
  103008. "adds r5, r5, r6\n\t"
  103009. "adcs r3, r3, r7\n\t"
  103010. "adc r4, r4, #0\n\t"
  103011. #endif
  103012. /* A[11] * B[12] */
  103013. "ldr r9, [%[b], #48]\n\t"
  103014. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103015. "lsl r6, r11, #16\n\t"
  103016. "lsl r7, r9, #16\n\t"
  103017. "lsr r6, r6, #16\n\t"
  103018. "lsr r7, r7, #16\n\t"
  103019. "mul r7, r6, r7\n\t"
  103020. "adds r5, r5, r7\n\t"
  103021. "adcs r3, r3, #0\n\t"
  103022. "adc r4, r4, #0\n\t"
  103023. "lsr r7, r9, #16\n\t"
  103024. "mul r6, r7, r6\n\t"
  103025. "lsr r7, r6, #16\n\t"
  103026. "lsl r6, r6, #16\n\t"
  103027. "adds r5, r5, r6\n\t"
  103028. "adcs r3, r3, r7\n\t"
  103029. "adc r4, r4, #0\n\t"
  103030. "lsr r6, r11, #16\n\t"
  103031. "lsr r7, r9, #16\n\t"
  103032. "mul r7, r6, r7\n\t"
  103033. "adds r3, r3, r7\n\t"
  103034. "adc r4, r4, #0\n\t"
  103035. "lsl r7, r9, #16\n\t"
  103036. "lsr r7, r7, #16\n\t"
  103037. "mul r6, r7, r6\n\t"
  103038. "lsr r7, r6, #16\n\t"
  103039. "lsl r6, r6, #16\n\t"
  103040. "adds r5, r5, r6\n\t"
  103041. "adcs r3, r3, r7\n\t"
  103042. "adc r4, r4, #0\n\t"
  103043. #else
  103044. "umull r6, r7, r11, r9\n\t"
  103045. "adds r5, r5, r6\n\t"
  103046. "adcs r3, r3, r7\n\t"
  103047. "adc r4, r4, #0\n\t"
  103048. #endif
  103049. /* A[12] * B[11] */
  103050. "ldr r8, [%[a], #48]\n\t"
  103051. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103052. "lsl r6, r8, #16\n\t"
  103053. "lsl r7, r12, #16\n\t"
  103054. "lsr r6, r6, #16\n\t"
  103055. "lsr r7, r7, #16\n\t"
  103056. "mul r7, r6, r7\n\t"
  103057. "adds r5, r5, r7\n\t"
  103058. "adcs r3, r3, #0\n\t"
  103059. "adc r4, r4, #0\n\t"
  103060. "lsr r7, r12, #16\n\t"
  103061. "mul r6, r7, r6\n\t"
  103062. "lsr r7, r6, #16\n\t"
  103063. "lsl r6, r6, #16\n\t"
  103064. "adds r5, r5, r6\n\t"
  103065. "adcs r3, r3, r7\n\t"
  103066. "adc r4, r4, #0\n\t"
  103067. "lsr r6, r8, #16\n\t"
  103068. "lsr r7, r12, #16\n\t"
  103069. "mul r7, r6, r7\n\t"
  103070. "adds r3, r3, r7\n\t"
  103071. "adc r4, r4, #0\n\t"
  103072. "lsl r7, r12, #16\n\t"
  103073. "lsr r7, r7, #16\n\t"
  103074. "mul r6, r7, r6\n\t"
  103075. "lsr r7, r6, #16\n\t"
  103076. "lsl r6, r6, #16\n\t"
  103077. "adds r5, r5, r6\n\t"
  103078. "adcs r3, r3, r7\n\t"
  103079. "adc r4, r4, #0\n\t"
  103080. #else
  103081. "umull r6, r7, r8, r12\n\t"
  103082. "adds r5, r5, r6\n\t"
  103083. "adcs r3, r3, r7\n\t"
  103084. "adc r4, r4, #0\n\t"
  103085. #endif
  103086. /* A[13] * B[10] */
  103087. "ldr r8, [%[a], #52]\n\t"
  103088. "ldr r9, [%[b], #40]\n\t"
  103089. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103090. "lsl r6, r8, #16\n\t"
  103091. "lsl r7, r9, #16\n\t"
  103092. "lsr r6, r6, #16\n\t"
  103093. "lsr r7, r7, #16\n\t"
  103094. "mul r7, r6, r7\n\t"
  103095. "adds r5, r5, r7\n\t"
  103096. "adcs r3, r3, #0\n\t"
  103097. "adc r4, r4, #0\n\t"
  103098. "lsr r7, r9, #16\n\t"
  103099. "mul r6, r7, r6\n\t"
  103100. "lsr r7, r6, #16\n\t"
  103101. "lsl r6, r6, #16\n\t"
  103102. "adds r5, r5, r6\n\t"
  103103. "adcs r3, r3, r7\n\t"
  103104. "adc r4, r4, #0\n\t"
  103105. "lsr r6, r8, #16\n\t"
  103106. "lsr r7, r9, #16\n\t"
  103107. "mul r7, r6, r7\n\t"
  103108. "adds r3, r3, r7\n\t"
  103109. "adc r4, r4, #0\n\t"
  103110. "lsl r7, r9, #16\n\t"
  103111. "lsr r7, r7, #16\n\t"
  103112. "mul r6, r7, r6\n\t"
  103113. "lsr r7, r6, #16\n\t"
  103114. "lsl r6, r6, #16\n\t"
  103115. "adds r5, r5, r6\n\t"
  103116. "adcs r3, r3, r7\n\t"
  103117. "adc r4, r4, #0\n\t"
  103118. #else
  103119. "umull r6, r7, r8, r9\n\t"
  103120. "adds r5, r5, r6\n\t"
  103121. "adcs r3, r3, r7\n\t"
  103122. "adc r4, r4, #0\n\t"
  103123. #endif
  103124. /* A[14] * B[9] */
  103125. "ldr r8, [%[a], #56]\n\t"
  103126. "ldr r9, [%[b], #36]\n\t"
  103127. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103128. "lsl r6, r8, #16\n\t"
  103129. "lsl r7, r9, #16\n\t"
  103130. "lsr r6, r6, #16\n\t"
  103131. "lsr r7, r7, #16\n\t"
  103132. "mul r7, r6, r7\n\t"
  103133. "adds r5, r5, r7\n\t"
  103134. "adcs r3, r3, #0\n\t"
  103135. "adc r4, r4, #0\n\t"
  103136. "lsr r7, r9, #16\n\t"
  103137. "mul r6, r7, r6\n\t"
  103138. "lsr r7, r6, #16\n\t"
  103139. "lsl r6, r6, #16\n\t"
  103140. "adds r5, r5, r6\n\t"
  103141. "adcs r3, r3, r7\n\t"
  103142. "adc r4, r4, #0\n\t"
  103143. "lsr r6, r8, #16\n\t"
  103144. "lsr r7, r9, #16\n\t"
  103145. "mul r7, r6, r7\n\t"
  103146. "adds r3, r3, r7\n\t"
  103147. "adc r4, r4, #0\n\t"
  103148. "lsl r7, r9, #16\n\t"
  103149. "lsr r7, r7, #16\n\t"
  103150. "mul r6, r7, r6\n\t"
  103151. "lsr r7, r6, #16\n\t"
  103152. "lsl r6, r6, #16\n\t"
  103153. "adds r5, r5, r6\n\t"
  103154. "adcs r3, r3, r7\n\t"
  103155. "adc r4, r4, #0\n\t"
  103156. #else
  103157. "umull r6, r7, r8, r9\n\t"
  103158. "adds r5, r5, r6\n\t"
  103159. "adcs r3, r3, r7\n\t"
  103160. "adc r4, r4, #0\n\t"
  103161. #endif
  103162. /* A[15] * B[8] */
  103163. "ldr r8, [%[a], #60]\n\t"
  103164. "ldr r9, [%[b], #32]\n\t"
  103165. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103166. "lsl r6, r8, #16\n\t"
  103167. "lsl r7, r9, #16\n\t"
  103168. "lsr r6, r6, #16\n\t"
  103169. "lsr r7, r7, #16\n\t"
  103170. "mul r7, r6, r7\n\t"
  103171. "adds r5, r5, r7\n\t"
  103172. "adcs r3, r3, #0\n\t"
  103173. "adc r4, r4, #0\n\t"
  103174. "lsr r7, r9, #16\n\t"
  103175. "mul r6, r7, r6\n\t"
  103176. "lsr r7, r6, #16\n\t"
  103177. "lsl r6, r6, #16\n\t"
  103178. "adds r5, r5, r6\n\t"
  103179. "adcs r3, r3, r7\n\t"
  103180. "adc r4, r4, #0\n\t"
  103181. "lsr r6, r8, #16\n\t"
  103182. "lsr r7, r9, #16\n\t"
  103183. "mul r7, r6, r7\n\t"
  103184. "adds r3, r3, r7\n\t"
  103185. "adc r4, r4, #0\n\t"
  103186. "lsl r7, r9, #16\n\t"
  103187. "lsr r7, r7, #16\n\t"
  103188. "mul r6, r7, r6\n\t"
  103189. "lsr r7, r6, #16\n\t"
  103190. "lsl r6, r6, #16\n\t"
  103191. "adds r5, r5, r6\n\t"
  103192. "adcs r3, r3, r7\n\t"
  103193. "adc r4, r4, #0\n\t"
  103194. #else
  103195. "umull r6, r7, r8, r9\n\t"
  103196. "adds r5, r5, r6\n\t"
  103197. "adcs r3, r3, r7\n\t"
  103198. "adc r4, r4, #0\n\t"
  103199. #endif
  103200. /* A[16] * B[7] */
  103201. "ldr r8, [%[a], #64]\n\t"
  103202. "ldr r9, [%[b], #28]\n\t"
  103203. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103204. "lsl r6, r8, #16\n\t"
  103205. "lsl r7, r9, #16\n\t"
  103206. "lsr r6, r6, #16\n\t"
  103207. "lsr r7, r7, #16\n\t"
  103208. "mul r7, r6, r7\n\t"
  103209. "adds r5, r5, r7\n\t"
  103210. "adcs r3, r3, #0\n\t"
  103211. "adc r4, r4, #0\n\t"
  103212. "lsr r7, r9, #16\n\t"
  103213. "mul r6, r7, r6\n\t"
  103214. "lsr r7, r6, #16\n\t"
  103215. "lsl r6, r6, #16\n\t"
  103216. "adds r5, r5, r6\n\t"
  103217. "adcs r3, r3, r7\n\t"
  103218. "adc r4, r4, #0\n\t"
  103219. "lsr r6, r8, #16\n\t"
  103220. "lsr r7, r9, #16\n\t"
  103221. "mul r7, r6, r7\n\t"
  103222. "adds r3, r3, r7\n\t"
  103223. "adc r4, r4, #0\n\t"
  103224. "lsl r7, r9, #16\n\t"
  103225. "lsr r7, r7, #16\n\t"
  103226. "mul r6, r7, r6\n\t"
  103227. "lsr r7, r6, #16\n\t"
  103228. "lsl r6, r6, #16\n\t"
  103229. "adds r5, r5, r6\n\t"
  103230. "adcs r3, r3, r7\n\t"
  103231. "adc r4, r4, #0\n\t"
  103232. #else
  103233. "umull r6, r7, r8, r9\n\t"
  103234. "adds r5, r5, r6\n\t"
  103235. "adcs r3, r3, r7\n\t"
  103236. "adc r4, r4, #0\n\t"
  103237. #endif
  103238. "str r5, [%[r], #92]\n\t"
  103239. /* A[16] * B[8] */
  103240. "ldr r9, [%[b], #32]\n\t"
  103241. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103242. "lsl r6, r8, #16\n\t"
  103243. "lsl r7, r9, #16\n\t"
  103244. "lsr r6, r6, #16\n\t"
  103245. "lsr r7, r7, #16\n\t"
  103246. "mul r7, r6, r7\n\t"
  103247. "adds r3, r3, r7\n\t"
  103248. "adcs r4, r4, #0\n\t"
  103249. "mov r5, #0\n\t"
  103250. "adc r5, r5, #0\n\t"
  103251. "lsr r7, r9, #16\n\t"
  103252. "mul r6, r7, r6\n\t"
  103253. "lsr r7, r6, #16\n\t"
  103254. "lsl r6, r6, #16\n\t"
  103255. "adds r3, r3, r6\n\t"
  103256. "adcs r4, r4, r7\n\t"
  103257. "adc r5, r5, #0\n\t"
  103258. "lsr r6, r8, #16\n\t"
  103259. "lsr r7, r9, #16\n\t"
  103260. "mul r7, r6, r7\n\t"
  103261. "adds r4, r4, r7\n\t"
  103262. "adc r5, r5, #0\n\t"
  103263. "lsl r7, r9, #16\n\t"
  103264. "lsr r7, r7, #16\n\t"
  103265. "mul r6, r7, r6\n\t"
  103266. "lsr r7, r6, #16\n\t"
  103267. "lsl r6, r6, #16\n\t"
  103268. "adds r3, r3, r6\n\t"
  103269. "adcs r4, r4, r7\n\t"
  103270. "adc r5, r5, #0\n\t"
  103271. #else
  103272. "umull r6, r7, r8, r9\n\t"
  103273. "adds r3, r3, r6\n\t"
  103274. "adcs r4, r4, r7\n\t"
  103275. "mov r5, #0\n\t"
  103276. "adc r5, r5, #0\n\t"
  103277. #endif
  103278. /* A[15] * B[9] */
  103279. "ldr r8, [%[a], #60]\n\t"
  103280. "ldr r9, [%[b], #36]\n\t"
  103281. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103282. "lsl r6, r8, #16\n\t"
  103283. "lsl r7, r9, #16\n\t"
  103284. "lsr r6, r6, #16\n\t"
  103285. "lsr r7, r7, #16\n\t"
  103286. "mul r7, r6, r7\n\t"
  103287. "adds r3, r3, r7\n\t"
  103288. "adcs r4, r4, #0\n\t"
  103289. "adc r5, r5, #0\n\t"
  103290. "lsr r7, r9, #16\n\t"
  103291. "mul r6, r7, r6\n\t"
  103292. "lsr r7, r6, #16\n\t"
  103293. "lsl r6, r6, #16\n\t"
  103294. "adds r3, r3, r6\n\t"
  103295. "adcs r4, r4, r7\n\t"
  103296. "adc r5, r5, #0\n\t"
  103297. "lsr r6, r8, #16\n\t"
  103298. "lsr r7, r9, #16\n\t"
  103299. "mul r7, r6, r7\n\t"
  103300. "adds r4, r4, r7\n\t"
  103301. "adc r5, r5, #0\n\t"
  103302. "lsl r7, r9, #16\n\t"
  103303. "lsr r7, r7, #16\n\t"
  103304. "mul r6, r7, r6\n\t"
  103305. "lsr r7, r6, #16\n\t"
  103306. "lsl r6, r6, #16\n\t"
  103307. "adds r3, r3, r6\n\t"
  103308. "adcs r4, r4, r7\n\t"
  103309. "adc r5, r5, #0\n\t"
  103310. #else
  103311. "umull r6, r7, r8, r9\n\t"
  103312. "adds r3, r3, r6\n\t"
  103313. "adcs r4, r4, r7\n\t"
  103314. "adc r5, r5, #0\n\t"
  103315. #endif
  103316. /* A[14] * B[10] */
  103317. "ldr r8, [%[a], #56]\n\t"
  103318. "ldr r9, [%[b], #40]\n\t"
  103319. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103320. "lsl r6, r8, #16\n\t"
  103321. "lsl r7, r9, #16\n\t"
  103322. "lsr r6, r6, #16\n\t"
  103323. "lsr r7, r7, #16\n\t"
  103324. "mul r7, r6, r7\n\t"
  103325. "adds r3, r3, r7\n\t"
  103326. "adcs r4, r4, #0\n\t"
  103327. "adc r5, r5, #0\n\t"
  103328. "lsr r7, r9, #16\n\t"
  103329. "mul r6, r7, r6\n\t"
  103330. "lsr r7, r6, #16\n\t"
  103331. "lsl r6, r6, #16\n\t"
  103332. "adds r3, r3, r6\n\t"
  103333. "adcs r4, r4, r7\n\t"
  103334. "adc r5, r5, #0\n\t"
  103335. "lsr r6, r8, #16\n\t"
  103336. "lsr r7, r9, #16\n\t"
  103337. "mul r7, r6, r7\n\t"
  103338. "adds r4, r4, r7\n\t"
  103339. "adc r5, r5, #0\n\t"
  103340. "lsl r7, r9, #16\n\t"
  103341. "lsr r7, r7, #16\n\t"
  103342. "mul r6, r7, r6\n\t"
  103343. "lsr r7, r6, #16\n\t"
  103344. "lsl r6, r6, #16\n\t"
  103345. "adds r3, r3, r6\n\t"
  103346. "adcs r4, r4, r7\n\t"
  103347. "adc r5, r5, #0\n\t"
  103348. #else
  103349. "umull r6, r7, r8, r9\n\t"
  103350. "adds r3, r3, r6\n\t"
  103351. "adcs r4, r4, r7\n\t"
  103352. "adc r5, r5, #0\n\t"
  103353. #endif
  103354. /* A[13] * B[11] */
  103355. "ldr r8, [%[a], #52]\n\t"
  103356. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103357. "lsl r6, r8, #16\n\t"
  103358. "lsl r7, r12, #16\n\t"
  103359. "lsr r6, r6, #16\n\t"
  103360. "lsr r7, r7, #16\n\t"
  103361. "mul r7, r6, r7\n\t"
  103362. "adds r3, r3, r7\n\t"
  103363. "adcs r4, r4, #0\n\t"
  103364. "adc r5, r5, #0\n\t"
  103365. "lsr r7, r12, #16\n\t"
  103366. "mul r6, r7, r6\n\t"
  103367. "lsr r7, r6, #16\n\t"
  103368. "lsl r6, r6, #16\n\t"
  103369. "adds r3, r3, r6\n\t"
  103370. "adcs r4, r4, r7\n\t"
  103371. "adc r5, r5, #0\n\t"
  103372. "lsr r6, r8, #16\n\t"
  103373. "lsr r7, r12, #16\n\t"
  103374. "mul r7, r6, r7\n\t"
  103375. "adds r4, r4, r7\n\t"
  103376. "adc r5, r5, #0\n\t"
  103377. "lsl r7, r12, #16\n\t"
  103378. "lsr r7, r7, #16\n\t"
  103379. "mul r6, r7, r6\n\t"
  103380. "lsr r7, r6, #16\n\t"
  103381. "lsl r6, r6, #16\n\t"
  103382. "adds r3, r3, r6\n\t"
  103383. "adcs r4, r4, r7\n\t"
  103384. "adc r5, r5, #0\n\t"
  103385. #else
  103386. "umull r6, r7, r8, r12\n\t"
  103387. "adds r3, r3, r6\n\t"
  103388. "adcs r4, r4, r7\n\t"
  103389. "adc r5, r5, #0\n\t"
  103390. #endif
  103391. /* A[12] * B[12] */
  103392. "ldr r11, [%[a], #48]\n\t"
  103393. "ldr r12, [%[b], #48]\n\t"
  103394. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103395. "lsl r6, r11, #16\n\t"
  103396. "lsl r7, r12, #16\n\t"
  103397. "lsr r6, r6, #16\n\t"
  103398. "lsr r7, r7, #16\n\t"
  103399. "mul r7, r6, r7\n\t"
  103400. "adds r3, r3, r7\n\t"
  103401. "adcs r4, r4, #0\n\t"
  103402. "adc r5, r5, #0\n\t"
  103403. "lsr r7, r12, #16\n\t"
  103404. "mul r6, r7, r6\n\t"
  103405. "lsr r7, r6, #16\n\t"
  103406. "lsl r6, r6, #16\n\t"
  103407. "adds r3, r3, r6\n\t"
  103408. "adcs r4, r4, r7\n\t"
  103409. "adc r5, r5, #0\n\t"
  103410. "lsr r6, r11, #16\n\t"
  103411. "lsr r7, r12, #16\n\t"
  103412. "mul r7, r6, r7\n\t"
  103413. "adds r4, r4, r7\n\t"
  103414. "adc r5, r5, #0\n\t"
  103415. "lsl r7, r12, #16\n\t"
  103416. "lsr r7, r7, #16\n\t"
  103417. "mul r6, r7, r6\n\t"
  103418. "lsr r7, r6, #16\n\t"
  103419. "lsl r6, r6, #16\n\t"
  103420. "adds r3, r3, r6\n\t"
  103421. "adcs r4, r4, r7\n\t"
  103422. "adc r5, r5, #0\n\t"
  103423. #else
  103424. "umull r6, r7, r11, r12\n\t"
  103425. "adds r3, r3, r6\n\t"
  103426. "adcs r4, r4, r7\n\t"
  103427. "adc r5, r5, #0\n\t"
  103428. #endif
  103429. /* A[11] * B[13] */
  103430. "ldr r8, [%[a], #44]\n\t"
  103431. "ldr r9, [%[b], #52]\n\t"
  103432. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103433. "lsl r6, r8, #16\n\t"
  103434. "lsl r7, r9, #16\n\t"
  103435. "lsr r6, r6, #16\n\t"
  103436. "lsr r7, r7, #16\n\t"
  103437. "mul r7, r6, r7\n\t"
  103438. "adds r3, r3, r7\n\t"
  103439. "adcs r4, r4, #0\n\t"
  103440. "adc r5, r5, #0\n\t"
  103441. "lsr r7, r9, #16\n\t"
  103442. "mul r6, r7, r6\n\t"
  103443. "lsr r7, r6, #16\n\t"
  103444. "lsl r6, r6, #16\n\t"
  103445. "adds r3, r3, r6\n\t"
  103446. "adcs r4, r4, r7\n\t"
  103447. "adc r5, r5, #0\n\t"
  103448. "lsr r6, r8, #16\n\t"
  103449. "lsr r7, r9, #16\n\t"
  103450. "mul r7, r6, r7\n\t"
  103451. "adds r4, r4, r7\n\t"
  103452. "adc r5, r5, #0\n\t"
  103453. "lsl r7, r9, #16\n\t"
  103454. "lsr r7, r7, #16\n\t"
  103455. "mul r6, r7, r6\n\t"
  103456. "lsr r7, r6, #16\n\t"
  103457. "lsl r6, r6, #16\n\t"
  103458. "adds r3, r3, r6\n\t"
  103459. "adcs r4, r4, r7\n\t"
  103460. "adc r5, r5, #0\n\t"
  103461. #else
  103462. "umull r6, r7, r8, r9\n\t"
  103463. "adds r3, r3, r6\n\t"
  103464. "adcs r4, r4, r7\n\t"
  103465. "adc r5, r5, #0\n\t"
  103466. #endif
  103467. /* A[10] * B[14] */
  103468. "ldr r8, [%[a], #40]\n\t"
  103469. "ldr r9, [%[b], #56]\n\t"
  103470. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103471. "lsl r6, r8, #16\n\t"
  103472. "lsl r7, r9, #16\n\t"
  103473. "lsr r6, r6, #16\n\t"
  103474. "lsr r7, r7, #16\n\t"
  103475. "mul r7, r6, r7\n\t"
  103476. "adds r3, r3, r7\n\t"
  103477. "adcs r4, r4, #0\n\t"
  103478. "adc r5, r5, #0\n\t"
  103479. "lsr r7, r9, #16\n\t"
  103480. "mul r6, r7, r6\n\t"
  103481. "lsr r7, r6, #16\n\t"
  103482. "lsl r6, r6, #16\n\t"
  103483. "adds r3, r3, r6\n\t"
  103484. "adcs r4, r4, r7\n\t"
  103485. "adc r5, r5, #0\n\t"
  103486. "lsr r6, r8, #16\n\t"
  103487. "lsr r7, r9, #16\n\t"
  103488. "mul r7, r6, r7\n\t"
  103489. "adds r4, r4, r7\n\t"
  103490. "adc r5, r5, #0\n\t"
  103491. "lsl r7, r9, #16\n\t"
  103492. "lsr r7, r7, #16\n\t"
  103493. "mul r6, r7, r6\n\t"
  103494. "lsr r7, r6, #16\n\t"
  103495. "lsl r6, r6, #16\n\t"
  103496. "adds r3, r3, r6\n\t"
  103497. "adcs r4, r4, r7\n\t"
  103498. "adc r5, r5, #0\n\t"
  103499. #else
  103500. "umull r6, r7, r8, r9\n\t"
  103501. "adds r3, r3, r6\n\t"
  103502. "adcs r4, r4, r7\n\t"
  103503. "adc r5, r5, #0\n\t"
  103504. #endif
  103505. /* A[9] * B[15] */
  103506. "ldr r8, [%[a], #36]\n\t"
  103507. "ldr r9, [%[b], #60]\n\t"
  103508. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103509. "lsl r6, r8, #16\n\t"
  103510. "lsl r7, r9, #16\n\t"
  103511. "lsr r6, r6, #16\n\t"
  103512. "lsr r7, r7, #16\n\t"
  103513. "mul r7, r6, r7\n\t"
  103514. "adds r3, r3, r7\n\t"
  103515. "adcs r4, r4, #0\n\t"
  103516. "adc r5, r5, #0\n\t"
  103517. "lsr r7, r9, #16\n\t"
  103518. "mul r6, r7, r6\n\t"
  103519. "lsr r7, r6, #16\n\t"
  103520. "lsl r6, r6, #16\n\t"
  103521. "adds r3, r3, r6\n\t"
  103522. "adcs r4, r4, r7\n\t"
  103523. "adc r5, r5, #0\n\t"
  103524. "lsr r6, r8, #16\n\t"
  103525. "lsr r7, r9, #16\n\t"
  103526. "mul r7, r6, r7\n\t"
  103527. "adds r4, r4, r7\n\t"
  103528. "adc r5, r5, #0\n\t"
  103529. "lsl r7, r9, #16\n\t"
  103530. "lsr r7, r7, #16\n\t"
  103531. "mul r6, r7, r6\n\t"
  103532. "lsr r7, r6, #16\n\t"
  103533. "lsl r6, r6, #16\n\t"
  103534. "adds r3, r3, r6\n\t"
  103535. "adcs r4, r4, r7\n\t"
  103536. "adc r5, r5, #0\n\t"
  103537. #else
  103538. "umull r6, r7, r8, r9\n\t"
  103539. "adds r3, r3, r6\n\t"
  103540. "adcs r4, r4, r7\n\t"
  103541. "adc r5, r5, #0\n\t"
  103542. #endif
  103543. /* A[8] * B[16] */
  103544. "ldr r8, [%[a], #32]\n\t"
  103545. "ldr r9, [%[b], #64]\n\t"
  103546. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103547. "lsl r6, r8, #16\n\t"
  103548. "lsl r7, r9, #16\n\t"
  103549. "lsr r6, r6, #16\n\t"
  103550. "lsr r7, r7, #16\n\t"
  103551. "mul r7, r6, r7\n\t"
  103552. "adds r3, r3, r7\n\t"
  103553. "adcs r4, r4, #0\n\t"
  103554. "adc r5, r5, #0\n\t"
  103555. "lsr r7, r9, #16\n\t"
  103556. "mul r6, r7, r6\n\t"
  103557. "lsr r7, r6, #16\n\t"
  103558. "lsl r6, r6, #16\n\t"
  103559. "adds r3, r3, r6\n\t"
  103560. "adcs r4, r4, r7\n\t"
  103561. "adc r5, r5, #0\n\t"
  103562. "lsr r6, r8, #16\n\t"
  103563. "lsr r7, r9, #16\n\t"
  103564. "mul r7, r6, r7\n\t"
  103565. "adds r4, r4, r7\n\t"
  103566. "adc r5, r5, #0\n\t"
  103567. "lsl r7, r9, #16\n\t"
  103568. "lsr r7, r7, #16\n\t"
  103569. "mul r6, r7, r6\n\t"
  103570. "lsr r7, r6, #16\n\t"
  103571. "lsl r6, r6, #16\n\t"
  103572. "adds r3, r3, r6\n\t"
  103573. "adcs r4, r4, r7\n\t"
  103574. "adc r5, r5, #0\n\t"
  103575. #else
  103576. "umull r6, r7, r8, r9\n\t"
  103577. "adds r3, r3, r6\n\t"
  103578. "adcs r4, r4, r7\n\t"
  103579. "adc r5, r5, #0\n\t"
  103580. #endif
  103581. "str r3, [%[r], #96]\n\t"
  103582. /* A[9] * B[16] */
  103583. "ldr r8, [%[a], #36]\n\t"
  103584. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103585. "lsl r6, r8, #16\n\t"
  103586. "lsl r7, r9, #16\n\t"
  103587. "lsr r6, r6, #16\n\t"
  103588. "lsr r7, r7, #16\n\t"
  103589. "mul r7, r6, r7\n\t"
  103590. "adds r4, r4, r7\n\t"
  103591. "adcs r5, r5, #0\n\t"
  103592. "mov r3, #0\n\t"
  103593. "adc r3, r3, #0\n\t"
  103594. "lsr r7, r9, #16\n\t"
  103595. "mul r6, r7, r6\n\t"
  103596. "lsr r7, r6, #16\n\t"
  103597. "lsl r6, r6, #16\n\t"
  103598. "adds r4, r4, r6\n\t"
  103599. "adcs r5, r5, r7\n\t"
  103600. "adc r3, r3, #0\n\t"
  103601. "lsr r6, r8, #16\n\t"
  103602. "lsr r7, r9, #16\n\t"
  103603. "mul r7, r6, r7\n\t"
  103604. "adds r5, r5, r7\n\t"
  103605. "adc r3, r3, #0\n\t"
  103606. "lsl r7, r9, #16\n\t"
  103607. "lsr r7, r7, #16\n\t"
  103608. "mul r6, r7, r6\n\t"
  103609. "lsr r7, r6, #16\n\t"
  103610. "lsl r6, r6, #16\n\t"
  103611. "adds r4, r4, r6\n\t"
  103612. "adcs r5, r5, r7\n\t"
  103613. "adc r3, r3, #0\n\t"
  103614. #else
  103615. "umull r6, r7, r8, r9\n\t"
  103616. "adds r4, r4, r6\n\t"
  103617. "adcs r5, r5, r7\n\t"
  103618. "mov r3, #0\n\t"
  103619. "adc r3, r3, #0\n\t"
  103620. #endif
  103621. /* A[10] * B[15] */
  103622. "ldr r8, [%[a], #40]\n\t"
  103623. "ldr r9, [%[b], #60]\n\t"
  103624. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103625. "lsl r6, r8, #16\n\t"
  103626. "lsl r7, r9, #16\n\t"
  103627. "lsr r6, r6, #16\n\t"
  103628. "lsr r7, r7, #16\n\t"
  103629. "mul r7, r6, r7\n\t"
  103630. "adds r4, r4, r7\n\t"
  103631. "adcs r5, r5, #0\n\t"
  103632. "adc r3, r3, #0\n\t"
  103633. "lsr r7, r9, #16\n\t"
  103634. "mul r6, r7, r6\n\t"
  103635. "lsr r7, r6, #16\n\t"
  103636. "lsl r6, r6, #16\n\t"
  103637. "adds r4, r4, r6\n\t"
  103638. "adcs r5, r5, r7\n\t"
  103639. "adc r3, r3, #0\n\t"
  103640. "lsr r6, r8, #16\n\t"
  103641. "lsr r7, r9, #16\n\t"
  103642. "mul r7, r6, r7\n\t"
  103643. "adds r5, r5, r7\n\t"
  103644. "adc r3, r3, #0\n\t"
  103645. "lsl r7, r9, #16\n\t"
  103646. "lsr r7, r7, #16\n\t"
  103647. "mul r6, r7, r6\n\t"
  103648. "lsr r7, r6, #16\n\t"
  103649. "lsl r6, r6, #16\n\t"
  103650. "adds r4, r4, r6\n\t"
  103651. "adcs r5, r5, r7\n\t"
  103652. "adc r3, r3, #0\n\t"
  103653. #else
  103654. "umull r6, r7, r8, r9\n\t"
  103655. "adds r4, r4, r6\n\t"
  103656. "adcs r5, r5, r7\n\t"
  103657. "adc r3, r3, #0\n\t"
  103658. #endif
  103659. /* A[11] * B[14] */
  103660. "ldr r8, [%[a], #44]\n\t"
  103661. "ldr r9, [%[b], #56]\n\t"
  103662. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103663. "lsl r6, r8, #16\n\t"
  103664. "lsl r7, r9, #16\n\t"
  103665. "lsr r6, r6, #16\n\t"
  103666. "lsr r7, r7, #16\n\t"
  103667. "mul r7, r6, r7\n\t"
  103668. "adds r4, r4, r7\n\t"
  103669. "adcs r5, r5, #0\n\t"
  103670. "adc r3, r3, #0\n\t"
  103671. "lsr r7, r9, #16\n\t"
  103672. "mul r6, r7, r6\n\t"
  103673. "lsr r7, r6, #16\n\t"
  103674. "lsl r6, r6, #16\n\t"
  103675. "adds r4, r4, r6\n\t"
  103676. "adcs r5, r5, r7\n\t"
  103677. "adc r3, r3, #0\n\t"
  103678. "lsr r6, r8, #16\n\t"
  103679. "lsr r7, r9, #16\n\t"
  103680. "mul r7, r6, r7\n\t"
  103681. "adds r5, r5, r7\n\t"
  103682. "adc r3, r3, #0\n\t"
  103683. "lsl r7, r9, #16\n\t"
  103684. "lsr r7, r7, #16\n\t"
  103685. "mul r6, r7, r6\n\t"
  103686. "lsr r7, r6, #16\n\t"
  103687. "lsl r6, r6, #16\n\t"
  103688. "adds r4, r4, r6\n\t"
  103689. "adcs r5, r5, r7\n\t"
  103690. "adc r3, r3, #0\n\t"
  103691. #else
  103692. "umull r6, r7, r8, r9\n\t"
  103693. "adds r4, r4, r6\n\t"
  103694. "adcs r5, r5, r7\n\t"
  103695. "adc r3, r3, #0\n\t"
  103696. #endif
  103697. /* A[12] * B[13] */
  103698. "ldr r9, [%[b], #52]\n\t"
  103699. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103700. "lsl r6, r11, #16\n\t"
  103701. "lsl r7, r9, #16\n\t"
  103702. "lsr r6, r6, #16\n\t"
  103703. "lsr r7, r7, #16\n\t"
  103704. "mul r7, r6, r7\n\t"
  103705. "adds r4, r4, r7\n\t"
  103706. "adcs r5, r5, #0\n\t"
  103707. "adc r3, r3, #0\n\t"
  103708. "lsr r7, r9, #16\n\t"
  103709. "mul r6, r7, r6\n\t"
  103710. "lsr r7, r6, #16\n\t"
  103711. "lsl r6, r6, #16\n\t"
  103712. "adds r4, r4, r6\n\t"
  103713. "adcs r5, r5, r7\n\t"
  103714. "adc r3, r3, #0\n\t"
  103715. "lsr r6, r11, #16\n\t"
  103716. "lsr r7, r9, #16\n\t"
  103717. "mul r7, r6, r7\n\t"
  103718. "adds r5, r5, r7\n\t"
  103719. "adc r3, r3, #0\n\t"
  103720. "lsl r7, r9, #16\n\t"
  103721. "lsr r7, r7, #16\n\t"
  103722. "mul r6, r7, r6\n\t"
  103723. "lsr r7, r6, #16\n\t"
  103724. "lsl r6, r6, #16\n\t"
  103725. "adds r4, r4, r6\n\t"
  103726. "adcs r5, r5, r7\n\t"
  103727. "adc r3, r3, #0\n\t"
  103728. #else
  103729. "umull r6, r7, r11, r9\n\t"
  103730. "adds r4, r4, r6\n\t"
  103731. "adcs r5, r5, r7\n\t"
  103732. "adc r3, r3, #0\n\t"
  103733. #endif
  103734. /* A[13] * B[12] */
  103735. "ldr r8, [%[a], #52]\n\t"
  103736. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103737. "lsl r6, r8, #16\n\t"
  103738. "lsl r7, r12, #16\n\t"
  103739. "lsr r6, r6, #16\n\t"
  103740. "lsr r7, r7, #16\n\t"
  103741. "mul r7, r6, r7\n\t"
  103742. "adds r4, r4, r7\n\t"
  103743. "adcs r5, r5, #0\n\t"
  103744. "adc r3, r3, #0\n\t"
  103745. "lsr r7, r12, #16\n\t"
  103746. "mul r6, r7, r6\n\t"
  103747. "lsr r7, r6, #16\n\t"
  103748. "lsl r6, r6, #16\n\t"
  103749. "adds r4, r4, r6\n\t"
  103750. "adcs r5, r5, r7\n\t"
  103751. "adc r3, r3, #0\n\t"
  103752. "lsr r6, r8, #16\n\t"
  103753. "lsr r7, r12, #16\n\t"
  103754. "mul r7, r6, r7\n\t"
  103755. "adds r5, r5, r7\n\t"
  103756. "adc r3, r3, #0\n\t"
  103757. "lsl r7, r12, #16\n\t"
  103758. "lsr r7, r7, #16\n\t"
  103759. "mul r6, r7, r6\n\t"
  103760. "lsr r7, r6, #16\n\t"
  103761. "lsl r6, r6, #16\n\t"
  103762. "adds r4, r4, r6\n\t"
  103763. "adcs r5, r5, r7\n\t"
  103764. "adc r3, r3, #0\n\t"
  103765. #else
  103766. "umull r6, r7, r8, r12\n\t"
  103767. "adds r4, r4, r6\n\t"
  103768. "adcs r5, r5, r7\n\t"
  103769. "adc r3, r3, #0\n\t"
  103770. #endif
  103771. /* A[14] * B[11] */
  103772. "ldr r8, [%[a], #56]\n\t"
  103773. "ldr r9, [%[b], #44]\n\t"
  103774. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103775. "lsl r6, r8, #16\n\t"
  103776. "lsl r7, r9, #16\n\t"
  103777. "lsr r6, r6, #16\n\t"
  103778. "lsr r7, r7, #16\n\t"
  103779. "mul r7, r6, r7\n\t"
  103780. "adds r4, r4, r7\n\t"
  103781. "adcs r5, r5, #0\n\t"
  103782. "adc r3, r3, #0\n\t"
  103783. "lsr r7, r9, #16\n\t"
  103784. "mul r6, r7, r6\n\t"
  103785. "lsr r7, r6, #16\n\t"
  103786. "lsl r6, r6, #16\n\t"
  103787. "adds r4, r4, r6\n\t"
  103788. "adcs r5, r5, r7\n\t"
  103789. "adc r3, r3, #0\n\t"
  103790. "lsr r6, r8, #16\n\t"
  103791. "lsr r7, r9, #16\n\t"
  103792. "mul r7, r6, r7\n\t"
  103793. "adds r5, r5, r7\n\t"
  103794. "adc r3, r3, #0\n\t"
  103795. "lsl r7, r9, #16\n\t"
  103796. "lsr r7, r7, #16\n\t"
  103797. "mul r6, r7, r6\n\t"
  103798. "lsr r7, r6, #16\n\t"
  103799. "lsl r6, r6, #16\n\t"
  103800. "adds r4, r4, r6\n\t"
  103801. "adcs r5, r5, r7\n\t"
  103802. "adc r3, r3, #0\n\t"
  103803. #else
  103804. "umull r6, r7, r8, r9\n\t"
  103805. "adds r4, r4, r6\n\t"
  103806. "adcs r5, r5, r7\n\t"
  103807. "adc r3, r3, #0\n\t"
  103808. #endif
  103809. /* A[15] * B[10] */
  103810. "ldr r8, [%[a], #60]\n\t"
  103811. "ldr r9, [%[b], #40]\n\t"
  103812. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103813. "lsl r6, r8, #16\n\t"
  103814. "lsl r7, r9, #16\n\t"
  103815. "lsr r6, r6, #16\n\t"
  103816. "lsr r7, r7, #16\n\t"
  103817. "mul r7, r6, r7\n\t"
  103818. "adds r4, r4, r7\n\t"
  103819. "adcs r5, r5, #0\n\t"
  103820. "adc r3, r3, #0\n\t"
  103821. "lsr r7, r9, #16\n\t"
  103822. "mul r6, r7, r6\n\t"
  103823. "lsr r7, r6, #16\n\t"
  103824. "lsl r6, r6, #16\n\t"
  103825. "adds r4, r4, r6\n\t"
  103826. "adcs r5, r5, r7\n\t"
  103827. "adc r3, r3, #0\n\t"
  103828. "lsr r6, r8, #16\n\t"
  103829. "lsr r7, r9, #16\n\t"
  103830. "mul r7, r6, r7\n\t"
  103831. "adds r5, r5, r7\n\t"
  103832. "adc r3, r3, #0\n\t"
  103833. "lsl r7, r9, #16\n\t"
  103834. "lsr r7, r7, #16\n\t"
  103835. "mul r6, r7, r6\n\t"
  103836. "lsr r7, r6, #16\n\t"
  103837. "lsl r6, r6, #16\n\t"
  103838. "adds r4, r4, r6\n\t"
  103839. "adcs r5, r5, r7\n\t"
  103840. "adc r3, r3, #0\n\t"
  103841. #else
  103842. "umull r6, r7, r8, r9\n\t"
  103843. "adds r4, r4, r6\n\t"
  103844. "adcs r5, r5, r7\n\t"
  103845. "adc r3, r3, #0\n\t"
  103846. #endif
  103847. /* A[16] * B[9] */
  103848. "ldr r8, [%[a], #64]\n\t"
  103849. "ldr r9, [%[b], #36]\n\t"
  103850. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103851. "lsl r6, r8, #16\n\t"
  103852. "lsl r7, r9, #16\n\t"
  103853. "lsr r6, r6, #16\n\t"
  103854. "lsr r7, r7, #16\n\t"
  103855. "mul r7, r6, r7\n\t"
  103856. "adds r4, r4, r7\n\t"
  103857. "adcs r5, r5, #0\n\t"
  103858. "adc r3, r3, #0\n\t"
  103859. "lsr r7, r9, #16\n\t"
  103860. "mul r6, r7, r6\n\t"
  103861. "lsr r7, r6, #16\n\t"
  103862. "lsl r6, r6, #16\n\t"
  103863. "adds r4, r4, r6\n\t"
  103864. "adcs r5, r5, r7\n\t"
  103865. "adc r3, r3, #0\n\t"
  103866. "lsr r6, r8, #16\n\t"
  103867. "lsr r7, r9, #16\n\t"
  103868. "mul r7, r6, r7\n\t"
  103869. "adds r5, r5, r7\n\t"
  103870. "adc r3, r3, #0\n\t"
  103871. "lsl r7, r9, #16\n\t"
  103872. "lsr r7, r7, #16\n\t"
  103873. "mul r6, r7, r6\n\t"
  103874. "lsr r7, r6, #16\n\t"
  103875. "lsl r6, r6, #16\n\t"
  103876. "adds r4, r4, r6\n\t"
  103877. "adcs r5, r5, r7\n\t"
  103878. "adc r3, r3, #0\n\t"
  103879. #else
  103880. "umull r6, r7, r8, r9\n\t"
  103881. "adds r4, r4, r6\n\t"
  103882. "adcs r5, r5, r7\n\t"
  103883. "adc r3, r3, #0\n\t"
  103884. #endif
  103885. "str r4, [%[r], #100]\n\t"
  103886. /* A[16] * B[10] */
  103887. "ldr r9, [%[b], #40]\n\t"
  103888. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103889. "lsl r6, r8, #16\n\t"
  103890. "lsl r7, r9, #16\n\t"
  103891. "lsr r6, r6, #16\n\t"
  103892. "lsr r7, r7, #16\n\t"
  103893. "mul r7, r6, r7\n\t"
  103894. "adds r5, r5, r7\n\t"
  103895. "adcs r3, r3, #0\n\t"
  103896. "mov r4, #0\n\t"
  103897. "adc r4, r4, #0\n\t"
  103898. "lsr r7, r9, #16\n\t"
  103899. "mul r6, r7, r6\n\t"
  103900. "lsr r7, r6, #16\n\t"
  103901. "lsl r6, r6, #16\n\t"
  103902. "adds r5, r5, r6\n\t"
  103903. "adcs r3, r3, r7\n\t"
  103904. "adc r4, r4, #0\n\t"
  103905. "lsr r6, r8, #16\n\t"
  103906. "lsr r7, r9, #16\n\t"
  103907. "mul r7, r6, r7\n\t"
  103908. "adds r3, r3, r7\n\t"
  103909. "adc r4, r4, #0\n\t"
  103910. "lsl r7, r9, #16\n\t"
  103911. "lsr r7, r7, #16\n\t"
  103912. "mul r6, r7, r6\n\t"
  103913. "lsr r7, r6, #16\n\t"
  103914. "lsl r6, r6, #16\n\t"
  103915. "adds r5, r5, r6\n\t"
  103916. "adcs r3, r3, r7\n\t"
  103917. "adc r4, r4, #0\n\t"
  103918. #else
  103919. "umull r6, r7, r8, r9\n\t"
  103920. "adds r5, r5, r6\n\t"
  103921. "adcs r3, r3, r7\n\t"
  103922. "mov r4, #0\n\t"
  103923. "adc r4, r4, #0\n\t"
  103924. #endif
  103925. /* A[15] * B[11] */
  103926. "ldr r8, [%[a], #60]\n\t"
  103927. "ldr r9, [%[b], #44]\n\t"
  103928. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103929. "lsl r6, r8, #16\n\t"
  103930. "lsl r7, r9, #16\n\t"
  103931. "lsr r6, r6, #16\n\t"
  103932. "lsr r7, r7, #16\n\t"
  103933. "mul r7, r6, r7\n\t"
  103934. "adds r5, r5, r7\n\t"
  103935. "adcs r3, r3, #0\n\t"
  103936. "adc r4, r4, #0\n\t"
  103937. "lsr r7, r9, #16\n\t"
  103938. "mul r6, r7, r6\n\t"
  103939. "lsr r7, r6, #16\n\t"
  103940. "lsl r6, r6, #16\n\t"
  103941. "adds r5, r5, r6\n\t"
  103942. "adcs r3, r3, r7\n\t"
  103943. "adc r4, r4, #0\n\t"
  103944. "lsr r6, r8, #16\n\t"
  103945. "lsr r7, r9, #16\n\t"
  103946. "mul r7, r6, r7\n\t"
  103947. "adds r3, r3, r7\n\t"
  103948. "adc r4, r4, #0\n\t"
  103949. "lsl r7, r9, #16\n\t"
  103950. "lsr r7, r7, #16\n\t"
  103951. "mul r6, r7, r6\n\t"
  103952. "lsr r7, r6, #16\n\t"
  103953. "lsl r6, r6, #16\n\t"
  103954. "adds r5, r5, r6\n\t"
  103955. "adcs r3, r3, r7\n\t"
  103956. "adc r4, r4, #0\n\t"
  103957. #else
  103958. "umull r6, r7, r8, r9\n\t"
  103959. "adds r5, r5, r6\n\t"
  103960. "adcs r3, r3, r7\n\t"
  103961. "adc r4, r4, #0\n\t"
  103962. #endif
  103963. /* A[14] * B[12] */
  103964. "ldr r8, [%[a], #56]\n\t"
  103965. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  103966. "lsl r6, r8, #16\n\t"
  103967. "lsl r7, r12, #16\n\t"
  103968. "lsr r6, r6, #16\n\t"
  103969. "lsr r7, r7, #16\n\t"
  103970. "mul r7, r6, r7\n\t"
  103971. "adds r5, r5, r7\n\t"
  103972. "adcs r3, r3, #0\n\t"
  103973. "adc r4, r4, #0\n\t"
  103974. "lsr r7, r12, #16\n\t"
  103975. "mul r6, r7, r6\n\t"
  103976. "lsr r7, r6, #16\n\t"
  103977. "lsl r6, r6, #16\n\t"
  103978. "adds r5, r5, r6\n\t"
  103979. "adcs r3, r3, r7\n\t"
  103980. "adc r4, r4, #0\n\t"
  103981. "lsr r6, r8, #16\n\t"
  103982. "lsr r7, r12, #16\n\t"
  103983. "mul r7, r6, r7\n\t"
  103984. "adds r3, r3, r7\n\t"
  103985. "adc r4, r4, #0\n\t"
  103986. "lsl r7, r12, #16\n\t"
  103987. "lsr r7, r7, #16\n\t"
  103988. "mul r6, r7, r6\n\t"
  103989. "lsr r7, r6, #16\n\t"
  103990. "lsl r6, r6, #16\n\t"
  103991. "adds r5, r5, r6\n\t"
  103992. "adcs r3, r3, r7\n\t"
  103993. "adc r4, r4, #0\n\t"
  103994. #else
  103995. "umull r6, r7, r8, r12\n\t"
  103996. "adds r5, r5, r6\n\t"
  103997. "adcs r3, r3, r7\n\t"
  103998. "adc r4, r4, #0\n\t"
  103999. #endif
  104000. /* A[13] * B[13] */
  104001. "ldr r11, [%[a], #52]\n\t"
  104002. "ldr r12, [%[b], #52]\n\t"
  104003. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104004. "lsl r6, r11, #16\n\t"
  104005. "lsl r7, r12, #16\n\t"
  104006. "lsr r6, r6, #16\n\t"
  104007. "lsr r7, r7, #16\n\t"
  104008. "mul r7, r6, r7\n\t"
  104009. "adds r5, r5, r7\n\t"
  104010. "adcs r3, r3, #0\n\t"
  104011. "adc r4, r4, #0\n\t"
  104012. "lsr r7, r12, #16\n\t"
  104013. "mul r6, r7, r6\n\t"
  104014. "lsr r7, r6, #16\n\t"
  104015. "lsl r6, r6, #16\n\t"
  104016. "adds r5, r5, r6\n\t"
  104017. "adcs r3, r3, r7\n\t"
  104018. "adc r4, r4, #0\n\t"
  104019. "lsr r6, r11, #16\n\t"
  104020. "lsr r7, r12, #16\n\t"
  104021. "mul r7, r6, r7\n\t"
  104022. "adds r3, r3, r7\n\t"
  104023. "adc r4, r4, #0\n\t"
  104024. "lsl r7, r12, #16\n\t"
  104025. "lsr r7, r7, #16\n\t"
  104026. "mul r6, r7, r6\n\t"
  104027. "lsr r7, r6, #16\n\t"
  104028. "lsl r6, r6, #16\n\t"
  104029. "adds r5, r5, r6\n\t"
  104030. "adcs r3, r3, r7\n\t"
  104031. "adc r4, r4, #0\n\t"
  104032. #else
  104033. "umull r6, r7, r11, r12\n\t"
  104034. "adds r5, r5, r6\n\t"
  104035. "adcs r3, r3, r7\n\t"
  104036. "adc r4, r4, #0\n\t"
  104037. #endif
  104038. /* A[12] * B[14] */
  104039. "ldr r8, [%[a], #48]\n\t"
  104040. "ldr r9, [%[b], #56]\n\t"
  104041. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104042. "lsl r6, r8, #16\n\t"
  104043. "lsl r7, r9, #16\n\t"
  104044. "lsr r6, r6, #16\n\t"
  104045. "lsr r7, r7, #16\n\t"
  104046. "mul r7, r6, r7\n\t"
  104047. "adds r5, r5, r7\n\t"
  104048. "adcs r3, r3, #0\n\t"
  104049. "adc r4, r4, #0\n\t"
  104050. "lsr r7, r9, #16\n\t"
  104051. "mul r6, r7, r6\n\t"
  104052. "lsr r7, r6, #16\n\t"
  104053. "lsl r6, r6, #16\n\t"
  104054. "adds r5, r5, r6\n\t"
  104055. "adcs r3, r3, r7\n\t"
  104056. "adc r4, r4, #0\n\t"
  104057. "lsr r6, r8, #16\n\t"
  104058. "lsr r7, r9, #16\n\t"
  104059. "mul r7, r6, r7\n\t"
  104060. "adds r3, r3, r7\n\t"
  104061. "adc r4, r4, #0\n\t"
  104062. "lsl r7, r9, #16\n\t"
  104063. "lsr r7, r7, #16\n\t"
  104064. "mul r6, r7, r6\n\t"
  104065. "lsr r7, r6, #16\n\t"
  104066. "lsl r6, r6, #16\n\t"
  104067. "adds r5, r5, r6\n\t"
  104068. "adcs r3, r3, r7\n\t"
  104069. "adc r4, r4, #0\n\t"
  104070. #else
  104071. "umull r6, r7, r8, r9\n\t"
  104072. "adds r5, r5, r6\n\t"
  104073. "adcs r3, r3, r7\n\t"
  104074. "adc r4, r4, #0\n\t"
  104075. #endif
  104076. /* A[11] * B[15] */
  104077. "ldr r8, [%[a], #44]\n\t"
  104078. "ldr r9, [%[b], #60]\n\t"
  104079. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104080. "lsl r6, r8, #16\n\t"
  104081. "lsl r7, r9, #16\n\t"
  104082. "lsr r6, r6, #16\n\t"
  104083. "lsr r7, r7, #16\n\t"
  104084. "mul r7, r6, r7\n\t"
  104085. "adds r5, r5, r7\n\t"
  104086. "adcs r3, r3, #0\n\t"
  104087. "adc r4, r4, #0\n\t"
  104088. "lsr r7, r9, #16\n\t"
  104089. "mul r6, r7, r6\n\t"
  104090. "lsr r7, r6, #16\n\t"
  104091. "lsl r6, r6, #16\n\t"
  104092. "adds r5, r5, r6\n\t"
  104093. "adcs r3, r3, r7\n\t"
  104094. "adc r4, r4, #0\n\t"
  104095. "lsr r6, r8, #16\n\t"
  104096. "lsr r7, r9, #16\n\t"
  104097. "mul r7, r6, r7\n\t"
  104098. "adds r3, r3, r7\n\t"
  104099. "adc r4, r4, #0\n\t"
  104100. "lsl r7, r9, #16\n\t"
  104101. "lsr r7, r7, #16\n\t"
  104102. "mul r6, r7, r6\n\t"
  104103. "lsr r7, r6, #16\n\t"
  104104. "lsl r6, r6, #16\n\t"
  104105. "adds r5, r5, r6\n\t"
  104106. "adcs r3, r3, r7\n\t"
  104107. "adc r4, r4, #0\n\t"
  104108. #else
  104109. "umull r6, r7, r8, r9\n\t"
  104110. "adds r5, r5, r6\n\t"
  104111. "adcs r3, r3, r7\n\t"
  104112. "adc r4, r4, #0\n\t"
  104113. #endif
  104114. /* A[10] * B[16] */
  104115. "ldr r8, [%[a], #40]\n\t"
  104116. "ldr r9, [%[b], #64]\n\t"
  104117. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104118. "lsl r6, r8, #16\n\t"
  104119. "lsl r7, r9, #16\n\t"
  104120. "lsr r6, r6, #16\n\t"
  104121. "lsr r7, r7, #16\n\t"
  104122. "mul r7, r6, r7\n\t"
  104123. "adds r5, r5, r7\n\t"
  104124. "adcs r3, r3, #0\n\t"
  104125. "adc r4, r4, #0\n\t"
  104126. "lsr r7, r9, #16\n\t"
  104127. "mul r6, r7, r6\n\t"
  104128. "lsr r7, r6, #16\n\t"
  104129. "lsl r6, r6, #16\n\t"
  104130. "adds r5, r5, r6\n\t"
  104131. "adcs r3, r3, r7\n\t"
  104132. "adc r4, r4, #0\n\t"
  104133. "lsr r6, r8, #16\n\t"
  104134. "lsr r7, r9, #16\n\t"
  104135. "mul r7, r6, r7\n\t"
  104136. "adds r3, r3, r7\n\t"
  104137. "adc r4, r4, #0\n\t"
  104138. "lsl r7, r9, #16\n\t"
  104139. "lsr r7, r7, #16\n\t"
  104140. "mul r6, r7, r6\n\t"
  104141. "lsr r7, r6, #16\n\t"
  104142. "lsl r6, r6, #16\n\t"
  104143. "adds r5, r5, r6\n\t"
  104144. "adcs r3, r3, r7\n\t"
  104145. "adc r4, r4, #0\n\t"
  104146. #else
  104147. "umull r6, r7, r8, r9\n\t"
  104148. "adds r5, r5, r6\n\t"
  104149. "adcs r3, r3, r7\n\t"
  104150. "adc r4, r4, #0\n\t"
  104151. #endif
  104152. "str r5, [%[r], #104]\n\t"
  104153. /* A[11] * B[16] */
  104154. "ldr r8, [%[a], #44]\n\t"
  104155. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104156. "lsl r6, r8, #16\n\t"
  104157. "lsl r7, r9, #16\n\t"
  104158. "lsr r6, r6, #16\n\t"
  104159. "lsr r7, r7, #16\n\t"
  104160. "mul r7, r6, r7\n\t"
  104161. "adds r3, r3, r7\n\t"
  104162. "adcs r4, r4, #0\n\t"
  104163. "mov r5, #0\n\t"
  104164. "adc r5, r5, #0\n\t"
  104165. "lsr r7, r9, #16\n\t"
  104166. "mul r6, r7, r6\n\t"
  104167. "lsr r7, r6, #16\n\t"
  104168. "lsl r6, r6, #16\n\t"
  104169. "adds r3, r3, r6\n\t"
  104170. "adcs r4, r4, r7\n\t"
  104171. "adc r5, r5, #0\n\t"
  104172. "lsr r6, r8, #16\n\t"
  104173. "lsr r7, r9, #16\n\t"
  104174. "mul r7, r6, r7\n\t"
  104175. "adds r4, r4, r7\n\t"
  104176. "adc r5, r5, #0\n\t"
  104177. "lsl r7, r9, #16\n\t"
  104178. "lsr r7, r7, #16\n\t"
  104179. "mul r6, r7, r6\n\t"
  104180. "lsr r7, r6, #16\n\t"
  104181. "lsl r6, r6, #16\n\t"
  104182. "adds r3, r3, r6\n\t"
  104183. "adcs r4, r4, r7\n\t"
  104184. "adc r5, r5, #0\n\t"
  104185. #else
  104186. "umull r6, r7, r8, r9\n\t"
  104187. "adds r3, r3, r6\n\t"
  104188. "adcs r4, r4, r7\n\t"
  104189. "mov r5, #0\n\t"
  104190. "adc r5, r5, #0\n\t"
  104191. #endif
  104192. /* A[12] * B[15] */
  104193. "ldr r8, [%[a], #48]\n\t"
  104194. "ldr r9, [%[b], #60]\n\t"
  104195. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104196. "lsl r6, r8, #16\n\t"
  104197. "lsl r7, r9, #16\n\t"
  104198. "lsr r6, r6, #16\n\t"
  104199. "lsr r7, r7, #16\n\t"
  104200. "mul r7, r6, r7\n\t"
  104201. "adds r3, r3, r7\n\t"
  104202. "adcs r4, r4, #0\n\t"
  104203. "adc r5, r5, #0\n\t"
  104204. "lsr r7, r9, #16\n\t"
  104205. "mul r6, r7, r6\n\t"
  104206. "lsr r7, r6, #16\n\t"
  104207. "lsl r6, r6, #16\n\t"
  104208. "adds r3, r3, r6\n\t"
  104209. "adcs r4, r4, r7\n\t"
  104210. "adc r5, r5, #0\n\t"
  104211. "lsr r6, r8, #16\n\t"
  104212. "lsr r7, r9, #16\n\t"
  104213. "mul r7, r6, r7\n\t"
  104214. "adds r4, r4, r7\n\t"
  104215. "adc r5, r5, #0\n\t"
  104216. "lsl r7, r9, #16\n\t"
  104217. "lsr r7, r7, #16\n\t"
  104218. "mul r6, r7, r6\n\t"
  104219. "lsr r7, r6, #16\n\t"
  104220. "lsl r6, r6, #16\n\t"
  104221. "adds r3, r3, r6\n\t"
  104222. "adcs r4, r4, r7\n\t"
  104223. "adc r5, r5, #0\n\t"
  104224. #else
  104225. "umull r6, r7, r8, r9\n\t"
  104226. "adds r3, r3, r6\n\t"
  104227. "adcs r4, r4, r7\n\t"
  104228. "adc r5, r5, #0\n\t"
  104229. #endif
  104230. /* A[13] * B[14] */
  104231. "ldr r9, [%[b], #56]\n\t"
  104232. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104233. "lsl r6, r11, #16\n\t"
  104234. "lsl r7, r9, #16\n\t"
  104235. "lsr r6, r6, #16\n\t"
  104236. "lsr r7, r7, #16\n\t"
  104237. "mul r7, r6, r7\n\t"
  104238. "adds r3, r3, r7\n\t"
  104239. "adcs r4, r4, #0\n\t"
  104240. "adc r5, r5, #0\n\t"
  104241. "lsr r7, r9, #16\n\t"
  104242. "mul r6, r7, r6\n\t"
  104243. "lsr r7, r6, #16\n\t"
  104244. "lsl r6, r6, #16\n\t"
  104245. "adds r3, r3, r6\n\t"
  104246. "adcs r4, r4, r7\n\t"
  104247. "adc r5, r5, #0\n\t"
  104248. "lsr r6, r11, #16\n\t"
  104249. "lsr r7, r9, #16\n\t"
  104250. "mul r7, r6, r7\n\t"
  104251. "adds r4, r4, r7\n\t"
  104252. "adc r5, r5, #0\n\t"
  104253. "lsl r7, r9, #16\n\t"
  104254. "lsr r7, r7, #16\n\t"
  104255. "mul r6, r7, r6\n\t"
  104256. "lsr r7, r6, #16\n\t"
  104257. "lsl r6, r6, #16\n\t"
  104258. "adds r3, r3, r6\n\t"
  104259. "adcs r4, r4, r7\n\t"
  104260. "adc r5, r5, #0\n\t"
  104261. #else
  104262. "umull r6, r7, r11, r9\n\t"
  104263. "adds r3, r3, r6\n\t"
  104264. "adcs r4, r4, r7\n\t"
  104265. "adc r5, r5, #0\n\t"
  104266. #endif
  104267. /* A[14] * B[13] */
  104268. "ldr r8, [%[a], #56]\n\t"
  104269. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104270. "lsl r6, r8, #16\n\t"
  104271. "lsl r7, r12, #16\n\t"
  104272. "lsr r6, r6, #16\n\t"
  104273. "lsr r7, r7, #16\n\t"
  104274. "mul r7, r6, r7\n\t"
  104275. "adds r3, r3, r7\n\t"
  104276. "adcs r4, r4, #0\n\t"
  104277. "adc r5, r5, #0\n\t"
  104278. "lsr r7, r12, #16\n\t"
  104279. "mul r6, r7, r6\n\t"
  104280. "lsr r7, r6, #16\n\t"
  104281. "lsl r6, r6, #16\n\t"
  104282. "adds r3, r3, r6\n\t"
  104283. "adcs r4, r4, r7\n\t"
  104284. "adc r5, r5, #0\n\t"
  104285. "lsr r6, r8, #16\n\t"
  104286. "lsr r7, r12, #16\n\t"
  104287. "mul r7, r6, r7\n\t"
  104288. "adds r4, r4, r7\n\t"
  104289. "adc r5, r5, #0\n\t"
  104290. "lsl r7, r12, #16\n\t"
  104291. "lsr r7, r7, #16\n\t"
  104292. "mul r6, r7, r6\n\t"
  104293. "lsr r7, r6, #16\n\t"
  104294. "lsl r6, r6, #16\n\t"
  104295. "adds r3, r3, r6\n\t"
  104296. "adcs r4, r4, r7\n\t"
  104297. "adc r5, r5, #0\n\t"
  104298. #else
  104299. "umull r6, r7, r8, r12\n\t"
  104300. "adds r3, r3, r6\n\t"
  104301. "adcs r4, r4, r7\n\t"
  104302. "adc r5, r5, #0\n\t"
  104303. #endif
  104304. /* A[15] * B[12] */
  104305. "ldr r8, [%[a], #60]\n\t"
  104306. "ldr r9, [%[b], #48]\n\t"
  104307. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104308. "lsl r6, r8, #16\n\t"
  104309. "lsl r7, r9, #16\n\t"
  104310. "lsr r6, r6, #16\n\t"
  104311. "lsr r7, r7, #16\n\t"
  104312. "mul r7, r6, r7\n\t"
  104313. "adds r3, r3, r7\n\t"
  104314. "adcs r4, r4, #0\n\t"
  104315. "adc r5, r5, #0\n\t"
  104316. "lsr r7, r9, #16\n\t"
  104317. "mul r6, r7, r6\n\t"
  104318. "lsr r7, r6, #16\n\t"
  104319. "lsl r6, r6, #16\n\t"
  104320. "adds r3, r3, r6\n\t"
  104321. "adcs r4, r4, r7\n\t"
  104322. "adc r5, r5, #0\n\t"
  104323. "lsr r6, r8, #16\n\t"
  104324. "lsr r7, r9, #16\n\t"
  104325. "mul r7, r6, r7\n\t"
  104326. "adds r4, r4, r7\n\t"
  104327. "adc r5, r5, #0\n\t"
  104328. "lsl r7, r9, #16\n\t"
  104329. "lsr r7, r7, #16\n\t"
  104330. "mul r6, r7, r6\n\t"
  104331. "lsr r7, r6, #16\n\t"
  104332. "lsl r6, r6, #16\n\t"
  104333. "adds r3, r3, r6\n\t"
  104334. "adcs r4, r4, r7\n\t"
  104335. "adc r5, r5, #0\n\t"
  104336. #else
  104337. "umull r6, r7, r8, r9\n\t"
  104338. "adds r3, r3, r6\n\t"
  104339. "adcs r4, r4, r7\n\t"
  104340. "adc r5, r5, #0\n\t"
  104341. #endif
  104342. /* A[16] * B[11] */
  104343. "ldr r8, [%[a], #64]\n\t"
  104344. "ldr r9, [%[b], #44]\n\t"
  104345. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104346. "lsl r6, r8, #16\n\t"
  104347. "lsl r7, r9, #16\n\t"
  104348. "lsr r6, r6, #16\n\t"
  104349. "lsr r7, r7, #16\n\t"
  104350. "mul r7, r6, r7\n\t"
  104351. "adds r3, r3, r7\n\t"
  104352. "adcs r4, r4, #0\n\t"
  104353. "adc r5, r5, #0\n\t"
  104354. "lsr r7, r9, #16\n\t"
  104355. "mul r6, r7, r6\n\t"
  104356. "lsr r7, r6, #16\n\t"
  104357. "lsl r6, r6, #16\n\t"
  104358. "adds r3, r3, r6\n\t"
  104359. "adcs r4, r4, r7\n\t"
  104360. "adc r5, r5, #0\n\t"
  104361. "lsr r6, r8, #16\n\t"
  104362. "lsr r7, r9, #16\n\t"
  104363. "mul r7, r6, r7\n\t"
  104364. "adds r4, r4, r7\n\t"
  104365. "adc r5, r5, #0\n\t"
  104366. "lsl r7, r9, #16\n\t"
  104367. "lsr r7, r7, #16\n\t"
  104368. "mul r6, r7, r6\n\t"
  104369. "lsr r7, r6, #16\n\t"
  104370. "lsl r6, r6, #16\n\t"
  104371. "adds r3, r3, r6\n\t"
  104372. "adcs r4, r4, r7\n\t"
  104373. "adc r5, r5, #0\n\t"
  104374. #else
  104375. "umull r6, r7, r8, r9\n\t"
  104376. "adds r3, r3, r6\n\t"
  104377. "adcs r4, r4, r7\n\t"
  104378. "adc r5, r5, #0\n\t"
  104379. #endif
  104380. "str r3, [%[r], #108]\n\t"
  104381. /* A[16] * B[12] */
  104382. "ldr r9, [%[b], #48]\n\t"
  104383. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104384. "lsl r6, r8, #16\n\t"
  104385. "lsl r7, r9, #16\n\t"
  104386. "lsr r6, r6, #16\n\t"
  104387. "lsr r7, r7, #16\n\t"
  104388. "mul r7, r6, r7\n\t"
  104389. "adds r4, r4, r7\n\t"
  104390. "adcs r5, r5, #0\n\t"
  104391. "mov r3, #0\n\t"
  104392. "adc r3, r3, #0\n\t"
  104393. "lsr r7, r9, #16\n\t"
  104394. "mul r6, r7, r6\n\t"
  104395. "lsr r7, r6, #16\n\t"
  104396. "lsl r6, r6, #16\n\t"
  104397. "adds r4, r4, r6\n\t"
  104398. "adcs r5, r5, r7\n\t"
  104399. "adc r3, r3, #0\n\t"
  104400. "lsr r6, r8, #16\n\t"
  104401. "lsr r7, r9, #16\n\t"
  104402. "mul r7, r6, r7\n\t"
  104403. "adds r5, r5, r7\n\t"
  104404. "adc r3, r3, #0\n\t"
  104405. "lsl r7, r9, #16\n\t"
  104406. "lsr r7, r7, #16\n\t"
  104407. "mul r6, r7, r6\n\t"
  104408. "lsr r7, r6, #16\n\t"
  104409. "lsl r6, r6, #16\n\t"
  104410. "adds r4, r4, r6\n\t"
  104411. "adcs r5, r5, r7\n\t"
  104412. "adc r3, r3, #0\n\t"
  104413. #else
  104414. "umull r6, r7, r8, r9\n\t"
  104415. "adds r4, r4, r6\n\t"
  104416. "adcs r5, r5, r7\n\t"
  104417. "mov r3, #0\n\t"
  104418. "adc r3, r3, #0\n\t"
  104419. #endif
  104420. /* A[15] * B[13] */
  104421. "ldr r8, [%[a], #60]\n\t"
  104422. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104423. "lsl r6, r8, #16\n\t"
  104424. "lsl r7, r12, #16\n\t"
  104425. "lsr r6, r6, #16\n\t"
  104426. "lsr r7, r7, #16\n\t"
  104427. "mul r7, r6, r7\n\t"
  104428. "adds r4, r4, r7\n\t"
  104429. "adcs r5, r5, #0\n\t"
  104430. "adc r3, r3, #0\n\t"
  104431. "lsr r7, r12, #16\n\t"
  104432. "mul r6, r7, r6\n\t"
  104433. "lsr r7, r6, #16\n\t"
  104434. "lsl r6, r6, #16\n\t"
  104435. "adds r4, r4, r6\n\t"
  104436. "adcs r5, r5, r7\n\t"
  104437. "adc r3, r3, #0\n\t"
  104438. "lsr r6, r8, #16\n\t"
  104439. "lsr r7, r12, #16\n\t"
  104440. "mul r7, r6, r7\n\t"
  104441. "adds r5, r5, r7\n\t"
  104442. "adc r3, r3, #0\n\t"
  104443. "lsl r7, r12, #16\n\t"
  104444. "lsr r7, r7, #16\n\t"
  104445. "mul r6, r7, r6\n\t"
  104446. "lsr r7, r6, #16\n\t"
  104447. "lsl r6, r6, #16\n\t"
  104448. "adds r4, r4, r6\n\t"
  104449. "adcs r5, r5, r7\n\t"
  104450. "adc r3, r3, #0\n\t"
  104451. #else
  104452. "umull r6, r7, r8, r12\n\t"
  104453. "adds r4, r4, r6\n\t"
  104454. "adcs r5, r5, r7\n\t"
  104455. "adc r3, r3, #0\n\t"
  104456. #endif
  104457. /* A[14] * B[14] */
  104458. "ldr r11, [%[a], #56]\n\t"
  104459. "ldr r12, [%[b], #56]\n\t"
  104460. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104461. "lsl r6, r11, #16\n\t"
  104462. "lsl r7, r12, #16\n\t"
  104463. "lsr r6, r6, #16\n\t"
  104464. "lsr r7, r7, #16\n\t"
  104465. "mul r7, r6, r7\n\t"
  104466. "adds r4, r4, r7\n\t"
  104467. "adcs r5, r5, #0\n\t"
  104468. "adc r3, r3, #0\n\t"
  104469. "lsr r7, r12, #16\n\t"
  104470. "mul r6, r7, r6\n\t"
  104471. "lsr r7, r6, #16\n\t"
  104472. "lsl r6, r6, #16\n\t"
  104473. "adds r4, r4, r6\n\t"
  104474. "adcs r5, r5, r7\n\t"
  104475. "adc r3, r3, #0\n\t"
  104476. "lsr r6, r11, #16\n\t"
  104477. "lsr r7, r12, #16\n\t"
  104478. "mul r7, r6, r7\n\t"
  104479. "adds r5, r5, r7\n\t"
  104480. "adc r3, r3, #0\n\t"
  104481. "lsl r7, r12, #16\n\t"
  104482. "lsr r7, r7, #16\n\t"
  104483. "mul r6, r7, r6\n\t"
  104484. "lsr r7, r6, #16\n\t"
  104485. "lsl r6, r6, #16\n\t"
  104486. "adds r4, r4, r6\n\t"
  104487. "adcs r5, r5, r7\n\t"
  104488. "adc r3, r3, #0\n\t"
  104489. #else
  104490. "umull r6, r7, r11, r12\n\t"
  104491. "adds r4, r4, r6\n\t"
  104492. "adcs r5, r5, r7\n\t"
  104493. "adc r3, r3, #0\n\t"
  104494. #endif
  104495. /* A[13] * B[15] */
  104496. "ldr r8, [%[a], #52]\n\t"
  104497. "ldr r9, [%[b], #60]\n\t"
  104498. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104499. "lsl r6, r8, #16\n\t"
  104500. "lsl r7, r9, #16\n\t"
  104501. "lsr r6, r6, #16\n\t"
  104502. "lsr r7, r7, #16\n\t"
  104503. "mul r7, r6, r7\n\t"
  104504. "adds r4, r4, r7\n\t"
  104505. "adcs r5, r5, #0\n\t"
  104506. "adc r3, r3, #0\n\t"
  104507. "lsr r7, r9, #16\n\t"
  104508. "mul r6, r7, r6\n\t"
  104509. "lsr r7, r6, #16\n\t"
  104510. "lsl r6, r6, #16\n\t"
  104511. "adds r4, r4, r6\n\t"
  104512. "adcs r5, r5, r7\n\t"
  104513. "adc r3, r3, #0\n\t"
  104514. "lsr r6, r8, #16\n\t"
  104515. "lsr r7, r9, #16\n\t"
  104516. "mul r7, r6, r7\n\t"
  104517. "adds r5, r5, r7\n\t"
  104518. "adc r3, r3, #0\n\t"
  104519. "lsl r7, r9, #16\n\t"
  104520. "lsr r7, r7, #16\n\t"
  104521. "mul r6, r7, r6\n\t"
  104522. "lsr r7, r6, #16\n\t"
  104523. "lsl r6, r6, #16\n\t"
  104524. "adds r4, r4, r6\n\t"
  104525. "adcs r5, r5, r7\n\t"
  104526. "adc r3, r3, #0\n\t"
  104527. #else
  104528. "umull r6, r7, r8, r9\n\t"
  104529. "adds r4, r4, r6\n\t"
  104530. "adcs r5, r5, r7\n\t"
  104531. "adc r3, r3, #0\n\t"
  104532. #endif
  104533. /* A[12] * B[16] */
  104534. "ldr r8, [%[a], #48]\n\t"
  104535. "ldr r9, [%[b], #64]\n\t"
  104536. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104537. "lsl r6, r8, #16\n\t"
  104538. "lsl r7, r9, #16\n\t"
  104539. "lsr r6, r6, #16\n\t"
  104540. "lsr r7, r7, #16\n\t"
  104541. "mul r7, r6, r7\n\t"
  104542. "adds r4, r4, r7\n\t"
  104543. "adcs r5, r5, #0\n\t"
  104544. "adc r3, r3, #0\n\t"
  104545. "lsr r7, r9, #16\n\t"
  104546. "mul r6, r7, r6\n\t"
  104547. "lsr r7, r6, #16\n\t"
  104548. "lsl r6, r6, #16\n\t"
  104549. "adds r4, r4, r6\n\t"
  104550. "adcs r5, r5, r7\n\t"
  104551. "adc r3, r3, #0\n\t"
  104552. "lsr r6, r8, #16\n\t"
  104553. "lsr r7, r9, #16\n\t"
  104554. "mul r7, r6, r7\n\t"
  104555. "adds r5, r5, r7\n\t"
  104556. "adc r3, r3, #0\n\t"
  104557. "lsl r7, r9, #16\n\t"
  104558. "lsr r7, r7, #16\n\t"
  104559. "mul r6, r7, r6\n\t"
  104560. "lsr r7, r6, #16\n\t"
  104561. "lsl r6, r6, #16\n\t"
  104562. "adds r4, r4, r6\n\t"
  104563. "adcs r5, r5, r7\n\t"
  104564. "adc r3, r3, #0\n\t"
  104565. #else
  104566. "umull r6, r7, r8, r9\n\t"
  104567. "adds r4, r4, r6\n\t"
  104568. "adcs r5, r5, r7\n\t"
  104569. "adc r3, r3, #0\n\t"
  104570. #endif
  104571. "str r4, [%[r], #112]\n\t"
  104572. /* A[13] * B[16] */
  104573. "ldr r8, [%[a], #52]\n\t"
  104574. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104575. "lsl r6, r8, #16\n\t"
  104576. "lsl r7, r9, #16\n\t"
  104577. "lsr r6, r6, #16\n\t"
  104578. "lsr r7, r7, #16\n\t"
  104579. "mul r7, r6, r7\n\t"
  104580. "adds r5, r5, r7\n\t"
  104581. "adcs r3, r3, #0\n\t"
  104582. "mov r4, #0\n\t"
  104583. "adc r4, r4, #0\n\t"
  104584. "lsr r7, r9, #16\n\t"
  104585. "mul r6, r7, r6\n\t"
  104586. "lsr r7, r6, #16\n\t"
  104587. "lsl r6, r6, #16\n\t"
  104588. "adds r5, r5, r6\n\t"
  104589. "adcs r3, r3, r7\n\t"
  104590. "adc r4, r4, #0\n\t"
  104591. "lsr r6, r8, #16\n\t"
  104592. "lsr r7, r9, #16\n\t"
  104593. "mul r7, r6, r7\n\t"
  104594. "adds r3, r3, r7\n\t"
  104595. "adc r4, r4, #0\n\t"
  104596. "lsl r7, r9, #16\n\t"
  104597. "lsr r7, r7, #16\n\t"
  104598. "mul r6, r7, r6\n\t"
  104599. "lsr r7, r6, #16\n\t"
  104600. "lsl r6, r6, #16\n\t"
  104601. "adds r5, r5, r6\n\t"
  104602. "adcs r3, r3, r7\n\t"
  104603. "adc r4, r4, #0\n\t"
  104604. #else
  104605. "umull r6, r7, r8, r9\n\t"
  104606. "adds r5, r5, r6\n\t"
  104607. "adcs r3, r3, r7\n\t"
  104608. "mov r4, #0\n\t"
  104609. "adc r4, r4, #0\n\t"
  104610. #endif
  104611. /* A[14] * B[15] */
  104612. "ldr r9, [%[b], #60]\n\t"
  104613. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104614. "lsl r6, r11, #16\n\t"
  104615. "lsl r7, r9, #16\n\t"
  104616. "lsr r6, r6, #16\n\t"
  104617. "lsr r7, r7, #16\n\t"
  104618. "mul r7, r6, r7\n\t"
  104619. "adds r5, r5, r7\n\t"
  104620. "adcs r3, r3, #0\n\t"
  104621. "adc r4, r4, #0\n\t"
  104622. "lsr r7, r9, #16\n\t"
  104623. "mul r6, r7, r6\n\t"
  104624. "lsr r7, r6, #16\n\t"
  104625. "lsl r6, r6, #16\n\t"
  104626. "adds r5, r5, r6\n\t"
  104627. "adcs r3, r3, r7\n\t"
  104628. "adc r4, r4, #0\n\t"
  104629. "lsr r6, r11, #16\n\t"
  104630. "lsr r7, r9, #16\n\t"
  104631. "mul r7, r6, r7\n\t"
  104632. "adds r3, r3, r7\n\t"
  104633. "adc r4, r4, #0\n\t"
  104634. "lsl r7, r9, #16\n\t"
  104635. "lsr r7, r7, #16\n\t"
  104636. "mul r6, r7, r6\n\t"
  104637. "lsr r7, r6, #16\n\t"
  104638. "lsl r6, r6, #16\n\t"
  104639. "adds r5, r5, r6\n\t"
  104640. "adcs r3, r3, r7\n\t"
  104641. "adc r4, r4, #0\n\t"
  104642. #else
  104643. "umull r6, r7, r11, r9\n\t"
  104644. "adds r5, r5, r6\n\t"
  104645. "adcs r3, r3, r7\n\t"
  104646. "adc r4, r4, #0\n\t"
  104647. #endif
  104648. /* A[15] * B[14] */
  104649. "ldr r8, [%[a], #60]\n\t"
  104650. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104651. "lsl r6, r8, #16\n\t"
  104652. "lsl r7, r12, #16\n\t"
  104653. "lsr r6, r6, #16\n\t"
  104654. "lsr r7, r7, #16\n\t"
  104655. "mul r7, r6, r7\n\t"
  104656. "adds r5, r5, r7\n\t"
  104657. "adcs r3, r3, #0\n\t"
  104658. "adc r4, r4, #0\n\t"
  104659. "lsr r7, r12, #16\n\t"
  104660. "mul r6, r7, r6\n\t"
  104661. "lsr r7, r6, #16\n\t"
  104662. "lsl r6, r6, #16\n\t"
  104663. "adds r5, r5, r6\n\t"
  104664. "adcs r3, r3, r7\n\t"
  104665. "adc r4, r4, #0\n\t"
  104666. "lsr r6, r8, #16\n\t"
  104667. "lsr r7, r12, #16\n\t"
  104668. "mul r7, r6, r7\n\t"
  104669. "adds r3, r3, r7\n\t"
  104670. "adc r4, r4, #0\n\t"
  104671. "lsl r7, r12, #16\n\t"
  104672. "lsr r7, r7, #16\n\t"
  104673. "mul r6, r7, r6\n\t"
  104674. "lsr r7, r6, #16\n\t"
  104675. "lsl r6, r6, #16\n\t"
  104676. "adds r5, r5, r6\n\t"
  104677. "adcs r3, r3, r7\n\t"
  104678. "adc r4, r4, #0\n\t"
  104679. #else
  104680. "umull r6, r7, r8, r12\n\t"
  104681. "adds r5, r5, r6\n\t"
  104682. "adcs r3, r3, r7\n\t"
  104683. "adc r4, r4, #0\n\t"
  104684. #endif
  104685. /* A[16] * B[13] */
  104686. "ldr r8, [%[a], #64]\n\t"
  104687. "ldr r9, [%[b], #52]\n\t"
  104688. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104689. "lsl r6, r8, #16\n\t"
  104690. "lsl r7, r9, #16\n\t"
  104691. "lsr r6, r6, #16\n\t"
  104692. "lsr r7, r7, #16\n\t"
  104693. "mul r7, r6, r7\n\t"
  104694. "adds r5, r5, r7\n\t"
  104695. "adcs r3, r3, #0\n\t"
  104696. "adc r4, r4, #0\n\t"
  104697. "lsr r7, r9, #16\n\t"
  104698. "mul r6, r7, r6\n\t"
  104699. "lsr r7, r6, #16\n\t"
  104700. "lsl r6, r6, #16\n\t"
  104701. "adds r5, r5, r6\n\t"
  104702. "adcs r3, r3, r7\n\t"
  104703. "adc r4, r4, #0\n\t"
  104704. "lsr r6, r8, #16\n\t"
  104705. "lsr r7, r9, #16\n\t"
  104706. "mul r7, r6, r7\n\t"
  104707. "adds r3, r3, r7\n\t"
  104708. "adc r4, r4, #0\n\t"
  104709. "lsl r7, r9, #16\n\t"
  104710. "lsr r7, r7, #16\n\t"
  104711. "mul r6, r7, r6\n\t"
  104712. "lsr r7, r6, #16\n\t"
  104713. "lsl r6, r6, #16\n\t"
  104714. "adds r5, r5, r6\n\t"
  104715. "adcs r3, r3, r7\n\t"
  104716. "adc r4, r4, #0\n\t"
  104717. #else
  104718. "umull r6, r7, r8, r9\n\t"
  104719. "adds r5, r5, r6\n\t"
  104720. "adcs r3, r3, r7\n\t"
  104721. "adc r4, r4, #0\n\t"
  104722. #endif
  104723. "str r5, [%[r], #116]\n\t"
  104724. /* A[16] * B[14] */
  104725. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104726. "lsl r6, r8, #16\n\t"
  104727. "lsl r7, r12, #16\n\t"
  104728. "lsr r6, r6, #16\n\t"
  104729. "lsr r7, r7, #16\n\t"
  104730. "mul r7, r6, r7\n\t"
  104731. "adds r3, r3, r7\n\t"
  104732. "adcs r4, r4, #0\n\t"
  104733. "mov r5, #0\n\t"
  104734. "adc r5, r5, #0\n\t"
  104735. "lsr r7, r12, #16\n\t"
  104736. "mul r6, r7, r6\n\t"
  104737. "lsr r7, r6, #16\n\t"
  104738. "lsl r6, r6, #16\n\t"
  104739. "adds r3, r3, r6\n\t"
  104740. "adcs r4, r4, r7\n\t"
  104741. "adc r5, r5, #0\n\t"
  104742. "lsr r6, r8, #16\n\t"
  104743. "lsr r7, r12, #16\n\t"
  104744. "mul r7, r6, r7\n\t"
  104745. "adds r4, r4, r7\n\t"
  104746. "adc r5, r5, #0\n\t"
  104747. "lsl r7, r12, #16\n\t"
  104748. "lsr r7, r7, #16\n\t"
  104749. "mul r6, r7, r6\n\t"
  104750. "lsr r7, r6, #16\n\t"
  104751. "lsl r6, r6, #16\n\t"
  104752. "adds r3, r3, r6\n\t"
  104753. "adcs r4, r4, r7\n\t"
  104754. "adc r5, r5, #0\n\t"
  104755. #else
  104756. "umull r6, r7, r8, r12\n\t"
  104757. "adds r3, r3, r6\n\t"
  104758. "adcs r4, r4, r7\n\t"
  104759. "mov r5, #0\n\t"
  104760. "adc r5, r5, #0\n\t"
  104761. #endif
  104762. /* A[15] * B[15] */
  104763. "ldr r11, [%[a], #60]\n\t"
  104764. "ldr r12, [%[b], #60]\n\t"
  104765. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104766. "lsl r6, r11, #16\n\t"
  104767. "lsl r7, r12, #16\n\t"
  104768. "lsr r6, r6, #16\n\t"
  104769. "lsr r7, r7, #16\n\t"
  104770. "mul r7, r6, r7\n\t"
  104771. "adds r3, r3, r7\n\t"
  104772. "adcs r4, r4, #0\n\t"
  104773. "adc r5, r5, #0\n\t"
  104774. "lsr r7, r12, #16\n\t"
  104775. "mul r6, r7, r6\n\t"
  104776. "lsr r7, r6, #16\n\t"
  104777. "lsl r6, r6, #16\n\t"
  104778. "adds r3, r3, r6\n\t"
  104779. "adcs r4, r4, r7\n\t"
  104780. "adc r5, r5, #0\n\t"
  104781. "lsr r6, r11, #16\n\t"
  104782. "lsr r7, r12, #16\n\t"
  104783. "mul r7, r6, r7\n\t"
  104784. "adds r4, r4, r7\n\t"
  104785. "adc r5, r5, #0\n\t"
  104786. "lsl r7, r12, #16\n\t"
  104787. "lsr r7, r7, #16\n\t"
  104788. "mul r6, r7, r6\n\t"
  104789. "lsr r7, r6, #16\n\t"
  104790. "lsl r6, r6, #16\n\t"
  104791. "adds r3, r3, r6\n\t"
  104792. "adcs r4, r4, r7\n\t"
  104793. "adc r5, r5, #0\n\t"
  104794. #else
  104795. "umull r6, r7, r11, r12\n\t"
  104796. "adds r3, r3, r6\n\t"
  104797. "adcs r4, r4, r7\n\t"
  104798. "adc r5, r5, #0\n\t"
  104799. #endif
  104800. /* A[14] * B[16] */
  104801. "ldr r8, [%[a], #56]\n\t"
  104802. "ldr r9, [%[b], #64]\n\t"
  104803. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104804. "lsl r6, r8, #16\n\t"
  104805. "lsl r7, r9, #16\n\t"
  104806. "lsr r6, r6, #16\n\t"
  104807. "lsr r7, r7, #16\n\t"
  104808. "mul r7, r6, r7\n\t"
  104809. "adds r3, r3, r7\n\t"
  104810. "adcs r4, r4, #0\n\t"
  104811. "adc r5, r5, #0\n\t"
  104812. "lsr r7, r9, #16\n\t"
  104813. "mul r6, r7, r6\n\t"
  104814. "lsr r7, r6, #16\n\t"
  104815. "lsl r6, r6, #16\n\t"
  104816. "adds r3, r3, r6\n\t"
  104817. "adcs r4, r4, r7\n\t"
  104818. "adc r5, r5, #0\n\t"
  104819. "lsr r6, r8, #16\n\t"
  104820. "lsr r7, r9, #16\n\t"
  104821. "mul r7, r6, r7\n\t"
  104822. "adds r4, r4, r7\n\t"
  104823. "adc r5, r5, #0\n\t"
  104824. "lsl r7, r9, #16\n\t"
  104825. "lsr r7, r7, #16\n\t"
  104826. "mul r6, r7, r6\n\t"
  104827. "lsr r7, r6, #16\n\t"
  104828. "lsl r6, r6, #16\n\t"
  104829. "adds r3, r3, r6\n\t"
  104830. "adcs r4, r4, r7\n\t"
  104831. "adc r5, r5, #0\n\t"
  104832. #else
  104833. "umull r6, r7, r8, r9\n\t"
  104834. "adds r3, r3, r6\n\t"
  104835. "adcs r4, r4, r7\n\t"
  104836. "adc r5, r5, #0\n\t"
  104837. #endif
  104838. "str r3, [%[r], #120]\n\t"
  104839. /* A[15] * B[16] */
  104840. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104841. "lsl r6, r11, #16\n\t"
  104842. "lsl r7, r9, #16\n\t"
  104843. "lsr r6, r6, #16\n\t"
  104844. "lsr r7, r7, #16\n\t"
  104845. "mul r7, r6, r7\n\t"
  104846. "adds r4, r4, r7\n\t"
  104847. "adcs r5, r5, #0\n\t"
  104848. "mov r3, #0\n\t"
  104849. "adc r3, r3, #0\n\t"
  104850. "lsr r7, r9, #16\n\t"
  104851. "mul r6, r7, r6\n\t"
  104852. "lsr r7, r6, #16\n\t"
  104853. "lsl r6, r6, #16\n\t"
  104854. "adds r4, r4, r6\n\t"
  104855. "adcs r5, r5, r7\n\t"
  104856. "adc r3, r3, #0\n\t"
  104857. "lsr r6, r11, #16\n\t"
  104858. "lsr r7, r9, #16\n\t"
  104859. "mul r7, r6, r7\n\t"
  104860. "adds r5, r5, r7\n\t"
  104861. "adc r3, r3, #0\n\t"
  104862. "lsl r7, r9, #16\n\t"
  104863. "lsr r7, r7, #16\n\t"
  104864. "mul r6, r7, r6\n\t"
  104865. "lsr r7, r6, #16\n\t"
  104866. "lsl r6, r6, #16\n\t"
  104867. "adds r4, r4, r6\n\t"
  104868. "adcs r5, r5, r7\n\t"
  104869. "adc r3, r3, #0\n\t"
  104870. #else
  104871. "umull r6, r7, r11, r9\n\t"
  104872. "adds r4, r4, r6\n\t"
  104873. "adcs r5, r5, r7\n\t"
  104874. "mov r3, #0\n\t"
  104875. "adc r3, r3, #0\n\t"
  104876. #endif
  104877. /* A[16] * B[15] */
  104878. "ldr r8, [%[a], #64]\n\t"
  104879. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104880. "lsl r6, r8, #16\n\t"
  104881. "lsl r7, r12, #16\n\t"
  104882. "lsr r6, r6, #16\n\t"
  104883. "lsr r7, r7, #16\n\t"
  104884. "mul r7, r6, r7\n\t"
  104885. "adds r4, r4, r7\n\t"
  104886. "adcs r5, r5, #0\n\t"
  104887. "adc r3, r3, #0\n\t"
  104888. "lsr r7, r12, #16\n\t"
  104889. "mul r6, r7, r6\n\t"
  104890. "lsr r7, r6, #16\n\t"
  104891. "lsl r6, r6, #16\n\t"
  104892. "adds r4, r4, r6\n\t"
  104893. "adcs r5, r5, r7\n\t"
  104894. "adc r3, r3, #0\n\t"
  104895. "lsr r6, r8, #16\n\t"
  104896. "lsr r7, r12, #16\n\t"
  104897. "mul r7, r6, r7\n\t"
  104898. "adds r5, r5, r7\n\t"
  104899. "adc r3, r3, #0\n\t"
  104900. "lsl r7, r12, #16\n\t"
  104901. "lsr r7, r7, #16\n\t"
  104902. "mul r6, r7, r6\n\t"
  104903. "lsr r7, r6, #16\n\t"
  104904. "lsl r6, r6, #16\n\t"
  104905. "adds r4, r4, r6\n\t"
  104906. "adcs r5, r5, r7\n\t"
  104907. "adc r3, r3, #0\n\t"
  104908. #else
  104909. "umull r6, r7, r8, r12\n\t"
  104910. "adds r4, r4, r6\n\t"
  104911. "adcs r5, r5, r7\n\t"
  104912. "adc r3, r3, #0\n\t"
  104913. #endif
  104914. "str r4, [%[r], #124]\n\t"
  104915. /* A[16] * B[16] */
  104916. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104917. "lsl r6, r8, #16\n\t"
  104918. "lsl r7, r9, #16\n\t"
  104919. "lsr r6, r6, #16\n\t"
  104920. "lsr r7, r7, #16\n\t"
  104921. "mul r7, r6, r7\n\t"
  104922. "adds r5, r5, r7\n\t"
  104923. "adc r3, r3, #0\n\t"
  104924. "lsr r7, r9, #16\n\t"
  104925. "mul r6, r7, r6\n\t"
  104926. "lsr r7, r6, #16\n\t"
  104927. "lsl r6, r6, #16\n\t"
  104928. "adds r5, r5, r6\n\t"
  104929. "adc r3, r3, r7\n\t"
  104930. "lsr r6, r8, #16\n\t"
  104931. "lsr r7, r9, #16\n\t"
  104932. "mul r7, r6, r7\n\t"
  104933. "add r3, r3, r7\n\t"
  104934. "lsl r7, r9, #16\n\t"
  104935. "lsr r7, r7, #16\n\t"
  104936. "mul r6, r7, r6\n\t"
  104937. "lsr r7, r6, #16\n\t"
  104938. "lsl r6, r6, #16\n\t"
  104939. "adds r5, r5, r6\n\t"
  104940. "adc r3, r3, r7\n\t"
  104941. #else
  104942. "umull r6, r7, r8, r9\n\t"
  104943. "adds r5, r5, r6\n\t"
  104944. "adc r3, r3, r7\n\t"
  104945. #endif
  104946. "str r5, [%[r], #128]\n\t"
  104947. "str r3, [%[r], #132]\n\t"
  104948. "ldm sp!, {r3, r4, r5, r6}\n\t"
  104949. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  104950. "ldm sp!, {r3, r4, r5, r6}\n\t"
  104951. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  104952. "ldm sp!, {r3, r4, r5, r6}\n\t"
  104953. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  104954. "ldm sp!, {r3, r4, r5, r6}\n\t"
  104955. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  104956. "ldm sp!, {r3}\n\t"
  104957. "stm %[r]!, {r3}\n\t"
  104958. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  104959. :
  104960. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  104961. );
  104962. }
  104963. #endif /* WOLFSSL_SP_SMALL */
  104964. #ifdef WOLFSSL_SP_SMALL
  104965. /* Square a and put result in r. (r = a * a)
  104966. *
  104967. * r A single precision integer.
  104968. * a A single precision integer.
  104969. */
  104970. static void sp_521_sqr_17(sp_digit* r_p, const sp_digit* a_p)
  104971. {
  104972. register sp_digit* r asm ("r0") = r_p;
  104973. register const sp_digit* a asm ("r1") = a_p;
  104974. __asm__ __volatile__ (
  104975. "sub sp, sp, #0x88\n\t"
  104976. "mov r12, #0\n\t"
  104977. "mov r6, #0\n\t"
  104978. "mov r7, #0\n\t"
  104979. "mov r8, #0\n\t"
  104980. "mov r5, #0\n\t"
  104981. "\n"
  104982. "L_sp_521_sqr_17_outer_%=: \n\t"
  104983. "subs r3, r5, #0x40\n\t"
  104984. "it cc\n\t"
  104985. "movcc r3, r12\n\t"
  104986. "sub r4, r5, r3\n\t"
  104987. "\n"
  104988. "L_sp_521_sqr_17_inner_%=: \n\t"
  104989. "cmp r4, r3\n\t"
  104990. "beq L_sp_521_sqr_17_op_sqr_%=\n\t"
  104991. "ldr lr, [%[a], r3]\n\t"
  104992. "ldr r11, [%[a], r4]\n\t"
  104993. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  104994. "lsl r9, lr, #16\n\t"
  104995. "lsl r10, r11, #16\n\t"
  104996. "lsr r9, r9, #16\n\t"
  104997. "lsr r10, r10, #16\n\t"
  104998. "mul r10, r9, r10\n\t"
  104999. "adds r6, r6, r10\n\t"
  105000. "adcs r7, r7, #0\n\t"
  105001. "adc r8, r8, #0\n\t"
  105002. "adds r6, r6, r10\n\t"
  105003. "adcs r7, r7, #0\n\t"
  105004. "adc r8, r8, #0\n\t"
  105005. "lsr r10, r11, #16\n\t"
  105006. "mul r9, r10, r9\n\t"
  105007. "lsr r10, r9, #16\n\t"
  105008. "lsl r9, r9, #16\n\t"
  105009. "adds r6, r6, r9\n\t"
  105010. "adcs r7, r7, r10\n\t"
  105011. "adc r8, r8, #0\n\t"
  105012. "adds r6, r6, r9\n\t"
  105013. "adcs r7, r7, r10\n\t"
  105014. "adc r8, r8, #0\n\t"
  105015. "lsr r9, lr, #16\n\t"
  105016. "lsr r10, r11, #16\n\t"
  105017. "mul r10, r9, r10\n\t"
  105018. "adds r7, r7, r10\n\t"
  105019. "adc r8, r8, #0\n\t"
  105020. "adds r7, r7, r10\n\t"
  105021. "adc r8, r8, #0\n\t"
  105022. "lsl r10, r11, #16\n\t"
  105023. "lsr r10, r10, #16\n\t"
  105024. "mul r9, r10, r9\n\t"
  105025. "lsr r10, r9, #16\n\t"
  105026. "lsl r9, r9, #16\n\t"
  105027. "adds r6, r6, r9\n\t"
  105028. "adcs r7, r7, r10\n\t"
  105029. "adc r8, r8, #0\n\t"
  105030. "adds r6, r6, r9\n\t"
  105031. "adcs r7, r7, r10\n\t"
  105032. "adc r8, r8, #0\n\t"
  105033. #else
  105034. "umull r9, r10, lr, r11\n\t"
  105035. "adds r6, r6, r9\n\t"
  105036. "adcs r7, r7, r10\n\t"
  105037. "adc r8, r8, #0\n\t"
  105038. "adds r6, r6, r9\n\t"
  105039. "adcs r7, r7, r10\n\t"
  105040. "adc r8, r8, #0\n\t"
  105041. #endif
  105042. "bal L_sp_521_sqr_17_op_done_%=\n\t"
  105043. "\n"
  105044. "L_sp_521_sqr_17_op_sqr_%=: \n\t"
  105045. "ldr lr, [%[a], r3]\n\t"
  105046. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105047. "lsl r9, lr, #16\n\t"
  105048. "lsr r10, lr, #16\n\t"
  105049. "lsr r9, r9, #16\n\t"
  105050. "mov r11, r9\n\t"
  105051. "mul r9, r11, r9\n\t"
  105052. "mov r11, r10\n\t"
  105053. "mul r10, r11, r10\n\t"
  105054. "adds r6, r6, r9\n\t"
  105055. "adcs r7, r7, r10\n\t"
  105056. "adc r8, r8, #0\n\t"
  105057. "lsr r10, lr, #16\n\t"
  105058. "lsl r9, lr, #16\n\t"
  105059. "lsr r9, r9, #16\n\t"
  105060. "mul r9, r10, r9\n\t"
  105061. "lsr r10, r9, #15\n\t"
  105062. "lsl r9, r9, #17\n\t"
  105063. "adds r6, r6, r9\n\t"
  105064. "adcs r7, r7, r10\n\t"
  105065. "adc r8, r8, #0\n\t"
  105066. #else
  105067. "umull r9, r10, lr, lr\n\t"
  105068. "adds r6, r6, r9\n\t"
  105069. "adcs r7, r7, r10\n\t"
  105070. "adc r8, r8, #0\n\t"
  105071. #endif
  105072. "\n"
  105073. "L_sp_521_sqr_17_op_done_%=: \n\t"
  105074. "add r3, r3, #4\n\t"
  105075. "sub r4, r4, #4\n\t"
  105076. "cmp r3, #0x44\n\t"
  105077. "beq L_sp_521_sqr_17_inner_done_%=\n\t"
  105078. "cmp r3, r4\n\t"
  105079. "bgt L_sp_521_sqr_17_inner_done_%=\n\t"
  105080. "cmp r3, r5\n\t"
  105081. "ble L_sp_521_sqr_17_inner_%=\n\t"
  105082. "\n"
  105083. "L_sp_521_sqr_17_inner_done_%=: \n\t"
  105084. "str r6, [sp, r5]\n\t"
  105085. "mov r6, r7\n\t"
  105086. "mov r7, r8\n\t"
  105087. "mov r8, #0\n\t"
  105088. "add r5, r5, #4\n\t"
  105089. "cmp r5, #0x80\n\t"
  105090. "ble L_sp_521_sqr_17_outer_%=\n\t"
  105091. "str r6, [sp, r5]\n\t"
  105092. "ldm sp!, {r6, r7}\n\t"
  105093. "stm %[r]!, {r6, r7}\n\t"
  105094. "sub r5, r5, #8\n\t"
  105095. "\n"
  105096. "L_sp_521_sqr_17_store_%=: \n\t"
  105097. "ldm sp!, {r6, r7, r8, r9}\n\t"
  105098. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  105099. "subs r5, r5, #16\n\t"
  105100. "bgt L_sp_521_sqr_17_store_%=\n\t"
  105101. : [r] "+r" (r), [a] "+r" (a)
  105102. :
  105103. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12"
  105104. );
  105105. }
  105106. #else
  105107. /* Square a and put result in r. (r = a * a)
  105108. *
  105109. * r A single precision integer.
  105110. * a A single precision integer.
  105111. */
  105112. static void sp_521_sqr_17(sp_digit* r_p, const sp_digit* a_p)
  105113. {
  105114. register sp_digit* r asm ("r0") = r_p;
  105115. register const sp_digit* a asm ("r1") = a_p;
  105116. __asm__ __volatile__ (
  105117. "sub sp, sp, #0x44\n\t"
  105118. /* A[0] * A[0] */
  105119. "ldr r10, [%[a]]\n\t"
  105120. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105121. "lsr r9, r10, #16\n\t"
  105122. "lsl r2, r10, #16\n\t"
  105123. "lsr r2, r2, #16\n\t"
  105124. "mul r8, r2, r2\n\t"
  105125. "mul r3, r9, r9\n\t"
  105126. "mul r2, r9, r2\n\t"
  105127. "lsr r9, r2, #15\n\t"
  105128. "lsl r2, r2, #17\n\t"
  105129. "adds r8, r8, r2\n\t"
  105130. "adc r3, r3, r9\n\t"
  105131. #else
  105132. "umull r8, r3, r10, r10\n\t"
  105133. #endif
  105134. "mov r4, #0\n\t"
  105135. "str r8, [sp]\n\t"
  105136. /* A[0] * A[1] */
  105137. "ldr r10, [%[a], #4]\n\t"
  105138. "ldr r12, [%[a]]\n\t"
  105139. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105140. "lsl r8, r10, #16\n\t"
  105141. "lsl r9, r12, #16\n\t"
  105142. "lsr r8, r8, #16\n\t"
  105143. "lsr r9, r9, #16\n\t"
  105144. "mul r9, r8, r9\n\t"
  105145. "adds r3, r3, r9\n\t"
  105146. "adcs r4, r4, #0\n\t"
  105147. "mov r2, #0\n\t"
  105148. "adc r2, r2, #0\n\t"
  105149. "adds r3, r3, r9\n\t"
  105150. "adcs r4, r4, #0\n\t"
  105151. "adc r2, r2, #0\n\t"
  105152. "lsr r9, r12, #16\n\t"
  105153. "mul r8, r9, r8\n\t"
  105154. "lsr r9, r8, #16\n\t"
  105155. "lsl r8, r8, #16\n\t"
  105156. "adds r3, r3, r8\n\t"
  105157. "adcs r4, r4, r9\n\t"
  105158. "adc r2, r2, #0\n\t"
  105159. "adds r3, r3, r8\n\t"
  105160. "adcs r4, r4, r9\n\t"
  105161. "adc r2, r2, #0\n\t"
  105162. "lsr r8, r10, #16\n\t"
  105163. "lsr r9, r12, #16\n\t"
  105164. "mul r9, r8, r9\n\t"
  105165. "adds r4, r4, r9\n\t"
  105166. "adc r2, r2, #0\n\t"
  105167. "adds r4, r4, r9\n\t"
  105168. "adc r2, r2, #0\n\t"
  105169. "lsl r9, r12, #16\n\t"
  105170. "lsr r9, r9, #16\n\t"
  105171. "mul r8, r9, r8\n\t"
  105172. "lsr r9, r8, #16\n\t"
  105173. "lsl r8, r8, #16\n\t"
  105174. "adds r3, r3, r8\n\t"
  105175. "adcs r4, r4, r9\n\t"
  105176. "adc r2, r2, #0\n\t"
  105177. "adds r3, r3, r8\n\t"
  105178. "adcs r4, r4, r9\n\t"
  105179. "adc r2, r2, #0\n\t"
  105180. #else
  105181. "umull r8, r9, r10, r12\n\t"
  105182. "adds r3, r3, r8\n\t"
  105183. "adcs r4, r4, r9\n\t"
  105184. "mov r2, #0\n\t"
  105185. "adc r2, r2, #0\n\t"
  105186. "adds r3, r3, r8\n\t"
  105187. "adcs r4, r4, r9\n\t"
  105188. "mov r2, #0\n\t"
  105189. "adc r2, r2, #0\n\t"
  105190. #endif
  105191. "str r3, [sp, #4]\n\t"
  105192. /* A[0] * A[2] */
  105193. "ldr r10, [%[a], #8]\n\t"
  105194. "ldr r12, [%[a]]\n\t"
  105195. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105196. "lsl r8, r10, #16\n\t"
  105197. "lsl r9, r12, #16\n\t"
  105198. "lsr r8, r8, #16\n\t"
  105199. "lsr r9, r9, #16\n\t"
  105200. "mul r9, r8, r9\n\t"
  105201. "adds r4, r4, r9\n\t"
  105202. "adcs r2, r2, #0\n\t"
  105203. "mov r3, #0\n\t"
  105204. "adc r3, r3, #0\n\t"
  105205. "adds r4, r4, r9\n\t"
  105206. "adcs r2, r2, #0\n\t"
  105207. "adc r3, r3, #0\n\t"
  105208. "lsr r9, r12, #16\n\t"
  105209. "mul r8, r9, r8\n\t"
  105210. "lsr r9, r8, #16\n\t"
  105211. "lsl r8, r8, #16\n\t"
  105212. "adds r4, r4, r8\n\t"
  105213. "adcs r2, r2, r9\n\t"
  105214. "adc r3, r3, #0\n\t"
  105215. "adds r4, r4, r8\n\t"
  105216. "adcs r2, r2, r9\n\t"
  105217. "adc r3, r3, #0\n\t"
  105218. "lsr r8, r10, #16\n\t"
  105219. "lsr r9, r12, #16\n\t"
  105220. "mul r9, r8, r9\n\t"
  105221. "adds r2, r2, r9\n\t"
  105222. "adc r3, r3, #0\n\t"
  105223. "adds r2, r2, r9\n\t"
  105224. "adc r3, r3, #0\n\t"
  105225. "lsl r9, r12, #16\n\t"
  105226. "lsr r9, r9, #16\n\t"
  105227. "mul r8, r9, r8\n\t"
  105228. "lsr r9, r8, #16\n\t"
  105229. "lsl r8, r8, #16\n\t"
  105230. "adds r4, r4, r8\n\t"
  105231. "adcs r2, r2, r9\n\t"
  105232. "adc r3, r3, #0\n\t"
  105233. "adds r4, r4, r8\n\t"
  105234. "adcs r2, r2, r9\n\t"
  105235. "adc r3, r3, #0\n\t"
  105236. #else
  105237. "umull r8, r9, r10, r12\n\t"
  105238. "adds r4, r4, r8\n\t"
  105239. "adcs r2, r2, r9\n\t"
  105240. "mov r3, #0\n\t"
  105241. "adc r3, r3, #0\n\t"
  105242. "adds r4, r4, r8\n\t"
  105243. "adcs r2, r2, r9\n\t"
  105244. "mov r3, #0\n\t"
  105245. "adc r3, r3, #0\n\t"
  105246. #endif
  105247. /* A[1] * A[1] */
  105248. "ldr r10, [%[a], #4]\n\t"
  105249. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105250. "lsl r8, r10, #16\n\t"
  105251. "lsr r9, r10, #16\n\t"
  105252. "lsr r8, r8, #16\n\t"
  105253. "mov r12, r8\n\t"
  105254. "mul r8, r12, r8\n\t"
  105255. "mov r12, r9\n\t"
  105256. "mul r9, r12, r9\n\t"
  105257. "adds r4, r4, r8\n\t"
  105258. "adcs r2, r2, r9\n\t"
  105259. "adc r3, r3, #0\n\t"
  105260. "lsr r9, r10, #16\n\t"
  105261. "lsl r8, r10, #16\n\t"
  105262. "lsr r8, r8, #16\n\t"
  105263. "mul r8, r9, r8\n\t"
  105264. "lsr r9, r8, #15\n\t"
  105265. "lsl r8, r8, #17\n\t"
  105266. "adds r4, r4, r8\n\t"
  105267. "adcs r2, r2, r9\n\t"
  105268. "adc r3, r3, #0\n\t"
  105269. #else
  105270. "umull r8, r9, r10, r10\n\t"
  105271. "adds r4, r4, r8\n\t"
  105272. "adcs r2, r2, r9\n\t"
  105273. "adc r3, r3, #0\n\t"
  105274. #endif
  105275. "str r4, [sp, #8]\n\t"
  105276. /* A[0] * A[3] */
  105277. "ldr r10, [%[a], #12]\n\t"
  105278. "ldr r12, [%[a]]\n\t"
  105279. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105280. "lsl r8, r10, #16\n\t"
  105281. "lsl r9, r12, #16\n\t"
  105282. "lsr r8, r8, #16\n\t"
  105283. "lsr r9, r9, #16\n\t"
  105284. "mul r9, r8, r9\n\t"
  105285. "adds r2, r2, r9\n\t"
  105286. "adcs r3, r3, #0\n\t"
  105287. "mov r4, #0\n\t"
  105288. "adc r4, r4, #0\n\t"
  105289. "adds r2, r2, r9\n\t"
  105290. "adcs r3, r3, #0\n\t"
  105291. "adc r4, r4, #0\n\t"
  105292. "lsr r9, r12, #16\n\t"
  105293. "mul r8, r9, r8\n\t"
  105294. "lsr r9, r8, #16\n\t"
  105295. "lsl r8, r8, #16\n\t"
  105296. "adds r2, r2, r8\n\t"
  105297. "adcs r3, r3, r9\n\t"
  105298. "adc r4, r4, #0\n\t"
  105299. "adds r2, r2, r8\n\t"
  105300. "adcs r3, r3, r9\n\t"
  105301. "adc r4, r4, #0\n\t"
  105302. "lsr r8, r10, #16\n\t"
  105303. "lsr r9, r12, #16\n\t"
  105304. "mul r9, r8, r9\n\t"
  105305. "adds r3, r3, r9\n\t"
  105306. "adc r4, r4, #0\n\t"
  105307. "adds r3, r3, r9\n\t"
  105308. "adc r4, r4, #0\n\t"
  105309. "lsl r9, r12, #16\n\t"
  105310. "lsr r9, r9, #16\n\t"
  105311. "mul r8, r9, r8\n\t"
  105312. "lsr r9, r8, #16\n\t"
  105313. "lsl r8, r8, #16\n\t"
  105314. "adds r2, r2, r8\n\t"
  105315. "adcs r3, r3, r9\n\t"
  105316. "adc r4, r4, #0\n\t"
  105317. "adds r2, r2, r8\n\t"
  105318. "adcs r3, r3, r9\n\t"
  105319. "adc r4, r4, #0\n\t"
  105320. #else
  105321. "umull r8, r9, r10, r12\n\t"
  105322. "adds r2, r2, r8\n\t"
  105323. "adcs r3, r3, r9\n\t"
  105324. "mov r4, #0\n\t"
  105325. "adc r4, r4, #0\n\t"
  105326. "adds r2, r2, r8\n\t"
  105327. "adcs r3, r3, r9\n\t"
  105328. "mov r4, #0\n\t"
  105329. "adc r4, r4, #0\n\t"
  105330. #endif
  105331. /* A[1] * A[2] */
  105332. "ldr r10, [%[a], #8]\n\t"
  105333. "ldr r12, [%[a], #4]\n\t"
  105334. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105335. "lsl r8, r10, #16\n\t"
  105336. "lsl r9, r12, #16\n\t"
  105337. "lsr r8, r8, #16\n\t"
  105338. "lsr r9, r9, #16\n\t"
  105339. "mul r9, r8, r9\n\t"
  105340. "adds r2, r2, r9\n\t"
  105341. "adcs r3, r3, #0\n\t"
  105342. "adc r4, r4, #0\n\t"
  105343. "adds r2, r2, r9\n\t"
  105344. "adcs r3, r3, #0\n\t"
  105345. "adc r4, r4, #0\n\t"
  105346. "lsr r9, r12, #16\n\t"
  105347. "mul r8, r9, r8\n\t"
  105348. "lsr r9, r8, #16\n\t"
  105349. "lsl r8, r8, #16\n\t"
  105350. "adds r2, r2, r8\n\t"
  105351. "adcs r3, r3, r9\n\t"
  105352. "adc r4, r4, #0\n\t"
  105353. "adds r2, r2, r8\n\t"
  105354. "adcs r3, r3, r9\n\t"
  105355. "adc r4, r4, #0\n\t"
  105356. "lsr r8, r10, #16\n\t"
  105357. "lsr r9, r12, #16\n\t"
  105358. "mul r9, r8, r9\n\t"
  105359. "adds r3, r3, r9\n\t"
  105360. "adc r4, r4, #0\n\t"
  105361. "adds r3, r3, r9\n\t"
  105362. "adc r4, r4, #0\n\t"
  105363. "lsl r9, r12, #16\n\t"
  105364. "lsr r9, r9, #16\n\t"
  105365. "mul r8, r9, r8\n\t"
  105366. "lsr r9, r8, #16\n\t"
  105367. "lsl r8, r8, #16\n\t"
  105368. "adds r2, r2, r8\n\t"
  105369. "adcs r3, r3, r9\n\t"
  105370. "adc r4, r4, #0\n\t"
  105371. "adds r2, r2, r8\n\t"
  105372. "adcs r3, r3, r9\n\t"
  105373. "adc r4, r4, #0\n\t"
  105374. #else
  105375. "umull r8, r9, r10, r12\n\t"
  105376. "adds r2, r2, r8\n\t"
  105377. "adcs r3, r3, r9\n\t"
  105378. "adc r4, r4, #0\n\t"
  105379. "adds r2, r2, r8\n\t"
  105380. "adcs r3, r3, r9\n\t"
  105381. "adc r4, r4, #0\n\t"
  105382. #endif
  105383. "str r2, [sp, #12]\n\t"
  105384. /* A[0] * A[4] */
  105385. "ldr r10, [%[a], #16]\n\t"
  105386. "ldr r12, [%[a]]\n\t"
  105387. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105388. "lsl r8, r10, #16\n\t"
  105389. "lsl r9, r12, #16\n\t"
  105390. "lsr r8, r8, #16\n\t"
  105391. "lsr r9, r9, #16\n\t"
  105392. "mul r9, r8, r9\n\t"
  105393. "adds r3, r3, r9\n\t"
  105394. "adcs r4, r4, #0\n\t"
  105395. "mov r2, #0\n\t"
  105396. "adc r2, r2, #0\n\t"
  105397. "adds r3, r3, r9\n\t"
  105398. "adcs r4, r4, #0\n\t"
  105399. "adc r2, r2, #0\n\t"
  105400. "lsr r9, r12, #16\n\t"
  105401. "mul r8, r9, r8\n\t"
  105402. "lsr r9, r8, #16\n\t"
  105403. "lsl r8, r8, #16\n\t"
  105404. "adds r3, r3, r8\n\t"
  105405. "adcs r4, r4, r9\n\t"
  105406. "adc r2, r2, #0\n\t"
  105407. "adds r3, r3, r8\n\t"
  105408. "adcs r4, r4, r9\n\t"
  105409. "adc r2, r2, #0\n\t"
  105410. "lsr r8, r10, #16\n\t"
  105411. "lsr r9, r12, #16\n\t"
  105412. "mul r9, r8, r9\n\t"
  105413. "adds r4, r4, r9\n\t"
  105414. "adc r2, r2, #0\n\t"
  105415. "adds r4, r4, r9\n\t"
  105416. "adc r2, r2, #0\n\t"
  105417. "lsl r9, r12, #16\n\t"
  105418. "lsr r9, r9, #16\n\t"
  105419. "mul r8, r9, r8\n\t"
  105420. "lsr r9, r8, #16\n\t"
  105421. "lsl r8, r8, #16\n\t"
  105422. "adds r3, r3, r8\n\t"
  105423. "adcs r4, r4, r9\n\t"
  105424. "adc r2, r2, #0\n\t"
  105425. "adds r3, r3, r8\n\t"
  105426. "adcs r4, r4, r9\n\t"
  105427. "adc r2, r2, #0\n\t"
  105428. #else
  105429. "umull r8, r9, r10, r12\n\t"
  105430. "adds r3, r3, r8\n\t"
  105431. "adcs r4, r4, r9\n\t"
  105432. "mov r2, #0\n\t"
  105433. "adc r2, r2, #0\n\t"
  105434. "adds r3, r3, r8\n\t"
  105435. "adcs r4, r4, r9\n\t"
  105436. "mov r2, #0\n\t"
  105437. "adc r2, r2, #0\n\t"
  105438. #endif
  105439. /* A[1] * A[3] */
  105440. "ldr r10, [%[a], #12]\n\t"
  105441. "ldr r12, [%[a], #4]\n\t"
  105442. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105443. "lsl r8, r10, #16\n\t"
  105444. "lsl r9, r12, #16\n\t"
  105445. "lsr r8, r8, #16\n\t"
  105446. "lsr r9, r9, #16\n\t"
  105447. "mul r9, r8, r9\n\t"
  105448. "adds r3, r3, r9\n\t"
  105449. "adcs r4, r4, #0\n\t"
  105450. "adc r2, r2, #0\n\t"
  105451. "adds r3, r3, r9\n\t"
  105452. "adcs r4, r4, #0\n\t"
  105453. "adc r2, r2, #0\n\t"
  105454. "lsr r9, r12, #16\n\t"
  105455. "mul r8, r9, r8\n\t"
  105456. "lsr r9, r8, #16\n\t"
  105457. "lsl r8, r8, #16\n\t"
  105458. "adds r3, r3, r8\n\t"
  105459. "adcs r4, r4, r9\n\t"
  105460. "adc r2, r2, #0\n\t"
  105461. "adds r3, r3, r8\n\t"
  105462. "adcs r4, r4, r9\n\t"
  105463. "adc r2, r2, #0\n\t"
  105464. "lsr r8, r10, #16\n\t"
  105465. "lsr r9, r12, #16\n\t"
  105466. "mul r9, r8, r9\n\t"
  105467. "adds r4, r4, r9\n\t"
  105468. "adc r2, r2, #0\n\t"
  105469. "adds r4, r4, r9\n\t"
  105470. "adc r2, r2, #0\n\t"
  105471. "lsl r9, r12, #16\n\t"
  105472. "lsr r9, r9, #16\n\t"
  105473. "mul r8, r9, r8\n\t"
  105474. "lsr r9, r8, #16\n\t"
  105475. "lsl r8, r8, #16\n\t"
  105476. "adds r3, r3, r8\n\t"
  105477. "adcs r4, r4, r9\n\t"
  105478. "adc r2, r2, #0\n\t"
  105479. "adds r3, r3, r8\n\t"
  105480. "adcs r4, r4, r9\n\t"
  105481. "adc r2, r2, #0\n\t"
  105482. #else
  105483. "umull r8, r9, r10, r12\n\t"
  105484. "adds r3, r3, r8\n\t"
  105485. "adcs r4, r4, r9\n\t"
  105486. "adc r2, r2, #0\n\t"
  105487. "adds r3, r3, r8\n\t"
  105488. "adcs r4, r4, r9\n\t"
  105489. "adc r2, r2, #0\n\t"
  105490. #endif
  105491. /* A[2] * A[2] */
  105492. "ldr r10, [%[a], #8]\n\t"
  105493. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105494. "lsl r8, r10, #16\n\t"
  105495. "lsr r9, r10, #16\n\t"
  105496. "lsr r8, r8, #16\n\t"
  105497. "mov r12, r8\n\t"
  105498. "mul r8, r12, r8\n\t"
  105499. "mov r12, r9\n\t"
  105500. "mul r9, r12, r9\n\t"
  105501. "adds r3, r3, r8\n\t"
  105502. "adcs r4, r4, r9\n\t"
  105503. "adc r2, r2, #0\n\t"
  105504. "lsr r9, r10, #16\n\t"
  105505. "lsl r8, r10, #16\n\t"
  105506. "lsr r8, r8, #16\n\t"
  105507. "mul r8, r9, r8\n\t"
  105508. "lsr r9, r8, #15\n\t"
  105509. "lsl r8, r8, #17\n\t"
  105510. "adds r3, r3, r8\n\t"
  105511. "adcs r4, r4, r9\n\t"
  105512. "adc r2, r2, #0\n\t"
  105513. #else
  105514. "umull r8, r9, r10, r10\n\t"
  105515. "adds r3, r3, r8\n\t"
  105516. "adcs r4, r4, r9\n\t"
  105517. "adc r2, r2, #0\n\t"
  105518. #endif
  105519. "str r3, [sp, #16]\n\t"
  105520. /* A[0] * A[5] */
  105521. "ldr r10, [%[a], #20]\n\t"
  105522. "ldr r12, [%[a]]\n\t"
  105523. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105524. "lsl r8, r10, #16\n\t"
  105525. "lsl r5, r12, #16\n\t"
  105526. "lsr r8, r8, #16\n\t"
  105527. "lsr r5, r5, #16\n\t"
  105528. "mul r5, r8, r5\n\t"
  105529. "lsr r9, r12, #16\n\t"
  105530. "mul r8, r9, r8\n\t"
  105531. "lsr r6, r8, #16\n\t"
  105532. "lsl r8, r8, #16\n\t"
  105533. "adds r5, r5, r8\n\t"
  105534. "adc r6, r6, #0\n\t"
  105535. "lsr r8, r10, #16\n\t"
  105536. "mul r9, r8, r9\n\t"
  105537. "add r6, r6, r9\n\t"
  105538. "lsl r9, r12, #16\n\t"
  105539. "lsr r9, r9, #16\n\t"
  105540. "mul r8, r9, r8\n\t"
  105541. "lsr r9, r8, #16\n\t"
  105542. "lsl r8, r8, #16\n\t"
  105543. "adds r5, r5, r8\n\t"
  105544. "adc r6, r6, r9\n\t"
  105545. #else
  105546. "umull r5, r6, r10, r12\n\t"
  105547. #endif
  105548. "mov r3, #0\n\t"
  105549. "mov r7, #0\n\t"
  105550. /* A[1] * A[4] */
  105551. "ldr r10, [%[a], #16]\n\t"
  105552. "ldr r12, [%[a], #4]\n\t"
  105553. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105554. "lsl r8, r10, #16\n\t"
  105555. "lsl r9, r12, #16\n\t"
  105556. "lsr r8, r8, #16\n\t"
  105557. "lsr r9, r9, #16\n\t"
  105558. "mul r9, r8, r9\n\t"
  105559. "adds r5, r5, r9\n\t"
  105560. "adcs r6, r6, #0\n\t"
  105561. "adc r7, r7, #0\n\t"
  105562. "lsr r9, r12, #16\n\t"
  105563. "mul r8, r9, r8\n\t"
  105564. "lsr r9, r8, #16\n\t"
  105565. "lsl r8, r8, #16\n\t"
  105566. "adds r5, r5, r8\n\t"
  105567. "adcs r6, r6, r9\n\t"
  105568. "adc r7, r7, #0\n\t"
  105569. "lsr r8, r10, #16\n\t"
  105570. "lsr r9, r12, #16\n\t"
  105571. "mul r9, r8, r9\n\t"
  105572. "adds r6, r6, r9\n\t"
  105573. "adc r7, r7, #0\n\t"
  105574. "lsl r9, r12, #16\n\t"
  105575. "lsr r9, r9, #16\n\t"
  105576. "mul r8, r9, r8\n\t"
  105577. "lsr r9, r8, #16\n\t"
  105578. "lsl r8, r8, #16\n\t"
  105579. "adds r5, r5, r8\n\t"
  105580. "adcs r6, r6, r9\n\t"
  105581. "adc r7, r7, #0\n\t"
  105582. #else
  105583. "umull r8, r9, r10, r12\n\t"
  105584. "adds r5, r5, r8\n\t"
  105585. "adcs r6, r6, r9\n\t"
  105586. "adc r7, r7, #0\n\t"
  105587. #endif
  105588. /* A[2] * A[3] */
  105589. "ldr r10, [%[a], #12]\n\t"
  105590. "ldr r12, [%[a], #8]\n\t"
  105591. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105592. "lsl r8, r10, #16\n\t"
  105593. "lsl r9, r12, #16\n\t"
  105594. "lsr r8, r8, #16\n\t"
  105595. "lsr r9, r9, #16\n\t"
  105596. "mul r9, r8, r9\n\t"
  105597. "adds r5, r5, r9\n\t"
  105598. "adcs r6, r6, #0\n\t"
  105599. "adc r7, r7, #0\n\t"
  105600. "lsr r9, r12, #16\n\t"
  105601. "mul r8, r9, r8\n\t"
  105602. "lsr r9, r8, #16\n\t"
  105603. "lsl r8, r8, #16\n\t"
  105604. "adds r5, r5, r8\n\t"
  105605. "adcs r6, r6, r9\n\t"
  105606. "adc r7, r7, #0\n\t"
  105607. "lsr r8, r10, #16\n\t"
  105608. "lsr r9, r12, #16\n\t"
  105609. "mul r9, r8, r9\n\t"
  105610. "adds r6, r6, r9\n\t"
  105611. "adc r7, r7, #0\n\t"
  105612. "lsl r9, r12, #16\n\t"
  105613. "lsr r9, r9, #16\n\t"
  105614. "mul r8, r9, r8\n\t"
  105615. "lsr r9, r8, #16\n\t"
  105616. "lsl r8, r8, #16\n\t"
  105617. "adds r5, r5, r8\n\t"
  105618. "adcs r6, r6, r9\n\t"
  105619. "adc r7, r7, #0\n\t"
  105620. #else
  105621. "umull r8, r9, r10, r12\n\t"
  105622. "adds r5, r5, r8\n\t"
  105623. "adcs r6, r6, r9\n\t"
  105624. "adc r7, r7, #0\n\t"
  105625. #endif
  105626. "adds r5, r5, r5\n\t"
  105627. "adcs r6, r6, r6\n\t"
  105628. "adc r7, r7, r7\n\t"
  105629. "adds r4, r4, r5\n\t"
  105630. "adcs r2, r2, r6\n\t"
  105631. "adc r3, r3, r7\n\t"
  105632. "str r4, [sp, #20]\n\t"
  105633. /* A[0] * A[6] */
  105634. "ldr r10, [%[a], #24]\n\t"
  105635. "ldr r12, [%[a]]\n\t"
  105636. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105637. "lsl r8, r10, #16\n\t"
  105638. "lsl r5, r12, #16\n\t"
  105639. "lsr r8, r8, #16\n\t"
  105640. "lsr r5, r5, #16\n\t"
  105641. "mul r5, r8, r5\n\t"
  105642. "lsr r9, r12, #16\n\t"
  105643. "mul r8, r9, r8\n\t"
  105644. "lsr r6, r8, #16\n\t"
  105645. "lsl r8, r8, #16\n\t"
  105646. "adds r5, r5, r8\n\t"
  105647. "adc r6, r6, #0\n\t"
  105648. "lsr r8, r10, #16\n\t"
  105649. "mul r9, r8, r9\n\t"
  105650. "add r6, r6, r9\n\t"
  105651. "lsl r9, r12, #16\n\t"
  105652. "lsr r9, r9, #16\n\t"
  105653. "mul r8, r9, r8\n\t"
  105654. "lsr r9, r8, #16\n\t"
  105655. "lsl r8, r8, #16\n\t"
  105656. "adds r5, r5, r8\n\t"
  105657. "adc r6, r6, r9\n\t"
  105658. #else
  105659. "umull r5, r6, r10, r12\n\t"
  105660. #endif
  105661. "mov r4, #0\n\t"
  105662. "mov r7, #0\n\t"
  105663. /* A[1] * A[5] */
  105664. "ldr r10, [%[a], #20]\n\t"
  105665. "ldr r12, [%[a], #4]\n\t"
  105666. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105667. "lsl r8, r10, #16\n\t"
  105668. "lsl r9, r12, #16\n\t"
  105669. "lsr r8, r8, #16\n\t"
  105670. "lsr r9, r9, #16\n\t"
  105671. "mul r9, r8, r9\n\t"
  105672. "adds r5, r5, r9\n\t"
  105673. "adcs r6, r6, #0\n\t"
  105674. "adc r7, r7, #0\n\t"
  105675. "lsr r9, r12, #16\n\t"
  105676. "mul r8, r9, r8\n\t"
  105677. "lsr r9, r8, #16\n\t"
  105678. "lsl r8, r8, #16\n\t"
  105679. "adds r5, r5, r8\n\t"
  105680. "adcs r6, r6, r9\n\t"
  105681. "adc r7, r7, #0\n\t"
  105682. "lsr r8, r10, #16\n\t"
  105683. "lsr r9, r12, #16\n\t"
  105684. "mul r9, r8, r9\n\t"
  105685. "adds r6, r6, r9\n\t"
  105686. "adc r7, r7, #0\n\t"
  105687. "lsl r9, r12, #16\n\t"
  105688. "lsr r9, r9, #16\n\t"
  105689. "mul r8, r9, r8\n\t"
  105690. "lsr r9, r8, #16\n\t"
  105691. "lsl r8, r8, #16\n\t"
  105692. "adds r5, r5, r8\n\t"
  105693. "adcs r6, r6, r9\n\t"
  105694. "adc r7, r7, #0\n\t"
  105695. #else
  105696. "umull r8, r9, r10, r12\n\t"
  105697. "adds r5, r5, r8\n\t"
  105698. "adcs r6, r6, r9\n\t"
  105699. "adc r7, r7, #0\n\t"
  105700. #endif
  105701. /* A[2] * A[4] */
  105702. "ldr r10, [%[a], #16]\n\t"
  105703. "ldr r12, [%[a], #8]\n\t"
  105704. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105705. "lsl r8, r10, #16\n\t"
  105706. "lsl r9, r12, #16\n\t"
  105707. "lsr r8, r8, #16\n\t"
  105708. "lsr r9, r9, #16\n\t"
  105709. "mul r9, r8, r9\n\t"
  105710. "adds r5, r5, r9\n\t"
  105711. "adcs r6, r6, #0\n\t"
  105712. "adc r7, r7, #0\n\t"
  105713. "lsr r9, r12, #16\n\t"
  105714. "mul r8, r9, r8\n\t"
  105715. "lsr r9, r8, #16\n\t"
  105716. "lsl r8, r8, #16\n\t"
  105717. "adds r5, r5, r8\n\t"
  105718. "adcs r6, r6, r9\n\t"
  105719. "adc r7, r7, #0\n\t"
  105720. "lsr r8, r10, #16\n\t"
  105721. "lsr r9, r12, #16\n\t"
  105722. "mul r9, r8, r9\n\t"
  105723. "adds r6, r6, r9\n\t"
  105724. "adc r7, r7, #0\n\t"
  105725. "lsl r9, r12, #16\n\t"
  105726. "lsr r9, r9, #16\n\t"
  105727. "mul r8, r9, r8\n\t"
  105728. "lsr r9, r8, #16\n\t"
  105729. "lsl r8, r8, #16\n\t"
  105730. "adds r5, r5, r8\n\t"
  105731. "adcs r6, r6, r9\n\t"
  105732. "adc r7, r7, #0\n\t"
  105733. #else
  105734. "umull r8, r9, r10, r12\n\t"
  105735. "adds r5, r5, r8\n\t"
  105736. "adcs r6, r6, r9\n\t"
  105737. "adc r7, r7, #0\n\t"
  105738. #endif
  105739. /* A[3] * A[3] */
  105740. "ldr r10, [%[a], #12]\n\t"
  105741. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105742. "lsl r8, r10, #16\n\t"
  105743. "lsr r9, r10, #16\n\t"
  105744. "lsr r8, r8, #16\n\t"
  105745. "mov r12, r8\n\t"
  105746. "mul r8, r12, r8\n\t"
  105747. "mov r12, r9\n\t"
  105748. "mul r9, r12, r9\n\t"
  105749. "adds r2, r2, r8\n\t"
  105750. "adcs r3, r3, r9\n\t"
  105751. "adc r4, r4, #0\n\t"
  105752. "lsr r9, r10, #16\n\t"
  105753. "lsl r8, r10, #16\n\t"
  105754. "lsr r8, r8, #16\n\t"
  105755. "mul r8, r9, r8\n\t"
  105756. "lsr r9, r8, #15\n\t"
  105757. "lsl r8, r8, #17\n\t"
  105758. "adds r2, r2, r8\n\t"
  105759. "adcs r3, r3, r9\n\t"
  105760. "adc r4, r4, #0\n\t"
  105761. "adds r5, r5, r5\n\t"
  105762. "adcs r6, r6, r6\n\t"
  105763. "adc r7, r7, r7\n\t"
  105764. #else
  105765. "umull r8, r9, r10, r10\n\t"
  105766. "adds r5, r5, r5\n\t"
  105767. "adcs r6, r6, r6\n\t"
  105768. "adc r7, r7, r7\n\t"
  105769. "adds r2, r2, r8\n\t"
  105770. "adcs r3, r3, r9\n\t"
  105771. "adc r4, r4, #0\n\t"
  105772. #endif
  105773. "adds r2, r2, r5\n\t"
  105774. "adcs r3, r3, r6\n\t"
  105775. "adc r4, r4, r7\n\t"
  105776. "str r2, [sp, #24]\n\t"
  105777. /* A[0] * A[7] */
  105778. "ldr r10, [%[a], #28]\n\t"
  105779. "ldr r12, [%[a]]\n\t"
  105780. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105781. "lsl r8, r10, #16\n\t"
  105782. "lsl r5, r12, #16\n\t"
  105783. "lsr r8, r8, #16\n\t"
  105784. "lsr r5, r5, #16\n\t"
  105785. "mul r5, r8, r5\n\t"
  105786. "lsr r9, r12, #16\n\t"
  105787. "mul r8, r9, r8\n\t"
  105788. "lsr r6, r8, #16\n\t"
  105789. "lsl r8, r8, #16\n\t"
  105790. "adds r5, r5, r8\n\t"
  105791. "adc r6, r6, #0\n\t"
  105792. "lsr r8, r10, #16\n\t"
  105793. "mul r9, r8, r9\n\t"
  105794. "add r6, r6, r9\n\t"
  105795. "lsl r9, r12, #16\n\t"
  105796. "lsr r9, r9, #16\n\t"
  105797. "mul r8, r9, r8\n\t"
  105798. "lsr r9, r8, #16\n\t"
  105799. "lsl r8, r8, #16\n\t"
  105800. "adds r5, r5, r8\n\t"
  105801. "adc r6, r6, r9\n\t"
  105802. #else
  105803. "umull r5, r6, r10, r12\n\t"
  105804. #endif
  105805. "mov r2, #0\n\t"
  105806. "mov r7, #0\n\t"
  105807. /* A[1] * A[6] */
  105808. "ldr r10, [%[a], #24]\n\t"
  105809. "ldr r12, [%[a], #4]\n\t"
  105810. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105811. "lsl r8, r10, #16\n\t"
  105812. "lsl r9, r12, #16\n\t"
  105813. "lsr r8, r8, #16\n\t"
  105814. "lsr r9, r9, #16\n\t"
  105815. "mul r9, r8, r9\n\t"
  105816. "adds r5, r5, r9\n\t"
  105817. "adcs r6, r6, #0\n\t"
  105818. "adc r7, r7, #0\n\t"
  105819. "lsr r9, r12, #16\n\t"
  105820. "mul r8, r9, r8\n\t"
  105821. "lsr r9, r8, #16\n\t"
  105822. "lsl r8, r8, #16\n\t"
  105823. "adds r5, r5, r8\n\t"
  105824. "adcs r6, r6, r9\n\t"
  105825. "adc r7, r7, #0\n\t"
  105826. "lsr r8, r10, #16\n\t"
  105827. "lsr r9, r12, #16\n\t"
  105828. "mul r9, r8, r9\n\t"
  105829. "adds r6, r6, r9\n\t"
  105830. "adc r7, r7, #0\n\t"
  105831. "lsl r9, r12, #16\n\t"
  105832. "lsr r9, r9, #16\n\t"
  105833. "mul r8, r9, r8\n\t"
  105834. "lsr r9, r8, #16\n\t"
  105835. "lsl r8, r8, #16\n\t"
  105836. "adds r5, r5, r8\n\t"
  105837. "adcs r6, r6, r9\n\t"
  105838. "adc r7, r7, #0\n\t"
  105839. #else
  105840. "umull r8, r9, r10, r12\n\t"
  105841. "adds r5, r5, r8\n\t"
  105842. "adcs r6, r6, r9\n\t"
  105843. "adc r7, r7, #0\n\t"
  105844. #endif
  105845. /* A[2] * A[5] */
  105846. "ldr r10, [%[a], #20]\n\t"
  105847. "ldr r12, [%[a], #8]\n\t"
  105848. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105849. "lsl r8, r10, #16\n\t"
  105850. "lsl r9, r12, #16\n\t"
  105851. "lsr r8, r8, #16\n\t"
  105852. "lsr r9, r9, #16\n\t"
  105853. "mul r9, r8, r9\n\t"
  105854. "adds r5, r5, r9\n\t"
  105855. "adcs r6, r6, #0\n\t"
  105856. "adc r7, r7, #0\n\t"
  105857. "lsr r9, r12, #16\n\t"
  105858. "mul r8, r9, r8\n\t"
  105859. "lsr r9, r8, #16\n\t"
  105860. "lsl r8, r8, #16\n\t"
  105861. "adds r5, r5, r8\n\t"
  105862. "adcs r6, r6, r9\n\t"
  105863. "adc r7, r7, #0\n\t"
  105864. "lsr r8, r10, #16\n\t"
  105865. "lsr r9, r12, #16\n\t"
  105866. "mul r9, r8, r9\n\t"
  105867. "adds r6, r6, r9\n\t"
  105868. "adc r7, r7, #0\n\t"
  105869. "lsl r9, r12, #16\n\t"
  105870. "lsr r9, r9, #16\n\t"
  105871. "mul r8, r9, r8\n\t"
  105872. "lsr r9, r8, #16\n\t"
  105873. "lsl r8, r8, #16\n\t"
  105874. "adds r5, r5, r8\n\t"
  105875. "adcs r6, r6, r9\n\t"
  105876. "adc r7, r7, #0\n\t"
  105877. #else
  105878. "umull r8, r9, r10, r12\n\t"
  105879. "adds r5, r5, r8\n\t"
  105880. "adcs r6, r6, r9\n\t"
  105881. "adc r7, r7, #0\n\t"
  105882. #endif
  105883. /* A[3] * A[4] */
  105884. "ldr r10, [%[a], #16]\n\t"
  105885. "ldr r12, [%[a], #12]\n\t"
  105886. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105887. "lsl r8, r10, #16\n\t"
  105888. "lsl r9, r12, #16\n\t"
  105889. "lsr r8, r8, #16\n\t"
  105890. "lsr r9, r9, #16\n\t"
  105891. "mul r9, r8, r9\n\t"
  105892. "adds r5, r5, r9\n\t"
  105893. "adcs r6, r6, #0\n\t"
  105894. "adc r7, r7, #0\n\t"
  105895. "lsr r9, r12, #16\n\t"
  105896. "mul r8, r9, r8\n\t"
  105897. "lsr r9, r8, #16\n\t"
  105898. "lsl r8, r8, #16\n\t"
  105899. "adds r5, r5, r8\n\t"
  105900. "adcs r6, r6, r9\n\t"
  105901. "adc r7, r7, #0\n\t"
  105902. "lsr r8, r10, #16\n\t"
  105903. "lsr r9, r12, #16\n\t"
  105904. "mul r9, r8, r9\n\t"
  105905. "adds r6, r6, r9\n\t"
  105906. "adc r7, r7, #0\n\t"
  105907. "lsl r9, r12, #16\n\t"
  105908. "lsr r9, r9, #16\n\t"
  105909. "mul r8, r9, r8\n\t"
  105910. "lsr r9, r8, #16\n\t"
  105911. "lsl r8, r8, #16\n\t"
  105912. "adds r5, r5, r8\n\t"
  105913. "adcs r6, r6, r9\n\t"
  105914. "adc r7, r7, #0\n\t"
  105915. #else
  105916. "umull r8, r9, r10, r12\n\t"
  105917. "adds r5, r5, r8\n\t"
  105918. "adcs r6, r6, r9\n\t"
  105919. "adc r7, r7, #0\n\t"
  105920. #endif
  105921. "adds r5, r5, r5\n\t"
  105922. "adcs r6, r6, r6\n\t"
  105923. "adc r7, r7, r7\n\t"
  105924. "adds r3, r3, r5\n\t"
  105925. "adcs r4, r4, r6\n\t"
  105926. "adc r2, r2, r7\n\t"
  105927. "str r3, [sp, #28]\n\t"
  105928. /* A[0] * A[8] */
  105929. "ldr r10, [%[a], #32]\n\t"
  105930. "ldr r12, [%[a]]\n\t"
  105931. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105932. "lsl r8, r10, #16\n\t"
  105933. "lsl r5, r12, #16\n\t"
  105934. "lsr r8, r8, #16\n\t"
  105935. "lsr r5, r5, #16\n\t"
  105936. "mul r5, r8, r5\n\t"
  105937. "lsr r9, r12, #16\n\t"
  105938. "mul r8, r9, r8\n\t"
  105939. "lsr r6, r8, #16\n\t"
  105940. "lsl r8, r8, #16\n\t"
  105941. "adds r5, r5, r8\n\t"
  105942. "adc r6, r6, #0\n\t"
  105943. "lsr r8, r10, #16\n\t"
  105944. "mul r9, r8, r9\n\t"
  105945. "add r6, r6, r9\n\t"
  105946. "lsl r9, r12, #16\n\t"
  105947. "lsr r9, r9, #16\n\t"
  105948. "mul r8, r9, r8\n\t"
  105949. "lsr r9, r8, #16\n\t"
  105950. "lsl r8, r8, #16\n\t"
  105951. "adds r5, r5, r8\n\t"
  105952. "adc r6, r6, r9\n\t"
  105953. #else
  105954. "umull r5, r6, r10, r12\n\t"
  105955. #endif
  105956. "mov r3, #0\n\t"
  105957. "mov r7, #0\n\t"
  105958. /* A[1] * A[7] */
  105959. "ldr r10, [%[a], #28]\n\t"
  105960. "ldr r12, [%[a], #4]\n\t"
  105961. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  105962. "lsl r8, r10, #16\n\t"
  105963. "lsl r9, r12, #16\n\t"
  105964. "lsr r8, r8, #16\n\t"
  105965. "lsr r9, r9, #16\n\t"
  105966. "mul r9, r8, r9\n\t"
  105967. "adds r5, r5, r9\n\t"
  105968. "adcs r6, r6, #0\n\t"
  105969. "adc r7, r7, #0\n\t"
  105970. "lsr r9, r12, #16\n\t"
  105971. "mul r8, r9, r8\n\t"
  105972. "lsr r9, r8, #16\n\t"
  105973. "lsl r8, r8, #16\n\t"
  105974. "adds r5, r5, r8\n\t"
  105975. "adcs r6, r6, r9\n\t"
  105976. "adc r7, r7, #0\n\t"
  105977. "lsr r8, r10, #16\n\t"
  105978. "lsr r9, r12, #16\n\t"
  105979. "mul r9, r8, r9\n\t"
  105980. "adds r6, r6, r9\n\t"
  105981. "adc r7, r7, #0\n\t"
  105982. "lsl r9, r12, #16\n\t"
  105983. "lsr r9, r9, #16\n\t"
  105984. "mul r8, r9, r8\n\t"
  105985. "lsr r9, r8, #16\n\t"
  105986. "lsl r8, r8, #16\n\t"
  105987. "adds r5, r5, r8\n\t"
  105988. "adcs r6, r6, r9\n\t"
  105989. "adc r7, r7, #0\n\t"
  105990. #else
  105991. "umull r8, r9, r10, r12\n\t"
  105992. "adds r5, r5, r8\n\t"
  105993. "adcs r6, r6, r9\n\t"
  105994. "adc r7, r7, #0\n\t"
  105995. #endif
  105996. /* A[2] * A[6] */
  105997. "ldr r10, [%[a], #24]\n\t"
  105998. "ldr r12, [%[a], #8]\n\t"
  105999. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106000. "lsl r8, r10, #16\n\t"
  106001. "lsl r9, r12, #16\n\t"
  106002. "lsr r8, r8, #16\n\t"
  106003. "lsr r9, r9, #16\n\t"
  106004. "mul r9, r8, r9\n\t"
  106005. "adds r5, r5, r9\n\t"
  106006. "adcs r6, r6, #0\n\t"
  106007. "adc r7, r7, #0\n\t"
  106008. "lsr r9, r12, #16\n\t"
  106009. "mul r8, r9, r8\n\t"
  106010. "lsr r9, r8, #16\n\t"
  106011. "lsl r8, r8, #16\n\t"
  106012. "adds r5, r5, r8\n\t"
  106013. "adcs r6, r6, r9\n\t"
  106014. "adc r7, r7, #0\n\t"
  106015. "lsr r8, r10, #16\n\t"
  106016. "lsr r9, r12, #16\n\t"
  106017. "mul r9, r8, r9\n\t"
  106018. "adds r6, r6, r9\n\t"
  106019. "adc r7, r7, #0\n\t"
  106020. "lsl r9, r12, #16\n\t"
  106021. "lsr r9, r9, #16\n\t"
  106022. "mul r8, r9, r8\n\t"
  106023. "lsr r9, r8, #16\n\t"
  106024. "lsl r8, r8, #16\n\t"
  106025. "adds r5, r5, r8\n\t"
  106026. "adcs r6, r6, r9\n\t"
  106027. "adc r7, r7, #0\n\t"
  106028. #else
  106029. "umull r8, r9, r10, r12\n\t"
  106030. "adds r5, r5, r8\n\t"
  106031. "adcs r6, r6, r9\n\t"
  106032. "adc r7, r7, #0\n\t"
  106033. #endif
  106034. /* A[3] * A[5] */
  106035. "ldr r10, [%[a], #20]\n\t"
  106036. "ldr r12, [%[a], #12]\n\t"
  106037. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106038. "lsl r8, r10, #16\n\t"
  106039. "lsl r9, r12, #16\n\t"
  106040. "lsr r8, r8, #16\n\t"
  106041. "lsr r9, r9, #16\n\t"
  106042. "mul r9, r8, r9\n\t"
  106043. "adds r5, r5, r9\n\t"
  106044. "adcs r6, r6, #0\n\t"
  106045. "adc r7, r7, #0\n\t"
  106046. "lsr r9, r12, #16\n\t"
  106047. "mul r8, r9, r8\n\t"
  106048. "lsr r9, r8, #16\n\t"
  106049. "lsl r8, r8, #16\n\t"
  106050. "adds r5, r5, r8\n\t"
  106051. "adcs r6, r6, r9\n\t"
  106052. "adc r7, r7, #0\n\t"
  106053. "lsr r8, r10, #16\n\t"
  106054. "lsr r9, r12, #16\n\t"
  106055. "mul r9, r8, r9\n\t"
  106056. "adds r6, r6, r9\n\t"
  106057. "adc r7, r7, #0\n\t"
  106058. "lsl r9, r12, #16\n\t"
  106059. "lsr r9, r9, #16\n\t"
  106060. "mul r8, r9, r8\n\t"
  106061. "lsr r9, r8, #16\n\t"
  106062. "lsl r8, r8, #16\n\t"
  106063. "adds r5, r5, r8\n\t"
  106064. "adcs r6, r6, r9\n\t"
  106065. "adc r7, r7, #0\n\t"
  106066. #else
  106067. "umull r8, r9, r10, r12\n\t"
  106068. "adds r5, r5, r8\n\t"
  106069. "adcs r6, r6, r9\n\t"
  106070. "adc r7, r7, #0\n\t"
  106071. #endif
  106072. /* A[4] * A[4] */
  106073. "ldr r10, [%[a], #16]\n\t"
  106074. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106075. "lsl r8, r10, #16\n\t"
  106076. "lsr r9, r10, #16\n\t"
  106077. "lsr r8, r8, #16\n\t"
  106078. "mov r12, r8\n\t"
  106079. "mul r8, r12, r8\n\t"
  106080. "mov r12, r9\n\t"
  106081. "mul r9, r12, r9\n\t"
  106082. "adds r4, r4, r8\n\t"
  106083. "adcs r2, r2, r9\n\t"
  106084. "adc r3, r3, #0\n\t"
  106085. "lsr r9, r10, #16\n\t"
  106086. "lsl r8, r10, #16\n\t"
  106087. "lsr r8, r8, #16\n\t"
  106088. "mul r8, r9, r8\n\t"
  106089. "lsr r9, r8, #15\n\t"
  106090. "lsl r8, r8, #17\n\t"
  106091. "adds r4, r4, r8\n\t"
  106092. "adcs r2, r2, r9\n\t"
  106093. "adc r3, r3, #0\n\t"
  106094. "adds r5, r5, r5\n\t"
  106095. "adcs r6, r6, r6\n\t"
  106096. "adc r7, r7, r7\n\t"
  106097. #else
  106098. "umull r8, r9, r10, r10\n\t"
  106099. "adds r5, r5, r5\n\t"
  106100. "adcs r6, r6, r6\n\t"
  106101. "adc r7, r7, r7\n\t"
  106102. "adds r4, r4, r8\n\t"
  106103. "adcs r2, r2, r9\n\t"
  106104. "adc r3, r3, #0\n\t"
  106105. #endif
  106106. "adds r4, r4, r5\n\t"
  106107. "adcs r2, r2, r6\n\t"
  106108. "adc r3, r3, r7\n\t"
  106109. "str r4, [sp, #32]\n\t"
  106110. /* A[0] * A[9] */
  106111. "ldr r10, [%[a], #36]\n\t"
  106112. "ldr r12, [%[a]]\n\t"
  106113. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106114. "lsl r8, r10, #16\n\t"
  106115. "lsl r5, r12, #16\n\t"
  106116. "lsr r8, r8, #16\n\t"
  106117. "lsr r5, r5, #16\n\t"
  106118. "mul r5, r8, r5\n\t"
  106119. "lsr r9, r12, #16\n\t"
  106120. "mul r8, r9, r8\n\t"
  106121. "lsr r6, r8, #16\n\t"
  106122. "lsl r8, r8, #16\n\t"
  106123. "adds r5, r5, r8\n\t"
  106124. "adc r6, r6, #0\n\t"
  106125. "lsr r8, r10, #16\n\t"
  106126. "mul r9, r8, r9\n\t"
  106127. "add r6, r6, r9\n\t"
  106128. "lsl r9, r12, #16\n\t"
  106129. "lsr r9, r9, #16\n\t"
  106130. "mul r8, r9, r8\n\t"
  106131. "lsr r9, r8, #16\n\t"
  106132. "lsl r8, r8, #16\n\t"
  106133. "adds r5, r5, r8\n\t"
  106134. "adc r6, r6, r9\n\t"
  106135. #else
  106136. "umull r5, r6, r10, r12\n\t"
  106137. #endif
  106138. "mov r4, #0\n\t"
  106139. "mov r7, #0\n\t"
  106140. /* A[1] * A[8] */
  106141. "ldr r10, [%[a], #32]\n\t"
  106142. "ldr r12, [%[a], #4]\n\t"
  106143. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106144. "lsl r8, r10, #16\n\t"
  106145. "lsl r9, r12, #16\n\t"
  106146. "lsr r8, r8, #16\n\t"
  106147. "lsr r9, r9, #16\n\t"
  106148. "mul r9, r8, r9\n\t"
  106149. "adds r5, r5, r9\n\t"
  106150. "adcs r6, r6, #0\n\t"
  106151. "adc r7, r7, #0\n\t"
  106152. "lsr r9, r12, #16\n\t"
  106153. "mul r8, r9, r8\n\t"
  106154. "lsr r9, r8, #16\n\t"
  106155. "lsl r8, r8, #16\n\t"
  106156. "adds r5, r5, r8\n\t"
  106157. "adcs r6, r6, r9\n\t"
  106158. "adc r7, r7, #0\n\t"
  106159. "lsr r8, r10, #16\n\t"
  106160. "lsr r9, r12, #16\n\t"
  106161. "mul r9, r8, r9\n\t"
  106162. "adds r6, r6, r9\n\t"
  106163. "adc r7, r7, #0\n\t"
  106164. "lsl r9, r12, #16\n\t"
  106165. "lsr r9, r9, #16\n\t"
  106166. "mul r8, r9, r8\n\t"
  106167. "lsr r9, r8, #16\n\t"
  106168. "lsl r8, r8, #16\n\t"
  106169. "adds r5, r5, r8\n\t"
  106170. "adcs r6, r6, r9\n\t"
  106171. "adc r7, r7, #0\n\t"
  106172. #else
  106173. "umull r8, r9, r10, r12\n\t"
  106174. "adds r5, r5, r8\n\t"
  106175. "adcs r6, r6, r9\n\t"
  106176. "adc r7, r7, #0\n\t"
  106177. #endif
  106178. /* A[2] * A[7] */
  106179. "ldr r10, [%[a], #28]\n\t"
  106180. "ldr r12, [%[a], #8]\n\t"
  106181. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106182. "lsl r8, r10, #16\n\t"
  106183. "lsl r9, r12, #16\n\t"
  106184. "lsr r8, r8, #16\n\t"
  106185. "lsr r9, r9, #16\n\t"
  106186. "mul r9, r8, r9\n\t"
  106187. "adds r5, r5, r9\n\t"
  106188. "adcs r6, r6, #0\n\t"
  106189. "adc r7, r7, #0\n\t"
  106190. "lsr r9, r12, #16\n\t"
  106191. "mul r8, r9, r8\n\t"
  106192. "lsr r9, r8, #16\n\t"
  106193. "lsl r8, r8, #16\n\t"
  106194. "adds r5, r5, r8\n\t"
  106195. "adcs r6, r6, r9\n\t"
  106196. "adc r7, r7, #0\n\t"
  106197. "lsr r8, r10, #16\n\t"
  106198. "lsr r9, r12, #16\n\t"
  106199. "mul r9, r8, r9\n\t"
  106200. "adds r6, r6, r9\n\t"
  106201. "adc r7, r7, #0\n\t"
  106202. "lsl r9, r12, #16\n\t"
  106203. "lsr r9, r9, #16\n\t"
  106204. "mul r8, r9, r8\n\t"
  106205. "lsr r9, r8, #16\n\t"
  106206. "lsl r8, r8, #16\n\t"
  106207. "adds r5, r5, r8\n\t"
  106208. "adcs r6, r6, r9\n\t"
  106209. "adc r7, r7, #0\n\t"
  106210. #else
  106211. "umull r8, r9, r10, r12\n\t"
  106212. "adds r5, r5, r8\n\t"
  106213. "adcs r6, r6, r9\n\t"
  106214. "adc r7, r7, #0\n\t"
  106215. #endif
  106216. /* A[3] * A[6] */
  106217. "ldr r10, [%[a], #24]\n\t"
  106218. "ldr r12, [%[a], #12]\n\t"
  106219. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106220. "lsl r8, r10, #16\n\t"
  106221. "lsl r9, r12, #16\n\t"
  106222. "lsr r8, r8, #16\n\t"
  106223. "lsr r9, r9, #16\n\t"
  106224. "mul r9, r8, r9\n\t"
  106225. "adds r5, r5, r9\n\t"
  106226. "adcs r6, r6, #0\n\t"
  106227. "adc r7, r7, #0\n\t"
  106228. "lsr r9, r12, #16\n\t"
  106229. "mul r8, r9, r8\n\t"
  106230. "lsr r9, r8, #16\n\t"
  106231. "lsl r8, r8, #16\n\t"
  106232. "adds r5, r5, r8\n\t"
  106233. "adcs r6, r6, r9\n\t"
  106234. "adc r7, r7, #0\n\t"
  106235. "lsr r8, r10, #16\n\t"
  106236. "lsr r9, r12, #16\n\t"
  106237. "mul r9, r8, r9\n\t"
  106238. "adds r6, r6, r9\n\t"
  106239. "adc r7, r7, #0\n\t"
  106240. "lsl r9, r12, #16\n\t"
  106241. "lsr r9, r9, #16\n\t"
  106242. "mul r8, r9, r8\n\t"
  106243. "lsr r9, r8, #16\n\t"
  106244. "lsl r8, r8, #16\n\t"
  106245. "adds r5, r5, r8\n\t"
  106246. "adcs r6, r6, r9\n\t"
  106247. "adc r7, r7, #0\n\t"
  106248. #else
  106249. "umull r8, r9, r10, r12\n\t"
  106250. "adds r5, r5, r8\n\t"
  106251. "adcs r6, r6, r9\n\t"
  106252. "adc r7, r7, #0\n\t"
  106253. #endif
  106254. /* A[4] * A[5] */
  106255. "ldr r10, [%[a], #20]\n\t"
  106256. "ldr r12, [%[a], #16]\n\t"
  106257. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106258. "lsl r8, r10, #16\n\t"
  106259. "lsl r9, r12, #16\n\t"
  106260. "lsr r8, r8, #16\n\t"
  106261. "lsr r9, r9, #16\n\t"
  106262. "mul r9, r8, r9\n\t"
  106263. "adds r5, r5, r9\n\t"
  106264. "adcs r6, r6, #0\n\t"
  106265. "adc r7, r7, #0\n\t"
  106266. "lsr r9, r12, #16\n\t"
  106267. "mul r8, r9, r8\n\t"
  106268. "lsr r9, r8, #16\n\t"
  106269. "lsl r8, r8, #16\n\t"
  106270. "adds r5, r5, r8\n\t"
  106271. "adcs r6, r6, r9\n\t"
  106272. "adc r7, r7, #0\n\t"
  106273. "lsr r8, r10, #16\n\t"
  106274. "lsr r9, r12, #16\n\t"
  106275. "mul r9, r8, r9\n\t"
  106276. "adds r6, r6, r9\n\t"
  106277. "adc r7, r7, #0\n\t"
  106278. "lsl r9, r12, #16\n\t"
  106279. "lsr r9, r9, #16\n\t"
  106280. "mul r8, r9, r8\n\t"
  106281. "lsr r9, r8, #16\n\t"
  106282. "lsl r8, r8, #16\n\t"
  106283. "adds r5, r5, r8\n\t"
  106284. "adcs r6, r6, r9\n\t"
  106285. "adc r7, r7, #0\n\t"
  106286. #else
  106287. "umull r8, r9, r10, r12\n\t"
  106288. "adds r5, r5, r8\n\t"
  106289. "adcs r6, r6, r9\n\t"
  106290. "adc r7, r7, #0\n\t"
  106291. #endif
  106292. "adds r5, r5, r5\n\t"
  106293. "adcs r6, r6, r6\n\t"
  106294. "adc r7, r7, r7\n\t"
  106295. "adds r2, r2, r5\n\t"
  106296. "adcs r3, r3, r6\n\t"
  106297. "adc r4, r4, r7\n\t"
  106298. "str r2, [sp, #36]\n\t"
  106299. /* A[0] * A[10] */
  106300. "ldr r10, [%[a], #40]\n\t"
  106301. "ldr r12, [%[a]]\n\t"
  106302. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106303. "lsl r8, r10, #16\n\t"
  106304. "lsl r5, r12, #16\n\t"
  106305. "lsr r8, r8, #16\n\t"
  106306. "lsr r5, r5, #16\n\t"
  106307. "mul r5, r8, r5\n\t"
  106308. "lsr r9, r12, #16\n\t"
  106309. "mul r8, r9, r8\n\t"
  106310. "lsr r6, r8, #16\n\t"
  106311. "lsl r8, r8, #16\n\t"
  106312. "adds r5, r5, r8\n\t"
  106313. "adc r6, r6, #0\n\t"
  106314. "lsr r8, r10, #16\n\t"
  106315. "mul r9, r8, r9\n\t"
  106316. "add r6, r6, r9\n\t"
  106317. "lsl r9, r12, #16\n\t"
  106318. "lsr r9, r9, #16\n\t"
  106319. "mul r8, r9, r8\n\t"
  106320. "lsr r9, r8, #16\n\t"
  106321. "lsl r8, r8, #16\n\t"
  106322. "adds r5, r5, r8\n\t"
  106323. "adc r6, r6, r9\n\t"
  106324. #else
  106325. "umull r5, r6, r10, r12\n\t"
  106326. #endif
  106327. "mov r2, #0\n\t"
  106328. "mov r7, #0\n\t"
  106329. /* A[1] * A[9] */
  106330. "ldr r10, [%[a], #36]\n\t"
  106331. "ldr r12, [%[a], #4]\n\t"
  106332. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106333. "lsl r8, r10, #16\n\t"
  106334. "lsl r9, r12, #16\n\t"
  106335. "lsr r8, r8, #16\n\t"
  106336. "lsr r9, r9, #16\n\t"
  106337. "mul r9, r8, r9\n\t"
  106338. "adds r5, r5, r9\n\t"
  106339. "adcs r6, r6, #0\n\t"
  106340. "adc r7, r7, #0\n\t"
  106341. "lsr r9, r12, #16\n\t"
  106342. "mul r8, r9, r8\n\t"
  106343. "lsr r9, r8, #16\n\t"
  106344. "lsl r8, r8, #16\n\t"
  106345. "adds r5, r5, r8\n\t"
  106346. "adcs r6, r6, r9\n\t"
  106347. "adc r7, r7, #0\n\t"
  106348. "lsr r8, r10, #16\n\t"
  106349. "lsr r9, r12, #16\n\t"
  106350. "mul r9, r8, r9\n\t"
  106351. "adds r6, r6, r9\n\t"
  106352. "adc r7, r7, #0\n\t"
  106353. "lsl r9, r12, #16\n\t"
  106354. "lsr r9, r9, #16\n\t"
  106355. "mul r8, r9, r8\n\t"
  106356. "lsr r9, r8, #16\n\t"
  106357. "lsl r8, r8, #16\n\t"
  106358. "adds r5, r5, r8\n\t"
  106359. "adcs r6, r6, r9\n\t"
  106360. "adc r7, r7, #0\n\t"
  106361. #else
  106362. "umull r8, r9, r10, r12\n\t"
  106363. "adds r5, r5, r8\n\t"
  106364. "adcs r6, r6, r9\n\t"
  106365. "adc r7, r7, #0\n\t"
  106366. #endif
  106367. /* A[2] * A[8] */
  106368. "ldr r10, [%[a], #32]\n\t"
  106369. "ldr r12, [%[a], #8]\n\t"
  106370. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106371. "lsl r8, r10, #16\n\t"
  106372. "lsl r9, r12, #16\n\t"
  106373. "lsr r8, r8, #16\n\t"
  106374. "lsr r9, r9, #16\n\t"
  106375. "mul r9, r8, r9\n\t"
  106376. "adds r5, r5, r9\n\t"
  106377. "adcs r6, r6, #0\n\t"
  106378. "adc r7, r7, #0\n\t"
  106379. "lsr r9, r12, #16\n\t"
  106380. "mul r8, r9, r8\n\t"
  106381. "lsr r9, r8, #16\n\t"
  106382. "lsl r8, r8, #16\n\t"
  106383. "adds r5, r5, r8\n\t"
  106384. "adcs r6, r6, r9\n\t"
  106385. "adc r7, r7, #0\n\t"
  106386. "lsr r8, r10, #16\n\t"
  106387. "lsr r9, r12, #16\n\t"
  106388. "mul r9, r8, r9\n\t"
  106389. "adds r6, r6, r9\n\t"
  106390. "adc r7, r7, #0\n\t"
  106391. "lsl r9, r12, #16\n\t"
  106392. "lsr r9, r9, #16\n\t"
  106393. "mul r8, r9, r8\n\t"
  106394. "lsr r9, r8, #16\n\t"
  106395. "lsl r8, r8, #16\n\t"
  106396. "adds r5, r5, r8\n\t"
  106397. "adcs r6, r6, r9\n\t"
  106398. "adc r7, r7, #0\n\t"
  106399. #else
  106400. "umull r8, r9, r10, r12\n\t"
  106401. "adds r5, r5, r8\n\t"
  106402. "adcs r6, r6, r9\n\t"
  106403. "adc r7, r7, #0\n\t"
  106404. #endif
  106405. /* A[3] * A[7] */
  106406. "ldr r10, [%[a], #28]\n\t"
  106407. "ldr r12, [%[a], #12]\n\t"
  106408. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106409. "lsl r8, r10, #16\n\t"
  106410. "lsl r9, r12, #16\n\t"
  106411. "lsr r8, r8, #16\n\t"
  106412. "lsr r9, r9, #16\n\t"
  106413. "mul r9, r8, r9\n\t"
  106414. "adds r5, r5, r9\n\t"
  106415. "adcs r6, r6, #0\n\t"
  106416. "adc r7, r7, #0\n\t"
  106417. "lsr r9, r12, #16\n\t"
  106418. "mul r8, r9, r8\n\t"
  106419. "lsr r9, r8, #16\n\t"
  106420. "lsl r8, r8, #16\n\t"
  106421. "adds r5, r5, r8\n\t"
  106422. "adcs r6, r6, r9\n\t"
  106423. "adc r7, r7, #0\n\t"
  106424. "lsr r8, r10, #16\n\t"
  106425. "lsr r9, r12, #16\n\t"
  106426. "mul r9, r8, r9\n\t"
  106427. "adds r6, r6, r9\n\t"
  106428. "adc r7, r7, #0\n\t"
  106429. "lsl r9, r12, #16\n\t"
  106430. "lsr r9, r9, #16\n\t"
  106431. "mul r8, r9, r8\n\t"
  106432. "lsr r9, r8, #16\n\t"
  106433. "lsl r8, r8, #16\n\t"
  106434. "adds r5, r5, r8\n\t"
  106435. "adcs r6, r6, r9\n\t"
  106436. "adc r7, r7, #0\n\t"
  106437. #else
  106438. "umull r8, r9, r10, r12\n\t"
  106439. "adds r5, r5, r8\n\t"
  106440. "adcs r6, r6, r9\n\t"
  106441. "adc r7, r7, #0\n\t"
  106442. #endif
  106443. /* A[4] * A[6] */
  106444. "ldr r10, [%[a], #24]\n\t"
  106445. "ldr r12, [%[a], #16]\n\t"
  106446. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106447. "lsl r8, r10, #16\n\t"
  106448. "lsl r9, r12, #16\n\t"
  106449. "lsr r8, r8, #16\n\t"
  106450. "lsr r9, r9, #16\n\t"
  106451. "mul r9, r8, r9\n\t"
  106452. "adds r5, r5, r9\n\t"
  106453. "adcs r6, r6, #0\n\t"
  106454. "adc r7, r7, #0\n\t"
  106455. "lsr r9, r12, #16\n\t"
  106456. "mul r8, r9, r8\n\t"
  106457. "lsr r9, r8, #16\n\t"
  106458. "lsl r8, r8, #16\n\t"
  106459. "adds r5, r5, r8\n\t"
  106460. "adcs r6, r6, r9\n\t"
  106461. "adc r7, r7, #0\n\t"
  106462. "lsr r8, r10, #16\n\t"
  106463. "lsr r9, r12, #16\n\t"
  106464. "mul r9, r8, r9\n\t"
  106465. "adds r6, r6, r9\n\t"
  106466. "adc r7, r7, #0\n\t"
  106467. "lsl r9, r12, #16\n\t"
  106468. "lsr r9, r9, #16\n\t"
  106469. "mul r8, r9, r8\n\t"
  106470. "lsr r9, r8, #16\n\t"
  106471. "lsl r8, r8, #16\n\t"
  106472. "adds r5, r5, r8\n\t"
  106473. "adcs r6, r6, r9\n\t"
  106474. "adc r7, r7, #0\n\t"
  106475. #else
  106476. "umull r8, r9, r10, r12\n\t"
  106477. "adds r5, r5, r8\n\t"
  106478. "adcs r6, r6, r9\n\t"
  106479. "adc r7, r7, #0\n\t"
  106480. #endif
  106481. /* A[5] * A[5] */
  106482. "ldr r10, [%[a], #20]\n\t"
  106483. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106484. "lsl r8, r10, #16\n\t"
  106485. "lsr r9, r10, #16\n\t"
  106486. "lsr r8, r8, #16\n\t"
  106487. "mov r12, r8\n\t"
  106488. "mul r8, r12, r8\n\t"
  106489. "mov r12, r9\n\t"
  106490. "mul r9, r12, r9\n\t"
  106491. "adds r3, r3, r8\n\t"
  106492. "adcs r4, r4, r9\n\t"
  106493. "adc r2, r2, #0\n\t"
  106494. "lsr r9, r10, #16\n\t"
  106495. "lsl r8, r10, #16\n\t"
  106496. "lsr r8, r8, #16\n\t"
  106497. "mul r8, r9, r8\n\t"
  106498. "lsr r9, r8, #15\n\t"
  106499. "lsl r8, r8, #17\n\t"
  106500. "adds r3, r3, r8\n\t"
  106501. "adcs r4, r4, r9\n\t"
  106502. "adc r2, r2, #0\n\t"
  106503. "adds r5, r5, r5\n\t"
  106504. "adcs r6, r6, r6\n\t"
  106505. "adc r7, r7, r7\n\t"
  106506. #else
  106507. "umull r8, r9, r10, r10\n\t"
  106508. "adds r5, r5, r5\n\t"
  106509. "adcs r6, r6, r6\n\t"
  106510. "adc r7, r7, r7\n\t"
  106511. "adds r3, r3, r8\n\t"
  106512. "adcs r4, r4, r9\n\t"
  106513. "adc r2, r2, #0\n\t"
  106514. #endif
  106515. "adds r3, r3, r5\n\t"
  106516. "adcs r4, r4, r6\n\t"
  106517. "adc r2, r2, r7\n\t"
  106518. "str r3, [sp, #40]\n\t"
  106519. /* A[0] * A[11] */
  106520. "ldr r10, [%[a], #44]\n\t"
  106521. "ldr r12, [%[a]]\n\t"
  106522. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106523. "lsl r8, r10, #16\n\t"
  106524. "lsl r5, r12, #16\n\t"
  106525. "lsr r8, r8, #16\n\t"
  106526. "lsr r5, r5, #16\n\t"
  106527. "mul r5, r8, r5\n\t"
  106528. "lsr r9, r12, #16\n\t"
  106529. "mul r8, r9, r8\n\t"
  106530. "lsr r6, r8, #16\n\t"
  106531. "lsl r8, r8, #16\n\t"
  106532. "adds r5, r5, r8\n\t"
  106533. "adc r6, r6, #0\n\t"
  106534. "lsr r8, r10, #16\n\t"
  106535. "mul r9, r8, r9\n\t"
  106536. "add r6, r6, r9\n\t"
  106537. "lsl r9, r12, #16\n\t"
  106538. "lsr r9, r9, #16\n\t"
  106539. "mul r8, r9, r8\n\t"
  106540. "lsr r9, r8, #16\n\t"
  106541. "lsl r8, r8, #16\n\t"
  106542. "adds r5, r5, r8\n\t"
  106543. "adc r6, r6, r9\n\t"
  106544. #else
  106545. "umull r5, r6, r10, r12\n\t"
  106546. #endif
  106547. "mov r3, #0\n\t"
  106548. "mov r7, #0\n\t"
  106549. /* A[1] * A[10] */
  106550. "ldr r10, [%[a], #40]\n\t"
  106551. "ldr r12, [%[a], #4]\n\t"
  106552. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106553. "lsl r8, r10, #16\n\t"
  106554. "lsl r9, r12, #16\n\t"
  106555. "lsr r8, r8, #16\n\t"
  106556. "lsr r9, r9, #16\n\t"
  106557. "mul r9, r8, r9\n\t"
  106558. "adds r5, r5, r9\n\t"
  106559. "adcs r6, r6, #0\n\t"
  106560. "adc r7, r7, #0\n\t"
  106561. "lsr r9, r12, #16\n\t"
  106562. "mul r8, r9, r8\n\t"
  106563. "lsr r9, r8, #16\n\t"
  106564. "lsl r8, r8, #16\n\t"
  106565. "adds r5, r5, r8\n\t"
  106566. "adcs r6, r6, r9\n\t"
  106567. "adc r7, r7, #0\n\t"
  106568. "lsr r8, r10, #16\n\t"
  106569. "lsr r9, r12, #16\n\t"
  106570. "mul r9, r8, r9\n\t"
  106571. "adds r6, r6, r9\n\t"
  106572. "adc r7, r7, #0\n\t"
  106573. "lsl r9, r12, #16\n\t"
  106574. "lsr r9, r9, #16\n\t"
  106575. "mul r8, r9, r8\n\t"
  106576. "lsr r9, r8, #16\n\t"
  106577. "lsl r8, r8, #16\n\t"
  106578. "adds r5, r5, r8\n\t"
  106579. "adcs r6, r6, r9\n\t"
  106580. "adc r7, r7, #0\n\t"
  106581. #else
  106582. "umull r8, r9, r10, r12\n\t"
  106583. "adds r5, r5, r8\n\t"
  106584. "adcs r6, r6, r9\n\t"
  106585. "adc r7, r7, #0\n\t"
  106586. #endif
  106587. /* A[2] * A[9] */
  106588. "ldr r10, [%[a], #36]\n\t"
  106589. "ldr r12, [%[a], #8]\n\t"
  106590. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106591. "lsl r8, r10, #16\n\t"
  106592. "lsl r9, r12, #16\n\t"
  106593. "lsr r8, r8, #16\n\t"
  106594. "lsr r9, r9, #16\n\t"
  106595. "mul r9, r8, r9\n\t"
  106596. "adds r5, r5, r9\n\t"
  106597. "adcs r6, r6, #0\n\t"
  106598. "adc r7, r7, #0\n\t"
  106599. "lsr r9, r12, #16\n\t"
  106600. "mul r8, r9, r8\n\t"
  106601. "lsr r9, r8, #16\n\t"
  106602. "lsl r8, r8, #16\n\t"
  106603. "adds r5, r5, r8\n\t"
  106604. "adcs r6, r6, r9\n\t"
  106605. "adc r7, r7, #0\n\t"
  106606. "lsr r8, r10, #16\n\t"
  106607. "lsr r9, r12, #16\n\t"
  106608. "mul r9, r8, r9\n\t"
  106609. "adds r6, r6, r9\n\t"
  106610. "adc r7, r7, #0\n\t"
  106611. "lsl r9, r12, #16\n\t"
  106612. "lsr r9, r9, #16\n\t"
  106613. "mul r8, r9, r8\n\t"
  106614. "lsr r9, r8, #16\n\t"
  106615. "lsl r8, r8, #16\n\t"
  106616. "adds r5, r5, r8\n\t"
  106617. "adcs r6, r6, r9\n\t"
  106618. "adc r7, r7, #0\n\t"
  106619. #else
  106620. "umull r8, r9, r10, r12\n\t"
  106621. "adds r5, r5, r8\n\t"
  106622. "adcs r6, r6, r9\n\t"
  106623. "adc r7, r7, #0\n\t"
  106624. #endif
  106625. /* A[3] * A[8] */
  106626. "ldr r10, [%[a], #32]\n\t"
  106627. "ldr r12, [%[a], #12]\n\t"
  106628. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106629. "lsl r8, r10, #16\n\t"
  106630. "lsl r9, r12, #16\n\t"
  106631. "lsr r8, r8, #16\n\t"
  106632. "lsr r9, r9, #16\n\t"
  106633. "mul r9, r8, r9\n\t"
  106634. "adds r5, r5, r9\n\t"
  106635. "adcs r6, r6, #0\n\t"
  106636. "adc r7, r7, #0\n\t"
  106637. "lsr r9, r12, #16\n\t"
  106638. "mul r8, r9, r8\n\t"
  106639. "lsr r9, r8, #16\n\t"
  106640. "lsl r8, r8, #16\n\t"
  106641. "adds r5, r5, r8\n\t"
  106642. "adcs r6, r6, r9\n\t"
  106643. "adc r7, r7, #0\n\t"
  106644. "lsr r8, r10, #16\n\t"
  106645. "lsr r9, r12, #16\n\t"
  106646. "mul r9, r8, r9\n\t"
  106647. "adds r6, r6, r9\n\t"
  106648. "adc r7, r7, #0\n\t"
  106649. "lsl r9, r12, #16\n\t"
  106650. "lsr r9, r9, #16\n\t"
  106651. "mul r8, r9, r8\n\t"
  106652. "lsr r9, r8, #16\n\t"
  106653. "lsl r8, r8, #16\n\t"
  106654. "adds r5, r5, r8\n\t"
  106655. "adcs r6, r6, r9\n\t"
  106656. "adc r7, r7, #0\n\t"
  106657. #else
  106658. "umull r8, r9, r10, r12\n\t"
  106659. "adds r5, r5, r8\n\t"
  106660. "adcs r6, r6, r9\n\t"
  106661. "adc r7, r7, #0\n\t"
  106662. #endif
  106663. /* A[4] * A[7] */
  106664. "ldr r10, [%[a], #28]\n\t"
  106665. "ldr r12, [%[a], #16]\n\t"
  106666. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106667. "lsl r8, r10, #16\n\t"
  106668. "lsl r9, r12, #16\n\t"
  106669. "lsr r8, r8, #16\n\t"
  106670. "lsr r9, r9, #16\n\t"
  106671. "mul r9, r8, r9\n\t"
  106672. "adds r5, r5, r9\n\t"
  106673. "adcs r6, r6, #0\n\t"
  106674. "adc r7, r7, #0\n\t"
  106675. "lsr r9, r12, #16\n\t"
  106676. "mul r8, r9, r8\n\t"
  106677. "lsr r9, r8, #16\n\t"
  106678. "lsl r8, r8, #16\n\t"
  106679. "adds r5, r5, r8\n\t"
  106680. "adcs r6, r6, r9\n\t"
  106681. "adc r7, r7, #0\n\t"
  106682. "lsr r8, r10, #16\n\t"
  106683. "lsr r9, r12, #16\n\t"
  106684. "mul r9, r8, r9\n\t"
  106685. "adds r6, r6, r9\n\t"
  106686. "adc r7, r7, #0\n\t"
  106687. "lsl r9, r12, #16\n\t"
  106688. "lsr r9, r9, #16\n\t"
  106689. "mul r8, r9, r8\n\t"
  106690. "lsr r9, r8, #16\n\t"
  106691. "lsl r8, r8, #16\n\t"
  106692. "adds r5, r5, r8\n\t"
  106693. "adcs r6, r6, r9\n\t"
  106694. "adc r7, r7, #0\n\t"
  106695. #else
  106696. "umull r8, r9, r10, r12\n\t"
  106697. "adds r5, r5, r8\n\t"
  106698. "adcs r6, r6, r9\n\t"
  106699. "adc r7, r7, #0\n\t"
  106700. #endif
  106701. /* A[5] * A[6] */
  106702. "ldr r10, [%[a], #24]\n\t"
  106703. "ldr r12, [%[a], #20]\n\t"
  106704. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106705. "lsl r8, r10, #16\n\t"
  106706. "lsl r9, r12, #16\n\t"
  106707. "lsr r8, r8, #16\n\t"
  106708. "lsr r9, r9, #16\n\t"
  106709. "mul r9, r8, r9\n\t"
  106710. "adds r5, r5, r9\n\t"
  106711. "adcs r6, r6, #0\n\t"
  106712. "adc r7, r7, #0\n\t"
  106713. "lsr r9, r12, #16\n\t"
  106714. "mul r8, r9, r8\n\t"
  106715. "lsr r9, r8, #16\n\t"
  106716. "lsl r8, r8, #16\n\t"
  106717. "adds r5, r5, r8\n\t"
  106718. "adcs r6, r6, r9\n\t"
  106719. "adc r7, r7, #0\n\t"
  106720. "lsr r8, r10, #16\n\t"
  106721. "lsr r9, r12, #16\n\t"
  106722. "mul r9, r8, r9\n\t"
  106723. "adds r6, r6, r9\n\t"
  106724. "adc r7, r7, #0\n\t"
  106725. "lsl r9, r12, #16\n\t"
  106726. "lsr r9, r9, #16\n\t"
  106727. "mul r8, r9, r8\n\t"
  106728. "lsr r9, r8, #16\n\t"
  106729. "lsl r8, r8, #16\n\t"
  106730. "adds r5, r5, r8\n\t"
  106731. "adcs r6, r6, r9\n\t"
  106732. "adc r7, r7, #0\n\t"
  106733. #else
  106734. "umull r8, r9, r10, r12\n\t"
  106735. "adds r5, r5, r8\n\t"
  106736. "adcs r6, r6, r9\n\t"
  106737. "adc r7, r7, #0\n\t"
  106738. #endif
  106739. "adds r5, r5, r5\n\t"
  106740. "adcs r6, r6, r6\n\t"
  106741. "adc r7, r7, r7\n\t"
  106742. "adds r4, r4, r5\n\t"
  106743. "adcs r2, r2, r6\n\t"
  106744. "adc r3, r3, r7\n\t"
  106745. "str r4, [sp, #44]\n\t"
  106746. /* A[0] * A[12] */
  106747. "ldr r10, [%[a], #48]\n\t"
  106748. "ldr r12, [%[a]]\n\t"
  106749. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106750. "lsl r8, r10, #16\n\t"
  106751. "lsl r5, r12, #16\n\t"
  106752. "lsr r8, r8, #16\n\t"
  106753. "lsr r5, r5, #16\n\t"
  106754. "mul r5, r8, r5\n\t"
  106755. "lsr r9, r12, #16\n\t"
  106756. "mul r8, r9, r8\n\t"
  106757. "lsr r6, r8, #16\n\t"
  106758. "lsl r8, r8, #16\n\t"
  106759. "adds r5, r5, r8\n\t"
  106760. "adc r6, r6, #0\n\t"
  106761. "lsr r8, r10, #16\n\t"
  106762. "mul r9, r8, r9\n\t"
  106763. "add r6, r6, r9\n\t"
  106764. "lsl r9, r12, #16\n\t"
  106765. "lsr r9, r9, #16\n\t"
  106766. "mul r8, r9, r8\n\t"
  106767. "lsr r9, r8, #16\n\t"
  106768. "lsl r8, r8, #16\n\t"
  106769. "adds r5, r5, r8\n\t"
  106770. "adc r6, r6, r9\n\t"
  106771. #else
  106772. "umull r5, r6, r10, r12\n\t"
  106773. #endif
  106774. "mov r4, #0\n\t"
  106775. "mov r7, #0\n\t"
  106776. /* A[1] * A[11] */
  106777. "ldr r10, [%[a], #44]\n\t"
  106778. "ldr r12, [%[a], #4]\n\t"
  106779. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106780. "lsl r8, r10, #16\n\t"
  106781. "lsl r9, r12, #16\n\t"
  106782. "lsr r8, r8, #16\n\t"
  106783. "lsr r9, r9, #16\n\t"
  106784. "mul r9, r8, r9\n\t"
  106785. "adds r5, r5, r9\n\t"
  106786. "adcs r6, r6, #0\n\t"
  106787. "adc r7, r7, #0\n\t"
  106788. "lsr r9, r12, #16\n\t"
  106789. "mul r8, r9, r8\n\t"
  106790. "lsr r9, r8, #16\n\t"
  106791. "lsl r8, r8, #16\n\t"
  106792. "adds r5, r5, r8\n\t"
  106793. "adcs r6, r6, r9\n\t"
  106794. "adc r7, r7, #0\n\t"
  106795. "lsr r8, r10, #16\n\t"
  106796. "lsr r9, r12, #16\n\t"
  106797. "mul r9, r8, r9\n\t"
  106798. "adds r6, r6, r9\n\t"
  106799. "adc r7, r7, #0\n\t"
  106800. "lsl r9, r12, #16\n\t"
  106801. "lsr r9, r9, #16\n\t"
  106802. "mul r8, r9, r8\n\t"
  106803. "lsr r9, r8, #16\n\t"
  106804. "lsl r8, r8, #16\n\t"
  106805. "adds r5, r5, r8\n\t"
  106806. "adcs r6, r6, r9\n\t"
  106807. "adc r7, r7, #0\n\t"
  106808. #else
  106809. "umull r8, r9, r10, r12\n\t"
  106810. "adds r5, r5, r8\n\t"
  106811. "adcs r6, r6, r9\n\t"
  106812. "adc r7, r7, #0\n\t"
  106813. #endif
  106814. /* A[2] * A[10] */
  106815. "ldr r10, [%[a], #40]\n\t"
  106816. "ldr r12, [%[a], #8]\n\t"
  106817. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106818. "lsl r8, r10, #16\n\t"
  106819. "lsl r9, r12, #16\n\t"
  106820. "lsr r8, r8, #16\n\t"
  106821. "lsr r9, r9, #16\n\t"
  106822. "mul r9, r8, r9\n\t"
  106823. "adds r5, r5, r9\n\t"
  106824. "adcs r6, r6, #0\n\t"
  106825. "adc r7, r7, #0\n\t"
  106826. "lsr r9, r12, #16\n\t"
  106827. "mul r8, r9, r8\n\t"
  106828. "lsr r9, r8, #16\n\t"
  106829. "lsl r8, r8, #16\n\t"
  106830. "adds r5, r5, r8\n\t"
  106831. "adcs r6, r6, r9\n\t"
  106832. "adc r7, r7, #0\n\t"
  106833. "lsr r8, r10, #16\n\t"
  106834. "lsr r9, r12, #16\n\t"
  106835. "mul r9, r8, r9\n\t"
  106836. "adds r6, r6, r9\n\t"
  106837. "adc r7, r7, #0\n\t"
  106838. "lsl r9, r12, #16\n\t"
  106839. "lsr r9, r9, #16\n\t"
  106840. "mul r8, r9, r8\n\t"
  106841. "lsr r9, r8, #16\n\t"
  106842. "lsl r8, r8, #16\n\t"
  106843. "adds r5, r5, r8\n\t"
  106844. "adcs r6, r6, r9\n\t"
  106845. "adc r7, r7, #0\n\t"
  106846. #else
  106847. "umull r8, r9, r10, r12\n\t"
  106848. "adds r5, r5, r8\n\t"
  106849. "adcs r6, r6, r9\n\t"
  106850. "adc r7, r7, #0\n\t"
  106851. #endif
  106852. /* A[3] * A[9] */
  106853. "ldr r10, [%[a], #36]\n\t"
  106854. "ldr r12, [%[a], #12]\n\t"
  106855. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106856. "lsl r8, r10, #16\n\t"
  106857. "lsl r9, r12, #16\n\t"
  106858. "lsr r8, r8, #16\n\t"
  106859. "lsr r9, r9, #16\n\t"
  106860. "mul r9, r8, r9\n\t"
  106861. "adds r5, r5, r9\n\t"
  106862. "adcs r6, r6, #0\n\t"
  106863. "adc r7, r7, #0\n\t"
  106864. "lsr r9, r12, #16\n\t"
  106865. "mul r8, r9, r8\n\t"
  106866. "lsr r9, r8, #16\n\t"
  106867. "lsl r8, r8, #16\n\t"
  106868. "adds r5, r5, r8\n\t"
  106869. "adcs r6, r6, r9\n\t"
  106870. "adc r7, r7, #0\n\t"
  106871. "lsr r8, r10, #16\n\t"
  106872. "lsr r9, r12, #16\n\t"
  106873. "mul r9, r8, r9\n\t"
  106874. "adds r6, r6, r9\n\t"
  106875. "adc r7, r7, #0\n\t"
  106876. "lsl r9, r12, #16\n\t"
  106877. "lsr r9, r9, #16\n\t"
  106878. "mul r8, r9, r8\n\t"
  106879. "lsr r9, r8, #16\n\t"
  106880. "lsl r8, r8, #16\n\t"
  106881. "adds r5, r5, r8\n\t"
  106882. "adcs r6, r6, r9\n\t"
  106883. "adc r7, r7, #0\n\t"
  106884. #else
  106885. "umull r8, r9, r10, r12\n\t"
  106886. "adds r5, r5, r8\n\t"
  106887. "adcs r6, r6, r9\n\t"
  106888. "adc r7, r7, #0\n\t"
  106889. #endif
  106890. /* A[4] * A[8] */
  106891. "ldr r10, [%[a], #32]\n\t"
  106892. "ldr r12, [%[a], #16]\n\t"
  106893. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106894. "lsl r8, r10, #16\n\t"
  106895. "lsl r9, r12, #16\n\t"
  106896. "lsr r8, r8, #16\n\t"
  106897. "lsr r9, r9, #16\n\t"
  106898. "mul r9, r8, r9\n\t"
  106899. "adds r5, r5, r9\n\t"
  106900. "adcs r6, r6, #0\n\t"
  106901. "adc r7, r7, #0\n\t"
  106902. "lsr r9, r12, #16\n\t"
  106903. "mul r8, r9, r8\n\t"
  106904. "lsr r9, r8, #16\n\t"
  106905. "lsl r8, r8, #16\n\t"
  106906. "adds r5, r5, r8\n\t"
  106907. "adcs r6, r6, r9\n\t"
  106908. "adc r7, r7, #0\n\t"
  106909. "lsr r8, r10, #16\n\t"
  106910. "lsr r9, r12, #16\n\t"
  106911. "mul r9, r8, r9\n\t"
  106912. "adds r6, r6, r9\n\t"
  106913. "adc r7, r7, #0\n\t"
  106914. "lsl r9, r12, #16\n\t"
  106915. "lsr r9, r9, #16\n\t"
  106916. "mul r8, r9, r8\n\t"
  106917. "lsr r9, r8, #16\n\t"
  106918. "lsl r8, r8, #16\n\t"
  106919. "adds r5, r5, r8\n\t"
  106920. "adcs r6, r6, r9\n\t"
  106921. "adc r7, r7, #0\n\t"
  106922. #else
  106923. "umull r8, r9, r10, r12\n\t"
  106924. "adds r5, r5, r8\n\t"
  106925. "adcs r6, r6, r9\n\t"
  106926. "adc r7, r7, #0\n\t"
  106927. #endif
  106928. /* A[5] * A[7] */
  106929. "ldr r10, [%[a], #28]\n\t"
  106930. "ldr r12, [%[a], #20]\n\t"
  106931. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106932. "lsl r8, r10, #16\n\t"
  106933. "lsl r9, r12, #16\n\t"
  106934. "lsr r8, r8, #16\n\t"
  106935. "lsr r9, r9, #16\n\t"
  106936. "mul r9, r8, r9\n\t"
  106937. "adds r5, r5, r9\n\t"
  106938. "adcs r6, r6, #0\n\t"
  106939. "adc r7, r7, #0\n\t"
  106940. "lsr r9, r12, #16\n\t"
  106941. "mul r8, r9, r8\n\t"
  106942. "lsr r9, r8, #16\n\t"
  106943. "lsl r8, r8, #16\n\t"
  106944. "adds r5, r5, r8\n\t"
  106945. "adcs r6, r6, r9\n\t"
  106946. "adc r7, r7, #0\n\t"
  106947. "lsr r8, r10, #16\n\t"
  106948. "lsr r9, r12, #16\n\t"
  106949. "mul r9, r8, r9\n\t"
  106950. "adds r6, r6, r9\n\t"
  106951. "adc r7, r7, #0\n\t"
  106952. "lsl r9, r12, #16\n\t"
  106953. "lsr r9, r9, #16\n\t"
  106954. "mul r8, r9, r8\n\t"
  106955. "lsr r9, r8, #16\n\t"
  106956. "lsl r8, r8, #16\n\t"
  106957. "adds r5, r5, r8\n\t"
  106958. "adcs r6, r6, r9\n\t"
  106959. "adc r7, r7, #0\n\t"
  106960. #else
  106961. "umull r8, r9, r10, r12\n\t"
  106962. "adds r5, r5, r8\n\t"
  106963. "adcs r6, r6, r9\n\t"
  106964. "adc r7, r7, #0\n\t"
  106965. #endif
  106966. /* A[6] * A[6] */
  106967. "ldr r10, [%[a], #24]\n\t"
  106968. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  106969. "lsl r8, r10, #16\n\t"
  106970. "lsr r9, r10, #16\n\t"
  106971. "lsr r8, r8, #16\n\t"
  106972. "mov r12, r8\n\t"
  106973. "mul r8, r12, r8\n\t"
  106974. "mov r12, r9\n\t"
  106975. "mul r9, r12, r9\n\t"
  106976. "adds r2, r2, r8\n\t"
  106977. "adcs r3, r3, r9\n\t"
  106978. "adc r4, r4, #0\n\t"
  106979. "lsr r9, r10, #16\n\t"
  106980. "lsl r8, r10, #16\n\t"
  106981. "lsr r8, r8, #16\n\t"
  106982. "mul r8, r9, r8\n\t"
  106983. "lsr r9, r8, #15\n\t"
  106984. "lsl r8, r8, #17\n\t"
  106985. "adds r2, r2, r8\n\t"
  106986. "adcs r3, r3, r9\n\t"
  106987. "adc r4, r4, #0\n\t"
  106988. "adds r5, r5, r5\n\t"
  106989. "adcs r6, r6, r6\n\t"
  106990. "adc r7, r7, r7\n\t"
  106991. #else
  106992. "umull r8, r9, r10, r10\n\t"
  106993. "adds r5, r5, r5\n\t"
  106994. "adcs r6, r6, r6\n\t"
  106995. "adc r7, r7, r7\n\t"
  106996. "adds r2, r2, r8\n\t"
  106997. "adcs r3, r3, r9\n\t"
  106998. "adc r4, r4, #0\n\t"
  106999. #endif
  107000. "adds r2, r2, r5\n\t"
  107001. "adcs r3, r3, r6\n\t"
  107002. "adc r4, r4, r7\n\t"
  107003. "str r2, [sp, #48]\n\t"
  107004. /* A[0] * A[13] */
  107005. "ldr r10, [%[a], #52]\n\t"
  107006. "ldr r12, [%[a]]\n\t"
  107007. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107008. "lsl r8, r10, #16\n\t"
  107009. "lsl r5, r12, #16\n\t"
  107010. "lsr r8, r8, #16\n\t"
  107011. "lsr r5, r5, #16\n\t"
  107012. "mul r5, r8, r5\n\t"
  107013. "lsr r9, r12, #16\n\t"
  107014. "mul r8, r9, r8\n\t"
  107015. "lsr r6, r8, #16\n\t"
  107016. "lsl r8, r8, #16\n\t"
  107017. "adds r5, r5, r8\n\t"
  107018. "adc r6, r6, #0\n\t"
  107019. "lsr r8, r10, #16\n\t"
  107020. "mul r9, r8, r9\n\t"
  107021. "add r6, r6, r9\n\t"
  107022. "lsl r9, r12, #16\n\t"
  107023. "lsr r9, r9, #16\n\t"
  107024. "mul r8, r9, r8\n\t"
  107025. "lsr r9, r8, #16\n\t"
  107026. "lsl r8, r8, #16\n\t"
  107027. "adds r5, r5, r8\n\t"
  107028. "adc r6, r6, r9\n\t"
  107029. #else
  107030. "umull r5, r6, r10, r12\n\t"
  107031. #endif
  107032. "mov r2, #0\n\t"
  107033. "mov r7, #0\n\t"
  107034. /* A[1] * A[12] */
  107035. "ldr r10, [%[a], #48]\n\t"
  107036. "ldr r12, [%[a], #4]\n\t"
  107037. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107038. "lsl r8, r10, #16\n\t"
  107039. "lsl r9, r12, #16\n\t"
  107040. "lsr r8, r8, #16\n\t"
  107041. "lsr r9, r9, #16\n\t"
  107042. "mul r9, r8, r9\n\t"
  107043. "adds r5, r5, r9\n\t"
  107044. "adcs r6, r6, #0\n\t"
  107045. "adc r7, r7, #0\n\t"
  107046. "lsr r9, r12, #16\n\t"
  107047. "mul r8, r9, r8\n\t"
  107048. "lsr r9, r8, #16\n\t"
  107049. "lsl r8, r8, #16\n\t"
  107050. "adds r5, r5, r8\n\t"
  107051. "adcs r6, r6, r9\n\t"
  107052. "adc r7, r7, #0\n\t"
  107053. "lsr r8, r10, #16\n\t"
  107054. "lsr r9, r12, #16\n\t"
  107055. "mul r9, r8, r9\n\t"
  107056. "adds r6, r6, r9\n\t"
  107057. "adc r7, r7, #0\n\t"
  107058. "lsl r9, r12, #16\n\t"
  107059. "lsr r9, r9, #16\n\t"
  107060. "mul r8, r9, r8\n\t"
  107061. "lsr r9, r8, #16\n\t"
  107062. "lsl r8, r8, #16\n\t"
  107063. "adds r5, r5, r8\n\t"
  107064. "adcs r6, r6, r9\n\t"
  107065. "adc r7, r7, #0\n\t"
  107066. #else
  107067. "umull r8, r9, r10, r12\n\t"
  107068. "adds r5, r5, r8\n\t"
  107069. "adcs r6, r6, r9\n\t"
  107070. "adc r7, r7, #0\n\t"
  107071. #endif
  107072. /* A[2] * A[11] */
  107073. "ldr r10, [%[a], #44]\n\t"
  107074. "ldr r12, [%[a], #8]\n\t"
  107075. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107076. "lsl r8, r10, #16\n\t"
  107077. "lsl r9, r12, #16\n\t"
  107078. "lsr r8, r8, #16\n\t"
  107079. "lsr r9, r9, #16\n\t"
  107080. "mul r9, r8, r9\n\t"
  107081. "adds r5, r5, r9\n\t"
  107082. "adcs r6, r6, #0\n\t"
  107083. "adc r7, r7, #0\n\t"
  107084. "lsr r9, r12, #16\n\t"
  107085. "mul r8, r9, r8\n\t"
  107086. "lsr r9, r8, #16\n\t"
  107087. "lsl r8, r8, #16\n\t"
  107088. "adds r5, r5, r8\n\t"
  107089. "adcs r6, r6, r9\n\t"
  107090. "adc r7, r7, #0\n\t"
  107091. "lsr r8, r10, #16\n\t"
  107092. "lsr r9, r12, #16\n\t"
  107093. "mul r9, r8, r9\n\t"
  107094. "adds r6, r6, r9\n\t"
  107095. "adc r7, r7, #0\n\t"
  107096. "lsl r9, r12, #16\n\t"
  107097. "lsr r9, r9, #16\n\t"
  107098. "mul r8, r9, r8\n\t"
  107099. "lsr r9, r8, #16\n\t"
  107100. "lsl r8, r8, #16\n\t"
  107101. "adds r5, r5, r8\n\t"
  107102. "adcs r6, r6, r9\n\t"
  107103. "adc r7, r7, #0\n\t"
  107104. #else
  107105. "umull r8, r9, r10, r12\n\t"
  107106. "adds r5, r5, r8\n\t"
  107107. "adcs r6, r6, r9\n\t"
  107108. "adc r7, r7, #0\n\t"
  107109. #endif
  107110. /* A[3] * A[10] */
  107111. "ldr r10, [%[a], #40]\n\t"
  107112. "ldr r12, [%[a], #12]\n\t"
  107113. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107114. "lsl r8, r10, #16\n\t"
  107115. "lsl r9, r12, #16\n\t"
  107116. "lsr r8, r8, #16\n\t"
  107117. "lsr r9, r9, #16\n\t"
  107118. "mul r9, r8, r9\n\t"
  107119. "adds r5, r5, r9\n\t"
  107120. "adcs r6, r6, #0\n\t"
  107121. "adc r7, r7, #0\n\t"
  107122. "lsr r9, r12, #16\n\t"
  107123. "mul r8, r9, r8\n\t"
  107124. "lsr r9, r8, #16\n\t"
  107125. "lsl r8, r8, #16\n\t"
  107126. "adds r5, r5, r8\n\t"
  107127. "adcs r6, r6, r9\n\t"
  107128. "adc r7, r7, #0\n\t"
  107129. "lsr r8, r10, #16\n\t"
  107130. "lsr r9, r12, #16\n\t"
  107131. "mul r9, r8, r9\n\t"
  107132. "adds r6, r6, r9\n\t"
  107133. "adc r7, r7, #0\n\t"
  107134. "lsl r9, r12, #16\n\t"
  107135. "lsr r9, r9, #16\n\t"
  107136. "mul r8, r9, r8\n\t"
  107137. "lsr r9, r8, #16\n\t"
  107138. "lsl r8, r8, #16\n\t"
  107139. "adds r5, r5, r8\n\t"
  107140. "adcs r6, r6, r9\n\t"
  107141. "adc r7, r7, #0\n\t"
  107142. #else
  107143. "umull r8, r9, r10, r12\n\t"
  107144. "adds r5, r5, r8\n\t"
  107145. "adcs r6, r6, r9\n\t"
  107146. "adc r7, r7, #0\n\t"
  107147. #endif
  107148. /* A[4] * A[9] */
  107149. "ldr r10, [%[a], #36]\n\t"
  107150. "ldr r12, [%[a], #16]\n\t"
  107151. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107152. "lsl r8, r10, #16\n\t"
  107153. "lsl r9, r12, #16\n\t"
  107154. "lsr r8, r8, #16\n\t"
  107155. "lsr r9, r9, #16\n\t"
  107156. "mul r9, r8, r9\n\t"
  107157. "adds r5, r5, r9\n\t"
  107158. "adcs r6, r6, #0\n\t"
  107159. "adc r7, r7, #0\n\t"
  107160. "lsr r9, r12, #16\n\t"
  107161. "mul r8, r9, r8\n\t"
  107162. "lsr r9, r8, #16\n\t"
  107163. "lsl r8, r8, #16\n\t"
  107164. "adds r5, r5, r8\n\t"
  107165. "adcs r6, r6, r9\n\t"
  107166. "adc r7, r7, #0\n\t"
  107167. "lsr r8, r10, #16\n\t"
  107168. "lsr r9, r12, #16\n\t"
  107169. "mul r9, r8, r9\n\t"
  107170. "adds r6, r6, r9\n\t"
  107171. "adc r7, r7, #0\n\t"
  107172. "lsl r9, r12, #16\n\t"
  107173. "lsr r9, r9, #16\n\t"
  107174. "mul r8, r9, r8\n\t"
  107175. "lsr r9, r8, #16\n\t"
  107176. "lsl r8, r8, #16\n\t"
  107177. "adds r5, r5, r8\n\t"
  107178. "adcs r6, r6, r9\n\t"
  107179. "adc r7, r7, #0\n\t"
  107180. #else
  107181. "umull r8, r9, r10, r12\n\t"
  107182. "adds r5, r5, r8\n\t"
  107183. "adcs r6, r6, r9\n\t"
  107184. "adc r7, r7, #0\n\t"
  107185. #endif
  107186. /* A[5] * A[8] */
  107187. "ldr r10, [%[a], #32]\n\t"
  107188. "ldr r12, [%[a], #20]\n\t"
  107189. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107190. "lsl r8, r10, #16\n\t"
  107191. "lsl r9, r12, #16\n\t"
  107192. "lsr r8, r8, #16\n\t"
  107193. "lsr r9, r9, #16\n\t"
  107194. "mul r9, r8, r9\n\t"
  107195. "adds r5, r5, r9\n\t"
  107196. "adcs r6, r6, #0\n\t"
  107197. "adc r7, r7, #0\n\t"
  107198. "lsr r9, r12, #16\n\t"
  107199. "mul r8, r9, r8\n\t"
  107200. "lsr r9, r8, #16\n\t"
  107201. "lsl r8, r8, #16\n\t"
  107202. "adds r5, r5, r8\n\t"
  107203. "adcs r6, r6, r9\n\t"
  107204. "adc r7, r7, #0\n\t"
  107205. "lsr r8, r10, #16\n\t"
  107206. "lsr r9, r12, #16\n\t"
  107207. "mul r9, r8, r9\n\t"
  107208. "adds r6, r6, r9\n\t"
  107209. "adc r7, r7, #0\n\t"
  107210. "lsl r9, r12, #16\n\t"
  107211. "lsr r9, r9, #16\n\t"
  107212. "mul r8, r9, r8\n\t"
  107213. "lsr r9, r8, #16\n\t"
  107214. "lsl r8, r8, #16\n\t"
  107215. "adds r5, r5, r8\n\t"
  107216. "adcs r6, r6, r9\n\t"
  107217. "adc r7, r7, #0\n\t"
  107218. #else
  107219. "umull r8, r9, r10, r12\n\t"
  107220. "adds r5, r5, r8\n\t"
  107221. "adcs r6, r6, r9\n\t"
  107222. "adc r7, r7, #0\n\t"
  107223. #endif
  107224. /* A[6] * A[7] */
  107225. "ldr r10, [%[a], #28]\n\t"
  107226. "ldr r12, [%[a], #24]\n\t"
  107227. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107228. "lsl r8, r10, #16\n\t"
  107229. "lsl r9, r12, #16\n\t"
  107230. "lsr r8, r8, #16\n\t"
  107231. "lsr r9, r9, #16\n\t"
  107232. "mul r9, r8, r9\n\t"
  107233. "adds r5, r5, r9\n\t"
  107234. "adcs r6, r6, #0\n\t"
  107235. "adc r7, r7, #0\n\t"
  107236. "lsr r9, r12, #16\n\t"
  107237. "mul r8, r9, r8\n\t"
  107238. "lsr r9, r8, #16\n\t"
  107239. "lsl r8, r8, #16\n\t"
  107240. "adds r5, r5, r8\n\t"
  107241. "adcs r6, r6, r9\n\t"
  107242. "adc r7, r7, #0\n\t"
  107243. "lsr r8, r10, #16\n\t"
  107244. "lsr r9, r12, #16\n\t"
  107245. "mul r9, r8, r9\n\t"
  107246. "adds r6, r6, r9\n\t"
  107247. "adc r7, r7, #0\n\t"
  107248. "lsl r9, r12, #16\n\t"
  107249. "lsr r9, r9, #16\n\t"
  107250. "mul r8, r9, r8\n\t"
  107251. "lsr r9, r8, #16\n\t"
  107252. "lsl r8, r8, #16\n\t"
  107253. "adds r5, r5, r8\n\t"
  107254. "adcs r6, r6, r9\n\t"
  107255. "adc r7, r7, #0\n\t"
  107256. #else
  107257. "umull r8, r9, r10, r12\n\t"
  107258. "adds r5, r5, r8\n\t"
  107259. "adcs r6, r6, r9\n\t"
  107260. "adc r7, r7, #0\n\t"
  107261. #endif
  107262. "adds r5, r5, r5\n\t"
  107263. "adcs r6, r6, r6\n\t"
  107264. "adc r7, r7, r7\n\t"
  107265. "adds r3, r3, r5\n\t"
  107266. "adcs r4, r4, r6\n\t"
  107267. "adc r2, r2, r7\n\t"
  107268. "str r3, [sp, #52]\n\t"
  107269. /* A[0] * A[14] */
  107270. "ldr r10, [%[a], #56]\n\t"
  107271. "ldr r12, [%[a]]\n\t"
  107272. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107273. "lsl r8, r10, #16\n\t"
  107274. "lsl r5, r12, #16\n\t"
  107275. "lsr r8, r8, #16\n\t"
  107276. "lsr r5, r5, #16\n\t"
  107277. "mul r5, r8, r5\n\t"
  107278. "lsr r9, r12, #16\n\t"
  107279. "mul r8, r9, r8\n\t"
  107280. "lsr r6, r8, #16\n\t"
  107281. "lsl r8, r8, #16\n\t"
  107282. "adds r5, r5, r8\n\t"
  107283. "adc r6, r6, #0\n\t"
  107284. "lsr r8, r10, #16\n\t"
  107285. "mul r9, r8, r9\n\t"
  107286. "add r6, r6, r9\n\t"
  107287. "lsl r9, r12, #16\n\t"
  107288. "lsr r9, r9, #16\n\t"
  107289. "mul r8, r9, r8\n\t"
  107290. "lsr r9, r8, #16\n\t"
  107291. "lsl r8, r8, #16\n\t"
  107292. "adds r5, r5, r8\n\t"
  107293. "adc r6, r6, r9\n\t"
  107294. #else
  107295. "umull r5, r6, r10, r12\n\t"
  107296. #endif
  107297. "mov r3, #0\n\t"
  107298. "mov r7, #0\n\t"
  107299. /* A[1] * A[13] */
  107300. "ldr r10, [%[a], #52]\n\t"
  107301. "ldr r12, [%[a], #4]\n\t"
  107302. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107303. "lsl r8, r10, #16\n\t"
  107304. "lsl r9, r12, #16\n\t"
  107305. "lsr r8, r8, #16\n\t"
  107306. "lsr r9, r9, #16\n\t"
  107307. "mul r9, r8, r9\n\t"
  107308. "adds r5, r5, r9\n\t"
  107309. "adcs r6, r6, #0\n\t"
  107310. "adc r7, r7, #0\n\t"
  107311. "lsr r9, r12, #16\n\t"
  107312. "mul r8, r9, r8\n\t"
  107313. "lsr r9, r8, #16\n\t"
  107314. "lsl r8, r8, #16\n\t"
  107315. "adds r5, r5, r8\n\t"
  107316. "adcs r6, r6, r9\n\t"
  107317. "adc r7, r7, #0\n\t"
  107318. "lsr r8, r10, #16\n\t"
  107319. "lsr r9, r12, #16\n\t"
  107320. "mul r9, r8, r9\n\t"
  107321. "adds r6, r6, r9\n\t"
  107322. "adc r7, r7, #0\n\t"
  107323. "lsl r9, r12, #16\n\t"
  107324. "lsr r9, r9, #16\n\t"
  107325. "mul r8, r9, r8\n\t"
  107326. "lsr r9, r8, #16\n\t"
  107327. "lsl r8, r8, #16\n\t"
  107328. "adds r5, r5, r8\n\t"
  107329. "adcs r6, r6, r9\n\t"
  107330. "adc r7, r7, #0\n\t"
  107331. #else
  107332. "umull r8, r9, r10, r12\n\t"
  107333. "adds r5, r5, r8\n\t"
  107334. "adcs r6, r6, r9\n\t"
  107335. "adc r7, r7, #0\n\t"
  107336. #endif
  107337. /* A[2] * A[12] */
  107338. "ldr r10, [%[a], #48]\n\t"
  107339. "ldr r12, [%[a], #8]\n\t"
  107340. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107341. "lsl r8, r10, #16\n\t"
  107342. "lsl r9, r12, #16\n\t"
  107343. "lsr r8, r8, #16\n\t"
  107344. "lsr r9, r9, #16\n\t"
  107345. "mul r9, r8, r9\n\t"
  107346. "adds r5, r5, r9\n\t"
  107347. "adcs r6, r6, #0\n\t"
  107348. "adc r7, r7, #0\n\t"
  107349. "lsr r9, r12, #16\n\t"
  107350. "mul r8, r9, r8\n\t"
  107351. "lsr r9, r8, #16\n\t"
  107352. "lsl r8, r8, #16\n\t"
  107353. "adds r5, r5, r8\n\t"
  107354. "adcs r6, r6, r9\n\t"
  107355. "adc r7, r7, #0\n\t"
  107356. "lsr r8, r10, #16\n\t"
  107357. "lsr r9, r12, #16\n\t"
  107358. "mul r9, r8, r9\n\t"
  107359. "adds r6, r6, r9\n\t"
  107360. "adc r7, r7, #0\n\t"
  107361. "lsl r9, r12, #16\n\t"
  107362. "lsr r9, r9, #16\n\t"
  107363. "mul r8, r9, r8\n\t"
  107364. "lsr r9, r8, #16\n\t"
  107365. "lsl r8, r8, #16\n\t"
  107366. "adds r5, r5, r8\n\t"
  107367. "adcs r6, r6, r9\n\t"
  107368. "adc r7, r7, #0\n\t"
  107369. #else
  107370. "umull r8, r9, r10, r12\n\t"
  107371. "adds r5, r5, r8\n\t"
  107372. "adcs r6, r6, r9\n\t"
  107373. "adc r7, r7, #0\n\t"
  107374. #endif
  107375. /* A[3] * A[11] */
  107376. "ldr r10, [%[a], #44]\n\t"
  107377. "ldr r12, [%[a], #12]\n\t"
  107378. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107379. "lsl r8, r10, #16\n\t"
  107380. "lsl r9, r12, #16\n\t"
  107381. "lsr r8, r8, #16\n\t"
  107382. "lsr r9, r9, #16\n\t"
  107383. "mul r9, r8, r9\n\t"
  107384. "adds r5, r5, r9\n\t"
  107385. "adcs r6, r6, #0\n\t"
  107386. "adc r7, r7, #0\n\t"
  107387. "lsr r9, r12, #16\n\t"
  107388. "mul r8, r9, r8\n\t"
  107389. "lsr r9, r8, #16\n\t"
  107390. "lsl r8, r8, #16\n\t"
  107391. "adds r5, r5, r8\n\t"
  107392. "adcs r6, r6, r9\n\t"
  107393. "adc r7, r7, #0\n\t"
  107394. "lsr r8, r10, #16\n\t"
  107395. "lsr r9, r12, #16\n\t"
  107396. "mul r9, r8, r9\n\t"
  107397. "adds r6, r6, r9\n\t"
  107398. "adc r7, r7, #0\n\t"
  107399. "lsl r9, r12, #16\n\t"
  107400. "lsr r9, r9, #16\n\t"
  107401. "mul r8, r9, r8\n\t"
  107402. "lsr r9, r8, #16\n\t"
  107403. "lsl r8, r8, #16\n\t"
  107404. "adds r5, r5, r8\n\t"
  107405. "adcs r6, r6, r9\n\t"
  107406. "adc r7, r7, #0\n\t"
  107407. #else
  107408. "umull r8, r9, r10, r12\n\t"
  107409. "adds r5, r5, r8\n\t"
  107410. "adcs r6, r6, r9\n\t"
  107411. "adc r7, r7, #0\n\t"
  107412. #endif
  107413. /* A[4] * A[10] */
  107414. "ldr r10, [%[a], #40]\n\t"
  107415. "ldr r12, [%[a], #16]\n\t"
  107416. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107417. "lsl r8, r10, #16\n\t"
  107418. "lsl r9, r12, #16\n\t"
  107419. "lsr r8, r8, #16\n\t"
  107420. "lsr r9, r9, #16\n\t"
  107421. "mul r9, r8, r9\n\t"
  107422. "adds r5, r5, r9\n\t"
  107423. "adcs r6, r6, #0\n\t"
  107424. "adc r7, r7, #0\n\t"
  107425. "lsr r9, r12, #16\n\t"
  107426. "mul r8, r9, r8\n\t"
  107427. "lsr r9, r8, #16\n\t"
  107428. "lsl r8, r8, #16\n\t"
  107429. "adds r5, r5, r8\n\t"
  107430. "adcs r6, r6, r9\n\t"
  107431. "adc r7, r7, #0\n\t"
  107432. "lsr r8, r10, #16\n\t"
  107433. "lsr r9, r12, #16\n\t"
  107434. "mul r9, r8, r9\n\t"
  107435. "adds r6, r6, r9\n\t"
  107436. "adc r7, r7, #0\n\t"
  107437. "lsl r9, r12, #16\n\t"
  107438. "lsr r9, r9, #16\n\t"
  107439. "mul r8, r9, r8\n\t"
  107440. "lsr r9, r8, #16\n\t"
  107441. "lsl r8, r8, #16\n\t"
  107442. "adds r5, r5, r8\n\t"
  107443. "adcs r6, r6, r9\n\t"
  107444. "adc r7, r7, #0\n\t"
  107445. #else
  107446. "umull r8, r9, r10, r12\n\t"
  107447. "adds r5, r5, r8\n\t"
  107448. "adcs r6, r6, r9\n\t"
  107449. "adc r7, r7, #0\n\t"
  107450. #endif
  107451. /* A[5] * A[9] */
  107452. "ldr r10, [%[a], #36]\n\t"
  107453. "ldr r12, [%[a], #20]\n\t"
  107454. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107455. "lsl r8, r10, #16\n\t"
  107456. "lsl r9, r12, #16\n\t"
  107457. "lsr r8, r8, #16\n\t"
  107458. "lsr r9, r9, #16\n\t"
  107459. "mul r9, r8, r9\n\t"
  107460. "adds r5, r5, r9\n\t"
  107461. "adcs r6, r6, #0\n\t"
  107462. "adc r7, r7, #0\n\t"
  107463. "lsr r9, r12, #16\n\t"
  107464. "mul r8, r9, r8\n\t"
  107465. "lsr r9, r8, #16\n\t"
  107466. "lsl r8, r8, #16\n\t"
  107467. "adds r5, r5, r8\n\t"
  107468. "adcs r6, r6, r9\n\t"
  107469. "adc r7, r7, #0\n\t"
  107470. "lsr r8, r10, #16\n\t"
  107471. "lsr r9, r12, #16\n\t"
  107472. "mul r9, r8, r9\n\t"
  107473. "adds r6, r6, r9\n\t"
  107474. "adc r7, r7, #0\n\t"
  107475. "lsl r9, r12, #16\n\t"
  107476. "lsr r9, r9, #16\n\t"
  107477. "mul r8, r9, r8\n\t"
  107478. "lsr r9, r8, #16\n\t"
  107479. "lsl r8, r8, #16\n\t"
  107480. "adds r5, r5, r8\n\t"
  107481. "adcs r6, r6, r9\n\t"
  107482. "adc r7, r7, #0\n\t"
  107483. #else
  107484. "umull r8, r9, r10, r12\n\t"
  107485. "adds r5, r5, r8\n\t"
  107486. "adcs r6, r6, r9\n\t"
  107487. "adc r7, r7, #0\n\t"
  107488. #endif
  107489. /* A[6] * A[8] */
  107490. "ldr r10, [%[a], #32]\n\t"
  107491. "ldr r12, [%[a], #24]\n\t"
  107492. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107493. "lsl r8, r10, #16\n\t"
  107494. "lsl r9, r12, #16\n\t"
  107495. "lsr r8, r8, #16\n\t"
  107496. "lsr r9, r9, #16\n\t"
  107497. "mul r9, r8, r9\n\t"
  107498. "adds r5, r5, r9\n\t"
  107499. "adcs r6, r6, #0\n\t"
  107500. "adc r7, r7, #0\n\t"
  107501. "lsr r9, r12, #16\n\t"
  107502. "mul r8, r9, r8\n\t"
  107503. "lsr r9, r8, #16\n\t"
  107504. "lsl r8, r8, #16\n\t"
  107505. "adds r5, r5, r8\n\t"
  107506. "adcs r6, r6, r9\n\t"
  107507. "adc r7, r7, #0\n\t"
  107508. "lsr r8, r10, #16\n\t"
  107509. "lsr r9, r12, #16\n\t"
  107510. "mul r9, r8, r9\n\t"
  107511. "adds r6, r6, r9\n\t"
  107512. "adc r7, r7, #0\n\t"
  107513. "lsl r9, r12, #16\n\t"
  107514. "lsr r9, r9, #16\n\t"
  107515. "mul r8, r9, r8\n\t"
  107516. "lsr r9, r8, #16\n\t"
  107517. "lsl r8, r8, #16\n\t"
  107518. "adds r5, r5, r8\n\t"
  107519. "adcs r6, r6, r9\n\t"
  107520. "adc r7, r7, #0\n\t"
  107521. #else
  107522. "umull r8, r9, r10, r12\n\t"
  107523. "adds r5, r5, r8\n\t"
  107524. "adcs r6, r6, r9\n\t"
  107525. "adc r7, r7, #0\n\t"
  107526. #endif
  107527. /* A[7] * A[7] */
  107528. "ldr r10, [%[a], #28]\n\t"
  107529. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107530. "lsl r8, r10, #16\n\t"
  107531. "lsr r9, r10, #16\n\t"
  107532. "lsr r8, r8, #16\n\t"
  107533. "mov r12, r8\n\t"
  107534. "mul r8, r12, r8\n\t"
  107535. "mov r12, r9\n\t"
  107536. "mul r9, r12, r9\n\t"
  107537. "adds r4, r4, r8\n\t"
  107538. "adcs r2, r2, r9\n\t"
  107539. "adc r3, r3, #0\n\t"
  107540. "lsr r9, r10, #16\n\t"
  107541. "lsl r8, r10, #16\n\t"
  107542. "lsr r8, r8, #16\n\t"
  107543. "mul r8, r9, r8\n\t"
  107544. "lsr r9, r8, #15\n\t"
  107545. "lsl r8, r8, #17\n\t"
  107546. "adds r4, r4, r8\n\t"
  107547. "adcs r2, r2, r9\n\t"
  107548. "adc r3, r3, #0\n\t"
  107549. "adds r5, r5, r5\n\t"
  107550. "adcs r6, r6, r6\n\t"
  107551. "adc r7, r7, r7\n\t"
  107552. #else
  107553. "umull r8, r9, r10, r10\n\t"
  107554. "adds r5, r5, r5\n\t"
  107555. "adcs r6, r6, r6\n\t"
  107556. "adc r7, r7, r7\n\t"
  107557. "adds r4, r4, r8\n\t"
  107558. "adcs r2, r2, r9\n\t"
  107559. "adc r3, r3, #0\n\t"
  107560. #endif
  107561. "adds r4, r4, r5\n\t"
  107562. "adcs r2, r2, r6\n\t"
  107563. "adc r3, r3, r7\n\t"
  107564. "str r4, [sp, #56]\n\t"
  107565. /* A[0] * A[15] */
  107566. "ldr r10, [%[a], #60]\n\t"
  107567. "ldr r12, [%[a]]\n\t"
  107568. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107569. "lsl r8, r10, #16\n\t"
  107570. "lsl r5, r12, #16\n\t"
  107571. "lsr r8, r8, #16\n\t"
  107572. "lsr r5, r5, #16\n\t"
  107573. "mul r5, r8, r5\n\t"
  107574. "lsr r9, r12, #16\n\t"
  107575. "mul r8, r9, r8\n\t"
  107576. "lsr r6, r8, #16\n\t"
  107577. "lsl r8, r8, #16\n\t"
  107578. "adds r5, r5, r8\n\t"
  107579. "adc r6, r6, #0\n\t"
  107580. "lsr r8, r10, #16\n\t"
  107581. "mul r9, r8, r9\n\t"
  107582. "add r6, r6, r9\n\t"
  107583. "lsl r9, r12, #16\n\t"
  107584. "lsr r9, r9, #16\n\t"
  107585. "mul r8, r9, r8\n\t"
  107586. "lsr r9, r8, #16\n\t"
  107587. "lsl r8, r8, #16\n\t"
  107588. "adds r5, r5, r8\n\t"
  107589. "adc r6, r6, r9\n\t"
  107590. #else
  107591. "umull r5, r6, r10, r12\n\t"
  107592. #endif
  107593. "mov r4, #0\n\t"
  107594. "mov r7, #0\n\t"
  107595. /* A[1] * A[14] */
  107596. "ldr r10, [%[a], #56]\n\t"
  107597. "ldr r12, [%[a], #4]\n\t"
  107598. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107599. "lsl r8, r10, #16\n\t"
  107600. "lsl r9, r12, #16\n\t"
  107601. "lsr r8, r8, #16\n\t"
  107602. "lsr r9, r9, #16\n\t"
  107603. "mul r9, r8, r9\n\t"
  107604. "adds r5, r5, r9\n\t"
  107605. "adcs r6, r6, #0\n\t"
  107606. "adc r7, r7, #0\n\t"
  107607. "lsr r9, r12, #16\n\t"
  107608. "mul r8, r9, r8\n\t"
  107609. "lsr r9, r8, #16\n\t"
  107610. "lsl r8, r8, #16\n\t"
  107611. "adds r5, r5, r8\n\t"
  107612. "adcs r6, r6, r9\n\t"
  107613. "adc r7, r7, #0\n\t"
  107614. "lsr r8, r10, #16\n\t"
  107615. "lsr r9, r12, #16\n\t"
  107616. "mul r9, r8, r9\n\t"
  107617. "adds r6, r6, r9\n\t"
  107618. "adc r7, r7, #0\n\t"
  107619. "lsl r9, r12, #16\n\t"
  107620. "lsr r9, r9, #16\n\t"
  107621. "mul r8, r9, r8\n\t"
  107622. "lsr r9, r8, #16\n\t"
  107623. "lsl r8, r8, #16\n\t"
  107624. "adds r5, r5, r8\n\t"
  107625. "adcs r6, r6, r9\n\t"
  107626. "adc r7, r7, #0\n\t"
  107627. #else
  107628. "umull r8, r9, r10, r12\n\t"
  107629. "adds r5, r5, r8\n\t"
  107630. "adcs r6, r6, r9\n\t"
  107631. "adc r7, r7, #0\n\t"
  107632. #endif
  107633. /* A[2] * A[13] */
  107634. "ldr r10, [%[a], #52]\n\t"
  107635. "ldr r12, [%[a], #8]\n\t"
  107636. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107637. "lsl r8, r10, #16\n\t"
  107638. "lsl r9, r12, #16\n\t"
  107639. "lsr r8, r8, #16\n\t"
  107640. "lsr r9, r9, #16\n\t"
  107641. "mul r9, r8, r9\n\t"
  107642. "adds r5, r5, r9\n\t"
  107643. "adcs r6, r6, #0\n\t"
  107644. "adc r7, r7, #0\n\t"
  107645. "lsr r9, r12, #16\n\t"
  107646. "mul r8, r9, r8\n\t"
  107647. "lsr r9, r8, #16\n\t"
  107648. "lsl r8, r8, #16\n\t"
  107649. "adds r5, r5, r8\n\t"
  107650. "adcs r6, r6, r9\n\t"
  107651. "adc r7, r7, #0\n\t"
  107652. "lsr r8, r10, #16\n\t"
  107653. "lsr r9, r12, #16\n\t"
  107654. "mul r9, r8, r9\n\t"
  107655. "adds r6, r6, r9\n\t"
  107656. "adc r7, r7, #0\n\t"
  107657. "lsl r9, r12, #16\n\t"
  107658. "lsr r9, r9, #16\n\t"
  107659. "mul r8, r9, r8\n\t"
  107660. "lsr r9, r8, #16\n\t"
  107661. "lsl r8, r8, #16\n\t"
  107662. "adds r5, r5, r8\n\t"
  107663. "adcs r6, r6, r9\n\t"
  107664. "adc r7, r7, #0\n\t"
  107665. #else
  107666. "umull r8, r9, r10, r12\n\t"
  107667. "adds r5, r5, r8\n\t"
  107668. "adcs r6, r6, r9\n\t"
  107669. "adc r7, r7, #0\n\t"
  107670. #endif
  107671. /* A[3] * A[12] */
  107672. "ldr r10, [%[a], #48]\n\t"
  107673. "ldr r12, [%[a], #12]\n\t"
  107674. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107675. "lsl r8, r10, #16\n\t"
  107676. "lsl r9, r12, #16\n\t"
  107677. "lsr r8, r8, #16\n\t"
  107678. "lsr r9, r9, #16\n\t"
  107679. "mul r9, r8, r9\n\t"
  107680. "adds r5, r5, r9\n\t"
  107681. "adcs r6, r6, #0\n\t"
  107682. "adc r7, r7, #0\n\t"
  107683. "lsr r9, r12, #16\n\t"
  107684. "mul r8, r9, r8\n\t"
  107685. "lsr r9, r8, #16\n\t"
  107686. "lsl r8, r8, #16\n\t"
  107687. "adds r5, r5, r8\n\t"
  107688. "adcs r6, r6, r9\n\t"
  107689. "adc r7, r7, #0\n\t"
  107690. "lsr r8, r10, #16\n\t"
  107691. "lsr r9, r12, #16\n\t"
  107692. "mul r9, r8, r9\n\t"
  107693. "adds r6, r6, r9\n\t"
  107694. "adc r7, r7, #0\n\t"
  107695. "lsl r9, r12, #16\n\t"
  107696. "lsr r9, r9, #16\n\t"
  107697. "mul r8, r9, r8\n\t"
  107698. "lsr r9, r8, #16\n\t"
  107699. "lsl r8, r8, #16\n\t"
  107700. "adds r5, r5, r8\n\t"
  107701. "adcs r6, r6, r9\n\t"
  107702. "adc r7, r7, #0\n\t"
  107703. #else
  107704. "umull r8, r9, r10, r12\n\t"
  107705. "adds r5, r5, r8\n\t"
  107706. "adcs r6, r6, r9\n\t"
  107707. "adc r7, r7, #0\n\t"
  107708. #endif
  107709. /* A[4] * A[11] */
  107710. "ldr r10, [%[a], #44]\n\t"
  107711. "ldr r12, [%[a], #16]\n\t"
  107712. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107713. "lsl r8, r10, #16\n\t"
  107714. "lsl r9, r12, #16\n\t"
  107715. "lsr r8, r8, #16\n\t"
  107716. "lsr r9, r9, #16\n\t"
  107717. "mul r9, r8, r9\n\t"
  107718. "adds r5, r5, r9\n\t"
  107719. "adcs r6, r6, #0\n\t"
  107720. "adc r7, r7, #0\n\t"
  107721. "lsr r9, r12, #16\n\t"
  107722. "mul r8, r9, r8\n\t"
  107723. "lsr r9, r8, #16\n\t"
  107724. "lsl r8, r8, #16\n\t"
  107725. "adds r5, r5, r8\n\t"
  107726. "adcs r6, r6, r9\n\t"
  107727. "adc r7, r7, #0\n\t"
  107728. "lsr r8, r10, #16\n\t"
  107729. "lsr r9, r12, #16\n\t"
  107730. "mul r9, r8, r9\n\t"
  107731. "adds r6, r6, r9\n\t"
  107732. "adc r7, r7, #0\n\t"
  107733. "lsl r9, r12, #16\n\t"
  107734. "lsr r9, r9, #16\n\t"
  107735. "mul r8, r9, r8\n\t"
  107736. "lsr r9, r8, #16\n\t"
  107737. "lsl r8, r8, #16\n\t"
  107738. "adds r5, r5, r8\n\t"
  107739. "adcs r6, r6, r9\n\t"
  107740. "adc r7, r7, #0\n\t"
  107741. #else
  107742. "umull r8, r9, r10, r12\n\t"
  107743. "adds r5, r5, r8\n\t"
  107744. "adcs r6, r6, r9\n\t"
  107745. "adc r7, r7, #0\n\t"
  107746. #endif
  107747. /* A[5] * A[10] */
  107748. "ldr r10, [%[a], #40]\n\t"
  107749. "ldr r12, [%[a], #20]\n\t"
  107750. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107751. "lsl r8, r10, #16\n\t"
  107752. "lsl r9, r12, #16\n\t"
  107753. "lsr r8, r8, #16\n\t"
  107754. "lsr r9, r9, #16\n\t"
  107755. "mul r9, r8, r9\n\t"
  107756. "adds r5, r5, r9\n\t"
  107757. "adcs r6, r6, #0\n\t"
  107758. "adc r7, r7, #0\n\t"
  107759. "lsr r9, r12, #16\n\t"
  107760. "mul r8, r9, r8\n\t"
  107761. "lsr r9, r8, #16\n\t"
  107762. "lsl r8, r8, #16\n\t"
  107763. "adds r5, r5, r8\n\t"
  107764. "adcs r6, r6, r9\n\t"
  107765. "adc r7, r7, #0\n\t"
  107766. "lsr r8, r10, #16\n\t"
  107767. "lsr r9, r12, #16\n\t"
  107768. "mul r9, r8, r9\n\t"
  107769. "adds r6, r6, r9\n\t"
  107770. "adc r7, r7, #0\n\t"
  107771. "lsl r9, r12, #16\n\t"
  107772. "lsr r9, r9, #16\n\t"
  107773. "mul r8, r9, r8\n\t"
  107774. "lsr r9, r8, #16\n\t"
  107775. "lsl r8, r8, #16\n\t"
  107776. "adds r5, r5, r8\n\t"
  107777. "adcs r6, r6, r9\n\t"
  107778. "adc r7, r7, #0\n\t"
  107779. #else
  107780. "umull r8, r9, r10, r12\n\t"
  107781. "adds r5, r5, r8\n\t"
  107782. "adcs r6, r6, r9\n\t"
  107783. "adc r7, r7, #0\n\t"
  107784. #endif
  107785. /* A[6] * A[9] */
  107786. "ldr r10, [%[a], #36]\n\t"
  107787. "ldr r12, [%[a], #24]\n\t"
  107788. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107789. "lsl r8, r10, #16\n\t"
  107790. "lsl r9, r12, #16\n\t"
  107791. "lsr r8, r8, #16\n\t"
  107792. "lsr r9, r9, #16\n\t"
  107793. "mul r9, r8, r9\n\t"
  107794. "adds r5, r5, r9\n\t"
  107795. "adcs r6, r6, #0\n\t"
  107796. "adc r7, r7, #0\n\t"
  107797. "lsr r9, r12, #16\n\t"
  107798. "mul r8, r9, r8\n\t"
  107799. "lsr r9, r8, #16\n\t"
  107800. "lsl r8, r8, #16\n\t"
  107801. "adds r5, r5, r8\n\t"
  107802. "adcs r6, r6, r9\n\t"
  107803. "adc r7, r7, #0\n\t"
  107804. "lsr r8, r10, #16\n\t"
  107805. "lsr r9, r12, #16\n\t"
  107806. "mul r9, r8, r9\n\t"
  107807. "adds r6, r6, r9\n\t"
  107808. "adc r7, r7, #0\n\t"
  107809. "lsl r9, r12, #16\n\t"
  107810. "lsr r9, r9, #16\n\t"
  107811. "mul r8, r9, r8\n\t"
  107812. "lsr r9, r8, #16\n\t"
  107813. "lsl r8, r8, #16\n\t"
  107814. "adds r5, r5, r8\n\t"
  107815. "adcs r6, r6, r9\n\t"
  107816. "adc r7, r7, #0\n\t"
  107817. #else
  107818. "umull r8, r9, r10, r12\n\t"
  107819. "adds r5, r5, r8\n\t"
  107820. "adcs r6, r6, r9\n\t"
  107821. "adc r7, r7, #0\n\t"
  107822. #endif
  107823. /* A[7] * A[8] */
  107824. "ldr r10, [%[a], #32]\n\t"
  107825. "ldr r12, [%[a], #28]\n\t"
  107826. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107827. "lsl r8, r10, #16\n\t"
  107828. "lsl r9, r12, #16\n\t"
  107829. "lsr r8, r8, #16\n\t"
  107830. "lsr r9, r9, #16\n\t"
  107831. "mul r9, r8, r9\n\t"
  107832. "adds r5, r5, r9\n\t"
  107833. "adcs r6, r6, #0\n\t"
  107834. "adc r7, r7, #0\n\t"
  107835. "lsr r9, r12, #16\n\t"
  107836. "mul r8, r9, r8\n\t"
  107837. "lsr r9, r8, #16\n\t"
  107838. "lsl r8, r8, #16\n\t"
  107839. "adds r5, r5, r8\n\t"
  107840. "adcs r6, r6, r9\n\t"
  107841. "adc r7, r7, #0\n\t"
  107842. "lsr r8, r10, #16\n\t"
  107843. "lsr r9, r12, #16\n\t"
  107844. "mul r9, r8, r9\n\t"
  107845. "adds r6, r6, r9\n\t"
  107846. "adc r7, r7, #0\n\t"
  107847. "lsl r9, r12, #16\n\t"
  107848. "lsr r9, r9, #16\n\t"
  107849. "mul r8, r9, r8\n\t"
  107850. "lsr r9, r8, #16\n\t"
  107851. "lsl r8, r8, #16\n\t"
  107852. "adds r5, r5, r8\n\t"
  107853. "adcs r6, r6, r9\n\t"
  107854. "adc r7, r7, #0\n\t"
  107855. #else
  107856. "umull r8, r9, r10, r12\n\t"
  107857. "adds r5, r5, r8\n\t"
  107858. "adcs r6, r6, r9\n\t"
  107859. "adc r7, r7, #0\n\t"
  107860. #endif
  107861. "adds r5, r5, r5\n\t"
  107862. "adcs r6, r6, r6\n\t"
  107863. "adc r7, r7, r7\n\t"
  107864. "adds r2, r2, r5\n\t"
  107865. "adcs r3, r3, r6\n\t"
  107866. "adc r4, r4, r7\n\t"
  107867. "str r2, [sp, #60]\n\t"
  107868. /* A[0] * A[16] */
  107869. "ldr r10, [%[a], #64]\n\t"
  107870. "ldr r12, [%[a]]\n\t"
  107871. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107872. "lsl r8, r10, #16\n\t"
  107873. "lsl r5, r12, #16\n\t"
  107874. "lsr r8, r8, #16\n\t"
  107875. "lsr r5, r5, #16\n\t"
  107876. "mul r5, r8, r5\n\t"
  107877. "lsr r9, r12, #16\n\t"
  107878. "mul r8, r9, r8\n\t"
  107879. "lsr r6, r8, #16\n\t"
  107880. "lsl r8, r8, #16\n\t"
  107881. "adds r5, r5, r8\n\t"
  107882. "adc r6, r6, #0\n\t"
  107883. "lsr r8, r10, #16\n\t"
  107884. "mul r9, r8, r9\n\t"
  107885. "add r6, r6, r9\n\t"
  107886. "lsl r9, r12, #16\n\t"
  107887. "lsr r9, r9, #16\n\t"
  107888. "mul r8, r9, r8\n\t"
  107889. "lsr r9, r8, #16\n\t"
  107890. "lsl r8, r8, #16\n\t"
  107891. "adds r5, r5, r8\n\t"
  107892. "adc r6, r6, r9\n\t"
  107893. #else
  107894. "umull r5, r6, r10, r12\n\t"
  107895. #endif
  107896. "mov r2, #0\n\t"
  107897. "mov r7, #0\n\t"
  107898. /* A[1] * A[15] */
  107899. "ldr r10, [%[a], #60]\n\t"
  107900. "ldr r12, [%[a], #4]\n\t"
  107901. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107902. "lsl r8, r10, #16\n\t"
  107903. "lsl r9, r12, #16\n\t"
  107904. "lsr r8, r8, #16\n\t"
  107905. "lsr r9, r9, #16\n\t"
  107906. "mul r9, r8, r9\n\t"
  107907. "adds r5, r5, r9\n\t"
  107908. "adcs r6, r6, #0\n\t"
  107909. "adc r7, r7, #0\n\t"
  107910. "lsr r9, r12, #16\n\t"
  107911. "mul r8, r9, r8\n\t"
  107912. "lsr r9, r8, #16\n\t"
  107913. "lsl r8, r8, #16\n\t"
  107914. "adds r5, r5, r8\n\t"
  107915. "adcs r6, r6, r9\n\t"
  107916. "adc r7, r7, #0\n\t"
  107917. "lsr r8, r10, #16\n\t"
  107918. "lsr r9, r12, #16\n\t"
  107919. "mul r9, r8, r9\n\t"
  107920. "adds r6, r6, r9\n\t"
  107921. "adc r7, r7, #0\n\t"
  107922. "lsl r9, r12, #16\n\t"
  107923. "lsr r9, r9, #16\n\t"
  107924. "mul r8, r9, r8\n\t"
  107925. "lsr r9, r8, #16\n\t"
  107926. "lsl r8, r8, #16\n\t"
  107927. "adds r5, r5, r8\n\t"
  107928. "adcs r6, r6, r9\n\t"
  107929. "adc r7, r7, #0\n\t"
  107930. #else
  107931. "umull r8, r9, r10, r12\n\t"
  107932. "adds r5, r5, r8\n\t"
  107933. "adcs r6, r6, r9\n\t"
  107934. "adc r7, r7, #0\n\t"
  107935. #endif
  107936. /* A[2] * A[14] */
  107937. "ldr r10, [%[a], #56]\n\t"
  107938. "ldr r12, [%[a], #8]\n\t"
  107939. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107940. "lsl r8, r10, #16\n\t"
  107941. "lsl r9, r12, #16\n\t"
  107942. "lsr r8, r8, #16\n\t"
  107943. "lsr r9, r9, #16\n\t"
  107944. "mul r9, r8, r9\n\t"
  107945. "adds r5, r5, r9\n\t"
  107946. "adcs r6, r6, #0\n\t"
  107947. "adc r7, r7, #0\n\t"
  107948. "lsr r9, r12, #16\n\t"
  107949. "mul r8, r9, r8\n\t"
  107950. "lsr r9, r8, #16\n\t"
  107951. "lsl r8, r8, #16\n\t"
  107952. "adds r5, r5, r8\n\t"
  107953. "adcs r6, r6, r9\n\t"
  107954. "adc r7, r7, #0\n\t"
  107955. "lsr r8, r10, #16\n\t"
  107956. "lsr r9, r12, #16\n\t"
  107957. "mul r9, r8, r9\n\t"
  107958. "adds r6, r6, r9\n\t"
  107959. "adc r7, r7, #0\n\t"
  107960. "lsl r9, r12, #16\n\t"
  107961. "lsr r9, r9, #16\n\t"
  107962. "mul r8, r9, r8\n\t"
  107963. "lsr r9, r8, #16\n\t"
  107964. "lsl r8, r8, #16\n\t"
  107965. "adds r5, r5, r8\n\t"
  107966. "adcs r6, r6, r9\n\t"
  107967. "adc r7, r7, #0\n\t"
  107968. #else
  107969. "umull r8, r9, r10, r12\n\t"
  107970. "adds r5, r5, r8\n\t"
  107971. "adcs r6, r6, r9\n\t"
  107972. "adc r7, r7, #0\n\t"
  107973. #endif
  107974. /* A[3] * A[13] */
  107975. "ldr r10, [%[a], #52]\n\t"
  107976. "ldr r12, [%[a], #12]\n\t"
  107977. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  107978. "lsl r8, r10, #16\n\t"
  107979. "lsl r9, r12, #16\n\t"
  107980. "lsr r8, r8, #16\n\t"
  107981. "lsr r9, r9, #16\n\t"
  107982. "mul r9, r8, r9\n\t"
  107983. "adds r5, r5, r9\n\t"
  107984. "adcs r6, r6, #0\n\t"
  107985. "adc r7, r7, #0\n\t"
  107986. "lsr r9, r12, #16\n\t"
  107987. "mul r8, r9, r8\n\t"
  107988. "lsr r9, r8, #16\n\t"
  107989. "lsl r8, r8, #16\n\t"
  107990. "adds r5, r5, r8\n\t"
  107991. "adcs r6, r6, r9\n\t"
  107992. "adc r7, r7, #0\n\t"
  107993. "lsr r8, r10, #16\n\t"
  107994. "lsr r9, r12, #16\n\t"
  107995. "mul r9, r8, r9\n\t"
  107996. "adds r6, r6, r9\n\t"
  107997. "adc r7, r7, #0\n\t"
  107998. "lsl r9, r12, #16\n\t"
  107999. "lsr r9, r9, #16\n\t"
  108000. "mul r8, r9, r8\n\t"
  108001. "lsr r9, r8, #16\n\t"
  108002. "lsl r8, r8, #16\n\t"
  108003. "adds r5, r5, r8\n\t"
  108004. "adcs r6, r6, r9\n\t"
  108005. "adc r7, r7, #0\n\t"
  108006. #else
  108007. "umull r8, r9, r10, r12\n\t"
  108008. "adds r5, r5, r8\n\t"
  108009. "adcs r6, r6, r9\n\t"
  108010. "adc r7, r7, #0\n\t"
  108011. #endif
  108012. /* A[4] * A[12] */
  108013. "ldr r10, [%[a], #48]\n\t"
  108014. "ldr r12, [%[a], #16]\n\t"
  108015. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108016. "lsl r8, r10, #16\n\t"
  108017. "lsl r9, r12, #16\n\t"
  108018. "lsr r8, r8, #16\n\t"
  108019. "lsr r9, r9, #16\n\t"
  108020. "mul r9, r8, r9\n\t"
  108021. "adds r5, r5, r9\n\t"
  108022. "adcs r6, r6, #0\n\t"
  108023. "adc r7, r7, #0\n\t"
  108024. "lsr r9, r12, #16\n\t"
  108025. "mul r8, r9, r8\n\t"
  108026. "lsr r9, r8, #16\n\t"
  108027. "lsl r8, r8, #16\n\t"
  108028. "adds r5, r5, r8\n\t"
  108029. "adcs r6, r6, r9\n\t"
  108030. "adc r7, r7, #0\n\t"
  108031. "lsr r8, r10, #16\n\t"
  108032. "lsr r9, r12, #16\n\t"
  108033. "mul r9, r8, r9\n\t"
  108034. "adds r6, r6, r9\n\t"
  108035. "adc r7, r7, #0\n\t"
  108036. "lsl r9, r12, #16\n\t"
  108037. "lsr r9, r9, #16\n\t"
  108038. "mul r8, r9, r8\n\t"
  108039. "lsr r9, r8, #16\n\t"
  108040. "lsl r8, r8, #16\n\t"
  108041. "adds r5, r5, r8\n\t"
  108042. "adcs r6, r6, r9\n\t"
  108043. "adc r7, r7, #0\n\t"
  108044. #else
  108045. "umull r8, r9, r10, r12\n\t"
  108046. "adds r5, r5, r8\n\t"
  108047. "adcs r6, r6, r9\n\t"
  108048. "adc r7, r7, #0\n\t"
  108049. #endif
  108050. /* A[5] * A[11] */
  108051. "ldr r10, [%[a], #44]\n\t"
  108052. "ldr r12, [%[a], #20]\n\t"
  108053. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108054. "lsl r8, r10, #16\n\t"
  108055. "lsl r9, r12, #16\n\t"
  108056. "lsr r8, r8, #16\n\t"
  108057. "lsr r9, r9, #16\n\t"
  108058. "mul r9, r8, r9\n\t"
  108059. "adds r5, r5, r9\n\t"
  108060. "adcs r6, r6, #0\n\t"
  108061. "adc r7, r7, #0\n\t"
  108062. "lsr r9, r12, #16\n\t"
  108063. "mul r8, r9, r8\n\t"
  108064. "lsr r9, r8, #16\n\t"
  108065. "lsl r8, r8, #16\n\t"
  108066. "adds r5, r5, r8\n\t"
  108067. "adcs r6, r6, r9\n\t"
  108068. "adc r7, r7, #0\n\t"
  108069. "lsr r8, r10, #16\n\t"
  108070. "lsr r9, r12, #16\n\t"
  108071. "mul r9, r8, r9\n\t"
  108072. "adds r6, r6, r9\n\t"
  108073. "adc r7, r7, #0\n\t"
  108074. "lsl r9, r12, #16\n\t"
  108075. "lsr r9, r9, #16\n\t"
  108076. "mul r8, r9, r8\n\t"
  108077. "lsr r9, r8, #16\n\t"
  108078. "lsl r8, r8, #16\n\t"
  108079. "adds r5, r5, r8\n\t"
  108080. "adcs r6, r6, r9\n\t"
  108081. "adc r7, r7, #0\n\t"
  108082. #else
  108083. "umull r8, r9, r10, r12\n\t"
  108084. "adds r5, r5, r8\n\t"
  108085. "adcs r6, r6, r9\n\t"
  108086. "adc r7, r7, #0\n\t"
  108087. #endif
  108088. /* A[6] * A[10] */
  108089. "ldr r10, [%[a], #40]\n\t"
  108090. "ldr r12, [%[a], #24]\n\t"
  108091. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108092. "lsl r8, r10, #16\n\t"
  108093. "lsl r9, r12, #16\n\t"
  108094. "lsr r8, r8, #16\n\t"
  108095. "lsr r9, r9, #16\n\t"
  108096. "mul r9, r8, r9\n\t"
  108097. "adds r5, r5, r9\n\t"
  108098. "adcs r6, r6, #0\n\t"
  108099. "adc r7, r7, #0\n\t"
  108100. "lsr r9, r12, #16\n\t"
  108101. "mul r8, r9, r8\n\t"
  108102. "lsr r9, r8, #16\n\t"
  108103. "lsl r8, r8, #16\n\t"
  108104. "adds r5, r5, r8\n\t"
  108105. "adcs r6, r6, r9\n\t"
  108106. "adc r7, r7, #0\n\t"
  108107. "lsr r8, r10, #16\n\t"
  108108. "lsr r9, r12, #16\n\t"
  108109. "mul r9, r8, r9\n\t"
  108110. "adds r6, r6, r9\n\t"
  108111. "adc r7, r7, #0\n\t"
  108112. "lsl r9, r12, #16\n\t"
  108113. "lsr r9, r9, #16\n\t"
  108114. "mul r8, r9, r8\n\t"
  108115. "lsr r9, r8, #16\n\t"
  108116. "lsl r8, r8, #16\n\t"
  108117. "adds r5, r5, r8\n\t"
  108118. "adcs r6, r6, r9\n\t"
  108119. "adc r7, r7, #0\n\t"
  108120. #else
  108121. "umull r8, r9, r10, r12\n\t"
  108122. "adds r5, r5, r8\n\t"
  108123. "adcs r6, r6, r9\n\t"
  108124. "adc r7, r7, #0\n\t"
  108125. #endif
  108126. /* A[7] * A[9] */
  108127. "ldr r10, [%[a], #36]\n\t"
  108128. "ldr r12, [%[a], #28]\n\t"
  108129. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108130. "lsl r8, r10, #16\n\t"
  108131. "lsl r9, r12, #16\n\t"
  108132. "lsr r8, r8, #16\n\t"
  108133. "lsr r9, r9, #16\n\t"
  108134. "mul r9, r8, r9\n\t"
  108135. "adds r5, r5, r9\n\t"
  108136. "adcs r6, r6, #0\n\t"
  108137. "adc r7, r7, #0\n\t"
  108138. "lsr r9, r12, #16\n\t"
  108139. "mul r8, r9, r8\n\t"
  108140. "lsr r9, r8, #16\n\t"
  108141. "lsl r8, r8, #16\n\t"
  108142. "adds r5, r5, r8\n\t"
  108143. "adcs r6, r6, r9\n\t"
  108144. "adc r7, r7, #0\n\t"
  108145. "lsr r8, r10, #16\n\t"
  108146. "lsr r9, r12, #16\n\t"
  108147. "mul r9, r8, r9\n\t"
  108148. "adds r6, r6, r9\n\t"
  108149. "adc r7, r7, #0\n\t"
  108150. "lsl r9, r12, #16\n\t"
  108151. "lsr r9, r9, #16\n\t"
  108152. "mul r8, r9, r8\n\t"
  108153. "lsr r9, r8, #16\n\t"
  108154. "lsl r8, r8, #16\n\t"
  108155. "adds r5, r5, r8\n\t"
  108156. "adcs r6, r6, r9\n\t"
  108157. "adc r7, r7, #0\n\t"
  108158. #else
  108159. "umull r8, r9, r10, r12\n\t"
  108160. "adds r5, r5, r8\n\t"
  108161. "adcs r6, r6, r9\n\t"
  108162. "adc r7, r7, #0\n\t"
  108163. #endif
  108164. /* A[8] * A[8] */
  108165. "ldr r10, [%[a], #32]\n\t"
  108166. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108167. "lsl r8, r10, #16\n\t"
  108168. "lsr r9, r10, #16\n\t"
  108169. "lsr r8, r8, #16\n\t"
  108170. "mov r12, r8\n\t"
  108171. "mul r8, r12, r8\n\t"
  108172. "mov r12, r9\n\t"
  108173. "mul r9, r12, r9\n\t"
  108174. "adds r3, r3, r8\n\t"
  108175. "adcs r4, r4, r9\n\t"
  108176. "adc r2, r2, #0\n\t"
  108177. "lsr r9, r10, #16\n\t"
  108178. "lsl r8, r10, #16\n\t"
  108179. "lsr r8, r8, #16\n\t"
  108180. "mul r8, r9, r8\n\t"
  108181. "lsr r9, r8, #15\n\t"
  108182. "lsl r8, r8, #17\n\t"
  108183. "adds r3, r3, r8\n\t"
  108184. "adcs r4, r4, r9\n\t"
  108185. "adc r2, r2, #0\n\t"
  108186. "adds r5, r5, r5\n\t"
  108187. "adcs r6, r6, r6\n\t"
  108188. "adc r7, r7, r7\n\t"
  108189. #else
  108190. "umull r8, r9, r10, r10\n\t"
  108191. "adds r5, r5, r5\n\t"
  108192. "adcs r6, r6, r6\n\t"
  108193. "adc r7, r7, r7\n\t"
  108194. "adds r3, r3, r8\n\t"
  108195. "adcs r4, r4, r9\n\t"
  108196. "adc r2, r2, #0\n\t"
  108197. #endif
  108198. "adds r3, r3, r5\n\t"
  108199. "adcs r4, r4, r6\n\t"
  108200. "adc r2, r2, r7\n\t"
  108201. "str r3, [sp, #64]\n\t"
  108202. /* A[1] * A[16] */
  108203. "ldr r10, [%[a], #64]\n\t"
  108204. "ldr r12, [%[a], #4]\n\t"
  108205. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108206. "lsl r8, r10, #16\n\t"
  108207. "lsl r5, r12, #16\n\t"
  108208. "lsr r8, r8, #16\n\t"
  108209. "lsr r5, r5, #16\n\t"
  108210. "mul r5, r8, r5\n\t"
  108211. "lsr r9, r12, #16\n\t"
  108212. "mul r8, r9, r8\n\t"
  108213. "lsr r6, r8, #16\n\t"
  108214. "lsl r8, r8, #16\n\t"
  108215. "adds r5, r5, r8\n\t"
  108216. "adc r6, r6, #0\n\t"
  108217. "lsr r8, r10, #16\n\t"
  108218. "mul r9, r8, r9\n\t"
  108219. "add r6, r6, r9\n\t"
  108220. "lsl r9, r12, #16\n\t"
  108221. "lsr r9, r9, #16\n\t"
  108222. "mul r8, r9, r8\n\t"
  108223. "lsr r9, r8, #16\n\t"
  108224. "lsl r8, r8, #16\n\t"
  108225. "adds r5, r5, r8\n\t"
  108226. "adc r6, r6, r9\n\t"
  108227. #else
  108228. "umull r5, r6, r10, r12\n\t"
  108229. #endif
  108230. "mov r3, #0\n\t"
  108231. "mov r7, #0\n\t"
  108232. /* A[2] * A[15] */
  108233. "ldr r10, [%[a], #60]\n\t"
  108234. "ldr r12, [%[a], #8]\n\t"
  108235. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108236. "lsl r8, r10, #16\n\t"
  108237. "lsl r9, r12, #16\n\t"
  108238. "lsr r8, r8, #16\n\t"
  108239. "lsr r9, r9, #16\n\t"
  108240. "mul r9, r8, r9\n\t"
  108241. "adds r5, r5, r9\n\t"
  108242. "adcs r6, r6, #0\n\t"
  108243. "adc r7, r7, #0\n\t"
  108244. "lsr r9, r12, #16\n\t"
  108245. "mul r8, r9, r8\n\t"
  108246. "lsr r9, r8, #16\n\t"
  108247. "lsl r8, r8, #16\n\t"
  108248. "adds r5, r5, r8\n\t"
  108249. "adcs r6, r6, r9\n\t"
  108250. "adc r7, r7, #0\n\t"
  108251. "lsr r8, r10, #16\n\t"
  108252. "lsr r9, r12, #16\n\t"
  108253. "mul r9, r8, r9\n\t"
  108254. "adds r6, r6, r9\n\t"
  108255. "adc r7, r7, #0\n\t"
  108256. "lsl r9, r12, #16\n\t"
  108257. "lsr r9, r9, #16\n\t"
  108258. "mul r8, r9, r8\n\t"
  108259. "lsr r9, r8, #16\n\t"
  108260. "lsl r8, r8, #16\n\t"
  108261. "adds r5, r5, r8\n\t"
  108262. "adcs r6, r6, r9\n\t"
  108263. "adc r7, r7, #0\n\t"
  108264. #else
  108265. "umull r8, r9, r10, r12\n\t"
  108266. "adds r5, r5, r8\n\t"
  108267. "adcs r6, r6, r9\n\t"
  108268. "adc r7, r7, #0\n\t"
  108269. #endif
  108270. /* A[3] * A[14] */
  108271. "ldr r10, [%[a], #56]\n\t"
  108272. "ldr r12, [%[a], #12]\n\t"
  108273. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108274. "lsl r8, r10, #16\n\t"
  108275. "lsl r9, r12, #16\n\t"
  108276. "lsr r8, r8, #16\n\t"
  108277. "lsr r9, r9, #16\n\t"
  108278. "mul r9, r8, r9\n\t"
  108279. "adds r5, r5, r9\n\t"
  108280. "adcs r6, r6, #0\n\t"
  108281. "adc r7, r7, #0\n\t"
  108282. "lsr r9, r12, #16\n\t"
  108283. "mul r8, r9, r8\n\t"
  108284. "lsr r9, r8, #16\n\t"
  108285. "lsl r8, r8, #16\n\t"
  108286. "adds r5, r5, r8\n\t"
  108287. "adcs r6, r6, r9\n\t"
  108288. "adc r7, r7, #0\n\t"
  108289. "lsr r8, r10, #16\n\t"
  108290. "lsr r9, r12, #16\n\t"
  108291. "mul r9, r8, r9\n\t"
  108292. "adds r6, r6, r9\n\t"
  108293. "adc r7, r7, #0\n\t"
  108294. "lsl r9, r12, #16\n\t"
  108295. "lsr r9, r9, #16\n\t"
  108296. "mul r8, r9, r8\n\t"
  108297. "lsr r9, r8, #16\n\t"
  108298. "lsl r8, r8, #16\n\t"
  108299. "adds r5, r5, r8\n\t"
  108300. "adcs r6, r6, r9\n\t"
  108301. "adc r7, r7, #0\n\t"
  108302. #else
  108303. "umull r8, r9, r10, r12\n\t"
  108304. "adds r5, r5, r8\n\t"
  108305. "adcs r6, r6, r9\n\t"
  108306. "adc r7, r7, #0\n\t"
  108307. #endif
  108308. /* A[4] * A[13] */
  108309. "ldr r10, [%[a], #52]\n\t"
  108310. "ldr r12, [%[a], #16]\n\t"
  108311. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108312. "lsl r8, r10, #16\n\t"
  108313. "lsl r9, r12, #16\n\t"
  108314. "lsr r8, r8, #16\n\t"
  108315. "lsr r9, r9, #16\n\t"
  108316. "mul r9, r8, r9\n\t"
  108317. "adds r5, r5, r9\n\t"
  108318. "adcs r6, r6, #0\n\t"
  108319. "adc r7, r7, #0\n\t"
  108320. "lsr r9, r12, #16\n\t"
  108321. "mul r8, r9, r8\n\t"
  108322. "lsr r9, r8, #16\n\t"
  108323. "lsl r8, r8, #16\n\t"
  108324. "adds r5, r5, r8\n\t"
  108325. "adcs r6, r6, r9\n\t"
  108326. "adc r7, r7, #0\n\t"
  108327. "lsr r8, r10, #16\n\t"
  108328. "lsr r9, r12, #16\n\t"
  108329. "mul r9, r8, r9\n\t"
  108330. "adds r6, r6, r9\n\t"
  108331. "adc r7, r7, #0\n\t"
  108332. "lsl r9, r12, #16\n\t"
  108333. "lsr r9, r9, #16\n\t"
  108334. "mul r8, r9, r8\n\t"
  108335. "lsr r9, r8, #16\n\t"
  108336. "lsl r8, r8, #16\n\t"
  108337. "adds r5, r5, r8\n\t"
  108338. "adcs r6, r6, r9\n\t"
  108339. "adc r7, r7, #0\n\t"
  108340. #else
  108341. "umull r8, r9, r10, r12\n\t"
  108342. "adds r5, r5, r8\n\t"
  108343. "adcs r6, r6, r9\n\t"
  108344. "adc r7, r7, #0\n\t"
  108345. #endif
  108346. /* A[5] * A[12] */
  108347. "ldr r10, [%[a], #48]\n\t"
  108348. "ldr r12, [%[a], #20]\n\t"
  108349. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108350. "lsl r8, r10, #16\n\t"
  108351. "lsl r9, r12, #16\n\t"
  108352. "lsr r8, r8, #16\n\t"
  108353. "lsr r9, r9, #16\n\t"
  108354. "mul r9, r8, r9\n\t"
  108355. "adds r5, r5, r9\n\t"
  108356. "adcs r6, r6, #0\n\t"
  108357. "adc r7, r7, #0\n\t"
  108358. "lsr r9, r12, #16\n\t"
  108359. "mul r8, r9, r8\n\t"
  108360. "lsr r9, r8, #16\n\t"
  108361. "lsl r8, r8, #16\n\t"
  108362. "adds r5, r5, r8\n\t"
  108363. "adcs r6, r6, r9\n\t"
  108364. "adc r7, r7, #0\n\t"
  108365. "lsr r8, r10, #16\n\t"
  108366. "lsr r9, r12, #16\n\t"
  108367. "mul r9, r8, r9\n\t"
  108368. "adds r6, r6, r9\n\t"
  108369. "adc r7, r7, #0\n\t"
  108370. "lsl r9, r12, #16\n\t"
  108371. "lsr r9, r9, #16\n\t"
  108372. "mul r8, r9, r8\n\t"
  108373. "lsr r9, r8, #16\n\t"
  108374. "lsl r8, r8, #16\n\t"
  108375. "adds r5, r5, r8\n\t"
  108376. "adcs r6, r6, r9\n\t"
  108377. "adc r7, r7, #0\n\t"
  108378. #else
  108379. "umull r8, r9, r10, r12\n\t"
  108380. "adds r5, r5, r8\n\t"
  108381. "adcs r6, r6, r9\n\t"
  108382. "adc r7, r7, #0\n\t"
  108383. #endif
  108384. /* A[6] * A[11] */
  108385. "ldr r10, [%[a], #44]\n\t"
  108386. "ldr r12, [%[a], #24]\n\t"
  108387. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108388. "lsl r8, r10, #16\n\t"
  108389. "lsl r9, r12, #16\n\t"
  108390. "lsr r8, r8, #16\n\t"
  108391. "lsr r9, r9, #16\n\t"
  108392. "mul r9, r8, r9\n\t"
  108393. "adds r5, r5, r9\n\t"
  108394. "adcs r6, r6, #0\n\t"
  108395. "adc r7, r7, #0\n\t"
  108396. "lsr r9, r12, #16\n\t"
  108397. "mul r8, r9, r8\n\t"
  108398. "lsr r9, r8, #16\n\t"
  108399. "lsl r8, r8, #16\n\t"
  108400. "adds r5, r5, r8\n\t"
  108401. "adcs r6, r6, r9\n\t"
  108402. "adc r7, r7, #0\n\t"
  108403. "lsr r8, r10, #16\n\t"
  108404. "lsr r9, r12, #16\n\t"
  108405. "mul r9, r8, r9\n\t"
  108406. "adds r6, r6, r9\n\t"
  108407. "adc r7, r7, #0\n\t"
  108408. "lsl r9, r12, #16\n\t"
  108409. "lsr r9, r9, #16\n\t"
  108410. "mul r8, r9, r8\n\t"
  108411. "lsr r9, r8, #16\n\t"
  108412. "lsl r8, r8, #16\n\t"
  108413. "adds r5, r5, r8\n\t"
  108414. "adcs r6, r6, r9\n\t"
  108415. "adc r7, r7, #0\n\t"
  108416. #else
  108417. "umull r8, r9, r10, r12\n\t"
  108418. "adds r5, r5, r8\n\t"
  108419. "adcs r6, r6, r9\n\t"
  108420. "adc r7, r7, #0\n\t"
  108421. #endif
  108422. /* A[7] * A[10] */
  108423. "ldr r10, [%[a], #40]\n\t"
  108424. "ldr r12, [%[a], #28]\n\t"
  108425. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108426. "lsl r8, r10, #16\n\t"
  108427. "lsl r9, r12, #16\n\t"
  108428. "lsr r8, r8, #16\n\t"
  108429. "lsr r9, r9, #16\n\t"
  108430. "mul r9, r8, r9\n\t"
  108431. "adds r5, r5, r9\n\t"
  108432. "adcs r6, r6, #0\n\t"
  108433. "adc r7, r7, #0\n\t"
  108434. "lsr r9, r12, #16\n\t"
  108435. "mul r8, r9, r8\n\t"
  108436. "lsr r9, r8, #16\n\t"
  108437. "lsl r8, r8, #16\n\t"
  108438. "adds r5, r5, r8\n\t"
  108439. "adcs r6, r6, r9\n\t"
  108440. "adc r7, r7, #0\n\t"
  108441. "lsr r8, r10, #16\n\t"
  108442. "lsr r9, r12, #16\n\t"
  108443. "mul r9, r8, r9\n\t"
  108444. "adds r6, r6, r9\n\t"
  108445. "adc r7, r7, #0\n\t"
  108446. "lsl r9, r12, #16\n\t"
  108447. "lsr r9, r9, #16\n\t"
  108448. "mul r8, r9, r8\n\t"
  108449. "lsr r9, r8, #16\n\t"
  108450. "lsl r8, r8, #16\n\t"
  108451. "adds r5, r5, r8\n\t"
  108452. "adcs r6, r6, r9\n\t"
  108453. "adc r7, r7, #0\n\t"
  108454. #else
  108455. "umull r8, r9, r10, r12\n\t"
  108456. "adds r5, r5, r8\n\t"
  108457. "adcs r6, r6, r9\n\t"
  108458. "adc r7, r7, #0\n\t"
  108459. #endif
  108460. /* A[8] * A[9] */
  108461. "ldr r10, [%[a], #36]\n\t"
  108462. "ldr r12, [%[a], #32]\n\t"
  108463. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108464. "lsl r8, r10, #16\n\t"
  108465. "lsl r9, r12, #16\n\t"
  108466. "lsr r8, r8, #16\n\t"
  108467. "lsr r9, r9, #16\n\t"
  108468. "mul r9, r8, r9\n\t"
  108469. "adds r5, r5, r9\n\t"
  108470. "adcs r6, r6, #0\n\t"
  108471. "adc r7, r7, #0\n\t"
  108472. "lsr r9, r12, #16\n\t"
  108473. "mul r8, r9, r8\n\t"
  108474. "lsr r9, r8, #16\n\t"
  108475. "lsl r8, r8, #16\n\t"
  108476. "adds r5, r5, r8\n\t"
  108477. "adcs r6, r6, r9\n\t"
  108478. "adc r7, r7, #0\n\t"
  108479. "lsr r8, r10, #16\n\t"
  108480. "lsr r9, r12, #16\n\t"
  108481. "mul r9, r8, r9\n\t"
  108482. "adds r6, r6, r9\n\t"
  108483. "adc r7, r7, #0\n\t"
  108484. "lsl r9, r12, #16\n\t"
  108485. "lsr r9, r9, #16\n\t"
  108486. "mul r8, r9, r8\n\t"
  108487. "lsr r9, r8, #16\n\t"
  108488. "lsl r8, r8, #16\n\t"
  108489. "adds r5, r5, r8\n\t"
  108490. "adcs r6, r6, r9\n\t"
  108491. "adc r7, r7, #0\n\t"
  108492. #else
  108493. "umull r8, r9, r10, r12\n\t"
  108494. "adds r5, r5, r8\n\t"
  108495. "adcs r6, r6, r9\n\t"
  108496. "adc r7, r7, #0\n\t"
  108497. #endif
  108498. "adds r5, r5, r5\n\t"
  108499. "adcs r6, r6, r6\n\t"
  108500. "adc r7, r7, r7\n\t"
  108501. "adds r4, r4, r5\n\t"
  108502. "adcs r2, r2, r6\n\t"
  108503. "adc r3, r3, r7\n\t"
  108504. "str r4, [%[r], #68]\n\t"
  108505. /* A[2] * A[16] */
  108506. "ldr r10, [%[a], #64]\n\t"
  108507. "ldr r12, [%[a], #8]\n\t"
  108508. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108509. "lsl r8, r10, #16\n\t"
  108510. "lsl r5, r12, #16\n\t"
  108511. "lsr r8, r8, #16\n\t"
  108512. "lsr r5, r5, #16\n\t"
  108513. "mul r5, r8, r5\n\t"
  108514. "lsr r9, r12, #16\n\t"
  108515. "mul r8, r9, r8\n\t"
  108516. "lsr r6, r8, #16\n\t"
  108517. "lsl r8, r8, #16\n\t"
  108518. "adds r5, r5, r8\n\t"
  108519. "adc r6, r6, #0\n\t"
  108520. "lsr r8, r10, #16\n\t"
  108521. "mul r9, r8, r9\n\t"
  108522. "add r6, r6, r9\n\t"
  108523. "lsl r9, r12, #16\n\t"
  108524. "lsr r9, r9, #16\n\t"
  108525. "mul r8, r9, r8\n\t"
  108526. "lsr r9, r8, #16\n\t"
  108527. "lsl r8, r8, #16\n\t"
  108528. "adds r5, r5, r8\n\t"
  108529. "adc r6, r6, r9\n\t"
  108530. #else
  108531. "umull r5, r6, r10, r12\n\t"
  108532. #endif
  108533. "mov r4, #0\n\t"
  108534. "mov r7, #0\n\t"
  108535. /* A[3] * A[15] */
  108536. "ldr r10, [%[a], #60]\n\t"
  108537. "ldr r12, [%[a], #12]\n\t"
  108538. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108539. "lsl r8, r10, #16\n\t"
  108540. "lsl r9, r12, #16\n\t"
  108541. "lsr r8, r8, #16\n\t"
  108542. "lsr r9, r9, #16\n\t"
  108543. "mul r9, r8, r9\n\t"
  108544. "adds r5, r5, r9\n\t"
  108545. "adcs r6, r6, #0\n\t"
  108546. "adc r7, r7, #0\n\t"
  108547. "lsr r9, r12, #16\n\t"
  108548. "mul r8, r9, r8\n\t"
  108549. "lsr r9, r8, #16\n\t"
  108550. "lsl r8, r8, #16\n\t"
  108551. "adds r5, r5, r8\n\t"
  108552. "adcs r6, r6, r9\n\t"
  108553. "adc r7, r7, #0\n\t"
  108554. "lsr r8, r10, #16\n\t"
  108555. "lsr r9, r12, #16\n\t"
  108556. "mul r9, r8, r9\n\t"
  108557. "adds r6, r6, r9\n\t"
  108558. "adc r7, r7, #0\n\t"
  108559. "lsl r9, r12, #16\n\t"
  108560. "lsr r9, r9, #16\n\t"
  108561. "mul r8, r9, r8\n\t"
  108562. "lsr r9, r8, #16\n\t"
  108563. "lsl r8, r8, #16\n\t"
  108564. "adds r5, r5, r8\n\t"
  108565. "adcs r6, r6, r9\n\t"
  108566. "adc r7, r7, #0\n\t"
  108567. #else
  108568. "umull r8, r9, r10, r12\n\t"
  108569. "adds r5, r5, r8\n\t"
  108570. "adcs r6, r6, r9\n\t"
  108571. "adc r7, r7, #0\n\t"
  108572. #endif
  108573. /* A[4] * A[14] */
  108574. "ldr r10, [%[a], #56]\n\t"
  108575. "ldr r12, [%[a], #16]\n\t"
  108576. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108577. "lsl r8, r10, #16\n\t"
  108578. "lsl r9, r12, #16\n\t"
  108579. "lsr r8, r8, #16\n\t"
  108580. "lsr r9, r9, #16\n\t"
  108581. "mul r9, r8, r9\n\t"
  108582. "adds r5, r5, r9\n\t"
  108583. "adcs r6, r6, #0\n\t"
  108584. "adc r7, r7, #0\n\t"
  108585. "lsr r9, r12, #16\n\t"
  108586. "mul r8, r9, r8\n\t"
  108587. "lsr r9, r8, #16\n\t"
  108588. "lsl r8, r8, #16\n\t"
  108589. "adds r5, r5, r8\n\t"
  108590. "adcs r6, r6, r9\n\t"
  108591. "adc r7, r7, #0\n\t"
  108592. "lsr r8, r10, #16\n\t"
  108593. "lsr r9, r12, #16\n\t"
  108594. "mul r9, r8, r9\n\t"
  108595. "adds r6, r6, r9\n\t"
  108596. "adc r7, r7, #0\n\t"
  108597. "lsl r9, r12, #16\n\t"
  108598. "lsr r9, r9, #16\n\t"
  108599. "mul r8, r9, r8\n\t"
  108600. "lsr r9, r8, #16\n\t"
  108601. "lsl r8, r8, #16\n\t"
  108602. "adds r5, r5, r8\n\t"
  108603. "adcs r6, r6, r9\n\t"
  108604. "adc r7, r7, #0\n\t"
  108605. #else
  108606. "umull r8, r9, r10, r12\n\t"
  108607. "adds r5, r5, r8\n\t"
  108608. "adcs r6, r6, r9\n\t"
  108609. "adc r7, r7, #0\n\t"
  108610. #endif
  108611. /* A[5] * A[13] */
  108612. "ldr r10, [%[a], #52]\n\t"
  108613. "ldr r12, [%[a], #20]\n\t"
  108614. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108615. "lsl r8, r10, #16\n\t"
  108616. "lsl r9, r12, #16\n\t"
  108617. "lsr r8, r8, #16\n\t"
  108618. "lsr r9, r9, #16\n\t"
  108619. "mul r9, r8, r9\n\t"
  108620. "adds r5, r5, r9\n\t"
  108621. "adcs r6, r6, #0\n\t"
  108622. "adc r7, r7, #0\n\t"
  108623. "lsr r9, r12, #16\n\t"
  108624. "mul r8, r9, r8\n\t"
  108625. "lsr r9, r8, #16\n\t"
  108626. "lsl r8, r8, #16\n\t"
  108627. "adds r5, r5, r8\n\t"
  108628. "adcs r6, r6, r9\n\t"
  108629. "adc r7, r7, #0\n\t"
  108630. "lsr r8, r10, #16\n\t"
  108631. "lsr r9, r12, #16\n\t"
  108632. "mul r9, r8, r9\n\t"
  108633. "adds r6, r6, r9\n\t"
  108634. "adc r7, r7, #0\n\t"
  108635. "lsl r9, r12, #16\n\t"
  108636. "lsr r9, r9, #16\n\t"
  108637. "mul r8, r9, r8\n\t"
  108638. "lsr r9, r8, #16\n\t"
  108639. "lsl r8, r8, #16\n\t"
  108640. "adds r5, r5, r8\n\t"
  108641. "adcs r6, r6, r9\n\t"
  108642. "adc r7, r7, #0\n\t"
  108643. #else
  108644. "umull r8, r9, r10, r12\n\t"
  108645. "adds r5, r5, r8\n\t"
  108646. "adcs r6, r6, r9\n\t"
  108647. "adc r7, r7, #0\n\t"
  108648. #endif
  108649. /* A[6] * A[12] */
  108650. "ldr r10, [%[a], #48]\n\t"
  108651. "ldr r12, [%[a], #24]\n\t"
  108652. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108653. "lsl r8, r10, #16\n\t"
  108654. "lsl r9, r12, #16\n\t"
  108655. "lsr r8, r8, #16\n\t"
  108656. "lsr r9, r9, #16\n\t"
  108657. "mul r9, r8, r9\n\t"
  108658. "adds r5, r5, r9\n\t"
  108659. "adcs r6, r6, #0\n\t"
  108660. "adc r7, r7, #0\n\t"
  108661. "lsr r9, r12, #16\n\t"
  108662. "mul r8, r9, r8\n\t"
  108663. "lsr r9, r8, #16\n\t"
  108664. "lsl r8, r8, #16\n\t"
  108665. "adds r5, r5, r8\n\t"
  108666. "adcs r6, r6, r9\n\t"
  108667. "adc r7, r7, #0\n\t"
  108668. "lsr r8, r10, #16\n\t"
  108669. "lsr r9, r12, #16\n\t"
  108670. "mul r9, r8, r9\n\t"
  108671. "adds r6, r6, r9\n\t"
  108672. "adc r7, r7, #0\n\t"
  108673. "lsl r9, r12, #16\n\t"
  108674. "lsr r9, r9, #16\n\t"
  108675. "mul r8, r9, r8\n\t"
  108676. "lsr r9, r8, #16\n\t"
  108677. "lsl r8, r8, #16\n\t"
  108678. "adds r5, r5, r8\n\t"
  108679. "adcs r6, r6, r9\n\t"
  108680. "adc r7, r7, #0\n\t"
  108681. #else
  108682. "umull r8, r9, r10, r12\n\t"
  108683. "adds r5, r5, r8\n\t"
  108684. "adcs r6, r6, r9\n\t"
  108685. "adc r7, r7, #0\n\t"
  108686. #endif
  108687. /* A[7] * A[11] */
  108688. "ldr r10, [%[a], #44]\n\t"
  108689. "ldr r12, [%[a], #28]\n\t"
  108690. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108691. "lsl r8, r10, #16\n\t"
  108692. "lsl r9, r12, #16\n\t"
  108693. "lsr r8, r8, #16\n\t"
  108694. "lsr r9, r9, #16\n\t"
  108695. "mul r9, r8, r9\n\t"
  108696. "adds r5, r5, r9\n\t"
  108697. "adcs r6, r6, #0\n\t"
  108698. "adc r7, r7, #0\n\t"
  108699. "lsr r9, r12, #16\n\t"
  108700. "mul r8, r9, r8\n\t"
  108701. "lsr r9, r8, #16\n\t"
  108702. "lsl r8, r8, #16\n\t"
  108703. "adds r5, r5, r8\n\t"
  108704. "adcs r6, r6, r9\n\t"
  108705. "adc r7, r7, #0\n\t"
  108706. "lsr r8, r10, #16\n\t"
  108707. "lsr r9, r12, #16\n\t"
  108708. "mul r9, r8, r9\n\t"
  108709. "adds r6, r6, r9\n\t"
  108710. "adc r7, r7, #0\n\t"
  108711. "lsl r9, r12, #16\n\t"
  108712. "lsr r9, r9, #16\n\t"
  108713. "mul r8, r9, r8\n\t"
  108714. "lsr r9, r8, #16\n\t"
  108715. "lsl r8, r8, #16\n\t"
  108716. "adds r5, r5, r8\n\t"
  108717. "adcs r6, r6, r9\n\t"
  108718. "adc r7, r7, #0\n\t"
  108719. #else
  108720. "umull r8, r9, r10, r12\n\t"
  108721. "adds r5, r5, r8\n\t"
  108722. "adcs r6, r6, r9\n\t"
  108723. "adc r7, r7, #0\n\t"
  108724. #endif
  108725. /* A[8] * A[10] */
  108726. "ldr r10, [%[a], #40]\n\t"
  108727. "ldr r12, [%[a], #32]\n\t"
  108728. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108729. "lsl r8, r10, #16\n\t"
  108730. "lsl r9, r12, #16\n\t"
  108731. "lsr r8, r8, #16\n\t"
  108732. "lsr r9, r9, #16\n\t"
  108733. "mul r9, r8, r9\n\t"
  108734. "adds r5, r5, r9\n\t"
  108735. "adcs r6, r6, #0\n\t"
  108736. "adc r7, r7, #0\n\t"
  108737. "lsr r9, r12, #16\n\t"
  108738. "mul r8, r9, r8\n\t"
  108739. "lsr r9, r8, #16\n\t"
  108740. "lsl r8, r8, #16\n\t"
  108741. "adds r5, r5, r8\n\t"
  108742. "adcs r6, r6, r9\n\t"
  108743. "adc r7, r7, #0\n\t"
  108744. "lsr r8, r10, #16\n\t"
  108745. "lsr r9, r12, #16\n\t"
  108746. "mul r9, r8, r9\n\t"
  108747. "adds r6, r6, r9\n\t"
  108748. "adc r7, r7, #0\n\t"
  108749. "lsl r9, r12, #16\n\t"
  108750. "lsr r9, r9, #16\n\t"
  108751. "mul r8, r9, r8\n\t"
  108752. "lsr r9, r8, #16\n\t"
  108753. "lsl r8, r8, #16\n\t"
  108754. "adds r5, r5, r8\n\t"
  108755. "adcs r6, r6, r9\n\t"
  108756. "adc r7, r7, #0\n\t"
  108757. #else
  108758. "umull r8, r9, r10, r12\n\t"
  108759. "adds r5, r5, r8\n\t"
  108760. "adcs r6, r6, r9\n\t"
  108761. "adc r7, r7, #0\n\t"
  108762. #endif
  108763. /* A[9] * A[9] */
  108764. "ldr r10, [%[a], #36]\n\t"
  108765. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108766. "lsl r8, r10, #16\n\t"
  108767. "lsr r9, r10, #16\n\t"
  108768. "lsr r8, r8, #16\n\t"
  108769. "mov r12, r8\n\t"
  108770. "mul r8, r12, r8\n\t"
  108771. "mov r12, r9\n\t"
  108772. "mul r9, r12, r9\n\t"
  108773. "adds r2, r2, r8\n\t"
  108774. "adcs r3, r3, r9\n\t"
  108775. "adc r4, r4, #0\n\t"
  108776. "lsr r9, r10, #16\n\t"
  108777. "lsl r8, r10, #16\n\t"
  108778. "lsr r8, r8, #16\n\t"
  108779. "mul r8, r9, r8\n\t"
  108780. "lsr r9, r8, #15\n\t"
  108781. "lsl r8, r8, #17\n\t"
  108782. "adds r2, r2, r8\n\t"
  108783. "adcs r3, r3, r9\n\t"
  108784. "adc r4, r4, #0\n\t"
  108785. "adds r5, r5, r5\n\t"
  108786. "adcs r6, r6, r6\n\t"
  108787. "adc r7, r7, r7\n\t"
  108788. #else
  108789. "umull r8, r9, r10, r10\n\t"
  108790. "adds r5, r5, r5\n\t"
  108791. "adcs r6, r6, r6\n\t"
  108792. "adc r7, r7, r7\n\t"
  108793. "adds r2, r2, r8\n\t"
  108794. "adcs r3, r3, r9\n\t"
  108795. "adc r4, r4, #0\n\t"
  108796. #endif
  108797. "adds r2, r2, r5\n\t"
  108798. "adcs r3, r3, r6\n\t"
  108799. "adc r4, r4, r7\n\t"
  108800. "str r2, [%[r], #72]\n\t"
  108801. /* A[3] * A[16] */
  108802. "ldr r10, [%[a], #64]\n\t"
  108803. "ldr r12, [%[a], #12]\n\t"
  108804. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108805. "lsl r8, r10, #16\n\t"
  108806. "lsl r5, r12, #16\n\t"
  108807. "lsr r8, r8, #16\n\t"
  108808. "lsr r5, r5, #16\n\t"
  108809. "mul r5, r8, r5\n\t"
  108810. "lsr r9, r12, #16\n\t"
  108811. "mul r8, r9, r8\n\t"
  108812. "lsr r6, r8, #16\n\t"
  108813. "lsl r8, r8, #16\n\t"
  108814. "adds r5, r5, r8\n\t"
  108815. "adc r6, r6, #0\n\t"
  108816. "lsr r8, r10, #16\n\t"
  108817. "mul r9, r8, r9\n\t"
  108818. "add r6, r6, r9\n\t"
  108819. "lsl r9, r12, #16\n\t"
  108820. "lsr r9, r9, #16\n\t"
  108821. "mul r8, r9, r8\n\t"
  108822. "lsr r9, r8, #16\n\t"
  108823. "lsl r8, r8, #16\n\t"
  108824. "adds r5, r5, r8\n\t"
  108825. "adc r6, r6, r9\n\t"
  108826. #else
  108827. "umull r5, r6, r10, r12\n\t"
  108828. #endif
  108829. "mov r2, #0\n\t"
  108830. "mov r7, #0\n\t"
  108831. /* A[4] * A[15] */
  108832. "ldr r10, [%[a], #60]\n\t"
  108833. "ldr r12, [%[a], #16]\n\t"
  108834. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108835. "lsl r8, r10, #16\n\t"
  108836. "lsl r9, r12, #16\n\t"
  108837. "lsr r8, r8, #16\n\t"
  108838. "lsr r9, r9, #16\n\t"
  108839. "mul r9, r8, r9\n\t"
  108840. "adds r5, r5, r9\n\t"
  108841. "adcs r6, r6, #0\n\t"
  108842. "adc r7, r7, #0\n\t"
  108843. "lsr r9, r12, #16\n\t"
  108844. "mul r8, r9, r8\n\t"
  108845. "lsr r9, r8, #16\n\t"
  108846. "lsl r8, r8, #16\n\t"
  108847. "adds r5, r5, r8\n\t"
  108848. "adcs r6, r6, r9\n\t"
  108849. "adc r7, r7, #0\n\t"
  108850. "lsr r8, r10, #16\n\t"
  108851. "lsr r9, r12, #16\n\t"
  108852. "mul r9, r8, r9\n\t"
  108853. "adds r6, r6, r9\n\t"
  108854. "adc r7, r7, #0\n\t"
  108855. "lsl r9, r12, #16\n\t"
  108856. "lsr r9, r9, #16\n\t"
  108857. "mul r8, r9, r8\n\t"
  108858. "lsr r9, r8, #16\n\t"
  108859. "lsl r8, r8, #16\n\t"
  108860. "adds r5, r5, r8\n\t"
  108861. "adcs r6, r6, r9\n\t"
  108862. "adc r7, r7, #0\n\t"
  108863. #else
  108864. "umull r8, r9, r10, r12\n\t"
  108865. "adds r5, r5, r8\n\t"
  108866. "adcs r6, r6, r9\n\t"
  108867. "adc r7, r7, #0\n\t"
  108868. #endif
  108869. /* A[5] * A[14] */
  108870. "ldr r10, [%[a], #56]\n\t"
  108871. "ldr r12, [%[a], #20]\n\t"
  108872. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108873. "lsl r8, r10, #16\n\t"
  108874. "lsl r9, r12, #16\n\t"
  108875. "lsr r8, r8, #16\n\t"
  108876. "lsr r9, r9, #16\n\t"
  108877. "mul r9, r8, r9\n\t"
  108878. "adds r5, r5, r9\n\t"
  108879. "adcs r6, r6, #0\n\t"
  108880. "adc r7, r7, #0\n\t"
  108881. "lsr r9, r12, #16\n\t"
  108882. "mul r8, r9, r8\n\t"
  108883. "lsr r9, r8, #16\n\t"
  108884. "lsl r8, r8, #16\n\t"
  108885. "adds r5, r5, r8\n\t"
  108886. "adcs r6, r6, r9\n\t"
  108887. "adc r7, r7, #0\n\t"
  108888. "lsr r8, r10, #16\n\t"
  108889. "lsr r9, r12, #16\n\t"
  108890. "mul r9, r8, r9\n\t"
  108891. "adds r6, r6, r9\n\t"
  108892. "adc r7, r7, #0\n\t"
  108893. "lsl r9, r12, #16\n\t"
  108894. "lsr r9, r9, #16\n\t"
  108895. "mul r8, r9, r8\n\t"
  108896. "lsr r9, r8, #16\n\t"
  108897. "lsl r8, r8, #16\n\t"
  108898. "adds r5, r5, r8\n\t"
  108899. "adcs r6, r6, r9\n\t"
  108900. "adc r7, r7, #0\n\t"
  108901. #else
  108902. "umull r8, r9, r10, r12\n\t"
  108903. "adds r5, r5, r8\n\t"
  108904. "adcs r6, r6, r9\n\t"
  108905. "adc r7, r7, #0\n\t"
  108906. #endif
  108907. /* A[6] * A[13] */
  108908. "ldr r10, [%[a], #52]\n\t"
  108909. "ldr r12, [%[a], #24]\n\t"
  108910. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108911. "lsl r8, r10, #16\n\t"
  108912. "lsl r9, r12, #16\n\t"
  108913. "lsr r8, r8, #16\n\t"
  108914. "lsr r9, r9, #16\n\t"
  108915. "mul r9, r8, r9\n\t"
  108916. "adds r5, r5, r9\n\t"
  108917. "adcs r6, r6, #0\n\t"
  108918. "adc r7, r7, #0\n\t"
  108919. "lsr r9, r12, #16\n\t"
  108920. "mul r8, r9, r8\n\t"
  108921. "lsr r9, r8, #16\n\t"
  108922. "lsl r8, r8, #16\n\t"
  108923. "adds r5, r5, r8\n\t"
  108924. "adcs r6, r6, r9\n\t"
  108925. "adc r7, r7, #0\n\t"
  108926. "lsr r8, r10, #16\n\t"
  108927. "lsr r9, r12, #16\n\t"
  108928. "mul r9, r8, r9\n\t"
  108929. "adds r6, r6, r9\n\t"
  108930. "adc r7, r7, #0\n\t"
  108931. "lsl r9, r12, #16\n\t"
  108932. "lsr r9, r9, #16\n\t"
  108933. "mul r8, r9, r8\n\t"
  108934. "lsr r9, r8, #16\n\t"
  108935. "lsl r8, r8, #16\n\t"
  108936. "adds r5, r5, r8\n\t"
  108937. "adcs r6, r6, r9\n\t"
  108938. "adc r7, r7, #0\n\t"
  108939. #else
  108940. "umull r8, r9, r10, r12\n\t"
  108941. "adds r5, r5, r8\n\t"
  108942. "adcs r6, r6, r9\n\t"
  108943. "adc r7, r7, #0\n\t"
  108944. #endif
  108945. /* A[7] * A[12] */
  108946. "ldr r10, [%[a], #48]\n\t"
  108947. "ldr r12, [%[a], #28]\n\t"
  108948. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108949. "lsl r8, r10, #16\n\t"
  108950. "lsl r9, r12, #16\n\t"
  108951. "lsr r8, r8, #16\n\t"
  108952. "lsr r9, r9, #16\n\t"
  108953. "mul r9, r8, r9\n\t"
  108954. "adds r5, r5, r9\n\t"
  108955. "adcs r6, r6, #0\n\t"
  108956. "adc r7, r7, #0\n\t"
  108957. "lsr r9, r12, #16\n\t"
  108958. "mul r8, r9, r8\n\t"
  108959. "lsr r9, r8, #16\n\t"
  108960. "lsl r8, r8, #16\n\t"
  108961. "adds r5, r5, r8\n\t"
  108962. "adcs r6, r6, r9\n\t"
  108963. "adc r7, r7, #0\n\t"
  108964. "lsr r8, r10, #16\n\t"
  108965. "lsr r9, r12, #16\n\t"
  108966. "mul r9, r8, r9\n\t"
  108967. "adds r6, r6, r9\n\t"
  108968. "adc r7, r7, #0\n\t"
  108969. "lsl r9, r12, #16\n\t"
  108970. "lsr r9, r9, #16\n\t"
  108971. "mul r8, r9, r8\n\t"
  108972. "lsr r9, r8, #16\n\t"
  108973. "lsl r8, r8, #16\n\t"
  108974. "adds r5, r5, r8\n\t"
  108975. "adcs r6, r6, r9\n\t"
  108976. "adc r7, r7, #0\n\t"
  108977. #else
  108978. "umull r8, r9, r10, r12\n\t"
  108979. "adds r5, r5, r8\n\t"
  108980. "adcs r6, r6, r9\n\t"
  108981. "adc r7, r7, #0\n\t"
  108982. #endif
  108983. /* A[8] * A[11] */
  108984. "ldr r10, [%[a], #44]\n\t"
  108985. "ldr r12, [%[a], #32]\n\t"
  108986. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  108987. "lsl r8, r10, #16\n\t"
  108988. "lsl r9, r12, #16\n\t"
  108989. "lsr r8, r8, #16\n\t"
  108990. "lsr r9, r9, #16\n\t"
  108991. "mul r9, r8, r9\n\t"
  108992. "adds r5, r5, r9\n\t"
  108993. "adcs r6, r6, #0\n\t"
  108994. "adc r7, r7, #0\n\t"
  108995. "lsr r9, r12, #16\n\t"
  108996. "mul r8, r9, r8\n\t"
  108997. "lsr r9, r8, #16\n\t"
  108998. "lsl r8, r8, #16\n\t"
  108999. "adds r5, r5, r8\n\t"
  109000. "adcs r6, r6, r9\n\t"
  109001. "adc r7, r7, #0\n\t"
  109002. "lsr r8, r10, #16\n\t"
  109003. "lsr r9, r12, #16\n\t"
  109004. "mul r9, r8, r9\n\t"
  109005. "adds r6, r6, r9\n\t"
  109006. "adc r7, r7, #0\n\t"
  109007. "lsl r9, r12, #16\n\t"
  109008. "lsr r9, r9, #16\n\t"
  109009. "mul r8, r9, r8\n\t"
  109010. "lsr r9, r8, #16\n\t"
  109011. "lsl r8, r8, #16\n\t"
  109012. "adds r5, r5, r8\n\t"
  109013. "adcs r6, r6, r9\n\t"
  109014. "adc r7, r7, #0\n\t"
  109015. #else
  109016. "umull r8, r9, r10, r12\n\t"
  109017. "adds r5, r5, r8\n\t"
  109018. "adcs r6, r6, r9\n\t"
  109019. "adc r7, r7, #0\n\t"
  109020. #endif
  109021. /* A[9] * A[10] */
  109022. "ldr r10, [%[a], #40]\n\t"
  109023. "ldr r12, [%[a], #36]\n\t"
  109024. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109025. "lsl r8, r10, #16\n\t"
  109026. "lsl r9, r12, #16\n\t"
  109027. "lsr r8, r8, #16\n\t"
  109028. "lsr r9, r9, #16\n\t"
  109029. "mul r9, r8, r9\n\t"
  109030. "adds r5, r5, r9\n\t"
  109031. "adcs r6, r6, #0\n\t"
  109032. "adc r7, r7, #0\n\t"
  109033. "lsr r9, r12, #16\n\t"
  109034. "mul r8, r9, r8\n\t"
  109035. "lsr r9, r8, #16\n\t"
  109036. "lsl r8, r8, #16\n\t"
  109037. "adds r5, r5, r8\n\t"
  109038. "adcs r6, r6, r9\n\t"
  109039. "adc r7, r7, #0\n\t"
  109040. "lsr r8, r10, #16\n\t"
  109041. "lsr r9, r12, #16\n\t"
  109042. "mul r9, r8, r9\n\t"
  109043. "adds r6, r6, r9\n\t"
  109044. "adc r7, r7, #0\n\t"
  109045. "lsl r9, r12, #16\n\t"
  109046. "lsr r9, r9, #16\n\t"
  109047. "mul r8, r9, r8\n\t"
  109048. "lsr r9, r8, #16\n\t"
  109049. "lsl r8, r8, #16\n\t"
  109050. "adds r5, r5, r8\n\t"
  109051. "adcs r6, r6, r9\n\t"
  109052. "adc r7, r7, #0\n\t"
  109053. #else
  109054. "umull r8, r9, r10, r12\n\t"
  109055. "adds r5, r5, r8\n\t"
  109056. "adcs r6, r6, r9\n\t"
  109057. "adc r7, r7, #0\n\t"
  109058. #endif
  109059. "adds r5, r5, r5\n\t"
  109060. "adcs r6, r6, r6\n\t"
  109061. "adc r7, r7, r7\n\t"
  109062. "adds r3, r3, r5\n\t"
  109063. "adcs r4, r4, r6\n\t"
  109064. "adc r2, r2, r7\n\t"
  109065. "str r3, [%[r], #76]\n\t"
  109066. /* A[4] * A[16] */
  109067. "ldr r10, [%[a], #64]\n\t"
  109068. "ldr r12, [%[a], #16]\n\t"
  109069. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109070. "lsl r8, r10, #16\n\t"
  109071. "lsl r5, r12, #16\n\t"
  109072. "lsr r8, r8, #16\n\t"
  109073. "lsr r5, r5, #16\n\t"
  109074. "mul r5, r8, r5\n\t"
  109075. "lsr r9, r12, #16\n\t"
  109076. "mul r8, r9, r8\n\t"
  109077. "lsr r6, r8, #16\n\t"
  109078. "lsl r8, r8, #16\n\t"
  109079. "adds r5, r5, r8\n\t"
  109080. "adc r6, r6, #0\n\t"
  109081. "lsr r8, r10, #16\n\t"
  109082. "mul r9, r8, r9\n\t"
  109083. "add r6, r6, r9\n\t"
  109084. "lsl r9, r12, #16\n\t"
  109085. "lsr r9, r9, #16\n\t"
  109086. "mul r8, r9, r8\n\t"
  109087. "lsr r9, r8, #16\n\t"
  109088. "lsl r8, r8, #16\n\t"
  109089. "adds r5, r5, r8\n\t"
  109090. "adc r6, r6, r9\n\t"
  109091. #else
  109092. "umull r5, r6, r10, r12\n\t"
  109093. #endif
  109094. "mov r3, #0\n\t"
  109095. "mov r7, #0\n\t"
  109096. /* A[5] * A[15] */
  109097. "ldr r10, [%[a], #60]\n\t"
  109098. "ldr r12, [%[a], #20]\n\t"
  109099. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109100. "lsl r8, r10, #16\n\t"
  109101. "lsl r9, r12, #16\n\t"
  109102. "lsr r8, r8, #16\n\t"
  109103. "lsr r9, r9, #16\n\t"
  109104. "mul r9, r8, r9\n\t"
  109105. "adds r5, r5, r9\n\t"
  109106. "adcs r6, r6, #0\n\t"
  109107. "adc r7, r7, #0\n\t"
  109108. "lsr r9, r12, #16\n\t"
  109109. "mul r8, r9, r8\n\t"
  109110. "lsr r9, r8, #16\n\t"
  109111. "lsl r8, r8, #16\n\t"
  109112. "adds r5, r5, r8\n\t"
  109113. "adcs r6, r6, r9\n\t"
  109114. "adc r7, r7, #0\n\t"
  109115. "lsr r8, r10, #16\n\t"
  109116. "lsr r9, r12, #16\n\t"
  109117. "mul r9, r8, r9\n\t"
  109118. "adds r6, r6, r9\n\t"
  109119. "adc r7, r7, #0\n\t"
  109120. "lsl r9, r12, #16\n\t"
  109121. "lsr r9, r9, #16\n\t"
  109122. "mul r8, r9, r8\n\t"
  109123. "lsr r9, r8, #16\n\t"
  109124. "lsl r8, r8, #16\n\t"
  109125. "adds r5, r5, r8\n\t"
  109126. "adcs r6, r6, r9\n\t"
  109127. "adc r7, r7, #0\n\t"
  109128. #else
  109129. "umull r8, r9, r10, r12\n\t"
  109130. "adds r5, r5, r8\n\t"
  109131. "adcs r6, r6, r9\n\t"
  109132. "adc r7, r7, #0\n\t"
  109133. #endif
  109134. /* A[6] * A[14] */
  109135. "ldr r10, [%[a], #56]\n\t"
  109136. "ldr r12, [%[a], #24]\n\t"
  109137. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109138. "lsl r8, r10, #16\n\t"
  109139. "lsl r9, r12, #16\n\t"
  109140. "lsr r8, r8, #16\n\t"
  109141. "lsr r9, r9, #16\n\t"
  109142. "mul r9, r8, r9\n\t"
  109143. "adds r5, r5, r9\n\t"
  109144. "adcs r6, r6, #0\n\t"
  109145. "adc r7, r7, #0\n\t"
  109146. "lsr r9, r12, #16\n\t"
  109147. "mul r8, r9, r8\n\t"
  109148. "lsr r9, r8, #16\n\t"
  109149. "lsl r8, r8, #16\n\t"
  109150. "adds r5, r5, r8\n\t"
  109151. "adcs r6, r6, r9\n\t"
  109152. "adc r7, r7, #0\n\t"
  109153. "lsr r8, r10, #16\n\t"
  109154. "lsr r9, r12, #16\n\t"
  109155. "mul r9, r8, r9\n\t"
  109156. "adds r6, r6, r9\n\t"
  109157. "adc r7, r7, #0\n\t"
  109158. "lsl r9, r12, #16\n\t"
  109159. "lsr r9, r9, #16\n\t"
  109160. "mul r8, r9, r8\n\t"
  109161. "lsr r9, r8, #16\n\t"
  109162. "lsl r8, r8, #16\n\t"
  109163. "adds r5, r5, r8\n\t"
  109164. "adcs r6, r6, r9\n\t"
  109165. "adc r7, r7, #0\n\t"
  109166. #else
  109167. "umull r8, r9, r10, r12\n\t"
  109168. "adds r5, r5, r8\n\t"
  109169. "adcs r6, r6, r9\n\t"
  109170. "adc r7, r7, #0\n\t"
  109171. #endif
  109172. /* A[7] * A[13] */
  109173. "ldr r10, [%[a], #52]\n\t"
  109174. "ldr r12, [%[a], #28]\n\t"
  109175. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109176. "lsl r8, r10, #16\n\t"
  109177. "lsl r9, r12, #16\n\t"
  109178. "lsr r8, r8, #16\n\t"
  109179. "lsr r9, r9, #16\n\t"
  109180. "mul r9, r8, r9\n\t"
  109181. "adds r5, r5, r9\n\t"
  109182. "adcs r6, r6, #0\n\t"
  109183. "adc r7, r7, #0\n\t"
  109184. "lsr r9, r12, #16\n\t"
  109185. "mul r8, r9, r8\n\t"
  109186. "lsr r9, r8, #16\n\t"
  109187. "lsl r8, r8, #16\n\t"
  109188. "adds r5, r5, r8\n\t"
  109189. "adcs r6, r6, r9\n\t"
  109190. "adc r7, r7, #0\n\t"
  109191. "lsr r8, r10, #16\n\t"
  109192. "lsr r9, r12, #16\n\t"
  109193. "mul r9, r8, r9\n\t"
  109194. "adds r6, r6, r9\n\t"
  109195. "adc r7, r7, #0\n\t"
  109196. "lsl r9, r12, #16\n\t"
  109197. "lsr r9, r9, #16\n\t"
  109198. "mul r8, r9, r8\n\t"
  109199. "lsr r9, r8, #16\n\t"
  109200. "lsl r8, r8, #16\n\t"
  109201. "adds r5, r5, r8\n\t"
  109202. "adcs r6, r6, r9\n\t"
  109203. "adc r7, r7, #0\n\t"
  109204. #else
  109205. "umull r8, r9, r10, r12\n\t"
  109206. "adds r5, r5, r8\n\t"
  109207. "adcs r6, r6, r9\n\t"
  109208. "adc r7, r7, #0\n\t"
  109209. #endif
  109210. /* A[8] * A[12] */
  109211. "ldr r10, [%[a], #48]\n\t"
  109212. "ldr r12, [%[a], #32]\n\t"
  109213. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109214. "lsl r8, r10, #16\n\t"
  109215. "lsl r9, r12, #16\n\t"
  109216. "lsr r8, r8, #16\n\t"
  109217. "lsr r9, r9, #16\n\t"
  109218. "mul r9, r8, r9\n\t"
  109219. "adds r5, r5, r9\n\t"
  109220. "adcs r6, r6, #0\n\t"
  109221. "adc r7, r7, #0\n\t"
  109222. "lsr r9, r12, #16\n\t"
  109223. "mul r8, r9, r8\n\t"
  109224. "lsr r9, r8, #16\n\t"
  109225. "lsl r8, r8, #16\n\t"
  109226. "adds r5, r5, r8\n\t"
  109227. "adcs r6, r6, r9\n\t"
  109228. "adc r7, r7, #0\n\t"
  109229. "lsr r8, r10, #16\n\t"
  109230. "lsr r9, r12, #16\n\t"
  109231. "mul r9, r8, r9\n\t"
  109232. "adds r6, r6, r9\n\t"
  109233. "adc r7, r7, #0\n\t"
  109234. "lsl r9, r12, #16\n\t"
  109235. "lsr r9, r9, #16\n\t"
  109236. "mul r8, r9, r8\n\t"
  109237. "lsr r9, r8, #16\n\t"
  109238. "lsl r8, r8, #16\n\t"
  109239. "adds r5, r5, r8\n\t"
  109240. "adcs r6, r6, r9\n\t"
  109241. "adc r7, r7, #0\n\t"
  109242. #else
  109243. "umull r8, r9, r10, r12\n\t"
  109244. "adds r5, r5, r8\n\t"
  109245. "adcs r6, r6, r9\n\t"
  109246. "adc r7, r7, #0\n\t"
  109247. #endif
  109248. /* A[9] * A[11] */
  109249. "ldr r10, [%[a], #44]\n\t"
  109250. "ldr r12, [%[a], #36]\n\t"
  109251. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109252. "lsl r8, r10, #16\n\t"
  109253. "lsl r9, r12, #16\n\t"
  109254. "lsr r8, r8, #16\n\t"
  109255. "lsr r9, r9, #16\n\t"
  109256. "mul r9, r8, r9\n\t"
  109257. "adds r5, r5, r9\n\t"
  109258. "adcs r6, r6, #0\n\t"
  109259. "adc r7, r7, #0\n\t"
  109260. "lsr r9, r12, #16\n\t"
  109261. "mul r8, r9, r8\n\t"
  109262. "lsr r9, r8, #16\n\t"
  109263. "lsl r8, r8, #16\n\t"
  109264. "adds r5, r5, r8\n\t"
  109265. "adcs r6, r6, r9\n\t"
  109266. "adc r7, r7, #0\n\t"
  109267. "lsr r8, r10, #16\n\t"
  109268. "lsr r9, r12, #16\n\t"
  109269. "mul r9, r8, r9\n\t"
  109270. "adds r6, r6, r9\n\t"
  109271. "adc r7, r7, #0\n\t"
  109272. "lsl r9, r12, #16\n\t"
  109273. "lsr r9, r9, #16\n\t"
  109274. "mul r8, r9, r8\n\t"
  109275. "lsr r9, r8, #16\n\t"
  109276. "lsl r8, r8, #16\n\t"
  109277. "adds r5, r5, r8\n\t"
  109278. "adcs r6, r6, r9\n\t"
  109279. "adc r7, r7, #0\n\t"
  109280. #else
  109281. "umull r8, r9, r10, r12\n\t"
  109282. "adds r5, r5, r8\n\t"
  109283. "adcs r6, r6, r9\n\t"
  109284. "adc r7, r7, #0\n\t"
  109285. #endif
  109286. /* A[10] * A[10] */
  109287. "ldr r10, [%[a], #40]\n\t"
  109288. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109289. "lsl r8, r10, #16\n\t"
  109290. "lsr r9, r10, #16\n\t"
  109291. "lsr r8, r8, #16\n\t"
  109292. "mov r12, r8\n\t"
  109293. "mul r8, r12, r8\n\t"
  109294. "mov r12, r9\n\t"
  109295. "mul r9, r12, r9\n\t"
  109296. "adds r4, r4, r8\n\t"
  109297. "adcs r2, r2, r9\n\t"
  109298. "adc r3, r3, #0\n\t"
  109299. "lsr r9, r10, #16\n\t"
  109300. "lsl r8, r10, #16\n\t"
  109301. "lsr r8, r8, #16\n\t"
  109302. "mul r8, r9, r8\n\t"
  109303. "lsr r9, r8, #15\n\t"
  109304. "lsl r8, r8, #17\n\t"
  109305. "adds r4, r4, r8\n\t"
  109306. "adcs r2, r2, r9\n\t"
  109307. "adc r3, r3, #0\n\t"
  109308. "adds r5, r5, r5\n\t"
  109309. "adcs r6, r6, r6\n\t"
  109310. "adc r7, r7, r7\n\t"
  109311. #else
  109312. "umull r8, r9, r10, r10\n\t"
  109313. "adds r5, r5, r5\n\t"
  109314. "adcs r6, r6, r6\n\t"
  109315. "adc r7, r7, r7\n\t"
  109316. "adds r4, r4, r8\n\t"
  109317. "adcs r2, r2, r9\n\t"
  109318. "adc r3, r3, #0\n\t"
  109319. #endif
  109320. "adds r4, r4, r5\n\t"
  109321. "adcs r2, r2, r6\n\t"
  109322. "adc r3, r3, r7\n\t"
  109323. "str r4, [%[r], #80]\n\t"
  109324. /* A[5] * A[16] */
  109325. "ldr r10, [%[a], #64]\n\t"
  109326. "ldr r12, [%[a], #20]\n\t"
  109327. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109328. "lsl r8, r10, #16\n\t"
  109329. "lsl r5, r12, #16\n\t"
  109330. "lsr r8, r8, #16\n\t"
  109331. "lsr r5, r5, #16\n\t"
  109332. "mul r5, r8, r5\n\t"
  109333. "lsr r9, r12, #16\n\t"
  109334. "mul r8, r9, r8\n\t"
  109335. "lsr r6, r8, #16\n\t"
  109336. "lsl r8, r8, #16\n\t"
  109337. "adds r5, r5, r8\n\t"
  109338. "adc r6, r6, #0\n\t"
  109339. "lsr r8, r10, #16\n\t"
  109340. "mul r9, r8, r9\n\t"
  109341. "add r6, r6, r9\n\t"
  109342. "lsl r9, r12, #16\n\t"
  109343. "lsr r9, r9, #16\n\t"
  109344. "mul r8, r9, r8\n\t"
  109345. "lsr r9, r8, #16\n\t"
  109346. "lsl r8, r8, #16\n\t"
  109347. "adds r5, r5, r8\n\t"
  109348. "adc r6, r6, r9\n\t"
  109349. #else
  109350. "umull r5, r6, r10, r12\n\t"
  109351. #endif
  109352. "mov r4, #0\n\t"
  109353. "mov r7, #0\n\t"
  109354. /* A[6] * A[15] */
  109355. "ldr r10, [%[a], #60]\n\t"
  109356. "ldr r12, [%[a], #24]\n\t"
  109357. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109358. "lsl r8, r10, #16\n\t"
  109359. "lsl r9, r12, #16\n\t"
  109360. "lsr r8, r8, #16\n\t"
  109361. "lsr r9, r9, #16\n\t"
  109362. "mul r9, r8, r9\n\t"
  109363. "adds r5, r5, r9\n\t"
  109364. "adcs r6, r6, #0\n\t"
  109365. "adc r7, r7, #0\n\t"
  109366. "lsr r9, r12, #16\n\t"
  109367. "mul r8, r9, r8\n\t"
  109368. "lsr r9, r8, #16\n\t"
  109369. "lsl r8, r8, #16\n\t"
  109370. "adds r5, r5, r8\n\t"
  109371. "adcs r6, r6, r9\n\t"
  109372. "adc r7, r7, #0\n\t"
  109373. "lsr r8, r10, #16\n\t"
  109374. "lsr r9, r12, #16\n\t"
  109375. "mul r9, r8, r9\n\t"
  109376. "adds r6, r6, r9\n\t"
  109377. "adc r7, r7, #0\n\t"
  109378. "lsl r9, r12, #16\n\t"
  109379. "lsr r9, r9, #16\n\t"
  109380. "mul r8, r9, r8\n\t"
  109381. "lsr r9, r8, #16\n\t"
  109382. "lsl r8, r8, #16\n\t"
  109383. "adds r5, r5, r8\n\t"
  109384. "adcs r6, r6, r9\n\t"
  109385. "adc r7, r7, #0\n\t"
  109386. #else
  109387. "umull r8, r9, r10, r12\n\t"
  109388. "adds r5, r5, r8\n\t"
  109389. "adcs r6, r6, r9\n\t"
  109390. "adc r7, r7, #0\n\t"
  109391. #endif
  109392. /* A[7] * A[14] */
  109393. "ldr r10, [%[a], #56]\n\t"
  109394. "ldr r12, [%[a], #28]\n\t"
  109395. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109396. "lsl r8, r10, #16\n\t"
  109397. "lsl r9, r12, #16\n\t"
  109398. "lsr r8, r8, #16\n\t"
  109399. "lsr r9, r9, #16\n\t"
  109400. "mul r9, r8, r9\n\t"
  109401. "adds r5, r5, r9\n\t"
  109402. "adcs r6, r6, #0\n\t"
  109403. "adc r7, r7, #0\n\t"
  109404. "lsr r9, r12, #16\n\t"
  109405. "mul r8, r9, r8\n\t"
  109406. "lsr r9, r8, #16\n\t"
  109407. "lsl r8, r8, #16\n\t"
  109408. "adds r5, r5, r8\n\t"
  109409. "adcs r6, r6, r9\n\t"
  109410. "adc r7, r7, #0\n\t"
  109411. "lsr r8, r10, #16\n\t"
  109412. "lsr r9, r12, #16\n\t"
  109413. "mul r9, r8, r9\n\t"
  109414. "adds r6, r6, r9\n\t"
  109415. "adc r7, r7, #0\n\t"
  109416. "lsl r9, r12, #16\n\t"
  109417. "lsr r9, r9, #16\n\t"
  109418. "mul r8, r9, r8\n\t"
  109419. "lsr r9, r8, #16\n\t"
  109420. "lsl r8, r8, #16\n\t"
  109421. "adds r5, r5, r8\n\t"
  109422. "adcs r6, r6, r9\n\t"
  109423. "adc r7, r7, #0\n\t"
  109424. #else
  109425. "umull r8, r9, r10, r12\n\t"
  109426. "adds r5, r5, r8\n\t"
  109427. "adcs r6, r6, r9\n\t"
  109428. "adc r7, r7, #0\n\t"
  109429. #endif
  109430. /* A[8] * A[13] */
  109431. "ldr r10, [%[a], #52]\n\t"
  109432. "ldr r12, [%[a], #32]\n\t"
  109433. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109434. "lsl r8, r10, #16\n\t"
  109435. "lsl r9, r12, #16\n\t"
  109436. "lsr r8, r8, #16\n\t"
  109437. "lsr r9, r9, #16\n\t"
  109438. "mul r9, r8, r9\n\t"
  109439. "adds r5, r5, r9\n\t"
  109440. "adcs r6, r6, #0\n\t"
  109441. "adc r7, r7, #0\n\t"
  109442. "lsr r9, r12, #16\n\t"
  109443. "mul r8, r9, r8\n\t"
  109444. "lsr r9, r8, #16\n\t"
  109445. "lsl r8, r8, #16\n\t"
  109446. "adds r5, r5, r8\n\t"
  109447. "adcs r6, r6, r9\n\t"
  109448. "adc r7, r7, #0\n\t"
  109449. "lsr r8, r10, #16\n\t"
  109450. "lsr r9, r12, #16\n\t"
  109451. "mul r9, r8, r9\n\t"
  109452. "adds r6, r6, r9\n\t"
  109453. "adc r7, r7, #0\n\t"
  109454. "lsl r9, r12, #16\n\t"
  109455. "lsr r9, r9, #16\n\t"
  109456. "mul r8, r9, r8\n\t"
  109457. "lsr r9, r8, #16\n\t"
  109458. "lsl r8, r8, #16\n\t"
  109459. "adds r5, r5, r8\n\t"
  109460. "adcs r6, r6, r9\n\t"
  109461. "adc r7, r7, #0\n\t"
  109462. #else
  109463. "umull r8, r9, r10, r12\n\t"
  109464. "adds r5, r5, r8\n\t"
  109465. "adcs r6, r6, r9\n\t"
  109466. "adc r7, r7, #0\n\t"
  109467. #endif
  109468. /* A[9] * A[12] */
  109469. "ldr r10, [%[a], #48]\n\t"
  109470. "ldr r12, [%[a], #36]\n\t"
  109471. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109472. "lsl r8, r10, #16\n\t"
  109473. "lsl r9, r12, #16\n\t"
  109474. "lsr r8, r8, #16\n\t"
  109475. "lsr r9, r9, #16\n\t"
  109476. "mul r9, r8, r9\n\t"
  109477. "adds r5, r5, r9\n\t"
  109478. "adcs r6, r6, #0\n\t"
  109479. "adc r7, r7, #0\n\t"
  109480. "lsr r9, r12, #16\n\t"
  109481. "mul r8, r9, r8\n\t"
  109482. "lsr r9, r8, #16\n\t"
  109483. "lsl r8, r8, #16\n\t"
  109484. "adds r5, r5, r8\n\t"
  109485. "adcs r6, r6, r9\n\t"
  109486. "adc r7, r7, #0\n\t"
  109487. "lsr r8, r10, #16\n\t"
  109488. "lsr r9, r12, #16\n\t"
  109489. "mul r9, r8, r9\n\t"
  109490. "adds r6, r6, r9\n\t"
  109491. "adc r7, r7, #0\n\t"
  109492. "lsl r9, r12, #16\n\t"
  109493. "lsr r9, r9, #16\n\t"
  109494. "mul r8, r9, r8\n\t"
  109495. "lsr r9, r8, #16\n\t"
  109496. "lsl r8, r8, #16\n\t"
  109497. "adds r5, r5, r8\n\t"
  109498. "adcs r6, r6, r9\n\t"
  109499. "adc r7, r7, #0\n\t"
  109500. #else
  109501. "umull r8, r9, r10, r12\n\t"
  109502. "adds r5, r5, r8\n\t"
  109503. "adcs r6, r6, r9\n\t"
  109504. "adc r7, r7, #0\n\t"
  109505. #endif
  109506. /* A[10] * A[11] */
  109507. "ldr r10, [%[a], #44]\n\t"
  109508. "ldr r12, [%[a], #40]\n\t"
  109509. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109510. "lsl r8, r10, #16\n\t"
  109511. "lsl r9, r12, #16\n\t"
  109512. "lsr r8, r8, #16\n\t"
  109513. "lsr r9, r9, #16\n\t"
  109514. "mul r9, r8, r9\n\t"
  109515. "adds r5, r5, r9\n\t"
  109516. "adcs r6, r6, #0\n\t"
  109517. "adc r7, r7, #0\n\t"
  109518. "lsr r9, r12, #16\n\t"
  109519. "mul r8, r9, r8\n\t"
  109520. "lsr r9, r8, #16\n\t"
  109521. "lsl r8, r8, #16\n\t"
  109522. "adds r5, r5, r8\n\t"
  109523. "adcs r6, r6, r9\n\t"
  109524. "adc r7, r7, #0\n\t"
  109525. "lsr r8, r10, #16\n\t"
  109526. "lsr r9, r12, #16\n\t"
  109527. "mul r9, r8, r9\n\t"
  109528. "adds r6, r6, r9\n\t"
  109529. "adc r7, r7, #0\n\t"
  109530. "lsl r9, r12, #16\n\t"
  109531. "lsr r9, r9, #16\n\t"
  109532. "mul r8, r9, r8\n\t"
  109533. "lsr r9, r8, #16\n\t"
  109534. "lsl r8, r8, #16\n\t"
  109535. "adds r5, r5, r8\n\t"
  109536. "adcs r6, r6, r9\n\t"
  109537. "adc r7, r7, #0\n\t"
  109538. #else
  109539. "umull r8, r9, r10, r12\n\t"
  109540. "adds r5, r5, r8\n\t"
  109541. "adcs r6, r6, r9\n\t"
  109542. "adc r7, r7, #0\n\t"
  109543. #endif
  109544. "adds r5, r5, r5\n\t"
  109545. "adcs r6, r6, r6\n\t"
  109546. "adc r7, r7, r7\n\t"
  109547. "adds r2, r2, r5\n\t"
  109548. "adcs r3, r3, r6\n\t"
  109549. "adc r4, r4, r7\n\t"
  109550. "str r2, [%[r], #84]\n\t"
  109551. /* A[6] * A[16] */
  109552. "ldr r10, [%[a], #64]\n\t"
  109553. "ldr r12, [%[a], #24]\n\t"
  109554. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109555. "lsl r8, r10, #16\n\t"
  109556. "lsl r5, r12, #16\n\t"
  109557. "lsr r8, r8, #16\n\t"
  109558. "lsr r5, r5, #16\n\t"
  109559. "mul r5, r8, r5\n\t"
  109560. "lsr r9, r12, #16\n\t"
  109561. "mul r8, r9, r8\n\t"
  109562. "lsr r6, r8, #16\n\t"
  109563. "lsl r8, r8, #16\n\t"
  109564. "adds r5, r5, r8\n\t"
  109565. "adc r6, r6, #0\n\t"
  109566. "lsr r8, r10, #16\n\t"
  109567. "mul r9, r8, r9\n\t"
  109568. "add r6, r6, r9\n\t"
  109569. "lsl r9, r12, #16\n\t"
  109570. "lsr r9, r9, #16\n\t"
  109571. "mul r8, r9, r8\n\t"
  109572. "lsr r9, r8, #16\n\t"
  109573. "lsl r8, r8, #16\n\t"
  109574. "adds r5, r5, r8\n\t"
  109575. "adc r6, r6, r9\n\t"
  109576. #else
  109577. "umull r5, r6, r10, r12\n\t"
  109578. #endif
  109579. "mov r2, #0\n\t"
  109580. "mov r7, #0\n\t"
  109581. /* A[7] * A[15] */
  109582. "ldr r10, [%[a], #60]\n\t"
  109583. "ldr r12, [%[a], #28]\n\t"
  109584. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109585. "lsl r8, r10, #16\n\t"
  109586. "lsl r9, r12, #16\n\t"
  109587. "lsr r8, r8, #16\n\t"
  109588. "lsr r9, r9, #16\n\t"
  109589. "mul r9, r8, r9\n\t"
  109590. "adds r5, r5, r9\n\t"
  109591. "adcs r6, r6, #0\n\t"
  109592. "adc r7, r7, #0\n\t"
  109593. "lsr r9, r12, #16\n\t"
  109594. "mul r8, r9, r8\n\t"
  109595. "lsr r9, r8, #16\n\t"
  109596. "lsl r8, r8, #16\n\t"
  109597. "adds r5, r5, r8\n\t"
  109598. "adcs r6, r6, r9\n\t"
  109599. "adc r7, r7, #0\n\t"
  109600. "lsr r8, r10, #16\n\t"
  109601. "lsr r9, r12, #16\n\t"
  109602. "mul r9, r8, r9\n\t"
  109603. "adds r6, r6, r9\n\t"
  109604. "adc r7, r7, #0\n\t"
  109605. "lsl r9, r12, #16\n\t"
  109606. "lsr r9, r9, #16\n\t"
  109607. "mul r8, r9, r8\n\t"
  109608. "lsr r9, r8, #16\n\t"
  109609. "lsl r8, r8, #16\n\t"
  109610. "adds r5, r5, r8\n\t"
  109611. "adcs r6, r6, r9\n\t"
  109612. "adc r7, r7, #0\n\t"
  109613. #else
  109614. "umull r8, r9, r10, r12\n\t"
  109615. "adds r5, r5, r8\n\t"
  109616. "adcs r6, r6, r9\n\t"
  109617. "adc r7, r7, #0\n\t"
  109618. #endif
  109619. /* A[8] * A[14] */
  109620. "ldr r10, [%[a], #56]\n\t"
  109621. "ldr r12, [%[a], #32]\n\t"
  109622. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109623. "lsl r8, r10, #16\n\t"
  109624. "lsl r9, r12, #16\n\t"
  109625. "lsr r8, r8, #16\n\t"
  109626. "lsr r9, r9, #16\n\t"
  109627. "mul r9, r8, r9\n\t"
  109628. "adds r5, r5, r9\n\t"
  109629. "adcs r6, r6, #0\n\t"
  109630. "adc r7, r7, #0\n\t"
  109631. "lsr r9, r12, #16\n\t"
  109632. "mul r8, r9, r8\n\t"
  109633. "lsr r9, r8, #16\n\t"
  109634. "lsl r8, r8, #16\n\t"
  109635. "adds r5, r5, r8\n\t"
  109636. "adcs r6, r6, r9\n\t"
  109637. "adc r7, r7, #0\n\t"
  109638. "lsr r8, r10, #16\n\t"
  109639. "lsr r9, r12, #16\n\t"
  109640. "mul r9, r8, r9\n\t"
  109641. "adds r6, r6, r9\n\t"
  109642. "adc r7, r7, #0\n\t"
  109643. "lsl r9, r12, #16\n\t"
  109644. "lsr r9, r9, #16\n\t"
  109645. "mul r8, r9, r8\n\t"
  109646. "lsr r9, r8, #16\n\t"
  109647. "lsl r8, r8, #16\n\t"
  109648. "adds r5, r5, r8\n\t"
  109649. "adcs r6, r6, r9\n\t"
  109650. "adc r7, r7, #0\n\t"
  109651. #else
  109652. "umull r8, r9, r10, r12\n\t"
  109653. "adds r5, r5, r8\n\t"
  109654. "adcs r6, r6, r9\n\t"
  109655. "adc r7, r7, #0\n\t"
  109656. #endif
  109657. /* A[9] * A[13] */
  109658. "ldr r10, [%[a], #52]\n\t"
  109659. "ldr r12, [%[a], #36]\n\t"
  109660. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109661. "lsl r8, r10, #16\n\t"
  109662. "lsl r9, r12, #16\n\t"
  109663. "lsr r8, r8, #16\n\t"
  109664. "lsr r9, r9, #16\n\t"
  109665. "mul r9, r8, r9\n\t"
  109666. "adds r5, r5, r9\n\t"
  109667. "adcs r6, r6, #0\n\t"
  109668. "adc r7, r7, #0\n\t"
  109669. "lsr r9, r12, #16\n\t"
  109670. "mul r8, r9, r8\n\t"
  109671. "lsr r9, r8, #16\n\t"
  109672. "lsl r8, r8, #16\n\t"
  109673. "adds r5, r5, r8\n\t"
  109674. "adcs r6, r6, r9\n\t"
  109675. "adc r7, r7, #0\n\t"
  109676. "lsr r8, r10, #16\n\t"
  109677. "lsr r9, r12, #16\n\t"
  109678. "mul r9, r8, r9\n\t"
  109679. "adds r6, r6, r9\n\t"
  109680. "adc r7, r7, #0\n\t"
  109681. "lsl r9, r12, #16\n\t"
  109682. "lsr r9, r9, #16\n\t"
  109683. "mul r8, r9, r8\n\t"
  109684. "lsr r9, r8, #16\n\t"
  109685. "lsl r8, r8, #16\n\t"
  109686. "adds r5, r5, r8\n\t"
  109687. "adcs r6, r6, r9\n\t"
  109688. "adc r7, r7, #0\n\t"
  109689. #else
  109690. "umull r8, r9, r10, r12\n\t"
  109691. "adds r5, r5, r8\n\t"
  109692. "adcs r6, r6, r9\n\t"
  109693. "adc r7, r7, #0\n\t"
  109694. #endif
  109695. /* A[10] * A[12] */
  109696. "ldr r10, [%[a], #48]\n\t"
  109697. "ldr r12, [%[a], #40]\n\t"
  109698. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109699. "lsl r8, r10, #16\n\t"
  109700. "lsl r9, r12, #16\n\t"
  109701. "lsr r8, r8, #16\n\t"
  109702. "lsr r9, r9, #16\n\t"
  109703. "mul r9, r8, r9\n\t"
  109704. "adds r5, r5, r9\n\t"
  109705. "adcs r6, r6, #0\n\t"
  109706. "adc r7, r7, #0\n\t"
  109707. "lsr r9, r12, #16\n\t"
  109708. "mul r8, r9, r8\n\t"
  109709. "lsr r9, r8, #16\n\t"
  109710. "lsl r8, r8, #16\n\t"
  109711. "adds r5, r5, r8\n\t"
  109712. "adcs r6, r6, r9\n\t"
  109713. "adc r7, r7, #0\n\t"
  109714. "lsr r8, r10, #16\n\t"
  109715. "lsr r9, r12, #16\n\t"
  109716. "mul r9, r8, r9\n\t"
  109717. "adds r6, r6, r9\n\t"
  109718. "adc r7, r7, #0\n\t"
  109719. "lsl r9, r12, #16\n\t"
  109720. "lsr r9, r9, #16\n\t"
  109721. "mul r8, r9, r8\n\t"
  109722. "lsr r9, r8, #16\n\t"
  109723. "lsl r8, r8, #16\n\t"
  109724. "adds r5, r5, r8\n\t"
  109725. "adcs r6, r6, r9\n\t"
  109726. "adc r7, r7, #0\n\t"
  109727. #else
  109728. "umull r8, r9, r10, r12\n\t"
  109729. "adds r5, r5, r8\n\t"
  109730. "adcs r6, r6, r9\n\t"
  109731. "adc r7, r7, #0\n\t"
  109732. #endif
  109733. /* A[11] * A[11] */
  109734. "ldr r10, [%[a], #44]\n\t"
  109735. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109736. "lsl r8, r10, #16\n\t"
  109737. "lsr r9, r10, #16\n\t"
  109738. "lsr r8, r8, #16\n\t"
  109739. "mov r12, r8\n\t"
  109740. "mul r8, r12, r8\n\t"
  109741. "mov r12, r9\n\t"
  109742. "mul r9, r12, r9\n\t"
  109743. "adds r3, r3, r8\n\t"
  109744. "adcs r4, r4, r9\n\t"
  109745. "adc r2, r2, #0\n\t"
  109746. "lsr r9, r10, #16\n\t"
  109747. "lsl r8, r10, #16\n\t"
  109748. "lsr r8, r8, #16\n\t"
  109749. "mul r8, r9, r8\n\t"
  109750. "lsr r9, r8, #15\n\t"
  109751. "lsl r8, r8, #17\n\t"
  109752. "adds r3, r3, r8\n\t"
  109753. "adcs r4, r4, r9\n\t"
  109754. "adc r2, r2, #0\n\t"
  109755. "adds r5, r5, r5\n\t"
  109756. "adcs r6, r6, r6\n\t"
  109757. "adc r7, r7, r7\n\t"
  109758. #else
  109759. "umull r8, r9, r10, r10\n\t"
  109760. "adds r5, r5, r5\n\t"
  109761. "adcs r6, r6, r6\n\t"
  109762. "adc r7, r7, r7\n\t"
  109763. "adds r3, r3, r8\n\t"
  109764. "adcs r4, r4, r9\n\t"
  109765. "adc r2, r2, #0\n\t"
  109766. #endif
  109767. "adds r3, r3, r5\n\t"
  109768. "adcs r4, r4, r6\n\t"
  109769. "adc r2, r2, r7\n\t"
  109770. "str r3, [%[r], #88]\n\t"
  109771. /* A[7] * A[16] */
  109772. "ldr r10, [%[a], #64]\n\t"
  109773. "ldr r12, [%[a], #28]\n\t"
  109774. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109775. "lsl r8, r10, #16\n\t"
  109776. "lsl r5, r12, #16\n\t"
  109777. "lsr r8, r8, #16\n\t"
  109778. "lsr r5, r5, #16\n\t"
  109779. "mul r5, r8, r5\n\t"
  109780. "lsr r9, r12, #16\n\t"
  109781. "mul r8, r9, r8\n\t"
  109782. "lsr r6, r8, #16\n\t"
  109783. "lsl r8, r8, #16\n\t"
  109784. "adds r5, r5, r8\n\t"
  109785. "adc r6, r6, #0\n\t"
  109786. "lsr r8, r10, #16\n\t"
  109787. "mul r9, r8, r9\n\t"
  109788. "add r6, r6, r9\n\t"
  109789. "lsl r9, r12, #16\n\t"
  109790. "lsr r9, r9, #16\n\t"
  109791. "mul r8, r9, r8\n\t"
  109792. "lsr r9, r8, #16\n\t"
  109793. "lsl r8, r8, #16\n\t"
  109794. "adds r5, r5, r8\n\t"
  109795. "adc r6, r6, r9\n\t"
  109796. #else
  109797. "umull r5, r6, r10, r12\n\t"
  109798. #endif
  109799. "mov r3, #0\n\t"
  109800. "mov r7, #0\n\t"
  109801. /* A[8] * A[15] */
  109802. "ldr r10, [%[a], #60]\n\t"
  109803. "ldr r12, [%[a], #32]\n\t"
  109804. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109805. "lsl r8, r10, #16\n\t"
  109806. "lsl r9, r12, #16\n\t"
  109807. "lsr r8, r8, #16\n\t"
  109808. "lsr r9, r9, #16\n\t"
  109809. "mul r9, r8, r9\n\t"
  109810. "adds r5, r5, r9\n\t"
  109811. "adcs r6, r6, #0\n\t"
  109812. "adc r7, r7, #0\n\t"
  109813. "lsr r9, r12, #16\n\t"
  109814. "mul r8, r9, r8\n\t"
  109815. "lsr r9, r8, #16\n\t"
  109816. "lsl r8, r8, #16\n\t"
  109817. "adds r5, r5, r8\n\t"
  109818. "adcs r6, r6, r9\n\t"
  109819. "adc r7, r7, #0\n\t"
  109820. "lsr r8, r10, #16\n\t"
  109821. "lsr r9, r12, #16\n\t"
  109822. "mul r9, r8, r9\n\t"
  109823. "adds r6, r6, r9\n\t"
  109824. "adc r7, r7, #0\n\t"
  109825. "lsl r9, r12, #16\n\t"
  109826. "lsr r9, r9, #16\n\t"
  109827. "mul r8, r9, r8\n\t"
  109828. "lsr r9, r8, #16\n\t"
  109829. "lsl r8, r8, #16\n\t"
  109830. "adds r5, r5, r8\n\t"
  109831. "adcs r6, r6, r9\n\t"
  109832. "adc r7, r7, #0\n\t"
  109833. #else
  109834. "umull r8, r9, r10, r12\n\t"
  109835. "adds r5, r5, r8\n\t"
  109836. "adcs r6, r6, r9\n\t"
  109837. "adc r7, r7, #0\n\t"
  109838. #endif
  109839. /* A[9] * A[14] */
  109840. "ldr r10, [%[a], #56]\n\t"
  109841. "ldr r12, [%[a], #36]\n\t"
  109842. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109843. "lsl r8, r10, #16\n\t"
  109844. "lsl r9, r12, #16\n\t"
  109845. "lsr r8, r8, #16\n\t"
  109846. "lsr r9, r9, #16\n\t"
  109847. "mul r9, r8, r9\n\t"
  109848. "adds r5, r5, r9\n\t"
  109849. "adcs r6, r6, #0\n\t"
  109850. "adc r7, r7, #0\n\t"
  109851. "lsr r9, r12, #16\n\t"
  109852. "mul r8, r9, r8\n\t"
  109853. "lsr r9, r8, #16\n\t"
  109854. "lsl r8, r8, #16\n\t"
  109855. "adds r5, r5, r8\n\t"
  109856. "adcs r6, r6, r9\n\t"
  109857. "adc r7, r7, #0\n\t"
  109858. "lsr r8, r10, #16\n\t"
  109859. "lsr r9, r12, #16\n\t"
  109860. "mul r9, r8, r9\n\t"
  109861. "adds r6, r6, r9\n\t"
  109862. "adc r7, r7, #0\n\t"
  109863. "lsl r9, r12, #16\n\t"
  109864. "lsr r9, r9, #16\n\t"
  109865. "mul r8, r9, r8\n\t"
  109866. "lsr r9, r8, #16\n\t"
  109867. "lsl r8, r8, #16\n\t"
  109868. "adds r5, r5, r8\n\t"
  109869. "adcs r6, r6, r9\n\t"
  109870. "adc r7, r7, #0\n\t"
  109871. #else
  109872. "umull r8, r9, r10, r12\n\t"
  109873. "adds r5, r5, r8\n\t"
  109874. "adcs r6, r6, r9\n\t"
  109875. "adc r7, r7, #0\n\t"
  109876. #endif
  109877. /* A[10] * A[13] */
  109878. "ldr r10, [%[a], #52]\n\t"
  109879. "ldr r12, [%[a], #40]\n\t"
  109880. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109881. "lsl r8, r10, #16\n\t"
  109882. "lsl r9, r12, #16\n\t"
  109883. "lsr r8, r8, #16\n\t"
  109884. "lsr r9, r9, #16\n\t"
  109885. "mul r9, r8, r9\n\t"
  109886. "adds r5, r5, r9\n\t"
  109887. "adcs r6, r6, #0\n\t"
  109888. "adc r7, r7, #0\n\t"
  109889. "lsr r9, r12, #16\n\t"
  109890. "mul r8, r9, r8\n\t"
  109891. "lsr r9, r8, #16\n\t"
  109892. "lsl r8, r8, #16\n\t"
  109893. "adds r5, r5, r8\n\t"
  109894. "adcs r6, r6, r9\n\t"
  109895. "adc r7, r7, #0\n\t"
  109896. "lsr r8, r10, #16\n\t"
  109897. "lsr r9, r12, #16\n\t"
  109898. "mul r9, r8, r9\n\t"
  109899. "adds r6, r6, r9\n\t"
  109900. "adc r7, r7, #0\n\t"
  109901. "lsl r9, r12, #16\n\t"
  109902. "lsr r9, r9, #16\n\t"
  109903. "mul r8, r9, r8\n\t"
  109904. "lsr r9, r8, #16\n\t"
  109905. "lsl r8, r8, #16\n\t"
  109906. "adds r5, r5, r8\n\t"
  109907. "adcs r6, r6, r9\n\t"
  109908. "adc r7, r7, #0\n\t"
  109909. #else
  109910. "umull r8, r9, r10, r12\n\t"
  109911. "adds r5, r5, r8\n\t"
  109912. "adcs r6, r6, r9\n\t"
  109913. "adc r7, r7, #0\n\t"
  109914. #endif
  109915. /* A[11] * A[12] */
  109916. "ldr r10, [%[a], #48]\n\t"
  109917. "ldr r12, [%[a], #44]\n\t"
  109918. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109919. "lsl r8, r10, #16\n\t"
  109920. "lsl r9, r12, #16\n\t"
  109921. "lsr r8, r8, #16\n\t"
  109922. "lsr r9, r9, #16\n\t"
  109923. "mul r9, r8, r9\n\t"
  109924. "adds r5, r5, r9\n\t"
  109925. "adcs r6, r6, #0\n\t"
  109926. "adc r7, r7, #0\n\t"
  109927. "lsr r9, r12, #16\n\t"
  109928. "mul r8, r9, r8\n\t"
  109929. "lsr r9, r8, #16\n\t"
  109930. "lsl r8, r8, #16\n\t"
  109931. "adds r5, r5, r8\n\t"
  109932. "adcs r6, r6, r9\n\t"
  109933. "adc r7, r7, #0\n\t"
  109934. "lsr r8, r10, #16\n\t"
  109935. "lsr r9, r12, #16\n\t"
  109936. "mul r9, r8, r9\n\t"
  109937. "adds r6, r6, r9\n\t"
  109938. "adc r7, r7, #0\n\t"
  109939. "lsl r9, r12, #16\n\t"
  109940. "lsr r9, r9, #16\n\t"
  109941. "mul r8, r9, r8\n\t"
  109942. "lsr r9, r8, #16\n\t"
  109943. "lsl r8, r8, #16\n\t"
  109944. "adds r5, r5, r8\n\t"
  109945. "adcs r6, r6, r9\n\t"
  109946. "adc r7, r7, #0\n\t"
  109947. #else
  109948. "umull r8, r9, r10, r12\n\t"
  109949. "adds r5, r5, r8\n\t"
  109950. "adcs r6, r6, r9\n\t"
  109951. "adc r7, r7, #0\n\t"
  109952. #endif
  109953. "adds r5, r5, r5\n\t"
  109954. "adcs r6, r6, r6\n\t"
  109955. "adc r7, r7, r7\n\t"
  109956. "adds r4, r4, r5\n\t"
  109957. "adcs r2, r2, r6\n\t"
  109958. "adc r3, r3, r7\n\t"
  109959. "str r4, [%[r], #92]\n\t"
  109960. /* A[8] * A[16] */
  109961. "ldr r10, [%[a], #64]\n\t"
  109962. "ldr r12, [%[a], #32]\n\t"
  109963. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109964. "lsl r8, r10, #16\n\t"
  109965. "lsl r5, r12, #16\n\t"
  109966. "lsr r8, r8, #16\n\t"
  109967. "lsr r5, r5, #16\n\t"
  109968. "mul r5, r8, r5\n\t"
  109969. "lsr r9, r12, #16\n\t"
  109970. "mul r8, r9, r8\n\t"
  109971. "lsr r6, r8, #16\n\t"
  109972. "lsl r8, r8, #16\n\t"
  109973. "adds r5, r5, r8\n\t"
  109974. "adc r6, r6, #0\n\t"
  109975. "lsr r8, r10, #16\n\t"
  109976. "mul r9, r8, r9\n\t"
  109977. "add r6, r6, r9\n\t"
  109978. "lsl r9, r12, #16\n\t"
  109979. "lsr r9, r9, #16\n\t"
  109980. "mul r8, r9, r8\n\t"
  109981. "lsr r9, r8, #16\n\t"
  109982. "lsl r8, r8, #16\n\t"
  109983. "adds r5, r5, r8\n\t"
  109984. "adc r6, r6, r9\n\t"
  109985. #else
  109986. "umull r5, r6, r10, r12\n\t"
  109987. #endif
  109988. "mov r4, #0\n\t"
  109989. "mov r7, #0\n\t"
  109990. /* A[9] * A[15] */
  109991. "ldr r10, [%[a], #60]\n\t"
  109992. "ldr r12, [%[a], #36]\n\t"
  109993. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  109994. "lsl r8, r10, #16\n\t"
  109995. "lsl r9, r12, #16\n\t"
  109996. "lsr r8, r8, #16\n\t"
  109997. "lsr r9, r9, #16\n\t"
  109998. "mul r9, r8, r9\n\t"
  109999. "adds r5, r5, r9\n\t"
  110000. "adcs r6, r6, #0\n\t"
  110001. "adc r7, r7, #0\n\t"
  110002. "lsr r9, r12, #16\n\t"
  110003. "mul r8, r9, r8\n\t"
  110004. "lsr r9, r8, #16\n\t"
  110005. "lsl r8, r8, #16\n\t"
  110006. "adds r5, r5, r8\n\t"
  110007. "adcs r6, r6, r9\n\t"
  110008. "adc r7, r7, #0\n\t"
  110009. "lsr r8, r10, #16\n\t"
  110010. "lsr r9, r12, #16\n\t"
  110011. "mul r9, r8, r9\n\t"
  110012. "adds r6, r6, r9\n\t"
  110013. "adc r7, r7, #0\n\t"
  110014. "lsl r9, r12, #16\n\t"
  110015. "lsr r9, r9, #16\n\t"
  110016. "mul r8, r9, r8\n\t"
  110017. "lsr r9, r8, #16\n\t"
  110018. "lsl r8, r8, #16\n\t"
  110019. "adds r5, r5, r8\n\t"
  110020. "adcs r6, r6, r9\n\t"
  110021. "adc r7, r7, #0\n\t"
  110022. #else
  110023. "umull r8, r9, r10, r12\n\t"
  110024. "adds r5, r5, r8\n\t"
  110025. "adcs r6, r6, r9\n\t"
  110026. "adc r7, r7, #0\n\t"
  110027. #endif
  110028. /* A[10] * A[14] */
  110029. "ldr r10, [%[a], #56]\n\t"
  110030. "ldr r12, [%[a], #40]\n\t"
  110031. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110032. "lsl r8, r10, #16\n\t"
  110033. "lsl r9, r12, #16\n\t"
  110034. "lsr r8, r8, #16\n\t"
  110035. "lsr r9, r9, #16\n\t"
  110036. "mul r9, r8, r9\n\t"
  110037. "adds r5, r5, r9\n\t"
  110038. "adcs r6, r6, #0\n\t"
  110039. "adc r7, r7, #0\n\t"
  110040. "lsr r9, r12, #16\n\t"
  110041. "mul r8, r9, r8\n\t"
  110042. "lsr r9, r8, #16\n\t"
  110043. "lsl r8, r8, #16\n\t"
  110044. "adds r5, r5, r8\n\t"
  110045. "adcs r6, r6, r9\n\t"
  110046. "adc r7, r7, #0\n\t"
  110047. "lsr r8, r10, #16\n\t"
  110048. "lsr r9, r12, #16\n\t"
  110049. "mul r9, r8, r9\n\t"
  110050. "adds r6, r6, r9\n\t"
  110051. "adc r7, r7, #0\n\t"
  110052. "lsl r9, r12, #16\n\t"
  110053. "lsr r9, r9, #16\n\t"
  110054. "mul r8, r9, r8\n\t"
  110055. "lsr r9, r8, #16\n\t"
  110056. "lsl r8, r8, #16\n\t"
  110057. "adds r5, r5, r8\n\t"
  110058. "adcs r6, r6, r9\n\t"
  110059. "adc r7, r7, #0\n\t"
  110060. #else
  110061. "umull r8, r9, r10, r12\n\t"
  110062. "adds r5, r5, r8\n\t"
  110063. "adcs r6, r6, r9\n\t"
  110064. "adc r7, r7, #0\n\t"
  110065. #endif
  110066. /* A[11] * A[13] */
  110067. "ldr r10, [%[a], #52]\n\t"
  110068. "ldr r12, [%[a], #44]\n\t"
  110069. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110070. "lsl r8, r10, #16\n\t"
  110071. "lsl r9, r12, #16\n\t"
  110072. "lsr r8, r8, #16\n\t"
  110073. "lsr r9, r9, #16\n\t"
  110074. "mul r9, r8, r9\n\t"
  110075. "adds r5, r5, r9\n\t"
  110076. "adcs r6, r6, #0\n\t"
  110077. "adc r7, r7, #0\n\t"
  110078. "lsr r9, r12, #16\n\t"
  110079. "mul r8, r9, r8\n\t"
  110080. "lsr r9, r8, #16\n\t"
  110081. "lsl r8, r8, #16\n\t"
  110082. "adds r5, r5, r8\n\t"
  110083. "adcs r6, r6, r9\n\t"
  110084. "adc r7, r7, #0\n\t"
  110085. "lsr r8, r10, #16\n\t"
  110086. "lsr r9, r12, #16\n\t"
  110087. "mul r9, r8, r9\n\t"
  110088. "adds r6, r6, r9\n\t"
  110089. "adc r7, r7, #0\n\t"
  110090. "lsl r9, r12, #16\n\t"
  110091. "lsr r9, r9, #16\n\t"
  110092. "mul r8, r9, r8\n\t"
  110093. "lsr r9, r8, #16\n\t"
  110094. "lsl r8, r8, #16\n\t"
  110095. "adds r5, r5, r8\n\t"
  110096. "adcs r6, r6, r9\n\t"
  110097. "adc r7, r7, #0\n\t"
  110098. #else
  110099. "umull r8, r9, r10, r12\n\t"
  110100. "adds r5, r5, r8\n\t"
  110101. "adcs r6, r6, r9\n\t"
  110102. "adc r7, r7, #0\n\t"
  110103. #endif
  110104. /* A[12] * A[12] */
  110105. "ldr r10, [%[a], #48]\n\t"
  110106. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110107. "lsl r8, r10, #16\n\t"
  110108. "lsr r9, r10, #16\n\t"
  110109. "lsr r8, r8, #16\n\t"
  110110. "mov r12, r8\n\t"
  110111. "mul r8, r12, r8\n\t"
  110112. "mov r12, r9\n\t"
  110113. "mul r9, r12, r9\n\t"
  110114. "adds r2, r2, r8\n\t"
  110115. "adcs r3, r3, r9\n\t"
  110116. "adc r4, r4, #0\n\t"
  110117. "lsr r9, r10, #16\n\t"
  110118. "lsl r8, r10, #16\n\t"
  110119. "lsr r8, r8, #16\n\t"
  110120. "mul r8, r9, r8\n\t"
  110121. "lsr r9, r8, #15\n\t"
  110122. "lsl r8, r8, #17\n\t"
  110123. "adds r2, r2, r8\n\t"
  110124. "adcs r3, r3, r9\n\t"
  110125. "adc r4, r4, #0\n\t"
  110126. "adds r5, r5, r5\n\t"
  110127. "adcs r6, r6, r6\n\t"
  110128. "adc r7, r7, r7\n\t"
  110129. #else
  110130. "umull r8, r9, r10, r10\n\t"
  110131. "adds r5, r5, r5\n\t"
  110132. "adcs r6, r6, r6\n\t"
  110133. "adc r7, r7, r7\n\t"
  110134. "adds r2, r2, r8\n\t"
  110135. "adcs r3, r3, r9\n\t"
  110136. "adc r4, r4, #0\n\t"
  110137. #endif
  110138. "adds r2, r2, r5\n\t"
  110139. "adcs r3, r3, r6\n\t"
  110140. "adc r4, r4, r7\n\t"
  110141. "str r2, [%[r], #96]\n\t"
  110142. /* A[9] * A[16] */
  110143. "ldr r10, [%[a], #64]\n\t"
  110144. "ldr r12, [%[a], #36]\n\t"
  110145. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110146. "lsl r8, r10, #16\n\t"
  110147. "lsl r5, r12, #16\n\t"
  110148. "lsr r8, r8, #16\n\t"
  110149. "lsr r5, r5, #16\n\t"
  110150. "mul r5, r8, r5\n\t"
  110151. "lsr r9, r12, #16\n\t"
  110152. "mul r8, r9, r8\n\t"
  110153. "lsr r6, r8, #16\n\t"
  110154. "lsl r8, r8, #16\n\t"
  110155. "adds r5, r5, r8\n\t"
  110156. "adc r6, r6, #0\n\t"
  110157. "lsr r8, r10, #16\n\t"
  110158. "mul r9, r8, r9\n\t"
  110159. "add r6, r6, r9\n\t"
  110160. "lsl r9, r12, #16\n\t"
  110161. "lsr r9, r9, #16\n\t"
  110162. "mul r8, r9, r8\n\t"
  110163. "lsr r9, r8, #16\n\t"
  110164. "lsl r8, r8, #16\n\t"
  110165. "adds r5, r5, r8\n\t"
  110166. "adc r6, r6, r9\n\t"
  110167. #else
  110168. "umull r5, r6, r10, r12\n\t"
  110169. #endif
  110170. "mov r2, #0\n\t"
  110171. "mov r7, #0\n\t"
  110172. /* A[10] * A[15] */
  110173. "ldr r10, [%[a], #60]\n\t"
  110174. "ldr r12, [%[a], #40]\n\t"
  110175. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110176. "lsl r8, r10, #16\n\t"
  110177. "lsl r9, r12, #16\n\t"
  110178. "lsr r8, r8, #16\n\t"
  110179. "lsr r9, r9, #16\n\t"
  110180. "mul r9, r8, r9\n\t"
  110181. "adds r5, r5, r9\n\t"
  110182. "adcs r6, r6, #0\n\t"
  110183. "adc r7, r7, #0\n\t"
  110184. "lsr r9, r12, #16\n\t"
  110185. "mul r8, r9, r8\n\t"
  110186. "lsr r9, r8, #16\n\t"
  110187. "lsl r8, r8, #16\n\t"
  110188. "adds r5, r5, r8\n\t"
  110189. "adcs r6, r6, r9\n\t"
  110190. "adc r7, r7, #0\n\t"
  110191. "lsr r8, r10, #16\n\t"
  110192. "lsr r9, r12, #16\n\t"
  110193. "mul r9, r8, r9\n\t"
  110194. "adds r6, r6, r9\n\t"
  110195. "adc r7, r7, #0\n\t"
  110196. "lsl r9, r12, #16\n\t"
  110197. "lsr r9, r9, #16\n\t"
  110198. "mul r8, r9, r8\n\t"
  110199. "lsr r9, r8, #16\n\t"
  110200. "lsl r8, r8, #16\n\t"
  110201. "adds r5, r5, r8\n\t"
  110202. "adcs r6, r6, r9\n\t"
  110203. "adc r7, r7, #0\n\t"
  110204. #else
  110205. "umull r8, r9, r10, r12\n\t"
  110206. "adds r5, r5, r8\n\t"
  110207. "adcs r6, r6, r9\n\t"
  110208. "adc r7, r7, #0\n\t"
  110209. #endif
  110210. /* A[11] * A[14] */
  110211. "ldr r10, [%[a], #56]\n\t"
  110212. "ldr r12, [%[a], #44]\n\t"
  110213. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110214. "lsl r8, r10, #16\n\t"
  110215. "lsl r9, r12, #16\n\t"
  110216. "lsr r8, r8, #16\n\t"
  110217. "lsr r9, r9, #16\n\t"
  110218. "mul r9, r8, r9\n\t"
  110219. "adds r5, r5, r9\n\t"
  110220. "adcs r6, r6, #0\n\t"
  110221. "adc r7, r7, #0\n\t"
  110222. "lsr r9, r12, #16\n\t"
  110223. "mul r8, r9, r8\n\t"
  110224. "lsr r9, r8, #16\n\t"
  110225. "lsl r8, r8, #16\n\t"
  110226. "adds r5, r5, r8\n\t"
  110227. "adcs r6, r6, r9\n\t"
  110228. "adc r7, r7, #0\n\t"
  110229. "lsr r8, r10, #16\n\t"
  110230. "lsr r9, r12, #16\n\t"
  110231. "mul r9, r8, r9\n\t"
  110232. "adds r6, r6, r9\n\t"
  110233. "adc r7, r7, #0\n\t"
  110234. "lsl r9, r12, #16\n\t"
  110235. "lsr r9, r9, #16\n\t"
  110236. "mul r8, r9, r8\n\t"
  110237. "lsr r9, r8, #16\n\t"
  110238. "lsl r8, r8, #16\n\t"
  110239. "adds r5, r5, r8\n\t"
  110240. "adcs r6, r6, r9\n\t"
  110241. "adc r7, r7, #0\n\t"
  110242. #else
  110243. "umull r8, r9, r10, r12\n\t"
  110244. "adds r5, r5, r8\n\t"
  110245. "adcs r6, r6, r9\n\t"
  110246. "adc r7, r7, #0\n\t"
  110247. #endif
  110248. /* A[12] * A[13] */
  110249. "ldr r10, [%[a], #52]\n\t"
  110250. "ldr r12, [%[a], #48]\n\t"
  110251. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110252. "lsl r8, r10, #16\n\t"
  110253. "lsl r9, r12, #16\n\t"
  110254. "lsr r8, r8, #16\n\t"
  110255. "lsr r9, r9, #16\n\t"
  110256. "mul r9, r8, r9\n\t"
  110257. "adds r5, r5, r9\n\t"
  110258. "adcs r6, r6, #0\n\t"
  110259. "adc r7, r7, #0\n\t"
  110260. "lsr r9, r12, #16\n\t"
  110261. "mul r8, r9, r8\n\t"
  110262. "lsr r9, r8, #16\n\t"
  110263. "lsl r8, r8, #16\n\t"
  110264. "adds r5, r5, r8\n\t"
  110265. "adcs r6, r6, r9\n\t"
  110266. "adc r7, r7, #0\n\t"
  110267. "lsr r8, r10, #16\n\t"
  110268. "lsr r9, r12, #16\n\t"
  110269. "mul r9, r8, r9\n\t"
  110270. "adds r6, r6, r9\n\t"
  110271. "adc r7, r7, #0\n\t"
  110272. "lsl r9, r12, #16\n\t"
  110273. "lsr r9, r9, #16\n\t"
  110274. "mul r8, r9, r8\n\t"
  110275. "lsr r9, r8, #16\n\t"
  110276. "lsl r8, r8, #16\n\t"
  110277. "adds r5, r5, r8\n\t"
  110278. "adcs r6, r6, r9\n\t"
  110279. "adc r7, r7, #0\n\t"
  110280. #else
  110281. "umull r8, r9, r10, r12\n\t"
  110282. "adds r5, r5, r8\n\t"
  110283. "adcs r6, r6, r9\n\t"
  110284. "adc r7, r7, #0\n\t"
  110285. #endif
  110286. "adds r5, r5, r5\n\t"
  110287. "adcs r6, r6, r6\n\t"
  110288. "adc r7, r7, r7\n\t"
  110289. "adds r3, r3, r5\n\t"
  110290. "adcs r4, r4, r6\n\t"
  110291. "adc r2, r2, r7\n\t"
  110292. "str r3, [%[r], #100]\n\t"
  110293. /* A[10] * A[16] */
  110294. "ldr r10, [%[a], #64]\n\t"
  110295. "ldr r12, [%[a], #40]\n\t"
  110296. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110297. "lsl r8, r10, #16\n\t"
  110298. "lsl r5, r12, #16\n\t"
  110299. "lsr r8, r8, #16\n\t"
  110300. "lsr r5, r5, #16\n\t"
  110301. "mul r5, r8, r5\n\t"
  110302. "lsr r9, r12, #16\n\t"
  110303. "mul r8, r9, r8\n\t"
  110304. "lsr r6, r8, #16\n\t"
  110305. "lsl r8, r8, #16\n\t"
  110306. "adds r5, r5, r8\n\t"
  110307. "adc r6, r6, #0\n\t"
  110308. "lsr r8, r10, #16\n\t"
  110309. "mul r9, r8, r9\n\t"
  110310. "add r6, r6, r9\n\t"
  110311. "lsl r9, r12, #16\n\t"
  110312. "lsr r9, r9, #16\n\t"
  110313. "mul r8, r9, r8\n\t"
  110314. "lsr r9, r8, #16\n\t"
  110315. "lsl r8, r8, #16\n\t"
  110316. "adds r5, r5, r8\n\t"
  110317. "adc r6, r6, r9\n\t"
  110318. #else
  110319. "umull r5, r6, r10, r12\n\t"
  110320. #endif
  110321. "mov r3, #0\n\t"
  110322. "mov r7, #0\n\t"
  110323. /* A[11] * A[15] */
  110324. "ldr r10, [%[a], #60]\n\t"
  110325. "ldr r12, [%[a], #44]\n\t"
  110326. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110327. "lsl r8, r10, #16\n\t"
  110328. "lsl r9, r12, #16\n\t"
  110329. "lsr r8, r8, #16\n\t"
  110330. "lsr r9, r9, #16\n\t"
  110331. "mul r9, r8, r9\n\t"
  110332. "adds r5, r5, r9\n\t"
  110333. "adcs r6, r6, #0\n\t"
  110334. "adc r7, r7, #0\n\t"
  110335. "lsr r9, r12, #16\n\t"
  110336. "mul r8, r9, r8\n\t"
  110337. "lsr r9, r8, #16\n\t"
  110338. "lsl r8, r8, #16\n\t"
  110339. "adds r5, r5, r8\n\t"
  110340. "adcs r6, r6, r9\n\t"
  110341. "adc r7, r7, #0\n\t"
  110342. "lsr r8, r10, #16\n\t"
  110343. "lsr r9, r12, #16\n\t"
  110344. "mul r9, r8, r9\n\t"
  110345. "adds r6, r6, r9\n\t"
  110346. "adc r7, r7, #0\n\t"
  110347. "lsl r9, r12, #16\n\t"
  110348. "lsr r9, r9, #16\n\t"
  110349. "mul r8, r9, r8\n\t"
  110350. "lsr r9, r8, #16\n\t"
  110351. "lsl r8, r8, #16\n\t"
  110352. "adds r5, r5, r8\n\t"
  110353. "adcs r6, r6, r9\n\t"
  110354. "adc r7, r7, #0\n\t"
  110355. #else
  110356. "umull r8, r9, r10, r12\n\t"
  110357. "adds r5, r5, r8\n\t"
  110358. "adcs r6, r6, r9\n\t"
  110359. "adc r7, r7, #0\n\t"
  110360. #endif
  110361. /* A[12] * A[14] */
  110362. "ldr r10, [%[a], #56]\n\t"
  110363. "ldr r12, [%[a], #48]\n\t"
  110364. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110365. "lsl r8, r10, #16\n\t"
  110366. "lsl r9, r12, #16\n\t"
  110367. "lsr r8, r8, #16\n\t"
  110368. "lsr r9, r9, #16\n\t"
  110369. "mul r9, r8, r9\n\t"
  110370. "adds r5, r5, r9\n\t"
  110371. "adcs r6, r6, #0\n\t"
  110372. "adc r7, r7, #0\n\t"
  110373. "lsr r9, r12, #16\n\t"
  110374. "mul r8, r9, r8\n\t"
  110375. "lsr r9, r8, #16\n\t"
  110376. "lsl r8, r8, #16\n\t"
  110377. "adds r5, r5, r8\n\t"
  110378. "adcs r6, r6, r9\n\t"
  110379. "adc r7, r7, #0\n\t"
  110380. "lsr r8, r10, #16\n\t"
  110381. "lsr r9, r12, #16\n\t"
  110382. "mul r9, r8, r9\n\t"
  110383. "adds r6, r6, r9\n\t"
  110384. "adc r7, r7, #0\n\t"
  110385. "lsl r9, r12, #16\n\t"
  110386. "lsr r9, r9, #16\n\t"
  110387. "mul r8, r9, r8\n\t"
  110388. "lsr r9, r8, #16\n\t"
  110389. "lsl r8, r8, #16\n\t"
  110390. "adds r5, r5, r8\n\t"
  110391. "adcs r6, r6, r9\n\t"
  110392. "adc r7, r7, #0\n\t"
  110393. #else
  110394. "umull r8, r9, r10, r12\n\t"
  110395. "adds r5, r5, r8\n\t"
  110396. "adcs r6, r6, r9\n\t"
  110397. "adc r7, r7, #0\n\t"
  110398. #endif
  110399. /* A[13] * A[13] */
  110400. "ldr r10, [%[a], #52]\n\t"
  110401. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110402. "lsl r8, r10, #16\n\t"
  110403. "lsr r9, r10, #16\n\t"
  110404. "lsr r8, r8, #16\n\t"
  110405. "mov r12, r8\n\t"
  110406. "mul r8, r12, r8\n\t"
  110407. "mov r12, r9\n\t"
  110408. "mul r9, r12, r9\n\t"
  110409. "adds r4, r4, r8\n\t"
  110410. "adcs r2, r2, r9\n\t"
  110411. "adc r3, r3, #0\n\t"
  110412. "lsr r9, r10, #16\n\t"
  110413. "lsl r8, r10, #16\n\t"
  110414. "lsr r8, r8, #16\n\t"
  110415. "mul r8, r9, r8\n\t"
  110416. "lsr r9, r8, #15\n\t"
  110417. "lsl r8, r8, #17\n\t"
  110418. "adds r4, r4, r8\n\t"
  110419. "adcs r2, r2, r9\n\t"
  110420. "adc r3, r3, #0\n\t"
  110421. "adds r5, r5, r5\n\t"
  110422. "adcs r6, r6, r6\n\t"
  110423. "adc r7, r7, r7\n\t"
  110424. #else
  110425. "umull r8, r9, r10, r10\n\t"
  110426. "adds r5, r5, r5\n\t"
  110427. "adcs r6, r6, r6\n\t"
  110428. "adc r7, r7, r7\n\t"
  110429. "adds r4, r4, r8\n\t"
  110430. "adcs r2, r2, r9\n\t"
  110431. "adc r3, r3, #0\n\t"
  110432. #endif
  110433. "adds r4, r4, r5\n\t"
  110434. "adcs r2, r2, r6\n\t"
  110435. "adc r3, r3, r7\n\t"
  110436. "str r4, [%[r], #104]\n\t"
  110437. /* A[11] * A[16] */
  110438. "ldr r10, [%[a], #64]\n\t"
  110439. "ldr r12, [%[a], #44]\n\t"
  110440. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110441. "lsl r8, r10, #16\n\t"
  110442. "lsl r5, r12, #16\n\t"
  110443. "lsr r8, r8, #16\n\t"
  110444. "lsr r5, r5, #16\n\t"
  110445. "mul r5, r8, r5\n\t"
  110446. "lsr r9, r12, #16\n\t"
  110447. "mul r8, r9, r8\n\t"
  110448. "lsr r6, r8, #16\n\t"
  110449. "lsl r8, r8, #16\n\t"
  110450. "adds r5, r5, r8\n\t"
  110451. "adc r6, r6, #0\n\t"
  110452. "lsr r8, r10, #16\n\t"
  110453. "mul r9, r8, r9\n\t"
  110454. "add r6, r6, r9\n\t"
  110455. "lsl r9, r12, #16\n\t"
  110456. "lsr r9, r9, #16\n\t"
  110457. "mul r8, r9, r8\n\t"
  110458. "lsr r9, r8, #16\n\t"
  110459. "lsl r8, r8, #16\n\t"
  110460. "adds r5, r5, r8\n\t"
  110461. "adc r6, r6, r9\n\t"
  110462. #else
  110463. "umull r5, r6, r10, r12\n\t"
  110464. #endif
  110465. "mov r4, #0\n\t"
  110466. "mov r7, #0\n\t"
  110467. /* A[12] * A[15] */
  110468. "ldr r10, [%[a], #60]\n\t"
  110469. "ldr r12, [%[a], #48]\n\t"
  110470. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110471. "lsl r8, r10, #16\n\t"
  110472. "lsl r9, r12, #16\n\t"
  110473. "lsr r8, r8, #16\n\t"
  110474. "lsr r9, r9, #16\n\t"
  110475. "mul r9, r8, r9\n\t"
  110476. "adds r5, r5, r9\n\t"
  110477. "adcs r6, r6, #0\n\t"
  110478. "adc r7, r7, #0\n\t"
  110479. "lsr r9, r12, #16\n\t"
  110480. "mul r8, r9, r8\n\t"
  110481. "lsr r9, r8, #16\n\t"
  110482. "lsl r8, r8, #16\n\t"
  110483. "adds r5, r5, r8\n\t"
  110484. "adcs r6, r6, r9\n\t"
  110485. "adc r7, r7, #0\n\t"
  110486. "lsr r8, r10, #16\n\t"
  110487. "lsr r9, r12, #16\n\t"
  110488. "mul r9, r8, r9\n\t"
  110489. "adds r6, r6, r9\n\t"
  110490. "adc r7, r7, #0\n\t"
  110491. "lsl r9, r12, #16\n\t"
  110492. "lsr r9, r9, #16\n\t"
  110493. "mul r8, r9, r8\n\t"
  110494. "lsr r9, r8, #16\n\t"
  110495. "lsl r8, r8, #16\n\t"
  110496. "adds r5, r5, r8\n\t"
  110497. "adcs r6, r6, r9\n\t"
  110498. "adc r7, r7, #0\n\t"
  110499. #else
  110500. "umull r8, r9, r10, r12\n\t"
  110501. "adds r5, r5, r8\n\t"
  110502. "adcs r6, r6, r9\n\t"
  110503. "adc r7, r7, #0\n\t"
  110504. #endif
  110505. /* A[13] * A[14] */
  110506. "ldr r10, [%[a], #56]\n\t"
  110507. "ldr r12, [%[a], #52]\n\t"
  110508. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110509. "lsl r8, r10, #16\n\t"
  110510. "lsl r9, r12, #16\n\t"
  110511. "lsr r8, r8, #16\n\t"
  110512. "lsr r9, r9, #16\n\t"
  110513. "mul r9, r8, r9\n\t"
  110514. "adds r5, r5, r9\n\t"
  110515. "adcs r6, r6, #0\n\t"
  110516. "adc r7, r7, #0\n\t"
  110517. "lsr r9, r12, #16\n\t"
  110518. "mul r8, r9, r8\n\t"
  110519. "lsr r9, r8, #16\n\t"
  110520. "lsl r8, r8, #16\n\t"
  110521. "adds r5, r5, r8\n\t"
  110522. "adcs r6, r6, r9\n\t"
  110523. "adc r7, r7, #0\n\t"
  110524. "lsr r8, r10, #16\n\t"
  110525. "lsr r9, r12, #16\n\t"
  110526. "mul r9, r8, r9\n\t"
  110527. "adds r6, r6, r9\n\t"
  110528. "adc r7, r7, #0\n\t"
  110529. "lsl r9, r12, #16\n\t"
  110530. "lsr r9, r9, #16\n\t"
  110531. "mul r8, r9, r8\n\t"
  110532. "lsr r9, r8, #16\n\t"
  110533. "lsl r8, r8, #16\n\t"
  110534. "adds r5, r5, r8\n\t"
  110535. "adcs r6, r6, r9\n\t"
  110536. "adc r7, r7, #0\n\t"
  110537. #else
  110538. "umull r8, r9, r10, r12\n\t"
  110539. "adds r5, r5, r8\n\t"
  110540. "adcs r6, r6, r9\n\t"
  110541. "adc r7, r7, #0\n\t"
  110542. #endif
  110543. "adds r5, r5, r5\n\t"
  110544. "adcs r6, r6, r6\n\t"
  110545. "adc r7, r7, r7\n\t"
  110546. "adds r2, r2, r5\n\t"
  110547. "adcs r3, r3, r6\n\t"
  110548. "adc r4, r4, r7\n\t"
  110549. "str r2, [%[r], #108]\n\t"
  110550. /* A[12] * A[16] */
  110551. "ldr r10, [%[a], #64]\n\t"
  110552. "ldr r12, [%[a], #48]\n\t"
  110553. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110554. "lsl r8, r10, #16\n\t"
  110555. "lsl r9, r12, #16\n\t"
  110556. "lsr r8, r8, #16\n\t"
  110557. "lsr r9, r9, #16\n\t"
  110558. "mul r9, r8, r9\n\t"
  110559. "adds r3, r3, r9\n\t"
  110560. "adcs r4, r4, #0\n\t"
  110561. "mov r2, #0\n\t"
  110562. "adc r2, r2, #0\n\t"
  110563. "adds r3, r3, r9\n\t"
  110564. "adcs r4, r4, #0\n\t"
  110565. "adc r2, r2, #0\n\t"
  110566. "lsr r9, r12, #16\n\t"
  110567. "mul r8, r9, r8\n\t"
  110568. "lsr r9, r8, #16\n\t"
  110569. "lsl r8, r8, #16\n\t"
  110570. "adds r3, r3, r8\n\t"
  110571. "adcs r4, r4, r9\n\t"
  110572. "adc r2, r2, #0\n\t"
  110573. "adds r3, r3, r8\n\t"
  110574. "adcs r4, r4, r9\n\t"
  110575. "adc r2, r2, #0\n\t"
  110576. "lsr r8, r10, #16\n\t"
  110577. "lsr r9, r12, #16\n\t"
  110578. "mul r9, r8, r9\n\t"
  110579. "adds r4, r4, r9\n\t"
  110580. "adc r2, r2, #0\n\t"
  110581. "adds r4, r4, r9\n\t"
  110582. "adc r2, r2, #0\n\t"
  110583. "lsl r9, r12, #16\n\t"
  110584. "lsr r9, r9, #16\n\t"
  110585. "mul r8, r9, r8\n\t"
  110586. "lsr r9, r8, #16\n\t"
  110587. "lsl r8, r8, #16\n\t"
  110588. "adds r3, r3, r8\n\t"
  110589. "adcs r4, r4, r9\n\t"
  110590. "adc r2, r2, #0\n\t"
  110591. "adds r3, r3, r8\n\t"
  110592. "adcs r4, r4, r9\n\t"
  110593. "adc r2, r2, #0\n\t"
  110594. #else
  110595. "umull r8, r9, r10, r12\n\t"
  110596. "adds r3, r3, r8\n\t"
  110597. "adcs r4, r4, r9\n\t"
  110598. "mov r2, #0\n\t"
  110599. "adc r2, r2, #0\n\t"
  110600. "adds r3, r3, r8\n\t"
  110601. "adcs r4, r4, r9\n\t"
  110602. "mov r2, #0\n\t"
  110603. "adc r2, r2, #0\n\t"
  110604. #endif
  110605. /* A[13] * A[15] */
  110606. "ldr r10, [%[a], #60]\n\t"
  110607. "ldr r12, [%[a], #52]\n\t"
  110608. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110609. "lsl r8, r10, #16\n\t"
  110610. "lsl r9, r12, #16\n\t"
  110611. "lsr r8, r8, #16\n\t"
  110612. "lsr r9, r9, #16\n\t"
  110613. "mul r9, r8, r9\n\t"
  110614. "adds r3, r3, r9\n\t"
  110615. "adcs r4, r4, #0\n\t"
  110616. "adc r2, r2, #0\n\t"
  110617. "adds r3, r3, r9\n\t"
  110618. "adcs r4, r4, #0\n\t"
  110619. "adc r2, r2, #0\n\t"
  110620. "lsr r9, r12, #16\n\t"
  110621. "mul r8, r9, r8\n\t"
  110622. "lsr r9, r8, #16\n\t"
  110623. "lsl r8, r8, #16\n\t"
  110624. "adds r3, r3, r8\n\t"
  110625. "adcs r4, r4, r9\n\t"
  110626. "adc r2, r2, #0\n\t"
  110627. "adds r3, r3, r8\n\t"
  110628. "adcs r4, r4, r9\n\t"
  110629. "adc r2, r2, #0\n\t"
  110630. "lsr r8, r10, #16\n\t"
  110631. "lsr r9, r12, #16\n\t"
  110632. "mul r9, r8, r9\n\t"
  110633. "adds r4, r4, r9\n\t"
  110634. "adc r2, r2, #0\n\t"
  110635. "adds r4, r4, r9\n\t"
  110636. "adc r2, r2, #0\n\t"
  110637. "lsl r9, r12, #16\n\t"
  110638. "lsr r9, r9, #16\n\t"
  110639. "mul r8, r9, r8\n\t"
  110640. "lsr r9, r8, #16\n\t"
  110641. "lsl r8, r8, #16\n\t"
  110642. "adds r3, r3, r8\n\t"
  110643. "adcs r4, r4, r9\n\t"
  110644. "adc r2, r2, #0\n\t"
  110645. "adds r3, r3, r8\n\t"
  110646. "adcs r4, r4, r9\n\t"
  110647. "adc r2, r2, #0\n\t"
  110648. #else
  110649. "umull r8, r9, r10, r12\n\t"
  110650. "adds r3, r3, r8\n\t"
  110651. "adcs r4, r4, r9\n\t"
  110652. "adc r2, r2, #0\n\t"
  110653. "adds r3, r3, r8\n\t"
  110654. "adcs r4, r4, r9\n\t"
  110655. "adc r2, r2, #0\n\t"
  110656. #endif
  110657. /* A[14] * A[14] */
  110658. "ldr r10, [%[a], #56]\n\t"
  110659. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110660. "lsl r8, r10, #16\n\t"
  110661. "lsr r9, r10, #16\n\t"
  110662. "lsr r8, r8, #16\n\t"
  110663. "mov r12, r8\n\t"
  110664. "mul r8, r12, r8\n\t"
  110665. "mov r12, r9\n\t"
  110666. "mul r9, r12, r9\n\t"
  110667. "adds r3, r3, r8\n\t"
  110668. "adcs r4, r4, r9\n\t"
  110669. "adc r2, r2, #0\n\t"
  110670. "lsr r9, r10, #16\n\t"
  110671. "lsl r8, r10, #16\n\t"
  110672. "lsr r8, r8, #16\n\t"
  110673. "mul r8, r9, r8\n\t"
  110674. "lsr r9, r8, #15\n\t"
  110675. "lsl r8, r8, #17\n\t"
  110676. "adds r3, r3, r8\n\t"
  110677. "adcs r4, r4, r9\n\t"
  110678. "adc r2, r2, #0\n\t"
  110679. #else
  110680. "umull r8, r9, r10, r10\n\t"
  110681. "adds r3, r3, r8\n\t"
  110682. "adcs r4, r4, r9\n\t"
  110683. "adc r2, r2, #0\n\t"
  110684. #endif
  110685. "str r3, [%[r], #112]\n\t"
  110686. /* A[13] * A[16] */
  110687. "ldr r10, [%[a], #64]\n\t"
  110688. "ldr r12, [%[a], #52]\n\t"
  110689. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110690. "lsl r8, r10, #16\n\t"
  110691. "lsl r9, r12, #16\n\t"
  110692. "lsr r8, r8, #16\n\t"
  110693. "lsr r9, r9, #16\n\t"
  110694. "mul r9, r8, r9\n\t"
  110695. "adds r4, r4, r9\n\t"
  110696. "adcs r2, r2, #0\n\t"
  110697. "mov r3, #0\n\t"
  110698. "adc r3, r3, #0\n\t"
  110699. "adds r4, r4, r9\n\t"
  110700. "adcs r2, r2, #0\n\t"
  110701. "adc r3, r3, #0\n\t"
  110702. "lsr r9, r12, #16\n\t"
  110703. "mul r8, r9, r8\n\t"
  110704. "lsr r9, r8, #16\n\t"
  110705. "lsl r8, r8, #16\n\t"
  110706. "adds r4, r4, r8\n\t"
  110707. "adcs r2, r2, r9\n\t"
  110708. "adc r3, r3, #0\n\t"
  110709. "adds r4, r4, r8\n\t"
  110710. "adcs r2, r2, r9\n\t"
  110711. "adc r3, r3, #0\n\t"
  110712. "lsr r8, r10, #16\n\t"
  110713. "lsr r9, r12, #16\n\t"
  110714. "mul r9, r8, r9\n\t"
  110715. "adds r2, r2, r9\n\t"
  110716. "adc r3, r3, #0\n\t"
  110717. "adds r2, r2, r9\n\t"
  110718. "adc r3, r3, #0\n\t"
  110719. "lsl r9, r12, #16\n\t"
  110720. "lsr r9, r9, #16\n\t"
  110721. "mul r8, r9, r8\n\t"
  110722. "lsr r9, r8, #16\n\t"
  110723. "lsl r8, r8, #16\n\t"
  110724. "adds r4, r4, r8\n\t"
  110725. "adcs r2, r2, r9\n\t"
  110726. "adc r3, r3, #0\n\t"
  110727. "adds r4, r4, r8\n\t"
  110728. "adcs r2, r2, r9\n\t"
  110729. "adc r3, r3, #0\n\t"
  110730. #else
  110731. "umull r8, r9, r10, r12\n\t"
  110732. "adds r4, r4, r8\n\t"
  110733. "adcs r2, r2, r9\n\t"
  110734. "mov r3, #0\n\t"
  110735. "adc r3, r3, #0\n\t"
  110736. "adds r4, r4, r8\n\t"
  110737. "adcs r2, r2, r9\n\t"
  110738. "mov r3, #0\n\t"
  110739. "adc r3, r3, #0\n\t"
  110740. #endif
  110741. /* A[14] * A[15] */
  110742. "ldr r10, [%[a], #60]\n\t"
  110743. "ldr r12, [%[a], #56]\n\t"
  110744. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110745. "lsl r8, r10, #16\n\t"
  110746. "lsl r9, r12, #16\n\t"
  110747. "lsr r8, r8, #16\n\t"
  110748. "lsr r9, r9, #16\n\t"
  110749. "mul r9, r8, r9\n\t"
  110750. "adds r4, r4, r9\n\t"
  110751. "adcs r2, r2, #0\n\t"
  110752. "adc r3, r3, #0\n\t"
  110753. "adds r4, r4, r9\n\t"
  110754. "adcs r2, r2, #0\n\t"
  110755. "adc r3, r3, #0\n\t"
  110756. "lsr r9, r12, #16\n\t"
  110757. "mul r8, r9, r8\n\t"
  110758. "lsr r9, r8, #16\n\t"
  110759. "lsl r8, r8, #16\n\t"
  110760. "adds r4, r4, r8\n\t"
  110761. "adcs r2, r2, r9\n\t"
  110762. "adc r3, r3, #0\n\t"
  110763. "adds r4, r4, r8\n\t"
  110764. "adcs r2, r2, r9\n\t"
  110765. "adc r3, r3, #0\n\t"
  110766. "lsr r8, r10, #16\n\t"
  110767. "lsr r9, r12, #16\n\t"
  110768. "mul r9, r8, r9\n\t"
  110769. "adds r2, r2, r9\n\t"
  110770. "adc r3, r3, #0\n\t"
  110771. "adds r2, r2, r9\n\t"
  110772. "adc r3, r3, #0\n\t"
  110773. "lsl r9, r12, #16\n\t"
  110774. "lsr r9, r9, #16\n\t"
  110775. "mul r8, r9, r8\n\t"
  110776. "lsr r9, r8, #16\n\t"
  110777. "lsl r8, r8, #16\n\t"
  110778. "adds r4, r4, r8\n\t"
  110779. "adcs r2, r2, r9\n\t"
  110780. "adc r3, r3, #0\n\t"
  110781. "adds r4, r4, r8\n\t"
  110782. "adcs r2, r2, r9\n\t"
  110783. "adc r3, r3, #0\n\t"
  110784. #else
  110785. "umull r8, r9, r10, r12\n\t"
  110786. "adds r4, r4, r8\n\t"
  110787. "adcs r2, r2, r9\n\t"
  110788. "adc r3, r3, #0\n\t"
  110789. "adds r4, r4, r8\n\t"
  110790. "adcs r2, r2, r9\n\t"
  110791. "adc r3, r3, #0\n\t"
  110792. #endif
  110793. "str r4, [%[r], #116]\n\t"
  110794. /* A[14] * A[16] */
  110795. "ldr r10, [%[a], #64]\n\t"
  110796. "ldr r12, [%[a], #56]\n\t"
  110797. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110798. "lsl r8, r10, #16\n\t"
  110799. "lsl r9, r12, #16\n\t"
  110800. "lsr r8, r8, #16\n\t"
  110801. "lsr r9, r9, #16\n\t"
  110802. "mul r9, r8, r9\n\t"
  110803. "adds r2, r2, r9\n\t"
  110804. "adcs r3, r3, #0\n\t"
  110805. "mov r4, #0\n\t"
  110806. "adc r4, r4, #0\n\t"
  110807. "adds r2, r2, r9\n\t"
  110808. "adcs r3, r3, #0\n\t"
  110809. "adc r4, r4, #0\n\t"
  110810. "lsr r9, r12, #16\n\t"
  110811. "mul r8, r9, r8\n\t"
  110812. "lsr r9, r8, #16\n\t"
  110813. "lsl r8, r8, #16\n\t"
  110814. "adds r2, r2, r8\n\t"
  110815. "adcs r3, r3, r9\n\t"
  110816. "adc r4, r4, #0\n\t"
  110817. "adds r2, r2, r8\n\t"
  110818. "adcs r3, r3, r9\n\t"
  110819. "adc r4, r4, #0\n\t"
  110820. "lsr r8, r10, #16\n\t"
  110821. "lsr r9, r12, #16\n\t"
  110822. "mul r9, r8, r9\n\t"
  110823. "adds r3, r3, r9\n\t"
  110824. "adc r4, r4, #0\n\t"
  110825. "adds r3, r3, r9\n\t"
  110826. "adc r4, r4, #0\n\t"
  110827. "lsl r9, r12, #16\n\t"
  110828. "lsr r9, r9, #16\n\t"
  110829. "mul r8, r9, r8\n\t"
  110830. "lsr r9, r8, #16\n\t"
  110831. "lsl r8, r8, #16\n\t"
  110832. "adds r2, r2, r8\n\t"
  110833. "adcs r3, r3, r9\n\t"
  110834. "adc r4, r4, #0\n\t"
  110835. "adds r2, r2, r8\n\t"
  110836. "adcs r3, r3, r9\n\t"
  110837. "adc r4, r4, #0\n\t"
  110838. #else
  110839. "umull r8, r9, r10, r12\n\t"
  110840. "adds r2, r2, r8\n\t"
  110841. "adcs r3, r3, r9\n\t"
  110842. "mov r4, #0\n\t"
  110843. "adc r4, r4, #0\n\t"
  110844. "adds r2, r2, r8\n\t"
  110845. "adcs r3, r3, r9\n\t"
  110846. "mov r4, #0\n\t"
  110847. "adc r4, r4, #0\n\t"
  110848. #endif
  110849. /* A[15] * A[15] */
  110850. "ldr r10, [%[a], #60]\n\t"
  110851. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110852. "lsl r8, r10, #16\n\t"
  110853. "lsr r9, r10, #16\n\t"
  110854. "lsr r8, r8, #16\n\t"
  110855. "mov r12, r8\n\t"
  110856. "mul r8, r12, r8\n\t"
  110857. "mov r12, r9\n\t"
  110858. "mul r9, r12, r9\n\t"
  110859. "adds r2, r2, r8\n\t"
  110860. "adcs r3, r3, r9\n\t"
  110861. "adc r4, r4, #0\n\t"
  110862. "lsr r9, r10, #16\n\t"
  110863. "lsl r8, r10, #16\n\t"
  110864. "lsr r8, r8, #16\n\t"
  110865. "mul r8, r9, r8\n\t"
  110866. "lsr r9, r8, #15\n\t"
  110867. "lsl r8, r8, #17\n\t"
  110868. "adds r2, r2, r8\n\t"
  110869. "adcs r3, r3, r9\n\t"
  110870. "adc r4, r4, #0\n\t"
  110871. #else
  110872. "umull r8, r9, r10, r10\n\t"
  110873. "adds r2, r2, r8\n\t"
  110874. "adcs r3, r3, r9\n\t"
  110875. "adc r4, r4, #0\n\t"
  110876. #endif
  110877. "str r2, [%[r], #120]\n\t"
  110878. /* A[15] * A[16] */
  110879. "ldr r10, [%[a], #64]\n\t"
  110880. "ldr r12, [%[a], #60]\n\t"
  110881. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110882. "lsl r8, r10, #16\n\t"
  110883. "lsl r9, r12, #16\n\t"
  110884. "lsr r8, r8, #16\n\t"
  110885. "lsr r9, r9, #16\n\t"
  110886. "mul r9, r8, r9\n\t"
  110887. "adds r3, r3, r9\n\t"
  110888. "adcs r4, r4, #0\n\t"
  110889. "mov r2, #0\n\t"
  110890. "adc r2, r2, #0\n\t"
  110891. "adds r3, r3, r9\n\t"
  110892. "adcs r4, r4, #0\n\t"
  110893. "adc r2, r2, #0\n\t"
  110894. "lsr r9, r12, #16\n\t"
  110895. "mul r8, r9, r8\n\t"
  110896. "lsr r9, r8, #16\n\t"
  110897. "lsl r8, r8, #16\n\t"
  110898. "adds r3, r3, r8\n\t"
  110899. "adcs r4, r4, r9\n\t"
  110900. "adc r2, r2, #0\n\t"
  110901. "adds r3, r3, r8\n\t"
  110902. "adcs r4, r4, r9\n\t"
  110903. "adc r2, r2, #0\n\t"
  110904. "lsr r8, r10, #16\n\t"
  110905. "lsr r9, r12, #16\n\t"
  110906. "mul r9, r8, r9\n\t"
  110907. "adds r4, r4, r9\n\t"
  110908. "adc r2, r2, #0\n\t"
  110909. "adds r4, r4, r9\n\t"
  110910. "adc r2, r2, #0\n\t"
  110911. "lsl r9, r12, #16\n\t"
  110912. "lsr r9, r9, #16\n\t"
  110913. "mul r8, r9, r8\n\t"
  110914. "lsr r9, r8, #16\n\t"
  110915. "lsl r8, r8, #16\n\t"
  110916. "adds r3, r3, r8\n\t"
  110917. "adcs r4, r4, r9\n\t"
  110918. "adc r2, r2, #0\n\t"
  110919. "adds r3, r3, r8\n\t"
  110920. "adcs r4, r4, r9\n\t"
  110921. "adc r2, r2, #0\n\t"
  110922. #else
  110923. "umull r8, r9, r10, r12\n\t"
  110924. "adds r3, r3, r8\n\t"
  110925. "adcs r4, r4, r9\n\t"
  110926. "mov r2, #0\n\t"
  110927. "adc r2, r2, #0\n\t"
  110928. "adds r3, r3, r8\n\t"
  110929. "adcs r4, r4, r9\n\t"
  110930. "mov r2, #0\n\t"
  110931. "adc r2, r2, #0\n\t"
  110932. #endif
  110933. "str r3, [%[r], #124]\n\t"
  110934. /* A[16] * A[16] */
  110935. "ldr r10, [%[a], #64]\n\t"
  110936. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  110937. "lsl r8, r10, #16\n\t"
  110938. "lsr r9, r10, #16\n\t"
  110939. "lsr r8, r8, #16\n\t"
  110940. "mov r12, r8\n\t"
  110941. "mul r8, r12, r8\n\t"
  110942. "mov r12, r9\n\t"
  110943. "mul r9, r12, r9\n\t"
  110944. "adds r4, r4, r8\n\t"
  110945. "adc r2, r2, r9\n\t"
  110946. "lsr r9, r10, #16\n\t"
  110947. "lsl r8, r10, #16\n\t"
  110948. "lsr r8, r8, #16\n\t"
  110949. "mul r8, r9, r8\n\t"
  110950. "lsr r9, r8, #15\n\t"
  110951. "lsl r8, r8, #17\n\t"
  110952. "adds r4, r4, r8\n\t"
  110953. "adc r2, r2, r9\n\t"
  110954. #else
  110955. "umull r8, r9, r10, r10\n\t"
  110956. "adds r4, r4, r8\n\t"
  110957. "adc r2, r2, r9\n\t"
  110958. #endif
  110959. "str r4, [%[r], #128]\n\t"
  110960. "str r2, [%[r], #132]\n\t"
  110961. "ldm sp!, {r2, r3, r4, r8}\n\t"
  110962. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  110963. "ldm sp!, {r2, r3, r4, r8}\n\t"
  110964. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  110965. "ldm sp!, {r2, r3, r4, r8}\n\t"
  110966. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  110967. "ldm sp!, {r2, r3, r4, r8}\n\t"
  110968. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  110969. "ldm sp!, {r2}\n\t"
  110970. "stm %[r]!, {r2}\n\t"
  110971. : [r] "+r" (r), [a] "+r" (a)
  110972. :
  110973. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  110974. );
  110975. }
  110976. #endif /* WOLFSSL_SP_SMALL */
  110977. #ifdef WOLFSSL_SP_SMALL
  110978. /* Add b to a into r. (r = a + b)
  110979. *
  110980. * r A single precision integer.
  110981. * a A single precision integer.
  110982. * b A single precision integer.
  110983. */
  110984. static sp_digit sp_521_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  110985. {
  110986. register sp_digit* r asm ("r0") = r_p;
  110987. register const sp_digit* a asm ("r1") = a_p;
  110988. register const sp_digit* b asm ("r2") = b_p;
  110989. __asm__ __volatile__ (
  110990. "mov r3, #0\n\t"
  110991. "add r12, %[a], #0x40\n\t"
  110992. "\n"
  110993. "L_sp_521_add_17_word_%=: \n\t"
  110994. "adds r3, r3, #-1\n\t"
  110995. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  110996. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  110997. "adcs r4, r4, r8\n\t"
  110998. "adcs r5, r5, r9\n\t"
  110999. "adcs r6, r6, r10\n\t"
  111000. "adcs r7, r7, r11\n\t"
  111001. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  111002. "mov r4, #0\n\t"
  111003. "adc r3, r4, #0\n\t"
  111004. "cmp %[a], r12\n\t"
  111005. "bne L_sp_521_add_17_word_%=\n\t"
  111006. "adds r3, r3, #-1\n\t"
  111007. "ldm %[a], {r4}\n\t"
  111008. "ldm %[b], {r8}\n\t"
  111009. "adcs r4, r4, r8\n\t"
  111010. "stm %[r]!, {r4}\n\t"
  111011. "mov r4, #0\n\t"
  111012. "adc %[r], r4, #0\n\t"
  111013. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  111014. :
  111015. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  111016. );
  111017. return (uint32_t)(size_t)r;
  111018. }
  111019. #else
  111020. /* Add b to a into r. (r = a + b)
  111021. *
  111022. * r A single precision integer.
  111023. * a A single precision integer.
  111024. * b A single precision integer.
  111025. */
  111026. static sp_digit sp_521_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  111027. {
  111028. register sp_digit* r asm ("r0") = r_p;
  111029. register const sp_digit* a asm ("r1") = a_p;
  111030. register const sp_digit* b asm ("r2") = b_p;
  111031. __asm__ __volatile__ (
  111032. "mov r12, #0\n\t"
  111033. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  111034. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  111035. "adds r3, r3, r7\n\t"
  111036. "adcs r4, r4, r8\n\t"
  111037. "adcs r5, r5, r9\n\t"
  111038. "adcs r6, r6, r10\n\t"
  111039. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  111040. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  111041. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  111042. "adcs r3, r3, r7\n\t"
  111043. "adcs r4, r4, r8\n\t"
  111044. "adcs r5, r5, r9\n\t"
  111045. "adcs r6, r6, r10\n\t"
  111046. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  111047. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  111048. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  111049. "adcs r3, r3, r7\n\t"
  111050. "adcs r4, r4, r8\n\t"
  111051. "adcs r5, r5, r9\n\t"
  111052. "adcs r6, r6, r10\n\t"
  111053. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  111054. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  111055. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  111056. "adcs r3, r3, r7\n\t"
  111057. "adcs r4, r4, r8\n\t"
  111058. "adcs r5, r5, r9\n\t"
  111059. "adcs r6, r6, r10\n\t"
  111060. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  111061. "ldm %[a]!, {r3}\n\t"
  111062. "ldm %[b]!, {r7}\n\t"
  111063. "adcs r3, r3, r7\n\t"
  111064. "stm %[r]!, {r3}\n\t"
  111065. "adc %[r], r12, r12\n\t"
  111066. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  111067. :
  111068. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  111069. );
  111070. return (uint32_t)(size_t)r;
  111071. }
  111072. #endif /* WOLFSSL_SP_SMALL */
  111073. #ifdef WOLFSSL_SP_SMALL
  111074. /* Sub b from a into r. (r = a - b)
  111075. *
  111076. * r A single precision integer.
  111077. * a A single precision integer.
  111078. * b A single precision integer.
  111079. */
  111080. static sp_digit sp_521_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  111081. {
  111082. register sp_digit* r asm ("r0") = r_p;
  111083. register const sp_digit* a asm ("r1") = a_p;
  111084. register const sp_digit* b asm ("r2") = b_p;
  111085. __asm__ __volatile__ (
  111086. "mov r12, #0\n\t"
  111087. "add lr, %[a], #0x40\n\t"
  111088. "\n"
  111089. "L_sp_521_sub_17_word_%=: \n\t"
  111090. "rsbs r12, r12, #0\n\t"
  111091. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  111092. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  111093. "sbcs r3, r3, r7\n\t"
  111094. "sbcs r4, r4, r8\n\t"
  111095. "sbcs r5, r5, r9\n\t"
  111096. "sbcs r6, r6, r10\n\t"
  111097. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  111098. "sbc r12, r3, r3\n\t"
  111099. "cmp %[a], lr\n\t"
  111100. "bne L_sp_521_sub_17_word_%=\n\t"
  111101. "rsbs r12, r12, #0\n\t"
  111102. "ldm %[a]!, {r3}\n\t"
  111103. "ldm %[b]!, {r7}\n\t"
  111104. "sbcs r3, r3, r7\n\t"
  111105. "stm %[r]!, {r3}\n\t"
  111106. "sbc %[r], r6, r6\n\t"
  111107. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  111108. :
  111109. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr"
  111110. );
  111111. return (uint32_t)(size_t)r;
  111112. }
  111113. #else
  111114. /* Sub b from a into r. (r = a - b)
  111115. *
  111116. * r A single precision integer.
  111117. * a A single precision integer.
  111118. * b A single precision integer.
  111119. */
  111120. static sp_digit sp_521_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  111121. {
  111122. register sp_digit* r asm ("r0") = r_p;
  111123. register const sp_digit* a asm ("r1") = a_p;
  111124. register const sp_digit* b asm ("r2") = b_p;
  111125. __asm__ __volatile__ (
  111126. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  111127. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  111128. "subs r3, r3, r7\n\t"
  111129. "sbcs r4, r4, r8\n\t"
  111130. "sbcs r5, r5, r9\n\t"
  111131. "sbcs r6, r6, r10\n\t"
  111132. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  111133. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  111134. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  111135. "sbcs r3, r3, r7\n\t"
  111136. "sbcs r4, r4, r8\n\t"
  111137. "sbcs r5, r5, r9\n\t"
  111138. "sbcs r6, r6, r10\n\t"
  111139. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  111140. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  111141. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  111142. "sbcs r3, r3, r7\n\t"
  111143. "sbcs r4, r4, r8\n\t"
  111144. "sbcs r5, r5, r9\n\t"
  111145. "sbcs r6, r6, r10\n\t"
  111146. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  111147. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  111148. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  111149. "sbcs r3, r3, r7\n\t"
  111150. "sbcs r4, r4, r8\n\t"
  111151. "sbcs r5, r5, r9\n\t"
  111152. "sbcs r6, r6, r10\n\t"
  111153. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  111154. "ldm %[a]!, {r3}\n\t"
  111155. "ldm %[b]!, {r7}\n\t"
  111156. "sbcs r3, r3, r7\n\t"
  111157. "stm %[r]!, {r3}\n\t"
  111158. "sbc %[r], r6, r6\n\t"
  111159. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  111160. :
  111161. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  111162. );
  111163. return (uint32_t)(size_t)r;
  111164. }
  111165. #endif /* WOLFSSL_SP_SMALL */
  111166. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  111167. *
  111168. * r The resulting Montgomery form number.
  111169. * a The number to convert.
  111170. * m The modulus (prime).
  111171. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  111172. */
  111173. static int sp_521_mod_mul_norm_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  111174. {
  111175. (void)m;
  111176. if (r != a) {
  111177. XMEMCPY(r, a, 17 * sizeof(sp_digit));
  111178. }
  111179. return MP_OKAY;
  111180. }
  111181. /* Convert an mp_int to an array of sp_digit.
  111182. *
  111183. * r A single precision integer.
  111184. * size Maximum number of bytes to convert
  111185. * a A multi-precision integer.
  111186. */
  111187. static void sp_521_from_mp(sp_digit* r, int size, const mp_int* a)
  111188. {
  111189. #if DIGIT_BIT == 32
  111190. int i;
  111191. int j = 0;
  111192. for (i = 0; i < size; i++) {
  111193. sp_digit mask =
  111194. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  111195. r[i] = a->dp[j] & mask;
  111196. j += (int)(((sp_digit)1) -
  111197. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  111198. }
  111199. #elif DIGIT_BIT > 32
  111200. int i;
  111201. int j = 0;
  111202. word32 s = 0;
  111203. r[0] = 0;
  111204. for (i = 0; i < a->used && j < size; i++) {
  111205. r[j] |= ((sp_digit)a->dp[i] << s);
  111206. r[j] &= 0xffffffff;
  111207. s = 32U - s;
  111208. if (j + 1 >= size) {
  111209. break;
  111210. }
  111211. /* lint allow cast of mismatch word32 and mp_digit */
  111212. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  111213. while ((s + 32U) <= (word32)DIGIT_BIT) {
  111214. s += 32U;
  111215. r[j] &= 0xffffffff;
  111216. if (j + 1 >= size) {
  111217. break;
  111218. }
  111219. if (s < (word32)DIGIT_BIT) {
  111220. /* lint allow cast of mismatch word32 and mp_digit */
  111221. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  111222. }
  111223. else {
  111224. r[++j] = (sp_digit)0;
  111225. }
  111226. }
  111227. s = (word32)DIGIT_BIT - s;
  111228. }
  111229. for (j++; j < size; j++) {
  111230. r[j] = 0;
  111231. }
  111232. #else
  111233. int i;
  111234. int j = 0;
  111235. int s = 0;
  111236. r[0] = 0;
  111237. for (i = 0; i < a->used && j < size; i++) {
  111238. r[j] |= ((sp_digit)a->dp[i]) << s;
  111239. if (s + DIGIT_BIT >= 32) {
  111240. r[j] &= 0xffffffff;
  111241. if (j + 1 >= size) {
  111242. break;
  111243. }
  111244. s = 32 - s;
  111245. if (s == DIGIT_BIT) {
  111246. r[++j] = 0;
  111247. s = 0;
  111248. }
  111249. else {
  111250. r[++j] = a->dp[i] >> s;
  111251. s = DIGIT_BIT - s;
  111252. }
  111253. }
  111254. else {
  111255. s += DIGIT_BIT;
  111256. }
  111257. }
  111258. for (j++; j < size; j++) {
  111259. r[j] = 0;
  111260. }
  111261. #endif
  111262. }
  111263. /* Convert a point of type ecc_point to type sp_point_521.
  111264. *
  111265. * p Point of type sp_point_521 (result).
  111266. * pm Point of type ecc_point.
  111267. */
  111268. static void sp_521_point_from_ecc_point_17(sp_point_521* p,
  111269. const ecc_point* pm)
  111270. {
  111271. XMEMSET(p->x, 0, sizeof(p->x));
  111272. XMEMSET(p->y, 0, sizeof(p->y));
  111273. XMEMSET(p->z, 0, sizeof(p->z));
  111274. sp_521_from_mp(p->x, 17, pm->x);
  111275. sp_521_from_mp(p->y, 17, pm->y);
  111276. sp_521_from_mp(p->z, 17, pm->z);
  111277. p->infinity = 0;
  111278. }
  111279. /* Convert an array of sp_digit to an mp_int.
  111280. *
  111281. * a A single precision integer.
  111282. * r A multi-precision integer.
  111283. */
  111284. static int sp_521_to_mp(const sp_digit* a, mp_int* r)
  111285. {
  111286. int err;
  111287. err = mp_grow(r, (521 + DIGIT_BIT - 1) / DIGIT_BIT);
  111288. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  111289. #if DIGIT_BIT == 32
  111290. XMEMCPY(r->dp, a, sizeof(sp_digit) * 17);
  111291. r->used = 17;
  111292. mp_clamp(r);
  111293. #elif DIGIT_BIT < 32
  111294. int i;
  111295. int j = 0;
  111296. int s = 0;
  111297. r->dp[0] = 0;
  111298. for (i = 0; i < 17; i++) {
  111299. r->dp[j] |= (mp_digit)(a[i] << s);
  111300. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  111301. s = DIGIT_BIT - s;
  111302. r->dp[++j] = (mp_digit)(a[i] >> s);
  111303. while (s + DIGIT_BIT <= 32) {
  111304. s += DIGIT_BIT;
  111305. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  111306. if (s == SP_WORD_SIZE) {
  111307. r->dp[j] = 0;
  111308. }
  111309. else {
  111310. r->dp[j] = (mp_digit)(a[i] >> s);
  111311. }
  111312. }
  111313. s = 32 - s;
  111314. }
  111315. r->used = (521 + DIGIT_BIT - 1) / DIGIT_BIT;
  111316. mp_clamp(r);
  111317. #else
  111318. int i;
  111319. int j = 0;
  111320. int s = 0;
  111321. r->dp[0] = 0;
  111322. for (i = 0; i < 17; i++) {
  111323. r->dp[j] |= ((mp_digit)a[i]) << s;
  111324. if (s + 32 >= DIGIT_BIT) {
  111325. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  111326. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  111327. #endif
  111328. s = DIGIT_BIT - s;
  111329. r->dp[++j] = a[i] >> s;
  111330. s = 32 - s;
  111331. }
  111332. else {
  111333. s += 32;
  111334. }
  111335. }
  111336. r->used = (521 + DIGIT_BIT - 1) / DIGIT_BIT;
  111337. mp_clamp(r);
  111338. #endif
  111339. }
  111340. return err;
  111341. }
  111342. /* Convert a point of type sp_point_521 to type ecc_point.
  111343. *
  111344. * p Point of type sp_point_521.
  111345. * pm Point of type ecc_point (result).
  111346. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  111347. * MP_OKAY.
  111348. */
  111349. static int sp_521_point_to_ecc_point_17(const sp_point_521* p, ecc_point* pm)
  111350. {
  111351. int err;
  111352. err = sp_521_to_mp(p->x, pm->x);
  111353. if (err == MP_OKAY) {
  111354. err = sp_521_to_mp(p->y, pm->y);
  111355. }
  111356. if (err == MP_OKAY) {
  111357. err = sp_521_to_mp(p->z, pm->z);
  111358. }
  111359. return err;
  111360. }
  111361. #ifdef WOLFSSL_SP_SMALL
  111362. /* Conditionally subtract b from a using the mask m.
  111363. * m is -1 to subtract and 0 when not copying.
  111364. *
  111365. * r A single precision number representing condition subtract result.
  111366. * a A single precision number to subtract from.
  111367. * b A single precision number to subtract.
  111368. * m Mask value to apply.
  111369. */
  111370. static sp_digit sp_521_cond_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  111371. {
  111372. register sp_digit* r asm ("r0") = r_p;
  111373. register const sp_digit* a asm ("r1") = a_p;
  111374. register const sp_digit* b asm ("r2") = b_p;
  111375. register sp_digit m asm ("r3") = m_p;
  111376. __asm__ __volatile__ (
  111377. "mov r6, #0\n\t"
  111378. "mov r12, #0\n\t"
  111379. "mov lr, #0\n\t"
  111380. "\n"
  111381. "L_sp_521_cond_sub_17_words_%=: \n\t"
  111382. "subs r12, r6, r12\n\t"
  111383. "ldr r4, [%[a], lr]\n\t"
  111384. "ldr r5, [%[b], lr]\n\t"
  111385. "and r5, r5, %[m]\n\t"
  111386. "sbcs r4, r4, r5\n\t"
  111387. "sbc r12, r6, r6\n\t"
  111388. "str r4, [%[r], lr]\n\t"
  111389. "add lr, lr, #4\n\t"
  111390. "cmp lr, #0x44\n\t"
  111391. "blt L_sp_521_cond_sub_17_words_%=\n\t"
  111392. "mov %[r], r12\n\t"
  111393. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  111394. :
  111395. : "memory", "r12", "lr", "r4", "r5", "r6"
  111396. );
  111397. return (uint32_t)(size_t)r;
  111398. }
  111399. #else
  111400. /* Conditionally subtract b from a using the mask m.
  111401. * m is -1 to subtract and 0 when not copying.
  111402. *
  111403. * r A single precision number representing condition subtract result.
  111404. * a A single precision number to subtract from.
  111405. * b A single precision number to subtract.
  111406. * m Mask value to apply.
  111407. */
  111408. static sp_digit sp_521_cond_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  111409. {
  111410. register sp_digit* r asm ("r0") = r_p;
  111411. register const sp_digit* a asm ("r1") = a_p;
  111412. register const sp_digit* b asm ("r2") = b_p;
  111413. register sp_digit m asm ("r3") = m_p;
  111414. __asm__ __volatile__ (
  111415. "mov lr, #0\n\t"
  111416. "ldm %[a]!, {r4, r5}\n\t"
  111417. "ldm %[b]!, {r6, r7}\n\t"
  111418. "and r6, r6, %[m]\n\t"
  111419. "and r7, r7, %[m]\n\t"
  111420. "subs r4, r4, r6\n\t"
  111421. "sbcs r5, r5, r7\n\t"
  111422. "stm %[r]!, {r4, r5}\n\t"
  111423. "ldm %[a]!, {r4, r5}\n\t"
  111424. "ldm %[b]!, {r6, r7}\n\t"
  111425. "and r6, r6, %[m]\n\t"
  111426. "and r7, r7, %[m]\n\t"
  111427. "sbcs r4, r4, r6\n\t"
  111428. "sbcs r5, r5, r7\n\t"
  111429. "stm %[r]!, {r4, r5}\n\t"
  111430. "ldm %[a]!, {r4, r5}\n\t"
  111431. "ldm %[b]!, {r6, r7}\n\t"
  111432. "and r6, r6, %[m]\n\t"
  111433. "and r7, r7, %[m]\n\t"
  111434. "sbcs r4, r4, r6\n\t"
  111435. "sbcs r5, r5, r7\n\t"
  111436. "stm %[r]!, {r4, r5}\n\t"
  111437. "ldm %[a]!, {r4, r5}\n\t"
  111438. "ldm %[b]!, {r6, r7}\n\t"
  111439. "and r6, r6, %[m]\n\t"
  111440. "and r7, r7, %[m]\n\t"
  111441. "sbcs r4, r4, r6\n\t"
  111442. "sbcs r5, r5, r7\n\t"
  111443. "stm %[r]!, {r4, r5}\n\t"
  111444. "ldm %[a]!, {r4, r5}\n\t"
  111445. "ldm %[b]!, {r6, r7}\n\t"
  111446. "and r6, r6, %[m]\n\t"
  111447. "and r7, r7, %[m]\n\t"
  111448. "sbcs r4, r4, r6\n\t"
  111449. "sbcs r5, r5, r7\n\t"
  111450. "stm %[r]!, {r4, r5}\n\t"
  111451. "ldm %[a]!, {r4, r5}\n\t"
  111452. "ldm %[b]!, {r6, r7}\n\t"
  111453. "and r6, r6, %[m]\n\t"
  111454. "and r7, r7, %[m]\n\t"
  111455. "sbcs r4, r4, r6\n\t"
  111456. "sbcs r5, r5, r7\n\t"
  111457. "stm %[r]!, {r4, r5}\n\t"
  111458. "ldm %[a]!, {r4, r5}\n\t"
  111459. "ldm %[b]!, {r6, r7}\n\t"
  111460. "and r6, r6, %[m]\n\t"
  111461. "and r7, r7, %[m]\n\t"
  111462. "sbcs r4, r4, r6\n\t"
  111463. "sbcs r5, r5, r7\n\t"
  111464. "stm %[r]!, {r4, r5}\n\t"
  111465. "ldm %[a]!, {r4, r5}\n\t"
  111466. "ldm %[b]!, {r6, r7}\n\t"
  111467. "and r6, r6, %[m]\n\t"
  111468. "and r7, r7, %[m]\n\t"
  111469. "sbcs r4, r4, r6\n\t"
  111470. "sbcs r5, r5, r7\n\t"
  111471. "stm %[r]!, {r4, r5}\n\t"
  111472. "ldr r4, [%[a]]\n\t"
  111473. "ldr r6, [%[b]]\n\t"
  111474. "and r6, r6, %[m]\n\t"
  111475. "sbcs r4, r4, r6\n\t"
  111476. "str r4, [%[r]]\n\t"
  111477. "sbc %[r], lr, lr\n\t"
  111478. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  111479. :
  111480. : "memory", "r12", "lr", "r4", "r5", "r6", "r7"
  111481. );
  111482. return (uint32_t)(size_t)r;
  111483. }
  111484. #endif /* WOLFSSL_SP_SMALL */
  111485. /* Reduce the number back to 521 bits using Montgomery reduction.
  111486. *
  111487. * a A single precision number to reduce in place.
  111488. * m The single precision number representing the modulus.
  111489. * mp The digit representing the negative inverse of m mod 2^n.
  111490. */
  111491. static SP_NOINLINE void sp_521_mont_reduce_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  111492. {
  111493. register sp_digit* a asm ("r0") = a_p;
  111494. __asm__ __volatile__ (
  111495. "sub sp, sp, #0x44\n\t"
  111496. "mov r12, sp\n\t"
  111497. /* Shift top down by 9 bits */
  111498. "add lr, %[a], #0x40\n\t"
  111499. /* 0-7 */
  111500. "ldm lr!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  111501. "lsr r1, r1, #9\n\t"
  111502. "orr r1, r1, r2, lsl #23\n\t"
  111503. "lsr r2, r2, #9\n\t"
  111504. "orr r2, r2, r3, lsl #23\n\t"
  111505. "lsr r3, r3, #9\n\t"
  111506. "orr r3, r3, r4, lsl #23\n\t"
  111507. "lsr r4, r4, #9\n\t"
  111508. "orr r4, r4, r5, lsl #23\n\t"
  111509. "lsr r5, r5, #9\n\t"
  111510. "orr r5, r5, r6, lsl #23\n\t"
  111511. "lsr r6, r6, #9\n\t"
  111512. "orr r6, r6, r7, lsl #23\n\t"
  111513. "lsr r7, r7, #9\n\t"
  111514. "orr r7, r7, r8, lsl #23\n\t"
  111515. "lsr r8, r8, #9\n\t"
  111516. "orr r8, r8, r9, lsl #23\n\t"
  111517. "stm r12!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  111518. "mov r1, r9\n\t"
  111519. /* 8-16 */
  111520. "ldm lr!, {r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  111521. "lsr r1, r1, #9\n\t"
  111522. "orr r1, r1, r2, lsl #23\n\t"
  111523. "lsr r2, r2, #9\n\t"
  111524. "orr r2, r2, r3, lsl #23\n\t"
  111525. "lsr r3, r3, #9\n\t"
  111526. "orr r3, r3, r4, lsl #23\n\t"
  111527. "lsr r4, r4, #9\n\t"
  111528. "orr r4, r4, r5, lsl #23\n\t"
  111529. "lsr r5, r5, #9\n\t"
  111530. "orr r5, r5, r6, lsl #23\n\t"
  111531. "lsr r6, r6, #9\n\t"
  111532. "orr r6, r6, r7, lsl #23\n\t"
  111533. "lsr r7, r7, #9\n\t"
  111534. "orr r7, r7, r8, lsl #23\n\t"
  111535. "lsr r8, r8, #9\n\t"
  111536. "orr r8, r8, r9, lsl #23\n\t"
  111537. "lsr r9, r9, #9\n\t"
  111538. "stm r12!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  111539. /* Add top to bottom */
  111540. /* 0-5 */
  111541. "ldm %[a], {r1, r2, r3, r4, r5, r6}\n\t"
  111542. "ldm sp!, {r7, r8, r9, r10, r11, r12}\n\t"
  111543. "adds r1, r1, r7\n\t"
  111544. "adcs r2, r2, r8\n\t"
  111545. "adcs r3, r3, r9\n\t"
  111546. "adcs r4, r4, r10\n\t"
  111547. "adcs r5, r5, r11\n\t"
  111548. "adcs r6, r6, r12\n\t"
  111549. "stm %[a]!, {r1, r2, r3, r4, r5, r6}\n\t"
  111550. /* 6-11 */
  111551. "ldm %[a], {r1, r2, r3, r4, r5, r6}\n\t"
  111552. "ldm sp!, {r7, r8, r9, r10, r11, r12}\n\t"
  111553. "adcs r1, r1, r7\n\t"
  111554. "adcs r2, r2, r8\n\t"
  111555. "adcs r3, r3, r9\n\t"
  111556. "adcs r4, r4, r10\n\t"
  111557. "adcs r5, r5, r11\n\t"
  111558. "adcs r6, r6, r12\n\t"
  111559. "stm %[a]!, {r1, r2, r3, r4, r5, r6}\n\t"
  111560. /* 12-16 */
  111561. "ldm %[a], {r1, r2, r3, r4, r5}\n\t"
  111562. "ldm sp!, {r7, r8, r9, r10, r11}\n\t"
  111563. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  111564. "mov lr, #0x1\n\t"
  111565. "lsl lr, lr, #8\n\t"
  111566. "add lr, lr, #0xff\n\t"
  111567. #else
  111568. "mov lr, #0x1ff\n\t"
  111569. #endif
  111570. "and r5, r5, lr\n\t"
  111571. "adcs r1, r1, r7\n\t"
  111572. "adcs r2, r2, r8\n\t"
  111573. "adcs r3, r3, r9\n\t"
  111574. "adcs r4, r4, r10\n\t"
  111575. "adcs r5, r5, r11\n\t"
  111576. "lsr r12, r5, #9\n\t"
  111577. "and r5, r5, lr\n\t"
  111578. "stm %[a]!, {r1, r2, r3, r4, r5}\n\t"
  111579. "sub %[a], %[a], #0x44\n\t"
  111580. /* Add overflow */
  111581. /* 0-8 */
  111582. "ldm %[a], {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  111583. "adds r1, r1, r12\n\t"
  111584. "adcs r2, r2, #0\n\t"
  111585. "adcs r3, r3, #0\n\t"
  111586. "adcs r4, r4, #0\n\t"
  111587. "adcs r5, r5, #0\n\t"
  111588. "adcs r6, r6, #0\n\t"
  111589. "adcs r7, r7, #0\n\t"
  111590. "adcs r8, r8, #0\n\t"
  111591. "adcs r9, r9, #0\n\t"
  111592. "stm %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t"
  111593. /* 9-16 */
  111594. "ldm %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  111595. "adcs r1, r1, #0\n\t"
  111596. "adcs r2, r2, #0\n\t"
  111597. "adcs r3, r3, #0\n\t"
  111598. "adcs r4, r4, #0\n\t"
  111599. "adcs r5, r5, #0\n\t"
  111600. "adcs r6, r6, #0\n\t"
  111601. "adcs r7, r7, #0\n\t"
  111602. "adcs r8, r8, #0\n\t"
  111603. "stm %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t"
  111604. : [a] "+r" (a)
  111605. :
  111606. : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  111607. );
  111608. (void)m_p;
  111609. (void)mp_p;
  111610. }
  111611. /* Reduce the number back to 521 bits using Montgomery reduction.
  111612. *
  111613. * a A single precision number to reduce in place.
  111614. * m The single precision number representing the modulus.
  111615. * mp The digit representing the negative inverse of m mod 2^n.
  111616. */
  111617. static SP_NOINLINE void sp_521_mont_reduce_order_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  111618. {
  111619. register sp_digit* a asm ("r0") = a_p;
  111620. register const sp_digit* m asm ("r1") = m_p;
  111621. register sp_digit mp asm ("r2") = mp_p;
  111622. __asm__ __volatile__ (
  111623. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  111624. "ldr r11, [%[m]]\n\t"
  111625. #endif
  111626. /* i = 0 */
  111627. "mov r9, #0\n\t"
  111628. "mov r3, #0\n\t"
  111629. "ldr r12, [%[a]]\n\t"
  111630. "ldr lr, [%[a], #4]\n\t"
  111631. "\n"
  111632. "L_sp_521_mont_reduce_order_17_word_%=: \n\t"
  111633. /* mu = a[i] * mp */
  111634. "mul r8, %[mp], r12\n\t"
  111635. "cmp r9, #0x40\n\t"
  111636. "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t"
  111637. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  111638. "mov r7, #0x1\n\t"
  111639. "lsl r7, r7, #8\n\t"
  111640. "add r7, r7, #0xff\n\t"
  111641. #else
  111642. "mov r7, #0x1ff\n\t"
  111643. #endif
  111644. "and r8, r8, r7\n\t"
  111645. "\n"
  111646. "L_sp_521_mont_reduce_order_17_nomask_%=: \n\t"
  111647. /* a[i+0] += m[0] * mu */
  111648. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  111649. "ldr r11, [%[m]]\n\t"
  111650. #endif
  111651. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  111652. "lsr r7, r11, #16\n\t"
  111653. "lsr r6, r8, #16\n\t"
  111654. "mul r5, r6, r7\n\t"
  111655. "lsl r7, r11, #16\n\t"
  111656. "lsr r7, r7, #16\n\t"
  111657. "mul r6, r7, r6\n\t"
  111658. "lsr r7, r6, #16\n\t"
  111659. "lsl r6, r6, #16\n\t"
  111660. "adds r12, r12, r6\n\t"
  111661. "adc r5, r5, r7\n\t"
  111662. "lsl r6, r8, #16\n\t"
  111663. "lsl r7, r11, #16\n\t"
  111664. "lsr r6, r6, #16\n\t"
  111665. "lsr r7, r7, #16\n\t"
  111666. "mul r7, r6, r7\n\t"
  111667. "adds r12, r12, r7\n\t"
  111668. "adc r5, r5, #0\n\t"
  111669. "lsr r7, r11, #16\n\t"
  111670. "mul r6, r7, r6\n\t"
  111671. "lsr r7, r6, #16\n\t"
  111672. "lsl r6, r6, #16\n\t"
  111673. "adds r12, r12, r6\n\t"
  111674. "adc r5, r5, r7\n\t"
  111675. #else
  111676. "umull r6, r7, r8, r11\n\t"
  111677. "adds r12, r12, r6\n\t"
  111678. "adc r5, r7, #0\n\t"
  111679. #endif
  111680. "str r12, [%[a]]\n\t"
  111681. /* a[i+1] += m[1] * mu */
  111682. "ldr r7, [%[m], #4]\n\t"
  111683. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  111684. "lsr r10, r7, #16\n\t"
  111685. "lsr r6, r8, #16\n\t"
  111686. "mul r4, r6, r10\n\t"
  111687. "lsl r10, r7, #16\n\t"
  111688. "lsr r10, r10, #16\n\t"
  111689. "mul r6, r10, r6\n\t"
  111690. "lsr r10, r6, #16\n\t"
  111691. "lsl r6, r6, #16\n\t"
  111692. "adds lr, lr, r6\n\t"
  111693. "adc r4, r4, r10\n\t"
  111694. "lsl r6, r8, #16\n\t"
  111695. "lsl r10, r7, #16\n\t"
  111696. "lsr r6, r6, #16\n\t"
  111697. "lsr r10, r10, #16\n\t"
  111698. "mul r10, r6, r10\n\t"
  111699. "adds lr, lr, r10\n\t"
  111700. "adc r4, r4, #0\n\t"
  111701. "lsr r10, r7, #16\n\t"
  111702. "mul r6, r10, r6\n\t"
  111703. "lsr r10, r6, #16\n\t"
  111704. "lsl r6, r6, #16\n\t"
  111705. "adds lr, lr, r6\n\t"
  111706. "adc r4, r4, r10\n\t"
  111707. #else
  111708. "umull r6, r10, r8, r7\n\t"
  111709. "adds lr, lr, r6\n\t"
  111710. "adc r4, r10, #0\n\t"
  111711. #endif
  111712. "mov r12, lr\n\t"
  111713. "adds r12, r12, r5\n\t"
  111714. "adc r4, r4, #0\n\t"
  111715. /* a[i+2] += m[2] * mu */
  111716. "ldr r7, [%[m], #8]\n\t"
  111717. "ldr lr, [%[a], #8]\n\t"
  111718. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  111719. "lsr r10, r7, #16\n\t"
  111720. "lsr r6, r8, #16\n\t"
  111721. "mul r5, r6, r10\n\t"
  111722. "lsl r10, r7, #16\n\t"
  111723. "lsr r10, r10, #16\n\t"
  111724. "mul r6, r10, r6\n\t"
  111725. "lsr r10, r6, #16\n\t"
  111726. "lsl r6, r6, #16\n\t"
  111727. "adds lr, lr, r6\n\t"
  111728. "adc r5, r5, r10\n\t"
  111729. "lsl r6, r8, #16\n\t"
  111730. "lsl r10, r7, #16\n\t"
  111731. "lsr r6, r6, #16\n\t"
  111732. "lsr r10, r10, #16\n\t"
  111733. "mul r10, r6, r10\n\t"
  111734. "adds lr, lr, r10\n\t"
  111735. "adc r5, r5, #0\n\t"
  111736. "lsr r10, r7, #16\n\t"
  111737. "mul r6, r10, r6\n\t"
  111738. "lsr r10, r6, #16\n\t"
  111739. "lsl r6, r6, #16\n\t"
  111740. "adds lr, lr, r6\n\t"
  111741. "adc r5, r5, r10\n\t"
  111742. #else
  111743. "umull r6, r10, r8, r7\n\t"
  111744. "adds lr, lr, r6\n\t"
  111745. "adc r5, r10, #0\n\t"
  111746. #endif
  111747. "adds lr, lr, r4\n\t"
  111748. "adc r5, r5, #0\n\t"
  111749. /* a[i+3] += m[3] * mu */
  111750. "ldr r7, [%[m], #12]\n\t"
  111751. "ldr r10, [%[a], #12]\n\t"
  111752. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  111753. "lsr r11, r7, #16\n\t"
  111754. "lsr r6, r8, #16\n\t"
  111755. "mul r4, r6, r11\n\t"
  111756. "lsl r11, r7, #16\n\t"
  111757. "lsr r11, r11, #16\n\t"
  111758. "mul r6, r11, r6\n\t"
  111759. "lsr r11, r6, #16\n\t"
  111760. "lsl r6, r6, #16\n\t"
  111761. "adds r10, r10, r6\n\t"
  111762. "adc r4, r4, r11\n\t"
  111763. "lsl r6, r8, #16\n\t"
  111764. "lsl r11, r7, #16\n\t"
  111765. "lsr r6, r6, #16\n\t"
  111766. "lsr r11, r11, #16\n\t"
  111767. "mul r11, r6, r11\n\t"
  111768. "adds r10, r10, r11\n\t"
  111769. "adc r4, r4, #0\n\t"
  111770. "lsr r11, r7, #16\n\t"
  111771. "mul r6, r11, r6\n\t"
  111772. "lsr r11, r6, #16\n\t"
  111773. "lsl r6, r6, #16\n\t"
  111774. "adds r10, r10, r6\n\t"
  111775. "adc r4, r4, r11\n\t"
  111776. #else
  111777. "umull r6, r7, r8, r7\n\t"
  111778. "adds r10, r10, r6\n\t"
  111779. "adc r4, r7, #0\n\t"
  111780. #endif
  111781. "adds r10, r10, r5\n\t"
  111782. "str r10, [%[a], #12]\n\t"
  111783. "adc r4, r4, #0\n\t"
  111784. /* a[i+4] += m[4] * mu */
  111785. "ldr r7, [%[m], #16]\n\t"
  111786. "ldr r10, [%[a], #16]\n\t"
  111787. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  111788. "lsr r11, r7, #16\n\t"
  111789. "lsr r6, r8, #16\n\t"
  111790. "mul r5, r6, r11\n\t"
  111791. "lsl r11, r7, #16\n\t"
  111792. "lsr r11, r11, #16\n\t"
  111793. "mul r6, r11, r6\n\t"
  111794. "lsr r11, r6, #16\n\t"
  111795. "lsl r6, r6, #16\n\t"
  111796. "adds r10, r10, r6\n\t"
  111797. "adc r5, r5, r11\n\t"
  111798. "lsl r6, r8, #16\n\t"
  111799. "lsl r11, r7, #16\n\t"
  111800. "lsr r6, r6, #16\n\t"
  111801. "lsr r11, r11, #16\n\t"
  111802. "mul r11, r6, r11\n\t"
  111803. "adds r10, r10, r11\n\t"
  111804. "adc r5, r5, #0\n\t"
  111805. "lsr r11, r7, #16\n\t"
  111806. "mul r6, r11, r6\n\t"
  111807. "lsr r11, r6, #16\n\t"
  111808. "lsl r6, r6, #16\n\t"
  111809. "adds r10, r10, r6\n\t"
  111810. "adc r5, r5, r11\n\t"
  111811. #else
  111812. "umull r6, r7, r8, r7\n\t"
  111813. "adds r10, r10, r6\n\t"
  111814. "adc r5, r7, #0\n\t"
  111815. #endif
  111816. "adds r10, r10, r4\n\t"
  111817. "str r10, [%[a], #16]\n\t"
  111818. "adc r5, r5, #0\n\t"
  111819. /* a[i+5] += m[5] * mu */
  111820. "ldr r7, [%[m], #20]\n\t"
  111821. "ldr r10, [%[a], #20]\n\t"
  111822. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  111823. "lsr r11, r7, #16\n\t"
  111824. "lsr r6, r8, #16\n\t"
  111825. "mul r4, r6, r11\n\t"
  111826. "lsl r11, r7, #16\n\t"
  111827. "lsr r11, r11, #16\n\t"
  111828. "mul r6, r11, r6\n\t"
  111829. "lsr r11, r6, #16\n\t"
  111830. "lsl r6, r6, #16\n\t"
  111831. "adds r10, r10, r6\n\t"
  111832. "adc r4, r4, r11\n\t"
  111833. "lsl r6, r8, #16\n\t"
  111834. "lsl r11, r7, #16\n\t"
  111835. "lsr r6, r6, #16\n\t"
  111836. "lsr r11, r11, #16\n\t"
  111837. "mul r11, r6, r11\n\t"
  111838. "adds r10, r10, r11\n\t"
  111839. "adc r4, r4, #0\n\t"
  111840. "lsr r11, r7, #16\n\t"
  111841. "mul r6, r11, r6\n\t"
  111842. "lsr r11, r6, #16\n\t"
  111843. "lsl r6, r6, #16\n\t"
  111844. "adds r10, r10, r6\n\t"
  111845. "adc r4, r4, r11\n\t"
  111846. #else
  111847. "umull r6, r7, r8, r7\n\t"
  111848. "adds r10, r10, r6\n\t"
  111849. "adc r4, r7, #0\n\t"
  111850. #endif
  111851. "adds r10, r10, r5\n\t"
  111852. "str r10, [%[a], #20]\n\t"
  111853. "adc r4, r4, #0\n\t"
  111854. /* a[i+6] += m[6] * mu */
  111855. "ldr r7, [%[m], #24]\n\t"
  111856. "ldr r10, [%[a], #24]\n\t"
  111857. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  111858. "lsr r11, r7, #16\n\t"
  111859. "lsr r6, r8, #16\n\t"
  111860. "mul r5, r6, r11\n\t"
  111861. "lsl r11, r7, #16\n\t"
  111862. "lsr r11, r11, #16\n\t"
  111863. "mul r6, r11, r6\n\t"
  111864. "lsr r11, r6, #16\n\t"
  111865. "lsl r6, r6, #16\n\t"
  111866. "adds r10, r10, r6\n\t"
  111867. "adc r5, r5, r11\n\t"
  111868. "lsl r6, r8, #16\n\t"
  111869. "lsl r11, r7, #16\n\t"
  111870. "lsr r6, r6, #16\n\t"
  111871. "lsr r11, r11, #16\n\t"
  111872. "mul r11, r6, r11\n\t"
  111873. "adds r10, r10, r11\n\t"
  111874. "adc r5, r5, #0\n\t"
  111875. "lsr r11, r7, #16\n\t"
  111876. "mul r6, r11, r6\n\t"
  111877. "lsr r11, r6, #16\n\t"
  111878. "lsl r6, r6, #16\n\t"
  111879. "adds r10, r10, r6\n\t"
  111880. "adc r5, r5, r11\n\t"
  111881. #else
  111882. "umull r6, r7, r8, r7\n\t"
  111883. "adds r10, r10, r6\n\t"
  111884. "adc r5, r7, #0\n\t"
  111885. #endif
  111886. "adds r10, r10, r4\n\t"
  111887. "str r10, [%[a], #24]\n\t"
  111888. "adc r5, r5, #0\n\t"
  111889. /* a[i+7] += m[7] * mu */
  111890. "ldr r7, [%[m], #28]\n\t"
  111891. "ldr r10, [%[a], #28]\n\t"
  111892. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  111893. "lsr r11, r7, #16\n\t"
  111894. "lsr r6, r8, #16\n\t"
  111895. "mul r4, r6, r11\n\t"
  111896. "lsl r11, r7, #16\n\t"
  111897. "lsr r11, r11, #16\n\t"
  111898. "mul r6, r11, r6\n\t"
  111899. "lsr r11, r6, #16\n\t"
  111900. "lsl r6, r6, #16\n\t"
  111901. "adds r10, r10, r6\n\t"
  111902. "adc r4, r4, r11\n\t"
  111903. "lsl r6, r8, #16\n\t"
  111904. "lsl r11, r7, #16\n\t"
  111905. "lsr r6, r6, #16\n\t"
  111906. "lsr r11, r11, #16\n\t"
  111907. "mul r11, r6, r11\n\t"
  111908. "adds r10, r10, r11\n\t"
  111909. "adc r4, r4, #0\n\t"
  111910. "lsr r11, r7, #16\n\t"
  111911. "mul r6, r11, r6\n\t"
  111912. "lsr r11, r6, #16\n\t"
  111913. "lsl r6, r6, #16\n\t"
  111914. "adds r10, r10, r6\n\t"
  111915. "adc r4, r4, r11\n\t"
  111916. #else
  111917. "umull r6, r7, r8, r7\n\t"
  111918. "adds r10, r10, r6\n\t"
  111919. "adc r4, r7, #0\n\t"
  111920. #endif
  111921. "adds r10, r10, r5\n\t"
  111922. "str r10, [%[a], #28]\n\t"
  111923. "adc r4, r4, #0\n\t"
  111924. /* a[i+8] += m[8] * mu */
  111925. "ldr r7, [%[m], #32]\n\t"
  111926. "ldr r10, [%[a], #32]\n\t"
  111927. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  111928. "lsr r11, r7, #16\n\t"
  111929. "lsr r6, r8, #16\n\t"
  111930. "mul r5, r6, r11\n\t"
  111931. "lsl r11, r7, #16\n\t"
  111932. "lsr r11, r11, #16\n\t"
  111933. "mul r6, r11, r6\n\t"
  111934. "lsr r11, r6, #16\n\t"
  111935. "lsl r6, r6, #16\n\t"
  111936. "adds r10, r10, r6\n\t"
  111937. "adc r5, r5, r11\n\t"
  111938. "lsl r6, r8, #16\n\t"
  111939. "lsl r11, r7, #16\n\t"
  111940. "lsr r6, r6, #16\n\t"
  111941. "lsr r11, r11, #16\n\t"
  111942. "mul r11, r6, r11\n\t"
  111943. "adds r10, r10, r11\n\t"
  111944. "adc r5, r5, #0\n\t"
  111945. "lsr r11, r7, #16\n\t"
  111946. "mul r6, r11, r6\n\t"
  111947. "lsr r11, r6, #16\n\t"
  111948. "lsl r6, r6, #16\n\t"
  111949. "adds r10, r10, r6\n\t"
  111950. "adc r5, r5, r11\n\t"
  111951. #else
  111952. "umull r6, r7, r8, r7\n\t"
  111953. "adds r10, r10, r6\n\t"
  111954. "adc r5, r7, #0\n\t"
  111955. #endif
  111956. "adds r10, r10, r4\n\t"
  111957. "str r10, [%[a], #32]\n\t"
  111958. "adc r5, r5, #0\n\t"
  111959. /* a[i+9] += m[9] * mu */
  111960. "ldr r7, [%[m], #36]\n\t"
  111961. "ldr r10, [%[a], #36]\n\t"
  111962. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  111963. "lsr r11, r7, #16\n\t"
  111964. "lsr r6, r8, #16\n\t"
  111965. "mul r4, r6, r11\n\t"
  111966. "lsl r11, r7, #16\n\t"
  111967. "lsr r11, r11, #16\n\t"
  111968. "mul r6, r11, r6\n\t"
  111969. "lsr r11, r6, #16\n\t"
  111970. "lsl r6, r6, #16\n\t"
  111971. "adds r10, r10, r6\n\t"
  111972. "adc r4, r4, r11\n\t"
  111973. "lsl r6, r8, #16\n\t"
  111974. "lsl r11, r7, #16\n\t"
  111975. "lsr r6, r6, #16\n\t"
  111976. "lsr r11, r11, #16\n\t"
  111977. "mul r11, r6, r11\n\t"
  111978. "adds r10, r10, r11\n\t"
  111979. "adc r4, r4, #0\n\t"
  111980. "lsr r11, r7, #16\n\t"
  111981. "mul r6, r11, r6\n\t"
  111982. "lsr r11, r6, #16\n\t"
  111983. "lsl r6, r6, #16\n\t"
  111984. "adds r10, r10, r6\n\t"
  111985. "adc r4, r4, r11\n\t"
  111986. #else
  111987. "umull r6, r7, r8, r7\n\t"
  111988. "adds r10, r10, r6\n\t"
  111989. "adc r4, r7, #0\n\t"
  111990. #endif
  111991. "adds r10, r10, r5\n\t"
  111992. "str r10, [%[a], #36]\n\t"
  111993. "adc r4, r4, #0\n\t"
  111994. /* a[i+10] += m[10] * mu */
  111995. "ldr r7, [%[m], #40]\n\t"
  111996. "ldr r10, [%[a], #40]\n\t"
  111997. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  111998. "lsr r11, r7, #16\n\t"
  111999. "lsr r6, r8, #16\n\t"
  112000. "mul r5, r6, r11\n\t"
  112001. "lsl r11, r7, #16\n\t"
  112002. "lsr r11, r11, #16\n\t"
  112003. "mul r6, r11, r6\n\t"
  112004. "lsr r11, r6, #16\n\t"
  112005. "lsl r6, r6, #16\n\t"
  112006. "adds r10, r10, r6\n\t"
  112007. "adc r5, r5, r11\n\t"
  112008. "lsl r6, r8, #16\n\t"
  112009. "lsl r11, r7, #16\n\t"
  112010. "lsr r6, r6, #16\n\t"
  112011. "lsr r11, r11, #16\n\t"
  112012. "mul r11, r6, r11\n\t"
  112013. "adds r10, r10, r11\n\t"
  112014. "adc r5, r5, #0\n\t"
  112015. "lsr r11, r7, #16\n\t"
  112016. "mul r6, r11, r6\n\t"
  112017. "lsr r11, r6, #16\n\t"
  112018. "lsl r6, r6, #16\n\t"
  112019. "adds r10, r10, r6\n\t"
  112020. "adc r5, r5, r11\n\t"
  112021. #else
  112022. "umull r6, r7, r8, r7\n\t"
  112023. "adds r10, r10, r6\n\t"
  112024. "adc r5, r7, #0\n\t"
  112025. #endif
  112026. "adds r10, r10, r4\n\t"
  112027. "str r10, [%[a], #40]\n\t"
  112028. "adc r5, r5, #0\n\t"
  112029. /* a[i+11] += m[11] * mu */
  112030. "ldr r7, [%[m], #44]\n\t"
  112031. "ldr r10, [%[a], #44]\n\t"
  112032. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  112033. "lsr r11, r7, #16\n\t"
  112034. "lsr r6, r8, #16\n\t"
  112035. "mul r4, r6, r11\n\t"
  112036. "lsl r11, r7, #16\n\t"
  112037. "lsr r11, r11, #16\n\t"
  112038. "mul r6, r11, r6\n\t"
  112039. "lsr r11, r6, #16\n\t"
  112040. "lsl r6, r6, #16\n\t"
  112041. "adds r10, r10, r6\n\t"
  112042. "adc r4, r4, r11\n\t"
  112043. "lsl r6, r8, #16\n\t"
  112044. "lsl r11, r7, #16\n\t"
  112045. "lsr r6, r6, #16\n\t"
  112046. "lsr r11, r11, #16\n\t"
  112047. "mul r11, r6, r11\n\t"
  112048. "adds r10, r10, r11\n\t"
  112049. "adc r4, r4, #0\n\t"
  112050. "lsr r11, r7, #16\n\t"
  112051. "mul r6, r11, r6\n\t"
  112052. "lsr r11, r6, #16\n\t"
  112053. "lsl r6, r6, #16\n\t"
  112054. "adds r10, r10, r6\n\t"
  112055. "adc r4, r4, r11\n\t"
  112056. #else
  112057. "umull r6, r7, r8, r7\n\t"
  112058. "adds r10, r10, r6\n\t"
  112059. "adc r4, r7, #0\n\t"
  112060. #endif
  112061. "adds r10, r10, r5\n\t"
  112062. "str r10, [%[a], #44]\n\t"
  112063. "adc r4, r4, #0\n\t"
  112064. /* a[i+12] += m[12] * mu */
  112065. "ldr r7, [%[m], #48]\n\t"
  112066. "ldr r10, [%[a], #48]\n\t"
  112067. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  112068. "lsr r11, r7, #16\n\t"
  112069. "lsr r6, r8, #16\n\t"
  112070. "mul r5, r6, r11\n\t"
  112071. "lsl r11, r7, #16\n\t"
  112072. "lsr r11, r11, #16\n\t"
  112073. "mul r6, r11, r6\n\t"
  112074. "lsr r11, r6, #16\n\t"
  112075. "lsl r6, r6, #16\n\t"
  112076. "adds r10, r10, r6\n\t"
  112077. "adc r5, r5, r11\n\t"
  112078. "lsl r6, r8, #16\n\t"
  112079. "lsl r11, r7, #16\n\t"
  112080. "lsr r6, r6, #16\n\t"
  112081. "lsr r11, r11, #16\n\t"
  112082. "mul r11, r6, r11\n\t"
  112083. "adds r10, r10, r11\n\t"
  112084. "adc r5, r5, #0\n\t"
  112085. "lsr r11, r7, #16\n\t"
  112086. "mul r6, r11, r6\n\t"
  112087. "lsr r11, r6, #16\n\t"
  112088. "lsl r6, r6, #16\n\t"
  112089. "adds r10, r10, r6\n\t"
  112090. "adc r5, r5, r11\n\t"
  112091. #else
  112092. "umull r6, r7, r8, r7\n\t"
  112093. "adds r10, r10, r6\n\t"
  112094. "adc r5, r7, #0\n\t"
  112095. #endif
  112096. "adds r10, r10, r4\n\t"
  112097. "str r10, [%[a], #48]\n\t"
  112098. "adc r5, r5, #0\n\t"
  112099. /* a[i+13] += m[13] * mu */
  112100. "ldr r7, [%[m], #52]\n\t"
  112101. "ldr r10, [%[a], #52]\n\t"
  112102. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  112103. "lsr r11, r7, #16\n\t"
  112104. "lsr r6, r8, #16\n\t"
  112105. "mul r4, r6, r11\n\t"
  112106. "lsl r11, r7, #16\n\t"
  112107. "lsr r11, r11, #16\n\t"
  112108. "mul r6, r11, r6\n\t"
  112109. "lsr r11, r6, #16\n\t"
  112110. "lsl r6, r6, #16\n\t"
  112111. "adds r10, r10, r6\n\t"
  112112. "adc r4, r4, r11\n\t"
  112113. "lsl r6, r8, #16\n\t"
  112114. "lsl r11, r7, #16\n\t"
  112115. "lsr r6, r6, #16\n\t"
  112116. "lsr r11, r11, #16\n\t"
  112117. "mul r11, r6, r11\n\t"
  112118. "adds r10, r10, r11\n\t"
  112119. "adc r4, r4, #0\n\t"
  112120. "lsr r11, r7, #16\n\t"
  112121. "mul r6, r11, r6\n\t"
  112122. "lsr r11, r6, #16\n\t"
  112123. "lsl r6, r6, #16\n\t"
  112124. "adds r10, r10, r6\n\t"
  112125. "adc r4, r4, r11\n\t"
  112126. #else
  112127. "umull r6, r7, r8, r7\n\t"
  112128. "adds r10, r10, r6\n\t"
  112129. "adc r4, r7, #0\n\t"
  112130. #endif
  112131. "adds r10, r10, r5\n\t"
  112132. "str r10, [%[a], #52]\n\t"
  112133. "adc r4, r4, #0\n\t"
  112134. /* a[i+14] += m[14] * mu */
  112135. "ldr r7, [%[m], #56]\n\t"
  112136. "ldr r10, [%[a], #56]\n\t"
  112137. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  112138. "lsr r11, r7, #16\n\t"
  112139. "lsr r6, r8, #16\n\t"
  112140. "mul r5, r6, r11\n\t"
  112141. "lsl r11, r7, #16\n\t"
  112142. "lsr r11, r11, #16\n\t"
  112143. "mul r6, r11, r6\n\t"
  112144. "lsr r11, r6, #16\n\t"
  112145. "lsl r6, r6, #16\n\t"
  112146. "adds r10, r10, r6\n\t"
  112147. "adc r5, r5, r11\n\t"
  112148. "lsl r6, r8, #16\n\t"
  112149. "lsl r11, r7, #16\n\t"
  112150. "lsr r6, r6, #16\n\t"
  112151. "lsr r11, r11, #16\n\t"
  112152. "mul r11, r6, r11\n\t"
  112153. "adds r10, r10, r11\n\t"
  112154. "adc r5, r5, #0\n\t"
  112155. "lsr r11, r7, #16\n\t"
  112156. "mul r6, r11, r6\n\t"
  112157. "lsr r11, r6, #16\n\t"
  112158. "lsl r6, r6, #16\n\t"
  112159. "adds r10, r10, r6\n\t"
  112160. "adc r5, r5, r11\n\t"
  112161. #else
  112162. "umull r6, r7, r8, r7\n\t"
  112163. "adds r10, r10, r6\n\t"
  112164. "adc r5, r7, #0\n\t"
  112165. #endif
  112166. "adds r10, r10, r4\n\t"
  112167. "str r10, [%[a], #56]\n\t"
  112168. "adc r5, r5, #0\n\t"
  112169. /* a[i+15] += m[15] * mu */
  112170. "ldr r7, [%[m], #60]\n\t"
  112171. "ldr r10, [%[a], #60]\n\t"
  112172. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  112173. "lsr r11, r7, #16\n\t"
  112174. "lsr r6, r8, #16\n\t"
  112175. "mul r4, r6, r11\n\t"
  112176. "lsl r11, r7, #16\n\t"
  112177. "lsr r11, r11, #16\n\t"
  112178. "mul r6, r11, r6\n\t"
  112179. "lsr r11, r6, #16\n\t"
  112180. "lsl r6, r6, #16\n\t"
  112181. "adds r10, r10, r6\n\t"
  112182. "adc r4, r4, r11\n\t"
  112183. "lsl r6, r8, #16\n\t"
  112184. "lsl r11, r7, #16\n\t"
  112185. "lsr r6, r6, #16\n\t"
  112186. "lsr r11, r11, #16\n\t"
  112187. "mul r11, r6, r11\n\t"
  112188. "adds r10, r10, r11\n\t"
  112189. "adc r4, r4, #0\n\t"
  112190. "lsr r11, r7, #16\n\t"
  112191. "mul r6, r11, r6\n\t"
  112192. "lsr r11, r6, #16\n\t"
  112193. "lsl r6, r6, #16\n\t"
  112194. "adds r10, r10, r6\n\t"
  112195. "adc r4, r4, r11\n\t"
  112196. #else
  112197. "umull r6, r7, r8, r7\n\t"
  112198. "adds r10, r10, r6\n\t"
  112199. "adc r4, r7, #0\n\t"
  112200. #endif
  112201. "adds r10, r10, r5\n\t"
  112202. "str r10, [%[a], #60]\n\t"
  112203. "adc r4, r4, #0\n\t"
  112204. /* a[i+16] += m[16] * mu */
  112205. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  112206. "ldr r7, [%[m], #64]\n\t"
  112207. #else
  112208. "ldr r11, [%[m], #64]\n\t"
  112209. #endif
  112210. "ldr r10, [%[a], #64]\n\t"
  112211. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  112212. "lsl r6, r8, #16\n\t"
  112213. "lsl r7, r11, #16\n\t"
  112214. "lsr r6, r6, #16\n\t"
  112215. "lsr r7, r7, #16\n\t"
  112216. "mul r7, r6, r7\n\t"
  112217. "adds r4, r4, r7\n\t"
  112218. "adcs r5, r3, #0\n\t"
  112219. "mov r3, #0\n\t"
  112220. "adc r3, r3, r3\n\t"
  112221. "lsr r7, r11, #16\n\t"
  112222. "mul r6, r7, r6\n\t"
  112223. "lsr r7, r6, #16\n\t"
  112224. "lsl r6, r6, #16\n\t"
  112225. "adds r4, r4, r6\n\t"
  112226. "adcs r5, r5, r7\n\t"
  112227. "adc r3, r3, #0\n\t"
  112228. "mov r6, r8\n\t"
  112229. "lsr r7, r11, #16\n\t"
  112230. "lsr r6, r6, #16\n\t"
  112231. "mul r7, r6, r7\n\t"
  112232. "adds r5, r5, r7\n\t"
  112233. "lsl r7, r11, #16\n\t"
  112234. "adc r3, r3, #0\n\t"
  112235. "lsr r7, r7, #16\n\t"
  112236. "mul r6, r7, r6\n\t"
  112237. "lsr r7, r6, #16\n\t"
  112238. "lsl r6, r6, #16\n\t"
  112239. "adds r4, r4, r6\n\t"
  112240. "adcs r5, r5, r7\n\t"
  112241. "adc r3, r3, #0\n\t"
  112242. #else
  112243. "umull r6, r7, r8, r7\n\t"
  112244. "adds r4, r4, r6\n\t"
  112245. "adcs r5, r7, r3\n\t"
  112246. "mov r3, #0\n\t"
  112247. "adc r3, r3, r3\n\t"
  112248. #endif
  112249. "adds r10, r10, r4\n\t"
  112250. "str r10, [%[a], #64]\n\t"
  112251. "ldr r10, [%[a], #68]\n\t"
  112252. "adcs r10, r10, r5\n\t"
  112253. "str r10, [%[a], #68]\n\t"
  112254. "adc r3, r3, #0\n\t"
  112255. /* i += 1 */
  112256. "add r9, r9, #4\n\t"
  112257. "add %[a], %[a], #4\n\t"
  112258. "cmp r9, #0x44\n\t"
  112259. "blt L_sp_521_mont_reduce_order_17_word_%=\n\t"
  112260. "str r12, [%[a]]\n\t"
  112261. "str lr, [%[a], #4]\n\t"
  112262. "sub %[a], %[a], #4\n\t"
  112263. "ldr r4, [%[a]]\n\t"
  112264. "ldr r5, [%[a], #4]\n\t"
  112265. "lsr r4, r4, #9\n\t"
  112266. "orr r4, r4, r5, lsl #23\n\t"
  112267. "str r4, [%[a], #4]\n\t"
  112268. "ldr r4, [%[a], #8]\n\t"
  112269. "lsr r5, r5, #9\n\t"
  112270. "orr r5, r5, r4, lsl #23\n\t"
  112271. "str r5, [%[a], #8]\n\t"
  112272. "ldr r5, [%[a], #12]\n\t"
  112273. "lsr r4, r4, #9\n\t"
  112274. "orr r4, r4, r5, lsl #23\n\t"
  112275. "str r4, [%[a], #12]\n\t"
  112276. "ldr r4, [%[a], #16]\n\t"
  112277. "lsr r5, r5, #9\n\t"
  112278. "orr r5, r5, r4, lsl #23\n\t"
  112279. "str r5, [%[a], #16]\n\t"
  112280. "ldr r5, [%[a], #20]\n\t"
  112281. "lsr r4, r4, #9\n\t"
  112282. "orr r4, r4, r5, lsl #23\n\t"
  112283. "str r4, [%[a], #20]\n\t"
  112284. "ldr r4, [%[a], #24]\n\t"
  112285. "lsr r5, r5, #9\n\t"
  112286. "orr r5, r5, r4, lsl #23\n\t"
  112287. "str r5, [%[a], #24]\n\t"
  112288. "ldr r5, [%[a], #28]\n\t"
  112289. "lsr r4, r4, #9\n\t"
  112290. "orr r4, r4, r5, lsl #23\n\t"
  112291. "str r4, [%[a], #28]\n\t"
  112292. "ldr r4, [%[a], #32]\n\t"
  112293. "lsr r5, r5, #9\n\t"
  112294. "orr r5, r5, r4, lsl #23\n\t"
  112295. "str r5, [%[a], #32]\n\t"
  112296. "ldr r5, [%[a], #36]\n\t"
  112297. "lsr r4, r4, #9\n\t"
  112298. "orr r4, r4, r5, lsl #23\n\t"
  112299. "str r4, [%[a], #36]\n\t"
  112300. "ldr r4, [%[a], #40]\n\t"
  112301. "lsr r5, r5, #9\n\t"
  112302. "orr r5, r5, r4, lsl #23\n\t"
  112303. "str r5, [%[a], #40]\n\t"
  112304. "ldr r5, [%[a], #44]\n\t"
  112305. "lsr r4, r4, #9\n\t"
  112306. "orr r4, r4, r5, lsl #23\n\t"
  112307. "str r4, [%[a], #44]\n\t"
  112308. "ldr r4, [%[a], #48]\n\t"
  112309. "lsr r5, r5, #9\n\t"
  112310. "orr r5, r5, r4, lsl #23\n\t"
  112311. "str r5, [%[a], #48]\n\t"
  112312. "ldr r5, [%[a], #52]\n\t"
  112313. "lsr r4, r4, #9\n\t"
  112314. "orr r4, r4, r5, lsl #23\n\t"
  112315. "str r4, [%[a], #52]\n\t"
  112316. "ldr r4, [%[a], #56]\n\t"
  112317. "lsr r5, r5, #9\n\t"
  112318. "orr r5, r5, r4, lsl #23\n\t"
  112319. "str r5, [%[a], #56]\n\t"
  112320. "ldr r5, [%[a], #60]\n\t"
  112321. "lsr r4, r4, #9\n\t"
  112322. "orr r4, r4, r5, lsl #23\n\t"
  112323. "str r4, [%[a], #60]\n\t"
  112324. "ldr r4, [%[a], #64]\n\t"
  112325. "lsr r5, r5, #9\n\t"
  112326. "orr r5, r5, r4, lsl #23\n\t"
  112327. "str r5, [%[a], #64]\n\t"
  112328. "lsr r4, r4, #9\n\t"
  112329. "str r4, [%[a], #68]\n\t"
  112330. "lsr r3, r4, #9\n\t"
  112331. "add %[a], %[a], #4\n\t"
  112332. "mov %[mp], r3\n\t"
  112333. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  112334. :
  112335. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  112336. );
  112337. sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - mp);
  112338. }
  112339. /* Multiply two Montgomery form numbers mod the modulus (prime).
  112340. * (r = a * b mod m)
  112341. *
  112342. * r Result of multiplication.
  112343. * a First number to multiply in Montgomery form.
  112344. * b Second number to multiply in Montgomery form.
  112345. * m Modulus (prime).
  112346. * mp Montgomery mulitplier.
  112347. */
  112348. SP_NOINLINE static void sp_521_mont_mul_17(sp_digit* r, const sp_digit* a,
  112349. const sp_digit* b, const sp_digit* m, sp_digit mp)
  112350. {
  112351. sp_521_mul_17(r, a, b);
  112352. sp_521_mont_reduce_17(r, m, mp);
  112353. }
  112354. /* Square the Montgomery form number. (r = a * a mod m)
  112355. *
  112356. * r Result of squaring.
  112357. * a Number to square in Montgomery form.
  112358. * m Modulus (prime).
  112359. * mp Montgomery mulitplier.
  112360. */
  112361. SP_NOINLINE static void sp_521_mont_sqr_17(sp_digit* r, const sp_digit* a,
  112362. const sp_digit* m, sp_digit mp)
  112363. {
  112364. sp_521_sqr_17(r, a);
  112365. sp_521_mont_reduce_17(r, m, mp);
  112366. }
  112367. #ifndef WOLFSSL_SP_SMALL
  112368. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  112369. *
  112370. * r Result of squaring.
  112371. * a Number to square in Montgomery form.
  112372. * n Number of times to square.
  112373. * m Modulus (prime).
  112374. * mp Montgomery mulitplier.
  112375. */
  112376. static void sp_521_mont_sqr_n_17(sp_digit* r, const sp_digit* a, int n,
  112377. const sp_digit* m, sp_digit mp)
  112378. {
  112379. sp_521_mont_sqr_17(r, a, m, mp);
  112380. for (; n > 1; n--) {
  112381. sp_521_mont_sqr_17(r, r, m, mp);
  112382. }
  112383. }
  112384. #endif /* !WOLFSSL_SP_SMALL */
  112385. #ifdef WOLFSSL_SP_SMALL
  112386. /* Mod-2 for the P521 curve. */
  112387. static const uint32_t p521_mod_minus_2[17] = {
  112388. 0xfffffffdU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,
  112389. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,
  112390. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0x000001ffU
  112391. };
  112392. #endif /* !WOLFSSL_SP_SMALL */
  112393. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  112394. * P521 curve. (r = 1 / a mod m)
  112395. *
  112396. * r Inverse result.
  112397. * a Number to invert.
  112398. * td Temporary data.
  112399. */
  112400. static void sp_521_mont_inv_17(sp_digit* r, const sp_digit* a, sp_digit* td)
  112401. {
  112402. #ifdef WOLFSSL_SP_SMALL
  112403. sp_digit* t = td;
  112404. int i;
  112405. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  112406. for (i=519; i>=0; i--) {
  112407. sp_521_mont_sqr_17(t, t, p521_mod, p521_mp_mod);
  112408. if (p521_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  112409. sp_521_mont_mul_17(t, t, a, p521_mod, p521_mp_mod);
  112410. }
  112411. XMEMCPY(r, t, sizeof(sp_digit) * 17);
  112412. #else
  112413. sp_digit* t1 = td;
  112414. sp_digit* t2 = td + 2 * 17;
  112415. sp_digit* t3 = td + 4 * 17;
  112416. /* 0x2 */
  112417. sp_521_mont_sqr_17(t1, a, p521_mod, p521_mp_mod);
  112418. /* 0x3 */
  112419. sp_521_mont_mul_17(t2, t1, a, p521_mod, p521_mp_mod);
  112420. /* 0x6 */
  112421. sp_521_mont_sqr_17(t1, t2, p521_mod, p521_mp_mod);
  112422. /* 0x7 */
  112423. sp_521_mont_mul_17(t3, t1, a, p521_mod, p521_mp_mod);
  112424. /* 0xc */
  112425. sp_521_mont_sqr_n_17(t1, t2, 2, p521_mod, p521_mp_mod);
  112426. /* 0xf */
  112427. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  112428. /* 0x78 */
  112429. sp_521_mont_sqr_n_17(t1, t2, 3, p521_mod, p521_mp_mod);
  112430. /* 0x7f */
  112431. sp_521_mont_mul_17(t3, t3, t1, p521_mod, p521_mp_mod);
  112432. /* 0xf0 */
  112433. sp_521_mont_sqr_n_17(t1, t2, 4, p521_mod, p521_mp_mod);
  112434. /* 0xff */
  112435. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  112436. /* 0xff00 */
  112437. sp_521_mont_sqr_n_17(t1, t2, 8, p521_mod, p521_mp_mod);
  112438. /* 0xffff */
  112439. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  112440. /* 0xffff0000 */
  112441. sp_521_mont_sqr_n_17(t1, t2, 16, p521_mod, p521_mp_mod);
  112442. /* 0xffffffff */
  112443. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  112444. /* 0xffffffff00000000 */
  112445. sp_521_mont_sqr_n_17(t1, t2, 32, p521_mod, p521_mp_mod);
  112446. /* 0xffffffffffffffff */
  112447. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  112448. /* 0xffffffffffffffff0000000000000000 */
  112449. sp_521_mont_sqr_n_17(t1, t2, 64, p521_mod, p521_mp_mod);
  112450. /* 0xffffffffffffffffffffffffffffffff */
  112451. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  112452. /* 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000 */
  112453. sp_521_mont_sqr_n_17(t1, t2, 128, p521_mod, p521_mp_mod);
  112454. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  112455. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  112456. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000 */
  112457. sp_521_mont_sqr_n_17(t1, t2, 256, p521_mod, p521_mp_mod);
  112458. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  112459. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  112460. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80 */
  112461. sp_521_mont_sqr_n_17(t1, t2, 7, p521_mod, p521_mp_mod);
  112462. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  112463. sp_521_mont_mul_17(t2, t3, t1, p521_mod, p521_mp_mod);
  112464. /* 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc */
  112465. sp_521_mont_sqr_n_17(t1, t2, 2, p521_mod, p521_mp_mod);
  112466. /* 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd */
  112467. sp_521_mont_mul_17(r, t1, a, p521_mod, p521_mp_mod);
  112468. #endif /* WOLFSSL_SP_SMALL */
  112469. }
  112470. /* Compare a with b in constant time.
  112471. *
  112472. * a A single precision integer.
  112473. * b A single precision integer.
  112474. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  112475. * respectively.
  112476. */
  112477. static sp_int32 sp_521_cmp_17(const sp_digit* a_p, const sp_digit* b_p)
  112478. {
  112479. register const sp_digit* a asm ("r0") = a_p;
  112480. register const sp_digit* b asm ("r1") = b_p;
  112481. __asm__ __volatile__ (
  112482. "mov r2, #-1\n\t"
  112483. "mov r6, #1\n\t"
  112484. "mov r5, #0\n\t"
  112485. "mov r3, #-1\n\t"
  112486. #ifdef WOLFSSL_SP_SMALL
  112487. "mov r4, #0x40\n\t"
  112488. "\n"
  112489. "L_sp_521_cmp_17_words_%=: \n\t"
  112490. "ldr r12, [%[a], r4]\n\t"
  112491. "ldr lr, [%[b], r4]\n\t"
  112492. "and r12, r12, r3\n\t"
  112493. "and lr, lr, r3\n\t"
  112494. "subs r12, r12, lr\n\t"
  112495. "it hi\n\t"
  112496. "movhi r2, r6\n\t"
  112497. "it lo\n\t"
  112498. "movlo r2, r3\n\t"
  112499. "it ne\n\t"
  112500. "movne r3, r5\n\t"
  112501. "subs r4, r4, #4\n\t"
  112502. "bcs L_sp_521_cmp_17_words_%=\n\t"
  112503. "eor r2, r2, r3\n\t"
  112504. #else
  112505. "ldr r12, [%[a], #64]\n\t"
  112506. "ldr lr, [%[b], #64]\n\t"
  112507. "and r12, r12, r3\n\t"
  112508. "and lr, lr, r3\n\t"
  112509. "subs r12, r12, lr\n\t"
  112510. "it hi\n\t"
  112511. "movhi r2, r6\n\t"
  112512. "it lo\n\t"
  112513. "movlo r2, r3\n\t"
  112514. "it ne\n\t"
  112515. "movne r3, r5\n\t"
  112516. "ldr r12, [%[a], #60]\n\t"
  112517. "ldr lr, [%[b], #60]\n\t"
  112518. "and r12, r12, r3\n\t"
  112519. "and lr, lr, r3\n\t"
  112520. "subs r12, r12, lr\n\t"
  112521. "it hi\n\t"
  112522. "movhi r2, r6\n\t"
  112523. "it lo\n\t"
  112524. "movlo r2, r3\n\t"
  112525. "it ne\n\t"
  112526. "movne r3, r5\n\t"
  112527. "ldr r12, [%[a], #56]\n\t"
  112528. "ldr lr, [%[b], #56]\n\t"
  112529. "and r12, r12, r3\n\t"
  112530. "and lr, lr, r3\n\t"
  112531. "subs r12, r12, lr\n\t"
  112532. "it hi\n\t"
  112533. "movhi r2, r6\n\t"
  112534. "it lo\n\t"
  112535. "movlo r2, r3\n\t"
  112536. "it ne\n\t"
  112537. "movne r3, r5\n\t"
  112538. "ldr r12, [%[a], #52]\n\t"
  112539. "ldr lr, [%[b], #52]\n\t"
  112540. "and r12, r12, r3\n\t"
  112541. "and lr, lr, r3\n\t"
  112542. "subs r12, r12, lr\n\t"
  112543. "it hi\n\t"
  112544. "movhi r2, r6\n\t"
  112545. "it lo\n\t"
  112546. "movlo r2, r3\n\t"
  112547. "it ne\n\t"
  112548. "movne r3, r5\n\t"
  112549. "ldr r12, [%[a], #48]\n\t"
  112550. "ldr lr, [%[b], #48]\n\t"
  112551. "and r12, r12, r3\n\t"
  112552. "and lr, lr, r3\n\t"
  112553. "subs r12, r12, lr\n\t"
  112554. "it hi\n\t"
  112555. "movhi r2, r6\n\t"
  112556. "it lo\n\t"
  112557. "movlo r2, r3\n\t"
  112558. "it ne\n\t"
  112559. "movne r3, r5\n\t"
  112560. "ldr r12, [%[a], #44]\n\t"
  112561. "ldr lr, [%[b], #44]\n\t"
  112562. "and r12, r12, r3\n\t"
  112563. "and lr, lr, r3\n\t"
  112564. "subs r12, r12, lr\n\t"
  112565. "it hi\n\t"
  112566. "movhi r2, r6\n\t"
  112567. "it lo\n\t"
  112568. "movlo r2, r3\n\t"
  112569. "it ne\n\t"
  112570. "movne r3, r5\n\t"
  112571. "ldr r12, [%[a], #40]\n\t"
  112572. "ldr lr, [%[b], #40]\n\t"
  112573. "and r12, r12, r3\n\t"
  112574. "and lr, lr, r3\n\t"
  112575. "subs r12, r12, lr\n\t"
  112576. "it hi\n\t"
  112577. "movhi r2, r6\n\t"
  112578. "it lo\n\t"
  112579. "movlo r2, r3\n\t"
  112580. "it ne\n\t"
  112581. "movne r3, r5\n\t"
  112582. "ldr r12, [%[a], #36]\n\t"
  112583. "ldr lr, [%[b], #36]\n\t"
  112584. "and r12, r12, r3\n\t"
  112585. "and lr, lr, r3\n\t"
  112586. "subs r12, r12, lr\n\t"
  112587. "it hi\n\t"
  112588. "movhi r2, r6\n\t"
  112589. "it lo\n\t"
  112590. "movlo r2, r3\n\t"
  112591. "it ne\n\t"
  112592. "movne r3, r5\n\t"
  112593. "ldr r12, [%[a], #32]\n\t"
  112594. "ldr lr, [%[b], #32]\n\t"
  112595. "and r12, r12, r3\n\t"
  112596. "and lr, lr, r3\n\t"
  112597. "subs r12, r12, lr\n\t"
  112598. "it hi\n\t"
  112599. "movhi r2, r6\n\t"
  112600. "it lo\n\t"
  112601. "movlo r2, r3\n\t"
  112602. "it ne\n\t"
  112603. "movne r3, r5\n\t"
  112604. "ldr r12, [%[a], #28]\n\t"
  112605. "ldr lr, [%[b], #28]\n\t"
  112606. "and r12, r12, r3\n\t"
  112607. "and lr, lr, r3\n\t"
  112608. "subs r12, r12, lr\n\t"
  112609. "it hi\n\t"
  112610. "movhi r2, r6\n\t"
  112611. "it lo\n\t"
  112612. "movlo r2, r3\n\t"
  112613. "it ne\n\t"
  112614. "movne r3, r5\n\t"
  112615. "ldr r12, [%[a], #24]\n\t"
  112616. "ldr lr, [%[b], #24]\n\t"
  112617. "and r12, r12, r3\n\t"
  112618. "and lr, lr, r3\n\t"
  112619. "subs r12, r12, lr\n\t"
  112620. "it hi\n\t"
  112621. "movhi r2, r6\n\t"
  112622. "it lo\n\t"
  112623. "movlo r2, r3\n\t"
  112624. "it ne\n\t"
  112625. "movne r3, r5\n\t"
  112626. "ldr r12, [%[a], #20]\n\t"
  112627. "ldr lr, [%[b], #20]\n\t"
  112628. "and r12, r12, r3\n\t"
  112629. "and lr, lr, r3\n\t"
  112630. "subs r12, r12, lr\n\t"
  112631. "it hi\n\t"
  112632. "movhi r2, r6\n\t"
  112633. "it lo\n\t"
  112634. "movlo r2, r3\n\t"
  112635. "it ne\n\t"
  112636. "movne r3, r5\n\t"
  112637. "ldr r12, [%[a], #16]\n\t"
  112638. "ldr lr, [%[b], #16]\n\t"
  112639. "and r12, r12, r3\n\t"
  112640. "and lr, lr, r3\n\t"
  112641. "subs r12, r12, lr\n\t"
  112642. "it hi\n\t"
  112643. "movhi r2, r6\n\t"
  112644. "it lo\n\t"
  112645. "movlo r2, r3\n\t"
  112646. "it ne\n\t"
  112647. "movne r3, r5\n\t"
  112648. "ldr r12, [%[a], #12]\n\t"
  112649. "ldr lr, [%[b], #12]\n\t"
  112650. "and r12, r12, r3\n\t"
  112651. "and lr, lr, r3\n\t"
  112652. "subs r12, r12, lr\n\t"
  112653. "it hi\n\t"
  112654. "movhi r2, r6\n\t"
  112655. "it lo\n\t"
  112656. "movlo r2, r3\n\t"
  112657. "it ne\n\t"
  112658. "movne r3, r5\n\t"
  112659. "ldr r12, [%[a], #8]\n\t"
  112660. "ldr lr, [%[b], #8]\n\t"
  112661. "and r12, r12, r3\n\t"
  112662. "and lr, lr, r3\n\t"
  112663. "subs r12, r12, lr\n\t"
  112664. "it hi\n\t"
  112665. "movhi r2, r6\n\t"
  112666. "it lo\n\t"
  112667. "movlo r2, r3\n\t"
  112668. "it ne\n\t"
  112669. "movne r3, r5\n\t"
  112670. "ldr r12, [%[a], #4]\n\t"
  112671. "ldr lr, [%[b], #4]\n\t"
  112672. "and r12, r12, r3\n\t"
  112673. "and lr, lr, r3\n\t"
  112674. "subs r12, r12, lr\n\t"
  112675. "it hi\n\t"
  112676. "movhi r2, r6\n\t"
  112677. "it lo\n\t"
  112678. "movlo r2, r3\n\t"
  112679. "it ne\n\t"
  112680. "movne r3, r5\n\t"
  112681. "ldr r12, [%[a]]\n\t"
  112682. "ldr lr, [%[b]]\n\t"
  112683. "and r12, r12, r3\n\t"
  112684. "and lr, lr, r3\n\t"
  112685. "subs r12, r12, lr\n\t"
  112686. "it hi\n\t"
  112687. "movhi r2, r6\n\t"
  112688. "it lo\n\t"
  112689. "movlo r2, r3\n\t"
  112690. "it ne\n\t"
  112691. "movne r3, r5\n\t"
  112692. "eor r2, r2, r3\n\t"
  112693. #endif /*WOLFSSL_SP_SMALL */
  112694. "mov %[a], r2\n\t"
  112695. : [a] "+r" (a), [b] "+r" (b)
  112696. :
  112697. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6"
  112698. );
  112699. return (uint32_t)(size_t)a;
  112700. }
  112701. /* Normalize the values in each word to 32.
  112702. *
  112703. * a Array of sp_digit to normalize.
  112704. */
  112705. #define sp_521_norm_17(a)
  112706. /* Map the Montgomery form projective coordinate point to an affine point.
  112707. *
  112708. * r Resulting affine coordinate point.
  112709. * p Montgomery form projective coordinate point.
  112710. * t Temporary ordinate data.
  112711. */
  112712. static void sp_521_map_17(sp_point_521* r, const sp_point_521* p,
  112713. sp_digit* t)
  112714. {
  112715. sp_digit* t1 = t;
  112716. sp_digit* t2 = t + 2*17;
  112717. sp_int32 n;
  112718. sp_521_mont_inv_17(t1, p->z, t + 2*17);
  112719. sp_521_mont_sqr_17(t2, t1, p521_mod, p521_mp_mod);
  112720. sp_521_mont_mul_17(t1, t2, t1, p521_mod, p521_mp_mod);
  112721. /* x /= z^2 */
  112722. sp_521_mont_mul_17(r->x, p->x, t2, p521_mod, p521_mp_mod);
  112723. XMEMSET(r->x + 17, 0, sizeof(r->x) / 2U);
  112724. sp_521_mont_reduce_17(r->x, p521_mod, p521_mp_mod);
  112725. /* Reduce x to less than modulus */
  112726. n = sp_521_cmp_17(r->x, p521_mod);
  112727. sp_521_cond_sub_17(r->x, r->x, p521_mod, ~(n >> 31));
  112728. sp_521_norm_17(r->x);
  112729. /* y /= z^3 */
  112730. sp_521_mont_mul_17(r->y, p->y, t1, p521_mod, p521_mp_mod);
  112731. XMEMSET(r->y + 17, 0, sizeof(r->y) / 2U);
  112732. sp_521_mont_reduce_17(r->y, p521_mod, p521_mp_mod);
  112733. /* Reduce y to less than modulus */
  112734. n = sp_521_cmp_17(r->y, p521_mod);
  112735. sp_521_cond_sub_17(r->y, r->y, p521_mod, ~(n >> 31));
  112736. sp_521_norm_17(r->y);
  112737. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  112738. r->z[0] = 1;
  112739. }
  112740. /* Add two Montgomery form numbers (r = a + b % m).
  112741. *
  112742. * r Result of addition.
  112743. * a First number to add in Montgomery form.
  112744. * b Second number to add in Montgomery form.
  112745. * m Modulus (prime).
  112746. */
  112747. static void sp_521_mont_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p)
  112748. {
  112749. register sp_digit* r asm ("r0") = r_p;
  112750. register const sp_digit* a asm ("r1") = a_p;
  112751. register const sp_digit* b asm ("r2") = b_p;
  112752. __asm__ __volatile__ (
  112753. "mov r3, #0\n\t"
  112754. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  112755. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  112756. "adds r8, r8, r4\n\t"
  112757. "adcs r9, r9, r5\n\t"
  112758. "adcs r10, r10, r6\n\t"
  112759. "adcs r11, r11, r7\n\t"
  112760. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  112761. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  112762. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  112763. "adcs r8, r8, r4\n\t"
  112764. "adcs r9, r9, r5\n\t"
  112765. "adcs r10, r10, r6\n\t"
  112766. "adcs r11, r11, r7\n\t"
  112767. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  112768. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  112769. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  112770. "adcs r8, r8, r4\n\t"
  112771. "adcs r9, r9, r5\n\t"
  112772. "adcs r10, r10, r6\n\t"
  112773. "adcs r11, r11, r7\n\t"
  112774. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  112775. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  112776. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  112777. "adcs r8, r8, r4\n\t"
  112778. "adcs r9, r9, r5\n\t"
  112779. "adcs r10, r10, r6\n\t"
  112780. "adcs r11, r11, r7\n\t"
  112781. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  112782. "ldm %[a]!, {r8}\n\t"
  112783. "ldm %[b]!, {r4}\n\t"
  112784. "adcs r8, r8, r4\n\t"
  112785. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  112786. "mov r12, #0x1\n\t"
  112787. "lsl r12, r12, #8\n\t"
  112788. "add r12, r12, #0xff\n\t"
  112789. #else
  112790. "mov r12, #0x1ff\n\t"
  112791. #endif
  112792. "lsr r3, r8, #9\n\t"
  112793. "and r8, r8, r12\n\t"
  112794. "stm %[r]!, {r8}\n\t"
  112795. "sub %[r], %[r], #0x44\n\t"
  112796. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112797. "adds r4, r4, r3\n\t"
  112798. "adcs r5, r5, #0\n\t"
  112799. "adcs r6, r6, #0\n\t"
  112800. "adcs r7, r7, #0\n\t"
  112801. "adcs r8, r8, #0\n\t"
  112802. "adcs r9, r9, #0\n\t"
  112803. "adcs r10, r10, #0\n\t"
  112804. "adcs r11, r11, #0\n\t"
  112805. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112806. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112807. "adcs r4, r4, #0\n\t"
  112808. "adcs r5, r5, #0\n\t"
  112809. "adcs r6, r6, #0\n\t"
  112810. "adcs r7, r7, #0\n\t"
  112811. "adcs r8, r8, #0\n\t"
  112812. "adcs r9, r9, #0\n\t"
  112813. "adcs r10, r10, #0\n\t"
  112814. "adcs r11, r11, #0\n\t"
  112815. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112816. "ldm %[r], {r4}\n\t"
  112817. "adcs r4, r4, #0\n\t"
  112818. "stm %[r]!, {r4}\n\t"
  112819. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  112820. :
  112821. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  112822. );
  112823. (void)m_p;
  112824. }
  112825. /* Double a Montgomery form number (r = a + a % m).
  112826. *
  112827. * r Result of doubling.
  112828. * a Number to double in Montgomery form.
  112829. * m Modulus (prime).
  112830. */
  112831. static void sp_521_mont_dbl_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  112832. {
  112833. register sp_digit* r asm ("r0") = r_p;
  112834. register const sp_digit* a asm ("r1") = a_p;
  112835. __asm__ __volatile__ (
  112836. "mov r2, #0\n\t"
  112837. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112838. "adds r4, r4, r4\n\t"
  112839. "adcs r5, r5, r5\n\t"
  112840. "adcs r6, r6, r6\n\t"
  112841. "adcs r7, r7, r7\n\t"
  112842. "adcs r8, r8, r8\n\t"
  112843. "adcs r9, r9, r9\n\t"
  112844. "adcs r10, r10, r10\n\t"
  112845. "adcs r11, r11, r11\n\t"
  112846. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112847. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112848. "adcs r4, r4, r4\n\t"
  112849. "adcs r5, r5, r5\n\t"
  112850. "adcs r6, r6, r6\n\t"
  112851. "adcs r7, r7, r7\n\t"
  112852. "adcs r8, r8, r8\n\t"
  112853. "adcs r9, r9, r9\n\t"
  112854. "adcs r10, r10, r10\n\t"
  112855. "adcs r11, r11, r11\n\t"
  112856. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112857. "ldm %[a]!, {r4}\n\t"
  112858. "adcs r4, r4, r4\n\t"
  112859. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  112860. "mov r3, #0x1\n\t"
  112861. "lsl r3, r3, #8\n\t"
  112862. "add r3, r3, #0xff\n\t"
  112863. #else
  112864. "mov r3, #0x1ff\n\t"
  112865. #endif
  112866. "lsr r2, r4, #9\n\t"
  112867. "and r4, r4, r3\n\t"
  112868. "stm %[r]!, {r4}\n\t"
  112869. "sub %[r], %[r], #0x44\n\t"
  112870. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112871. "adds r4, r4, r2\n\t"
  112872. "adcs r5, r5, #0\n\t"
  112873. "adcs r6, r6, #0\n\t"
  112874. "adcs r7, r7, #0\n\t"
  112875. "adcs r8, r8, #0\n\t"
  112876. "adcs r9, r9, #0\n\t"
  112877. "adcs r10, r10, #0\n\t"
  112878. "adcs r11, r11, #0\n\t"
  112879. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112880. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112881. "adcs r4, r4, #0\n\t"
  112882. "adcs r5, r5, #0\n\t"
  112883. "adcs r6, r6, #0\n\t"
  112884. "adcs r7, r7, #0\n\t"
  112885. "adcs r8, r8, #0\n\t"
  112886. "adcs r9, r9, #0\n\t"
  112887. "adcs r10, r10, #0\n\t"
  112888. "adcs r11, r11, #0\n\t"
  112889. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112890. "ldm %[r], {r4}\n\t"
  112891. "adcs r4, r4, #0\n\t"
  112892. "stm %[r]!, {r4}\n\t"
  112893. : [r] "+r" (r), [a] "+r" (a)
  112894. :
  112895. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3"
  112896. );
  112897. (void)m_p;
  112898. }
  112899. /* Triple a Montgomery form number (r = a + a + a % m).
  112900. *
  112901. * r Result of Tripling.
  112902. * a Number to triple in Montgomery form.
  112903. * m Modulus (prime).
  112904. */
  112905. static void sp_521_mont_tpl_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  112906. {
  112907. register sp_digit* r asm ("r0") = r_p;
  112908. register const sp_digit* a asm ("r1") = a_p;
  112909. __asm__ __volatile__ (
  112910. "mov r2, #0\n\t"
  112911. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112912. "adds r4, r4, r4\n\t"
  112913. "adcs r5, r5, r5\n\t"
  112914. "adcs r6, r6, r6\n\t"
  112915. "adcs r7, r7, r7\n\t"
  112916. "adcs r8, r8, r8\n\t"
  112917. "adcs r9, r9, r9\n\t"
  112918. "adcs r10, r10, r10\n\t"
  112919. "adcs r11, r11, r11\n\t"
  112920. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112921. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112922. "adcs r4, r4, r4\n\t"
  112923. "adcs r5, r5, r5\n\t"
  112924. "adcs r6, r6, r6\n\t"
  112925. "adcs r7, r7, r7\n\t"
  112926. "adcs r8, r8, r8\n\t"
  112927. "adcs r9, r9, r9\n\t"
  112928. "adcs r10, r10, r10\n\t"
  112929. "adcs r11, r11, r11\n\t"
  112930. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112931. "ldm %[a]!, {r4}\n\t"
  112932. "adcs r4, r4, r4\n\t"
  112933. "stm %[r]!, {r4}\n\t"
  112934. "sub %[r], %[r], #0x44\n\t"
  112935. "sub %[a], %[a], #0x44\n\t"
  112936. "ldm %[r], {r4, r5, r6, r7}\n\t"
  112937. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  112938. "adds r4, r4, r8\n\t"
  112939. "adcs r5, r5, r9\n\t"
  112940. "adcs r6, r6, r10\n\t"
  112941. "adcs r7, r7, r11\n\t"
  112942. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  112943. "ldm %[r], {r4, r5, r6, r7}\n\t"
  112944. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  112945. "adcs r4, r4, r8\n\t"
  112946. "adcs r5, r5, r9\n\t"
  112947. "adcs r6, r6, r10\n\t"
  112948. "adcs r7, r7, r11\n\t"
  112949. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  112950. "ldm %[r], {r4, r5, r6, r7}\n\t"
  112951. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  112952. "adcs r4, r4, r8\n\t"
  112953. "adcs r5, r5, r9\n\t"
  112954. "adcs r6, r6, r10\n\t"
  112955. "adcs r7, r7, r11\n\t"
  112956. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  112957. "ldm %[r], {r4, r5, r6, r7}\n\t"
  112958. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  112959. "adcs r4, r4, r8\n\t"
  112960. "adcs r5, r5, r9\n\t"
  112961. "adcs r6, r6, r10\n\t"
  112962. "adcs r7, r7, r11\n\t"
  112963. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  112964. "ldm %[r], {r4}\n\t"
  112965. "ldm %[a]!, {r8}\n\t"
  112966. "adcs r4, r4, r8\n\t"
  112967. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  112968. "mov r3, #0x1\n\t"
  112969. "lsl r3, r3, #8\n\t"
  112970. "add r3, r3, #0xff\n\t"
  112971. #else
  112972. "mov r3, #0x1ff\n\t"
  112973. #endif
  112974. "lsr r2, r4, #9\n\t"
  112975. "and r4, r4, r3\n\t"
  112976. "stm %[r]!, {r4}\n\t"
  112977. "sub %[r], %[r], #0x44\n\t"
  112978. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112979. "adds r4, r4, r2\n\t"
  112980. "adcs r4, r4, #0\n\t"
  112981. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112982. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112983. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  112984. "ldm %[r], {r4}\n\t"
  112985. "adcs r4, r4, #0\n\t"
  112986. "stm %[r]!, {r4}\n\t"
  112987. : [r] "+r" (r), [a] "+r" (a)
  112988. :
  112989. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3"
  112990. );
  112991. (void)m_p;
  112992. }
  112993. /* Subtract two Montgomery form numbers (r = a - b % m).
  112994. *
  112995. * r Result of subtration.
  112996. * a Number to subtract from in Montgomery form.
  112997. * b Number to subtract with in Montgomery form.
  112998. * m Modulus (prime).
  112999. */
  113000. static void sp_521_mont_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p)
  113001. {
  113002. register sp_digit* r asm ("r0") = r_p;
  113003. register const sp_digit* a asm ("r1") = a_p;
  113004. register const sp_digit* b asm ("r2") = b_p;
  113005. __asm__ __volatile__ (
  113006. "mov r3, #0\n\t"
  113007. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  113008. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  113009. "subs r8, r8, r4\n\t"
  113010. "sbcs r9, r9, r5\n\t"
  113011. "sbcs r10, r10, r6\n\t"
  113012. "sbcs r11, r11, r7\n\t"
  113013. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  113014. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  113015. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  113016. "sbcs r8, r8, r4\n\t"
  113017. "sbcs r9, r9, r5\n\t"
  113018. "sbcs r10, r10, r6\n\t"
  113019. "sbcs r11, r11, r7\n\t"
  113020. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  113021. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  113022. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  113023. "sbcs r8, r8, r4\n\t"
  113024. "sbcs r9, r9, r5\n\t"
  113025. "sbcs r10, r10, r6\n\t"
  113026. "sbcs r11, r11, r7\n\t"
  113027. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  113028. "ldm %[a]!, {r8, r9, r10, r11}\n\t"
  113029. "ldm %[b]!, {r4, r5, r6, r7}\n\t"
  113030. "sbcs r8, r8, r4\n\t"
  113031. "sbcs r9, r9, r5\n\t"
  113032. "sbcs r10, r10, r6\n\t"
  113033. "sbcs r11, r11, r7\n\t"
  113034. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  113035. "ldm %[a]!, {r8}\n\t"
  113036. "ldm %[b]!, {r4}\n\t"
  113037. "sbcs r8, r8, r4\n\t"
  113038. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  113039. "mov r12, #0x1\n\t"
  113040. "lsl r12, r12, #8\n\t"
  113041. "add r12, r12, #0xff\n\t"
  113042. #else
  113043. "mov r12, #0x1ff\n\t"
  113044. #endif
  113045. "asr r3, r8, #9\n\t"
  113046. "and r8, r8, r12\n\t"
  113047. "neg r3, r3\n\t"
  113048. "stm %[r]!, {r8}\n\t"
  113049. "sub %[r], %[r], #0x44\n\t"
  113050. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  113051. "subs r4, r4, r3\n\t"
  113052. "sbcs r5, r5, #0\n\t"
  113053. "sbcs r6, r6, #0\n\t"
  113054. "sbcs r7, r7, #0\n\t"
  113055. "sbcs r8, r8, #0\n\t"
  113056. "sbcs r9, r9, #0\n\t"
  113057. "sbcs r10, r10, #0\n\t"
  113058. "sbcs r11, r11, #0\n\t"
  113059. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  113060. "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  113061. "sbcs r4, r4, #0\n\t"
  113062. "sbcs r5, r5, #0\n\t"
  113063. "sbcs r6, r6, #0\n\t"
  113064. "sbcs r7, r7, #0\n\t"
  113065. "sbcs r8, r8, #0\n\t"
  113066. "sbcs r9, r9, #0\n\t"
  113067. "sbcs r10, r10, #0\n\t"
  113068. "sbcs r11, r11, #0\n\t"
  113069. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  113070. "ldm %[r], {r4}\n\t"
  113071. "sbcs r4, r4, #0\n\t"
  113072. "stm %[r]!, {r4}\n\t"
  113073. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  113074. :
  113075. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  113076. );
  113077. (void)m_p;
  113078. }
  113079. #define sp_521_mont_sub_lower_17 sp_521_mont_sub_17
  113080. static void sp_521_rshift1_17(sp_digit* r_p, const sp_digit* a_p)
  113081. {
  113082. register sp_digit* r asm ("r0") = r_p;
  113083. register const sp_digit* a asm ("r1") = a_p;
  113084. __asm__ __volatile__ (
  113085. "ldm %[a], {r2, r3}\n\t"
  113086. "lsr r2, r2, #1\n\t"
  113087. "orr r2, r2, r3, lsl #31\n\t"
  113088. "lsr r3, r3, #1\n\t"
  113089. "ldr r4, [%[a], #8]\n\t"
  113090. "str r2, [%[r]]\n\t"
  113091. "orr r3, r3, r4, lsl #31\n\t"
  113092. "lsr r4, r4, #1\n\t"
  113093. "ldr r2, [%[a], #12]\n\t"
  113094. "str r3, [%[r], #4]\n\t"
  113095. "orr r4, r4, r2, lsl #31\n\t"
  113096. "lsr r2, r2, #1\n\t"
  113097. "ldr r3, [%[a], #16]\n\t"
  113098. "str r4, [%[r], #8]\n\t"
  113099. "orr r2, r2, r3, lsl #31\n\t"
  113100. "lsr r3, r3, #1\n\t"
  113101. "ldr r4, [%[a], #20]\n\t"
  113102. "str r2, [%[r], #12]\n\t"
  113103. "orr r3, r3, r4, lsl #31\n\t"
  113104. "lsr r4, r4, #1\n\t"
  113105. "ldr r2, [%[a], #24]\n\t"
  113106. "str r3, [%[r], #16]\n\t"
  113107. "orr r4, r4, r2, lsl #31\n\t"
  113108. "lsr r2, r2, #1\n\t"
  113109. "ldr r3, [%[a], #28]\n\t"
  113110. "str r4, [%[r], #20]\n\t"
  113111. "orr r2, r2, r3, lsl #31\n\t"
  113112. "lsr r3, r3, #1\n\t"
  113113. "ldr r4, [%[a], #32]\n\t"
  113114. "str r2, [%[r], #24]\n\t"
  113115. "orr r3, r3, r4, lsl #31\n\t"
  113116. "lsr r4, r4, #1\n\t"
  113117. "ldr r2, [%[a], #36]\n\t"
  113118. "str r3, [%[r], #28]\n\t"
  113119. "orr r4, r4, r2, lsl #31\n\t"
  113120. "lsr r2, r2, #1\n\t"
  113121. "ldr r3, [%[a], #40]\n\t"
  113122. "str r4, [%[r], #32]\n\t"
  113123. "orr r2, r2, r3, lsl #31\n\t"
  113124. "lsr r3, r3, #1\n\t"
  113125. "ldr r4, [%[a], #44]\n\t"
  113126. "str r2, [%[r], #36]\n\t"
  113127. "orr r3, r3, r4, lsl #31\n\t"
  113128. "lsr r4, r4, #1\n\t"
  113129. "ldr r2, [%[a], #48]\n\t"
  113130. "str r3, [%[r], #40]\n\t"
  113131. "orr r4, r4, r2, lsl #31\n\t"
  113132. "lsr r2, r2, #1\n\t"
  113133. "ldr r3, [%[a], #52]\n\t"
  113134. "str r4, [%[r], #44]\n\t"
  113135. "orr r2, r2, r3, lsl #31\n\t"
  113136. "lsr r3, r3, #1\n\t"
  113137. "ldr r4, [%[a], #56]\n\t"
  113138. "str r2, [%[r], #48]\n\t"
  113139. "orr r3, r3, r4, lsl #31\n\t"
  113140. "lsr r4, r4, #1\n\t"
  113141. "ldr r2, [%[a], #60]\n\t"
  113142. "str r3, [%[r], #52]\n\t"
  113143. "orr r4, r4, r2, lsl #31\n\t"
  113144. "lsr r2, r2, #1\n\t"
  113145. "ldr r3, [%[a], #64]\n\t"
  113146. "str r4, [%[r], #56]\n\t"
  113147. "orr r2, r2, r3, lsl #31\n\t"
  113148. "lsr r3, r3, #1\n\t"
  113149. "str r2, [%[r], #60]\n\t"
  113150. "str r3, [%[r], #64]\n\t"
  113151. : [r] "+r" (r), [a] "+r" (a)
  113152. :
  113153. : "memory", "r2", "r3", "r4"
  113154. );
  113155. }
  113156. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  113157. *
  113158. * r Result of division by 2.
  113159. * a Number to divide.
  113160. * m Modulus (prime).
  113161. */
  113162. static void sp_521_div2_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  113163. {
  113164. sp_digit o = a[0] & 1;
  113165. (void)m;
  113166. sp_521_rshift1_17(r, r);
  113167. r[16] |= o << 8;
  113168. }
  113169. /* Double the Montgomery form projective point p.
  113170. *
  113171. * r Result of doubling point.
  113172. * p Point to double.
  113173. * t Temporary ordinate data.
  113174. */
  113175. #ifdef WOLFSSL_SP_NONBLOCK
  113176. typedef struct sp_521_proj_point_dbl_17_ctx {
  113177. int state;
  113178. sp_digit* t1;
  113179. sp_digit* t2;
  113180. sp_digit* x;
  113181. sp_digit* y;
  113182. sp_digit* z;
  113183. } sp_521_proj_point_dbl_17_ctx;
  113184. static int sp_521_proj_point_dbl_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, const sp_point_521* p, sp_digit* t)
  113185. {
  113186. int err = FP_WOULDBLOCK;
  113187. sp_521_proj_point_dbl_17_ctx* ctx = (sp_521_proj_point_dbl_17_ctx*)sp_ctx->data;
  113188. typedef char ctx_size_test[sizeof(sp_521_proj_point_dbl_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  113189. (void)sizeof(ctx_size_test);
  113190. switch (ctx->state) {
  113191. case 0:
  113192. ctx->t1 = t;
  113193. ctx->t2 = t + 2*17;
  113194. ctx->x = r->x;
  113195. ctx->y = r->y;
  113196. ctx->z = r->z;
  113197. /* Put infinity into result. */
  113198. if (r != p) {
  113199. r->infinity = p->infinity;
  113200. }
  113201. ctx->state = 1;
  113202. break;
  113203. case 1:
  113204. /* T1 = Z * Z */
  113205. sp_521_mont_sqr_17(ctx->t1, p->z, p521_mod, p521_mp_mod);
  113206. ctx->state = 2;
  113207. break;
  113208. case 2:
  113209. /* Z = Y * Z */
  113210. sp_521_mont_mul_17(ctx->z, p->y, p->z, p521_mod, p521_mp_mod);
  113211. ctx->state = 3;
  113212. break;
  113213. case 3:
  113214. /* Z = 2Z */
  113215. sp_521_mont_dbl_17(ctx->z, ctx->z, p521_mod);
  113216. ctx->state = 4;
  113217. break;
  113218. case 4:
  113219. /* T2 = X - T1 */
  113220. sp_521_mont_sub_17(ctx->t2, p->x, ctx->t1, p521_mod);
  113221. ctx->state = 5;
  113222. break;
  113223. case 5:
  113224. /* T1 = X + T1 */
  113225. sp_521_mont_add_17(ctx->t1, p->x, ctx->t1, p521_mod);
  113226. ctx->state = 6;
  113227. break;
  113228. case 6:
  113229. /* T2 = T1 * T2 */
  113230. sp_521_mont_mul_17(ctx->t2, ctx->t1, ctx->t2, p521_mod, p521_mp_mod);
  113231. ctx->state = 7;
  113232. break;
  113233. case 7:
  113234. /* T1 = 3T2 */
  113235. sp_521_mont_tpl_17(ctx->t1, ctx->t2, p521_mod);
  113236. ctx->state = 8;
  113237. break;
  113238. case 8:
  113239. /* Y = 2Y */
  113240. sp_521_mont_dbl_17(ctx->y, p->y, p521_mod);
  113241. ctx->state = 9;
  113242. break;
  113243. case 9:
  113244. /* Y = Y * Y */
  113245. sp_521_mont_sqr_17(ctx->y, ctx->y, p521_mod, p521_mp_mod);
  113246. ctx->state = 10;
  113247. break;
  113248. case 10:
  113249. /* T2 = Y * Y */
  113250. sp_521_mont_sqr_17(ctx->t2, ctx->y, p521_mod, p521_mp_mod);
  113251. ctx->state = 11;
  113252. break;
  113253. case 11:
  113254. /* T2 = T2/2 */
  113255. sp_521_div2_17(ctx->t2, ctx->t2, p521_mod);
  113256. ctx->state = 12;
  113257. break;
  113258. case 12:
  113259. /* Y = Y * X */
  113260. sp_521_mont_mul_17(ctx->y, ctx->y, p->x, p521_mod, p521_mp_mod);
  113261. ctx->state = 13;
  113262. break;
  113263. case 13:
  113264. /* X = T1 * T1 */
  113265. sp_521_mont_sqr_17(ctx->x, ctx->t1, p521_mod, p521_mp_mod);
  113266. ctx->state = 14;
  113267. break;
  113268. case 14:
  113269. /* X = X - Y */
  113270. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->y, p521_mod);
  113271. ctx->state = 15;
  113272. break;
  113273. case 15:
  113274. /* X = X - Y */
  113275. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->y, p521_mod);
  113276. ctx->state = 16;
  113277. break;
  113278. case 16:
  113279. /* Y = Y - X */
  113280. sp_521_mont_sub_lower_17(ctx->y, ctx->y, ctx->x, p521_mod);
  113281. ctx->state = 17;
  113282. break;
  113283. case 17:
  113284. /* Y = Y * T1 */
  113285. sp_521_mont_mul_17(ctx->y, ctx->y, ctx->t1, p521_mod, p521_mp_mod);
  113286. ctx->state = 18;
  113287. break;
  113288. case 18:
  113289. /* Y = Y - T2 */
  113290. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->t2, p521_mod);
  113291. ctx->state = 19;
  113292. /* fall-through */
  113293. case 19:
  113294. err = MP_OKAY;
  113295. break;
  113296. }
  113297. if (err == MP_OKAY && ctx->state != 19) {
  113298. err = FP_WOULDBLOCK;
  113299. }
  113300. return err;
  113301. }
  113302. #endif /* WOLFSSL_SP_NONBLOCK */
  113303. static void sp_521_proj_point_dbl_17(sp_point_521* r, const sp_point_521* p,
  113304. sp_digit* t)
  113305. {
  113306. sp_digit* t1 = t;
  113307. sp_digit* t2 = t + 2*17;
  113308. sp_digit* x;
  113309. sp_digit* y;
  113310. sp_digit* z;
  113311. x = r->x;
  113312. y = r->y;
  113313. z = r->z;
  113314. /* Put infinity into result. */
  113315. if (r != p) {
  113316. r->infinity = p->infinity;
  113317. }
  113318. /* T1 = Z * Z */
  113319. sp_521_mont_sqr_17(t1, p->z, p521_mod, p521_mp_mod);
  113320. /* Z = Y * Z */
  113321. sp_521_mont_mul_17(z, p->y, p->z, p521_mod, p521_mp_mod);
  113322. /* Z = 2Z */
  113323. sp_521_mont_dbl_17(z, z, p521_mod);
  113324. /* T2 = X - T1 */
  113325. sp_521_mont_sub_17(t2, p->x, t1, p521_mod);
  113326. /* T1 = X + T1 */
  113327. sp_521_mont_add_17(t1, p->x, t1, p521_mod);
  113328. /* T2 = T1 * T2 */
  113329. sp_521_mont_mul_17(t2, t1, t2, p521_mod, p521_mp_mod);
  113330. /* T1 = 3T2 */
  113331. sp_521_mont_tpl_17(t1, t2, p521_mod);
  113332. /* Y = 2Y */
  113333. sp_521_mont_dbl_17(y, p->y, p521_mod);
  113334. /* Y = Y * Y */
  113335. sp_521_mont_sqr_17(y, y, p521_mod, p521_mp_mod);
  113336. /* T2 = Y * Y */
  113337. sp_521_mont_sqr_17(t2, y, p521_mod, p521_mp_mod);
  113338. /* T2 = T2/2 */
  113339. sp_521_div2_17(t2, t2, p521_mod);
  113340. /* Y = Y * X */
  113341. sp_521_mont_mul_17(y, y, p->x, p521_mod, p521_mp_mod);
  113342. /* X = T1 * T1 */
  113343. sp_521_mont_sqr_17(x, t1, p521_mod, p521_mp_mod);
  113344. /* X = X - Y */
  113345. sp_521_mont_sub_17(x, x, y, p521_mod);
  113346. /* X = X - Y */
  113347. sp_521_mont_sub_17(x, x, y, p521_mod);
  113348. /* Y = Y - X */
  113349. sp_521_mont_sub_lower_17(y, y, x, p521_mod);
  113350. /* Y = Y * T1 */
  113351. sp_521_mont_mul_17(y, y, t1, p521_mod, p521_mp_mod);
  113352. /* Y = Y - T2 */
  113353. sp_521_mont_sub_17(y, y, t2, p521_mod);
  113354. }
  113355. /* Compare two numbers to determine if they are equal.
  113356. * Constant time implementation.
  113357. *
  113358. * a First number to compare.
  113359. * b Second number to compare.
  113360. * returns 1 when equal and 0 otherwise.
  113361. */
  113362. static int sp_521_cmp_equal_17(const sp_digit* a, const sp_digit* b)
  113363. {
  113364. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  113365. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  113366. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  113367. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  113368. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  113369. (a[15] ^ b[15]) | (a[16] ^ b[16])) == 0;
  113370. }
  113371. /* Returns 1 if the number of zero.
  113372. * Implementation is constant time.
  113373. *
  113374. * a Number to check.
  113375. * returns 1 if the number is zero and 0 otherwise.
  113376. */
  113377. static int sp_521_iszero_17(const sp_digit* a)
  113378. {
  113379. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  113380. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  113381. a[16]) == 0;
  113382. }
  113383. /* Add two Montgomery form projective points.
  113384. *
  113385. * r Result of addition.
  113386. * p First point to add.
  113387. * q Second point to add.
  113388. * t Temporary ordinate data.
  113389. */
  113390. #ifdef WOLFSSL_SP_NONBLOCK
  113391. typedef struct sp_521_proj_point_add_17_ctx {
  113392. int state;
  113393. sp_521_proj_point_dbl_17_ctx dbl_ctx;
  113394. const sp_point_521* ap[2];
  113395. sp_point_521* rp[2];
  113396. sp_digit* t1;
  113397. sp_digit* t2;
  113398. sp_digit* t3;
  113399. sp_digit* t4;
  113400. sp_digit* t5;
  113401. sp_digit* t6;
  113402. sp_digit* x;
  113403. sp_digit* y;
  113404. sp_digit* z;
  113405. } sp_521_proj_point_add_17_ctx;
  113406. static int sp_521_proj_point_add_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r,
  113407. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  113408. {
  113409. int err = FP_WOULDBLOCK;
  113410. sp_521_proj_point_add_17_ctx* ctx = (sp_521_proj_point_add_17_ctx*)sp_ctx->data;
  113411. /* Ensure only the first point is the same as the result. */
  113412. if (q == r) {
  113413. const sp_point_521* a = p;
  113414. p = q;
  113415. q = a;
  113416. }
  113417. typedef char ctx_size_test[sizeof(sp_521_proj_point_add_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  113418. (void)sizeof(ctx_size_test);
  113419. switch (ctx->state) {
  113420. case 0: /* INIT */
  113421. ctx->t1 = t;
  113422. ctx->t2 = t + 2*17;
  113423. ctx->t3 = t + 4*17;
  113424. ctx->t4 = t + 6*17;
  113425. ctx->t5 = t + 8*17;
  113426. ctx->t6 = t + 10*17;
  113427. ctx->x = ctx->t6;
  113428. ctx->y = ctx->t1;
  113429. ctx->z = ctx->t2;
  113430. ctx->state = 1;
  113431. break;
  113432. case 1:
  113433. /* Check double */
  113434. (void)sp_521_sub_17(ctx->t1, p521_mod, q->y);
  113435. sp_521_norm_17(ctx->t1);
  113436. if ((~p->infinity & ~q->infinity &
  113437. sp_521_cmp_equal_17(p->x, q->x) & sp_521_cmp_equal_17(p->z, q->z) &
  113438. (sp_521_cmp_equal_17(p->y, q->y) | sp_521_cmp_equal_17(p->y, ctx->t1))) != 0)
  113439. {
  113440. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  113441. ctx->state = 2;
  113442. }
  113443. else {
  113444. ctx->state = 3;
  113445. }
  113446. break;
  113447. case 2:
  113448. err = sp_521_proj_point_dbl_17_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  113449. if (err == MP_OKAY)
  113450. ctx->state = 27; /* done */
  113451. break;
  113452. case 3:
  113453. {
  113454. ctx->state = 4;
  113455. break;
  113456. }
  113457. case 4:
  113458. /* U1 = X1*Z2^2 */
  113459. sp_521_mont_sqr_17(ctx->t1, q->z, p521_mod, p521_mp_mod);
  113460. ctx->state = 5;
  113461. break;
  113462. case 5:
  113463. sp_521_mont_mul_17(ctx->t3, ctx->t1, q->z, p521_mod, p521_mp_mod);
  113464. ctx->state = 6;
  113465. break;
  113466. case 6:
  113467. sp_521_mont_mul_17(ctx->t1, ctx->t1, p->x, p521_mod, p521_mp_mod);
  113468. ctx->state = 7;
  113469. break;
  113470. case 7:
  113471. /* U2 = X2*Z1^2 */
  113472. sp_521_mont_sqr_17(ctx->t2, p->z, p521_mod, p521_mp_mod);
  113473. ctx->state = 8;
  113474. break;
  113475. case 8:
  113476. sp_521_mont_mul_17(ctx->t4, ctx->t2, p->z, p521_mod, p521_mp_mod);
  113477. ctx->state = 9;
  113478. break;
  113479. case 9:
  113480. sp_521_mont_mul_17(ctx->t2, ctx->t2, q->x, p521_mod, p521_mp_mod);
  113481. ctx->state = 10;
  113482. break;
  113483. case 10:
  113484. /* S1 = Y1*Z2^3 */
  113485. sp_521_mont_mul_17(ctx->t3, ctx->t3, p->y, p521_mod, p521_mp_mod);
  113486. ctx->state = 11;
  113487. break;
  113488. case 11:
  113489. /* S2 = Y2*Z1^3 */
  113490. sp_521_mont_mul_17(ctx->t4, ctx->t4, q->y, p521_mod, p521_mp_mod);
  113491. ctx->state = 12;
  113492. break;
  113493. case 12:
  113494. /* H = U2 - U1 */
  113495. sp_521_mont_sub_17(ctx->t2, ctx->t2, ctx->t1, p521_mod);
  113496. ctx->state = 13;
  113497. break;
  113498. case 13:
  113499. /* R = S2 - S1 */
  113500. sp_521_mont_sub_17(ctx->t4, ctx->t4, ctx->t3, p521_mod);
  113501. ctx->state = 14;
  113502. break;
  113503. case 14:
  113504. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  113505. sp_521_mont_sqr_17(ctx->t5, ctx->t2, p521_mod, p521_mp_mod);
  113506. ctx->state = 15;
  113507. break;
  113508. case 15:
  113509. sp_521_mont_mul_17(ctx->y, ctx->t1, ctx->t5, p521_mod, p521_mp_mod);
  113510. ctx->state = 16;
  113511. break;
  113512. case 16:
  113513. sp_521_mont_mul_17(ctx->t5, ctx->t5, ctx->t2, p521_mod, p521_mp_mod);
  113514. ctx->state = 17;
  113515. break;
  113516. case 17:
  113517. /* Z3 = H*Z1*Z2 */
  113518. sp_521_mont_mul_17(ctx->z, p->z, ctx->t2, p521_mod, p521_mp_mod);
  113519. ctx->state = 18;
  113520. break;
  113521. case 18:
  113522. sp_521_mont_mul_17(ctx->z, ctx->z, q->z, p521_mod, p521_mp_mod);
  113523. ctx->state = 19;
  113524. break;
  113525. case 19:
  113526. sp_521_mont_sqr_17(ctx->x, ctx->t4, p521_mod, p521_mp_mod);
  113527. ctx->state = 20;
  113528. break;
  113529. case 20:
  113530. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->t5, p521_mod);
  113531. ctx->state = 21;
  113532. break;
  113533. case 21:
  113534. sp_521_mont_mul_17(ctx->t5, ctx->t5, ctx->t3, p521_mod, p521_mp_mod);
  113535. ctx->state = 22;
  113536. break;
  113537. case 22:
  113538. sp_521_mont_dbl_17(ctx->t3, ctx->y, p521_mod);
  113539. ctx->state = 23;
  113540. break;
  113541. case 23:
  113542. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->t3, p521_mod);
  113543. ctx->state = 24;
  113544. break;
  113545. case 24:
  113546. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  113547. sp_521_mont_sub_lower_17(ctx->y, ctx->y, ctx->x, p521_mod);
  113548. ctx->state = 25;
  113549. break;
  113550. case 25:
  113551. sp_521_mont_mul_17(ctx->y, ctx->y, ctx->t4, p521_mod, p521_mp_mod);
  113552. ctx->state = 26;
  113553. break;
  113554. case 26:
  113555. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->t5, p521_mod);
  113556. ctx->state = 27;
  113557. /* fall-through */
  113558. case 27:
  113559. {
  113560. int i;
  113561. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  113562. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  113563. sp_digit maskt = ~(maskp | maskq);
  113564. for (i = 0; i < 17; i++) {
  113565. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  113566. (ctx->x[i] & maskt);
  113567. }
  113568. for (i = 0; i < 17; i++) {
  113569. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  113570. (ctx->y[i] & maskt);
  113571. }
  113572. for (i = 0; i < 17; i++) {
  113573. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  113574. (ctx->z[i] & maskt);
  113575. }
  113576. r->z[0] |= p->infinity & q->infinity;
  113577. r->infinity = p->infinity & q->infinity;
  113578. err = MP_OKAY;
  113579. break;
  113580. }
  113581. }
  113582. if (err == MP_OKAY && ctx->state != 27) {
  113583. err = FP_WOULDBLOCK;
  113584. }
  113585. return err;
  113586. }
  113587. #endif /* WOLFSSL_SP_NONBLOCK */
  113588. static void sp_521_proj_point_add_17(sp_point_521* r,
  113589. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  113590. {
  113591. sp_digit* t1 = t;
  113592. sp_digit* t2 = t + 2*17;
  113593. sp_digit* t3 = t + 4*17;
  113594. sp_digit* t4 = t + 6*17;
  113595. sp_digit* t5 = t + 8*17;
  113596. sp_digit* t6 = t + 10*17;
  113597. /* Check double */
  113598. (void)sp_521_sub_17(t1, p521_mod, q->y);
  113599. sp_521_norm_17(t1);
  113600. if ((~p->infinity & ~q->infinity &
  113601. sp_521_cmp_equal_17(p->x, q->x) & sp_521_cmp_equal_17(p->z, q->z) &
  113602. (sp_521_cmp_equal_17(p->y, q->y) | sp_521_cmp_equal_17(p->y, t1))) != 0) {
  113603. sp_521_proj_point_dbl_17(r, p, t);
  113604. }
  113605. else {
  113606. sp_digit maskp;
  113607. sp_digit maskq;
  113608. sp_digit maskt;
  113609. sp_digit* x = t6;
  113610. sp_digit* y = t1;
  113611. sp_digit* z = t2;
  113612. int i;
  113613. maskp = 0 - (q->infinity & (!p->infinity));
  113614. maskq = 0 - (p->infinity & (!q->infinity));
  113615. maskt = ~(maskp | maskq);
  113616. /* U1 = X1*Z2^2 */
  113617. sp_521_mont_sqr_17(t1, q->z, p521_mod, p521_mp_mod);
  113618. sp_521_mont_mul_17(t3, t1, q->z, p521_mod, p521_mp_mod);
  113619. sp_521_mont_mul_17(t1, t1, p->x, p521_mod, p521_mp_mod);
  113620. /* U2 = X2*Z1^2 */
  113621. sp_521_mont_sqr_17(t2, p->z, p521_mod, p521_mp_mod);
  113622. sp_521_mont_mul_17(t4, t2, p->z, p521_mod, p521_mp_mod);
  113623. sp_521_mont_mul_17(t2, t2, q->x, p521_mod, p521_mp_mod);
  113624. /* S1 = Y1*Z2^3 */
  113625. sp_521_mont_mul_17(t3, t3, p->y, p521_mod, p521_mp_mod);
  113626. /* S2 = Y2*Z1^3 */
  113627. sp_521_mont_mul_17(t4, t4, q->y, p521_mod, p521_mp_mod);
  113628. /* H = U2 - U1 */
  113629. sp_521_mont_sub_17(t2, t2, t1, p521_mod);
  113630. /* R = S2 - S1 */
  113631. sp_521_mont_sub_17(t4, t4, t3, p521_mod);
  113632. if (~p->infinity & ~q->infinity &
  113633. sp_521_iszero_17(t2) & sp_521_iszero_17(t4) & maskt) {
  113634. sp_521_proj_point_dbl_17(r, p, t);
  113635. }
  113636. else {
  113637. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  113638. sp_521_mont_sqr_17(t5, t2, p521_mod, p521_mp_mod);
  113639. sp_521_mont_mul_17(y, t1, t5, p521_mod, p521_mp_mod);
  113640. sp_521_mont_mul_17(t5, t5, t2, p521_mod, p521_mp_mod);
  113641. /* Z3 = H*Z1*Z2 */
  113642. sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod);
  113643. sp_521_mont_mul_17(z, z, q->z, p521_mod, p521_mp_mod);
  113644. sp_521_mont_sqr_17(x, t4, p521_mod, p521_mp_mod);
  113645. sp_521_mont_sub_17(x, x, t5, p521_mod);
  113646. sp_521_mont_mul_17(t5, t5, t3, p521_mod, p521_mp_mod);
  113647. sp_521_mont_dbl_17(t3, y, p521_mod);
  113648. sp_521_mont_sub_17(x, x, t3, p521_mod);
  113649. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  113650. sp_521_mont_sub_lower_17(y, y, x, p521_mod);
  113651. sp_521_mont_mul_17(y, y, t4, p521_mod, p521_mp_mod);
  113652. sp_521_mont_sub_17(y, y, t5, p521_mod);
  113653. for (i = 0; i < 17; i++) {
  113654. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  113655. (x[i] & maskt);
  113656. }
  113657. for (i = 0; i < 17; i++) {
  113658. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  113659. (y[i] & maskt);
  113660. }
  113661. for (i = 0; i < 17; i++) {
  113662. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  113663. (z[i] & maskt);
  113664. }
  113665. r->z[0] |= p->infinity & q->infinity;
  113666. r->infinity = p->infinity & q->infinity;
  113667. }
  113668. }
  113669. }
  113670. #ifndef WC_NO_CACHE_RESISTANT
  113671. /* Touch each possible point that could be being copied.
  113672. *
  113673. * r Point to copy into.
  113674. * table Table - start of the entires to access
  113675. * idx Index of entry to retrieve.
  113676. */
  113677. static void sp_521_get_point_16_17(sp_point_521* r, const sp_point_521* table,
  113678. int idx)
  113679. {
  113680. int i;
  113681. sp_digit mask;
  113682. r->x[0] = 0;
  113683. r->x[1] = 0;
  113684. r->x[2] = 0;
  113685. r->x[3] = 0;
  113686. r->x[4] = 0;
  113687. r->x[5] = 0;
  113688. r->x[6] = 0;
  113689. r->x[7] = 0;
  113690. r->x[8] = 0;
  113691. r->x[9] = 0;
  113692. r->x[10] = 0;
  113693. r->x[11] = 0;
  113694. r->x[12] = 0;
  113695. r->x[13] = 0;
  113696. r->x[14] = 0;
  113697. r->x[15] = 0;
  113698. r->x[16] = 0;
  113699. r->y[0] = 0;
  113700. r->y[1] = 0;
  113701. r->y[2] = 0;
  113702. r->y[3] = 0;
  113703. r->y[4] = 0;
  113704. r->y[5] = 0;
  113705. r->y[6] = 0;
  113706. r->y[7] = 0;
  113707. r->y[8] = 0;
  113708. r->y[9] = 0;
  113709. r->y[10] = 0;
  113710. r->y[11] = 0;
  113711. r->y[12] = 0;
  113712. r->y[13] = 0;
  113713. r->y[14] = 0;
  113714. r->y[15] = 0;
  113715. r->y[16] = 0;
  113716. r->z[0] = 0;
  113717. r->z[1] = 0;
  113718. r->z[2] = 0;
  113719. r->z[3] = 0;
  113720. r->z[4] = 0;
  113721. r->z[5] = 0;
  113722. r->z[6] = 0;
  113723. r->z[7] = 0;
  113724. r->z[8] = 0;
  113725. r->z[9] = 0;
  113726. r->z[10] = 0;
  113727. r->z[11] = 0;
  113728. r->z[12] = 0;
  113729. r->z[13] = 0;
  113730. r->z[14] = 0;
  113731. r->z[15] = 0;
  113732. r->z[16] = 0;
  113733. for (i = 1; i < 16; i++) {
  113734. mask = 0 - (i == idx);
  113735. r->x[0] |= mask & table[i].x[0];
  113736. r->x[1] |= mask & table[i].x[1];
  113737. r->x[2] |= mask & table[i].x[2];
  113738. r->x[3] |= mask & table[i].x[3];
  113739. r->x[4] |= mask & table[i].x[4];
  113740. r->x[5] |= mask & table[i].x[5];
  113741. r->x[6] |= mask & table[i].x[6];
  113742. r->x[7] |= mask & table[i].x[7];
  113743. r->x[8] |= mask & table[i].x[8];
  113744. r->x[9] |= mask & table[i].x[9];
  113745. r->x[10] |= mask & table[i].x[10];
  113746. r->x[11] |= mask & table[i].x[11];
  113747. r->x[12] |= mask & table[i].x[12];
  113748. r->x[13] |= mask & table[i].x[13];
  113749. r->x[14] |= mask & table[i].x[14];
  113750. r->x[15] |= mask & table[i].x[15];
  113751. r->x[16] |= mask & table[i].x[16];
  113752. r->y[0] |= mask & table[i].y[0];
  113753. r->y[1] |= mask & table[i].y[1];
  113754. r->y[2] |= mask & table[i].y[2];
  113755. r->y[3] |= mask & table[i].y[3];
  113756. r->y[4] |= mask & table[i].y[4];
  113757. r->y[5] |= mask & table[i].y[5];
  113758. r->y[6] |= mask & table[i].y[6];
  113759. r->y[7] |= mask & table[i].y[7];
  113760. r->y[8] |= mask & table[i].y[8];
  113761. r->y[9] |= mask & table[i].y[9];
  113762. r->y[10] |= mask & table[i].y[10];
  113763. r->y[11] |= mask & table[i].y[11];
  113764. r->y[12] |= mask & table[i].y[12];
  113765. r->y[13] |= mask & table[i].y[13];
  113766. r->y[14] |= mask & table[i].y[14];
  113767. r->y[15] |= mask & table[i].y[15];
  113768. r->y[16] |= mask & table[i].y[16];
  113769. r->z[0] |= mask & table[i].z[0];
  113770. r->z[1] |= mask & table[i].z[1];
  113771. r->z[2] |= mask & table[i].z[2];
  113772. r->z[3] |= mask & table[i].z[3];
  113773. r->z[4] |= mask & table[i].z[4];
  113774. r->z[5] |= mask & table[i].z[5];
  113775. r->z[6] |= mask & table[i].z[6];
  113776. r->z[7] |= mask & table[i].z[7];
  113777. r->z[8] |= mask & table[i].z[8];
  113778. r->z[9] |= mask & table[i].z[9];
  113779. r->z[10] |= mask & table[i].z[10];
  113780. r->z[11] |= mask & table[i].z[11];
  113781. r->z[12] |= mask & table[i].z[12];
  113782. r->z[13] |= mask & table[i].z[13];
  113783. r->z[14] |= mask & table[i].z[14];
  113784. r->z[15] |= mask & table[i].z[15];
  113785. r->z[16] |= mask & table[i].z[16];
  113786. }
  113787. }
  113788. #endif /* !WC_NO_CACHE_RESISTANT */
  113789. /* Multiply the point by the scalar and return the result.
  113790. * If map is true then convert result to affine coordinates.
  113791. *
  113792. * Fast implementation that generates a pre-computation table.
  113793. * 4 bits of window (no sliding!).
  113794. * Uses add and double for calculating table.
  113795. * 521 doubles.
  113796. * 143 adds.
  113797. *
  113798. * r Resulting point.
  113799. * g Point to multiply.
  113800. * k Scalar to multiply by.
  113801. * map Indicates whether to convert result to affine.
  113802. * ct Constant time required.
  113803. * heap Heap to use for allocation.
  113804. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  113805. */
  113806. static int sp_521_ecc_mulmod_fast_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k,
  113807. int map, int ct, void* heap)
  113808. {
  113809. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113810. sp_point_521* t = NULL;
  113811. sp_digit* tmp = NULL;
  113812. #else
  113813. sp_point_521 t[16 + 1];
  113814. sp_digit tmp[2 * 17 * 6];
  113815. #endif
  113816. sp_point_521* rt = NULL;
  113817. #ifndef WC_NO_CACHE_RESISTANT
  113818. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113819. sp_point_521* p = NULL;
  113820. #else
  113821. sp_point_521 p[1];
  113822. #endif
  113823. #endif /* !WC_NO_CACHE_RESISTANT */
  113824. sp_digit n;
  113825. int i;
  113826. int c;
  113827. int y;
  113828. int err = MP_OKAY;
  113829. /* Constant time used for cache attack resistance implementation. */
  113830. (void)ct;
  113831. (void)heap;
  113832. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113833. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * (16 + 1),
  113834. heap, DYNAMIC_TYPE_ECC);
  113835. if (t == NULL)
  113836. err = MEMORY_E;
  113837. #ifndef WC_NO_CACHE_RESISTANT
  113838. if (err == MP_OKAY) {
  113839. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521),
  113840. heap, DYNAMIC_TYPE_ECC);
  113841. if (p == NULL)
  113842. err = MEMORY_E;
  113843. }
  113844. #endif
  113845. if (err == MP_OKAY) {
  113846. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  113847. DYNAMIC_TYPE_ECC);
  113848. if (tmp == NULL)
  113849. err = MEMORY_E;
  113850. }
  113851. #endif
  113852. if (err == MP_OKAY) {
  113853. rt = t + 16;
  113854. /* t[0] = {0, 0, 1} * norm */
  113855. XMEMSET(&t[0], 0, sizeof(t[0]));
  113856. t[0].infinity = 1;
  113857. /* t[1] = {g->x, g->y, g->z} * norm */
  113858. (void)sp_521_mod_mul_norm_17(t[1].x, g->x, p521_mod);
  113859. (void)sp_521_mod_mul_norm_17(t[1].y, g->y, p521_mod);
  113860. (void)sp_521_mod_mul_norm_17(t[1].z, g->z, p521_mod);
  113861. t[1].infinity = 0;
  113862. sp_521_proj_point_dbl_17(&t[ 2], &t[ 1], tmp);
  113863. t[ 2].infinity = 0;
  113864. sp_521_proj_point_add_17(&t[ 3], &t[ 2], &t[ 1], tmp);
  113865. t[ 3].infinity = 0;
  113866. sp_521_proj_point_dbl_17(&t[ 4], &t[ 2], tmp);
  113867. t[ 4].infinity = 0;
  113868. sp_521_proj_point_add_17(&t[ 5], &t[ 3], &t[ 2], tmp);
  113869. t[ 5].infinity = 0;
  113870. sp_521_proj_point_dbl_17(&t[ 6], &t[ 3], tmp);
  113871. t[ 6].infinity = 0;
  113872. sp_521_proj_point_add_17(&t[ 7], &t[ 4], &t[ 3], tmp);
  113873. t[ 7].infinity = 0;
  113874. sp_521_proj_point_dbl_17(&t[ 8], &t[ 4], tmp);
  113875. t[ 8].infinity = 0;
  113876. sp_521_proj_point_add_17(&t[ 9], &t[ 5], &t[ 4], tmp);
  113877. t[ 9].infinity = 0;
  113878. sp_521_proj_point_dbl_17(&t[10], &t[ 5], tmp);
  113879. t[10].infinity = 0;
  113880. sp_521_proj_point_add_17(&t[11], &t[ 6], &t[ 5], tmp);
  113881. t[11].infinity = 0;
  113882. sp_521_proj_point_dbl_17(&t[12], &t[ 6], tmp);
  113883. t[12].infinity = 0;
  113884. sp_521_proj_point_add_17(&t[13], &t[ 7], &t[ 6], tmp);
  113885. t[13].infinity = 0;
  113886. sp_521_proj_point_dbl_17(&t[14], &t[ 7], tmp);
  113887. t[14].infinity = 0;
  113888. sp_521_proj_point_add_17(&t[15], &t[ 8], &t[ 7], tmp);
  113889. t[15].infinity = 0;
  113890. i = 15;
  113891. n = k[i+1] << 0;
  113892. c = 5;
  113893. y = (int)(n >> 5);
  113894. #ifndef WC_NO_CACHE_RESISTANT
  113895. if (ct) {
  113896. sp_521_get_point_16_17(rt, t, y);
  113897. rt->infinity = !y;
  113898. }
  113899. else
  113900. #endif
  113901. {
  113902. XMEMCPY(rt, &t[y], sizeof(sp_point_521));
  113903. }
  113904. n <<= 27;
  113905. for (; i>=0 || c>=4; ) {
  113906. if (c < 4) {
  113907. n = (k[i+1] << 31) | (k[i] >> 1);
  113908. i--;
  113909. c += 32;
  113910. }
  113911. y = (n >> 28) & 0xf;
  113912. n <<= 4;
  113913. c -= 4;
  113914. sp_521_proj_point_dbl_17(rt, rt, tmp);
  113915. sp_521_proj_point_dbl_17(rt, rt, tmp);
  113916. sp_521_proj_point_dbl_17(rt, rt, tmp);
  113917. sp_521_proj_point_dbl_17(rt, rt, tmp);
  113918. #ifndef WC_NO_CACHE_RESISTANT
  113919. if (ct) {
  113920. sp_521_get_point_16_17(p, t, y);
  113921. p->infinity = !y;
  113922. sp_521_proj_point_add_17(rt, rt, p, tmp);
  113923. }
  113924. else
  113925. #endif
  113926. {
  113927. sp_521_proj_point_add_17(rt, rt, &t[y], tmp);
  113928. }
  113929. }
  113930. y = k[0] & 0x1;
  113931. sp_521_proj_point_dbl_17(rt, rt, tmp);
  113932. sp_521_proj_point_add_17(rt, rt, &t[y], tmp);
  113933. if (map != 0) {
  113934. sp_521_map_17(r, rt, tmp);
  113935. }
  113936. else {
  113937. XMEMCPY(r, rt, sizeof(sp_point_521));
  113938. }
  113939. }
  113940. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113941. if (tmp != NULL)
  113942. #endif
  113943. {
  113944. ForceZero(tmp, sizeof(sp_digit) * 2 * 17 * 6);
  113945. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113946. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  113947. #endif
  113948. }
  113949. #ifndef WC_NO_CACHE_RESISTANT
  113950. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113951. if (p != NULL)
  113952. #endif
  113953. {
  113954. ForceZero(p, sizeof(sp_point_521));
  113955. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113956. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  113957. #endif
  113958. }
  113959. #endif /* !WC_NO_CACHE_RESISTANT */
  113960. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113961. if (t != NULL)
  113962. #endif
  113963. {
  113964. ForceZero(t, sizeof(sp_point_521) * 17);
  113965. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113966. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  113967. #endif
  113968. }
  113969. return err;
  113970. }
  113971. #ifdef FP_ECC
  113972. #define sp_521_mont_dbl_lower_17 sp_521_mont_dbl_17
  113973. #define sp_521_mont_tpl_lower_17 sp_521_mont_tpl_17
  113974. /* Double the Montgomery form projective point p a number of times.
  113975. *
  113976. * r Result of repeated doubling of point.
  113977. * p Point to double.
  113978. * n Number of times to double
  113979. * t Temporary ordinate data.
  113980. */
  113981. static void sp_521_proj_point_dbl_n_17(sp_point_521* p, int i,
  113982. sp_digit* t)
  113983. {
  113984. sp_digit* w = t;
  113985. sp_digit* a = t + 2*17;
  113986. sp_digit* b = t + 4*17;
  113987. sp_digit* t1 = t + 6*17;
  113988. sp_digit* t2 = t + 8*17;
  113989. sp_digit* x;
  113990. sp_digit* y;
  113991. sp_digit* z;
  113992. volatile int n = i;
  113993. x = p->x;
  113994. y = p->y;
  113995. z = p->z;
  113996. /* Y = 2*Y */
  113997. sp_521_mont_dbl_17(y, y, p521_mod);
  113998. /* W = Z^4 */
  113999. sp_521_mont_sqr_17(w, z, p521_mod, p521_mp_mod);
  114000. sp_521_mont_sqr_17(w, w, p521_mod, p521_mp_mod);
  114001. #ifndef WOLFSSL_SP_SMALL
  114002. while (--n > 0)
  114003. #else
  114004. while (--n >= 0)
  114005. #endif
  114006. {
  114007. /* A = 3*(X^2 - W) */
  114008. sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod);
  114009. sp_521_mont_sub_17(t1, t1, w, p521_mod);
  114010. sp_521_mont_tpl_lower_17(a, t1, p521_mod);
  114011. /* B = X*Y^2 */
  114012. sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod);
  114013. sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod);
  114014. /* X = A^2 - 2B */
  114015. sp_521_mont_sqr_17(x, a, p521_mod, p521_mp_mod);
  114016. sp_521_mont_dbl_17(t2, b, p521_mod);
  114017. sp_521_mont_sub_17(x, x, t2, p521_mod);
  114018. /* b = 2.(B - X) */
  114019. sp_521_mont_sub_lower_17(t2, b, x, p521_mod);
  114020. sp_521_mont_dbl_lower_17(b, t2, p521_mod);
  114021. /* Z = Z*Y */
  114022. sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod);
  114023. /* t1 = Y^4 */
  114024. sp_521_mont_sqr_17(t1, t1, p521_mod, p521_mp_mod);
  114025. #ifdef WOLFSSL_SP_SMALL
  114026. if (n != 0)
  114027. #endif
  114028. {
  114029. /* W = W*Y^4 */
  114030. sp_521_mont_mul_17(w, w, t1, p521_mod, p521_mp_mod);
  114031. }
  114032. /* y = 2*A*(B - X) - Y^4 */
  114033. sp_521_mont_mul_17(y, b, a, p521_mod, p521_mp_mod);
  114034. sp_521_mont_sub_17(y, y, t1, p521_mod);
  114035. }
  114036. #ifndef WOLFSSL_SP_SMALL
  114037. /* A = 3*(X^2 - W) */
  114038. sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod);
  114039. sp_521_mont_sub_17(t1, t1, w, p521_mod);
  114040. sp_521_mont_tpl_lower_17(a, t1, p521_mod);
  114041. /* B = X*Y^2 */
  114042. sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod);
  114043. sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod);
  114044. /* X = A^2 - 2B */
  114045. sp_521_mont_sqr_17(x, a, p521_mod, p521_mp_mod);
  114046. sp_521_mont_dbl_17(t2, b, p521_mod);
  114047. sp_521_mont_sub_17(x, x, t2, p521_mod);
  114048. /* b = 2.(B - X) */
  114049. sp_521_mont_sub_lower_17(t2, b, x, p521_mod);
  114050. sp_521_mont_dbl_lower_17(b, t2, p521_mod);
  114051. /* Z = Z*Y */
  114052. sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod);
  114053. /* t1 = Y^4 */
  114054. sp_521_mont_sqr_17(t1, t1, p521_mod, p521_mp_mod);
  114055. /* y = 2*A*(B - X) - Y^4 */
  114056. sp_521_mont_mul_17(y, b, a, p521_mod, p521_mp_mod);
  114057. sp_521_mont_sub_17(y, y, t1, p521_mod);
  114058. #endif
  114059. /* Y = Y/2 */
  114060. sp_521_div2_17(y, y, p521_mod);
  114061. }
  114062. /* Convert the projective point to affine.
  114063. * Ordinates are in Montgomery form.
  114064. *
  114065. * a Point to convert.
  114066. * t Temporary data.
  114067. */
  114068. static void sp_521_proj_to_affine_17(sp_point_521* a, sp_digit* t)
  114069. {
  114070. sp_digit* t1 = t;
  114071. sp_digit* t2 = t + 2 * 17;
  114072. sp_digit* tmp = t + 4 * 17;
  114073. sp_521_mont_inv_17(t1, a->z, tmp);
  114074. sp_521_mont_sqr_17(t2, t1, p521_mod, p521_mp_mod);
  114075. sp_521_mont_mul_17(t1, t2, t1, p521_mod, p521_mp_mod);
  114076. sp_521_mont_mul_17(a->x, a->x, t2, p521_mod, p521_mp_mod);
  114077. sp_521_mont_mul_17(a->y, a->y, t1, p521_mod, p521_mp_mod);
  114078. XMEMCPY(a->z, p521_norm_mod, sizeof(p521_norm_mod));
  114079. }
  114080. #endif /* FP_ECC */
  114081. /* A table entry for pre-computed points. */
  114082. typedef struct sp_table_entry_521 {
  114083. sp_digit x[17];
  114084. sp_digit y[17];
  114085. } sp_table_entry_521;
  114086. #ifdef FP_ECC
  114087. #endif /* FP_ECC */
  114088. /* Add two Montgomery form projective points. The second point has a q value of
  114089. * one.
  114090. * Only the first point can be the same pointer as the result point.
  114091. *
  114092. * r Result of addition.
  114093. * p First point to add.
  114094. * q Second point to add.
  114095. * t Temporary ordinate data.
  114096. */
  114097. static void sp_521_proj_point_add_qz1_17(sp_point_521* r, const sp_point_521* p,
  114098. const sp_point_521* q, sp_digit* t)
  114099. {
  114100. sp_digit* t1 = t;
  114101. sp_digit* t2 = t + 2*17;
  114102. sp_digit* t3 = t + 4*17;
  114103. sp_digit* t4 = t + 6*17;
  114104. sp_digit* t5 = t + 8*17;
  114105. sp_digit* t6 = t + 10*17;
  114106. /* Check double */
  114107. (void)sp_521_sub_17(t1, p521_mod, q->y);
  114108. sp_521_norm_17(t1);
  114109. if ((~p->infinity & ~q->infinity &
  114110. sp_521_cmp_equal_17(p->x, q->x) & sp_521_cmp_equal_17(p->z, q->z) &
  114111. (sp_521_cmp_equal_17(p->y, q->y) | sp_521_cmp_equal_17(p->y, t1))) != 0) {
  114112. sp_521_proj_point_dbl_17(r, p, t);
  114113. }
  114114. else {
  114115. sp_digit maskp;
  114116. sp_digit maskq;
  114117. sp_digit maskt;
  114118. sp_digit* x = t2;
  114119. sp_digit* y = t5;
  114120. sp_digit* z = t6;
  114121. int i;
  114122. /* U2 = X2*Z1^2 */
  114123. sp_521_mont_sqr_17(t2, p->z, p521_mod, p521_mp_mod);
  114124. sp_521_mont_mul_17(t4, t2, p->z, p521_mod, p521_mp_mod);
  114125. sp_521_mont_mul_17(t2, t2, q->x, p521_mod, p521_mp_mod);
  114126. /* S2 = Y2*Z1^3 */
  114127. sp_521_mont_mul_17(t4, t4, q->y, p521_mod, p521_mp_mod);
  114128. /* H = U2 - X1 */
  114129. sp_521_mont_sub_17(t2, t2, p->x, p521_mod);
  114130. /* R = S2 - Y1 */
  114131. sp_521_mont_sub_17(t4, t4, p->y, p521_mod);
  114132. /* Z3 = H*Z1 */
  114133. sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod);
  114134. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  114135. sp_521_mont_sqr_17(t1, t4, p521_mod, p521_mp_mod);
  114136. sp_521_mont_sqr_17(t5, t2, p521_mod, p521_mp_mod);
  114137. sp_521_mont_mul_17(t3, p->x, t5, p521_mod, p521_mp_mod);
  114138. sp_521_mont_mul_17(t5, t5, t2, p521_mod, p521_mp_mod);
  114139. sp_521_mont_sub_17(x, t1, t5, p521_mod);
  114140. sp_521_mont_dbl_17(t1, t3, p521_mod);
  114141. sp_521_mont_sub_17(x, x, t1, p521_mod);
  114142. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  114143. sp_521_mont_sub_lower_17(t3, t3, x, p521_mod);
  114144. sp_521_mont_mul_17(t3, t3, t4, p521_mod, p521_mp_mod);
  114145. sp_521_mont_mul_17(t5, t5, p->y, p521_mod, p521_mp_mod);
  114146. sp_521_mont_sub_17(y, t3, t5, p521_mod);
  114147. maskp = 0 - (q->infinity & (!p->infinity));
  114148. maskq = 0 - (p->infinity & (!q->infinity));
  114149. maskt = ~(maskp | maskq);
  114150. for (i = 0; i < 17; i++) {
  114151. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt);
  114152. }
  114153. for (i = 0; i < 17; i++) {
  114154. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt);
  114155. }
  114156. for (i = 0; i < 17; i++) {
  114157. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt);
  114158. }
  114159. r->z[0] |= p->infinity & q->infinity;
  114160. r->infinity = p->infinity & q->infinity;
  114161. }
  114162. }
  114163. #ifdef WOLFSSL_SP_SMALL
  114164. #ifdef FP_ECC
  114165. /* Generate the pre-computed table of points for the base point.
  114166. *
  114167. * width = 4
  114168. * 16 entries
  114169. * 130 bits between
  114170. *
  114171. * a The base point.
  114172. * table Place to store generated point data.
  114173. * tmp Temporary data.
  114174. * heap Heap to use for allocation.
  114175. */
  114176. static int sp_521_gen_stripe_table_17(const sp_point_521* a,
  114177. sp_table_entry_521* table, sp_digit* tmp, void* heap)
  114178. {
  114179. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114180. sp_point_521* t = NULL;
  114181. #else
  114182. sp_point_521 t[3];
  114183. #endif
  114184. sp_point_521* s1 = NULL;
  114185. sp_point_521* s2 = NULL;
  114186. int i;
  114187. int j;
  114188. int err = MP_OKAY;
  114189. (void)heap;
  114190. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114191. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 3, heap,
  114192. DYNAMIC_TYPE_ECC);
  114193. if (t == NULL)
  114194. err = MEMORY_E;
  114195. #endif
  114196. if (err == MP_OKAY) {
  114197. s1 = t + 1;
  114198. s2 = t + 2;
  114199. err = sp_521_mod_mul_norm_17(t->x, a->x, p521_mod);
  114200. }
  114201. if (err == MP_OKAY) {
  114202. err = sp_521_mod_mul_norm_17(t->y, a->y, p521_mod);
  114203. }
  114204. if (err == MP_OKAY) {
  114205. err = sp_521_mod_mul_norm_17(t->z, a->z, p521_mod);
  114206. }
  114207. if (err == MP_OKAY) {
  114208. t->infinity = 0;
  114209. sp_521_proj_to_affine_17(t, tmp);
  114210. XMEMCPY(s1->z, p521_norm_mod, sizeof(p521_norm_mod));
  114211. s1->infinity = 0;
  114212. XMEMCPY(s2->z, p521_norm_mod, sizeof(p521_norm_mod));
  114213. s2->infinity = 0;
  114214. /* table[0] = {0, 0, infinity} */
  114215. XMEMSET(&table[0], 0, sizeof(sp_table_entry_521));
  114216. /* table[1] = Affine version of 'a' in Montgomery form */
  114217. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  114218. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  114219. for (i=1; i<4; i++) {
  114220. sp_521_proj_point_dbl_n_17(t, 131, tmp);
  114221. sp_521_proj_to_affine_17(t, tmp);
  114222. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  114223. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  114224. }
  114225. for (i=1; i<4; i++) {
  114226. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  114227. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  114228. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  114229. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  114230. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  114231. sp_521_proj_point_add_qz1_17(t, s1, s2, tmp);
  114232. sp_521_proj_to_affine_17(t, tmp);
  114233. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  114234. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  114235. }
  114236. }
  114237. }
  114238. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114239. if (t != NULL)
  114240. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  114241. #endif
  114242. return err;
  114243. }
  114244. #endif /* FP_ECC */
  114245. #ifndef WC_NO_CACHE_RESISTANT
  114246. /* Touch each possible entry that could be being copied.
  114247. *
  114248. * r Point to copy into.
  114249. * table Table - start of the entires to access
  114250. * idx Index of entry to retrieve.
  114251. */
  114252. static void sp_521_get_entry_16_17(sp_point_521* r,
  114253. const sp_table_entry_521* table, int idx)
  114254. {
  114255. int i;
  114256. sp_digit mask;
  114257. r->x[0] = 0;
  114258. r->x[1] = 0;
  114259. r->x[2] = 0;
  114260. r->x[3] = 0;
  114261. r->x[4] = 0;
  114262. r->x[5] = 0;
  114263. r->x[6] = 0;
  114264. r->x[7] = 0;
  114265. r->x[8] = 0;
  114266. r->x[9] = 0;
  114267. r->x[10] = 0;
  114268. r->x[11] = 0;
  114269. r->x[12] = 0;
  114270. r->x[13] = 0;
  114271. r->x[14] = 0;
  114272. r->x[15] = 0;
  114273. r->x[16] = 0;
  114274. r->y[0] = 0;
  114275. r->y[1] = 0;
  114276. r->y[2] = 0;
  114277. r->y[3] = 0;
  114278. r->y[4] = 0;
  114279. r->y[5] = 0;
  114280. r->y[6] = 0;
  114281. r->y[7] = 0;
  114282. r->y[8] = 0;
  114283. r->y[9] = 0;
  114284. r->y[10] = 0;
  114285. r->y[11] = 0;
  114286. r->y[12] = 0;
  114287. r->y[13] = 0;
  114288. r->y[14] = 0;
  114289. r->y[15] = 0;
  114290. r->y[16] = 0;
  114291. for (i = 1; i < 16; i++) {
  114292. mask = 0 - (i == idx);
  114293. r->x[0] |= mask & table[i].x[0];
  114294. r->x[1] |= mask & table[i].x[1];
  114295. r->x[2] |= mask & table[i].x[2];
  114296. r->x[3] |= mask & table[i].x[3];
  114297. r->x[4] |= mask & table[i].x[4];
  114298. r->x[5] |= mask & table[i].x[5];
  114299. r->x[6] |= mask & table[i].x[6];
  114300. r->x[7] |= mask & table[i].x[7];
  114301. r->x[8] |= mask & table[i].x[8];
  114302. r->x[9] |= mask & table[i].x[9];
  114303. r->x[10] |= mask & table[i].x[10];
  114304. r->x[11] |= mask & table[i].x[11];
  114305. r->x[12] |= mask & table[i].x[12];
  114306. r->x[13] |= mask & table[i].x[13];
  114307. r->x[14] |= mask & table[i].x[14];
  114308. r->x[15] |= mask & table[i].x[15];
  114309. r->x[16] |= mask & table[i].x[16];
  114310. r->y[0] |= mask & table[i].y[0];
  114311. r->y[1] |= mask & table[i].y[1];
  114312. r->y[2] |= mask & table[i].y[2];
  114313. r->y[3] |= mask & table[i].y[3];
  114314. r->y[4] |= mask & table[i].y[4];
  114315. r->y[5] |= mask & table[i].y[5];
  114316. r->y[6] |= mask & table[i].y[6];
  114317. r->y[7] |= mask & table[i].y[7];
  114318. r->y[8] |= mask & table[i].y[8];
  114319. r->y[9] |= mask & table[i].y[9];
  114320. r->y[10] |= mask & table[i].y[10];
  114321. r->y[11] |= mask & table[i].y[11];
  114322. r->y[12] |= mask & table[i].y[12];
  114323. r->y[13] |= mask & table[i].y[13];
  114324. r->y[14] |= mask & table[i].y[14];
  114325. r->y[15] |= mask & table[i].y[15];
  114326. r->y[16] |= mask & table[i].y[16];
  114327. }
  114328. }
  114329. #endif /* !WC_NO_CACHE_RESISTANT */
  114330. /* Multiply the point by the scalar and return the result.
  114331. * If map is true then convert result to affine coordinates.
  114332. *
  114333. * Stripe implementation.
  114334. * Pre-generated: 2^0, 2^130, ...
  114335. * Pre-generated: products of all combinations of above.
  114336. * 4 doubles and adds (with qz=1)
  114337. *
  114338. * r Resulting point.
  114339. * k Scalar to multiply by.
  114340. * table Pre-computed table.
  114341. * map Indicates whether to convert result to affine.
  114342. * ct Constant time required.
  114343. * heap Heap to use for allocation.
  114344. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  114345. */
  114346. static int sp_521_ecc_mulmod_stripe_17(sp_point_521* r, const sp_point_521* g,
  114347. const sp_table_entry_521* table, const sp_digit* k, int map,
  114348. int ct, void* heap)
  114349. {
  114350. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114351. sp_point_521* rt = NULL;
  114352. sp_digit* t = NULL;
  114353. #else
  114354. sp_point_521 rt[2];
  114355. sp_digit t[2 * 17 * 6];
  114356. #endif
  114357. sp_point_521* p = NULL;
  114358. int i;
  114359. int j;
  114360. int y;
  114361. int x;
  114362. int err = MP_OKAY;
  114363. (void)g;
  114364. /* Constant time used for cache attack resistance implementation. */
  114365. (void)ct;
  114366. (void)heap;
  114367. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114368. rt = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  114369. DYNAMIC_TYPE_ECC);
  114370. if (rt == NULL)
  114371. err = MEMORY_E;
  114372. if (err == MP_OKAY) {
  114373. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  114374. DYNAMIC_TYPE_ECC);
  114375. if (t == NULL)
  114376. err = MEMORY_E;
  114377. }
  114378. #endif
  114379. if (err == MP_OKAY) {
  114380. p = rt + 1;
  114381. XMEMCPY(p->z, p521_norm_mod, sizeof(p521_norm_mod));
  114382. XMEMCPY(rt->z, p521_norm_mod, sizeof(p521_norm_mod));
  114383. y = 0;
  114384. x = 130;
  114385. for (j=0; j<4 && x<521; j++) {
  114386. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  114387. x += 131;
  114388. }
  114389. #ifndef WC_NO_CACHE_RESISTANT
  114390. if (ct) {
  114391. sp_521_get_entry_16_17(rt, table, y);
  114392. } else
  114393. #endif
  114394. {
  114395. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  114396. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  114397. }
  114398. rt->infinity = !y;
  114399. for (i=129; i>=0; i--) {
  114400. y = 0;
  114401. x = i;
  114402. for (j=0; j<4 && x<521; j++) {
  114403. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  114404. x += 131;
  114405. }
  114406. sp_521_proj_point_dbl_17(rt, rt, t);
  114407. #ifndef WC_NO_CACHE_RESISTANT
  114408. if (ct) {
  114409. sp_521_get_entry_16_17(p, table, y);
  114410. }
  114411. else
  114412. #endif
  114413. {
  114414. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  114415. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  114416. }
  114417. p->infinity = !y;
  114418. sp_521_proj_point_add_qz1_17(rt, rt, p, t);
  114419. }
  114420. if (map != 0) {
  114421. sp_521_map_17(r, rt, t);
  114422. }
  114423. else {
  114424. XMEMCPY(r, rt, sizeof(sp_point_521));
  114425. }
  114426. }
  114427. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114428. if (t != NULL)
  114429. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  114430. if (rt != NULL)
  114431. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  114432. #endif
  114433. return err;
  114434. }
  114435. #ifdef FP_ECC
  114436. #ifndef FP_ENTRIES
  114437. #define FP_ENTRIES 16
  114438. #endif
  114439. /* Cache entry - holds precomputation tables for a point. */
  114440. typedef struct sp_cache_521_t {
  114441. /* X ordinate of point that table was generated from. */
  114442. sp_digit x[17];
  114443. /* Y ordinate of point that table was generated from. */
  114444. sp_digit y[17];
  114445. /* Precomputation table for point. */
  114446. sp_table_entry_521 table[16];
  114447. /* Count of entries in table. */
  114448. uint32_t cnt;
  114449. /* Point and table set in entry. */
  114450. int set;
  114451. } sp_cache_521_t;
  114452. /* Cache of tables. */
  114453. static THREAD_LS_T sp_cache_521_t sp_cache_521[FP_ENTRIES];
  114454. /* Index of last entry in cache. */
  114455. static THREAD_LS_T int sp_cache_521_last = -1;
  114456. /* Cache has been initialized. */
  114457. static THREAD_LS_T int sp_cache_521_inited = 0;
  114458. #ifndef HAVE_THREAD_LS
  114459. static volatile int initCacheMutex_521 = 0;
  114460. static wolfSSL_Mutex sp_cache_521_lock;
  114461. #endif
  114462. /* Get the cache entry for the point.
  114463. *
  114464. * g [in] Point scalar multipling.
  114465. * cache [out] Cache table to use.
  114466. */
  114467. static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache)
  114468. {
  114469. int i;
  114470. int j;
  114471. uint32_t least;
  114472. if (sp_cache_521_inited == 0) {
  114473. for (i=0; i<FP_ENTRIES; i++) {
  114474. sp_cache_521[i].set = 0;
  114475. }
  114476. sp_cache_521_inited = 1;
  114477. }
  114478. /* Compare point with those in cache. */
  114479. for (i=0; i<FP_ENTRIES; i++) {
  114480. if (!sp_cache_521[i].set)
  114481. continue;
  114482. if (sp_521_cmp_equal_17(g->x, sp_cache_521[i].x) &
  114483. sp_521_cmp_equal_17(g->y, sp_cache_521[i].y)) {
  114484. sp_cache_521[i].cnt++;
  114485. break;
  114486. }
  114487. }
  114488. /* No match. */
  114489. if (i == FP_ENTRIES) {
  114490. /* Find empty entry. */
  114491. i = (sp_cache_521_last + 1) % FP_ENTRIES;
  114492. for (; i != sp_cache_521_last; i=(i+1)%FP_ENTRIES) {
  114493. if (!sp_cache_521[i].set) {
  114494. break;
  114495. }
  114496. }
  114497. /* Evict least used. */
  114498. if (i == sp_cache_521_last) {
  114499. least = sp_cache_521[0].cnt;
  114500. for (j=1; j<FP_ENTRIES; j++) {
  114501. if (sp_cache_521[j].cnt < least) {
  114502. i = j;
  114503. least = sp_cache_521[i].cnt;
  114504. }
  114505. }
  114506. }
  114507. XMEMCPY(sp_cache_521[i].x, g->x, sizeof(sp_cache_521[i].x));
  114508. XMEMCPY(sp_cache_521[i].y, g->y, sizeof(sp_cache_521[i].y));
  114509. sp_cache_521[i].set = 1;
  114510. sp_cache_521[i].cnt = 1;
  114511. }
  114512. *cache = &sp_cache_521[i];
  114513. sp_cache_521_last = i;
  114514. }
  114515. #endif /* FP_ECC */
  114516. /* Multiply the base point of P521 by the scalar and return the result.
  114517. * If map is true then convert result to affine coordinates.
  114518. *
  114519. * r Resulting point.
  114520. * g Point to multiply.
  114521. * k Scalar to multiply by.
  114522. * map Indicates whether to convert result to affine.
  114523. * ct Constant time required.
  114524. * heap Heap to use for allocation.
  114525. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  114526. */
  114527. static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k,
  114528. int map, int ct, void* heap)
  114529. {
  114530. #ifndef FP_ECC
  114531. return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  114532. #else
  114533. sp_digit tmp[2 * 17 * 6];
  114534. sp_cache_521_t* cache;
  114535. int err = MP_OKAY;
  114536. #ifndef HAVE_THREAD_LS
  114537. if (initCacheMutex_521 == 0) {
  114538. wc_InitMutex(&sp_cache_521_lock);
  114539. initCacheMutex_521 = 1;
  114540. }
  114541. if (wc_LockMutex(&sp_cache_521_lock) != 0)
  114542. err = BAD_MUTEX_E;
  114543. #endif /* HAVE_THREAD_LS */
  114544. if (err == MP_OKAY) {
  114545. sp_ecc_get_cache_521(g, &cache);
  114546. if (cache->cnt == 2)
  114547. sp_521_gen_stripe_table_17(g, cache->table, tmp, heap);
  114548. #ifndef HAVE_THREAD_LS
  114549. wc_UnLockMutex(&sp_cache_521_lock);
  114550. #endif /* HAVE_THREAD_LS */
  114551. if (cache->cnt < 2) {
  114552. err = sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  114553. }
  114554. else {
  114555. err = sp_521_ecc_mulmod_stripe_17(r, g, cache->table, k,
  114556. map, ct, heap);
  114557. }
  114558. }
  114559. return err;
  114560. #endif
  114561. }
  114562. #else
  114563. #ifdef FP_ECC
  114564. /* Generate the pre-computed table of points for the base point.
  114565. *
  114566. * width = 8
  114567. * 256 entries
  114568. * 65 bits between
  114569. *
  114570. * a The base point.
  114571. * table Place to store generated point data.
  114572. * tmp Temporary data.
  114573. * heap Heap to use for allocation.
  114574. */
  114575. static int sp_521_gen_stripe_table_17(const sp_point_521* a,
  114576. sp_table_entry_521* table, sp_digit* tmp, void* heap)
  114577. {
  114578. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114579. sp_point_521* t = NULL;
  114580. #else
  114581. sp_point_521 t[3];
  114582. #endif
  114583. sp_point_521* s1 = NULL;
  114584. sp_point_521* s2 = NULL;
  114585. int i;
  114586. int j;
  114587. int err = MP_OKAY;
  114588. (void)heap;
  114589. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114590. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 3, heap,
  114591. DYNAMIC_TYPE_ECC);
  114592. if (t == NULL)
  114593. err = MEMORY_E;
  114594. #endif
  114595. if (err == MP_OKAY) {
  114596. s1 = t + 1;
  114597. s2 = t + 2;
  114598. err = sp_521_mod_mul_norm_17(t->x, a->x, p521_mod);
  114599. }
  114600. if (err == MP_OKAY) {
  114601. err = sp_521_mod_mul_norm_17(t->y, a->y, p521_mod);
  114602. }
  114603. if (err == MP_OKAY) {
  114604. err = sp_521_mod_mul_norm_17(t->z, a->z, p521_mod);
  114605. }
  114606. if (err == MP_OKAY) {
  114607. t->infinity = 0;
  114608. sp_521_proj_to_affine_17(t, tmp);
  114609. XMEMCPY(s1->z, p521_norm_mod, sizeof(p521_norm_mod));
  114610. s1->infinity = 0;
  114611. XMEMCPY(s2->z, p521_norm_mod, sizeof(p521_norm_mod));
  114612. s2->infinity = 0;
  114613. /* table[0] = {0, 0, infinity} */
  114614. XMEMSET(&table[0], 0, sizeof(sp_table_entry_521));
  114615. /* table[1] = Affine version of 'a' in Montgomery form */
  114616. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  114617. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  114618. for (i=1; i<8; i++) {
  114619. sp_521_proj_point_dbl_n_17(t, 66, tmp);
  114620. sp_521_proj_to_affine_17(t, tmp);
  114621. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  114622. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  114623. }
  114624. for (i=1; i<8; i++) {
  114625. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  114626. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  114627. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  114628. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  114629. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  114630. sp_521_proj_point_add_qz1_17(t, s1, s2, tmp);
  114631. sp_521_proj_to_affine_17(t, tmp);
  114632. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  114633. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  114634. }
  114635. }
  114636. }
  114637. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114638. if (t != NULL)
  114639. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  114640. #endif
  114641. return err;
  114642. }
  114643. #endif /* FP_ECC */
  114644. #ifndef WC_NO_CACHE_RESISTANT
  114645. /* Touch each possible entry that could be being copied.
  114646. *
  114647. * r Point to copy into.
  114648. * table Table - start of the entires to access
  114649. * idx Index of entry to retrieve.
  114650. */
  114651. static void sp_521_get_entry_256_17(sp_point_521* r,
  114652. const sp_table_entry_521* table, int idx)
  114653. {
  114654. int i;
  114655. sp_digit mask;
  114656. r->x[0] = 0;
  114657. r->x[1] = 0;
  114658. r->x[2] = 0;
  114659. r->x[3] = 0;
  114660. r->x[4] = 0;
  114661. r->x[5] = 0;
  114662. r->x[6] = 0;
  114663. r->x[7] = 0;
  114664. r->x[8] = 0;
  114665. r->x[9] = 0;
  114666. r->x[10] = 0;
  114667. r->x[11] = 0;
  114668. r->x[12] = 0;
  114669. r->x[13] = 0;
  114670. r->x[14] = 0;
  114671. r->x[15] = 0;
  114672. r->x[16] = 0;
  114673. r->y[0] = 0;
  114674. r->y[1] = 0;
  114675. r->y[2] = 0;
  114676. r->y[3] = 0;
  114677. r->y[4] = 0;
  114678. r->y[5] = 0;
  114679. r->y[6] = 0;
  114680. r->y[7] = 0;
  114681. r->y[8] = 0;
  114682. r->y[9] = 0;
  114683. r->y[10] = 0;
  114684. r->y[11] = 0;
  114685. r->y[12] = 0;
  114686. r->y[13] = 0;
  114687. r->y[14] = 0;
  114688. r->y[15] = 0;
  114689. r->y[16] = 0;
  114690. for (i = 1; i < 256; i++) {
  114691. mask = 0 - (i == idx);
  114692. r->x[0] |= mask & table[i].x[0];
  114693. r->x[1] |= mask & table[i].x[1];
  114694. r->x[2] |= mask & table[i].x[2];
  114695. r->x[3] |= mask & table[i].x[3];
  114696. r->x[4] |= mask & table[i].x[4];
  114697. r->x[5] |= mask & table[i].x[5];
  114698. r->x[6] |= mask & table[i].x[6];
  114699. r->x[7] |= mask & table[i].x[7];
  114700. r->x[8] |= mask & table[i].x[8];
  114701. r->x[9] |= mask & table[i].x[9];
  114702. r->x[10] |= mask & table[i].x[10];
  114703. r->x[11] |= mask & table[i].x[11];
  114704. r->x[12] |= mask & table[i].x[12];
  114705. r->x[13] |= mask & table[i].x[13];
  114706. r->x[14] |= mask & table[i].x[14];
  114707. r->x[15] |= mask & table[i].x[15];
  114708. r->x[16] |= mask & table[i].x[16];
  114709. r->y[0] |= mask & table[i].y[0];
  114710. r->y[1] |= mask & table[i].y[1];
  114711. r->y[2] |= mask & table[i].y[2];
  114712. r->y[3] |= mask & table[i].y[3];
  114713. r->y[4] |= mask & table[i].y[4];
  114714. r->y[5] |= mask & table[i].y[5];
  114715. r->y[6] |= mask & table[i].y[6];
  114716. r->y[7] |= mask & table[i].y[7];
  114717. r->y[8] |= mask & table[i].y[8];
  114718. r->y[9] |= mask & table[i].y[9];
  114719. r->y[10] |= mask & table[i].y[10];
  114720. r->y[11] |= mask & table[i].y[11];
  114721. r->y[12] |= mask & table[i].y[12];
  114722. r->y[13] |= mask & table[i].y[13];
  114723. r->y[14] |= mask & table[i].y[14];
  114724. r->y[15] |= mask & table[i].y[15];
  114725. r->y[16] |= mask & table[i].y[16];
  114726. }
  114727. }
  114728. #endif /* !WC_NO_CACHE_RESISTANT */
  114729. /* Multiply the point by the scalar and return the result.
  114730. * If map is true then convert result to affine coordinates.
  114731. *
  114732. * Stripe implementation.
  114733. * Pre-generated: 2^0, 2^65, ...
  114734. * Pre-generated: products of all combinations of above.
  114735. * 8 doubles and adds (with qz=1)
  114736. *
  114737. * r Resulting point.
  114738. * k Scalar to multiply by.
  114739. * table Pre-computed table.
  114740. * map Indicates whether to convert result to affine.
  114741. * ct Constant time required.
  114742. * heap Heap to use for allocation.
  114743. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  114744. */
  114745. static int sp_521_ecc_mulmod_stripe_17(sp_point_521* r, const sp_point_521* g,
  114746. const sp_table_entry_521* table, const sp_digit* k, int map,
  114747. int ct, void* heap)
  114748. {
  114749. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114750. sp_point_521* rt = NULL;
  114751. sp_digit* t = NULL;
  114752. #else
  114753. sp_point_521 rt[2];
  114754. sp_digit t[2 * 17 * 6];
  114755. #endif
  114756. sp_point_521* p = NULL;
  114757. int i;
  114758. int j;
  114759. int y;
  114760. int x;
  114761. int err = MP_OKAY;
  114762. (void)g;
  114763. /* Constant time used for cache attack resistance implementation. */
  114764. (void)ct;
  114765. (void)heap;
  114766. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114767. rt = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  114768. DYNAMIC_TYPE_ECC);
  114769. if (rt == NULL)
  114770. err = MEMORY_E;
  114771. if (err == MP_OKAY) {
  114772. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  114773. DYNAMIC_TYPE_ECC);
  114774. if (t == NULL)
  114775. err = MEMORY_E;
  114776. }
  114777. #endif
  114778. if (err == MP_OKAY) {
  114779. p = rt + 1;
  114780. XMEMCPY(p->z, p521_norm_mod, sizeof(p521_norm_mod));
  114781. XMEMCPY(rt->z, p521_norm_mod, sizeof(p521_norm_mod));
  114782. y = 0;
  114783. x = 65;
  114784. for (j=0; j<8 && x<521; j++) {
  114785. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  114786. x += 66;
  114787. }
  114788. #ifndef WC_NO_CACHE_RESISTANT
  114789. if (ct) {
  114790. sp_521_get_entry_256_17(rt, table, y);
  114791. } else
  114792. #endif
  114793. {
  114794. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  114795. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  114796. }
  114797. rt->infinity = !y;
  114798. for (i=64; i>=0; i--) {
  114799. y = 0;
  114800. x = i;
  114801. for (j=0; j<8 && x<521; j++) {
  114802. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  114803. x += 66;
  114804. }
  114805. sp_521_proj_point_dbl_17(rt, rt, t);
  114806. #ifndef WC_NO_CACHE_RESISTANT
  114807. if (ct) {
  114808. sp_521_get_entry_256_17(p, table, y);
  114809. }
  114810. else
  114811. #endif
  114812. {
  114813. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  114814. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  114815. }
  114816. p->infinity = !y;
  114817. sp_521_proj_point_add_qz1_17(rt, rt, p, t);
  114818. }
  114819. if (map != 0) {
  114820. sp_521_map_17(r, rt, t);
  114821. }
  114822. else {
  114823. XMEMCPY(r, rt, sizeof(sp_point_521));
  114824. }
  114825. }
  114826. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114827. if (t != NULL)
  114828. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  114829. if (rt != NULL)
  114830. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  114831. #endif
  114832. return err;
  114833. }
  114834. #ifdef FP_ECC
  114835. #ifndef FP_ENTRIES
  114836. #define FP_ENTRIES 16
  114837. #endif
  114838. /* Cache entry - holds precomputation tables for a point. */
  114839. typedef struct sp_cache_521_t {
  114840. /* X ordinate of point that table was generated from. */
  114841. sp_digit x[17];
  114842. /* Y ordinate of point that table was generated from. */
  114843. sp_digit y[17];
  114844. /* Precomputation table for point. */
  114845. sp_table_entry_521 table[256];
  114846. /* Count of entries in table. */
  114847. uint32_t cnt;
  114848. /* Point and table set in entry. */
  114849. int set;
  114850. } sp_cache_521_t;
  114851. /* Cache of tables. */
  114852. static THREAD_LS_T sp_cache_521_t sp_cache_521[FP_ENTRIES];
  114853. /* Index of last entry in cache. */
  114854. static THREAD_LS_T int sp_cache_521_last = -1;
  114855. /* Cache has been initialized. */
  114856. static THREAD_LS_T int sp_cache_521_inited = 0;
  114857. #ifndef HAVE_THREAD_LS
  114858. static volatile int initCacheMutex_521 = 0;
  114859. static wolfSSL_Mutex sp_cache_521_lock;
  114860. #endif
  114861. /* Get the cache entry for the point.
  114862. *
  114863. * g [in] Point scalar multipling.
  114864. * cache [out] Cache table to use.
  114865. */
  114866. static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache)
  114867. {
  114868. int i;
  114869. int j;
  114870. uint32_t least;
  114871. if (sp_cache_521_inited == 0) {
  114872. for (i=0; i<FP_ENTRIES; i++) {
  114873. sp_cache_521[i].set = 0;
  114874. }
  114875. sp_cache_521_inited = 1;
  114876. }
  114877. /* Compare point with those in cache. */
  114878. for (i=0; i<FP_ENTRIES; i++) {
  114879. if (!sp_cache_521[i].set)
  114880. continue;
  114881. if (sp_521_cmp_equal_17(g->x, sp_cache_521[i].x) &
  114882. sp_521_cmp_equal_17(g->y, sp_cache_521[i].y)) {
  114883. sp_cache_521[i].cnt++;
  114884. break;
  114885. }
  114886. }
  114887. /* No match. */
  114888. if (i == FP_ENTRIES) {
  114889. /* Find empty entry. */
  114890. i = (sp_cache_521_last + 1) % FP_ENTRIES;
  114891. for (; i != sp_cache_521_last; i=(i+1)%FP_ENTRIES) {
  114892. if (!sp_cache_521[i].set) {
  114893. break;
  114894. }
  114895. }
  114896. /* Evict least used. */
  114897. if (i == sp_cache_521_last) {
  114898. least = sp_cache_521[0].cnt;
  114899. for (j=1; j<FP_ENTRIES; j++) {
  114900. if (sp_cache_521[j].cnt < least) {
  114901. i = j;
  114902. least = sp_cache_521[i].cnt;
  114903. }
  114904. }
  114905. }
  114906. XMEMCPY(sp_cache_521[i].x, g->x, sizeof(sp_cache_521[i].x));
  114907. XMEMCPY(sp_cache_521[i].y, g->y, sizeof(sp_cache_521[i].y));
  114908. sp_cache_521[i].set = 1;
  114909. sp_cache_521[i].cnt = 1;
  114910. }
  114911. *cache = &sp_cache_521[i];
  114912. sp_cache_521_last = i;
  114913. }
  114914. #endif /* FP_ECC */
  114915. /* Multiply the base point of P521 by the scalar and return the result.
  114916. * If map is true then convert result to affine coordinates.
  114917. *
  114918. * r Resulting point.
  114919. * g Point to multiply.
  114920. * k Scalar to multiply by.
  114921. * map Indicates whether to convert result to affine.
  114922. * ct Constant time required.
  114923. * heap Heap to use for allocation.
  114924. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  114925. */
  114926. static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k,
  114927. int map, int ct, void* heap)
  114928. {
  114929. #ifndef FP_ECC
  114930. return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  114931. #else
  114932. sp_digit tmp[2 * 17 * 6];
  114933. sp_cache_521_t* cache;
  114934. int err = MP_OKAY;
  114935. #ifndef HAVE_THREAD_LS
  114936. if (initCacheMutex_521 == 0) {
  114937. wc_InitMutex(&sp_cache_521_lock);
  114938. initCacheMutex_521 = 1;
  114939. }
  114940. if (wc_LockMutex(&sp_cache_521_lock) != 0)
  114941. err = BAD_MUTEX_E;
  114942. #endif /* HAVE_THREAD_LS */
  114943. if (err == MP_OKAY) {
  114944. sp_ecc_get_cache_521(g, &cache);
  114945. if (cache->cnt == 2)
  114946. sp_521_gen_stripe_table_17(g, cache->table, tmp, heap);
  114947. #ifndef HAVE_THREAD_LS
  114948. wc_UnLockMutex(&sp_cache_521_lock);
  114949. #endif /* HAVE_THREAD_LS */
  114950. if (cache->cnt < 2) {
  114951. err = sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  114952. }
  114953. else {
  114954. err = sp_521_ecc_mulmod_stripe_17(r, g, cache->table, k,
  114955. map, ct, heap);
  114956. }
  114957. }
  114958. return err;
  114959. #endif
  114960. }
  114961. #endif /* WOLFSSL_SP_SMALL */
  114962. /* Multiply the point by the scalar and return the result.
  114963. * If map is true then convert result to affine coordinates.
  114964. *
  114965. * km Scalar to multiply by.
  114966. * p Point to multiply.
  114967. * r Resulting point.
  114968. * map Indicates whether to convert result to affine.
  114969. * heap Heap to use for allocation.
  114970. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  114971. */
  114972. int sp_ecc_mulmod_521(const mp_int* km, const ecc_point* gm, ecc_point* r,
  114973. int map, void* heap)
  114974. {
  114975. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114976. sp_point_521* point = NULL;
  114977. sp_digit* k = NULL;
  114978. #else
  114979. sp_point_521 point[1];
  114980. sp_digit k[17];
  114981. #endif
  114982. int err = MP_OKAY;
  114983. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114984. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  114985. DYNAMIC_TYPE_ECC);
  114986. if (point == NULL)
  114987. err = MEMORY_E;
  114988. if (err == MP_OKAY) {
  114989. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  114990. DYNAMIC_TYPE_ECC);
  114991. if (k == NULL)
  114992. err = MEMORY_E;
  114993. }
  114994. #endif
  114995. if (err == MP_OKAY) {
  114996. sp_521_from_mp(k, 17, km);
  114997. sp_521_point_from_ecc_point_17(point, gm);
  114998. err = sp_521_ecc_mulmod_17(point, point, k, map, 1, heap);
  114999. }
  115000. if (err == MP_OKAY) {
  115001. err = sp_521_point_to_ecc_point_17(point, r);
  115002. }
  115003. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115004. if (k != NULL)
  115005. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  115006. if (point != NULL)
  115007. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  115008. #endif
  115009. return err;
  115010. }
  115011. /* Multiply the point by the scalar, add point a and return the result.
  115012. * If map is true then convert result to affine coordinates.
  115013. *
  115014. * km Scalar to multiply by.
  115015. * p Point to multiply.
  115016. * am Point to add to scalar mulitply result.
  115017. * inMont Point to add is in montgomery form.
  115018. * r Resulting point.
  115019. * map Indicates whether to convert result to affine.
  115020. * heap Heap to use for allocation.
  115021. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  115022. */
  115023. int sp_ecc_mulmod_add_521(const mp_int* km, const ecc_point* gm,
  115024. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  115025. {
  115026. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115027. sp_point_521* point = NULL;
  115028. sp_digit* k = NULL;
  115029. #else
  115030. sp_point_521 point[2];
  115031. sp_digit k[17 + 17 * 2 * 6];
  115032. #endif
  115033. sp_point_521* addP = NULL;
  115034. sp_digit* tmp = NULL;
  115035. int err = MP_OKAY;
  115036. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115037. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  115038. DYNAMIC_TYPE_ECC);
  115039. if (point == NULL)
  115040. err = MEMORY_E;
  115041. if (err == MP_OKAY) {
  115042. k = (sp_digit*)XMALLOC(
  115043. sizeof(sp_digit) * (17 + 17 * 2 * 6), heap,
  115044. DYNAMIC_TYPE_ECC);
  115045. if (k == NULL)
  115046. err = MEMORY_E;
  115047. }
  115048. #endif
  115049. if (err == MP_OKAY) {
  115050. addP = point + 1;
  115051. tmp = k + 17;
  115052. sp_521_from_mp(k, 17, km);
  115053. sp_521_point_from_ecc_point_17(point, gm);
  115054. sp_521_point_from_ecc_point_17(addP, am);
  115055. }
  115056. if ((err == MP_OKAY) && (!inMont)) {
  115057. err = sp_521_mod_mul_norm_17(addP->x, addP->x, p521_mod);
  115058. }
  115059. if ((err == MP_OKAY) && (!inMont)) {
  115060. err = sp_521_mod_mul_norm_17(addP->y, addP->y, p521_mod);
  115061. }
  115062. if ((err == MP_OKAY) && (!inMont)) {
  115063. err = sp_521_mod_mul_norm_17(addP->z, addP->z, p521_mod);
  115064. }
  115065. if (err == MP_OKAY) {
  115066. err = sp_521_ecc_mulmod_17(point, point, k, 0, 0, heap);
  115067. }
  115068. if (err == MP_OKAY) {
  115069. sp_521_proj_point_add_17(point, point, addP, tmp);
  115070. if (map) {
  115071. sp_521_map_17(point, point, tmp);
  115072. }
  115073. err = sp_521_point_to_ecc_point_17(point, r);
  115074. }
  115075. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115076. if (k != NULL)
  115077. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  115078. if (point != NULL)
  115079. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  115080. #endif
  115081. return err;
  115082. }
  115083. #ifdef WOLFSSL_SP_SMALL
  115084. /* Striping precomputation table.
  115085. * 4 points combined into a table of 16 points.
  115086. * Distance of 131 between points.
  115087. */
  115088. static const sp_table_entry_521 p521_table[16] = {
  115089. /* 0 */
  115090. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  115091. 0x00, 0x00, 0x00, 0x00, 0x00 },
  115092. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  115093. 0x00, 0x00, 0x00, 0x00, 0x00 } },
  115094. /* 1 */
  115095. { { 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  115096. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  115097. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6 },
  115098. { 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  115099. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  115100. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118 } },
  115101. /* 2 */
  115102. { { 0x66fd07ca,0x1036eb9b,0x6b7fb490,0x6ca52cc1,0xd3e0c270,0x512e973e,
  115103. 0x73d92d11,0x889980bf,0xa4005eea,0x38b4cfe4,0x8ceb4313,0xb6f992cc,
  115104. 0x6daf7c23,0xd0ac2f8d,0xe32a93cb,0x1ccfbf17,0x000000c2 },
  115105. { 0x2f508cca,0x7bd9d6f1,0x595a72af,0xe82d7171,0x97512873,0x25d02976,
  115106. 0x8cf39fbc,0xefc1de8b,0x9a1237f4,0x25e6b77f,0xd4d98b5d,0x9f3b73e7,
  115107. 0xeccb07fe,0xe1fda62b,0x625350cf,0xdb813b03,0x00000014 } },
  115108. /* 3 */
  115109. { { 0x9b27bd61,0x415a1c9b,0x606854d6,0x74522753,0x92e73538,0x9e331ef4,
  115110. 0x817e7a6d,0x0b3dba85,0x49ac273b,0x55c4bd53,0xfcb5417f,0xad42c78d,
  115111. 0x92e08d38,0x528998b9,0xcc1914cc,0x14c2fff6,0x000000c1 },
  115112. { 0x767e9645,0x35b26fb0,0xc5e5a659,0x162b512f,0xcc47fbb8,0xa6e03696,
  115113. 0x0a29a69b,0x732db065,0xd56bdf5d,0x058a74ed,0x25c858d9,0x4b7b60a0,
  115114. 0xbd43373d,0x17f8a6d4,0xedf610b4,0x7b968f51,0x0000011f } },
  115115. /* 4 */
  115116. { { 0x1bc0fa77,0x5f56b5a4,0x64fd36f5,0x6cdd6bb5,0x8a5b7c7f,0xd0ac68b5,
  115117. 0x09919ef9,0x4a92d9bf,0x71c3c520,0xc305e12b,0xdb699aee,0x554a9d1c,
  115118. 0x61f54643,0x7fde0077,0x479115ce,0x99c13124,0x00000039 },
  115119. { 0xc271ac2d,0x25f890e1,0x94b370ac,0x1353ccd3,0x744d4011,0xc7b5adf6,
  115120. 0xbe378127,0x9ccd7687,0x06c4e3cd,0xa8489b5c,0x305505f9,0x1945580a,
  115121. 0x4ab3b12b,0x07190a20,0x1534ea4d,0x0ff53eb1,0x00000159 } },
  115122. /* 5 */
  115123. { { 0x91798548,0x877d4edd,0x031d657a,0xc43c7b25,0xfab18a04,0x47603671,
  115124. 0xf670b476,0x7e39e7f2,0xb02fcc03,0xf7b76431,0x877f46f5,0x7c5662f3,
  115125. 0x1c8b0c61,0x5bf8327e,0x4a8be322,0xe9cdb353,0x000001ae },
  115126. { 0x9d264420,0xa2d7092e,0x533ff3db,0x1f970352,0x99b5b52e,0x31dd232b,
  115127. 0x850f45e9,0x8a9ce16b,0xc3011849,0x01c99023,0xc8e9301e,0x4bc30989,
  115128. 0xcd95f64c,0x77a4de70,0x1026f289,0xbc8797bb,0x000000d7 } },
  115129. /* 6 */
  115130. { { 0x2be9edf8,0x98ea0934,0xfcb98199,0x6c2f3132,0xfaf83aeb,0xf579893d,
  115131. 0xc73fda0f,0x858e87bb,0x7a0b9d1c,0xd3c0b3fb,0x71ee68b1,0x21fe6305,
  115132. 0x66aa6f16,0x5bf8f01f,0xbca825ed,0x30934c99,0x000000d1 },
  115133. { 0x913022f2,0xe4309850,0xde5b80ce,0xfdc336c9,0x8b6130ef,0xb716d689,
  115134. 0xa758d2f4,0x8a58b405,0xaa5cbc1c,0x98879df8,0xc12ce0bb,0x847cfd06,
  115135. 0x8c02ff3c,0xa1006360,0x3438695b,0x836e906a,0x00000136 } },
  115136. /* 7 */
  115137. { { 0x259ce02d,0xac8fe351,0xdae5e0f7,0xa506da0c,0xf043421d,0x77b56e98,
  115138. 0xa1647490,0xe0d041c7,0x9cb90101,0xe41f0789,0xda3e72e6,0x29bbf572,
  115139. 0x04a14df0,0x6b635c47,0xe81ef5d3,0x56873f58,0x000001dd },
  115140. { 0x5cf9e33f,0x77abe79e,0x0a1117fd,0x91aab581,0xcbac2fe1,0x11edf3b1,
  115141. 0xd72113b7,0xef43e017,0x06b74002,0xf9ad685c,0x8fbd3b1a,0x7e6370ce,
  115142. 0x42f73a82,0x550dd50b,0xc5e64a9b,0x8f2146be,0x000001f2 } },
  115143. /* 8 */
  115144. { { 0x2934ed82,0x05a704cc,0x989edd8c,0x647089fb,0x0ce7c62d,0xe0b239d4,
  115145. 0x105a5eff,0x4c892ea6,0xd5ed6b04,0xa519395f,0x509ed794,0x806c7003,
  115146. 0xe70ce5c4,0x882e9886,0xff01f6a9,0x50730ca1,0x00000088 },
  115147. { 0xdbcc5484,0x90a78a16,0xfd454b50,0xc1ab078c,0xcb09e525,0x6f488252,
  115148. 0xe19b2ed7,0xdd663f53,0xa67bf59c,0x16b10da1,0x36bb770a,0xb47f6b95,
  115149. 0x777b2bce,0x6bdc8428,0x561553f8,0xcd02ae3d,0x00000017 } },
  115150. /* 9 */
  115151. { { 0x1579d15a,0x1e3633a0,0x3e98cd1f,0x574f0c23,0xc60f4f99,0x45969dca,
  115152. 0x49fb9f24,0x10062c93,0xd378f640,0xd29a29d7,0xd7d48c2f,0xec941760,
  115153. 0x31fbea5c,0xf0591c59,0xb40f9ebf,0xd6173e6b,0x00000063 },
  115154. { 0x5a984a72,0x220f4f39,0x32510f26,0x9a3f82ce,0x8c069a1d,0xf3d04c76,
  115155. 0x69a21e57,0xf1d6d891,0xdc4db601,0x6b96b30b,0x64dcf3e0,0x71eeb728,
  115156. 0xc7caaff3,0x6f80c483,0x571b66e4,0x45533092,0x000000b0 } },
  115157. /* 10 */
  115158. { { 0x87140dad,0x49ae4521,0x57e2803e,0xda73032b,0x026ea20a,0x13f5e5eb,
  115159. 0x6e00afb9,0x2d54c4b0,0x7a150474,0x4393b92b,0x13f1a7da,0xb5b41bf8,
  115160. 0x02b5867a,0x6d786907,0xaf2ea4d1,0x5193a9ac,0x000001b3 },
  115161. { 0xa6b186cb,0x2a1563f7,0xe28e57b6,0x73a70a44,0x78fc8a1d,0xd7c4fc6d,
  115162. 0xdf3d6d99,0x4c9b4581,0x1e373aab,0x544f5249,0xe913498e,0xe99434a2,
  115163. 0xc4700f4c,0x30159749,0xe5142766,0xb8ef02cc,0x000001d0 } },
  115164. /* 11 */
  115165. { { 0xb9e6ffc9,0xe99805a6,0xf74d977b,0x1a357f05,0x5c9941bc,0xc8ddef31,
  115166. 0xcbe842e7,0x4b6d66ca,0xa20dc12d,0x84e1f75f,0x5f0c02fc,0x8b1b2c50,
  115167. 0x037b493d,0x3fa1889e,0x95705046,0x720bd9e0,0x000001c2 },
  115168. { 0x93ab9309,0x1a1f3378,0x226a8f94,0xe05a30a2,0x4045f1bd,0x2c01a52d,
  115169. 0xab5f5115,0xf42e8fd5,0x0c05fecf,0x954d1d09,0x8d0650d3,0x47e964d1,
  115170. 0x3c860801,0x6866fa5d,0x5abbb4af,0xac2fecbf,0x0000012c } },
  115171. /* 12 */
  115172. { { 0xe5537747,0x846dc3d2,0x1f5f9f46,0xe28e00df,0x3f31e42d,0x041af624,
  115173. 0x256af225,0x4948947f,0xff4f9550,0x3896c61a,0x34bb5a3e,0xcb40c773,
  115174. 0xeceafacc,0xb9becb07,0x4d45e83e,0xfe29f049,0x000001aa },
  115175. { 0x6b5578db,0x83fb71b3,0x0a710526,0x3017f115,0x5f220d77,0x189ec946,
  115176. 0x48465e68,0xba87ae07,0x70e0cbea,0x1da474d5,0x2b2ba7c5,0xb92cb0a6,
  115177. 0x8b1fb7e2,0x35cb356d,0x2cc8cb18,0x1155296a,0x0000000f } },
  115178. /* 13 */
  115179. { { 0x6ed0f604,0x7f9c9d9b,0xcb49c6d7,0x765e43e9,0xae9be5ca,0x03c4dd67,
  115180. 0x405aed36,0x5480888b,0x920ccddb,0x3a69ebb2,0x03f0c7cc,0x44ec0573,
  115181. 0xce89b026,0x158e2437,0x4f179a17,0x86795029,0x0000003a },
  115182. { 0x9f193dd9,0xf7854032,0xdcc158a9,0x531e4068,0x3642b1a5,0x774171bf,
  115183. 0xc1e53aa3,0x12b4920f,0xfd87478d,0xd1c5fb53,0xa7cba7ca,0x48958c58,
  115184. 0x3f66f2c7,0x375b2cb2,0x598899bd,0x1b510d0f,0x000001b8 } },
  115185. /* 14 */
  115186. { { 0x52007e41,0xfe96299d,0xcd708dcd,0x997140b5,0xf655f6fa,0xe9294eed,
  115187. 0xd58b839d,0x7701d45d,0xb6f77cdb,0x5dbdf5ad,0x95a572f0,0x265189f4,
  115188. 0xb3515e7b,0xc162794e,0x72655e0b,0xbfb571e0,0x00000168 },
  115189. { 0xbda82a6b,0xf0d2b863,0x390a9cc7,0x3df5b283,0x700fcd7b,0xbab9995a,
  115190. 0xfa4e6c06,0xc01ef0af,0x76a392d4,0x10a98513,0x955392f0,0xa7e3fc72,
  115191. 0x1d7a8550,0x8e3c0128,0x361898a8,0xcbca551a,0x0000010f } },
  115192. /* 15 */
  115193. { { 0x3ab71115,0xc8a4cd40,0xbcb9b55b,0xb783170d,0xabd9b426,0x1be20f6a,
  115194. 0x5377b714,0x32d2ea64,0x6b358bbf,0xda342480,0x6e202211,0x782bc800,
  115195. 0xaa27c499,0xf80974c4,0x50341cde,0xc2e66fa9,0x0000004e },
  115196. { 0x24ae60c3,0x082cb95b,0x83ad7484,0xd4b80af4,0x6205256b,0x84b739ce,
  115197. 0xae1fe063,0x616f505e,0x342f218f,0xef14ea68,0x64a01186,0x2b17d66c,
  115198. 0x50858bce,0x60e889ce,0xd5881005,0xdb046c59,0x000001e1 } },
  115199. };
  115200. /* Multiply the base point of P521 by the scalar and return the result.
  115201. * If map is true then convert result to affine coordinates.
  115202. *
  115203. * Stripe implementation.
  115204. * Pre-generated: 2^0, 2^130, ...
  115205. * Pre-generated: products of all combinations of above.
  115206. * 4 doubles and adds (with qz=1)
  115207. *
  115208. * r Resulting point.
  115209. * k Scalar to multiply by.
  115210. * map Indicates whether to convert result to affine.
  115211. * ct Constant time required.
  115212. * heap Heap to use for allocation.
  115213. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  115214. */
  115215. static int sp_521_ecc_mulmod_base_17(sp_point_521* r, const sp_digit* k,
  115216. int map, int ct, void* heap)
  115217. {
  115218. return sp_521_ecc_mulmod_stripe_17(r, &p521_base, p521_table,
  115219. k, map, ct, heap);
  115220. }
  115221. #else
  115222. /* Striping precomputation table.
  115223. * 8 points combined into a table of 256 points.
  115224. * Distance of 66 between points.
  115225. */
  115226. static const sp_table_entry_521 p521_table[256] = {
  115227. /* 0 */
  115228. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  115229. 0x00, 0x00, 0x00, 0x00, 0x00 },
  115230. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  115231. 0x00, 0x00, 0x00, 0x00, 0x00 } },
  115232. /* 1 */
  115233. { { 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  115234. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  115235. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6 },
  115236. { 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  115237. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  115238. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118 } },
  115239. /* 2 */
  115240. { { 0x0f0ccb51,0x80398667,0x3654974a,0xb87e1d01,0xb2b29ed9,0x7f58cf21,
  115241. 0xa3add337,0x06c0e9aa,0xe9d08ffb,0xf13b35d0,0x96761627,0xdd8bf44c,
  115242. 0x758a3ef4,0xa4a18c14,0xa0043adb,0x96a576dd,0x0000013e },
  115243. { 0x632d95a3,0x2bde24f8,0x4c524829,0x79f15ef1,0x9bdaba19,0xaadd863e,
  115244. 0xa962b707,0xdde053f4,0x14258d98,0xc598a2de,0x061c235c,0x9fa5a19d,
  115245. 0xe8ffd32c,0x0ed46510,0xef78ceac,0x2aea9dd1,0x00000185 } },
  115246. /* 3 */
  115247. { { 0xeaaf1fe3,0xd0a91dd8,0x4400b52b,0x0db38662,0x21abf0d2,0xff6a06a9,
  115248. 0xa768c940,0x9412879a,0x9a1eec37,0xf3791abc,0x2738343c,0xc913fbe6,
  115249. 0xe222abc1,0x728b42ab,0x2b9ef313,0x874c0a86,0x00000157 },
  115250. { 0xe6f03d49,0x0ac8f184,0x1e48be03,0xa9c357e4,0x815cbdef,0x02ce5ef3,
  115251. 0x5fd8dc3c,0x7a41c7ab,0xfaeb109d,0x4bef67c9,0xa84f4d38,0x2f98cca1,
  115252. 0x672f0aae,0x7e03d47d,0x1d58968b,0x24b1ab58,0x00000007 } },
  115253. /* 4 */
  115254. { { 0xdf9314e0,0x904f2d4b,0xe7a00aac,0xdaae850d,0x582efb03,0x79231083,
  115255. 0xec7fe6d2,0x80f1c283,0x199d74a8,0x2d5b3996,0x395007e7,0x5f120b9b,
  115256. 0x4773f03e,0x30d23773,0x3b78b686,0xf4c19273,0x00000121 },
  115257. { 0xfa8b51f0,0xf103ff6d,0x40e2bdf0,0xae7afb51,0x83254171,0x1130380e,
  115258. 0xcda10d95,0xe83501b8,0x4f3a8c01,0x1057771e,0xac807069,0x8f52196a,
  115259. 0xa5623821,0x3609b0aa,0x94a0a7f1,0x8c257906,0x000001db } },
  115260. /* 5 */
  115261. { { 0xb2c0958d,0x300370cc,0x69a7b387,0x89aef166,0x480c9b38,0x2792f3cf,
  115262. 0xfab3e149,0x0b2984f2,0x50748967,0x9751e436,0xad33db2a,0x9cab99d5,
  115263. 0xb44a4daa,0x4d945d32,0x16c77325,0xa26cca52,0x0000000a },
  115264. { 0xf9e66d18,0xcdbe1d41,0xaa117e7a,0x80aeef96,0xddb0d24b,0x053214a2,
  115265. 0x5c98b7bf,0x6dcfb227,0xdfd3c848,0x613e7436,0x3ca4d52c,0x6e703fa1,
  115266. 0x18551e64,0x0c8e2977,0xbfa8527d,0xf5e90eac,0x000001c6 } },
  115267. /* 6 */
  115268. { { 0x4ab2d58f,0xa2c2f1e7,0x2a097802,0xc1bbf82c,0x770bb76a,0x6583eb24,
  115269. 0x5667f7bd,0x8e4ed9ed,0xfd96897e,0xd8c01d86,0x3fbe0f15,0x66395a13,
  115270. 0xd99cdcb1,0x51e4f39d,0x720deb25,0xde08424a,0x00000082 },
  115271. { 0x60ea91af,0x97aa53b2,0x7a31dfdd,0xa4384af7,0x5cd09bbe,0xcd82f239,
  115272. 0xf30058e1,0x997c19da,0xe5c78e97,0x443b60c6,0x575b1845,0xfaae9b5f,
  115273. 0x08c2ce16,0x5ce86f33,0x4f63fa86,0x983ce58f,0x00000073 } },
  115274. /* 7 */
  115275. { { 0x8217609d,0xaee93131,0x2412fc00,0x7f8a9dd4,0x286c6329,0xe117e64c,
  115276. 0x7bf1c65e,0xcc3782d6,0x8d03eee5,0xe8c144db,0x9ab93799,0x01acacb2,
  115277. 0xb07784c7,0x215eb1b5,0x1affcd87,0x2c409fa8,0x000000f8 },
  115278. { 0x378139a4,0x007d3766,0xb55bea93,0xc6d969eb,0x68c8bc9d,0xc7c60d6f,
  115279. 0x5f93f242,0x844e8461,0x741717d9,0x8461ca2a,0xf0bf120e,0x8e930e79,
  115280. 0x6b5699d7,0xe1554a02,0x6a4fb6de,0xe69c7702,0x0000007d } },
  115281. /* 8 */
  115282. { { 0x4bee80d7,0x61b51bb0,0x7692de69,0x0e1f6a1f,0xa0ebc3bd,0x8379e46c,
  115283. 0x930644f0,0x1c0bffa7,0x390db077,0x97c67b87,0xfada1ce9,0x095c33e1,
  115284. 0xac54b512,0x3c500add,0xd3118656,0xc231d360,0x000000b0 },
  115285. { 0x39bcab2f,0x06289298,0x64dd220a,0xc0c06780,0x763dc2a0,0x062f6084,
  115286. 0x1938c3e3,0x88e9da73,0x52e46eb9,0x69be8f2d,0x6a5de0fd,0xe55c8d2d,
  115287. 0xdb2c0e26,0xf3a3fd63,0x1e4bff57,0x899c6d9f,0x0000014a } },
  115288. /* 9 */
  115289. { { 0xec05ce88,0x9ff6e3a1,0xb6afd202,0xf8fc2496,0x6fbeb007,0x0b9d2077,
  115290. 0xeebded40,0xb50ec0bd,0x693700f7,0xaef97742,0x3f7b030e,0x806e37a1,
  115291. 0x1b901f77,0x5cf17d17,0xca95ae0f,0x9036e5df,0x00000159 },
  115292. { 0x000e8e0c,0x00af64b5,0x06fb4df9,0xd3f2ae04,0x449f23ba,0x5f61da67,
  115293. 0x255b25a9,0x0ca91842,0x8e33c650,0xfa6af3e6,0xc2c027c1,0x14373c00,
  115294. 0x972840a5,0x99f3cda1,0xd0e84240,0x98c62b79,0x000000e7 } },
  115295. /* 10 */
  115296. { { 0xae4d0f28,0xe8c7c4a8,0x566d006e,0x3a8a55ef,0x066e4023,0x37985f65,
  115297. 0x5d321b76,0x8deccab5,0xb8351b07,0x38b966d6,0x57d548ab,0x2e889e53,
  115298. 0xe631ab0b,0x7a9e8e2f,0xe75c537b,0x45c60f95,0x00000059 },
  115299. { 0x7867d79c,0xbca27d34,0x81c81980,0x7f460b15,0x976b8c51,0x7ec2d9ab,
  115300. 0x61b91ed9,0xfcd04486,0xd9c1d15f,0x730a7a25,0xf94c9db9,0x8a2cf259,
  115301. 0x5dec5a3b,0x8e784b87,0x3e5131ee,0x06252607,0x00000004 } },
  115302. /* 11 */
  115303. { { 0xf1631bba,0xdee04e5c,0x156f4524,0x40e6c1df,0xe4c30990,0x06603f30,
  115304. 0x6b6abec7,0xdb649a43,0xf6b94f6e,0x354f509c,0x36b7e0b5,0x7fecf469,
  115305. 0xba1e6dd2,0xa7a7107e,0x689450ca,0x889edac5,0x00000022 },
  115306. { 0xd05596f2,0x9012916e,0xb023cb8b,0xe3901dac,0xe7d4abe1,0x2501d3ec,
  115307. 0xa9c90313,0xb2815040,0xc6d146d0,0x9dbcd3f1,0x74ee1896,0x6fa1d5b1,
  115308. 0xa91226fb,0x49aea161,0xb8a80984,0x754ceedf,0x00000154 } },
  115309. /* 12 */
  115310. { { 0x4270b2f0,0xb64e27b0,0xbf4d74d7,0x84b34e48,0x0c2722ba,0xb186be8b,
  115311. 0x9ff9b71c,0xf54a589d,0x34fd6bc4,0x9887e4df,0x7412f49d,0xb7c669fd,
  115312. 0x77f89d16,0x4008d9bb,0xc902e074,0xafb9426b,0x000001cf },
  115313. { 0x662935ca,0xcca4f2d1,0x997dcc46,0x2847c703,0x353c79f8,0xc089e9e5,
  115314. 0x5215f0f4,0x9ed8d989,0x80911b9d,0x59cf08bc,0x6de27aa3,0x4b03540e,
  115315. 0xf69e320d,0x52f4d63e,0x94ef193b,0xa0217fd6,0x000000e6 } },
  115316. /* 13 */
  115317. { { 0x74214780,0xb77de627,0x207459ea,0xca066817,0xe9c7fb01,0xf78579b7,
  115318. 0xd6d4b7c7,0xe55548c1,0xa66caa39,0x45756190,0x98505a4f,0xf8141b03,
  115319. 0x4c8864eb,0xa5ca0d7c,0x9e129d3f,0xbf8af950,0x00000053 },
  115320. { 0x85285092,0xbc9b29d8,0x8eed5e5f,0x82f31daa,0xf618aab9,0x9c33690e,
  115321. 0xd2626ed1,0x0eee14f4,0x07ed8e09,0x4229570b,0x8736d040,0x1977920e,
  115322. 0xede7d01d,0x47ee25ff,0xbc7ab73b,0x3c921c3a,0x000001b9 } },
  115323. /* 14 */
  115324. { { 0xa08b2b14,0x0b6a07cc,0xbf174c7f,0xaa978deb,0xc40cb2a4,0x291cb828,
  115325. 0x90adc838,0x95c78272,0x8c1edde6,0x08da8b2a,0x90fbd220,0x741ceb2f,
  115326. 0x322db94e,0x5f89c9e5,0xb73c548e,0x18266085,0x0000007d },
  115327. { 0x2defd012,0x69ebf82a,0x5a1537ef,0x01ecb094,0x3ef0811d,0x3c557535,
  115328. 0xb2bd4dea,0x59c882a7,0x7bf969c8,0x00a1f972,0x0b25ad1b,0x063adf5e,
  115329. 0xf2536005,0x4c1ff306,0x4112fe18,0x8e515bec,0x00000117 } },
  115330. /* 15 */
  115331. { { 0xefe3d3d5,0x9314787f,0x9d897227,0x29e76f65,0xe0b6acf5,0x15c77ed1,
  115332. 0x1c5e8dd9,0x9c2b7b20,0x5f5667af,0x788038f1,0xf3576ef4,0xf38c766f,
  115333. 0x0040154a,0x9f0623c8,0xde883b53,0x47d3c44b,0x00000096 },
  115334. { 0xde1b21a4,0x32075638,0x571081c1,0xbb6399c1,0x75c03599,0x322e6067,
  115335. 0xade60cf5,0x5c7fde7f,0xefc19059,0x1b195440,0xdd7b3960,0x7e70ac8c,
  115336. 0x6a6fa73e,0x4aa5a83d,0x63080764,0x34f8cfac,0x00000042 } },
  115337. /* 16 */
  115338. { { 0x286492ad,0xee31e71a,0x65f86ac4,0x08f3de44,0xda713cb4,0xe89700d4,
  115339. 0xa86b7104,0x7ad0f5e9,0x2572c161,0xd9a62e4f,0x25cc1c99,0x77d223ef,
  115340. 0x3b962e0c,0xedff6961,0x81d8b205,0x818d28f3,0x0000008e },
  115341. { 0x8cdf1f60,0x721231cf,0x6717760f,0x8b640f2b,0xe045a403,0xbe726f8c,
  115342. 0x0370689f,0x422285dc,0x72ea0dcb,0x7196bf8f,0xc8086623,0xa16f7855,
  115343. 0xc326fe48,0xd4e19fc7,0x8f68bf44,0xfdbc856e,0x0000013e } },
  115344. /* 17 */
  115345. { { 0xe6a3ace5,0xde34d04f,0x896191c1,0x0dbb603e,0xf75ed0f4,0xb4dc0007,
  115346. 0x95b259b5,0x15e0e6bc,0x2615f020,0xdfbcba66,0xd31ea3f8,0xb2ec5433,
  115347. 0x103ff824,0x42b0b0e4,0xc480332e,0x19315060,0x00000111 },
  115348. { 0x045452f1,0x9997ea28,0x71f3f73b,0x80b678cf,0x41e9328e,0x4a52bddc,
  115349. 0xe6af1c23,0xb7f2656e,0xb44215e7,0xc43805b9,0xf0a4028b,0x3aa734f2,
  115350. 0x422476e2,0xe3c72479,0x68c60cf7,0x6dc2e8b0,0x000001f1 } },
  115351. /* 18 */
  115352. { { 0xfffc0de5,0xbcdfae6f,0xab4a5f24,0xa801814f,0xea2aa8dd,0x19013658,
  115353. 0xda4f0441,0xf3b1caf5,0x34100611,0xf24b9cdb,0x96e0cf88,0x48c324ed,
  115354. 0x23055c82,0x4b7ea334,0x89092e29,0x6e835b64,0x000001d3 },
  115355. { 0x07372f27,0x7eb77ae7,0x83bae19a,0x4779b4fa,0x65429ebb,0xa175dae1,
  115356. 0xfc03ef3f,0x942ec266,0x6991c7c4,0x0e5fc6a9,0x56253d3c,0xa0f61e4f,
  115357. 0xde74e738,0x7a11ff58,0x624de919,0x60524cd4,0x00000002 } },
  115358. /* 19 */
  115359. { { 0x01342e08,0x45b5d0ca,0xb749f0af,0x509ed4f0,0x6529d804,0xeb5502d9,
  115360. 0x6d80359c,0x5eb087db,0x4c384800,0xeaa66a87,0xc75a8784,0xe972c7a0,
  115361. 0x6874317e,0x8c169e21,0xe5c9fbf4,0x81c556e0,0x0000014f },
  115362. { 0xe120674d,0x26b0b12b,0x219f00ac,0xc6bf09b9,0xd658caa6,0x1e1e732d,
  115363. 0x8292d99e,0xc771c5af,0x25fdbf80,0x5d813529,0x3666c37d,0xe61bd798,
  115364. 0x1d0df680,0x8dac946a,0xc39f0983,0x58dcf684,0x0000009f } },
  115365. /* 20 */
  115366. { { 0x7b7dc837,0x14169102,0xb50eb1c4,0x2d719754,0xd7e6741b,0x04f4092a,
  115367. 0xbc824a38,0x1d0a7f1d,0xc8e20bcf,0x570b2056,0xda181db0,0x6732e3b9,
  115368. 0x0a7b508a,0x7880636e,0xc9f70492,0x11af502c,0x00000045 },
  115369. { 0xc56f4ffa,0x0b820d94,0xc4f0c0fa,0x1c6205a2,0xa1a0606a,0x99f33d4e,
  115370. 0x79b316fb,0x1bab6466,0xe4f240fc,0x05aa0852,0x92d7dc43,0x22539b78,
  115371. 0x06e3c073,0x03657f12,0xcedb6633,0x28405280,0x00000059 } },
  115372. /* 21 */
  115373. { { 0x4397760c,0x90d08711,0x1c9fcd06,0xb9020b76,0x987e24f7,0xc7fec7fa,
  115374. 0x522335a0,0x0e33b8a0,0xae21ca10,0x73dbeafd,0x3b032220,0x458c060a,
  115375. 0xee145da6,0x9b9c73b8,0x27ff62ef,0x31c661e5,0x000000aa },
  115376. { 0x81430b5e,0xaf518eb0,0x50ee0d69,0xb32f9cea,0xaa6ebe8b,0x0ecdb0b5,
  115377. 0x9fe1d689,0x1f15f7f2,0x1a59cc9a,0xce5d68f3,0x08ab2a63,0xf4d67994,
  115378. 0x4347ce54,0xe85b1cef,0x286d0776,0x8ff423c0,0x00000176 } },
  115379. /* 22 */
  115380. { { 0x33dcec23,0x8564104c,0xcdd07519,0xbaf0d61b,0x4c4f309a,0x486daf51,
  115381. 0xde488715,0xf01bc8f5,0xd3539ba3,0xddd6baf1,0x3a3be8ec,0xbb7e665d,
  115382. 0xcb5d865f,0xf919dac3,0xf12149a0,0xfe203da3,0x00000173 },
  115383. { 0x78d4a3d1,0x043ae9a1,0x865316d8,0xa4d5cf58,0x41176463,0xeaf026c0,
  115384. 0xf84afa44,0x316c638f,0xffea422d,0x512f2397,0x6622b613,0x691eaa04,
  115385. 0x97e7068d,0x48856ea3,0xf4a1b33c,0x42d1b2e3,0x000001b5 } },
  115386. /* 23 */
  115387. { { 0x1f487402,0xf51b2d5e,0x7aaf1dd5,0xe36016e6,0x6da9c20a,0x1eb3f1f5,
  115388. 0xece45bfd,0x25b7d361,0x027a9e18,0x42db0633,0xe8411649,0xbf228777,
  115389. 0x458773d0,0xf5fce0c4,0x2dd7a5f0,0xb2b3151d,0x0000001f },
  115390. { 0xfbaa096a,0x102773e8,0xe093a878,0x152726eb,0x2c7f1781,0x5c53cd07,
  115391. 0xab5dca76,0x38d3dfd0,0x87ef2d4a,0xbb4a7d85,0xb7eb11c2,0x5c9c2013,
  115392. 0x0b6da22f,0x5e353c34,0xa325ecad,0x846d50a5,0x00000039 } },
  115393. /* 24 */
  115394. { { 0x1677df58,0x76da7736,0x1cb50d6c,0x364bd567,0x0a080ff2,0x0443c7d7,
  115395. 0x86532430,0xa0a85429,0xc35101e7,0x82002dd2,0x48c5cd76,0xbebc6143,
  115396. 0xca6cf13f,0xff1591ae,0x98bf8dc0,0x91c7c2e6,0x000000fb },
  115397. { 0x12de14d5,0x6a7c5cad,0x6561c822,0xbc448c5f,0x7cdbb3da,0x9f8de430,
  115398. 0xc76811d7,0x9c58f011,0x75462049,0x1e89806e,0xc9a74e49,0xe52ad0a2,
  115399. 0xb2be37c3,0x2034685c,0x0a0bc72d,0x7a863245,0x000000ec } },
  115400. /* 25 */
  115401. { { 0x8a86786e,0x33818c21,0x2137e2c8,0xed537f74,0xa7e6eb20,0x5d9690d1,
  115402. 0x5cdc4803,0x9790ec70,0x24f7bd75,0x469162c8,0x4e1f0f14,0x09e7ef9d,
  115403. 0xce9915ca,0xd30c128b,0x6c71226f,0x810145f6,0x0000002d },
  115404. { 0xb71d87e5,0x312749f5,0x7b02ceda,0x25f3b141,0xe0baff16,0x02456d2e,
  115405. 0xfcae6627,0x97f7b3a9,0x37bd985f,0x0d6ebf8f,0x7fa6d0c1,0x20aa81b9,
  115406. 0x21f2f137,0xb29f1a01,0x5cc0ddb1,0xe326a2f8,0x0000003d } },
  115407. /* 26 */
  115408. { { 0x38c2ee78,0x26f3398b,0xa75a0bee,0x40c3d101,0x565a7f8e,0x35a31706,
  115409. 0x04019e5d,0xd12985e3,0xb8174b6e,0x21e2a642,0xaf80a52a,0x25a15ee8,
  115410. 0x8518d80e,0x5d1e0fe6,0x04f6ea9a,0x8cbbc138,0x00000084 },
  115411. { 0xdfd45169,0x76828690,0x59d3e8d0,0x38d7e098,0xcdb8bfc2,0x23758811,
  115412. 0x162cf648,0x8499547a,0xb4d15b8c,0x494bab3b,0xc60499a6,0x822cbc57,
  115413. 0xa8a1cfed,0xac43224e,0x57c6598b,0x43563469,0x000000d9 } },
  115414. /* 27 */
  115415. { { 0x68271323,0x2b069253,0x49cd04d7,0x24d9e0a8,0x2b31cc7d,0xaae35fbf,
  115416. 0x57a3e361,0x44f64b4f,0x0294e856,0x14904686,0x43ced4ae,0xddc82ee7,
  115417. 0x7e2cda47,0xcb92a6a5,0xbfc1f968,0x989c42ef,0x0000013f },
  115418. { 0xb8651600,0xbed98bdf,0x7a3cfaee,0x8c363434,0x35b1a226,0x93a12543,
  115419. 0xd5825507,0x558da7dd,0x852eb1e9,0xa5173b23,0x2295f545,0xdf5ae585,
  115420. 0x6646d101,0xe546e2ef,0x5d89f862,0xf7e16a2c,0x000001fa } },
  115421. /* 28 */
  115422. { { 0xc7ec136d,0x0d746c8e,0xcd11351b,0xf8e1d827,0xf187a116,0x764a3ad3,
  115423. 0x136e8465,0x2f1b968f,0x850983c2,0xd41aa294,0xbe717259,0x2123ecc4,
  115424. 0x763c149c,0xdcdcab52,0x1022b82d,0xa7f50b18,0x0000016d },
  115425. { 0x0ca5e258,0xf99e532d,0x97b62a7b,0xa148ad17,0xc77fddef,0x8d0a242e,
  115426. 0x74f9b6c4,0x58518bcd,0x7fd122d4,0xc53b30b8,0xfb50b2d7,0xbb8cd193,
  115427. 0xbc01aae9,0x1a169aee,0x1de26e09,0x7e49b10a,0x000001c5 } },
  115428. /* 29 */
  115429. { { 0x21210716,0x2cabe675,0x07e02400,0x81a296a3,0x8c83795b,0x94afc11d,
  115430. 0xdd9efa6a,0x68f20334,0x677d686f,0x5be2f9eb,0xbf5ce275,0x6a13f277,
  115431. 0xb9757c5c,0xf7d92241,0xc74f4b8c,0x70c3d2f4,0x00000132 },
  115432. { 0x8d209aa4,0xf9c8609c,0xdb2b5436,0x46f413a2,0x2992345d,0x96b72d1a,
  115433. 0x9487c34f,0x186f2aeb,0xb440a375,0x4fa72176,0x7da5358e,0x3a420936,
  115434. 0xff25b310,0xf11eade3,0x505d60b8,0x9a570153,0x000001a9 } },
  115435. /* 30 */
  115436. { { 0x6e7495bb,0xae151393,0x490879d1,0xebd2fd28,0x29fd76fc,0x9c232b0b,
  115437. 0xc60e721c,0xa1a0d49b,0x517a09e2,0x9f582b83,0x9d8badf8,0xac37809e,
  115438. 0x0ad48bb4,0x4aa4de9e,0xcb6cc487,0xfd041312,0x00000027 },
  115439. { 0xead4fb6d,0xc05502ee,0x0a602cbe,0x760c25ed,0xbd7f4a07,0x58ba6841,
  115440. 0x54edce14,0xc28b6032,0x0397614c,0xb9d41e39,0x181eed93,0x4221b71d,
  115441. 0x332d4b0b,0xd010e3c2,0xdab0e419,0xdfe58a27,0x00000096 } },
  115442. /* 31 */
  115443. { { 0x7debd24e,0x4cd6fcd6,0x9ae2b075,0xbe3fca60,0xf217c26c,0xa7d8c22e,
  115444. 0xb9620e3f,0xd42d03e0,0xc7f9f87d,0x634bf216,0x8972ffee,0x22b1ec53,
  115445. 0xd60d3e77,0x83a957c1,0x0f6a537e,0xedfe5f86,0x00000162 },
  115446. { 0xf0ea20b8,0x40a05400,0x1d796900,0x2872ac7e,0x0edb0cac,0x7765a5c9,
  115447. 0xb62939a7,0x9df5b930,0xaf2cb708,0xf78a676e,0x52febc12,0x030732bf,
  115448. 0xba190ad3,0x3a6640de,0x93e7e341,0x36eae15f,0x000000d5 } },
  115449. /* 32 */
  115450. { { 0xa1c88f3c,0x6c6119f6,0x2ec6944a,0x924e5fec,0x5742ff2a,0x4c8aac60,
  115451. 0xddb22c7c,0x60adde1e,0xfa5d25bb,0x9728938c,0xec117de0,0xfa5ac4f7,
  115452. 0x482929c1,0x41f35ab7,0x0afd95f5,0xd1c4e8f9,0x00000180 },
  115453. { 0xa7cd8358,0x2fc4e73d,0xf2a1c920,0x39361a57,0xad94d288,0xf6f2f130,
  115454. 0x2b6a78e2,0xe37e2466,0x79c262cd,0x0babff8b,0x61b597b9,0x6cae01ef,
  115455. 0xa60d4e64,0x9c1e33f0,0xdd01f845,0x52a42280,0x0000000e } },
  115456. /* 33 */
  115457. { { 0x0f013755,0x72d640a4,0xfb8380e9,0x0b6dce77,0x7eb64b31,0x2789ce79,
  115458. 0x93ca5a36,0x8e704b0b,0x58bdffc9,0x18c360ff,0xb230c372,0x53b1f323,
  115459. 0x5a7385d1,0xd6b39088,0x56b93bf7,0x071130f5,0x0000004a },
  115460. { 0xfeef3f88,0x29a2096b,0xb82b3945,0x22eba869,0x872664a7,0x7fe2184a,
  115461. 0x858ff942,0xa0dc0ba1,0x7490c9da,0x33799eb5,0x81588ce8,0x1d356f62,
  115462. 0xa7b2cee2,0x7dd9bc7f,0xa3cfaee9,0x1e61a4e8,0x000000d2 } },
  115463. /* 34 */
  115464. { { 0xe9068656,0xec5db629,0x9fede4df,0x623bd70c,0xfcd45546,0xc78ad5bd,
  115465. 0x6291a741,0xf7981dd2,0x761e688e,0x3ac53d92,0x55b9272f,0x6a96892a,
  115466. 0x06546fec,0x4217e7b8,0xab9e2f56,0x793c03cb,0x0000015e },
  115467. { 0x6eff39be,0x08fd9543,0xdbff4f68,0x5a1af07e,0xb0241616,0x83d47abd,
  115468. 0xd4798029,0x37c5d2fd,0x60b2e6fb,0x9d86d978,0xce8db998,0xe3e3284e,
  115469. 0xd868b9bb,0x9f049eb5,0x9dad18b3,0x3b3e8a78,0x0000018e } },
  115470. /* 35 */
  115471. { { 0xe51e61f0,0x57026c56,0x307f2757,0xdddbcaa3,0xb1aeaf41,0x92a026eb,
  115472. 0xe2d7f5ba,0xa33e937c,0xbc5ead91,0x1f7cc01e,0x2e46807d,0x90ab665d,
  115473. 0x53419519,0xc2a44f55,0x79664049,0x099c1ca6,0x000000aa },
  115474. { 0x8f97e387,0xb561a909,0x45e1dd69,0xf6051778,0x7ff1d6ab,0x1ffa512b,
  115475. 0xd09a9c89,0x42da55a4,0xd2282e2b,0x5e5a7c71,0xe74185ad,0xdfa5a203,
  115476. 0xea0baeff,0x19b1369d,0x1ecc0a16,0xa5eef914,0x000001a3 } },
  115477. /* 36 */
  115478. { { 0x7a573b81,0x2af20d0a,0x66194cef,0x7eac1ca8,0x0b711c34,0xef0d2d8d,
  115479. 0xba099d42,0x6aea016c,0x5067a8ca,0xa6609d28,0x7a1351ef,0x6a52c600,
  115480. 0xb11c2634,0xdab85818,0xbb1c033c,0xf17fa45d,0x00000121 },
  115481. { 0xfc3279d6,0x9fb8b87a,0xc201f1e1,0xe30e76ab,0x806c21dd,0x02af6a83,
  115482. 0xc63f824f,0xeafd7e2b,0x46bd1a53,0x7b074e26,0xa2139164,0xcd6f4931,
  115483. 0xc172d9bf,0xab2cfd39,0x4db59cf1,0x62f3eb4b,0x0000010a } },
  115484. /* 37 */
  115485. { { 0xe0689a1b,0xe402de36,0x7dcafe72,0x9dccc9fd,0x255d0bfb,0xe4dead7e,
  115486. 0x4ada04d9,0xd7ee87ee,0xbfd2e774,0x5a85039e,0x770b2b9b,0x282c6657,
  115487. 0xba103bba,0xa7aca826,0xc7cd5071,0xac7028ba,0x0000011a },
  115488. { 0x680c8f04,0x2e61d39c,0xb48b3b5e,0x2f09c4cc,0x95744f3c,0x131609bd,
  115489. 0xaaccb593,0x6d72e4b4,0x5adfb209,0xdb7060ca,0x1fd3eccf,0xc67d9e43,
  115490. 0xe1752a73,0x1487a26f,0x64d0857c,0x3d953663,0x000001e3 } },
  115491. /* 38 */
  115492. { { 0x4cec9e7f,0xe664506b,0x30aab98f,0xa44564b4,0x173fa284,0x5e1b501f,
  115493. 0x15c97472,0xe7b7bd7e,0x82dec033,0xd6cc67a8,0x0a63b762,0x1fe2e934,
  115494. 0x3f8e2fcd,0x3a084e1b,0x9ae6e752,0xccce4da8,0x000000fd },
  115495. { 0xc12fd820,0x0797f8ee,0x96da4733,0x325f892a,0x55997bf4,0x597d241d,
  115496. 0x02b753cf,0x3aef35ac,0xf677ceba,0x8a73f95d,0xd1bbac6c,0x5b2892b7,
  115497. 0xcc5278b0,0x90751583,0xa47f45f6,0x2f5ed53f,0x0000001c } },
  115498. /* 39 */
  115499. { { 0xab40b79c,0x3914165e,0x25b489a8,0xbfb6eed8,0x8a6c107f,0xda136b7d,
  115500. 0x8e01f28b,0xd431db8b,0xa4d79907,0x84e5d0dd,0xa471e685,0x69a91472,
  115501. 0x98376ff8,0x58d06969,0xc46311fd,0xce369b74,0x00000006 },
  115502. { 0x1add1452,0x6c0773d1,0xed8e9a2a,0x2e4e9c95,0xca15a40c,0xe8ff8e32,
  115503. 0xaf62f18f,0x3fcb7d36,0xeec9484b,0x2ca336ee,0x3b20405b,0xa4d6e7a9,
  115504. 0x956d8352,0x6d90d031,0xd9ca03e7,0xdd375603,0x000000e5 } },
  115505. /* 40 */
  115506. { { 0x8b481bf7,0xcc5f297d,0x2a13383c,0x06a2a3e4,0xdc40b96c,0x9e14528c,
  115507. 0x1189da3c,0x9a2bf35f,0x6cd57fa7,0xb8adb989,0x9357d32b,0xc1a4935c,
  115508. 0xc2d76fad,0x51fb2580,0x24f23de1,0x98721eb4,0x000001ba },
  115509. { 0x52a4b397,0x8c02daaf,0x0d0b4e54,0xc3c5f4cc,0x7b7e79cd,0x29be4db3,
  115510. 0xb33970b6,0xf34336ec,0x92808c7f,0xed3dcb7c,0x02288db1,0xec290eff,
  115511. 0xe96ed59a,0x2a479d51,0x76d8fa5f,0x9d7ed870,0x00000092 } },
  115512. /* 41 */
  115513. { { 0xe660043c,0xd8edaf0b,0x016e074d,0x84aa2ccb,0xe2cc3b3d,0x9d2368e7,
  115514. 0x5c269fc4,0x47b50130,0x3de33e36,0xd0194ee1,0x789ca504,0xdb3361b9,
  115515. 0x984db11d,0x8cd51833,0xc8ec92f0,0xd5b801ec,0x000000c6 },
  115516. { 0x47ab9887,0x33f91c15,0x6b5ab011,0x2f285e2a,0x133fc818,0x9b734e5a,
  115517. 0x38d8692c,0x5c435a74,0x43282e81,0x3c92b47c,0x9c7bcdaa,0x191231f5,
  115518. 0x4d158c86,0x3ae425c3,0xc5a23cca,0x7f568feb,0x00000011 } },
  115519. /* 42 */
  115520. { { 0xbf5caa87,0x8ccbd9d5,0x68dd8c9d,0x17bfc60f,0xc7d4dede,0x63eb4dbb,
  115521. 0x8270b5bf,0xbf6e5945,0xcc098fe7,0x887137a5,0x05d7b8f5,0xca5eb687,
  115522. 0x4b25a533,0x4b7deeee,0x4a700a6c,0x8e045c32,0x000000ef },
  115523. { 0x70cf52bc,0x160c1c92,0x90cc6298,0x4bf3f63a,0xbf3028fb,0x5fff421c,
  115524. 0x523beff1,0x0a8102d7,0x8b9ce105,0xff3309a3,0x06621b1e,0x8e9da4d0,
  115525. 0xcc0a7807,0x9775f89f,0x00178612,0x59044865,0x000000eb } },
  115526. /* 43 */
  115527. { { 0xebbd33ec,0x8a6664fd,0xce5ad579,0x0cf9a660,0x50fb56ed,0xecd06c05,
  115528. 0x1d5aaa6e,0xb4ca5fad,0x948a7f07,0x36daee5b,0xefe1c11a,0xd2e37887,
  115529. 0x91d2544b,0x41f61ac4,0x2bffd8ea,0x49df7071,0x000000be },
  115530. { 0x65acdb56,0x60e2f1f5,0x5e5e5bde,0xf2f13c84,0xe17a0412,0xb97fd354,
  115531. 0xd9c93bef,0x8a2867cf,0x25a957e4,0x9ca9d16b,0x4a18635f,0x1f55c19b,
  115532. 0x8d26ae71,0x9b3868f5,0x4c94541d,0xac448041,0x00000000 } },
  115533. /* 44 */
  115534. { { 0xd4ad38db,0x6c1bcf89,0x3d714511,0x1180f381,0xcb70243a,0x5b4c2759,
  115535. 0x163a716c,0x5dd64d63,0x13648bdb,0xbbd2efea,0xe4de9969,0xa47187f9,
  115536. 0xe2de8c45,0x65de6912,0x4bdad0a7,0xe075f29c,0x00000048 },
  115537. { 0x5e4dd88d,0x00335474,0x80577afc,0x18283638,0x227288f7,0xe4b35c01,
  115538. 0xe68989de,0xd008fd91,0xcd3f71ba,0x42142315,0x3e4da1e2,0x5cb023ff,
  115539. 0xb5662bb1,0x7e6b9c35,0x7fb04fe5,0x143f4165,0x00000072 } },
  115540. /* 45 */
  115541. { { 0x26f40f2c,0xb06b046c,0x6cd7c31d,0xbd5d246c,0x1953a9b7,0xaaa56270,
  115542. 0x8f00436f,0x5ac929b8,0x21d0660d,0x1937392c,0x9bd6dbe6,0xd279ed15,
  115543. 0xd17c43f9,0x377c4d5a,0xb8fcd025,0x800eda50,0x00000179 },
  115544. { 0x36132f31,0xb88ddc0b,0x2ade73a3,0x6f8f4f01,0x203de2b9,0x38859ec3,
  115545. 0x231b6533,0xedb03814,0xa14093ca,0xad08cd20,0x5c2be2f9,0xb9f86d44,
  115546. 0xf6ebc09f,0xfd3d9532,0x1aef478d,0x757b5899,0x0000013d } },
  115547. /* 46 */
  115548. { { 0x580f894b,0x7d9ad100,0xd925e46f,0xb612488a,0x2e5a6865,0x45497e14,
  115549. 0x17f9a813,0xc86e1053,0xf8a33541,0xd8aa820a,0x7a66d578,0xa6790660,
  115550. 0x5f758e23,0x47df60ae,0xa7f8ab5c,0xcadd4c90,0x00000107 },
  115551. { 0x6764ad0e,0x356b044f,0x250189b3,0xf69fe0e1,0x5f14db6a,0x2deaca62,
  115552. 0x1bd77d54,0xe9f2779f,0x5cfa895c,0x979911f2,0xb6f19ac3,0xd4e94ced,
  115553. 0x01af44b1,0xc3533417,0x50c727f5,0xcac43fff,0x0000003b } },
  115554. /* 47 */
  115555. { { 0x83c1d4cf,0x1742951c,0xb245c34f,0xe03791d0,0x9c2dcc71,0xea8f8ef6,
  115556. 0x2a310767,0x2ea57a29,0xb12948bd,0x255b46bb,0x0feaeb83,0x2adc1e09,
  115557. 0x449abf59,0xa0d2d18c,0xc4a8a689,0x9e8c9ff5,0x00000019 },
  115558. { 0xeb28171a,0xc9f7b9cd,0xd576987b,0xefd78403,0x22ff824c,0x58b4f3bf,
  115559. 0xbf333cc5,0xee09b393,0xb01ceb72,0xebff83a2,0x220299cd,0x5bb34c45,
  115560. 0x66ebf751,0xa3c3e8a0,0x49d05cf3,0x5dee07bb,0x000001a6 } },
  115561. /* 48 */
  115562. { { 0xb114257b,0x09a958d6,0xd4975e30,0x729afd41,0x3aae7b11,0x072879b5,
  115563. 0xedd1ac83,0x0791b093,0x1eb67975,0xcfefc7d1,0xe2675b4a,0x0e54bd37,
  115564. 0x8d69517f,0x89a62d7e,0x202109a3,0x96f805d8,0x0000006b },
  115565. { 0x57b5f9f4,0x4815d517,0x405b44d1,0xe5c9e436,0xe4870160,0x3442dde0,
  115566. 0x1ef6b3f8,0x953fef95,0xf7497faf,0x919e4cf5,0x016ef0b7,0x24e3cc4d,
  115567. 0x2512eeed,0xfc5caa87,0xa3bd1703,0xf1ba4029,0x000001b6 } },
  115568. /* 49 */
  115569. { { 0x529252ac,0x2a668435,0x74e7b0d8,0x3da626c0,0xe0be86ab,0x55080cc1,
  115570. 0x4ed5dc53,0x534a53f7,0x0cd41fd0,0xa9eff140,0x5674891c,0x0e7c945c,
  115571. 0xec53b5ad,0xdea4b895,0x15150988,0xefc67bef,0x000001ff },
  115572. { 0x306033fd,0x988dc109,0xf36875d9,0x1b287979,0xe3c335c5,0x4d39af26,
  115573. 0x124e29d6,0xa47259fd,0xc41dbdfc,0x5d60c570,0x0cc0d895,0x06224b61,
  115574. 0xeea8ff86,0xa041d4e5,0xae4d8707,0x2920e15c,0x000001fd } },
  115575. /* 50 */
  115576. { { 0xcd67da85,0x66d15f0c,0x5ac54a15,0xae98b6f4,0xf1ac71c3,0x2f05e021,
  115577. 0x47559224,0x1feb2226,0x66e856dc,0x2a2f1561,0x6fb4ba47,0x65eb1456,
  115578. 0xa29d920b,0x34688bd2,0xf9d4cb9b,0x943ce86e,0x00000061 },
  115579. { 0xaac91174,0xb4696218,0x41dd9234,0x85b519ec,0x9f0763a4,0xb7efadf2,
  115580. 0x712c8b33,0x98517f27,0xb0538630,0xa02e7ec3,0x1ff3e3e4,0x46bc45bb,
  115581. 0x29496486,0x46ae896f,0xebd2b93f,0x2aeb1649,0x00000146 } },
  115582. /* 51 */
  115583. { { 0xe8e4d3c3,0x1f34f41f,0x5bb7e9db,0xc80d87ff,0xd910b579,0xf0216c0a,
  115584. 0xb87349ae,0x2a24b761,0x2b0a6cc0,0x054bc528,0xaf2d1957,0x3b4c7029,
  115585. 0xadbe6cdd,0x0e4b90e2,0x26060a34,0x8e774f81,0x000000cf },
  115586. { 0x2e229950,0x3c7f9dbc,0xd9f82b70,0xab11f846,0xf10c05f3,0x2b7ad9a3,
  115587. 0x0f1820ca,0x203ead4f,0xccbfb332,0x51dbcbc8,0x066706f1,0x3bd9caf0,
  115588. 0x06059d5e,0x5a39be25,0xdcafe64e,0x984387c8,0x0000014c } },
  115589. /* 52 */
  115590. { { 0x8e011531,0x708a757f,0xc3dcd57c,0x7f45b172,0xc2d99e29,0xa8eac9fd,
  115591. 0xb93b6415,0x9d4ee81f,0xa5488e86,0xa5833b54,0x0bb7ab70,0xddd561c3,
  115592. 0xb3bdf3a9,0xb5bda384,0x1ddf332b,0xf909f8e0,0x00000124 },
  115593. { 0xab41e782,0xc5b8aa84,0x851ddb87,0x1de20126,0x99482bd2,0xf49baa7d,
  115594. 0xf4b6413b,0x05963deb,0x7cd1e224,0xed369fbb,0x1bad60ee,0xdcf495dd,
  115595. 0x892e30ed,0xeb475693,0xaf0a212d,0xaaf11bd8,0x0000010b } },
  115596. /* 53 */
  115597. { { 0x16ec64e2,0x71460174,0x7d7c6ebe,0xbfd14acf,0x668b7176,0x1e3504a3,
  115598. 0x741b041c,0x72e3f3f3,0x2d3b67b0,0x651fa54a,0xe57d928d,0x623edca3,
  115599. 0x72c8f419,0x29b74e8b,0x327abaef,0x3d99cb47,0x00000038 },
  115600. { 0xda342a3f,0x808dd0b3,0xdef4a954,0x12002462,0xeab5a860,0x1b1c642e,
  115601. 0x06e54b6d,0x5e1e2a05,0x10c6cf1a,0x9ba1710f,0x0f903cd0,0x334fc366,
  115602. 0x134166f5,0x969e0001,0x155c4353,0xfaa26074,0x000000fa } },
  115603. /* 54 */
  115604. { { 0x712de285,0xc85cd0e6,0x869f5dc5,0xcd2ff8b0,0xdf4ed389,0x372a2b92,
  115605. 0x55b99c84,0x63524d30,0xe07a0033,0x46fef5a2,0xd6e09493,0x0a2c82da,
  115606. 0x72a8952b,0xb3626621,0xaf217eb6,0x9afcb188,0x0000002c },
  115607. { 0x9a64c5b5,0xd3b9d476,0x44c4cfe1,0xa0d8d5de,0x11c6dbff,0x560858ef,
  115608. 0x41c14aed,0xce1d978f,0x35efe854,0x251f9e72,0x0474575d,0xf9d0c14c,
  115609. 0xbda89c03,0x0d2c838e,0x36cc9dc0,0xa25f040b,0x0000016f } },
  115610. /* 55 */
  115611. { { 0x9cad682d,0xb23d9dea,0x46369391,0x87acb1b3,0x5c0f24d7,0x9f5c1988,
  115612. 0xd41883ce,0xdff62fc7,0x53555e46,0xd1ab29df,0x891cda05,0x569b1cb2,
  115613. 0x52c633ed,0xdb14dbc4,0x2a345428,0x1acbb86c,0x00000194 },
  115614. { 0x24db8127,0xd86a70c8,0x41b7cf5b,0x84a6563f,0xb908d9b4,0x8d84dabe,
  115615. 0x899c260a,0xaaeaae63,0x44436957,0x13ed6b2b,0xd0a92c8d,0x3bc94f99,
  115616. 0xd04bcb97,0x978f2e2b,0x716a565f,0x56a388ef,0x00000074 } },
  115617. /* 56 */
  115618. { { 0x96fc1f77,0x6082dfe4,0x1347ad6a,0xb04c435f,0x25ebe457,0xf42694dc,
  115619. 0xb6f764aa,0x64a17069,0x04d83da1,0xe03873d5,0xe0c82330,0xb0b9db52,
  115620. 0xd4239b3e,0x9886b34e,0x598814da,0x76587f2a,0x0000016a },
  115621. { 0xebc71a5d,0x6918f8e8,0x85405233,0x49141a42,0xc182cbcc,0xd63f09cc,
  115622. 0xe09057a7,0x4afe59d3,0xe239d8eb,0xe633db0d,0xfd9494b2,0xbac8582d,
  115623. 0x4704fd61,0x8b915a41,0xfceaefd9,0xe0866a9d,0x0000010e } },
  115624. /* 57 */
  115625. { { 0x52e07a4d,0x2b50c470,0xe5d745d0,0x7f6d38b8,0xe1af1226,0xb414c47c,
  115626. 0x39c505f7,0x03e4b44b,0x86f739be,0x59f3d795,0xe7c2f1bc,0xca19bca7,
  115627. 0xc063fad4,0x1c51c01e,0x7f428afb,0xda3937a5,0x00000080 },
  115628. { 0x102369fa,0xe9d8ca9d,0x706c0e35,0xe009bffb,0x96b55d80,0x2e0a19a7,
  115629. 0xac0d094c,0xda0e42de,0x787c187a,0x6c1be2c5,0x9cfa04b6,0x6d4ae2cc,
  115630. 0x76577340,0x5b0cea60,0xc7c96285,0x2d525245,0x000000d8 } },
  115631. /* 58 */
  115632. { { 0xae93de69,0x6dcb238c,0x3bfdae9b,0x4963c833,0xe8b79836,0x33c81f4d,
  115633. 0xae8bf8ae,0xe13a2244,0x4c3ebacc,0x0bc6e786,0x555a5ad6,0xa837a53c,
  115634. 0xbc7e9459,0x875d8d35,0xf9f46fcd,0xb3705534,0x0000001f },
  115635. { 0x7fb974a1,0x78e9270c,0xe9ed2481,0x23448fa0,0x64bffbd4,0x14166c3d,
  115636. 0xd79f4b3c,0xa05aa443,0x3b9f32a0,0xd855a4f1,0xac90235e,0x4bebcf8d,
  115637. 0x8db52b48,0x65849987,0xe48d09d1,0xaa4d59f1,0x00000183 } },
  115638. /* 59 */
  115639. { { 0xdbffad9f,0xee585d75,0xf419d8fc,0x64df6174,0xe6c69345,0x6f73bf59,
  115640. 0x83d59b0c,0xb80793d1,0x929c8950,0x6baf4fc3,0x29962bab,0xbd445a95,
  115641. 0xeaa91273,0x52b61945,0x3d1c785b,0x4fccdfff,0x000001be },
  115642. { 0x7cb2857f,0x05c384d9,0x06b7abf4,0x4cf83058,0x43ace6b2,0xf528dd17,
  115643. 0xbc43d6b6,0x2c7b8fa2,0x14e564b9,0x8f0e28bf,0xd2b9f01a,0x1b69bc73,
  115644. 0x3dd383e6,0xab8beb40,0x9791946b,0xaccea0c5,0x000000ae } },
  115645. /* 60 */
  115646. { { 0x0163c2de,0x9a68baee,0xeb2768a4,0xc42d0b2b,0xffdae767,0x5686f124,
  115647. 0x0aaca943,0x926da5d5,0xe01091cf,0x699c34ce,0x5324becd,0x3d254540,
  115648. 0x4193a0a9,0x1b6b58f1,0xd611cc9d,0xf144925e,0x0000014f },
  115649. { 0xc1ed9259,0x7f61a60c,0x2f1d5a7f,0x1be37aa3,0x07aef431,0x0384713d,
  115650. 0x4e6fa7ba,0x99f33d49,0x8bd3730c,0x43928c16,0x5b9557dc,0x73cf8ccf,
  115651. 0xd1a2bee5,0x0bc6d460,0x83b15610,0x27cd1943,0x00000145 } },
  115652. /* 61 */
  115653. { { 0x3427af4e,0x4be65135,0x310d937d,0x2e6c0bb1,0xcaa671c3,0xbd8ea76a,
  115654. 0xd3a9c376,0x9d7b3fd4,0x471709aa,0x124ce863,0x018051c0,0x225ce41d,
  115655. 0xf9e8ee1c,0x5489284f,0x535c4ec8,0x22d829c9,0x0000013d },
  115656. { 0xa1b15e02,0x6b01ed9d,0x301e5868,0x1d092bac,0x5764135b,0xbfa7a183,
  115657. 0x6f7159a4,0xc0ee59b7,0x18090d0d,0x9171a051,0xb8052196,0x5c1531bb,
  115658. 0x20927904,0x740930fc,0x76337685,0x963b48cc,0x00000008 } },
  115659. /* 62 */
  115660. { { 0xf4aaaed5,0x0fe8b620,0xfe871ee8,0x1068de7d,0xfebfcb4b,0x2b22030f,
  115661. 0xc3a2155b,0xd4dfbee7,0x2769b805,0xa7a26a8c,0x6d39eaf0,0x377de770,
  115662. 0xf615f032,0xf1a92447,0x42d9b731,0xa1b81a84,0x0000012a },
  115663. { 0xb1152e8f,0x299e67d0,0x92b5e14c,0x2e773d97,0xf1cb57a2,0xe0d81073,
  115664. 0xbf1da4a2,0x03af0a9c,0xc22b449a,0x169b160e,0xdd2d7d1d,0xb82c1ac8,
  115665. 0xbfc98ee4,0x7508aca6,0xe3cbea15,0x54992440,0x00000150 } },
  115666. /* 63 */
  115667. { { 0xa13a4602,0x70004a0a,0xd0d2c60e,0x505c71a3,0xa6d79bc5,0xa4fe2463,
  115668. 0xd54d9df4,0xe878eb3a,0x73d3c7b8,0x7ecca907,0x244ecfa5,0x5b3bb278,
  115669. 0xb124d179,0x8a30f61f,0x4f632af0,0x5b7e5001,0x00000115 },
  115670. { 0x9ef0021a,0x62c42ecc,0xf856c9d4,0x58017fd7,0x2e6478bc,0x10e243b8,
  115671. 0x1505a4db,0xaf074669,0x4cd7eea5,0xd9bb0a1c,0xd52aed0a,0xe8ba39a2,
  115672. 0xb549f09d,0x0747449a,0x9e57fa64,0xd5c8f7bd,0x0000013f } },
  115673. /* 64 */
  115674. { { 0x5a53c22b,0x1bd8ce7b,0x7cab446a,0x78733fcd,0x48acb394,0xc44ca4e2,
  115675. 0xa38c790f,0xa9888b1e,0x15c34237,0x36afb6eb,0xfb702063,0xb913b8a8,
  115676. 0x917508fa,0x34b77cc5,0xf9e4732b,0xa931d7a7,0x00000050 },
  115677. { 0x56d21d18,0xa90a4290,0x55b410a1,0x82666307,0x894a6b05,0xb4684a8b,
  115678. 0x828cf75c,0x8a1ade63,0x127702a3,0x4fb2f85a,0xadf7b709,0x83ff7d05,
  115679. 0xa68d1db6,0x1d3f5a92,0xc093cd5c,0x243ce1db,0x000000f5 } },
  115680. /* 65 */
  115681. { { 0xd37d7891,0x8fc183c3,0xfd865eca,0x17b50149,0x8f218441,0x0f6e43d6,
  115682. 0x5a07f658,0xaf51ec25,0xad303202,0x8fe5a6cb,0x10676ef5,0x95de68f3,
  115683. 0xca4e000c,0x7508e31f,0x77735254,0x783e5a95,0x00000159 },
  115684. { 0x2e537ad9,0xbc1db571,0x35be9cf7,0x5e87112d,0xd57f9bcb,0xbb522b48,
  115685. 0xa8b3cbc7,0x1eff7890,0xe5ecdb5c,0x4f306e11,0x3387e7ed,0x30da8392,
  115686. 0x72321e3d,0x4d91fcf4,0xe412a67c,0x8487bb62,0x0000009f } },
  115687. /* 66 */
  115688. { { 0x8cb8e08e,0x86f5f80f,0x2496fed6,0x7cfd2c41,0x60b7dcdf,0x0061b743,
  115689. 0x57f4d05f,0x4dbaffdf,0x458061f2,0xb1993c2a,0x9de994c4,0x6c6ca8d0,
  115690. 0x2747e062,0xef70d24d,0xb9995cbc,0xd4e5d4e3,0x000000ff },
  115691. { 0xc6f40077,0x3171e245,0x0723e506,0x1592e045,0x6a6bfd88,0x35c86f7e,
  115692. 0x6d9d9ce0,0xba0959d1,0x3eb5770c,0x2e7f8fe8,0xc40d63dd,0x58eb0881,
  115693. 0xeb9e4419,0x56333bda,0x3afd1f4d,0xfb0397df,0x00000034 } },
  115694. /* 67 */
  115695. { { 0xb358815c,0x7b84e05e,0xe41087d9,0x3abcb2d4,0x07f05d7a,0x87a75889,
  115696. 0x7a9d481c,0x350778d5,0x42d64cbd,0x9d34cff8,0xccf289fe,0x0859cd5a,
  115697. 0xdd2b2c6e,0x8372d591,0x18b40b62,0xc06d482e,0x0000006b },
  115698. { 0xda4ed375,0xd10695a0,0x298daaea,0x51baf588,0xf4b7092c,0xb028a1b4,
  115699. 0x7a335b35,0x8ab87dae,0x0567efd8,0xa7359362,0x3320c374,0x7a49fc10,
  115700. 0xa3558b30,0x737acac4,0x4c0fce9b,0xd30696a3,0x0000001e } },
  115701. /* 68 */
  115702. { { 0xbd3902fe,0xd9550ab0,0x86a9d3b3,0x9bba4b4b,0x975cac37,0x3a59e0a9,
  115703. 0x333605dc,0x045e8731,0x1afc2c58,0xf2c598c2,0xeef9cbf1,0x81ff8d6f,
  115704. 0x9bf83c42,0x82bed5d0,0x528131d5,0x9d1d9d5b,0x00000157 },
  115705. { 0x5519258e,0x687da305,0x027de2a8,0x73f539f9,0xd6a230d6,0x69fa9747,
  115706. 0x5f5d1684,0xab1aeb23,0x5f7e41f5,0x5bbfe947,0x16a7feb3,0xbd546abb,
  115707. 0xe16d5187,0x2afbd4e8,0xbcc953dd,0x7437be13,0x00000160 } },
  115708. /* 69 */
  115709. { { 0xee9755a3,0x55f165a9,0xb82c9ab1,0x0c8d5a1a,0xab6b97e6,0x65a1e45a,
  115710. 0xab05e271,0x3004cdb0,0x6db0830f,0x9e0c3b52,0x75acbdeb,0xaae1ec1a,
  115711. 0x761e8498,0x413d4484,0xb1b9c62e,0x589e09bb,0x000001e9 },
  115712. { 0x9c72258d,0x67512081,0x5c1593d4,0x61dcd734,0x91c11fdb,0x6c627a7b,
  115713. 0x8857908e,0xd1d3e9bf,0x530bc68e,0x9aac06fe,0x6b5b44ff,0x125c16bb,
  115714. 0xdb90edd5,0x38860bb6,0xfbbedb5c,0x96fe8b08,0x000001aa } },
  115715. /* 70 */
  115716. { { 0xf257c0f8,0x323a5dd8,0xdd3a10d9,0x4884dc92,0xbbb8ce03,0x03f379ce,
  115717. 0xa47262a9,0x6217ad53,0x52e06c6d,0xa1df2017,0xc32428cd,0xf5b723e0,
  115718. 0x2c30c62c,0x1e5d3889,0x477f82cc,0xd9a90f1f,0x000001fd },
  115719. { 0x1763ab59,0x830d27ba,0x723783e9,0xcf27d93e,0x945968aa,0x81558264,
  115720. 0x1700d5d5,0x63251a32,0x03146d9f,0xcf6bbe73,0xe65bf0f2,0x6cdcf455,
  115721. 0x632323fb,0x80aa00ce,0xd96a4744,0x6e49e62c,0x00000149 } },
  115722. /* 71 */
  115723. { { 0x40574c09,0xbeff0b7e,0x3fe80e96,0xb76f2643,0xeb237d91,0x0b3bd352,
  115724. 0x7edc3102,0x3c0c62b7,0x424a36dc,0xf989394b,0x7c6c435e,0xe9ea64c2,
  115725. 0xe388d076,0x2dfc21c4,0xa4e69e4b,0xcc3852f6,0x00000139 },
  115726. { 0xbb096b91,0x5238a3ff,0x73d8d43e,0xee72c9e5,0x8c577558,0xc116db11,
  115727. 0xdc47d4b4,0x54ec89d2,0x42e1955f,0x2006dd35,0x7437475c,0x004aed6a,
  115728. 0x2bee9041,0xc1ddc32a,0xed9332c9,0x597417a2,0x000001fb } },
  115729. /* 72 */
  115730. { { 0x859bae66,0x3c0f1981,0x845d7c1b,0xab48e9b1,0x452a3c1e,0xc6ce9c03,
  115731. 0xff810339,0x2384a00c,0x5f98d6fe,0xcd7ede11,0x38a0dd5b,0xf7a00e3d,
  115732. 0x3c7e1c06,0x56dd948a,0x8e53a61f,0x9d21a7d1,0x000000d0 },
  115733. { 0x880eb3fb,0xf9cfdbaf,0x5e83f7c9,0x64cfd297,0xa28a74b4,0x61ba7d6f,
  115734. 0xdfb13e03,0xb8200d5f,0x232a6128,0x03bc8f4b,0x81a8d86e,0xd1fb92c2,
  115735. 0x706d6ea7,0x68675fae,0xefab18c2,0x9b08608a,0x0000011d } },
  115736. /* 73 */
  115737. { { 0xbbd2f539,0x17cf6146,0x76e26ba2,0x96052fc0,0xd4be4a67,0x36821d18,
  115738. 0x9f3f39a8,0x8f823422,0x433f873a,0x68b846b9,0x716f4568,0x7a1d3f36,
  115739. 0x2fd47750,0xdf603e28,0x6975e226,0x77cb02c5,0x00000003 },
  115740. { 0x8c01dd59,0xf275add3,0xb9c1a37a,0x9c213a9e,0x4dfc5403,0x690ad104,
  115741. 0x07ee0d86,0x202ee206,0x661fc40e,0x896ede95,0xd0b02f56,0x6b4d7398,
  115742. 0xe5af1a24,0xccb96991,0xc13f7125,0xd5c281af,0x0000009f } },
  115743. /* 74 */
  115744. { { 0xd7073a5a,0xc858c54b,0x861eac7d,0x87c81a5c,0xe720201a,0x51f84a39,
  115745. 0x40e003ce,0x952a9f8e,0x58f199de,0x76bdc4ab,0xd56cc02b,0x1cf12322,
  115746. 0x83f162f3,0xb6634e63,0x8f969e11,0x84c017ee,0x00000169 },
  115747. { 0x5c89f1fa,0xf1f43362,0xb697b078,0x4a02a630,0x4b05b7f4,0x33311e5c,
  115748. 0x4fede4cc,0xa7ccae51,0x4b025aa4,0x0d26e874,0xf84db7ad,0x7d5b77bb,
  115749. 0xf571c1fe,0x39ef1aa8,0x418ccd20,0x65eba928,0x0000018d } },
  115750. /* 75 */
  115751. { { 0x8abb2537,0xa37866ab,0x65b3096f,0x14ac4cbb,0x2a428ad3,0x827fa7ed,
  115752. 0x10e9e196,0x95d19f62,0x89801b4e,0x31eb97a0,0xaae8b823,0xaae77a62,
  115753. 0x5f5c9642,0x9693d62a,0x3e368b84,0xff5bfe97,0x000000ad },
  115754. { 0x492b0dee,0xa3efae21,0x9602c2ce,0x2143e9ee,0x6f3b99e5,0x21367c99,
  115755. 0xe93b8f59,0xdd78b2b0,0x1064c13e,0x8d541c38,0xf5738e7a,0xe6b970da,
  115756. 0x8373b1a4,0xaf6ecc16,0x74ae208f,0xdbfa3f4f,0x00000180 } },
  115757. /* 76 */
  115758. { { 0x907a6aa0,0xb024621a,0x407879f6,0xef56cb68,0x8168a934,0x44c38b68,
  115759. 0x9b9a9048,0x70d638d3,0x82541f20,0x6968caa0,0x1fc88b50,0x0c597053,
  115760. 0xaf635784,0x5564ded5,0xc4d494cf,0xe7e898c7,0x00000097 },
  115761. { 0x6b6ebb2f,0xe1dc98d9,0x7aa9e126,0x292a17fc,0xfa2a2c68,0xb60f0fdb,
  115762. 0xb2e1851b,0x9c63270c,0x81ca4cfe,0x898db265,0xb11959d5,0x94082638,
  115763. 0xa54b8d19,0xe44f308e,0x44e63094,0x96399eb8,0x000000d6 } },
  115764. /* 77 */
  115765. { { 0xb83769ee,0xfa00f362,0x3efc4cb3,0x72d040ac,0x57abd687,0xc3933889,
  115766. 0x940a7128,0x62264425,0xec242a31,0x909c4c8f,0x65a1a551,0xd1e48f1e,
  115767. 0x049c2172,0x68bd70f1,0x709b7fd4,0xc8692d2b,0x00000041 },
  115768. { 0xdf816784,0x4e388aa1,0x01be75ce,0x4a58c8a5,0x02a67812,0x9b49dffb,
  115769. 0xeda721e0,0xa73299e0,0xe67a65ec,0x8a0bd1f5,0x856c71b6,0xd81e91e8,
  115770. 0xc005aa30,0x37aee2f4,0x0595bbf2,0xd9400750,0x00000073 } },
  115771. /* 78 */
  115772. { { 0x010c0ef3,0xa912ac4a,0x4e81b1a0,0x0e654bd8,0x4f353509,0x8f0563dc,
  115773. 0xb47d189a,0x10dc41f3,0xf238c09c,0x122edd06,0xc41acf67,0x224c16af,
  115774. 0x83758520,0x1ccb9334,0x2275ae6f,0x1a4b5f29,0x00000127 },
  115775. { 0x3ce688b5,0x792fd473,0xdca9c68b,0x14566d37,0x541711d0,0xfce9326e,
  115776. 0x3cc341a8,0xe3ba14ee,0x2122c11f,0x6b8ab4cc,0xf5d379b5,0xc0fa763b,
  115777. 0xf1522f91,0x95e2d2ae,0x31cf95a5,0xd4e21b3d,0x000000ac } },
  115778. /* 79 */
  115779. { { 0x1d8e061a,0x4013a779,0xacc84a30,0x62707e70,0xeb2f636a,0x6ac08266,
  115780. 0x77b25c9d,0xe917ea21,0x70ff35cf,0xddb78bbd,0x041898be,0x5008db2b,
  115781. 0xce0ae445,0x0f58a4fc,0x2257d0e7,0xed092397,0x00000043 },
  115782. { 0xe2e129e6,0x2cad77b3,0x0f1be4d7,0xfb8c4a87,0x20056333,0xaee50dff,
  115783. 0x2a691543,0xbc2658c1,0xb8fe2640,0x95dc0cca,0x1965a0af,0x694eb584,
  115784. 0xedd1d99e,0x7d3baa53,0x8a1edc87,0x2df13b20,0x00000083 } },
  115785. /* 80 */
  115786. { { 0xd181c3f2,0xfead2247,0xf337b23f,0x915d35be,0x74890672,0xdb4cfcba,
  115787. 0xfda7a3a1,0xe4f70d8f,0x79275686,0x226b6419,0x6ff1f79e,0xe8040863,
  115788. 0xcf5fa4e8,0x98e84b39,0xd8a09f60,0x57aa0be9,0x000000da },
  115789. { 0x4efcea66,0xd40cecf5,0xafc76fae,0x98df2aec,0xc91585a8,0x63f19a48,
  115790. 0x13f00aa5,0xb111bda7,0x44b5cb9f,0x6687afab,0x652620d1,0xc6d5fb12,
  115791. 0xbacb35ab,0xaf953f1b,0xff94c4d2,0x99709370,0x000000ed } },
  115792. /* 81 */
  115793. { { 0x68b54c89,0xac9f56e0,0xce737c22,0x08ecc17d,0xab089b53,0x208ee83f,
  115794. 0x543fbd1b,0xb0f3a129,0x844dd706,0x1b204cf8,0xdec2e40d,0x80975c89,
  115795. 0x9399914a,0x08b011ae,0x74674df7,0x6b4ba170,0x00000017 },
  115796. { 0x8fdfc175,0x71216ea9,0x7e0f5b0c,0x77b7fc63,0xceb33a34,0x88d0285f,
  115797. 0x0223eab7,0xb679814f,0x51c6d922,0x9078720b,0x9c13f51d,0x5859d5a4,
  115798. 0xfaed60b5,0xe69f850b,0x6d0ccab2,0x2499a844,0x0000005c } },
  115799. /* 82 */
  115800. { { 0x73e7bcf1,0x41d581fb,0xdd3c17be,0x16dde61c,0xfa199fd9,0xc62997ec,
  115801. 0xc159db97,0x1a758873,0x64132830,0x4ed77896,0x2942a918,0x9672ce89,
  115802. 0x816ba4bb,0xf3ee4587,0xce54dd7f,0x4fb7a148,0x00000123 },
  115803. { 0xf009be8c,0xf05d80af,0x78df1ba1,0x62e938d7,0x312de620,0xa7e22e84,
  115804. 0x6070c4b9,0x48d29e7f,0xa1b5da37,0x5cd9c3eb,0xa4717453,0x1e51bd2f,
  115805. 0x56ab9e67,0x94098ab0,0x49f7c6a1,0xbb584abc,0x00000049 } },
  115806. /* 83 */
  115807. { { 0x1ea470f7,0xa9f25530,0xe9254e30,0xa01bf808,0x71a0038d,0x098569ea,
  115808. 0x5913ca87,0x0d2b2ee1,0xb8281fdb,0xae17004b,0x118e5c2a,0xdb5c6eb0,
  115809. 0x1fa943ab,0xa56ac64c,0x1a92d501,0x1aaf6477,0x00000053 },
  115810. { 0x06345730,0x9679ef49,0x846f37c2,0x946aaa4e,0x1a7c3aab,0xf81726b0,
  115811. 0x8166df4e,0xcb808da2,0x4e04dc3e,0xe9fb3fc2,0x76ec19b4,0x9e0b61db,
  115812. 0xeed6d13e,0x6e7f665e,0x86a75384,0x70ed8c07,0x000000e5 } },
  115813. /* 84 */
  115814. { { 0x108ce13f,0x66456e58,0x0e397813,0xb5bfc58d,0xea3949e9,0x04b6a84b,
  115815. 0x75af667d,0xea9b66bc,0xa891566b,0x7cb4d6dc,0xbf61595a,0x1b3cecf0,
  115816. 0x002e2520,0x4312c73d,0x6135a5fa,0x81d76898,0x0000014b },
  115817. { 0x841078ec,0x4047bc25,0x179c454d,0x75aa9c96,0x4851f8fc,0x6a160609,
  115818. 0xce34091f,0x998d4e3e,0x88e54102,0x9a9f6704,0x5da8ac5e,0xbf280f88,
  115819. 0x8fec230c,0xc64caca0,0x5094b775,0x0ac864b0,0x0000002b } },
  115820. /* 85 */
  115821. { { 0x8f5daf7f,0x6b606e39,0x10927506,0x48385489,0x08c58a72,0xa2255c5c,
  115822. 0xc90f3ee3,0x2f362fd0,0x08795f02,0xc9633af4,0x0425f5aa,0x71710bd1,
  115823. 0xec06dbfb,0xc2017e05,0xc1b8bbcd,0xd9c7dc82,0x000001c8 },
  115824. { 0x18b8bed9,0x7db41fdf,0xe3a23125,0xe9483308,0x7291c4bb,0xbcf91de7,
  115825. 0x41448aaf,0x9b0b972b,0xc44da462,0x95dfc633,0x01bf50a2,0x90b9c463,
  115826. 0x869e3131,0x18b66f77,0x121baad9,0xa8a4e2fa,0x000000f5 } },
  115827. /* 86 */
  115828. { { 0xca0251ea,0x8ca55109,0x27a6c9b0,0xf2aeed8b,0x5620f528,0x901a8beb,
  115829. 0xae13fc56,0x9a8421e8,0x85993c07,0x1349f1c4,0x0d1ab0d7,0x29e08359,
  115830. 0xaeb5d909,0x96e2929b,0xf599a66f,0x96c2f1f8,0x000000ce },
  115831. { 0x12be8bd7,0xe4bc4b51,0x3c67e99b,0xf4846a0f,0x4d3a3864,0xd89cc7d3,
  115832. 0x73f43981,0x1f647112,0x26dce567,0xc32bc324,0xf02b096b,0xf7134ebf,
  115833. 0x0d0682b7,0x5604f00b,0xe3ce8b59,0xfd23d7ea,0x0000011c } },
  115834. /* 87 */
  115835. { { 0xa27689a6,0xf89646cc,0x5564172b,0xd6a7dc43,0xb57cbfcc,0x30bda48e,
  115836. 0x5b1adfe5,0x9b11fffb,0x711d8bf4,0x9f2d80db,0xb70e5a5b,0xe879fdf0,
  115837. 0x6bd18a1d,0x97534183,0x8cbfd504,0xc8c526bd,0x00000114 },
  115838. { 0xef7388bd,0xd5fe725b,0xe7ffaea7,0xf1c3dbdf,0x7e6de2ac,0x78395b89,
  115839. 0x9ebf1bfb,0x81a72c9a,0x69785146,0x65265707,0xf52670af,0x3925ecd9,
  115840. 0x83d57d48,0x437bcdd2,0xc80ecb02,0xb5d732a7,0x000001ce } },
  115841. /* 88 */
  115842. { { 0xcfd376d7,0xa7f9fcce,0xa66b084d,0x6b4eab3e,0xd5b91bd8,0x6ac90d08,
  115843. 0x8aa304d8,0xaa3d5b7e,0x7f866a4f,0x27f3d42b,0xbb813ae1,0x95d19fa8,
  115844. 0xe34a9206,0xd38798d7,0xa32c1cdd,0xdf7c0a69,0x00000073 },
  115845. { 0x38315b16,0xbe2c01bb,0x9e18c8f9,0x1daa7c89,0x08b6b853,0xa3d43fb4,
  115846. 0x68092a81,0xb159e48c,0x836faad4,0x77e93d9e,0xa4699730,0xd4ed6361,
  115847. 0x6297e476,0x569cb3f6,0xe7811fa6,0xb69d8183,0x00000185 } },
  115848. /* 89 */
  115849. { { 0xab9cb764,0x18f27eb3,0x8ebc1d6d,0xbbbefc21,0x0479aa79,0x47760ddb,
  115850. 0x09e542f5,0xb4d16d24,0xbc699b96,0xe35c38d1,0x8c8d8c8a,0x13b2ae25,
  115851. 0x67a3a45d,0x8579c152,0x6c554c04,0x773b7357,0x000000d9 },
  115852. { 0x0218c299,0x9620a473,0x99f78a33,0x69be29b3,0x484f414f,0x4684a009,
  115853. 0x9a2ca4d4,0xb2c74937,0x68db7ab3,0x09c0773e,0x935c357f,0x6181f059,
  115854. 0x8b7de3f2,0x0931303d,0xe0fb6e08,0xf3effcd0,0x00000060 } },
  115855. /* 90 */
  115856. { { 0xb25d6530,0x723c14be,0x9a97d40f,0x5e015b39,0xfbf7f622,0x209c3c4b,
  115857. 0x14b4f0f1,0x83d8c59c,0x3f7e8ecf,0xcf002fde,0x1eb1ef0f,0x35d353c9,
  115858. 0x201f0c60,0x394c42a5,0x7be8ee34,0x787128ab,0x000001b5 },
  115859. { 0xb70110cd,0xa0937d3a,0x477911b5,0xe0fa4efc,0xc53a4c19,0xc6acaf5b,
  115860. 0x38d509f2,0xbd3010f3,0xe54ac1c6,0x3ee2a82b,0xe4f2a3bf,0x31ea67c3,
  115861. 0xf089c7b9,0x7a4ca66e,0x34a2362f,0x5bda2c4f,0x000000b0 } },
  115862. /* 91 */
  115863. { { 0xd1f575cd,0xb424a071,0xa5237182,0x15693b01,0x9a2c9d40,0x14133602,
  115864. 0x9c914a60,0x50c4348b,0x095b31c1,0x9024573d,0x22fd4962,0x6f975fd2,
  115865. 0xe210b277,0xa1704886,0x6dba937b,0xac29b813,0x000001f6 },
  115866. { 0x775da491,0x09edef55,0x2b6aad82,0x25953f9e,0x1bb40d5b,0x6696a106,
  115867. 0x4d5127d8,0xcfc45311,0x81ead062,0x2f21dca9,0xaf3b7123,0x3f3e4f07,
  115868. 0x9646f20d,0x12cd06b8,0x6910f5bb,0x24136369,0x0000015e } },
  115869. /* 92 */
  115870. { { 0x3ecfc44e,0x0c844fd0,0x5043b3d5,0x4095f2c8,0xc9bd059a,0x9a5fe7db,
  115871. 0xf65becdf,0x239328fa,0xa67961cd,0xe3102471,0xbbb5dfdd,0xea9e39bf,
  115872. 0x133dc5ba,0x8022b6d0,0x5f12c379,0xbed7aa9b,0x00000141 },
  115873. { 0xfd94d941,0x096f0059,0x7d4ff018,0xfc6e9f00,0x779f05e3,0xe63af598,
  115874. 0x00483c99,0x4c40f0b3,0x72a19870,0x04d2feef,0x464a4a71,0xdb773b5b,
  115875. 0x49367f1e,0x00b6770f,0x2a9fbd2a,0x4f7e0301,0x00000169 } },
  115876. /* 93 */
  115877. { { 0x8a9095fd,0x0df5dd73,0xd3ce857a,0xc4b7a021,0xe5edc767,0x90aa796b,
  115878. 0x180a0808,0x56497eff,0x66f10aab,0xb9856e1f,0x39879766,0x31298824,
  115879. 0x3ba80601,0x61748cf7,0x555da929,0x07d9076c,0x00000012 },
  115880. { 0x1c44394d,0x0b049a01,0x0ce49e45,0xf5f25ef7,0xb1694265,0x1e3a09f0,
  115881. 0x109b33f8,0x2c5bd9fe,0xa30932e4,0x07f2a43f,0xc6cf8af2,0x736abfca,
  115882. 0xf3366722,0xadf7fa04,0xfa9d26b0,0x2f1e92fb,0x000000e0 } },
  115883. /* 94 */
  115884. { { 0x63be4d4a,0x9524e4a6,0x66f3cc91,0x1fa57bed,0x7e7a7ccd,0xdd7c93fa,
  115885. 0x88c5d1d3,0x70e8cf6a,0x3f251f1e,0xb257997a,0xe3554cf5,0x0a5ec58e,
  115886. 0x065a7109,0x68d268d7,0x085089ea,0x7c23d4d2,0x0000004c },
  115887. { 0xbd52d132,0x63ae575b,0x38c81cc5,0x0fb8daa7,0xe4e63b99,0x096a6e51,
  115888. 0xb239d387,0x51d6b366,0xa5d49fed,0xed5f8874,0x43a8c07a,0x025091d9,
  115889. 0xe4686ae2,0x100f845a,0x7eb4ef5a,0x1af59d74,0x000001c2 } },
  115890. /* 95 */
  115891. { { 0xdd441308,0x5f7bc01e,0x86308890,0x0dc34944,0x759611cd,0x2af38a74,
  115892. 0x4c23ce66,0x11a71261,0xf8bafed2,0x37f317b5,0x4c93e079,0x4efbb9ff,
  115893. 0x8ecc52cf,0x880f0edd,0xddc9d82a,0x480cdd2c,0x00000028 },
  115894. { 0xc3f807ac,0xe8f1ca0d,0xbd070549,0x6a3e4fc2,0x91f8bb6c,0xad3d0a14,
  115895. 0x3d6dfacd,0xe3ee1cfd,0x5fb46ffb,0xee46b1b9,0x7dd5cfbc,0x5207b3ac,
  115896. 0xb1b8e8b7,0xd580c0d9,0xc7bdd11a,0x52c669f4,0x00000084 } },
  115897. /* 96 */
  115898. { { 0xc0ace6d5,0xa42b4747,0xbe7287ad,0xd5acb64b,0x89bc2614,0xf3304899,
  115899. 0xff05c71e,0x817fe836,0xd35ac450,0x772eb246,0x375a9c3c,0x7f5fc216,
  115900. 0xcbc0d6fd,0xfb6f9e1a,0x720e9733,0x7643c315,0x0000009a },
  115901. { 0xf3845ccf,0x4b2216b4,0x90bc05bd,0x9c174e80,0xd6049037,0x7a550c74,
  115902. 0x6358c806,0xbd7220a1,0xaa677b6d,0x838f9c41,0x66e2e08e,0x37332c19,
  115903. 0x496f6da5,0xb032875e,0x9c30630d,0x52b274cf,0x0000000c } },
  115904. /* 97 */
  115905. { { 0x8ea58beb,0x6ec2e782,0x3665fa48,0x2b404c1d,0x20b40ff0,0x546d5fad,
  115906. 0x29d3e6a5,0xfb5df7b6,0x66c81991,0xf186846d,0x6e2cfe3e,0xbe690bde,
  115907. 0x1410d16b,0x97aeb9a0,0xbacc8e92,0x59d81548,0x000000cb },
  115908. { 0xbaf66a23,0xd905d3ad,0x40dfb081,0xc3337387,0x4b00f432,0x6d5535de,
  115909. 0x07d3a03e,0xe17fe8e8,0x066bca80,0x29544ff7,0xbadffa55,0x60c2b96c,
  115910. 0x45a26ea4,0x9f018d94,0x24a34ffc,0xd5438167,0x0000011e } },
  115911. /* 98 */
  115912. { { 0xbd7f8a61,0x62a873fb,0xbbe580bb,0x5e18cd71,0x667f6980,0xfd5c9eb3,
  115913. 0x571d3dc0,0xab8d4f61,0x783f9bc8,0xe2e45215,0x24398b14,0x36c3774b,
  115914. 0x74d811b5,0x2db4a363,0x2debe3c3,0x9f7f1297,0x00000138 },
  115915. { 0x798fefb2,0xbb97f21c,0x107baa72,0x9c76fcb5,0xfadbb568,0x12fbf760,
  115916. 0xd33ea6c5,0x1a648be7,0x236134a5,0x412a2993,0x8985893b,0x4a3d8169,
  115917. 0x3e66ada4,0x6144958f,0x7687b457,0xb4dfc79b,0x00000140 } },
  115918. /* 99 */
  115919. { { 0x7abe5bb9,0x83b14570,0xe51d81be,0xae0cbfd8,0xc9827aff,0x20dadf49,
  115920. 0xa687b554,0xc3a72548,0xeeb41733,0x080263fb,0xd3827c63,0x7014fdc3,
  115921. 0xb5e3b70e,0x7d018f84,0xfbcf7168,0x1d483e00,0x00000015 },
  115922. { 0x6b578aa3,0x154e3c7c,0xd3043dae,0x511ce9b5,0xb6008101,0x55f89e9b,
  115923. 0xf405ac6f,0x4ec31112,0x2008ac7b,0x7e66a4d8,0x25c52fa6,0x73c00d39,
  115924. 0x8acac2eb,0xee1b9998,0x60b57453,0xdfa31d95,0x0000008f } },
  115925. /* 100 */
  115926. { { 0x251cf8d8,0xcc74a0e0,0x041f2bd2,0xd4d8949d,0x33ebce52,0x0b734a49,
  115927. 0x5c5bcdae,0xe1ac5f51,0x16200b93,0xd3ecdfcc,0xa793736e,0x2506a266,
  115928. 0xea6e6940,0x585a1c8b,0x9190f935,0x081cdd53,0x0000000e },
  115929. { 0x53e28412,0x055f9956,0xdb27164b,0x0d1526f2,0x1df3adc7,0xcd5625eb,
  115930. 0xdd35dedd,0xd2c453ca,0xa838ffe2,0xed442849,0x5c0ce589,0xad20c137,
  115931. 0xbd99b609,0x2d5fba81,0x622efb07,0x5be41dcc,0x000001ad } },
  115932. /* 101 */
  115933. { { 0x8f850756,0x563af667,0x52f3b597,0x86d37aae,0x796842f5,0x10d38a53,
  115934. 0xf743f997,0xcdaaf99f,0x93f1a8ba,0x2fa755e5,0x409f7cd9,0x1af04e15,
  115935. 0xd6d0650b,0x63bf9a0a,0x55abfd9a,0x67b1cead,0x0000000e },
  115936. { 0xb5f43178,0x3660a8e0,0x9cc35b33,0x56bd412d,0x880f6808,0x3d7bfa63,
  115937. 0x2e622c71,0x7f372d66,0x6ff82445,0xad7b7be7,0x8db04e51,0x0f2bde80,
  115938. 0x4bd15c8d,0xe1e781fe,0xb8e502f2,0x1f475bfb,0x00000194 } },
  115939. /* 102 */
  115940. { { 0xd63543ec,0x79482bf9,0xa117ef3e,0x985cb67c,0x160ccc63,0x8ac50638,
  115941. 0x729bdc1e,0x556cbed5,0xa22686df,0xd62ed97d,0xc81eb77c,0xb124cb5f,
  115942. 0x72fa2ed9,0x4d7b4f66,0x78335b96,0x60b29aa7,0x00000172 },
  115943. { 0xa43df7c6,0x21bfc7b6,0xbc20706c,0x85acac23,0x345d9580,0xeb6f37bc,
  115944. 0xa32a08bc,0x9d8f20d2,0xd1953c5e,0xf08924f6,0xc4f680d0,0x7d25d7c6,
  115945. 0x2de9912c,0x64e6a237,0x52ce644c,0xda1c06c4,0x000000eb } },
  115946. /* 103 */
  115947. { { 0x411dd110,0x26677c5c,0x2c991c4a,0x0d6787aa,0xa45666d6,0x53be6a41,
  115948. 0xc15f9f15,0x73e716aa,0x0e0cc7b2,0xa93b863f,0x2a624ab0,0xa4057117,
  115949. 0x1a39c260,0xe5e7656e,0x2ef6f130,0xaf8d78b5,0x00000046 },
  115950. { 0x70f38dff,0x796214b1,0x123a1105,0x3e35d828,0x957ed812,0x046a44d4,
  115951. 0x0da60161,0x618fa9ba,0x54f84413,0xe7cdd2a5,0x19ea95ab,0xf1c2563e,
  115952. 0xcb2a30b4,0xc4459e14,0x61ff9aa9,0xc748add6,0x00000183 } },
  115953. /* 104 */
  115954. { { 0x9de58caf,0x32981f39,0x8753ea64,0x05bb80fd,0x2d119486,0xc83f9f24,
  115955. 0x03eeb00a,0xf490cf06,0x7c73d79c,0x4037f251,0x724d461b,0x844209fd,
  115956. 0x272420cf,0x6b03f6d2,0xb3438fa2,0x6f4bd29e,0x00000152 },
  115957. { 0xc389e51c,0x964d034a,0x6db7d98e,0xacda55e9,0xe913c583,0xb2ae97de,
  115958. 0xfeb03440,0x0793077b,0x9d461e29,0xaa16e378,0x043bf8be,0xb0a67533,
  115959. 0xba7d8c3f,0x9d749a42,0x6bb925dc,0x7c41e6d6,0x000000ec } },
  115960. /* 105 */
  115961. { { 0xc5da8398,0x2e9b345d,0xbb38c430,0xbc66841f,0x7c3bb47a,0xce3ac562,
  115962. 0x738d2cdd,0x8fbeb12b,0x68731185,0xd4bc2ad7,0xbbd4f4f4,0x9521db1c,
  115963. 0xfe4e1b0e,0x2a690cae,0x7bfebe3e,0x375215eb,0x00000194 },
  115964. { 0x2edfd661,0x4cb234f1,0xed52c1f4,0x0149984e,0xd8f8f98c,0x32d27260,
  115965. 0x7be38590,0xfe76e4e4,0x95e8b672,0x5435873d,0xf2b00e82,0x916c397f,
  115966. 0xbad61eb8,0x3b9bf705,0xae131bbe,0x7ee90182,0x00000000 } },
  115967. /* 106 */
  115968. { { 0x93fbcb5c,0xd36fea9e,0x9fa8529b,0x382be583,0xfd611ba0,0x0b243125,
  115969. 0xcd8a2637,0xa59ae37f,0x3d8d4704,0xab78c60e,0x44c41b79,0x1bac243d,
  115970. 0xeda49cc5,0xc4001fea,0x83dc7e9f,0x988ea44a,0x000000f6 },
  115971. { 0xf077f79e,0x4d90caa4,0xd9e2590d,0xf4d17601,0xd21b4b77,0x11debbb3,
  115972. 0x9037e1b6,0x031b3f60,0x135becf0,0xf113ed82,0xf2903dda,0xf6c01379,
  115973. 0xa6f19296,0x36bde7ca,0x9dbbad85,0x57d3b684,0x0000006c } },
  115974. /* 107 */
  115975. { { 0x9abfccb0,0x963fee38,0xb9676e63,0x6c6e2a24,0x84ba6d27,0xf8768f02,
  115976. 0x465853d1,0xc38ba3ba,0x1b8ab9b6,0x6e3ab36d,0x47a07331,0x01fc9742,
  115977. 0x25233f32,0xfdd41718,0xac61de7a,0x4dacfa81,0x00000021 },
  115978. { 0xeaa3198c,0x365a9f37,0xfc8b99d5,0xcbe8a345,0xd4f5ecbc,0xa427f12a,
  115979. 0x0c237514,0xe841ff60,0x28a27b05,0x5d9e8c5a,0x62859ff3,0x2d377444,
  115980. 0xea8bde37,0x1c0460ff,0x29cf5bf8,0x0a0e49a1,0x00000181 } },
  115981. /* 108 */
  115982. { { 0x45843c3e,0x688203af,0xaabebae7,0x4601e303,0x624df62b,0x397b08f3,
  115983. 0xd21e5aa8,0x5687348a,0x9a242b0e,0x2cf12c73,0x32a76c6d,0xc848ed01,
  115984. 0xf52751a2,0xb72aa1c2,0x92c02d05,0xb63296c3,0x000000f3 },
  115985. { 0xc6f3d1f0,0xce4b42ad,0x2f532b94,0x2f0dcc53,0x83443d9c,0x57813335,
  115986. 0xdc8dd9cb,0xb50118ee,0xee87192f,0x3039e1a5,0x557419c2,0x9977267d,
  115987. 0x30f96b0c,0x462efa4c,0x3cd3c35a,0x454fb796,0x000001f7 } },
  115988. /* 109 */
  115989. { { 0x9d153926,0x10f28194,0x82b57548,0x42e28c91,0x509e94c9,0x4b423b30,
  115990. 0xde9d6b57,0xc5acc52a,0x8b3ca314,0xaa746c39,0xc63d5bc5,0x0f4ea307,
  115991. 0xe1ccc989,0x425553a2,0xf76d9194,0x271198bf,0x0000008e },
  115992. { 0x3c8e672b,0xc7900e46,0x3f2dfc27,0x703675cd,0xaf2163c9,0x704951f7,
  115993. 0x7aceaab0,0x74d69908,0x7e8d2369,0x482f21a9,0x813dc115,0xdcfbc1dc,
  115994. 0x04f6cd13,0x0ce2bc80,0x82bfaff2,0x2a54662c,0x0000003f } },
  115995. /* 110 */
  115996. { { 0x1588a8bc,0x0dcf41e6,0x210c52cb,0x6f48cd0e,0x758e7a45,0x338562bd,
  115997. 0x48b9b957,0x1600d54b,0xa6b89b9e,0x461df80b,0x098cc82f,0xf7fd4f17,
  115998. 0x14977147,0x167f01cd,0x6116c5f9,0xb1338511,0x00000048 },
  115999. { 0x5d2617f0,0xdeb76333,0x6ecb8606,0x3f9a5772,0x1b91fce9,0xa93c032d,
  116000. 0x6c84b997,0xf7a4388b,0x823ca5be,0xbfe80225,0x35a32f6b,0x6f19c028,
  116001. 0xe3cb5c58,0xf26cd5ad,0x6d0c1dd9,0x7f5ddc77,0x000001e7 } },
  116002. /* 111 */
  116003. { { 0x6ee764c9,0x3c9feec8,0xb07c82cc,0xd1bec836,0xa005b142,0x6bf1b2e6,
  116004. 0x29e8a5ea,0x70ef51a3,0x3ffe241c,0x517d298e,0x72966c28,0xbb389e28,
  116005. 0x2c7acc76,0x3a2da8a9,0x732a21b5,0x902c9126,0x0000004a },
  116006. { 0x8f7ce110,0x96c51b9c,0xaeb036f1,0xdcc33a87,0x0a6a59e2,0x82695098,
  116007. 0xe78db500,0xceaf26a7,0xc95bb030,0x82f3c384,0x24c42f42,0x6dd6e9f7,
  116008. 0x70ac4a0a,0x768dde29,0x03d22efc,0x4aedce4b,0x0000016f } },
  116009. /* 112 */
  116010. { { 0xeded03c0,0x077f032a,0x588ddd4d,0x2684a052,0x9a85be0f,0x6d09bc4f,
  116011. 0xe0b9b6bb,0xbdda0c7f,0xf2fb5887,0x19689c7e,0xec3cce7e,0xf8a96960,
  116012. 0x768d2ae5,0xb043d9d5,0xdb21219a,0x29c8081b,0x00000068 },
  116013. { 0xde59f006,0x6bf872fa,0xcb97ef5a,0xc2b9ffc6,0x58ae7ef8,0x371915db,
  116014. 0xf4ccaa1f,0xc2e23ca1,0x89c27cc4,0x1af8c60e,0xc86bdcc6,0xeee5d7e7,
  116015. 0x9bd8de43,0x9225b47f,0x4b24f08b,0x53e7f463,0x000000b4 } },
  116016. /* 113 */
  116017. { { 0xe3048bda,0x54c496d0,0x43c3de4e,0xe2b67499,0x4c2d509e,0xac2049f7,
  116018. 0x543c5089,0xb01f691e,0x105a365b,0xcd9960a3,0x78b17049,0x34d93ffe,
  116019. 0xf82c9467,0x029f99b3,0x0161a755,0x785c5ea2,0x00000091 },
  116020. { 0x953dbdb6,0xb455f978,0x97eca19f,0xea9e84d9,0x36d4d75a,0x473bd029,
  116021. 0xc15276fa,0xa9c17ca8,0x47c76356,0x9cf66133,0x039738d2,0x4a68360b,
  116022. 0x69733609,0xd3e430a8,0xe2b27f21,0x0ae532de,0x000001b4 } },
  116023. /* 114 */
  116024. { { 0x5164cb8b,0x68110e82,0x2552a67d,0x6979af4f,0x8d185527,0xe10d6d0e,
  116025. 0xfb64eac4,0xcf6c5787,0xac424592,0x8408163b,0xfce0d810,0x5d8fff37,
  116026. 0xda84c15c,0x8b284e49,0x32663ec9,0xed805567,0x00000010 },
  116027. { 0x51f3ee9e,0x106f4030,0xb38adf1e,0x2e8e3ee9,0xa13d6449,0xd3c87a6e,
  116028. 0x80e1abb1,0x27b49f45,0x0bfd7298,0xc283d179,0xafc7a35f,0x8fe50fa5,
  116029. 0xade3ad4f,0x773da545,0xd9a21df2,0x78bfaae4,0x000001f8 } },
  116030. /* 115 */
  116031. { { 0xabad5678,0xae60d8e8,0xe600c25b,0x0afa72ce,0x4c288e21,0xb9d4e0b4,
  116032. 0xd254cf9f,0x64447f76,0x959e2ba5,0x1fb36bc4,0x2961132c,0x393c44d7,
  116033. 0xfc140f19,0xd7a8881f,0x8d096648,0x27a86128,0x00000091 },
  116034. { 0x8a9e690c,0xb536c021,0xeab4fa15,0x85dcc521,0xb00ee54c,0x09af4423,
  116035. 0xaf3a8e48,0xb3793525,0xb7731d85,0xe1f36308,0x141cfb55,0xb5361d78,
  116036. 0xeffc4529,0xea41f29e,0x9f7d2634,0xcf5755b1,0x000000e8 } },
  116037. /* 116 */
  116038. { { 0xd212b398,0x01edb80d,0xd53dd373,0xd0396181,0x8a52fa95,0x0e086047,
  116039. 0xa7825e6d,0xad1e6432,0x330ece4f,0xe0185bc5,0xb078936f,0x508f7313,
  116040. 0x9e7f6ea3,0x1dc982fd,0xd5556b60,0xdbf3a602,0x000000e8 },
  116041. { 0x279e05bc,0xc3763234,0xf44453d3,0x7f5f40ec,0x7fa30793,0x310c5f4d,
  116042. 0x108d7e22,0x5cffad36,0xc2a98bbc,0xf2f01ef3,0xd7d47f80,0x30ab1719,
  116043. 0xa9b22e1c,0x7bc9f918,0xe834df94,0xf53dc52a,0x000001f9 } },
  116044. /* 117 */
  116045. { { 0xc183f89b,0xf266b49e,0x5f5806d4,0xd3fb5f02,0x94ec3080,0xd30a42b5,
  116046. 0x371cd917,0x4b6b1940,0xb7f7e26d,0xf7541aab,0x2d5b7b64,0xe55269eb,
  116047. 0x7f8036c5,0x0e1a85c1,0xda5f2675,0xa0ff0f22,0x000001ce },
  116048. { 0x3a8e11f8,0x602bd56a,0xf5f9ab54,0x29864021,0x0ccc92d7,0xc6742c5a,
  116049. 0x523f650b,0xd64569e6,0xf7fabfb4,0xc8e4681b,0xc3c9e6cb,0xb4275947,
  116050. 0x38f5ff20,0x2b3952d5,0x1f04aea2,0x818f8e38,0x000001b0 } },
  116051. /* 118 */
  116052. { { 0xe50d90f0,0x3be5bffa,0xf5011cdc,0x4cb3b11b,0xa691dfac,0xe10ca711,
  116053. 0x4ea1a773,0x62ec211d,0xe586eeb6,0x5a979ebb,0xa0c2f1fd,0x4df16ab1,
  116054. 0xc57bbfea,0xfe9e3f7e,0x5ae526f6,0x1b05960e,0x0000015e },
  116055. { 0x8630e62e,0x1c8e04a5,0x6447e1b7,0x3d00310e,0x43b4447a,0xcf1e6b61,
  116056. 0x7462e7a3,0x92abb851,0x0002724d,0x8309ea08,0xe45296df,0x1d805d70,
  116057. 0x3d4ed812,0x0f3849b3,0x6834d44e,0x2d6bffbc,0x00000096 } },
  116058. /* 119 */
  116059. { { 0x48e07711,0xd13fe58d,0xd270a3b2,0x70f83648,0x8cdff04c,0x1517892d,
  116060. 0x51411f14,0x15bb6578,0x3e4f8a55,0x6c31cd90,0x0413362f,0x73f87152,
  116061. 0xeca06d4d,0x2fe025ee,0x954e317f,0x32a6e417,0x000000ad },
  116062. { 0x69d147df,0x7e38c63f,0x710bf37b,0xb69bb06e,0x28d514de,0xb94debef,
  116063. 0x8d11c3d9,0x4b2307fb,0x0385c604,0x3b369df9,0xe7800e83,0x68ea2f49,
  116064. 0x7d501c1c,0xf028b258,0x5cef7818,0x97078221,0x00000055 } },
  116065. /* 120 */
  116066. { { 0x54c1d751,0x10c351db,0xba0f9512,0x81445301,0xbfdc8bed,0xa77eb34f,
  116067. 0xcf23680a,0x498d8138,0xe04f2860,0x928c14a4,0x16a5b6da,0x96192dba,
  116068. 0x5f9a9103,0x49dea95b,0x01724102,0x80dd4578,0x00000085 },
  116069. { 0x0e09221c,0xe9072500,0xf21de056,0x62e05b21,0xe0e60950,0x448cafa1,
  116070. 0x6f775129,0x657fb97b,0xf1f34aca,0x5d2991bd,0x49ff15d6,0xa66cd5ac,
  116071. 0xd049ec79,0xdc1d6897,0xe72baea8,0x388fca84,0x00000067 } },
  116072. /* 121 */
  116073. { { 0xa6ef1dd3,0x6520b49d,0x3ba6cd76,0x391a045e,0xf33d5f48,0x9c84980a,
  116074. 0xef07474a,0xe53cf5b2,0x78bfb1ea,0xa35b2e9a,0xeda906fa,0xeca97fd6,
  116075. 0x1b9f2cf4,0xf1a93789,0x3ab28589,0x66753369,0x0000010d },
  116076. { 0x73691faf,0x5b510496,0xd57ec618,0xdc73d3a9,0x930a8525,0x7e2921bb,
  116077. 0x40b05b69,0x094f571e,0x413bedca,0x5e96a017,0x8d1a6b98,0x9e7d4f72,
  116078. 0x3eade8b7,0x55143fda,0xd16e454d,0x859b8444,0x000000fb } },
  116079. /* 122 */
  116080. { { 0x7c667aaf,0x7c22083e,0x4a91ccba,0x33545cb9,0x8ca0e94a,0xca1e9931,
  116081. 0xe4eaa0c7,0xc3afff23,0x42f56844,0xa21ac436,0x60d52d0b,0xfcc68a8b,
  116082. 0x6a9301d4,0x401a585b,0x907abce1,0x547f762c,0x000000a3 },
  116083. { 0xfbe260ce,0x63dd3ed3,0x80dc01fa,0x2717752d,0x6f1da3e4,0xd5fab75d,
  116084. 0x5261f10e,0x5f16864a,0xd20cd6bb,0xbe7b1f63,0x221ac656,0x9d638c10,
  116085. 0x673b918e,0x3137b8f6,0x4ada2fb8,0x23eb4438,0x00000174 } },
  116086. /* 123 */
  116087. { { 0x2a1fbcf4,0x194e27c4,0x5facd5ee,0x4c0d285b,0x915e6607,0x75c2ebdd,
  116088. 0xef0a6a9a,0x1e696510,0x067cf458,0x13c5afa1,0x7bee1fba,0x2be013c1,
  116089. 0xdad279e7,0x85a406d6,0x5142cf59,0x0042951d,0x00000031 },
  116090. { 0xa22bbc45,0x6a735ec1,0x7f56f4d8,0x4ee5391a,0x236001de,0x305af9d0,
  116091. 0xaa2f8d25,0xa8b21851,0x187db78a,0x0e2c36d8,0xa1a888c3,0xcfcc083f,
  116092. 0xbd3e7d5b,0xb91dab7f,0xf4fdd023,0x62d85460,0x000000f4 } },
  116093. /* 124 */
  116094. { { 0x4972d703,0xf568ba02,0x39098a03,0xfc44ca1d,0xae28c855,0xe9b8e542,
  116095. 0x5b1b4536,0x4fd4f360,0x4c7f7e48,0x2e08b07b,0x2230823d,0x042f3b98,
  116096. 0x1889fd13,0xc9ffd313,0xc6c68359,0x56af0652,0x000001bb },
  116097. { 0x06e0f16a,0xedbf05e2,0xd74644a5,0xfc1ac2fa,0x0f92c71a,0xe59a0a98,
  116098. 0x36c800a1,0x13ae37d7,0x236178dc,0x5f20efc6,0x2b46ef10,0x443a58b8,
  116099. 0x442509e4,0xc9517dcf,0x640ed9b0,0x7d0bb415,0x00000166 } },
  116100. /* 125 */
  116101. { { 0x3d22842d,0x3aa30a61,0xb3c4ece0,0x8c6e00f5,0x6df82b79,0x8764cf87,
  116102. 0x78d208c5,0xda92d86d,0xe788854a,0x0a52d391,0xa59b0994,0x499b26fb,
  116103. 0x04c5fc9a,0x5dc133ad,0x34e3f134,0xa5c09269,0x000001dd },
  116104. { 0xfad6d673,0x6f0dcac2,0x00f3b3fe,0x6d8fdf05,0x631756e9,0xece71941,
  116105. 0x0a4d80e3,0x3990f493,0x31d13001,0xf2aca936,0x75581638,0xee91966c,
  116106. 0xe6dd5679,0x6df0f574,0xccd71cda,0xbe124868,0x00000111 } },
  116107. /* 126 */
  116108. { { 0x475cc1b4,0xf644c726,0x2b73978c,0x915fc2f9,0x0e3d7eb7,0x65a7e6d1,
  116109. 0xf40c38e0,0xbb44e21a,0xe1ad24fc,0x988662b9,0xc35606e5,0x270ba4dd,
  116110. 0x1a4f93f7,0xc3834a2c,0x3362a4d7,0x93d0c9a2,0x00000021 },
  116111. { 0xf769fd7f,0xe2cb7b8c,0x89a213b9,0x1815da97,0x6b910fef,0x7b4f8c56,
  116112. 0x26931438,0x2088b309,0x925b37c0,0x477b71bd,0x26a640e5,0xa049a921,
  116113. 0xfd21c6ef,0xd3ddf1bd,0x232a56b2,0x9b5f9d7d,0x00000064 } },
  116114. /* 127 */
  116115. { { 0x679a9c35,0xd640adf8,0xcb74d796,0xcdad98e3,0x5f8e9daf,0x464b8ebb,
  116116. 0xad4a073c,0x4738614e,0x2edde557,0xbd86c0ee,0x576ce0b9,0x77331738,
  116117. 0x4095fb96,0x9b5d3327,0xee09aead,0x72f0aeb3,0x00000136 },
  116118. { 0x64e54ba5,0xa388c76d,0xdc474d21,0x63fe7af1,0xb2a77081,0x7fa3e9d1,
  116119. 0xde1240ad,0x0447b49e,0xc720303a,0xd9f64b66,0xe6bd0213,0xb1c78029,
  116120. 0x0aa03ea5,0x1caf1c70,0x3bb85d2b,0x179180eb,0x00000103 } },
  116121. /* 128 */
  116122. { { 0xaf2ed12f,0xadbf4f9f,0xf380fd8a,0xce1d19e4,0xa39e81ae,0x0957bdb5,
  116123. 0x626ef6bc,0xf9833321,0x0cf5b28d,0x110ae5ea,0x20392cd4,0xab159450,
  116124. 0x6bc67855,0x67c49887,0xa3fd61c6,0xce7e5938,0x0000004a },
  116125. { 0x28c7dea9,0x59c5b9ef,0x0a6a7184,0xd02f95ba,0x8202769c,0x034dc257,
  116126. 0x94dd6896,0x213b0b08,0xb5dea95a,0x03730b7f,0x617ca889,0xfe243ed0,
  116127. 0xfb1ba052,0x16cf4d17,0x226f96da,0xd8691d6b,0x000001c0 } },
  116128. /* 129 */
  116129. { { 0xbf8015c2,0xaa2edf3f,0xc49502d8,0xe7f8236d,0xa6a43157,0xe890f6e0,
  116130. 0xa2d04b0c,0x318ef325,0xa809dbab,0x9cc0668d,0xda67ca21,0xdd26937a,
  116131. 0x83febc49,0x8f27c12c,0x3c9b9844,0x87b3db2f,0x00000029 },
  116132. { 0xfd2e3dc7,0x37e7aed0,0x7415fd55,0x498e8bdb,0x58a45f25,0xfc0d6c9a,
  116133. 0x209c85d0,0x83d5baba,0xd579e1ee,0x31ec8dc6,0xa502bfed,0x1f4cad0b,
  116134. 0x1f41bef1,0xc432e6ce,0xbbffca65,0x3b10afaa,0x00000191 } },
  116135. /* 130 */
  116136. { { 0x53053af7,0xbd9f7df0,0xb28a1cf4,0x60304765,0x7ce90438,0x441778fc,
  116137. 0xac8c5ddd,0x8fbed36e,0xfb59ec61,0x27b1313b,0xa1b1becf,0x9d2656ff,
  116138. 0x945973a9,0x334e1345,0xc362b595,0x3261888c,0x0000018c },
  116139. { 0xaa7f6ff8,0xf413a414,0x3fab7c7a,0x092aeb88,0x7cc307ba,0xfa1d886b,
  116140. 0x2346100e,0xdc81c125,0x02140c93,0x93d4d273,0xe6104835,0xa1ed7e3c,
  116141. 0xdf1795f3,0xe2b91ecf,0x369ed416,0x160dc11a,0x00000191 } },
  116142. /* 131 */
  116143. { { 0x8b57d7cc,0x9a72f46e,0x4bf02386,0x3140b0e5,0x05b3a91d,0x886c396e,
  116144. 0xa4ec26e0,0x1b9ab3a9,0xc50f58e9,0x742feaeb,0x55e26af0,0x1592c608,
  116145. 0xbb1cd9f7,0x943cd476,0xc7f02c89,0x3ed97fd4,0x0000017c },
  116146. { 0xe6d54964,0x53b02503,0xc6a318c0,0xd9bd1162,0x9cc28c22,0x18ff6cf4,
  116147. 0x03534640,0xa45c7840,0xb4cc0668,0x8ea3335e,0xf42dbe03,0x7ad727f8,
  116148. 0xfdf6c3cd,0xb157e911,0xec992d76,0xa7f894c9,0x000001b3 } },
  116149. /* 132 */
  116150. { { 0xaf09ea77,0x91e6e397,0x75dc25c5,0x26a760b9,0xb94a197b,0x8c040c08,
  116151. 0xb68ce619,0x041baca8,0x5bd23564,0xa19a0d15,0xd977b33f,0x86ca5b94,
  116152. 0xe5fbd029,0xf31f87f8,0xb1901f99,0xf76c55a6,0x000000b8 },
  116153. { 0x3846ec9f,0x175bf8c3,0x9deaca46,0xf462205c,0xa3108df0,0x92cb5ec0,
  116154. 0xcfaed928,0x879db283,0x65049fb2,0x477dc004,0x96ee5031,0x48d24bac,
  116155. 0x56adce45,0xa7db6b16,0xab1c684f,0x0110cdab,0x000000fc } },
  116156. /* 133 */
  116157. { { 0x4d308bf2,0x151b66d8,0xd6638004,0x99013c9f,0xfd383bf9,0x6892df92,
  116158. 0x3ffc8efc,0xa10efd84,0x313ea287,0x527e316c,0x3a0df740,0x8ef6e3cd,
  116159. 0xf6ebd2a1,0xcb96e430,0xa70ee4ce,0xc1ebecf2,0x0000018c },
  116160. { 0x1a70404c,0x80d14ad7,0xf9ce2a30,0x6ad21dd0,0x3aa3e072,0xb94cbcde,
  116161. 0x6363a690,0x0ab59611,0xc6b1e2b4,0xe70bff45,0x66ceec5b,0x1296dd0b,
  116162. 0x747757c0,0xd4cb2a74,0x3d7d91e8,0x08988ca6,0x000000aa } },
  116163. /* 134 */
  116164. { { 0xf8db0396,0xaa2dcfca,0xb422da76,0xe8ae8f37,0x96485724,0x652f8349,
  116165. 0x7bf1493f,0xf647c3c4,0xb0247a4e,0x8b600b46,0x7aebda8e,0xabf3e439,
  116166. 0xa7958df0,0x2e1d231f,0xf881bab2,0x38e692b1,0x000000ef },
  116167. { 0x26cf3047,0x1f3c1689,0x59539858,0xdad14f94,0x293f20b6,0xfde85d1c,
  116168. 0xf57abb17,0x2ea5436e,0x1794de38,0x0d1a8ffc,0x2bfecd2f,0x9ba508e2,
  116169. 0xdb786042,0x110f0a7f,0x7cde31f8,0x2ade6f64,0x00000196 } },
  116170. /* 135 */
  116171. { { 0xfec78898,0xc996a537,0xde0fa77f,0x0b39de72,0xd34cb08f,0xf6d076ac,
  116172. 0xda78d353,0xacd8bb82,0xa0392cc1,0x5fe804d3,0xe581549d,0xab7adede,
  116173. 0xc067c6d9,0x883901a0,0x4ed93f37,0x5855ffa2,0x00000191 },
  116174. { 0xbf9ebef3,0x29570e36,0xdf4b3177,0xe21046a5,0xa6816b5c,0xf9b89a95,
  116175. 0x288d0e11,0xadf39281,0x3979159a,0xd6baabe5,0x5c8fabb2,0x411afee0,
  116176. 0xe5c7af10,0xf192c3af,0xd7dce37b,0xaa72e81c,0x000000f7 } },
  116177. /* 136 */
  116178. { { 0x16c386ee,0x20fa3c0f,0xd4c09839,0xb33b0469,0x876a3136,0x79e0d722,
  116179. 0x3c406c06,0x343c0a92,0x4debe27d,0xef220e3e,0x196f00ea,0x09d7b1e1,
  116180. 0x24a9dcff,0x4a0f5dd8,0x99c1d085,0x53582ec5,0x000001e2 },
  116181. { 0x5138c7ed,0xcc8ef262,0x6547f88d,0xdec43194,0xdd0a9488,0x2b6e53ad,
  116182. 0x8257ebdc,0xeb9f1efa,0x1f08c989,0xc583c6eb,0x40163768,0xf1736911,
  116183. 0xdbc20e3d,0x6282ff8b,0x9cbd514e,0x26b81005,0x000000d5 } },
  116184. /* 137 */
  116185. { { 0xa0025949,0x2449522f,0x0bbd8945,0xb26d888f,0xe637216f,0x33442f5f,
  116186. 0x472827f6,0xd8ec3b64,0x99fc2681,0x91d8a1a3,0x68c7710d,0x6d232ead,
  116187. 0xe51b2762,0x8e5bfe2f,0xfd109fa7,0x0f9f4fed,0x00000004 },
  116188. { 0x6b4a05e0,0x1952ea51,0xf21c78eb,0xcb0d48ee,0x1997dfdb,0x64d36619,
  116189. 0x8b4c21fd,0x0d11b204,0xbe92303a,0xa6f569b6,0x78c5e809,0x2b8f6096,
  116190. 0x36805d8e,0x7226b5ab,0xdb349ca2,0xd6cff180,0x000001bd } },
  116191. /* 138 */
  116192. { { 0x943cc612,0xa49f8576,0x832b31c7,0xc914319e,0xcccadebd,0x9225e297,
  116193. 0xb0619821,0x4918fb42,0x25b1cc7c,0xaccb3084,0xa646e5f0,0x751d3347,
  116194. 0x590e3e22,0xeafb4aae,0x2c4a0008,0x82146038,0x00000151 },
  116195. { 0xbf96a461,0x3c2481db,0xb52a3ba4,0x51c122e9,0x464db08b,0x21c2858e,
  116196. 0x6d6a081d,0xb1014b78,0xf533cef7,0x167d3ed4,0x81545f7c,0x6cfb3294,
  116197. 0x449b7b9f,0xea46d31c,0x9621c299,0xcfad7613,0x00000081 } },
  116198. /* 139 */
  116199. { { 0x478a7f0e,0xef796327,0xde17705d,0x914183e2,0x572117e8,0xd24a26df,
  116200. 0xb7cd52cf,0x3cdb1b09,0xad83c160,0x9e42b9fb,0x709ef8c9,0x6971d2ea,
  116201. 0x8ee54ccd,0x1894fc5b,0x34a520fc,0xf757b4e5,0x000000fc },
  116202. { 0x86b62347,0x5a5518cc,0x7bc2a928,0xec51c9d2,0x2966727f,0x2eea2b05,
  116203. 0x0ae43e6f,0xbc8a8e3a,0x05ca066b,0x80535b5e,0x8833986d,0x91ffcdb1,
  116204. 0x32374cdd,0x2f4a5bba,0x0d202243,0x08763a49,0x00000124 } },
  116205. /* 140 */
  116206. { { 0x4efac14d,0xe498b972,0xa79a9d3c,0xb6f4bf8d,0xd6e07c29,0x0f1e8dbd,
  116207. 0x71771538,0xfac30cfd,0x71b03263,0x4c91ed22,0x19b455f5,0xbf938335,
  116208. 0x127092bf,0x76a5e789,0xb4813bd9,0xa97674e1,0x00000128 },
  116209. { 0x583e5924,0x29b63c41,0x8f171d06,0x61f9aff1,0xab227a28,0x2b45b3cd,
  116210. 0x8a11ab70,0x939d5dda,0xe8db6971,0x2bfb47b0,0x0ec10805,0x562379df,
  116211. 0x24ce1801,0xaf5a6481,0x34f94aba,0x8d98c434,0x00000150 } },
  116212. /* 141 */
  116213. { { 0xcfffc80f,0xdea9fe73,0xd43473f6,0xe23e2e9b,0xc9d37ba7,0x27fb3ed3,
  116214. 0x7a3fc357,0x733766d2,0x8e04a03d,0xd0db4cf3,0x2bbe0f43,0x8ce01752,
  116215. 0xda986f4f,0xd87eb719,0x2fe6b037,0x6d1b50ae,0x00000153 },
  116216. { 0xda40bab1,0x371f5def,0x9b2bda63,0x07d6a8af,0x0d4aca87,0x5e8a5c89,
  116217. 0x643ff8ab,0x4d72f0ff,0x4bf8ec2f,0x9c4c10d9,0x0eb93e22,0x36b0eaba,
  116218. 0x1d2dfd01,0xbc4b0e8f,0x9d34a082,0x9f252e5a,0x00000142 } },
  116219. /* 142 */
  116220. { { 0x7d0e7020,0x4affd4c1,0xb5482168,0x9b169aaa,0x588f348f,0xdbe01708,
  116221. 0x885986bb,0xdaebf6ff,0x15f9c381,0xb33987f5,0x04a94a7b,0x7e455f2c,
  116222. 0xa0ed6849,0x39a41442,0x1ef7798c,0x1c1ad4a6,0x00000154 },
  116223. { 0x072709c4,0x7647b628,0x8810e5fe,0xb330d68b,0xe92e0f63,0xd1bd8874,
  116224. 0xf8bea9ba,0x144e4fb9,0x8318981a,0xc15afc18,0xb68c6a07,0xe19c5c82,
  116225. 0x36e00b66,0x858c57a2,0x07cb7aec,0x9b255110,0x00000011 } },
  116226. /* 143 */
  116227. { { 0xc887027d,0x121ced27,0x2bfab286,0x6050f335,0x19d511e2,0x6e373c1c,
  116228. 0x7f4c69f5,0x02d4c3a9,0x25226bb4,0xe6f356af,0x83e7ac30,0x3b9011c3,
  116229. 0x33d8fdfb,0x43b0c23d,0xaf2ea363,0xa8c390f7,0x0000000b },
  116230. { 0x7e851bac,0xc430c3d6,0xa5f544fc,0x8991c389,0x67fba061,0x006bbc64,
  116231. 0x97cbdbf4,0xd49d024e,0x7734adad,0x4539b7dd,0x28cb6d2a,0x90ba8f9f,
  116232. 0x4de4b3ad,0x7a921830,0xa7b96928,0xb28732ef,0x0000006a } },
  116233. /* 144 */
  116234. { { 0x22ed5986,0x71dab52d,0x58533e06,0xdeee627a,0xcf155fe3,0xe8fee37a,
  116235. 0x7ae8b132,0xcd61490d,0x34a08b94,0x2706e185,0xf9c15c30,0xa85ffd52,
  116236. 0x51a5ad46,0xd5a224f3,0x54d700bb,0x44d1b6d5,0x000001e6 },
  116237. { 0x862e4e9c,0x96830686,0x48763fe4,0xfe5cd76c,0xc0839caa,0x60309679,
  116238. 0x8d83d62d,0xc0e4cbeb,0x11bc4ae2,0x911e254e,0x64fca062,0x96a0d7c8,
  116239. 0xe9a27045,0xf5785dd5,0xf3e0412c,0x2f4677d0,0x000001be } },
  116240. /* 145 */
  116241. { { 0xab01a6dc,0x4c0012dd,0xae1adb69,0x391bd6c1,0xb9b05079,0x3ae7daec,
  116242. 0x62a1061f,0xc2714f9e,0xa96536b7,0x71978ee7,0x5e17654b,0xeec11bd0,
  116243. 0xefab3dd4,0xc71166e0,0x87edbf61,0x0f7aa572,0x000001d7 },
  116244. { 0x51eb5932,0x26ea6f7d,0x5f882ca4,0x354ea0aa,0x7739f7dc,0x175b6097,
  116245. 0x9be57934,0xd335192a,0x78545ecc,0x9801f423,0x7b643c9d,0x32b8e256,
  116246. 0x23e3abec,0xb9411dd7,0xcf1c6509,0x656dea68,0x000000ee } },
  116247. /* 146 */
  116248. { { 0xa0890deb,0x4d38e140,0xbceb84bd,0xbf7bd87d,0xba041dec,0x51f0ff72,
  116249. 0xa6820be9,0xafeec70a,0x8c486298,0x755190a3,0xe7010ec4,0xecdba558,
  116250. 0x8c7879b1,0xced91db8,0xef5e215c,0x08de3e4c,0x0000014c },
  116251. { 0x16266da2,0x9c1534ed,0x7b4c9009,0x9ce322eb,0x69927688,0x37decaef,
  116252. 0x05c2844d,0x6525097f,0x1ac519ab,0xd23b7e13,0x65a3cc86,0x682ebb72,
  116253. 0x628c4575,0x0c531db9,0x73805373,0x2e00e8b8,0x000000be } },
  116254. /* 147 */
  116255. { { 0x57ed32e9,0x3807c800,0x7c024997,0x427e40cf,0xabb54830,0x58506abb,
  116256. 0xce820bf4,0x5649776f,0xb2c43e81,0xb5353293,0xcfef6648,0x671e8353,
  116257. 0x903bdca5,0x27217d3f,0xa813fd79,0x40a9c109,0x000001dc },
  116258. { 0x3db21a38,0x6beaa6c3,0xd73ef7e4,0xcae222e1,0xbd1d507f,0x1ff684e7,
  116259. 0x587a77ab,0xf5bac664,0x0c64a4d6,0x58c74f62,0x6a7c378a,0x4ca837d9,
  116260. 0x3e42e409,0xf43df531,0xfb49e14f,0x8a9a4347,0x0000013f } },
  116261. /* 148 */
  116262. { { 0x992f8923,0x85ab4edf,0x6fd209f3,0xe24aa5e0,0x1b1340ee,0x27be9b87,
  116263. 0x91e0bb40,0x2957d11f,0xf3d4c62c,0x425afad2,0xc7ff7aaf,0x2d231286,
  116264. 0x0114cbe9,0x96412b2b,0xc3e23529,0x6706a231,0x0000019f },
  116265. { 0x225c02af,0x06b3bbd2,0x3fa3e98d,0x53ebc166,0xb84f482e,0xa6df2b75,
  116266. 0x2bfc55df,0x912b4521,0x512a73da,0x30bdbd40,0x3d53eaa4,0xac0f43d9,
  116267. 0x0c27fd53,0xfc358fe4,0x919424b4,0x2cb183be,0x000000a3 } },
  116268. /* 149 */
  116269. { { 0x3fa6a746,0xe39b0c2d,0x1d5a24a8,0xe84a7922,0x78cdf2b5,0x70a58914,
  116270. 0x30666cb3,0x8a88067d,0xf6d71d06,0xb09a709e,0x0065d184,0x50007a3e,
  116271. 0xb8dc9448,0x7046af4b,0xc65493ac,0x2b6a3129,0x000001fd },
  116272. { 0xe45f2771,0xd3d5d5bd,0xf432ed95,0x8542b08a,0xf232a6bb,0x2ecd40fb,
  116273. 0xe8beccb2,0x0fcb6143,0xbf8e247f,0xcecc513a,0x8da3039b,0x955d56f7,
  116274. 0x56c2a0df,0x9157c619,0x3031fe2a,0xa6d35cbf,0x0000018c } },
  116275. /* 150 */
  116276. { { 0xbe0c4923,0xdd800b1b,0x6902907b,0x046ae740,0x957bd0c7,0x2398b37f,
  116277. 0x9655f8b8,0xaa8e1a9d,0x500f4150,0xcd2927fa,0x202e7aee,0x826a9c6d,
  116278. 0x9f29692e,0xb4cf58b3,0xbf41577c,0x3093868c,0x0000011f },
  116279. { 0x333ed442,0xadcb5e7a,0x906fef7b,0xae5c8e2f,0x3d98f228,0x2d9b0123,
  116280. 0x7ffe125c,0x4632f2da,0xba231835,0x59487731,0x12d2c512,0xa0caae5b,
  116281. 0x9857d9c4,0xbf00e658,0x54f200f6,0xc5d10086,0x00000172 } },
  116282. /* 151 */
  116283. { { 0x2fc283e0,0x58954046,0x7ee0880e,0xf7633984,0xb7fd1622,0xfaf1b40e,
  116284. 0xf598c5ed,0xecf5151e,0x7e00d9bb,0x6b4d92f7,0xa8c43fd4,0x7543e3b3,
  116285. 0x6511d1d2,0x3994e12c,0xaf05b6d3,0xdd841a1d,0x000000c6 },
  116286. { 0x23b991ad,0x23da17e0,0x71fba514,0xaab2b213,0x0ddc1879,0xb417ec5a,
  116287. 0x5f63acdc,0x173bc8ad,0x1e2a7d50,0x2fcf5210,0x6106d008,0x63373fd0,
  116288. 0x7db012cf,0x1e8211de,0x576545ef,0xa07766d9,0x0000018c } },
  116289. /* 152 */
  116290. { { 0xaf80dfaf,0x8e4347b9,0x9c4667f3,0xa80b631f,0x6ddbc238,0x6ff1db26,
  116291. 0xaa8718a0,0x6161e365,0xaf31c35f,0xe7f7ac90,0xfc6846e8,0xc03831d1,
  116292. 0x684175b4,0x1e669d10,0x934b731a,0x6da9d620,0x000000c7 },
  116293. { 0xa3e4e78b,0x981f597b,0x55099f9a,0x2c14dedc,0x93088c61,0xbf373995,
  116294. 0x9b207458,0x7c568307,0xa2276900,0xc4440c47,0xf7e6daf3,0xb6df23c8,
  116295. 0x42929103,0x4f662c25,0x8b3b7963,0xf4ea6db1,0x000000f9 } },
  116296. /* 153 */
  116297. { { 0xced36049,0xc669eb88,0xf41b99f8,0x87a4ffe1,0x6a72e108,0x690b7563,
  116298. 0x65a0bb8a,0x67dd6a8c,0x96e42955,0x42cf8c58,0x1aabffad,0x5286b5f3,
  116299. 0x8f6f26a4,0x1f7dfaf2,0x0e1ae503,0xc5d9e0ac,0x00000120 },
  116300. { 0xacc10da7,0xafbee3ff,0x944946e5,0x67e2d5f9,0x3c4220ff,0x8ec17e86,
  116301. 0xbd6f632e,0xfe6f7414,0xc3fc9ef4,0x4a9e3c0f,0x03bfb870,0x25ff3cba,
  116302. 0xbb03342d,0x18fd3600,0x0050cd2e,0x1e63e753,0x000001ac } },
  116303. /* 154 */
  116304. { { 0x8f3d6a02,0xdd83d07c,0x7ef4d0d1,0x71fc143c,0xd4c7af61,0xca994bf0,
  116305. 0x827c5cf0,0xc8a93e98,0x2b697882,0x4a102c7b,0x8a55e8ba,0x633c87d5,
  116306. 0xcc2d64f0,0x1ae8822f,0x986d01fc,0x2ce9b53f,0x000001c1 },
  116307. { 0x95dc1b79,0x859639fd,0x3f4e616a,0x2728f754,0xede2fb9f,0x6e703c4c,
  116308. 0xd50fae9e,0x042f7680,0xc2d530ed,0x0546bc3b,0xcdd598ac,0x00a4006b,
  116309. 0xe1294910,0x3f3286c9,0xb6bf9629,0x77782255,0x00000146 } },
  116310. /* 155 */
  116311. { { 0xe30c98fe,0xaf81421e,0xfc2cd705,0xdeb0feb0,0x14df6ad2,0x9b2c4ca6,
  116312. 0x9ba314e8,0xd38134de,0x4f04b16d,0xa443deb8,0xf07f8ca8,0xfc556ee0,
  116313. 0x3a4f3917,0x3c1c83bb,0xb1adcd41,0x8397dd24,0x00000199 },
  116314. { 0xdf4781e6,0xca01e17e,0x46f1f901,0x32d7c319,0xb53090da,0xa227a613,
  116315. 0xa7c8c607,0x2495b1dc,0xddc69709,0x1cf2fbee,0x45608098,0x1d3d82bb,
  116316. 0x085134d7,0xcfcddda3,0x96798c41,0x3dd171b5,0x000000d2 } },
  116317. /* 156 */
  116318. { { 0xd4dd7e96,0x97a40f84,0x8409fc0c,0x7114c8ea,0xa9d11393,0xc56f29e6,
  116319. 0x8fd8c6d6,0x3b606621,0x00269e7c,0xad3baa86,0x05929d5f,0x1413c6b0,
  116320. 0x222e365b,0xc1ad7e40,0x4798aaec,0x6a82621a,0x000001d3 },
  116321. { 0xc1003c81,0xaeac45c4,0xf43d8602,0x9ef9ef5a,0x60f77469,0x36a65f5e,
  116322. 0xbf5d2858,0xf312e7ab,0xc84acef1,0x2f53ec81,0x9d248b52,0x63e32ca2,
  116323. 0x81e65c60,0xfe9aa7c5,0x52841973,0xe3686c9a,0x00000017 } },
  116324. /* 157 */
  116325. { { 0x9e90de99,0x0b2efe65,0xad05ab63,0xbe4485bc,0xe14e4892,0xc48a6a52,
  116326. 0x22628687,0x2ad85430,0x5eb3db54,0x261f0e95,0xd45e5841,0x48e81863,
  116327. 0x8ed75739,0xcfe1ce0f,0x7d84ade4,0xbd6f1ff5,0x0000003f },
  116328. { 0xd1bf968c,0xd43711dd,0x48dfa472,0xd558d7cd,0xe425a566,0x49f09223,
  116329. 0x5c26d041,0x0cf83338,0x7c2c1743,0xbe7b81f1,0x5143d9d9,0xe3bdc33e,
  116330. 0x94fd3fae,0xf385ac35,0x9fd1811a,0x7551cf42,0x00000113 } },
  116331. /* 158 */
  116332. { { 0x20193bb2,0x4928f55b,0x7310b872,0x96e579d0,0xd345d276,0x5ee06309,
  116333. 0xa871868a,0x9a43e432,0x11038683,0x28c113e1,0xa332f108,0x8286ecf3,
  116334. 0x0385cbb4,0x3348aa37,0xef158daf,0x698ffcaa,0x000000c6 },
  116335. { 0xf6908745,0xa044c54a,0x6a3353fb,0xa6b336e4,0xd561e821,0x694c2852,
  116336. 0x3634917f,0x1b297970,0x81f61315,0x6e1023b9,0xef46a5ef,0x6817dc2b,
  116337. 0x8e114f7f,0x93dea0af,0xed72c5bf,0xc3cf3cd5,0x00000136 } },
  116338. /* 159 */
  116339. { { 0x7b080de4,0xbb8799ab,0xd69d8396,0x3b8f781d,0x986f8f63,0x76b42aaa,
  116340. 0xa54bc5ca,0x5d74c038,0xa9c2fbb9,0x76fcb605,0x80178930,0x8451b440,
  116341. 0x9d286f0d,0x40f00c38,0x0c543263,0x3038e952,0x0000014c },
  116342. { 0x6977aad9,0xc94bc381,0xd7087be3,0xadbfd082,0x875fed08,0x06d0820c,
  116343. 0x345656fc,0xe1ce84d4,0x0fd6dd4e,0x71c4d8e0,0x6a5fab40,0x23338b22,
  116344. 0x0baeeb6f,0xd477eac1,0x5f80c26c,0xe4db08bb,0x00000078 } },
  116345. /* 160 */
  116346. { { 0x1078342a,0x0111d12a,0x559a1064,0x0534725e,0x0fd3ffdd,0xea459d59,
  116347. 0x06f0ac1f,0xcf694a9f,0x3e19bc69,0xf6d24adb,0xb9ddcd00,0x3ce38f5e,
  116348. 0xb632dd4e,0x38400f66,0xe15e1c55,0xcab8fdfb,0x00000085 },
  116349. { 0x8d09422f,0x0a943f6b,0x0f988c3b,0x17d29756,0x2ef2e4d9,0x55a441fa,
  116350. 0x35f7c13f,0x6743523b,0xedaad3ff,0x274d3407,0x9347242d,0x59411435,
  116351. 0x3bb8615d,0x1cb27301,0xbd7794cd,0xa0437004,0x0000007d } },
  116352. /* 161 */
  116353. { { 0x2d712c44,0x824b99a6,0xa6962577,0x148368f8,0xd65e2287,0x8ed68432,
  116354. 0x6f5bc5f8,0x14028306,0x4ec3479d,0xe6cf3121,0x9326db70,0x96db6f44,
  116355. 0xca32936b,0xca5ac098,0x2fea21af,0x69e248c7,0x0000004d },
  116356. { 0xa71269fb,0x0aa89092,0x18650b60,0x2f6bdba8,0x9fb55db2,0x1d9cc2a3,
  116357. 0x6311e9d0,0x0fceb0df,0x90ac2c1d,0x6faeb79c,0xcb1f372a,0x2393b222,
  116358. 0xbc8c4193,0x62a6f3df,0x2fe8e674,0x9dea30b2,0x00000001 } },
  116359. /* 162 */
  116360. { { 0x12b3118b,0x7df689ac,0x6cb6ea56,0xd06ee39d,0x187cd978,0xcfcc22c2,
  116361. 0x8d537d87,0xb985b681,0xe9f56db2,0x75845152,0x5e098c15,0x0f839871,
  116362. 0x3b212cd2,0xbe96a5c8,0xd9ac1c47,0x3dda0338,0x000001fb },
  116363. { 0xcfa0a9b8,0xf06b7fe0,0xe22dcf75,0x9478bac7,0x136887c8,0xf3815e04,
  116364. 0x914c54bc,0xed811dde,0x0f51ea64,0xc8c24160,0x4c870577,0x63914d83,
  116365. 0xa8abbcb4,0xed24e552,0x2644f52e,0x9e5eb9e8,0x00000001 } },
  116366. /* 163 */
  116367. { { 0x66d52313,0x1f65a04e,0x4d3f72bd,0xfd694545,0xa6b7ae11,0x2bc0ddaf,
  116368. 0x571ab247,0x921f79d8,0xae5a8d68,0xd4c5f966,0xaec5ce13,0xfde17716,
  116369. 0xb764bd39,0x70e6eda4,0x990d6783,0xffe94085,0x000001ef },
  116370. { 0xd88f92e8,0xf3fa0e27,0x9c77123c,0xa21ef0fd,0x89274dba,0x6259974c,
  116371. 0xb9ba2762,0xd4cfa4a5,0x46ebcaf6,0x10c909d2,0x8f8e2870,0x0317a10d,
  116372. 0x453aeea2,0xb0771de1,0x68c6b0a3,0xdf0c4791,0x000000ea } },
  116373. /* 164 */
  116374. { { 0x4c854477,0x11bc1e48,0x8638e47c,0x2bec25b4,0x869c54d9,0x43d4e02b,
  116375. 0xbe1e7ed2,0xe318de32,0x6b460c4a,0xf5471eb0,0xaa426afe,0x38ae7bf3,
  116376. 0xd8452dc1,0x23ae26dd,0x5782de9d,0x9d3fc1d5,0x00000164 },
  116377. { 0x0ade1979,0xd87cae31,0x3b4bc728,0xa847041d,0x56c3c9be,0x38923c40,
  116378. 0xd74ae467,0x36fe182a,0xecbe49ae,0x92bff6f4,0xdc41f9f5,0x6680db80,
  116379. 0xe4630715,0x35bac06f,0xd6d07307,0x6d68b4c7,0x000000c0 } },
  116380. /* 165 */
  116381. { { 0x854dfcf2,0xdbe22be7,0xa6ae3bd0,0xee21a7df,0xa521ec46,0xf4633ad1,
  116382. 0x41a9484c,0xee94527a,0x2aa123f3,0x1145eb9b,0xcae3ca92,0x5634a82a,
  116383. 0xfc85d925,0xe176aca0,0x19082d8c,0x504cf7fc,0x00000078 },
  116384. { 0x3799793c,0xd74ce7c4,0xb5519fb5,0x74ddd618,0x95ff9808,0x2cf6df93,
  116385. 0xb8bf61e6,0x00ea45d1,0xdcfcf54f,0x26863613,0x030035b0,0x67423b76,
  116386. 0x4028a9cb,0x9fbc7534,0x051a077e,0x7b52ce37,0x000000f4 } },
  116387. /* 166 */
  116388. { { 0x96bec962,0xebf7d8ad,0x17e0107a,0xd1cc81f6,0x214e1058,0x64c44509,
  116389. 0x42394c9f,0x6c298c43,0x1a660513,0xd910052d,0x90df8243,0xc3643754,
  116390. 0xfe5cdea4,0x2313be1e,0xd27fb7b1,0x249a60f7,0x00000076 },
  116391. { 0x1cf593a0,0x74975838,0x8364c59e,0x0c9ceefb,0xe05c9991,0x2f5a1333,
  116392. 0x421808e3,0x30ea5e1f,0x4f5e8f4f,0x56fb3a4f,0xb6c0cb47,0x2cae6e2e,
  116393. 0x08bdcc6a,0x60b307fd,0x0ff8c117,0xee17901c,0x0000001a } },
  116394. /* 167 */
  116395. { { 0x89aa9e14,0xc048336b,0xf676700f,0x66634271,0x906b6980,0x4daa0433,
  116396. 0xebb7ab23,0x30247ee1,0xeb59a053,0x969b4aa7,0x8000f4d5,0xd78ef825,
  116397. 0x46026b5b,0xe5db38eb,0x7d6856c4,0x06a43e5d,0x0000003b },
  116398. { 0xed2a0ee7,0xaa0ae838,0xf16e8813,0x04bbe528,0x4ea64137,0x8ab6df5c,
  116399. 0x06e29867,0x5be80cb6,0xf459ed2b,0xf19b1b72,0x1761521a,0x7a9cce4d,
  116400. 0xaa516f3b,0x39aff994,0xb3416925,0x97d92e86,0x00000007 } },
  116401. /* 168 */
  116402. { { 0x5af3a8ca,0x25aeede1,0xa5c351ec,0x33924782,0xf93ec080,0x41e7a3fb,
  116403. 0xe6f425b4,0xb04f93c4,0x81e76009,0xe4ec12ec,0x5180ffc6,0x797366d4,
  116404. 0x0e0aef3a,0xd293cbb5,0x68d71d91,0xa1496944,0x00000061 },
  116405. { 0x675a67a1,0xf52c541c,0x8f5fe906,0x67d38d30,0xf6be988e,0x2a70bccc,
  116406. 0x18589886,0xae03ecbe,0x7067045b,0xecd02616,0x10ca8d96,0x1facdd99,
  116407. 0x30c0735d,0x7aa10a82,0x3328f21c,0x2a27e554,0x00000015 } },
  116408. /* 169 */
  116409. { { 0xe6057e27,0x3dd609e0,0xc7a454da,0x87e8b6a7,0x1f32dd5b,0xff599145,
  116410. 0xd0ef51e2,0xea397a88,0x25567546,0xc49866a1,0x3228b480,0xea45c8b1,
  116411. 0xdd01997a,0x3dbe0e77,0xc51867d2,0x0e2ea28f,0x000001f8 },
  116412. { 0x69d0820b,0x6295412d,0x1ea65a18,0x03173127,0xeb06380d,0xc27c8221,
  116413. 0x75fe9706,0x7ffd4efc,0x5a71d250,0x7b396a57,0xc7cb7543,0x61c80051,
  116414. 0xad4dbee3,0xe07db4d7,0x9b192d45,0x1c7481f4,0x00000143 } },
  116415. /* 170 */
  116416. { { 0x08e1cc4d,0x5eab2d04,0xad2dc1ee,0xe93758d3,0x5c9c7393,0x0ceb7dfe,
  116417. 0xd3379683,0x530d86a9,0xe24f86d7,0xef5283ca,0xf0b1bb0b,0xab5d1a64,
  116418. 0x54db4e3c,0x96aabc1f,0x3bc00c59,0x3e3d87cc,0x00000144 },
  116419. { 0x1d60e7b0,0xe50a8213,0x5d33d018,0xfc9b629b,0xfd05338d,0xc54aee42,
  116420. 0xe821c6ea,0x0678f2c0,0x06ac09cb,0xe5c9d75f,0x53018df6,0x83357513,
  116421. 0x0bf8c667,0x81ca6fac,0x9d0ae2dd,0x7fc8020e,0x000000e1 } },
  116422. /* 171 */
  116423. { { 0x1baaa5eb,0x8add4741,0x79bd8036,0x02cbb759,0xcdffed22,0xd8680c40,
  116424. 0x4e091141,0x1c23a8f0,0x20748b87,0x65d141ed,0x659e9289,0x586a1575,
  116425. 0x5006dbfe,0x7c68d7cd,0x22569a74,0xda0ad0df,0x00000148 },
  116426. { 0x7f9069d7,0xc8fcc5db,0x5c0531a4,0x2487d245,0xe9a2db3a,0xc5ab4899,
  116427. 0xb4fe9720,0x52bfd538,0xd27f35e4,0x73a04ca4,0xee2dac93,0x7cbbc549,
  116428. 0xff3ee7e2,0x0287229d,0x28da9360,0x3179878d,0x000000d0 } },
  116429. /* 172 */
  116430. { { 0x3b66c047,0x89b7e9bb,0x602a3e1d,0x22e65869,0xc8db9c00,0x44f82297,
  116431. 0xd08a74a3,0x0e76aca3,0xfcd398de,0xfbf1a71d,0x8320e66a,0x2fbb6eaa,
  116432. 0x179c9fc5,0xa82d0ebc,0x4e7ab2b4,0x4e00cf6f,0x0000000f },
  116433. { 0x4890c439,0x424c0e9a,0xbc35a6b2,0x37564a2b,0xd9b7497d,0x95a4479d,
  116434. 0x612de942,0xa1ff3f0d,0xe60d0033,0x358627fc,0x522417da,0x815da8c0,
  116435. 0xef6b8385,0x506104d4,0xf16e96aa,0x800728d2,0x00000120 } },
  116436. /* 173 */
  116437. { { 0xab039042,0x976f2372,0x9fa084ed,0x10e6978c,0x58bec143,0xd03fdd2f,
  116438. 0xfe2045c3,0x3200c101,0xb0a5a928,0xe6868f7a,0xe61faff8,0x26c95d1d,
  116439. 0xb7b12265,0xa1e20127,0xc2a5ed17,0x8e63dd78,0x00000089 },
  116440. { 0x22bba4ee,0xbb6533da,0xf496a574,0x3eff6397,0x14f2a6b9,0x409329f7,
  116441. 0x1dfdd73f,0xa08248bd,0x69bca1b1,0x62f33f2e,0xba2e0327,0x9a177e64,
  116442. 0x75ddf741,0xbc50e993,0x4a56bd1c,0xb87a979f,0x00000095 } },
  116443. /* 174 */
  116444. { { 0x67c1f177,0xe83736a9,0x600133c9,0x1b6d3508,0x6eac9a5b,0x9424bb92,
  116445. 0xc27ef31c,0x7a9c01a6,0x122b4870,0xad93bba5,0x9d1ac985,0x9eb94e2a,
  116446. 0xd53f175b,0x511c0206,0x5102d914,0xd13eb252,0x000000b1 },
  116447. { 0x675a1171,0xcfe7dbeb,0x16c0d2b1,0xb228295c,0x057c88ca,0x8db25b5a,
  116448. 0xd300e9cf,0x73ea9e96,0x269552eb,0xb0e0037f,0x9e0f98df,0xea9d035c,
  116449. 0xd290480f,0x860e49b8,0xc036b319,0xa35e9512,0x00000037 } },
  116450. /* 175 */
  116451. { { 0x8f00df48,0xc56729ee,0x11ac8304,0xb89ca7b6,0x8b3a8123,0x497a57f9,
  116452. 0xc21ca3ea,0xe0431b19,0xe2bb3ce7,0x45a73deb,0xadc77819,0x2f86cc2b,
  116453. 0xe5eb3df1,0x5ff005e4,0xdd27dcf0,0xf955dd7a,0x0000005e },
  116454. { 0x00ee402f,0xe0c22ffa,0x3b30bb4c,0x5b335e2a,0x643cb101,0x542551d0,
  116455. 0x3cd19688,0xc6183f45,0xf0be54b4,0xc6664f22,0x4c20cde4,0xa5f4cfee,
  116456. 0x80a4c475,0xdcaa972f,0x59111ed9,0xde4af200,0x0000019c } },
  116457. /* 176 */
  116458. { { 0xd771f428,0x9e9d0bc8,0xe43ca382,0x3ac1ecd9,0xeb93acf0,0x8d5ee480,
  116459. 0x065a2a3f,0x16232f81,0x2f0b8a73,0x1fc04faa,0x025474a2,0x4a8df7e7,
  116460. 0x3bb15f6f,0x51ac4ff2,0xe0950e52,0x66e21b73,0x0000006b },
  116461. { 0x67a41dee,0x59c98480,0x7b3e2b3f,0x2cfa95ae,0x891454e1,0x54d98386,
  116462. 0xeefca6a4,0xf0dddbdf,0x11e9cb75,0x5f691b24,0xfef208c3,0xa9b9e766,
  116463. 0x18b33cf6,0xe8df1000,0xd1c174a9,0xb8a55ac9,0x000001c4 } },
  116464. /* 177 */
  116465. { { 0x5c4cccb8,0xa99f5862,0x2ef4d3ef,0x70bf5209,0x89efc878,0x28f4e576,
  116466. 0xda14206e,0xa2366f96,0x7c52107d,0x90331a00,0xd4a0f0f0,0x478d4cea,
  116467. 0x472a47b0,0xb2899ee2,0x64207549,0xae96534e,0x00000110 },
  116468. { 0xcced05b0,0x2cc1d655,0x01759543,0xabac3f09,0x8e577cd7,0xbaeb70a4,
  116469. 0x40e98d6d,0x84b00893,0x603d24f1,0x26983653,0x2572173d,0x6e145883,
  116470. 0x611141de,0x1d348b26,0xefa27f34,0xe52257dc,0x0000006b } },
  116471. /* 178 */
  116472. { { 0xc947e655,0x92678f33,0x08923795,0xff0fb76a,0x790239d1,0xb2dfe745,
  116473. 0x3cdbb7ce,0xea087492,0x05f6d41c,0x21326db9,0x79dc5588,0x5b1ae9ae,
  116474. 0xe9c31702,0xe145340c,0xa2c38a9c,0x07502c29,0x000000c3 },
  116475. { 0xc156ace2,0x0c124f11,0x79ff2529,0x2c170fe7,0x6e1171b2,0x60df9a81,
  116476. 0x55de2797,0xa19bca83,0x7c6cc79d,0x1ad927ea,0x1d61f770,0x28590112,
  116477. 0x261c06bb,0xfe80c826,0xaa2642bb,0x4050d338,0x0000015e } },
  116478. /* 179 */
  116479. { { 0xeaad87bc,0xc9397829,0x81e84cbd,0xe0ac9367,0x6ade4fde,0xb579c24d,
  116480. 0x690d7f56,0x50b9aba5,0xd14fb0b9,0xf09b29d3,0x25a0e7b6,0xd0684f23,
  116481. 0x606f4ff3,0x0514e9d3,0xe8ad733b,0xe63bdd26,0x00000077 },
  116482. { 0xe0d25c6d,0x0afd06ec,0x00ba2dcf,0xdd90021a,0x8c5bb398,0x1b025770,
  116483. 0x198ff8fc,0x077f06d8,0xb7e2cd68,0x87d50ff1,0x263a3572,0xef75e057,
  116484. 0xfa925a9a,0xbf257892,0x739d0e95,0x847d3df0,0x00000111 } },
  116485. /* 180 */
  116486. { { 0xfec82924,0x52ab9cc7,0xa7220d69,0x1c76dd69,0xa06ef0e2,0xa63527de,
  116487. 0x27183904,0xab3e51c2,0x716807c8,0xf4db35ea,0x748f1246,0x8f3ede0a,
  116488. 0x41156095,0xf1493644,0x874b38de,0x5f6583d1,0x000000f7 },
  116489. { 0x0b927eb7,0xa39189e1,0xc2e2f127,0xa87c6359,0x7fe966f4,0x0b72c233,
  116490. 0x105e5585,0x102b8382,0xe58c39f9,0x63fee006,0x991b5329,0x3f052ee3,
  116491. 0xcbaff97b,0x7f5b854c,0x5f805060,0x935e5f6c,0x0000016a } },
  116492. /* 181 */
  116493. { { 0xdfd88d38,0xf19a0355,0xc549df40,0x555cd8e3,0x04d006e1,0x322729e3,
  116494. 0xfd0b0ce6,0xf16b706c,0x35f2ad31,0xf156dc09,0xf7a3df9f,0xb30c5213,
  116495. 0xa55e5fb5,0x9f29cc92,0x2b858da2,0xa0ecfdd4,0x00000144 },
  116496. { 0x52658a92,0xb5c115df,0xc4281616,0xbce3ed17,0x7fd92a91,0xa5595f70,
  116497. 0x9cd5d896,0x663c8bfd,0x5a9472b1,0x0776343f,0xb033e1bd,0x14e44ca8,
  116498. 0x1e5c02fb,0x27a1c986,0xcc4ffb32,0xece0f2c4,0x000001b5 } },
  116499. /* 182 */
  116500. { { 0x31211943,0x17127bab,0x5684325c,0x44a8cac6,0xd855fc3e,0xd2fe0b88,
  116501. 0xce91eea5,0x47abab0c,0x78ec7d12,0x5d23ddc4,0x0cd9fefa,0xa3986de7,
  116502. 0x82655766,0x32c7b867,0xeeaec7fa,0x3e54018b,0x00000087 },
  116503. { 0xb38d17c1,0xc96e86f2,0x71fa040d,0x9cbfbd0c,0xf88499cb,0xe111ab79,
  116504. 0xf71ec80b,0x1d47c5ce,0x46c89692,0xacaa3bc1,0x3d316331,0x5f921c0e,
  116505. 0xe768765b,0x31fa081e,0x41eff270,0xd5dafd5f,0x000000fe } },
  116506. /* 183 */
  116507. { { 0x4cda1348,0x8af10b9d,0x25c3013a,0xb0769fd2,0x8957c22b,0x450aa5b1,
  116508. 0xf5acf1c4,0x5cafd6c7,0x9fef8029,0xcf71a140,0xee089f5d,0xe12029f5,
  116509. 0x0fbd2ba8,0x9752a8fb,0x6f70cb58,0x61e2275f,0x00000090 },
  116510. { 0x1fbda16a,0xb70a4ac5,0xf1dfa2a2,0x79910e79,0xd9945f6f,0xba2ce132,
  116511. 0xeb4ba4ef,0x450d59ae,0x4bf2d53d,0x6a8e09b3,0xe620c7a8,0x76010204,
  116512. 0x0a53c6f4,0x63f8943d,0x87eaf56a,0x14c91d19,0x00000132 } },
  116513. /* 184 */
  116514. { { 0x490d66c3,0xe54fb120,0xa0dc8204,0xeaed7328,0x04b4294d,0xba014c38,
  116515. 0x31ddc467,0x3f2fa2ab,0x8342ed11,0x70ff55ea,0x23034e0e,0xb18da72f,
  116516. 0xbd8ae3c1,0xadc30dbe,0x3e945a02,0x179bdf6f,0x0000009c },
  116517. { 0x7484c26f,0x46c928ef,0xef2adbb1,0x206b7db1,0x3f58dda7,0x0887f548,
  116518. 0x4bc7edb6,0xfde4e20c,0x975cafdc,0x484d121d,0x86beec20,0xc5b59670,
  116519. 0xa6d6db67,0xb579aa88,0x41187488,0x22c6d87e,0x00000015 } },
  116520. /* 185 */
  116521. { { 0xc471d4ae,0x0a890757,0x43a1da76,0xfef4b1a5,0x6aa701a1,0xb892b182,
  116522. 0x59c65f93,0xbf4d4e52,0xd789df35,0x923af929,0x0b79c3f2,0x3ccb46c6,
  116523. 0xcf4cf130,0x95582ce7,0x257f0ec4,0x7da081b4,0x0000011c },
  116524. { 0x9aeef274,0xf92c6ae5,0x1437c083,0xe6c5bf4f,0xe13c86af,0xaa74b023,
  116525. 0x2a225360,0xd21dace6,0x22589fa5,0xb3d572b8,0xdfa74b0f,0x3d4a3916,
  116526. 0xb12891a9,0xe76cd8dc,0x59f4cfbd,0xa0391a3f,0x0000019a } },
  116527. /* 186 */
  116528. { { 0x203fc3f1,0x054ba69e,0x62106a29,0x09168ccb,0xaad5fa9f,0xb0818540,
  116529. 0xbff7ed6f,0xecb8f20e,0xbef94afd,0x2c80a618,0xb0abd1db,0xe25d8ca0,
  116530. 0x028e0a7c,0x75e67a41,0xd6e95b9a,0xdd7662dd,0x000001b2 },
  116531. { 0xf289d7ee,0x87dff279,0xeea2205c,0x4d755d59,0xc18adac6,0xaeb0fd54,
  116532. 0x7ec01019,0x3a8c46cf,0xb48d70a4,0x6fc90e7e,0x10b39ef8,0x965c53c1,
  116533. 0x38545a20,0x455777cc,0x57dd023e,0xa33430f7,0x0000016e } },
  116534. /* 187 */
  116535. { { 0x0ff53d2c,0xfa9f3949,0xb00349b9,0x8dc91596,0xd5997967,0xf10a5014,
  116536. 0xa8a6b78a,0x4dd72dab,0x8b517b10,0xef5de540,0xa6d39be0,0x142b90bc,
  116537. 0xeda17f70,0xcaeaa3e9,0x06b31118,0xa01689d6,0x0000016d },
  116538. { 0xf46afff7,0xea6ca563,0x34a5e5f3,0x3945c7ba,0xaa998fd8,0xc1ffe4c8,
  116539. 0xb63f535e,0x42a60146,0xd1f509e5,0x50816888,0x9f8cd0db,0xd1918daa,
  116540. 0x78a36772,0x6505e6bb,0x9cc6dc66,0x4ab03a81,0x000001ef } },
  116541. /* 188 */
  116542. { { 0xd376d986,0x06089d14,0xa2dc35b0,0xd0f4e077,0x53ff2c86,0x1c11709a,
  116543. 0x123c3fc8,0xfef4ba45,0x1b656fc2,0x852cd5a7,0x1fefa8bb,0xb57c7489,
  116544. 0x48110b77,0x8f05383e,0x52c5a129,0x4b55d3ad,0x0000004c },
  116545. { 0xf3827633,0x5110cff3,0xe00afe96,0x086784d5,0x3ead32fa,0xcb387882,
  116546. 0x2b91cd86,0x3dcf4d16,0xe6f3638a,0x078b6a58,0xe8b7fd42,0x33792112,
  116547. 0xee5683e7,0x6964044d,0x28e28433,0x3b84210f,0x00000122 } },
  116548. /* 189 */
  116549. { { 0xc3ebeb27,0x6c28a9a9,0x3ef590f8,0xd7bcdcb5,0x4dae7f37,0xe88a2e11,
  116550. 0x726ea7c9,0x033522e4,0x8c141388,0x99d50386,0x61621575,0x59b1aeca,
  116551. 0xfcc564d8,0x719fcfeb,0x1aeb8e36,0x3a577af1,0x00000043 },
  116552. { 0x6feba922,0xc3f26ce0,0x475a5693,0x5f6c83ee,0x28bf378e,0x7f796740,
  116553. 0xbdc3f6f1,0xd2a5e368,0xa6ed90ae,0x3d034a0a,0x4a47cbd5,0x3b1c3a4c,
  116554. 0x4dce2bc8,0xa4f0aa6e,0x74ca00eb,0x97c7af43,0x000001c0 } },
  116555. /* 190 */
  116556. { { 0x79c28de7,0x00377178,0xab9c330c,0x617aa2aa,0x66bc61eb,0x43081826,
  116557. 0x4d78b504,0xe0b5b5cf,0x9870fc72,0xd76a752d,0xd40b7bc5,0x3b4689f5,
  116558. 0x87f2d03a,0xa97fd867,0xfd6060a9,0x6ab7b5ee,0x000001c0 },
  116559. { 0xffb71704,0xe99eadb1,0x390fe3b1,0x436e58bb,0xab4f19aa,0xeecab82c,
  116560. 0xe0f3d9dc,0xda492dfa,0x6e20ad12,0x2a0f54bd,0x7dbbd262,0xaf89fa0f,
  116561. 0xe8d2eb54,0xdcc50a1a,0xef7d0758,0x9799f816,0x000000b7 } },
  116562. /* 191 */
  116563. { { 0x104f98cc,0x9ec46462,0x72aedeae,0x45115922,0x7e62186f,0x7ae93dd0,
  116564. 0x8d6d69b6,0xd17ce026,0xfd43a8f3,0xb5347608,0x7c0ab797,0xe87f1c13,
  116565. 0x139f991d,0x3bf597a8,0xe547e0d6,0xe293a85b,0x0000008d },
  116566. { 0x8ef668b1,0x0982add3,0x611c9764,0xc54e6b2d,0x1c1d4263,0x3ce76b12,
  116567. 0xeff64e73,0x3134b28e,0x2871612a,0xaf71a9ac,0xba093594,0x31c88af2,
  116568. 0xba9108e8,0x0b649112,0x5cf437da,0x8febc5c5,0x00000113 } },
  116569. /* 192 */
  116570. { { 0xc4a2daa2,0x7e9ca589,0x400f608c,0x18ea703c,0xd5175103,0x6f8cd058,
  116571. 0x4abb6f29,0x26493472,0x94296ab4,0x0be553e1,0xac51657d,0x9af9398f,
  116572. 0x4f880ea8,0xe232deec,0x67b1e1b1,0x2f81761e,0x00000137 },
  116573. { 0x3a20f662,0x51014bc7,0x49ed9502,0x1fb7e77c,0xb62b9652,0x89f5096f,
  116574. 0xa2e8d37e,0x3a659c67,0x5804170e,0x0f2b2a26,0x9ed50a34,0x1674fce6,
  116575. 0xfdc3c00f,0xaaa4537e,0x4ce99d93,0xf3c3bfda,0x00000198 } },
  116576. /* 193 */
  116577. { { 0x81614189,0xbab1f5cd,0x24b259f7,0xc7d56c45,0x45fb415e,0xc7baa4b2,
  116578. 0x7af6bef9,0x302bc8dc,0x74b48e82,0x91b770e0,0x9b6d1b1f,0x4a1336e0,
  116579. 0xe6680c97,0x285c1357,0xc7ccb625,0x59bcb813,0x0000012d },
  116580. { 0x7c019927,0xddad83b4,0x630dfd5b,0xe10f2667,0x31e05d23,0x15dbec5a,
  116581. 0x456ac460,0x2aa6e5fa,0x243cac82,0x46956529,0x4dc8c9e9,0xc69c9c7f,
  116582. 0xe24a4065,0xadb27e09,0xae41301b,0xdfa7a34e,0x000001cc } },
  116583. /* 194 */
  116584. { { 0x59cb1a7d,0x176a864d,0x6aefb8ee,0x4d864ca3,0x1c22b0d8,0x0ee83acb,
  116585. 0xd980df1d,0x7e80a6eb,0x7f94ced9,0xf582acc4,0x3a72c115,0xa29cd123,
  116586. 0xc7107bb7,0xce12a2a8,0x4ed80a30,0x0229ca56,0x00000150 },
  116587. { 0x2f1c180b,0x9774bad5,0xd749aa10,0xd08be998,0x56dbd1ba,0x978c48ab,
  116588. 0x0afbea9a,0x6ed3e3e4,0x153dc5fc,0x8a8be97b,0x9be93ed0,0xadc7f095,
  116589. 0x2cee23bd,0x8d242908,0xdc2729de,0x417523c6,0x00000016 } },
  116590. /* 195 */
  116591. { { 0x6c14a31e,0x74eeccf1,0xb2de3c2d,0x488e2534,0x7cec43c3,0xf9bb3599,
  116592. 0x916ac936,0x4210459d,0x9f7e4400,0x71d15c02,0x44553583,0x8c9c7c12,
  116593. 0xec94a467,0xcc97548d,0x3167bad9,0x4ca67818,0x0000014e },
  116594. { 0x8d0312bf,0x033af055,0x54161e66,0xbd1bf4f5,0xfa41781d,0x259945a7,
  116595. 0x00eef1d5,0x33494da8,0x79c3b8d0,0x6c505ec0,0x1c9f6e69,0x70ae1ade,
  116596. 0x76830aaa,0x0288f0c1,0xa62a060c,0x7f4cfe3b,0x0000000c } },
  116597. /* 196 */
  116598. { { 0x057d6006,0x0d8b447d,0xfd71c8b0,0x38b976e6,0xabcf40f5,0x5e77e029,
  116599. 0xf103a783,0x13bee386,0x5e472c4b,0x20a6ac20,0x31fcb194,0x43b045f6,
  116600. 0xc00abf49,0xe5dc1d9f,0xa5556b79,0x28c0bc70,0x000001b5 },
  116601. { 0x8a8640b8,0xba9d07ee,0xd0e34012,0x25611023,0xbe24ae89,0xc7ce655b,
  116602. 0xfa579dcd,0xe358e524,0x377bbfe5,0x57ce2715,0x3c0947e4,0x64651c6c,
  116603. 0xf4a97826,0x5fbd8d50,0xe2e1c15a,0x6fcdd28f,0x0000008d } },
  116604. /* 197 */
  116605. { { 0x5c7202c8,0xb564a2f6,0x5a54b0d8,0x7d634052,0x1434fbf5,0x8414d672,
  116606. 0x1d9830a3,0x8114215e,0x5ef0fbe1,0xc7a758d5,0xe6f57f9f,0x5705dcf8,
  116607. 0xd92269d3,0x5dd49a56,0xbdb49f97,0x8f015d7a,0x000000f1 },
  116608. { 0xb4799ce6,0x07131110,0x2cbcb7db,0x35bbfb99,0xf7ba21e2,0xc1f00c9f,
  116609. 0xb18f49fe,0x009d6913,0xabcf959b,0x8da61951,0x0d42146e,0x0e687213,
  116610. 0xae5f23f1,0x55832817,0x9ae7386b,0xc9b5bb68,0x00000143 } },
  116611. /* 198 */
  116612. { { 0x48c74424,0x423328db,0xd19cb2eb,0x32616e11,0x40d6e217,0xe534192a,
  116613. 0x0cbdc752,0xdd83a94c,0xd733bb01,0x5c623050,0x5b7a4520,0xcd0d631a,
  116614. 0x9a4011c8,0xccdc0a25,0x646e7cd5,0x22f112cc,0x000001e6 },
  116615. { 0x3e1e4c4b,0x47d6e29a,0x9fb1548a,0xd5f82538,0x4fd3e319,0x7e3705b5,
  116616. 0x0a08b966,0x8c4ce59a,0xd8cbe8db,0xbca749e7,0xaeec3d75,0xcc4496ea,
  116617. 0x8a1a313d,0x17dc723a,0x8ceb9360,0x250ff77a,0x000001a5 } },
  116618. /* 199 */
  116619. { { 0xfe29bd79,0xa55a0726,0x4f990b34,0x6574a810,0xaad56983,0x6906946d,
  116620. 0x50d41fef,0x0e580ab9,0x6e6f7f45,0xbc75b514,0xf0f3718a,0x508cc97b,
  116621. 0xa5634087,0x51ba2ca4,0xe64d8910,0x75c39077,0x00000172 },
  116622. { 0xf77ca6bd,0xf37cccaf,0xbdb18df5,0xe0a0df41,0x019e01f7,0x9f46cff8,
  116623. 0xaa65d72b,0xbe4f3d44,0x6e3663e9,0x7822d8ac,0x3ef9db6d,0x5f37f922,
  116624. 0xabe4a9aa,0x7f0ad39d,0xf69cc8ba,0xa0a57c70,0x00000098 } },
  116625. /* 200 */
  116626. { { 0x00fd5286,0xd9c50cf4,0x72a4b03c,0x1ea5b9d5,0x051ae73e,0xf5e60f9e,
  116627. 0x951b3824,0xfe9b5142,0x9fb4d667,0xb034b2d0,0xedc50856,0x4b537a80,
  116628. 0x8cb0022e,0x69ee1012,0x6a548aee,0x7c8b9e5c,0x000000ed },
  116629. { 0xd933619b,0x746007bc,0x2b9dfe19,0x0ce7668e,0xcc6e2a2e,0xa9eed5d3,
  116630. 0x7eebf32f,0x35a14f5f,0x67cc4f64,0x75cb898d,0x7850c16c,0xcb2185fc,
  116631. 0x45f79c96,0x09874a76,0x27db4744,0x7468f8ae,0x00000139 } },
  116632. /* 201 */
  116633. { { 0xc88684f6,0xc5de68ad,0x619a7dbf,0x7c1edaab,0xb27a18f5,0x258d1735,
  116634. 0x8ecd89eb,0xb27e7b65,0xd879f7ea,0x3d8889c6,0x67d5befb,0xa8fdc96d,
  116635. 0x37bad73c,0xc84d86ae,0xce8e56d7,0xc7e91976,0x000001a4 },
  116636. { 0x6319ffa6,0x5001a540,0x134ec04c,0x0cae64ec,0xd541242c,0x1f69a96c,
  116637. 0xbf2caeee,0x9da259ee,0x28bee805,0x88e7978c,0xb8e890e4,0xe9484beb,
  116638. 0xfb227fd9,0x0e5246d0,0x625d6318,0x8be2a54a,0x000001b7 } },
  116639. /* 202 */
  116640. { { 0xf472f13a,0xa223554a,0x5733e91c,0xfac993b7,0x96c168a2,0x26afe9f0,
  116641. 0x4b127535,0x7cfe761d,0xe77070ca,0x84301873,0xc7e7cdf6,0x66b6aaad,
  116642. 0xa1562ed4,0xda2dd5ea,0x39faf8d8,0xa81a2e00,0x00000016 },
  116643. { 0x4e3de3bf,0xa880759c,0x52f3088a,0x0c1e2e11,0xaa7eba5b,0xcb2ded9a,
  116644. 0x9f9c11ca,0x4c65d553,0xb0dc5c19,0x0ab9bd87,0xca3f4b61,0xd32f8c96,
  116645. 0x28cb5f9f,0x49842fcc,0xb90e21df,0x31ae27cc,0x000000f4 } },
  116646. /* 203 */
  116647. { { 0x6a0ccd0a,0x3b2a0a0d,0x5993b555,0xa3eeec82,0x9de672a6,0xb13486fd,
  116648. 0x0da05dcf,0x8d9c5148,0x6739874d,0xc4aa444d,0xe29a35c9,0xd9cf35b2,
  116649. 0x89177ead,0xd6bd9b5f,0x2a0470a1,0x9af0f59d,0x000001d6 },
  116650. { 0xba7535fd,0xb2f844c7,0xa842ff39,0x45bd4c3d,0xe951974b,0x5fe149ed,
  116651. 0xfd4453ec,0x6982e997,0xe6c37c0e,0xa63f705d,0xd2c3ef6a,0x09b0f6a9,
  116652. 0x1776a8d6,0xbedd3586,0xede11b78,0x4048a46a,0x00000176 } },
  116653. /* 204 */
  116654. { { 0x51a251d1,0xa47c6ee5,0x0d279dfd,0xbef4bf12,0xec518a28,0x4c2d538c,
  116655. 0x3880be6e,0x1b2b7887,0x1be9b20b,0xc69ccf8e,0x3796a19e,0xe41dfeae,
  116656. 0xfb50bdea,0x25676fc9,0x03e180c0,0x8b815a05,0x0000016a },
  116657. { 0x53f5ef65,0x2ca085f6,0x77b25105,0x61dfbbf9,0xa3346fe6,0x88ea87e3,
  116658. 0x1b95f7ef,0x25ddfdee,0x5b65eaec,0x22074e69,0x4c2e023b,0x11869a15,
  116659. 0x42e83bb5,0x8601b577,0xfa877e7d,0x1464652c,0x00000015 } },
  116660. /* 205 */
  116661. { { 0x57fa58f1,0x250853c8,0x4ca4c670,0xb58a4e68,0x1b81f40d,0x07b96d0a,
  116662. 0x558e8cbd,0xa4651e10,0x42e388cf,0x1a64046e,0x44436088,0x51b0d539,
  116663. 0xe26b8fd0,0xc2bf35b3,0x5702cfce,0x4ae78709,0x000000fd },
  116664. { 0xdf53d498,0x3c79bc29,0x1137f624,0x4cf31c4e,0x17a3cedf,0x93b6856c,
  116665. 0x6cd9115d,0x2461131c,0x9228cddb,0xab30a453,0x8d202bf1,0xe97757b6,
  116666. 0xe6108612,0xa666de7c,0x4f6026b4,0xc200fe65,0x00000051 } },
  116667. /* 206 */
  116668. { { 0xb1a2b4b5,0xea96103c,0x843c0968,0x98dccbfe,0x986ffb5b,0x6a37072d,
  116669. 0x169d3ac2,0x2fa07af2,0x771371f1,0x8bb85b9a,0xe7c299ef,0xeae10d34,
  116670. 0xe2372efc,0x3d4bdc69,0x8dd856f1,0x378df75d,0x00000039 },
  116671. { 0xde7ff5d9,0x31e902ff,0x325a09ca,0x0e9a85d2,0xf4192fcd,0xd71b93a6,
  116672. 0x15b076b3,0xf52a5737,0x6e711d1c,0xd726aa86,0x2c292819,0x0b61b1df,
  116673. 0xc8015de6,0x224e575c,0x18b79e47,0x68e893e1,0x000001dc } },
  116674. /* 207 */
  116675. { { 0x6ffeda73,0xb7924ff9,0xa0da2018,0xe709f406,0xf89584df,0x368e20ea,
  116676. 0x8355a040,0x0095112e,0xfd777d7c,0x259d4528,0x2bf8f2c8,0xb0c49565,
  116677. 0x44c5311b,0x7f631928,0x8466d9d5,0x698d0e4f,0x000000d5 },
  116678. { 0x015d204d,0xe10d64fa,0x6dd10c53,0x7b626bfa,0xa7698c94,0x087f8e63,
  116679. 0x05337a56,0x525a6547,0xdf5c782f,0x558e2244,0x855fbaff,0x48aa1e41,
  116680. 0x47ee3830,0x48f2218e,0x138463d3,0xf2523959,0x0000004d } },
  116681. /* 208 */
  116682. { { 0xd8695310,0x76f4fd69,0x7e8768ea,0xe28eb09f,0xe0d532a8,0x039c1812,
  116683. 0xc572ac79,0xdda67744,0x785d6293,0x1f9800e0,0x3da76bb2,0x2bfe2a5a,
  116684. 0xa2bc7217,0x6ed15b90,0xd1788a8e,0xd80e61bf,0x0000004c },
  116685. { 0x16730056,0xb9f40370,0xdced3d43,0x46f45fef,0x1aa50742,0x0afd763c,
  116686. 0xff92ae73,0x21e5c652,0x1bb2063f,0x6ef0830d,0x12d22540,0x18306ecc,
  116687. 0x1f15001c,0x4edd9b3a,0xc0cc5424,0xe4eb25b8,0x000001f4 } },
  116688. /* 209 */
  116689. { { 0xa1db5c18,0xed61a714,0x7677074c,0x9454e61e,0x7bf685de,0xe970fbe5,
  116690. 0xd2145be5,0x221b0c53,0xee49a5f2,0xb931881b,0x14b11d03,0x00b91afa,
  116691. 0x3ec22137,0xc6aefe49,0x526200af,0x50554e94,0x0000013c },
  116692. { 0x7364c92e,0xd42c45e7,0x735218e8,0xe0500265,0x84d3f3c5,0xd281da02,
  116693. 0xdbf7646b,0x312f8424,0x485f304f,0xe1a88f2a,0x1127a513,0x583f5631,
  116694. 0x1a60e0bc,0xed7950c7,0x4b7b70a4,0x92855e10,0x000000c6 } },
  116695. /* 210 */
  116696. { { 0x644614e7,0x8d06185c,0x4749a424,0x2e906cae,0x2587e528,0x585412ea,
  116697. 0xd12857cd,0x3763990a,0xba5593b5,0x770c7f70,0xdd5d2a46,0xc2cf6dc4,
  116698. 0x3b69a1ba,0x564da456,0x187895da,0x639f7e14,0x000001c8 },
  116699. { 0xf8589620,0x05c96b02,0x41e44054,0x2fe468a3,0x096ad09c,0xbf22da11,
  116700. 0x9c652aee,0xbc73c298,0x547e1b8f,0xcdef9f8b,0x977dbf73,0x7073785a,
  116701. 0x7e13552d,0x0a92a1aa,0x3a393d3f,0x22761140,0x0000015b } },
  116702. /* 211 */
  116703. { { 0x1fbfaf32,0x89a5a7b0,0xbe661d21,0x5c5a62d0,0xf5e3b44d,0x47970f5e,
  116704. 0xf43bbf62,0x3ea001ed,0x260ae5a0,0xa8e74285,0x2697c62c,0xeb899ebd,
  116705. 0x751a7643,0x36a003e6,0xba0725a6,0xef178c51,0x000000ea },
  116706. { 0x9bd51f28,0xaacf8e9f,0xa8712044,0x39febbdb,0x5bfc8365,0x8780ad3a,
  116707. 0x10e6f08f,0x408a34cd,0x8241ab0e,0x8104ca10,0x98a662a1,0x843e71ce,
  116708. 0x232048d6,0x9dce8514,0x1cf3d187,0x5cba23be,0x000001fa } },
  116709. /* 212 */
  116710. { { 0x2973a15c,0x2fe8c9d2,0xd42979f3,0x66fec8dd,0x0b6afb3e,0x39af4a39,
  116711. 0xab65ef22,0x0bb1e436,0x66c5fcdb,0x8f26201e,0x5af4870b,0x3cffe8a3,
  116712. 0x2bb44e24,0x65ae286f,0x51dd1722,0xda2e283a,0x00000114 },
  116713. { 0xc1e3d708,0x4a9c9a56,0x1cb0efa6,0x4fe62d3f,0x97e87540,0xf0702984,
  116714. 0x3cea46fa,0x138b7d6b,0x83886263,0x0780634e,0x71c30909,0x27e84280,
  116715. 0xe5838647,0xf0af79d7,0xb236a267,0xc1b86582,0x00000104 } },
  116716. /* 213 */
  116717. { { 0xa526c894,0x32ff09ed,0x14ac7d23,0x95abf120,0x3cd92934,0xb6f94dcd,
  116718. 0x92e6b556,0xffaaeb12,0x1036c31b,0x193796ea,0x707ff32e,0xa9d237e7,
  116719. 0x829d67b8,0xd65a5b0d,0xdb29248b,0x48edb556,0x000001b3 },
  116720. { 0xded46575,0x6ee9f9b2,0xffa69acf,0x496ca08a,0xf16d37d1,0xd5aeb3a1,
  116721. 0x789e5d01,0x4a507db1,0xc827cc45,0x05e2ce29,0x2964e677,0x29b6e4a5,
  116722. 0x4c0e46f2,0x0563b0ba,0x4bc46485,0xe75c2448,0x000000a3 } },
  116723. /* 214 */
  116724. { { 0xd2f6615d,0x0fcb476f,0xd98da9a9,0x4b7f9b78,0xd2bdf107,0xe2fddf1c,
  116725. 0x9b956f31,0x2bda3086,0xb596eadf,0xf3cca2f7,0x355b2538,0x91c09f8b,
  116726. 0xc6c846db,0x46f3f6f3,0x2a14642e,0x9bb9398e,0x000001ff },
  116727. { 0xa17bd645,0x5118d4f5,0xdbd6d552,0x57033eab,0x734d0957,0x007e86fc,
  116728. 0x5f53c435,0x98ca065f,0xfd27dd19,0x9949d9bf,0x6952d1ca,0xddc4e304,
  116729. 0x81ac101c,0x84cab4fb,0x4a56b007,0x46d079f9,0x00000003 } },
  116730. /* 215 */
  116731. { { 0xa6bfdedd,0x95eb8e4f,0x7a74c6f9,0x993a285e,0x3d09a252,0x8bd5d4d1,
  116732. 0x19a5f767,0xeaa10be6,0x0cebb340,0xd3db083e,0x1dbf7a83,0xc633a78b,
  116733. 0xc30f23e1,0x2664bc3e,0x07a08379,0x6630f8f1,0x000001c9 },
  116734. { 0xdef86a80,0xbbf4cb4b,0x3f8259ab,0x1fa4ec78,0x609532c8,0xa4bf7604,
  116735. 0x8b909e92,0x71bb7acc,0x17884160,0xca1d7317,0xca1ab928,0x7f7f14be,
  116736. 0x5f8455a5,0xbfea016e,0xbf21e899,0x7b8c76b9,0x0000002d } },
  116737. /* 216 */
  116738. { { 0x4b9f8e7d,0x46860563,0x63fc58a8,0x201176b7,0x2feed68a,0xe7a5da7e,
  116739. 0x65183190,0xcc67763e,0xe9377ad6,0x7d7d0102,0x77032321,0xccfc4720,
  116740. 0x534bb505,0x573ee031,0x0f1a2769,0x1bf1ef8c,0x000000f3 },
  116741. { 0x0c935667,0x635f5c4b,0x060d2b8b,0x74152c39,0x37c3a574,0xeffaac2e,
  116742. 0x0b72e0cd,0xfd5fcc4c,0xf4f60247,0xb743f9b9,0x79e16f33,0x05c2e354,
  116743. 0x3074ef9c,0xa2234c47,0x495aace3,0x4092f279,0x00000124 } },
  116744. /* 217 */
  116745. { { 0xb30f9170,0x5bfd7851,0x37fce5b1,0x715aa1e9,0x928437b9,0xcffd55e0,
  116746. 0xc32f1273,0x88acd259,0x48be1e34,0x5a145cf2,0x7a5bc62b,0x3a340860,
  116747. 0x18156f46,0x6296eb15,0x2774e1c3,0x397fad19,0x000001e7 },
  116748. { 0x9c8225b5,0x362f99f4,0x46b77c4d,0x33efce49,0x8541e91b,0x451df530,
  116749. 0x38f3d693,0x0bd2d934,0xe727b54e,0x0b5de2d6,0x7622d940,0x42d929c2,
  116750. 0x56f6a94b,0x36ace723,0xfccaf205,0x64a18cd5,0x00000044 } },
  116751. /* 218 */
  116752. { { 0xaba95d63,0x8dbe0aab,0x7b4b346d,0x92780c61,0x0e0d8142,0x6430f863,
  116753. 0xb56ef04c,0x875be02a,0x785e3633,0xc28feb95,0xc12c93e4,0xd5401795,
  116754. 0xe36f82a3,0x89ff51c1,0x10eeafd6,0x3c48c895,0x0000016b },
  116755. { 0xd4f064be,0x79287eba,0x54ebda99,0x1a77d555,0x623727ea,0x46745ef2,
  116756. 0x89f366c6,0xa911f591,0xc59d6ebd,0x7e5435cd,0x7524d213,0x3a84daea,
  116757. 0x4395b38d,0xc7b1dd1c,0x1a823c49,0xca13e704,0x0000001c } },
  116758. /* 219 */
  116759. { { 0x874d64b0,0x6399860c,0x1653ce0c,0x3375b092,0xeaa11986,0x16700000,
  116760. 0x621cd15d,0x62c67909,0x77d70dcd,0xbe1d7dd6,0x305bd4cd,0xeff0f270,
  116761. 0x362f8f30,0x076ec621,0x7e445b78,0x81204816,0x000001d8 },
  116762. { 0x161f9758,0x81749a0e,0xa3c4fce2,0xe60915fe,0x911dd8af,0xf537ce41,
  116763. 0x79a51a09,0xfe36a8ac,0x2ca5cf8e,0x67fb54b4,0xe49057f5,0x1bdcae07,
  116764. 0xa4244b64,0xb71ff0c5,0x4b606583,0x4815a536,0x00000106 } },
  116765. /* 220 */
  116766. { { 0xef39cc39,0x78c69c3e,0xfa6356d1,0x98304564,0x412fb990,0xbd3c3542,
  116767. 0x79dbb2a5,0xa1d531d3,0xe7e75e3d,0x4865f188,0x0b0147b1,0x2dac4e22,
  116768. 0x33d29ab0,0xf59e51ca,0x37b074ef,0xc964f7fe,0x000000f1 },
  116769. { 0x0e301262,0x7080c0a6,0x5390a22d,0x9a458060,0xcc8a9029,0xda677f9a,
  116770. 0x14c0f1c2,0xdfae9057,0x6e66d9f7,0x3665ff16,0x47846924,0xc866dd8c,
  116771. 0xc4cc307c,0xc5afe98f,0xe0bf50e4,0x60e3ba63,0x00000039 } },
  116772. /* 221 */
  116773. { { 0x959ecdb3,0x1a785136,0xf9e959be,0x289af617,0xcde0dc88,0x5145b2b8,
  116774. 0x7c079e15,0xfe9070b0,0x50e22415,0xf77f04d3,0x358d6d42,0xb3ab7372,
  116775. 0xba7b629a,0x14fd41b9,0x7400fd25,0x7b32d80e,0x00000193 },
  116776. { 0x7147886f,0xe5d80d4d,0x576c81ca,0xe08ced61,0x642717bb,0xe14e8692,
  116777. 0xabb4bd21,0x9dcdf198,0x6530308b,0x658be646,0xd99d19c7,0xfbf192da,
  116778. 0x304ab126,0x55a3d1b3,0xfa24de31,0x943f4be5,0x0000000e } },
  116779. /* 222 */
  116780. { { 0x7fe9ea48,0xc5424058,0x61b57486,0xaf24f825,0x78719740,0x9d2c413c,
  116781. 0x70eb874d,0x27a9be79,0xb62ba3aa,0x43fef8e0,0x2c1bf0ac,0x0a23f286,
  116782. 0x4af130e1,0x51c276f3,0xae55cebf,0xf6cd1e9a,0x00000185 },
  116783. { 0x40369093,0x24defa7f,0x58581e0a,0x11f1d9d6,0xe512ed9e,0x9900bf33,
  116784. 0xed120896,0xbf8a8459,0x8b73c399,0x8324555e,0x8f6f54fe,0x54a30569,
  116785. 0x3c252355,0x2a9d6da5,0x2a093b31,0xe6a6f904,0x0000016a } },
  116786. /* 223 */
  116787. { { 0x152cdd35,0xb2e123c9,0x86402ef1,0xae6e43a8,0xb9ce5bd5,0x892bf0df,
  116788. 0x75804914,0xb4acb84a,0xf502eec2,0x8c7f55ff,0xaa33ef4e,0x9c8a7b93,
  116789. 0xfd9d2001,0x06b10357,0x0ba3bceb,0x3e319ff0,0x00000027 },
  116790. { 0xabe360a3,0x182c2f77,0xadfefca6,0x57ef5c84,0x650b6fcc,0x9a4f0ca6,
  116791. 0xaaf0b202,0x3f4f8e56,0xa24ef156,0x5c8508a0,0x1ea45f13,0xd8f62fd9,
  116792. 0x28036dbe,0xf2c923a0,0x1a4d103b,0x4a9ca4c0,0x0000018a } },
  116793. /* 224 */
  116794. { { 0x5448e339,0x2a3fb798,0x18a39976,0xde8770cf,0x7a69170c,0x1160574d,
  116795. 0x2b6067ac,0x4bb05c59,0x848138ab,0xde0d2db0,0x4909e794,0x149dab92,
  116796. 0x790315f7,0x83a336b6,0xa335a258,0xcd9074d9,0x0000013c },
  116797. { 0xac1b784d,0xe839c5e0,0xee527ae1,0xab65c8c6,0xa1c88ec0,0xd3c86146,
  116798. 0x46c1bf58,0x2201f790,0x3fda502a,0x71cec627,0x225b9065,0xff3f88eb,
  116799. 0xc556dfcd,0x6c1f0c98,0x484fa5cc,0xaa3222aa,0x000000ac } },
  116800. /* 225 */
  116801. { { 0xc9b4dfd6,0x17e74bc3,0xf8e76293,0x25ba8053,0x9d8c3520,0x0307dc05,
  116802. 0xb85a20b4,0x1c9036cc,0x23871359,0xf2c63f0a,0xca95fb4e,0x1a99d9d8,
  116803. 0x9850c6c6,0x3d7c4f39,0x68299668,0x162969c9,0x00000169 },
  116804. { 0xcb63ee53,0x7d13c267,0x75eac353,0x67b12e61,0x191abfca,0xb3369a11,
  116805. 0xee1af69f,0x5ad0649d,0x11dc11e7,0x4d7a6f00,0xdb9f9765,0x80f030b8,
  116806. 0xf0ab1332,0xa20001a3,0x39d8cc62,0xe17c98d2,0x00000194 } },
  116807. /* 226 */
  116808. { { 0x1d8fe898,0x720d80b4,0x32184534,0x8d7a28b7,0x04f21740,0xf1f3c385,
  116809. 0x166aa6af,0x5d381cd5,0xcc560e35,0x9cde6084,0x5e61e2cd,0xcb041f0a,
  116810. 0xd9b4951a,0x621116f5,0x7ee2ac2c,0x509e16d3,0x000000c4 },
  116811. { 0x2c6fd79e,0xb82a20c4,0x3af78b0e,0x95b7ee4e,0xbad819ca,0x3d9b63c1,
  116812. 0x98552569,0x10d674de,0xf9c19d0f,0x17de64b2,0x47c5e6a9,0xa03fabaf,
  116813. 0x2ce2db6f,0x858bc4ad,0x1fc9d18e,0x76c2380a,0x000000c9 } },
  116814. /* 227 */
  116815. { { 0xb064f114,0x91171ef8,0x4f2f0f4c,0x83cb1565,0x57b262b7,0x30525854,
  116816. 0x0f34936c,0x468c6701,0x99a41fed,0xef26d2fe,0xa7f7f6a9,0xf6da2267,
  116817. 0xa01bfc1b,0x2563b8db,0xc340ed40,0x14b36c85,0x0000000e },
  116818. { 0x25db67e6,0x5e57e264,0x7f2e905f,0x85df4e89,0x026c4268,0x7832e514,
  116819. 0x3e875093,0x312be262,0x3c538691,0x856b5bd8,0x95734f9d,0x5b1cae55,
  116820. 0xd5aa4861,0x5a07bfe2,0xce8abb58,0x7a4c96f0,0x000001d0 } },
  116821. /* 228 */
  116822. { { 0x523aa2e9,0x7bf54d05,0xed3d0860,0xc8841e0c,0x7f9bfb69,0x5683f6e2,
  116823. 0x162bdf85,0xdcb07f44,0x07b0dcc9,0x62d17839,0x657a536e,0xa2cbb8ab,
  116824. 0x7cf47d3c,0x98b9a0d2,0x5eea6370,0xff154d68,0x000001f2 },
  116825. { 0x56b232ac,0x568b768a,0x3f2a52ab,0x4e8d6e36,0x8837fc60,0xbae87a16,
  116826. 0xd10a7691,0xebc58a83,0xf9455fbe,0xad5e4af0,0x7d654e2e,0x1a20d6c3,
  116827. 0xda7c8255,0x8c40fcb9,0x60d9b931,0x6d7b3cd7,0x000000b2 } },
  116828. /* 229 */
  116829. { { 0xbb2eaf45,0x7b090c3e,0x62ffb92f,0xed24d91c,0xa736f23d,0xbf2a3ea4,
  116830. 0x6ff0fde3,0xb5b99ebd,0xca1102f5,0xbca2b55d,0x07e032a8,0xf6203cd8,
  116831. 0xa8bf17a8,0x5410b448,0xe1dc55b1,0xb86660a7,0x00000109 },
  116832. { 0x02a2fbd8,0xb148b1da,0x3b22e8a5,0xfed85e8b,0x8712b509,0x1378a0e4,
  116833. 0xc6a3e516,0x68560148,0x1633b503,0x7100921c,0x25512711,0x93925143,
  116834. 0x07d31047,0x7b4931d2,0x8542e0bb,0x623e722b,0x000000ea } },
  116835. /* 230 */
  116836. { { 0x24972688,0x084823d3,0x003f5762,0x58b83c12,0x6d0d4528,0x194d6690,
  116837. 0x2c6f747e,0x84219584,0x0146d89a,0xc8f8a2e9,0x7451bbc2,0x29ec1de7,
  116838. 0xf7f284fa,0xf622b6b8,0x7b71e44f,0x83f1dbe9,0x00000060 },
  116839. { 0x999dd56b,0x99649333,0x97a47de9,0x2cfac0ba,0xbbe8fb20,0x6660d8ae,
  116840. 0xf61d7bca,0x47c29dd8,0x85adc14d,0x6f5fb51d,0x4f9fd41c,0xe65ac788,
  116841. 0xff513e6c,0x1ce69dd4,0xffe59d3e,0x1ace591e,0x00000023 } },
  116842. /* 231 */
  116843. { { 0xa9fda771,0x2e67a438,0x8663100e,0x626f652c,0xe133f23b,0xdfb19e48,
  116844. 0x035d2d1f,0x599f88f2,0x8d13e878,0x1723a112,0xfb51ce07,0x890aa292,
  116845. 0xbbd9ba82,0xe5f3a70e,0x374514b4,0xdde82673,0x00000155 },
  116846. { 0xd6f59a95,0x08b2b77e,0x02020420,0x93f853e3,0xebac7797,0x52252ac1,
  116847. 0xb56b6676,0x6ecdcb99,0x9722a500,0x4abdb9f9,0x04e2bad0,0x26210f3f,
  116848. 0x3034dd4d,0x0ca5a0ff,0xdac0b80d,0x333d8080,0x00000041 } },
  116849. /* 232 */
  116850. { { 0x35a85a06,0xe8510709,0x42ef1b44,0x4e166e76,0xa07b3a6d,0x84a90b71,
  116851. 0x30329e6a,0xd6dd6c00,0x3d555259,0x20c4ba65,0x6f8ad05e,0xee3b26af,
  116852. 0x2ab4cccd,0x20e3d541,0xa9406424,0x79798934,0x000001bd },
  116853. { 0x8e0c7ff0,0xf2a1d184,0x9543b340,0xbae85efc,0xf51d318b,0xe96431ae,
  116854. 0x75878fa6,0xe5d3ed4e,0xc2895f52,0x4d2a29db,0x1f11067c,0x3af27877,
  116855. 0x9e7f4ee5,0x6ccde964,0xa56d74da,0x35188da1,0x00000192 } },
  116856. /* 233 */
  116857. { { 0x03d310ed,0xb0832120,0x987b0311,0xd20ee8cc,0x84c558a8,0x9e549d26,
  116858. 0xb7167ec8,0x5e25f3ce,0x4bf55bb5,0xacf114f4,0x061c9017,0x819edc77,
  116859. 0xdeb343c0,0x759a44e6,0x04c9b5ed,0x58df9f7e,0x00000078 },
  116860. { 0x3bf13222,0x4fa47ebb,0xea07da11,0x1e451dcd,0xc0d8242f,0x1be9fac3,
  116861. 0x36eb871e,0x93257d4d,0xbea3190d,0xf49e775a,0x4ebe2b33,0x406d191f,
  116862. 0x0c110096,0x67aac53c,0xd381ac78,0x5215cf8b,0x000001f4 } },
  116863. /* 234 */
  116864. { { 0xfa493b79,0x387e8a8e,0x4eb1c2ac,0xb20e270b,0x9ff22320,0x9f393fa0,
  116865. 0xa91c393d,0x5ee1baae,0x138a8d96,0xdeda961a,0x97bd50e4,0x69ab238c,
  116866. 0x2363c8e0,0xff68d48a,0xce4c4c16,0xaf8e00e5,0x00000158 },
  116867. { 0xcfc509a1,0x6ccdcf06,0xc26cc075,0x60f411ef,0x4d9c57f0,0x6d0cdfd6,
  116868. 0x32e99cac,0xa9514853,0x8b8e9510,0x58f9ab3d,0xb10dc3fd,0xa7e98709,
  116869. 0x75ef3509,0x8390843d,0x5a9312c7,0x28ccc9d0,0x000001b6 } },
  116870. /* 235 */
  116871. { { 0xe341463f,0x1d934f00,0x150da7a0,0x14c8a6ce,0x4109553f,0xdb4860fc,
  116872. 0xa93f4a91,0xc23bde5a,0x2cd58067,0x9f47c787,0x8433dc80,0x1d330054,
  116873. 0x75a32a7d,0x0c0be7f9,0x88c75da9,0x08b777d5,0x0000012e },
  116874. { 0x61a10d37,0xdfc12817,0x5c50f5a5,0xed7b6181,0x79477c60,0x28af95db,
  116875. 0x33c5310b,0xa0aa2b77,0x53118267,0x905faab8,0x6b41959f,0xf40e9816,
  116876. 0x16b37784,0x9ccb4252,0x69866acc,0x6835d77c,0x000000c5 } },
  116877. /* 236 */
  116878. { { 0x2b450a66,0xe9d714cb,0x7dbfdc14,0x1318885c,0xb466a0c0,0x655a8d85,
  116879. 0x5bdfc1a6,0x02a21e99,0xe67792d1,0x7a0d7c98,0xb550a797,0x2a01bb57,
  116880. 0x5d74d337,0x42c46233,0x88dad495,0x7be4e1c0,0x0000008b },
  116881. { 0x95812273,0x1873b03f,0xee3f757f,0x2e26ed32,0x6da6217a,0x2c710eae,
  116882. 0x261d9f4f,0x9b50b574,0xb7c1da2d,0x43971fa9,0xc4a85de7,0x22c4fb87,
  116883. 0xec22137b,0xf72c3451,0x77ba1926,0x1345668c,0x00000173 } },
  116884. /* 237 */
  116885. { { 0x8a3ba183,0x3e3e8c7a,0xfe389fa7,0x4e8cebbb,0x0f9ba60f,0x8ea44687,
  116886. 0xcb601a83,0x55176e35,0x12e52db4,0xf90bdc26,0x8f712bf1,0x95f9e459,
  116887. 0xbea054cd,0x9bd3200f,0xdd5fd40b,0x2cf19bf6,0x0000017a },
  116888. { 0x66736feb,0x71cf6ca2,0xde7cfe2f,0xbde86f49,0xfc290563,0xc60abce8,
  116889. 0x726b6e4f,0xaae8a3ce,0x3f29235b,0xd2382445,0x650ffa5e,0xa4b557f5,
  116890. 0x113ef744,0xa1453e54,0x3e426dd2,0x7c676a53,0x000001b0 } },
  116891. /* 238 */
  116892. { { 0x35d96872,0xf5e603f2,0x3fa5b8ca,0xab1a23cc,0xe988dc5f,0x5459871b,
  116893. 0xd430c0bd,0xe32e8489,0x764d9cc3,0x7ec269e0,0xf2c0c40d,0xf7238212,
  116894. 0x887b83b4,0x2d946183,0x2f18a411,0x281fa671,0x00000010 },
  116895. { 0x64858b37,0x8028048f,0x357de5d9,0xe0e149af,0x619ebb18,0xb2218791,
  116896. 0x9f2b0ba0,0x210200b3,0x1039cbae,0x5a87eae6,0x39579d1d,0x4efdcddb,
  116897. 0x2788515e,0x1b388eaa,0xc81878aa,0x1a552c3c,0x0000002c } },
  116898. /* 239 */
  116899. { { 0x0ea723dc,0x7ac7f500,0x42b15231,0x0a5f04f4,0xbe885c86,0x63d49445,
  116900. 0xff119702,0x61f9993f,0xc4c58cea,0xc3fba45c,0xb9cd6036,0xe6d151e6,
  116901. 0x57b923bb,0x75a3ab15,0xceb2fd46,0x4ec07c52,0x00000147 },
  116902. { 0xed88239d,0xc46a3d32,0x835ae694,0x0d1b8ae6,0x9feeb2e7,0xf4fde325,
  116903. 0x43bc0bb5,0x223bf71c,0x8f62a705,0x3cd220b7,0x9fe799a5,0x2224860e,
  116904. 0x24ab7f93,0xd8558703,0xb594958b,0x8e0f7330,0x0000010f } },
  116905. /* 240 */
  116906. { { 0x3c67d520,0xaf35c7bb,0x23fca9ec,0xd8f4958b,0x8bbaa808,0x0778f194,
  116907. 0x2135e8ae,0x418c30ce,0xc888eff7,0xcdd8d9a9,0xf73144ab,0x72075df0,
  116908. 0x4506a534,0xb549c895,0x5fbb7fc5,0x4ef38979,0x0000011c },
  116909. { 0x43f5e698,0x3fe2c9ac,0xe38a5e3a,0xce77fcbc,0x3089c2e1,0x6d05c90e,
  116910. 0xac1d5801,0x5a74f3ff,0x381b9d2a,0xaeeda220,0xf5f3960b,0xd958b143,
  116911. 0x0db7abbe,0x65ffd051,0x7a05b718,0x8e97e680,0x000000ce } },
  116912. /* 241 */
  116913. { { 0x8ce86a83,0x2251e61b,0xbf7e7160,0x8604159f,0x48f03377,0xfc127dd7,
  116914. 0x45052242,0x87cb2c37,0x934ea09b,0xbd4950f4,0xc4679441,0x5146c403,
  116915. 0x23ba416a,0xe8ad4710,0xaf638eb1,0x89b81a60,0x000001b3 },
  116916. { 0xe8150c69,0xe699934e,0xe27c14bc,0x74f75908,0x6a0194ff,0x5dc0a891,
  116917. 0x1bd51b76,0x38f49d32,0x18779630,0x6bc3305e,0xfd3b4a68,0xfe2f3fbf,
  116918. 0xd7caf189,0x1409b377,0x9b8f109b,0x029ea13b,0x000001b3 } },
  116919. /* 242 */
  116920. { { 0x25a2fd88,0xef7938d2,0xceba0603,0x890f2f7c,0xd7a6dff4,0x4c3e1c80,
  116921. 0x2883f986,0x00c78f36,0x998e5305,0xed92b592,0x325ddc73,0x018a8f1b,
  116922. 0xd5d3708a,0x6dffd987,0x0d1f28bb,0xdcd3554f,0x00000059 },
  116923. { 0x23a74e7d,0x17c6e41d,0x5db32df6,0x94b61ebe,0x9e7ffa0b,0x3c2fffa7,
  116924. 0x2ebb7a0d,0x473662b7,0x01adf9c3,0xa86415ee,0x54679264,0x1502c326,
  116925. 0x2fa09c57,0x16911349,0x24749086,0x897f34aa,0x00000195 } },
  116926. /* 243 */
  116927. { { 0xabadc253,0x4845d359,0xc797c95e,0xe054b92c,0x9a218212,0x22a9b5bd,
  116928. 0xa52b8827,0x9bb80a5e,0x2e61c676,0xea38e78e,0x08b0f8b3,0xfb274b1a,
  116929. 0xdb9d854c,0xb6aa42e3,0x56012d73,0x8ba22523,0x00000163 },
  116930. { 0x75c8c576,0x7cec0e6f,0xe4bc7dd2,0xabb20e7c,0x69d80726,0x0958a0c8,
  116931. 0x8a023eb7,0xa908c66a,0x76110b15,0xca9f50ea,0x186f61a6,0x668c9994,
  116932. 0x2a0a69d8,0x9ddf22ed,0xbbf8a10f,0xbfee1897,0x000001e0 } },
  116933. /* 244 */
  116934. { { 0x48319e4f,0x26d86818,0x5a586fa0,0x6be6f6b5,0x26713265,0xbef5d886,
  116935. 0x98529cfa,0xac252ac5,0x62b29cfb,0xe7cc45f1,0xa2a6358d,0xee050609,
  116936. 0x2940ac70,0xf7cb9ca4,0xa885b1f0,0xfb44aaec,0x000001ad },
  116937. { 0xe798678e,0x66b7a936,0x99540438,0xca01e103,0x816860b7,0xf2491e37,
  116938. 0xb745d857,0xeeffd483,0xa4705ed6,0x5dbb3628,0xb2a5d0f7,0x57d68d49,
  116939. 0x2389fee3,0xd1a8529a,0x1a7fd686,0xdbbc2549,0x000001ad } },
  116940. /* 245 */
  116941. { { 0x969686a3,0xe10cba20,0xe3c053f5,0x308b1c55,0x26f47102,0x1712b134,
  116942. 0x49033038,0x1f9165b1,0x2d01527b,0x45b72017,0xaa9a34e2,0x6fcf6647,
  116943. 0xb0be35c8,0x51f54b94,0x5a15e382,0xfccb22a5,0x000000e3 },
  116944. { 0x5b4dc0be,0xaa71e4ec,0xdb1cd5c4,0xbb136248,0x046e1007,0xf36bff43,
  116945. 0xda9c99a3,0x5a6806d7,0x8349bc50,0x9cbfc6ee,0xe13e0850,0x26871e73,
  116946. 0x67f448c1,0x5e6aa227,0x2da7baf9,0xba77787c,0x000001b9 } },
  116947. /* 246 */
  116948. { { 0xc5a73375,0x1abe58ee,0x7a8ac438,0x175df69d,0xceca835a,0x2cf3150a,
  116949. 0xf507d30f,0xb87b0609,0xc60b0424,0x9ae53a2b,0x410f90ec,0x4931e182,
  116950. 0xadd689bb,0x452c7d0f,0x47631a8e,0xab453491,0x00000013 },
  116951. { 0x8c84f3af,0xaf2dd856,0x1baae33e,0x829dc092,0x8b96b070,0x46542a85,
  116952. 0xe8a82516,0x42260d40,0x5c35322b,0xb9e5edac,0x39eda0d2,0xbca79560,
  116953. 0xb962b90a,0x86bd07c6,0xb1ec5302,0x2e22dac7,0x0000010a } },
  116954. /* 247 */
  116955. { { 0x239d8f0a,0x665fc09d,0xab8a1021,0x92b2e03c,0x0173477b,0xe4369768,
  116956. 0x8e361604,0xab38ed9f,0x9eb061be,0x79b0091d,0x3e845670,0xcd422654,
  116957. 0x2fe1a2e0,0xa0f77ec7,0x760a030f,0x1d242162,0x00000093 },
  116958. { 0xf8646bc3,0xfa9f834c,0x40ae96f9,0x7df94a52,0x379177d1,0x901c3890,
  116959. 0xffeb66cd,0x9dfd0644,0x77b92465,0x81aec2ec,0xcd981d4f,0x2df3b7f2,
  116960. 0xf377b093,0xc9bc3f69,0xdd859d8b,0xdaef34f3,0x00000125 } },
  116961. /* 248 */
  116962. { { 0xa2c123bc,0xac08451b,0x0818fa54,0xd1e83a68,0x98957b8a,0x56dd5702,
  116963. 0xf0f12f16,0xcc7f2e34,0x0a9fa14d,0x1f6a9c33,0xb2fe782c,0xefc9a2bb,
  116964. 0x709f54dd,0xd319c697,0xd6460a53,0x0b8238cb,0x000001dc },
  116965. { 0x44dfb6f6,0xf6492901,0x6e401d26,0x270d7cb4,0x48537ad8,0x1a70a40e,
  116966. 0x70d8dbd9,0x84d661b5,0xf170d58b,0xca27223a,0x6344e1d2,0xeeb4cf14,
  116967. 0xab9de1fa,0x2255fc95,0xdbdc5ea7,0xcd6e110a,0x000001f8 } },
  116968. /* 249 */
  116969. { { 0x78b8a0a7,0x2a57c6b9,0xe833edea,0x24b4aeb6,0x4bd13fe7,0x9e4617c1,
  116970. 0xfc2e8ee4,0xc4186888,0xfb147eef,0x8d398a49,0x2e662cfb,0xe9f191f1,
  116971. 0x958ba2ec,0x61872289,0x00b8d50d,0xbd6d0f1b,0x0000002d },
  116972. { 0x24c93cc9,0x895cfdfe,0xb9e718e7,0x29ed7780,0x38baf7eb,0x01c8ba58,
  116973. 0x4ddcbf69,0x0225387e,0xa180d6bb,0x64b250bf,0xc947c7c2,0x6d68e548,
  116974. 0x9923f3cd,0x82a7b632,0x2d103cd2,0xb8f03613,0x0000000f } },
  116975. /* 250 */
  116976. { { 0x8cd9d494,0x8198b3f0,0x94f4f9f3,0x9b2065b9,0x3c738fa9,0x7664a220,
  116977. 0xd8d229cb,0x199f4c14,0xc51c54b3,0xddad75c4,0xd213a332,0x9a32ce0b,
  116978. 0x888c7b2f,0xf3a21085,0x5b1ff20a,0x6defa362,0x000000d1 },
  116979. { 0x19a296eb,0x44e00548,0xd1a91313,0x1d94ff15,0xfeaa454f,0xd7dead2b,
  116980. 0x4d40bd7f,0xae65a803,0x1801a4af,0x604f147e,0xa5e0de77,0x983048f9,
  116981. 0xff572ca0,0xa3b19ca5,0x1821d117,0xa237dba7,0x000000e0 } },
  116982. /* 251 */
  116983. { { 0x91630ee8,0xedbabf84,0x05eb5301,0xde6589c2,0xa051f47b,0x9f7d2b2d,
  116984. 0x212bbe81,0xaeaa9f96,0x94292124,0xdced3d5e,0xf4435e5b,0x691f5b89,
  116985. 0x9411f66f,0x19604c33,0x4356f0da,0xb7fc09ca,0x000000e6 },
  116986. { 0xf74f811c,0x1294e413,0xdf8d8ddb,0x1a42d831,0x963418c9,0x27f57217,
  116987. 0x88ebcdec,0x5fde5218,0xea305bc9,0xfdd5e06e,0xac668b61,0xed1e6088,
  116988. 0xeb811861,0x333af016,0x15ddcebc,0x5ecb192d,0x000001c9 } },
  116989. /* 252 */
  116990. { { 0xe0bde442,0x927b37a3,0x66f7a73e,0xe0543fe8,0x8ed10c2e,0xd30d9d20,
  116991. 0xa6617a32,0xaf79c341,0xd1d5cf8b,0xe7367870,0xe3abcf8b,0x02d0dce9,
  116992. 0x772b5e7b,0xfe23d2dd,0x1ffc70c5,0x29fceea0,0x0000010b },
  116993. { 0x62d803ff,0x31bcae4d,0xdbc306a9,0x93ee913f,0xd8c10662,0xaf1de7ab,
  116994. 0xe7a6d658,0xd485782a,0x102f4e06,0x9126592e,0x136fafe6,0x91a3127f,
  116995. 0x88371213,0x46b93440,0xa31e1634,0x53bb4380,0x000000ba } },
  116996. /* 253 */
  116997. { { 0xca5636b0,0x62e517fc,0x6aba15c7,0x4296e021,0x212e7b2d,0x5aa8fd7c,
  116998. 0x5717ad84,0x9517ce6d,0x98b2f357,0xe762b85b,0xdf59b07c,0x42f996b5,
  116999. 0xf37ef6f0,0xf3732abb,0x4542b489,0xa5d145ea,0x0000015d },
  117000. { 0xaa7f6e3f,0x1e77c55e,0xaa4a05bc,0x3f4d99a7,0x45828227,0xa56d7d77,
  117001. 0x77b748fb,0xdb0895fb,0x0629f5d1,0x1c484cce,0x359803fb,0xf5b1c90a,
  117002. 0x1720b8d0,0x43ac4f29,0x72ac13f2,0x8c10bfe8,0x000000e9 } },
  117003. /* 254 */
  117004. { { 0xc06c4fd6,0x9d1c4785,0xd25c2b9d,0xbf4b9025,0xd4982f24,0x04135eb1,
  117005. 0xba4fef2b,0x3ab3edc2,0x98de07ab,0x55a5239f,0x096f4b7d,0xd5fc49ab,
  117006. 0x3844c815,0xc50a2960,0x15676b2b,0xdb1148d0,0x00000047 },
  117007. { 0x10f3bad9,0xc49f9cc5,0x022901d4,0x490888fc,0xc47b44df,0x917a55eb,
  117008. 0xf39f2b68,0x20b2ebc6,0x04e9962a,0x0c58e3af,0x573dd5b7,0x52ab7c1b,
  117009. 0xa329f76c,0x2b54add6,0x82f4ca3b,0x59dad1eb,0x00000108 } },
  117010. /* 255 */
  117011. { { 0xa182d1ad,0x662c4128,0x20916c45,0x7751796e,0xba681647,0xa7704272,
  117012. 0xb92c85c1,0xfac8b0fa,0xaefb2e07,0x207ab2df,0x7861b32d,0xc73530a0,
  117013. 0x88aed145,0x63dbed65,0x0a53a49d,0x547bcdca,0x000000bd },
  117014. { 0x87056b51,0xa7c1382f,0x130f9912,0xc3d91edb,0xd3805b42,0xf7c7de46,
  117015. 0xfd31a995,0x456101eb,0xcd3fb8aa,0x1efd22b4,0x9eb17bce,0xfe391df7,
  117016. 0x616c0c32,0xb4d4c0c6,0x711beef4,0x19f023be,0x00000112 } },
  117017. };
  117018. /* Multiply the base point of P521 by the scalar and return the result.
  117019. * If map is true then convert result to affine coordinates.
  117020. *
  117021. * Stripe implementation.
  117022. * Pre-generated: 2^0, 2^65, ...
  117023. * Pre-generated: products of all combinations of above.
  117024. * 8 doubles and adds (with qz=1)
  117025. *
  117026. * r Resulting point.
  117027. * k Scalar to multiply by.
  117028. * map Indicates whether to convert result to affine.
  117029. * ct Constant time required.
  117030. * heap Heap to use for allocation.
  117031. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117032. */
  117033. static int sp_521_ecc_mulmod_base_17(sp_point_521* r, const sp_digit* k,
  117034. int map, int ct, void* heap)
  117035. {
  117036. return sp_521_ecc_mulmod_stripe_17(r, &p521_base, p521_table,
  117037. k, map, ct, heap);
  117038. }
  117039. #endif
  117040. /* Multiply the base point of P521 by the scalar and return the result.
  117041. * If map is true then convert result to affine coordinates.
  117042. *
  117043. * km Scalar to multiply by.
  117044. * r Resulting point.
  117045. * map Indicates whether to convert result to affine.
  117046. * heap Heap to use for allocation.
  117047. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117048. */
  117049. int sp_ecc_mulmod_base_521(const mp_int* km, ecc_point* r, int map, void* heap)
  117050. {
  117051. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117052. sp_point_521* point = NULL;
  117053. sp_digit* k = NULL;
  117054. #else
  117055. sp_point_521 point[1];
  117056. sp_digit k[17];
  117057. #endif
  117058. int err = MP_OKAY;
  117059. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117060. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  117061. DYNAMIC_TYPE_ECC);
  117062. if (point == NULL)
  117063. err = MEMORY_E;
  117064. if (err == MP_OKAY) {
  117065. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  117066. DYNAMIC_TYPE_ECC);
  117067. if (k == NULL)
  117068. err = MEMORY_E;
  117069. }
  117070. #endif
  117071. if (err == MP_OKAY) {
  117072. sp_521_from_mp(k, 17, km);
  117073. err = sp_521_ecc_mulmod_base_17(point, k, map, 1, heap);
  117074. }
  117075. if (err == MP_OKAY) {
  117076. err = sp_521_point_to_ecc_point_17(point, r);
  117077. }
  117078. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117079. if (k != NULL)
  117080. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  117081. if (point != NULL)
  117082. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  117083. #endif
  117084. return err;
  117085. }
  117086. /* Multiply the base point of P521 by the scalar, add point a and return
  117087. * the result. If map is true then convert result to affine coordinates.
  117088. *
  117089. * km Scalar to multiply by.
  117090. * am Point to add to scalar mulitply result.
  117091. * inMont Point to add is in montgomery form.
  117092. * r Resulting point.
  117093. * map Indicates whether to convert result to affine.
  117094. * heap Heap to use for allocation.
  117095. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117096. */
  117097. int sp_ecc_mulmod_base_add_521(const mp_int* km, const ecc_point* am,
  117098. int inMont, ecc_point* r, int map, void* heap)
  117099. {
  117100. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117101. sp_point_521* point = NULL;
  117102. sp_digit* k = NULL;
  117103. #else
  117104. sp_point_521 point[2];
  117105. sp_digit k[17 + 17 * 2 * 6];
  117106. #endif
  117107. sp_point_521* addP = NULL;
  117108. sp_digit* tmp = NULL;
  117109. int err = MP_OKAY;
  117110. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117111. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  117112. DYNAMIC_TYPE_ECC);
  117113. if (point == NULL)
  117114. err = MEMORY_E;
  117115. if (err == MP_OKAY) {
  117116. k = (sp_digit*)XMALLOC(
  117117. sizeof(sp_digit) * (17 + 17 * 2 * 6),
  117118. heap, DYNAMIC_TYPE_ECC);
  117119. if (k == NULL)
  117120. err = MEMORY_E;
  117121. }
  117122. #endif
  117123. if (err == MP_OKAY) {
  117124. addP = point + 1;
  117125. tmp = k + 17;
  117126. sp_521_from_mp(k, 17, km);
  117127. sp_521_point_from_ecc_point_17(addP, am);
  117128. }
  117129. if ((err == MP_OKAY) && (!inMont)) {
  117130. err = sp_521_mod_mul_norm_17(addP->x, addP->x, p521_mod);
  117131. }
  117132. if ((err == MP_OKAY) && (!inMont)) {
  117133. err = sp_521_mod_mul_norm_17(addP->y, addP->y, p521_mod);
  117134. }
  117135. if ((err == MP_OKAY) && (!inMont)) {
  117136. err = sp_521_mod_mul_norm_17(addP->z, addP->z, p521_mod);
  117137. }
  117138. if (err == MP_OKAY) {
  117139. err = sp_521_ecc_mulmod_base_17(point, k, 0, 0, heap);
  117140. }
  117141. if (err == MP_OKAY) {
  117142. sp_521_proj_point_add_17(point, point, addP, tmp);
  117143. if (map) {
  117144. sp_521_map_17(point, point, tmp);
  117145. }
  117146. err = sp_521_point_to_ecc_point_17(point, r);
  117147. }
  117148. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117149. if (k != NULL)
  117150. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  117151. if (point)
  117152. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  117153. #endif
  117154. return err;
  117155. }
  117156. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  117157. defined(HAVE_ECC_VERIFY)
  117158. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  117159. /* Add 1 to a. (a = a + 1)
  117160. *
  117161. * a A single precision integer.
  117162. */
  117163. static void sp_521_add_one_17(sp_digit* a_p)
  117164. {
  117165. register sp_digit* a asm ("r0") = a_p;
  117166. __asm__ __volatile__ (
  117167. "ldm %[a], {r1, r2, r3, r4}\n\t"
  117168. "adds r1, r1, #1\n\t"
  117169. "adcs r2, r2, #0\n\t"
  117170. "adcs r3, r3, #0\n\t"
  117171. "adcs r4, r4, #0\n\t"
  117172. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  117173. "ldm %[a], {r1, r2, r3, r4}\n\t"
  117174. "adcs r1, r1, #0\n\t"
  117175. "adcs r2, r2, #0\n\t"
  117176. "adcs r3, r3, #0\n\t"
  117177. "adcs r4, r4, #0\n\t"
  117178. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  117179. "ldm %[a], {r1, r2, r3, r4}\n\t"
  117180. "adcs r1, r1, #0\n\t"
  117181. "adcs r2, r2, #0\n\t"
  117182. "adcs r3, r3, #0\n\t"
  117183. "adcs r4, r4, #0\n\t"
  117184. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  117185. "ldm %[a], {r1, r2, r3, r4}\n\t"
  117186. "adcs r1, r1, #0\n\t"
  117187. "adcs r2, r2, #0\n\t"
  117188. "adcs r3, r3, #0\n\t"
  117189. "adcs r4, r4, #0\n\t"
  117190. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  117191. "ldm %[a], {r1}\n\t"
  117192. "adcs r1, r1, #0\n\t"
  117193. "stm %[a]!, {r1}\n\t"
  117194. : [a] "+r" (a)
  117195. :
  117196. : "memory", "r1", "r2", "r3", "r4"
  117197. );
  117198. }
  117199. /* Read big endian unsigned byte array into r.
  117200. *
  117201. * r A single precision integer.
  117202. * size Maximum number of bytes to convert
  117203. * a Byte array.
  117204. * n Number of bytes in array to read.
  117205. */
  117206. static void sp_521_from_bin(sp_digit* r, int size, const byte* a, int n)
  117207. {
  117208. int i;
  117209. int j;
  117210. byte* d;
  117211. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  117212. r[j] = ((sp_digit)a[i - 0] << 0) |
  117213. ((sp_digit)a[i - 1] << 8) |
  117214. ((sp_digit)a[i - 2] << 16) |
  117215. ((sp_digit)a[i - 3] << 24);
  117216. j++;
  117217. }
  117218. if (i >= 0) {
  117219. r[j] = 0;
  117220. d = (byte*)r;
  117221. switch (i) {
  117222. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  117223. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  117224. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  117225. }
  117226. j++;
  117227. }
  117228. for (; j < size; j++) {
  117229. r[j] = 0;
  117230. }
  117231. }
  117232. /* Generates a scalar that is in the range 1..order-1.
  117233. *
  117234. * rng Random number generator.
  117235. * k Scalar value.
  117236. * returns RNG failures, MEMORY_E when memory allocation fails and
  117237. * MP_OKAY on success.
  117238. */
  117239. static int sp_521_ecc_gen_k_17(WC_RNG* rng, sp_digit* k)
  117240. {
  117241. int err;
  117242. byte buf[66];
  117243. do {
  117244. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  117245. if (err == 0) {
  117246. buf[0] &= 0x1;
  117247. sp_521_from_bin(k, 17, buf, (int)sizeof(buf));
  117248. if (sp_521_cmp_17(k, p521_order2) <= 0) {
  117249. sp_521_add_one_17(k);
  117250. break;
  117251. }
  117252. }
  117253. }
  117254. while (err == 0);
  117255. return err;
  117256. }
  117257. /* Makes a random EC key pair.
  117258. *
  117259. * rng Random number generator.
  117260. * priv Generated private value.
  117261. * pub Generated public point.
  117262. * heap Heap to use for allocation.
  117263. * returns ECC_INF_E when the point does not have the correct order, RNG
  117264. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  117265. */
  117266. int sp_ecc_make_key_521(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  117267. {
  117268. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117269. sp_point_521* point = NULL;
  117270. sp_digit* k = NULL;
  117271. #else
  117272. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  117273. sp_point_521 point[2];
  117274. #else
  117275. sp_point_521 point[1];
  117276. #endif
  117277. sp_digit k[17];
  117278. #endif
  117279. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  117280. sp_point_521* infinity = NULL;
  117281. #endif
  117282. int err = MP_OKAY;
  117283. (void)heap;
  117284. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117285. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  117286. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC);
  117287. #else
  117288. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC);
  117289. #endif
  117290. if (point == NULL)
  117291. err = MEMORY_E;
  117292. if (err == MP_OKAY) {
  117293. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  117294. DYNAMIC_TYPE_ECC);
  117295. if (k == NULL)
  117296. err = MEMORY_E;
  117297. }
  117298. #endif
  117299. if (err == MP_OKAY) {
  117300. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  117301. infinity = point + 1;
  117302. #endif
  117303. err = sp_521_ecc_gen_k_17(rng, k);
  117304. }
  117305. if (err == MP_OKAY) {
  117306. err = sp_521_ecc_mulmod_base_17(point, k, 1, 1, NULL);
  117307. }
  117308. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  117309. if (err == MP_OKAY) {
  117310. err = sp_521_ecc_mulmod_17(infinity, point, p521_order, 1, 1, NULL);
  117311. }
  117312. if (err == MP_OKAY) {
  117313. if (sp_521_iszero_17(point->x) || sp_521_iszero_17(point->y)) {
  117314. err = ECC_INF_E;
  117315. }
  117316. }
  117317. #endif
  117318. if (err == MP_OKAY) {
  117319. err = sp_521_to_mp(k, priv);
  117320. }
  117321. if (err == MP_OKAY) {
  117322. err = sp_521_point_to_ecc_point_17(point, pub);
  117323. }
  117324. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117325. if (k != NULL)
  117326. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  117327. if (point != NULL) {
  117328. /* point is not sensitive, so no need to zeroize */
  117329. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  117330. }
  117331. #endif
  117332. return err;
  117333. }
  117334. #ifdef WOLFSSL_SP_NONBLOCK
  117335. typedef struct sp_ecc_key_gen_521_ctx {
  117336. int state;
  117337. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  117338. sp_digit k[17];
  117339. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  117340. sp_point_521 point[2];
  117341. #else
  117342. sp_point_521 point[1];
  117343. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  117344. } sp_ecc_key_gen_521_ctx;
  117345. int sp_ecc_make_key_521_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  117346. ecc_point* pub, void* heap)
  117347. {
  117348. int err = FP_WOULDBLOCK;
  117349. sp_ecc_key_gen_521_ctx* ctx = (sp_ecc_key_gen_521_ctx*)sp_ctx->data;
  117350. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  117351. sp_point_521* infinity = ctx->point + 1;
  117352. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  117353. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_521_ctx)
  117354. >= sizeof(*sp_ctx) ? -1 : 1];
  117355. (void)sizeof(ctx_size_test);
  117356. switch (ctx->state) {
  117357. case 0:
  117358. err = sp_521_ecc_gen_k_17(rng, ctx->k);
  117359. if (err == MP_OKAY) {
  117360. err = FP_WOULDBLOCK;
  117361. ctx->state = 1;
  117362. }
  117363. break;
  117364. case 1:
  117365. err = sp_521_ecc_mulmod_base_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  117366. ctx->point, ctx->k, 1, 1, heap);
  117367. if (err == MP_OKAY) {
  117368. err = FP_WOULDBLOCK;
  117369. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  117370. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  117371. ctx->state = 2;
  117372. #else
  117373. ctx->state = 3;
  117374. #endif
  117375. }
  117376. break;
  117377. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  117378. case 2:
  117379. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  117380. infinity, ctx->point, p521_order, 1, 1);
  117381. if (err == MP_OKAY) {
  117382. if (sp_521_iszero_17(ctx->point->x) ||
  117383. sp_521_iszero_17(ctx->point->y)) {
  117384. err = ECC_INF_E;
  117385. }
  117386. else {
  117387. err = FP_WOULDBLOCK;
  117388. ctx->state = 3;
  117389. }
  117390. }
  117391. break;
  117392. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  117393. case 3:
  117394. err = sp_521_to_mp(ctx->k, priv);
  117395. if (err == MP_OKAY) {
  117396. err = sp_521_point_to_ecc_point_17(ctx->point, pub);
  117397. }
  117398. break;
  117399. }
  117400. if (err != FP_WOULDBLOCK) {
  117401. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_521_ctx));
  117402. }
  117403. return err;
  117404. }
  117405. #endif /* WOLFSSL_SP_NONBLOCK */
  117406. #ifdef HAVE_ECC_DHE
  117407. /* Write r as big endian to byte array.
  117408. * Fixed length number of bytes written: 66
  117409. *
  117410. * r A single precision integer.
  117411. * a Byte array.
  117412. */
  117413. static void sp_521_to_bin_17(sp_digit* r, byte* a)
  117414. {
  117415. int i;
  117416. int j = 0;
  117417. a[j++] = r[16] >> 8;
  117418. a[j++] = r[16] >> 0;
  117419. for (i = 15; i >= 0; i--) {
  117420. a[j++] = r[i] >> 24;
  117421. a[j++] = r[i] >> 16;
  117422. a[j++] = r[i] >> 8;
  117423. a[j++] = r[i] >> 0;
  117424. }
  117425. }
  117426. /* Multiply the point by the scalar and serialize the X ordinate.
  117427. * The number is 0 padded to maximum size on output.
  117428. *
  117429. * priv Scalar to multiply the point by.
  117430. * pub Point to multiply.
  117431. * out Buffer to hold X ordinate.
  117432. * outLen On entry, size of the buffer in bytes.
  117433. * On exit, length of data in buffer in bytes.
  117434. * heap Heap to use for allocation.
  117435. * returns BUFFER_E if the buffer is to small for output size,
  117436. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  117437. */
  117438. int sp_ecc_secret_gen_521(const mp_int* priv, const ecc_point* pub, byte* out,
  117439. word32* outLen, void* heap)
  117440. {
  117441. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117442. sp_point_521* point = NULL;
  117443. sp_digit* k = NULL;
  117444. #else
  117445. sp_point_521 point[1];
  117446. sp_digit k[17];
  117447. #endif
  117448. int err = MP_OKAY;
  117449. if (*outLen < 65U) {
  117450. err = BUFFER_E;
  117451. }
  117452. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117453. if (err == MP_OKAY) {
  117454. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  117455. DYNAMIC_TYPE_ECC);
  117456. if (point == NULL)
  117457. err = MEMORY_E;
  117458. }
  117459. if (err == MP_OKAY) {
  117460. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  117461. DYNAMIC_TYPE_ECC);
  117462. if (k == NULL)
  117463. err = MEMORY_E;
  117464. }
  117465. #endif
  117466. if (err == MP_OKAY) {
  117467. sp_521_from_mp(k, 17, priv);
  117468. sp_521_point_from_ecc_point_17(point, pub);
  117469. err = sp_521_ecc_mulmod_17(point, point, k, 1, 1, heap);
  117470. }
  117471. if (err == MP_OKAY) {
  117472. sp_521_to_bin_17(point->x, out);
  117473. *outLen = 66;
  117474. }
  117475. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117476. if (k != NULL)
  117477. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  117478. if (point != NULL)
  117479. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  117480. #endif
  117481. return err;
  117482. }
  117483. #ifdef WOLFSSL_SP_NONBLOCK
  117484. typedef struct sp_ecc_sec_gen_521_ctx {
  117485. int state;
  117486. union {
  117487. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  117488. };
  117489. sp_digit k[17];
  117490. sp_point_521 point;
  117491. } sp_ecc_sec_gen_521_ctx;
  117492. int sp_ecc_secret_gen_521_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  117493. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  117494. {
  117495. int err = FP_WOULDBLOCK;
  117496. sp_ecc_sec_gen_521_ctx* ctx = (sp_ecc_sec_gen_521_ctx*)sp_ctx->data;
  117497. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  117498. (void)sizeof(ctx_size_test);
  117499. if (*outLen < 32U) {
  117500. err = BUFFER_E;
  117501. }
  117502. switch (ctx->state) {
  117503. case 0:
  117504. sp_521_from_mp(ctx->k, 17, priv);
  117505. sp_521_point_from_ecc_point_17(&ctx->point, pub);
  117506. ctx->state = 1;
  117507. break;
  117508. case 1:
  117509. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  117510. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  117511. if (err == MP_OKAY) {
  117512. sp_521_to_bin_17(ctx->point.x, out);
  117513. *outLen = 66;
  117514. }
  117515. break;
  117516. }
  117517. if (err == MP_OKAY && ctx->state != 1) {
  117518. err = FP_WOULDBLOCK;
  117519. }
  117520. if (err != FP_WOULDBLOCK) {
  117521. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_521_ctx));
  117522. }
  117523. return err;
  117524. }
  117525. #endif /* WOLFSSL_SP_NONBLOCK */
  117526. #endif /* HAVE_ECC_DHE */
  117527. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  117528. static void sp_521_rshift_17(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  117529. {
  117530. register sp_digit* r asm ("r0") = r_p;
  117531. register const sp_digit* a asm ("r1") = a_p;
  117532. register byte n asm ("r2") = n_p;
  117533. __asm__ __volatile__ (
  117534. "rsb r12, %[n], #32\n\t"
  117535. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  117536. "ldr r4, [%[a]]\n\t"
  117537. "ldr r5, [%[a], #4]\n\t"
  117538. #else
  117539. "ldrd r4, r5, [%[a]]\n\t"
  117540. #endif
  117541. "lsr r4, r4, %[n]\n\t"
  117542. "lsl r3, r5, r12\n\t"
  117543. "lsr r5, r5, %[n]\n\t"
  117544. "orr r4, r4, r3\n\t"
  117545. "ldr r6, [%[a], #8]\n\t"
  117546. "str r4, [%[a]]\n\t"
  117547. "lsl r3, r6, r12\n\t"
  117548. "lsr r6, r6, %[n]\n\t"
  117549. "orr r5, r5, r3\n\t"
  117550. "ldr r4, [%[a], #12]\n\t"
  117551. "str r5, [%[a], #4]\n\t"
  117552. "lsl r3, r4, r12\n\t"
  117553. "lsr r4, r4, %[n]\n\t"
  117554. "orr r6, r6, r3\n\t"
  117555. "ldr r5, [%[a], #16]\n\t"
  117556. "str r6, [%[a], #8]\n\t"
  117557. "lsl r3, r5, r12\n\t"
  117558. "lsr r5, r5, %[n]\n\t"
  117559. "orr r4, r4, r3\n\t"
  117560. "ldr r6, [%[a], #20]\n\t"
  117561. "str r4, [%[a], #12]\n\t"
  117562. "lsl r3, r6, r12\n\t"
  117563. "lsr r6, r6, %[n]\n\t"
  117564. "orr r5, r5, r3\n\t"
  117565. "ldr r4, [%[a], #24]\n\t"
  117566. "str r5, [%[a], #16]\n\t"
  117567. "lsl r3, r4, r12\n\t"
  117568. "lsr r4, r4, %[n]\n\t"
  117569. "orr r6, r6, r3\n\t"
  117570. "ldr r5, [%[a], #28]\n\t"
  117571. "str r6, [%[a], #20]\n\t"
  117572. "lsl r3, r5, r12\n\t"
  117573. "lsr r5, r5, %[n]\n\t"
  117574. "orr r4, r4, r3\n\t"
  117575. "ldr r6, [%[a], #32]\n\t"
  117576. "str r4, [%[a], #24]\n\t"
  117577. "lsl r3, r6, r12\n\t"
  117578. "lsr r6, r6, %[n]\n\t"
  117579. "orr r5, r5, r3\n\t"
  117580. "ldr r4, [%[a], #36]\n\t"
  117581. "str r5, [%[a], #28]\n\t"
  117582. "lsl r3, r4, r12\n\t"
  117583. "lsr r4, r4, %[n]\n\t"
  117584. "orr r6, r6, r3\n\t"
  117585. "ldr r5, [%[a], #40]\n\t"
  117586. "str r6, [%[a], #32]\n\t"
  117587. "lsl r3, r5, r12\n\t"
  117588. "lsr r5, r5, %[n]\n\t"
  117589. "orr r4, r4, r3\n\t"
  117590. "ldr r6, [%[a], #44]\n\t"
  117591. "str r4, [%[a], #36]\n\t"
  117592. "lsl r3, r6, r12\n\t"
  117593. "lsr r6, r6, %[n]\n\t"
  117594. "orr r5, r5, r3\n\t"
  117595. "ldr r4, [%[a], #48]\n\t"
  117596. "str r5, [%[a], #40]\n\t"
  117597. "lsl r3, r4, r12\n\t"
  117598. "lsr r4, r4, %[n]\n\t"
  117599. "orr r6, r6, r3\n\t"
  117600. "ldr r5, [%[a], #52]\n\t"
  117601. "str r6, [%[a], #44]\n\t"
  117602. "lsl r3, r5, r12\n\t"
  117603. "lsr r5, r5, %[n]\n\t"
  117604. "orr r4, r4, r3\n\t"
  117605. "ldr r6, [%[a], #56]\n\t"
  117606. "str r4, [%[a], #48]\n\t"
  117607. "lsl r3, r6, r12\n\t"
  117608. "lsr r6, r6, %[n]\n\t"
  117609. "orr r5, r5, r3\n\t"
  117610. "ldr r4, [%[a], #60]\n\t"
  117611. "str r5, [%[a], #52]\n\t"
  117612. "lsl r3, r4, r12\n\t"
  117613. "lsr r4, r4, %[n]\n\t"
  117614. "orr r6, r6, r3\n\t"
  117615. "ldr r5, [%[a], #64]\n\t"
  117616. "str r6, [%[a], #56]\n\t"
  117617. "lsl r3, r5, r12\n\t"
  117618. "lsr r5, r5, %[n]\n\t"
  117619. "orr r4, r4, r3\n\t"
  117620. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  117621. "str r4, [%[r], #60]\n\t"
  117622. "str r5, [%[r], #64]\n\t"
  117623. #else
  117624. "strd r4, r5, [%[r], #60]\n\t"
  117625. #endif
  117626. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  117627. :
  117628. : "memory", "r4", "r5", "r6", "r3", "r12"
  117629. );
  117630. }
  117631. #endif
  117632. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  117633. #endif
  117634. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  117635. static void sp_521_lshift_17(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  117636. {
  117637. register sp_digit* r asm ("r0") = r_p;
  117638. register const sp_digit* a asm ("r1") = a_p;
  117639. register byte n asm ("r2") = n_p;
  117640. __asm__ __volatile__ (
  117641. "rsb r12, %[n], #31\n\t"
  117642. "ldr r5, [%[a], #64]\n\t"
  117643. "lsr r6, r5, #1\n\t"
  117644. "lsl r5, r5, %[n]\n\t"
  117645. "lsr r6, r6, r12\n\t"
  117646. "ldr r4, [%[a], #60]\n\t"
  117647. "str r6, [%[r], #68]\n\t"
  117648. "lsr r3, r4, #1\n\t"
  117649. "lsl r4, r4, %[n]\n\t"
  117650. "lsr r3, r3, r12\n\t"
  117651. "orr r5, r5, r3\n\t"
  117652. "ldr r6, [%[a], #56]\n\t"
  117653. "str r5, [%[r], #64]\n\t"
  117654. "lsr r3, r6, #1\n\t"
  117655. "lsl r6, r6, %[n]\n\t"
  117656. "lsr r3, r3, r12\n\t"
  117657. "orr r4, r4, r3\n\t"
  117658. "ldr r5, [%[a], #52]\n\t"
  117659. "str r4, [%[r], #60]\n\t"
  117660. "lsr r3, r5, #1\n\t"
  117661. "lsl r5, r5, %[n]\n\t"
  117662. "lsr r3, r3, r12\n\t"
  117663. "orr r6, r6, r3\n\t"
  117664. "ldr r4, [%[a], #48]\n\t"
  117665. "str r6, [%[r], #56]\n\t"
  117666. "lsr r3, r4, #1\n\t"
  117667. "lsl r4, r4, %[n]\n\t"
  117668. "lsr r3, r3, r12\n\t"
  117669. "orr r5, r5, r3\n\t"
  117670. "ldr r6, [%[a], #44]\n\t"
  117671. "str r5, [%[r], #52]\n\t"
  117672. "lsr r3, r6, #1\n\t"
  117673. "lsl r6, r6, %[n]\n\t"
  117674. "lsr r3, r3, r12\n\t"
  117675. "orr r4, r4, r3\n\t"
  117676. "ldr r5, [%[a], #40]\n\t"
  117677. "str r4, [%[r], #48]\n\t"
  117678. "lsr r3, r5, #1\n\t"
  117679. "lsl r5, r5, %[n]\n\t"
  117680. "lsr r3, r3, r12\n\t"
  117681. "orr r6, r6, r3\n\t"
  117682. "ldr r4, [%[a], #36]\n\t"
  117683. "str r6, [%[r], #44]\n\t"
  117684. "lsr r3, r4, #1\n\t"
  117685. "lsl r4, r4, %[n]\n\t"
  117686. "lsr r3, r3, r12\n\t"
  117687. "orr r5, r5, r3\n\t"
  117688. "ldr r6, [%[a], #32]\n\t"
  117689. "str r5, [%[r], #40]\n\t"
  117690. "lsr r3, r6, #1\n\t"
  117691. "lsl r6, r6, %[n]\n\t"
  117692. "lsr r3, r3, r12\n\t"
  117693. "orr r4, r4, r3\n\t"
  117694. "ldr r5, [%[a], #28]\n\t"
  117695. "str r4, [%[r], #36]\n\t"
  117696. "lsr r3, r5, #1\n\t"
  117697. "lsl r5, r5, %[n]\n\t"
  117698. "lsr r3, r3, r12\n\t"
  117699. "orr r6, r6, r3\n\t"
  117700. "ldr r4, [%[a], #24]\n\t"
  117701. "str r6, [%[r], #32]\n\t"
  117702. "lsr r3, r4, #1\n\t"
  117703. "lsl r4, r4, %[n]\n\t"
  117704. "lsr r3, r3, r12\n\t"
  117705. "orr r5, r5, r3\n\t"
  117706. "ldr r6, [%[a], #20]\n\t"
  117707. "str r5, [%[r], #28]\n\t"
  117708. "lsr r3, r6, #1\n\t"
  117709. "lsl r6, r6, %[n]\n\t"
  117710. "lsr r3, r3, r12\n\t"
  117711. "orr r4, r4, r3\n\t"
  117712. "ldr r5, [%[a], #16]\n\t"
  117713. "str r4, [%[r], #24]\n\t"
  117714. "lsr r3, r5, #1\n\t"
  117715. "lsl r5, r5, %[n]\n\t"
  117716. "lsr r3, r3, r12\n\t"
  117717. "orr r6, r6, r3\n\t"
  117718. "ldr r4, [%[a], #12]\n\t"
  117719. "str r6, [%[r], #20]\n\t"
  117720. "lsr r3, r4, #1\n\t"
  117721. "lsl r4, r4, %[n]\n\t"
  117722. "lsr r3, r3, r12\n\t"
  117723. "orr r5, r5, r3\n\t"
  117724. "ldr r6, [%[a], #8]\n\t"
  117725. "str r5, [%[r], #16]\n\t"
  117726. "lsr r3, r6, #1\n\t"
  117727. "lsl r6, r6, %[n]\n\t"
  117728. "lsr r3, r3, r12\n\t"
  117729. "orr r4, r4, r3\n\t"
  117730. "ldr r5, [%[a], #4]\n\t"
  117731. "str r4, [%[r], #12]\n\t"
  117732. "lsr r3, r5, #1\n\t"
  117733. "lsl r5, r5, %[n]\n\t"
  117734. "lsr r3, r3, r12\n\t"
  117735. "orr r6, r6, r3\n\t"
  117736. "ldr r4, [%[a]]\n\t"
  117737. "str r6, [%[r], #8]\n\t"
  117738. "lsr r3, r4, #1\n\t"
  117739. "lsl r4, r4, %[n]\n\t"
  117740. "lsr r3, r3, r12\n\t"
  117741. "orr r5, r5, r3\n\t"
  117742. "str r4, [%[r]]\n\t"
  117743. "str r5, [%[r], #4]\n\t"
  117744. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  117745. :
  117746. : "memory", "r4", "r5", "r6", "r3", "r12"
  117747. );
  117748. }
  117749. static void sp_521_lshift_34(sp_digit* r_p, const sp_digit* a_p, byte n_p)
  117750. {
  117751. register sp_digit* r asm ("r0") = r_p;
  117752. register const sp_digit* a asm ("r1") = a_p;
  117753. register byte n asm ("r2") = n_p;
  117754. __asm__ __volatile__ (
  117755. "rsb r12, %[n], #31\n\t"
  117756. "ldr r5, [%[a], #132]\n\t"
  117757. "lsr r6, r5, #1\n\t"
  117758. "lsl r5, r5, %[n]\n\t"
  117759. "lsr r6, r6, r12\n\t"
  117760. "ldr r4, [%[a], #128]\n\t"
  117761. "str r6, [%[r], #136]\n\t"
  117762. "lsr r3, r4, #1\n\t"
  117763. "lsl r4, r4, %[n]\n\t"
  117764. "lsr r3, r3, r12\n\t"
  117765. "orr r5, r5, r3\n\t"
  117766. "ldr r6, [%[a], #124]\n\t"
  117767. "str r5, [%[r], #132]\n\t"
  117768. "lsr r3, r6, #1\n\t"
  117769. "lsl r6, r6, %[n]\n\t"
  117770. "lsr r3, r3, r12\n\t"
  117771. "orr r4, r4, r3\n\t"
  117772. "ldr r5, [%[a], #120]\n\t"
  117773. "str r4, [%[r], #128]\n\t"
  117774. "lsr r3, r5, #1\n\t"
  117775. "lsl r5, r5, %[n]\n\t"
  117776. "lsr r3, r3, r12\n\t"
  117777. "orr r6, r6, r3\n\t"
  117778. "ldr r4, [%[a], #116]\n\t"
  117779. "str r6, [%[r], #124]\n\t"
  117780. "lsr r3, r4, #1\n\t"
  117781. "lsl r4, r4, %[n]\n\t"
  117782. "lsr r3, r3, r12\n\t"
  117783. "orr r5, r5, r3\n\t"
  117784. "ldr r6, [%[a], #112]\n\t"
  117785. "str r5, [%[r], #120]\n\t"
  117786. "lsr r3, r6, #1\n\t"
  117787. "lsl r6, r6, %[n]\n\t"
  117788. "lsr r3, r3, r12\n\t"
  117789. "orr r4, r4, r3\n\t"
  117790. "ldr r5, [%[a], #108]\n\t"
  117791. "str r4, [%[r], #116]\n\t"
  117792. "lsr r3, r5, #1\n\t"
  117793. "lsl r5, r5, %[n]\n\t"
  117794. "lsr r3, r3, r12\n\t"
  117795. "orr r6, r6, r3\n\t"
  117796. "ldr r4, [%[a], #104]\n\t"
  117797. "str r6, [%[r], #112]\n\t"
  117798. "lsr r3, r4, #1\n\t"
  117799. "lsl r4, r4, %[n]\n\t"
  117800. "lsr r3, r3, r12\n\t"
  117801. "orr r5, r5, r3\n\t"
  117802. "ldr r6, [%[a], #100]\n\t"
  117803. "str r5, [%[r], #108]\n\t"
  117804. "lsr r3, r6, #1\n\t"
  117805. "lsl r6, r6, %[n]\n\t"
  117806. "lsr r3, r3, r12\n\t"
  117807. "orr r4, r4, r3\n\t"
  117808. "ldr r5, [%[a], #96]\n\t"
  117809. "str r4, [%[r], #104]\n\t"
  117810. "lsr r3, r5, #1\n\t"
  117811. "lsl r5, r5, %[n]\n\t"
  117812. "lsr r3, r3, r12\n\t"
  117813. "orr r6, r6, r3\n\t"
  117814. "ldr r4, [%[a], #92]\n\t"
  117815. "str r6, [%[r], #100]\n\t"
  117816. "lsr r3, r4, #1\n\t"
  117817. "lsl r4, r4, %[n]\n\t"
  117818. "lsr r3, r3, r12\n\t"
  117819. "orr r5, r5, r3\n\t"
  117820. "ldr r6, [%[a], #88]\n\t"
  117821. "str r5, [%[r], #96]\n\t"
  117822. "lsr r3, r6, #1\n\t"
  117823. "lsl r6, r6, %[n]\n\t"
  117824. "lsr r3, r3, r12\n\t"
  117825. "orr r4, r4, r3\n\t"
  117826. "ldr r5, [%[a], #84]\n\t"
  117827. "str r4, [%[r], #92]\n\t"
  117828. "lsr r3, r5, #1\n\t"
  117829. "lsl r5, r5, %[n]\n\t"
  117830. "lsr r3, r3, r12\n\t"
  117831. "orr r6, r6, r3\n\t"
  117832. "ldr r4, [%[a], #80]\n\t"
  117833. "str r6, [%[r], #88]\n\t"
  117834. "lsr r3, r4, #1\n\t"
  117835. "lsl r4, r4, %[n]\n\t"
  117836. "lsr r3, r3, r12\n\t"
  117837. "orr r5, r5, r3\n\t"
  117838. "ldr r6, [%[a], #76]\n\t"
  117839. "str r5, [%[r], #84]\n\t"
  117840. "lsr r3, r6, #1\n\t"
  117841. "lsl r6, r6, %[n]\n\t"
  117842. "lsr r3, r3, r12\n\t"
  117843. "orr r4, r4, r3\n\t"
  117844. "ldr r5, [%[a], #72]\n\t"
  117845. "str r4, [%[r], #80]\n\t"
  117846. "lsr r3, r5, #1\n\t"
  117847. "lsl r5, r5, %[n]\n\t"
  117848. "lsr r3, r3, r12\n\t"
  117849. "orr r6, r6, r3\n\t"
  117850. "ldr r4, [%[a], #68]\n\t"
  117851. "str r6, [%[r], #76]\n\t"
  117852. "lsr r3, r4, #1\n\t"
  117853. "lsl r4, r4, %[n]\n\t"
  117854. "lsr r3, r3, r12\n\t"
  117855. "orr r5, r5, r3\n\t"
  117856. "ldr r6, [%[a], #64]\n\t"
  117857. "str r5, [%[r], #72]\n\t"
  117858. "lsr r3, r6, #1\n\t"
  117859. "lsl r6, r6, %[n]\n\t"
  117860. "lsr r3, r3, r12\n\t"
  117861. "orr r4, r4, r3\n\t"
  117862. "ldr r5, [%[a], #60]\n\t"
  117863. "str r4, [%[r], #68]\n\t"
  117864. "lsr r3, r5, #1\n\t"
  117865. "lsl r5, r5, %[n]\n\t"
  117866. "lsr r3, r3, r12\n\t"
  117867. "orr r6, r6, r3\n\t"
  117868. "ldr r4, [%[a], #56]\n\t"
  117869. "str r6, [%[r], #64]\n\t"
  117870. "lsr r3, r4, #1\n\t"
  117871. "lsl r4, r4, %[n]\n\t"
  117872. "lsr r3, r3, r12\n\t"
  117873. "orr r5, r5, r3\n\t"
  117874. "ldr r6, [%[a], #52]\n\t"
  117875. "str r5, [%[r], #60]\n\t"
  117876. "lsr r3, r6, #1\n\t"
  117877. "lsl r6, r6, %[n]\n\t"
  117878. "lsr r3, r3, r12\n\t"
  117879. "orr r4, r4, r3\n\t"
  117880. "ldr r5, [%[a], #48]\n\t"
  117881. "str r4, [%[r], #56]\n\t"
  117882. "lsr r3, r5, #1\n\t"
  117883. "lsl r5, r5, %[n]\n\t"
  117884. "lsr r3, r3, r12\n\t"
  117885. "orr r6, r6, r3\n\t"
  117886. "ldr r4, [%[a], #44]\n\t"
  117887. "str r6, [%[r], #52]\n\t"
  117888. "lsr r3, r4, #1\n\t"
  117889. "lsl r4, r4, %[n]\n\t"
  117890. "lsr r3, r3, r12\n\t"
  117891. "orr r5, r5, r3\n\t"
  117892. "ldr r6, [%[a], #40]\n\t"
  117893. "str r5, [%[r], #48]\n\t"
  117894. "lsr r3, r6, #1\n\t"
  117895. "lsl r6, r6, %[n]\n\t"
  117896. "lsr r3, r3, r12\n\t"
  117897. "orr r4, r4, r3\n\t"
  117898. "ldr r5, [%[a], #36]\n\t"
  117899. "str r4, [%[r], #44]\n\t"
  117900. "lsr r3, r5, #1\n\t"
  117901. "lsl r5, r5, %[n]\n\t"
  117902. "lsr r3, r3, r12\n\t"
  117903. "orr r6, r6, r3\n\t"
  117904. "ldr r4, [%[a], #32]\n\t"
  117905. "str r6, [%[r], #40]\n\t"
  117906. "lsr r3, r4, #1\n\t"
  117907. "lsl r4, r4, %[n]\n\t"
  117908. "lsr r3, r3, r12\n\t"
  117909. "orr r5, r5, r3\n\t"
  117910. "ldr r6, [%[a], #28]\n\t"
  117911. "str r5, [%[r], #36]\n\t"
  117912. "lsr r3, r6, #1\n\t"
  117913. "lsl r6, r6, %[n]\n\t"
  117914. "lsr r3, r3, r12\n\t"
  117915. "orr r4, r4, r3\n\t"
  117916. "ldr r5, [%[a], #24]\n\t"
  117917. "str r4, [%[r], #32]\n\t"
  117918. "lsr r3, r5, #1\n\t"
  117919. "lsl r5, r5, %[n]\n\t"
  117920. "lsr r3, r3, r12\n\t"
  117921. "orr r6, r6, r3\n\t"
  117922. "ldr r4, [%[a], #20]\n\t"
  117923. "str r6, [%[r], #28]\n\t"
  117924. "lsr r3, r4, #1\n\t"
  117925. "lsl r4, r4, %[n]\n\t"
  117926. "lsr r3, r3, r12\n\t"
  117927. "orr r5, r5, r3\n\t"
  117928. "ldr r6, [%[a], #16]\n\t"
  117929. "str r5, [%[r], #24]\n\t"
  117930. "lsr r3, r6, #1\n\t"
  117931. "lsl r6, r6, %[n]\n\t"
  117932. "lsr r3, r3, r12\n\t"
  117933. "orr r4, r4, r3\n\t"
  117934. "ldr r5, [%[a], #12]\n\t"
  117935. "str r4, [%[r], #20]\n\t"
  117936. "lsr r3, r5, #1\n\t"
  117937. "lsl r5, r5, %[n]\n\t"
  117938. "lsr r3, r3, r12\n\t"
  117939. "orr r6, r6, r3\n\t"
  117940. "ldr r4, [%[a], #8]\n\t"
  117941. "str r6, [%[r], #16]\n\t"
  117942. "lsr r3, r4, #1\n\t"
  117943. "lsl r4, r4, %[n]\n\t"
  117944. "lsr r3, r3, r12\n\t"
  117945. "orr r5, r5, r3\n\t"
  117946. "ldr r6, [%[a], #4]\n\t"
  117947. "str r5, [%[r], #12]\n\t"
  117948. "lsr r3, r6, #1\n\t"
  117949. "lsl r6, r6, %[n]\n\t"
  117950. "lsr r3, r3, r12\n\t"
  117951. "orr r4, r4, r3\n\t"
  117952. "ldr r5, [%[a]]\n\t"
  117953. "str r4, [%[r], #8]\n\t"
  117954. "lsr r3, r5, #1\n\t"
  117955. "lsl r5, r5, %[n]\n\t"
  117956. "lsr r3, r3, r12\n\t"
  117957. "orr r6, r6, r3\n\t"
  117958. "str r5, [%[r]]\n\t"
  117959. "str r6, [%[r], #4]\n\t"
  117960. : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n)
  117961. :
  117962. : "memory", "r4", "r5", "r6", "r3", "r12"
  117963. );
  117964. }
  117965. #ifdef WOLFSSL_SP_SMALL
  117966. /* Sub b from a into a. (a -= b)
  117967. *
  117968. * a A single precision integer.
  117969. * b A single precision integer.
  117970. */
  117971. static sp_digit sp_521_sub_in_place_17(sp_digit* a_p, const sp_digit* b_p)
  117972. {
  117973. register sp_digit* a asm ("r0") = a_p;
  117974. register const sp_digit* b asm ("r1") = b_p;
  117975. __asm__ __volatile__ (
  117976. "mov r10, #0\n\t"
  117977. "mov r12, #0\n\t"
  117978. "add lr, %[a], #0x40\n\t"
  117979. "\n"
  117980. "L_sp_521_sub_in_pkace_17_word_%=: \n\t"
  117981. "subs r12, r10, r12\n\t"
  117982. "ldm %[a], {r2, r3, r4, r5}\n\t"
  117983. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  117984. "sbcs r2, r2, r6\n\t"
  117985. "sbcs r3, r3, r7\n\t"
  117986. "sbcs r4, r4, r8\n\t"
  117987. "sbcs r5, r5, r9\n\t"
  117988. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  117989. "sbc r12, r10, r10\n\t"
  117990. "cmp %[a], lr\n\t"
  117991. "bne L_sp_521_sub_in_pkace_17_word_%=\n\t"
  117992. "subs r12, r10, r12\n\t"
  117993. "ldm %[a], {r2}\n\t"
  117994. "ldm %[b]!, {r6}\n\t"
  117995. "sbcs r2, r2, r6\n\t"
  117996. "stm %[a]!, {r2}\n\t"
  117997. "sbc %[a], r10, r10\n\t"
  117998. : [a] "+r" (a), [b] "+r" (b)
  117999. :
  118000. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10"
  118001. );
  118002. return (uint32_t)(size_t)a;
  118003. }
  118004. #else
  118005. /* Sub b from a into a. (a -= b)
  118006. *
  118007. * a A single precision integer and result.
  118008. * b A single precision integer.
  118009. */
  118010. static sp_digit sp_521_sub_in_place_17(sp_digit* a_p, const sp_digit* b_p)
  118011. {
  118012. register sp_digit* a asm ("r0") = a_p;
  118013. register const sp_digit* b asm ("r1") = b_p;
  118014. __asm__ __volatile__ (
  118015. "ldm %[a], {r2, r3, r4, r5}\n\t"
  118016. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  118017. "subs r2, r2, r6\n\t"
  118018. "sbcs r3, r3, r7\n\t"
  118019. "sbcs r4, r4, r8\n\t"
  118020. "sbcs r5, r5, r9\n\t"
  118021. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  118022. "ldm %[a], {r2, r3, r4, r5}\n\t"
  118023. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  118024. "sbcs r2, r2, r6\n\t"
  118025. "sbcs r3, r3, r7\n\t"
  118026. "sbcs r4, r4, r8\n\t"
  118027. "sbcs r5, r5, r9\n\t"
  118028. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  118029. "ldm %[a], {r2, r3, r4, r5}\n\t"
  118030. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  118031. "sbcs r2, r2, r6\n\t"
  118032. "sbcs r3, r3, r7\n\t"
  118033. "sbcs r4, r4, r8\n\t"
  118034. "sbcs r5, r5, r9\n\t"
  118035. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  118036. "ldm %[a], {r2, r3, r4, r5}\n\t"
  118037. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  118038. "sbcs r2, r2, r6\n\t"
  118039. "sbcs r3, r3, r7\n\t"
  118040. "sbcs r4, r4, r8\n\t"
  118041. "sbcs r5, r5, r9\n\t"
  118042. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  118043. "ldm %[a], {r2}\n\t"
  118044. "ldm %[b]!, {r6}\n\t"
  118045. "sbcs r2, r2, r6\n\t"
  118046. "stm %[a]!, {r2}\n\t"
  118047. "sbc %[a], r9, r9\n\t"
  118048. : [a] "+r" (a), [b] "+r" (b)
  118049. :
  118050. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  118051. );
  118052. return (uint32_t)(size_t)a;
  118053. }
  118054. #endif /* WOLFSSL_SP_SMALL */
  118055. #ifdef WOLFSSL_SP_SMALL
  118056. /* Mul a by digit b into r. (r = a * b)
  118057. *
  118058. * r A single precision integer.
  118059. * a A single precision integer.
  118060. * b A single precision digit.
  118061. */
  118062. static void sp_521_mul_d_17(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  118063. {
  118064. register sp_digit* r asm ("r0") = r_p;
  118065. register const sp_digit* a asm ("r1") = a_p;
  118066. register sp_digit b asm ("r2") = b_p;
  118067. __asm__ __volatile__ (
  118068. "mov r10, #0\n\t"
  118069. /* A[0] * B */
  118070. "ldr r8, [%[a]]\n\t"
  118071. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118072. "lsl r6, %[b], #16\n\t"
  118073. "lsl r5, r8, #16\n\t"
  118074. "lsr r6, r6, #16\n\t"
  118075. "lsr r5, r5, #16\n\t"
  118076. "mul r5, r6, r5\n\t"
  118077. "lsr r7, r8, #16\n\t"
  118078. "mul r6, r7, r6\n\t"
  118079. "lsr r3, r6, #16\n\t"
  118080. "lsl r6, r6, #16\n\t"
  118081. "adds r5, r5, r6\n\t"
  118082. "adc r3, r3, #0\n\t"
  118083. "lsr r6, %[b], #16\n\t"
  118084. "mul r7, r6, r7\n\t"
  118085. "add r3, r3, r7\n\t"
  118086. "lsl r7, r8, #16\n\t"
  118087. "lsr r7, r7, #16\n\t"
  118088. "mul r6, r7, r6\n\t"
  118089. "lsr r7, r6, #16\n\t"
  118090. "lsl r6, r6, #16\n\t"
  118091. "adds r5, r5, r6\n\t"
  118092. "adc r3, r3, r7\n\t"
  118093. #else
  118094. "umull r5, r3, %[b], r8\n\t"
  118095. #endif
  118096. "mov r4, #0\n\t"
  118097. "str r5, [%[r]]\n\t"
  118098. "mov r5, #0\n\t"
  118099. "mov r9, #4\n\t"
  118100. "\n"
  118101. "L_sp_521_mul_d_17_word_%=: \n\t"
  118102. /* A[i] * B */
  118103. "ldr r8, [%[a], r9]\n\t"
  118104. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118105. "lsl r6, %[b], #16\n\t"
  118106. "lsl r7, r8, #16\n\t"
  118107. "lsr r6, r6, #16\n\t"
  118108. "lsr r7, r7, #16\n\t"
  118109. "mul r7, r6, r7\n\t"
  118110. "adds r3, r3, r7\n\t"
  118111. "adcs r4, r4, #0\n\t"
  118112. "adc r5, r5, #0\n\t"
  118113. "lsr r7, r8, #16\n\t"
  118114. "mul r6, r7, r6\n\t"
  118115. "lsr r7, r6, #16\n\t"
  118116. "lsl r6, r6, #16\n\t"
  118117. "adds r3, r3, r6\n\t"
  118118. "adcs r4, r4, r7\n\t"
  118119. "adc r5, r5, #0\n\t"
  118120. "lsr r6, %[b], #16\n\t"
  118121. "lsr r7, r8, #16\n\t"
  118122. "mul r7, r6, r7\n\t"
  118123. "adds r4, r4, r7\n\t"
  118124. "adc r5, r5, #0\n\t"
  118125. "lsl r7, r8, #16\n\t"
  118126. "lsr r7, r7, #16\n\t"
  118127. "mul r6, r7, r6\n\t"
  118128. "lsr r7, r6, #16\n\t"
  118129. "lsl r6, r6, #16\n\t"
  118130. "adds r3, r3, r6\n\t"
  118131. "adcs r4, r4, r7\n\t"
  118132. "adc r5, r5, #0\n\t"
  118133. #else
  118134. "umull r6, r7, %[b], r8\n\t"
  118135. "adds r3, r3, r6\n\t"
  118136. "adcs r4, r4, r7\n\t"
  118137. "adc r5, r5, #0\n\t"
  118138. #endif
  118139. "str r3, [%[r], r9]\n\t"
  118140. "mov r3, r4\n\t"
  118141. "mov r4, r5\n\t"
  118142. "mov r5, #0\n\t"
  118143. "add r9, r9, #4\n\t"
  118144. "cmp r9, #0x44\n\t"
  118145. "blt L_sp_521_mul_d_17_word_%=\n\t"
  118146. "str r3, [%[r], #68]\n\t"
  118147. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  118148. :
  118149. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  118150. );
  118151. }
  118152. #else
  118153. /* Mul a by digit b into r. (r = a * b)
  118154. *
  118155. * r A single precision integer.
  118156. * a A single precision integer.
  118157. * b A single precision digit.
  118158. */
  118159. static void sp_521_mul_d_17(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  118160. {
  118161. register sp_digit* r asm ("r0") = r_p;
  118162. register const sp_digit* a asm ("r1") = a_p;
  118163. register sp_digit b asm ("r2") = b_p;
  118164. __asm__ __volatile__ (
  118165. "mov r10, #0\n\t"
  118166. /* A[0] * B */
  118167. "ldr r8, [%[a]], #4\n\t"
  118168. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118169. "lsl r6, %[b], #16\n\t"
  118170. "lsl r3, r8, #16\n\t"
  118171. "lsr r6, r6, #16\n\t"
  118172. "lsr r3, r3, #16\n\t"
  118173. "mul r3, r6, r3\n\t"
  118174. "lsr r7, r8, #16\n\t"
  118175. "mul r6, r7, r6\n\t"
  118176. "lsr r4, r6, #16\n\t"
  118177. "lsl r6, r6, #16\n\t"
  118178. "adds r3, r3, r6\n\t"
  118179. "adc r4, r4, #0\n\t"
  118180. "lsr r6, %[b], #16\n\t"
  118181. "mul r7, r6, r7\n\t"
  118182. "add r4, r4, r7\n\t"
  118183. "lsl r7, r8, #16\n\t"
  118184. "lsr r7, r7, #16\n\t"
  118185. "mul r6, r7, r6\n\t"
  118186. "lsr r7, r6, #16\n\t"
  118187. "lsl r6, r6, #16\n\t"
  118188. "adds r3, r3, r6\n\t"
  118189. "adc r4, r4, r7\n\t"
  118190. #else
  118191. "umull r3, r4, %[b], r8\n\t"
  118192. #endif
  118193. "mov r5, #0\n\t"
  118194. "str r3, [%[r]], #4\n\t"
  118195. /* A[1] * B */
  118196. "ldr r8, [%[a]], #4\n\t"
  118197. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118198. "lsl r6, %[b], #16\n\t"
  118199. "lsl r7, r8, #16\n\t"
  118200. "lsr r6, r6, #16\n\t"
  118201. "lsr r7, r7, #16\n\t"
  118202. "mul r7, r6, r7\n\t"
  118203. "adds r4, r4, r7\n\t"
  118204. "adcs r5, r5, #0\n\t"
  118205. "mov r3, #0\n\t"
  118206. "adc r3, r3, #0\n\t"
  118207. "lsr r7, r8, #16\n\t"
  118208. "mul r6, r7, r6\n\t"
  118209. "lsr r7, r6, #16\n\t"
  118210. "lsl r6, r6, #16\n\t"
  118211. "adds r4, r4, r6\n\t"
  118212. "adcs r5, r5, r7\n\t"
  118213. "adc r3, r3, #0\n\t"
  118214. "lsr r6, %[b], #16\n\t"
  118215. "lsr r7, r8, #16\n\t"
  118216. "mul r7, r6, r7\n\t"
  118217. "adds r5, r5, r7\n\t"
  118218. "adc r3, r3, #0\n\t"
  118219. "lsl r7, r8, #16\n\t"
  118220. "lsr r7, r7, #16\n\t"
  118221. "mul r6, r7, r6\n\t"
  118222. "lsr r7, r6, #16\n\t"
  118223. "lsl r6, r6, #16\n\t"
  118224. "adds r4, r4, r6\n\t"
  118225. "adcs r5, r5, r7\n\t"
  118226. "adc r3, r3, #0\n\t"
  118227. #else
  118228. "umull r6, r7, %[b], r8\n\t"
  118229. "adds r4, r4, r6\n\t"
  118230. "adcs r5, r5, r7\n\t"
  118231. "mov r3, #0\n\t"
  118232. "adc r3, r3, #0\n\t"
  118233. #endif
  118234. "str r4, [%[r]], #4\n\t"
  118235. /* A[2] * B */
  118236. "ldr r8, [%[a]], #4\n\t"
  118237. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118238. "lsl r6, %[b], #16\n\t"
  118239. "lsl r7, r8, #16\n\t"
  118240. "lsr r6, r6, #16\n\t"
  118241. "lsr r7, r7, #16\n\t"
  118242. "mul r7, r6, r7\n\t"
  118243. "adds r5, r5, r7\n\t"
  118244. "adcs r3, r3, #0\n\t"
  118245. "mov r4, #0\n\t"
  118246. "adc r4, r4, #0\n\t"
  118247. "lsr r7, r8, #16\n\t"
  118248. "mul r6, r7, r6\n\t"
  118249. "lsr r7, r6, #16\n\t"
  118250. "lsl r6, r6, #16\n\t"
  118251. "adds r5, r5, r6\n\t"
  118252. "adcs r3, r3, r7\n\t"
  118253. "adc r4, r4, #0\n\t"
  118254. "lsr r6, %[b], #16\n\t"
  118255. "lsr r7, r8, #16\n\t"
  118256. "mul r7, r6, r7\n\t"
  118257. "adds r3, r3, r7\n\t"
  118258. "adc r4, r4, #0\n\t"
  118259. "lsl r7, r8, #16\n\t"
  118260. "lsr r7, r7, #16\n\t"
  118261. "mul r6, r7, r6\n\t"
  118262. "lsr r7, r6, #16\n\t"
  118263. "lsl r6, r6, #16\n\t"
  118264. "adds r5, r5, r6\n\t"
  118265. "adcs r3, r3, r7\n\t"
  118266. "adc r4, r4, #0\n\t"
  118267. #else
  118268. "umull r6, r7, %[b], r8\n\t"
  118269. "adds r5, r5, r6\n\t"
  118270. "adcs r3, r3, r7\n\t"
  118271. "mov r4, #0\n\t"
  118272. "adc r4, r4, #0\n\t"
  118273. #endif
  118274. "str r5, [%[r]], #4\n\t"
  118275. /* A[3] * B */
  118276. "ldr r8, [%[a]], #4\n\t"
  118277. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118278. "lsl r6, %[b], #16\n\t"
  118279. "lsl r7, r8, #16\n\t"
  118280. "lsr r6, r6, #16\n\t"
  118281. "lsr r7, r7, #16\n\t"
  118282. "mul r7, r6, r7\n\t"
  118283. "adds r3, r3, r7\n\t"
  118284. "adcs r4, r4, #0\n\t"
  118285. "mov r5, #0\n\t"
  118286. "adc r5, r5, #0\n\t"
  118287. "lsr r7, r8, #16\n\t"
  118288. "mul r6, r7, r6\n\t"
  118289. "lsr r7, r6, #16\n\t"
  118290. "lsl r6, r6, #16\n\t"
  118291. "adds r3, r3, r6\n\t"
  118292. "adcs r4, r4, r7\n\t"
  118293. "adc r5, r5, #0\n\t"
  118294. "lsr r6, %[b], #16\n\t"
  118295. "lsr r7, r8, #16\n\t"
  118296. "mul r7, r6, r7\n\t"
  118297. "adds r4, r4, r7\n\t"
  118298. "adc r5, r5, #0\n\t"
  118299. "lsl r7, r8, #16\n\t"
  118300. "lsr r7, r7, #16\n\t"
  118301. "mul r6, r7, r6\n\t"
  118302. "lsr r7, r6, #16\n\t"
  118303. "lsl r6, r6, #16\n\t"
  118304. "adds r3, r3, r6\n\t"
  118305. "adcs r4, r4, r7\n\t"
  118306. "adc r5, r5, #0\n\t"
  118307. #else
  118308. "umull r6, r7, %[b], r8\n\t"
  118309. "adds r3, r3, r6\n\t"
  118310. "adcs r4, r4, r7\n\t"
  118311. "mov r5, #0\n\t"
  118312. "adc r5, r5, #0\n\t"
  118313. #endif
  118314. "str r3, [%[r]], #4\n\t"
  118315. /* A[4] * B */
  118316. "ldr r8, [%[a]], #4\n\t"
  118317. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118318. "lsl r6, %[b], #16\n\t"
  118319. "lsl r7, r8, #16\n\t"
  118320. "lsr r6, r6, #16\n\t"
  118321. "lsr r7, r7, #16\n\t"
  118322. "mul r7, r6, r7\n\t"
  118323. "adds r4, r4, r7\n\t"
  118324. "adcs r5, r5, #0\n\t"
  118325. "mov r3, #0\n\t"
  118326. "adc r3, r3, #0\n\t"
  118327. "lsr r7, r8, #16\n\t"
  118328. "mul r6, r7, r6\n\t"
  118329. "lsr r7, r6, #16\n\t"
  118330. "lsl r6, r6, #16\n\t"
  118331. "adds r4, r4, r6\n\t"
  118332. "adcs r5, r5, r7\n\t"
  118333. "adc r3, r3, #0\n\t"
  118334. "lsr r6, %[b], #16\n\t"
  118335. "lsr r7, r8, #16\n\t"
  118336. "mul r7, r6, r7\n\t"
  118337. "adds r5, r5, r7\n\t"
  118338. "adc r3, r3, #0\n\t"
  118339. "lsl r7, r8, #16\n\t"
  118340. "lsr r7, r7, #16\n\t"
  118341. "mul r6, r7, r6\n\t"
  118342. "lsr r7, r6, #16\n\t"
  118343. "lsl r6, r6, #16\n\t"
  118344. "adds r4, r4, r6\n\t"
  118345. "adcs r5, r5, r7\n\t"
  118346. "adc r3, r3, #0\n\t"
  118347. #else
  118348. "umull r6, r7, %[b], r8\n\t"
  118349. "adds r4, r4, r6\n\t"
  118350. "adcs r5, r5, r7\n\t"
  118351. "mov r3, #0\n\t"
  118352. "adc r3, r3, #0\n\t"
  118353. #endif
  118354. "str r4, [%[r]], #4\n\t"
  118355. /* A[5] * B */
  118356. "ldr r8, [%[a]], #4\n\t"
  118357. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118358. "lsl r6, %[b], #16\n\t"
  118359. "lsl r7, r8, #16\n\t"
  118360. "lsr r6, r6, #16\n\t"
  118361. "lsr r7, r7, #16\n\t"
  118362. "mul r7, r6, r7\n\t"
  118363. "adds r5, r5, r7\n\t"
  118364. "adcs r3, r3, #0\n\t"
  118365. "mov r4, #0\n\t"
  118366. "adc r4, r4, #0\n\t"
  118367. "lsr r7, r8, #16\n\t"
  118368. "mul r6, r7, r6\n\t"
  118369. "lsr r7, r6, #16\n\t"
  118370. "lsl r6, r6, #16\n\t"
  118371. "adds r5, r5, r6\n\t"
  118372. "adcs r3, r3, r7\n\t"
  118373. "adc r4, r4, #0\n\t"
  118374. "lsr r6, %[b], #16\n\t"
  118375. "lsr r7, r8, #16\n\t"
  118376. "mul r7, r6, r7\n\t"
  118377. "adds r3, r3, r7\n\t"
  118378. "adc r4, r4, #0\n\t"
  118379. "lsl r7, r8, #16\n\t"
  118380. "lsr r7, r7, #16\n\t"
  118381. "mul r6, r7, r6\n\t"
  118382. "lsr r7, r6, #16\n\t"
  118383. "lsl r6, r6, #16\n\t"
  118384. "adds r5, r5, r6\n\t"
  118385. "adcs r3, r3, r7\n\t"
  118386. "adc r4, r4, #0\n\t"
  118387. #else
  118388. "umull r6, r7, %[b], r8\n\t"
  118389. "adds r5, r5, r6\n\t"
  118390. "adcs r3, r3, r7\n\t"
  118391. "mov r4, #0\n\t"
  118392. "adc r4, r4, #0\n\t"
  118393. #endif
  118394. "str r5, [%[r]], #4\n\t"
  118395. /* A[6] * B */
  118396. "ldr r8, [%[a]], #4\n\t"
  118397. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118398. "lsl r6, %[b], #16\n\t"
  118399. "lsl r7, r8, #16\n\t"
  118400. "lsr r6, r6, #16\n\t"
  118401. "lsr r7, r7, #16\n\t"
  118402. "mul r7, r6, r7\n\t"
  118403. "adds r3, r3, r7\n\t"
  118404. "adcs r4, r4, #0\n\t"
  118405. "mov r5, #0\n\t"
  118406. "adc r5, r5, #0\n\t"
  118407. "lsr r7, r8, #16\n\t"
  118408. "mul r6, r7, r6\n\t"
  118409. "lsr r7, r6, #16\n\t"
  118410. "lsl r6, r6, #16\n\t"
  118411. "adds r3, r3, r6\n\t"
  118412. "adcs r4, r4, r7\n\t"
  118413. "adc r5, r5, #0\n\t"
  118414. "lsr r6, %[b], #16\n\t"
  118415. "lsr r7, r8, #16\n\t"
  118416. "mul r7, r6, r7\n\t"
  118417. "adds r4, r4, r7\n\t"
  118418. "adc r5, r5, #0\n\t"
  118419. "lsl r7, r8, #16\n\t"
  118420. "lsr r7, r7, #16\n\t"
  118421. "mul r6, r7, r6\n\t"
  118422. "lsr r7, r6, #16\n\t"
  118423. "lsl r6, r6, #16\n\t"
  118424. "adds r3, r3, r6\n\t"
  118425. "adcs r4, r4, r7\n\t"
  118426. "adc r5, r5, #0\n\t"
  118427. #else
  118428. "umull r6, r7, %[b], r8\n\t"
  118429. "adds r3, r3, r6\n\t"
  118430. "adcs r4, r4, r7\n\t"
  118431. "mov r5, #0\n\t"
  118432. "adc r5, r5, #0\n\t"
  118433. #endif
  118434. "str r3, [%[r]], #4\n\t"
  118435. /* A[7] * B */
  118436. "ldr r8, [%[a]], #4\n\t"
  118437. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118438. "lsl r6, %[b], #16\n\t"
  118439. "lsl r7, r8, #16\n\t"
  118440. "lsr r6, r6, #16\n\t"
  118441. "lsr r7, r7, #16\n\t"
  118442. "mul r7, r6, r7\n\t"
  118443. "adds r4, r4, r7\n\t"
  118444. "adcs r5, r5, #0\n\t"
  118445. "mov r3, #0\n\t"
  118446. "adc r3, r3, #0\n\t"
  118447. "lsr r7, r8, #16\n\t"
  118448. "mul r6, r7, r6\n\t"
  118449. "lsr r7, r6, #16\n\t"
  118450. "lsl r6, r6, #16\n\t"
  118451. "adds r4, r4, r6\n\t"
  118452. "adcs r5, r5, r7\n\t"
  118453. "adc r3, r3, #0\n\t"
  118454. "lsr r6, %[b], #16\n\t"
  118455. "lsr r7, r8, #16\n\t"
  118456. "mul r7, r6, r7\n\t"
  118457. "adds r5, r5, r7\n\t"
  118458. "adc r3, r3, #0\n\t"
  118459. "lsl r7, r8, #16\n\t"
  118460. "lsr r7, r7, #16\n\t"
  118461. "mul r6, r7, r6\n\t"
  118462. "lsr r7, r6, #16\n\t"
  118463. "lsl r6, r6, #16\n\t"
  118464. "adds r4, r4, r6\n\t"
  118465. "adcs r5, r5, r7\n\t"
  118466. "adc r3, r3, #0\n\t"
  118467. #else
  118468. "umull r6, r7, %[b], r8\n\t"
  118469. "adds r4, r4, r6\n\t"
  118470. "adcs r5, r5, r7\n\t"
  118471. "mov r3, #0\n\t"
  118472. "adc r3, r3, #0\n\t"
  118473. #endif
  118474. "str r4, [%[r]], #4\n\t"
  118475. /* A[8] * B */
  118476. "ldr r8, [%[a]], #4\n\t"
  118477. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118478. "lsl r6, %[b], #16\n\t"
  118479. "lsl r7, r8, #16\n\t"
  118480. "lsr r6, r6, #16\n\t"
  118481. "lsr r7, r7, #16\n\t"
  118482. "mul r7, r6, r7\n\t"
  118483. "adds r5, r5, r7\n\t"
  118484. "adcs r3, r3, #0\n\t"
  118485. "mov r4, #0\n\t"
  118486. "adc r4, r4, #0\n\t"
  118487. "lsr r7, r8, #16\n\t"
  118488. "mul r6, r7, r6\n\t"
  118489. "lsr r7, r6, #16\n\t"
  118490. "lsl r6, r6, #16\n\t"
  118491. "adds r5, r5, r6\n\t"
  118492. "adcs r3, r3, r7\n\t"
  118493. "adc r4, r4, #0\n\t"
  118494. "lsr r6, %[b], #16\n\t"
  118495. "lsr r7, r8, #16\n\t"
  118496. "mul r7, r6, r7\n\t"
  118497. "adds r3, r3, r7\n\t"
  118498. "adc r4, r4, #0\n\t"
  118499. "lsl r7, r8, #16\n\t"
  118500. "lsr r7, r7, #16\n\t"
  118501. "mul r6, r7, r6\n\t"
  118502. "lsr r7, r6, #16\n\t"
  118503. "lsl r6, r6, #16\n\t"
  118504. "adds r5, r5, r6\n\t"
  118505. "adcs r3, r3, r7\n\t"
  118506. "adc r4, r4, #0\n\t"
  118507. #else
  118508. "umull r6, r7, %[b], r8\n\t"
  118509. "adds r5, r5, r6\n\t"
  118510. "adcs r3, r3, r7\n\t"
  118511. "mov r4, #0\n\t"
  118512. "adc r4, r4, #0\n\t"
  118513. #endif
  118514. "str r5, [%[r]], #4\n\t"
  118515. /* A[9] * B */
  118516. "ldr r8, [%[a]], #4\n\t"
  118517. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118518. "lsl r6, %[b], #16\n\t"
  118519. "lsl r7, r8, #16\n\t"
  118520. "lsr r6, r6, #16\n\t"
  118521. "lsr r7, r7, #16\n\t"
  118522. "mul r7, r6, r7\n\t"
  118523. "adds r3, r3, r7\n\t"
  118524. "adcs r4, r4, #0\n\t"
  118525. "mov r5, #0\n\t"
  118526. "adc r5, r5, #0\n\t"
  118527. "lsr r7, r8, #16\n\t"
  118528. "mul r6, r7, r6\n\t"
  118529. "lsr r7, r6, #16\n\t"
  118530. "lsl r6, r6, #16\n\t"
  118531. "adds r3, r3, r6\n\t"
  118532. "adcs r4, r4, r7\n\t"
  118533. "adc r5, r5, #0\n\t"
  118534. "lsr r6, %[b], #16\n\t"
  118535. "lsr r7, r8, #16\n\t"
  118536. "mul r7, r6, r7\n\t"
  118537. "adds r4, r4, r7\n\t"
  118538. "adc r5, r5, #0\n\t"
  118539. "lsl r7, r8, #16\n\t"
  118540. "lsr r7, r7, #16\n\t"
  118541. "mul r6, r7, r6\n\t"
  118542. "lsr r7, r6, #16\n\t"
  118543. "lsl r6, r6, #16\n\t"
  118544. "adds r3, r3, r6\n\t"
  118545. "adcs r4, r4, r7\n\t"
  118546. "adc r5, r5, #0\n\t"
  118547. #else
  118548. "umull r6, r7, %[b], r8\n\t"
  118549. "adds r3, r3, r6\n\t"
  118550. "adcs r4, r4, r7\n\t"
  118551. "mov r5, #0\n\t"
  118552. "adc r5, r5, #0\n\t"
  118553. #endif
  118554. "str r3, [%[r]], #4\n\t"
  118555. /* A[10] * B */
  118556. "ldr r8, [%[a]], #4\n\t"
  118557. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118558. "lsl r6, %[b], #16\n\t"
  118559. "lsl r7, r8, #16\n\t"
  118560. "lsr r6, r6, #16\n\t"
  118561. "lsr r7, r7, #16\n\t"
  118562. "mul r7, r6, r7\n\t"
  118563. "adds r4, r4, r7\n\t"
  118564. "adcs r5, r5, #0\n\t"
  118565. "mov r3, #0\n\t"
  118566. "adc r3, r3, #0\n\t"
  118567. "lsr r7, r8, #16\n\t"
  118568. "mul r6, r7, r6\n\t"
  118569. "lsr r7, r6, #16\n\t"
  118570. "lsl r6, r6, #16\n\t"
  118571. "adds r4, r4, r6\n\t"
  118572. "adcs r5, r5, r7\n\t"
  118573. "adc r3, r3, #0\n\t"
  118574. "lsr r6, %[b], #16\n\t"
  118575. "lsr r7, r8, #16\n\t"
  118576. "mul r7, r6, r7\n\t"
  118577. "adds r5, r5, r7\n\t"
  118578. "adc r3, r3, #0\n\t"
  118579. "lsl r7, r8, #16\n\t"
  118580. "lsr r7, r7, #16\n\t"
  118581. "mul r6, r7, r6\n\t"
  118582. "lsr r7, r6, #16\n\t"
  118583. "lsl r6, r6, #16\n\t"
  118584. "adds r4, r4, r6\n\t"
  118585. "adcs r5, r5, r7\n\t"
  118586. "adc r3, r3, #0\n\t"
  118587. #else
  118588. "umull r6, r7, %[b], r8\n\t"
  118589. "adds r4, r4, r6\n\t"
  118590. "adcs r5, r5, r7\n\t"
  118591. "mov r3, #0\n\t"
  118592. "adc r3, r3, #0\n\t"
  118593. #endif
  118594. "str r4, [%[r]], #4\n\t"
  118595. /* A[11] * B */
  118596. "ldr r8, [%[a]], #4\n\t"
  118597. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118598. "lsl r6, %[b], #16\n\t"
  118599. "lsl r7, r8, #16\n\t"
  118600. "lsr r6, r6, #16\n\t"
  118601. "lsr r7, r7, #16\n\t"
  118602. "mul r7, r6, r7\n\t"
  118603. "adds r5, r5, r7\n\t"
  118604. "adcs r3, r3, #0\n\t"
  118605. "mov r4, #0\n\t"
  118606. "adc r4, r4, #0\n\t"
  118607. "lsr r7, r8, #16\n\t"
  118608. "mul r6, r7, r6\n\t"
  118609. "lsr r7, r6, #16\n\t"
  118610. "lsl r6, r6, #16\n\t"
  118611. "adds r5, r5, r6\n\t"
  118612. "adcs r3, r3, r7\n\t"
  118613. "adc r4, r4, #0\n\t"
  118614. "lsr r6, %[b], #16\n\t"
  118615. "lsr r7, r8, #16\n\t"
  118616. "mul r7, r6, r7\n\t"
  118617. "adds r3, r3, r7\n\t"
  118618. "adc r4, r4, #0\n\t"
  118619. "lsl r7, r8, #16\n\t"
  118620. "lsr r7, r7, #16\n\t"
  118621. "mul r6, r7, r6\n\t"
  118622. "lsr r7, r6, #16\n\t"
  118623. "lsl r6, r6, #16\n\t"
  118624. "adds r5, r5, r6\n\t"
  118625. "adcs r3, r3, r7\n\t"
  118626. "adc r4, r4, #0\n\t"
  118627. #else
  118628. "umull r6, r7, %[b], r8\n\t"
  118629. "adds r5, r5, r6\n\t"
  118630. "adcs r3, r3, r7\n\t"
  118631. "mov r4, #0\n\t"
  118632. "adc r4, r4, #0\n\t"
  118633. #endif
  118634. "str r5, [%[r]], #4\n\t"
  118635. /* A[12] * B */
  118636. "ldr r8, [%[a]], #4\n\t"
  118637. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118638. "lsl r6, %[b], #16\n\t"
  118639. "lsl r7, r8, #16\n\t"
  118640. "lsr r6, r6, #16\n\t"
  118641. "lsr r7, r7, #16\n\t"
  118642. "mul r7, r6, r7\n\t"
  118643. "adds r3, r3, r7\n\t"
  118644. "adcs r4, r4, #0\n\t"
  118645. "mov r5, #0\n\t"
  118646. "adc r5, r5, #0\n\t"
  118647. "lsr r7, r8, #16\n\t"
  118648. "mul r6, r7, r6\n\t"
  118649. "lsr r7, r6, #16\n\t"
  118650. "lsl r6, r6, #16\n\t"
  118651. "adds r3, r3, r6\n\t"
  118652. "adcs r4, r4, r7\n\t"
  118653. "adc r5, r5, #0\n\t"
  118654. "lsr r6, %[b], #16\n\t"
  118655. "lsr r7, r8, #16\n\t"
  118656. "mul r7, r6, r7\n\t"
  118657. "adds r4, r4, r7\n\t"
  118658. "adc r5, r5, #0\n\t"
  118659. "lsl r7, r8, #16\n\t"
  118660. "lsr r7, r7, #16\n\t"
  118661. "mul r6, r7, r6\n\t"
  118662. "lsr r7, r6, #16\n\t"
  118663. "lsl r6, r6, #16\n\t"
  118664. "adds r3, r3, r6\n\t"
  118665. "adcs r4, r4, r7\n\t"
  118666. "adc r5, r5, #0\n\t"
  118667. #else
  118668. "umull r6, r7, %[b], r8\n\t"
  118669. "adds r3, r3, r6\n\t"
  118670. "adcs r4, r4, r7\n\t"
  118671. "mov r5, #0\n\t"
  118672. "adc r5, r5, #0\n\t"
  118673. #endif
  118674. "str r3, [%[r]], #4\n\t"
  118675. /* A[13] * B */
  118676. "ldr r8, [%[a]], #4\n\t"
  118677. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118678. "lsl r6, %[b], #16\n\t"
  118679. "lsl r7, r8, #16\n\t"
  118680. "lsr r6, r6, #16\n\t"
  118681. "lsr r7, r7, #16\n\t"
  118682. "mul r7, r6, r7\n\t"
  118683. "adds r4, r4, r7\n\t"
  118684. "adcs r5, r5, #0\n\t"
  118685. "mov r3, #0\n\t"
  118686. "adc r3, r3, #0\n\t"
  118687. "lsr r7, r8, #16\n\t"
  118688. "mul r6, r7, r6\n\t"
  118689. "lsr r7, r6, #16\n\t"
  118690. "lsl r6, r6, #16\n\t"
  118691. "adds r4, r4, r6\n\t"
  118692. "adcs r5, r5, r7\n\t"
  118693. "adc r3, r3, #0\n\t"
  118694. "lsr r6, %[b], #16\n\t"
  118695. "lsr r7, r8, #16\n\t"
  118696. "mul r7, r6, r7\n\t"
  118697. "adds r5, r5, r7\n\t"
  118698. "adc r3, r3, #0\n\t"
  118699. "lsl r7, r8, #16\n\t"
  118700. "lsr r7, r7, #16\n\t"
  118701. "mul r6, r7, r6\n\t"
  118702. "lsr r7, r6, #16\n\t"
  118703. "lsl r6, r6, #16\n\t"
  118704. "adds r4, r4, r6\n\t"
  118705. "adcs r5, r5, r7\n\t"
  118706. "adc r3, r3, #0\n\t"
  118707. #else
  118708. "umull r6, r7, %[b], r8\n\t"
  118709. "adds r4, r4, r6\n\t"
  118710. "adcs r5, r5, r7\n\t"
  118711. "mov r3, #0\n\t"
  118712. "adc r3, r3, #0\n\t"
  118713. #endif
  118714. "str r4, [%[r]], #4\n\t"
  118715. /* A[14] * B */
  118716. "ldr r8, [%[a]], #4\n\t"
  118717. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118718. "lsl r6, %[b], #16\n\t"
  118719. "lsl r7, r8, #16\n\t"
  118720. "lsr r6, r6, #16\n\t"
  118721. "lsr r7, r7, #16\n\t"
  118722. "mul r7, r6, r7\n\t"
  118723. "adds r5, r5, r7\n\t"
  118724. "adcs r3, r3, #0\n\t"
  118725. "mov r4, #0\n\t"
  118726. "adc r4, r4, #0\n\t"
  118727. "lsr r7, r8, #16\n\t"
  118728. "mul r6, r7, r6\n\t"
  118729. "lsr r7, r6, #16\n\t"
  118730. "lsl r6, r6, #16\n\t"
  118731. "adds r5, r5, r6\n\t"
  118732. "adcs r3, r3, r7\n\t"
  118733. "adc r4, r4, #0\n\t"
  118734. "lsr r6, %[b], #16\n\t"
  118735. "lsr r7, r8, #16\n\t"
  118736. "mul r7, r6, r7\n\t"
  118737. "adds r3, r3, r7\n\t"
  118738. "adc r4, r4, #0\n\t"
  118739. "lsl r7, r8, #16\n\t"
  118740. "lsr r7, r7, #16\n\t"
  118741. "mul r6, r7, r6\n\t"
  118742. "lsr r7, r6, #16\n\t"
  118743. "lsl r6, r6, #16\n\t"
  118744. "adds r5, r5, r6\n\t"
  118745. "adcs r3, r3, r7\n\t"
  118746. "adc r4, r4, #0\n\t"
  118747. #else
  118748. "umull r6, r7, %[b], r8\n\t"
  118749. "adds r5, r5, r6\n\t"
  118750. "adcs r3, r3, r7\n\t"
  118751. "mov r4, #0\n\t"
  118752. "adc r4, r4, #0\n\t"
  118753. #endif
  118754. "str r5, [%[r]], #4\n\t"
  118755. /* A[15] * B */
  118756. "ldr r8, [%[a]], #4\n\t"
  118757. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118758. "lsl r6, %[b], #16\n\t"
  118759. "lsl r7, r8, #16\n\t"
  118760. "lsr r6, r6, #16\n\t"
  118761. "lsr r7, r7, #16\n\t"
  118762. "mul r7, r6, r7\n\t"
  118763. "adds r3, r3, r7\n\t"
  118764. "adcs r4, r4, #0\n\t"
  118765. "mov r5, #0\n\t"
  118766. "adc r5, r5, #0\n\t"
  118767. "lsr r7, r8, #16\n\t"
  118768. "mul r6, r7, r6\n\t"
  118769. "lsr r7, r6, #16\n\t"
  118770. "lsl r6, r6, #16\n\t"
  118771. "adds r3, r3, r6\n\t"
  118772. "adcs r4, r4, r7\n\t"
  118773. "adc r5, r5, #0\n\t"
  118774. "lsr r6, %[b], #16\n\t"
  118775. "lsr r7, r8, #16\n\t"
  118776. "mul r7, r6, r7\n\t"
  118777. "adds r4, r4, r7\n\t"
  118778. "adc r5, r5, #0\n\t"
  118779. "lsl r7, r8, #16\n\t"
  118780. "lsr r7, r7, #16\n\t"
  118781. "mul r6, r7, r6\n\t"
  118782. "lsr r7, r6, #16\n\t"
  118783. "lsl r6, r6, #16\n\t"
  118784. "adds r3, r3, r6\n\t"
  118785. "adcs r4, r4, r7\n\t"
  118786. "adc r5, r5, #0\n\t"
  118787. #else
  118788. "umull r6, r7, %[b], r8\n\t"
  118789. "adds r3, r3, r6\n\t"
  118790. "adcs r4, r4, r7\n\t"
  118791. "mov r5, #0\n\t"
  118792. "adc r5, r5, #0\n\t"
  118793. #endif
  118794. "str r3, [%[r]], #4\n\t"
  118795. /* A[16] * B */
  118796. "ldr r8, [%[a]], #4\n\t"
  118797. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118798. "lsl r6, %[b], #16\n\t"
  118799. "lsl r7, r8, #16\n\t"
  118800. "lsr r6, r6, #16\n\t"
  118801. "lsr r7, r7, #16\n\t"
  118802. "mul r7, r6, r7\n\t"
  118803. "adds r4, r4, r7\n\t"
  118804. "adc r5, r5, #0\n\t"
  118805. "lsr r7, r8, #16\n\t"
  118806. "mul r6, r7, r6\n\t"
  118807. "lsr r7, r6, #16\n\t"
  118808. "lsl r6, r6, #16\n\t"
  118809. "adds r4, r4, r6\n\t"
  118810. "adc r5, r5, r7\n\t"
  118811. "lsr r6, %[b], #16\n\t"
  118812. "lsr r7, r8, #16\n\t"
  118813. "mul r7, r6, r7\n\t"
  118814. "add r5, r5, r7\n\t"
  118815. "lsl r7, r8, #16\n\t"
  118816. "lsr r7, r7, #16\n\t"
  118817. "mul r6, r7, r6\n\t"
  118818. "lsr r7, r6, #16\n\t"
  118819. "lsl r6, r6, #16\n\t"
  118820. "adds r4, r4, r6\n\t"
  118821. "adc r5, r5, r7\n\t"
  118822. #else
  118823. "umull r6, r7, %[b], r8\n\t"
  118824. "adds r4, r4, r6\n\t"
  118825. "adc r5, r5, r7\n\t"
  118826. #endif
  118827. "str r4, [%[r]], #4\n\t"
  118828. "str r5, [%[r]]\n\t"
  118829. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  118830. :
  118831. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10"
  118832. );
  118833. }
  118834. #endif /* WOLFSSL_SP_SMALL */
  118835. #ifdef WOLFSSL_SP_USE_UDIV
  118836. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  118837. *
  118838. * d1 The high order half of the number to divide.
  118839. * d0 The low order half of the number to divide.
  118840. * div The divisor.
  118841. * returns the result of the division.
  118842. *
  118843. * Note that this is an approximate div. It may give an answer 1 larger.
  118844. */
  118845. static sp_digit div_521_word_17(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  118846. {
  118847. register sp_digit d1 asm ("r0") = d1_p;
  118848. register sp_digit d0 asm ("r1") = d0_p;
  118849. register sp_digit div asm ("r2") = div_p;
  118850. __asm__ __volatile__ (
  118851. "lsr r6, %[div], #16\n\t"
  118852. "add lr, r6, #1\n\t"
  118853. "udiv r4, %[d1], lr\n\t"
  118854. "lsl r5, %[div], #16\n\t"
  118855. "lsl r4, r4, #16\n\t"
  118856. "umull r3, r12, %[div], r4\n\t"
  118857. "subs %[d0], %[d0], r3\n\t"
  118858. "sbc %[d1], %[d1], r12\n\t"
  118859. "subs r3, %[d1], lr\n\t"
  118860. "sbc r7, r7, r7\n\t"
  118861. "add r7, r7, #1\n\t"
  118862. "rsb r8, r7, #0\n\t"
  118863. "lsl r7, r7, #16\n\t"
  118864. "and r5, r5, r8\n\t"
  118865. "and r6, r6, r8\n\t"
  118866. "subs %[d0], %[d0], r5\n\t"
  118867. "add r4, r4, r7\n\t"
  118868. "sbc %[d1], %[d1], r6\n\t"
  118869. "lsl r12, %[d1], #16\n\t"
  118870. "lsr r3, %[d0], #16\n\t"
  118871. "orr r3, r3, r12\n\t"
  118872. "udiv r3, r3, lr\n\t"
  118873. "add r4, r4, r3\n\t"
  118874. "umull r3, r12, %[div], r3\n\t"
  118875. "subs %[d0], %[d0], r3\n\t"
  118876. "sbc %[d1], %[d1], r12\n\t"
  118877. "lsl r12, %[d1], #16\n\t"
  118878. "lsr r3, %[d0], #16\n\t"
  118879. "orr r3, r3, r12\n\t"
  118880. "udiv r3, r3, lr\n\t"
  118881. "add r4, r4, r3\n\t"
  118882. "mul r3, %[div], r3\n\t"
  118883. "sub %[d0], %[d0], r3\n\t"
  118884. "udiv r3, %[d0], %[div]\n\t"
  118885. "add %[d1], r4, r3\n\t"
  118886. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  118887. :
  118888. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  118889. );
  118890. return (uint32_t)(size_t)d1;
  118891. }
  118892. #else
  118893. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  118894. *
  118895. * d1 The high order half of the number to divide.
  118896. * d0 The low order half of the number to divide.
  118897. * div The divisor.
  118898. * returns the result of the division.
  118899. *
  118900. * Note that this is an approximate div. It may give an answer 1 larger.
  118901. */
  118902. static sp_digit div_521_word_17(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  118903. {
  118904. register sp_digit d1 asm ("r0") = d1_p;
  118905. register sp_digit d0 asm ("r1") = d0_p;
  118906. register sp_digit div asm ("r2") = div_p;
  118907. __asm__ __volatile__ (
  118908. "lsr lr, %[div], #1\n\t"
  118909. "add lr, lr, #1\n\t"
  118910. "mov r4, %[d0]\n\t"
  118911. "mov r5, %[d1]\n\t"
  118912. /* Do top 32 */
  118913. "subs r6, lr, r5\n\t"
  118914. "sbc r6, r6, r6\n\t"
  118915. "mov r3, #0\n\t"
  118916. "sub r3, r3, r6\n\t"
  118917. "and r6, r6, lr\n\t"
  118918. "subs r5, r5, r6\n\t"
  118919. /* Next 30 bits */
  118920. "mov r12, #29\n\t"
  118921. "\n"
  118922. "L_div_521_word_17_bit_%=: \n\t"
  118923. "lsls r4, r4, #1\n\t"
  118924. "adc r5, r5, r5\n\t"
  118925. "subs r6, lr, r5\n\t"
  118926. "sbc r6, r6, r6\n\t"
  118927. "add r3, r3, r3\n\t"
  118928. "sub r3, r3, r6\n\t"
  118929. "and r6, r6, lr\n\t"
  118930. "subs r5, r5, r6\n\t"
  118931. "subs r12, r12, #1\n\t"
  118932. "bpl L_div_521_word_17_bit_%=\n\t"
  118933. "add r3, r3, r3\n\t"
  118934. "add r3, r3, #1\n\t"
  118935. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118936. "lsl r7, r3, #16\n\t"
  118937. "lsl r4, %[div], #16\n\t"
  118938. "lsr r7, r7, #16\n\t"
  118939. "lsr r4, r4, #16\n\t"
  118940. "mul r4, r7, r4\n\t"
  118941. "lsr r8, %[div], #16\n\t"
  118942. "mul r7, r8, r7\n\t"
  118943. "lsr r5, r7, #16\n\t"
  118944. "lsl r7, r7, #16\n\t"
  118945. "adds r4, r4, r7\n\t"
  118946. "adc r5, r5, #0\n\t"
  118947. "lsr r7, r3, #16\n\t"
  118948. "mul r8, r7, r8\n\t"
  118949. "add r5, r5, r8\n\t"
  118950. "lsl r8, %[div], #16\n\t"
  118951. "lsr r8, r8, #16\n\t"
  118952. "mul r7, r8, r7\n\t"
  118953. "lsr r8, r7, #16\n\t"
  118954. "lsl r7, r7, #16\n\t"
  118955. "adds r4, r4, r7\n\t"
  118956. "adc r5, r5, r8\n\t"
  118957. #else
  118958. "umull r4, r5, r3, %[div]\n\t"
  118959. #endif
  118960. "subs r7, %[d0], r4\n\t"
  118961. "sbc r8, %[d1], r5\n\t"
  118962. "add r3, r3, r8\n\t"
  118963. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118964. "lsl r7, r3, #16\n\t"
  118965. "lsl r4, %[div], #16\n\t"
  118966. "lsr r7, r7, #16\n\t"
  118967. "lsr r4, r4, #16\n\t"
  118968. "mul r4, r7, r4\n\t"
  118969. "lsr r8, %[div], #16\n\t"
  118970. "mul r7, r8, r7\n\t"
  118971. "lsr r5, r7, #16\n\t"
  118972. "lsl r7, r7, #16\n\t"
  118973. "adds r4, r4, r7\n\t"
  118974. "adc r5, r5, #0\n\t"
  118975. "lsr r7, r3, #16\n\t"
  118976. "mul r8, r7, r8\n\t"
  118977. "add r5, r5, r8\n\t"
  118978. "lsl r8, %[div], #16\n\t"
  118979. "lsr r8, r8, #16\n\t"
  118980. "mul r7, r8, r7\n\t"
  118981. "lsr r8, r7, #16\n\t"
  118982. "lsl r7, r7, #16\n\t"
  118983. "adds r4, r4, r7\n\t"
  118984. "adc r5, r5, r8\n\t"
  118985. #else
  118986. "umull r4, r5, r3, %[div]\n\t"
  118987. #endif
  118988. "subs r7, %[d0], r4\n\t"
  118989. "sbc r8, %[d1], r5\n\t"
  118990. "add r3, r3, r8\n\t"
  118991. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  118992. "lsl r7, r3, #16\n\t"
  118993. "lsl r4, %[div], #16\n\t"
  118994. "lsr r7, r7, #16\n\t"
  118995. "lsr r4, r4, #16\n\t"
  118996. "mul r4, r7, r4\n\t"
  118997. "lsr r8, %[div], #16\n\t"
  118998. "mul r7, r8, r7\n\t"
  118999. "lsr r5, r7, #16\n\t"
  119000. "lsl r7, r7, #16\n\t"
  119001. "adds r4, r4, r7\n\t"
  119002. "adc r5, r5, #0\n\t"
  119003. "lsr r7, r3, #16\n\t"
  119004. "mul r8, r7, r8\n\t"
  119005. "add r5, r5, r8\n\t"
  119006. "lsl r8, %[div], #16\n\t"
  119007. "lsr r8, r8, #16\n\t"
  119008. "mul r7, r8, r7\n\t"
  119009. "lsr r8, r7, #16\n\t"
  119010. "lsl r7, r7, #16\n\t"
  119011. "adds r4, r4, r7\n\t"
  119012. "adc r5, r5, r8\n\t"
  119013. #else
  119014. "umull r4, r5, r3, %[div]\n\t"
  119015. #endif
  119016. "subs r7, %[d0], r4\n\t"
  119017. "sbc r8, %[d1], r5\n\t"
  119018. "add r3, r3, r8\n\t"
  119019. "subs r6, %[div], r7\n\t"
  119020. "sbc r6, r6, r6\n\t"
  119021. "sub %[d1], r3, r6\n\t"
  119022. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  119023. :
  119024. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  119025. );
  119026. return (uint32_t)(size_t)d1;
  119027. }
  119028. #endif
  119029. /* AND m into each word of a and store in r.
  119030. *
  119031. * r A single precision integer.
  119032. * a A single precision integer.
  119033. * m Mask to AND against each digit.
  119034. */
  119035. static void sp_521_mask_17(sp_digit* r, const sp_digit* a, sp_digit m)
  119036. {
  119037. #ifdef WOLFSSL_SP_SMALL
  119038. int i;
  119039. for (i=0; i<17; i++) {
  119040. r[i] = a[i] & m;
  119041. }
  119042. #else
  119043. int i;
  119044. for (i = 0; i < 16; i += 8) {
  119045. r[i+0] = a[i+0] & m;
  119046. r[i+1] = a[i+1] & m;
  119047. r[i+2] = a[i+2] & m;
  119048. r[i+3] = a[i+3] & m;
  119049. r[i+4] = a[i+4] & m;
  119050. r[i+5] = a[i+5] & m;
  119051. r[i+6] = a[i+6] & m;
  119052. r[i+7] = a[i+7] & m;
  119053. }
  119054. r[16] = a[16] & m;
  119055. #endif
  119056. }
  119057. /* Divide d in a and put remainder into r (m*d + r = a)
  119058. * m is not calculated as it is not needed at this time.
  119059. *
  119060. * a Number to be divided.
  119061. * d Number to divide with.
  119062. * m Multiplier result.
  119063. * r Remainder from the division.
  119064. * returns MP_OKAY indicating success.
  119065. */
  119066. static WC_INLINE int sp_521_div_17(const sp_digit* a, const sp_digit* d, sp_digit* m,
  119067. sp_digit* r)
  119068. {
  119069. sp_digit t1[35];
  119070. sp_digit t2[18];
  119071. sp_digit sd[18];
  119072. sp_digit div;
  119073. sp_digit r1;
  119074. int i;
  119075. ASSERT_SAVED_VECTOR_REGISTERS();
  119076. (void)m;
  119077. div = (d[16] << 23) | (d[15] >> 9);
  119078. XMEMCPY(t1, a, sizeof(*t1) * 2 * 17);
  119079. r1 = sp_521_cmp_17(&t1[17], d) >= 0;
  119080. sp_521_cond_sub_17(&t1[17], &t1[17], d, (sp_digit)0 - r1);
  119081. sp_521_lshift_17(sd, d, 23);
  119082. sp_521_lshift_34(t1, t1, 23);
  119083. for (i = 16; i >= 0; i--) {
  119084. sp_digit hi = t1[17 + i] - (t1[17 + i] == div);
  119085. r1 = div_521_word_17(hi, t1[17 + i - 1], div);
  119086. sp_521_mul_d_17(t2, sd, r1);
  119087. t1[17 + i] += sp_521_sub_in_place_17(&t1[i], t2);
  119088. t1[17 + i] -= t2[17];
  119089. sp_521_mask_17(t2, sd, t1[17 + i]);
  119090. t1[17 + i] += sp_521_add_17(&t1[i], &t1[i], t2);
  119091. sp_521_mask_17(t2, sd, t1[17 + i]);
  119092. t1[17 + i] += sp_521_add_17(&t1[i], &t1[i], t2);
  119093. }
  119094. r1 = sp_521_cmp_17(t1, sd) >= 0;
  119095. sp_521_cond_sub_17(r, t1, sd, (sp_digit)0 - r1);
  119096. sp_521_rshift_17(r, r, 23);
  119097. return MP_OKAY;
  119098. }
  119099. /* Reduce a modulo m into r. (r = a mod m)
  119100. *
  119101. * r A single precision number that is the reduced result.
  119102. * a A single precision number that is to be reduced.
  119103. * m A single precision number that is the modulus to reduce with.
  119104. * returns MP_OKAY indicating success.
  119105. */
  119106. static WC_INLINE int sp_521_mod_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  119107. {
  119108. return sp_521_div_17(a, m, NULL, r);
  119109. }
  119110. #endif
  119111. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  119112. /* Multiply two number mod the order of P521 curve. (r = a * b mod order)
  119113. *
  119114. * r Result of the multiplication.
  119115. * a First operand of the multiplication.
  119116. * b Second operand of the multiplication.
  119117. */
  119118. static void sp_521_mont_mul_order_17(sp_digit* r, const sp_digit* a, const sp_digit* b)
  119119. {
  119120. sp_521_mul_17(r, a, b);
  119121. sp_521_mont_reduce_order_17(r, p521_order, p521_mp_order);
  119122. }
  119123. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  119124. #ifdef WOLFSSL_SP_SMALL
  119125. /* Order-2 for the P521 curve. */
  119126. static const uint32_t p521_order_minus_2[17] = {
  119127. 0x91386407U,0xbb6fb71eU,0x899c47aeU,0x3bb5c9b8U,0xf709a5d0U,0x7fcc0148U,
  119128. 0xbf2f966bU,0x51868783U,0xfffffffaU,0xffffffffU,0xffffffffU,0xffffffffU,
  119129. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0x000001ffU
  119130. };
  119131. #else
  119132. /* The low half of the order-2 of the P521 curve. */
  119133. static const uint32_t p521_order_low[9] = {
  119134. 0x91386407U,0xbb6fb71eU,0x899c47aeU,0x3bb5c9b8U,0xf709a5d0U,0x7fcc0148U,
  119135. 0xbf2f966bU,0x51868783U,0xfffffffaU
  119136. };
  119137. #endif /* WOLFSSL_SP_SMALL */
  119138. /* Square number mod the order of P521 curve. (r = a * a mod order)
  119139. *
  119140. * r Result of the squaring.
  119141. * a Number to square.
  119142. */
  119143. static void sp_521_mont_sqr_order_17(sp_digit* r, const sp_digit* a)
  119144. {
  119145. sp_521_sqr_17(r, a);
  119146. sp_521_mont_reduce_order_17(r, p521_order, p521_mp_order);
  119147. }
  119148. #ifndef WOLFSSL_SP_SMALL
  119149. /* Square number mod the order of P521 curve a number of times.
  119150. * (r = a ^ n mod order)
  119151. *
  119152. * r Result of the squaring.
  119153. * a Number to square.
  119154. */
  119155. static void sp_521_mont_sqr_n_order_17(sp_digit* r, const sp_digit* a, int n)
  119156. {
  119157. int i;
  119158. sp_521_mont_sqr_order_17(r, a);
  119159. for (i=1; i<n; i++) {
  119160. sp_521_mont_sqr_order_17(r, r);
  119161. }
  119162. }
  119163. #endif /* !WOLFSSL_SP_SMALL */
  119164. /* Invert the number, in Montgomery form, modulo the order of the P521 curve.
  119165. * (r = 1 / a mod order)
  119166. *
  119167. * r Inverse result.
  119168. * a Number to invert.
  119169. * td Temporary data.
  119170. */
  119171. #ifdef WOLFSSL_SP_NONBLOCK
  119172. typedef struct sp_521_mont_inv_order_17_ctx {
  119173. int state;
  119174. int i;
  119175. } sp_521_mont_inv_order_17_ctx;
  119176. static int sp_521_mont_inv_order_17_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  119177. sp_digit* t)
  119178. {
  119179. int err = FP_WOULDBLOCK;
  119180. sp_521_mont_inv_order_17_ctx* ctx = (sp_521_mont_inv_order_17_ctx*)sp_ctx;
  119181. typedef char ctx_size_test[sizeof(sp_521_mont_inv_order_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  119182. (void)sizeof(ctx_size_test);
  119183. switch (ctx->state) {
  119184. case 0:
  119185. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  119186. ctx->i = 519;
  119187. ctx->state = 1;
  119188. break;
  119189. case 1:
  119190. sp_521_mont_sqr_order_17(t, t);
  119191. ctx->state = 2;
  119192. break;
  119193. case 2:
  119194. if ((p521_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  119195. sp_521_mont_mul_order_17(t, t, a);
  119196. }
  119197. ctx->i--;
  119198. ctx->state = (ctx->i == 0) ? 3 : 1;
  119199. break;
  119200. case 3:
  119201. XMEMCPY(r, t, sizeof(sp_digit) * 17U);
  119202. err = MP_OKAY;
  119203. break;
  119204. }
  119205. return err;
  119206. }
  119207. #endif /* WOLFSSL_SP_NONBLOCK */
  119208. static void sp_521_mont_inv_order_17(sp_digit* r, const sp_digit* a,
  119209. sp_digit* td)
  119210. {
  119211. #ifdef WOLFSSL_SP_SMALL
  119212. sp_digit* t = td;
  119213. int i;
  119214. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  119215. for (i=519; i>=0; i--) {
  119216. sp_521_mont_sqr_order_17(t, t);
  119217. if ((p521_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  119218. sp_521_mont_mul_order_17(t, t, a);
  119219. }
  119220. }
  119221. XMEMCPY(r, t, sizeof(sp_digit) * 17U);
  119222. #else
  119223. sp_digit* t = td;
  119224. sp_digit* t2 = td + 2 * 17;
  119225. sp_digit* t3 = td + 4 * 17;
  119226. int i;
  119227. /* t = a^2 */
  119228. sp_521_mont_sqr_order_17(t, a);
  119229. /* t = a^3 = t * a */
  119230. sp_521_mont_mul_order_17(t, t, a);
  119231. /* t= a^c = t ^ 2 ^ 2 */
  119232. sp_521_mont_sqr_n_order_17(t2, t, 2);
  119233. /* t = a^f = t2 * t */
  119234. sp_521_mont_mul_order_17(t, t2, t);
  119235. /* t3 = a^1e */
  119236. sp_521_mont_sqr_order_17(t3, t);
  119237. /* t3 = a^1f = t3 * a */
  119238. sp_521_mont_mul_order_17(t3, t3, a);
  119239. /* t2= a^f0 = t ^ 2 ^ 4 */
  119240. sp_521_mont_sqr_n_order_17(t2, t, 4);
  119241. /* t = a^ff = t2 * t */
  119242. sp_521_mont_mul_order_17(t, t2, t);
  119243. /* t2= a^ff00 = t ^ 2 ^ 8 */
  119244. sp_521_mont_sqr_n_order_17(t2, t, 8);
  119245. /* t3= a^ffff = t2 * t */
  119246. sp_521_mont_mul_order_17(t, t2, t);
  119247. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  119248. sp_521_mont_sqr_n_order_17(t2, t, 16);
  119249. /* t = a^ffffffff = t2 * t */
  119250. sp_521_mont_mul_order_17(t, t2, t);
  119251. /* t2= a^ffffffff00000000 = t ^ 2 ^ 32 */
  119252. sp_521_mont_sqr_n_order_17(t2, t, 32);
  119253. /* t = a^ffffffffffffffff = t2 * t */
  119254. sp_521_mont_mul_order_17(t, t2, t);
  119255. /* t2= a^ffffffffffffffff0000000000000000 = t ^ 2 ^ 64 */
  119256. sp_521_mont_sqr_n_order_17(t2, t, 64);
  119257. /* t = a^ffffffffffffffffffffffffffffffff = t2 * t */
  119258. sp_521_mont_mul_order_17(t, t2, t);
  119259. /* t2= a^ffffffffffffffffffffffffffffffff00000000000000000000000000000000 = t ^ 2 ^ 128 */
  119260. sp_521_mont_sqr_n_order_17(t2, t, 128);
  119261. /* t = a^ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  119262. sp_521_mont_mul_order_17(t, t2, t);
  119263. /* t2 = a^1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0 */
  119264. sp_521_mont_sqr_n_order_17(t2, t, 5);
  119265. /* t2 = a^1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff = t * t3 */
  119266. sp_521_mont_mul_order_17(t2, t2, t3);
  119267. for (i=259; i>=1; i--) {
  119268. sp_521_mont_sqr_order_17(t2, t2);
  119269. if ((p521_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  119270. sp_521_mont_mul_order_17(t2, t2, a);
  119271. }
  119272. }
  119273. sp_521_mont_sqr_order_17(t2, t2);
  119274. sp_521_mont_mul_order_17(r, t2, a);
  119275. #endif /* WOLFSSL_SP_SMALL */
  119276. }
  119277. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  119278. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  119279. #ifdef HAVE_ECC_SIGN
  119280. #ifndef SP_ECC_MAX_SIG_GEN
  119281. #define SP_ECC_MAX_SIG_GEN 64
  119282. #endif
  119283. /* Calculate second signature value S from R, k and private value.
  119284. *
  119285. * s = (r * x + e) / k
  119286. *
  119287. * s Signature value.
  119288. * r First signature value.
  119289. * k Ephemeral private key.
  119290. * x Private key as a number.
  119291. * e Hash of message as a number.
  119292. * tmp Temporary storage for intermediate numbers.
  119293. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  119294. */
  119295. static int sp_521_calc_s_17(sp_digit* s, const sp_digit* r, sp_digit* k,
  119296. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  119297. {
  119298. int err;
  119299. sp_digit carry;
  119300. sp_int32 c;
  119301. sp_digit* kInv = k;
  119302. /* Conv k to Montgomery form (mod order) */
  119303. sp_521_mul_17(k, k, p521_norm_order);
  119304. err = sp_521_mod_17(k, k, p521_order);
  119305. if (err == MP_OKAY) {
  119306. sp_521_norm_17(k);
  119307. /* kInv = 1/k mod order */
  119308. sp_521_mont_inv_order_17(kInv, k, tmp);
  119309. sp_521_norm_17(kInv);
  119310. /* s = r * x + e */
  119311. sp_521_mul_17(x, x, r);
  119312. err = sp_521_mod_17(x, x, p521_order);
  119313. }
  119314. if (err == MP_OKAY) {
  119315. sp_521_norm_17(x);
  119316. carry = sp_521_add_17(s, e, x);
  119317. sp_521_cond_sub_17(s, s, p521_order, 0 - carry);
  119318. sp_521_norm_17(s);
  119319. c = sp_521_cmp_17(s, p521_order);
  119320. sp_521_cond_sub_17(s, s, p521_order,
  119321. (sp_digit)0 - (sp_digit)(c >= 0));
  119322. sp_521_norm_17(s);
  119323. /* s = s * k^-1 mod order */
  119324. sp_521_mont_mul_order_17(s, s, kInv);
  119325. sp_521_norm_17(s);
  119326. }
  119327. return err;
  119328. }
  119329. /* Sign the hash using the private key.
  119330. * e = [hash, 521 bits] from binary
  119331. * r = (k.G)->x mod order
  119332. * s = (r * x + e) / k mod order
  119333. * The hash is truncated to the first 521 bits.
  119334. *
  119335. * hash Hash to sign.
  119336. * hashLen Length of the hash data.
  119337. * rng Random number generator.
  119338. * priv Private part of key - scalar.
  119339. * rm First part of result as an mp_int.
  119340. * sm Sirst part of result as an mp_int.
  119341. * heap Heap to use for allocation.
  119342. * returns RNG failures, MEMORY_E when memory allocation fails and
  119343. * MP_OKAY on success.
  119344. */
  119345. int sp_ecc_sign_521(const byte* hash, word32 hashLen, WC_RNG* rng,
  119346. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  119347. {
  119348. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  119349. sp_digit* e = NULL;
  119350. sp_point_521* point = NULL;
  119351. #else
  119352. sp_digit e[7 * 2 * 17];
  119353. sp_point_521 point[1];
  119354. #endif
  119355. sp_digit* x = NULL;
  119356. sp_digit* k = NULL;
  119357. sp_digit* r = NULL;
  119358. sp_digit* tmp = NULL;
  119359. sp_digit* s = NULL;
  119360. sp_int32 c;
  119361. int err = MP_OKAY;
  119362. int i;
  119363. (void)heap;
  119364. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  119365. if (err == MP_OKAY) {
  119366. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  119367. DYNAMIC_TYPE_ECC);
  119368. if (point == NULL)
  119369. err = MEMORY_E;
  119370. }
  119371. if (err == MP_OKAY) {
  119372. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 17, heap,
  119373. DYNAMIC_TYPE_ECC);
  119374. if (e == NULL)
  119375. err = MEMORY_E;
  119376. }
  119377. #endif
  119378. if (err == MP_OKAY) {
  119379. x = e + 2 * 17;
  119380. k = e + 4 * 17;
  119381. r = e + 6 * 17;
  119382. tmp = e + 8 * 17;
  119383. s = e;
  119384. if (hashLen > 66U) {
  119385. hashLen = 66U;
  119386. }
  119387. }
  119388. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  119389. /* New random point. */
  119390. if (km == NULL || mp_iszero(km)) {
  119391. err = sp_521_ecc_gen_k_17(rng, k);
  119392. }
  119393. else {
  119394. sp_521_from_mp(k, 17, km);
  119395. mp_zero(km);
  119396. }
  119397. if (err == MP_OKAY) {
  119398. err = sp_521_ecc_mulmod_base_17(point, k, 1, 1, heap);
  119399. }
  119400. if (err == MP_OKAY) {
  119401. /* r = point->x mod order */
  119402. XMEMCPY(r, point->x, sizeof(sp_digit) * 17U);
  119403. sp_521_norm_17(r);
  119404. c = sp_521_cmp_17(r, p521_order);
  119405. sp_521_cond_sub_17(r, r, p521_order,
  119406. (sp_digit)0 - (sp_digit)(c >= 0));
  119407. sp_521_norm_17(r);
  119408. sp_521_from_mp(x, 17, priv);
  119409. sp_521_from_bin(e, 17, hash, (int)hashLen);
  119410. if (hashLen == 66U) {
  119411. sp_521_rshift_17(e, e, 7);
  119412. }
  119413. err = sp_521_calc_s_17(s, r, k, x, e, tmp);
  119414. }
  119415. /* Check that signature is usable. */
  119416. if ((err == MP_OKAY) && (sp_521_iszero_17(s) == 0)) {
  119417. break;
  119418. }
  119419. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  119420. i = 1;
  119421. #endif
  119422. }
  119423. if (i == 0) {
  119424. err = RNG_FAILURE_E;
  119425. }
  119426. if (err == MP_OKAY) {
  119427. err = sp_521_to_mp(r, rm);
  119428. }
  119429. if (err == MP_OKAY) {
  119430. err = sp_521_to_mp(s, sm);
  119431. }
  119432. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  119433. if (e != NULL)
  119434. #endif
  119435. {
  119436. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 17);
  119437. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  119438. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  119439. #endif
  119440. }
  119441. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  119442. if (point != NULL)
  119443. #endif
  119444. {
  119445. ForceZero(point, sizeof(sp_point_521));
  119446. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  119447. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  119448. #endif
  119449. }
  119450. return err;
  119451. }
  119452. #ifdef WOLFSSL_SP_NONBLOCK
  119453. typedef struct sp_ecc_sign_521_ctx {
  119454. int state;
  119455. union {
  119456. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  119457. sp_521_mont_inv_order_17_ctx mont_inv_order_ctx;
  119458. };
  119459. sp_digit e[2*17];
  119460. sp_digit x[2*17];
  119461. sp_digit k[2*17];
  119462. sp_digit r[2*17];
  119463. sp_digit tmp[3 * 2*17];
  119464. sp_point_521 point;
  119465. sp_digit* s;
  119466. sp_digit* kInv;
  119467. int i;
  119468. } sp_ecc_sign_521_ctx;
  119469. int sp_ecc_sign_521_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  119470. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  119471. {
  119472. int err = FP_WOULDBLOCK;
  119473. sp_ecc_sign_521_ctx* ctx = (sp_ecc_sign_521_ctx*)sp_ctx->data;
  119474. typedef char ctx_size_test[sizeof(sp_ecc_sign_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  119475. (void)sizeof(ctx_size_test);
  119476. switch (ctx->state) {
  119477. case 0: /* INIT */
  119478. ctx->s = ctx->e;
  119479. ctx->kInv = ctx->k;
  119480. ctx->i = SP_ECC_MAX_SIG_GEN;
  119481. ctx->state = 1;
  119482. break;
  119483. case 1: /* GEN */
  119484. /* New random point. */
  119485. if (km == NULL || mp_iszero(km)) {
  119486. err = sp_521_ecc_gen_k_17(rng, ctx->k);
  119487. }
  119488. else {
  119489. sp_521_from_mp(ctx->k, 17, km);
  119490. mp_zero(km);
  119491. }
  119492. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  119493. ctx->state = 2;
  119494. break;
  119495. case 2: /* MULMOD */
  119496. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  119497. &ctx->point, &p521_base, ctx->k, 1, 1, heap);
  119498. if (err == MP_OKAY) {
  119499. ctx->state = 3;
  119500. }
  119501. break;
  119502. case 3: /* MODORDER */
  119503. {
  119504. sp_int32 c;
  119505. /* r = point->x mod order */
  119506. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 17U);
  119507. sp_521_norm_17(ctx->r);
  119508. c = sp_521_cmp_17(ctx->r, p521_order);
  119509. sp_521_cond_sub_17(ctx->r, ctx->r, p521_order,
  119510. (sp_digit)0 - (sp_digit)(c >= 0));
  119511. sp_521_norm_17(ctx->r);
  119512. if (hashLen > 66U) {
  119513. hashLen = 66U;
  119514. }
  119515. sp_521_from_mp(ctx->x, 17, priv);
  119516. sp_521_from_bin(ctx->e, 17, hash, (int)hashLen);
  119517. if (hashLen == 66U) {
  119518. sp_521_rshift_17(ctx->e, ctx->e, 7);
  119519. }
  119520. ctx->state = 4;
  119521. break;
  119522. }
  119523. case 4: /* KMODORDER */
  119524. /* Conv k to Montgomery form (mod order) */
  119525. sp_521_mul_17(ctx->k, ctx->k, p521_norm_order);
  119526. err = sp_521_mod_17(ctx->k, ctx->k, p521_order);
  119527. if (err == MP_OKAY) {
  119528. sp_521_norm_17(ctx->k);
  119529. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  119530. ctx->state = 5;
  119531. }
  119532. break;
  119533. case 5: /* KINV */
  119534. /* kInv = 1/k mod order */
  119535. err = sp_521_mont_inv_order_17_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  119536. if (err == MP_OKAY) {
  119537. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  119538. ctx->state = 6;
  119539. }
  119540. break;
  119541. case 6: /* KINVNORM */
  119542. sp_521_norm_17(ctx->kInv);
  119543. ctx->state = 7;
  119544. break;
  119545. case 7: /* R */
  119546. /* s = r * x + e */
  119547. sp_521_mul_17(ctx->x, ctx->x, ctx->r);
  119548. ctx->state = 8;
  119549. break;
  119550. case 8: /* S1 */
  119551. err = sp_521_mod_17(ctx->x, ctx->x, p521_order);
  119552. if (err == MP_OKAY)
  119553. ctx->state = 9;
  119554. break;
  119555. case 9: /* S2 */
  119556. {
  119557. sp_digit carry;
  119558. sp_int32 c;
  119559. sp_521_norm_17(ctx->x);
  119560. carry = sp_521_add_17(ctx->s, ctx->e, ctx->x);
  119561. sp_521_cond_sub_17(ctx->s, ctx->s,
  119562. p521_order, 0 - carry);
  119563. sp_521_norm_17(ctx->s);
  119564. c = sp_521_cmp_17(ctx->s, p521_order);
  119565. sp_521_cond_sub_17(ctx->s, ctx->s, p521_order,
  119566. (sp_digit)0 - (sp_digit)(c >= 0));
  119567. sp_521_norm_17(ctx->s);
  119568. /* s = s * k^-1 mod order */
  119569. sp_521_mont_mul_order_17(ctx->s, ctx->s, ctx->kInv);
  119570. sp_521_norm_17(ctx->s);
  119571. /* Check that signature is usable. */
  119572. if (sp_521_iszero_17(ctx->s) == 0) {
  119573. ctx->state = 10;
  119574. break;
  119575. }
  119576. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  119577. ctx->i = 1;
  119578. #endif
  119579. /* not usable gen, try again */
  119580. ctx->i--;
  119581. if (ctx->i == 0) {
  119582. err = RNG_FAILURE_E;
  119583. }
  119584. ctx->state = 1;
  119585. break;
  119586. }
  119587. case 10: /* RES */
  119588. err = sp_521_to_mp(ctx->r, rm);
  119589. if (err == MP_OKAY) {
  119590. err = sp_521_to_mp(ctx->s, sm);
  119591. }
  119592. break;
  119593. }
  119594. if (err == MP_OKAY && ctx->state != 10) {
  119595. err = FP_WOULDBLOCK;
  119596. }
  119597. if (err != FP_WOULDBLOCK) {
  119598. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 17U);
  119599. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 17U);
  119600. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 17U);
  119601. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 17U);
  119602. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 17U);
  119603. }
  119604. return err;
  119605. }
  119606. #endif /* WOLFSSL_SP_NONBLOCK */
  119607. #endif /* HAVE_ECC_SIGN */
  119608. #ifndef WOLFSSL_SP_SMALL
  119609. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  119610. *
  119611. * r Result of division by 2.
  119612. * a Number to divide.
  119613. * m Modulus.
  119614. */
  119615. static void sp_521_div2_mod_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  119616. {
  119617. register sp_digit* r asm ("r0") = r_p;
  119618. register const sp_digit* a asm ("r1") = a_p;
  119619. register const sp_digit* m asm ("r2") = m_p;
  119620. __asm__ __volatile__ (
  119621. "ldr r4, [%[a]], #4\n\t"
  119622. "ands r3, r4, #1\n\t"
  119623. "beq L_sp_521_div2_mod_17_even_%=\n\t"
  119624. "mov r12, #0\n\t"
  119625. "ldm %[a]!, {r5, r6, r7}\n\t"
  119626. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  119627. "adds r4, r4, r8\n\t"
  119628. "adcs r5, r5, r9\n\t"
  119629. "adcs r6, r6, r10\n\t"
  119630. "adcs r7, r7, r11\n\t"
  119631. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  119632. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  119633. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  119634. "adcs r4, r4, r8\n\t"
  119635. "adcs r5, r5, r9\n\t"
  119636. "adcs r6, r6, r10\n\t"
  119637. "adcs r7, r7, r11\n\t"
  119638. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  119639. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  119640. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  119641. "adcs r4, r4, r8\n\t"
  119642. "adcs r5, r5, r9\n\t"
  119643. "adcs r6, r6, r10\n\t"
  119644. "adcs r7, r7, r11\n\t"
  119645. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  119646. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  119647. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  119648. "adcs r4, r4, r8\n\t"
  119649. "adcs r5, r5, r9\n\t"
  119650. "adcs r6, r6, r10\n\t"
  119651. "adcs r7, r7, r11\n\t"
  119652. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  119653. "ldm %[a]!, {r4}\n\t"
  119654. "ldm %[m]!, {r8}\n\t"
  119655. "adcs r4, r4, r8\n\t"
  119656. "stm %[r]!, {r4}\n\t"
  119657. "adc r3, r12, r12\n\t"
  119658. "b L_sp_521_div2_mod_17_div2_%=\n\t"
  119659. "\n"
  119660. "L_sp_521_div2_mod_17_even_%=: \n\t"
  119661. "ldm %[a]!, {r5, r6, r7}\n\t"
  119662. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  119663. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  119664. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  119665. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  119666. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  119667. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  119668. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  119669. "ldm %[a]!, {r4}\n\t"
  119670. "stm %[r]!, {r4}\n\t"
  119671. "\n"
  119672. "L_sp_521_div2_mod_17_div2_%=: \n\t"
  119673. "sub %[r], #0x44\n\t"
  119674. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119675. "ldr r8, [%[r]]\n\t"
  119676. "ldr r9, [%[r], #4]\n\t"
  119677. #else
  119678. "ldrd r8, r9, [%[r]]\n\t"
  119679. #endif
  119680. "lsr r8, r8, #1\n\t"
  119681. "orr r8, r8, r9, lsl #31\n\t"
  119682. "lsr r9, r9, #1\n\t"
  119683. "ldr r10, [%[r], #8]\n\t"
  119684. "str r8, [%[r]]\n\t"
  119685. "orr r9, r9, r10, lsl #31\n\t"
  119686. "lsr r10, r10, #1\n\t"
  119687. "ldr r8, [%[r], #12]\n\t"
  119688. "str r9, [%[r], #4]\n\t"
  119689. "orr r10, r10, r8, lsl #31\n\t"
  119690. "lsr r8, r8, #1\n\t"
  119691. "ldr r9, [%[r], #16]\n\t"
  119692. "str r10, [%[r], #8]\n\t"
  119693. "orr r8, r8, r9, lsl #31\n\t"
  119694. "lsr r9, r9, #1\n\t"
  119695. "ldr r10, [%[r], #20]\n\t"
  119696. "str r8, [%[r], #12]\n\t"
  119697. "orr r9, r9, r10, lsl #31\n\t"
  119698. "lsr r10, r10, #1\n\t"
  119699. "ldr r8, [%[r], #24]\n\t"
  119700. "str r9, [%[r], #16]\n\t"
  119701. "orr r10, r10, r8, lsl #31\n\t"
  119702. "lsr r8, r8, #1\n\t"
  119703. "ldr r9, [%[r], #28]\n\t"
  119704. "str r10, [%[r], #20]\n\t"
  119705. "orr r8, r8, r9, lsl #31\n\t"
  119706. "lsr r9, r9, #1\n\t"
  119707. "ldr r10, [%[r], #32]\n\t"
  119708. "str r8, [%[r], #24]\n\t"
  119709. "orr r9, r9, r10, lsl #31\n\t"
  119710. "lsr r10, r10, #1\n\t"
  119711. "ldr r8, [%[r], #36]\n\t"
  119712. "str r9, [%[r], #28]\n\t"
  119713. "orr r10, r10, r8, lsl #31\n\t"
  119714. "lsr r8, r8, #1\n\t"
  119715. "ldr r9, [%[r], #40]\n\t"
  119716. "str r10, [%[r], #32]\n\t"
  119717. "orr r8, r8, r9, lsl #31\n\t"
  119718. "lsr r9, r9, #1\n\t"
  119719. "ldr r10, [%[r], #44]\n\t"
  119720. "str r8, [%[r], #36]\n\t"
  119721. "orr r9, r9, r10, lsl #31\n\t"
  119722. "lsr r10, r10, #1\n\t"
  119723. "ldr r8, [%[r], #48]\n\t"
  119724. "str r9, [%[r], #40]\n\t"
  119725. "orr r10, r10, r8, lsl #31\n\t"
  119726. "lsr r8, r8, #1\n\t"
  119727. "ldr r9, [%[r], #52]\n\t"
  119728. "str r10, [%[r], #44]\n\t"
  119729. "orr r8, r8, r9, lsl #31\n\t"
  119730. "lsr r9, r9, #1\n\t"
  119731. "ldr r10, [%[r], #56]\n\t"
  119732. "str r8, [%[r], #48]\n\t"
  119733. "orr r9, r9, r10, lsl #31\n\t"
  119734. "lsr r10, r10, #1\n\t"
  119735. "ldr r8, [%[r], #60]\n\t"
  119736. "str r9, [%[r], #52]\n\t"
  119737. "orr r10, r10, r8, lsl #31\n\t"
  119738. "lsr r8, r8, #1\n\t"
  119739. "ldr r9, [%[r], #64]\n\t"
  119740. "str r10, [%[r], #56]\n\t"
  119741. "orr r8, r8, r9, lsl #31\n\t"
  119742. "lsr r9, r9, #1\n\t"
  119743. "orr r9, r9, r3, lsl #31\n\t"
  119744. "str r8, [%[r], #60]\n\t"
  119745. "str r9, [%[r], #64]\n\t"
  119746. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  119747. :
  119748. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  119749. );
  119750. }
  119751. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119752. static const unsigned char L_sp_521_num_bits_17_table[] = {
  119753. 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03,
  119754. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  119755. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  119756. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  119757. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  119758. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  119759. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  119760. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  119761. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  119762. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  119763. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  119764. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  119765. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  119766. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  119767. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  119768. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  119769. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119770. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119771. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119772. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119773. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119774. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119775. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119776. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119777. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119778. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119779. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119780. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119781. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119782. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119783. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119784. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  119785. };
  119786. static int sp_521_num_bits_17(const sp_digit* a_p)
  119787. {
  119788. register const sp_digit* a asm ("r0") = a_p;
  119789. __asm__ __volatile__ (
  119790. "mov lr, %[L_sp_521_num_bits_17_table]\n\t"
  119791. "ldr r1, [%[a], #64]\n\t"
  119792. "cmp r1, #0\n\t"
  119793. "beq L_sp_521_num_bits_17_16_%=\n\t"
  119794. "lsr r3, r1, #24\n\t"
  119795. "cmp r3, #0\n\t"
  119796. "beq L_sp_521_num_bits_17_16_3_%=\n\t"
  119797. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119798. "mov r2, #0x2\n\t"
  119799. "lsl r2, r2, #8\n\t"
  119800. "add r2, r2, #0x18\n\t"
  119801. #else
  119802. "mov r2, #0x218\n\t"
  119803. #endif
  119804. "ldrb r12, [lr, r3]\n\t"
  119805. "add r12, r2, r12\n\t"
  119806. "b L_sp_521_num_bits_17_18_%=\n\t"
  119807. "\n"
  119808. "L_sp_521_num_bits_17_16_3_%=: \n\t"
  119809. "lsr r3, r1, #16\n\t"
  119810. "and r3, r3, #0xff\n\t"
  119811. "cmp r3, #0\n\t"
  119812. "beq L_sp_521_num_bits_17_16_2_%=\n\t"
  119813. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119814. "mov r2, #0x2\n\t"
  119815. "lsl r2, r2, #8\n\t"
  119816. "add r2, r2, #0x10\n\t"
  119817. #else
  119818. "mov r2, #0x210\n\t"
  119819. #endif
  119820. "ldrb r12, [lr, r3]\n\t"
  119821. "add r12, r2, r12\n\t"
  119822. "b L_sp_521_num_bits_17_18_%=\n\t"
  119823. "\n"
  119824. "L_sp_521_num_bits_17_16_2_%=: \n\t"
  119825. "lsr r3, r1, #8\n\t"
  119826. "and r3, r3, #0xff\n\t"
  119827. "cmp r3, #0\n\t"
  119828. "beq L_sp_521_num_bits_17_16_1_%=\n\t"
  119829. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119830. "mov r2, #0x2\n\t"
  119831. "lsl r2, r2, #8\n\t"
  119832. "add r2, r2, #0x8\n\t"
  119833. #else
  119834. "mov r2, #0x208\n\t"
  119835. #endif
  119836. "ldrb r12, [lr, r3]\n\t"
  119837. "add r12, r2, r12\n\t"
  119838. "b L_sp_521_num_bits_17_18_%=\n\t"
  119839. "\n"
  119840. "L_sp_521_num_bits_17_16_1_%=: \n\t"
  119841. "and r3, r1, #0xff\n\t"
  119842. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119843. "mov r2, #0x2\n\t"
  119844. "lsl r2, r2, #8\n\t"
  119845. "add r2, r2, #0x0\n\t"
  119846. #else
  119847. "mov r2, #0x200\n\t"
  119848. #endif
  119849. "ldrb r12, [lr, r3]\n\t"
  119850. "add r12, r2, r12\n\t"
  119851. "b L_sp_521_num_bits_17_18_%=\n\t"
  119852. "\n"
  119853. "L_sp_521_num_bits_17_16_%=: \n\t"
  119854. "ldr r1, [%[a], #60]\n\t"
  119855. "cmp r1, #0\n\t"
  119856. "beq L_sp_521_num_bits_17_15_%=\n\t"
  119857. "lsr r3, r1, #24\n\t"
  119858. "cmp r3, #0\n\t"
  119859. "beq L_sp_521_num_bits_17_15_3_%=\n\t"
  119860. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119861. "mov r2, #0x1\n\t"
  119862. "lsl r2, r2, #8\n\t"
  119863. "add r2, r2, #0xf8\n\t"
  119864. #else
  119865. "mov r2, #0x1f8\n\t"
  119866. #endif
  119867. "ldrb r12, [lr, r3]\n\t"
  119868. "add r12, r2, r12\n\t"
  119869. "b L_sp_521_num_bits_17_18_%=\n\t"
  119870. "\n"
  119871. "L_sp_521_num_bits_17_15_3_%=: \n\t"
  119872. "lsr r3, r1, #16\n\t"
  119873. "and r3, r3, #0xff\n\t"
  119874. "cmp r3, #0\n\t"
  119875. "beq L_sp_521_num_bits_17_15_2_%=\n\t"
  119876. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119877. "mov r2, #0x1\n\t"
  119878. "lsl r2, r2, #8\n\t"
  119879. "add r2, r2, #0xf0\n\t"
  119880. #else
  119881. "mov r2, #0x1f0\n\t"
  119882. #endif
  119883. "ldrb r12, [lr, r3]\n\t"
  119884. "add r12, r2, r12\n\t"
  119885. "b L_sp_521_num_bits_17_18_%=\n\t"
  119886. "\n"
  119887. "L_sp_521_num_bits_17_15_2_%=: \n\t"
  119888. "lsr r3, r1, #8\n\t"
  119889. "and r3, r3, #0xff\n\t"
  119890. "cmp r3, #0\n\t"
  119891. "beq L_sp_521_num_bits_17_15_1_%=\n\t"
  119892. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119893. "mov r2, #0x1\n\t"
  119894. "lsl r2, r2, #8\n\t"
  119895. "add r2, r2, #0xe8\n\t"
  119896. #else
  119897. "mov r2, #0x1e8\n\t"
  119898. #endif
  119899. "ldrb r12, [lr, r3]\n\t"
  119900. "add r12, r2, r12\n\t"
  119901. "b L_sp_521_num_bits_17_18_%=\n\t"
  119902. "\n"
  119903. "L_sp_521_num_bits_17_15_1_%=: \n\t"
  119904. "and r3, r1, #0xff\n\t"
  119905. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119906. "mov r2, #0x1\n\t"
  119907. "lsl r2, r2, #8\n\t"
  119908. "add r2, r2, #0xe0\n\t"
  119909. #else
  119910. "mov r2, #0x1e0\n\t"
  119911. #endif
  119912. "ldrb r12, [lr, r3]\n\t"
  119913. "add r12, r2, r12\n\t"
  119914. "b L_sp_521_num_bits_17_18_%=\n\t"
  119915. "\n"
  119916. "L_sp_521_num_bits_17_15_%=: \n\t"
  119917. "ldr r1, [%[a], #56]\n\t"
  119918. "cmp r1, #0\n\t"
  119919. "beq L_sp_521_num_bits_17_14_%=\n\t"
  119920. "lsr r3, r1, #24\n\t"
  119921. "cmp r3, #0\n\t"
  119922. "beq L_sp_521_num_bits_17_14_3_%=\n\t"
  119923. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119924. "mov r2, #0x1\n\t"
  119925. "lsl r2, r2, #8\n\t"
  119926. "add r2, r2, #0xd8\n\t"
  119927. #else
  119928. "mov r2, #0x1d8\n\t"
  119929. #endif
  119930. "ldrb r12, [lr, r3]\n\t"
  119931. "add r12, r2, r12\n\t"
  119932. "b L_sp_521_num_bits_17_18_%=\n\t"
  119933. "\n"
  119934. "L_sp_521_num_bits_17_14_3_%=: \n\t"
  119935. "lsr r3, r1, #16\n\t"
  119936. "and r3, r3, #0xff\n\t"
  119937. "cmp r3, #0\n\t"
  119938. "beq L_sp_521_num_bits_17_14_2_%=\n\t"
  119939. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119940. "mov r2, #0x1\n\t"
  119941. "lsl r2, r2, #8\n\t"
  119942. "add r2, r2, #0xd0\n\t"
  119943. #else
  119944. "mov r2, #0x1d0\n\t"
  119945. #endif
  119946. "ldrb r12, [lr, r3]\n\t"
  119947. "add r12, r2, r12\n\t"
  119948. "b L_sp_521_num_bits_17_18_%=\n\t"
  119949. "\n"
  119950. "L_sp_521_num_bits_17_14_2_%=: \n\t"
  119951. "lsr r3, r1, #8\n\t"
  119952. "and r3, r3, #0xff\n\t"
  119953. "cmp r3, #0\n\t"
  119954. "beq L_sp_521_num_bits_17_14_1_%=\n\t"
  119955. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119956. "mov r2, #0x1\n\t"
  119957. "lsl r2, r2, #8\n\t"
  119958. "add r2, r2, #0xc8\n\t"
  119959. #else
  119960. "mov r2, #0x1c8\n\t"
  119961. #endif
  119962. "ldrb r12, [lr, r3]\n\t"
  119963. "add r12, r2, r12\n\t"
  119964. "b L_sp_521_num_bits_17_18_%=\n\t"
  119965. "\n"
  119966. "L_sp_521_num_bits_17_14_1_%=: \n\t"
  119967. "and r3, r1, #0xff\n\t"
  119968. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119969. "mov r2, #0x1\n\t"
  119970. "lsl r2, r2, #8\n\t"
  119971. "add r2, r2, #0xc0\n\t"
  119972. #else
  119973. "mov r2, #0x1c0\n\t"
  119974. #endif
  119975. "ldrb r12, [lr, r3]\n\t"
  119976. "add r12, r2, r12\n\t"
  119977. "b L_sp_521_num_bits_17_18_%=\n\t"
  119978. "\n"
  119979. "L_sp_521_num_bits_17_14_%=: \n\t"
  119980. "ldr r1, [%[a], #52]\n\t"
  119981. "cmp r1, #0\n\t"
  119982. "beq L_sp_521_num_bits_17_13_%=\n\t"
  119983. "lsr r3, r1, #24\n\t"
  119984. "cmp r3, #0\n\t"
  119985. "beq L_sp_521_num_bits_17_13_3_%=\n\t"
  119986. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  119987. "mov r2, #0x1\n\t"
  119988. "lsl r2, r2, #8\n\t"
  119989. "add r2, r2, #0xb8\n\t"
  119990. #else
  119991. "mov r2, #0x1b8\n\t"
  119992. #endif
  119993. "ldrb r12, [lr, r3]\n\t"
  119994. "add r12, r2, r12\n\t"
  119995. "b L_sp_521_num_bits_17_18_%=\n\t"
  119996. "\n"
  119997. "L_sp_521_num_bits_17_13_3_%=: \n\t"
  119998. "lsr r3, r1, #16\n\t"
  119999. "and r3, r3, #0xff\n\t"
  120000. "cmp r3, #0\n\t"
  120001. "beq L_sp_521_num_bits_17_13_2_%=\n\t"
  120002. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120003. "mov r2, #0x1\n\t"
  120004. "lsl r2, r2, #8\n\t"
  120005. "add r2, r2, #0xb0\n\t"
  120006. #else
  120007. "mov r2, #0x1b0\n\t"
  120008. #endif
  120009. "ldrb r12, [lr, r3]\n\t"
  120010. "add r12, r2, r12\n\t"
  120011. "b L_sp_521_num_bits_17_18_%=\n\t"
  120012. "\n"
  120013. "L_sp_521_num_bits_17_13_2_%=: \n\t"
  120014. "lsr r3, r1, #8\n\t"
  120015. "and r3, r3, #0xff\n\t"
  120016. "cmp r3, #0\n\t"
  120017. "beq L_sp_521_num_bits_17_13_1_%=\n\t"
  120018. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120019. "mov r2, #0x1\n\t"
  120020. "lsl r2, r2, #8\n\t"
  120021. "add r2, r2, #0xa8\n\t"
  120022. #else
  120023. "mov r2, #0x1a8\n\t"
  120024. #endif
  120025. "ldrb r12, [lr, r3]\n\t"
  120026. "add r12, r2, r12\n\t"
  120027. "b L_sp_521_num_bits_17_18_%=\n\t"
  120028. "\n"
  120029. "L_sp_521_num_bits_17_13_1_%=: \n\t"
  120030. "and r3, r1, #0xff\n\t"
  120031. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120032. "mov r2, #0x1\n\t"
  120033. "lsl r2, r2, #8\n\t"
  120034. "add r2, r2, #0xa0\n\t"
  120035. #else
  120036. "mov r2, #0x1a0\n\t"
  120037. #endif
  120038. "ldrb r12, [lr, r3]\n\t"
  120039. "add r12, r2, r12\n\t"
  120040. "b L_sp_521_num_bits_17_18_%=\n\t"
  120041. "\n"
  120042. "L_sp_521_num_bits_17_13_%=: \n\t"
  120043. "ldr r1, [%[a], #48]\n\t"
  120044. "cmp r1, #0\n\t"
  120045. "beq L_sp_521_num_bits_17_12_%=\n\t"
  120046. "lsr r3, r1, #24\n\t"
  120047. "cmp r3, #0\n\t"
  120048. "beq L_sp_521_num_bits_17_12_3_%=\n\t"
  120049. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120050. "mov r2, #0x1\n\t"
  120051. "lsl r2, r2, #8\n\t"
  120052. "add r2, r2, #0x98\n\t"
  120053. #else
  120054. "mov r2, #0x198\n\t"
  120055. #endif
  120056. "ldrb r12, [lr, r3]\n\t"
  120057. "add r12, r2, r12\n\t"
  120058. "b L_sp_521_num_bits_17_18_%=\n\t"
  120059. "\n"
  120060. "L_sp_521_num_bits_17_12_3_%=: \n\t"
  120061. "lsr r3, r1, #16\n\t"
  120062. "and r3, r3, #0xff\n\t"
  120063. "cmp r3, #0\n\t"
  120064. "beq L_sp_521_num_bits_17_12_2_%=\n\t"
  120065. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120066. "mov r2, #0x1\n\t"
  120067. "lsl r2, r2, #8\n\t"
  120068. "add r2, r2, #0x90\n\t"
  120069. #else
  120070. "mov r2, #0x190\n\t"
  120071. #endif
  120072. "ldrb r12, [lr, r3]\n\t"
  120073. "add r12, r2, r12\n\t"
  120074. "b L_sp_521_num_bits_17_18_%=\n\t"
  120075. "\n"
  120076. "L_sp_521_num_bits_17_12_2_%=: \n\t"
  120077. "lsr r3, r1, #8\n\t"
  120078. "and r3, r3, #0xff\n\t"
  120079. "cmp r3, #0\n\t"
  120080. "beq L_sp_521_num_bits_17_12_1_%=\n\t"
  120081. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120082. "mov r2, #0x1\n\t"
  120083. "lsl r2, r2, #8\n\t"
  120084. "add r2, r2, #0x88\n\t"
  120085. #else
  120086. "mov r2, #0x188\n\t"
  120087. #endif
  120088. "ldrb r12, [lr, r3]\n\t"
  120089. "add r12, r2, r12\n\t"
  120090. "b L_sp_521_num_bits_17_18_%=\n\t"
  120091. "\n"
  120092. "L_sp_521_num_bits_17_12_1_%=: \n\t"
  120093. "and r3, r1, #0xff\n\t"
  120094. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120095. "mov r2, #0x1\n\t"
  120096. "lsl r2, r2, #8\n\t"
  120097. "add r2, r2, #0x80\n\t"
  120098. #else
  120099. "mov r2, #0x180\n\t"
  120100. #endif
  120101. "ldrb r12, [lr, r3]\n\t"
  120102. "add r12, r2, r12\n\t"
  120103. "b L_sp_521_num_bits_17_18_%=\n\t"
  120104. "\n"
  120105. "L_sp_521_num_bits_17_12_%=: \n\t"
  120106. "ldr r1, [%[a], #44]\n\t"
  120107. "cmp r1, #0\n\t"
  120108. "beq L_sp_521_num_bits_17_11_%=\n\t"
  120109. "lsr r3, r1, #24\n\t"
  120110. "cmp r3, #0\n\t"
  120111. "beq L_sp_521_num_bits_17_11_3_%=\n\t"
  120112. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120113. "mov r2, #0x1\n\t"
  120114. "lsl r2, r2, #8\n\t"
  120115. "add r2, r2, #0x78\n\t"
  120116. #else
  120117. "mov r2, #0x178\n\t"
  120118. #endif
  120119. "ldrb r12, [lr, r3]\n\t"
  120120. "add r12, r2, r12\n\t"
  120121. "b L_sp_521_num_bits_17_18_%=\n\t"
  120122. "\n"
  120123. "L_sp_521_num_bits_17_11_3_%=: \n\t"
  120124. "lsr r3, r1, #16\n\t"
  120125. "and r3, r3, #0xff\n\t"
  120126. "cmp r3, #0\n\t"
  120127. "beq L_sp_521_num_bits_17_11_2_%=\n\t"
  120128. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120129. "mov r2, #0x1\n\t"
  120130. "lsl r2, r2, #8\n\t"
  120131. "add r2, r2, #0x70\n\t"
  120132. #else
  120133. "mov r2, #0x170\n\t"
  120134. #endif
  120135. "ldrb r12, [lr, r3]\n\t"
  120136. "add r12, r2, r12\n\t"
  120137. "b L_sp_521_num_bits_17_18_%=\n\t"
  120138. "\n"
  120139. "L_sp_521_num_bits_17_11_2_%=: \n\t"
  120140. "lsr r3, r1, #8\n\t"
  120141. "and r3, r3, #0xff\n\t"
  120142. "cmp r3, #0\n\t"
  120143. "beq L_sp_521_num_bits_17_11_1_%=\n\t"
  120144. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120145. "mov r2, #0x1\n\t"
  120146. "lsl r2, r2, #8\n\t"
  120147. "add r2, r2, #0x68\n\t"
  120148. #else
  120149. "mov r2, #0x168\n\t"
  120150. #endif
  120151. "ldrb r12, [lr, r3]\n\t"
  120152. "add r12, r2, r12\n\t"
  120153. "b L_sp_521_num_bits_17_18_%=\n\t"
  120154. "\n"
  120155. "L_sp_521_num_bits_17_11_1_%=: \n\t"
  120156. "and r3, r1, #0xff\n\t"
  120157. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120158. "mov r2, #0x1\n\t"
  120159. "lsl r2, r2, #8\n\t"
  120160. "add r2, r2, #0x60\n\t"
  120161. #else
  120162. "mov r2, #0x160\n\t"
  120163. #endif
  120164. "ldrb r12, [lr, r3]\n\t"
  120165. "add r12, r2, r12\n\t"
  120166. "b L_sp_521_num_bits_17_18_%=\n\t"
  120167. "\n"
  120168. "L_sp_521_num_bits_17_11_%=: \n\t"
  120169. "ldr r1, [%[a], #40]\n\t"
  120170. "cmp r1, #0\n\t"
  120171. "beq L_sp_521_num_bits_17_10_%=\n\t"
  120172. "lsr r3, r1, #24\n\t"
  120173. "cmp r3, #0\n\t"
  120174. "beq L_sp_521_num_bits_17_10_3_%=\n\t"
  120175. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120176. "mov r2, #0x1\n\t"
  120177. "lsl r2, r2, #8\n\t"
  120178. "add r2, r2, #0x58\n\t"
  120179. #else
  120180. "mov r2, #0x158\n\t"
  120181. #endif
  120182. "ldrb r12, [lr, r3]\n\t"
  120183. "add r12, r2, r12\n\t"
  120184. "b L_sp_521_num_bits_17_18_%=\n\t"
  120185. "\n"
  120186. "L_sp_521_num_bits_17_10_3_%=: \n\t"
  120187. "lsr r3, r1, #16\n\t"
  120188. "and r3, r3, #0xff\n\t"
  120189. "cmp r3, #0\n\t"
  120190. "beq L_sp_521_num_bits_17_10_2_%=\n\t"
  120191. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120192. "mov r2, #0x1\n\t"
  120193. "lsl r2, r2, #8\n\t"
  120194. "add r2, r2, #0x50\n\t"
  120195. #else
  120196. "mov r2, #0x150\n\t"
  120197. #endif
  120198. "ldrb r12, [lr, r3]\n\t"
  120199. "add r12, r2, r12\n\t"
  120200. "b L_sp_521_num_bits_17_18_%=\n\t"
  120201. "\n"
  120202. "L_sp_521_num_bits_17_10_2_%=: \n\t"
  120203. "lsr r3, r1, #8\n\t"
  120204. "and r3, r3, #0xff\n\t"
  120205. "cmp r3, #0\n\t"
  120206. "beq L_sp_521_num_bits_17_10_1_%=\n\t"
  120207. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120208. "mov r2, #0x1\n\t"
  120209. "lsl r2, r2, #8\n\t"
  120210. "add r2, r2, #0x48\n\t"
  120211. #else
  120212. "mov r2, #0x148\n\t"
  120213. #endif
  120214. "ldrb r12, [lr, r3]\n\t"
  120215. "add r12, r2, r12\n\t"
  120216. "b L_sp_521_num_bits_17_18_%=\n\t"
  120217. "\n"
  120218. "L_sp_521_num_bits_17_10_1_%=: \n\t"
  120219. "and r3, r1, #0xff\n\t"
  120220. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120221. "mov r2, #0x1\n\t"
  120222. "lsl r2, r2, #8\n\t"
  120223. "add r2, r2, #0x40\n\t"
  120224. #else
  120225. "mov r2, #0x140\n\t"
  120226. #endif
  120227. "ldrb r12, [lr, r3]\n\t"
  120228. "add r12, r2, r12\n\t"
  120229. "b L_sp_521_num_bits_17_18_%=\n\t"
  120230. "\n"
  120231. "L_sp_521_num_bits_17_10_%=: \n\t"
  120232. "ldr r1, [%[a], #36]\n\t"
  120233. "cmp r1, #0\n\t"
  120234. "beq L_sp_521_num_bits_17_9_%=\n\t"
  120235. "lsr r3, r1, #24\n\t"
  120236. "cmp r3, #0\n\t"
  120237. "beq L_sp_521_num_bits_17_9_3_%=\n\t"
  120238. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120239. "mov r2, #0x1\n\t"
  120240. "lsl r2, r2, #8\n\t"
  120241. "add r2, r2, #0x38\n\t"
  120242. #else
  120243. "mov r2, #0x138\n\t"
  120244. #endif
  120245. "ldrb r12, [lr, r3]\n\t"
  120246. "add r12, r2, r12\n\t"
  120247. "b L_sp_521_num_bits_17_18_%=\n\t"
  120248. "\n"
  120249. "L_sp_521_num_bits_17_9_3_%=: \n\t"
  120250. "lsr r3, r1, #16\n\t"
  120251. "and r3, r3, #0xff\n\t"
  120252. "cmp r3, #0\n\t"
  120253. "beq L_sp_521_num_bits_17_9_2_%=\n\t"
  120254. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120255. "mov r2, #0x1\n\t"
  120256. "lsl r2, r2, #8\n\t"
  120257. "add r2, r2, #0x30\n\t"
  120258. #else
  120259. "mov r2, #0x130\n\t"
  120260. #endif
  120261. "ldrb r12, [lr, r3]\n\t"
  120262. "add r12, r2, r12\n\t"
  120263. "b L_sp_521_num_bits_17_18_%=\n\t"
  120264. "\n"
  120265. "L_sp_521_num_bits_17_9_2_%=: \n\t"
  120266. "lsr r3, r1, #8\n\t"
  120267. "and r3, r3, #0xff\n\t"
  120268. "cmp r3, #0\n\t"
  120269. "beq L_sp_521_num_bits_17_9_1_%=\n\t"
  120270. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120271. "mov r2, #0x1\n\t"
  120272. "lsl r2, r2, #8\n\t"
  120273. "add r2, r2, #0x28\n\t"
  120274. #else
  120275. "mov r2, #0x128\n\t"
  120276. #endif
  120277. "ldrb r12, [lr, r3]\n\t"
  120278. "add r12, r2, r12\n\t"
  120279. "b L_sp_521_num_bits_17_18_%=\n\t"
  120280. "\n"
  120281. "L_sp_521_num_bits_17_9_1_%=: \n\t"
  120282. "and r3, r1, #0xff\n\t"
  120283. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120284. "mov r2, #0x1\n\t"
  120285. "lsl r2, r2, #8\n\t"
  120286. "add r2, r2, #0x20\n\t"
  120287. #else
  120288. "mov r2, #0x120\n\t"
  120289. #endif
  120290. "ldrb r12, [lr, r3]\n\t"
  120291. "add r12, r2, r12\n\t"
  120292. "b L_sp_521_num_bits_17_18_%=\n\t"
  120293. "\n"
  120294. "L_sp_521_num_bits_17_9_%=: \n\t"
  120295. "ldr r1, [%[a], #32]\n\t"
  120296. "cmp r1, #0\n\t"
  120297. "beq L_sp_521_num_bits_17_8_%=\n\t"
  120298. "lsr r3, r1, #24\n\t"
  120299. "cmp r3, #0\n\t"
  120300. "beq L_sp_521_num_bits_17_8_3_%=\n\t"
  120301. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120302. "mov r2, #0x1\n\t"
  120303. "lsl r2, r2, #8\n\t"
  120304. "add r2, r2, #0x18\n\t"
  120305. #else
  120306. "mov r2, #0x118\n\t"
  120307. #endif
  120308. "ldrb r12, [lr, r3]\n\t"
  120309. "add r12, r2, r12\n\t"
  120310. "b L_sp_521_num_bits_17_18_%=\n\t"
  120311. "\n"
  120312. "L_sp_521_num_bits_17_8_3_%=: \n\t"
  120313. "lsr r3, r1, #16\n\t"
  120314. "and r3, r3, #0xff\n\t"
  120315. "cmp r3, #0\n\t"
  120316. "beq L_sp_521_num_bits_17_8_2_%=\n\t"
  120317. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120318. "mov r2, #0x1\n\t"
  120319. "lsl r2, r2, #8\n\t"
  120320. "add r2, r2, #0x10\n\t"
  120321. #else
  120322. "mov r2, #0x110\n\t"
  120323. #endif
  120324. "ldrb r12, [lr, r3]\n\t"
  120325. "add r12, r2, r12\n\t"
  120326. "b L_sp_521_num_bits_17_18_%=\n\t"
  120327. "\n"
  120328. "L_sp_521_num_bits_17_8_2_%=: \n\t"
  120329. "lsr r3, r1, #8\n\t"
  120330. "and r3, r3, #0xff\n\t"
  120331. "cmp r3, #0\n\t"
  120332. "beq L_sp_521_num_bits_17_8_1_%=\n\t"
  120333. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120334. "mov r2, #0x1\n\t"
  120335. "lsl r2, r2, #8\n\t"
  120336. "add r2, r2, #0x8\n\t"
  120337. #else
  120338. "mov r2, #0x108\n\t"
  120339. #endif
  120340. "ldrb r12, [lr, r3]\n\t"
  120341. "add r12, r2, r12\n\t"
  120342. "b L_sp_521_num_bits_17_18_%=\n\t"
  120343. "\n"
  120344. "L_sp_521_num_bits_17_8_1_%=: \n\t"
  120345. "and r3, r1, #0xff\n\t"
  120346. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120347. "mov r2, #0x1\n\t"
  120348. "lsl r2, r2, #8\n\t"
  120349. "add r2, r2, #0x0\n\t"
  120350. #else
  120351. "mov r2, #0x100\n\t"
  120352. #endif
  120353. "ldrb r12, [lr, r3]\n\t"
  120354. "add r12, r2, r12\n\t"
  120355. "b L_sp_521_num_bits_17_18_%=\n\t"
  120356. "\n"
  120357. "L_sp_521_num_bits_17_8_%=: \n\t"
  120358. "ldr r1, [%[a], #28]\n\t"
  120359. "cmp r1, #0\n\t"
  120360. "beq L_sp_521_num_bits_17_7_%=\n\t"
  120361. "lsr r3, r1, #24\n\t"
  120362. "cmp r3, #0\n\t"
  120363. "beq L_sp_521_num_bits_17_7_3_%=\n\t"
  120364. "mov r2, #0xf8\n\t"
  120365. "ldrb r12, [lr, r3]\n\t"
  120366. "add r12, r2, r12\n\t"
  120367. "b L_sp_521_num_bits_17_18_%=\n\t"
  120368. "\n"
  120369. "L_sp_521_num_bits_17_7_3_%=: \n\t"
  120370. "lsr r3, r1, #16\n\t"
  120371. "and r3, r3, #0xff\n\t"
  120372. "cmp r3, #0\n\t"
  120373. "beq L_sp_521_num_bits_17_7_2_%=\n\t"
  120374. "mov r2, #0xf0\n\t"
  120375. "ldrb r12, [lr, r3]\n\t"
  120376. "add r12, r2, r12\n\t"
  120377. "b L_sp_521_num_bits_17_18_%=\n\t"
  120378. "\n"
  120379. "L_sp_521_num_bits_17_7_2_%=: \n\t"
  120380. "lsr r3, r1, #8\n\t"
  120381. "and r3, r3, #0xff\n\t"
  120382. "cmp r3, #0\n\t"
  120383. "beq L_sp_521_num_bits_17_7_1_%=\n\t"
  120384. "mov r2, #0xe8\n\t"
  120385. "ldrb r12, [lr, r3]\n\t"
  120386. "add r12, r2, r12\n\t"
  120387. "b L_sp_521_num_bits_17_18_%=\n\t"
  120388. "\n"
  120389. "L_sp_521_num_bits_17_7_1_%=: \n\t"
  120390. "and r3, r1, #0xff\n\t"
  120391. "mov r2, #0xe0\n\t"
  120392. "ldrb r12, [lr, r3]\n\t"
  120393. "add r12, r2, r12\n\t"
  120394. "b L_sp_521_num_bits_17_18_%=\n\t"
  120395. "\n"
  120396. "L_sp_521_num_bits_17_7_%=: \n\t"
  120397. "ldr r1, [%[a], #24]\n\t"
  120398. "cmp r1, #0\n\t"
  120399. "beq L_sp_521_num_bits_17_6_%=\n\t"
  120400. "lsr r3, r1, #24\n\t"
  120401. "cmp r3, #0\n\t"
  120402. "beq L_sp_521_num_bits_17_6_3_%=\n\t"
  120403. "mov r2, #0xd8\n\t"
  120404. "ldrb r12, [lr, r3]\n\t"
  120405. "add r12, r2, r12\n\t"
  120406. "b L_sp_521_num_bits_17_18_%=\n\t"
  120407. "\n"
  120408. "L_sp_521_num_bits_17_6_3_%=: \n\t"
  120409. "lsr r3, r1, #16\n\t"
  120410. "and r3, r3, #0xff\n\t"
  120411. "cmp r3, #0\n\t"
  120412. "beq L_sp_521_num_bits_17_6_2_%=\n\t"
  120413. "mov r2, #0xd0\n\t"
  120414. "ldrb r12, [lr, r3]\n\t"
  120415. "add r12, r2, r12\n\t"
  120416. "b L_sp_521_num_bits_17_18_%=\n\t"
  120417. "\n"
  120418. "L_sp_521_num_bits_17_6_2_%=: \n\t"
  120419. "lsr r3, r1, #8\n\t"
  120420. "and r3, r3, #0xff\n\t"
  120421. "cmp r3, #0\n\t"
  120422. "beq L_sp_521_num_bits_17_6_1_%=\n\t"
  120423. "mov r2, #0xc8\n\t"
  120424. "ldrb r12, [lr, r3]\n\t"
  120425. "add r12, r2, r12\n\t"
  120426. "b L_sp_521_num_bits_17_18_%=\n\t"
  120427. "\n"
  120428. "L_sp_521_num_bits_17_6_1_%=: \n\t"
  120429. "and r3, r1, #0xff\n\t"
  120430. "mov r2, #0xc0\n\t"
  120431. "ldrb r12, [lr, r3]\n\t"
  120432. "add r12, r2, r12\n\t"
  120433. "b L_sp_521_num_bits_17_18_%=\n\t"
  120434. "\n"
  120435. "L_sp_521_num_bits_17_6_%=: \n\t"
  120436. "ldr r1, [%[a], #20]\n\t"
  120437. "cmp r1, #0\n\t"
  120438. "beq L_sp_521_num_bits_17_5_%=\n\t"
  120439. "lsr r3, r1, #24\n\t"
  120440. "cmp r3, #0\n\t"
  120441. "beq L_sp_521_num_bits_17_5_3_%=\n\t"
  120442. "mov r2, #0xb8\n\t"
  120443. "ldrb r12, [lr, r3]\n\t"
  120444. "add r12, r2, r12\n\t"
  120445. "b L_sp_521_num_bits_17_18_%=\n\t"
  120446. "\n"
  120447. "L_sp_521_num_bits_17_5_3_%=: \n\t"
  120448. "lsr r3, r1, #16\n\t"
  120449. "and r3, r3, #0xff\n\t"
  120450. "cmp r3, #0\n\t"
  120451. "beq L_sp_521_num_bits_17_5_2_%=\n\t"
  120452. "mov r2, #0xb0\n\t"
  120453. "ldrb r12, [lr, r3]\n\t"
  120454. "add r12, r2, r12\n\t"
  120455. "b L_sp_521_num_bits_17_18_%=\n\t"
  120456. "\n"
  120457. "L_sp_521_num_bits_17_5_2_%=: \n\t"
  120458. "lsr r3, r1, #8\n\t"
  120459. "and r3, r3, #0xff\n\t"
  120460. "cmp r3, #0\n\t"
  120461. "beq L_sp_521_num_bits_17_5_1_%=\n\t"
  120462. "mov r2, #0xa8\n\t"
  120463. "ldrb r12, [lr, r3]\n\t"
  120464. "add r12, r2, r12\n\t"
  120465. "b L_sp_521_num_bits_17_18_%=\n\t"
  120466. "\n"
  120467. "L_sp_521_num_bits_17_5_1_%=: \n\t"
  120468. "and r3, r1, #0xff\n\t"
  120469. "mov r2, #0xa0\n\t"
  120470. "ldrb r12, [lr, r3]\n\t"
  120471. "add r12, r2, r12\n\t"
  120472. "b L_sp_521_num_bits_17_18_%=\n\t"
  120473. "\n"
  120474. "L_sp_521_num_bits_17_5_%=: \n\t"
  120475. "ldr r1, [%[a], #16]\n\t"
  120476. "cmp r1, #0\n\t"
  120477. "beq L_sp_521_num_bits_17_4_%=\n\t"
  120478. "lsr r3, r1, #24\n\t"
  120479. "cmp r3, #0\n\t"
  120480. "beq L_sp_521_num_bits_17_4_3_%=\n\t"
  120481. "mov r2, #0x98\n\t"
  120482. "ldrb r12, [lr, r3]\n\t"
  120483. "add r12, r2, r12\n\t"
  120484. "b L_sp_521_num_bits_17_18_%=\n\t"
  120485. "\n"
  120486. "L_sp_521_num_bits_17_4_3_%=: \n\t"
  120487. "lsr r3, r1, #16\n\t"
  120488. "and r3, r3, #0xff\n\t"
  120489. "cmp r3, #0\n\t"
  120490. "beq L_sp_521_num_bits_17_4_2_%=\n\t"
  120491. "mov r2, #0x90\n\t"
  120492. "ldrb r12, [lr, r3]\n\t"
  120493. "add r12, r2, r12\n\t"
  120494. "b L_sp_521_num_bits_17_18_%=\n\t"
  120495. "\n"
  120496. "L_sp_521_num_bits_17_4_2_%=: \n\t"
  120497. "lsr r3, r1, #8\n\t"
  120498. "and r3, r3, #0xff\n\t"
  120499. "cmp r3, #0\n\t"
  120500. "beq L_sp_521_num_bits_17_4_1_%=\n\t"
  120501. "mov r2, #0x88\n\t"
  120502. "ldrb r12, [lr, r3]\n\t"
  120503. "add r12, r2, r12\n\t"
  120504. "b L_sp_521_num_bits_17_18_%=\n\t"
  120505. "\n"
  120506. "L_sp_521_num_bits_17_4_1_%=: \n\t"
  120507. "and r3, r1, #0xff\n\t"
  120508. "mov r2, #0x80\n\t"
  120509. "ldrb r12, [lr, r3]\n\t"
  120510. "add r12, r2, r12\n\t"
  120511. "b L_sp_521_num_bits_17_18_%=\n\t"
  120512. "\n"
  120513. "L_sp_521_num_bits_17_4_%=: \n\t"
  120514. "ldr r1, [%[a], #12]\n\t"
  120515. "cmp r1, #0\n\t"
  120516. "beq L_sp_521_num_bits_17_3_%=\n\t"
  120517. "lsr r3, r1, #24\n\t"
  120518. "cmp r3, #0\n\t"
  120519. "beq L_sp_521_num_bits_17_3_3_%=\n\t"
  120520. "mov r2, #0x78\n\t"
  120521. "ldrb r12, [lr, r3]\n\t"
  120522. "add r12, r2, r12\n\t"
  120523. "b L_sp_521_num_bits_17_18_%=\n\t"
  120524. "\n"
  120525. "L_sp_521_num_bits_17_3_3_%=: \n\t"
  120526. "lsr r3, r1, #16\n\t"
  120527. "and r3, r3, #0xff\n\t"
  120528. "cmp r3, #0\n\t"
  120529. "beq L_sp_521_num_bits_17_3_2_%=\n\t"
  120530. "mov r2, #0x70\n\t"
  120531. "ldrb r12, [lr, r3]\n\t"
  120532. "add r12, r2, r12\n\t"
  120533. "b L_sp_521_num_bits_17_18_%=\n\t"
  120534. "\n"
  120535. "L_sp_521_num_bits_17_3_2_%=: \n\t"
  120536. "lsr r3, r1, #8\n\t"
  120537. "and r3, r3, #0xff\n\t"
  120538. "cmp r3, #0\n\t"
  120539. "beq L_sp_521_num_bits_17_3_1_%=\n\t"
  120540. "mov r2, #0x68\n\t"
  120541. "ldrb r12, [lr, r3]\n\t"
  120542. "add r12, r2, r12\n\t"
  120543. "b L_sp_521_num_bits_17_18_%=\n\t"
  120544. "\n"
  120545. "L_sp_521_num_bits_17_3_1_%=: \n\t"
  120546. "and r3, r1, #0xff\n\t"
  120547. "mov r2, #0x60\n\t"
  120548. "ldrb r12, [lr, r3]\n\t"
  120549. "add r12, r2, r12\n\t"
  120550. "b L_sp_521_num_bits_17_18_%=\n\t"
  120551. "\n"
  120552. "L_sp_521_num_bits_17_3_%=: \n\t"
  120553. "ldr r1, [%[a], #8]\n\t"
  120554. "cmp r1, #0\n\t"
  120555. "beq L_sp_521_num_bits_17_2_%=\n\t"
  120556. "lsr r3, r1, #24\n\t"
  120557. "cmp r3, #0\n\t"
  120558. "beq L_sp_521_num_bits_17_2_3_%=\n\t"
  120559. "mov r2, #0x58\n\t"
  120560. "ldrb r12, [lr, r3]\n\t"
  120561. "add r12, r2, r12\n\t"
  120562. "b L_sp_521_num_bits_17_18_%=\n\t"
  120563. "\n"
  120564. "L_sp_521_num_bits_17_2_3_%=: \n\t"
  120565. "lsr r3, r1, #16\n\t"
  120566. "and r3, r3, #0xff\n\t"
  120567. "cmp r3, #0\n\t"
  120568. "beq L_sp_521_num_bits_17_2_2_%=\n\t"
  120569. "mov r2, #0x50\n\t"
  120570. "ldrb r12, [lr, r3]\n\t"
  120571. "add r12, r2, r12\n\t"
  120572. "b L_sp_521_num_bits_17_18_%=\n\t"
  120573. "\n"
  120574. "L_sp_521_num_bits_17_2_2_%=: \n\t"
  120575. "lsr r3, r1, #8\n\t"
  120576. "and r3, r3, #0xff\n\t"
  120577. "cmp r3, #0\n\t"
  120578. "beq L_sp_521_num_bits_17_2_1_%=\n\t"
  120579. "mov r2, #0x48\n\t"
  120580. "ldrb r12, [lr, r3]\n\t"
  120581. "add r12, r2, r12\n\t"
  120582. "b L_sp_521_num_bits_17_18_%=\n\t"
  120583. "\n"
  120584. "L_sp_521_num_bits_17_2_1_%=: \n\t"
  120585. "and r3, r1, #0xff\n\t"
  120586. "mov r2, #0x40\n\t"
  120587. "ldrb r12, [lr, r3]\n\t"
  120588. "add r12, r2, r12\n\t"
  120589. "b L_sp_521_num_bits_17_18_%=\n\t"
  120590. "\n"
  120591. "L_sp_521_num_bits_17_2_%=: \n\t"
  120592. "ldr r1, [%[a], #4]\n\t"
  120593. "cmp r1, #0\n\t"
  120594. "beq L_sp_521_num_bits_17_1_%=\n\t"
  120595. "lsr r3, r1, #24\n\t"
  120596. "cmp r3, #0\n\t"
  120597. "beq L_sp_521_num_bits_17_1_3_%=\n\t"
  120598. "mov r2, #56\n\t"
  120599. "ldrb r12, [lr, r3]\n\t"
  120600. "add r12, r2, r12\n\t"
  120601. "b L_sp_521_num_bits_17_18_%=\n\t"
  120602. "\n"
  120603. "L_sp_521_num_bits_17_1_3_%=: \n\t"
  120604. "lsr r3, r1, #16\n\t"
  120605. "and r3, r3, #0xff\n\t"
  120606. "cmp r3, #0\n\t"
  120607. "beq L_sp_521_num_bits_17_1_2_%=\n\t"
  120608. "mov r2, #48\n\t"
  120609. "ldrb r12, [lr, r3]\n\t"
  120610. "add r12, r2, r12\n\t"
  120611. "b L_sp_521_num_bits_17_18_%=\n\t"
  120612. "\n"
  120613. "L_sp_521_num_bits_17_1_2_%=: \n\t"
  120614. "lsr r3, r1, #8\n\t"
  120615. "and r3, r3, #0xff\n\t"
  120616. "cmp r3, #0\n\t"
  120617. "beq L_sp_521_num_bits_17_1_1_%=\n\t"
  120618. "mov r2, #40\n\t"
  120619. "ldrb r12, [lr, r3]\n\t"
  120620. "add r12, r2, r12\n\t"
  120621. "b L_sp_521_num_bits_17_18_%=\n\t"
  120622. "\n"
  120623. "L_sp_521_num_bits_17_1_1_%=: \n\t"
  120624. "and r3, r1, #0xff\n\t"
  120625. "mov r2, #32\n\t"
  120626. "ldrb r12, [lr, r3]\n\t"
  120627. "add r12, r2, r12\n\t"
  120628. "b L_sp_521_num_bits_17_18_%=\n\t"
  120629. "\n"
  120630. "L_sp_521_num_bits_17_1_%=: \n\t"
  120631. "ldr r1, [%[a]]\n\t"
  120632. "lsr r3, r1, #24\n\t"
  120633. "cmp r3, #0\n\t"
  120634. "beq L_sp_521_num_bits_17_0_3_%=\n\t"
  120635. "mov r2, #24\n\t"
  120636. "ldrb r12, [lr, r3]\n\t"
  120637. "add r12, r2, r12\n\t"
  120638. "b L_sp_521_num_bits_17_18_%=\n\t"
  120639. "\n"
  120640. "L_sp_521_num_bits_17_0_3_%=: \n\t"
  120641. "lsr r3, r1, #16\n\t"
  120642. "and r3, r3, #0xff\n\t"
  120643. "cmp r3, #0\n\t"
  120644. "beq L_sp_521_num_bits_17_0_2_%=\n\t"
  120645. "mov r2, #16\n\t"
  120646. "ldrb r12, [lr, r3]\n\t"
  120647. "add r12, r2, r12\n\t"
  120648. "b L_sp_521_num_bits_17_18_%=\n\t"
  120649. "\n"
  120650. "L_sp_521_num_bits_17_0_2_%=: \n\t"
  120651. "lsr r3, r1, #8\n\t"
  120652. "and r3, r3, #0xff\n\t"
  120653. "cmp r3, #0\n\t"
  120654. "beq L_sp_521_num_bits_17_0_1_%=\n\t"
  120655. "mov r2, #8\n\t"
  120656. "ldrb r12, [lr, r3]\n\t"
  120657. "add r12, r2, r12\n\t"
  120658. "b L_sp_521_num_bits_17_18_%=\n\t"
  120659. "\n"
  120660. "L_sp_521_num_bits_17_0_1_%=: \n\t"
  120661. "and r3, r1, #0xff\n\t"
  120662. "ldrb r12, [lr, r3]\n\t"
  120663. "\n"
  120664. "L_sp_521_num_bits_17_18_%=: \n\t"
  120665. "mov %[a], r12\n\t"
  120666. : [a] "+r" (a)
  120667. : [L_sp_521_num_bits_17_table] "r" (L_sp_521_num_bits_17_table)
  120668. : "memory", "r1", "r2", "r3", "r12", "lr"
  120669. );
  120670. return (uint32_t)(size_t)a;
  120671. }
  120672. #else
  120673. static int sp_521_num_bits_17(const sp_digit* a_p)
  120674. {
  120675. register const sp_digit* a asm ("r0") = a_p;
  120676. __asm__ __volatile__ (
  120677. "ldr r1, [%[a], #64]\n\t"
  120678. "cmp r1, #0\n\t"
  120679. "beq L_sp_521_num_bits_17_16_%=\n\t"
  120680. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120681. "mov r2, #0x2\n\t"
  120682. "lsl r2, r2, #8\n\t"
  120683. "add r2, r2, #0x20\n\t"
  120684. #else
  120685. "mov r2, #0x220\n\t"
  120686. #endif
  120687. "clz r12, r1\n\t"
  120688. "sub r12, r2, r12\n\t"
  120689. "b L_sp_521_num_bits_17_18_%=\n\t"
  120690. "\n"
  120691. "L_sp_521_num_bits_17_16_%=: \n\t"
  120692. "ldr r1, [%[a], #60]\n\t"
  120693. "cmp r1, #0\n\t"
  120694. "beq L_sp_521_num_bits_17_15_%=\n\t"
  120695. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120696. "mov r2, #0x2\n\t"
  120697. "lsl r2, r2, #8\n\t"
  120698. "add r2, r2, #0x0\n\t"
  120699. #else
  120700. "mov r2, #0x200\n\t"
  120701. #endif
  120702. "clz r12, r1\n\t"
  120703. "sub r12, r2, r12\n\t"
  120704. "b L_sp_521_num_bits_17_18_%=\n\t"
  120705. "\n"
  120706. "L_sp_521_num_bits_17_15_%=: \n\t"
  120707. "ldr r1, [%[a], #56]\n\t"
  120708. "cmp r1, #0\n\t"
  120709. "beq L_sp_521_num_bits_17_14_%=\n\t"
  120710. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120711. "mov r2, #0x1\n\t"
  120712. "lsl r2, r2, #8\n\t"
  120713. "add r2, r2, #0xe0\n\t"
  120714. #else
  120715. "mov r2, #0x1e0\n\t"
  120716. #endif
  120717. "clz r12, r1\n\t"
  120718. "sub r12, r2, r12\n\t"
  120719. "b L_sp_521_num_bits_17_18_%=\n\t"
  120720. "\n"
  120721. "L_sp_521_num_bits_17_14_%=: \n\t"
  120722. "ldr r1, [%[a], #52]\n\t"
  120723. "cmp r1, #0\n\t"
  120724. "beq L_sp_521_num_bits_17_13_%=\n\t"
  120725. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120726. "mov r2, #0x1\n\t"
  120727. "lsl r2, r2, #8\n\t"
  120728. "add r2, r2, #0xc0\n\t"
  120729. #else
  120730. "mov r2, #0x1c0\n\t"
  120731. #endif
  120732. "clz r12, r1\n\t"
  120733. "sub r12, r2, r12\n\t"
  120734. "b L_sp_521_num_bits_17_18_%=\n\t"
  120735. "\n"
  120736. "L_sp_521_num_bits_17_13_%=: \n\t"
  120737. "ldr r1, [%[a], #48]\n\t"
  120738. "cmp r1, #0\n\t"
  120739. "beq L_sp_521_num_bits_17_12_%=\n\t"
  120740. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120741. "mov r2, #0x1\n\t"
  120742. "lsl r2, r2, #8\n\t"
  120743. "add r2, r2, #0xa0\n\t"
  120744. #else
  120745. "mov r2, #0x1a0\n\t"
  120746. #endif
  120747. "clz r12, r1\n\t"
  120748. "sub r12, r2, r12\n\t"
  120749. "b L_sp_521_num_bits_17_18_%=\n\t"
  120750. "\n"
  120751. "L_sp_521_num_bits_17_12_%=: \n\t"
  120752. "ldr r1, [%[a], #44]\n\t"
  120753. "cmp r1, #0\n\t"
  120754. "beq L_sp_521_num_bits_17_11_%=\n\t"
  120755. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120756. "mov r2, #0x1\n\t"
  120757. "lsl r2, r2, #8\n\t"
  120758. "add r2, r2, #0x80\n\t"
  120759. #else
  120760. "mov r2, #0x180\n\t"
  120761. #endif
  120762. "clz r12, r1\n\t"
  120763. "sub r12, r2, r12\n\t"
  120764. "b L_sp_521_num_bits_17_18_%=\n\t"
  120765. "\n"
  120766. "L_sp_521_num_bits_17_11_%=: \n\t"
  120767. "ldr r1, [%[a], #40]\n\t"
  120768. "cmp r1, #0\n\t"
  120769. "beq L_sp_521_num_bits_17_10_%=\n\t"
  120770. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120771. "mov r2, #0x1\n\t"
  120772. "lsl r2, r2, #8\n\t"
  120773. "add r2, r2, #0x60\n\t"
  120774. #else
  120775. "mov r2, #0x160\n\t"
  120776. #endif
  120777. "clz r12, r1\n\t"
  120778. "sub r12, r2, r12\n\t"
  120779. "b L_sp_521_num_bits_17_18_%=\n\t"
  120780. "\n"
  120781. "L_sp_521_num_bits_17_10_%=: \n\t"
  120782. "ldr r1, [%[a], #36]\n\t"
  120783. "cmp r1, #0\n\t"
  120784. "beq L_sp_521_num_bits_17_9_%=\n\t"
  120785. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120786. "mov r2, #0x1\n\t"
  120787. "lsl r2, r2, #8\n\t"
  120788. "add r2, r2, #0x40\n\t"
  120789. #else
  120790. "mov r2, #0x140\n\t"
  120791. #endif
  120792. "clz r12, r1\n\t"
  120793. "sub r12, r2, r12\n\t"
  120794. "b L_sp_521_num_bits_17_18_%=\n\t"
  120795. "\n"
  120796. "L_sp_521_num_bits_17_9_%=: \n\t"
  120797. "ldr r1, [%[a], #32]\n\t"
  120798. "cmp r1, #0\n\t"
  120799. "beq L_sp_521_num_bits_17_8_%=\n\t"
  120800. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120801. "mov r2, #0x1\n\t"
  120802. "lsl r2, r2, #8\n\t"
  120803. "add r2, r2, #0x20\n\t"
  120804. #else
  120805. "mov r2, #0x120\n\t"
  120806. #endif
  120807. "clz r12, r1\n\t"
  120808. "sub r12, r2, r12\n\t"
  120809. "b L_sp_521_num_bits_17_18_%=\n\t"
  120810. "\n"
  120811. "L_sp_521_num_bits_17_8_%=: \n\t"
  120812. "ldr r1, [%[a], #28]\n\t"
  120813. "cmp r1, #0\n\t"
  120814. "beq L_sp_521_num_bits_17_7_%=\n\t"
  120815. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7)
  120816. "mov r2, #0x1\n\t"
  120817. "lsl r2, r2, #8\n\t"
  120818. "add r2, r2, #0x0\n\t"
  120819. #else
  120820. "mov r2, #0x100\n\t"
  120821. #endif
  120822. "clz r12, r1\n\t"
  120823. "sub r12, r2, r12\n\t"
  120824. "b L_sp_521_num_bits_17_18_%=\n\t"
  120825. "\n"
  120826. "L_sp_521_num_bits_17_7_%=: \n\t"
  120827. "ldr r1, [%[a], #24]\n\t"
  120828. "cmp r1, #0\n\t"
  120829. "beq L_sp_521_num_bits_17_6_%=\n\t"
  120830. "mov r2, #0xe0\n\t"
  120831. "clz r12, r1\n\t"
  120832. "sub r12, r2, r12\n\t"
  120833. "b L_sp_521_num_bits_17_18_%=\n\t"
  120834. "\n"
  120835. "L_sp_521_num_bits_17_6_%=: \n\t"
  120836. "ldr r1, [%[a], #20]\n\t"
  120837. "cmp r1, #0\n\t"
  120838. "beq L_sp_521_num_bits_17_5_%=\n\t"
  120839. "mov r2, #0xc0\n\t"
  120840. "clz r12, r1\n\t"
  120841. "sub r12, r2, r12\n\t"
  120842. "b L_sp_521_num_bits_17_18_%=\n\t"
  120843. "\n"
  120844. "L_sp_521_num_bits_17_5_%=: \n\t"
  120845. "ldr r1, [%[a], #16]\n\t"
  120846. "cmp r1, #0\n\t"
  120847. "beq L_sp_521_num_bits_17_4_%=\n\t"
  120848. "mov r2, #0xa0\n\t"
  120849. "clz r12, r1\n\t"
  120850. "sub r12, r2, r12\n\t"
  120851. "b L_sp_521_num_bits_17_18_%=\n\t"
  120852. "\n"
  120853. "L_sp_521_num_bits_17_4_%=: \n\t"
  120854. "ldr r1, [%[a], #12]\n\t"
  120855. "cmp r1, #0\n\t"
  120856. "beq L_sp_521_num_bits_17_3_%=\n\t"
  120857. "mov r2, #0x80\n\t"
  120858. "clz r12, r1\n\t"
  120859. "sub r12, r2, r12\n\t"
  120860. "b L_sp_521_num_bits_17_18_%=\n\t"
  120861. "\n"
  120862. "L_sp_521_num_bits_17_3_%=: \n\t"
  120863. "ldr r1, [%[a], #8]\n\t"
  120864. "cmp r1, #0\n\t"
  120865. "beq L_sp_521_num_bits_17_2_%=\n\t"
  120866. "mov r2, #0x60\n\t"
  120867. "clz r12, r1\n\t"
  120868. "sub r12, r2, r12\n\t"
  120869. "b L_sp_521_num_bits_17_18_%=\n\t"
  120870. "\n"
  120871. "L_sp_521_num_bits_17_2_%=: \n\t"
  120872. "ldr r1, [%[a], #4]\n\t"
  120873. "cmp r1, #0\n\t"
  120874. "beq L_sp_521_num_bits_17_1_%=\n\t"
  120875. "mov r2, #0x40\n\t"
  120876. "clz r12, r1\n\t"
  120877. "sub r12, r2, r12\n\t"
  120878. "b L_sp_521_num_bits_17_18_%=\n\t"
  120879. "\n"
  120880. "L_sp_521_num_bits_17_1_%=: \n\t"
  120881. "ldr r1, [%[a]]\n\t"
  120882. "mov r2, #32\n\t"
  120883. "clz r12, r1\n\t"
  120884. "sub r12, r2, r12\n\t"
  120885. "\n"
  120886. "L_sp_521_num_bits_17_18_%=: \n\t"
  120887. "mov %[a], r12\n\t"
  120888. : [a] "+r" (a)
  120889. :
  120890. : "memory", "r1", "r2", "r3", "r12", "lr"
  120891. );
  120892. return (uint32_t)(size_t)a;
  120893. }
  120894. #endif /* WOLFSSL_SP_ARM_ARCH && (WOLFSSL_SP_ARM_ARCH < 7) */
  120895. /* Non-constant time modular inversion.
  120896. *
  120897. * @param [out] r Resulting number.
  120898. * @param [in] a Number to invert.
  120899. * @param [in] m Modulus.
  120900. * @return MP_OKAY on success.
  120901. */
  120902. static int sp_521_mod_inv_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  120903. {
  120904. sp_digit u[17];
  120905. sp_digit v[17];
  120906. sp_digit b[17];
  120907. sp_digit d[17];
  120908. int ut, vt;
  120909. sp_digit o;
  120910. XMEMCPY(u, m, sizeof(u));
  120911. XMEMCPY(v, a, sizeof(v));
  120912. ut = sp_521_num_bits_17(u);
  120913. vt = sp_521_num_bits_17(v);
  120914. XMEMSET(b, 0, sizeof(b));
  120915. if ((v[0] & 1) == 0) {
  120916. sp_521_rshift1_17(v, v);
  120917. XMEMCPY(d, m, sizeof(u));
  120918. d[0] += 1;
  120919. sp_521_rshift1_17(d, d);
  120920. vt--;
  120921. while ((v[0] & 1) == 0) {
  120922. sp_521_rshift1_17(v, v);
  120923. sp_521_div2_mod_17(d, d, m);
  120924. vt--;
  120925. }
  120926. }
  120927. else {
  120928. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  120929. d[0] = 1;
  120930. }
  120931. while (ut > 1 && vt > 1) {
  120932. if (ut > vt || (ut == vt && sp_521_cmp_17(u, v) >= 0)) {
  120933. sp_521_sub_17(u, u, v);
  120934. o = sp_521_sub_17(b, b, d);
  120935. if (o != 0)
  120936. sp_521_add_17(b, b, m);
  120937. ut = sp_521_num_bits_17(u);
  120938. do {
  120939. sp_521_rshift1_17(u, u);
  120940. sp_521_div2_mod_17(b, b, m);
  120941. ut--;
  120942. }
  120943. while (ut > 0 && (u[0] & 1) == 0);
  120944. }
  120945. else {
  120946. sp_521_sub_17(v, v, u);
  120947. o = sp_521_sub_17(d, d, b);
  120948. if (o != 0)
  120949. sp_521_add_17(d, d, m);
  120950. vt = sp_521_num_bits_17(v);
  120951. do {
  120952. sp_521_rshift1_17(v, v);
  120953. sp_521_div2_mod_17(d, d, m);
  120954. vt--;
  120955. }
  120956. while (vt > 0 && (v[0] & 1) == 0);
  120957. }
  120958. }
  120959. if (ut == 1)
  120960. XMEMCPY(r, b, sizeof(b));
  120961. else
  120962. XMEMCPY(r, d, sizeof(d));
  120963. return MP_OKAY;
  120964. }
  120965. #endif /* WOLFSSL_SP_SMALL */
  120966. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  120967. *
  120968. * p1 First point to add and holds result.
  120969. * p2 Second point to add.
  120970. * tmp Temporary storage for intermediate numbers.
  120971. */
  120972. static void sp_521_add_points_17(sp_point_521* p1, const sp_point_521* p2,
  120973. sp_digit* tmp)
  120974. {
  120975. sp_521_proj_point_add_17(p1, p1, p2, tmp);
  120976. if (sp_521_iszero_17(p1->z)) {
  120977. if (sp_521_iszero_17(p1->x) && sp_521_iszero_17(p1->y)) {
  120978. sp_521_proj_point_dbl_17(p1, p2, tmp);
  120979. }
  120980. else {
  120981. /* Y ordinate is not used from here - don't set. */
  120982. p1->x[0] = 0;
  120983. p1->x[1] = 0;
  120984. p1->x[2] = 0;
  120985. p1->x[3] = 0;
  120986. p1->x[4] = 0;
  120987. p1->x[5] = 0;
  120988. p1->x[6] = 0;
  120989. p1->x[7] = 0;
  120990. p1->x[8] = 0;
  120991. p1->x[9] = 0;
  120992. p1->x[10] = 0;
  120993. p1->x[11] = 0;
  120994. p1->x[12] = 0;
  120995. p1->x[13] = 0;
  120996. p1->x[14] = 0;
  120997. p1->x[15] = 0;
  120998. p1->x[16] = 0;
  120999. XMEMCPY(p1->z, p521_norm_mod, sizeof(p521_norm_mod));
  121000. }
  121001. }
  121002. }
  121003. /* Calculate the verification point: [e/s]G + [r/s]Q
  121004. *
  121005. * p1 Calculated point.
  121006. * p2 Public point and temporary.
  121007. * s Second part of signature as a number.
  121008. * u1 Temporary number.
  121009. * u2 Temproray number.
  121010. * heap Heap to use for allocation.
  121011. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  121012. */
  121013. static int sp_521_calc_vfy_point_17(sp_point_521* p1, sp_point_521* p2,
  121014. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  121015. {
  121016. int err;
  121017. #ifndef WOLFSSL_SP_SMALL
  121018. err = sp_521_mod_inv_17(s, s, p521_order);
  121019. if (err == MP_OKAY)
  121020. #endif /* !WOLFSSL_SP_SMALL */
  121021. {
  121022. sp_521_mul_17(s, s, p521_norm_order);
  121023. err = sp_521_mod_17(s, s, p521_order);
  121024. }
  121025. if (err == MP_OKAY) {
  121026. sp_521_norm_17(s);
  121027. #ifdef WOLFSSL_SP_SMALL
  121028. {
  121029. sp_521_mont_inv_order_17(s, s, tmp);
  121030. sp_521_mont_mul_order_17(u1, u1, s);
  121031. sp_521_mont_mul_order_17(u2, u2, s);
  121032. }
  121033. #else
  121034. {
  121035. sp_521_mont_mul_order_17(u1, u1, s);
  121036. sp_521_mont_mul_order_17(u2, u2, s);
  121037. }
  121038. #endif /* WOLFSSL_SP_SMALL */
  121039. {
  121040. err = sp_521_ecc_mulmod_base_17(p1, u1, 0, 0, heap);
  121041. }
  121042. }
  121043. if ((err == MP_OKAY) && sp_521_iszero_17(p1->z)) {
  121044. p1->infinity = 1;
  121045. }
  121046. if (err == MP_OKAY) {
  121047. err = sp_521_ecc_mulmod_17(p2, p2, u2, 0, 0, heap);
  121048. }
  121049. if ((err == MP_OKAY) && sp_521_iszero_17(p2->z)) {
  121050. p2->infinity = 1;
  121051. }
  121052. if (err == MP_OKAY) {
  121053. sp_521_add_points_17(p1, p2, tmp);
  121054. }
  121055. return err;
  121056. }
  121057. #ifdef HAVE_ECC_VERIFY
  121058. /* Verify the signature values with the hash and public key.
  121059. * e = Truncate(hash, 521)
  121060. * u1 = e/s mod order
  121061. * u2 = r/s mod order
  121062. * r == (u1.G + u2.Q)->x mod order
  121063. * Optimization: Leave point in projective form.
  121064. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  121065. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  121066. * The hash is truncated to the first 521 bits.
  121067. *
  121068. * hash Hash to sign.
  121069. * hashLen Length of the hash data.
  121070. * rng Random number generator.
  121071. * priv Private part of key - scalar.
  121072. * rm First part of result as an mp_int.
  121073. * sm Sirst part of result as an mp_int.
  121074. * heap Heap to use for allocation.
  121075. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  121076. */
  121077. int sp_ecc_verify_521(const byte* hash, word32 hashLen, const mp_int* pX,
  121078. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  121079. int* res, void* heap)
  121080. {
  121081. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121082. sp_digit* u1 = NULL;
  121083. sp_point_521* p1 = NULL;
  121084. #else
  121085. sp_digit u1[18 * 17];
  121086. sp_point_521 p1[2];
  121087. #endif
  121088. sp_digit* u2 = NULL;
  121089. sp_digit* s = NULL;
  121090. sp_digit* tmp = NULL;
  121091. sp_point_521* p2 = NULL;
  121092. sp_digit carry;
  121093. sp_int32 c = 0;
  121094. int err = MP_OKAY;
  121095. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121096. if (err == MP_OKAY) {
  121097. p1 = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  121098. DYNAMIC_TYPE_ECC);
  121099. if (p1 == NULL)
  121100. err = MEMORY_E;
  121101. }
  121102. if (err == MP_OKAY) {
  121103. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 17, heap,
  121104. DYNAMIC_TYPE_ECC);
  121105. if (u1 == NULL)
  121106. err = MEMORY_E;
  121107. }
  121108. #endif
  121109. if (err == MP_OKAY) {
  121110. u2 = u1 + 2 * 17;
  121111. s = u1 + 4 * 17;
  121112. tmp = u1 + 6 * 17;
  121113. p2 = p1 + 1;
  121114. if (hashLen > 66U) {
  121115. hashLen = 66U;
  121116. }
  121117. sp_521_from_bin(u1, 17, hash, (int)hashLen);
  121118. sp_521_from_mp(u2, 17, rm);
  121119. sp_521_from_mp(s, 17, sm);
  121120. sp_521_from_mp(p2->x, 17, pX);
  121121. sp_521_from_mp(p2->y, 17, pY);
  121122. sp_521_from_mp(p2->z, 17, pZ);
  121123. if (hashLen == 66U) {
  121124. sp_521_rshift_17(u1, u1, 7);
  121125. }
  121126. err = sp_521_calc_vfy_point_17(p1, p2, s, u1, u2, tmp, heap);
  121127. }
  121128. if (err == MP_OKAY) {
  121129. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  121130. /* Reload r and convert to Montgomery form. */
  121131. sp_521_from_mp(u2, 17, rm);
  121132. err = sp_521_mod_mul_norm_17(u2, u2, p521_mod);
  121133. }
  121134. if (err == MP_OKAY) {
  121135. /* u1 = r.z'.z' mod prime */
  121136. sp_521_mont_sqr_17(p1->z, p1->z, p521_mod, p521_mp_mod);
  121137. sp_521_mont_mul_17(u1, u2, p1->z, p521_mod, p521_mp_mod);
  121138. *res = (int)(sp_521_cmp_17(p1->x, u1) == 0);
  121139. if (*res == 0) {
  121140. /* Reload r and add order. */
  121141. sp_521_from_mp(u2, 17, rm);
  121142. carry = sp_521_add_17(u2, u2, p521_order);
  121143. /* Carry means result is greater than mod and is not valid. */
  121144. if (carry == 0) {
  121145. sp_521_norm_17(u2);
  121146. /* Compare with mod and if greater or equal then not valid. */
  121147. c = sp_521_cmp_17(u2, p521_mod);
  121148. }
  121149. }
  121150. if ((*res == 0) && (c < 0)) {
  121151. /* Convert to Montogomery form */
  121152. err = sp_521_mod_mul_norm_17(u2, u2, p521_mod);
  121153. if (err == MP_OKAY) {
  121154. /* u1 = (r + 1*order).z'.z' mod prime */
  121155. {
  121156. sp_521_mont_mul_17(u1, u2, p1->z, p521_mod, p521_mp_mod);
  121157. }
  121158. *res = (sp_521_cmp_17(p1->x, u1) == 0);
  121159. }
  121160. }
  121161. }
  121162. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121163. if (u1 != NULL)
  121164. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  121165. if (p1 != NULL)
  121166. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  121167. #endif
  121168. return err;
  121169. }
  121170. #ifdef WOLFSSL_SP_NONBLOCK
  121171. typedef struct sp_ecc_verify_521_ctx {
  121172. int state;
  121173. union {
  121174. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  121175. sp_521_mont_inv_order_17_ctx mont_inv_order_ctx;
  121176. sp_521_proj_point_dbl_17_ctx dbl_ctx;
  121177. sp_521_proj_point_add_17_ctx add_ctx;
  121178. };
  121179. sp_digit u1[2*17];
  121180. sp_digit u2[2*17];
  121181. sp_digit s[2*17];
  121182. sp_digit tmp[2*17 * 6];
  121183. sp_point_521 p1;
  121184. sp_point_521 p2;
  121185. } sp_ecc_verify_521_ctx;
  121186. int sp_ecc_verify_521_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  121187. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  121188. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  121189. {
  121190. int err = FP_WOULDBLOCK;
  121191. sp_ecc_verify_521_ctx* ctx = (sp_ecc_verify_521_ctx*)sp_ctx->data;
  121192. typedef char ctx_size_test[sizeof(sp_ecc_verify_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  121193. (void)sizeof(ctx_size_test);
  121194. switch (ctx->state) {
  121195. case 0: /* INIT */
  121196. if (hashLen > 66U) {
  121197. hashLen = 66U;
  121198. }
  121199. sp_521_from_bin(ctx->u1, 17, hash, (int)hashLen);
  121200. sp_521_from_mp(ctx->u2, 17, rm);
  121201. sp_521_from_mp(ctx->s, 17, sm);
  121202. sp_521_from_mp(ctx->p2.x, 17, pX);
  121203. sp_521_from_mp(ctx->p2.y, 17, pY);
  121204. sp_521_from_mp(ctx->p2.z, 17, pZ);
  121205. if (hashLen == 66U) {
  121206. sp_521_rshift_17(ctx->u1, ctx->u1, 7);
  121207. }
  121208. ctx->state = 1;
  121209. break;
  121210. case 1: /* NORMS0 */
  121211. sp_521_mul_17(ctx->s, ctx->s, p521_norm_order);
  121212. err = sp_521_mod_17(ctx->s, ctx->s, p521_order);
  121213. if (err == MP_OKAY)
  121214. ctx->state = 2;
  121215. break;
  121216. case 2: /* NORMS1 */
  121217. sp_521_norm_17(ctx->s);
  121218. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  121219. ctx->state = 3;
  121220. break;
  121221. case 3: /* NORMS2 */
  121222. err = sp_521_mont_inv_order_17_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  121223. if (err == MP_OKAY) {
  121224. ctx->state = 4;
  121225. }
  121226. break;
  121227. case 4: /* NORMS3 */
  121228. sp_521_mont_mul_order_17(ctx->u1, ctx->u1, ctx->s);
  121229. ctx->state = 5;
  121230. break;
  121231. case 5: /* NORMS4 */
  121232. sp_521_mont_mul_order_17(ctx->u2, ctx->u2, ctx->s);
  121233. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  121234. ctx->state = 6;
  121235. break;
  121236. case 6: /* MULBASE */
  121237. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p521_base, ctx->u1, 0, 0, heap);
  121238. if (err == MP_OKAY) {
  121239. if (sp_521_iszero_17(ctx->p1.z)) {
  121240. ctx->p1.infinity = 1;
  121241. }
  121242. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  121243. ctx->state = 7;
  121244. }
  121245. break;
  121246. case 7: /* MULMOD */
  121247. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  121248. if (err == MP_OKAY) {
  121249. if (sp_521_iszero_17(ctx->p2.z)) {
  121250. ctx->p2.infinity = 1;
  121251. }
  121252. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  121253. ctx->state = 8;
  121254. }
  121255. break;
  121256. case 8: /* ADD */
  121257. err = sp_521_proj_point_add_17_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  121258. if (err == MP_OKAY)
  121259. ctx->state = 9;
  121260. break;
  121261. case 9: /* MONT */
  121262. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  121263. /* Reload r and convert to Montgomery form. */
  121264. sp_521_from_mp(ctx->u2, 17, rm);
  121265. err = sp_521_mod_mul_norm_17(ctx->u2, ctx->u2, p521_mod);
  121266. if (err == MP_OKAY)
  121267. ctx->state = 10;
  121268. break;
  121269. case 10: /* SQR */
  121270. /* u1 = r.z'.z' mod prime */
  121271. sp_521_mont_sqr_17(ctx->p1.z, ctx->p1.z, p521_mod, p521_mp_mod);
  121272. ctx->state = 11;
  121273. break;
  121274. case 11: /* MUL */
  121275. sp_521_mont_mul_17(ctx->u1, ctx->u2, ctx->p1.z, p521_mod, p521_mp_mod);
  121276. ctx->state = 12;
  121277. break;
  121278. case 12: /* RES */
  121279. {
  121280. sp_int32 c = 0;
  121281. err = MP_OKAY; /* math okay, now check result */
  121282. *res = (int)(sp_521_cmp_17(ctx->p1.x, ctx->u1) == 0);
  121283. if (*res == 0) {
  121284. sp_digit carry;
  121285. /* Reload r and add order. */
  121286. sp_521_from_mp(ctx->u2, 17, rm);
  121287. carry = sp_521_add_17(ctx->u2, ctx->u2, p521_order);
  121288. /* Carry means result is greater than mod and is not valid. */
  121289. if (carry == 0) {
  121290. sp_521_norm_17(ctx->u2);
  121291. /* Compare with mod and if greater or equal then not valid. */
  121292. c = sp_521_cmp_17(ctx->u2, p521_mod);
  121293. }
  121294. }
  121295. if ((*res == 0) && (c < 0)) {
  121296. /* Convert to Montogomery form */
  121297. err = sp_521_mod_mul_norm_17(ctx->u2, ctx->u2, p521_mod);
  121298. if (err == MP_OKAY) {
  121299. /* u1 = (r + 1*order).z'.z' mod prime */
  121300. sp_521_mont_mul_17(ctx->u1, ctx->u2, ctx->p1.z, p521_mod,
  121301. p521_mp_mod);
  121302. *res = (int)(sp_521_cmp_17(ctx->p1.x, ctx->u1) == 0);
  121303. }
  121304. }
  121305. break;
  121306. }
  121307. } /* switch */
  121308. if (err == MP_OKAY && ctx->state != 12) {
  121309. err = FP_WOULDBLOCK;
  121310. }
  121311. return err;
  121312. }
  121313. #endif /* WOLFSSL_SP_NONBLOCK */
  121314. #endif /* HAVE_ECC_VERIFY */
  121315. #ifdef HAVE_ECC_CHECK_KEY
  121316. /* Check that the x and y oridinates are a valid point on the curve.
  121317. *
  121318. * point EC point.
  121319. * heap Heap to use if dynamically allocating.
  121320. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  121321. * not on the curve and MP_OKAY otherwise.
  121322. */
  121323. static int sp_521_ecc_is_point_17(const sp_point_521* point,
  121324. void* heap)
  121325. {
  121326. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121327. sp_digit* t1 = NULL;
  121328. #else
  121329. sp_digit t1[17 * 4];
  121330. #endif
  121331. sp_digit* t2 = NULL;
  121332. int err = MP_OKAY;
  121333. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121334. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17 * 4, heap, DYNAMIC_TYPE_ECC);
  121335. if (t1 == NULL)
  121336. err = MEMORY_E;
  121337. #endif
  121338. (void)heap;
  121339. if (err == MP_OKAY) {
  121340. t2 = t1 + 2 * 17;
  121341. sp_521_sqr_17(t1, point->y);
  121342. (void)sp_521_mod_17(t1, t1, p521_mod);
  121343. sp_521_sqr_17(t2, point->x);
  121344. (void)sp_521_mod_17(t2, t2, p521_mod);
  121345. sp_521_mul_17(t2, t2, point->x);
  121346. (void)sp_521_mod_17(t2, t2, p521_mod);
  121347. (void)sp_521_sub_17(t2, p521_mod, t2);
  121348. sp_521_mont_add_17(t1, t1, t2, p521_mod);
  121349. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  121350. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  121351. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  121352. if (sp_521_cmp_17(t1, p521_b) != 0) {
  121353. err = MP_VAL;
  121354. }
  121355. }
  121356. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121357. if (t1 != NULL)
  121358. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  121359. #endif
  121360. return err;
  121361. }
  121362. /* Check that the x and y oridinates are a valid point on the curve.
  121363. *
  121364. * pX X ordinate of EC point.
  121365. * pY Y ordinate of EC point.
  121366. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  121367. * not on the curve and MP_OKAY otherwise.
  121368. */
  121369. int sp_ecc_is_point_521(const mp_int* pX, const mp_int* pY)
  121370. {
  121371. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121372. sp_point_521* pub = NULL;
  121373. #else
  121374. sp_point_521 pub[1];
  121375. #endif
  121376. const byte one[1] = { 1 };
  121377. int err = MP_OKAY;
  121378. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121379. pub = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  121380. DYNAMIC_TYPE_ECC);
  121381. if (pub == NULL)
  121382. err = MEMORY_E;
  121383. #endif
  121384. if (err == MP_OKAY) {
  121385. sp_521_from_mp(pub->x, 17, pX);
  121386. sp_521_from_mp(pub->y, 17, pY);
  121387. sp_521_from_bin(pub->z, 17, one, (int)sizeof(one));
  121388. err = sp_521_ecc_is_point_17(pub, NULL);
  121389. }
  121390. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121391. if (pub != NULL)
  121392. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  121393. #endif
  121394. return err;
  121395. }
  121396. /* Check that the private scalar generates the EC point (px, py), the point is
  121397. * on the curve and the point has the correct order.
  121398. *
  121399. * pX X ordinate of EC point.
  121400. * pY Y ordinate of EC point.
  121401. * privm Private scalar that generates EC point.
  121402. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  121403. * not on the curve, ECC_INF_E if the point does not have the correct order,
  121404. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  121405. * MP_OKAY otherwise.
  121406. */
  121407. int sp_ecc_check_key_521(const mp_int* pX, const mp_int* pY,
  121408. const mp_int* privm, void* heap)
  121409. {
  121410. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121411. sp_digit* priv = NULL;
  121412. sp_point_521* pub = NULL;
  121413. #else
  121414. sp_digit priv[17];
  121415. sp_point_521 pub[2];
  121416. #endif
  121417. sp_point_521* p = NULL;
  121418. const byte one[1] = { 1 };
  121419. int err = MP_OKAY;
  121420. /* Quick check the lengs of public key ordinates and private key are in
  121421. * range. Proper check later.
  121422. */
  121423. if (((mp_count_bits(pX) > 521) ||
  121424. (mp_count_bits(pY) > 521) ||
  121425. ((privm != NULL) && (mp_count_bits(privm) > 521)))) {
  121426. err = ECC_OUT_OF_RANGE_E;
  121427. }
  121428. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121429. if (err == MP_OKAY) {
  121430. pub = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  121431. DYNAMIC_TYPE_ECC);
  121432. if (pub == NULL)
  121433. err = MEMORY_E;
  121434. }
  121435. if (err == MP_OKAY && privm) {
  121436. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  121437. DYNAMIC_TYPE_ECC);
  121438. if (priv == NULL)
  121439. err = MEMORY_E;
  121440. }
  121441. #endif
  121442. if (err == MP_OKAY) {
  121443. p = pub + 1;
  121444. sp_521_from_mp(pub->x, 17, pX);
  121445. sp_521_from_mp(pub->y, 17, pY);
  121446. sp_521_from_bin(pub->z, 17, one, (int)sizeof(one));
  121447. if (privm)
  121448. sp_521_from_mp(priv, 17, privm);
  121449. /* Check point at infinitiy. */
  121450. if ((sp_521_iszero_17(pub->x) != 0) &&
  121451. (sp_521_iszero_17(pub->y) != 0)) {
  121452. err = ECC_INF_E;
  121453. }
  121454. }
  121455. /* Check range of X and Y */
  121456. if ((err == MP_OKAY) &&
  121457. ((sp_521_cmp_17(pub->x, p521_mod) >= 0) ||
  121458. (sp_521_cmp_17(pub->y, p521_mod) >= 0))) {
  121459. err = ECC_OUT_OF_RANGE_E;
  121460. }
  121461. if (err == MP_OKAY) {
  121462. /* Check point is on curve */
  121463. err = sp_521_ecc_is_point_17(pub, heap);
  121464. }
  121465. if (err == MP_OKAY) {
  121466. /* Point * order = infinity */
  121467. err = sp_521_ecc_mulmod_17(p, pub, p521_order, 1, 1, heap);
  121468. }
  121469. /* Check result is infinity */
  121470. if ((err == MP_OKAY) && ((sp_521_iszero_17(p->x) == 0) ||
  121471. (sp_521_iszero_17(p->y) == 0))) {
  121472. err = ECC_INF_E;
  121473. }
  121474. if (privm) {
  121475. if (err == MP_OKAY) {
  121476. /* Base * private = point */
  121477. err = sp_521_ecc_mulmod_base_17(p, priv, 1, 1, heap);
  121478. }
  121479. /* Check result is public key */
  121480. if ((err == MP_OKAY) &&
  121481. ((sp_521_cmp_17(p->x, pub->x) != 0) ||
  121482. (sp_521_cmp_17(p->y, pub->y) != 0))) {
  121483. err = ECC_PRIV_KEY_E;
  121484. }
  121485. }
  121486. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121487. if (pub != NULL)
  121488. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  121489. if (priv != NULL)
  121490. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  121491. #endif
  121492. return err;
  121493. }
  121494. #endif
  121495. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  121496. /* Add two projective EC points together.
  121497. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  121498. *
  121499. * pX First EC point's X ordinate.
  121500. * pY First EC point's Y ordinate.
  121501. * pZ First EC point's Z ordinate.
  121502. * qX Second EC point's X ordinate.
  121503. * qY Second EC point's Y ordinate.
  121504. * qZ Second EC point's Z ordinate.
  121505. * rX Resultant EC point's X ordinate.
  121506. * rY Resultant EC point's Y ordinate.
  121507. * rZ Resultant EC point's Z ordinate.
  121508. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  121509. */
  121510. int sp_ecc_proj_add_point_521(mp_int* pX, mp_int* pY, mp_int* pZ,
  121511. mp_int* qX, mp_int* qY, mp_int* qZ,
  121512. mp_int* rX, mp_int* rY, mp_int* rZ)
  121513. {
  121514. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121515. sp_digit* tmp = NULL;
  121516. sp_point_521* p = NULL;
  121517. #else
  121518. sp_digit tmp[2 * 17 * 6];
  121519. sp_point_521 p[2];
  121520. #endif
  121521. sp_point_521* q = NULL;
  121522. int err = MP_OKAY;
  121523. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121524. if (err == MP_OKAY) {
  121525. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, NULL,
  121526. DYNAMIC_TYPE_ECC);
  121527. if (p == NULL)
  121528. err = MEMORY_E;
  121529. }
  121530. if (err == MP_OKAY) {
  121531. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, NULL,
  121532. DYNAMIC_TYPE_ECC);
  121533. if (tmp == NULL) {
  121534. err = MEMORY_E;
  121535. }
  121536. }
  121537. #endif
  121538. if (err == MP_OKAY) {
  121539. q = p + 1;
  121540. sp_521_from_mp(p->x, 17, pX);
  121541. sp_521_from_mp(p->y, 17, pY);
  121542. sp_521_from_mp(p->z, 17, pZ);
  121543. sp_521_from_mp(q->x, 17, qX);
  121544. sp_521_from_mp(q->y, 17, qY);
  121545. sp_521_from_mp(q->z, 17, qZ);
  121546. p->infinity = sp_521_iszero_17(p->x) &
  121547. sp_521_iszero_17(p->y);
  121548. q->infinity = sp_521_iszero_17(q->x) &
  121549. sp_521_iszero_17(q->y);
  121550. sp_521_proj_point_add_17(p, p, q, tmp);
  121551. }
  121552. if (err == MP_OKAY) {
  121553. err = sp_521_to_mp(p->x, rX);
  121554. }
  121555. if (err == MP_OKAY) {
  121556. err = sp_521_to_mp(p->y, rY);
  121557. }
  121558. if (err == MP_OKAY) {
  121559. err = sp_521_to_mp(p->z, rZ);
  121560. }
  121561. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121562. if (tmp != NULL)
  121563. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  121564. if (p != NULL)
  121565. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  121566. #endif
  121567. return err;
  121568. }
  121569. /* Double a projective EC point.
  121570. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  121571. *
  121572. * pX EC point's X ordinate.
  121573. * pY EC point's Y ordinate.
  121574. * pZ EC point's Z ordinate.
  121575. * rX Resultant EC point's X ordinate.
  121576. * rY Resultant EC point's Y ordinate.
  121577. * rZ Resultant EC point's Z ordinate.
  121578. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  121579. */
  121580. int sp_ecc_proj_dbl_point_521(mp_int* pX, mp_int* pY, mp_int* pZ,
  121581. mp_int* rX, mp_int* rY, mp_int* rZ)
  121582. {
  121583. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121584. sp_digit* tmp = NULL;
  121585. sp_point_521* p = NULL;
  121586. #else
  121587. sp_digit tmp[2 * 17 * 2];
  121588. sp_point_521 p[1];
  121589. #endif
  121590. int err = MP_OKAY;
  121591. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121592. if (err == MP_OKAY) {
  121593. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  121594. DYNAMIC_TYPE_ECC);
  121595. if (p == NULL)
  121596. err = MEMORY_E;
  121597. }
  121598. if (err == MP_OKAY) {
  121599. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 2, NULL,
  121600. DYNAMIC_TYPE_ECC);
  121601. if (tmp == NULL)
  121602. err = MEMORY_E;
  121603. }
  121604. #endif
  121605. if (err == MP_OKAY) {
  121606. sp_521_from_mp(p->x, 17, pX);
  121607. sp_521_from_mp(p->y, 17, pY);
  121608. sp_521_from_mp(p->z, 17, pZ);
  121609. p->infinity = sp_521_iszero_17(p->x) &
  121610. sp_521_iszero_17(p->y);
  121611. sp_521_proj_point_dbl_17(p, p, tmp);
  121612. }
  121613. if (err == MP_OKAY) {
  121614. err = sp_521_to_mp(p->x, rX);
  121615. }
  121616. if (err == MP_OKAY) {
  121617. err = sp_521_to_mp(p->y, rY);
  121618. }
  121619. if (err == MP_OKAY) {
  121620. err = sp_521_to_mp(p->z, rZ);
  121621. }
  121622. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121623. if (tmp != NULL)
  121624. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  121625. if (p != NULL)
  121626. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  121627. #endif
  121628. return err;
  121629. }
  121630. /* Map a projective EC point to affine in place.
  121631. * pZ will be one.
  121632. *
  121633. * pX EC point's X ordinate.
  121634. * pY EC point's Y ordinate.
  121635. * pZ EC point's Z ordinate.
  121636. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  121637. */
  121638. int sp_ecc_map_521(mp_int* pX, mp_int* pY, mp_int* pZ)
  121639. {
  121640. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121641. sp_digit* tmp = NULL;
  121642. sp_point_521* p = NULL;
  121643. #else
  121644. sp_digit tmp[2 * 17 * 5];
  121645. sp_point_521 p[1];
  121646. #endif
  121647. int err = MP_OKAY;
  121648. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121649. if (err == MP_OKAY) {
  121650. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  121651. DYNAMIC_TYPE_ECC);
  121652. if (p == NULL)
  121653. err = MEMORY_E;
  121654. }
  121655. if (err == MP_OKAY) {
  121656. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 5, NULL,
  121657. DYNAMIC_TYPE_ECC);
  121658. if (tmp == NULL)
  121659. err = MEMORY_E;
  121660. }
  121661. #endif
  121662. if (err == MP_OKAY) {
  121663. sp_521_from_mp(p->x, 17, pX);
  121664. sp_521_from_mp(p->y, 17, pY);
  121665. sp_521_from_mp(p->z, 17, pZ);
  121666. p->infinity = sp_521_iszero_17(p->x) &
  121667. sp_521_iszero_17(p->y);
  121668. sp_521_map_17(p, p, tmp);
  121669. }
  121670. if (err == MP_OKAY) {
  121671. err = sp_521_to_mp(p->x, pX);
  121672. }
  121673. if (err == MP_OKAY) {
  121674. err = sp_521_to_mp(p->y, pY);
  121675. }
  121676. if (err == MP_OKAY) {
  121677. err = sp_521_to_mp(p->z, pZ);
  121678. }
  121679. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121680. if (tmp != NULL)
  121681. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  121682. if (p != NULL)
  121683. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  121684. #endif
  121685. return err;
  121686. }
  121687. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  121688. #ifdef HAVE_COMP_KEY
  121689. /* Square root power for the P521 curve. */
  121690. static const uint32_t p521_sqrt_power[17] = {
  121691. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  121692. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  121693. 0x00000000,0x00000000,0x00000080
  121694. };
  121695. /* Find the square root of a number mod the prime of the curve.
  121696. *
  121697. * y The number to operate on and the result.
  121698. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  121699. */
  121700. static int sp_521_mont_sqrt_17(sp_digit* y)
  121701. {
  121702. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121703. sp_digit* t = NULL;
  121704. #else
  121705. sp_digit t[2 * 17];
  121706. #endif
  121707. int err = MP_OKAY;
  121708. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121709. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17, NULL, DYNAMIC_TYPE_ECC);
  121710. if (t == NULL)
  121711. err = MEMORY_E;
  121712. #endif
  121713. if (err == MP_OKAY) {
  121714. {
  121715. int i;
  121716. XMEMCPY(t, y, sizeof(sp_digit) * 17);
  121717. for (i=518; i>=0; i--) {
  121718. sp_521_mont_sqr_17(t, t, p521_mod, p521_mp_mod);
  121719. if (p521_sqrt_power[i / 32] & ((sp_digit)1 << (i % 32)))
  121720. sp_521_mont_mul_17(t, t, y, p521_mod, p521_mp_mod);
  121721. }
  121722. XMEMCPY(y, t, sizeof(sp_digit) * 17);
  121723. }
  121724. }
  121725. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121726. if (t != NULL)
  121727. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  121728. #endif
  121729. return err;
  121730. }
  121731. /* Uncompress the point given the X ordinate.
  121732. *
  121733. * xm X ordinate.
  121734. * odd Whether the Y ordinate is odd.
  121735. * ym Calculated Y ordinate.
  121736. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  121737. */
  121738. int sp_ecc_uncompress_521(mp_int* xm, int odd, mp_int* ym)
  121739. {
  121740. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121741. sp_digit* x = NULL;
  121742. #else
  121743. sp_digit x[4 * 17];
  121744. #endif
  121745. sp_digit* y = NULL;
  121746. int err = MP_OKAY;
  121747. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121748. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 17, NULL, DYNAMIC_TYPE_ECC);
  121749. if (x == NULL)
  121750. err = MEMORY_E;
  121751. #endif
  121752. if (err == MP_OKAY) {
  121753. y = x + 2 * 17;
  121754. sp_521_from_mp(x, 17, xm);
  121755. err = sp_521_mod_mul_norm_17(x, x, p521_mod);
  121756. }
  121757. if (err == MP_OKAY) {
  121758. /* y = x^3 */
  121759. {
  121760. sp_521_mont_sqr_17(y, x, p521_mod, p521_mp_mod);
  121761. sp_521_mont_mul_17(y, y, x, p521_mod, p521_mp_mod);
  121762. }
  121763. /* y = x^3 - 3x */
  121764. sp_521_mont_sub_17(y, y, x, p521_mod);
  121765. sp_521_mont_sub_17(y, y, x, p521_mod);
  121766. sp_521_mont_sub_17(y, y, x, p521_mod);
  121767. /* y = x^3 - 3x + b */
  121768. err = sp_521_mod_mul_norm_17(x, p521_b, p521_mod);
  121769. }
  121770. if (err == MP_OKAY) {
  121771. sp_521_mont_add_17(y, y, x, p521_mod);
  121772. /* y = sqrt(x^3 - 3x + b) */
  121773. err = sp_521_mont_sqrt_17(y);
  121774. }
  121775. if (err == MP_OKAY) {
  121776. XMEMSET(y + 17, 0, 17U * sizeof(sp_digit));
  121777. sp_521_mont_reduce_17(y, p521_mod, p521_mp_mod);
  121778. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  121779. sp_521_mont_sub_17(y, p521_mod, y, p521_mod);
  121780. }
  121781. err = sp_521_to_mp(y, ym);
  121782. }
  121783. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  121784. if (x != NULL)
  121785. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  121786. #endif
  121787. return err;
  121788. }
  121789. #endif
  121790. #endif /* WOLFSSL_SP_521 */
  121791. #ifdef WOLFCRYPT_HAVE_SAKKE
  121792. #ifdef WOLFSSL_SP_1024
  121793. /* Point structure to use. */
  121794. typedef struct sp_point_1024 {
  121795. /* X ordinate of point. */
  121796. sp_digit x[2 * 32];
  121797. /* Y ordinate of point. */
  121798. sp_digit y[2 * 32];
  121799. /* Z ordinate of point. */
  121800. sp_digit z[2 * 32];
  121801. /* Indicates point is at infinity. */
  121802. int infinity;
  121803. } sp_point_1024;
  121804. #ifndef WOLFSSL_SP_SMALL
  121805. /* Multiply a and b into r. (r = a * b)
  121806. *
  121807. * r A single precision integer.
  121808. * a A single precision integer.
  121809. * b A single precision integer.
  121810. */
  121811. static void sp_1024_mul_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  121812. {
  121813. register sp_digit* r asm ("r0") = r_p;
  121814. register const sp_digit* a asm ("r1") = a_p;
  121815. register const sp_digit* b asm ("r2") = b_p;
  121816. __asm__ __volatile__ (
  121817. "sub sp, sp, #0x40\n\t"
  121818. "mov r10, #0\n\t"
  121819. /* A[0] * B[0] */
  121820. "ldr r11, [%[a]]\n\t"
  121821. "ldr r12, [%[b]]\n\t"
  121822. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  121823. "lsl r6, r11, #16\n\t"
  121824. "lsl r3, r12, #16\n\t"
  121825. "lsr r6, r6, #16\n\t"
  121826. "lsr r3, r3, #16\n\t"
  121827. "mul r3, r6, r3\n\t"
  121828. "lsr r7, r12, #16\n\t"
  121829. "mul r6, r7, r6\n\t"
  121830. "lsr r4, r6, #16\n\t"
  121831. "lsl r6, r6, #16\n\t"
  121832. "adds r3, r3, r6\n\t"
  121833. "adc r4, r4, #0\n\t"
  121834. "lsr r6, r11, #16\n\t"
  121835. "mul r7, r6, r7\n\t"
  121836. "add r4, r4, r7\n\t"
  121837. "lsl r7, r12, #16\n\t"
  121838. "lsr r7, r7, #16\n\t"
  121839. "mul r6, r7, r6\n\t"
  121840. "lsr r7, r6, #16\n\t"
  121841. "lsl r6, r6, #16\n\t"
  121842. "adds r3, r3, r6\n\t"
  121843. "adc r4, r4, r7\n\t"
  121844. "mov r5, #0\n\t"
  121845. #else
  121846. "umull r3, r4, r11, r12\n\t"
  121847. "mov r5, #0\n\t"
  121848. #endif
  121849. "str r3, [sp]\n\t"
  121850. /* A[0] * B[1] */
  121851. "ldr r9, [%[b], #4]\n\t"
  121852. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  121853. "lsl r6, r11, #16\n\t"
  121854. "lsl r7, r9, #16\n\t"
  121855. "lsr r6, r6, #16\n\t"
  121856. "lsr r7, r7, #16\n\t"
  121857. "mul r7, r6, r7\n\t"
  121858. "adds r4, r4, r7\n\t"
  121859. "adcs r5, r5, #0\n\t"
  121860. "mov r3, #0\n\t"
  121861. "adc r3, r3, #0\n\t"
  121862. "lsr r7, r9, #16\n\t"
  121863. "mul r6, r7, r6\n\t"
  121864. "lsr r7, r6, #16\n\t"
  121865. "lsl r6, r6, #16\n\t"
  121866. "adds r4, r4, r6\n\t"
  121867. "adcs r5, r5, r7\n\t"
  121868. "adc r3, r3, #0\n\t"
  121869. "lsr r6, r11, #16\n\t"
  121870. "lsr r7, r9, #16\n\t"
  121871. "mul r7, r6, r7\n\t"
  121872. "adds r5, r5, r7\n\t"
  121873. "adc r3, r3, #0\n\t"
  121874. "lsl r7, r9, #16\n\t"
  121875. "lsr r7, r7, #16\n\t"
  121876. "mul r6, r7, r6\n\t"
  121877. "lsr r7, r6, #16\n\t"
  121878. "lsl r6, r6, #16\n\t"
  121879. "adds r4, r4, r6\n\t"
  121880. "adcs r5, r5, r7\n\t"
  121881. "adc r3, r3, #0\n\t"
  121882. #else
  121883. "umull r6, r7, r11, r9\n\t"
  121884. "adds r4, r4, r6\n\t"
  121885. "adcs r5, r5, r7\n\t"
  121886. "mov r3, #0\n\t"
  121887. "adc r3, r3, #0\n\t"
  121888. #endif
  121889. /* A[1] * B[0] */
  121890. "ldr r8, [%[a], #4]\n\t"
  121891. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  121892. "lsl r6, r8, #16\n\t"
  121893. "lsl r7, r12, #16\n\t"
  121894. "lsr r6, r6, #16\n\t"
  121895. "lsr r7, r7, #16\n\t"
  121896. "mul r7, r6, r7\n\t"
  121897. "adds r4, r4, r7\n\t"
  121898. "adcs r5, r5, #0\n\t"
  121899. "adc r3, r3, #0\n\t"
  121900. "lsr r7, r12, #16\n\t"
  121901. "mul r6, r7, r6\n\t"
  121902. "lsr r7, r6, #16\n\t"
  121903. "lsl r6, r6, #16\n\t"
  121904. "adds r4, r4, r6\n\t"
  121905. "adcs r5, r5, r7\n\t"
  121906. "adc r3, r3, #0\n\t"
  121907. "lsr r6, r8, #16\n\t"
  121908. "lsr r7, r12, #16\n\t"
  121909. "mul r7, r6, r7\n\t"
  121910. "adds r5, r5, r7\n\t"
  121911. "adc r3, r3, #0\n\t"
  121912. "lsl r7, r12, #16\n\t"
  121913. "lsr r7, r7, #16\n\t"
  121914. "mul r6, r7, r6\n\t"
  121915. "lsr r7, r6, #16\n\t"
  121916. "lsl r6, r6, #16\n\t"
  121917. "adds r4, r4, r6\n\t"
  121918. "adcs r5, r5, r7\n\t"
  121919. "adc r3, r3, #0\n\t"
  121920. #else
  121921. "umull r6, r7, r8, r12\n\t"
  121922. "adds r4, r4, r6\n\t"
  121923. "adcs r5, r5, r7\n\t"
  121924. "adc r3, r3, #0\n\t"
  121925. #endif
  121926. "str r4, [sp, #4]\n\t"
  121927. /* A[2] * B[0] */
  121928. "ldr r8, [%[a], #8]\n\t"
  121929. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  121930. "lsl r6, r8, #16\n\t"
  121931. "lsl r7, r12, #16\n\t"
  121932. "lsr r6, r6, #16\n\t"
  121933. "lsr r7, r7, #16\n\t"
  121934. "mul r7, r6, r7\n\t"
  121935. "adds r5, r5, r7\n\t"
  121936. "adcs r3, r3, #0\n\t"
  121937. "mov r4, #0\n\t"
  121938. "adc r4, r4, #0\n\t"
  121939. "lsr r7, r12, #16\n\t"
  121940. "mul r6, r7, r6\n\t"
  121941. "lsr r7, r6, #16\n\t"
  121942. "lsl r6, r6, #16\n\t"
  121943. "adds r5, r5, r6\n\t"
  121944. "adcs r3, r3, r7\n\t"
  121945. "adc r4, r4, #0\n\t"
  121946. "lsr r6, r8, #16\n\t"
  121947. "lsr r7, r12, #16\n\t"
  121948. "mul r7, r6, r7\n\t"
  121949. "adds r3, r3, r7\n\t"
  121950. "adc r4, r4, #0\n\t"
  121951. "lsl r7, r12, #16\n\t"
  121952. "lsr r7, r7, #16\n\t"
  121953. "mul r6, r7, r6\n\t"
  121954. "lsr r7, r6, #16\n\t"
  121955. "lsl r6, r6, #16\n\t"
  121956. "adds r5, r5, r6\n\t"
  121957. "adcs r3, r3, r7\n\t"
  121958. "adc r4, r4, #0\n\t"
  121959. #else
  121960. "umull r6, r7, r8, r12\n\t"
  121961. "adds r5, r5, r6\n\t"
  121962. "adcs r3, r3, r7\n\t"
  121963. "mov r4, #0\n\t"
  121964. "adc r4, r4, #0\n\t"
  121965. #endif
  121966. /* A[1] * B[1] */
  121967. "ldr r11, [%[a], #4]\n\t"
  121968. "ldr r12, [%[b], #4]\n\t"
  121969. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  121970. "lsl r6, r11, #16\n\t"
  121971. "lsl r7, r12, #16\n\t"
  121972. "lsr r6, r6, #16\n\t"
  121973. "lsr r7, r7, #16\n\t"
  121974. "mul r7, r6, r7\n\t"
  121975. "adds r5, r5, r7\n\t"
  121976. "adcs r3, r3, #0\n\t"
  121977. "adc r4, r4, #0\n\t"
  121978. "lsr r7, r12, #16\n\t"
  121979. "mul r6, r7, r6\n\t"
  121980. "lsr r7, r6, #16\n\t"
  121981. "lsl r6, r6, #16\n\t"
  121982. "adds r5, r5, r6\n\t"
  121983. "adcs r3, r3, r7\n\t"
  121984. "adc r4, r4, #0\n\t"
  121985. "lsr r6, r11, #16\n\t"
  121986. "lsr r7, r12, #16\n\t"
  121987. "mul r7, r6, r7\n\t"
  121988. "adds r3, r3, r7\n\t"
  121989. "adc r4, r4, #0\n\t"
  121990. "lsl r7, r12, #16\n\t"
  121991. "lsr r7, r7, #16\n\t"
  121992. "mul r6, r7, r6\n\t"
  121993. "lsr r7, r6, #16\n\t"
  121994. "lsl r6, r6, #16\n\t"
  121995. "adds r5, r5, r6\n\t"
  121996. "adcs r3, r3, r7\n\t"
  121997. "adc r4, r4, #0\n\t"
  121998. #else
  121999. "umull r6, r7, r11, r12\n\t"
  122000. "adds r5, r5, r6\n\t"
  122001. "adcs r3, r3, r7\n\t"
  122002. "adc r4, r4, #0\n\t"
  122003. #endif
  122004. /* A[0] * B[2] */
  122005. "ldr r8, [%[a]]\n\t"
  122006. "ldr r9, [%[b], #8]\n\t"
  122007. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122008. "lsl r6, r8, #16\n\t"
  122009. "lsl r7, r9, #16\n\t"
  122010. "lsr r6, r6, #16\n\t"
  122011. "lsr r7, r7, #16\n\t"
  122012. "mul r7, r6, r7\n\t"
  122013. "adds r5, r5, r7\n\t"
  122014. "adcs r3, r3, #0\n\t"
  122015. "adc r4, r4, #0\n\t"
  122016. "lsr r7, r9, #16\n\t"
  122017. "mul r6, r7, r6\n\t"
  122018. "lsr r7, r6, #16\n\t"
  122019. "lsl r6, r6, #16\n\t"
  122020. "adds r5, r5, r6\n\t"
  122021. "adcs r3, r3, r7\n\t"
  122022. "adc r4, r4, #0\n\t"
  122023. "lsr r6, r8, #16\n\t"
  122024. "lsr r7, r9, #16\n\t"
  122025. "mul r7, r6, r7\n\t"
  122026. "adds r3, r3, r7\n\t"
  122027. "adc r4, r4, #0\n\t"
  122028. "lsl r7, r9, #16\n\t"
  122029. "lsr r7, r7, #16\n\t"
  122030. "mul r6, r7, r6\n\t"
  122031. "lsr r7, r6, #16\n\t"
  122032. "lsl r6, r6, #16\n\t"
  122033. "adds r5, r5, r6\n\t"
  122034. "adcs r3, r3, r7\n\t"
  122035. "adc r4, r4, #0\n\t"
  122036. #else
  122037. "umull r6, r7, r8, r9\n\t"
  122038. "adds r5, r5, r6\n\t"
  122039. "adcs r3, r3, r7\n\t"
  122040. "adc r4, r4, #0\n\t"
  122041. #endif
  122042. "str r5, [sp, #8]\n\t"
  122043. /* A[0] * B[3] */
  122044. "ldr r9, [%[b], #12]\n\t"
  122045. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122046. "lsl r6, r8, #16\n\t"
  122047. "lsl r7, r9, #16\n\t"
  122048. "lsr r6, r6, #16\n\t"
  122049. "lsr r7, r7, #16\n\t"
  122050. "mul r7, r6, r7\n\t"
  122051. "adds r3, r3, r7\n\t"
  122052. "adcs r4, r4, #0\n\t"
  122053. "mov r5, #0\n\t"
  122054. "adc r5, r5, #0\n\t"
  122055. "lsr r7, r9, #16\n\t"
  122056. "mul r6, r7, r6\n\t"
  122057. "lsr r7, r6, #16\n\t"
  122058. "lsl r6, r6, #16\n\t"
  122059. "adds r3, r3, r6\n\t"
  122060. "adcs r4, r4, r7\n\t"
  122061. "adc r5, r5, #0\n\t"
  122062. "lsr r6, r8, #16\n\t"
  122063. "lsr r7, r9, #16\n\t"
  122064. "mul r7, r6, r7\n\t"
  122065. "adds r4, r4, r7\n\t"
  122066. "adc r5, r5, #0\n\t"
  122067. "lsl r7, r9, #16\n\t"
  122068. "lsr r7, r7, #16\n\t"
  122069. "mul r6, r7, r6\n\t"
  122070. "lsr r7, r6, #16\n\t"
  122071. "lsl r6, r6, #16\n\t"
  122072. "adds r3, r3, r6\n\t"
  122073. "adcs r4, r4, r7\n\t"
  122074. "adc r5, r5, #0\n\t"
  122075. #else
  122076. "umull r6, r7, r8, r9\n\t"
  122077. "adds r3, r3, r6\n\t"
  122078. "adcs r4, r4, r7\n\t"
  122079. "mov r5, #0\n\t"
  122080. "adc r5, r5, #0\n\t"
  122081. #endif
  122082. /* A[1] * B[2] */
  122083. "ldr r9, [%[b], #8]\n\t"
  122084. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122085. "lsl r6, r11, #16\n\t"
  122086. "lsl r7, r9, #16\n\t"
  122087. "lsr r6, r6, #16\n\t"
  122088. "lsr r7, r7, #16\n\t"
  122089. "mul r7, r6, r7\n\t"
  122090. "adds r3, r3, r7\n\t"
  122091. "adcs r4, r4, #0\n\t"
  122092. "adc r5, r5, #0\n\t"
  122093. "lsr r7, r9, #16\n\t"
  122094. "mul r6, r7, r6\n\t"
  122095. "lsr r7, r6, #16\n\t"
  122096. "lsl r6, r6, #16\n\t"
  122097. "adds r3, r3, r6\n\t"
  122098. "adcs r4, r4, r7\n\t"
  122099. "adc r5, r5, #0\n\t"
  122100. "lsr r6, r11, #16\n\t"
  122101. "lsr r7, r9, #16\n\t"
  122102. "mul r7, r6, r7\n\t"
  122103. "adds r4, r4, r7\n\t"
  122104. "adc r5, r5, #0\n\t"
  122105. "lsl r7, r9, #16\n\t"
  122106. "lsr r7, r7, #16\n\t"
  122107. "mul r6, r7, r6\n\t"
  122108. "lsr r7, r6, #16\n\t"
  122109. "lsl r6, r6, #16\n\t"
  122110. "adds r3, r3, r6\n\t"
  122111. "adcs r4, r4, r7\n\t"
  122112. "adc r5, r5, #0\n\t"
  122113. #else
  122114. "umull r6, r7, r11, r9\n\t"
  122115. "adds r3, r3, r6\n\t"
  122116. "adcs r4, r4, r7\n\t"
  122117. "adc r5, r5, #0\n\t"
  122118. #endif
  122119. /* A[2] * B[1] */
  122120. "ldr r8, [%[a], #8]\n\t"
  122121. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122122. "lsl r6, r8, #16\n\t"
  122123. "lsl r7, r12, #16\n\t"
  122124. "lsr r6, r6, #16\n\t"
  122125. "lsr r7, r7, #16\n\t"
  122126. "mul r7, r6, r7\n\t"
  122127. "adds r3, r3, r7\n\t"
  122128. "adcs r4, r4, #0\n\t"
  122129. "adc r5, r5, #0\n\t"
  122130. "lsr r7, r12, #16\n\t"
  122131. "mul r6, r7, r6\n\t"
  122132. "lsr r7, r6, #16\n\t"
  122133. "lsl r6, r6, #16\n\t"
  122134. "adds r3, r3, r6\n\t"
  122135. "adcs r4, r4, r7\n\t"
  122136. "adc r5, r5, #0\n\t"
  122137. "lsr r6, r8, #16\n\t"
  122138. "lsr r7, r12, #16\n\t"
  122139. "mul r7, r6, r7\n\t"
  122140. "adds r4, r4, r7\n\t"
  122141. "adc r5, r5, #0\n\t"
  122142. "lsl r7, r12, #16\n\t"
  122143. "lsr r7, r7, #16\n\t"
  122144. "mul r6, r7, r6\n\t"
  122145. "lsr r7, r6, #16\n\t"
  122146. "lsl r6, r6, #16\n\t"
  122147. "adds r3, r3, r6\n\t"
  122148. "adcs r4, r4, r7\n\t"
  122149. "adc r5, r5, #0\n\t"
  122150. #else
  122151. "umull r6, r7, r8, r12\n\t"
  122152. "adds r3, r3, r6\n\t"
  122153. "adcs r4, r4, r7\n\t"
  122154. "adc r5, r5, #0\n\t"
  122155. #endif
  122156. /* A[3] * B[0] */
  122157. "ldr r8, [%[a], #12]\n\t"
  122158. "ldr r9, [%[b]]\n\t"
  122159. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122160. "lsl r6, r8, #16\n\t"
  122161. "lsl r7, r9, #16\n\t"
  122162. "lsr r6, r6, #16\n\t"
  122163. "lsr r7, r7, #16\n\t"
  122164. "mul r7, r6, r7\n\t"
  122165. "adds r3, r3, r7\n\t"
  122166. "adcs r4, r4, #0\n\t"
  122167. "adc r5, r5, #0\n\t"
  122168. "lsr r7, r9, #16\n\t"
  122169. "mul r6, r7, r6\n\t"
  122170. "lsr r7, r6, #16\n\t"
  122171. "lsl r6, r6, #16\n\t"
  122172. "adds r3, r3, r6\n\t"
  122173. "adcs r4, r4, r7\n\t"
  122174. "adc r5, r5, #0\n\t"
  122175. "lsr r6, r8, #16\n\t"
  122176. "lsr r7, r9, #16\n\t"
  122177. "mul r7, r6, r7\n\t"
  122178. "adds r4, r4, r7\n\t"
  122179. "adc r5, r5, #0\n\t"
  122180. "lsl r7, r9, #16\n\t"
  122181. "lsr r7, r7, #16\n\t"
  122182. "mul r6, r7, r6\n\t"
  122183. "lsr r7, r6, #16\n\t"
  122184. "lsl r6, r6, #16\n\t"
  122185. "adds r3, r3, r6\n\t"
  122186. "adcs r4, r4, r7\n\t"
  122187. "adc r5, r5, #0\n\t"
  122188. #else
  122189. "umull r6, r7, r8, r9\n\t"
  122190. "adds r3, r3, r6\n\t"
  122191. "adcs r4, r4, r7\n\t"
  122192. "adc r5, r5, #0\n\t"
  122193. #endif
  122194. "str r3, [sp, #12]\n\t"
  122195. /* A[4] * B[0] */
  122196. "ldr r8, [%[a], #16]\n\t"
  122197. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122198. "lsl r6, r8, #16\n\t"
  122199. "lsl r7, r9, #16\n\t"
  122200. "lsr r6, r6, #16\n\t"
  122201. "lsr r7, r7, #16\n\t"
  122202. "mul r7, r6, r7\n\t"
  122203. "adds r4, r4, r7\n\t"
  122204. "adcs r5, r5, #0\n\t"
  122205. "mov r3, #0\n\t"
  122206. "adc r3, r3, #0\n\t"
  122207. "lsr r7, r9, #16\n\t"
  122208. "mul r6, r7, r6\n\t"
  122209. "lsr r7, r6, #16\n\t"
  122210. "lsl r6, r6, #16\n\t"
  122211. "adds r4, r4, r6\n\t"
  122212. "adcs r5, r5, r7\n\t"
  122213. "adc r3, r3, #0\n\t"
  122214. "lsr r6, r8, #16\n\t"
  122215. "lsr r7, r9, #16\n\t"
  122216. "mul r7, r6, r7\n\t"
  122217. "adds r5, r5, r7\n\t"
  122218. "adc r3, r3, #0\n\t"
  122219. "lsl r7, r9, #16\n\t"
  122220. "lsr r7, r7, #16\n\t"
  122221. "mul r6, r7, r6\n\t"
  122222. "lsr r7, r6, #16\n\t"
  122223. "lsl r6, r6, #16\n\t"
  122224. "adds r4, r4, r6\n\t"
  122225. "adcs r5, r5, r7\n\t"
  122226. "adc r3, r3, #0\n\t"
  122227. #else
  122228. "umull r6, r7, r8, r9\n\t"
  122229. "adds r4, r4, r6\n\t"
  122230. "adcs r5, r5, r7\n\t"
  122231. "mov r3, #0\n\t"
  122232. "adc r3, r3, #0\n\t"
  122233. #endif
  122234. /* A[3] * B[1] */
  122235. "ldr r8, [%[a], #12]\n\t"
  122236. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122237. "lsl r6, r8, #16\n\t"
  122238. "lsl r7, r12, #16\n\t"
  122239. "lsr r6, r6, #16\n\t"
  122240. "lsr r7, r7, #16\n\t"
  122241. "mul r7, r6, r7\n\t"
  122242. "adds r4, r4, r7\n\t"
  122243. "adcs r5, r5, #0\n\t"
  122244. "adc r3, r3, #0\n\t"
  122245. "lsr r7, r12, #16\n\t"
  122246. "mul r6, r7, r6\n\t"
  122247. "lsr r7, r6, #16\n\t"
  122248. "lsl r6, r6, #16\n\t"
  122249. "adds r4, r4, r6\n\t"
  122250. "adcs r5, r5, r7\n\t"
  122251. "adc r3, r3, #0\n\t"
  122252. "lsr r6, r8, #16\n\t"
  122253. "lsr r7, r12, #16\n\t"
  122254. "mul r7, r6, r7\n\t"
  122255. "adds r5, r5, r7\n\t"
  122256. "adc r3, r3, #0\n\t"
  122257. "lsl r7, r12, #16\n\t"
  122258. "lsr r7, r7, #16\n\t"
  122259. "mul r6, r7, r6\n\t"
  122260. "lsr r7, r6, #16\n\t"
  122261. "lsl r6, r6, #16\n\t"
  122262. "adds r4, r4, r6\n\t"
  122263. "adcs r5, r5, r7\n\t"
  122264. "adc r3, r3, #0\n\t"
  122265. #else
  122266. "umull r6, r7, r8, r12\n\t"
  122267. "adds r4, r4, r6\n\t"
  122268. "adcs r5, r5, r7\n\t"
  122269. "adc r3, r3, #0\n\t"
  122270. #endif
  122271. /* A[2] * B[2] */
  122272. "ldr r11, [%[a], #8]\n\t"
  122273. "ldr r12, [%[b], #8]\n\t"
  122274. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122275. "lsl r6, r11, #16\n\t"
  122276. "lsl r7, r12, #16\n\t"
  122277. "lsr r6, r6, #16\n\t"
  122278. "lsr r7, r7, #16\n\t"
  122279. "mul r7, r6, r7\n\t"
  122280. "adds r4, r4, r7\n\t"
  122281. "adcs r5, r5, #0\n\t"
  122282. "adc r3, r3, #0\n\t"
  122283. "lsr r7, r12, #16\n\t"
  122284. "mul r6, r7, r6\n\t"
  122285. "lsr r7, r6, #16\n\t"
  122286. "lsl r6, r6, #16\n\t"
  122287. "adds r4, r4, r6\n\t"
  122288. "adcs r5, r5, r7\n\t"
  122289. "adc r3, r3, #0\n\t"
  122290. "lsr r6, r11, #16\n\t"
  122291. "lsr r7, r12, #16\n\t"
  122292. "mul r7, r6, r7\n\t"
  122293. "adds r5, r5, r7\n\t"
  122294. "adc r3, r3, #0\n\t"
  122295. "lsl r7, r12, #16\n\t"
  122296. "lsr r7, r7, #16\n\t"
  122297. "mul r6, r7, r6\n\t"
  122298. "lsr r7, r6, #16\n\t"
  122299. "lsl r6, r6, #16\n\t"
  122300. "adds r4, r4, r6\n\t"
  122301. "adcs r5, r5, r7\n\t"
  122302. "adc r3, r3, #0\n\t"
  122303. #else
  122304. "umull r6, r7, r11, r12\n\t"
  122305. "adds r4, r4, r6\n\t"
  122306. "adcs r5, r5, r7\n\t"
  122307. "adc r3, r3, #0\n\t"
  122308. #endif
  122309. /* A[1] * B[3] */
  122310. "ldr r8, [%[a], #4]\n\t"
  122311. "ldr r9, [%[b], #12]\n\t"
  122312. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122313. "lsl r6, r8, #16\n\t"
  122314. "lsl r7, r9, #16\n\t"
  122315. "lsr r6, r6, #16\n\t"
  122316. "lsr r7, r7, #16\n\t"
  122317. "mul r7, r6, r7\n\t"
  122318. "adds r4, r4, r7\n\t"
  122319. "adcs r5, r5, #0\n\t"
  122320. "adc r3, r3, #0\n\t"
  122321. "lsr r7, r9, #16\n\t"
  122322. "mul r6, r7, r6\n\t"
  122323. "lsr r7, r6, #16\n\t"
  122324. "lsl r6, r6, #16\n\t"
  122325. "adds r4, r4, r6\n\t"
  122326. "adcs r5, r5, r7\n\t"
  122327. "adc r3, r3, #0\n\t"
  122328. "lsr r6, r8, #16\n\t"
  122329. "lsr r7, r9, #16\n\t"
  122330. "mul r7, r6, r7\n\t"
  122331. "adds r5, r5, r7\n\t"
  122332. "adc r3, r3, #0\n\t"
  122333. "lsl r7, r9, #16\n\t"
  122334. "lsr r7, r7, #16\n\t"
  122335. "mul r6, r7, r6\n\t"
  122336. "lsr r7, r6, #16\n\t"
  122337. "lsl r6, r6, #16\n\t"
  122338. "adds r4, r4, r6\n\t"
  122339. "adcs r5, r5, r7\n\t"
  122340. "adc r3, r3, #0\n\t"
  122341. #else
  122342. "umull r6, r7, r8, r9\n\t"
  122343. "adds r4, r4, r6\n\t"
  122344. "adcs r5, r5, r7\n\t"
  122345. "adc r3, r3, #0\n\t"
  122346. #endif
  122347. /* A[0] * B[4] */
  122348. "ldr r8, [%[a]]\n\t"
  122349. "ldr r9, [%[b], #16]\n\t"
  122350. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122351. "lsl r6, r8, #16\n\t"
  122352. "lsl r7, r9, #16\n\t"
  122353. "lsr r6, r6, #16\n\t"
  122354. "lsr r7, r7, #16\n\t"
  122355. "mul r7, r6, r7\n\t"
  122356. "adds r4, r4, r7\n\t"
  122357. "adcs r5, r5, #0\n\t"
  122358. "adc r3, r3, #0\n\t"
  122359. "lsr r7, r9, #16\n\t"
  122360. "mul r6, r7, r6\n\t"
  122361. "lsr r7, r6, #16\n\t"
  122362. "lsl r6, r6, #16\n\t"
  122363. "adds r4, r4, r6\n\t"
  122364. "adcs r5, r5, r7\n\t"
  122365. "adc r3, r3, #0\n\t"
  122366. "lsr r6, r8, #16\n\t"
  122367. "lsr r7, r9, #16\n\t"
  122368. "mul r7, r6, r7\n\t"
  122369. "adds r5, r5, r7\n\t"
  122370. "adc r3, r3, #0\n\t"
  122371. "lsl r7, r9, #16\n\t"
  122372. "lsr r7, r7, #16\n\t"
  122373. "mul r6, r7, r6\n\t"
  122374. "lsr r7, r6, #16\n\t"
  122375. "lsl r6, r6, #16\n\t"
  122376. "adds r4, r4, r6\n\t"
  122377. "adcs r5, r5, r7\n\t"
  122378. "adc r3, r3, #0\n\t"
  122379. #else
  122380. "umull r6, r7, r8, r9\n\t"
  122381. "adds r4, r4, r6\n\t"
  122382. "adcs r5, r5, r7\n\t"
  122383. "adc r3, r3, #0\n\t"
  122384. #endif
  122385. "str r4, [sp, #16]\n\t"
  122386. /* A[0] * B[5] */
  122387. "ldr r9, [%[b], #20]\n\t"
  122388. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122389. "lsl r6, r8, #16\n\t"
  122390. "lsl r7, r9, #16\n\t"
  122391. "lsr r6, r6, #16\n\t"
  122392. "lsr r7, r7, #16\n\t"
  122393. "mul r7, r6, r7\n\t"
  122394. "adds r5, r5, r7\n\t"
  122395. "adcs r3, r3, #0\n\t"
  122396. "mov r4, #0\n\t"
  122397. "adc r4, r4, #0\n\t"
  122398. "lsr r7, r9, #16\n\t"
  122399. "mul r6, r7, r6\n\t"
  122400. "lsr r7, r6, #16\n\t"
  122401. "lsl r6, r6, #16\n\t"
  122402. "adds r5, r5, r6\n\t"
  122403. "adcs r3, r3, r7\n\t"
  122404. "adc r4, r4, #0\n\t"
  122405. "lsr r6, r8, #16\n\t"
  122406. "lsr r7, r9, #16\n\t"
  122407. "mul r7, r6, r7\n\t"
  122408. "adds r3, r3, r7\n\t"
  122409. "adc r4, r4, #0\n\t"
  122410. "lsl r7, r9, #16\n\t"
  122411. "lsr r7, r7, #16\n\t"
  122412. "mul r6, r7, r6\n\t"
  122413. "lsr r7, r6, #16\n\t"
  122414. "lsl r6, r6, #16\n\t"
  122415. "adds r5, r5, r6\n\t"
  122416. "adcs r3, r3, r7\n\t"
  122417. "adc r4, r4, #0\n\t"
  122418. #else
  122419. "umull r6, r7, r8, r9\n\t"
  122420. "adds r5, r5, r6\n\t"
  122421. "adcs r3, r3, r7\n\t"
  122422. "mov r4, #0\n\t"
  122423. "adc r4, r4, #0\n\t"
  122424. #endif
  122425. /* A[1] * B[4] */
  122426. "ldr r8, [%[a], #4]\n\t"
  122427. "ldr r9, [%[b], #16]\n\t"
  122428. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122429. "lsl r6, r8, #16\n\t"
  122430. "lsl r7, r9, #16\n\t"
  122431. "lsr r6, r6, #16\n\t"
  122432. "lsr r7, r7, #16\n\t"
  122433. "mul r7, r6, r7\n\t"
  122434. "adds r5, r5, r7\n\t"
  122435. "adcs r3, r3, #0\n\t"
  122436. "adc r4, r4, #0\n\t"
  122437. "lsr r7, r9, #16\n\t"
  122438. "mul r6, r7, r6\n\t"
  122439. "lsr r7, r6, #16\n\t"
  122440. "lsl r6, r6, #16\n\t"
  122441. "adds r5, r5, r6\n\t"
  122442. "adcs r3, r3, r7\n\t"
  122443. "adc r4, r4, #0\n\t"
  122444. "lsr r6, r8, #16\n\t"
  122445. "lsr r7, r9, #16\n\t"
  122446. "mul r7, r6, r7\n\t"
  122447. "adds r3, r3, r7\n\t"
  122448. "adc r4, r4, #0\n\t"
  122449. "lsl r7, r9, #16\n\t"
  122450. "lsr r7, r7, #16\n\t"
  122451. "mul r6, r7, r6\n\t"
  122452. "lsr r7, r6, #16\n\t"
  122453. "lsl r6, r6, #16\n\t"
  122454. "adds r5, r5, r6\n\t"
  122455. "adcs r3, r3, r7\n\t"
  122456. "adc r4, r4, #0\n\t"
  122457. #else
  122458. "umull r6, r7, r8, r9\n\t"
  122459. "adds r5, r5, r6\n\t"
  122460. "adcs r3, r3, r7\n\t"
  122461. "adc r4, r4, #0\n\t"
  122462. #endif
  122463. /* A[2] * B[3] */
  122464. "ldr r9, [%[b], #12]\n\t"
  122465. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122466. "lsl r6, r11, #16\n\t"
  122467. "lsl r7, r9, #16\n\t"
  122468. "lsr r6, r6, #16\n\t"
  122469. "lsr r7, r7, #16\n\t"
  122470. "mul r7, r6, r7\n\t"
  122471. "adds r5, r5, r7\n\t"
  122472. "adcs r3, r3, #0\n\t"
  122473. "adc r4, r4, #0\n\t"
  122474. "lsr r7, r9, #16\n\t"
  122475. "mul r6, r7, r6\n\t"
  122476. "lsr r7, r6, #16\n\t"
  122477. "lsl r6, r6, #16\n\t"
  122478. "adds r5, r5, r6\n\t"
  122479. "adcs r3, r3, r7\n\t"
  122480. "adc r4, r4, #0\n\t"
  122481. "lsr r6, r11, #16\n\t"
  122482. "lsr r7, r9, #16\n\t"
  122483. "mul r7, r6, r7\n\t"
  122484. "adds r3, r3, r7\n\t"
  122485. "adc r4, r4, #0\n\t"
  122486. "lsl r7, r9, #16\n\t"
  122487. "lsr r7, r7, #16\n\t"
  122488. "mul r6, r7, r6\n\t"
  122489. "lsr r7, r6, #16\n\t"
  122490. "lsl r6, r6, #16\n\t"
  122491. "adds r5, r5, r6\n\t"
  122492. "adcs r3, r3, r7\n\t"
  122493. "adc r4, r4, #0\n\t"
  122494. #else
  122495. "umull r6, r7, r11, r9\n\t"
  122496. "adds r5, r5, r6\n\t"
  122497. "adcs r3, r3, r7\n\t"
  122498. "adc r4, r4, #0\n\t"
  122499. #endif
  122500. /* A[3] * B[2] */
  122501. "ldr r8, [%[a], #12]\n\t"
  122502. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122503. "lsl r6, r8, #16\n\t"
  122504. "lsl r7, r12, #16\n\t"
  122505. "lsr r6, r6, #16\n\t"
  122506. "lsr r7, r7, #16\n\t"
  122507. "mul r7, r6, r7\n\t"
  122508. "adds r5, r5, r7\n\t"
  122509. "adcs r3, r3, #0\n\t"
  122510. "adc r4, r4, #0\n\t"
  122511. "lsr r7, r12, #16\n\t"
  122512. "mul r6, r7, r6\n\t"
  122513. "lsr r7, r6, #16\n\t"
  122514. "lsl r6, r6, #16\n\t"
  122515. "adds r5, r5, r6\n\t"
  122516. "adcs r3, r3, r7\n\t"
  122517. "adc r4, r4, #0\n\t"
  122518. "lsr r6, r8, #16\n\t"
  122519. "lsr r7, r12, #16\n\t"
  122520. "mul r7, r6, r7\n\t"
  122521. "adds r3, r3, r7\n\t"
  122522. "adc r4, r4, #0\n\t"
  122523. "lsl r7, r12, #16\n\t"
  122524. "lsr r7, r7, #16\n\t"
  122525. "mul r6, r7, r6\n\t"
  122526. "lsr r7, r6, #16\n\t"
  122527. "lsl r6, r6, #16\n\t"
  122528. "adds r5, r5, r6\n\t"
  122529. "adcs r3, r3, r7\n\t"
  122530. "adc r4, r4, #0\n\t"
  122531. #else
  122532. "umull r6, r7, r8, r12\n\t"
  122533. "adds r5, r5, r6\n\t"
  122534. "adcs r3, r3, r7\n\t"
  122535. "adc r4, r4, #0\n\t"
  122536. #endif
  122537. /* A[4] * B[1] */
  122538. "ldr r8, [%[a], #16]\n\t"
  122539. "ldr r9, [%[b], #4]\n\t"
  122540. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122541. "lsl r6, r8, #16\n\t"
  122542. "lsl r7, r9, #16\n\t"
  122543. "lsr r6, r6, #16\n\t"
  122544. "lsr r7, r7, #16\n\t"
  122545. "mul r7, r6, r7\n\t"
  122546. "adds r5, r5, r7\n\t"
  122547. "adcs r3, r3, #0\n\t"
  122548. "adc r4, r4, #0\n\t"
  122549. "lsr r7, r9, #16\n\t"
  122550. "mul r6, r7, r6\n\t"
  122551. "lsr r7, r6, #16\n\t"
  122552. "lsl r6, r6, #16\n\t"
  122553. "adds r5, r5, r6\n\t"
  122554. "adcs r3, r3, r7\n\t"
  122555. "adc r4, r4, #0\n\t"
  122556. "lsr r6, r8, #16\n\t"
  122557. "lsr r7, r9, #16\n\t"
  122558. "mul r7, r6, r7\n\t"
  122559. "adds r3, r3, r7\n\t"
  122560. "adc r4, r4, #0\n\t"
  122561. "lsl r7, r9, #16\n\t"
  122562. "lsr r7, r7, #16\n\t"
  122563. "mul r6, r7, r6\n\t"
  122564. "lsr r7, r6, #16\n\t"
  122565. "lsl r6, r6, #16\n\t"
  122566. "adds r5, r5, r6\n\t"
  122567. "adcs r3, r3, r7\n\t"
  122568. "adc r4, r4, #0\n\t"
  122569. #else
  122570. "umull r6, r7, r8, r9\n\t"
  122571. "adds r5, r5, r6\n\t"
  122572. "adcs r3, r3, r7\n\t"
  122573. "adc r4, r4, #0\n\t"
  122574. #endif
  122575. /* A[5] * B[0] */
  122576. "ldr r8, [%[a], #20]\n\t"
  122577. "ldr r9, [%[b]]\n\t"
  122578. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122579. "lsl r6, r8, #16\n\t"
  122580. "lsl r7, r9, #16\n\t"
  122581. "lsr r6, r6, #16\n\t"
  122582. "lsr r7, r7, #16\n\t"
  122583. "mul r7, r6, r7\n\t"
  122584. "adds r5, r5, r7\n\t"
  122585. "adcs r3, r3, #0\n\t"
  122586. "adc r4, r4, #0\n\t"
  122587. "lsr r7, r9, #16\n\t"
  122588. "mul r6, r7, r6\n\t"
  122589. "lsr r7, r6, #16\n\t"
  122590. "lsl r6, r6, #16\n\t"
  122591. "adds r5, r5, r6\n\t"
  122592. "adcs r3, r3, r7\n\t"
  122593. "adc r4, r4, #0\n\t"
  122594. "lsr r6, r8, #16\n\t"
  122595. "lsr r7, r9, #16\n\t"
  122596. "mul r7, r6, r7\n\t"
  122597. "adds r3, r3, r7\n\t"
  122598. "adc r4, r4, #0\n\t"
  122599. "lsl r7, r9, #16\n\t"
  122600. "lsr r7, r7, #16\n\t"
  122601. "mul r6, r7, r6\n\t"
  122602. "lsr r7, r6, #16\n\t"
  122603. "lsl r6, r6, #16\n\t"
  122604. "adds r5, r5, r6\n\t"
  122605. "adcs r3, r3, r7\n\t"
  122606. "adc r4, r4, #0\n\t"
  122607. #else
  122608. "umull r6, r7, r8, r9\n\t"
  122609. "adds r5, r5, r6\n\t"
  122610. "adcs r3, r3, r7\n\t"
  122611. "adc r4, r4, #0\n\t"
  122612. #endif
  122613. "str r5, [sp, #20]\n\t"
  122614. /* A[6] * B[0] */
  122615. "ldr r8, [%[a], #24]\n\t"
  122616. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122617. "lsl r6, r8, #16\n\t"
  122618. "lsl r7, r9, #16\n\t"
  122619. "lsr r6, r6, #16\n\t"
  122620. "lsr r7, r7, #16\n\t"
  122621. "mul r7, r6, r7\n\t"
  122622. "adds r3, r3, r7\n\t"
  122623. "adcs r4, r4, #0\n\t"
  122624. "mov r5, #0\n\t"
  122625. "adc r5, r5, #0\n\t"
  122626. "lsr r7, r9, #16\n\t"
  122627. "mul r6, r7, r6\n\t"
  122628. "lsr r7, r6, #16\n\t"
  122629. "lsl r6, r6, #16\n\t"
  122630. "adds r3, r3, r6\n\t"
  122631. "adcs r4, r4, r7\n\t"
  122632. "adc r5, r5, #0\n\t"
  122633. "lsr r6, r8, #16\n\t"
  122634. "lsr r7, r9, #16\n\t"
  122635. "mul r7, r6, r7\n\t"
  122636. "adds r4, r4, r7\n\t"
  122637. "adc r5, r5, #0\n\t"
  122638. "lsl r7, r9, #16\n\t"
  122639. "lsr r7, r7, #16\n\t"
  122640. "mul r6, r7, r6\n\t"
  122641. "lsr r7, r6, #16\n\t"
  122642. "lsl r6, r6, #16\n\t"
  122643. "adds r3, r3, r6\n\t"
  122644. "adcs r4, r4, r7\n\t"
  122645. "adc r5, r5, #0\n\t"
  122646. #else
  122647. "umull r6, r7, r8, r9\n\t"
  122648. "adds r3, r3, r6\n\t"
  122649. "adcs r4, r4, r7\n\t"
  122650. "mov r5, #0\n\t"
  122651. "adc r5, r5, #0\n\t"
  122652. #endif
  122653. /* A[5] * B[1] */
  122654. "ldr r8, [%[a], #20]\n\t"
  122655. "ldr r9, [%[b], #4]\n\t"
  122656. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122657. "lsl r6, r8, #16\n\t"
  122658. "lsl r7, r9, #16\n\t"
  122659. "lsr r6, r6, #16\n\t"
  122660. "lsr r7, r7, #16\n\t"
  122661. "mul r7, r6, r7\n\t"
  122662. "adds r3, r3, r7\n\t"
  122663. "adcs r4, r4, #0\n\t"
  122664. "adc r5, r5, #0\n\t"
  122665. "lsr r7, r9, #16\n\t"
  122666. "mul r6, r7, r6\n\t"
  122667. "lsr r7, r6, #16\n\t"
  122668. "lsl r6, r6, #16\n\t"
  122669. "adds r3, r3, r6\n\t"
  122670. "adcs r4, r4, r7\n\t"
  122671. "adc r5, r5, #0\n\t"
  122672. "lsr r6, r8, #16\n\t"
  122673. "lsr r7, r9, #16\n\t"
  122674. "mul r7, r6, r7\n\t"
  122675. "adds r4, r4, r7\n\t"
  122676. "adc r5, r5, #0\n\t"
  122677. "lsl r7, r9, #16\n\t"
  122678. "lsr r7, r7, #16\n\t"
  122679. "mul r6, r7, r6\n\t"
  122680. "lsr r7, r6, #16\n\t"
  122681. "lsl r6, r6, #16\n\t"
  122682. "adds r3, r3, r6\n\t"
  122683. "adcs r4, r4, r7\n\t"
  122684. "adc r5, r5, #0\n\t"
  122685. #else
  122686. "umull r6, r7, r8, r9\n\t"
  122687. "adds r3, r3, r6\n\t"
  122688. "adcs r4, r4, r7\n\t"
  122689. "adc r5, r5, #0\n\t"
  122690. #endif
  122691. /* A[4] * B[2] */
  122692. "ldr r8, [%[a], #16]\n\t"
  122693. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122694. "lsl r6, r8, #16\n\t"
  122695. "lsl r7, r12, #16\n\t"
  122696. "lsr r6, r6, #16\n\t"
  122697. "lsr r7, r7, #16\n\t"
  122698. "mul r7, r6, r7\n\t"
  122699. "adds r3, r3, r7\n\t"
  122700. "adcs r4, r4, #0\n\t"
  122701. "adc r5, r5, #0\n\t"
  122702. "lsr r7, r12, #16\n\t"
  122703. "mul r6, r7, r6\n\t"
  122704. "lsr r7, r6, #16\n\t"
  122705. "lsl r6, r6, #16\n\t"
  122706. "adds r3, r3, r6\n\t"
  122707. "adcs r4, r4, r7\n\t"
  122708. "adc r5, r5, #0\n\t"
  122709. "lsr r6, r8, #16\n\t"
  122710. "lsr r7, r12, #16\n\t"
  122711. "mul r7, r6, r7\n\t"
  122712. "adds r4, r4, r7\n\t"
  122713. "adc r5, r5, #0\n\t"
  122714. "lsl r7, r12, #16\n\t"
  122715. "lsr r7, r7, #16\n\t"
  122716. "mul r6, r7, r6\n\t"
  122717. "lsr r7, r6, #16\n\t"
  122718. "lsl r6, r6, #16\n\t"
  122719. "adds r3, r3, r6\n\t"
  122720. "adcs r4, r4, r7\n\t"
  122721. "adc r5, r5, #0\n\t"
  122722. #else
  122723. "umull r6, r7, r8, r12\n\t"
  122724. "adds r3, r3, r6\n\t"
  122725. "adcs r4, r4, r7\n\t"
  122726. "adc r5, r5, #0\n\t"
  122727. #endif
  122728. /* A[3] * B[3] */
  122729. "ldr r11, [%[a], #12]\n\t"
  122730. "ldr r12, [%[b], #12]\n\t"
  122731. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122732. "lsl r6, r11, #16\n\t"
  122733. "lsl r7, r12, #16\n\t"
  122734. "lsr r6, r6, #16\n\t"
  122735. "lsr r7, r7, #16\n\t"
  122736. "mul r7, r6, r7\n\t"
  122737. "adds r3, r3, r7\n\t"
  122738. "adcs r4, r4, #0\n\t"
  122739. "adc r5, r5, #0\n\t"
  122740. "lsr r7, r12, #16\n\t"
  122741. "mul r6, r7, r6\n\t"
  122742. "lsr r7, r6, #16\n\t"
  122743. "lsl r6, r6, #16\n\t"
  122744. "adds r3, r3, r6\n\t"
  122745. "adcs r4, r4, r7\n\t"
  122746. "adc r5, r5, #0\n\t"
  122747. "lsr r6, r11, #16\n\t"
  122748. "lsr r7, r12, #16\n\t"
  122749. "mul r7, r6, r7\n\t"
  122750. "adds r4, r4, r7\n\t"
  122751. "adc r5, r5, #0\n\t"
  122752. "lsl r7, r12, #16\n\t"
  122753. "lsr r7, r7, #16\n\t"
  122754. "mul r6, r7, r6\n\t"
  122755. "lsr r7, r6, #16\n\t"
  122756. "lsl r6, r6, #16\n\t"
  122757. "adds r3, r3, r6\n\t"
  122758. "adcs r4, r4, r7\n\t"
  122759. "adc r5, r5, #0\n\t"
  122760. #else
  122761. "umull r6, r7, r11, r12\n\t"
  122762. "adds r3, r3, r6\n\t"
  122763. "adcs r4, r4, r7\n\t"
  122764. "adc r5, r5, #0\n\t"
  122765. #endif
  122766. /* A[2] * B[4] */
  122767. "ldr r8, [%[a], #8]\n\t"
  122768. "ldr r9, [%[b], #16]\n\t"
  122769. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122770. "lsl r6, r8, #16\n\t"
  122771. "lsl r7, r9, #16\n\t"
  122772. "lsr r6, r6, #16\n\t"
  122773. "lsr r7, r7, #16\n\t"
  122774. "mul r7, r6, r7\n\t"
  122775. "adds r3, r3, r7\n\t"
  122776. "adcs r4, r4, #0\n\t"
  122777. "adc r5, r5, #0\n\t"
  122778. "lsr r7, r9, #16\n\t"
  122779. "mul r6, r7, r6\n\t"
  122780. "lsr r7, r6, #16\n\t"
  122781. "lsl r6, r6, #16\n\t"
  122782. "adds r3, r3, r6\n\t"
  122783. "adcs r4, r4, r7\n\t"
  122784. "adc r5, r5, #0\n\t"
  122785. "lsr r6, r8, #16\n\t"
  122786. "lsr r7, r9, #16\n\t"
  122787. "mul r7, r6, r7\n\t"
  122788. "adds r4, r4, r7\n\t"
  122789. "adc r5, r5, #0\n\t"
  122790. "lsl r7, r9, #16\n\t"
  122791. "lsr r7, r7, #16\n\t"
  122792. "mul r6, r7, r6\n\t"
  122793. "lsr r7, r6, #16\n\t"
  122794. "lsl r6, r6, #16\n\t"
  122795. "adds r3, r3, r6\n\t"
  122796. "adcs r4, r4, r7\n\t"
  122797. "adc r5, r5, #0\n\t"
  122798. #else
  122799. "umull r6, r7, r8, r9\n\t"
  122800. "adds r3, r3, r6\n\t"
  122801. "adcs r4, r4, r7\n\t"
  122802. "adc r5, r5, #0\n\t"
  122803. #endif
  122804. /* A[1] * B[5] */
  122805. "ldr r8, [%[a], #4]\n\t"
  122806. "ldr r9, [%[b], #20]\n\t"
  122807. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122808. "lsl r6, r8, #16\n\t"
  122809. "lsl r7, r9, #16\n\t"
  122810. "lsr r6, r6, #16\n\t"
  122811. "lsr r7, r7, #16\n\t"
  122812. "mul r7, r6, r7\n\t"
  122813. "adds r3, r3, r7\n\t"
  122814. "adcs r4, r4, #0\n\t"
  122815. "adc r5, r5, #0\n\t"
  122816. "lsr r7, r9, #16\n\t"
  122817. "mul r6, r7, r6\n\t"
  122818. "lsr r7, r6, #16\n\t"
  122819. "lsl r6, r6, #16\n\t"
  122820. "adds r3, r3, r6\n\t"
  122821. "adcs r4, r4, r7\n\t"
  122822. "adc r5, r5, #0\n\t"
  122823. "lsr r6, r8, #16\n\t"
  122824. "lsr r7, r9, #16\n\t"
  122825. "mul r7, r6, r7\n\t"
  122826. "adds r4, r4, r7\n\t"
  122827. "adc r5, r5, #0\n\t"
  122828. "lsl r7, r9, #16\n\t"
  122829. "lsr r7, r7, #16\n\t"
  122830. "mul r6, r7, r6\n\t"
  122831. "lsr r7, r6, #16\n\t"
  122832. "lsl r6, r6, #16\n\t"
  122833. "adds r3, r3, r6\n\t"
  122834. "adcs r4, r4, r7\n\t"
  122835. "adc r5, r5, #0\n\t"
  122836. #else
  122837. "umull r6, r7, r8, r9\n\t"
  122838. "adds r3, r3, r6\n\t"
  122839. "adcs r4, r4, r7\n\t"
  122840. "adc r5, r5, #0\n\t"
  122841. #endif
  122842. /* A[0] * B[6] */
  122843. "ldr r8, [%[a]]\n\t"
  122844. "ldr r9, [%[b], #24]\n\t"
  122845. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122846. "lsl r6, r8, #16\n\t"
  122847. "lsl r7, r9, #16\n\t"
  122848. "lsr r6, r6, #16\n\t"
  122849. "lsr r7, r7, #16\n\t"
  122850. "mul r7, r6, r7\n\t"
  122851. "adds r3, r3, r7\n\t"
  122852. "adcs r4, r4, #0\n\t"
  122853. "adc r5, r5, #0\n\t"
  122854. "lsr r7, r9, #16\n\t"
  122855. "mul r6, r7, r6\n\t"
  122856. "lsr r7, r6, #16\n\t"
  122857. "lsl r6, r6, #16\n\t"
  122858. "adds r3, r3, r6\n\t"
  122859. "adcs r4, r4, r7\n\t"
  122860. "adc r5, r5, #0\n\t"
  122861. "lsr r6, r8, #16\n\t"
  122862. "lsr r7, r9, #16\n\t"
  122863. "mul r7, r6, r7\n\t"
  122864. "adds r4, r4, r7\n\t"
  122865. "adc r5, r5, #0\n\t"
  122866. "lsl r7, r9, #16\n\t"
  122867. "lsr r7, r7, #16\n\t"
  122868. "mul r6, r7, r6\n\t"
  122869. "lsr r7, r6, #16\n\t"
  122870. "lsl r6, r6, #16\n\t"
  122871. "adds r3, r3, r6\n\t"
  122872. "adcs r4, r4, r7\n\t"
  122873. "adc r5, r5, #0\n\t"
  122874. #else
  122875. "umull r6, r7, r8, r9\n\t"
  122876. "adds r3, r3, r6\n\t"
  122877. "adcs r4, r4, r7\n\t"
  122878. "adc r5, r5, #0\n\t"
  122879. #endif
  122880. "str r3, [sp, #24]\n\t"
  122881. /* A[0] * B[7] */
  122882. "ldr r9, [%[b], #28]\n\t"
  122883. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122884. "lsl r6, r8, #16\n\t"
  122885. "lsl r7, r9, #16\n\t"
  122886. "lsr r6, r6, #16\n\t"
  122887. "lsr r7, r7, #16\n\t"
  122888. "mul r7, r6, r7\n\t"
  122889. "adds r4, r4, r7\n\t"
  122890. "adcs r5, r5, #0\n\t"
  122891. "mov r3, #0\n\t"
  122892. "adc r3, r3, #0\n\t"
  122893. "lsr r7, r9, #16\n\t"
  122894. "mul r6, r7, r6\n\t"
  122895. "lsr r7, r6, #16\n\t"
  122896. "lsl r6, r6, #16\n\t"
  122897. "adds r4, r4, r6\n\t"
  122898. "adcs r5, r5, r7\n\t"
  122899. "adc r3, r3, #0\n\t"
  122900. "lsr r6, r8, #16\n\t"
  122901. "lsr r7, r9, #16\n\t"
  122902. "mul r7, r6, r7\n\t"
  122903. "adds r5, r5, r7\n\t"
  122904. "adc r3, r3, #0\n\t"
  122905. "lsl r7, r9, #16\n\t"
  122906. "lsr r7, r7, #16\n\t"
  122907. "mul r6, r7, r6\n\t"
  122908. "lsr r7, r6, #16\n\t"
  122909. "lsl r6, r6, #16\n\t"
  122910. "adds r4, r4, r6\n\t"
  122911. "adcs r5, r5, r7\n\t"
  122912. "adc r3, r3, #0\n\t"
  122913. #else
  122914. "umull r6, r7, r8, r9\n\t"
  122915. "adds r4, r4, r6\n\t"
  122916. "adcs r5, r5, r7\n\t"
  122917. "mov r3, #0\n\t"
  122918. "adc r3, r3, #0\n\t"
  122919. #endif
  122920. /* A[1] * B[6] */
  122921. "ldr r8, [%[a], #4]\n\t"
  122922. "ldr r9, [%[b], #24]\n\t"
  122923. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122924. "lsl r6, r8, #16\n\t"
  122925. "lsl r7, r9, #16\n\t"
  122926. "lsr r6, r6, #16\n\t"
  122927. "lsr r7, r7, #16\n\t"
  122928. "mul r7, r6, r7\n\t"
  122929. "adds r4, r4, r7\n\t"
  122930. "adcs r5, r5, #0\n\t"
  122931. "adc r3, r3, #0\n\t"
  122932. "lsr r7, r9, #16\n\t"
  122933. "mul r6, r7, r6\n\t"
  122934. "lsr r7, r6, #16\n\t"
  122935. "lsl r6, r6, #16\n\t"
  122936. "adds r4, r4, r6\n\t"
  122937. "adcs r5, r5, r7\n\t"
  122938. "adc r3, r3, #0\n\t"
  122939. "lsr r6, r8, #16\n\t"
  122940. "lsr r7, r9, #16\n\t"
  122941. "mul r7, r6, r7\n\t"
  122942. "adds r5, r5, r7\n\t"
  122943. "adc r3, r3, #0\n\t"
  122944. "lsl r7, r9, #16\n\t"
  122945. "lsr r7, r7, #16\n\t"
  122946. "mul r6, r7, r6\n\t"
  122947. "lsr r7, r6, #16\n\t"
  122948. "lsl r6, r6, #16\n\t"
  122949. "adds r4, r4, r6\n\t"
  122950. "adcs r5, r5, r7\n\t"
  122951. "adc r3, r3, #0\n\t"
  122952. #else
  122953. "umull r6, r7, r8, r9\n\t"
  122954. "adds r4, r4, r6\n\t"
  122955. "adcs r5, r5, r7\n\t"
  122956. "adc r3, r3, #0\n\t"
  122957. #endif
  122958. /* A[2] * B[5] */
  122959. "ldr r8, [%[a], #8]\n\t"
  122960. "ldr r9, [%[b], #20]\n\t"
  122961. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122962. "lsl r6, r8, #16\n\t"
  122963. "lsl r7, r9, #16\n\t"
  122964. "lsr r6, r6, #16\n\t"
  122965. "lsr r7, r7, #16\n\t"
  122966. "mul r7, r6, r7\n\t"
  122967. "adds r4, r4, r7\n\t"
  122968. "adcs r5, r5, #0\n\t"
  122969. "adc r3, r3, #0\n\t"
  122970. "lsr r7, r9, #16\n\t"
  122971. "mul r6, r7, r6\n\t"
  122972. "lsr r7, r6, #16\n\t"
  122973. "lsl r6, r6, #16\n\t"
  122974. "adds r4, r4, r6\n\t"
  122975. "adcs r5, r5, r7\n\t"
  122976. "adc r3, r3, #0\n\t"
  122977. "lsr r6, r8, #16\n\t"
  122978. "lsr r7, r9, #16\n\t"
  122979. "mul r7, r6, r7\n\t"
  122980. "adds r5, r5, r7\n\t"
  122981. "adc r3, r3, #0\n\t"
  122982. "lsl r7, r9, #16\n\t"
  122983. "lsr r7, r7, #16\n\t"
  122984. "mul r6, r7, r6\n\t"
  122985. "lsr r7, r6, #16\n\t"
  122986. "lsl r6, r6, #16\n\t"
  122987. "adds r4, r4, r6\n\t"
  122988. "adcs r5, r5, r7\n\t"
  122989. "adc r3, r3, #0\n\t"
  122990. #else
  122991. "umull r6, r7, r8, r9\n\t"
  122992. "adds r4, r4, r6\n\t"
  122993. "adcs r5, r5, r7\n\t"
  122994. "adc r3, r3, #0\n\t"
  122995. #endif
  122996. /* A[3] * B[4] */
  122997. "ldr r9, [%[b], #16]\n\t"
  122998. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  122999. "lsl r6, r11, #16\n\t"
  123000. "lsl r7, r9, #16\n\t"
  123001. "lsr r6, r6, #16\n\t"
  123002. "lsr r7, r7, #16\n\t"
  123003. "mul r7, r6, r7\n\t"
  123004. "adds r4, r4, r7\n\t"
  123005. "adcs r5, r5, #0\n\t"
  123006. "adc r3, r3, #0\n\t"
  123007. "lsr r7, r9, #16\n\t"
  123008. "mul r6, r7, r6\n\t"
  123009. "lsr r7, r6, #16\n\t"
  123010. "lsl r6, r6, #16\n\t"
  123011. "adds r4, r4, r6\n\t"
  123012. "adcs r5, r5, r7\n\t"
  123013. "adc r3, r3, #0\n\t"
  123014. "lsr r6, r11, #16\n\t"
  123015. "lsr r7, r9, #16\n\t"
  123016. "mul r7, r6, r7\n\t"
  123017. "adds r5, r5, r7\n\t"
  123018. "adc r3, r3, #0\n\t"
  123019. "lsl r7, r9, #16\n\t"
  123020. "lsr r7, r7, #16\n\t"
  123021. "mul r6, r7, r6\n\t"
  123022. "lsr r7, r6, #16\n\t"
  123023. "lsl r6, r6, #16\n\t"
  123024. "adds r4, r4, r6\n\t"
  123025. "adcs r5, r5, r7\n\t"
  123026. "adc r3, r3, #0\n\t"
  123027. #else
  123028. "umull r6, r7, r11, r9\n\t"
  123029. "adds r4, r4, r6\n\t"
  123030. "adcs r5, r5, r7\n\t"
  123031. "adc r3, r3, #0\n\t"
  123032. #endif
  123033. /* A[4] * B[3] */
  123034. "ldr r8, [%[a], #16]\n\t"
  123035. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123036. "lsl r6, r8, #16\n\t"
  123037. "lsl r7, r12, #16\n\t"
  123038. "lsr r6, r6, #16\n\t"
  123039. "lsr r7, r7, #16\n\t"
  123040. "mul r7, r6, r7\n\t"
  123041. "adds r4, r4, r7\n\t"
  123042. "adcs r5, r5, #0\n\t"
  123043. "adc r3, r3, #0\n\t"
  123044. "lsr r7, r12, #16\n\t"
  123045. "mul r6, r7, r6\n\t"
  123046. "lsr r7, r6, #16\n\t"
  123047. "lsl r6, r6, #16\n\t"
  123048. "adds r4, r4, r6\n\t"
  123049. "adcs r5, r5, r7\n\t"
  123050. "adc r3, r3, #0\n\t"
  123051. "lsr r6, r8, #16\n\t"
  123052. "lsr r7, r12, #16\n\t"
  123053. "mul r7, r6, r7\n\t"
  123054. "adds r5, r5, r7\n\t"
  123055. "adc r3, r3, #0\n\t"
  123056. "lsl r7, r12, #16\n\t"
  123057. "lsr r7, r7, #16\n\t"
  123058. "mul r6, r7, r6\n\t"
  123059. "lsr r7, r6, #16\n\t"
  123060. "lsl r6, r6, #16\n\t"
  123061. "adds r4, r4, r6\n\t"
  123062. "adcs r5, r5, r7\n\t"
  123063. "adc r3, r3, #0\n\t"
  123064. #else
  123065. "umull r6, r7, r8, r12\n\t"
  123066. "adds r4, r4, r6\n\t"
  123067. "adcs r5, r5, r7\n\t"
  123068. "adc r3, r3, #0\n\t"
  123069. #endif
  123070. /* A[5] * B[2] */
  123071. "ldr r8, [%[a], #20]\n\t"
  123072. "ldr r9, [%[b], #8]\n\t"
  123073. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123074. "lsl r6, r8, #16\n\t"
  123075. "lsl r7, r9, #16\n\t"
  123076. "lsr r6, r6, #16\n\t"
  123077. "lsr r7, r7, #16\n\t"
  123078. "mul r7, r6, r7\n\t"
  123079. "adds r4, r4, r7\n\t"
  123080. "adcs r5, r5, #0\n\t"
  123081. "adc r3, r3, #0\n\t"
  123082. "lsr r7, r9, #16\n\t"
  123083. "mul r6, r7, r6\n\t"
  123084. "lsr r7, r6, #16\n\t"
  123085. "lsl r6, r6, #16\n\t"
  123086. "adds r4, r4, r6\n\t"
  123087. "adcs r5, r5, r7\n\t"
  123088. "adc r3, r3, #0\n\t"
  123089. "lsr r6, r8, #16\n\t"
  123090. "lsr r7, r9, #16\n\t"
  123091. "mul r7, r6, r7\n\t"
  123092. "adds r5, r5, r7\n\t"
  123093. "adc r3, r3, #0\n\t"
  123094. "lsl r7, r9, #16\n\t"
  123095. "lsr r7, r7, #16\n\t"
  123096. "mul r6, r7, r6\n\t"
  123097. "lsr r7, r6, #16\n\t"
  123098. "lsl r6, r6, #16\n\t"
  123099. "adds r4, r4, r6\n\t"
  123100. "adcs r5, r5, r7\n\t"
  123101. "adc r3, r3, #0\n\t"
  123102. #else
  123103. "umull r6, r7, r8, r9\n\t"
  123104. "adds r4, r4, r6\n\t"
  123105. "adcs r5, r5, r7\n\t"
  123106. "adc r3, r3, #0\n\t"
  123107. #endif
  123108. /* A[6] * B[1] */
  123109. "ldr r8, [%[a], #24]\n\t"
  123110. "ldr r9, [%[b], #4]\n\t"
  123111. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123112. "lsl r6, r8, #16\n\t"
  123113. "lsl r7, r9, #16\n\t"
  123114. "lsr r6, r6, #16\n\t"
  123115. "lsr r7, r7, #16\n\t"
  123116. "mul r7, r6, r7\n\t"
  123117. "adds r4, r4, r7\n\t"
  123118. "adcs r5, r5, #0\n\t"
  123119. "adc r3, r3, #0\n\t"
  123120. "lsr r7, r9, #16\n\t"
  123121. "mul r6, r7, r6\n\t"
  123122. "lsr r7, r6, #16\n\t"
  123123. "lsl r6, r6, #16\n\t"
  123124. "adds r4, r4, r6\n\t"
  123125. "adcs r5, r5, r7\n\t"
  123126. "adc r3, r3, #0\n\t"
  123127. "lsr r6, r8, #16\n\t"
  123128. "lsr r7, r9, #16\n\t"
  123129. "mul r7, r6, r7\n\t"
  123130. "adds r5, r5, r7\n\t"
  123131. "adc r3, r3, #0\n\t"
  123132. "lsl r7, r9, #16\n\t"
  123133. "lsr r7, r7, #16\n\t"
  123134. "mul r6, r7, r6\n\t"
  123135. "lsr r7, r6, #16\n\t"
  123136. "lsl r6, r6, #16\n\t"
  123137. "adds r4, r4, r6\n\t"
  123138. "adcs r5, r5, r7\n\t"
  123139. "adc r3, r3, #0\n\t"
  123140. #else
  123141. "umull r6, r7, r8, r9\n\t"
  123142. "adds r4, r4, r6\n\t"
  123143. "adcs r5, r5, r7\n\t"
  123144. "adc r3, r3, #0\n\t"
  123145. #endif
  123146. /* A[7] * B[0] */
  123147. "ldr r8, [%[a], #28]\n\t"
  123148. "ldr r9, [%[b]]\n\t"
  123149. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123150. "lsl r6, r8, #16\n\t"
  123151. "lsl r7, r9, #16\n\t"
  123152. "lsr r6, r6, #16\n\t"
  123153. "lsr r7, r7, #16\n\t"
  123154. "mul r7, r6, r7\n\t"
  123155. "adds r4, r4, r7\n\t"
  123156. "adcs r5, r5, #0\n\t"
  123157. "adc r3, r3, #0\n\t"
  123158. "lsr r7, r9, #16\n\t"
  123159. "mul r6, r7, r6\n\t"
  123160. "lsr r7, r6, #16\n\t"
  123161. "lsl r6, r6, #16\n\t"
  123162. "adds r4, r4, r6\n\t"
  123163. "adcs r5, r5, r7\n\t"
  123164. "adc r3, r3, #0\n\t"
  123165. "lsr r6, r8, #16\n\t"
  123166. "lsr r7, r9, #16\n\t"
  123167. "mul r7, r6, r7\n\t"
  123168. "adds r5, r5, r7\n\t"
  123169. "adc r3, r3, #0\n\t"
  123170. "lsl r7, r9, #16\n\t"
  123171. "lsr r7, r7, #16\n\t"
  123172. "mul r6, r7, r6\n\t"
  123173. "lsr r7, r6, #16\n\t"
  123174. "lsl r6, r6, #16\n\t"
  123175. "adds r4, r4, r6\n\t"
  123176. "adcs r5, r5, r7\n\t"
  123177. "adc r3, r3, #0\n\t"
  123178. #else
  123179. "umull r6, r7, r8, r9\n\t"
  123180. "adds r4, r4, r6\n\t"
  123181. "adcs r5, r5, r7\n\t"
  123182. "adc r3, r3, #0\n\t"
  123183. #endif
  123184. "str r4, [sp, #28]\n\t"
  123185. /* A[8] * B[0] */
  123186. "ldr r8, [%[a], #32]\n\t"
  123187. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123188. "lsl r6, r8, #16\n\t"
  123189. "lsl r7, r9, #16\n\t"
  123190. "lsr r6, r6, #16\n\t"
  123191. "lsr r7, r7, #16\n\t"
  123192. "mul r7, r6, r7\n\t"
  123193. "adds r5, r5, r7\n\t"
  123194. "adcs r3, r3, #0\n\t"
  123195. "mov r4, #0\n\t"
  123196. "adc r4, r4, #0\n\t"
  123197. "lsr r7, r9, #16\n\t"
  123198. "mul r6, r7, r6\n\t"
  123199. "lsr r7, r6, #16\n\t"
  123200. "lsl r6, r6, #16\n\t"
  123201. "adds r5, r5, r6\n\t"
  123202. "adcs r3, r3, r7\n\t"
  123203. "adc r4, r4, #0\n\t"
  123204. "lsr r6, r8, #16\n\t"
  123205. "lsr r7, r9, #16\n\t"
  123206. "mul r7, r6, r7\n\t"
  123207. "adds r3, r3, r7\n\t"
  123208. "adc r4, r4, #0\n\t"
  123209. "lsl r7, r9, #16\n\t"
  123210. "lsr r7, r7, #16\n\t"
  123211. "mul r6, r7, r6\n\t"
  123212. "lsr r7, r6, #16\n\t"
  123213. "lsl r6, r6, #16\n\t"
  123214. "adds r5, r5, r6\n\t"
  123215. "adcs r3, r3, r7\n\t"
  123216. "adc r4, r4, #0\n\t"
  123217. #else
  123218. "umull r6, r7, r8, r9\n\t"
  123219. "adds r5, r5, r6\n\t"
  123220. "adcs r3, r3, r7\n\t"
  123221. "mov r4, #0\n\t"
  123222. "adc r4, r4, #0\n\t"
  123223. #endif
  123224. /* A[7] * B[1] */
  123225. "ldr r8, [%[a], #28]\n\t"
  123226. "ldr r9, [%[b], #4]\n\t"
  123227. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123228. "lsl r6, r8, #16\n\t"
  123229. "lsl r7, r9, #16\n\t"
  123230. "lsr r6, r6, #16\n\t"
  123231. "lsr r7, r7, #16\n\t"
  123232. "mul r7, r6, r7\n\t"
  123233. "adds r5, r5, r7\n\t"
  123234. "adcs r3, r3, #0\n\t"
  123235. "adc r4, r4, #0\n\t"
  123236. "lsr r7, r9, #16\n\t"
  123237. "mul r6, r7, r6\n\t"
  123238. "lsr r7, r6, #16\n\t"
  123239. "lsl r6, r6, #16\n\t"
  123240. "adds r5, r5, r6\n\t"
  123241. "adcs r3, r3, r7\n\t"
  123242. "adc r4, r4, #0\n\t"
  123243. "lsr r6, r8, #16\n\t"
  123244. "lsr r7, r9, #16\n\t"
  123245. "mul r7, r6, r7\n\t"
  123246. "adds r3, r3, r7\n\t"
  123247. "adc r4, r4, #0\n\t"
  123248. "lsl r7, r9, #16\n\t"
  123249. "lsr r7, r7, #16\n\t"
  123250. "mul r6, r7, r6\n\t"
  123251. "lsr r7, r6, #16\n\t"
  123252. "lsl r6, r6, #16\n\t"
  123253. "adds r5, r5, r6\n\t"
  123254. "adcs r3, r3, r7\n\t"
  123255. "adc r4, r4, #0\n\t"
  123256. #else
  123257. "umull r6, r7, r8, r9\n\t"
  123258. "adds r5, r5, r6\n\t"
  123259. "adcs r3, r3, r7\n\t"
  123260. "adc r4, r4, #0\n\t"
  123261. #endif
  123262. /* A[6] * B[2] */
  123263. "ldr r8, [%[a], #24]\n\t"
  123264. "ldr r9, [%[b], #8]\n\t"
  123265. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123266. "lsl r6, r8, #16\n\t"
  123267. "lsl r7, r9, #16\n\t"
  123268. "lsr r6, r6, #16\n\t"
  123269. "lsr r7, r7, #16\n\t"
  123270. "mul r7, r6, r7\n\t"
  123271. "adds r5, r5, r7\n\t"
  123272. "adcs r3, r3, #0\n\t"
  123273. "adc r4, r4, #0\n\t"
  123274. "lsr r7, r9, #16\n\t"
  123275. "mul r6, r7, r6\n\t"
  123276. "lsr r7, r6, #16\n\t"
  123277. "lsl r6, r6, #16\n\t"
  123278. "adds r5, r5, r6\n\t"
  123279. "adcs r3, r3, r7\n\t"
  123280. "adc r4, r4, #0\n\t"
  123281. "lsr r6, r8, #16\n\t"
  123282. "lsr r7, r9, #16\n\t"
  123283. "mul r7, r6, r7\n\t"
  123284. "adds r3, r3, r7\n\t"
  123285. "adc r4, r4, #0\n\t"
  123286. "lsl r7, r9, #16\n\t"
  123287. "lsr r7, r7, #16\n\t"
  123288. "mul r6, r7, r6\n\t"
  123289. "lsr r7, r6, #16\n\t"
  123290. "lsl r6, r6, #16\n\t"
  123291. "adds r5, r5, r6\n\t"
  123292. "adcs r3, r3, r7\n\t"
  123293. "adc r4, r4, #0\n\t"
  123294. #else
  123295. "umull r6, r7, r8, r9\n\t"
  123296. "adds r5, r5, r6\n\t"
  123297. "adcs r3, r3, r7\n\t"
  123298. "adc r4, r4, #0\n\t"
  123299. #endif
  123300. /* A[5] * B[3] */
  123301. "ldr r8, [%[a], #20]\n\t"
  123302. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123303. "lsl r6, r8, #16\n\t"
  123304. "lsl r7, r12, #16\n\t"
  123305. "lsr r6, r6, #16\n\t"
  123306. "lsr r7, r7, #16\n\t"
  123307. "mul r7, r6, r7\n\t"
  123308. "adds r5, r5, r7\n\t"
  123309. "adcs r3, r3, #0\n\t"
  123310. "adc r4, r4, #0\n\t"
  123311. "lsr r7, r12, #16\n\t"
  123312. "mul r6, r7, r6\n\t"
  123313. "lsr r7, r6, #16\n\t"
  123314. "lsl r6, r6, #16\n\t"
  123315. "adds r5, r5, r6\n\t"
  123316. "adcs r3, r3, r7\n\t"
  123317. "adc r4, r4, #0\n\t"
  123318. "lsr r6, r8, #16\n\t"
  123319. "lsr r7, r12, #16\n\t"
  123320. "mul r7, r6, r7\n\t"
  123321. "adds r3, r3, r7\n\t"
  123322. "adc r4, r4, #0\n\t"
  123323. "lsl r7, r12, #16\n\t"
  123324. "lsr r7, r7, #16\n\t"
  123325. "mul r6, r7, r6\n\t"
  123326. "lsr r7, r6, #16\n\t"
  123327. "lsl r6, r6, #16\n\t"
  123328. "adds r5, r5, r6\n\t"
  123329. "adcs r3, r3, r7\n\t"
  123330. "adc r4, r4, #0\n\t"
  123331. #else
  123332. "umull r6, r7, r8, r12\n\t"
  123333. "adds r5, r5, r6\n\t"
  123334. "adcs r3, r3, r7\n\t"
  123335. "adc r4, r4, #0\n\t"
  123336. #endif
  123337. /* A[4] * B[4] */
  123338. "ldr r11, [%[a], #16]\n\t"
  123339. "ldr r12, [%[b], #16]\n\t"
  123340. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123341. "lsl r6, r11, #16\n\t"
  123342. "lsl r7, r12, #16\n\t"
  123343. "lsr r6, r6, #16\n\t"
  123344. "lsr r7, r7, #16\n\t"
  123345. "mul r7, r6, r7\n\t"
  123346. "adds r5, r5, r7\n\t"
  123347. "adcs r3, r3, #0\n\t"
  123348. "adc r4, r4, #0\n\t"
  123349. "lsr r7, r12, #16\n\t"
  123350. "mul r6, r7, r6\n\t"
  123351. "lsr r7, r6, #16\n\t"
  123352. "lsl r6, r6, #16\n\t"
  123353. "adds r5, r5, r6\n\t"
  123354. "adcs r3, r3, r7\n\t"
  123355. "adc r4, r4, #0\n\t"
  123356. "lsr r6, r11, #16\n\t"
  123357. "lsr r7, r12, #16\n\t"
  123358. "mul r7, r6, r7\n\t"
  123359. "adds r3, r3, r7\n\t"
  123360. "adc r4, r4, #0\n\t"
  123361. "lsl r7, r12, #16\n\t"
  123362. "lsr r7, r7, #16\n\t"
  123363. "mul r6, r7, r6\n\t"
  123364. "lsr r7, r6, #16\n\t"
  123365. "lsl r6, r6, #16\n\t"
  123366. "adds r5, r5, r6\n\t"
  123367. "adcs r3, r3, r7\n\t"
  123368. "adc r4, r4, #0\n\t"
  123369. #else
  123370. "umull r6, r7, r11, r12\n\t"
  123371. "adds r5, r5, r6\n\t"
  123372. "adcs r3, r3, r7\n\t"
  123373. "adc r4, r4, #0\n\t"
  123374. #endif
  123375. /* A[3] * B[5] */
  123376. "ldr r8, [%[a], #12]\n\t"
  123377. "ldr r9, [%[b], #20]\n\t"
  123378. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123379. "lsl r6, r8, #16\n\t"
  123380. "lsl r7, r9, #16\n\t"
  123381. "lsr r6, r6, #16\n\t"
  123382. "lsr r7, r7, #16\n\t"
  123383. "mul r7, r6, r7\n\t"
  123384. "adds r5, r5, r7\n\t"
  123385. "adcs r3, r3, #0\n\t"
  123386. "adc r4, r4, #0\n\t"
  123387. "lsr r7, r9, #16\n\t"
  123388. "mul r6, r7, r6\n\t"
  123389. "lsr r7, r6, #16\n\t"
  123390. "lsl r6, r6, #16\n\t"
  123391. "adds r5, r5, r6\n\t"
  123392. "adcs r3, r3, r7\n\t"
  123393. "adc r4, r4, #0\n\t"
  123394. "lsr r6, r8, #16\n\t"
  123395. "lsr r7, r9, #16\n\t"
  123396. "mul r7, r6, r7\n\t"
  123397. "adds r3, r3, r7\n\t"
  123398. "adc r4, r4, #0\n\t"
  123399. "lsl r7, r9, #16\n\t"
  123400. "lsr r7, r7, #16\n\t"
  123401. "mul r6, r7, r6\n\t"
  123402. "lsr r7, r6, #16\n\t"
  123403. "lsl r6, r6, #16\n\t"
  123404. "adds r5, r5, r6\n\t"
  123405. "adcs r3, r3, r7\n\t"
  123406. "adc r4, r4, #0\n\t"
  123407. #else
  123408. "umull r6, r7, r8, r9\n\t"
  123409. "adds r5, r5, r6\n\t"
  123410. "adcs r3, r3, r7\n\t"
  123411. "adc r4, r4, #0\n\t"
  123412. #endif
  123413. /* A[2] * B[6] */
  123414. "ldr r8, [%[a], #8]\n\t"
  123415. "ldr r9, [%[b], #24]\n\t"
  123416. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123417. "lsl r6, r8, #16\n\t"
  123418. "lsl r7, r9, #16\n\t"
  123419. "lsr r6, r6, #16\n\t"
  123420. "lsr r7, r7, #16\n\t"
  123421. "mul r7, r6, r7\n\t"
  123422. "adds r5, r5, r7\n\t"
  123423. "adcs r3, r3, #0\n\t"
  123424. "adc r4, r4, #0\n\t"
  123425. "lsr r7, r9, #16\n\t"
  123426. "mul r6, r7, r6\n\t"
  123427. "lsr r7, r6, #16\n\t"
  123428. "lsl r6, r6, #16\n\t"
  123429. "adds r5, r5, r6\n\t"
  123430. "adcs r3, r3, r7\n\t"
  123431. "adc r4, r4, #0\n\t"
  123432. "lsr r6, r8, #16\n\t"
  123433. "lsr r7, r9, #16\n\t"
  123434. "mul r7, r6, r7\n\t"
  123435. "adds r3, r3, r7\n\t"
  123436. "adc r4, r4, #0\n\t"
  123437. "lsl r7, r9, #16\n\t"
  123438. "lsr r7, r7, #16\n\t"
  123439. "mul r6, r7, r6\n\t"
  123440. "lsr r7, r6, #16\n\t"
  123441. "lsl r6, r6, #16\n\t"
  123442. "adds r5, r5, r6\n\t"
  123443. "adcs r3, r3, r7\n\t"
  123444. "adc r4, r4, #0\n\t"
  123445. #else
  123446. "umull r6, r7, r8, r9\n\t"
  123447. "adds r5, r5, r6\n\t"
  123448. "adcs r3, r3, r7\n\t"
  123449. "adc r4, r4, #0\n\t"
  123450. #endif
  123451. /* A[1] * B[7] */
  123452. "ldr r8, [%[a], #4]\n\t"
  123453. "ldr r9, [%[b], #28]\n\t"
  123454. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123455. "lsl r6, r8, #16\n\t"
  123456. "lsl r7, r9, #16\n\t"
  123457. "lsr r6, r6, #16\n\t"
  123458. "lsr r7, r7, #16\n\t"
  123459. "mul r7, r6, r7\n\t"
  123460. "adds r5, r5, r7\n\t"
  123461. "adcs r3, r3, #0\n\t"
  123462. "adc r4, r4, #0\n\t"
  123463. "lsr r7, r9, #16\n\t"
  123464. "mul r6, r7, r6\n\t"
  123465. "lsr r7, r6, #16\n\t"
  123466. "lsl r6, r6, #16\n\t"
  123467. "adds r5, r5, r6\n\t"
  123468. "adcs r3, r3, r7\n\t"
  123469. "adc r4, r4, #0\n\t"
  123470. "lsr r6, r8, #16\n\t"
  123471. "lsr r7, r9, #16\n\t"
  123472. "mul r7, r6, r7\n\t"
  123473. "adds r3, r3, r7\n\t"
  123474. "adc r4, r4, #0\n\t"
  123475. "lsl r7, r9, #16\n\t"
  123476. "lsr r7, r7, #16\n\t"
  123477. "mul r6, r7, r6\n\t"
  123478. "lsr r7, r6, #16\n\t"
  123479. "lsl r6, r6, #16\n\t"
  123480. "adds r5, r5, r6\n\t"
  123481. "adcs r3, r3, r7\n\t"
  123482. "adc r4, r4, #0\n\t"
  123483. #else
  123484. "umull r6, r7, r8, r9\n\t"
  123485. "adds r5, r5, r6\n\t"
  123486. "adcs r3, r3, r7\n\t"
  123487. "adc r4, r4, #0\n\t"
  123488. #endif
  123489. /* A[0] * B[8] */
  123490. "ldr r8, [%[a]]\n\t"
  123491. "ldr r9, [%[b], #32]\n\t"
  123492. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123493. "lsl r6, r8, #16\n\t"
  123494. "lsl r7, r9, #16\n\t"
  123495. "lsr r6, r6, #16\n\t"
  123496. "lsr r7, r7, #16\n\t"
  123497. "mul r7, r6, r7\n\t"
  123498. "adds r5, r5, r7\n\t"
  123499. "adcs r3, r3, #0\n\t"
  123500. "adc r4, r4, #0\n\t"
  123501. "lsr r7, r9, #16\n\t"
  123502. "mul r6, r7, r6\n\t"
  123503. "lsr r7, r6, #16\n\t"
  123504. "lsl r6, r6, #16\n\t"
  123505. "adds r5, r5, r6\n\t"
  123506. "adcs r3, r3, r7\n\t"
  123507. "adc r4, r4, #0\n\t"
  123508. "lsr r6, r8, #16\n\t"
  123509. "lsr r7, r9, #16\n\t"
  123510. "mul r7, r6, r7\n\t"
  123511. "adds r3, r3, r7\n\t"
  123512. "adc r4, r4, #0\n\t"
  123513. "lsl r7, r9, #16\n\t"
  123514. "lsr r7, r7, #16\n\t"
  123515. "mul r6, r7, r6\n\t"
  123516. "lsr r7, r6, #16\n\t"
  123517. "lsl r6, r6, #16\n\t"
  123518. "adds r5, r5, r6\n\t"
  123519. "adcs r3, r3, r7\n\t"
  123520. "adc r4, r4, #0\n\t"
  123521. #else
  123522. "umull r6, r7, r8, r9\n\t"
  123523. "adds r5, r5, r6\n\t"
  123524. "adcs r3, r3, r7\n\t"
  123525. "adc r4, r4, #0\n\t"
  123526. #endif
  123527. "str r5, [sp, #32]\n\t"
  123528. /* A[0] * B[9] */
  123529. "ldr r9, [%[b], #36]\n\t"
  123530. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123531. "lsl r6, r8, #16\n\t"
  123532. "lsl r7, r9, #16\n\t"
  123533. "lsr r6, r6, #16\n\t"
  123534. "lsr r7, r7, #16\n\t"
  123535. "mul r7, r6, r7\n\t"
  123536. "adds r3, r3, r7\n\t"
  123537. "adcs r4, r4, #0\n\t"
  123538. "mov r5, #0\n\t"
  123539. "adc r5, r5, #0\n\t"
  123540. "lsr r7, r9, #16\n\t"
  123541. "mul r6, r7, r6\n\t"
  123542. "lsr r7, r6, #16\n\t"
  123543. "lsl r6, r6, #16\n\t"
  123544. "adds r3, r3, r6\n\t"
  123545. "adcs r4, r4, r7\n\t"
  123546. "adc r5, r5, #0\n\t"
  123547. "lsr r6, r8, #16\n\t"
  123548. "lsr r7, r9, #16\n\t"
  123549. "mul r7, r6, r7\n\t"
  123550. "adds r4, r4, r7\n\t"
  123551. "adc r5, r5, #0\n\t"
  123552. "lsl r7, r9, #16\n\t"
  123553. "lsr r7, r7, #16\n\t"
  123554. "mul r6, r7, r6\n\t"
  123555. "lsr r7, r6, #16\n\t"
  123556. "lsl r6, r6, #16\n\t"
  123557. "adds r3, r3, r6\n\t"
  123558. "adcs r4, r4, r7\n\t"
  123559. "adc r5, r5, #0\n\t"
  123560. #else
  123561. "umull r6, r7, r8, r9\n\t"
  123562. "adds r3, r3, r6\n\t"
  123563. "adcs r4, r4, r7\n\t"
  123564. "mov r5, #0\n\t"
  123565. "adc r5, r5, #0\n\t"
  123566. #endif
  123567. /* A[1] * B[8] */
  123568. "ldr r8, [%[a], #4]\n\t"
  123569. "ldr r9, [%[b], #32]\n\t"
  123570. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123571. "lsl r6, r8, #16\n\t"
  123572. "lsl r7, r9, #16\n\t"
  123573. "lsr r6, r6, #16\n\t"
  123574. "lsr r7, r7, #16\n\t"
  123575. "mul r7, r6, r7\n\t"
  123576. "adds r3, r3, r7\n\t"
  123577. "adcs r4, r4, #0\n\t"
  123578. "adc r5, r5, #0\n\t"
  123579. "lsr r7, r9, #16\n\t"
  123580. "mul r6, r7, r6\n\t"
  123581. "lsr r7, r6, #16\n\t"
  123582. "lsl r6, r6, #16\n\t"
  123583. "adds r3, r3, r6\n\t"
  123584. "adcs r4, r4, r7\n\t"
  123585. "adc r5, r5, #0\n\t"
  123586. "lsr r6, r8, #16\n\t"
  123587. "lsr r7, r9, #16\n\t"
  123588. "mul r7, r6, r7\n\t"
  123589. "adds r4, r4, r7\n\t"
  123590. "adc r5, r5, #0\n\t"
  123591. "lsl r7, r9, #16\n\t"
  123592. "lsr r7, r7, #16\n\t"
  123593. "mul r6, r7, r6\n\t"
  123594. "lsr r7, r6, #16\n\t"
  123595. "lsl r6, r6, #16\n\t"
  123596. "adds r3, r3, r6\n\t"
  123597. "adcs r4, r4, r7\n\t"
  123598. "adc r5, r5, #0\n\t"
  123599. #else
  123600. "umull r6, r7, r8, r9\n\t"
  123601. "adds r3, r3, r6\n\t"
  123602. "adcs r4, r4, r7\n\t"
  123603. "adc r5, r5, #0\n\t"
  123604. #endif
  123605. /* A[2] * B[7] */
  123606. "ldr r8, [%[a], #8]\n\t"
  123607. "ldr r9, [%[b], #28]\n\t"
  123608. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123609. "lsl r6, r8, #16\n\t"
  123610. "lsl r7, r9, #16\n\t"
  123611. "lsr r6, r6, #16\n\t"
  123612. "lsr r7, r7, #16\n\t"
  123613. "mul r7, r6, r7\n\t"
  123614. "adds r3, r3, r7\n\t"
  123615. "adcs r4, r4, #0\n\t"
  123616. "adc r5, r5, #0\n\t"
  123617. "lsr r7, r9, #16\n\t"
  123618. "mul r6, r7, r6\n\t"
  123619. "lsr r7, r6, #16\n\t"
  123620. "lsl r6, r6, #16\n\t"
  123621. "adds r3, r3, r6\n\t"
  123622. "adcs r4, r4, r7\n\t"
  123623. "adc r5, r5, #0\n\t"
  123624. "lsr r6, r8, #16\n\t"
  123625. "lsr r7, r9, #16\n\t"
  123626. "mul r7, r6, r7\n\t"
  123627. "adds r4, r4, r7\n\t"
  123628. "adc r5, r5, #0\n\t"
  123629. "lsl r7, r9, #16\n\t"
  123630. "lsr r7, r7, #16\n\t"
  123631. "mul r6, r7, r6\n\t"
  123632. "lsr r7, r6, #16\n\t"
  123633. "lsl r6, r6, #16\n\t"
  123634. "adds r3, r3, r6\n\t"
  123635. "adcs r4, r4, r7\n\t"
  123636. "adc r5, r5, #0\n\t"
  123637. #else
  123638. "umull r6, r7, r8, r9\n\t"
  123639. "adds r3, r3, r6\n\t"
  123640. "adcs r4, r4, r7\n\t"
  123641. "adc r5, r5, #0\n\t"
  123642. #endif
  123643. /* A[3] * B[6] */
  123644. "ldr r8, [%[a], #12]\n\t"
  123645. "ldr r9, [%[b], #24]\n\t"
  123646. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123647. "lsl r6, r8, #16\n\t"
  123648. "lsl r7, r9, #16\n\t"
  123649. "lsr r6, r6, #16\n\t"
  123650. "lsr r7, r7, #16\n\t"
  123651. "mul r7, r6, r7\n\t"
  123652. "adds r3, r3, r7\n\t"
  123653. "adcs r4, r4, #0\n\t"
  123654. "adc r5, r5, #0\n\t"
  123655. "lsr r7, r9, #16\n\t"
  123656. "mul r6, r7, r6\n\t"
  123657. "lsr r7, r6, #16\n\t"
  123658. "lsl r6, r6, #16\n\t"
  123659. "adds r3, r3, r6\n\t"
  123660. "adcs r4, r4, r7\n\t"
  123661. "adc r5, r5, #0\n\t"
  123662. "lsr r6, r8, #16\n\t"
  123663. "lsr r7, r9, #16\n\t"
  123664. "mul r7, r6, r7\n\t"
  123665. "adds r4, r4, r7\n\t"
  123666. "adc r5, r5, #0\n\t"
  123667. "lsl r7, r9, #16\n\t"
  123668. "lsr r7, r7, #16\n\t"
  123669. "mul r6, r7, r6\n\t"
  123670. "lsr r7, r6, #16\n\t"
  123671. "lsl r6, r6, #16\n\t"
  123672. "adds r3, r3, r6\n\t"
  123673. "adcs r4, r4, r7\n\t"
  123674. "adc r5, r5, #0\n\t"
  123675. #else
  123676. "umull r6, r7, r8, r9\n\t"
  123677. "adds r3, r3, r6\n\t"
  123678. "adcs r4, r4, r7\n\t"
  123679. "adc r5, r5, #0\n\t"
  123680. #endif
  123681. /* A[4] * B[5] */
  123682. "ldr r9, [%[b], #20]\n\t"
  123683. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123684. "lsl r6, r11, #16\n\t"
  123685. "lsl r7, r9, #16\n\t"
  123686. "lsr r6, r6, #16\n\t"
  123687. "lsr r7, r7, #16\n\t"
  123688. "mul r7, r6, r7\n\t"
  123689. "adds r3, r3, r7\n\t"
  123690. "adcs r4, r4, #0\n\t"
  123691. "adc r5, r5, #0\n\t"
  123692. "lsr r7, r9, #16\n\t"
  123693. "mul r6, r7, r6\n\t"
  123694. "lsr r7, r6, #16\n\t"
  123695. "lsl r6, r6, #16\n\t"
  123696. "adds r3, r3, r6\n\t"
  123697. "adcs r4, r4, r7\n\t"
  123698. "adc r5, r5, #0\n\t"
  123699. "lsr r6, r11, #16\n\t"
  123700. "lsr r7, r9, #16\n\t"
  123701. "mul r7, r6, r7\n\t"
  123702. "adds r4, r4, r7\n\t"
  123703. "adc r5, r5, #0\n\t"
  123704. "lsl r7, r9, #16\n\t"
  123705. "lsr r7, r7, #16\n\t"
  123706. "mul r6, r7, r6\n\t"
  123707. "lsr r7, r6, #16\n\t"
  123708. "lsl r6, r6, #16\n\t"
  123709. "adds r3, r3, r6\n\t"
  123710. "adcs r4, r4, r7\n\t"
  123711. "adc r5, r5, #0\n\t"
  123712. #else
  123713. "umull r6, r7, r11, r9\n\t"
  123714. "adds r3, r3, r6\n\t"
  123715. "adcs r4, r4, r7\n\t"
  123716. "adc r5, r5, #0\n\t"
  123717. #endif
  123718. /* A[5] * B[4] */
  123719. "ldr r8, [%[a], #20]\n\t"
  123720. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123721. "lsl r6, r8, #16\n\t"
  123722. "lsl r7, r12, #16\n\t"
  123723. "lsr r6, r6, #16\n\t"
  123724. "lsr r7, r7, #16\n\t"
  123725. "mul r7, r6, r7\n\t"
  123726. "adds r3, r3, r7\n\t"
  123727. "adcs r4, r4, #0\n\t"
  123728. "adc r5, r5, #0\n\t"
  123729. "lsr r7, r12, #16\n\t"
  123730. "mul r6, r7, r6\n\t"
  123731. "lsr r7, r6, #16\n\t"
  123732. "lsl r6, r6, #16\n\t"
  123733. "adds r3, r3, r6\n\t"
  123734. "adcs r4, r4, r7\n\t"
  123735. "adc r5, r5, #0\n\t"
  123736. "lsr r6, r8, #16\n\t"
  123737. "lsr r7, r12, #16\n\t"
  123738. "mul r7, r6, r7\n\t"
  123739. "adds r4, r4, r7\n\t"
  123740. "adc r5, r5, #0\n\t"
  123741. "lsl r7, r12, #16\n\t"
  123742. "lsr r7, r7, #16\n\t"
  123743. "mul r6, r7, r6\n\t"
  123744. "lsr r7, r6, #16\n\t"
  123745. "lsl r6, r6, #16\n\t"
  123746. "adds r3, r3, r6\n\t"
  123747. "adcs r4, r4, r7\n\t"
  123748. "adc r5, r5, #0\n\t"
  123749. #else
  123750. "umull r6, r7, r8, r12\n\t"
  123751. "adds r3, r3, r6\n\t"
  123752. "adcs r4, r4, r7\n\t"
  123753. "adc r5, r5, #0\n\t"
  123754. #endif
  123755. /* A[6] * B[3] */
  123756. "ldr r8, [%[a], #24]\n\t"
  123757. "ldr r9, [%[b], #12]\n\t"
  123758. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123759. "lsl r6, r8, #16\n\t"
  123760. "lsl r7, r9, #16\n\t"
  123761. "lsr r6, r6, #16\n\t"
  123762. "lsr r7, r7, #16\n\t"
  123763. "mul r7, r6, r7\n\t"
  123764. "adds r3, r3, r7\n\t"
  123765. "adcs r4, r4, #0\n\t"
  123766. "adc r5, r5, #0\n\t"
  123767. "lsr r7, r9, #16\n\t"
  123768. "mul r6, r7, r6\n\t"
  123769. "lsr r7, r6, #16\n\t"
  123770. "lsl r6, r6, #16\n\t"
  123771. "adds r3, r3, r6\n\t"
  123772. "adcs r4, r4, r7\n\t"
  123773. "adc r5, r5, #0\n\t"
  123774. "lsr r6, r8, #16\n\t"
  123775. "lsr r7, r9, #16\n\t"
  123776. "mul r7, r6, r7\n\t"
  123777. "adds r4, r4, r7\n\t"
  123778. "adc r5, r5, #0\n\t"
  123779. "lsl r7, r9, #16\n\t"
  123780. "lsr r7, r7, #16\n\t"
  123781. "mul r6, r7, r6\n\t"
  123782. "lsr r7, r6, #16\n\t"
  123783. "lsl r6, r6, #16\n\t"
  123784. "adds r3, r3, r6\n\t"
  123785. "adcs r4, r4, r7\n\t"
  123786. "adc r5, r5, #0\n\t"
  123787. #else
  123788. "umull r6, r7, r8, r9\n\t"
  123789. "adds r3, r3, r6\n\t"
  123790. "adcs r4, r4, r7\n\t"
  123791. "adc r5, r5, #0\n\t"
  123792. #endif
  123793. /* A[7] * B[2] */
  123794. "ldr r8, [%[a], #28]\n\t"
  123795. "ldr r9, [%[b], #8]\n\t"
  123796. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123797. "lsl r6, r8, #16\n\t"
  123798. "lsl r7, r9, #16\n\t"
  123799. "lsr r6, r6, #16\n\t"
  123800. "lsr r7, r7, #16\n\t"
  123801. "mul r7, r6, r7\n\t"
  123802. "adds r3, r3, r7\n\t"
  123803. "adcs r4, r4, #0\n\t"
  123804. "adc r5, r5, #0\n\t"
  123805. "lsr r7, r9, #16\n\t"
  123806. "mul r6, r7, r6\n\t"
  123807. "lsr r7, r6, #16\n\t"
  123808. "lsl r6, r6, #16\n\t"
  123809. "adds r3, r3, r6\n\t"
  123810. "adcs r4, r4, r7\n\t"
  123811. "adc r5, r5, #0\n\t"
  123812. "lsr r6, r8, #16\n\t"
  123813. "lsr r7, r9, #16\n\t"
  123814. "mul r7, r6, r7\n\t"
  123815. "adds r4, r4, r7\n\t"
  123816. "adc r5, r5, #0\n\t"
  123817. "lsl r7, r9, #16\n\t"
  123818. "lsr r7, r7, #16\n\t"
  123819. "mul r6, r7, r6\n\t"
  123820. "lsr r7, r6, #16\n\t"
  123821. "lsl r6, r6, #16\n\t"
  123822. "adds r3, r3, r6\n\t"
  123823. "adcs r4, r4, r7\n\t"
  123824. "adc r5, r5, #0\n\t"
  123825. #else
  123826. "umull r6, r7, r8, r9\n\t"
  123827. "adds r3, r3, r6\n\t"
  123828. "adcs r4, r4, r7\n\t"
  123829. "adc r5, r5, #0\n\t"
  123830. #endif
  123831. /* A[8] * B[1] */
  123832. "ldr r8, [%[a], #32]\n\t"
  123833. "ldr r9, [%[b], #4]\n\t"
  123834. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123835. "lsl r6, r8, #16\n\t"
  123836. "lsl r7, r9, #16\n\t"
  123837. "lsr r6, r6, #16\n\t"
  123838. "lsr r7, r7, #16\n\t"
  123839. "mul r7, r6, r7\n\t"
  123840. "adds r3, r3, r7\n\t"
  123841. "adcs r4, r4, #0\n\t"
  123842. "adc r5, r5, #0\n\t"
  123843. "lsr r7, r9, #16\n\t"
  123844. "mul r6, r7, r6\n\t"
  123845. "lsr r7, r6, #16\n\t"
  123846. "lsl r6, r6, #16\n\t"
  123847. "adds r3, r3, r6\n\t"
  123848. "adcs r4, r4, r7\n\t"
  123849. "adc r5, r5, #0\n\t"
  123850. "lsr r6, r8, #16\n\t"
  123851. "lsr r7, r9, #16\n\t"
  123852. "mul r7, r6, r7\n\t"
  123853. "adds r4, r4, r7\n\t"
  123854. "adc r5, r5, #0\n\t"
  123855. "lsl r7, r9, #16\n\t"
  123856. "lsr r7, r7, #16\n\t"
  123857. "mul r6, r7, r6\n\t"
  123858. "lsr r7, r6, #16\n\t"
  123859. "lsl r6, r6, #16\n\t"
  123860. "adds r3, r3, r6\n\t"
  123861. "adcs r4, r4, r7\n\t"
  123862. "adc r5, r5, #0\n\t"
  123863. #else
  123864. "umull r6, r7, r8, r9\n\t"
  123865. "adds r3, r3, r6\n\t"
  123866. "adcs r4, r4, r7\n\t"
  123867. "adc r5, r5, #0\n\t"
  123868. #endif
  123869. /* A[9] * B[0] */
  123870. "ldr r8, [%[a], #36]\n\t"
  123871. "ldr r9, [%[b]]\n\t"
  123872. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123873. "lsl r6, r8, #16\n\t"
  123874. "lsl r7, r9, #16\n\t"
  123875. "lsr r6, r6, #16\n\t"
  123876. "lsr r7, r7, #16\n\t"
  123877. "mul r7, r6, r7\n\t"
  123878. "adds r3, r3, r7\n\t"
  123879. "adcs r4, r4, #0\n\t"
  123880. "adc r5, r5, #0\n\t"
  123881. "lsr r7, r9, #16\n\t"
  123882. "mul r6, r7, r6\n\t"
  123883. "lsr r7, r6, #16\n\t"
  123884. "lsl r6, r6, #16\n\t"
  123885. "adds r3, r3, r6\n\t"
  123886. "adcs r4, r4, r7\n\t"
  123887. "adc r5, r5, #0\n\t"
  123888. "lsr r6, r8, #16\n\t"
  123889. "lsr r7, r9, #16\n\t"
  123890. "mul r7, r6, r7\n\t"
  123891. "adds r4, r4, r7\n\t"
  123892. "adc r5, r5, #0\n\t"
  123893. "lsl r7, r9, #16\n\t"
  123894. "lsr r7, r7, #16\n\t"
  123895. "mul r6, r7, r6\n\t"
  123896. "lsr r7, r6, #16\n\t"
  123897. "lsl r6, r6, #16\n\t"
  123898. "adds r3, r3, r6\n\t"
  123899. "adcs r4, r4, r7\n\t"
  123900. "adc r5, r5, #0\n\t"
  123901. #else
  123902. "umull r6, r7, r8, r9\n\t"
  123903. "adds r3, r3, r6\n\t"
  123904. "adcs r4, r4, r7\n\t"
  123905. "adc r5, r5, #0\n\t"
  123906. #endif
  123907. "str r3, [sp, #36]\n\t"
  123908. /* A[10] * B[0] */
  123909. "ldr r8, [%[a], #40]\n\t"
  123910. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123911. "lsl r6, r8, #16\n\t"
  123912. "lsl r7, r9, #16\n\t"
  123913. "lsr r6, r6, #16\n\t"
  123914. "lsr r7, r7, #16\n\t"
  123915. "mul r7, r6, r7\n\t"
  123916. "adds r4, r4, r7\n\t"
  123917. "adcs r5, r5, #0\n\t"
  123918. "mov r3, #0\n\t"
  123919. "adc r3, r3, #0\n\t"
  123920. "lsr r7, r9, #16\n\t"
  123921. "mul r6, r7, r6\n\t"
  123922. "lsr r7, r6, #16\n\t"
  123923. "lsl r6, r6, #16\n\t"
  123924. "adds r4, r4, r6\n\t"
  123925. "adcs r5, r5, r7\n\t"
  123926. "adc r3, r3, #0\n\t"
  123927. "lsr r6, r8, #16\n\t"
  123928. "lsr r7, r9, #16\n\t"
  123929. "mul r7, r6, r7\n\t"
  123930. "adds r5, r5, r7\n\t"
  123931. "adc r3, r3, #0\n\t"
  123932. "lsl r7, r9, #16\n\t"
  123933. "lsr r7, r7, #16\n\t"
  123934. "mul r6, r7, r6\n\t"
  123935. "lsr r7, r6, #16\n\t"
  123936. "lsl r6, r6, #16\n\t"
  123937. "adds r4, r4, r6\n\t"
  123938. "adcs r5, r5, r7\n\t"
  123939. "adc r3, r3, #0\n\t"
  123940. #else
  123941. "umull r6, r7, r8, r9\n\t"
  123942. "adds r4, r4, r6\n\t"
  123943. "adcs r5, r5, r7\n\t"
  123944. "mov r3, #0\n\t"
  123945. "adc r3, r3, #0\n\t"
  123946. #endif
  123947. /* A[9] * B[1] */
  123948. "ldr r8, [%[a], #36]\n\t"
  123949. "ldr r9, [%[b], #4]\n\t"
  123950. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123951. "lsl r6, r8, #16\n\t"
  123952. "lsl r7, r9, #16\n\t"
  123953. "lsr r6, r6, #16\n\t"
  123954. "lsr r7, r7, #16\n\t"
  123955. "mul r7, r6, r7\n\t"
  123956. "adds r4, r4, r7\n\t"
  123957. "adcs r5, r5, #0\n\t"
  123958. "adc r3, r3, #0\n\t"
  123959. "lsr r7, r9, #16\n\t"
  123960. "mul r6, r7, r6\n\t"
  123961. "lsr r7, r6, #16\n\t"
  123962. "lsl r6, r6, #16\n\t"
  123963. "adds r4, r4, r6\n\t"
  123964. "adcs r5, r5, r7\n\t"
  123965. "adc r3, r3, #0\n\t"
  123966. "lsr r6, r8, #16\n\t"
  123967. "lsr r7, r9, #16\n\t"
  123968. "mul r7, r6, r7\n\t"
  123969. "adds r5, r5, r7\n\t"
  123970. "adc r3, r3, #0\n\t"
  123971. "lsl r7, r9, #16\n\t"
  123972. "lsr r7, r7, #16\n\t"
  123973. "mul r6, r7, r6\n\t"
  123974. "lsr r7, r6, #16\n\t"
  123975. "lsl r6, r6, #16\n\t"
  123976. "adds r4, r4, r6\n\t"
  123977. "adcs r5, r5, r7\n\t"
  123978. "adc r3, r3, #0\n\t"
  123979. #else
  123980. "umull r6, r7, r8, r9\n\t"
  123981. "adds r4, r4, r6\n\t"
  123982. "adcs r5, r5, r7\n\t"
  123983. "adc r3, r3, #0\n\t"
  123984. #endif
  123985. /* A[8] * B[2] */
  123986. "ldr r8, [%[a], #32]\n\t"
  123987. "ldr r9, [%[b], #8]\n\t"
  123988. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  123989. "lsl r6, r8, #16\n\t"
  123990. "lsl r7, r9, #16\n\t"
  123991. "lsr r6, r6, #16\n\t"
  123992. "lsr r7, r7, #16\n\t"
  123993. "mul r7, r6, r7\n\t"
  123994. "adds r4, r4, r7\n\t"
  123995. "adcs r5, r5, #0\n\t"
  123996. "adc r3, r3, #0\n\t"
  123997. "lsr r7, r9, #16\n\t"
  123998. "mul r6, r7, r6\n\t"
  123999. "lsr r7, r6, #16\n\t"
  124000. "lsl r6, r6, #16\n\t"
  124001. "adds r4, r4, r6\n\t"
  124002. "adcs r5, r5, r7\n\t"
  124003. "adc r3, r3, #0\n\t"
  124004. "lsr r6, r8, #16\n\t"
  124005. "lsr r7, r9, #16\n\t"
  124006. "mul r7, r6, r7\n\t"
  124007. "adds r5, r5, r7\n\t"
  124008. "adc r3, r3, #0\n\t"
  124009. "lsl r7, r9, #16\n\t"
  124010. "lsr r7, r7, #16\n\t"
  124011. "mul r6, r7, r6\n\t"
  124012. "lsr r7, r6, #16\n\t"
  124013. "lsl r6, r6, #16\n\t"
  124014. "adds r4, r4, r6\n\t"
  124015. "adcs r5, r5, r7\n\t"
  124016. "adc r3, r3, #0\n\t"
  124017. #else
  124018. "umull r6, r7, r8, r9\n\t"
  124019. "adds r4, r4, r6\n\t"
  124020. "adcs r5, r5, r7\n\t"
  124021. "adc r3, r3, #0\n\t"
  124022. #endif
  124023. /* A[7] * B[3] */
  124024. "ldr r8, [%[a], #28]\n\t"
  124025. "ldr r9, [%[b], #12]\n\t"
  124026. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124027. "lsl r6, r8, #16\n\t"
  124028. "lsl r7, r9, #16\n\t"
  124029. "lsr r6, r6, #16\n\t"
  124030. "lsr r7, r7, #16\n\t"
  124031. "mul r7, r6, r7\n\t"
  124032. "adds r4, r4, r7\n\t"
  124033. "adcs r5, r5, #0\n\t"
  124034. "adc r3, r3, #0\n\t"
  124035. "lsr r7, r9, #16\n\t"
  124036. "mul r6, r7, r6\n\t"
  124037. "lsr r7, r6, #16\n\t"
  124038. "lsl r6, r6, #16\n\t"
  124039. "adds r4, r4, r6\n\t"
  124040. "adcs r5, r5, r7\n\t"
  124041. "adc r3, r3, #0\n\t"
  124042. "lsr r6, r8, #16\n\t"
  124043. "lsr r7, r9, #16\n\t"
  124044. "mul r7, r6, r7\n\t"
  124045. "adds r5, r5, r7\n\t"
  124046. "adc r3, r3, #0\n\t"
  124047. "lsl r7, r9, #16\n\t"
  124048. "lsr r7, r7, #16\n\t"
  124049. "mul r6, r7, r6\n\t"
  124050. "lsr r7, r6, #16\n\t"
  124051. "lsl r6, r6, #16\n\t"
  124052. "adds r4, r4, r6\n\t"
  124053. "adcs r5, r5, r7\n\t"
  124054. "adc r3, r3, #0\n\t"
  124055. #else
  124056. "umull r6, r7, r8, r9\n\t"
  124057. "adds r4, r4, r6\n\t"
  124058. "adcs r5, r5, r7\n\t"
  124059. "adc r3, r3, #0\n\t"
  124060. #endif
  124061. /* A[6] * B[4] */
  124062. "ldr r8, [%[a], #24]\n\t"
  124063. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124064. "lsl r6, r8, #16\n\t"
  124065. "lsl r7, r12, #16\n\t"
  124066. "lsr r6, r6, #16\n\t"
  124067. "lsr r7, r7, #16\n\t"
  124068. "mul r7, r6, r7\n\t"
  124069. "adds r4, r4, r7\n\t"
  124070. "adcs r5, r5, #0\n\t"
  124071. "adc r3, r3, #0\n\t"
  124072. "lsr r7, r12, #16\n\t"
  124073. "mul r6, r7, r6\n\t"
  124074. "lsr r7, r6, #16\n\t"
  124075. "lsl r6, r6, #16\n\t"
  124076. "adds r4, r4, r6\n\t"
  124077. "adcs r5, r5, r7\n\t"
  124078. "adc r3, r3, #0\n\t"
  124079. "lsr r6, r8, #16\n\t"
  124080. "lsr r7, r12, #16\n\t"
  124081. "mul r7, r6, r7\n\t"
  124082. "adds r5, r5, r7\n\t"
  124083. "adc r3, r3, #0\n\t"
  124084. "lsl r7, r12, #16\n\t"
  124085. "lsr r7, r7, #16\n\t"
  124086. "mul r6, r7, r6\n\t"
  124087. "lsr r7, r6, #16\n\t"
  124088. "lsl r6, r6, #16\n\t"
  124089. "adds r4, r4, r6\n\t"
  124090. "adcs r5, r5, r7\n\t"
  124091. "adc r3, r3, #0\n\t"
  124092. #else
  124093. "umull r6, r7, r8, r12\n\t"
  124094. "adds r4, r4, r6\n\t"
  124095. "adcs r5, r5, r7\n\t"
  124096. "adc r3, r3, #0\n\t"
  124097. #endif
  124098. /* A[5] * B[5] */
  124099. "ldr r11, [%[a], #20]\n\t"
  124100. "ldr r12, [%[b], #20]\n\t"
  124101. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124102. "lsl r6, r11, #16\n\t"
  124103. "lsl r7, r12, #16\n\t"
  124104. "lsr r6, r6, #16\n\t"
  124105. "lsr r7, r7, #16\n\t"
  124106. "mul r7, r6, r7\n\t"
  124107. "adds r4, r4, r7\n\t"
  124108. "adcs r5, r5, #0\n\t"
  124109. "adc r3, r3, #0\n\t"
  124110. "lsr r7, r12, #16\n\t"
  124111. "mul r6, r7, r6\n\t"
  124112. "lsr r7, r6, #16\n\t"
  124113. "lsl r6, r6, #16\n\t"
  124114. "adds r4, r4, r6\n\t"
  124115. "adcs r5, r5, r7\n\t"
  124116. "adc r3, r3, #0\n\t"
  124117. "lsr r6, r11, #16\n\t"
  124118. "lsr r7, r12, #16\n\t"
  124119. "mul r7, r6, r7\n\t"
  124120. "adds r5, r5, r7\n\t"
  124121. "adc r3, r3, #0\n\t"
  124122. "lsl r7, r12, #16\n\t"
  124123. "lsr r7, r7, #16\n\t"
  124124. "mul r6, r7, r6\n\t"
  124125. "lsr r7, r6, #16\n\t"
  124126. "lsl r6, r6, #16\n\t"
  124127. "adds r4, r4, r6\n\t"
  124128. "adcs r5, r5, r7\n\t"
  124129. "adc r3, r3, #0\n\t"
  124130. #else
  124131. "umull r6, r7, r11, r12\n\t"
  124132. "adds r4, r4, r6\n\t"
  124133. "adcs r5, r5, r7\n\t"
  124134. "adc r3, r3, #0\n\t"
  124135. #endif
  124136. /* A[4] * B[6] */
  124137. "ldr r8, [%[a], #16]\n\t"
  124138. "ldr r9, [%[b], #24]\n\t"
  124139. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124140. "lsl r6, r8, #16\n\t"
  124141. "lsl r7, r9, #16\n\t"
  124142. "lsr r6, r6, #16\n\t"
  124143. "lsr r7, r7, #16\n\t"
  124144. "mul r7, r6, r7\n\t"
  124145. "adds r4, r4, r7\n\t"
  124146. "adcs r5, r5, #0\n\t"
  124147. "adc r3, r3, #0\n\t"
  124148. "lsr r7, r9, #16\n\t"
  124149. "mul r6, r7, r6\n\t"
  124150. "lsr r7, r6, #16\n\t"
  124151. "lsl r6, r6, #16\n\t"
  124152. "adds r4, r4, r6\n\t"
  124153. "adcs r5, r5, r7\n\t"
  124154. "adc r3, r3, #0\n\t"
  124155. "lsr r6, r8, #16\n\t"
  124156. "lsr r7, r9, #16\n\t"
  124157. "mul r7, r6, r7\n\t"
  124158. "adds r5, r5, r7\n\t"
  124159. "adc r3, r3, #0\n\t"
  124160. "lsl r7, r9, #16\n\t"
  124161. "lsr r7, r7, #16\n\t"
  124162. "mul r6, r7, r6\n\t"
  124163. "lsr r7, r6, #16\n\t"
  124164. "lsl r6, r6, #16\n\t"
  124165. "adds r4, r4, r6\n\t"
  124166. "adcs r5, r5, r7\n\t"
  124167. "adc r3, r3, #0\n\t"
  124168. #else
  124169. "umull r6, r7, r8, r9\n\t"
  124170. "adds r4, r4, r6\n\t"
  124171. "adcs r5, r5, r7\n\t"
  124172. "adc r3, r3, #0\n\t"
  124173. #endif
  124174. /* A[3] * B[7] */
  124175. "ldr r8, [%[a], #12]\n\t"
  124176. "ldr r9, [%[b], #28]\n\t"
  124177. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124178. "lsl r6, r8, #16\n\t"
  124179. "lsl r7, r9, #16\n\t"
  124180. "lsr r6, r6, #16\n\t"
  124181. "lsr r7, r7, #16\n\t"
  124182. "mul r7, r6, r7\n\t"
  124183. "adds r4, r4, r7\n\t"
  124184. "adcs r5, r5, #0\n\t"
  124185. "adc r3, r3, #0\n\t"
  124186. "lsr r7, r9, #16\n\t"
  124187. "mul r6, r7, r6\n\t"
  124188. "lsr r7, r6, #16\n\t"
  124189. "lsl r6, r6, #16\n\t"
  124190. "adds r4, r4, r6\n\t"
  124191. "adcs r5, r5, r7\n\t"
  124192. "adc r3, r3, #0\n\t"
  124193. "lsr r6, r8, #16\n\t"
  124194. "lsr r7, r9, #16\n\t"
  124195. "mul r7, r6, r7\n\t"
  124196. "adds r5, r5, r7\n\t"
  124197. "adc r3, r3, #0\n\t"
  124198. "lsl r7, r9, #16\n\t"
  124199. "lsr r7, r7, #16\n\t"
  124200. "mul r6, r7, r6\n\t"
  124201. "lsr r7, r6, #16\n\t"
  124202. "lsl r6, r6, #16\n\t"
  124203. "adds r4, r4, r6\n\t"
  124204. "adcs r5, r5, r7\n\t"
  124205. "adc r3, r3, #0\n\t"
  124206. #else
  124207. "umull r6, r7, r8, r9\n\t"
  124208. "adds r4, r4, r6\n\t"
  124209. "adcs r5, r5, r7\n\t"
  124210. "adc r3, r3, #0\n\t"
  124211. #endif
  124212. /* A[2] * B[8] */
  124213. "ldr r8, [%[a], #8]\n\t"
  124214. "ldr r9, [%[b], #32]\n\t"
  124215. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124216. "lsl r6, r8, #16\n\t"
  124217. "lsl r7, r9, #16\n\t"
  124218. "lsr r6, r6, #16\n\t"
  124219. "lsr r7, r7, #16\n\t"
  124220. "mul r7, r6, r7\n\t"
  124221. "adds r4, r4, r7\n\t"
  124222. "adcs r5, r5, #0\n\t"
  124223. "adc r3, r3, #0\n\t"
  124224. "lsr r7, r9, #16\n\t"
  124225. "mul r6, r7, r6\n\t"
  124226. "lsr r7, r6, #16\n\t"
  124227. "lsl r6, r6, #16\n\t"
  124228. "adds r4, r4, r6\n\t"
  124229. "adcs r5, r5, r7\n\t"
  124230. "adc r3, r3, #0\n\t"
  124231. "lsr r6, r8, #16\n\t"
  124232. "lsr r7, r9, #16\n\t"
  124233. "mul r7, r6, r7\n\t"
  124234. "adds r5, r5, r7\n\t"
  124235. "adc r3, r3, #0\n\t"
  124236. "lsl r7, r9, #16\n\t"
  124237. "lsr r7, r7, #16\n\t"
  124238. "mul r6, r7, r6\n\t"
  124239. "lsr r7, r6, #16\n\t"
  124240. "lsl r6, r6, #16\n\t"
  124241. "adds r4, r4, r6\n\t"
  124242. "adcs r5, r5, r7\n\t"
  124243. "adc r3, r3, #0\n\t"
  124244. #else
  124245. "umull r6, r7, r8, r9\n\t"
  124246. "adds r4, r4, r6\n\t"
  124247. "adcs r5, r5, r7\n\t"
  124248. "adc r3, r3, #0\n\t"
  124249. #endif
  124250. /* A[1] * B[9] */
  124251. "ldr r8, [%[a], #4]\n\t"
  124252. "ldr r9, [%[b], #36]\n\t"
  124253. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124254. "lsl r6, r8, #16\n\t"
  124255. "lsl r7, r9, #16\n\t"
  124256. "lsr r6, r6, #16\n\t"
  124257. "lsr r7, r7, #16\n\t"
  124258. "mul r7, r6, r7\n\t"
  124259. "adds r4, r4, r7\n\t"
  124260. "adcs r5, r5, #0\n\t"
  124261. "adc r3, r3, #0\n\t"
  124262. "lsr r7, r9, #16\n\t"
  124263. "mul r6, r7, r6\n\t"
  124264. "lsr r7, r6, #16\n\t"
  124265. "lsl r6, r6, #16\n\t"
  124266. "adds r4, r4, r6\n\t"
  124267. "adcs r5, r5, r7\n\t"
  124268. "adc r3, r3, #0\n\t"
  124269. "lsr r6, r8, #16\n\t"
  124270. "lsr r7, r9, #16\n\t"
  124271. "mul r7, r6, r7\n\t"
  124272. "adds r5, r5, r7\n\t"
  124273. "adc r3, r3, #0\n\t"
  124274. "lsl r7, r9, #16\n\t"
  124275. "lsr r7, r7, #16\n\t"
  124276. "mul r6, r7, r6\n\t"
  124277. "lsr r7, r6, #16\n\t"
  124278. "lsl r6, r6, #16\n\t"
  124279. "adds r4, r4, r6\n\t"
  124280. "adcs r5, r5, r7\n\t"
  124281. "adc r3, r3, #0\n\t"
  124282. #else
  124283. "umull r6, r7, r8, r9\n\t"
  124284. "adds r4, r4, r6\n\t"
  124285. "adcs r5, r5, r7\n\t"
  124286. "adc r3, r3, #0\n\t"
  124287. #endif
  124288. /* A[0] * B[10] */
  124289. "ldr r8, [%[a]]\n\t"
  124290. "ldr r9, [%[b], #40]\n\t"
  124291. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124292. "lsl r6, r8, #16\n\t"
  124293. "lsl r7, r9, #16\n\t"
  124294. "lsr r6, r6, #16\n\t"
  124295. "lsr r7, r7, #16\n\t"
  124296. "mul r7, r6, r7\n\t"
  124297. "adds r4, r4, r7\n\t"
  124298. "adcs r5, r5, #0\n\t"
  124299. "adc r3, r3, #0\n\t"
  124300. "lsr r7, r9, #16\n\t"
  124301. "mul r6, r7, r6\n\t"
  124302. "lsr r7, r6, #16\n\t"
  124303. "lsl r6, r6, #16\n\t"
  124304. "adds r4, r4, r6\n\t"
  124305. "adcs r5, r5, r7\n\t"
  124306. "adc r3, r3, #0\n\t"
  124307. "lsr r6, r8, #16\n\t"
  124308. "lsr r7, r9, #16\n\t"
  124309. "mul r7, r6, r7\n\t"
  124310. "adds r5, r5, r7\n\t"
  124311. "adc r3, r3, #0\n\t"
  124312. "lsl r7, r9, #16\n\t"
  124313. "lsr r7, r7, #16\n\t"
  124314. "mul r6, r7, r6\n\t"
  124315. "lsr r7, r6, #16\n\t"
  124316. "lsl r6, r6, #16\n\t"
  124317. "adds r4, r4, r6\n\t"
  124318. "adcs r5, r5, r7\n\t"
  124319. "adc r3, r3, #0\n\t"
  124320. #else
  124321. "umull r6, r7, r8, r9\n\t"
  124322. "adds r4, r4, r6\n\t"
  124323. "adcs r5, r5, r7\n\t"
  124324. "adc r3, r3, #0\n\t"
  124325. #endif
  124326. "str r4, [sp, #40]\n\t"
  124327. /* A[0] * B[11] */
  124328. "ldr r9, [%[b], #44]\n\t"
  124329. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124330. "lsl r6, r8, #16\n\t"
  124331. "lsl r7, r9, #16\n\t"
  124332. "lsr r6, r6, #16\n\t"
  124333. "lsr r7, r7, #16\n\t"
  124334. "mul r7, r6, r7\n\t"
  124335. "adds r5, r5, r7\n\t"
  124336. "adcs r3, r3, #0\n\t"
  124337. "mov r4, #0\n\t"
  124338. "adc r4, r4, #0\n\t"
  124339. "lsr r7, r9, #16\n\t"
  124340. "mul r6, r7, r6\n\t"
  124341. "lsr r7, r6, #16\n\t"
  124342. "lsl r6, r6, #16\n\t"
  124343. "adds r5, r5, r6\n\t"
  124344. "adcs r3, r3, r7\n\t"
  124345. "adc r4, r4, #0\n\t"
  124346. "lsr r6, r8, #16\n\t"
  124347. "lsr r7, r9, #16\n\t"
  124348. "mul r7, r6, r7\n\t"
  124349. "adds r3, r3, r7\n\t"
  124350. "adc r4, r4, #0\n\t"
  124351. "lsl r7, r9, #16\n\t"
  124352. "lsr r7, r7, #16\n\t"
  124353. "mul r6, r7, r6\n\t"
  124354. "lsr r7, r6, #16\n\t"
  124355. "lsl r6, r6, #16\n\t"
  124356. "adds r5, r5, r6\n\t"
  124357. "adcs r3, r3, r7\n\t"
  124358. "adc r4, r4, #0\n\t"
  124359. #else
  124360. "umull r6, r7, r8, r9\n\t"
  124361. "adds r5, r5, r6\n\t"
  124362. "adcs r3, r3, r7\n\t"
  124363. "mov r4, #0\n\t"
  124364. "adc r4, r4, #0\n\t"
  124365. #endif
  124366. /* A[1] * B[10] */
  124367. "ldr r8, [%[a], #4]\n\t"
  124368. "ldr r9, [%[b], #40]\n\t"
  124369. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124370. "lsl r6, r8, #16\n\t"
  124371. "lsl r7, r9, #16\n\t"
  124372. "lsr r6, r6, #16\n\t"
  124373. "lsr r7, r7, #16\n\t"
  124374. "mul r7, r6, r7\n\t"
  124375. "adds r5, r5, r7\n\t"
  124376. "adcs r3, r3, #0\n\t"
  124377. "adc r4, r4, #0\n\t"
  124378. "lsr r7, r9, #16\n\t"
  124379. "mul r6, r7, r6\n\t"
  124380. "lsr r7, r6, #16\n\t"
  124381. "lsl r6, r6, #16\n\t"
  124382. "adds r5, r5, r6\n\t"
  124383. "adcs r3, r3, r7\n\t"
  124384. "adc r4, r4, #0\n\t"
  124385. "lsr r6, r8, #16\n\t"
  124386. "lsr r7, r9, #16\n\t"
  124387. "mul r7, r6, r7\n\t"
  124388. "adds r3, r3, r7\n\t"
  124389. "adc r4, r4, #0\n\t"
  124390. "lsl r7, r9, #16\n\t"
  124391. "lsr r7, r7, #16\n\t"
  124392. "mul r6, r7, r6\n\t"
  124393. "lsr r7, r6, #16\n\t"
  124394. "lsl r6, r6, #16\n\t"
  124395. "adds r5, r5, r6\n\t"
  124396. "adcs r3, r3, r7\n\t"
  124397. "adc r4, r4, #0\n\t"
  124398. #else
  124399. "umull r6, r7, r8, r9\n\t"
  124400. "adds r5, r5, r6\n\t"
  124401. "adcs r3, r3, r7\n\t"
  124402. "adc r4, r4, #0\n\t"
  124403. #endif
  124404. /* A[2] * B[9] */
  124405. "ldr r8, [%[a], #8]\n\t"
  124406. "ldr r9, [%[b], #36]\n\t"
  124407. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124408. "lsl r6, r8, #16\n\t"
  124409. "lsl r7, r9, #16\n\t"
  124410. "lsr r6, r6, #16\n\t"
  124411. "lsr r7, r7, #16\n\t"
  124412. "mul r7, r6, r7\n\t"
  124413. "adds r5, r5, r7\n\t"
  124414. "adcs r3, r3, #0\n\t"
  124415. "adc r4, r4, #0\n\t"
  124416. "lsr r7, r9, #16\n\t"
  124417. "mul r6, r7, r6\n\t"
  124418. "lsr r7, r6, #16\n\t"
  124419. "lsl r6, r6, #16\n\t"
  124420. "adds r5, r5, r6\n\t"
  124421. "adcs r3, r3, r7\n\t"
  124422. "adc r4, r4, #0\n\t"
  124423. "lsr r6, r8, #16\n\t"
  124424. "lsr r7, r9, #16\n\t"
  124425. "mul r7, r6, r7\n\t"
  124426. "adds r3, r3, r7\n\t"
  124427. "adc r4, r4, #0\n\t"
  124428. "lsl r7, r9, #16\n\t"
  124429. "lsr r7, r7, #16\n\t"
  124430. "mul r6, r7, r6\n\t"
  124431. "lsr r7, r6, #16\n\t"
  124432. "lsl r6, r6, #16\n\t"
  124433. "adds r5, r5, r6\n\t"
  124434. "adcs r3, r3, r7\n\t"
  124435. "adc r4, r4, #0\n\t"
  124436. #else
  124437. "umull r6, r7, r8, r9\n\t"
  124438. "adds r5, r5, r6\n\t"
  124439. "adcs r3, r3, r7\n\t"
  124440. "adc r4, r4, #0\n\t"
  124441. #endif
  124442. /* A[3] * B[8] */
  124443. "ldr r8, [%[a], #12]\n\t"
  124444. "ldr r9, [%[b], #32]\n\t"
  124445. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124446. "lsl r6, r8, #16\n\t"
  124447. "lsl r7, r9, #16\n\t"
  124448. "lsr r6, r6, #16\n\t"
  124449. "lsr r7, r7, #16\n\t"
  124450. "mul r7, r6, r7\n\t"
  124451. "adds r5, r5, r7\n\t"
  124452. "adcs r3, r3, #0\n\t"
  124453. "adc r4, r4, #0\n\t"
  124454. "lsr r7, r9, #16\n\t"
  124455. "mul r6, r7, r6\n\t"
  124456. "lsr r7, r6, #16\n\t"
  124457. "lsl r6, r6, #16\n\t"
  124458. "adds r5, r5, r6\n\t"
  124459. "adcs r3, r3, r7\n\t"
  124460. "adc r4, r4, #0\n\t"
  124461. "lsr r6, r8, #16\n\t"
  124462. "lsr r7, r9, #16\n\t"
  124463. "mul r7, r6, r7\n\t"
  124464. "adds r3, r3, r7\n\t"
  124465. "adc r4, r4, #0\n\t"
  124466. "lsl r7, r9, #16\n\t"
  124467. "lsr r7, r7, #16\n\t"
  124468. "mul r6, r7, r6\n\t"
  124469. "lsr r7, r6, #16\n\t"
  124470. "lsl r6, r6, #16\n\t"
  124471. "adds r5, r5, r6\n\t"
  124472. "adcs r3, r3, r7\n\t"
  124473. "adc r4, r4, #0\n\t"
  124474. #else
  124475. "umull r6, r7, r8, r9\n\t"
  124476. "adds r5, r5, r6\n\t"
  124477. "adcs r3, r3, r7\n\t"
  124478. "adc r4, r4, #0\n\t"
  124479. #endif
  124480. /* A[4] * B[7] */
  124481. "ldr r8, [%[a], #16]\n\t"
  124482. "ldr r9, [%[b], #28]\n\t"
  124483. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124484. "lsl r6, r8, #16\n\t"
  124485. "lsl r7, r9, #16\n\t"
  124486. "lsr r6, r6, #16\n\t"
  124487. "lsr r7, r7, #16\n\t"
  124488. "mul r7, r6, r7\n\t"
  124489. "adds r5, r5, r7\n\t"
  124490. "adcs r3, r3, #0\n\t"
  124491. "adc r4, r4, #0\n\t"
  124492. "lsr r7, r9, #16\n\t"
  124493. "mul r6, r7, r6\n\t"
  124494. "lsr r7, r6, #16\n\t"
  124495. "lsl r6, r6, #16\n\t"
  124496. "adds r5, r5, r6\n\t"
  124497. "adcs r3, r3, r7\n\t"
  124498. "adc r4, r4, #0\n\t"
  124499. "lsr r6, r8, #16\n\t"
  124500. "lsr r7, r9, #16\n\t"
  124501. "mul r7, r6, r7\n\t"
  124502. "adds r3, r3, r7\n\t"
  124503. "adc r4, r4, #0\n\t"
  124504. "lsl r7, r9, #16\n\t"
  124505. "lsr r7, r7, #16\n\t"
  124506. "mul r6, r7, r6\n\t"
  124507. "lsr r7, r6, #16\n\t"
  124508. "lsl r6, r6, #16\n\t"
  124509. "adds r5, r5, r6\n\t"
  124510. "adcs r3, r3, r7\n\t"
  124511. "adc r4, r4, #0\n\t"
  124512. #else
  124513. "umull r6, r7, r8, r9\n\t"
  124514. "adds r5, r5, r6\n\t"
  124515. "adcs r3, r3, r7\n\t"
  124516. "adc r4, r4, #0\n\t"
  124517. #endif
  124518. /* A[5] * B[6] */
  124519. "ldr r9, [%[b], #24]\n\t"
  124520. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124521. "lsl r6, r11, #16\n\t"
  124522. "lsl r7, r9, #16\n\t"
  124523. "lsr r6, r6, #16\n\t"
  124524. "lsr r7, r7, #16\n\t"
  124525. "mul r7, r6, r7\n\t"
  124526. "adds r5, r5, r7\n\t"
  124527. "adcs r3, r3, #0\n\t"
  124528. "adc r4, r4, #0\n\t"
  124529. "lsr r7, r9, #16\n\t"
  124530. "mul r6, r7, r6\n\t"
  124531. "lsr r7, r6, #16\n\t"
  124532. "lsl r6, r6, #16\n\t"
  124533. "adds r5, r5, r6\n\t"
  124534. "adcs r3, r3, r7\n\t"
  124535. "adc r4, r4, #0\n\t"
  124536. "lsr r6, r11, #16\n\t"
  124537. "lsr r7, r9, #16\n\t"
  124538. "mul r7, r6, r7\n\t"
  124539. "adds r3, r3, r7\n\t"
  124540. "adc r4, r4, #0\n\t"
  124541. "lsl r7, r9, #16\n\t"
  124542. "lsr r7, r7, #16\n\t"
  124543. "mul r6, r7, r6\n\t"
  124544. "lsr r7, r6, #16\n\t"
  124545. "lsl r6, r6, #16\n\t"
  124546. "adds r5, r5, r6\n\t"
  124547. "adcs r3, r3, r7\n\t"
  124548. "adc r4, r4, #0\n\t"
  124549. #else
  124550. "umull r6, r7, r11, r9\n\t"
  124551. "adds r5, r5, r6\n\t"
  124552. "adcs r3, r3, r7\n\t"
  124553. "adc r4, r4, #0\n\t"
  124554. #endif
  124555. /* A[6] * B[5] */
  124556. "ldr r8, [%[a], #24]\n\t"
  124557. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124558. "lsl r6, r8, #16\n\t"
  124559. "lsl r7, r12, #16\n\t"
  124560. "lsr r6, r6, #16\n\t"
  124561. "lsr r7, r7, #16\n\t"
  124562. "mul r7, r6, r7\n\t"
  124563. "adds r5, r5, r7\n\t"
  124564. "adcs r3, r3, #0\n\t"
  124565. "adc r4, r4, #0\n\t"
  124566. "lsr r7, r12, #16\n\t"
  124567. "mul r6, r7, r6\n\t"
  124568. "lsr r7, r6, #16\n\t"
  124569. "lsl r6, r6, #16\n\t"
  124570. "adds r5, r5, r6\n\t"
  124571. "adcs r3, r3, r7\n\t"
  124572. "adc r4, r4, #0\n\t"
  124573. "lsr r6, r8, #16\n\t"
  124574. "lsr r7, r12, #16\n\t"
  124575. "mul r7, r6, r7\n\t"
  124576. "adds r3, r3, r7\n\t"
  124577. "adc r4, r4, #0\n\t"
  124578. "lsl r7, r12, #16\n\t"
  124579. "lsr r7, r7, #16\n\t"
  124580. "mul r6, r7, r6\n\t"
  124581. "lsr r7, r6, #16\n\t"
  124582. "lsl r6, r6, #16\n\t"
  124583. "adds r5, r5, r6\n\t"
  124584. "adcs r3, r3, r7\n\t"
  124585. "adc r4, r4, #0\n\t"
  124586. #else
  124587. "umull r6, r7, r8, r12\n\t"
  124588. "adds r5, r5, r6\n\t"
  124589. "adcs r3, r3, r7\n\t"
  124590. "adc r4, r4, #0\n\t"
  124591. #endif
  124592. /* A[7] * B[4] */
  124593. "ldr r8, [%[a], #28]\n\t"
  124594. "ldr r9, [%[b], #16]\n\t"
  124595. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124596. "lsl r6, r8, #16\n\t"
  124597. "lsl r7, r9, #16\n\t"
  124598. "lsr r6, r6, #16\n\t"
  124599. "lsr r7, r7, #16\n\t"
  124600. "mul r7, r6, r7\n\t"
  124601. "adds r5, r5, r7\n\t"
  124602. "adcs r3, r3, #0\n\t"
  124603. "adc r4, r4, #0\n\t"
  124604. "lsr r7, r9, #16\n\t"
  124605. "mul r6, r7, r6\n\t"
  124606. "lsr r7, r6, #16\n\t"
  124607. "lsl r6, r6, #16\n\t"
  124608. "adds r5, r5, r6\n\t"
  124609. "adcs r3, r3, r7\n\t"
  124610. "adc r4, r4, #0\n\t"
  124611. "lsr r6, r8, #16\n\t"
  124612. "lsr r7, r9, #16\n\t"
  124613. "mul r7, r6, r7\n\t"
  124614. "adds r3, r3, r7\n\t"
  124615. "adc r4, r4, #0\n\t"
  124616. "lsl r7, r9, #16\n\t"
  124617. "lsr r7, r7, #16\n\t"
  124618. "mul r6, r7, r6\n\t"
  124619. "lsr r7, r6, #16\n\t"
  124620. "lsl r6, r6, #16\n\t"
  124621. "adds r5, r5, r6\n\t"
  124622. "adcs r3, r3, r7\n\t"
  124623. "adc r4, r4, #0\n\t"
  124624. #else
  124625. "umull r6, r7, r8, r9\n\t"
  124626. "adds r5, r5, r6\n\t"
  124627. "adcs r3, r3, r7\n\t"
  124628. "adc r4, r4, #0\n\t"
  124629. #endif
  124630. /* A[8] * B[3] */
  124631. "ldr r8, [%[a], #32]\n\t"
  124632. "ldr r9, [%[b], #12]\n\t"
  124633. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124634. "lsl r6, r8, #16\n\t"
  124635. "lsl r7, r9, #16\n\t"
  124636. "lsr r6, r6, #16\n\t"
  124637. "lsr r7, r7, #16\n\t"
  124638. "mul r7, r6, r7\n\t"
  124639. "adds r5, r5, r7\n\t"
  124640. "adcs r3, r3, #0\n\t"
  124641. "adc r4, r4, #0\n\t"
  124642. "lsr r7, r9, #16\n\t"
  124643. "mul r6, r7, r6\n\t"
  124644. "lsr r7, r6, #16\n\t"
  124645. "lsl r6, r6, #16\n\t"
  124646. "adds r5, r5, r6\n\t"
  124647. "adcs r3, r3, r7\n\t"
  124648. "adc r4, r4, #0\n\t"
  124649. "lsr r6, r8, #16\n\t"
  124650. "lsr r7, r9, #16\n\t"
  124651. "mul r7, r6, r7\n\t"
  124652. "adds r3, r3, r7\n\t"
  124653. "adc r4, r4, #0\n\t"
  124654. "lsl r7, r9, #16\n\t"
  124655. "lsr r7, r7, #16\n\t"
  124656. "mul r6, r7, r6\n\t"
  124657. "lsr r7, r6, #16\n\t"
  124658. "lsl r6, r6, #16\n\t"
  124659. "adds r5, r5, r6\n\t"
  124660. "adcs r3, r3, r7\n\t"
  124661. "adc r4, r4, #0\n\t"
  124662. #else
  124663. "umull r6, r7, r8, r9\n\t"
  124664. "adds r5, r5, r6\n\t"
  124665. "adcs r3, r3, r7\n\t"
  124666. "adc r4, r4, #0\n\t"
  124667. #endif
  124668. /* A[9] * B[2] */
  124669. "ldr r8, [%[a], #36]\n\t"
  124670. "ldr r9, [%[b], #8]\n\t"
  124671. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124672. "lsl r6, r8, #16\n\t"
  124673. "lsl r7, r9, #16\n\t"
  124674. "lsr r6, r6, #16\n\t"
  124675. "lsr r7, r7, #16\n\t"
  124676. "mul r7, r6, r7\n\t"
  124677. "adds r5, r5, r7\n\t"
  124678. "adcs r3, r3, #0\n\t"
  124679. "adc r4, r4, #0\n\t"
  124680. "lsr r7, r9, #16\n\t"
  124681. "mul r6, r7, r6\n\t"
  124682. "lsr r7, r6, #16\n\t"
  124683. "lsl r6, r6, #16\n\t"
  124684. "adds r5, r5, r6\n\t"
  124685. "adcs r3, r3, r7\n\t"
  124686. "adc r4, r4, #0\n\t"
  124687. "lsr r6, r8, #16\n\t"
  124688. "lsr r7, r9, #16\n\t"
  124689. "mul r7, r6, r7\n\t"
  124690. "adds r3, r3, r7\n\t"
  124691. "adc r4, r4, #0\n\t"
  124692. "lsl r7, r9, #16\n\t"
  124693. "lsr r7, r7, #16\n\t"
  124694. "mul r6, r7, r6\n\t"
  124695. "lsr r7, r6, #16\n\t"
  124696. "lsl r6, r6, #16\n\t"
  124697. "adds r5, r5, r6\n\t"
  124698. "adcs r3, r3, r7\n\t"
  124699. "adc r4, r4, #0\n\t"
  124700. #else
  124701. "umull r6, r7, r8, r9\n\t"
  124702. "adds r5, r5, r6\n\t"
  124703. "adcs r3, r3, r7\n\t"
  124704. "adc r4, r4, #0\n\t"
  124705. #endif
  124706. /* A[10] * B[1] */
  124707. "ldr r8, [%[a], #40]\n\t"
  124708. "ldr r9, [%[b], #4]\n\t"
  124709. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124710. "lsl r6, r8, #16\n\t"
  124711. "lsl r7, r9, #16\n\t"
  124712. "lsr r6, r6, #16\n\t"
  124713. "lsr r7, r7, #16\n\t"
  124714. "mul r7, r6, r7\n\t"
  124715. "adds r5, r5, r7\n\t"
  124716. "adcs r3, r3, #0\n\t"
  124717. "adc r4, r4, #0\n\t"
  124718. "lsr r7, r9, #16\n\t"
  124719. "mul r6, r7, r6\n\t"
  124720. "lsr r7, r6, #16\n\t"
  124721. "lsl r6, r6, #16\n\t"
  124722. "adds r5, r5, r6\n\t"
  124723. "adcs r3, r3, r7\n\t"
  124724. "adc r4, r4, #0\n\t"
  124725. "lsr r6, r8, #16\n\t"
  124726. "lsr r7, r9, #16\n\t"
  124727. "mul r7, r6, r7\n\t"
  124728. "adds r3, r3, r7\n\t"
  124729. "adc r4, r4, #0\n\t"
  124730. "lsl r7, r9, #16\n\t"
  124731. "lsr r7, r7, #16\n\t"
  124732. "mul r6, r7, r6\n\t"
  124733. "lsr r7, r6, #16\n\t"
  124734. "lsl r6, r6, #16\n\t"
  124735. "adds r5, r5, r6\n\t"
  124736. "adcs r3, r3, r7\n\t"
  124737. "adc r4, r4, #0\n\t"
  124738. #else
  124739. "umull r6, r7, r8, r9\n\t"
  124740. "adds r5, r5, r6\n\t"
  124741. "adcs r3, r3, r7\n\t"
  124742. "adc r4, r4, #0\n\t"
  124743. #endif
  124744. /* A[11] * B[0] */
  124745. "ldr r8, [%[a], #44]\n\t"
  124746. "ldr r9, [%[b]]\n\t"
  124747. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124748. "lsl r6, r8, #16\n\t"
  124749. "lsl r7, r9, #16\n\t"
  124750. "lsr r6, r6, #16\n\t"
  124751. "lsr r7, r7, #16\n\t"
  124752. "mul r7, r6, r7\n\t"
  124753. "adds r5, r5, r7\n\t"
  124754. "adcs r3, r3, #0\n\t"
  124755. "adc r4, r4, #0\n\t"
  124756. "lsr r7, r9, #16\n\t"
  124757. "mul r6, r7, r6\n\t"
  124758. "lsr r7, r6, #16\n\t"
  124759. "lsl r6, r6, #16\n\t"
  124760. "adds r5, r5, r6\n\t"
  124761. "adcs r3, r3, r7\n\t"
  124762. "adc r4, r4, #0\n\t"
  124763. "lsr r6, r8, #16\n\t"
  124764. "lsr r7, r9, #16\n\t"
  124765. "mul r7, r6, r7\n\t"
  124766. "adds r3, r3, r7\n\t"
  124767. "adc r4, r4, #0\n\t"
  124768. "lsl r7, r9, #16\n\t"
  124769. "lsr r7, r7, #16\n\t"
  124770. "mul r6, r7, r6\n\t"
  124771. "lsr r7, r6, #16\n\t"
  124772. "lsl r6, r6, #16\n\t"
  124773. "adds r5, r5, r6\n\t"
  124774. "adcs r3, r3, r7\n\t"
  124775. "adc r4, r4, #0\n\t"
  124776. #else
  124777. "umull r6, r7, r8, r9\n\t"
  124778. "adds r5, r5, r6\n\t"
  124779. "adcs r3, r3, r7\n\t"
  124780. "adc r4, r4, #0\n\t"
  124781. #endif
  124782. "str r5, [sp, #44]\n\t"
  124783. /* A[12] * B[0] */
  124784. "ldr r8, [%[a], #48]\n\t"
  124785. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124786. "lsl r6, r8, #16\n\t"
  124787. "lsl r7, r9, #16\n\t"
  124788. "lsr r6, r6, #16\n\t"
  124789. "lsr r7, r7, #16\n\t"
  124790. "mul r7, r6, r7\n\t"
  124791. "adds r3, r3, r7\n\t"
  124792. "adcs r4, r4, #0\n\t"
  124793. "mov r5, #0\n\t"
  124794. "adc r5, r5, #0\n\t"
  124795. "lsr r7, r9, #16\n\t"
  124796. "mul r6, r7, r6\n\t"
  124797. "lsr r7, r6, #16\n\t"
  124798. "lsl r6, r6, #16\n\t"
  124799. "adds r3, r3, r6\n\t"
  124800. "adcs r4, r4, r7\n\t"
  124801. "adc r5, r5, #0\n\t"
  124802. "lsr r6, r8, #16\n\t"
  124803. "lsr r7, r9, #16\n\t"
  124804. "mul r7, r6, r7\n\t"
  124805. "adds r4, r4, r7\n\t"
  124806. "adc r5, r5, #0\n\t"
  124807. "lsl r7, r9, #16\n\t"
  124808. "lsr r7, r7, #16\n\t"
  124809. "mul r6, r7, r6\n\t"
  124810. "lsr r7, r6, #16\n\t"
  124811. "lsl r6, r6, #16\n\t"
  124812. "adds r3, r3, r6\n\t"
  124813. "adcs r4, r4, r7\n\t"
  124814. "adc r5, r5, #0\n\t"
  124815. #else
  124816. "umull r6, r7, r8, r9\n\t"
  124817. "adds r3, r3, r6\n\t"
  124818. "adcs r4, r4, r7\n\t"
  124819. "mov r5, #0\n\t"
  124820. "adc r5, r5, #0\n\t"
  124821. #endif
  124822. /* A[11] * B[1] */
  124823. "ldr r8, [%[a], #44]\n\t"
  124824. "ldr r9, [%[b], #4]\n\t"
  124825. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124826. "lsl r6, r8, #16\n\t"
  124827. "lsl r7, r9, #16\n\t"
  124828. "lsr r6, r6, #16\n\t"
  124829. "lsr r7, r7, #16\n\t"
  124830. "mul r7, r6, r7\n\t"
  124831. "adds r3, r3, r7\n\t"
  124832. "adcs r4, r4, #0\n\t"
  124833. "adc r5, r5, #0\n\t"
  124834. "lsr r7, r9, #16\n\t"
  124835. "mul r6, r7, r6\n\t"
  124836. "lsr r7, r6, #16\n\t"
  124837. "lsl r6, r6, #16\n\t"
  124838. "adds r3, r3, r6\n\t"
  124839. "adcs r4, r4, r7\n\t"
  124840. "adc r5, r5, #0\n\t"
  124841. "lsr r6, r8, #16\n\t"
  124842. "lsr r7, r9, #16\n\t"
  124843. "mul r7, r6, r7\n\t"
  124844. "adds r4, r4, r7\n\t"
  124845. "adc r5, r5, #0\n\t"
  124846. "lsl r7, r9, #16\n\t"
  124847. "lsr r7, r7, #16\n\t"
  124848. "mul r6, r7, r6\n\t"
  124849. "lsr r7, r6, #16\n\t"
  124850. "lsl r6, r6, #16\n\t"
  124851. "adds r3, r3, r6\n\t"
  124852. "adcs r4, r4, r7\n\t"
  124853. "adc r5, r5, #0\n\t"
  124854. #else
  124855. "umull r6, r7, r8, r9\n\t"
  124856. "adds r3, r3, r6\n\t"
  124857. "adcs r4, r4, r7\n\t"
  124858. "adc r5, r5, #0\n\t"
  124859. #endif
  124860. /* A[10] * B[2] */
  124861. "ldr r8, [%[a], #40]\n\t"
  124862. "ldr r9, [%[b], #8]\n\t"
  124863. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124864. "lsl r6, r8, #16\n\t"
  124865. "lsl r7, r9, #16\n\t"
  124866. "lsr r6, r6, #16\n\t"
  124867. "lsr r7, r7, #16\n\t"
  124868. "mul r7, r6, r7\n\t"
  124869. "adds r3, r3, r7\n\t"
  124870. "adcs r4, r4, #0\n\t"
  124871. "adc r5, r5, #0\n\t"
  124872. "lsr r7, r9, #16\n\t"
  124873. "mul r6, r7, r6\n\t"
  124874. "lsr r7, r6, #16\n\t"
  124875. "lsl r6, r6, #16\n\t"
  124876. "adds r3, r3, r6\n\t"
  124877. "adcs r4, r4, r7\n\t"
  124878. "adc r5, r5, #0\n\t"
  124879. "lsr r6, r8, #16\n\t"
  124880. "lsr r7, r9, #16\n\t"
  124881. "mul r7, r6, r7\n\t"
  124882. "adds r4, r4, r7\n\t"
  124883. "adc r5, r5, #0\n\t"
  124884. "lsl r7, r9, #16\n\t"
  124885. "lsr r7, r7, #16\n\t"
  124886. "mul r6, r7, r6\n\t"
  124887. "lsr r7, r6, #16\n\t"
  124888. "lsl r6, r6, #16\n\t"
  124889. "adds r3, r3, r6\n\t"
  124890. "adcs r4, r4, r7\n\t"
  124891. "adc r5, r5, #0\n\t"
  124892. #else
  124893. "umull r6, r7, r8, r9\n\t"
  124894. "adds r3, r3, r6\n\t"
  124895. "adcs r4, r4, r7\n\t"
  124896. "adc r5, r5, #0\n\t"
  124897. #endif
  124898. /* A[9] * B[3] */
  124899. "ldr r8, [%[a], #36]\n\t"
  124900. "ldr r9, [%[b], #12]\n\t"
  124901. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124902. "lsl r6, r8, #16\n\t"
  124903. "lsl r7, r9, #16\n\t"
  124904. "lsr r6, r6, #16\n\t"
  124905. "lsr r7, r7, #16\n\t"
  124906. "mul r7, r6, r7\n\t"
  124907. "adds r3, r3, r7\n\t"
  124908. "adcs r4, r4, #0\n\t"
  124909. "adc r5, r5, #0\n\t"
  124910. "lsr r7, r9, #16\n\t"
  124911. "mul r6, r7, r6\n\t"
  124912. "lsr r7, r6, #16\n\t"
  124913. "lsl r6, r6, #16\n\t"
  124914. "adds r3, r3, r6\n\t"
  124915. "adcs r4, r4, r7\n\t"
  124916. "adc r5, r5, #0\n\t"
  124917. "lsr r6, r8, #16\n\t"
  124918. "lsr r7, r9, #16\n\t"
  124919. "mul r7, r6, r7\n\t"
  124920. "adds r4, r4, r7\n\t"
  124921. "adc r5, r5, #0\n\t"
  124922. "lsl r7, r9, #16\n\t"
  124923. "lsr r7, r7, #16\n\t"
  124924. "mul r6, r7, r6\n\t"
  124925. "lsr r7, r6, #16\n\t"
  124926. "lsl r6, r6, #16\n\t"
  124927. "adds r3, r3, r6\n\t"
  124928. "adcs r4, r4, r7\n\t"
  124929. "adc r5, r5, #0\n\t"
  124930. #else
  124931. "umull r6, r7, r8, r9\n\t"
  124932. "adds r3, r3, r6\n\t"
  124933. "adcs r4, r4, r7\n\t"
  124934. "adc r5, r5, #0\n\t"
  124935. #endif
  124936. /* A[8] * B[4] */
  124937. "ldr r8, [%[a], #32]\n\t"
  124938. "ldr r9, [%[b], #16]\n\t"
  124939. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124940. "lsl r6, r8, #16\n\t"
  124941. "lsl r7, r9, #16\n\t"
  124942. "lsr r6, r6, #16\n\t"
  124943. "lsr r7, r7, #16\n\t"
  124944. "mul r7, r6, r7\n\t"
  124945. "adds r3, r3, r7\n\t"
  124946. "adcs r4, r4, #0\n\t"
  124947. "adc r5, r5, #0\n\t"
  124948. "lsr r7, r9, #16\n\t"
  124949. "mul r6, r7, r6\n\t"
  124950. "lsr r7, r6, #16\n\t"
  124951. "lsl r6, r6, #16\n\t"
  124952. "adds r3, r3, r6\n\t"
  124953. "adcs r4, r4, r7\n\t"
  124954. "adc r5, r5, #0\n\t"
  124955. "lsr r6, r8, #16\n\t"
  124956. "lsr r7, r9, #16\n\t"
  124957. "mul r7, r6, r7\n\t"
  124958. "adds r4, r4, r7\n\t"
  124959. "adc r5, r5, #0\n\t"
  124960. "lsl r7, r9, #16\n\t"
  124961. "lsr r7, r7, #16\n\t"
  124962. "mul r6, r7, r6\n\t"
  124963. "lsr r7, r6, #16\n\t"
  124964. "lsl r6, r6, #16\n\t"
  124965. "adds r3, r3, r6\n\t"
  124966. "adcs r4, r4, r7\n\t"
  124967. "adc r5, r5, #0\n\t"
  124968. #else
  124969. "umull r6, r7, r8, r9\n\t"
  124970. "adds r3, r3, r6\n\t"
  124971. "adcs r4, r4, r7\n\t"
  124972. "adc r5, r5, #0\n\t"
  124973. #endif
  124974. /* A[7] * B[5] */
  124975. "ldr r8, [%[a], #28]\n\t"
  124976. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  124977. "lsl r6, r8, #16\n\t"
  124978. "lsl r7, r12, #16\n\t"
  124979. "lsr r6, r6, #16\n\t"
  124980. "lsr r7, r7, #16\n\t"
  124981. "mul r7, r6, r7\n\t"
  124982. "adds r3, r3, r7\n\t"
  124983. "adcs r4, r4, #0\n\t"
  124984. "adc r5, r5, #0\n\t"
  124985. "lsr r7, r12, #16\n\t"
  124986. "mul r6, r7, r6\n\t"
  124987. "lsr r7, r6, #16\n\t"
  124988. "lsl r6, r6, #16\n\t"
  124989. "adds r3, r3, r6\n\t"
  124990. "adcs r4, r4, r7\n\t"
  124991. "adc r5, r5, #0\n\t"
  124992. "lsr r6, r8, #16\n\t"
  124993. "lsr r7, r12, #16\n\t"
  124994. "mul r7, r6, r7\n\t"
  124995. "adds r4, r4, r7\n\t"
  124996. "adc r5, r5, #0\n\t"
  124997. "lsl r7, r12, #16\n\t"
  124998. "lsr r7, r7, #16\n\t"
  124999. "mul r6, r7, r6\n\t"
  125000. "lsr r7, r6, #16\n\t"
  125001. "lsl r6, r6, #16\n\t"
  125002. "adds r3, r3, r6\n\t"
  125003. "adcs r4, r4, r7\n\t"
  125004. "adc r5, r5, #0\n\t"
  125005. #else
  125006. "umull r6, r7, r8, r12\n\t"
  125007. "adds r3, r3, r6\n\t"
  125008. "adcs r4, r4, r7\n\t"
  125009. "adc r5, r5, #0\n\t"
  125010. #endif
  125011. /* A[6] * B[6] */
  125012. "ldr r11, [%[a], #24]\n\t"
  125013. "ldr r12, [%[b], #24]\n\t"
  125014. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125015. "lsl r6, r11, #16\n\t"
  125016. "lsl r7, r12, #16\n\t"
  125017. "lsr r6, r6, #16\n\t"
  125018. "lsr r7, r7, #16\n\t"
  125019. "mul r7, r6, r7\n\t"
  125020. "adds r3, r3, r7\n\t"
  125021. "adcs r4, r4, #0\n\t"
  125022. "adc r5, r5, #0\n\t"
  125023. "lsr r7, r12, #16\n\t"
  125024. "mul r6, r7, r6\n\t"
  125025. "lsr r7, r6, #16\n\t"
  125026. "lsl r6, r6, #16\n\t"
  125027. "adds r3, r3, r6\n\t"
  125028. "adcs r4, r4, r7\n\t"
  125029. "adc r5, r5, #0\n\t"
  125030. "lsr r6, r11, #16\n\t"
  125031. "lsr r7, r12, #16\n\t"
  125032. "mul r7, r6, r7\n\t"
  125033. "adds r4, r4, r7\n\t"
  125034. "adc r5, r5, #0\n\t"
  125035. "lsl r7, r12, #16\n\t"
  125036. "lsr r7, r7, #16\n\t"
  125037. "mul r6, r7, r6\n\t"
  125038. "lsr r7, r6, #16\n\t"
  125039. "lsl r6, r6, #16\n\t"
  125040. "adds r3, r3, r6\n\t"
  125041. "adcs r4, r4, r7\n\t"
  125042. "adc r5, r5, #0\n\t"
  125043. #else
  125044. "umull r6, r7, r11, r12\n\t"
  125045. "adds r3, r3, r6\n\t"
  125046. "adcs r4, r4, r7\n\t"
  125047. "adc r5, r5, #0\n\t"
  125048. #endif
  125049. /* A[5] * B[7] */
  125050. "ldr r8, [%[a], #20]\n\t"
  125051. "ldr r9, [%[b], #28]\n\t"
  125052. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125053. "lsl r6, r8, #16\n\t"
  125054. "lsl r7, r9, #16\n\t"
  125055. "lsr r6, r6, #16\n\t"
  125056. "lsr r7, r7, #16\n\t"
  125057. "mul r7, r6, r7\n\t"
  125058. "adds r3, r3, r7\n\t"
  125059. "adcs r4, r4, #0\n\t"
  125060. "adc r5, r5, #0\n\t"
  125061. "lsr r7, r9, #16\n\t"
  125062. "mul r6, r7, r6\n\t"
  125063. "lsr r7, r6, #16\n\t"
  125064. "lsl r6, r6, #16\n\t"
  125065. "adds r3, r3, r6\n\t"
  125066. "adcs r4, r4, r7\n\t"
  125067. "adc r5, r5, #0\n\t"
  125068. "lsr r6, r8, #16\n\t"
  125069. "lsr r7, r9, #16\n\t"
  125070. "mul r7, r6, r7\n\t"
  125071. "adds r4, r4, r7\n\t"
  125072. "adc r5, r5, #0\n\t"
  125073. "lsl r7, r9, #16\n\t"
  125074. "lsr r7, r7, #16\n\t"
  125075. "mul r6, r7, r6\n\t"
  125076. "lsr r7, r6, #16\n\t"
  125077. "lsl r6, r6, #16\n\t"
  125078. "adds r3, r3, r6\n\t"
  125079. "adcs r4, r4, r7\n\t"
  125080. "adc r5, r5, #0\n\t"
  125081. #else
  125082. "umull r6, r7, r8, r9\n\t"
  125083. "adds r3, r3, r6\n\t"
  125084. "adcs r4, r4, r7\n\t"
  125085. "adc r5, r5, #0\n\t"
  125086. #endif
  125087. /* A[4] * B[8] */
  125088. "ldr r8, [%[a], #16]\n\t"
  125089. "ldr r9, [%[b], #32]\n\t"
  125090. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125091. "lsl r6, r8, #16\n\t"
  125092. "lsl r7, r9, #16\n\t"
  125093. "lsr r6, r6, #16\n\t"
  125094. "lsr r7, r7, #16\n\t"
  125095. "mul r7, r6, r7\n\t"
  125096. "adds r3, r3, r7\n\t"
  125097. "adcs r4, r4, #0\n\t"
  125098. "adc r5, r5, #0\n\t"
  125099. "lsr r7, r9, #16\n\t"
  125100. "mul r6, r7, r6\n\t"
  125101. "lsr r7, r6, #16\n\t"
  125102. "lsl r6, r6, #16\n\t"
  125103. "adds r3, r3, r6\n\t"
  125104. "adcs r4, r4, r7\n\t"
  125105. "adc r5, r5, #0\n\t"
  125106. "lsr r6, r8, #16\n\t"
  125107. "lsr r7, r9, #16\n\t"
  125108. "mul r7, r6, r7\n\t"
  125109. "adds r4, r4, r7\n\t"
  125110. "adc r5, r5, #0\n\t"
  125111. "lsl r7, r9, #16\n\t"
  125112. "lsr r7, r7, #16\n\t"
  125113. "mul r6, r7, r6\n\t"
  125114. "lsr r7, r6, #16\n\t"
  125115. "lsl r6, r6, #16\n\t"
  125116. "adds r3, r3, r6\n\t"
  125117. "adcs r4, r4, r7\n\t"
  125118. "adc r5, r5, #0\n\t"
  125119. #else
  125120. "umull r6, r7, r8, r9\n\t"
  125121. "adds r3, r3, r6\n\t"
  125122. "adcs r4, r4, r7\n\t"
  125123. "adc r5, r5, #0\n\t"
  125124. #endif
  125125. /* A[3] * B[9] */
  125126. "ldr r8, [%[a], #12]\n\t"
  125127. "ldr r9, [%[b], #36]\n\t"
  125128. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125129. "lsl r6, r8, #16\n\t"
  125130. "lsl r7, r9, #16\n\t"
  125131. "lsr r6, r6, #16\n\t"
  125132. "lsr r7, r7, #16\n\t"
  125133. "mul r7, r6, r7\n\t"
  125134. "adds r3, r3, r7\n\t"
  125135. "adcs r4, r4, #0\n\t"
  125136. "adc r5, r5, #0\n\t"
  125137. "lsr r7, r9, #16\n\t"
  125138. "mul r6, r7, r6\n\t"
  125139. "lsr r7, r6, #16\n\t"
  125140. "lsl r6, r6, #16\n\t"
  125141. "adds r3, r3, r6\n\t"
  125142. "adcs r4, r4, r7\n\t"
  125143. "adc r5, r5, #0\n\t"
  125144. "lsr r6, r8, #16\n\t"
  125145. "lsr r7, r9, #16\n\t"
  125146. "mul r7, r6, r7\n\t"
  125147. "adds r4, r4, r7\n\t"
  125148. "adc r5, r5, #0\n\t"
  125149. "lsl r7, r9, #16\n\t"
  125150. "lsr r7, r7, #16\n\t"
  125151. "mul r6, r7, r6\n\t"
  125152. "lsr r7, r6, #16\n\t"
  125153. "lsl r6, r6, #16\n\t"
  125154. "adds r3, r3, r6\n\t"
  125155. "adcs r4, r4, r7\n\t"
  125156. "adc r5, r5, #0\n\t"
  125157. #else
  125158. "umull r6, r7, r8, r9\n\t"
  125159. "adds r3, r3, r6\n\t"
  125160. "adcs r4, r4, r7\n\t"
  125161. "adc r5, r5, #0\n\t"
  125162. #endif
  125163. /* A[2] * B[10] */
  125164. "ldr r8, [%[a], #8]\n\t"
  125165. "ldr r9, [%[b], #40]\n\t"
  125166. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125167. "lsl r6, r8, #16\n\t"
  125168. "lsl r7, r9, #16\n\t"
  125169. "lsr r6, r6, #16\n\t"
  125170. "lsr r7, r7, #16\n\t"
  125171. "mul r7, r6, r7\n\t"
  125172. "adds r3, r3, r7\n\t"
  125173. "adcs r4, r4, #0\n\t"
  125174. "adc r5, r5, #0\n\t"
  125175. "lsr r7, r9, #16\n\t"
  125176. "mul r6, r7, r6\n\t"
  125177. "lsr r7, r6, #16\n\t"
  125178. "lsl r6, r6, #16\n\t"
  125179. "adds r3, r3, r6\n\t"
  125180. "adcs r4, r4, r7\n\t"
  125181. "adc r5, r5, #0\n\t"
  125182. "lsr r6, r8, #16\n\t"
  125183. "lsr r7, r9, #16\n\t"
  125184. "mul r7, r6, r7\n\t"
  125185. "adds r4, r4, r7\n\t"
  125186. "adc r5, r5, #0\n\t"
  125187. "lsl r7, r9, #16\n\t"
  125188. "lsr r7, r7, #16\n\t"
  125189. "mul r6, r7, r6\n\t"
  125190. "lsr r7, r6, #16\n\t"
  125191. "lsl r6, r6, #16\n\t"
  125192. "adds r3, r3, r6\n\t"
  125193. "adcs r4, r4, r7\n\t"
  125194. "adc r5, r5, #0\n\t"
  125195. #else
  125196. "umull r6, r7, r8, r9\n\t"
  125197. "adds r3, r3, r6\n\t"
  125198. "adcs r4, r4, r7\n\t"
  125199. "adc r5, r5, #0\n\t"
  125200. #endif
  125201. /* A[1] * B[11] */
  125202. "ldr r8, [%[a], #4]\n\t"
  125203. "ldr r9, [%[b], #44]\n\t"
  125204. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125205. "lsl r6, r8, #16\n\t"
  125206. "lsl r7, r9, #16\n\t"
  125207. "lsr r6, r6, #16\n\t"
  125208. "lsr r7, r7, #16\n\t"
  125209. "mul r7, r6, r7\n\t"
  125210. "adds r3, r3, r7\n\t"
  125211. "adcs r4, r4, #0\n\t"
  125212. "adc r5, r5, #0\n\t"
  125213. "lsr r7, r9, #16\n\t"
  125214. "mul r6, r7, r6\n\t"
  125215. "lsr r7, r6, #16\n\t"
  125216. "lsl r6, r6, #16\n\t"
  125217. "adds r3, r3, r6\n\t"
  125218. "adcs r4, r4, r7\n\t"
  125219. "adc r5, r5, #0\n\t"
  125220. "lsr r6, r8, #16\n\t"
  125221. "lsr r7, r9, #16\n\t"
  125222. "mul r7, r6, r7\n\t"
  125223. "adds r4, r4, r7\n\t"
  125224. "adc r5, r5, #0\n\t"
  125225. "lsl r7, r9, #16\n\t"
  125226. "lsr r7, r7, #16\n\t"
  125227. "mul r6, r7, r6\n\t"
  125228. "lsr r7, r6, #16\n\t"
  125229. "lsl r6, r6, #16\n\t"
  125230. "adds r3, r3, r6\n\t"
  125231. "adcs r4, r4, r7\n\t"
  125232. "adc r5, r5, #0\n\t"
  125233. #else
  125234. "umull r6, r7, r8, r9\n\t"
  125235. "adds r3, r3, r6\n\t"
  125236. "adcs r4, r4, r7\n\t"
  125237. "adc r5, r5, #0\n\t"
  125238. #endif
  125239. /* A[0] * B[12] */
  125240. "ldr r8, [%[a]]\n\t"
  125241. "ldr r9, [%[b], #48]\n\t"
  125242. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125243. "lsl r6, r8, #16\n\t"
  125244. "lsl r7, r9, #16\n\t"
  125245. "lsr r6, r6, #16\n\t"
  125246. "lsr r7, r7, #16\n\t"
  125247. "mul r7, r6, r7\n\t"
  125248. "adds r3, r3, r7\n\t"
  125249. "adcs r4, r4, #0\n\t"
  125250. "adc r5, r5, #0\n\t"
  125251. "lsr r7, r9, #16\n\t"
  125252. "mul r6, r7, r6\n\t"
  125253. "lsr r7, r6, #16\n\t"
  125254. "lsl r6, r6, #16\n\t"
  125255. "adds r3, r3, r6\n\t"
  125256. "adcs r4, r4, r7\n\t"
  125257. "adc r5, r5, #0\n\t"
  125258. "lsr r6, r8, #16\n\t"
  125259. "lsr r7, r9, #16\n\t"
  125260. "mul r7, r6, r7\n\t"
  125261. "adds r4, r4, r7\n\t"
  125262. "adc r5, r5, #0\n\t"
  125263. "lsl r7, r9, #16\n\t"
  125264. "lsr r7, r7, #16\n\t"
  125265. "mul r6, r7, r6\n\t"
  125266. "lsr r7, r6, #16\n\t"
  125267. "lsl r6, r6, #16\n\t"
  125268. "adds r3, r3, r6\n\t"
  125269. "adcs r4, r4, r7\n\t"
  125270. "adc r5, r5, #0\n\t"
  125271. #else
  125272. "umull r6, r7, r8, r9\n\t"
  125273. "adds r3, r3, r6\n\t"
  125274. "adcs r4, r4, r7\n\t"
  125275. "adc r5, r5, #0\n\t"
  125276. #endif
  125277. "str r3, [sp, #48]\n\t"
  125278. /* A[0] * B[13] */
  125279. "ldr r9, [%[b], #52]\n\t"
  125280. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125281. "lsl r6, r8, #16\n\t"
  125282. "lsl r7, r9, #16\n\t"
  125283. "lsr r6, r6, #16\n\t"
  125284. "lsr r7, r7, #16\n\t"
  125285. "mul r7, r6, r7\n\t"
  125286. "adds r4, r4, r7\n\t"
  125287. "adcs r5, r5, #0\n\t"
  125288. "mov r3, #0\n\t"
  125289. "adc r3, r3, #0\n\t"
  125290. "lsr r7, r9, #16\n\t"
  125291. "mul r6, r7, r6\n\t"
  125292. "lsr r7, r6, #16\n\t"
  125293. "lsl r6, r6, #16\n\t"
  125294. "adds r4, r4, r6\n\t"
  125295. "adcs r5, r5, r7\n\t"
  125296. "adc r3, r3, #0\n\t"
  125297. "lsr r6, r8, #16\n\t"
  125298. "lsr r7, r9, #16\n\t"
  125299. "mul r7, r6, r7\n\t"
  125300. "adds r5, r5, r7\n\t"
  125301. "adc r3, r3, #0\n\t"
  125302. "lsl r7, r9, #16\n\t"
  125303. "lsr r7, r7, #16\n\t"
  125304. "mul r6, r7, r6\n\t"
  125305. "lsr r7, r6, #16\n\t"
  125306. "lsl r6, r6, #16\n\t"
  125307. "adds r4, r4, r6\n\t"
  125308. "adcs r5, r5, r7\n\t"
  125309. "adc r3, r3, #0\n\t"
  125310. #else
  125311. "umull r6, r7, r8, r9\n\t"
  125312. "adds r4, r4, r6\n\t"
  125313. "adcs r5, r5, r7\n\t"
  125314. "mov r3, #0\n\t"
  125315. "adc r3, r3, #0\n\t"
  125316. #endif
  125317. /* A[1] * B[12] */
  125318. "ldr r8, [%[a], #4]\n\t"
  125319. "ldr r9, [%[b], #48]\n\t"
  125320. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125321. "lsl r6, r8, #16\n\t"
  125322. "lsl r7, r9, #16\n\t"
  125323. "lsr r6, r6, #16\n\t"
  125324. "lsr r7, r7, #16\n\t"
  125325. "mul r7, r6, r7\n\t"
  125326. "adds r4, r4, r7\n\t"
  125327. "adcs r5, r5, #0\n\t"
  125328. "adc r3, r3, #0\n\t"
  125329. "lsr r7, r9, #16\n\t"
  125330. "mul r6, r7, r6\n\t"
  125331. "lsr r7, r6, #16\n\t"
  125332. "lsl r6, r6, #16\n\t"
  125333. "adds r4, r4, r6\n\t"
  125334. "adcs r5, r5, r7\n\t"
  125335. "adc r3, r3, #0\n\t"
  125336. "lsr r6, r8, #16\n\t"
  125337. "lsr r7, r9, #16\n\t"
  125338. "mul r7, r6, r7\n\t"
  125339. "adds r5, r5, r7\n\t"
  125340. "adc r3, r3, #0\n\t"
  125341. "lsl r7, r9, #16\n\t"
  125342. "lsr r7, r7, #16\n\t"
  125343. "mul r6, r7, r6\n\t"
  125344. "lsr r7, r6, #16\n\t"
  125345. "lsl r6, r6, #16\n\t"
  125346. "adds r4, r4, r6\n\t"
  125347. "adcs r5, r5, r7\n\t"
  125348. "adc r3, r3, #0\n\t"
  125349. #else
  125350. "umull r6, r7, r8, r9\n\t"
  125351. "adds r4, r4, r6\n\t"
  125352. "adcs r5, r5, r7\n\t"
  125353. "adc r3, r3, #0\n\t"
  125354. #endif
  125355. /* A[2] * B[11] */
  125356. "ldr r8, [%[a], #8]\n\t"
  125357. "ldr r9, [%[b], #44]\n\t"
  125358. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125359. "lsl r6, r8, #16\n\t"
  125360. "lsl r7, r9, #16\n\t"
  125361. "lsr r6, r6, #16\n\t"
  125362. "lsr r7, r7, #16\n\t"
  125363. "mul r7, r6, r7\n\t"
  125364. "adds r4, r4, r7\n\t"
  125365. "adcs r5, r5, #0\n\t"
  125366. "adc r3, r3, #0\n\t"
  125367. "lsr r7, r9, #16\n\t"
  125368. "mul r6, r7, r6\n\t"
  125369. "lsr r7, r6, #16\n\t"
  125370. "lsl r6, r6, #16\n\t"
  125371. "adds r4, r4, r6\n\t"
  125372. "adcs r5, r5, r7\n\t"
  125373. "adc r3, r3, #0\n\t"
  125374. "lsr r6, r8, #16\n\t"
  125375. "lsr r7, r9, #16\n\t"
  125376. "mul r7, r6, r7\n\t"
  125377. "adds r5, r5, r7\n\t"
  125378. "adc r3, r3, #0\n\t"
  125379. "lsl r7, r9, #16\n\t"
  125380. "lsr r7, r7, #16\n\t"
  125381. "mul r6, r7, r6\n\t"
  125382. "lsr r7, r6, #16\n\t"
  125383. "lsl r6, r6, #16\n\t"
  125384. "adds r4, r4, r6\n\t"
  125385. "adcs r5, r5, r7\n\t"
  125386. "adc r3, r3, #0\n\t"
  125387. #else
  125388. "umull r6, r7, r8, r9\n\t"
  125389. "adds r4, r4, r6\n\t"
  125390. "adcs r5, r5, r7\n\t"
  125391. "adc r3, r3, #0\n\t"
  125392. #endif
  125393. /* A[3] * B[10] */
  125394. "ldr r8, [%[a], #12]\n\t"
  125395. "ldr r9, [%[b], #40]\n\t"
  125396. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125397. "lsl r6, r8, #16\n\t"
  125398. "lsl r7, r9, #16\n\t"
  125399. "lsr r6, r6, #16\n\t"
  125400. "lsr r7, r7, #16\n\t"
  125401. "mul r7, r6, r7\n\t"
  125402. "adds r4, r4, r7\n\t"
  125403. "adcs r5, r5, #0\n\t"
  125404. "adc r3, r3, #0\n\t"
  125405. "lsr r7, r9, #16\n\t"
  125406. "mul r6, r7, r6\n\t"
  125407. "lsr r7, r6, #16\n\t"
  125408. "lsl r6, r6, #16\n\t"
  125409. "adds r4, r4, r6\n\t"
  125410. "adcs r5, r5, r7\n\t"
  125411. "adc r3, r3, #0\n\t"
  125412. "lsr r6, r8, #16\n\t"
  125413. "lsr r7, r9, #16\n\t"
  125414. "mul r7, r6, r7\n\t"
  125415. "adds r5, r5, r7\n\t"
  125416. "adc r3, r3, #0\n\t"
  125417. "lsl r7, r9, #16\n\t"
  125418. "lsr r7, r7, #16\n\t"
  125419. "mul r6, r7, r6\n\t"
  125420. "lsr r7, r6, #16\n\t"
  125421. "lsl r6, r6, #16\n\t"
  125422. "adds r4, r4, r6\n\t"
  125423. "adcs r5, r5, r7\n\t"
  125424. "adc r3, r3, #0\n\t"
  125425. #else
  125426. "umull r6, r7, r8, r9\n\t"
  125427. "adds r4, r4, r6\n\t"
  125428. "adcs r5, r5, r7\n\t"
  125429. "adc r3, r3, #0\n\t"
  125430. #endif
  125431. /* A[4] * B[9] */
  125432. "ldr r8, [%[a], #16]\n\t"
  125433. "ldr r9, [%[b], #36]\n\t"
  125434. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125435. "lsl r6, r8, #16\n\t"
  125436. "lsl r7, r9, #16\n\t"
  125437. "lsr r6, r6, #16\n\t"
  125438. "lsr r7, r7, #16\n\t"
  125439. "mul r7, r6, r7\n\t"
  125440. "adds r4, r4, r7\n\t"
  125441. "adcs r5, r5, #0\n\t"
  125442. "adc r3, r3, #0\n\t"
  125443. "lsr r7, r9, #16\n\t"
  125444. "mul r6, r7, r6\n\t"
  125445. "lsr r7, r6, #16\n\t"
  125446. "lsl r6, r6, #16\n\t"
  125447. "adds r4, r4, r6\n\t"
  125448. "adcs r5, r5, r7\n\t"
  125449. "adc r3, r3, #0\n\t"
  125450. "lsr r6, r8, #16\n\t"
  125451. "lsr r7, r9, #16\n\t"
  125452. "mul r7, r6, r7\n\t"
  125453. "adds r5, r5, r7\n\t"
  125454. "adc r3, r3, #0\n\t"
  125455. "lsl r7, r9, #16\n\t"
  125456. "lsr r7, r7, #16\n\t"
  125457. "mul r6, r7, r6\n\t"
  125458. "lsr r7, r6, #16\n\t"
  125459. "lsl r6, r6, #16\n\t"
  125460. "adds r4, r4, r6\n\t"
  125461. "adcs r5, r5, r7\n\t"
  125462. "adc r3, r3, #0\n\t"
  125463. #else
  125464. "umull r6, r7, r8, r9\n\t"
  125465. "adds r4, r4, r6\n\t"
  125466. "adcs r5, r5, r7\n\t"
  125467. "adc r3, r3, #0\n\t"
  125468. #endif
  125469. /* A[5] * B[8] */
  125470. "ldr r8, [%[a], #20]\n\t"
  125471. "ldr r9, [%[b], #32]\n\t"
  125472. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125473. "lsl r6, r8, #16\n\t"
  125474. "lsl r7, r9, #16\n\t"
  125475. "lsr r6, r6, #16\n\t"
  125476. "lsr r7, r7, #16\n\t"
  125477. "mul r7, r6, r7\n\t"
  125478. "adds r4, r4, r7\n\t"
  125479. "adcs r5, r5, #0\n\t"
  125480. "adc r3, r3, #0\n\t"
  125481. "lsr r7, r9, #16\n\t"
  125482. "mul r6, r7, r6\n\t"
  125483. "lsr r7, r6, #16\n\t"
  125484. "lsl r6, r6, #16\n\t"
  125485. "adds r4, r4, r6\n\t"
  125486. "adcs r5, r5, r7\n\t"
  125487. "adc r3, r3, #0\n\t"
  125488. "lsr r6, r8, #16\n\t"
  125489. "lsr r7, r9, #16\n\t"
  125490. "mul r7, r6, r7\n\t"
  125491. "adds r5, r5, r7\n\t"
  125492. "adc r3, r3, #0\n\t"
  125493. "lsl r7, r9, #16\n\t"
  125494. "lsr r7, r7, #16\n\t"
  125495. "mul r6, r7, r6\n\t"
  125496. "lsr r7, r6, #16\n\t"
  125497. "lsl r6, r6, #16\n\t"
  125498. "adds r4, r4, r6\n\t"
  125499. "adcs r5, r5, r7\n\t"
  125500. "adc r3, r3, #0\n\t"
  125501. #else
  125502. "umull r6, r7, r8, r9\n\t"
  125503. "adds r4, r4, r6\n\t"
  125504. "adcs r5, r5, r7\n\t"
  125505. "adc r3, r3, #0\n\t"
  125506. #endif
  125507. /* A[6] * B[7] */
  125508. "ldr r9, [%[b], #28]\n\t"
  125509. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125510. "lsl r6, r11, #16\n\t"
  125511. "lsl r7, r9, #16\n\t"
  125512. "lsr r6, r6, #16\n\t"
  125513. "lsr r7, r7, #16\n\t"
  125514. "mul r7, r6, r7\n\t"
  125515. "adds r4, r4, r7\n\t"
  125516. "adcs r5, r5, #0\n\t"
  125517. "adc r3, r3, #0\n\t"
  125518. "lsr r7, r9, #16\n\t"
  125519. "mul r6, r7, r6\n\t"
  125520. "lsr r7, r6, #16\n\t"
  125521. "lsl r6, r6, #16\n\t"
  125522. "adds r4, r4, r6\n\t"
  125523. "adcs r5, r5, r7\n\t"
  125524. "adc r3, r3, #0\n\t"
  125525. "lsr r6, r11, #16\n\t"
  125526. "lsr r7, r9, #16\n\t"
  125527. "mul r7, r6, r7\n\t"
  125528. "adds r5, r5, r7\n\t"
  125529. "adc r3, r3, #0\n\t"
  125530. "lsl r7, r9, #16\n\t"
  125531. "lsr r7, r7, #16\n\t"
  125532. "mul r6, r7, r6\n\t"
  125533. "lsr r7, r6, #16\n\t"
  125534. "lsl r6, r6, #16\n\t"
  125535. "adds r4, r4, r6\n\t"
  125536. "adcs r5, r5, r7\n\t"
  125537. "adc r3, r3, #0\n\t"
  125538. #else
  125539. "umull r6, r7, r11, r9\n\t"
  125540. "adds r4, r4, r6\n\t"
  125541. "adcs r5, r5, r7\n\t"
  125542. "adc r3, r3, #0\n\t"
  125543. #endif
  125544. /* A[7] * B[6] */
  125545. "ldr r8, [%[a], #28]\n\t"
  125546. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125547. "lsl r6, r8, #16\n\t"
  125548. "lsl r7, r12, #16\n\t"
  125549. "lsr r6, r6, #16\n\t"
  125550. "lsr r7, r7, #16\n\t"
  125551. "mul r7, r6, r7\n\t"
  125552. "adds r4, r4, r7\n\t"
  125553. "adcs r5, r5, #0\n\t"
  125554. "adc r3, r3, #0\n\t"
  125555. "lsr r7, r12, #16\n\t"
  125556. "mul r6, r7, r6\n\t"
  125557. "lsr r7, r6, #16\n\t"
  125558. "lsl r6, r6, #16\n\t"
  125559. "adds r4, r4, r6\n\t"
  125560. "adcs r5, r5, r7\n\t"
  125561. "adc r3, r3, #0\n\t"
  125562. "lsr r6, r8, #16\n\t"
  125563. "lsr r7, r12, #16\n\t"
  125564. "mul r7, r6, r7\n\t"
  125565. "adds r5, r5, r7\n\t"
  125566. "adc r3, r3, #0\n\t"
  125567. "lsl r7, r12, #16\n\t"
  125568. "lsr r7, r7, #16\n\t"
  125569. "mul r6, r7, r6\n\t"
  125570. "lsr r7, r6, #16\n\t"
  125571. "lsl r6, r6, #16\n\t"
  125572. "adds r4, r4, r6\n\t"
  125573. "adcs r5, r5, r7\n\t"
  125574. "adc r3, r3, #0\n\t"
  125575. #else
  125576. "umull r6, r7, r8, r12\n\t"
  125577. "adds r4, r4, r6\n\t"
  125578. "adcs r5, r5, r7\n\t"
  125579. "adc r3, r3, #0\n\t"
  125580. #endif
  125581. /* A[8] * B[5] */
  125582. "ldr r8, [%[a], #32]\n\t"
  125583. "ldr r9, [%[b], #20]\n\t"
  125584. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125585. "lsl r6, r8, #16\n\t"
  125586. "lsl r7, r9, #16\n\t"
  125587. "lsr r6, r6, #16\n\t"
  125588. "lsr r7, r7, #16\n\t"
  125589. "mul r7, r6, r7\n\t"
  125590. "adds r4, r4, r7\n\t"
  125591. "adcs r5, r5, #0\n\t"
  125592. "adc r3, r3, #0\n\t"
  125593. "lsr r7, r9, #16\n\t"
  125594. "mul r6, r7, r6\n\t"
  125595. "lsr r7, r6, #16\n\t"
  125596. "lsl r6, r6, #16\n\t"
  125597. "adds r4, r4, r6\n\t"
  125598. "adcs r5, r5, r7\n\t"
  125599. "adc r3, r3, #0\n\t"
  125600. "lsr r6, r8, #16\n\t"
  125601. "lsr r7, r9, #16\n\t"
  125602. "mul r7, r6, r7\n\t"
  125603. "adds r5, r5, r7\n\t"
  125604. "adc r3, r3, #0\n\t"
  125605. "lsl r7, r9, #16\n\t"
  125606. "lsr r7, r7, #16\n\t"
  125607. "mul r6, r7, r6\n\t"
  125608. "lsr r7, r6, #16\n\t"
  125609. "lsl r6, r6, #16\n\t"
  125610. "adds r4, r4, r6\n\t"
  125611. "adcs r5, r5, r7\n\t"
  125612. "adc r3, r3, #0\n\t"
  125613. #else
  125614. "umull r6, r7, r8, r9\n\t"
  125615. "adds r4, r4, r6\n\t"
  125616. "adcs r5, r5, r7\n\t"
  125617. "adc r3, r3, #0\n\t"
  125618. #endif
  125619. /* A[9] * B[4] */
  125620. "ldr r8, [%[a], #36]\n\t"
  125621. "ldr r9, [%[b], #16]\n\t"
  125622. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125623. "lsl r6, r8, #16\n\t"
  125624. "lsl r7, r9, #16\n\t"
  125625. "lsr r6, r6, #16\n\t"
  125626. "lsr r7, r7, #16\n\t"
  125627. "mul r7, r6, r7\n\t"
  125628. "adds r4, r4, r7\n\t"
  125629. "adcs r5, r5, #0\n\t"
  125630. "adc r3, r3, #0\n\t"
  125631. "lsr r7, r9, #16\n\t"
  125632. "mul r6, r7, r6\n\t"
  125633. "lsr r7, r6, #16\n\t"
  125634. "lsl r6, r6, #16\n\t"
  125635. "adds r4, r4, r6\n\t"
  125636. "adcs r5, r5, r7\n\t"
  125637. "adc r3, r3, #0\n\t"
  125638. "lsr r6, r8, #16\n\t"
  125639. "lsr r7, r9, #16\n\t"
  125640. "mul r7, r6, r7\n\t"
  125641. "adds r5, r5, r7\n\t"
  125642. "adc r3, r3, #0\n\t"
  125643. "lsl r7, r9, #16\n\t"
  125644. "lsr r7, r7, #16\n\t"
  125645. "mul r6, r7, r6\n\t"
  125646. "lsr r7, r6, #16\n\t"
  125647. "lsl r6, r6, #16\n\t"
  125648. "adds r4, r4, r6\n\t"
  125649. "adcs r5, r5, r7\n\t"
  125650. "adc r3, r3, #0\n\t"
  125651. #else
  125652. "umull r6, r7, r8, r9\n\t"
  125653. "adds r4, r4, r6\n\t"
  125654. "adcs r5, r5, r7\n\t"
  125655. "adc r3, r3, #0\n\t"
  125656. #endif
  125657. /* A[10] * B[3] */
  125658. "ldr r8, [%[a], #40]\n\t"
  125659. "ldr r9, [%[b], #12]\n\t"
  125660. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125661. "lsl r6, r8, #16\n\t"
  125662. "lsl r7, r9, #16\n\t"
  125663. "lsr r6, r6, #16\n\t"
  125664. "lsr r7, r7, #16\n\t"
  125665. "mul r7, r6, r7\n\t"
  125666. "adds r4, r4, r7\n\t"
  125667. "adcs r5, r5, #0\n\t"
  125668. "adc r3, r3, #0\n\t"
  125669. "lsr r7, r9, #16\n\t"
  125670. "mul r6, r7, r6\n\t"
  125671. "lsr r7, r6, #16\n\t"
  125672. "lsl r6, r6, #16\n\t"
  125673. "adds r4, r4, r6\n\t"
  125674. "adcs r5, r5, r7\n\t"
  125675. "adc r3, r3, #0\n\t"
  125676. "lsr r6, r8, #16\n\t"
  125677. "lsr r7, r9, #16\n\t"
  125678. "mul r7, r6, r7\n\t"
  125679. "adds r5, r5, r7\n\t"
  125680. "adc r3, r3, #0\n\t"
  125681. "lsl r7, r9, #16\n\t"
  125682. "lsr r7, r7, #16\n\t"
  125683. "mul r6, r7, r6\n\t"
  125684. "lsr r7, r6, #16\n\t"
  125685. "lsl r6, r6, #16\n\t"
  125686. "adds r4, r4, r6\n\t"
  125687. "adcs r5, r5, r7\n\t"
  125688. "adc r3, r3, #0\n\t"
  125689. #else
  125690. "umull r6, r7, r8, r9\n\t"
  125691. "adds r4, r4, r6\n\t"
  125692. "adcs r5, r5, r7\n\t"
  125693. "adc r3, r3, #0\n\t"
  125694. #endif
  125695. /* A[11] * B[2] */
  125696. "ldr r8, [%[a], #44]\n\t"
  125697. "ldr r9, [%[b], #8]\n\t"
  125698. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125699. "lsl r6, r8, #16\n\t"
  125700. "lsl r7, r9, #16\n\t"
  125701. "lsr r6, r6, #16\n\t"
  125702. "lsr r7, r7, #16\n\t"
  125703. "mul r7, r6, r7\n\t"
  125704. "adds r4, r4, r7\n\t"
  125705. "adcs r5, r5, #0\n\t"
  125706. "adc r3, r3, #0\n\t"
  125707. "lsr r7, r9, #16\n\t"
  125708. "mul r6, r7, r6\n\t"
  125709. "lsr r7, r6, #16\n\t"
  125710. "lsl r6, r6, #16\n\t"
  125711. "adds r4, r4, r6\n\t"
  125712. "adcs r5, r5, r7\n\t"
  125713. "adc r3, r3, #0\n\t"
  125714. "lsr r6, r8, #16\n\t"
  125715. "lsr r7, r9, #16\n\t"
  125716. "mul r7, r6, r7\n\t"
  125717. "adds r5, r5, r7\n\t"
  125718. "adc r3, r3, #0\n\t"
  125719. "lsl r7, r9, #16\n\t"
  125720. "lsr r7, r7, #16\n\t"
  125721. "mul r6, r7, r6\n\t"
  125722. "lsr r7, r6, #16\n\t"
  125723. "lsl r6, r6, #16\n\t"
  125724. "adds r4, r4, r6\n\t"
  125725. "adcs r5, r5, r7\n\t"
  125726. "adc r3, r3, #0\n\t"
  125727. #else
  125728. "umull r6, r7, r8, r9\n\t"
  125729. "adds r4, r4, r6\n\t"
  125730. "adcs r5, r5, r7\n\t"
  125731. "adc r3, r3, #0\n\t"
  125732. #endif
  125733. /* A[12] * B[1] */
  125734. "ldr r8, [%[a], #48]\n\t"
  125735. "ldr r9, [%[b], #4]\n\t"
  125736. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125737. "lsl r6, r8, #16\n\t"
  125738. "lsl r7, r9, #16\n\t"
  125739. "lsr r6, r6, #16\n\t"
  125740. "lsr r7, r7, #16\n\t"
  125741. "mul r7, r6, r7\n\t"
  125742. "adds r4, r4, r7\n\t"
  125743. "adcs r5, r5, #0\n\t"
  125744. "adc r3, r3, #0\n\t"
  125745. "lsr r7, r9, #16\n\t"
  125746. "mul r6, r7, r6\n\t"
  125747. "lsr r7, r6, #16\n\t"
  125748. "lsl r6, r6, #16\n\t"
  125749. "adds r4, r4, r6\n\t"
  125750. "adcs r5, r5, r7\n\t"
  125751. "adc r3, r3, #0\n\t"
  125752. "lsr r6, r8, #16\n\t"
  125753. "lsr r7, r9, #16\n\t"
  125754. "mul r7, r6, r7\n\t"
  125755. "adds r5, r5, r7\n\t"
  125756. "adc r3, r3, #0\n\t"
  125757. "lsl r7, r9, #16\n\t"
  125758. "lsr r7, r7, #16\n\t"
  125759. "mul r6, r7, r6\n\t"
  125760. "lsr r7, r6, #16\n\t"
  125761. "lsl r6, r6, #16\n\t"
  125762. "adds r4, r4, r6\n\t"
  125763. "adcs r5, r5, r7\n\t"
  125764. "adc r3, r3, #0\n\t"
  125765. #else
  125766. "umull r6, r7, r8, r9\n\t"
  125767. "adds r4, r4, r6\n\t"
  125768. "adcs r5, r5, r7\n\t"
  125769. "adc r3, r3, #0\n\t"
  125770. #endif
  125771. /* A[13] * B[0] */
  125772. "ldr r8, [%[a], #52]\n\t"
  125773. "ldr r9, [%[b]]\n\t"
  125774. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125775. "lsl r6, r8, #16\n\t"
  125776. "lsl r7, r9, #16\n\t"
  125777. "lsr r6, r6, #16\n\t"
  125778. "lsr r7, r7, #16\n\t"
  125779. "mul r7, r6, r7\n\t"
  125780. "adds r4, r4, r7\n\t"
  125781. "adcs r5, r5, #0\n\t"
  125782. "adc r3, r3, #0\n\t"
  125783. "lsr r7, r9, #16\n\t"
  125784. "mul r6, r7, r6\n\t"
  125785. "lsr r7, r6, #16\n\t"
  125786. "lsl r6, r6, #16\n\t"
  125787. "adds r4, r4, r6\n\t"
  125788. "adcs r5, r5, r7\n\t"
  125789. "adc r3, r3, #0\n\t"
  125790. "lsr r6, r8, #16\n\t"
  125791. "lsr r7, r9, #16\n\t"
  125792. "mul r7, r6, r7\n\t"
  125793. "adds r5, r5, r7\n\t"
  125794. "adc r3, r3, #0\n\t"
  125795. "lsl r7, r9, #16\n\t"
  125796. "lsr r7, r7, #16\n\t"
  125797. "mul r6, r7, r6\n\t"
  125798. "lsr r7, r6, #16\n\t"
  125799. "lsl r6, r6, #16\n\t"
  125800. "adds r4, r4, r6\n\t"
  125801. "adcs r5, r5, r7\n\t"
  125802. "adc r3, r3, #0\n\t"
  125803. #else
  125804. "umull r6, r7, r8, r9\n\t"
  125805. "adds r4, r4, r6\n\t"
  125806. "adcs r5, r5, r7\n\t"
  125807. "adc r3, r3, #0\n\t"
  125808. #endif
  125809. "str r4, [sp, #52]\n\t"
  125810. /* A[14] * B[0] */
  125811. "ldr r8, [%[a], #56]\n\t"
  125812. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125813. "lsl r6, r8, #16\n\t"
  125814. "lsl r7, r9, #16\n\t"
  125815. "lsr r6, r6, #16\n\t"
  125816. "lsr r7, r7, #16\n\t"
  125817. "mul r7, r6, r7\n\t"
  125818. "adds r5, r5, r7\n\t"
  125819. "adcs r3, r3, #0\n\t"
  125820. "mov r4, #0\n\t"
  125821. "adc r4, r4, #0\n\t"
  125822. "lsr r7, r9, #16\n\t"
  125823. "mul r6, r7, r6\n\t"
  125824. "lsr r7, r6, #16\n\t"
  125825. "lsl r6, r6, #16\n\t"
  125826. "adds r5, r5, r6\n\t"
  125827. "adcs r3, r3, r7\n\t"
  125828. "adc r4, r4, #0\n\t"
  125829. "lsr r6, r8, #16\n\t"
  125830. "lsr r7, r9, #16\n\t"
  125831. "mul r7, r6, r7\n\t"
  125832. "adds r3, r3, r7\n\t"
  125833. "adc r4, r4, #0\n\t"
  125834. "lsl r7, r9, #16\n\t"
  125835. "lsr r7, r7, #16\n\t"
  125836. "mul r6, r7, r6\n\t"
  125837. "lsr r7, r6, #16\n\t"
  125838. "lsl r6, r6, #16\n\t"
  125839. "adds r5, r5, r6\n\t"
  125840. "adcs r3, r3, r7\n\t"
  125841. "adc r4, r4, #0\n\t"
  125842. #else
  125843. "umull r6, r7, r8, r9\n\t"
  125844. "adds r5, r5, r6\n\t"
  125845. "adcs r3, r3, r7\n\t"
  125846. "mov r4, #0\n\t"
  125847. "adc r4, r4, #0\n\t"
  125848. #endif
  125849. /* A[13] * B[1] */
  125850. "ldr r8, [%[a], #52]\n\t"
  125851. "ldr r9, [%[b], #4]\n\t"
  125852. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125853. "lsl r6, r8, #16\n\t"
  125854. "lsl r7, r9, #16\n\t"
  125855. "lsr r6, r6, #16\n\t"
  125856. "lsr r7, r7, #16\n\t"
  125857. "mul r7, r6, r7\n\t"
  125858. "adds r5, r5, r7\n\t"
  125859. "adcs r3, r3, #0\n\t"
  125860. "adc r4, r4, #0\n\t"
  125861. "lsr r7, r9, #16\n\t"
  125862. "mul r6, r7, r6\n\t"
  125863. "lsr r7, r6, #16\n\t"
  125864. "lsl r6, r6, #16\n\t"
  125865. "adds r5, r5, r6\n\t"
  125866. "adcs r3, r3, r7\n\t"
  125867. "adc r4, r4, #0\n\t"
  125868. "lsr r6, r8, #16\n\t"
  125869. "lsr r7, r9, #16\n\t"
  125870. "mul r7, r6, r7\n\t"
  125871. "adds r3, r3, r7\n\t"
  125872. "adc r4, r4, #0\n\t"
  125873. "lsl r7, r9, #16\n\t"
  125874. "lsr r7, r7, #16\n\t"
  125875. "mul r6, r7, r6\n\t"
  125876. "lsr r7, r6, #16\n\t"
  125877. "lsl r6, r6, #16\n\t"
  125878. "adds r5, r5, r6\n\t"
  125879. "adcs r3, r3, r7\n\t"
  125880. "adc r4, r4, #0\n\t"
  125881. #else
  125882. "umull r6, r7, r8, r9\n\t"
  125883. "adds r5, r5, r6\n\t"
  125884. "adcs r3, r3, r7\n\t"
  125885. "adc r4, r4, #0\n\t"
  125886. #endif
  125887. /* A[12] * B[2] */
  125888. "ldr r8, [%[a], #48]\n\t"
  125889. "ldr r9, [%[b], #8]\n\t"
  125890. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125891. "lsl r6, r8, #16\n\t"
  125892. "lsl r7, r9, #16\n\t"
  125893. "lsr r6, r6, #16\n\t"
  125894. "lsr r7, r7, #16\n\t"
  125895. "mul r7, r6, r7\n\t"
  125896. "adds r5, r5, r7\n\t"
  125897. "adcs r3, r3, #0\n\t"
  125898. "adc r4, r4, #0\n\t"
  125899. "lsr r7, r9, #16\n\t"
  125900. "mul r6, r7, r6\n\t"
  125901. "lsr r7, r6, #16\n\t"
  125902. "lsl r6, r6, #16\n\t"
  125903. "adds r5, r5, r6\n\t"
  125904. "adcs r3, r3, r7\n\t"
  125905. "adc r4, r4, #0\n\t"
  125906. "lsr r6, r8, #16\n\t"
  125907. "lsr r7, r9, #16\n\t"
  125908. "mul r7, r6, r7\n\t"
  125909. "adds r3, r3, r7\n\t"
  125910. "adc r4, r4, #0\n\t"
  125911. "lsl r7, r9, #16\n\t"
  125912. "lsr r7, r7, #16\n\t"
  125913. "mul r6, r7, r6\n\t"
  125914. "lsr r7, r6, #16\n\t"
  125915. "lsl r6, r6, #16\n\t"
  125916. "adds r5, r5, r6\n\t"
  125917. "adcs r3, r3, r7\n\t"
  125918. "adc r4, r4, #0\n\t"
  125919. #else
  125920. "umull r6, r7, r8, r9\n\t"
  125921. "adds r5, r5, r6\n\t"
  125922. "adcs r3, r3, r7\n\t"
  125923. "adc r4, r4, #0\n\t"
  125924. #endif
  125925. /* A[11] * B[3] */
  125926. "ldr r8, [%[a], #44]\n\t"
  125927. "ldr r9, [%[b], #12]\n\t"
  125928. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125929. "lsl r6, r8, #16\n\t"
  125930. "lsl r7, r9, #16\n\t"
  125931. "lsr r6, r6, #16\n\t"
  125932. "lsr r7, r7, #16\n\t"
  125933. "mul r7, r6, r7\n\t"
  125934. "adds r5, r5, r7\n\t"
  125935. "adcs r3, r3, #0\n\t"
  125936. "adc r4, r4, #0\n\t"
  125937. "lsr r7, r9, #16\n\t"
  125938. "mul r6, r7, r6\n\t"
  125939. "lsr r7, r6, #16\n\t"
  125940. "lsl r6, r6, #16\n\t"
  125941. "adds r5, r5, r6\n\t"
  125942. "adcs r3, r3, r7\n\t"
  125943. "adc r4, r4, #0\n\t"
  125944. "lsr r6, r8, #16\n\t"
  125945. "lsr r7, r9, #16\n\t"
  125946. "mul r7, r6, r7\n\t"
  125947. "adds r3, r3, r7\n\t"
  125948. "adc r4, r4, #0\n\t"
  125949. "lsl r7, r9, #16\n\t"
  125950. "lsr r7, r7, #16\n\t"
  125951. "mul r6, r7, r6\n\t"
  125952. "lsr r7, r6, #16\n\t"
  125953. "lsl r6, r6, #16\n\t"
  125954. "adds r5, r5, r6\n\t"
  125955. "adcs r3, r3, r7\n\t"
  125956. "adc r4, r4, #0\n\t"
  125957. #else
  125958. "umull r6, r7, r8, r9\n\t"
  125959. "adds r5, r5, r6\n\t"
  125960. "adcs r3, r3, r7\n\t"
  125961. "adc r4, r4, #0\n\t"
  125962. #endif
  125963. /* A[10] * B[4] */
  125964. "ldr r8, [%[a], #40]\n\t"
  125965. "ldr r9, [%[b], #16]\n\t"
  125966. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  125967. "lsl r6, r8, #16\n\t"
  125968. "lsl r7, r9, #16\n\t"
  125969. "lsr r6, r6, #16\n\t"
  125970. "lsr r7, r7, #16\n\t"
  125971. "mul r7, r6, r7\n\t"
  125972. "adds r5, r5, r7\n\t"
  125973. "adcs r3, r3, #0\n\t"
  125974. "adc r4, r4, #0\n\t"
  125975. "lsr r7, r9, #16\n\t"
  125976. "mul r6, r7, r6\n\t"
  125977. "lsr r7, r6, #16\n\t"
  125978. "lsl r6, r6, #16\n\t"
  125979. "adds r5, r5, r6\n\t"
  125980. "adcs r3, r3, r7\n\t"
  125981. "adc r4, r4, #0\n\t"
  125982. "lsr r6, r8, #16\n\t"
  125983. "lsr r7, r9, #16\n\t"
  125984. "mul r7, r6, r7\n\t"
  125985. "adds r3, r3, r7\n\t"
  125986. "adc r4, r4, #0\n\t"
  125987. "lsl r7, r9, #16\n\t"
  125988. "lsr r7, r7, #16\n\t"
  125989. "mul r6, r7, r6\n\t"
  125990. "lsr r7, r6, #16\n\t"
  125991. "lsl r6, r6, #16\n\t"
  125992. "adds r5, r5, r6\n\t"
  125993. "adcs r3, r3, r7\n\t"
  125994. "adc r4, r4, #0\n\t"
  125995. #else
  125996. "umull r6, r7, r8, r9\n\t"
  125997. "adds r5, r5, r6\n\t"
  125998. "adcs r3, r3, r7\n\t"
  125999. "adc r4, r4, #0\n\t"
  126000. #endif
  126001. /* A[9] * B[5] */
  126002. "ldr r8, [%[a], #36]\n\t"
  126003. "ldr r9, [%[b], #20]\n\t"
  126004. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126005. "lsl r6, r8, #16\n\t"
  126006. "lsl r7, r9, #16\n\t"
  126007. "lsr r6, r6, #16\n\t"
  126008. "lsr r7, r7, #16\n\t"
  126009. "mul r7, r6, r7\n\t"
  126010. "adds r5, r5, r7\n\t"
  126011. "adcs r3, r3, #0\n\t"
  126012. "adc r4, r4, #0\n\t"
  126013. "lsr r7, r9, #16\n\t"
  126014. "mul r6, r7, r6\n\t"
  126015. "lsr r7, r6, #16\n\t"
  126016. "lsl r6, r6, #16\n\t"
  126017. "adds r5, r5, r6\n\t"
  126018. "adcs r3, r3, r7\n\t"
  126019. "adc r4, r4, #0\n\t"
  126020. "lsr r6, r8, #16\n\t"
  126021. "lsr r7, r9, #16\n\t"
  126022. "mul r7, r6, r7\n\t"
  126023. "adds r3, r3, r7\n\t"
  126024. "adc r4, r4, #0\n\t"
  126025. "lsl r7, r9, #16\n\t"
  126026. "lsr r7, r7, #16\n\t"
  126027. "mul r6, r7, r6\n\t"
  126028. "lsr r7, r6, #16\n\t"
  126029. "lsl r6, r6, #16\n\t"
  126030. "adds r5, r5, r6\n\t"
  126031. "adcs r3, r3, r7\n\t"
  126032. "adc r4, r4, #0\n\t"
  126033. #else
  126034. "umull r6, r7, r8, r9\n\t"
  126035. "adds r5, r5, r6\n\t"
  126036. "adcs r3, r3, r7\n\t"
  126037. "adc r4, r4, #0\n\t"
  126038. #endif
  126039. /* A[8] * B[6] */
  126040. "ldr r8, [%[a], #32]\n\t"
  126041. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126042. "lsl r6, r8, #16\n\t"
  126043. "lsl r7, r12, #16\n\t"
  126044. "lsr r6, r6, #16\n\t"
  126045. "lsr r7, r7, #16\n\t"
  126046. "mul r7, r6, r7\n\t"
  126047. "adds r5, r5, r7\n\t"
  126048. "adcs r3, r3, #0\n\t"
  126049. "adc r4, r4, #0\n\t"
  126050. "lsr r7, r12, #16\n\t"
  126051. "mul r6, r7, r6\n\t"
  126052. "lsr r7, r6, #16\n\t"
  126053. "lsl r6, r6, #16\n\t"
  126054. "adds r5, r5, r6\n\t"
  126055. "adcs r3, r3, r7\n\t"
  126056. "adc r4, r4, #0\n\t"
  126057. "lsr r6, r8, #16\n\t"
  126058. "lsr r7, r12, #16\n\t"
  126059. "mul r7, r6, r7\n\t"
  126060. "adds r3, r3, r7\n\t"
  126061. "adc r4, r4, #0\n\t"
  126062. "lsl r7, r12, #16\n\t"
  126063. "lsr r7, r7, #16\n\t"
  126064. "mul r6, r7, r6\n\t"
  126065. "lsr r7, r6, #16\n\t"
  126066. "lsl r6, r6, #16\n\t"
  126067. "adds r5, r5, r6\n\t"
  126068. "adcs r3, r3, r7\n\t"
  126069. "adc r4, r4, #0\n\t"
  126070. #else
  126071. "umull r6, r7, r8, r12\n\t"
  126072. "adds r5, r5, r6\n\t"
  126073. "adcs r3, r3, r7\n\t"
  126074. "adc r4, r4, #0\n\t"
  126075. #endif
  126076. /* A[7] * B[7] */
  126077. "ldr r11, [%[a], #28]\n\t"
  126078. "ldr r12, [%[b], #28]\n\t"
  126079. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126080. "lsl r6, r11, #16\n\t"
  126081. "lsl r7, r12, #16\n\t"
  126082. "lsr r6, r6, #16\n\t"
  126083. "lsr r7, r7, #16\n\t"
  126084. "mul r7, r6, r7\n\t"
  126085. "adds r5, r5, r7\n\t"
  126086. "adcs r3, r3, #0\n\t"
  126087. "adc r4, r4, #0\n\t"
  126088. "lsr r7, r12, #16\n\t"
  126089. "mul r6, r7, r6\n\t"
  126090. "lsr r7, r6, #16\n\t"
  126091. "lsl r6, r6, #16\n\t"
  126092. "adds r5, r5, r6\n\t"
  126093. "adcs r3, r3, r7\n\t"
  126094. "adc r4, r4, #0\n\t"
  126095. "lsr r6, r11, #16\n\t"
  126096. "lsr r7, r12, #16\n\t"
  126097. "mul r7, r6, r7\n\t"
  126098. "adds r3, r3, r7\n\t"
  126099. "adc r4, r4, #0\n\t"
  126100. "lsl r7, r12, #16\n\t"
  126101. "lsr r7, r7, #16\n\t"
  126102. "mul r6, r7, r6\n\t"
  126103. "lsr r7, r6, #16\n\t"
  126104. "lsl r6, r6, #16\n\t"
  126105. "adds r5, r5, r6\n\t"
  126106. "adcs r3, r3, r7\n\t"
  126107. "adc r4, r4, #0\n\t"
  126108. #else
  126109. "umull r6, r7, r11, r12\n\t"
  126110. "adds r5, r5, r6\n\t"
  126111. "adcs r3, r3, r7\n\t"
  126112. "adc r4, r4, #0\n\t"
  126113. #endif
  126114. /* A[6] * B[8] */
  126115. "ldr r8, [%[a], #24]\n\t"
  126116. "ldr r9, [%[b], #32]\n\t"
  126117. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126118. "lsl r6, r8, #16\n\t"
  126119. "lsl r7, r9, #16\n\t"
  126120. "lsr r6, r6, #16\n\t"
  126121. "lsr r7, r7, #16\n\t"
  126122. "mul r7, r6, r7\n\t"
  126123. "adds r5, r5, r7\n\t"
  126124. "adcs r3, r3, #0\n\t"
  126125. "adc r4, r4, #0\n\t"
  126126. "lsr r7, r9, #16\n\t"
  126127. "mul r6, r7, r6\n\t"
  126128. "lsr r7, r6, #16\n\t"
  126129. "lsl r6, r6, #16\n\t"
  126130. "adds r5, r5, r6\n\t"
  126131. "adcs r3, r3, r7\n\t"
  126132. "adc r4, r4, #0\n\t"
  126133. "lsr r6, r8, #16\n\t"
  126134. "lsr r7, r9, #16\n\t"
  126135. "mul r7, r6, r7\n\t"
  126136. "adds r3, r3, r7\n\t"
  126137. "adc r4, r4, #0\n\t"
  126138. "lsl r7, r9, #16\n\t"
  126139. "lsr r7, r7, #16\n\t"
  126140. "mul r6, r7, r6\n\t"
  126141. "lsr r7, r6, #16\n\t"
  126142. "lsl r6, r6, #16\n\t"
  126143. "adds r5, r5, r6\n\t"
  126144. "adcs r3, r3, r7\n\t"
  126145. "adc r4, r4, #0\n\t"
  126146. #else
  126147. "umull r6, r7, r8, r9\n\t"
  126148. "adds r5, r5, r6\n\t"
  126149. "adcs r3, r3, r7\n\t"
  126150. "adc r4, r4, #0\n\t"
  126151. #endif
  126152. /* A[5] * B[9] */
  126153. "ldr r8, [%[a], #20]\n\t"
  126154. "ldr r9, [%[b], #36]\n\t"
  126155. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126156. "lsl r6, r8, #16\n\t"
  126157. "lsl r7, r9, #16\n\t"
  126158. "lsr r6, r6, #16\n\t"
  126159. "lsr r7, r7, #16\n\t"
  126160. "mul r7, r6, r7\n\t"
  126161. "adds r5, r5, r7\n\t"
  126162. "adcs r3, r3, #0\n\t"
  126163. "adc r4, r4, #0\n\t"
  126164. "lsr r7, r9, #16\n\t"
  126165. "mul r6, r7, r6\n\t"
  126166. "lsr r7, r6, #16\n\t"
  126167. "lsl r6, r6, #16\n\t"
  126168. "adds r5, r5, r6\n\t"
  126169. "adcs r3, r3, r7\n\t"
  126170. "adc r4, r4, #0\n\t"
  126171. "lsr r6, r8, #16\n\t"
  126172. "lsr r7, r9, #16\n\t"
  126173. "mul r7, r6, r7\n\t"
  126174. "adds r3, r3, r7\n\t"
  126175. "adc r4, r4, #0\n\t"
  126176. "lsl r7, r9, #16\n\t"
  126177. "lsr r7, r7, #16\n\t"
  126178. "mul r6, r7, r6\n\t"
  126179. "lsr r7, r6, #16\n\t"
  126180. "lsl r6, r6, #16\n\t"
  126181. "adds r5, r5, r6\n\t"
  126182. "adcs r3, r3, r7\n\t"
  126183. "adc r4, r4, #0\n\t"
  126184. #else
  126185. "umull r6, r7, r8, r9\n\t"
  126186. "adds r5, r5, r6\n\t"
  126187. "adcs r3, r3, r7\n\t"
  126188. "adc r4, r4, #0\n\t"
  126189. #endif
  126190. /* A[4] * B[10] */
  126191. "ldr r8, [%[a], #16]\n\t"
  126192. "ldr r9, [%[b], #40]\n\t"
  126193. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126194. "lsl r6, r8, #16\n\t"
  126195. "lsl r7, r9, #16\n\t"
  126196. "lsr r6, r6, #16\n\t"
  126197. "lsr r7, r7, #16\n\t"
  126198. "mul r7, r6, r7\n\t"
  126199. "adds r5, r5, r7\n\t"
  126200. "adcs r3, r3, #0\n\t"
  126201. "adc r4, r4, #0\n\t"
  126202. "lsr r7, r9, #16\n\t"
  126203. "mul r6, r7, r6\n\t"
  126204. "lsr r7, r6, #16\n\t"
  126205. "lsl r6, r6, #16\n\t"
  126206. "adds r5, r5, r6\n\t"
  126207. "adcs r3, r3, r7\n\t"
  126208. "adc r4, r4, #0\n\t"
  126209. "lsr r6, r8, #16\n\t"
  126210. "lsr r7, r9, #16\n\t"
  126211. "mul r7, r6, r7\n\t"
  126212. "adds r3, r3, r7\n\t"
  126213. "adc r4, r4, #0\n\t"
  126214. "lsl r7, r9, #16\n\t"
  126215. "lsr r7, r7, #16\n\t"
  126216. "mul r6, r7, r6\n\t"
  126217. "lsr r7, r6, #16\n\t"
  126218. "lsl r6, r6, #16\n\t"
  126219. "adds r5, r5, r6\n\t"
  126220. "adcs r3, r3, r7\n\t"
  126221. "adc r4, r4, #0\n\t"
  126222. #else
  126223. "umull r6, r7, r8, r9\n\t"
  126224. "adds r5, r5, r6\n\t"
  126225. "adcs r3, r3, r7\n\t"
  126226. "adc r4, r4, #0\n\t"
  126227. #endif
  126228. /* A[3] * B[11] */
  126229. "ldr r8, [%[a], #12]\n\t"
  126230. "ldr r9, [%[b], #44]\n\t"
  126231. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126232. "lsl r6, r8, #16\n\t"
  126233. "lsl r7, r9, #16\n\t"
  126234. "lsr r6, r6, #16\n\t"
  126235. "lsr r7, r7, #16\n\t"
  126236. "mul r7, r6, r7\n\t"
  126237. "adds r5, r5, r7\n\t"
  126238. "adcs r3, r3, #0\n\t"
  126239. "adc r4, r4, #0\n\t"
  126240. "lsr r7, r9, #16\n\t"
  126241. "mul r6, r7, r6\n\t"
  126242. "lsr r7, r6, #16\n\t"
  126243. "lsl r6, r6, #16\n\t"
  126244. "adds r5, r5, r6\n\t"
  126245. "adcs r3, r3, r7\n\t"
  126246. "adc r4, r4, #0\n\t"
  126247. "lsr r6, r8, #16\n\t"
  126248. "lsr r7, r9, #16\n\t"
  126249. "mul r7, r6, r7\n\t"
  126250. "adds r3, r3, r7\n\t"
  126251. "adc r4, r4, #0\n\t"
  126252. "lsl r7, r9, #16\n\t"
  126253. "lsr r7, r7, #16\n\t"
  126254. "mul r6, r7, r6\n\t"
  126255. "lsr r7, r6, #16\n\t"
  126256. "lsl r6, r6, #16\n\t"
  126257. "adds r5, r5, r6\n\t"
  126258. "adcs r3, r3, r7\n\t"
  126259. "adc r4, r4, #0\n\t"
  126260. #else
  126261. "umull r6, r7, r8, r9\n\t"
  126262. "adds r5, r5, r6\n\t"
  126263. "adcs r3, r3, r7\n\t"
  126264. "adc r4, r4, #0\n\t"
  126265. #endif
  126266. /* A[2] * B[12] */
  126267. "ldr r8, [%[a], #8]\n\t"
  126268. "ldr r9, [%[b], #48]\n\t"
  126269. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126270. "lsl r6, r8, #16\n\t"
  126271. "lsl r7, r9, #16\n\t"
  126272. "lsr r6, r6, #16\n\t"
  126273. "lsr r7, r7, #16\n\t"
  126274. "mul r7, r6, r7\n\t"
  126275. "adds r5, r5, r7\n\t"
  126276. "adcs r3, r3, #0\n\t"
  126277. "adc r4, r4, #0\n\t"
  126278. "lsr r7, r9, #16\n\t"
  126279. "mul r6, r7, r6\n\t"
  126280. "lsr r7, r6, #16\n\t"
  126281. "lsl r6, r6, #16\n\t"
  126282. "adds r5, r5, r6\n\t"
  126283. "adcs r3, r3, r7\n\t"
  126284. "adc r4, r4, #0\n\t"
  126285. "lsr r6, r8, #16\n\t"
  126286. "lsr r7, r9, #16\n\t"
  126287. "mul r7, r6, r7\n\t"
  126288. "adds r3, r3, r7\n\t"
  126289. "adc r4, r4, #0\n\t"
  126290. "lsl r7, r9, #16\n\t"
  126291. "lsr r7, r7, #16\n\t"
  126292. "mul r6, r7, r6\n\t"
  126293. "lsr r7, r6, #16\n\t"
  126294. "lsl r6, r6, #16\n\t"
  126295. "adds r5, r5, r6\n\t"
  126296. "adcs r3, r3, r7\n\t"
  126297. "adc r4, r4, #0\n\t"
  126298. #else
  126299. "umull r6, r7, r8, r9\n\t"
  126300. "adds r5, r5, r6\n\t"
  126301. "adcs r3, r3, r7\n\t"
  126302. "adc r4, r4, #0\n\t"
  126303. #endif
  126304. /* A[1] * B[13] */
  126305. "ldr r8, [%[a], #4]\n\t"
  126306. "ldr r9, [%[b], #52]\n\t"
  126307. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126308. "lsl r6, r8, #16\n\t"
  126309. "lsl r7, r9, #16\n\t"
  126310. "lsr r6, r6, #16\n\t"
  126311. "lsr r7, r7, #16\n\t"
  126312. "mul r7, r6, r7\n\t"
  126313. "adds r5, r5, r7\n\t"
  126314. "adcs r3, r3, #0\n\t"
  126315. "adc r4, r4, #0\n\t"
  126316. "lsr r7, r9, #16\n\t"
  126317. "mul r6, r7, r6\n\t"
  126318. "lsr r7, r6, #16\n\t"
  126319. "lsl r6, r6, #16\n\t"
  126320. "adds r5, r5, r6\n\t"
  126321. "adcs r3, r3, r7\n\t"
  126322. "adc r4, r4, #0\n\t"
  126323. "lsr r6, r8, #16\n\t"
  126324. "lsr r7, r9, #16\n\t"
  126325. "mul r7, r6, r7\n\t"
  126326. "adds r3, r3, r7\n\t"
  126327. "adc r4, r4, #0\n\t"
  126328. "lsl r7, r9, #16\n\t"
  126329. "lsr r7, r7, #16\n\t"
  126330. "mul r6, r7, r6\n\t"
  126331. "lsr r7, r6, #16\n\t"
  126332. "lsl r6, r6, #16\n\t"
  126333. "adds r5, r5, r6\n\t"
  126334. "adcs r3, r3, r7\n\t"
  126335. "adc r4, r4, #0\n\t"
  126336. #else
  126337. "umull r6, r7, r8, r9\n\t"
  126338. "adds r5, r5, r6\n\t"
  126339. "adcs r3, r3, r7\n\t"
  126340. "adc r4, r4, #0\n\t"
  126341. #endif
  126342. /* A[0] * B[14] */
  126343. "ldr r8, [%[a]]\n\t"
  126344. "ldr r9, [%[b], #56]\n\t"
  126345. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126346. "lsl r6, r8, #16\n\t"
  126347. "lsl r7, r9, #16\n\t"
  126348. "lsr r6, r6, #16\n\t"
  126349. "lsr r7, r7, #16\n\t"
  126350. "mul r7, r6, r7\n\t"
  126351. "adds r5, r5, r7\n\t"
  126352. "adcs r3, r3, #0\n\t"
  126353. "adc r4, r4, #0\n\t"
  126354. "lsr r7, r9, #16\n\t"
  126355. "mul r6, r7, r6\n\t"
  126356. "lsr r7, r6, #16\n\t"
  126357. "lsl r6, r6, #16\n\t"
  126358. "adds r5, r5, r6\n\t"
  126359. "adcs r3, r3, r7\n\t"
  126360. "adc r4, r4, #0\n\t"
  126361. "lsr r6, r8, #16\n\t"
  126362. "lsr r7, r9, #16\n\t"
  126363. "mul r7, r6, r7\n\t"
  126364. "adds r3, r3, r7\n\t"
  126365. "adc r4, r4, #0\n\t"
  126366. "lsl r7, r9, #16\n\t"
  126367. "lsr r7, r7, #16\n\t"
  126368. "mul r6, r7, r6\n\t"
  126369. "lsr r7, r6, #16\n\t"
  126370. "lsl r6, r6, #16\n\t"
  126371. "adds r5, r5, r6\n\t"
  126372. "adcs r3, r3, r7\n\t"
  126373. "adc r4, r4, #0\n\t"
  126374. #else
  126375. "umull r6, r7, r8, r9\n\t"
  126376. "adds r5, r5, r6\n\t"
  126377. "adcs r3, r3, r7\n\t"
  126378. "adc r4, r4, #0\n\t"
  126379. #endif
  126380. "str r5, [sp, #56]\n\t"
  126381. /* A[0] * B[15] */
  126382. "ldr r9, [%[b], #60]\n\t"
  126383. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126384. "lsl r6, r8, #16\n\t"
  126385. "lsl r7, r9, #16\n\t"
  126386. "lsr r6, r6, #16\n\t"
  126387. "lsr r7, r7, #16\n\t"
  126388. "mul r7, r6, r7\n\t"
  126389. "adds r3, r3, r7\n\t"
  126390. "adcs r4, r4, #0\n\t"
  126391. "mov r5, #0\n\t"
  126392. "adc r5, r5, #0\n\t"
  126393. "lsr r7, r9, #16\n\t"
  126394. "mul r6, r7, r6\n\t"
  126395. "lsr r7, r6, #16\n\t"
  126396. "lsl r6, r6, #16\n\t"
  126397. "adds r3, r3, r6\n\t"
  126398. "adcs r4, r4, r7\n\t"
  126399. "adc r5, r5, #0\n\t"
  126400. "lsr r6, r8, #16\n\t"
  126401. "lsr r7, r9, #16\n\t"
  126402. "mul r7, r6, r7\n\t"
  126403. "adds r4, r4, r7\n\t"
  126404. "adc r5, r5, #0\n\t"
  126405. "lsl r7, r9, #16\n\t"
  126406. "lsr r7, r7, #16\n\t"
  126407. "mul r6, r7, r6\n\t"
  126408. "lsr r7, r6, #16\n\t"
  126409. "lsl r6, r6, #16\n\t"
  126410. "adds r3, r3, r6\n\t"
  126411. "adcs r4, r4, r7\n\t"
  126412. "adc r5, r5, #0\n\t"
  126413. #else
  126414. "umull r6, r7, r8, r9\n\t"
  126415. "adds r3, r3, r6\n\t"
  126416. "adcs r4, r4, r7\n\t"
  126417. "mov r5, #0\n\t"
  126418. "adc r5, r5, #0\n\t"
  126419. #endif
  126420. /* A[1] * B[14] */
  126421. "ldr r8, [%[a], #4]\n\t"
  126422. "ldr r9, [%[b], #56]\n\t"
  126423. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126424. "lsl r6, r8, #16\n\t"
  126425. "lsl r7, r9, #16\n\t"
  126426. "lsr r6, r6, #16\n\t"
  126427. "lsr r7, r7, #16\n\t"
  126428. "mul r7, r6, r7\n\t"
  126429. "adds r3, r3, r7\n\t"
  126430. "adcs r4, r4, #0\n\t"
  126431. "adc r5, r5, #0\n\t"
  126432. "lsr r7, r9, #16\n\t"
  126433. "mul r6, r7, r6\n\t"
  126434. "lsr r7, r6, #16\n\t"
  126435. "lsl r6, r6, #16\n\t"
  126436. "adds r3, r3, r6\n\t"
  126437. "adcs r4, r4, r7\n\t"
  126438. "adc r5, r5, #0\n\t"
  126439. "lsr r6, r8, #16\n\t"
  126440. "lsr r7, r9, #16\n\t"
  126441. "mul r7, r6, r7\n\t"
  126442. "adds r4, r4, r7\n\t"
  126443. "adc r5, r5, #0\n\t"
  126444. "lsl r7, r9, #16\n\t"
  126445. "lsr r7, r7, #16\n\t"
  126446. "mul r6, r7, r6\n\t"
  126447. "lsr r7, r6, #16\n\t"
  126448. "lsl r6, r6, #16\n\t"
  126449. "adds r3, r3, r6\n\t"
  126450. "adcs r4, r4, r7\n\t"
  126451. "adc r5, r5, #0\n\t"
  126452. #else
  126453. "umull r6, r7, r8, r9\n\t"
  126454. "adds r3, r3, r6\n\t"
  126455. "adcs r4, r4, r7\n\t"
  126456. "adc r5, r5, #0\n\t"
  126457. #endif
  126458. /* A[2] * B[13] */
  126459. "ldr r8, [%[a], #8]\n\t"
  126460. "ldr r9, [%[b], #52]\n\t"
  126461. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126462. "lsl r6, r8, #16\n\t"
  126463. "lsl r7, r9, #16\n\t"
  126464. "lsr r6, r6, #16\n\t"
  126465. "lsr r7, r7, #16\n\t"
  126466. "mul r7, r6, r7\n\t"
  126467. "adds r3, r3, r7\n\t"
  126468. "adcs r4, r4, #0\n\t"
  126469. "adc r5, r5, #0\n\t"
  126470. "lsr r7, r9, #16\n\t"
  126471. "mul r6, r7, r6\n\t"
  126472. "lsr r7, r6, #16\n\t"
  126473. "lsl r6, r6, #16\n\t"
  126474. "adds r3, r3, r6\n\t"
  126475. "adcs r4, r4, r7\n\t"
  126476. "adc r5, r5, #0\n\t"
  126477. "lsr r6, r8, #16\n\t"
  126478. "lsr r7, r9, #16\n\t"
  126479. "mul r7, r6, r7\n\t"
  126480. "adds r4, r4, r7\n\t"
  126481. "adc r5, r5, #0\n\t"
  126482. "lsl r7, r9, #16\n\t"
  126483. "lsr r7, r7, #16\n\t"
  126484. "mul r6, r7, r6\n\t"
  126485. "lsr r7, r6, #16\n\t"
  126486. "lsl r6, r6, #16\n\t"
  126487. "adds r3, r3, r6\n\t"
  126488. "adcs r4, r4, r7\n\t"
  126489. "adc r5, r5, #0\n\t"
  126490. #else
  126491. "umull r6, r7, r8, r9\n\t"
  126492. "adds r3, r3, r6\n\t"
  126493. "adcs r4, r4, r7\n\t"
  126494. "adc r5, r5, #0\n\t"
  126495. #endif
  126496. /* A[3] * B[12] */
  126497. "ldr r8, [%[a], #12]\n\t"
  126498. "ldr r9, [%[b], #48]\n\t"
  126499. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126500. "lsl r6, r8, #16\n\t"
  126501. "lsl r7, r9, #16\n\t"
  126502. "lsr r6, r6, #16\n\t"
  126503. "lsr r7, r7, #16\n\t"
  126504. "mul r7, r6, r7\n\t"
  126505. "adds r3, r3, r7\n\t"
  126506. "adcs r4, r4, #0\n\t"
  126507. "adc r5, r5, #0\n\t"
  126508. "lsr r7, r9, #16\n\t"
  126509. "mul r6, r7, r6\n\t"
  126510. "lsr r7, r6, #16\n\t"
  126511. "lsl r6, r6, #16\n\t"
  126512. "adds r3, r3, r6\n\t"
  126513. "adcs r4, r4, r7\n\t"
  126514. "adc r5, r5, #0\n\t"
  126515. "lsr r6, r8, #16\n\t"
  126516. "lsr r7, r9, #16\n\t"
  126517. "mul r7, r6, r7\n\t"
  126518. "adds r4, r4, r7\n\t"
  126519. "adc r5, r5, #0\n\t"
  126520. "lsl r7, r9, #16\n\t"
  126521. "lsr r7, r7, #16\n\t"
  126522. "mul r6, r7, r6\n\t"
  126523. "lsr r7, r6, #16\n\t"
  126524. "lsl r6, r6, #16\n\t"
  126525. "adds r3, r3, r6\n\t"
  126526. "adcs r4, r4, r7\n\t"
  126527. "adc r5, r5, #0\n\t"
  126528. #else
  126529. "umull r6, r7, r8, r9\n\t"
  126530. "adds r3, r3, r6\n\t"
  126531. "adcs r4, r4, r7\n\t"
  126532. "adc r5, r5, #0\n\t"
  126533. #endif
  126534. /* A[4] * B[11] */
  126535. "ldr r8, [%[a], #16]\n\t"
  126536. "ldr r9, [%[b], #44]\n\t"
  126537. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126538. "lsl r6, r8, #16\n\t"
  126539. "lsl r7, r9, #16\n\t"
  126540. "lsr r6, r6, #16\n\t"
  126541. "lsr r7, r7, #16\n\t"
  126542. "mul r7, r6, r7\n\t"
  126543. "adds r3, r3, r7\n\t"
  126544. "adcs r4, r4, #0\n\t"
  126545. "adc r5, r5, #0\n\t"
  126546. "lsr r7, r9, #16\n\t"
  126547. "mul r6, r7, r6\n\t"
  126548. "lsr r7, r6, #16\n\t"
  126549. "lsl r6, r6, #16\n\t"
  126550. "adds r3, r3, r6\n\t"
  126551. "adcs r4, r4, r7\n\t"
  126552. "adc r5, r5, #0\n\t"
  126553. "lsr r6, r8, #16\n\t"
  126554. "lsr r7, r9, #16\n\t"
  126555. "mul r7, r6, r7\n\t"
  126556. "adds r4, r4, r7\n\t"
  126557. "adc r5, r5, #0\n\t"
  126558. "lsl r7, r9, #16\n\t"
  126559. "lsr r7, r7, #16\n\t"
  126560. "mul r6, r7, r6\n\t"
  126561. "lsr r7, r6, #16\n\t"
  126562. "lsl r6, r6, #16\n\t"
  126563. "adds r3, r3, r6\n\t"
  126564. "adcs r4, r4, r7\n\t"
  126565. "adc r5, r5, #0\n\t"
  126566. #else
  126567. "umull r6, r7, r8, r9\n\t"
  126568. "adds r3, r3, r6\n\t"
  126569. "adcs r4, r4, r7\n\t"
  126570. "adc r5, r5, #0\n\t"
  126571. #endif
  126572. /* A[5] * B[10] */
  126573. "ldr r8, [%[a], #20]\n\t"
  126574. "ldr r9, [%[b], #40]\n\t"
  126575. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126576. "lsl r6, r8, #16\n\t"
  126577. "lsl r7, r9, #16\n\t"
  126578. "lsr r6, r6, #16\n\t"
  126579. "lsr r7, r7, #16\n\t"
  126580. "mul r7, r6, r7\n\t"
  126581. "adds r3, r3, r7\n\t"
  126582. "adcs r4, r4, #0\n\t"
  126583. "adc r5, r5, #0\n\t"
  126584. "lsr r7, r9, #16\n\t"
  126585. "mul r6, r7, r6\n\t"
  126586. "lsr r7, r6, #16\n\t"
  126587. "lsl r6, r6, #16\n\t"
  126588. "adds r3, r3, r6\n\t"
  126589. "adcs r4, r4, r7\n\t"
  126590. "adc r5, r5, #0\n\t"
  126591. "lsr r6, r8, #16\n\t"
  126592. "lsr r7, r9, #16\n\t"
  126593. "mul r7, r6, r7\n\t"
  126594. "adds r4, r4, r7\n\t"
  126595. "adc r5, r5, #0\n\t"
  126596. "lsl r7, r9, #16\n\t"
  126597. "lsr r7, r7, #16\n\t"
  126598. "mul r6, r7, r6\n\t"
  126599. "lsr r7, r6, #16\n\t"
  126600. "lsl r6, r6, #16\n\t"
  126601. "adds r3, r3, r6\n\t"
  126602. "adcs r4, r4, r7\n\t"
  126603. "adc r5, r5, #0\n\t"
  126604. #else
  126605. "umull r6, r7, r8, r9\n\t"
  126606. "adds r3, r3, r6\n\t"
  126607. "adcs r4, r4, r7\n\t"
  126608. "adc r5, r5, #0\n\t"
  126609. #endif
  126610. /* A[6] * B[9] */
  126611. "ldr r8, [%[a], #24]\n\t"
  126612. "ldr r9, [%[b], #36]\n\t"
  126613. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126614. "lsl r6, r8, #16\n\t"
  126615. "lsl r7, r9, #16\n\t"
  126616. "lsr r6, r6, #16\n\t"
  126617. "lsr r7, r7, #16\n\t"
  126618. "mul r7, r6, r7\n\t"
  126619. "adds r3, r3, r7\n\t"
  126620. "adcs r4, r4, #0\n\t"
  126621. "adc r5, r5, #0\n\t"
  126622. "lsr r7, r9, #16\n\t"
  126623. "mul r6, r7, r6\n\t"
  126624. "lsr r7, r6, #16\n\t"
  126625. "lsl r6, r6, #16\n\t"
  126626. "adds r3, r3, r6\n\t"
  126627. "adcs r4, r4, r7\n\t"
  126628. "adc r5, r5, #0\n\t"
  126629. "lsr r6, r8, #16\n\t"
  126630. "lsr r7, r9, #16\n\t"
  126631. "mul r7, r6, r7\n\t"
  126632. "adds r4, r4, r7\n\t"
  126633. "adc r5, r5, #0\n\t"
  126634. "lsl r7, r9, #16\n\t"
  126635. "lsr r7, r7, #16\n\t"
  126636. "mul r6, r7, r6\n\t"
  126637. "lsr r7, r6, #16\n\t"
  126638. "lsl r6, r6, #16\n\t"
  126639. "adds r3, r3, r6\n\t"
  126640. "adcs r4, r4, r7\n\t"
  126641. "adc r5, r5, #0\n\t"
  126642. #else
  126643. "umull r6, r7, r8, r9\n\t"
  126644. "adds r3, r3, r6\n\t"
  126645. "adcs r4, r4, r7\n\t"
  126646. "adc r5, r5, #0\n\t"
  126647. #endif
  126648. /* A[7] * B[8] */
  126649. "ldr r9, [%[b], #32]\n\t"
  126650. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126651. "lsl r6, r11, #16\n\t"
  126652. "lsl r7, r9, #16\n\t"
  126653. "lsr r6, r6, #16\n\t"
  126654. "lsr r7, r7, #16\n\t"
  126655. "mul r7, r6, r7\n\t"
  126656. "adds r3, r3, r7\n\t"
  126657. "adcs r4, r4, #0\n\t"
  126658. "adc r5, r5, #0\n\t"
  126659. "lsr r7, r9, #16\n\t"
  126660. "mul r6, r7, r6\n\t"
  126661. "lsr r7, r6, #16\n\t"
  126662. "lsl r6, r6, #16\n\t"
  126663. "adds r3, r3, r6\n\t"
  126664. "adcs r4, r4, r7\n\t"
  126665. "adc r5, r5, #0\n\t"
  126666. "lsr r6, r11, #16\n\t"
  126667. "lsr r7, r9, #16\n\t"
  126668. "mul r7, r6, r7\n\t"
  126669. "adds r4, r4, r7\n\t"
  126670. "adc r5, r5, #0\n\t"
  126671. "lsl r7, r9, #16\n\t"
  126672. "lsr r7, r7, #16\n\t"
  126673. "mul r6, r7, r6\n\t"
  126674. "lsr r7, r6, #16\n\t"
  126675. "lsl r6, r6, #16\n\t"
  126676. "adds r3, r3, r6\n\t"
  126677. "adcs r4, r4, r7\n\t"
  126678. "adc r5, r5, #0\n\t"
  126679. #else
  126680. "umull r6, r7, r11, r9\n\t"
  126681. "adds r3, r3, r6\n\t"
  126682. "adcs r4, r4, r7\n\t"
  126683. "adc r5, r5, #0\n\t"
  126684. #endif
  126685. /* A[8] * B[7] */
  126686. "ldr r8, [%[a], #32]\n\t"
  126687. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126688. "lsl r6, r8, #16\n\t"
  126689. "lsl r7, r12, #16\n\t"
  126690. "lsr r6, r6, #16\n\t"
  126691. "lsr r7, r7, #16\n\t"
  126692. "mul r7, r6, r7\n\t"
  126693. "adds r3, r3, r7\n\t"
  126694. "adcs r4, r4, #0\n\t"
  126695. "adc r5, r5, #0\n\t"
  126696. "lsr r7, r12, #16\n\t"
  126697. "mul r6, r7, r6\n\t"
  126698. "lsr r7, r6, #16\n\t"
  126699. "lsl r6, r6, #16\n\t"
  126700. "adds r3, r3, r6\n\t"
  126701. "adcs r4, r4, r7\n\t"
  126702. "adc r5, r5, #0\n\t"
  126703. "lsr r6, r8, #16\n\t"
  126704. "lsr r7, r12, #16\n\t"
  126705. "mul r7, r6, r7\n\t"
  126706. "adds r4, r4, r7\n\t"
  126707. "adc r5, r5, #0\n\t"
  126708. "lsl r7, r12, #16\n\t"
  126709. "lsr r7, r7, #16\n\t"
  126710. "mul r6, r7, r6\n\t"
  126711. "lsr r7, r6, #16\n\t"
  126712. "lsl r6, r6, #16\n\t"
  126713. "adds r3, r3, r6\n\t"
  126714. "adcs r4, r4, r7\n\t"
  126715. "adc r5, r5, #0\n\t"
  126716. #else
  126717. "umull r6, r7, r8, r12\n\t"
  126718. "adds r3, r3, r6\n\t"
  126719. "adcs r4, r4, r7\n\t"
  126720. "adc r5, r5, #0\n\t"
  126721. #endif
  126722. /* A[9] * B[6] */
  126723. "ldr r8, [%[a], #36]\n\t"
  126724. "ldr r9, [%[b], #24]\n\t"
  126725. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126726. "lsl r6, r8, #16\n\t"
  126727. "lsl r7, r9, #16\n\t"
  126728. "lsr r6, r6, #16\n\t"
  126729. "lsr r7, r7, #16\n\t"
  126730. "mul r7, r6, r7\n\t"
  126731. "adds r3, r3, r7\n\t"
  126732. "adcs r4, r4, #0\n\t"
  126733. "adc r5, r5, #0\n\t"
  126734. "lsr r7, r9, #16\n\t"
  126735. "mul r6, r7, r6\n\t"
  126736. "lsr r7, r6, #16\n\t"
  126737. "lsl r6, r6, #16\n\t"
  126738. "adds r3, r3, r6\n\t"
  126739. "adcs r4, r4, r7\n\t"
  126740. "adc r5, r5, #0\n\t"
  126741. "lsr r6, r8, #16\n\t"
  126742. "lsr r7, r9, #16\n\t"
  126743. "mul r7, r6, r7\n\t"
  126744. "adds r4, r4, r7\n\t"
  126745. "adc r5, r5, #0\n\t"
  126746. "lsl r7, r9, #16\n\t"
  126747. "lsr r7, r7, #16\n\t"
  126748. "mul r6, r7, r6\n\t"
  126749. "lsr r7, r6, #16\n\t"
  126750. "lsl r6, r6, #16\n\t"
  126751. "adds r3, r3, r6\n\t"
  126752. "adcs r4, r4, r7\n\t"
  126753. "adc r5, r5, #0\n\t"
  126754. #else
  126755. "umull r6, r7, r8, r9\n\t"
  126756. "adds r3, r3, r6\n\t"
  126757. "adcs r4, r4, r7\n\t"
  126758. "adc r5, r5, #0\n\t"
  126759. #endif
  126760. /* A[10] * B[5] */
  126761. "ldr r8, [%[a], #40]\n\t"
  126762. "ldr r9, [%[b], #20]\n\t"
  126763. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126764. "lsl r6, r8, #16\n\t"
  126765. "lsl r7, r9, #16\n\t"
  126766. "lsr r6, r6, #16\n\t"
  126767. "lsr r7, r7, #16\n\t"
  126768. "mul r7, r6, r7\n\t"
  126769. "adds r3, r3, r7\n\t"
  126770. "adcs r4, r4, #0\n\t"
  126771. "adc r5, r5, #0\n\t"
  126772. "lsr r7, r9, #16\n\t"
  126773. "mul r6, r7, r6\n\t"
  126774. "lsr r7, r6, #16\n\t"
  126775. "lsl r6, r6, #16\n\t"
  126776. "adds r3, r3, r6\n\t"
  126777. "adcs r4, r4, r7\n\t"
  126778. "adc r5, r5, #0\n\t"
  126779. "lsr r6, r8, #16\n\t"
  126780. "lsr r7, r9, #16\n\t"
  126781. "mul r7, r6, r7\n\t"
  126782. "adds r4, r4, r7\n\t"
  126783. "adc r5, r5, #0\n\t"
  126784. "lsl r7, r9, #16\n\t"
  126785. "lsr r7, r7, #16\n\t"
  126786. "mul r6, r7, r6\n\t"
  126787. "lsr r7, r6, #16\n\t"
  126788. "lsl r6, r6, #16\n\t"
  126789. "adds r3, r3, r6\n\t"
  126790. "adcs r4, r4, r7\n\t"
  126791. "adc r5, r5, #0\n\t"
  126792. #else
  126793. "umull r6, r7, r8, r9\n\t"
  126794. "adds r3, r3, r6\n\t"
  126795. "adcs r4, r4, r7\n\t"
  126796. "adc r5, r5, #0\n\t"
  126797. #endif
  126798. /* A[11] * B[4] */
  126799. "ldr r8, [%[a], #44]\n\t"
  126800. "ldr r9, [%[b], #16]\n\t"
  126801. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126802. "lsl r6, r8, #16\n\t"
  126803. "lsl r7, r9, #16\n\t"
  126804. "lsr r6, r6, #16\n\t"
  126805. "lsr r7, r7, #16\n\t"
  126806. "mul r7, r6, r7\n\t"
  126807. "adds r3, r3, r7\n\t"
  126808. "adcs r4, r4, #0\n\t"
  126809. "adc r5, r5, #0\n\t"
  126810. "lsr r7, r9, #16\n\t"
  126811. "mul r6, r7, r6\n\t"
  126812. "lsr r7, r6, #16\n\t"
  126813. "lsl r6, r6, #16\n\t"
  126814. "adds r3, r3, r6\n\t"
  126815. "adcs r4, r4, r7\n\t"
  126816. "adc r5, r5, #0\n\t"
  126817. "lsr r6, r8, #16\n\t"
  126818. "lsr r7, r9, #16\n\t"
  126819. "mul r7, r6, r7\n\t"
  126820. "adds r4, r4, r7\n\t"
  126821. "adc r5, r5, #0\n\t"
  126822. "lsl r7, r9, #16\n\t"
  126823. "lsr r7, r7, #16\n\t"
  126824. "mul r6, r7, r6\n\t"
  126825. "lsr r7, r6, #16\n\t"
  126826. "lsl r6, r6, #16\n\t"
  126827. "adds r3, r3, r6\n\t"
  126828. "adcs r4, r4, r7\n\t"
  126829. "adc r5, r5, #0\n\t"
  126830. #else
  126831. "umull r6, r7, r8, r9\n\t"
  126832. "adds r3, r3, r6\n\t"
  126833. "adcs r4, r4, r7\n\t"
  126834. "adc r5, r5, #0\n\t"
  126835. #endif
  126836. /* A[12] * B[3] */
  126837. "ldr r8, [%[a], #48]\n\t"
  126838. "ldr r9, [%[b], #12]\n\t"
  126839. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126840. "lsl r6, r8, #16\n\t"
  126841. "lsl r7, r9, #16\n\t"
  126842. "lsr r6, r6, #16\n\t"
  126843. "lsr r7, r7, #16\n\t"
  126844. "mul r7, r6, r7\n\t"
  126845. "adds r3, r3, r7\n\t"
  126846. "adcs r4, r4, #0\n\t"
  126847. "adc r5, r5, #0\n\t"
  126848. "lsr r7, r9, #16\n\t"
  126849. "mul r6, r7, r6\n\t"
  126850. "lsr r7, r6, #16\n\t"
  126851. "lsl r6, r6, #16\n\t"
  126852. "adds r3, r3, r6\n\t"
  126853. "adcs r4, r4, r7\n\t"
  126854. "adc r5, r5, #0\n\t"
  126855. "lsr r6, r8, #16\n\t"
  126856. "lsr r7, r9, #16\n\t"
  126857. "mul r7, r6, r7\n\t"
  126858. "adds r4, r4, r7\n\t"
  126859. "adc r5, r5, #0\n\t"
  126860. "lsl r7, r9, #16\n\t"
  126861. "lsr r7, r7, #16\n\t"
  126862. "mul r6, r7, r6\n\t"
  126863. "lsr r7, r6, #16\n\t"
  126864. "lsl r6, r6, #16\n\t"
  126865. "adds r3, r3, r6\n\t"
  126866. "adcs r4, r4, r7\n\t"
  126867. "adc r5, r5, #0\n\t"
  126868. #else
  126869. "umull r6, r7, r8, r9\n\t"
  126870. "adds r3, r3, r6\n\t"
  126871. "adcs r4, r4, r7\n\t"
  126872. "adc r5, r5, #0\n\t"
  126873. #endif
  126874. /* A[13] * B[2] */
  126875. "ldr r8, [%[a], #52]\n\t"
  126876. "ldr r9, [%[b], #8]\n\t"
  126877. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126878. "lsl r6, r8, #16\n\t"
  126879. "lsl r7, r9, #16\n\t"
  126880. "lsr r6, r6, #16\n\t"
  126881. "lsr r7, r7, #16\n\t"
  126882. "mul r7, r6, r7\n\t"
  126883. "adds r3, r3, r7\n\t"
  126884. "adcs r4, r4, #0\n\t"
  126885. "adc r5, r5, #0\n\t"
  126886. "lsr r7, r9, #16\n\t"
  126887. "mul r6, r7, r6\n\t"
  126888. "lsr r7, r6, #16\n\t"
  126889. "lsl r6, r6, #16\n\t"
  126890. "adds r3, r3, r6\n\t"
  126891. "adcs r4, r4, r7\n\t"
  126892. "adc r5, r5, #0\n\t"
  126893. "lsr r6, r8, #16\n\t"
  126894. "lsr r7, r9, #16\n\t"
  126895. "mul r7, r6, r7\n\t"
  126896. "adds r4, r4, r7\n\t"
  126897. "adc r5, r5, #0\n\t"
  126898. "lsl r7, r9, #16\n\t"
  126899. "lsr r7, r7, #16\n\t"
  126900. "mul r6, r7, r6\n\t"
  126901. "lsr r7, r6, #16\n\t"
  126902. "lsl r6, r6, #16\n\t"
  126903. "adds r3, r3, r6\n\t"
  126904. "adcs r4, r4, r7\n\t"
  126905. "adc r5, r5, #0\n\t"
  126906. #else
  126907. "umull r6, r7, r8, r9\n\t"
  126908. "adds r3, r3, r6\n\t"
  126909. "adcs r4, r4, r7\n\t"
  126910. "adc r5, r5, #0\n\t"
  126911. #endif
  126912. /* A[14] * B[1] */
  126913. "ldr r8, [%[a], #56]\n\t"
  126914. "ldr r9, [%[b], #4]\n\t"
  126915. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126916. "lsl r6, r8, #16\n\t"
  126917. "lsl r7, r9, #16\n\t"
  126918. "lsr r6, r6, #16\n\t"
  126919. "lsr r7, r7, #16\n\t"
  126920. "mul r7, r6, r7\n\t"
  126921. "adds r3, r3, r7\n\t"
  126922. "adcs r4, r4, #0\n\t"
  126923. "adc r5, r5, #0\n\t"
  126924. "lsr r7, r9, #16\n\t"
  126925. "mul r6, r7, r6\n\t"
  126926. "lsr r7, r6, #16\n\t"
  126927. "lsl r6, r6, #16\n\t"
  126928. "adds r3, r3, r6\n\t"
  126929. "adcs r4, r4, r7\n\t"
  126930. "adc r5, r5, #0\n\t"
  126931. "lsr r6, r8, #16\n\t"
  126932. "lsr r7, r9, #16\n\t"
  126933. "mul r7, r6, r7\n\t"
  126934. "adds r4, r4, r7\n\t"
  126935. "adc r5, r5, #0\n\t"
  126936. "lsl r7, r9, #16\n\t"
  126937. "lsr r7, r7, #16\n\t"
  126938. "mul r6, r7, r6\n\t"
  126939. "lsr r7, r6, #16\n\t"
  126940. "lsl r6, r6, #16\n\t"
  126941. "adds r3, r3, r6\n\t"
  126942. "adcs r4, r4, r7\n\t"
  126943. "adc r5, r5, #0\n\t"
  126944. #else
  126945. "umull r6, r7, r8, r9\n\t"
  126946. "adds r3, r3, r6\n\t"
  126947. "adcs r4, r4, r7\n\t"
  126948. "adc r5, r5, #0\n\t"
  126949. #endif
  126950. /* A[15] * B[0] */
  126951. "ldr r8, [%[a], #60]\n\t"
  126952. "ldr r9, [%[b]]\n\t"
  126953. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126954. "lsl r6, r8, #16\n\t"
  126955. "lsl r7, r9, #16\n\t"
  126956. "lsr r6, r6, #16\n\t"
  126957. "lsr r7, r7, #16\n\t"
  126958. "mul r7, r6, r7\n\t"
  126959. "adds r3, r3, r7\n\t"
  126960. "adcs r4, r4, #0\n\t"
  126961. "adc r5, r5, #0\n\t"
  126962. "lsr r7, r9, #16\n\t"
  126963. "mul r6, r7, r6\n\t"
  126964. "lsr r7, r6, #16\n\t"
  126965. "lsl r6, r6, #16\n\t"
  126966. "adds r3, r3, r6\n\t"
  126967. "adcs r4, r4, r7\n\t"
  126968. "adc r5, r5, #0\n\t"
  126969. "lsr r6, r8, #16\n\t"
  126970. "lsr r7, r9, #16\n\t"
  126971. "mul r7, r6, r7\n\t"
  126972. "adds r4, r4, r7\n\t"
  126973. "adc r5, r5, #0\n\t"
  126974. "lsl r7, r9, #16\n\t"
  126975. "lsr r7, r7, #16\n\t"
  126976. "mul r6, r7, r6\n\t"
  126977. "lsr r7, r6, #16\n\t"
  126978. "lsl r6, r6, #16\n\t"
  126979. "adds r3, r3, r6\n\t"
  126980. "adcs r4, r4, r7\n\t"
  126981. "adc r5, r5, #0\n\t"
  126982. #else
  126983. "umull r6, r7, r8, r9\n\t"
  126984. "adds r3, r3, r6\n\t"
  126985. "adcs r4, r4, r7\n\t"
  126986. "adc r5, r5, #0\n\t"
  126987. #endif
  126988. "str r3, [sp, #60]\n\t"
  126989. /* A[15] * B[1] */
  126990. "ldr r9, [%[b], #4]\n\t"
  126991. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  126992. "lsl r6, r8, #16\n\t"
  126993. "lsl r7, r9, #16\n\t"
  126994. "lsr r6, r6, #16\n\t"
  126995. "lsr r7, r7, #16\n\t"
  126996. "mul r7, r6, r7\n\t"
  126997. "adds r4, r4, r7\n\t"
  126998. "adcs r5, r5, #0\n\t"
  126999. "mov r3, #0\n\t"
  127000. "adc r3, r3, #0\n\t"
  127001. "lsr r7, r9, #16\n\t"
  127002. "mul r6, r7, r6\n\t"
  127003. "lsr r7, r6, #16\n\t"
  127004. "lsl r6, r6, #16\n\t"
  127005. "adds r4, r4, r6\n\t"
  127006. "adcs r5, r5, r7\n\t"
  127007. "adc r3, r3, #0\n\t"
  127008. "lsr r6, r8, #16\n\t"
  127009. "lsr r7, r9, #16\n\t"
  127010. "mul r7, r6, r7\n\t"
  127011. "adds r5, r5, r7\n\t"
  127012. "adc r3, r3, #0\n\t"
  127013. "lsl r7, r9, #16\n\t"
  127014. "lsr r7, r7, #16\n\t"
  127015. "mul r6, r7, r6\n\t"
  127016. "lsr r7, r6, #16\n\t"
  127017. "lsl r6, r6, #16\n\t"
  127018. "adds r4, r4, r6\n\t"
  127019. "adcs r5, r5, r7\n\t"
  127020. "adc r3, r3, #0\n\t"
  127021. #else
  127022. "umull r6, r7, r8, r9\n\t"
  127023. "adds r4, r4, r6\n\t"
  127024. "adcs r5, r5, r7\n\t"
  127025. "mov r3, #0\n\t"
  127026. "adc r3, r3, #0\n\t"
  127027. #endif
  127028. /* A[14] * B[2] */
  127029. "ldr r8, [%[a], #56]\n\t"
  127030. "ldr r9, [%[b], #8]\n\t"
  127031. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127032. "lsl r6, r8, #16\n\t"
  127033. "lsl r7, r9, #16\n\t"
  127034. "lsr r6, r6, #16\n\t"
  127035. "lsr r7, r7, #16\n\t"
  127036. "mul r7, r6, r7\n\t"
  127037. "adds r4, r4, r7\n\t"
  127038. "adcs r5, r5, #0\n\t"
  127039. "adc r3, r3, #0\n\t"
  127040. "lsr r7, r9, #16\n\t"
  127041. "mul r6, r7, r6\n\t"
  127042. "lsr r7, r6, #16\n\t"
  127043. "lsl r6, r6, #16\n\t"
  127044. "adds r4, r4, r6\n\t"
  127045. "adcs r5, r5, r7\n\t"
  127046. "adc r3, r3, #0\n\t"
  127047. "lsr r6, r8, #16\n\t"
  127048. "lsr r7, r9, #16\n\t"
  127049. "mul r7, r6, r7\n\t"
  127050. "adds r5, r5, r7\n\t"
  127051. "adc r3, r3, #0\n\t"
  127052. "lsl r7, r9, #16\n\t"
  127053. "lsr r7, r7, #16\n\t"
  127054. "mul r6, r7, r6\n\t"
  127055. "lsr r7, r6, #16\n\t"
  127056. "lsl r6, r6, #16\n\t"
  127057. "adds r4, r4, r6\n\t"
  127058. "adcs r5, r5, r7\n\t"
  127059. "adc r3, r3, #0\n\t"
  127060. #else
  127061. "umull r6, r7, r8, r9\n\t"
  127062. "adds r4, r4, r6\n\t"
  127063. "adcs r5, r5, r7\n\t"
  127064. "adc r3, r3, #0\n\t"
  127065. #endif
  127066. /* A[13] * B[3] */
  127067. "ldr r8, [%[a], #52]\n\t"
  127068. "ldr r9, [%[b], #12]\n\t"
  127069. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127070. "lsl r6, r8, #16\n\t"
  127071. "lsl r7, r9, #16\n\t"
  127072. "lsr r6, r6, #16\n\t"
  127073. "lsr r7, r7, #16\n\t"
  127074. "mul r7, r6, r7\n\t"
  127075. "adds r4, r4, r7\n\t"
  127076. "adcs r5, r5, #0\n\t"
  127077. "adc r3, r3, #0\n\t"
  127078. "lsr r7, r9, #16\n\t"
  127079. "mul r6, r7, r6\n\t"
  127080. "lsr r7, r6, #16\n\t"
  127081. "lsl r6, r6, #16\n\t"
  127082. "adds r4, r4, r6\n\t"
  127083. "adcs r5, r5, r7\n\t"
  127084. "adc r3, r3, #0\n\t"
  127085. "lsr r6, r8, #16\n\t"
  127086. "lsr r7, r9, #16\n\t"
  127087. "mul r7, r6, r7\n\t"
  127088. "adds r5, r5, r7\n\t"
  127089. "adc r3, r3, #0\n\t"
  127090. "lsl r7, r9, #16\n\t"
  127091. "lsr r7, r7, #16\n\t"
  127092. "mul r6, r7, r6\n\t"
  127093. "lsr r7, r6, #16\n\t"
  127094. "lsl r6, r6, #16\n\t"
  127095. "adds r4, r4, r6\n\t"
  127096. "adcs r5, r5, r7\n\t"
  127097. "adc r3, r3, #0\n\t"
  127098. #else
  127099. "umull r6, r7, r8, r9\n\t"
  127100. "adds r4, r4, r6\n\t"
  127101. "adcs r5, r5, r7\n\t"
  127102. "adc r3, r3, #0\n\t"
  127103. #endif
  127104. /* A[12] * B[4] */
  127105. "ldr r8, [%[a], #48]\n\t"
  127106. "ldr r9, [%[b], #16]\n\t"
  127107. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127108. "lsl r6, r8, #16\n\t"
  127109. "lsl r7, r9, #16\n\t"
  127110. "lsr r6, r6, #16\n\t"
  127111. "lsr r7, r7, #16\n\t"
  127112. "mul r7, r6, r7\n\t"
  127113. "adds r4, r4, r7\n\t"
  127114. "adcs r5, r5, #0\n\t"
  127115. "adc r3, r3, #0\n\t"
  127116. "lsr r7, r9, #16\n\t"
  127117. "mul r6, r7, r6\n\t"
  127118. "lsr r7, r6, #16\n\t"
  127119. "lsl r6, r6, #16\n\t"
  127120. "adds r4, r4, r6\n\t"
  127121. "adcs r5, r5, r7\n\t"
  127122. "adc r3, r3, #0\n\t"
  127123. "lsr r6, r8, #16\n\t"
  127124. "lsr r7, r9, #16\n\t"
  127125. "mul r7, r6, r7\n\t"
  127126. "adds r5, r5, r7\n\t"
  127127. "adc r3, r3, #0\n\t"
  127128. "lsl r7, r9, #16\n\t"
  127129. "lsr r7, r7, #16\n\t"
  127130. "mul r6, r7, r6\n\t"
  127131. "lsr r7, r6, #16\n\t"
  127132. "lsl r6, r6, #16\n\t"
  127133. "adds r4, r4, r6\n\t"
  127134. "adcs r5, r5, r7\n\t"
  127135. "adc r3, r3, #0\n\t"
  127136. #else
  127137. "umull r6, r7, r8, r9\n\t"
  127138. "adds r4, r4, r6\n\t"
  127139. "adcs r5, r5, r7\n\t"
  127140. "adc r3, r3, #0\n\t"
  127141. #endif
  127142. /* A[11] * B[5] */
  127143. "ldr r8, [%[a], #44]\n\t"
  127144. "ldr r9, [%[b], #20]\n\t"
  127145. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127146. "lsl r6, r8, #16\n\t"
  127147. "lsl r7, r9, #16\n\t"
  127148. "lsr r6, r6, #16\n\t"
  127149. "lsr r7, r7, #16\n\t"
  127150. "mul r7, r6, r7\n\t"
  127151. "adds r4, r4, r7\n\t"
  127152. "adcs r5, r5, #0\n\t"
  127153. "adc r3, r3, #0\n\t"
  127154. "lsr r7, r9, #16\n\t"
  127155. "mul r6, r7, r6\n\t"
  127156. "lsr r7, r6, #16\n\t"
  127157. "lsl r6, r6, #16\n\t"
  127158. "adds r4, r4, r6\n\t"
  127159. "adcs r5, r5, r7\n\t"
  127160. "adc r3, r3, #0\n\t"
  127161. "lsr r6, r8, #16\n\t"
  127162. "lsr r7, r9, #16\n\t"
  127163. "mul r7, r6, r7\n\t"
  127164. "adds r5, r5, r7\n\t"
  127165. "adc r3, r3, #0\n\t"
  127166. "lsl r7, r9, #16\n\t"
  127167. "lsr r7, r7, #16\n\t"
  127168. "mul r6, r7, r6\n\t"
  127169. "lsr r7, r6, #16\n\t"
  127170. "lsl r6, r6, #16\n\t"
  127171. "adds r4, r4, r6\n\t"
  127172. "adcs r5, r5, r7\n\t"
  127173. "adc r3, r3, #0\n\t"
  127174. #else
  127175. "umull r6, r7, r8, r9\n\t"
  127176. "adds r4, r4, r6\n\t"
  127177. "adcs r5, r5, r7\n\t"
  127178. "adc r3, r3, #0\n\t"
  127179. #endif
  127180. /* A[10] * B[6] */
  127181. "ldr r8, [%[a], #40]\n\t"
  127182. "ldr r9, [%[b], #24]\n\t"
  127183. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127184. "lsl r6, r8, #16\n\t"
  127185. "lsl r7, r9, #16\n\t"
  127186. "lsr r6, r6, #16\n\t"
  127187. "lsr r7, r7, #16\n\t"
  127188. "mul r7, r6, r7\n\t"
  127189. "adds r4, r4, r7\n\t"
  127190. "adcs r5, r5, #0\n\t"
  127191. "adc r3, r3, #0\n\t"
  127192. "lsr r7, r9, #16\n\t"
  127193. "mul r6, r7, r6\n\t"
  127194. "lsr r7, r6, #16\n\t"
  127195. "lsl r6, r6, #16\n\t"
  127196. "adds r4, r4, r6\n\t"
  127197. "adcs r5, r5, r7\n\t"
  127198. "adc r3, r3, #0\n\t"
  127199. "lsr r6, r8, #16\n\t"
  127200. "lsr r7, r9, #16\n\t"
  127201. "mul r7, r6, r7\n\t"
  127202. "adds r5, r5, r7\n\t"
  127203. "adc r3, r3, #0\n\t"
  127204. "lsl r7, r9, #16\n\t"
  127205. "lsr r7, r7, #16\n\t"
  127206. "mul r6, r7, r6\n\t"
  127207. "lsr r7, r6, #16\n\t"
  127208. "lsl r6, r6, #16\n\t"
  127209. "adds r4, r4, r6\n\t"
  127210. "adcs r5, r5, r7\n\t"
  127211. "adc r3, r3, #0\n\t"
  127212. #else
  127213. "umull r6, r7, r8, r9\n\t"
  127214. "adds r4, r4, r6\n\t"
  127215. "adcs r5, r5, r7\n\t"
  127216. "adc r3, r3, #0\n\t"
  127217. #endif
  127218. /* A[9] * B[7] */
  127219. "ldr r8, [%[a], #36]\n\t"
  127220. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127221. "lsl r6, r8, #16\n\t"
  127222. "lsl r7, r12, #16\n\t"
  127223. "lsr r6, r6, #16\n\t"
  127224. "lsr r7, r7, #16\n\t"
  127225. "mul r7, r6, r7\n\t"
  127226. "adds r4, r4, r7\n\t"
  127227. "adcs r5, r5, #0\n\t"
  127228. "adc r3, r3, #0\n\t"
  127229. "lsr r7, r12, #16\n\t"
  127230. "mul r6, r7, r6\n\t"
  127231. "lsr r7, r6, #16\n\t"
  127232. "lsl r6, r6, #16\n\t"
  127233. "adds r4, r4, r6\n\t"
  127234. "adcs r5, r5, r7\n\t"
  127235. "adc r3, r3, #0\n\t"
  127236. "lsr r6, r8, #16\n\t"
  127237. "lsr r7, r12, #16\n\t"
  127238. "mul r7, r6, r7\n\t"
  127239. "adds r5, r5, r7\n\t"
  127240. "adc r3, r3, #0\n\t"
  127241. "lsl r7, r12, #16\n\t"
  127242. "lsr r7, r7, #16\n\t"
  127243. "mul r6, r7, r6\n\t"
  127244. "lsr r7, r6, #16\n\t"
  127245. "lsl r6, r6, #16\n\t"
  127246. "adds r4, r4, r6\n\t"
  127247. "adcs r5, r5, r7\n\t"
  127248. "adc r3, r3, #0\n\t"
  127249. #else
  127250. "umull r6, r7, r8, r12\n\t"
  127251. "adds r4, r4, r6\n\t"
  127252. "adcs r5, r5, r7\n\t"
  127253. "adc r3, r3, #0\n\t"
  127254. #endif
  127255. /* A[8] * B[8] */
  127256. "ldr r11, [%[a], #32]\n\t"
  127257. "ldr r12, [%[b], #32]\n\t"
  127258. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127259. "lsl r6, r11, #16\n\t"
  127260. "lsl r7, r12, #16\n\t"
  127261. "lsr r6, r6, #16\n\t"
  127262. "lsr r7, r7, #16\n\t"
  127263. "mul r7, r6, r7\n\t"
  127264. "adds r4, r4, r7\n\t"
  127265. "adcs r5, r5, #0\n\t"
  127266. "adc r3, r3, #0\n\t"
  127267. "lsr r7, r12, #16\n\t"
  127268. "mul r6, r7, r6\n\t"
  127269. "lsr r7, r6, #16\n\t"
  127270. "lsl r6, r6, #16\n\t"
  127271. "adds r4, r4, r6\n\t"
  127272. "adcs r5, r5, r7\n\t"
  127273. "adc r3, r3, #0\n\t"
  127274. "lsr r6, r11, #16\n\t"
  127275. "lsr r7, r12, #16\n\t"
  127276. "mul r7, r6, r7\n\t"
  127277. "adds r5, r5, r7\n\t"
  127278. "adc r3, r3, #0\n\t"
  127279. "lsl r7, r12, #16\n\t"
  127280. "lsr r7, r7, #16\n\t"
  127281. "mul r6, r7, r6\n\t"
  127282. "lsr r7, r6, #16\n\t"
  127283. "lsl r6, r6, #16\n\t"
  127284. "adds r4, r4, r6\n\t"
  127285. "adcs r5, r5, r7\n\t"
  127286. "adc r3, r3, #0\n\t"
  127287. #else
  127288. "umull r6, r7, r11, r12\n\t"
  127289. "adds r4, r4, r6\n\t"
  127290. "adcs r5, r5, r7\n\t"
  127291. "adc r3, r3, #0\n\t"
  127292. #endif
  127293. /* A[7] * B[9] */
  127294. "ldr r8, [%[a], #28]\n\t"
  127295. "ldr r9, [%[b], #36]\n\t"
  127296. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127297. "lsl r6, r8, #16\n\t"
  127298. "lsl r7, r9, #16\n\t"
  127299. "lsr r6, r6, #16\n\t"
  127300. "lsr r7, r7, #16\n\t"
  127301. "mul r7, r6, r7\n\t"
  127302. "adds r4, r4, r7\n\t"
  127303. "adcs r5, r5, #0\n\t"
  127304. "adc r3, r3, #0\n\t"
  127305. "lsr r7, r9, #16\n\t"
  127306. "mul r6, r7, r6\n\t"
  127307. "lsr r7, r6, #16\n\t"
  127308. "lsl r6, r6, #16\n\t"
  127309. "adds r4, r4, r6\n\t"
  127310. "adcs r5, r5, r7\n\t"
  127311. "adc r3, r3, #0\n\t"
  127312. "lsr r6, r8, #16\n\t"
  127313. "lsr r7, r9, #16\n\t"
  127314. "mul r7, r6, r7\n\t"
  127315. "adds r5, r5, r7\n\t"
  127316. "adc r3, r3, #0\n\t"
  127317. "lsl r7, r9, #16\n\t"
  127318. "lsr r7, r7, #16\n\t"
  127319. "mul r6, r7, r6\n\t"
  127320. "lsr r7, r6, #16\n\t"
  127321. "lsl r6, r6, #16\n\t"
  127322. "adds r4, r4, r6\n\t"
  127323. "adcs r5, r5, r7\n\t"
  127324. "adc r3, r3, #0\n\t"
  127325. #else
  127326. "umull r6, r7, r8, r9\n\t"
  127327. "adds r4, r4, r6\n\t"
  127328. "adcs r5, r5, r7\n\t"
  127329. "adc r3, r3, #0\n\t"
  127330. #endif
  127331. /* A[6] * B[10] */
  127332. "ldr r8, [%[a], #24]\n\t"
  127333. "ldr r9, [%[b], #40]\n\t"
  127334. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127335. "lsl r6, r8, #16\n\t"
  127336. "lsl r7, r9, #16\n\t"
  127337. "lsr r6, r6, #16\n\t"
  127338. "lsr r7, r7, #16\n\t"
  127339. "mul r7, r6, r7\n\t"
  127340. "adds r4, r4, r7\n\t"
  127341. "adcs r5, r5, #0\n\t"
  127342. "adc r3, r3, #0\n\t"
  127343. "lsr r7, r9, #16\n\t"
  127344. "mul r6, r7, r6\n\t"
  127345. "lsr r7, r6, #16\n\t"
  127346. "lsl r6, r6, #16\n\t"
  127347. "adds r4, r4, r6\n\t"
  127348. "adcs r5, r5, r7\n\t"
  127349. "adc r3, r3, #0\n\t"
  127350. "lsr r6, r8, #16\n\t"
  127351. "lsr r7, r9, #16\n\t"
  127352. "mul r7, r6, r7\n\t"
  127353. "adds r5, r5, r7\n\t"
  127354. "adc r3, r3, #0\n\t"
  127355. "lsl r7, r9, #16\n\t"
  127356. "lsr r7, r7, #16\n\t"
  127357. "mul r6, r7, r6\n\t"
  127358. "lsr r7, r6, #16\n\t"
  127359. "lsl r6, r6, #16\n\t"
  127360. "adds r4, r4, r6\n\t"
  127361. "adcs r5, r5, r7\n\t"
  127362. "adc r3, r3, #0\n\t"
  127363. #else
  127364. "umull r6, r7, r8, r9\n\t"
  127365. "adds r4, r4, r6\n\t"
  127366. "adcs r5, r5, r7\n\t"
  127367. "adc r3, r3, #0\n\t"
  127368. #endif
  127369. /* A[5] * B[11] */
  127370. "ldr r8, [%[a], #20]\n\t"
  127371. "ldr r9, [%[b], #44]\n\t"
  127372. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127373. "lsl r6, r8, #16\n\t"
  127374. "lsl r7, r9, #16\n\t"
  127375. "lsr r6, r6, #16\n\t"
  127376. "lsr r7, r7, #16\n\t"
  127377. "mul r7, r6, r7\n\t"
  127378. "adds r4, r4, r7\n\t"
  127379. "adcs r5, r5, #0\n\t"
  127380. "adc r3, r3, #0\n\t"
  127381. "lsr r7, r9, #16\n\t"
  127382. "mul r6, r7, r6\n\t"
  127383. "lsr r7, r6, #16\n\t"
  127384. "lsl r6, r6, #16\n\t"
  127385. "adds r4, r4, r6\n\t"
  127386. "adcs r5, r5, r7\n\t"
  127387. "adc r3, r3, #0\n\t"
  127388. "lsr r6, r8, #16\n\t"
  127389. "lsr r7, r9, #16\n\t"
  127390. "mul r7, r6, r7\n\t"
  127391. "adds r5, r5, r7\n\t"
  127392. "adc r3, r3, #0\n\t"
  127393. "lsl r7, r9, #16\n\t"
  127394. "lsr r7, r7, #16\n\t"
  127395. "mul r6, r7, r6\n\t"
  127396. "lsr r7, r6, #16\n\t"
  127397. "lsl r6, r6, #16\n\t"
  127398. "adds r4, r4, r6\n\t"
  127399. "adcs r5, r5, r7\n\t"
  127400. "adc r3, r3, #0\n\t"
  127401. #else
  127402. "umull r6, r7, r8, r9\n\t"
  127403. "adds r4, r4, r6\n\t"
  127404. "adcs r5, r5, r7\n\t"
  127405. "adc r3, r3, #0\n\t"
  127406. #endif
  127407. /* A[4] * B[12] */
  127408. "ldr r8, [%[a], #16]\n\t"
  127409. "ldr r9, [%[b], #48]\n\t"
  127410. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127411. "lsl r6, r8, #16\n\t"
  127412. "lsl r7, r9, #16\n\t"
  127413. "lsr r6, r6, #16\n\t"
  127414. "lsr r7, r7, #16\n\t"
  127415. "mul r7, r6, r7\n\t"
  127416. "adds r4, r4, r7\n\t"
  127417. "adcs r5, r5, #0\n\t"
  127418. "adc r3, r3, #0\n\t"
  127419. "lsr r7, r9, #16\n\t"
  127420. "mul r6, r7, r6\n\t"
  127421. "lsr r7, r6, #16\n\t"
  127422. "lsl r6, r6, #16\n\t"
  127423. "adds r4, r4, r6\n\t"
  127424. "adcs r5, r5, r7\n\t"
  127425. "adc r3, r3, #0\n\t"
  127426. "lsr r6, r8, #16\n\t"
  127427. "lsr r7, r9, #16\n\t"
  127428. "mul r7, r6, r7\n\t"
  127429. "adds r5, r5, r7\n\t"
  127430. "adc r3, r3, #0\n\t"
  127431. "lsl r7, r9, #16\n\t"
  127432. "lsr r7, r7, #16\n\t"
  127433. "mul r6, r7, r6\n\t"
  127434. "lsr r7, r6, #16\n\t"
  127435. "lsl r6, r6, #16\n\t"
  127436. "adds r4, r4, r6\n\t"
  127437. "adcs r5, r5, r7\n\t"
  127438. "adc r3, r3, #0\n\t"
  127439. #else
  127440. "umull r6, r7, r8, r9\n\t"
  127441. "adds r4, r4, r6\n\t"
  127442. "adcs r5, r5, r7\n\t"
  127443. "adc r3, r3, #0\n\t"
  127444. #endif
  127445. /* A[3] * B[13] */
  127446. "ldr r8, [%[a], #12]\n\t"
  127447. "ldr r9, [%[b], #52]\n\t"
  127448. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127449. "lsl r6, r8, #16\n\t"
  127450. "lsl r7, r9, #16\n\t"
  127451. "lsr r6, r6, #16\n\t"
  127452. "lsr r7, r7, #16\n\t"
  127453. "mul r7, r6, r7\n\t"
  127454. "adds r4, r4, r7\n\t"
  127455. "adcs r5, r5, #0\n\t"
  127456. "adc r3, r3, #0\n\t"
  127457. "lsr r7, r9, #16\n\t"
  127458. "mul r6, r7, r6\n\t"
  127459. "lsr r7, r6, #16\n\t"
  127460. "lsl r6, r6, #16\n\t"
  127461. "adds r4, r4, r6\n\t"
  127462. "adcs r5, r5, r7\n\t"
  127463. "adc r3, r3, #0\n\t"
  127464. "lsr r6, r8, #16\n\t"
  127465. "lsr r7, r9, #16\n\t"
  127466. "mul r7, r6, r7\n\t"
  127467. "adds r5, r5, r7\n\t"
  127468. "adc r3, r3, #0\n\t"
  127469. "lsl r7, r9, #16\n\t"
  127470. "lsr r7, r7, #16\n\t"
  127471. "mul r6, r7, r6\n\t"
  127472. "lsr r7, r6, #16\n\t"
  127473. "lsl r6, r6, #16\n\t"
  127474. "adds r4, r4, r6\n\t"
  127475. "adcs r5, r5, r7\n\t"
  127476. "adc r3, r3, #0\n\t"
  127477. #else
  127478. "umull r6, r7, r8, r9\n\t"
  127479. "adds r4, r4, r6\n\t"
  127480. "adcs r5, r5, r7\n\t"
  127481. "adc r3, r3, #0\n\t"
  127482. #endif
  127483. /* A[2] * B[14] */
  127484. "ldr r8, [%[a], #8]\n\t"
  127485. "ldr r9, [%[b], #56]\n\t"
  127486. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127487. "lsl r6, r8, #16\n\t"
  127488. "lsl r7, r9, #16\n\t"
  127489. "lsr r6, r6, #16\n\t"
  127490. "lsr r7, r7, #16\n\t"
  127491. "mul r7, r6, r7\n\t"
  127492. "adds r4, r4, r7\n\t"
  127493. "adcs r5, r5, #0\n\t"
  127494. "adc r3, r3, #0\n\t"
  127495. "lsr r7, r9, #16\n\t"
  127496. "mul r6, r7, r6\n\t"
  127497. "lsr r7, r6, #16\n\t"
  127498. "lsl r6, r6, #16\n\t"
  127499. "adds r4, r4, r6\n\t"
  127500. "adcs r5, r5, r7\n\t"
  127501. "adc r3, r3, #0\n\t"
  127502. "lsr r6, r8, #16\n\t"
  127503. "lsr r7, r9, #16\n\t"
  127504. "mul r7, r6, r7\n\t"
  127505. "adds r5, r5, r7\n\t"
  127506. "adc r3, r3, #0\n\t"
  127507. "lsl r7, r9, #16\n\t"
  127508. "lsr r7, r7, #16\n\t"
  127509. "mul r6, r7, r6\n\t"
  127510. "lsr r7, r6, #16\n\t"
  127511. "lsl r6, r6, #16\n\t"
  127512. "adds r4, r4, r6\n\t"
  127513. "adcs r5, r5, r7\n\t"
  127514. "adc r3, r3, #0\n\t"
  127515. #else
  127516. "umull r6, r7, r8, r9\n\t"
  127517. "adds r4, r4, r6\n\t"
  127518. "adcs r5, r5, r7\n\t"
  127519. "adc r3, r3, #0\n\t"
  127520. #endif
  127521. /* A[1] * B[15] */
  127522. "ldr r8, [%[a], #4]\n\t"
  127523. "ldr r9, [%[b], #60]\n\t"
  127524. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127525. "lsl r6, r8, #16\n\t"
  127526. "lsl r7, r9, #16\n\t"
  127527. "lsr r6, r6, #16\n\t"
  127528. "lsr r7, r7, #16\n\t"
  127529. "mul r7, r6, r7\n\t"
  127530. "adds r4, r4, r7\n\t"
  127531. "adcs r5, r5, #0\n\t"
  127532. "adc r3, r3, #0\n\t"
  127533. "lsr r7, r9, #16\n\t"
  127534. "mul r6, r7, r6\n\t"
  127535. "lsr r7, r6, #16\n\t"
  127536. "lsl r6, r6, #16\n\t"
  127537. "adds r4, r4, r6\n\t"
  127538. "adcs r5, r5, r7\n\t"
  127539. "adc r3, r3, #0\n\t"
  127540. "lsr r6, r8, #16\n\t"
  127541. "lsr r7, r9, #16\n\t"
  127542. "mul r7, r6, r7\n\t"
  127543. "adds r5, r5, r7\n\t"
  127544. "adc r3, r3, #0\n\t"
  127545. "lsl r7, r9, #16\n\t"
  127546. "lsr r7, r7, #16\n\t"
  127547. "mul r6, r7, r6\n\t"
  127548. "lsr r7, r6, #16\n\t"
  127549. "lsl r6, r6, #16\n\t"
  127550. "adds r4, r4, r6\n\t"
  127551. "adcs r5, r5, r7\n\t"
  127552. "adc r3, r3, #0\n\t"
  127553. #else
  127554. "umull r6, r7, r8, r9\n\t"
  127555. "adds r4, r4, r6\n\t"
  127556. "adcs r5, r5, r7\n\t"
  127557. "adc r3, r3, #0\n\t"
  127558. #endif
  127559. "str r4, [%[r], #64]\n\t"
  127560. /* A[2] * B[15] */
  127561. "ldr r8, [%[a], #8]\n\t"
  127562. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127563. "lsl r6, r8, #16\n\t"
  127564. "lsl r7, r9, #16\n\t"
  127565. "lsr r6, r6, #16\n\t"
  127566. "lsr r7, r7, #16\n\t"
  127567. "mul r7, r6, r7\n\t"
  127568. "adds r5, r5, r7\n\t"
  127569. "adcs r3, r3, #0\n\t"
  127570. "mov r4, #0\n\t"
  127571. "adc r4, r4, #0\n\t"
  127572. "lsr r7, r9, #16\n\t"
  127573. "mul r6, r7, r6\n\t"
  127574. "lsr r7, r6, #16\n\t"
  127575. "lsl r6, r6, #16\n\t"
  127576. "adds r5, r5, r6\n\t"
  127577. "adcs r3, r3, r7\n\t"
  127578. "adc r4, r4, #0\n\t"
  127579. "lsr r6, r8, #16\n\t"
  127580. "lsr r7, r9, #16\n\t"
  127581. "mul r7, r6, r7\n\t"
  127582. "adds r3, r3, r7\n\t"
  127583. "adc r4, r4, #0\n\t"
  127584. "lsl r7, r9, #16\n\t"
  127585. "lsr r7, r7, #16\n\t"
  127586. "mul r6, r7, r6\n\t"
  127587. "lsr r7, r6, #16\n\t"
  127588. "lsl r6, r6, #16\n\t"
  127589. "adds r5, r5, r6\n\t"
  127590. "adcs r3, r3, r7\n\t"
  127591. "adc r4, r4, #0\n\t"
  127592. #else
  127593. "umull r6, r7, r8, r9\n\t"
  127594. "adds r5, r5, r6\n\t"
  127595. "adcs r3, r3, r7\n\t"
  127596. "mov r4, #0\n\t"
  127597. "adc r4, r4, #0\n\t"
  127598. #endif
  127599. /* A[3] * B[14] */
  127600. "ldr r8, [%[a], #12]\n\t"
  127601. "ldr r9, [%[b], #56]\n\t"
  127602. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127603. "lsl r6, r8, #16\n\t"
  127604. "lsl r7, r9, #16\n\t"
  127605. "lsr r6, r6, #16\n\t"
  127606. "lsr r7, r7, #16\n\t"
  127607. "mul r7, r6, r7\n\t"
  127608. "adds r5, r5, r7\n\t"
  127609. "adcs r3, r3, #0\n\t"
  127610. "adc r4, r4, #0\n\t"
  127611. "lsr r7, r9, #16\n\t"
  127612. "mul r6, r7, r6\n\t"
  127613. "lsr r7, r6, #16\n\t"
  127614. "lsl r6, r6, #16\n\t"
  127615. "adds r5, r5, r6\n\t"
  127616. "adcs r3, r3, r7\n\t"
  127617. "adc r4, r4, #0\n\t"
  127618. "lsr r6, r8, #16\n\t"
  127619. "lsr r7, r9, #16\n\t"
  127620. "mul r7, r6, r7\n\t"
  127621. "adds r3, r3, r7\n\t"
  127622. "adc r4, r4, #0\n\t"
  127623. "lsl r7, r9, #16\n\t"
  127624. "lsr r7, r7, #16\n\t"
  127625. "mul r6, r7, r6\n\t"
  127626. "lsr r7, r6, #16\n\t"
  127627. "lsl r6, r6, #16\n\t"
  127628. "adds r5, r5, r6\n\t"
  127629. "adcs r3, r3, r7\n\t"
  127630. "adc r4, r4, #0\n\t"
  127631. #else
  127632. "umull r6, r7, r8, r9\n\t"
  127633. "adds r5, r5, r6\n\t"
  127634. "adcs r3, r3, r7\n\t"
  127635. "adc r4, r4, #0\n\t"
  127636. #endif
  127637. /* A[4] * B[13] */
  127638. "ldr r8, [%[a], #16]\n\t"
  127639. "ldr r9, [%[b], #52]\n\t"
  127640. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127641. "lsl r6, r8, #16\n\t"
  127642. "lsl r7, r9, #16\n\t"
  127643. "lsr r6, r6, #16\n\t"
  127644. "lsr r7, r7, #16\n\t"
  127645. "mul r7, r6, r7\n\t"
  127646. "adds r5, r5, r7\n\t"
  127647. "adcs r3, r3, #0\n\t"
  127648. "adc r4, r4, #0\n\t"
  127649. "lsr r7, r9, #16\n\t"
  127650. "mul r6, r7, r6\n\t"
  127651. "lsr r7, r6, #16\n\t"
  127652. "lsl r6, r6, #16\n\t"
  127653. "adds r5, r5, r6\n\t"
  127654. "adcs r3, r3, r7\n\t"
  127655. "adc r4, r4, #0\n\t"
  127656. "lsr r6, r8, #16\n\t"
  127657. "lsr r7, r9, #16\n\t"
  127658. "mul r7, r6, r7\n\t"
  127659. "adds r3, r3, r7\n\t"
  127660. "adc r4, r4, #0\n\t"
  127661. "lsl r7, r9, #16\n\t"
  127662. "lsr r7, r7, #16\n\t"
  127663. "mul r6, r7, r6\n\t"
  127664. "lsr r7, r6, #16\n\t"
  127665. "lsl r6, r6, #16\n\t"
  127666. "adds r5, r5, r6\n\t"
  127667. "adcs r3, r3, r7\n\t"
  127668. "adc r4, r4, #0\n\t"
  127669. #else
  127670. "umull r6, r7, r8, r9\n\t"
  127671. "adds r5, r5, r6\n\t"
  127672. "adcs r3, r3, r7\n\t"
  127673. "adc r4, r4, #0\n\t"
  127674. #endif
  127675. /* A[5] * B[12] */
  127676. "ldr r8, [%[a], #20]\n\t"
  127677. "ldr r9, [%[b], #48]\n\t"
  127678. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127679. "lsl r6, r8, #16\n\t"
  127680. "lsl r7, r9, #16\n\t"
  127681. "lsr r6, r6, #16\n\t"
  127682. "lsr r7, r7, #16\n\t"
  127683. "mul r7, r6, r7\n\t"
  127684. "adds r5, r5, r7\n\t"
  127685. "adcs r3, r3, #0\n\t"
  127686. "adc r4, r4, #0\n\t"
  127687. "lsr r7, r9, #16\n\t"
  127688. "mul r6, r7, r6\n\t"
  127689. "lsr r7, r6, #16\n\t"
  127690. "lsl r6, r6, #16\n\t"
  127691. "adds r5, r5, r6\n\t"
  127692. "adcs r3, r3, r7\n\t"
  127693. "adc r4, r4, #0\n\t"
  127694. "lsr r6, r8, #16\n\t"
  127695. "lsr r7, r9, #16\n\t"
  127696. "mul r7, r6, r7\n\t"
  127697. "adds r3, r3, r7\n\t"
  127698. "adc r4, r4, #0\n\t"
  127699. "lsl r7, r9, #16\n\t"
  127700. "lsr r7, r7, #16\n\t"
  127701. "mul r6, r7, r6\n\t"
  127702. "lsr r7, r6, #16\n\t"
  127703. "lsl r6, r6, #16\n\t"
  127704. "adds r5, r5, r6\n\t"
  127705. "adcs r3, r3, r7\n\t"
  127706. "adc r4, r4, #0\n\t"
  127707. #else
  127708. "umull r6, r7, r8, r9\n\t"
  127709. "adds r5, r5, r6\n\t"
  127710. "adcs r3, r3, r7\n\t"
  127711. "adc r4, r4, #0\n\t"
  127712. #endif
  127713. /* A[6] * B[11] */
  127714. "ldr r8, [%[a], #24]\n\t"
  127715. "ldr r9, [%[b], #44]\n\t"
  127716. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127717. "lsl r6, r8, #16\n\t"
  127718. "lsl r7, r9, #16\n\t"
  127719. "lsr r6, r6, #16\n\t"
  127720. "lsr r7, r7, #16\n\t"
  127721. "mul r7, r6, r7\n\t"
  127722. "adds r5, r5, r7\n\t"
  127723. "adcs r3, r3, #0\n\t"
  127724. "adc r4, r4, #0\n\t"
  127725. "lsr r7, r9, #16\n\t"
  127726. "mul r6, r7, r6\n\t"
  127727. "lsr r7, r6, #16\n\t"
  127728. "lsl r6, r6, #16\n\t"
  127729. "adds r5, r5, r6\n\t"
  127730. "adcs r3, r3, r7\n\t"
  127731. "adc r4, r4, #0\n\t"
  127732. "lsr r6, r8, #16\n\t"
  127733. "lsr r7, r9, #16\n\t"
  127734. "mul r7, r6, r7\n\t"
  127735. "adds r3, r3, r7\n\t"
  127736. "adc r4, r4, #0\n\t"
  127737. "lsl r7, r9, #16\n\t"
  127738. "lsr r7, r7, #16\n\t"
  127739. "mul r6, r7, r6\n\t"
  127740. "lsr r7, r6, #16\n\t"
  127741. "lsl r6, r6, #16\n\t"
  127742. "adds r5, r5, r6\n\t"
  127743. "adcs r3, r3, r7\n\t"
  127744. "adc r4, r4, #0\n\t"
  127745. #else
  127746. "umull r6, r7, r8, r9\n\t"
  127747. "adds r5, r5, r6\n\t"
  127748. "adcs r3, r3, r7\n\t"
  127749. "adc r4, r4, #0\n\t"
  127750. #endif
  127751. /* A[7] * B[10] */
  127752. "ldr r8, [%[a], #28]\n\t"
  127753. "ldr r9, [%[b], #40]\n\t"
  127754. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127755. "lsl r6, r8, #16\n\t"
  127756. "lsl r7, r9, #16\n\t"
  127757. "lsr r6, r6, #16\n\t"
  127758. "lsr r7, r7, #16\n\t"
  127759. "mul r7, r6, r7\n\t"
  127760. "adds r5, r5, r7\n\t"
  127761. "adcs r3, r3, #0\n\t"
  127762. "adc r4, r4, #0\n\t"
  127763. "lsr r7, r9, #16\n\t"
  127764. "mul r6, r7, r6\n\t"
  127765. "lsr r7, r6, #16\n\t"
  127766. "lsl r6, r6, #16\n\t"
  127767. "adds r5, r5, r6\n\t"
  127768. "adcs r3, r3, r7\n\t"
  127769. "adc r4, r4, #0\n\t"
  127770. "lsr r6, r8, #16\n\t"
  127771. "lsr r7, r9, #16\n\t"
  127772. "mul r7, r6, r7\n\t"
  127773. "adds r3, r3, r7\n\t"
  127774. "adc r4, r4, #0\n\t"
  127775. "lsl r7, r9, #16\n\t"
  127776. "lsr r7, r7, #16\n\t"
  127777. "mul r6, r7, r6\n\t"
  127778. "lsr r7, r6, #16\n\t"
  127779. "lsl r6, r6, #16\n\t"
  127780. "adds r5, r5, r6\n\t"
  127781. "adcs r3, r3, r7\n\t"
  127782. "adc r4, r4, #0\n\t"
  127783. #else
  127784. "umull r6, r7, r8, r9\n\t"
  127785. "adds r5, r5, r6\n\t"
  127786. "adcs r3, r3, r7\n\t"
  127787. "adc r4, r4, #0\n\t"
  127788. #endif
  127789. /* A[8] * B[9] */
  127790. "ldr r9, [%[b], #36]\n\t"
  127791. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127792. "lsl r6, r11, #16\n\t"
  127793. "lsl r7, r9, #16\n\t"
  127794. "lsr r6, r6, #16\n\t"
  127795. "lsr r7, r7, #16\n\t"
  127796. "mul r7, r6, r7\n\t"
  127797. "adds r5, r5, r7\n\t"
  127798. "adcs r3, r3, #0\n\t"
  127799. "adc r4, r4, #0\n\t"
  127800. "lsr r7, r9, #16\n\t"
  127801. "mul r6, r7, r6\n\t"
  127802. "lsr r7, r6, #16\n\t"
  127803. "lsl r6, r6, #16\n\t"
  127804. "adds r5, r5, r6\n\t"
  127805. "adcs r3, r3, r7\n\t"
  127806. "adc r4, r4, #0\n\t"
  127807. "lsr r6, r11, #16\n\t"
  127808. "lsr r7, r9, #16\n\t"
  127809. "mul r7, r6, r7\n\t"
  127810. "adds r3, r3, r7\n\t"
  127811. "adc r4, r4, #0\n\t"
  127812. "lsl r7, r9, #16\n\t"
  127813. "lsr r7, r7, #16\n\t"
  127814. "mul r6, r7, r6\n\t"
  127815. "lsr r7, r6, #16\n\t"
  127816. "lsl r6, r6, #16\n\t"
  127817. "adds r5, r5, r6\n\t"
  127818. "adcs r3, r3, r7\n\t"
  127819. "adc r4, r4, #0\n\t"
  127820. #else
  127821. "umull r6, r7, r11, r9\n\t"
  127822. "adds r5, r5, r6\n\t"
  127823. "adcs r3, r3, r7\n\t"
  127824. "adc r4, r4, #0\n\t"
  127825. #endif
  127826. /* A[9] * B[8] */
  127827. "ldr r8, [%[a], #36]\n\t"
  127828. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127829. "lsl r6, r8, #16\n\t"
  127830. "lsl r7, r12, #16\n\t"
  127831. "lsr r6, r6, #16\n\t"
  127832. "lsr r7, r7, #16\n\t"
  127833. "mul r7, r6, r7\n\t"
  127834. "adds r5, r5, r7\n\t"
  127835. "adcs r3, r3, #0\n\t"
  127836. "adc r4, r4, #0\n\t"
  127837. "lsr r7, r12, #16\n\t"
  127838. "mul r6, r7, r6\n\t"
  127839. "lsr r7, r6, #16\n\t"
  127840. "lsl r6, r6, #16\n\t"
  127841. "adds r5, r5, r6\n\t"
  127842. "adcs r3, r3, r7\n\t"
  127843. "adc r4, r4, #0\n\t"
  127844. "lsr r6, r8, #16\n\t"
  127845. "lsr r7, r12, #16\n\t"
  127846. "mul r7, r6, r7\n\t"
  127847. "adds r3, r3, r7\n\t"
  127848. "adc r4, r4, #0\n\t"
  127849. "lsl r7, r12, #16\n\t"
  127850. "lsr r7, r7, #16\n\t"
  127851. "mul r6, r7, r6\n\t"
  127852. "lsr r7, r6, #16\n\t"
  127853. "lsl r6, r6, #16\n\t"
  127854. "adds r5, r5, r6\n\t"
  127855. "adcs r3, r3, r7\n\t"
  127856. "adc r4, r4, #0\n\t"
  127857. #else
  127858. "umull r6, r7, r8, r12\n\t"
  127859. "adds r5, r5, r6\n\t"
  127860. "adcs r3, r3, r7\n\t"
  127861. "adc r4, r4, #0\n\t"
  127862. #endif
  127863. /* A[10] * B[7] */
  127864. "ldr r8, [%[a], #40]\n\t"
  127865. "ldr r9, [%[b], #28]\n\t"
  127866. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127867. "lsl r6, r8, #16\n\t"
  127868. "lsl r7, r9, #16\n\t"
  127869. "lsr r6, r6, #16\n\t"
  127870. "lsr r7, r7, #16\n\t"
  127871. "mul r7, r6, r7\n\t"
  127872. "adds r5, r5, r7\n\t"
  127873. "adcs r3, r3, #0\n\t"
  127874. "adc r4, r4, #0\n\t"
  127875. "lsr r7, r9, #16\n\t"
  127876. "mul r6, r7, r6\n\t"
  127877. "lsr r7, r6, #16\n\t"
  127878. "lsl r6, r6, #16\n\t"
  127879. "adds r5, r5, r6\n\t"
  127880. "adcs r3, r3, r7\n\t"
  127881. "adc r4, r4, #0\n\t"
  127882. "lsr r6, r8, #16\n\t"
  127883. "lsr r7, r9, #16\n\t"
  127884. "mul r7, r6, r7\n\t"
  127885. "adds r3, r3, r7\n\t"
  127886. "adc r4, r4, #0\n\t"
  127887. "lsl r7, r9, #16\n\t"
  127888. "lsr r7, r7, #16\n\t"
  127889. "mul r6, r7, r6\n\t"
  127890. "lsr r7, r6, #16\n\t"
  127891. "lsl r6, r6, #16\n\t"
  127892. "adds r5, r5, r6\n\t"
  127893. "adcs r3, r3, r7\n\t"
  127894. "adc r4, r4, #0\n\t"
  127895. #else
  127896. "umull r6, r7, r8, r9\n\t"
  127897. "adds r5, r5, r6\n\t"
  127898. "adcs r3, r3, r7\n\t"
  127899. "adc r4, r4, #0\n\t"
  127900. #endif
  127901. /* A[11] * B[6] */
  127902. "ldr r8, [%[a], #44]\n\t"
  127903. "ldr r9, [%[b], #24]\n\t"
  127904. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127905. "lsl r6, r8, #16\n\t"
  127906. "lsl r7, r9, #16\n\t"
  127907. "lsr r6, r6, #16\n\t"
  127908. "lsr r7, r7, #16\n\t"
  127909. "mul r7, r6, r7\n\t"
  127910. "adds r5, r5, r7\n\t"
  127911. "adcs r3, r3, #0\n\t"
  127912. "adc r4, r4, #0\n\t"
  127913. "lsr r7, r9, #16\n\t"
  127914. "mul r6, r7, r6\n\t"
  127915. "lsr r7, r6, #16\n\t"
  127916. "lsl r6, r6, #16\n\t"
  127917. "adds r5, r5, r6\n\t"
  127918. "adcs r3, r3, r7\n\t"
  127919. "adc r4, r4, #0\n\t"
  127920. "lsr r6, r8, #16\n\t"
  127921. "lsr r7, r9, #16\n\t"
  127922. "mul r7, r6, r7\n\t"
  127923. "adds r3, r3, r7\n\t"
  127924. "adc r4, r4, #0\n\t"
  127925. "lsl r7, r9, #16\n\t"
  127926. "lsr r7, r7, #16\n\t"
  127927. "mul r6, r7, r6\n\t"
  127928. "lsr r7, r6, #16\n\t"
  127929. "lsl r6, r6, #16\n\t"
  127930. "adds r5, r5, r6\n\t"
  127931. "adcs r3, r3, r7\n\t"
  127932. "adc r4, r4, #0\n\t"
  127933. #else
  127934. "umull r6, r7, r8, r9\n\t"
  127935. "adds r5, r5, r6\n\t"
  127936. "adcs r3, r3, r7\n\t"
  127937. "adc r4, r4, #0\n\t"
  127938. #endif
  127939. /* A[12] * B[5] */
  127940. "ldr r8, [%[a], #48]\n\t"
  127941. "ldr r9, [%[b], #20]\n\t"
  127942. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127943. "lsl r6, r8, #16\n\t"
  127944. "lsl r7, r9, #16\n\t"
  127945. "lsr r6, r6, #16\n\t"
  127946. "lsr r7, r7, #16\n\t"
  127947. "mul r7, r6, r7\n\t"
  127948. "adds r5, r5, r7\n\t"
  127949. "adcs r3, r3, #0\n\t"
  127950. "adc r4, r4, #0\n\t"
  127951. "lsr r7, r9, #16\n\t"
  127952. "mul r6, r7, r6\n\t"
  127953. "lsr r7, r6, #16\n\t"
  127954. "lsl r6, r6, #16\n\t"
  127955. "adds r5, r5, r6\n\t"
  127956. "adcs r3, r3, r7\n\t"
  127957. "adc r4, r4, #0\n\t"
  127958. "lsr r6, r8, #16\n\t"
  127959. "lsr r7, r9, #16\n\t"
  127960. "mul r7, r6, r7\n\t"
  127961. "adds r3, r3, r7\n\t"
  127962. "adc r4, r4, #0\n\t"
  127963. "lsl r7, r9, #16\n\t"
  127964. "lsr r7, r7, #16\n\t"
  127965. "mul r6, r7, r6\n\t"
  127966. "lsr r7, r6, #16\n\t"
  127967. "lsl r6, r6, #16\n\t"
  127968. "adds r5, r5, r6\n\t"
  127969. "adcs r3, r3, r7\n\t"
  127970. "adc r4, r4, #0\n\t"
  127971. #else
  127972. "umull r6, r7, r8, r9\n\t"
  127973. "adds r5, r5, r6\n\t"
  127974. "adcs r3, r3, r7\n\t"
  127975. "adc r4, r4, #0\n\t"
  127976. #endif
  127977. /* A[13] * B[4] */
  127978. "ldr r8, [%[a], #52]\n\t"
  127979. "ldr r9, [%[b], #16]\n\t"
  127980. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  127981. "lsl r6, r8, #16\n\t"
  127982. "lsl r7, r9, #16\n\t"
  127983. "lsr r6, r6, #16\n\t"
  127984. "lsr r7, r7, #16\n\t"
  127985. "mul r7, r6, r7\n\t"
  127986. "adds r5, r5, r7\n\t"
  127987. "adcs r3, r3, #0\n\t"
  127988. "adc r4, r4, #0\n\t"
  127989. "lsr r7, r9, #16\n\t"
  127990. "mul r6, r7, r6\n\t"
  127991. "lsr r7, r6, #16\n\t"
  127992. "lsl r6, r6, #16\n\t"
  127993. "adds r5, r5, r6\n\t"
  127994. "adcs r3, r3, r7\n\t"
  127995. "adc r4, r4, #0\n\t"
  127996. "lsr r6, r8, #16\n\t"
  127997. "lsr r7, r9, #16\n\t"
  127998. "mul r7, r6, r7\n\t"
  127999. "adds r3, r3, r7\n\t"
  128000. "adc r4, r4, #0\n\t"
  128001. "lsl r7, r9, #16\n\t"
  128002. "lsr r7, r7, #16\n\t"
  128003. "mul r6, r7, r6\n\t"
  128004. "lsr r7, r6, #16\n\t"
  128005. "lsl r6, r6, #16\n\t"
  128006. "adds r5, r5, r6\n\t"
  128007. "adcs r3, r3, r7\n\t"
  128008. "adc r4, r4, #0\n\t"
  128009. #else
  128010. "umull r6, r7, r8, r9\n\t"
  128011. "adds r5, r5, r6\n\t"
  128012. "adcs r3, r3, r7\n\t"
  128013. "adc r4, r4, #0\n\t"
  128014. #endif
  128015. /* A[14] * B[3] */
  128016. "ldr r8, [%[a], #56]\n\t"
  128017. "ldr r9, [%[b], #12]\n\t"
  128018. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128019. "lsl r6, r8, #16\n\t"
  128020. "lsl r7, r9, #16\n\t"
  128021. "lsr r6, r6, #16\n\t"
  128022. "lsr r7, r7, #16\n\t"
  128023. "mul r7, r6, r7\n\t"
  128024. "adds r5, r5, r7\n\t"
  128025. "adcs r3, r3, #0\n\t"
  128026. "adc r4, r4, #0\n\t"
  128027. "lsr r7, r9, #16\n\t"
  128028. "mul r6, r7, r6\n\t"
  128029. "lsr r7, r6, #16\n\t"
  128030. "lsl r6, r6, #16\n\t"
  128031. "adds r5, r5, r6\n\t"
  128032. "adcs r3, r3, r7\n\t"
  128033. "adc r4, r4, #0\n\t"
  128034. "lsr r6, r8, #16\n\t"
  128035. "lsr r7, r9, #16\n\t"
  128036. "mul r7, r6, r7\n\t"
  128037. "adds r3, r3, r7\n\t"
  128038. "adc r4, r4, #0\n\t"
  128039. "lsl r7, r9, #16\n\t"
  128040. "lsr r7, r7, #16\n\t"
  128041. "mul r6, r7, r6\n\t"
  128042. "lsr r7, r6, #16\n\t"
  128043. "lsl r6, r6, #16\n\t"
  128044. "adds r5, r5, r6\n\t"
  128045. "adcs r3, r3, r7\n\t"
  128046. "adc r4, r4, #0\n\t"
  128047. #else
  128048. "umull r6, r7, r8, r9\n\t"
  128049. "adds r5, r5, r6\n\t"
  128050. "adcs r3, r3, r7\n\t"
  128051. "adc r4, r4, #0\n\t"
  128052. #endif
  128053. /* A[15] * B[2] */
  128054. "ldr r8, [%[a], #60]\n\t"
  128055. "ldr r9, [%[b], #8]\n\t"
  128056. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128057. "lsl r6, r8, #16\n\t"
  128058. "lsl r7, r9, #16\n\t"
  128059. "lsr r6, r6, #16\n\t"
  128060. "lsr r7, r7, #16\n\t"
  128061. "mul r7, r6, r7\n\t"
  128062. "adds r5, r5, r7\n\t"
  128063. "adcs r3, r3, #0\n\t"
  128064. "adc r4, r4, #0\n\t"
  128065. "lsr r7, r9, #16\n\t"
  128066. "mul r6, r7, r6\n\t"
  128067. "lsr r7, r6, #16\n\t"
  128068. "lsl r6, r6, #16\n\t"
  128069. "adds r5, r5, r6\n\t"
  128070. "adcs r3, r3, r7\n\t"
  128071. "adc r4, r4, #0\n\t"
  128072. "lsr r6, r8, #16\n\t"
  128073. "lsr r7, r9, #16\n\t"
  128074. "mul r7, r6, r7\n\t"
  128075. "adds r3, r3, r7\n\t"
  128076. "adc r4, r4, #0\n\t"
  128077. "lsl r7, r9, #16\n\t"
  128078. "lsr r7, r7, #16\n\t"
  128079. "mul r6, r7, r6\n\t"
  128080. "lsr r7, r6, #16\n\t"
  128081. "lsl r6, r6, #16\n\t"
  128082. "adds r5, r5, r6\n\t"
  128083. "adcs r3, r3, r7\n\t"
  128084. "adc r4, r4, #0\n\t"
  128085. #else
  128086. "umull r6, r7, r8, r9\n\t"
  128087. "adds r5, r5, r6\n\t"
  128088. "adcs r3, r3, r7\n\t"
  128089. "adc r4, r4, #0\n\t"
  128090. #endif
  128091. "str r5, [%[r], #68]\n\t"
  128092. /* A[15] * B[3] */
  128093. "ldr r9, [%[b], #12]\n\t"
  128094. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128095. "lsl r6, r8, #16\n\t"
  128096. "lsl r7, r9, #16\n\t"
  128097. "lsr r6, r6, #16\n\t"
  128098. "lsr r7, r7, #16\n\t"
  128099. "mul r7, r6, r7\n\t"
  128100. "adds r3, r3, r7\n\t"
  128101. "adcs r4, r4, #0\n\t"
  128102. "mov r5, #0\n\t"
  128103. "adc r5, r5, #0\n\t"
  128104. "lsr r7, r9, #16\n\t"
  128105. "mul r6, r7, r6\n\t"
  128106. "lsr r7, r6, #16\n\t"
  128107. "lsl r6, r6, #16\n\t"
  128108. "adds r3, r3, r6\n\t"
  128109. "adcs r4, r4, r7\n\t"
  128110. "adc r5, r5, #0\n\t"
  128111. "lsr r6, r8, #16\n\t"
  128112. "lsr r7, r9, #16\n\t"
  128113. "mul r7, r6, r7\n\t"
  128114. "adds r4, r4, r7\n\t"
  128115. "adc r5, r5, #0\n\t"
  128116. "lsl r7, r9, #16\n\t"
  128117. "lsr r7, r7, #16\n\t"
  128118. "mul r6, r7, r6\n\t"
  128119. "lsr r7, r6, #16\n\t"
  128120. "lsl r6, r6, #16\n\t"
  128121. "adds r3, r3, r6\n\t"
  128122. "adcs r4, r4, r7\n\t"
  128123. "adc r5, r5, #0\n\t"
  128124. #else
  128125. "umull r6, r7, r8, r9\n\t"
  128126. "adds r3, r3, r6\n\t"
  128127. "adcs r4, r4, r7\n\t"
  128128. "mov r5, #0\n\t"
  128129. "adc r5, r5, #0\n\t"
  128130. #endif
  128131. /* A[14] * B[4] */
  128132. "ldr r8, [%[a], #56]\n\t"
  128133. "ldr r9, [%[b], #16]\n\t"
  128134. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128135. "lsl r6, r8, #16\n\t"
  128136. "lsl r7, r9, #16\n\t"
  128137. "lsr r6, r6, #16\n\t"
  128138. "lsr r7, r7, #16\n\t"
  128139. "mul r7, r6, r7\n\t"
  128140. "adds r3, r3, r7\n\t"
  128141. "adcs r4, r4, #0\n\t"
  128142. "adc r5, r5, #0\n\t"
  128143. "lsr r7, r9, #16\n\t"
  128144. "mul r6, r7, r6\n\t"
  128145. "lsr r7, r6, #16\n\t"
  128146. "lsl r6, r6, #16\n\t"
  128147. "adds r3, r3, r6\n\t"
  128148. "adcs r4, r4, r7\n\t"
  128149. "adc r5, r5, #0\n\t"
  128150. "lsr r6, r8, #16\n\t"
  128151. "lsr r7, r9, #16\n\t"
  128152. "mul r7, r6, r7\n\t"
  128153. "adds r4, r4, r7\n\t"
  128154. "adc r5, r5, #0\n\t"
  128155. "lsl r7, r9, #16\n\t"
  128156. "lsr r7, r7, #16\n\t"
  128157. "mul r6, r7, r6\n\t"
  128158. "lsr r7, r6, #16\n\t"
  128159. "lsl r6, r6, #16\n\t"
  128160. "adds r3, r3, r6\n\t"
  128161. "adcs r4, r4, r7\n\t"
  128162. "adc r5, r5, #0\n\t"
  128163. #else
  128164. "umull r6, r7, r8, r9\n\t"
  128165. "adds r3, r3, r6\n\t"
  128166. "adcs r4, r4, r7\n\t"
  128167. "adc r5, r5, #0\n\t"
  128168. #endif
  128169. /* A[13] * B[5] */
  128170. "ldr r8, [%[a], #52]\n\t"
  128171. "ldr r9, [%[b], #20]\n\t"
  128172. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128173. "lsl r6, r8, #16\n\t"
  128174. "lsl r7, r9, #16\n\t"
  128175. "lsr r6, r6, #16\n\t"
  128176. "lsr r7, r7, #16\n\t"
  128177. "mul r7, r6, r7\n\t"
  128178. "adds r3, r3, r7\n\t"
  128179. "adcs r4, r4, #0\n\t"
  128180. "adc r5, r5, #0\n\t"
  128181. "lsr r7, r9, #16\n\t"
  128182. "mul r6, r7, r6\n\t"
  128183. "lsr r7, r6, #16\n\t"
  128184. "lsl r6, r6, #16\n\t"
  128185. "adds r3, r3, r6\n\t"
  128186. "adcs r4, r4, r7\n\t"
  128187. "adc r5, r5, #0\n\t"
  128188. "lsr r6, r8, #16\n\t"
  128189. "lsr r7, r9, #16\n\t"
  128190. "mul r7, r6, r7\n\t"
  128191. "adds r4, r4, r7\n\t"
  128192. "adc r5, r5, #0\n\t"
  128193. "lsl r7, r9, #16\n\t"
  128194. "lsr r7, r7, #16\n\t"
  128195. "mul r6, r7, r6\n\t"
  128196. "lsr r7, r6, #16\n\t"
  128197. "lsl r6, r6, #16\n\t"
  128198. "adds r3, r3, r6\n\t"
  128199. "adcs r4, r4, r7\n\t"
  128200. "adc r5, r5, #0\n\t"
  128201. #else
  128202. "umull r6, r7, r8, r9\n\t"
  128203. "adds r3, r3, r6\n\t"
  128204. "adcs r4, r4, r7\n\t"
  128205. "adc r5, r5, #0\n\t"
  128206. #endif
  128207. /* A[12] * B[6] */
  128208. "ldr r8, [%[a], #48]\n\t"
  128209. "ldr r9, [%[b], #24]\n\t"
  128210. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128211. "lsl r6, r8, #16\n\t"
  128212. "lsl r7, r9, #16\n\t"
  128213. "lsr r6, r6, #16\n\t"
  128214. "lsr r7, r7, #16\n\t"
  128215. "mul r7, r6, r7\n\t"
  128216. "adds r3, r3, r7\n\t"
  128217. "adcs r4, r4, #0\n\t"
  128218. "adc r5, r5, #0\n\t"
  128219. "lsr r7, r9, #16\n\t"
  128220. "mul r6, r7, r6\n\t"
  128221. "lsr r7, r6, #16\n\t"
  128222. "lsl r6, r6, #16\n\t"
  128223. "adds r3, r3, r6\n\t"
  128224. "adcs r4, r4, r7\n\t"
  128225. "adc r5, r5, #0\n\t"
  128226. "lsr r6, r8, #16\n\t"
  128227. "lsr r7, r9, #16\n\t"
  128228. "mul r7, r6, r7\n\t"
  128229. "adds r4, r4, r7\n\t"
  128230. "adc r5, r5, #0\n\t"
  128231. "lsl r7, r9, #16\n\t"
  128232. "lsr r7, r7, #16\n\t"
  128233. "mul r6, r7, r6\n\t"
  128234. "lsr r7, r6, #16\n\t"
  128235. "lsl r6, r6, #16\n\t"
  128236. "adds r3, r3, r6\n\t"
  128237. "adcs r4, r4, r7\n\t"
  128238. "adc r5, r5, #0\n\t"
  128239. #else
  128240. "umull r6, r7, r8, r9\n\t"
  128241. "adds r3, r3, r6\n\t"
  128242. "adcs r4, r4, r7\n\t"
  128243. "adc r5, r5, #0\n\t"
  128244. #endif
  128245. /* A[11] * B[7] */
  128246. "ldr r8, [%[a], #44]\n\t"
  128247. "ldr r9, [%[b], #28]\n\t"
  128248. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128249. "lsl r6, r8, #16\n\t"
  128250. "lsl r7, r9, #16\n\t"
  128251. "lsr r6, r6, #16\n\t"
  128252. "lsr r7, r7, #16\n\t"
  128253. "mul r7, r6, r7\n\t"
  128254. "adds r3, r3, r7\n\t"
  128255. "adcs r4, r4, #0\n\t"
  128256. "adc r5, r5, #0\n\t"
  128257. "lsr r7, r9, #16\n\t"
  128258. "mul r6, r7, r6\n\t"
  128259. "lsr r7, r6, #16\n\t"
  128260. "lsl r6, r6, #16\n\t"
  128261. "adds r3, r3, r6\n\t"
  128262. "adcs r4, r4, r7\n\t"
  128263. "adc r5, r5, #0\n\t"
  128264. "lsr r6, r8, #16\n\t"
  128265. "lsr r7, r9, #16\n\t"
  128266. "mul r7, r6, r7\n\t"
  128267. "adds r4, r4, r7\n\t"
  128268. "adc r5, r5, #0\n\t"
  128269. "lsl r7, r9, #16\n\t"
  128270. "lsr r7, r7, #16\n\t"
  128271. "mul r6, r7, r6\n\t"
  128272. "lsr r7, r6, #16\n\t"
  128273. "lsl r6, r6, #16\n\t"
  128274. "adds r3, r3, r6\n\t"
  128275. "adcs r4, r4, r7\n\t"
  128276. "adc r5, r5, #0\n\t"
  128277. #else
  128278. "umull r6, r7, r8, r9\n\t"
  128279. "adds r3, r3, r6\n\t"
  128280. "adcs r4, r4, r7\n\t"
  128281. "adc r5, r5, #0\n\t"
  128282. #endif
  128283. /* A[10] * B[8] */
  128284. "ldr r8, [%[a], #40]\n\t"
  128285. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128286. "lsl r6, r8, #16\n\t"
  128287. "lsl r7, r12, #16\n\t"
  128288. "lsr r6, r6, #16\n\t"
  128289. "lsr r7, r7, #16\n\t"
  128290. "mul r7, r6, r7\n\t"
  128291. "adds r3, r3, r7\n\t"
  128292. "adcs r4, r4, #0\n\t"
  128293. "adc r5, r5, #0\n\t"
  128294. "lsr r7, r12, #16\n\t"
  128295. "mul r6, r7, r6\n\t"
  128296. "lsr r7, r6, #16\n\t"
  128297. "lsl r6, r6, #16\n\t"
  128298. "adds r3, r3, r6\n\t"
  128299. "adcs r4, r4, r7\n\t"
  128300. "adc r5, r5, #0\n\t"
  128301. "lsr r6, r8, #16\n\t"
  128302. "lsr r7, r12, #16\n\t"
  128303. "mul r7, r6, r7\n\t"
  128304. "adds r4, r4, r7\n\t"
  128305. "adc r5, r5, #0\n\t"
  128306. "lsl r7, r12, #16\n\t"
  128307. "lsr r7, r7, #16\n\t"
  128308. "mul r6, r7, r6\n\t"
  128309. "lsr r7, r6, #16\n\t"
  128310. "lsl r6, r6, #16\n\t"
  128311. "adds r3, r3, r6\n\t"
  128312. "adcs r4, r4, r7\n\t"
  128313. "adc r5, r5, #0\n\t"
  128314. #else
  128315. "umull r6, r7, r8, r12\n\t"
  128316. "adds r3, r3, r6\n\t"
  128317. "adcs r4, r4, r7\n\t"
  128318. "adc r5, r5, #0\n\t"
  128319. #endif
  128320. /* A[9] * B[9] */
  128321. "ldr r11, [%[a], #36]\n\t"
  128322. "ldr r12, [%[b], #36]\n\t"
  128323. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128324. "lsl r6, r11, #16\n\t"
  128325. "lsl r7, r12, #16\n\t"
  128326. "lsr r6, r6, #16\n\t"
  128327. "lsr r7, r7, #16\n\t"
  128328. "mul r7, r6, r7\n\t"
  128329. "adds r3, r3, r7\n\t"
  128330. "adcs r4, r4, #0\n\t"
  128331. "adc r5, r5, #0\n\t"
  128332. "lsr r7, r12, #16\n\t"
  128333. "mul r6, r7, r6\n\t"
  128334. "lsr r7, r6, #16\n\t"
  128335. "lsl r6, r6, #16\n\t"
  128336. "adds r3, r3, r6\n\t"
  128337. "adcs r4, r4, r7\n\t"
  128338. "adc r5, r5, #0\n\t"
  128339. "lsr r6, r11, #16\n\t"
  128340. "lsr r7, r12, #16\n\t"
  128341. "mul r7, r6, r7\n\t"
  128342. "adds r4, r4, r7\n\t"
  128343. "adc r5, r5, #0\n\t"
  128344. "lsl r7, r12, #16\n\t"
  128345. "lsr r7, r7, #16\n\t"
  128346. "mul r6, r7, r6\n\t"
  128347. "lsr r7, r6, #16\n\t"
  128348. "lsl r6, r6, #16\n\t"
  128349. "adds r3, r3, r6\n\t"
  128350. "adcs r4, r4, r7\n\t"
  128351. "adc r5, r5, #0\n\t"
  128352. #else
  128353. "umull r6, r7, r11, r12\n\t"
  128354. "adds r3, r3, r6\n\t"
  128355. "adcs r4, r4, r7\n\t"
  128356. "adc r5, r5, #0\n\t"
  128357. #endif
  128358. /* A[8] * B[10] */
  128359. "ldr r8, [%[a], #32]\n\t"
  128360. "ldr r9, [%[b], #40]\n\t"
  128361. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128362. "lsl r6, r8, #16\n\t"
  128363. "lsl r7, r9, #16\n\t"
  128364. "lsr r6, r6, #16\n\t"
  128365. "lsr r7, r7, #16\n\t"
  128366. "mul r7, r6, r7\n\t"
  128367. "adds r3, r3, r7\n\t"
  128368. "adcs r4, r4, #0\n\t"
  128369. "adc r5, r5, #0\n\t"
  128370. "lsr r7, r9, #16\n\t"
  128371. "mul r6, r7, r6\n\t"
  128372. "lsr r7, r6, #16\n\t"
  128373. "lsl r6, r6, #16\n\t"
  128374. "adds r3, r3, r6\n\t"
  128375. "adcs r4, r4, r7\n\t"
  128376. "adc r5, r5, #0\n\t"
  128377. "lsr r6, r8, #16\n\t"
  128378. "lsr r7, r9, #16\n\t"
  128379. "mul r7, r6, r7\n\t"
  128380. "adds r4, r4, r7\n\t"
  128381. "adc r5, r5, #0\n\t"
  128382. "lsl r7, r9, #16\n\t"
  128383. "lsr r7, r7, #16\n\t"
  128384. "mul r6, r7, r6\n\t"
  128385. "lsr r7, r6, #16\n\t"
  128386. "lsl r6, r6, #16\n\t"
  128387. "adds r3, r3, r6\n\t"
  128388. "adcs r4, r4, r7\n\t"
  128389. "adc r5, r5, #0\n\t"
  128390. #else
  128391. "umull r6, r7, r8, r9\n\t"
  128392. "adds r3, r3, r6\n\t"
  128393. "adcs r4, r4, r7\n\t"
  128394. "adc r5, r5, #0\n\t"
  128395. #endif
  128396. /* A[7] * B[11] */
  128397. "ldr r8, [%[a], #28]\n\t"
  128398. "ldr r9, [%[b], #44]\n\t"
  128399. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128400. "lsl r6, r8, #16\n\t"
  128401. "lsl r7, r9, #16\n\t"
  128402. "lsr r6, r6, #16\n\t"
  128403. "lsr r7, r7, #16\n\t"
  128404. "mul r7, r6, r7\n\t"
  128405. "adds r3, r3, r7\n\t"
  128406. "adcs r4, r4, #0\n\t"
  128407. "adc r5, r5, #0\n\t"
  128408. "lsr r7, r9, #16\n\t"
  128409. "mul r6, r7, r6\n\t"
  128410. "lsr r7, r6, #16\n\t"
  128411. "lsl r6, r6, #16\n\t"
  128412. "adds r3, r3, r6\n\t"
  128413. "adcs r4, r4, r7\n\t"
  128414. "adc r5, r5, #0\n\t"
  128415. "lsr r6, r8, #16\n\t"
  128416. "lsr r7, r9, #16\n\t"
  128417. "mul r7, r6, r7\n\t"
  128418. "adds r4, r4, r7\n\t"
  128419. "adc r5, r5, #0\n\t"
  128420. "lsl r7, r9, #16\n\t"
  128421. "lsr r7, r7, #16\n\t"
  128422. "mul r6, r7, r6\n\t"
  128423. "lsr r7, r6, #16\n\t"
  128424. "lsl r6, r6, #16\n\t"
  128425. "adds r3, r3, r6\n\t"
  128426. "adcs r4, r4, r7\n\t"
  128427. "adc r5, r5, #0\n\t"
  128428. #else
  128429. "umull r6, r7, r8, r9\n\t"
  128430. "adds r3, r3, r6\n\t"
  128431. "adcs r4, r4, r7\n\t"
  128432. "adc r5, r5, #0\n\t"
  128433. #endif
  128434. /* A[6] * B[12] */
  128435. "ldr r8, [%[a], #24]\n\t"
  128436. "ldr r9, [%[b], #48]\n\t"
  128437. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128438. "lsl r6, r8, #16\n\t"
  128439. "lsl r7, r9, #16\n\t"
  128440. "lsr r6, r6, #16\n\t"
  128441. "lsr r7, r7, #16\n\t"
  128442. "mul r7, r6, r7\n\t"
  128443. "adds r3, r3, r7\n\t"
  128444. "adcs r4, r4, #0\n\t"
  128445. "adc r5, r5, #0\n\t"
  128446. "lsr r7, r9, #16\n\t"
  128447. "mul r6, r7, r6\n\t"
  128448. "lsr r7, r6, #16\n\t"
  128449. "lsl r6, r6, #16\n\t"
  128450. "adds r3, r3, r6\n\t"
  128451. "adcs r4, r4, r7\n\t"
  128452. "adc r5, r5, #0\n\t"
  128453. "lsr r6, r8, #16\n\t"
  128454. "lsr r7, r9, #16\n\t"
  128455. "mul r7, r6, r7\n\t"
  128456. "adds r4, r4, r7\n\t"
  128457. "adc r5, r5, #0\n\t"
  128458. "lsl r7, r9, #16\n\t"
  128459. "lsr r7, r7, #16\n\t"
  128460. "mul r6, r7, r6\n\t"
  128461. "lsr r7, r6, #16\n\t"
  128462. "lsl r6, r6, #16\n\t"
  128463. "adds r3, r3, r6\n\t"
  128464. "adcs r4, r4, r7\n\t"
  128465. "adc r5, r5, #0\n\t"
  128466. #else
  128467. "umull r6, r7, r8, r9\n\t"
  128468. "adds r3, r3, r6\n\t"
  128469. "adcs r4, r4, r7\n\t"
  128470. "adc r5, r5, #0\n\t"
  128471. #endif
  128472. /* A[5] * B[13] */
  128473. "ldr r8, [%[a], #20]\n\t"
  128474. "ldr r9, [%[b], #52]\n\t"
  128475. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128476. "lsl r6, r8, #16\n\t"
  128477. "lsl r7, r9, #16\n\t"
  128478. "lsr r6, r6, #16\n\t"
  128479. "lsr r7, r7, #16\n\t"
  128480. "mul r7, r6, r7\n\t"
  128481. "adds r3, r3, r7\n\t"
  128482. "adcs r4, r4, #0\n\t"
  128483. "adc r5, r5, #0\n\t"
  128484. "lsr r7, r9, #16\n\t"
  128485. "mul r6, r7, r6\n\t"
  128486. "lsr r7, r6, #16\n\t"
  128487. "lsl r6, r6, #16\n\t"
  128488. "adds r3, r3, r6\n\t"
  128489. "adcs r4, r4, r7\n\t"
  128490. "adc r5, r5, #0\n\t"
  128491. "lsr r6, r8, #16\n\t"
  128492. "lsr r7, r9, #16\n\t"
  128493. "mul r7, r6, r7\n\t"
  128494. "adds r4, r4, r7\n\t"
  128495. "adc r5, r5, #0\n\t"
  128496. "lsl r7, r9, #16\n\t"
  128497. "lsr r7, r7, #16\n\t"
  128498. "mul r6, r7, r6\n\t"
  128499. "lsr r7, r6, #16\n\t"
  128500. "lsl r6, r6, #16\n\t"
  128501. "adds r3, r3, r6\n\t"
  128502. "adcs r4, r4, r7\n\t"
  128503. "adc r5, r5, #0\n\t"
  128504. #else
  128505. "umull r6, r7, r8, r9\n\t"
  128506. "adds r3, r3, r6\n\t"
  128507. "adcs r4, r4, r7\n\t"
  128508. "adc r5, r5, #0\n\t"
  128509. #endif
  128510. /* A[4] * B[14] */
  128511. "ldr r8, [%[a], #16]\n\t"
  128512. "ldr r9, [%[b], #56]\n\t"
  128513. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128514. "lsl r6, r8, #16\n\t"
  128515. "lsl r7, r9, #16\n\t"
  128516. "lsr r6, r6, #16\n\t"
  128517. "lsr r7, r7, #16\n\t"
  128518. "mul r7, r6, r7\n\t"
  128519. "adds r3, r3, r7\n\t"
  128520. "adcs r4, r4, #0\n\t"
  128521. "adc r5, r5, #0\n\t"
  128522. "lsr r7, r9, #16\n\t"
  128523. "mul r6, r7, r6\n\t"
  128524. "lsr r7, r6, #16\n\t"
  128525. "lsl r6, r6, #16\n\t"
  128526. "adds r3, r3, r6\n\t"
  128527. "adcs r4, r4, r7\n\t"
  128528. "adc r5, r5, #0\n\t"
  128529. "lsr r6, r8, #16\n\t"
  128530. "lsr r7, r9, #16\n\t"
  128531. "mul r7, r6, r7\n\t"
  128532. "adds r4, r4, r7\n\t"
  128533. "adc r5, r5, #0\n\t"
  128534. "lsl r7, r9, #16\n\t"
  128535. "lsr r7, r7, #16\n\t"
  128536. "mul r6, r7, r6\n\t"
  128537. "lsr r7, r6, #16\n\t"
  128538. "lsl r6, r6, #16\n\t"
  128539. "adds r3, r3, r6\n\t"
  128540. "adcs r4, r4, r7\n\t"
  128541. "adc r5, r5, #0\n\t"
  128542. #else
  128543. "umull r6, r7, r8, r9\n\t"
  128544. "adds r3, r3, r6\n\t"
  128545. "adcs r4, r4, r7\n\t"
  128546. "adc r5, r5, #0\n\t"
  128547. #endif
  128548. /* A[3] * B[15] */
  128549. "ldr r8, [%[a], #12]\n\t"
  128550. "ldr r9, [%[b], #60]\n\t"
  128551. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128552. "lsl r6, r8, #16\n\t"
  128553. "lsl r7, r9, #16\n\t"
  128554. "lsr r6, r6, #16\n\t"
  128555. "lsr r7, r7, #16\n\t"
  128556. "mul r7, r6, r7\n\t"
  128557. "adds r3, r3, r7\n\t"
  128558. "adcs r4, r4, #0\n\t"
  128559. "adc r5, r5, #0\n\t"
  128560. "lsr r7, r9, #16\n\t"
  128561. "mul r6, r7, r6\n\t"
  128562. "lsr r7, r6, #16\n\t"
  128563. "lsl r6, r6, #16\n\t"
  128564. "adds r3, r3, r6\n\t"
  128565. "adcs r4, r4, r7\n\t"
  128566. "adc r5, r5, #0\n\t"
  128567. "lsr r6, r8, #16\n\t"
  128568. "lsr r7, r9, #16\n\t"
  128569. "mul r7, r6, r7\n\t"
  128570. "adds r4, r4, r7\n\t"
  128571. "adc r5, r5, #0\n\t"
  128572. "lsl r7, r9, #16\n\t"
  128573. "lsr r7, r7, #16\n\t"
  128574. "mul r6, r7, r6\n\t"
  128575. "lsr r7, r6, #16\n\t"
  128576. "lsl r6, r6, #16\n\t"
  128577. "adds r3, r3, r6\n\t"
  128578. "adcs r4, r4, r7\n\t"
  128579. "adc r5, r5, #0\n\t"
  128580. #else
  128581. "umull r6, r7, r8, r9\n\t"
  128582. "adds r3, r3, r6\n\t"
  128583. "adcs r4, r4, r7\n\t"
  128584. "adc r5, r5, #0\n\t"
  128585. #endif
  128586. "str r3, [%[r], #72]\n\t"
  128587. /* A[4] * B[15] */
  128588. "ldr r8, [%[a], #16]\n\t"
  128589. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128590. "lsl r6, r8, #16\n\t"
  128591. "lsl r7, r9, #16\n\t"
  128592. "lsr r6, r6, #16\n\t"
  128593. "lsr r7, r7, #16\n\t"
  128594. "mul r7, r6, r7\n\t"
  128595. "adds r4, r4, r7\n\t"
  128596. "adcs r5, r5, #0\n\t"
  128597. "mov r3, #0\n\t"
  128598. "adc r3, r3, #0\n\t"
  128599. "lsr r7, r9, #16\n\t"
  128600. "mul r6, r7, r6\n\t"
  128601. "lsr r7, r6, #16\n\t"
  128602. "lsl r6, r6, #16\n\t"
  128603. "adds r4, r4, r6\n\t"
  128604. "adcs r5, r5, r7\n\t"
  128605. "adc r3, r3, #0\n\t"
  128606. "lsr r6, r8, #16\n\t"
  128607. "lsr r7, r9, #16\n\t"
  128608. "mul r7, r6, r7\n\t"
  128609. "adds r5, r5, r7\n\t"
  128610. "adc r3, r3, #0\n\t"
  128611. "lsl r7, r9, #16\n\t"
  128612. "lsr r7, r7, #16\n\t"
  128613. "mul r6, r7, r6\n\t"
  128614. "lsr r7, r6, #16\n\t"
  128615. "lsl r6, r6, #16\n\t"
  128616. "adds r4, r4, r6\n\t"
  128617. "adcs r5, r5, r7\n\t"
  128618. "adc r3, r3, #0\n\t"
  128619. #else
  128620. "umull r6, r7, r8, r9\n\t"
  128621. "adds r4, r4, r6\n\t"
  128622. "adcs r5, r5, r7\n\t"
  128623. "mov r3, #0\n\t"
  128624. "adc r3, r3, #0\n\t"
  128625. #endif
  128626. /* A[5] * B[14] */
  128627. "ldr r8, [%[a], #20]\n\t"
  128628. "ldr r9, [%[b], #56]\n\t"
  128629. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128630. "lsl r6, r8, #16\n\t"
  128631. "lsl r7, r9, #16\n\t"
  128632. "lsr r6, r6, #16\n\t"
  128633. "lsr r7, r7, #16\n\t"
  128634. "mul r7, r6, r7\n\t"
  128635. "adds r4, r4, r7\n\t"
  128636. "adcs r5, r5, #0\n\t"
  128637. "adc r3, r3, #0\n\t"
  128638. "lsr r7, r9, #16\n\t"
  128639. "mul r6, r7, r6\n\t"
  128640. "lsr r7, r6, #16\n\t"
  128641. "lsl r6, r6, #16\n\t"
  128642. "adds r4, r4, r6\n\t"
  128643. "adcs r5, r5, r7\n\t"
  128644. "adc r3, r3, #0\n\t"
  128645. "lsr r6, r8, #16\n\t"
  128646. "lsr r7, r9, #16\n\t"
  128647. "mul r7, r6, r7\n\t"
  128648. "adds r5, r5, r7\n\t"
  128649. "adc r3, r3, #0\n\t"
  128650. "lsl r7, r9, #16\n\t"
  128651. "lsr r7, r7, #16\n\t"
  128652. "mul r6, r7, r6\n\t"
  128653. "lsr r7, r6, #16\n\t"
  128654. "lsl r6, r6, #16\n\t"
  128655. "adds r4, r4, r6\n\t"
  128656. "adcs r5, r5, r7\n\t"
  128657. "adc r3, r3, #0\n\t"
  128658. #else
  128659. "umull r6, r7, r8, r9\n\t"
  128660. "adds r4, r4, r6\n\t"
  128661. "adcs r5, r5, r7\n\t"
  128662. "adc r3, r3, #0\n\t"
  128663. #endif
  128664. /* A[6] * B[13] */
  128665. "ldr r8, [%[a], #24]\n\t"
  128666. "ldr r9, [%[b], #52]\n\t"
  128667. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128668. "lsl r6, r8, #16\n\t"
  128669. "lsl r7, r9, #16\n\t"
  128670. "lsr r6, r6, #16\n\t"
  128671. "lsr r7, r7, #16\n\t"
  128672. "mul r7, r6, r7\n\t"
  128673. "adds r4, r4, r7\n\t"
  128674. "adcs r5, r5, #0\n\t"
  128675. "adc r3, r3, #0\n\t"
  128676. "lsr r7, r9, #16\n\t"
  128677. "mul r6, r7, r6\n\t"
  128678. "lsr r7, r6, #16\n\t"
  128679. "lsl r6, r6, #16\n\t"
  128680. "adds r4, r4, r6\n\t"
  128681. "adcs r5, r5, r7\n\t"
  128682. "adc r3, r3, #0\n\t"
  128683. "lsr r6, r8, #16\n\t"
  128684. "lsr r7, r9, #16\n\t"
  128685. "mul r7, r6, r7\n\t"
  128686. "adds r5, r5, r7\n\t"
  128687. "adc r3, r3, #0\n\t"
  128688. "lsl r7, r9, #16\n\t"
  128689. "lsr r7, r7, #16\n\t"
  128690. "mul r6, r7, r6\n\t"
  128691. "lsr r7, r6, #16\n\t"
  128692. "lsl r6, r6, #16\n\t"
  128693. "adds r4, r4, r6\n\t"
  128694. "adcs r5, r5, r7\n\t"
  128695. "adc r3, r3, #0\n\t"
  128696. #else
  128697. "umull r6, r7, r8, r9\n\t"
  128698. "adds r4, r4, r6\n\t"
  128699. "adcs r5, r5, r7\n\t"
  128700. "adc r3, r3, #0\n\t"
  128701. #endif
  128702. /* A[7] * B[12] */
  128703. "ldr r8, [%[a], #28]\n\t"
  128704. "ldr r9, [%[b], #48]\n\t"
  128705. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128706. "lsl r6, r8, #16\n\t"
  128707. "lsl r7, r9, #16\n\t"
  128708. "lsr r6, r6, #16\n\t"
  128709. "lsr r7, r7, #16\n\t"
  128710. "mul r7, r6, r7\n\t"
  128711. "adds r4, r4, r7\n\t"
  128712. "adcs r5, r5, #0\n\t"
  128713. "adc r3, r3, #0\n\t"
  128714. "lsr r7, r9, #16\n\t"
  128715. "mul r6, r7, r6\n\t"
  128716. "lsr r7, r6, #16\n\t"
  128717. "lsl r6, r6, #16\n\t"
  128718. "adds r4, r4, r6\n\t"
  128719. "adcs r5, r5, r7\n\t"
  128720. "adc r3, r3, #0\n\t"
  128721. "lsr r6, r8, #16\n\t"
  128722. "lsr r7, r9, #16\n\t"
  128723. "mul r7, r6, r7\n\t"
  128724. "adds r5, r5, r7\n\t"
  128725. "adc r3, r3, #0\n\t"
  128726. "lsl r7, r9, #16\n\t"
  128727. "lsr r7, r7, #16\n\t"
  128728. "mul r6, r7, r6\n\t"
  128729. "lsr r7, r6, #16\n\t"
  128730. "lsl r6, r6, #16\n\t"
  128731. "adds r4, r4, r6\n\t"
  128732. "adcs r5, r5, r7\n\t"
  128733. "adc r3, r3, #0\n\t"
  128734. #else
  128735. "umull r6, r7, r8, r9\n\t"
  128736. "adds r4, r4, r6\n\t"
  128737. "adcs r5, r5, r7\n\t"
  128738. "adc r3, r3, #0\n\t"
  128739. #endif
  128740. /* A[8] * B[11] */
  128741. "ldr r8, [%[a], #32]\n\t"
  128742. "ldr r9, [%[b], #44]\n\t"
  128743. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128744. "lsl r6, r8, #16\n\t"
  128745. "lsl r7, r9, #16\n\t"
  128746. "lsr r6, r6, #16\n\t"
  128747. "lsr r7, r7, #16\n\t"
  128748. "mul r7, r6, r7\n\t"
  128749. "adds r4, r4, r7\n\t"
  128750. "adcs r5, r5, #0\n\t"
  128751. "adc r3, r3, #0\n\t"
  128752. "lsr r7, r9, #16\n\t"
  128753. "mul r6, r7, r6\n\t"
  128754. "lsr r7, r6, #16\n\t"
  128755. "lsl r6, r6, #16\n\t"
  128756. "adds r4, r4, r6\n\t"
  128757. "adcs r5, r5, r7\n\t"
  128758. "adc r3, r3, #0\n\t"
  128759. "lsr r6, r8, #16\n\t"
  128760. "lsr r7, r9, #16\n\t"
  128761. "mul r7, r6, r7\n\t"
  128762. "adds r5, r5, r7\n\t"
  128763. "adc r3, r3, #0\n\t"
  128764. "lsl r7, r9, #16\n\t"
  128765. "lsr r7, r7, #16\n\t"
  128766. "mul r6, r7, r6\n\t"
  128767. "lsr r7, r6, #16\n\t"
  128768. "lsl r6, r6, #16\n\t"
  128769. "adds r4, r4, r6\n\t"
  128770. "adcs r5, r5, r7\n\t"
  128771. "adc r3, r3, #0\n\t"
  128772. #else
  128773. "umull r6, r7, r8, r9\n\t"
  128774. "adds r4, r4, r6\n\t"
  128775. "adcs r5, r5, r7\n\t"
  128776. "adc r3, r3, #0\n\t"
  128777. #endif
  128778. /* A[9] * B[10] */
  128779. "ldr r9, [%[b], #40]\n\t"
  128780. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128781. "lsl r6, r11, #16\n\t"
  128782. "lsl r7, r9, #16\n\t"
  128783. "lsr r6, r6, #16\n\t"
  128784. "lsr r7, r7, #16\n\t"
  128785. "mul r7, r6, r7\n\t"
  128786. "adds r4, r4, r7\n\t"
  128787. "adcs r5, r5, #0\n\t"
  128788. "adc r3, r3, #0\n\t"
  128789. "lsr r7, r9, #16\n\t"
  128790. "mul r6, r7, r6\n\t"
  128791. "lsr r7, r6, #16\n\t"
  128792. "lsl r6, r6, #16\n\t"
  128793. "adds r4, r4, r6\n\t"
  128794. "adcs r5, r5, r7\n\t"
  128795. "adc r3, r3, #0\n\t"
  128796. "lsr r6, r11, #16\n\t"
  128797. "lsr r7, r9, #16\n\t"
  128798. "mul r7, r6, r7\n\t"
  128799. "adds r5, r5, r7\n\t"
  128800. "adc r3, r3, #0\n\t"
  128801. "lsl r7, r9, #16\n\t"
  128802. "lsr r7, r7, #16\n\t"
  128803. "mul r6, r7, r6\n\t"
  128804. "lsr r7, r6, #16\n\t"
  128805. "lsl r6, r6, #16\n\t"
  128806. "adds r4, r4, r6\n\t"
  128807. "adcs r5, r5, r7\n\t"
  128808. "adc r3, r3, #0\n\t"
  128809. #else
  128810. "umull r6, r7, r11, r9\n\t"
  128811. "adds r4, r4, r6\n\t"
  128812. "adcs r5, r5, r7\n\t"
  128813. "adc r3, r3, #0\n\t"
  128814. #endif
  128815. /* A[10] * B[9] */
  128816. "ldr r8, [%[a], #40]\n\t"
  128817. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128818. "lsl r6, r8, #16\n\t"
  128819. "lsl r7, r12, #16\n\t"
  128820. "lsr r6, r6, #16\n\t"
  128821. "lsr r7, r7, #16\n\t"
  128822. "mul r7, r6, r7\n\t"
  128823. "adds r4, r4, r7\n\t"
  128824. "adcs r5, r5, #0\n\t"
  128825. "adc r3, r3, #0\n\t"
  128826. "lsr r7, r12, #16\n\t"
  128827. "mul r6, r7, r6\n\t"
  128828. "lsr r7, r6, #16\n\t"
  128829. "lsl r6, r6, #16\n\t"
  128830. "adds r4, r4, r6\n\t"
  128831. "adcs r5, r5, r7\n\t"
  128832. "adc r3, r3, #0\n\t"
  128833. "lsr r6, r8, #16\n\t"
  128834. "lsr r7, r12, #16\n\t"
  128835. "mul r7, r6, r7\n\t"
  128836. "adds r5, r5, r7\n\t"
  128837. "adc r3, r3, #0\n\t"
  128838. "lsl r7, r12, #16\n\t"
  128839. "lsr r7, r7, #16\n\t"
  128840. "mul r6, r7, r6\n\t"
  128841. "lsr r7, r6, #16\n\t"
  128842. "lsl r6, r6, #16\n\t"
  128843. "adds r4, r4, r6\n\t"
  128844. "adcs r5, r5, r7\n\t"
  128845. "adc r3, r3, #0\n\t"
  128846. #else
  128847. "umull r6, r7, r8, r12\n\t"
  128848. "adds r4, r4, r6\n\t"
  128849. "adcs r5, r5, r7\n\t"
  128850. "adc r3, r3, #0\n\t"
  128851. #endif
  128852. /* A[11] * B[8] */
  128853. "ldr r8, [%[a], #44]\n\t"
  128854. "ldr r9, [%[b], #32]\n\t"
  128855. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128856. "lsl r6, r8, #16\n\t"
  128857. "lsl r7, r9, #16\n\t"
  128858. "lsr r6, r6, #16\n\t"
  128859. "lsr r7, r7, #16\n\t"
  128860. "mul r7, r6, r7\n\t"
  128861. "adds r4, r4, r7\n\t"
  128862. "adcs r5, r5, #0\n\t"
  128863. "adc r3, r3, #0\n\t"
  128864. "lsr r7, r9, #16\n\t"
  128865. "mul r6, r7, r6\n\t"
  128866. "lsr r7, r6, #16\n\t"
  128867. "lsl r6, r6, #16\n\t"
  128868. "adds r4, r4, r6\n\t"
  128869. "adcs r5, r5, r7\n\t"
  128870. "adc r3, r3, #0\n\t"
  128871. "lsr r6, r8, #16\n\t"
  128872. "lsr r7, r9, #16\n\t"
  128873. "mul r7, r6, r7\n\t"
  128874. "adds r5, r5, r7\n\t"
  128875. "adc r3, r3, #0\n\t"
  128876. "lsl r7, r9, #16\n\t"
  128877. "lsr r7, r7, #16\n\t"
  128878. "mul r6, r7, r6\n\t"
  128879. "lsr r7, r6, #16\n\t"
  128880. "lsl r6, r6, #16\n\t"
  128881. "adds r4, r4, r6\n\t"
  128882. "adcs r5, r5, r7\n\t"
  128883. "adc r3, r3, #0\n\t"
  128884. #else
  128885. "umull r6, r7, r8, r9\n\t"
  128886. "adds r4, r4, r6\n\t"
  128887. "adcs r5, r5, r7\n\t"
  128888. "adc r3, r3, #0\n\t"
  128889. #endif
  128890. /* A[12] * B[7] */
  128891. "ldr r8, [%[a], #48]\n\t"
  128892. "ldr r9, [%[b], #28]\n\t"
  128893. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128894. "lsl r6, r8, #16\n\t"
  128895. "lsl r7, r9, #16\n\t"
  128896. "lsr r6, r6, #16\n\t"
  128897. "lsr r7, r7, #16\n\t"
  128898. "mul r7, r6, r7\n\t"
  128899. "adds r4, r4, r7\n\t"
  128900. "adcs r5, r5, #0\n\t"
  128901. "adc r3, r3, #0\n\t"
  128902. "lsr r7, r9, #16\n\t"
  128903. "mul r6, r7, r6\n\t"
  128904. "lsr r7, r6, #16\n\t"
  128905. "lsl r6, r6, #16\n\t"
  128906. "adds r4, r4, r6\n\t"
  128907. "adcs r5, r5, r7\n\t"
  128908. "adc r3, r3, #0\n\t"
  128909. "lsr r6, r8, #16\n\t"
  128910. "lsr r7, r9, #16\n\t"
  128911. "mul r7, r6, r7\n\t"
  128912. "adds r5, r5, r7\n\t"
  128913. "adc r3, r3, #0\n\t"
  128914. "lsl r7, r9, #16\n\t"
  128915. "lsr r7, r7, #16\n\t"
  128916. "mul r6, r7, r6\n\t"
  128917. "lsr r7, r6, #16\n\t"
  128918. "lsl r6, r6, #16\n\t"
  128919. "adds r4, r4, r6\n\t"
  128920. "adcs r5, r5, r7\n\t"
  128921. "adc r3, r3, #0\n\t"
  128922. #else
  128923. "umull r6, r7, r8, r9\n\t"
  128924. "adds r4, r4, r6\n\t"
  128925. "adcs r5, r5, r7\n\t"
  128926. "adc r3, r3, #0\n\t"
  128927. #endif
  128928. /* A[13] * B[6] */
  128929. "ldr r8, [%[a], #52]\n\t"
  128930. "ldr r9, [%[b], #24]\n\t"
  128931. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128932. "lsl r6, r8, #16\n\t"
  128933. "lsl r7, r9, #16\n\t"
  128934. "lsr r6, r6, #16\n\t"
  128935. "lsr r7, r7, #16\n\t"
  128936. "mul r7, r6, r7\n\t"
  128937. "adds r4, r4, r7\n\t"
  128938. "adcs r5, r5, #0\n\t"
  128939. "adc r3, r3, #0\n\t"
  128940. "lsr r7, r9, #16\n\t"
  128941. "mul r6, r7, r6\n\t"
  128942. "lsr r7, r6, #16\n\t"
  128943. "lsl r6, r6, #16\n\t"
  128944. "adds r4, r4, r6\n\t"
  128945. "adcs r5, r5, r7\n\t"
  128946. "adc r3, r3, #0\n\t"
  128947. "lsr r6, r8, #16\n\t"
  128948. "lsr r7, r9, #16\n\t"
  128949. "mul r7, r6, r7\n\t"
  128950. "adds r5, r5, r7\n\t"
  128951. "adc r3, r3, #0\n\t"
  128952. "lsl r7, r9, #16\n\t"
  128953. "lsr r7, r7, #16\n\t"
  128954. "mul r6, r7, r6\n\t"
  128955. "lsr r7, r6, #16\n\t"
  128956. "lsl r6, r6, #16\n\t"
  128957. "adds r4, r4, r6\n\t"
  128958. "adcs r5, r5, r7\n\t"
  128959. "adc r3, r3, #0\n\t"
  128960. #else
  128961. "umull r6, r7, r8, r9\n\t"
  128962. "adds r4, r4, r6\n\t"
  128963. "adcs r5, r5, r7\n\t"
  128964. "adc r3, r3, #0\n\t"
  128965. #endif
  128966. /* A[14] * B[5] */
  128967. "ldr r8, [%[a], #56]\n\t"
  128968. "ldr r9, [%[b], #20]\n\t"
  128969. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  128970. "lsl r6, r8, #16\n\t"
  128971. "lsl r7, r9, #16\n\t"
  128972. "lsr r6, r6, #16\n\t"
  128973. "lsr r7, r7, #16\n\t"
  128974. "mul r7, r6, r7\n\t"
  128975. "adds r4, r4, r7\n\t"
  128976. "adcs r5, r5, #0\n\t"
  128977. "adc r3, r3, #0\n\t"
  128978. "lsr r7, r9, #16\n\t"
  128979. "mul r6, r7, r6\n\t"
  128980. "lsr r7, r6, #16\n\t"
  128981. "lsl r6, r6, #16\n\t"
  128982. "adds r4, r4, r6\n\t"
  128983. "adcs r5, r5, r7\n\t"
  128984. "adc r3, r3, #0\n\t"
  128985. "lsr r6, r8, #16\n\t"
  128986. "lsr r7, r9, #16\n\t"
  128987. "mul r7, r6, r7\n\t"
  128988. "adds r5, r5, r7\n\t"
  128989. "adc r3, r3, #0\n\t"
  128990. "lsl r7, r9, #16\n\t"
  128991. "lsr r7, r7, #16\n\t"
  128992. "mul r6, r7, r6\n\t"
  128993. "lsr r7, r6, #16\n\t"
  128994. "lsl r6, r6, #16\n\t"
  128995. "adds r4, r4, r6\n\t"
  128996. "adcs r5, r5, r7\n\t"
  128997. "adc r3, r3, #0\n\t"
  128998. #else
  128999. "umull r6, r7, r8, r9\n\t"
  129000. "adds r4, r4, r6\n\t"
  129001. "adcs r5, r5, r7\n\t"
  129002. "adc r3, r3, #0\n\t"
  129003. #endif
  129004. /* A[15] * B[4] */
  129005. "ldr r8, [%[a], #60]\n\t"
  129006. "ldr r9, [%[b], #16]\n\t"
  129007. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129008. "lsl r6, r8, #16\n\t"
  129009. "lsl r7, r9, #16\n\t"
  129010. "lsr r6, r6, #16\n\t"
  129011. "lsr r7, r7, #16\n\t"
  129012. "mul r7, r6, r7\n\t"
  129013. "adds r4, r4, r7\n\t"
  129014. "adcs r5, r5, #0\n\t"
  129015. "adc r3, r3, #0\n\t"
  129016. "lsr r7, r9, #16\n\t"
  129017. "mul r6, r7, r6\n\t"
  129018. "lsr r7, r6, #16\n\t"
  129019. "lsl r6, r6, #16\n\t"
  129020. "adds r4, r4, r6\n\t"
  129021. "adcs r5, r5, r7\n\t"
  129022. "adc r3, r3, #0\n\t"
  129023. "lsr r6, r8, #16\n\t"
  129024. "lsr r7, r9, #16\n\t"
  129025. "mul r7, r6, r7\n\t"
  129026. "adds r5, r5, r7\n\t"
  129027. "adc r3, r3, #0\n\t"
  129028. "lsl r7, r9, #16\n\t"
  129029. "lsr r7, r7, #16\n\t"
  129030. "mul r6, r7, r6\n\t"
  129031. "lsr r7, r6, #16\n\t"
  129032. "lsl r6, r6, #16\n\t"
  129033. "adds r4, r4, r6\n\t"
  129034. "adcs r5, r5, r7\n\t"
  129035. "adc r3, r3, #0\n\t"
  129036. #else
  129037. "umull r6, r7, r8, r9\n\t"
  129038. "adds r4, r4, r6\n\t"
  129039. "adcs r5, r5, r7\n\t"
  129040. "adc r3, r3, #0\n\t"
  129041. #endif
  129042. "str r4, [%[r], #76]\n\t"
  129043. /* A[15] * B[5] */
  129044. "ldr r9, [%[b], #20]\n\t"
  129045. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129046. "lsl r6, r8, #16\n\t"
  129047. "lsl r7, r9, #16\n\t"
  129048. "lsr r6, r6, #16\n\t"
  129049. "lsr r7, r7, #16\n\t"
  129050. "mul r7, r6, r7\n\t"
  129051. "adds r5, r5, r7\n\t"
  129052. "adcs r3, r3, #0\n\t"
  129053. "mov r4, #0\n\t"
  129054. "adc r4, r4, #0\n\t"
  129055. "lsr r7, r9, #16\n\t"
  129056. "mul r6, r7, r6\n\t"
  129057. "lsr r7, r6, #16\n\t"
  129058. "lsl r6, r6, #16\n\t"
  129059. "adds r5, r5, r6\n\t"
  129060. "adcs r3, r3, r7\n\t"
  129061. "adc r4, r4, #0\n\t"
  129062. "lsr r6, r8, #16\n\t"
  129063. "lsr r7, r9, #16\n\t"
  129064. "mul r7, r6, r7\n\t"
  129065. "adds r3, r3, r7\n\t"
  129066. "adc r4, r4, #0\n\t"
  129067. "lsl r7, r9, #16\n\t"
  129068. "lsr r7, r7, #16\n\t"
  129069. "mul r6, r7, r6\n\t"
  129070. "lsr r7, r6, #16\n\t"
  129071. "lsl r6, r6, #16\n\t"
  129072. "adds r5, r5, r6\n\t"
  129073. "adcs r3, r3, r7\n\t"
  129074. "adc r4, r4, #0\n\t"
  129075. #else
  129076. "umull r6, r7, r8, r9\n\t"
  129077. "adds r5, r5, r6\n\t"
  129078. "adcs r3, r3, r7\n\t"
  129079. "mov r4, #0\n\t"
  129080. "adc r4, r4, #0\n\t"
  129081. #endif
  129082. /* A[14] * B[6] */
  129083. "ldr r8, [%[a], #56]\n\t"
  129084. "ldr r9, [%[b], #24]\n\t"
  129085. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129086. "lsl r6, r8, #16\n\t"
  129087. "lsl r7, r9, #16\n\t"
  129088. "lsr r6, r6, #16\n\t"
  129089. "lsr r7, r7, #16\n\t"
  129090. "mul r7, r6, r7\n\t"
  129091. "adds r5, r5, r7\n\t"
  129092. "adcs r3, r3, #0\n\t"
  129093. "adc r4, r4, #0\n\t"
  129094. "lsr r7, r9, #16\n\t"
  129095. "mul r6, r7, r6\n\t"
  129096. "lsr r7, r6, #16\n\t"
  129097. "lsl r6, r6, #16\n\t"
  129098. "adds r5, r5, r6\n\t"
  129099. "adcs r3, r3, r7\n\t"
  129100. "adc r4, r4, #0\n\t"
  129101. "lsr r6, r8, #16\n\t"
  129102. "lsr r7, r9, #16\n\t"
  129103. "mul r7, r6, r7\n\t"
  129104. "adds r3, r3, r7\n\t"
  129105. "adc r4, r4, #0\n\t"
  129106. "lsl r7, r9, #16\n\t"
  129107. "lsr r7, r7, #16\n\t"
  129108. "mul r6, r7, r6\n\t"
  129109. "lsr r7, r6, #16\n\t"
  129110. "lsl r6, r6, #16\n\t"
  129111. "adds r5, r5, r6\n\t"
  129112. "adcs r3, r3, r7\n\t"
  129113. "adc r4, r4, #0\n\t"
  129114. #else
  129115. "umull r6, r7, r8, r9\n\t"
  129116. "adds r5, r5, r6\n\t"
  129117. "adcs r3, r3, r7\n\t"
  129118. "adc r4, r4, #0\n\t"
  129119. #endif
  129120. /* A[13] * B[7] */
  129121. "ldr r8, [%[a], #52]\n\t"
  129122. "ldr r9, [%[b], #28]\n\t"
  129123. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129124. "lsl r6, r8, #16\n\t"
  129125. "lsl r7, r9, #16\n\t"
  129126. "lsr r6, r6, #16\n\t"
  129127. "lsr r7, r7, #16\n\t"
  129128. "mul r7, r6, r7\n\t"
  129129. "adds r5, r5, r7\n\t"
  129130. "adcs r3, r3, #0\n\t"
  129131. "adc r4, r4, #0\n\t"
  129132. "lsr r7, r9, #16\n\t"
  129133. "mul r6, r7, r6\n\t"
  129134. "lsr r7, r6, #16\n\t"
  129135. "lsl r6, r6, #16\n\t"
  129136. "adds r5, r5, r6\n\t"
  129137. "adcs r3, r3, r7\n\t"
  129138. "adc r4, r4, #0\n\t"
  129139. "lsr r6, r8, #16\n\t"
  129140. "lsr r7, r9, #16\n\t"
  129141. "mul r7, r6, r7\n\t"
  129142. "adds r3, r3, r7\n\t"
  129143. "adc r4, r4, #0\n\t"
  129144. "lsl r7, r9, #16\n\t"
  129145. "lsr r7, r7, #16\n\t"
  129146. "mul r6, r7, r6\n\t"
  129147. "lsr r7, r6, #16\n\t"
  129148. "lsl r6, r6, #16\n\t"
  129149. "adds r5, r5, r6\n\t"
  129150. "adcs r3, r3, r7\n\t"
  129151. "adc r4, r4, #0\n\t"
  129152. #else
  129153. "umull r6, r7, r8, r9\n\t"
  129154. "adds r5, r5, r6\n\t"
  129155. "adcs r3, r3, r7\n\t"
  129156. "adc r4, r4, #0\n\t"
  129157. #endif
  129158. /* A[12] * B[8] */
  129159. "ldr r8, [%[a], #48]\n\t"
  129160. "ldr r9, [%[b], #32]\n\t"
  129161. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129162. "lsl r6, r8, #16\n\t"
  129163. "lsl r7, r9, #16\n\t"
  129164. "lsr r6, r6, #16\n\t"
  129165. "lsr r7, r7, #16\n\t"
  129166. "mul r7, r6, r7\n\t"
  129167. "adds r5, r5, r7\n\t"
  129168. "adcs r3, r3, #0\n\t"
  129169. "adc r4, r4, #0\n\t"
  129170. "lsr r7, r9, #16\n\t"
  129171. "mul r6, r7, r6\n\t"
  129172. "lsr r7, r6, #16\n\t"
  129173. "lsl r6, r6, #16\n\t"
  129174. "adds r5, r5, r6\n\t"
  129175. "adcs r3, r3, r7\n\t"
  129176. "adc r4, r4, #0\n\t"
  129177. "lsr r6, r8, #16\n\t"
  129178. "lsr r7, r9, #16\n\t"
  129179. "mul r7, r6, r7\n\t"
  129180. "adds r3, r3, r7\n\t"
  129181. "adc r4, r4, #0\n\t"
  129182. "lsl r7, r9, #16\n\t"
  129183. "lsr r7, r7, #16\n\t"
  129184. "mul r6, r7, r6\n\t"
  129185. "lsr r7, r6, #16\n\t"
  129186. "lsl r6, r6, #16\n\t"
  129187. "adds r5, r5, r6\n\t"
  129188. "adcs r3, r3, r7\n\t"
  129189. "adc r4, r4, #0\n\t"
  129190. #else
  129191. "umull r6, r7, r8, r9\n\t"
  129192. "adds r5, r5, r6\n\t"
  129193. "adcs r3, r3, r7\n\t"
  129194. "adc r4, r4, #0\n\t"
  129195. #endif
  129196. /* A[11] * B[9] */
  129197. "ldr r8, [%[a], #44]\n\t"
  129198. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129199. "lsl r6, r8, #16\n\t"
  129200. "lsl r7, r12, #16\n\t"
  129201. "lsr r6, r6, #16\n\t"
  129202. "lsr r7, r7, #16\n\t"
  129203. "mul r7, r6, r7\n\t"
  129204. "adds r5, r5, r7\n\t"
  129205. "adcs r3, r3, #0\n\t"
  129206. "adc r4, r4, #0\n\t"
  129207. "lsr r7, r12, #16\n\t"
  129208. "mul r6, r7, r6\n\t"
  129209. "lsr r7, r6, #16\n\t"
  129210. "lsl r6, r6, #16\n\t"
  129211. "adds r5, r5, r6\n\t"
  129212. "adcs r3, r3, r7\n\t"
  129213. "adc r4, r4, #0\n\t"
  129214. "lsr r6, r8, #16\n\t"
  129215. "lsr r7, r12, #16\n\t"
  129216. "mul r7, r6, r7\n\t"
  129217. "adds r3, r3, r7\n\t"
  129218. "adc r4, r4, #0\n\t"
  129219. "lsl r7, r12, #16\n\t"
  129220. "lsr r7, r7, #16\n\t"
  129221. "mul r6, r7, r6\n\t"
  129222. "lsr r7, r6, #16\n\t"
  129223. "lsl r6, r6, #16\n\t"
  129224. "adds r5, r5, r6\n\t"
  129225. "adcs r3, r3, r7\n\t"
  129226. "adc r4, r4, #0\n\t"
  129227. #else
  129228. "umull r6, r7, r8, r12\n\t"
  129229. "adds r5, r5, r6\n\t"
  129230. "adcs r3, r3, r7\n\t"
  129231. "adc r4, r4, #0\n\t"
  129232. #endif
  129233. /* A[10] * B[10] */
  129234. "ldr r11, [%[a], #40]\n\t"
  129235. "ldr r12, [%[b], #40]\n\t"
  129236. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129237. "lsl r6, r11, #16\n\t"
  129238. "lsl r7, r12, #16\n\t"
  129239. "lsr r6, r6, #16\n\t"
  129240. "lsr r7, r7, #16\n\t"
  129241. "mul r7, r6, r7\n\t"
  129242. "adds r5, r5, r7\n\t"
  129243. "adcs r3, r3, #0\n\t"
  129244. "adc r4, r4, #0\n\t"
  129245. "lsr r7, r12, #16\n\t"
  129246. "mul r6, r7, r6\n\t"
  129247. "lsr r7, r6, #16\n\t"
  129248. "lsl r6, r6, #16\n\t"
  129249. "adds r5, r5, r6\n\t"
  129250. "adcs r3, r3, r7\n\t"
  129251. "adc r4, r4, #0\n\t"
  129252. "lsr r6, r11, #16\n\t"
  129253. "lsr r7, r12, #16\n\t"
  129254. "mul r7, r6, r7\n\t"
  129255. "adds r3, r3, r7\n\t"
  129256. "adc r4, r4, #0\n\t"
  129257. "lsl r7, r12, #16\n\t"
  129258. "lsr r7, r7, #16\n\t"
  129259. "mul r6, r7, r6\n\t"
  129260. "lsr r7, r6, #16\n\t"
  129261. "lsl r6, r6, #16\n\t"
  129262. "adds r5, r5, r6\n\t"
  129263. "adcs r3, r3, r7\n\t"
  129264. "adc r4, r4, #0\n\t"
  129265. #else
  129266. "umull r6, r7, r11, r12\n\t"
  129267. "adds r5, r5, r6\n\t"
  129268. "adcs r3, r3, r7\n\t"
  129269. "adc r4, r4, #0\n\t"
  129270. #endif
  129271. /* A[9] * B[11] */
  129272. "ldr r8, [%[a], #36]\n\t"
  129273. "ldr r9, [%[b], #44]\n\t"
  129274. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129275. "lsl r6, r8, #16\n\t"
  129276. "lsl r7, r9, #16\n\t"
  129277. "lsr r6, r6, #16\n\t"
  129278. "lsr r7, r7, #16\n\t"
  129279. "mul r7, r6, r7\n\t"
  129280. "adds r5, r5, r7\n\t"
  129281. "adcs r3, r3, #0\n\t"
  129282. "adc r4, r4, #0\n\t"
  129283. "lsr r7, r9, #16\n\t"
  129284. "mul r6, r7, r6\n\t"
  129285. "lsr r7, r6, #16\n\t"
  129286. "lsl r6, r6, #16\n\t"
  129287. "adds r5, r5, r6\n\t"
  129288. "adcs r3, r3, r7\n\t"
  129289. "adc r4, r4, #0\n\t"
  129290. "lsr r6, r8, #16\n\t"
  129291. "lsr r7, r9, #16\n\t"
  129292. "mul r7, r6, r7\n\t"
  129293. "adds r3, r3, r7\n\t"
  129294. "adc r4, r4, #0\n\t"
  129295. "lsl r7, r9, #16\n\t"
  129296. "lsr r7, r7, #16\n\t"
  129297. "mul r6, r7, r6\n\t"
  129298. "lsr r7, r6, #16\n\t"
  129299. "lsl r6, r6, #16\n\t"
  129300. "adds r5, r5, r6\n\t"
  129301. "adcs r3, r3, r7\n\t"
  129302. "adc r4, r4, #0\n\t"
  129303. #else
  129304. "umull r6, r7, r8, r9\n\t"
  129305. "adds r5, r5, r6\n\t"
  129306. "adcs r3, r3, r7\n\t"
  129307. "adc r4, r4, #0\n\t"
  129308. #endif
  129309. /* A[8] * B[12] */
  129310. "ldr r8, [%[a], #32]\n\t"
  129311. "ldr r9, [%[b], #48]\n\t"
  129312. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129313. "lsl r6, r8, #16\n\t"
  129314. "lsl r7, r9, #16\n\t"
  129315. "lsr r6, r6, #16\n\t"
  129316. "lsr r7, r7, #16\n\t"
  129317. "mul r7, r6, r7\n\t"
  129318. "adds r5, r5, r7\n\t"
  129319. "adcs r3, r3, #0\n\t"
  129320. "adc r4, r4, #0\n\t"
  129321. "lsr r7, r9, #16\n\t"
  129322. "mul r6, r7, r6\n\t"
  129323. "lsr r7, r6, #16\n\t"
  129324. "lsl r6, r6, #16\n\t"
  129325. "adds r5, r5, r6\n\t"
  129326. "adcs r3, r3, r7\n\t"
  129327. "adc r4, r4, #0\n\t"
  129328. "lsr r6, r8, #16\n\t"
  129329. "lsr r7, r9, #16\n\t"
  129330. "mul r7, r6, r7\n\t"
  129331. "adds r3, r3, r7\n\t"
  129332. "adc r4, r4, #0\n\t"
  129333. "lsl r7, r9, #16\n\t"
  129334. "lsr r7, r7, #16\n\t"
  129335. "mul r6, r7, r6\n\t"
  129336. "lsr r7, r6, #16\n\t"
  129337. "lsl r6, r6, #16\n\t"
  129338. "adds r5, r5, r6\n\t"
  129339. "adcs r3, r3, r7\n\t"
  129340. "adc r4, r4, #0\n\t"
  129341. #else
  129342. "umull r6, r7, r8, r9\n\t"
  129343. "adds r5, r5, r6\n\t"
  129344. "adcs r3, r3, r7\n\t"
  129345. "adc r4, r4, #0\n\t"
  129346. #endif
  129347. /* A[7] * B[13] */
  129348. "ldr r8, [%[a], #28]\n\t"
  129349. "ldr r9, [%[b], #52]\n\t"
  129350. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129351. "lsl r6, r8, #16\n\t"
  129352. "lsl r7, r9, #16\n\t"
  129353. "lsr r6, r6, #16\n\t"
  129354. "lsr r7, r7, #16\n\t"
  129355. "mul r7, r6, r7\n\t"
  129356. "adds r5, r5, r7\n\t"
  129357. "adcs r3, r3, #0\n\t"
  129358. "adc r4, r4, #0\n\t"
  129359. "lsr r7, r9, #16\n\t"
  129360. "mul r6, r7, r6\n\t"
  129361. "lsr r7, r6, #16\n\t"
  129362. "lsl r6, r6, #16\n\t"
  129363. "adds r5, r5, r6\n\t"
  129364. "adcs r3, r3, r7\n\t"
  129365. "adc r4, r4, #0\n\t"
  129366. "lsr r6, r8, #16\n\t"
  129367. "lsr r7, r9, #16\n\t"
  129368. "mul r7, r6, r7\n\t"
  129369. "adds r3, r3, r7\n\t"
  129370. "adc r4, r4, #0\n\t"
  129371. "lsl r7, r9, #16\n\t"
  129372. "lsr r7, r7, #16\n\t"
  129373. "mul r6, r7, r6\n\t"
  129374. "lsr r7, r6, #16\n\t"
  129375. "lsl r6, r6, #16\n\t"
  129376. "adds r5, r5, r6\n\t"
  129377. "adcs r3, r3, r7\n\t"
  129378. "adc r4, r4, #0\n\t"
  129379. #else
  129380. "umull r6, r7, r8, r9\n\t"
  129381. "adds r5, r5, r6\n\t"
  129382. "adcs r3, r3, r7\n\t"
  129383. "adc r4, r4, #0\n\t"
  129384. #endif
  129385. /* A[6] * B[14] */
  129386. "ldr r8, [%[a], #24]\n\t"
  129387. "ldr r9, [%[b], #56]\n\t"
  129388. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129389. "lsl r6, r8, #16\n\t"
  129390. "lsl r7, r9, #16\n\t"
  129391. "lsr r6, r6, #16\n\t"
  129392. "lsr r7, r7, #16\n\t"
  129393. "mul r7, r6, r7\n\t"
  129394. "adds r5, r5, r7\n\t"
  129395. "adcs r3, r3, #0\n\t"
  129396. "adc r4, r4, #0\n\t"
  129397. "lsr r7, r9, #16\n\t"
  129398. "mul r6, r7, r6\n\t"
  129399. "lsr r7, r6, #16\n\t"
  129400. "lsl r6, r6, #16\n\t"
  129401. "adds r5, r5, r6\n\t"
  129402. "adcs r3, r3, r7\n\t"
  129403. "adc r4, r4, #0\n\t"
  129404. "lsr r6, r8, #16\n\t"
  129405. "lsr r7, r9, #16\n\t"
  129406. "mul r7, r6, r7\n\t"
  129407. "adds r3, r3, r7\n\t"
  129408. "adc r4, r4, #0\n\t"
  129409. "lsl r7, r9, #16\n\t"
  129410. "lsr r7, r7, #16\n\t"
  129411. "mul r6, r7, r6\n\t"
  129412. "lsr r7, r6, #16\n\t"
  129413. "lsl r6, r6, #16\n\t"
  129414. "adds r5, r5, r6\n\t"
  129415. "adcs r3, r3, r7\n\t"
  129416. "adc r4, r4, #0\n\t"
  129417. #else
  129418. "umull r6, r7, r8, r9\n\t"
  129419. "adds r5, r5, r6\n\t"
  129420. "adcs r3, r3, r7\n\t"
  129421. "adc r4, r4, #0\n\t"
  129422. #endif
  129423. /* A[5] * B[15] */
  129424. "ldr r8, [%[a], #20]\n\t"
  129425. "ldr r9, [%[b], #60]\n\t"
  129426. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129427. "lsl r6, r8, #16\n\t"
  129428. "lsl r7, r9, #16\n\t"
  129429. "lsr r6, r6, #16\n\t"
  129430. "lsr r7, r7, #16\n\t"
  129431. "mul r7, r6, r7\n\t"
  129432. "adds r5, r5, r7\n\t"
  129433. "adcs r3, r3, #0\n\t"
  129434. "adc r4, r4, #0\n\t"
  129435. "lsr r7, r9, #16\n\t"
  129436. "mul r6, r7, r6\n\t"
  129437. "lsr r7, r6, #16\n\t"
  129438. "lsl r6, r6, #16\n\t"
  129439. "adds r5, r5, r6\n\t"
  129440. "adcs r3, r3, r7\n\t"
  129441. "adc r4, r4, #0\n\t"
  129442. "lsr r6, r8, #16\n\t"
  129443. "lsr r7, r9, #16\n\t"
  129444. "mul r7, r6, r7\n\t"
  129445. "adds r3, r3, r7\n\t"
  129446. "adc r4, r4, #0\n\t"
  129447. "lsl r7, r9, #16\n\t"
  129448. "lsr r7, r7, #16\n\t"
  129449. "mul r6, r7, r6\n\t"
  129450. "lsr r7, r6, #16\n\t"
  129451. "lsl r6, r6, #16\n\t"
  129452. "adds r5, r5, r6\n\t"
  129453. "adcs r3, r3, r7\n\t"
  129454. "adc r4, r4, #0\n\t"
  129455. #else
  129456. "umull r6, r7, r8, r9\n\t"
  129457. "adds r5, r5, r6\n\t"
  129458. "adcs r3, r3, r7\n\t"
  129459. "adc r4, r4, #0\n\t"
  129460. #endif
  129461. "str r5, [%[r], #80]\n\t"
  129462. /* A[6] * B[15] */
  129463. "ldr r8, [%[a], #24]\n\t"
  129464. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129465. "lsl r6, r8, #16\n\t"
  129466. "lsl r7, r9, #16\n\t"
  129467. "lsr r6, r6, #16\n\t"
  129468. "lsr r7, r7, #16\n\t"
  129469. "mul r7, r6, r7\n\t"
  129470. "adds r3, r3, r7\n\t"
  129471. "adcs r4, r4, #0\n\t"
  129472. "mov r5, #0\n\t"
  129473. "adc r5, r5, #0\n\t"
  129474. "lsr r7, r9, #16\n\t"
  129475. "mul r6, r7, r6\n\t"
  129476. "lsr r7, r6, #16\n\t"
  129477. "lsl r6, r6, #16\n\t"
  129478. "adds r3, r3, r6\n\t"
  129479. "adcs r4, r4, r7\n\t"
  129480. "adc r5, r5, #0\n\t"
  129481. "lsr r6, r8, #16\n\t"
  129482. "lsr r7, r9, #16\n\t"
  129483. "mul r7, r6, r7\n\t"
  129484. "adds r4, r4, r7\n\t"
  129485. "adc r5, r5, #0\n\t"
  129486. "lsl r7, r9, #16\n\t"
  129487. "lsr r7, r7, #16\n\t"
  129488. "mul r6, r7, r6\n\t"
  129489. "lsr r7, r6, #16\n\t"
  129490. "lsl r6, r6, #16\n\t"
  129491. "adds r3, r3, r6\n\t"
  129492. "adcs r4, r4, r7\n\t"
  129493. "adc r5, r5, #0\n\t"
  129494. #else
  129495. "umull r6, r7, r8, r9\n\t"
  129496. "adds r3, r3, r6\n\t"
  129497. "adcs r4, r4, r7\n\t"
  129498. "mov r5, #0\n\t"
  129499. "adc r5, r5, #0\n\t"
  129500. #endif
  129501. /* A[7] * B[14] */
  129502. "ldr r8, [%[a], #28]\n\t"
  129503. "ldr r9, [%[b], #56]\n\t"
  129504. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129505. "lsl r6, r8, #16\n\t"
  129506. "lsl r7, r9, #16\n\t"
  129507. "lsr r6, r6, #16\n\t"
  129508. "lsr r7, r7, #16\n\t"
  129509. "mul r7, r6, r7\n\t"
  129510. "adds r3, r3, r7\n\t"
  129511. "adcs r4, r4, #0\n\t"
  129512. "adc r5, r5, #0\n\t"
  129513. "lsr r7, r9, #16\n\t"
  129514. "mul r6, r7, r6\n\t"
  129515. "lsr r7, r6, #16\n\t"
  129516. "lsl r6, r6, #16\n\t"
  129517. "adds r3, r3, r6\n\t"
  129518. "adcs r4, r4, r7\n\t"
  129519. "adc r5, r5, #0\n\t"
  129520. "lsr r6, r8, #16\n\t"
  129521. "lsr r7, r9, #16\n\t"
  129522. "mul r7, r6, r7\n\t"
  129523. "adds r4, r4, r7\n\t"
  129524. "adc r5, r5, #0\n\t"
  129525. "lsl r7, r9, #16\n\t"
  129526. "lsr r7, r7, #16\n\t"
  129527. "mul r6, r7, r6\n\t"
  129528. "lsr r7, r6, #16\n\t"
  129529. "lsl r6, r6, #16\n\t"
  129530. "adds r3, r3, r6\n\t"
  129531. "adcs r4, r4, r7\n\t"
  129532. "adc r5, r5, #0\n\t"
  129533. #else
  129534. "umull r6, r7, r8, r9\n\t"
  129535. "adds r3, r3, r6\n\t"
  129536. "adcs r4, r4, r7\n\t"
  129537. "adc r5, r5, #0\n\t"
  129538. #endif
  129539. /* A[8] * B[13] */
  129540. "ldr r8, [%[a], #32]\n\t"
  129541. "ldr r9, [%[b], #52]\n\t"
  129542. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129543. "lsl r6, r8, #16\n\t"
  129544. "lsl r7, r9, #16\n\t"
  129545. "lsr r6, r6, #16\n\t"
  129546. "lsr r7, r7, #16\n\t"
  129547. "mul r7, r6, r7\n\t"
  129548. "adds r3, r3, r7\n\t"
  129549. "adcs r4, r4, #0\n\t"
  129550. "adc r5, r5, #0\n\t"
  129551. "lsr r7, r9, #16\n\t"
  129552. "mul r6, r7, r6\n\t"
  129553. "lsr r7, r6, #16\n\t"
  129554. "lsl r6, r6, #16\n\t"
  129555. "adds r3, r3, r6\n\t"
  129556. "adcs r4, r4, r7\n\t"
  129557. "adc r5, r5, #0\n\t"
  129558. "lsr r6, r8, #16\n\t"
  129559. "lsr r7, r9, #16\n\t"
  129560. "mul r7, r6, r7\n\t"
  129561. "adds r4, r4, r7\n\t"
  129562. "adc r5, r5, #0\n\t"
  129563. "lsl r7, r9, #16\n\t"
  129564. "lsr r7, r7, #16\n\t"
  129565. "mul r6, r7, r6\n\t"
  129566. "lsr r7, r6, #16\n\t"
  129567. "lsl r6, r6, #16\n\t"
  129568. "adds r3, r3, r6\n\t"
  129569. "adcs r4, r4, r7\n\t"
  129570. "adc r5, r5, #0\n\t"
  129571. #else
  129572. "umull r6, r7, r8, r9\n\t"
  129573. "adds r3, r3, r6\n\t"
  129574. "adcs r4, r4, r7\n\t"
  129575. "adc r5, r5, #0\n\t"
  129576. #endif
  129577. /* A[9] * B[12] */
  129578. "ldr r8, [%[a], #36]\n\t"
  129579. "ldr r9, [%[b], #48]\n\t"
  129580. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129581. "lsl r6, r8, #16\n\t"
  129582. "lsl r7, r9, #16\n\t"
  129583. "lsr r6, r6, #16\n\t"
  129584. "lsr r7, r7, #16\n\t"
  129585. "mul r7, r6, r7\n\t"
  129586. "adds r3, r3, r7\n\t"
  129587. "adcs r4, r4, #0\n\t"
  129588. "adc r5, r5, #0\n\t"
  129589. "lsr r7, r9, #16\n\t"
  129590. "mul r6, r7, r6\n\t"
  129591. "lsr r7, r6, #16\n\t"
  129592. "lsl r6, r6, #16\n\t"
  129593. "adds r3, r3, r6\n\t"
  129594. "adcs r4, r4, r7\n\t"
  129595. "adc r5, r5, #0\n\t"
  129596. "lsr r6, r8, #16\n\t"
  129597. "lsr r7, r9, #16\n\t"
  129598. "mul r7, r6, r7\n\t"
  129599. "adds r4, r4, r7\n\t"
  129600. "adc r5, r5, #0\n\t"
  129601. "lsl r7, r9, #16\n\t"
  129602. "lsr r7, r7, #16\n\t"
  129603. "mul r6, r7, r6\n\t"
  129604. "lsr r7, r6, #16\n\t"
  129605. "lsl r6, r6, #16\n\t"
  129606. "adds r3, r3, r6\n\t"
  129607. "adcs r4, r4, r7\n\t"
  129608. "adc r5, r5, #0\n\t"
  129609. #else
  129610. "umull r6, r7, r8, r9\n\t"
  129611. "adds r3, r3, r6\n\t"
  129612. "adcs r4, r4, r7\n\t"
  129613. "adc r5, r5, #0\n\t"
  129614. #endif
  129615. /* A[10] * B[11] */
  129616. "ldr r9, [%[b], #44]\n\t"
  129617. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129618. "lsl r6, r11, #16\n\t"
  129619. "lsl r7, r9, #16\n\t"
  129620. "lsr r6, r6, #16\n\t"
  129621. "lsr r7, r7, #16\n\t"
  129622. "mul r7, r6, r7\n\t"
  129623. "adds r3, r3, r7\n\t"
  129624. "adcs r4, r4, #0\n\t"
  129625. "adc r5, r5, #0\n\t"
  129626. "lsr r7, r9, #16\n\t"
  129627. "mul r6, r7, r6\n\t"
  129628. "lsr r7, r6, #16\n\t"
  129629. "lsl r6, r6, #16\n\t"
  129630. "adds r3, r3, r6\n\t"
  129631. "adcs r4, r4, r7\n\t"
  129632. "adc r5, r5, #0\n\t"
  129633. "lsr r6, r11, #16\n\t"
  129634. "lsr r7, r9, #16\n\t"
  129635. "mul r7, r6, r7\n\t"
  129636. "adds r4, r4, r7\n\t"
  129637. "adc r5, r5, #0\n\t"
  129638. "lsl r7, r9, #16\n\t"
  129639. "lsr r7, r7, #16\n\t"
  129640. "mul r6, r7, r6\n\t"
  129641. "lsr r7, r6, #16\n\t"
  129642. "lsl r6, r6, #16\n\t"
  129643. "adds r3, r3, r6\n\t"
  129644. "adcs r4, r4, r7\n\t"
  129645. "adc r5, r5, #0\n\t"
  129646. #else
  129647. "umull r6, r7, r11, r9\n\t"
  129648. "adds r3, r3, r6\n\t"
  129649. "adcs r4, r4, r7\n\t"
  129650. "adc r5, r5, #0\n\t"
  129651. #endif
  129652. /* A[11] * B[10] */
  129653. "ldr r8, [%[a], #44]\n\t"
  129654. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129655. "lsl r6, r8, #16\n\t"
  129656. "lsl r7, r12, #16\n\t"
  129657. "lsr r6, r6, #16\n\t"
  129658. "lsr r7, r7, #16\n\t"
  129659. "mul r7, r6, r7\n\t"
  129660. "adds r3, r3, r7\n\t"
  129661. "adcs r4, r4, #0\n\t"
  129662. "adc r5, r5, #0\n\t"
  129663. "lsr r7, r12, #16\n\t"
  129664. "mul r6, r7, r6\n\t"
  129665. "lsr r7, r6, #16\n\t"
  129666. "lsl r6, r6, #16\n\t"
  129667. "adds r3, r3, r6\n\t"
  129668. "adcs r4, r4, r7\n\t"
  129669. "adc r5, r5, #0\n\t"
  129670. "lsr r6, r8, #16\n\t"
  129671. "lsr r7, r12, #16\n\t"
  129672. "mul r7, r6, r7\n\t"
  129673. "adds r4, r4, r7\n\t"
  129674. "adc r5, r5, #0\n\t"
  129675. "lsl r7, r12, #16\n\t"
  129676. "lsr r7, r7, #16\n\t"
  129677. "mul r6, r7, r6\n\t"
  129678. "lsr r7, r6, #16\n\t"
  129679. "lsl r6, r6, #16\n\t"
  129680. "adds r3, r3, r6\n\t"
  129681. "adcs r4, r4, r7\n\t"
  129682. "adc r5, r5, #0\n\t"
  129683. #else
  129684. "umull r6, r7, r8, r12\n\t"
  129685. "adds r3, r3, r6\n\t"
  129686. "adcs r4, r4, r7\n\t"
  129687. "adc r5, r5, #0\n\t"
  129688. #endif
  129689. /* A[12] * B[9] */
  129690. "ldr r8, [%[a], #48]\n\t"
  129691. "ldr r9, [%[b], #36]\n\t"
  129692. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129693. "lsl r6, r8, #16\n\t"
  129694. "lsl r7, r9, #16\n\t"
  129695. "lsr r6, r6, #16\n\t"
  129696. "lsr r7, r7, #16\n\t"
  129697. "mul r7, r6, r7\n\t"
  129698. "adds r3, r3, r7\n\t"
  129699. "adcs r4, r4, #0\n\t"
  129700. "adc r5, r5, #0\n\t"
  129701. "lsr r7, r9, #16\n\t"
  129702. "mul r6, r7, r6\n\t"
  129703. "lsr r7, r6, #16\n\t"
  129704. "lsl r6, r6, #16\n\t"
  129705. "adds r3, r3, r6\n\t"
  129706. "adcs r4, r4, r7\n\t"
  129707. "adc r5, r5, #0\n\t"
  129708. "lsr r6, r8, #16\n\t"
  129709. "lsr r7, r9, #16\n\t"
  129710. "mul r7, r6, r7\n\t"
  129711. "adds r4, r4, r7\n\t"
  129712. "adc r5, r5, #0\n\t"
  129713. "lsl r7, r9, #16\n\t"
  129714. "lsr r7, r7, #16\n\t"
  129715. "mul r6, r7, r6\n\t"
  129716. "lsr r7, r6, #16\n\t"
  129717. "lsl r6, r6, #16\n\t"
  129718. "adds r3, r3, r6\n\t"
  129719. "adcs r4, r4, r7\n\t"
  129720. "adc r5, r5, #0\n\t"
  129721. #else
  129722. "umull r6, r7, r8, r9\n\t"
  129723. "adds r3, r3, r6\n\t"
  129724. "adcs r4, r4, r7\n\t"
  129725. "adc r5, r5, #0\n\t"
  129726. #endif
  129727. /* A[13] * B[8] */
  129728. "ldr r8, [%[a], #52]\n\t"
  129729. "ldr r9, [%[b], #32]\n\t"
  129730. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129731. "lsl r6, r8, #16\n\t"
  129732. "lsl r7, r9, #16\n\t"
  129733. "lsr r6, r6, #16\n\t"
  129734. "lsr r7, r7, #16\n\t"
  129735. "mul r7, r6, r7\n\t"
  129736. "adds r3, r3, r7\n\t"
  129737. "adcs r4, r4, #0\n\t"
  129738. "adc r5, r5, #0\n\t"
  129739. "lsr r7, r9, #16\n\t"
  129740. "mul r6, r7, r6\n\t"
  129741. "lsr r7, r6, #16\n\t"
  129742. "lsl r6, r6, #16\n\t"
  129743. "adds r3, r3, r6\n\t"
  129744. "adcs r4, r4, r7\n\t"
  129745. "adc r5, r5, #0\n\t"
  129746. "lsr r6, r8, #16\n\t"
  129747. "lsr r7, r9, #16\n\t"
  129748. "mul r7, r6, r7\n\t"
  129749. "adds r4, r4, r7\n\t"
  129750. "adc r5, r5, #0\n\t"
  129751. "lsl r7, r9, #16\n\t"
  129752. "lsr r7, r7, #16\n\t"
  129753. "mul r6, r7, r6\n\t"
  129754. "lsr r7, r6, #16\n\t"
  129755. "lsl r6, r6, #16\n\t"
  129756. "adds r3, r3, r6\n\t"
  129757. "adcs r4, r4, r7\n\t"
  129758. "adc r5, r5, #0\n\t"
  129759. #else
  129760. "umull r6, r7, r8, r9\n\t"
  129761. "adds r3, r3, r6\n\t"
  129762. "adcs r4, r4, r7\n\t"
  129763. "adc r5, r5, #0\n\t"
  129764. #endif
  129765. /* A[14] * B[7] */
  129766. "ldr r8, [%[a], #56]\n\t"
  129767. "ldr r9, [%[b], #28]\n\t"
  129768. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129769. "lsl r6, r8, #16\n\t"
  129770. "lsl r7, r9, #16\n\t"
  129771. "lsr r6, r6, #16\n\t"
  129772. "lsr r7, r7, #16\n\t"
  129773. "mul r7, r6, r7\n\t"
  129774. "adds r3, r3, r7\n\t"
  129775. "adcs r4, r4, #0\n\t"
  129776. "adc r5, r5, #0\n\t"
  129777. "lsr r7, r9, #16\n\t"
  129778. "mul r6, r7, r6\n\t"
  129779. "lsr r7, r6, #16\n\t"
  129780. "lsl r6, r6, #16\n\t"
  129781. "adds r3, r3, r6\n\t"
  129782. "adcs r4, r4, r7\n\t"
  129783. "adc r5, r5, #0\n\t"
  129784. "lsr r6, r8, #16\n\t"
  129785. "lsr r7, r9, #16\n\t"
  129786. "mul r7, r6, r7\n\t"
  129787. "adds r4, r4, r7\n\t"
  129788. "adc r5, r5, #0\n\t"
  129789. "lsl r7, r9, #16\n\t"
  129790. "lsr r7, r7, #16\n\t"
  129791. "mul r6, r7, r6\n\t"
  129792. "lsr r7, r6, #16\n\t"
  129793. "lsl r6, r6, #16\n\t"
  129794. "adds r3, r3, r6\n\t"
  129795. "adcs r4, r4, r7\n\t"
  129796. "adc r5, r5, #0\n\t"
  129797. #else
  129798. "umull r6, r7, r8, r9\n\t"
  129799. "adds r3, r3, r6\n\t"
  129800. "adcs r4, r4, r7\n\t"
  129801. "adc r5, r5, #0\n\t"
  129802. #endif
  129803. /* A[15] * B[6] */
  129804. "ldr r8, [%[a], #60]\n\t"
  129805. "ldr r9, [%[b], #24]\n\t"
  129806. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129807. "lsl r6, r8, #16\n\t"
  129808. "lsl r7, r9, #16\n\t"
  129809. "lsr r6, r6, #16\n\t"
  129810. "lsr r7, r7, #16\n\t"
  129811. "mul r7, r6, r7\n\t"
  129812. "adds r3, r3, r7\n\t"
  129813. "adcs r4, r4, #0\n\t"
  129814. "adc r5, r5, #0\n\t"
  129815. "lsr r7, r9, #16\n\t"
  129816. "mul r6, r7, r6\n\t"
  129817. "lsr r7, r6, #16\n\t"
  129818. "lsl r6, r6, #16\n\t"
  129819. "adds r3, r3, r6\n\t"
  129820. "adcs r4, r4, r7\n\t"
  129821. "adc r5, r5, #0\n\t"
  129822. "lsr r6, r8, #16\n\t"
  129823. "lsr r7, r9, #16\n\t"
  129824. "mul r7, r6, r7\n\t"
  129825. "adds r4, r4, r7\n\t"
  129826. "adc r5, r5, #0\n\t"
  129827. "lsl r7, r9, #16\n\t"
  129828. "lsr r7, r7, #16\n\t"
  129829. "mul r6, r7, r6\n\t"
  129830. "lsr r7, r6, #16\n\t"
  129831. "lsl r6, r6, #16\n\t"
  129832. "adds r3, r3, r6\n\t"
  129833. "adcs r4, r4, r7\n\t"
  129834. "adc r5, r5, #0\n\t"
  129835. #else
  129836. "umull r6, r7, r8, r9\n\t"
  129837. "adds r3, r3, r6\n\t"
  129838. "adcs r4, r4, r7\n\t"
  129839. "adc r5, r5, #0\n\t"
  129840. #endif
  129841. "str r3, [%[r], #84]\n\t"
  129842. /* A[15] * B[7] */
  129843. "ldr r9, [%[b], #28]\n\t"
  129844. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129845. "lsl r6, r8, #16\n\t"
  129846. "lsl r7, r9, #16\n\t"
  129847. "lsr r6, r6, #16\n\t"
  129848. "lsr r7, r7, #16\n\t"
  129849. "mul r7, r6, r7\n\t"
  129850. "adds r4, r4, r7\n\t"
  129851. "adcs r5, r5, #0\n\t"
  129852. "mov r3, #0\n\t"
  129853. "adc r3, r3, #0\n\t"
  129854. "lsr r7, r9, #16\n\t"
  129855. "mul r6, r7, r6\n\t"
  129856. "lsr r7, r6, #16\n\t"
  129857. "lsl r6, r6, #16\n\t"
  129858. "adds r4, r4, r6\n\t"
  129859. "adcs r5, r5, r7\n\t"
  129860. "adc r3, r3, #0\n\t"
  129861. "lsr r6, r8, #16\n\t"
  129862. "lsr r7, r9, #16\n\t"
  129863. "mul r7, r6, r7\n\t"
  129864. "adds r5, r5, r7\n\t"
  129865. "adc r3, r3, #0\n\t"
  129866. "lsl r7, r9, #16\n\t"
  129867. "lsr r7, r7, #16\n\t"
  129868. "mul r6, r7, r6\n\t"
  129869. "lsr r7, r6, #16\n\t"
  129870. "lsl r6, r6, #16\n\t"
  129871. "adds r4, r4, r6\n\t"
  129872. "adcs r5, r5, r7\n\t"
  129873. "adc r3, r3, #0\n\t"
  129874. #else
  129875. "umull r6, r7, r8, r9\n\t"
  129876. "adds r4, r4, r6\n\t"
  129877. "adcs r5, r5, r7\n\t"
  129878. "mov r3, #0\n\t"
  129879. "adc r3, r3, #0\n\t"
  129880. #endif
  129881. /* A[14] * B[8] */
  129882. "ldr r8, [%[a], #56]\n\t"
  129883. "ldr r9, [%[b], #32]\n\t"
  129884. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129885. "lsl r6, r8, #16\n\t"
  129886. "lsl r7, r9, #16\n\t"
  129887. "lsr r6, r6, #16\n\t"
  129888. "lsr r7, r7, #16\n\t"
  129889. "mul r7, r6, r7\n\t"
  129890. "adds r4, r4, r7\n\t"
  129891. "adcs r5, r5, #0\n\t"
  129892. "adc r3, r3, #0\n\t"
  129893. "lsr r7, r9, #16\n\t"
  129894. "mul r6, r7, r6\n\t"
  129895. "lsr r7, r6, #16\n\t"
  129896. "lsl r6, r6, #16\n\t"
  129897. "adds r4, r4, r6\n\t"
  129898. "adcs r5, r5, r7\n\t"
  129899. "adc r3, r3, #0\n\t"
  129900. "lsr r6, r8, #16\n\t"
  129901. "lsr r7, r9, #16\n\t"
  129902. "mul r7, r6, r7\n\t"
  129903. "adds r5, r5, r7\n\t"
  129904. "adc r3, r3, #0\n\t"
  129905. "lsl r7, r9, #16\n\t"
  129906. "lsr r7, r7, #16\n\t"
  129907. "mul r6, r7, r6\n\t"
  129908. "lsr r7, r6, #16\n\t"
  129909. "lsl r6, r6, #16\n\t"
  129910. "adds r4, r4, r6\n\t"
  129911. "adcs r5, r5, r7\n\t"
  129912. "adc r3, r3, #0\n\t"
  129913. #else
  129914. "umull r6, r7, r8, r9\n\t"
  129915. "adds r4, r4, r6\n\t"
  129916. "adcs r5, r5, r7\n\t"
  129917. "adc r3, r3, #0\n\t"
  129918. #endif
  129919. /* A[13] * B[9] */
  129920. "ldr r8, [%[a], #52]\n\t"
  129921. "ldr r9, [%[b], #36]\n\t"
  129922. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129923. "lsl r6, r8, #16\n\t"
  129924. "lsl r7, r9, #16\n\t"
  129925. "lsr r6, r6, #16\n\t"
  129926. "lsr r7, r7, #16\n\t"
  129927. "mul r7, r6, r7\n\t"
  129928. "adds r4, r4, r7\n\t"
  129929. "adcs r5, r5, #0\n\t"
  129930. "adc r3, r3, #0\n\t"
  129931. "lsr r7, r9, #16\n\t"
  129932. "mul r6, r7, r6\n\t"
  129933. "lsr r7, r6, #16\n\t"
  129934. "lsl r6, r6, #16\n\t"
  129935. "adds r4, r4, r6\n\t"
  129936. "adcs r5, r5, r7\n\t"
  129937. "adc r3, r3, #0\n\t"
  129938. "lsr r6, r8, #16\n\t"
  129939. "lsr r7, r9, #16\n\t"
  129940. "mul r7, r6, r7\n\t"
  129941. "adds r5, r5, r7\n\t"
  129942. "adc r3, r3, #0\n\t"
  129943. "lsl r7, r9, #16\n\t"
  129944. "lsr r7, r7, #16\n\t"
  129945. "mul r6, r7, r6\n\t"
  129946. "lsr r7, r6, #16\n\t"
  129947. "lsl r6, r6, #16\n\t"
  129948. "adds r4, r4, r6\n\t"
  129949. "adcs r5, r5, r7\n\t"
  129950. "adc r3, r3, #0\n\t"
  129951. #else
  129952. "umull r6, r7, r8, r9\n\t"
  129953. "adds r4, r4, r6\n\t"
  129954. "adcs r5, r5, r7\n\t"
  129955. "adc r3, r3, #0\n\t"
  129956. #endif
  129957. /* A[12] * B[10] */
  129958. "ldr r8, [%[a], #48]\n\t"
  129959. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129960. "lsl r6, r8, #16\n\t"
  129961. "lsl r7, r12, #16\n\t"
  129962. "lsr r6, r6, #16\n\t"
  129963. "lsr r7, r7, #16\n\t"
  129964. "mul r7, r6, r7\n\t"
  129965. "adds r4, r4, r7\n\t"
  129966. "adcs r5, r5, #0\n\t"
  129967. "adc r3, r3, #0\n\t"
  129968. "lsr r7, r12, #16\n\t"
  129969. "mul r6, r7, r6\n\t"
  129970. "lsr r7, r6, #16\n\t"
  129971. "lsl r6, r6, #16\n\t"
  129972. "adds r4, r4, r6\n\t"
  129973. "adcs r5, r5, r7\n\t"
  129974. "adc r3, r3, #0\n\t"
  129975. "lsr r6, r8, #16\n\t"
  129976. "lsr r7, r12, #16\n\t"
  129977. "mul r7, r6, r7\n\t"
  129978. "adds r5, r5, r7\n\t"
  129979. "adc r3, r3, #0\n\t"
  129980. "lsl r7, r12, #16\n\t"
  129981. "lsr r7, r7, #16\n\t"
  129982. "mul r6, r7, r6\n\t"
  129983. "lsr r7, r6, #16\n\t"
  129984. "lsl r6, r6, #16\n\t"
  129985. "adds r4, r4, r6\n\t"
  129986. "adcs r5, r5, r7\n\t"
  129987. "adc r3, r3, #0\n\t"
  129988. #else
  129989. "umull r6, r7, r8, r12\n\t"
  129990. "adds r4, r4, r6\n\t"
  129991. "adcs r5, r5, r7\n\t"
  129992. "adc r3, r3, #0\n\t"
  129993. #endif
  129994. /* A[11] * B[11] */
  129995. "ldr r11, [%[a], #44]\n\t"
  129996. "ldr r12, [%[b], #44]\n\t"
  129997. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  129998. "lsl r6, r11, #16\n\t"
  129999. "lsl r7, r12, #16\n\t"
  130000. "lsr r6, r6, #16\n\t"
  130001. "lsr r7, r7, #16\n\t"
  130002. "mul r7, r6, r7\n\t"
  130003. "adds r4, r4, r7\n\t"
  130004. "adcs r5, r5, #0\n\t"
  130005. "adc r3, r3, #0\n\t"
  130006. "lsr r7, r12, #16\n\t"
  130007. "mul r6, r7, r6\n\t"
  130008. "lsr r7, r6, #16\n\t"
  130009. "lsl r6, r6, #16\n\t"
  130010. "adds r4, r4, r6\n\t"
  130011. "adcs r5, r5, r7\n\t"
  130012. "adc r3, r3, #0\n\t"
  130013. "lsr r6, r11, #16\n\t"
  130014. "lsr r7, r12, #16\n\t"
  130015. "mul r7, r6, r7\n\t"
  130016. "adds r5, r5, r7\n\t"
  130017. "adc r3, r3, #0\n\t"
  130018. "lsl r7, r12, #16\n\t"
  130019. "lsr r7, r7, #16\n\t"
  130020. "mul r6, r7, r6\n\t"
  130021. "lsr r7, r6, #16\n\t"
  130022. "lsl r6, r6, #16\n\t"
  130023. "adds r4, r4, r6\n\t"
  130024. "adcs r5, r5, r7\n\t"
  130025. "adc r3, r3, #0\n\t"
  130026. #else
  130027. "umull r6, r7, r11, r12\n\t"
  130028. "adds r4, r4, r6\n\t"
  130029. "adcs r5, r5, r7\n\t"
  130030. "adc r3, r3, #0\n\t"
  130031. #endif
  130032. /* A[10] * B[12] */
  130033. "ldr r8, [%[a], #40]\n\t"
  130034. "ldr r9, [%[b], #48]\n\t"
  130035. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130036. "lsl r6, r8, #16\n\t"
  130037. "lsl r7, r9, #16\n\t"
  130038. "lsr r6, r6, #16\n\t"
  130039. "lsr r7, r7, #16\n\t"
  130040. "mul r7, r6, r7\n\t"
  130041. "adds r4, r4, r7\n\t"
  130042. "adcs r5, r5, #0\n\t"
  130043. "adc r3, r3, #0\n\t"
  130044. "lsr r7, r9, #16\n\t"
  130045. "mul r6, r7, r6\n\t"
  130046. "lsr r7, r6, #16\n\t"
  130047. "lsl r6, r6, #16\n\t"
  130048. "adds r4, r4, r6\n\t"
  130049. "adcs r5, r5, r7\n\t"
  130050. "adc r3, r3, #0\n\t"
  130051. "lsr r6, r8, #16\n\t"
  130052. "lsr r7, r9, #16\n\t"
  130053. "mul r7, r6, r7\n\t"
  130054. "adds r5, r5, r7\n\t"
  130055. "adc r3, r3, #0\n\t"
  130056. "lsl r7, r9, #16\n\t"
  130057. "lsr r7, r7, #16\n\t"
  130058. "mul r6, r7, r6\n\t"
  130059. "lsr r7, r6, #16\n\t"
  130060. "lsl r6, r6, #16\n\t"
  130061. "adds r4, r4, r6\n\t"
  130062. "adcs r5, r5, r7\n\t"
  130063. "adc r3, r3, #0\n\t"
  130064. #else
  130065. "umull r6, r7, r8, r9\n\t"
  130066. "adds r4, r4, r6\n\t"
  130067. "adcs r5, r5, r7\n\t"
  130068. "adc r3, r3, #0\n\t"
  130069. #endif
  130070. /* A[9] * B[13] */
  130071. "ldr r8, [%[a], #36]\n\t"
  130072. "ldr r9, [%[b], #52]\n\t"
  130073. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130074. "lsl r6, r8, #16\n\t"
  130075. "lsl r7, r9, #16\n\t"
  130076. "lsr r6, r6, #16\n\t"
  130077. "lsr r7, r7, #16\n\t"
  130078. "mul r7, r6, r7\n\t"
  130079. "adds r4, r4, r7\n\t"
  130080. "adcs r5, r5, #0\n\t"
  130081. "adc r3, r3, #0\n\t"
  130082. "lsr r7, r9, #16\n\t"
  130083. "mul r6, r7, r6\n\t"
  130084. "lsr r7, r6, #16\n\t"
  130085. "lsl r6, r6, #16\n\t"
  130086. "adds r4, r4, r6\n\t"
  130087. "adcs r5, r5, r7\n\t"
  130088. "adc r3, r3, #0\n\t"
  130089. "lsr r6, r8, #16\n\t"
  130090. "lsr r7, r9, #16\n\t"
  130091. "mul r7, r6, r7\n\t"
  130092. "adds r5, r5, r7\n\t"
  130093. "adc r3, r3, #0\n\t"
  130094. "lsl r7, r9, #16\n\t"
  130095. "lsr r7, r7, #16\n\t"
  130096. "mul r6, r7, r6\n\t"
  130097. "lsr r7, r6, #16\n\t"
  130098. "lsl r6, r6, #16\n\t"
  130099. "adds r4, r4, r6\n\t"
  130100. "adcs r5, r5, r7\n\t"
  130101. "adc r3, r3, #0\n\t"
  130102. #else
  130103. "umull r6, r7, r8, r9\n\t"
  130104. "adds r4, r4, r6\n\t"
  130105. "adcs r5, r5, r7\n\t"
  130106. "adc r3, r3, #0\n\t"
  130107. #endif
  130108. /* A[8] * B[14] */
  130109. "ldr r8, [%[a], #32]\n\t"
  130110. "ldr r9, [%[b], #56]\n\t"
  130111. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130112. "lsl r6, r8, #16\n\t"
  130113. "lsl r7, r9, #16\n\t"
  130114. "lsr r6, r6, #16\n\t"
  130115. "lsr r7, r7, #16\n\t"
  130116. "mul r7, r6, r7\n\t"
  130117. "adds r4, r4, r7\n\t"
  130118. "adcs r5, r5, #0\n\t"
  130119. "adc r3, r3, #0\n\t"
  130120. "lsr r7, r9, #16\n\t"
  130121. "mul r6, r7, r6\n\t"
  130122. "lsr r7, r6, #16\n\t"
  130123. "lsl r6, r6, #16\n\t"
  130124. "adds r4, r4, r6\n\t"
  130125. "adcs r5, r5, r7\n\t"
  130126. "adc r3, r3, #0\n\t"
  130127. "lsr r6, r8, #16\n\t"
  130128. "lsr r7, r9, #16\n\t"
  130129. "mul r7, r6, r7\n\t"
  130130. "adds r5, r5, r7\n\t"
  130131. "adc r3, r3, #0\n\t"
  130132. "lsl r7, r9, #16\n\t"
  130133. "lsr r7, r7, #16\n\t"
  130134. "mul r6, r7, r6\n\t"
  130135. "lsr r7, r6, #16\n\t"
  130136. "lsl r6, r6, #16\n\t"
  130137. "adds r4, r4, r6\n\t"
  130138. "adcs r5, r5, r7\n\t"
  130139. "adc r3, r3, #0\n\t"
  130140. #else
  130141. "umull r6, r7, r8, r9\n\t"
  130142. "adds r4, r4, r6\n\t"
  130143. "adcs r5, r5, r7\n\t"
  130144. "adc r3, r3, #0\n\t"
  130145. #endif
  130146. /* A[7] * B[15] */
  130147. "ldr r8, [%[a], #28]\n\t"
  130148. "ldr r9, [%[b], #60]\n\t"
  130149. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130150. "lsl r6, r8, #16\n\t"
  130151. "lsl r7, r9, #16\n\t"
  130152. "lsr r6, r6, #16\n\t"
  130153. "lsr r7, r7, #16\n\t"
  130154. "mul r7, r6, r7\n\t"
  130155. "adds r4, r4, r7\n\t"
  130156. "adcs r5, r5, #0\n\t"
  130157. "adc r3, r3, #0\n\t"
  130158. "lsr r7, r9, #16\n\t"
  130159. "mul r6, r7, r6\n\t"
  130160. "lsr r7, r6, #16\n\t"
  130161. "lsl r6, r6, #16\n\t"
  130162. "adds r4, r4, r6\n\t"
  130163. "adcs r5, r5, r7\n\t"
  130164. "adc r3, r3, #0\n\t"
  130165. "lsr r6, r8, #16\n\t"
  130166. "lsr r7, r9, #16\n\t"
  130167. "mul r7, r6, r7\n\t"
  130168. "adds r5, r5, r7\n\t"
  130169. "adc r3, r3, #0\n\t"
  130170. "lsl r7, r9, #16\n\t"
  130171. "lsr r7, r7, #16\n\t"
  130172. "mul r6, r7, r6\n\t"
  130173. "lsr r7, r6, #16\n\t"
  130174. "lsl r6, r6, #16\n\t"
  130175. "adds r4, r4, r6\n\t"
  130176. "adcs r5, r5, r7\n\t"
  130177. "adc r3, r3, #0\n\t"
  130178. #else
  130179. "umull r6, r7, r8, r9\n\t"
  130180. "adds r4, r4, r6\n\t"
  130181. "adcs r5, r5, r7\n\t"
  130182. "adc r3, r3, #0\n\t"
  130183. #endif
  130184. "str r4, [%[r], #88]\n\t"
  130185. /* A[8] * B[15] */
  130186. "ldr r8, [%[a], #32]\n\t"
  130187. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130188. "lsl r6, r8, #16\n\t"
  130189. "lsl r7, r9, #16\n\t"
  130190. "lsr r6, r6, #16\n\t"
  130191. "lsr r7, r7, #16\n\t"
  130192. "mul r7, r6, r7\n\t"
  130193. "adds r5, r5, r7\n\t"
  130194. "adcs r3, r3, #0\n\t"
  130195. "mov r4, #0\n\t"
  130196. "adc r4, r4, #0\n\t"
  130197. "lsr r7, r9, #16\n\t"
  130198. "mul r6, r7, r6\n\t"
  130199. "lsr r7, r6, #16\n\t"
  130200. "lsl r6, r6, #16\n\t"
  130201. "adds r5, r5, r6\n\t"
  130202. "adcs r3, r3, r7\n\t"
  130203. "adc r4, r4, #0\n\t"
  130204. "lsr r6, r8, #16\n\t"
  130205. "lsr r7, r9, #16\n\t"
  130206. "mul r7, r6, r7\n\t"
  130207. "adds r3, r3, r7\n\t"
  130208. "adc r4, r4, #0\n\t"
  130209. "lsl r7, r9, #16\n\t"
  130210. "lsr r7, r7, #16\n\t"
  130211. "mul r6, r7, r6\n\t"
  130212. "lsr r7, r6, #16\n\t"
  130213. "lsl r6, r6, #16\n\t"
  130214. "adds r5, r5, r6\n\t"
  130215. "adcs r3, r3, r7\n\t"
  130216. "adc r4, r4, #0\n\t"
  130217. #else
  130218. "umull r6, r7, r8, r9\n\t"
  130219. "adds r5, r5, r6\n\t"
  130220. "adcs r3, r3, r7\n\t"
  130221. "mov r4, #0\n\t"
  130222. "adc r4, r4, #0\n\t"
  130223. #endif
  130224. /* A[9] * B[14] */
  130225. "ldr r8, [%[a], #36]\n\t"
  130226. "ldr r9, [%[b], #56]\n\t"
  130227. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130228. "lsl r6, r8, #16\n\t"
  130229. "lsl r7, r9, #16\n\t"
  130230. "lsr r6, r6, #16\n\t"
  130231. "lsr r7, r7, #16\n\t"
  130232. "mul r7, r6, r7\n\t"
  130233. "adds r5, r5, r7\n\t"
  130234. "adcs r3, r3, #0\n\t"
  130235. "adc r4, r4, #0\n\t"
  130236. "lsr r7, r9, #16\n\t"
  130237. "mul r6, r7, r6\n\t"
  130238. "lsr r7, r6, #16\n\t"
  130239. "lsl r6, r6, #16\n\t"
  130240. "adds r5, r5, r6\n\t"
  130241. "adcs r3, r3, r7\n\t"
  130242. "adc r4, r4, #0\n\t"
  130243. "lsr r6, r8, #16\n\t"
  130244. "lsr r7, r9, #16\n\t"
  130245. "mul r7, r6, r7\n\t"
  130246. "adds r3, r3, r7\n\t"
  130247. "adc r4, r4, #0\n\t"
  130248. "lsl r7, r9, #16\n\t"
  130249. "lsr r7, r7, #16\n\t"
  130250. "mul r6, r7, r6\n\t"
  130251. "lsr r7, r6, #16\n\t"
  130252. "lsl r6, r6, #16\n\t"
  130253. "adds r5, r5, r6\n\t"
  130254. "adcs r3, r3, r7\n\t"
  130255. "adc r4, r4, #0\n\t"
  130256. #else
  130257. "umull r6, r7, r8, r9\n\t"
  130258. "adds r5, r5, r6\n\t"
  130259. "adcs r3, r3, r7\n\t"
  130260. "adc r4, r4, #0\n\t"
  130261. #endif
  130262. /* A[10] * B[13] */
  130263. "ldr r8, [%[a], #40]\n\t"
  130264. "ldr r9, [%[b], #52]\n\t"
  130265. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130266. "lsl r6, r8, #16\n\t"
  130267. "lsl r7, r9, #16\n\t"
  130268. "lsr r6, r6, #16\n\t"
  130269. "lsr r7, r7, #16\n\t"
  130270. "mul r7, r6, r7\n\t"
  130271. "adds r5, r5, r7\n\t"
  130272. "adcs r3, r3, #0\n\t"
  130273. "adc r4, r4, #0\n\t"
  130274. "lsr r7, r9, #16\n\t"
  130275. "mul r6, r7, r6\n\t"
  130276. "lsr r7, r6, #16\n\t"
  130277. "lsl r6, r6, #16\n\t"
  130278. "adds r5, r5, r6\n\t"
  130279. "adcs r3, r3, r7\n\t"
  130280. "adc r4, r4, #0\n\t"
  130281. "lsr r6, r8, #16\n\t"
  130282. "lsr r7, r9, #16\n\t"
  130283. "mul r7, r6, r7\n\t"
  130284. "adds r3, r3, r7\n\t"
  130285. "adc r4, r4, #0\n\t"
  130286. "lsl r7, r9, #16\n\t"
  130287. "lsr r7, r7, #16\n\t"
  130288. "mul r6, r7, r6\n\t"
  130289. "lsr r7, r6, #16\n\t"
  130290. "lsl r6, r6, #16\n\t"
  130291. "adds r5, r5, r6\n\t"
  130292. "adcs r3, r3, r7\n\t"
  130293. "adc r4, r4, #0\n\t"
  130294. #else
  130295. "umull r6, r7, r8, r9\n\t"
  130296. "adds r5, r5, r6\n\t"
  130297. "adcs r3, r3, r7\n\t"
  130298. "adc r4, r4, #0\n\t"
  130299. #endif
  130300. /* A[11] * B[12] */
  130301. "ldr r9, [%[b], #48]\n\t"
  130302. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130303. "lsl r6, r11, #16\n\t"
  130304. "lsl r7, r9, #16\n\t"
  130305. "lsr r6, r6, #16\n\t"
  130306. "lsr r7, r7, #16\n\t"
  130307. "mul r7, r6, r7\n\t"
  130308. "adds r5, r5, r7\n\t"
  130309. "adcs r3, r3, #0\n\t"
  130310. "adc r4, r4, #0\n\t"
  130311. "lsr r7, r9, #16\n\t"
  130312. "mul r6, r7, r6\n\t"
  130313. "lsr r7, r6, #16\n\t"
  130314. "lsl r6, r6, #16\n\t"
  130315. "adds r5, r5, r6\n\t"
  130316. "adcs r3, r3, r7\n\t"
  130317. "adc r4, r4, #0\n\t"
  130318. "lsr r6, r11, #16\n\t"
  130319. "lsr r7, r9, #16\n\t"
  130320. "mul r7, r6, r7\n\t"
  130321. "adds r3, r3, r7\n\t"
  130322. "adc r4, r4, #0\n\t"
  130323. "lsl r7, r9, #16\n\t"
  130324. "lsr r7, r7, #16\n\t"
  130325. "mul r6, r7, r6\n\t"
  130326. "lsr r7, r6, #16\n\t"
  130327. "lsl r6, r6, #16\n\t"
  130328. "adds r5, r5, r6\n\t"
  130329. "adcs r3, r3, r7\n\t"
  130330. "adc r4, r4, #0\n\t"
  130331. #else
  130332. "umull r6, r7, r11, r9\n\t"
  130333. "adds r5, r5, r6\n\t"
  130334. "adcs r3, r3, r7\n\t"
  130335. "adc r4, r4, #0\n\t"
  130336. #endif
  130337. /* A[12] * B[11] */
  130338. "ldr r8, [%[a], #48]\n\t"
  130339. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130340. "lsl r6, r8, #16\n\t"
  130341. "lsl r7, r12, #16\n\t"
  130342. "lsr r6, r6, #16\n\t"
  130343. "lsr r7, r7, #16\n\t"
  130344. "mul r7, r6, r7\n\t"
  130345. "adds r5, r5, r7\n\t"
  130346. "adcs r3, r3, #0\n\t"
  130347. "adc r4, r4, #0\n\t"
  130348. "lsr r7, r12, #16\n\t"
  130349. "mul r6, r7, r6\n\t"
  130350. "lsr r7, r6, #16\n\t"
  130351. "lsl r6, r6, #16\n\t"
  130352. "adds r5, r5, r6\n\t"
  130353. "adcs r3, r3, r7\n\t"
  130354. "adc r4, r4, #0\n\t"
  130355. "lsr r6, r8, #16\n\t"
  130356. "lsr r7, r12, #16\n\t"
  130357. "mul r7, r6, r7\n\t"
  130358. "adds r3, r3, r7\n\t"
  130359. "adc r4, r4, #0\n\t"
  130360. "lsl r7, r12, #16\n\t"
  130361. "lsr r7, r7, #16\n\t"
  130362. "mul r6, r7, r6\n\t"
  130363. "lsr r7, r6, #16\n\t"
  130364. "lsl r6, r6, #16\n\t"
  130365. "adds r5, r5, r6\n\t"
  130366. "adcs r3, r3, r7\n\t"
  130367. "adc r4, r4, #0\n\t"
  130368. #else
  130369. "umull r6, r7, r8, r12\n\t"
  130370. "adds r5, r5, r6\n\t"
  130371. "adcs r3, r3, r7\n\t"
  130372. "adc r4, r4, #0\n\t"
  130373. #endif
  130374. /* A[13] * B[10] */
  130375. "ldr r8, [%[a], #52]\n\t"
  130376. "ldr r9, [%[b], #40]\n\t"
  130377. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130378. "lsl r6, r8, #16\n\t"
  130379. "lsl r7, r9, #16\n\t"
  130380. "lsr r6, r6, #16\n\t"
  130381. "lsr r7, r7, #16\n\t"
  130382. "mul r7, r6, r7\n\t"
  130383. "adds r5, r5, r7\n\t"
  130384. "adcs r3, r3, #0\n\t"
  130385. "adc r4, r4, #0\n\t"
  130386. "lsr r7, r9, #16\n\t"
  130387. "mul r6, r7, r6\n\t"
  130388. "lsr r7, r6, #16\n\t"
  130389. "lsl r6, r6, #16\n\t"
  130390. "adds r5, r5, r6\n\t"
  130391. "adcs r3, r3, r7\n\t"
  130392. "adc r4, r4, #0\n\t"
  130393. "lsr r6, r8, #16\n\t"
  130394. "lsr r7, r9, #16\n\t"
  130395. "mul r7, r6, r7\n\t"
  130396. "adds r3, r3, r7\n\t"
  130397. "adc r4, r4, #0\n\t"
  130398. "lsl r7, r9, #16\n\t"
  130399. "lsr r7, r7, #16\n\t"
  130400. "mul r6, r7, r6\n\t"
  130401. "lsr r7, r6, #16\n\t"
  130402. "lsl r6, r6, #16\n\t"
  130403. "adds r5, r5, r6\n\t"
  130404. "adcs r3, r3, r7\n\t"
  130405. "adc r4, r4, #0\n\t"
  130406. #else
  130407. "umull r6, r7, r8, r9\n\t"
  130408. "adds r5, r5, r6\n\t"
  130409. "adcs r3, r3, r7\n\t"
  130410. "adc r4, r4, #0\n\t"
  130411. #endif
  130412. /* A[14] * B[9] */
  130413. "ldr r8, [%[a], #56]\n\t"
  130414. "ldr r9, [%[b], #36]\n\t"
  130415. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130416. "lsl r6, r8, #16\n\t"
  130417. "lsl r7, r9, #16\n\t"
  130418. "lsr r6, r6, #16\n\t"
  130419. "lsr r7, r7, #16\n\t"
  130420. "mul r7, r6, r7\n\t"
  130421. "adds r5, r5, r7\n\t"
  130422. "adcs r3, r3, #0\n\t"
  130423. "adc r4, r4, #0\n\t"
  130424. "lsr r7, r9, #16\n\t"
  130425. "mul r6, r7, r6\n\t"
  130426. "lsr r7, r6, #16\n\t"
  130427. "lsl r6, r6, #16\n\t"
  130428. "adds r5, r5, r6\n\t"
  130429. "adcs r3, r3, r7\n\t"
  130430. "adc r4, r4, #0\n\t"
  130431. "lsr r6, r8, #16\n\t"
  130432. "lsr r7, r9, #16\n\t"
  130433. "mul r7, r6, r7\n\t"
  130434. "adds r3, r3, r7\n\t"
  130435. "adc r4, r4, #0\n\t"
  130436. "lsl r7, r9, #16\n\t"
  130437. "lsr r7, r7, #16\n\t"
  130438. "mul r6, r7, r6\n\t"
  130439. "lsr r7, r6, #16\n\t"
  130440. "lsl r6, r6, #16\n\t"
  130441. "adds r5, r5, r6\n\t"
  130442. "adcs r3, r3, r7\n\t"
  130443. "adc r4, r4, #0\n\t"
  130444. #else
  130445. "umull r6, r7, r8, r9\n\t"
  130446. "adds r5, r5, r6\n\t"
  130447. "adcs r3, r3, r7\n\t"
  130448. "adc r4, r4, #0\n\t"
  130449. #endif
  130450. /* A[15] * B[8] */
  130451. "ldr r8, [%[a], #60]\n\t"
  130452. "ldr r9, [%[b], #32]\n\t"
  130453. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130454. "lsl r6, r8, #16\n\t"
  130455. "lsl r7, r9, #16\n\t"
  130456. "lsr r6, r6, #16\n\t"
  130457. "lsr r7, r7, #16\n\t"
  130458. "mul r7, r6, r7\n\t"
  130459. "adds r5, r5, r7\n\t"
  130460. "adcs r3, r3, #0\n\t"
  130461. "adc r4, r4, #0\n\t"
  130462. "lsr r7, r9, #16\n\t"
  130463. "mul r6, r7, r6\n\t"
  130464. "lsr r7, r6, #16\n\t"
  130465. "lsl r6, r6, #16\n\t"
  130466. "adds r5, r5, r6\n\t"
  130467. "adcs r3, r3, r7\n\t"
  130468. "adc r4, r4, #0\n\t"
  130469. "lsr r6, r8, #16\n\t"
  130470. "lsr r7, r9, #16\n\t"
  130471. "mul r7, r6, r7\n\t"
  130472. "adds r3, r3, r7\n\t"
  130473. "adc r4, r4, #0\n\t"
  130474. "lsl r7, r9, #16\n\t"
  130475. "lsr r7, r7, #16\n\t"
  130476. "mul r6, r7, r6\n\t"
  130477. "lsr r7, r6, #16\n\t"
  130478. "lsl r6, r6, #16\n\t"
  130479. "adds r5, r5, r6\n\t"
  130480. "adcs r3, r3, r7\n\t"
  130481. "adc r4, r4, #0\n\t"
  130482. #else
  130483. "umull r6, r7, r8, r9\n\t"
  130484. "adds r5, r5, r6\n\t"
  130485. "adcs r3, r3, r7\n\t"
  130486. "adc r4, r4, #0\n\t"
  130487. #endif
  130488. "str r5, [%[r], #92]\n\t"
  130489. /* A[15] * B[9] */
  130490. "ldr r9, [%[b], #36]\n\t"
  130491. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130492. "lsl r6, r8, #16\n\t"
  130493. "lsl r7, r9, #16\n\t"
  130494. "lsr r6, r6, #16\n\t"
  130495. "lsr r7, r7, #16\n\t"
  130496. "mul r7, r6, r7\n\t"
  130497. "adds r3, r3, r7\n\t"
  130498. "adcs r4, r4, #0\n\t"
  130499. "mov r5, #0\n\t"
  130500. "adc r5, r5, #0\n\t"
  130501. "lsr r7, r9, #16\n\t"
  130502. "mul r6, r7, r6\n\t"
  130503. "lsr r7, r6, #16\n\t"
  130504. "lsl r6, r6, #16\n\t"
  130505. "adds r3, r3, r6\n\t"
  130506. "adcs r4, r4, r7\n\t"
  130507. "adc r5, r5, #0\n\t"
  130508. "lsr r6, r8, #16\n\t"
  130509. "lsr r7, r9, #16\n\t"
  130510. "mul r7, r6, r7\n\t"
  130511. "adds r4, r4, r7\n\t"
  130512. "adc r5, r5, #0\n\t"
  130513. "lsl r7, r9, #16\n\t"
  130514. "lsr r7, r7, #16\n\t"
  130515. "mul r6, r7, r6\n\t"
  130516. "lsr r7, r6, #16\n\t"
  130517. "lsl r6, r6, #16\n\t"
  130518. "adds r3, r3, r6\n\t"
  130519. "adcs r4, r4, r7\n\t"
  130520. "adc r5, r5, #0\n\t"
  130521. #else
  130522. "umull r6, r7, r8, r9\n\t"
  130523. "adds r3, r3, r6\n\t"
  130524. "adcs r4, r4, r7\n\t"
  130525. "mov r5, #0\n\t"
  130526. "adc r5, r5, #0\n\t"
  130527. #endif
  130528. /* A[14] * B[10] */
  130529. "ldr r8, [%[a], #56]\n\t"
  130530. "ldr r9, [%[b], #40]\n\t"
  130531. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130532. "lsl r6, r8, #16\n\t"
  130533. "lsl r7, r9, #16\n\t"
  130534. "lsr r6, r6, #16\n\t"
  130535. "lsr r7, r7, #16\n\t"
  130536. "mul r7, r6, r7\n\t"
  130537. "adds r3, r3, r7\n\t"
  130538. "adcs r4, r4, #0\n\t"
  130539. "adc r5, r5, #0\n\t"
  130540. "lsr r7, r9, #16\n\t"
  130541. "mul r6, r7, r6\n\t"
  130542. "lsr r7, r6, #16\n\t"
  130543. "lsl r6, r6, #16\n\t"
  130544. "adds r3, r3, r6\n\t"
  130545. "adcs r4, r4, r7\n\t"
  130546. "adc r5, r5, #0\n\t"
  130547. "lsr r6, r8, #16\n\t"
  130548. "lsr r7, r9, #16\n\t"
  130549. "mul r7, r6, r7\n\t"
  130550. "adds r4, r4, r7\n\t"
  130551. "adc r5, r5, #0\n\t"
  130552. "lsl r7, r9, #16\n\t"
  130553. "lsr r7, r7, #16\n\t"
  130554. "mul r6, r7, r6\n\t"
  130555. "lsr r7, r6, #16\n\t"
  130556. "lsl r6, r6, #16\n\t"
  130557. "adds r3, r3, r6\n\t"
  130558. "adcs r4, r4, r7\n\t"
  130559. "adc r5, r5, #0\n\t"
  130560. #else
  130561. "umull r6, r7, r8, r9\n\t"
  130562. "adds r3, r3, r6\n\t"
  130563. "adcs r4, r4, r7\n\t"
  130564. "adc r5, r5, #0\n\t"
  130565. #endif
  130566. /* A[13] * B[11] */
  130567. "ldr r8, [%[a], #52]\n\t"
  130568. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130569. "lsl r6, r8, #16\n\t"
  130570. "lsl r7, r12, #16\n\t"
  130571. "lsr r6, r6, #16\n\t"
  130572. "lsr r7, r7, #16\n\t"
  130573. "mul r7, r6, r7\n\t"
  130574. "adds r3, r3, r7\n\t"
  130575. "adcs r4, r4, #0\n\t"
  130576. "adc r5, r5, #0\n\t"
  130577. "lsr r7, r12, #16\n\t"
  130578. "mul r6, r7, r6\n\t"
  130579. "lsr r7, r6, #16\n\t"
  130580. "lsl r6, r6, #16\n\t"
  130581. "adds r3, r3, r6\n\t"
  130582. "adcs r4, r4, r7\n\t"
  130583. "adc r5, r5, #0\n\t"
  130584. "lsr r6, r8, #16\n\t"
  130585. "lsr r7, r12, #16\n\t"
  130586. "mul r7, r6, r7\n\t"
  130587. "adds r4, r4, r7\n\t"
  130588. "adc r5, r5, #0\n\t"
  130589. "lsl r7, r12, #16\n\t"
  130590. "lsr r7, r7, #16\n\t"
  130591. "mul r6, r7, r6\n\t"
  130592. "lsr r7, r6, #16\n\t"
  130593. "lsl r6, r6, #16\n\t"
  130594. "adds r3, r3, r6\n\t"
  130595. "adcs r4, r4, r7\n\t"
  130596. "adc r5, r5, #0\n\t"
  130597. #else
  130598. "umull r6, r7, r8, r12\n\t"
  130599. "adds r3, r3, r6\n\t"
  130600. "adcs r4, r4, r7\n\t"
  130601. "adc r5, r5, #0\n\t"
  130602. #endif
  130603. /* A[12] * B[12] */
  130604. "ldr r11, [%[a], #48]\n\t"
  130605. "ldr r12, [%[b], #48]\n\t"
  130606. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130607. "lsl r6, r11, #16\n\t"
  130608. "lsl r7, r12, #16\n\t"
  130609. "lsr r6, r6, #16\n\t"
  130610. "lsr r7, r7, #16\n\t"
  130611. "mul r7, r6, r7\n\t"
  130612. "adds r3, r3, r7\n\t"
  130613. "adcs r4, r4, #0\n\t"
  130614. "adc r5, r5, #0\n\t"
  130615. "lsr r7, r12, #16\n\t"
  130616. "mul r6, r7, r6\n\t"
  130617. "lsr r7, r6, #16\n\t"
  130618. "lsl r6, r6, #16\n\t"
  130619. "adds r3, r3, r6\n\t"
  130620. "adcs r4, r4, r7\n\t"
  130621. "adc r5, r5, #0\n\t"
  130622. "lsr r6, r11, #16\n\t"
  130623. "lsr r7, r12, #16\n\t"
  130624. "mul r7, r6, r7\n\t"
  130625. "adds r4, r4, r7\n\t"
  130626. "adc r5, r5, #0\n\t"
  130627. "lsl r7, r12, #16\n\t"
  130628. "lsr r7, r7, #16\n\t"
  130629. "mul r6, r7, r6\n\t"
  130630. "lsr r7, r6, #16\n\t"
  130631. "lsl r6, r6, #16\n\t"
  130632. "adds r3, r3, r6\n\t"
  130633. "adcs r4, r4, r7\n\t"
  130634. "adc r5, r5, #0\n\t"
  130635. #else
  130636. "umull r6, r7, r11, r12\n\t"
  130637. "adds r3, r3, r6\n\t"
  130638. "adcs r4, r4, r7\n\t"
  130639. "adc r5, r5, #0\n\t"
  130640. #endif
  130641. /* A[11] * B[13] */
  130642. "ldr r8, [%[a], #44]\n\t"
  130643. "ldr r9, [%[b], #52]\n\t"
  130644. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130645. "lsl r6, r8, #16\n\t"
  130646. "lsl r7, r9, #16\n\t"
  130647. "lsr r6, r6, #16\n\t"
  130648. "lsr r7, r7, #16\n\t"
  130649. "mul r7, r6, r7\n\t"
  130650. "adds r3, r3, r7\n\t"
  130651. "adcs r4, r4, #0\n\t"
  130652. "adc r5, r5, #0\n\t"
  130653. "lsr r7, r9, #16\n\t"
  130654. "mul r6, r7, r6\n\t"
  130655. "lsr r7, r6, #16\n\t"
  130656. "lsl r6, r6, #16\n\t"
  130657. "adds r3, r3, r6\n\t"
  130658. "adcs r4, r4, r7\n\t"
  130659. "adc r5, r5, #0\n\t"
  130660. "lsr r6, r8, #16\n\t"
  130661. "lsr r7, r9, #16\n\t"
  130662. "mul r7, r6, r7\n\t"
  130663. "adds r4, r4, r7\n\t"
  130664. "adc r5, r5, #0\n\t"
  130665. "lsl r7, r9, #16\n\t"
  130666. "lsr r7, r7, #16\n\t"
  130667. "mul r6, r7, r6\n\t"
  130668. "lsr r7, r6, #16\n\t"
  130669. "lsl r6, r6, #16\n\t"
  130670. "adds r3, r3, r6\n\t"
  130671. "adcs r4, r4, r7\n\t"
  130672. "adc r5, r5, #0\n\t"
  130673. #else
  130674. "umull r6, r7, r8, r9\n\t"
  130675. "adds r3, r3, r6\n\t"
  130676. "adcs r4, r4, r7\n\t"
  130677. "adc r5, r5, #0\n\t"
  130678. #endif
  130679. /* A[10] * B[14] */
  130680. "ldr r8, [%[a], #40]\n\t"
  130681. "ldr r9, [%[b], #56]\n\t"
  130682. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130683. "lsl r6, r8, #16\n\t"
  130684. "lsl r7, r9, #16\n\t"
  130685. "lsr r6, r6, #16\n\t"
  130686. "lsr r7, r7, #16\n\t"
  130687. "mul r7, r6, r7\n\t"
  130688. "adds r3, r3, r7\n\t"
  130689. "adcs r4, r4, #0\n\t"
  130690. "adc r5, r5, #0\n\t"
  130691. "lsr r7, r9, #16\n\t"
  130692. "mul r6, r7, r6\n\t"
  130693. "lsr r7, r6, #16\n\t"
  130694. "lsl r6, r6, #16\n\t"
  130695. "adds r3, r3, r6\n\t"
  130696. "adcs r4, r4, r7\n\t"
  130697. "adc r5, r5, #0\n\t"
  130698. "lsr r6, r8, #16\n\t"
  130699. "lsr r7, r9, #16\n\t"
  130700. "mul r7, r6, r7\n\t"
  130701. "adds r4, r4, r7\n\t"
  130702. "adc r5, r5, #0\n\t"
  130703. "lsl r7, r9, #16\n\t"
  130704. "lsr r7, r7, #16\n\t"
  130705. "mul r6, r7, r6\n\t"
  130706. "lsr r7, r6, #16\n\t"
  130707. "lsl r6, r6, #16\n\t"
  130708. "adds r3, r3, r6\n\t"
  130709. "adcs r4, r4, r7\n\t"
  130710. "adc r5, r5, #0\n\t"
  130711. #else
  130712. "umull r6, r7, r8, r9\n\t"
  130713. "adds r3, r3, r6\n\t"
  130714. "adcs r4, r4, r7\n\t"
  130715. "adc r5, r5, #0\n\t"
  130716. #endif
  130717. /* A[9] * B[15] */
  130718. "ldr r8, [%[a], #36]\n\t"
  130719. "ldr r9, [%[b], #60]\n\t"
  130720. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130721. "lsl r6, r8, #16\n\t"
  130722. "lsl r7, r9, #16\n\t"
  130723. "lsr r6, r6, #16\n\t"
  130724. "lsr r7, r7, #16\n\t"
  130725. "mul r7, r6, r7\n\t"
  130726. "adds r3, r3, r7\n\t"
  130727. "adcs r4, r4, #0\n\t"
  130728. "adc r5, r5, #0\n\t"
  130729. "lsr r7, r9, #16\n\t"
  130730. "mul r6, r7, r6\n\t"
  130731. "lsr r7, r6, #16\n\t"
  130732. "lsl r6, r6, #16\n\t"
  130733. "adds r3, r3, r6\n\t"
  130734. "adcs r4, r4, r7\n\t"
  130735. "adc r5, r5, #0\n\t"
  130736. "lsr r6, r8, #16\n\t"
  130737. "lsr r7, r9, #16\n\t"
  130738. "mul r7, r6, r7\n\t"
  130739. "adds r4, r4, r7\n\t"
  130740. "adc r5, r5, #0\n\t"
  130741. "lsl r7, r9, #16\n\t"
  130742. "lsr r7, r7, #16\n\t"
  130743. "mul r6, r7, r6\n\t"
  130744. "lsr r7, r6, #16\n\t"
  130745. "lsl r6, r6, #16\n\t"
  130746. "adds r3, r3, r6\n\t"
  130747. "adcs r4, r4, r7\n\t"
  130748. "adc r5, r5, #0\n\t"
  130749. #else
  130750. "umull r6, r7, r8, r9\n\t"
  130751. "adds r3, r3, r6\n\t"
  130752. "adcs r4, r4, r7\n\t"
  130753. "adc r5, r5, #0\n\t"
  130754. #endif
  130755. "str r3, [%[r], #96]\n\t"
  130756. /* A[10] * B[15] */
  130757. "ldr r8, [%[a], #40]\n\t"
  130758. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130759. "lsl r6, r8, #16\n\t"
  130760. "lsl r7, r9, #16\n\t"
  130761. "lsr r6, r6, #16\n\t"
  130762. "lsr r7, r7, #16\n\t"
  130763. "mul r7, r6, r7\n\t"
  130764. "adds r4, r4, r7\n\t"
  130765. "adcs r5, r5, #0\n\t"
  130766. "mov r3, #0\n\t"
  130767. "adc r3, r3, #0\n\t"
  130768. "lsr r7, r9, #16\n\t"
  130769. "mul r6, r7, r6\n\t"
  130770. "lsr r7, r6, #16\n\t"
  130771. "lsl r6, r6, #16\n\t"
  130772. "adds r4, r4, r6\n\t"
  130773. "adcs r5, r5, r7\n\t"
  130774. "adc r3, r3, #0\n\t"
  130775. "lsr r6, r8, #16\n\t"
  130776. "lsr r7, r9, #16\n\t"
  130777. "mul r7, r6, r7\n\t"
  130778. "adds r5, r5, r7\n\t"
  130779. "adc r3, r3, #0\n\t"
  130780. "lsl r7, r9, #16\n\t"
  130781. "lsr r7, r7, #16\n\t"
  130782. "mul r6, r7, r6\n\t"
  130783. "lsr r7, r6, #16\n\t"
  130784. "lsl r6, r6, #16\n\t"
  130785. "adds r4, r4, r6\n\t"
  130786. "adcs r5, r5, r7\n\t"
  130787. "adc r3, r3, #0\n\t"
  130788. #else
  130789. "umull r6, r7, r8, r9\n\t"
  130790. "adds r4, r4, r6\n\t"
  130791. "adcs r5, r5, r7\n\t"
  130792. "mov r3, #0\n\t"
  130793. "adc r3, r3, #0\n\t"
  130794. #endif
  130795. /* A[11] * B[14] */
  130796. "ldr r8, [%[a], #44]\n\t"
  130797. "ldr r9, [%[b], #56]\n\t"
  130798. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130799. "lsl r6, r8, #16\n\t"
  130800. "lsl r7, r9, #16\n\t"
  130801. "lsr r6, r6, #16\n\t"
  130802. "lsr r7, r7, #16\n\t"
  130803. "mul r7, r6, r7\n\t"
  130804. "adds r4, r4, r7\n\t"
  130805. "adcs r5, r5, #0\n\t"
  130806. "adc r3, r3, #0\n\t"
  130807. "lsr r7, r9, #16\n\t"
  130808. "mul r6, r7, r6\n\t"
  130809. "lsr r7, r6, #16\n\t"
  130810. "lsl r6, r6, #16\n\t"
  130811. "adds r4, r4, r6\n\t"
  130812. "adcs r5, r5, r7\n\t"
  130813. "adc r3, r3, #0\n\t"
  130814. "lsr r6, r8, #16\n\t"
  130815. "lsr r7, r9, #16\n\t"
  130816. "mul r7, r6, r7\n\t"
  130817. "adds r5, r5, r7\n\t"
  130818. "adc r3, r3, #0\n\t"
  130819. "lsl r7, r9, #16\n\t"
  130820. "lsr r7, r7, #16\n\t"
  130821. "mul r6, r7, r6\n\t"
  130822. "lsr r7, r6, #16\n\t"
  130823. "lsl r6, r6, #16\n\t"
  130824. "adds r4, r4, r6\n\t"
  130825. "adcs r5, r5, r7\n\t"
  130826. "adc r3, r3, #0\n\t"
  130827. #else
  130828. "umull r6, r7, r8, r9\n\t"
  130829. "adds r4, r4, r6\n\t"
  130830. "adcs r5, r5, r7\n\t"
  130831. "adc r3, r3, #0\n\t"
  130832. #endif
  130833. /* A[12] * B[13] */
  130834. "ldr r9, [%[b], #52]\n\t"
  130835. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130836. "lsl r6, r11, #16\n\t"
  130837. "lsl r7, r9, #16\n\t"
  130838. "lsr r6, r6, #16\n\t"
  130839. "lsr r7, r7, #16\n\t"
  130840. "mul r7, r6, r7\n\t"
  130841. "adds r4, r4, r7\n\t"
  130842. "adcs r5, r5, #0\n\t"
  130843. "adc r3, r3, #0\n\t"
  130844. "lsr r7, r9, #16\n\t"
  130845. "mul r6, r7, r6\n\t"
  130846. "lsr r7, r6, #16\n\t"
  130847. "lsl r6, r6, #16\n\t"
  130848. "adds r4, r4, r6\n\t"
  130849. "adcs r5, r5, r7\n\t"
  130850. "adc r3, r3, #0\n\t"
  130851. "lsr r6, r11, #16\n\t"
  130852. "lsr r7, r9, #16\n\t"
  130853. "mul r7, r6, r7\n\t"
  130854. "adds r5, r5, r7\n\t"
  130855. "adc r3, r3, #0\n\t"
  130856. "lsl r7, r9, #16\n\t"
  130857. "lsr r7, r7, #16\n\t"
  130858. "mul r6, r7, r6\n\t"
  130859. "lsr r7, r6, #16\n\t"
  130860. "lsl r6, r6, #16\n\t"
  130861. "adds r4, r4, r6\n\t"
  130862. "adcs r5, r5, r7\n\t"
  130863. "adc r3, r3, #0\n\t"
  130864. #else
  130865. "umull r6, r7, r11, r9\n\t"
  130866. "adds r4, r4, r6\n\t"
  130867. "adcs r5, r5, r7\n\t"
  130868. "adc r3, r3, #0\n\t"
  130869. #endif
  130870. /* A[13] * B[12] */
  130871. "ldr r8, [%[a], #52]\n\t"
  130872. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130873. "lsl r6, r8, #16\n\t"
  130874. "lsl r7, r12, #16\n\t"
  130875. "lsr r6, r6, #16\n\t"
  130876. "lsr r7, r7, #16\n\t"
  130877. "mul r7, r6, r7\n\t"
  130878. "adds r4, r4, r7\n\t"
  130879. "adcs r5, r5, #0\n\t"
  130880. "adc r3, r3, #0\n\t"
  130881. "lsr r7, r12, #16\n\t"
  130882. "mul r6, r7, r6\n\t"
  130883. "lsr r7, r6, #16\n\t"
  130884. "lsl r6, r6, #16\n\t"
  130885. "adds r4, r4, r6\n\t"
  130886. "adcs r5, r5, r7\n\t"
  130887. "adc r3, r3, #0\n\t"
  130888. "lsr r6, r8, #16\n\t"
  130889. "lsr r7, r12, #16\n\t"
  130890. "mul r7, r6, r7\n\t"
  130891. "adds r5, r5, r7\n\t"
  130892. "adc r3, r3, #0\n\t"
  130893. "lsl r7, r12, #16\n\t"
  130894. "lsr r7, r7, #16\n\t"
  130895. "mul r6, r7, r6\n\t"
  130896. "lsr r7, r6, #16\n\t"
  130897. "lsl r6, r6, #16\n\t"
  130898. "adds r4, r4, r6\n\t"
  130899. "adcs r5, r5, r7\n\t"
  130900. "adc r3, r3, #0\n\t"
  130901. #else
  130902. "umull r6, r7, r8, r12\n\t"
  130903. "adds r4, r4, r6\n\t"
  130904. "adcs r5, r5, r7\n\t"
  130905. "adc r3, r3, #0\n\t"
  130906. #endif
  130907. /* A[14] * B[11] */
  130908. "ldr r8, [%[a], #56]\n\t"
  130909. "ldr r9, [%[b], #44]\n\t"
  130910. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130911. "lsl r6, r8, #16\n\t"
  130912. "lsl r7, r9, #16\n\t"
  130913. "lsr r6, r6, #16\n\t"
  130914. "lsr r7, r7, #16\n\t"
  130915. "mul r7, r6, r7\n\t"
  130916. "adds r4, r4, r7\n\t"
  130917. "adcs r5, r5, #0\n\t"
  130918. "adc r3, r3, #0\n\t"
  130919. "lsr r7, r9, #16\n\t"
  130920. "mul r6, r7, r6\n\t"
  130921. "lsr r7, r6, #16\n\t"
  130922. "lsl r6, r6, #16\n\t"
  130923. "adds r4, r4, r6\n\t"
  130924. "adcs r5, r5, r7\n\t"
  130925. "adc r3, r3, #0\n\t"
  130926. "lsr r6, r8, #16\n\t"
  130927. "lsr r7, r9, #16\n\t"
  130928. "mul r7, r6, r7\n\t"
  130929. "adds r5, r5, r7\n\t"
  130930. "adc r3, r3, #0\n\t"
  130931. "lsl r7, r9, #16\n\t"
  130932. "lsr r7, r7, #16\n\t"
  130933. "mul r6, r7, r6\n\t"
  130934. "lsr r7, r6, #16\n\t"
  130935. "lsl r6, r6, #16\n\t"
  130936. "adds r4, r4, r6\n\t"
  130937. "adcs r5, r5, r7\n\t"
  130938. "adc r3, r3, #0\n\t"
  130939. #else
  130940. "umull r6, r7, r8, r9\n\t"
  130941. "adds r4, r4, r6\n\t"
  130942. "adcs r5, r5, r7\n\t"
  130943. "adc r3, r3, #0\n\t"
  130944. #endif
  130945. /* A[15] * B[10] */
  130946. "ldr r8, [%[a], #60]\n\t"
  130947. "ldr r9, [%[b], #40]\n\t"
  130948. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130949. "lsl r6, r8, #16\n\t"
  130950. "lsl r7, r9, #16\n\t"
  130951. "lsr r6, r6, #16\n\t"
  130952. "lsr r7, r7, #16\n\t"
  130953. "mul r7, r6, r7\n\t"
  130954. "adds r4, r4, r7\n\t"
  130955. "adcs r5, r5, #0\n\t"
  130956. "adc r3, r3, #0\n\t"
  130957. "lsr r7, r9, #16\n\t"
  130958. "mul r6, r7, r6\n\t"
  130959. "lsr r7, r6, #16\n\t"
  130960. "lsl r6, r6, #16\n\t"
  130961. "adds r4, r4, r6\n\t"
  130962. "adcs r5, r5, r7\n\t"
  130963. "adc r3, r3, #0\n\t"
  130964. "lsr r6, r8, #16\n\t"
  130965. "lsr r7, r9, #16\n\t"
  130966. "mul r7, r6, r7\n\t"
  130967. "adds r5, r5, r7\n\t"
  130968. "adc r3, r3, #0\n\t"
  130969. "lsl r7, r9, #16\n\t"
  130970. "lsr r7, r7, #16\n\t"
  130971. "mul r6, r7, r6\n\t"
  130972. "lsr r7, r6, #16\n\t"
  130973. "lsl r6, r6, #16\n\t"
  130974. "adds r4, r4, r6\n\t"
  130975. "adcs r5, r5, r7\n\t"
  130976. "adc r3, r3, #0\n\t"
  130977. #else
  130978. "umull r6, r7, r8, r9\n\t"
  130979. "adds r4, r4, r6\n\t"
  130980. "adcs r5, r5, r7\n\t"
  130981. "adc r3, r3, #0\n\t"
  130982. #endif
  130983. "str r4, [%[r], #100]\n\t"
  130984. /* A[15] * B[11] */
  130985. "ldr r9, [%[b], #44]\n\t"
  130986. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  130987. "lsl r6, r8, #16\n\t"
  130988. "lsl r7, r9, #16\n\t"
  130989. "lsr r6, r6, #16\n\t"
  130990. "lsr r7, r7, #16\n\t"
  130991. "mul r7, r6, r7\n\t"
  130992. "adds r5, r5, r7\n\t"
  130993. "adcs r3, r3, #0\n\t"
  130994. "mov r4, #0\n\t"
  130995. "adc r4, r4, #0\n\t"
  130996. "lsr r7, r9, #16\n\t"
  130997. "mul r6, r7, r6\n\t"
  130998. "lsr r7, r6, #16\n\t"
  130999. "lsl r6, r6, #16\n\t"
  131000. "adds r5, r5, r6\n\t"
  131001. "adcs r3, r3, r7\n\t"
  131002. "adc r4, r4, #0\n\t"
  131003. "lsr r6, r8, #16\n\t"
  131004. "lsr r7, r9, #16\n\t"
  131005. "mul r7, r6, r7\n\t"
  131006. "adds r3, r3, r7\n\t"
  131007. "adc r4, r4, #0\n\t"
  131008. "lsl r7, r9, #16\n\t"
  131009. "lsr r7, r7, #16\n\t"
  131010. "mul r6, r7, r6\n\t"
  131011. "lsr r7, r6, #16\n\t"
  131012. "lsl r6, r6, #16\n\t"
  131013. "adds r5, r5, r6\n\t"
  131014. "adcs r3, r3, r7\n\t"
  131015. "adc r4, r4, #0\n\t"
  131016. #else
  131017. "umull r6, r7, r8, r9\n\t"
  131018. "adds r5, r5, r6\n\t"
  131019. "adcs r3, r3, r7\n\t"
  131020. "mov r4, #0\n\t"
  131021. "adc r4, r4, #0\n\t"
  131022. #endif
  131023. /* A[14] * B[12] */
  131024. "ldr r8, [%[a], #56]\n\t"
  131025. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131026. "lsl r6, r8, #16\n\t"
  131027. "lsl r7, r12, #16\n\t"
  131028. "lsr r6, r6, #16\n\t"
  131029. "lsr r7, r7, #16\n\t"
  131030. "mul r7, r6, r7\n\t"
  131031. "adds r5, r5, r7\n\t"
  131032. "adcs r3, r3, #0\n\t"
  131033. "adc r4, r4, #0\n\t"
  131034. "lsr r7, r12, #16\n\t"
  131035. "mul r6, r7, r6\n\t"
  131036. "lsr r7, r6, #16\n\t"
  131037. "lsl r6, r6, #16\n\t"
  131038. "adds r5, r5, r6\n\t"
  131039. "adcs r3, r3, r7\n\t"
  131040. "adc r4, r4, #0\n\t"
  131041. "lsr r6, r8, #16\n\t"
  131042. "lsr r7, r12, #16\n\t"
  131043. "mul r7, r6, r7\n\t"
  131044. "adds r3, r3, r7\n\t"
  131045. "adc r4, r4, #0\n\t"
  131046. "lsl r7, r12, #16\n\t"
  131047. "lsr r7, r7, #16\n\t"
  131048. "mul r6, r7, r6\n\t"
  131049. "lsr r7, r6, #16\n\t"
  131050. "lsl r6, r6, #16\n\t"
  131051. "adds r5, r5, r6\n\t"
  131052. "adcs r3, r3, r7\n\t"
  131053. "adc r4, r4, #0\n\t"
  131054. #else
  131055. "umull r6, r7, r8, r12\n\t"
  131056. "adds r5, r5, r6\n\t"
  131057. "adcs r3, r3, r7\n\t"
  131058. "adc r4, r4, #0\n\t"
  131059. #endif
  131060. /* A[13] * B[13] */
  131061. "ldr r11, [%[a], #52]\n\t"
  131062. "ldr r12, [%[b], #52]\n\t"
  131063. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131064. "lsl r6, r11, #16\n\t"
  131065. "lsl r7, r12, #16\n\t"
  131066. "lsr r6, r6, #16\n\t"
  131067. "lsr r7, r7, #16\n\t"
  131068. "mul r7, r6, r7\n\t"
  131069. "adds r5, r5, r7\n\t"
  131070. "adcs r3, r3, #0\n\t"
  131071. "adc r4, r4, #0\n\t"
  131072. "lsr r7, r12, #16\n\t"
  131073. "mul r6, r7, r6\n\t"
  131074. "lsr r7, r6, #16\n\t"
  131075. "lsl r6, r6, #16\n\t"
  131076. "adds r5, r5, r6\n\t"
  131077. "adcs r3, r3, r7\n\t"
  131078. "adc r4, r4, #0\n\t"
  131079. "lsr r6, r11, #16\n\t"
  131080. "lsr r7, r12, #16\n\t"
  131081. "mul r7, r6, r7\n\t"
  131082. "adds r3, r3, r7\n\t"
  131083. "adc r4, r4, #0\n\t"
  131084. "lsl r7, r12, #16\n\t"
  131085. "lsr r7, r7, #16\n\t"
  131086. "mul r6, r7, r6\n\t"
  131087. "lsr r7, r6, #16\n\t"
  131088. "lsl r6, r6, #16\n\t"
  131089. "adds r5, r5, r6\n\t"
  131090. "adcs r3, r3, r7\n\t"
  131091. "adc r4, r4, #0\n\t"
  131092. #else
  131093. "umull r6, r7, r11, r12\n\t"
  131094. "adds r5, r5, r6\n\t"
  131095. "adcs r3, r3, r7\n\t"
  131096. "adc r4, r4, #0\n\t"
  131097. #endif
  131098. /* A[12] * B[14] */
  131099. "ldr r8, [%[a], #48]\n\t"
  131100. "ldr r9, [%[b], #56]\n\t"
  131101. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131102. "lsl r6, r8, #16\n\t"
  131103. "lsl r7, r9, #16\n\t"
  131104. "lsr r6, r6, #16\n\t"
  131105. "lsr r7, r7, #16\n\t"
  131106. "mul r7, r6, r7\n\t"
  131107. "adds r5, r5, r7\n\t"
  131108. "adcs r3, r3, #0\n\t"
  131109. "adc r4, r4, #0\n\t"
  131110. "lsr r7, r9, #16\n\t"
  131111. "mul r6, r7, r6\n\t"
  131112. "lsr r7, r6, #16\n\t"
  131113. "lsl r6, r6, #16\n\t"
  131114. "adds r5, r5, r6\n\t"
  131115. "adcs r3, r3, r7\n\t"
  131116. "adc r4, r4, #0\n\t"
  131117. "lsr r6, r8, #16\n\t"
  131118. "lsr r7, r9, #16\n\t"
  131119. "mul r7, r6, r7\n\t"
  131120. "adds r3, r3, r7\n\t"
  131121. "adc r4, r4, #0\n\t"
  131122. "lsl r7, r9, #16\n\t"
  131123. "lsr r7, r7, #16\n\t"
  131124. "mul r6, r7, r6\n\t"
  131125. "lsr r7, r6, #16\n\t"
  131126. "lsl r6, r6, #16\n\t"
  131127. "adds r5, r5, r6\n\t"
  131128. "adcs r3, r3, r7\n\t"
  131129. "adc r4, r4, #0\n\t"
  131130. #else
  131131. "umull r6, r7, r8, r9\n\t"
  131132. "adds r5, r5, r6\n\t"
  131133. "adcs r3, r3, r7\n\t"
  131134. "adc r4, r4, #0\n\t"
  131135. #endif
  131136. /* A[11] * B[15] */
  131137. "ldr r8, [%[a], #44]\n\t"
  131138. "ldr r9, [%[b], #60]\n\t"
  131139. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131140. "lsl r6, r8, #16\n\t"
  131141. "lsl r7, r9, #16\n\t"
  131142. "lsr r6, r6, #16\n\t"
  131143. "lsr r7, r7, #16\n\t"
  131144. "mul r7, r6, r7\n\t"
  131145. "adds r5, r5, r7\n\t"
  131146. "adcs r3, r3, #0\n\t"
  131147. "adc r4, r4, #0\n\t"
  131148. "lsr r7, r9, #16\n\t"
  131149. "mul r6, r7, r6\n\t"
  131150. "lsr r7, r6, #16\n\t"
  131151. "lsl r6, r6, #16\n\t"
  131152. "adds r5, r5, r6\n\t"
  131153. "adcs r3, r3, r7\n\t"
  131154. "adc r4, r4, #0\n\t"
  131155. "lsr r6, r8, #16\n\t"
  131156. "lsr r7, r9, #16\n\t"
  131157. "mul r7, r6, r7\n\t"
  131158. "adds r3, r3, r7\n\t"
  131159. "adc r4, r4, #0\n\t"
  131160. "lsl r7, r9, #16\n\t"
  131161. "lsr r7, r7, #16\n\t"
  131162. "mul r6, r7, r6\n\t"
  131163. "lsr r7, r6, #16\n\t"
  131164. "lsl r6, r6, #16\n\t"
  131165. "adds r5, r5, r6\n\t"
  131166. "adcs r3, r3, r7\n\t"
  131167. "adc r4, r4, #0\n\t"
  131168. #else
  131169. "umull r6, r7, r8, r9\n\t"
  131170. "adds r5, r5, r6\n\t"
  131171. "adcs r3, r3, r7\n\t"
  131172. "adc r4, r4, #0\n\t"
  131173. #endif
  131174. "str r5, [%[r], #104]\n\t"
  131175. /* A[12] * B[15] */
  131176. "ldr r8, [%[a], #48]\n\t"
  131177. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131178. "lsl r6, r8, #16\n\t"
  131179. "lsl r7, r9, #16\n\t"
  131180. "lsr r6, r6, #16\n\t"
  131181. "lsr r7, r7, #16\n\t"
  131182. "mul r7, r6, r7\n\t"
  131183. "adds r3, r3, r7\n\t"
  131184. "adcs r4, r4, #0\n\t"
  131185. "mov r5, #0\n\t"
  131186. "adc r5, r5, #0\n\t"
  131187. "lsr r7, r9, #16\n\t"
  131188. "mul r6, r7, r6\n\t"
  131189. "lsr r7, r6, #16\n\t"
  131190. "lsl r6, r6, #16\n\t"
  131191. "adds r3, r3, r6\n\t"
  131192. "adcs r4, r4, r7\n\t"
  131193. "adc r5, r5, #0\n\t"
  131194. "lsr r6, r8, #16\n\t"
  131195. "lsr r7, r9, #16\n\t"
  131196. "mul r7, r6, r7\n\t"
  131197. "adds r4, r4, r7\n\t"
  131198. "adc r5, r5, #0\n\t"
  131199. "lsl r7, r9, #16\n\t"
  131200. "lsr r7, r7, #16\n\t"
  131201. "mul r6, r7, r6\n\t"
  131202. "lsr r7, r6, #16\n\t"
  131203. "lsl r6, r6, #16\n\t"
  131204. "adds r3, r3, r6\n\t"
  131205. "adcs r4, r4, r7\n\t"
  131206. "adc r5, r5, #0\n\t"
  131207. #else
  131208. "umull r6, r7, r8, r9\n\t"
  131209. "adds r3, r3, r6\n\t"
  131210. "adcs r4, r4, r7\n\t"
  131211. "mov r5, #0\n\t"
  131212. "adc r5, r5, #0\n\t"
  131213. #endif
  131214. /* A[13] * B[14] */
  131215. "ldr r9, [%[b], #56]\n\t"
  131216. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131217. "lsl r6, r11, #16\n\t"
  131218. "lsl r7, r9, #16\n\t"
  131219. "lsr r6, r6, #16\n\t"
  131220. "lsr r7, r7, #16\n\t"
  131221. "mul r7, r6, r7\n\t"
  131222. "adds r3, r3, r7\n\t"
  131223. "adcs r4, r4, #0\n\t"
  131224. "adc r5, r5, #0\n\t"
  131225. "lsr r7, r9, #16\n\t"
  131226. "mul r6, r7, r6\n\t"
  131227. "lsr r7, r6, #16\n\t"
  131228. "lsl r6, r6, #16\n\t"
  131229. "adds r3, r3, r6\n\t"
  131230. "adcs r4, r4, r7\n\t"
  131231. "adc r5, r5, #0\n\t"
  131232. "lsr r6, r11, #16\n\t"
  131233. "lsr r7, r9, #16\n\t"
  131234. "mul r7, r6, r7\n\t"
  131235. "adds r4, r4, r7\n\t"
  131236. "adc r5, r5, #0\n\t"
  131237. "lsl r7, r9, #16\n\t"
  131238. "lsr r7, r7, #16\n\t"
  131239. "mul r6, r7, r6\n\t"
  131240. "lsr r7, r6, #16\n\t"
  131241. "lsl r6, r6, #16\n\t"
  131242. "adds r3, r3, r6\n\t"
  131243. "adcs r4, r4, r7\n\t"
  131244. "adc r5, r5, #0\n\t"
  131245. #else
  131246. "umull r6, r7, r11, r9\n\t"
  131247. "adds r3, r3, r6\n\t"
  131248. "adcs r4, r4, r7\n\t"
  131249. "adc r5, r5, #0\n\t"
  131250. #endif
  131251. /* A[14] * B[13] */
  131252. "ldr r8, [%[a], #56]\n\t"
  131253. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131254. "lsl r6, r8, #16\n\t"
  131255. "lsl r7, r12, #16\n\t"
  131256. "lsr r6, r6, #16\n\t"
  131257. "lsr r7, r7, #16\n\t"
  131258. "mul r7, r6, r7\n\t"
  131259. "adds r3, r3, r7\n\t"
  131260. "adcs r4, r4, #0\n\t"
  131261. "adc r5, r5, #0\n\t"
  131262. "lsr r7, r12, #16\n\t"
  131263. "mul r6, r7, r6\n\t"
  131264. "lsr r7, r6, #16\n\t"
  131265. "lsl r6, r6, #16\n\t"
  131266. "adds r3, r3, r6\n\t"
  131267. "adcs r4, r4, r7\n\t"
  131268. "adc r5, r5, #0\n\t"
  131269. "lsr r6, r8, #16\n\t"
  131270. "lsr r7, r12, #16\n\t"
  131271. "mul r7, r6, r7\n\t"
  131272. "adds r4, r4, r7\n\t"
  131273. "adc r5, r5, #0\n\t"
  131274. "lsl r7, r12, #16\n\t"
  131275. "lsr r7, r7, #16\n\t"
  131276. "mul r6, r7, r6\n\t"
  131277. "lsr r7, r6, #16\n\t"
  131278. "lsl r6, r6, #16\n\t"
  131279. "adds r3, r3, r6\n\t"
  131280. "adcs r4, r4, r7\n\t"
  131281. "adc r5, r5, #0\n\t"
  131282. #else
  131283. "umull r6, r7, r8, r12\n\t"
  131284. "adds r3, r3, r6\n\t"
  131285. "adcs r4, r4, r7\n\t"
  131286. "adc r5, r5, #0\n\t"
  131287. #endif
  131288. /* A[15] * B[12] */
  131289. "ldr r8, [%[a], #60]\n\t"
  131290. "ldr r9, [%[b], #48]\n\t"
  131291. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131292. "lsl r6, r8, #16\n\t"
  131293. "lsl r7, r9, #16\n\t"
  131294. "lsr r6, r6, #16\n\t"
  131295. "lsr r7, r7, #16\n\t"
  131296. "mul r7, r6, r7\n\t"
  131297. "adds r3, r3, r7\n\t"
  131298. "adcs r4, r4, #0\n\t"
  131299. "adc r5, r5, #0\n\t"
  131300. "lsr r7, r9, #16\n\t"
  131301. "mul r6, r7, r6\n\t"
  131302. "lsr r7, r6, #16\n\t"
  131303. "lsl r6, r6, #16\n\t"
  131304. "adds r3, r3, r6\n\t"
  131305. "adcs r4, r4, r7\n\t"
  131306. "adc r5, r5, #0\n\t"
  131307. "lsr r6, r8, #16\n\t"
  131308. "lsr r7, r9, #16\n\t"
  131309. "mul r7, r6, r7\n\t"
  131310. "adds r4, r4, r7\n\t"
  131311. "adc r5, r5, #0\n\t"
  131312. "lsl r7, r9, #16\n\t"
  131313. "lsr r7, r7, #16\n\t"
  131314. "mul r6, r7, r6\n\t"
  131315. "lsr r7, r6, #16\n\t"
  131316. "lsl r6, r6, #16\n\t"
  131317. "adds r3, r3, r6\n\t"
  131318. "adcs r4, r4, r7\n\t"
  131319. "adc r5, r5, #0\n\t"
  131320. #else
  131321. "umull r6, r7, r8, r9\n\t"
  131322. "adds r3, r3, r6\n\t"
  131323. "adcs r4, r4, r7\n\t"
  131324. "adc r5, r5, #0\n\t"
  131325. #endif
  131326. "str r3, [%[r], #108]\n\t"
  131327. /* A[15] * B[13] */
  131328. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131329. "lsl r6, r8, #16\n\t"
  131330. "lsl r7, r12, #16\n\t"
  131331. "lsr r6, r6, #16\n\t"
  131332. "lsr r7, r7, #16\n\t"
  131333. "mul r7, r6, r7\n\t"
  131334. "adds r4, r4, r7\n\t"
  131335. "adcs r5, r5, #0\n\t"
  131336. "mov r3, #0\n\t"
  131337. "adc r3, r3, #0\n\t"
  131338. "lsr r7, r12, #16\n\t"
  131339. "mul r6, r7, r6\n\t"
  131340. "lsr r7, r6, #16\n\t"
  131341. "lsl r6, r6, #16\n\t"
  131342. "adds r4, r4, r6\n\t"
  131343. "adcs r5, r5, r7\n\t"
  131344. "adc r3, r3, #0\n\t"
  131345. "lsr r6, r8, #16\n\t"
  131346. "lsr r7, r12, #16\n\t"
  131347. "mul r7, r6, r7\n\t"
  131348. "adds r5, r5, r7\n\t"
  131349. "adc r3, r3, #0\n\t"
  131350. "lsl r7, r12, #16\n\t"
  131351. "lsr r7, r7, #16\n\t"
  131352. "mul r6, r7, r6\n\t"
  131353. "lsr r7, r6, #16\n\t"
  131354. "lsl r6, r6, #16\n\t"
  131355. "adds r4, r4, r6\n\t"
  131356. "adcs r5, r5, r7\n\t"
  131357. "adc r3, r3, #0\n\t"
  131358. #else
  131359. "umull r6, r7, r8, r12\n\t"
  131360. "adds r4, r4, r6\n\t"
  131361. "adcs r5, r5, r7\n\t"
  131362. "mov r3, #0\n\t"
  131363. "adc r3, r3, #0\n\t"
  131364. #endif
  131365. /* A[14] * B[14] */
  131366. "ldr r11, [%[a], #56]\n\t"
  131367. "ldr r12, [%[b], #56]\n\t"
  131368. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131369. "lsl r6, r11, #16\n\t"
  131370. "lsl r7, r12, #16\n\t"
  131371. "lsr r6, r6, #16\n\t"
  131372. "lsr r7, r7, #16\n\t"
  131373. "mul r7, r6, r7\n\t"
  131374. "adds r4, r4, r7\n\t"
  131375. "adcs r5, r5, #0\n\t"
  131376. "adc r3, r3, #0\n\t"
  131377. "lsr r7, r12, #16\n\t"
  131378. "mul r6, r7, r6\n\t"
  131379. "lsr r7, r6, #16\n\t"
  131380. "lsl r6, r6, #16\n\t"
  131381. "adds r4, r4, r6\n\t"
  131382. "adcs r5, r5, r7\n\t"
  131383. "adc r3, r3, #0\n\t"
  131384. "lsr r6, r11, #16\n\t"
  131385. "lsr r7, r12, #16\n\t"
  131386. "mul r7, r6, r7\n\t"
  131387. "adds r5, r5, r7\n\t"
  131388. "adc r3, r3, #0\n\t"
  131389. "lsl r7, r12, #16\n\t"
  131390. "lsr r7, r7, #16\n\t"
  131391. "mul r6, r7, r6\n\t"
  131392. "lsr r7, r6, #16\n\t"
  131393. "lsl r6, r6, #16\n\t"
  131394. "adds r4, r4, r6\n\t"
  131395. "adcs r5, r5, r7\n\t"
  131396. "adc r3, r3, #0\n\t"
  131397. #else
  131398. "umull r6, r7, r11, r12\n\t"
  131399. "adds r4, r4, r6\n\t"
  131400. "adcs r5, r5, r7\n\t"
  131401. "adc r3, r3, #0\n\t"
  131402. #endif
  131403. /* A[13] * B[15] */
  131404. "ldr r8, [%[a], #52]\n\t"
  131405. "ldr r9, [%[b], #60]\n\t"
  131406. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131407. "lsl r6, r8, #16\n\t"
  131408. "lsl r7, r9, #16\n\t"
  131409. "lsr r6, r6, #16\n\t"
  131410. "lsr r7, r7, #16\n\t"
  131411. "mul r7, r6, r7\n\t"
  131412. "adds r4, r4, r7\n\t"
  131413. "adcs r5, r5, #0\n\t"
  131414. "adc r3, r3, #0\n\t"
  131415. "lsr r7, r9, #16\n\t"
  131416. "mul r6, r7, r6\n\t"
  131417. "lsr r7, r6, #16\n\t"
  131418. "lsl r6, r6, #16\n\t"
  131419. "adds r4, r4, r6\n\t"
  131420. "adcs r5, r5, r7\n\t"
  131421. "adc r3, r3, #0\n\t"
  131422. "lsr r6, r8, #16\n\t"
  131423. "lsr r7, r9, #16\n\t"
  131424. "mul r7, r6, r7\n\t"
  131425. "adds r5, r5, r7\n\t"
  131426. "adc r3, r3, #0\n\t"
  131427. "lsl r7, r9, #16\n\t"
  131428. "lsr r7, r7, #16\n\t"
  131429. "mul r6, r7, r6\n\t"
  131430. "lsr r7, r6, #16\n\t"
  131431. "lsl r6, r6, #16\n\t"
  131432. "adds r4, r4, r6\n\t"
  131433. "adcs r5, r5, r7\n\t"
  131434. "adc r3, r3, #0\n\t"
  131435. #else
  131436. "umull r6, r7, r8, r9\n\t"
  131437. "adds r4, r4, r6\n\t"
  131438. "adcs r5, r5, r7\n\t"
  131439. "adc r3, r3, #0\n\t"
  131440. #endif
  131441. "str r4, [%[r], #112]\n\t"
  131442. /* A[14] * B[15] */
  131443. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131444. "lsl r6, r11, #16\n\t"
  131445. "lsl r7, r9, #16\n\t"
  131446. "lsr r6, r6, #16\n\t"
  131447. "lsr r7, r7, #16\n\t"
  131448. "mul r7, r6, r7\n\t"
  131449. "adds r5, r5, r7\n\t"
  131450. "adcs r3, r3, #0\n\t"
  131451. "mov r4, #0\n\t"
  131452. "adc r4, r4, #0\n\t"
  131453. "lsr r7, r9, #16\n\t"
  131454. "mul r6, r7, r6\n\t"
  131455. "lsr r7, r6, #16\n\t"
  131456. "lsl r6, r6, #16\n\t"
  131457. "adds r5, r5, r6\n\t"
  131458. "adcs r3, r3, r7\n\t"
  131459. "adc r4, r4, #0\n\t"
  131460. "lsr r6, r11, #16\n\t"
  131461. "lsr r7, r9, #16\n\t"
  131462. "mul r7, r6, r7\n\t"
  131463. "adds r3, r3, r7\n\t"
  131464. "adc r4, r4, #0\n\t"
  131465. "lsl r7, r9, #16\n\t"
  131466. "lsr r7, r7, #16\n\t"
  131467. "mul r6, r7, r6\n\t"
  131468. "lsr r7, r6, #16\n\t"
  131469. "lsl r6, r6, #16\n\t"
  131470. "adds r5, r5, r6\n\t"
  131471. "adcs r3, r3, r7\n\t"
  131472. "adc r4, r4, #0\n\t"
  131473. #else
  131474. "umull r6, r7, r11, r9\n\t"
  131475. "adds r5, r5, r6\n\t"
  131476. "adcs r3, r3, r7\n\t"
  131477. "mov r4, #0\n\t"
  131478. "adc r4, r4, #0\n\t"
  131479. #endif
  131480. /* A[15] * B[14] */
  131481. "ldr r8, [%[a], #60]\n\t"
  131482. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131483. "lsl r6, r8, #16\n\t"
  131484. "lsl r7, r12, #16\n\t"
  131485. "lsr r6, r6, #16\n\t"
  131486. "lsr r7, r7, #16\n\t"
  131487. "mul r7, r6, r7\n\t"
  131488. "adds r5, r5, r7\n\t"
  131489. "adcs r3, r3, #0\n\t"
  131490. "adc r4, r4, #0\n\t"
  131491. "lsr r7, r12, #16\n\t"
  131492. "mul r6, r7, r6\n\t"
  131493. "lsr r7, r6, #16\n\t"
  131494. "lsl r6, r6, #16\n\t"
  131495. "adds r5, r5, r6\n\t"
  131496. "adcs r3, r3, r7\n\t"
  131497. "adc r4, r4, #0\n\t"
  131498. "lsr r6, r8, #16\n\t"
  131499. "lsr r7, r12, #16\n\t"
  131500. "mul r7, r6, r7\n\t"
  131501. "adds r3, r3, r7\n\t"
  131502. "adc r4, r4, #0\n\t"
  131503. "lsl r7, r12, #16\n\t"
  131504. "lsr r7, r7, #16\n\t"
  131505. "mul r6, r7, r6\n\t"
  131506. "lsr r7, r6, #16\n\t"
  131507. "lsl r6, r6, #16\n\t"
  131508. "adds r5, r5, r6\n\t"
  131509. "adcs r3, r3, r7\n\t"
  131510. "adc r4, r4, #0\n\t"
  131511. #else
  131512. "umull r6, r7, r8, r12\n\t"
  131513. "adds r5, r5, r6\n\t"
  131514. "adcs r3, r3, r7\n\t"
  131515. "adc r4, r4, #0\n\t"
  131516. #endif
  131517. "str r5, [%[r], #116]\n\t"
  131518. /* A[15] * B[15] */
  131519. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131520. "lsl r6, r8, #16\n\t"
  131521. "lsl r7, r9, #16\n\t"
  131522. "lsr r6, r6, #16\n\t"
  131523. "lsr r7, r7, #16\n\t"
  131524. "mul r7, r6, r7\n\t"
  131525. "adds r3, r3, r7\n\t"
  131526. "adc r4, r4, #0\n\t"
  131527. "lsr r7, r9, #16\n\t"
  131528. "mul r6, r7, r6\n\t"
  131529. "lsr r7, r6, #16\n\t"
  131530. "lsl r6, r6, #16\n\t"
  131531. "adds r3, r3, r6\n\t"
  131532. "adc r4, r4, r7\n\t"
  131533. "lsr r6, r8, #16\n\t"
  131534. "lsr r7, r9, #16\n\t"
  131535. "mul r7, r6, r7\n\t"
  131536. "add r4, r4, r7\n\t"
  131537. "lsl r7, r9, #16\n\t"
  131538. "lsr r7, r7, #16\n\t"
  131539. "mul r6, r7, r6\n\t"
  131540. "lsr r7, r6, #16\n\t"
  131541. "lsl r6, r6, #16\n\t"
  131542. "adds r3, r3, r6\n\t"
  131543. "adc r4, r4, r7\n\t"
  131544. #else
  131545. "umull r6, r7, r8, r9\n\t"
  131546. "adds r3, r3, r6\n\t"
  131547. "adc r4, r4, r7\n\t"
  131548. #endif
  131549. "str r3, [%[r], #120]\n\t"
  131550. "str r4, [%[r], #124]\n\t"
  131551. "ldm sp!, {r3, r4, r5, r6}\n\t"
  131552. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  131553. "ldm sp!, {r3, r4, r5, r6}\n\t"
  131554. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  131555. "ldm sp!, {r3, r4, r5, r6}\n\t"
  131556. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  131557. "ldm sp!, {r3, r4, r5, r6}\n\t"
  131558. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  131559. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  131560. :
  131561. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  131562. );
  131563. }
  131564. /* Square a and put result in r. (r = a * a)
  131565. *
  131566. * r A single precision integer.
  131567. * a A single precision integer.
  131568. */
  131569. static void sp_1024_sqr_16(sp_digit* r_p, const sp_digit* a_p)
  131570. {
  131571. register sp_digit* r asm ("r0") = r_p;
  131572. register const sp_digit* a asm ("r1") = a_p;
  131573. __asm__ __volatile__ (
  131574. "sub sp, sp, #0x40\n\t"
  131575. /* A[0] * A[0] */
  131576. "ldr r10, [%[a]]\n\t"
  131577. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131578. "lsr r9, r10, #16\n\t"
  131579. "lsl r2, r10, #16\n\t"
  131580. "lsr r2, r2, #16\n\t"
  131581. "mul r8, r2, r2\n\t"
  131582. "mul r3, r9, r9\n\t"
  131583. "mul r2, r9, r2\n\t"
  131584. "lsr r9, r2, #15\n\t"
  131585. "lsl r2, r2, #17\n\t"
  131586. "adds r8, r8, r2\n\t"
  131587. "adc r3, r3, r9\n\t"
  131588. #else
  131589. "umull r8, r3, r10, r10\n\t"
  131590. #endif
  131591. "mov r4, #0\n\t"
  131592. "str r8, [sp]\n\t"
  131593. /* A[0] * A[1] */
  131594. "ldr r10, [%[a], #4]\n\t"
  131595. "ldr r12, [%[a]]\n\t"
  131596. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131597. "lsl r8, r10, #16\n\t"
  131598. "lsl r9, r12, #16\n\t"
  131599. "lsr r8, r8, #16\n\t"
  131600. "lsr r9, r9, #16\n\t"
  131601. "mul r9, r8, r9\n\t"
  131602. "adds r3, r3, r9\n\t"
  131603. "adcs r4, r4, #0\n\t"
  131604. "mov r2, #0\n\t"
  131605. "adc r2, r2, #0\n\t"
  131606. "adds r3, r3, r9\n\t"
  131607. "adcs r4, r4, #0\n\t"
  131608. "adc r2, r2, #0\n\t"
  131609. "lsr r9, r12, #16\n\t"
  131610. "mul r8, r9, r8\n\t"
  131611. "lsr r9, r8, #16\n\t"
  131612. "lsl r8, r8, #16\n\t"
  131613. "adds r3, r3, r8\n\t"
  131614. "adcs r4, r4, r9\n\t"
  131615. "adc r2, r2, #0\n\t"
  131616. "adds r3, r3, r8\n\t"
  131617. "adcs r4, r4, r9\n\t"
  131618. "adc r2, r2, #0\n\t"
  131619. "lsr r8, r10, #16\n\t"
  131620. "lsr r9, r12, #16\n\t"
  131621. "mul r9, r8, r9\n\t"
  131622. "adds r4, r4, r9\n\t"
  131623. "adc r2, r2, #0\n\t"
  131624. "adds r4, r4, r9\n\t"
  131625. "adc r2, r2, #0\n\t"
  131626. "lsl r9, r12, #16\n\t"
  131627. "lsr r9, r9, #16\n\t"
  131628. "mul r8, r9, r8\n\t"
  131629. "lsr r9, r8, #16\n\t"
  131630. "lsl r8, r8, #16\n\t"
  131631. "adds r3, r3, r8\n\t"
  131632. "adcs r4, r4, r9\n\t"
  131633. "adc r2, r2, #0\n\t"
  131634. "adds r3, r3, r8\n\t"
  131635. "adcs r4, r4, r9\n\t"
  131636. "adc r2, r2, #0\n\t"
  131637. #else
  131638. "umull r8, r9, r10, r12\n\t"
  131639. "adds r3, r3, r8\n\t"
  131640. "adcs r4, r4, r9\n\t"
  131641. "mov r2, #0\n\t"
  131642. "adc r2, r2, #0\n\t"
  131643. "adds r3, r3, r8\n\t"
  131644. "adcs r4, r4, r9\n\t"
  131645. "mov r2, #0\n\t"
  131646. "adc r2, r2, #0\n\t"
  131647. #endif
  131648. "str r3, [sp, #4]\n\t"
  131649. /* A[0] * A[2] */
  131650. "ldr r10, [%[a], #8]\n\t"
  131651. "ldr r12, [%[a]]\n\t"
  131652. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131653. "lsl r8, r10, #16\n\t"
  131654. "lsl r9, r12, #16\n\t"
  131655. "lsr r8, r8, #16\n\t"
  131656. "lsr r9, r9, #16\n\t"
  131657. "mul r9, r8, r9\n\t"
  131658. "adds r4, r4, r9\n\t"
  131659. "adcs r2, r2, #0\n\t"
  131660. "mov r3, #0\n\t"
  131661. "adc r3, r3, #0\n\t"
  131662. "adds r4, r4, r9\n\t"
  131663. "adcs r2, r2, #0\n\t"
  131664. "adc r3, r3, #0\n\t"
  131665. "lsr r9, r12, #16\n\t"
  131666. "mul r8, r9, r8\n\t"
  131667. "lsr r9, r8, #16\n\t"
  131668. "lsl r8, r8, #16\n\t"
  131669. "adds r4, r4, r8\n\t"
  131670. "adcs r2, r2, r9\n\t"
  131671. "adc r3, r3, #0\n\t"
  131672. "adds r4, r4, r8\n\t"
  131673. "adcs r2, r2, r9\n\t"
  131674. "adc r3, r3, #0\n\t"
  131675. "lsr r8, r10, #16\n\t"
  131676. "lsr r9, r12, #16\n\t"
  131677. "mul r9, r8, r9\n\t"
  131678. "adds r2, r2, r9\n\t"
  131679. "adc r3, r3, #0\n\t"
  131680. "adds r2, r2, r9\n\t"
  131681. "adc r3, r3, #0\n\t"
  131682. "lsl r9, r12, #16\n\t"
  131683. "lsr r9, r9, #16\n\t"
  131684. "mul r8, r9, r8\n\t"
  131685. "lsr r9, r8, #16\n\t"
  131686. "lsl r8, r8, #16\n\t"
  131687. "adds r4, r4, r8\n\t"
  131688. "adcs r2, r2, r9\n\t"
  131689. "adc r3, r3, #0\n\t"
  131690. "adds r4, r4, r8\n\t"
  131691. "adcs r2, r2, r9\n\t"
  131692. "adc r3, r3, #0\n\t"
  131693. #else
  131694. "umull r8, r9, r10, r12\n\t"
  131695. "adds r4, r4, r8\n\t"
  131696. "adcs r2, r2, r9\n\t"
  131697. "mov r3, #0\n\t"
  131698. "adc r3, r3, #0\n\t"
  131699. "adds r4, r4, r8\n\t"
  131700. "adcs r2, r2, r9\n\t"
  131701. "mov r3, #0\n\t"
  131702. "adc r3, r3, #0\n\t"
  131703. #endif
  131704. /* A[1] * A[1] */
  131705. "ldr r10, [%[a], #4]\n\t"
  131706. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131707. "lsl r8, r10, #16\n\t"
  131708. "lsr r9, r10, #16\n\t"
  131709. "lsr r8, r8, #16\n\t"
  131710. "mov r12, r8\n\t"
  131711. "mul r8, r12, r8\n\t"
  131712. "mov r12, r9\n\t"
  131713. "mul r9, r12, r9\n\t"
  131714. "adds r4, r4, r8\n\t"
  131715. "adcs r2, r2, r9\n\t"
  131716. "adc r3, r3, #0\n\t"
  131717. "lsr r9, r10, #16\n\t"
  131718. "lsl r8, r10, #16\n\t"
  131719. "lsr r8, r8, #16\n\t"
  131720. "mul r8, r9, r8\n\t"
  131721. "lsr r9, r8, #15\n\t"
  131722. "lsl r8, r8, #17\n\t"
  131723. "adds r4, r4, r8\n\t"
  131724. "adcs r2, r2, r9\n\t"
  131725. "adc r3, r3, #0\n\t"
  131726. #else
  131727. "umull r8, r9, r10, r10\n\t"
  131728. "adds r4, r4, r8\n\t"
  131729. "adcs r2, r2, r9\n\t"
  131730. "adc r3, r3, #0\n\t"
  131731. #endif
  131732. "str r4, [sp, #8]\n\t"
  131733. /* A[0] * A[3] */
  131734. "ldr r10, [%[a], #12]\n\t"
  131735. "ldr r12, [%[a]]\n\t"
  131736. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131737. "lsl r8, r10, #16\n\t"
  131738. "lsl r9, r12, #16\n\t"
  131739. "lsr r8, r8, #16\n\t"
  131740. "lsr r9, r9, #16\n\t"
  131741. "mul r9, r8, r9\n\t"
  131742. "adds r2, r2, r9\n\t"
  131743. "adcs r3, r3, #0\n\t"
  131744. "mov r4, #0\n\t"
  131745. "adc r4, r4, #0\n\t"
  131746. "adds r2, r2, r9\n\t"
  131747. "adcs r3, r3, #0\n\t"
  131748. "adc r4, r4, #0\n\t"
  131749. "lsr r9, r12, #16\n\t"
  131750. "mul r8, r9, r8\n\t"
  131751. "lsr r9, r8, #16\n\t"
  131752. "lsl r8, r8, #16\n\t"
  131753. "adds r2, r2, r8\n\t"
  131754. "adcs r3, r3, r9\n\t"
  131755. "adc r4, r4, #0\n\t"
  131756. "adds r2, r2, r8\n\t"
  131757. "adcs r3, r3, r9\n\t"
  131758. "adc r4, r4, #0\n\t"
  131759. "lsr r8, r10, #16\n\t"
  131760. "lsr r9, r12, #16\n\t"
  131761. "mul r9, r8, r9\n\t"
  131762. "adds r3, r3, r9\n\t"
  131763. "adc r4, r4, #0\n\t"
  131764. "adds r3, r3, r9\n\t"
  131765. "adc r4, r4, #0\n\t"
  131766. "lsl r9, r12, #16\n\t"
  131767. "lsr r9, r9, #16\n\t"
  131768. "mul r8, r9, r8\n\t"
  131769. "lsr r9, r8, #16\n\t"
  131770. "lsl r8, r8, #16\n\t"
  131771. "adds r2, r2, r8\n\t"
  131772. "adcs r3, r3, r9\n\t"
  131773. "adc r4, r4, #0\n\t"
  131774. "adds r2, r2, r8\n\t"
  131775. "adcs r3, r3, r9\n\t"
  131776. "adc r4, r4, #0\n\t"
  131777. #else
  131778. "umull r8, r9, r10, r12\n\t"
  131779. "adds r2, r2, r8\n\t"
  131780. "adcs r3, r3, r9\n\t"
  131781. "mov r4, #0\n\t"
  131782. "adc r4, r4, #0\n\t"
  131783. "adds r2, r2, r8\n\t"
  131784. "adcs r3, r3, r9\n\t"
  131785. "mov r4, #0\n\t"
  131786. "adc r4, r4, #0\n\t"
  131787. #endif
  131788. /* A[1] * A[2] */
  131789. "ldr r10, [%[a], #8]\n\t"
  131790. "ldr r12, [%[a], #4]\n\t"
  131791. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131792. "lsl r8, r10, #16\n\t"
  131793. "lsl r9, r12, #16\n\t"
  131794. "lsr r8, r8, #16\n\t"
  131795. "lsr r9, r9, #16\n\t"
  131796. "mul r9, r8, r9\n\t"
  131797. "adds r2, r2, r9\n\t"
  131798. "adcs r3, r3, #0\n\t"
  131799. "adc r4, r4, #0\n\t"
  131800. "adds r2, r2, r9\n\t"
  131801. "adcs r3, r3, #0\n\t"
  131802. "adc r4, r4, #0\n\t"
  131803. "lsr r9, r12, #16\n\t"
  131804. "mul r8, r9, r8\n\t"
  131805. "lsr r9, r8, #16\n\t"
  131806. "lsl r8, r8, #16\n\t"
  131807. "adds r2, r2, r8\n\t"
  131808. "adcs r3, r3, r9\n\t"
  131809. "adc r4, r4, #0\n\t"
  131810. "adds r2, r2, r8\n\t"
  131811. "adcs r3, r3, r9\n\t"
  131812. "adc r4, r4, #0\n\t"
  131813. "lsr r8, r10, #16\n\t"
  131814. "lsr r9, r12, #16\n\t"
  131815. "mul r9, r8, r9\n\t"
  131816. "adds r3, r3, r9\n\t"
  131817. "adc r4, r4, #0\n\t"
  131818. "adds r3, r3, r9\n\t"
  131819. "adc r4, r4, #0\n\t"
  131820. "lsl r9, r12, #16\n\t"
  131821. "lsr r9, r9, #16\n\t"
  131822. "mul r8, r9, r8\n\t"
  131823. "lsr r9, r8, #16\n\t"
  131824. "lsl r8, r8, #16\n\t"
  131825. "adds r2, r2, r8\n\t"
  131826. "adcs r3, r3, r9\n\t"
  131827. "adc r4, r4, #0\n\t"
  131828. "adds r2, r2, r8\n\t"
  131829. "adcs r3, r3, r9\n\t"
  131830. "adc r4, r4, #0\n\t"
  131831. #else
  131832. "umull r8, r9, r10, r12\n\t"
  131833. "adds r2, r2, r8\n\t"
  131834. "adcs r3, r3, r9\n\t"
  131835. "adc r4, r4, #0\n\t"
  131836. "adds r2, r2, r8\n\t"
  131837. "adcs r3, r3, r9\n\t"
  131838. "adc r4, r4, #0\n\t"
  131839. #endif
  131840. "str r2, [sp, #12]\n\t"
  131841. /* A[0] * A[4] */
  131842. "ldr r10, [%[a], #16]\n\t"
  131843. "ldr r12, [%[a]]\n\t"
  131844. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131845. "lsl r8, r10, #16\n\t"
  131846. "lsl r9, r12, #16\n\t"
  131847. "lsr r8, r8, #16\n\t"
  131848. "lsr r9, r9, #16\n\t"
  131849. "mul r9, r8, r9\n\t"
  131850. "adds r3, r3, r9\n\t"
  131851. "adcs r4, r4, #0\n\t"
  131852. "mov r2, #0\n\t"
  131853. "adc r2, r2, #0\n\t"
  131854. "adds r3, r3, r9\n\t"
  131855. "adcs r4, r4, #0\n\t"
  131856. "adc r2, r2, #0\n\t"
  131857. "lsr r9, r12, #16\n\t"
  131858. "mul r8, r9, r8\n\t"
  131859. "lsr r9, r8, #16\n\t"
  131860. "lsl r8, r8, #16\n\t"
  131861. "adds r3, r3, r8\n\t"
  131862. "adcs r4, r4, r9\n\t"
  131863. "adc r2, r2, #0\n\t"
  131864. "adds r3, r3, r8\n\t"
  131865. "adcs r4, r4, r9\n\t"
  131866. "adc r2, r2, #0\n\t"
  131867. "lsr r8, r10, #16\n\t"
  131868. "lsr r9, r12, #16\n\t"
  131869. "mul r9, r8, r9\n\t"
  131870. "adds r4, r4, r9\n\t"
  131871. "adc r2, r2, #0\n\t"
  131872. "adds r4, r4, r9\n\t"
  131873. "adc r2, r2, #0\n\t"
  131874. "lsl r9, r12, #16\n\t"
  131875. "lsr r9, r9, #16\n\t"
  131876. "mul r8, r9, r8\n\t"
  131877. "lsr r9, r8, #16\n\t"
  131878. "lsl r8, r8, #16\n\t"
  131879. "adds r3, r3, r8\n\t"
  131880. "adcs r4, r4, r9\n\t"
  131881. "adc r2, r2, #0\n\t"
  131882. "adds r3, r3, r8\n\t"
  131883. "adcs r4, r4, r9\n\t"
  131884. "adc r2, r2, #0\n\t"
  131885. #else
  131886. "umull r8, r9, r10, r12\n\t"
  131887. "adds r3, r3, r8\n\t"
  131888. "adcs r4, r4, r9\n\t"
  131889. "mov r2, #0\n\t"
  131890. "adc r2, r2, #0\n\t"
  131891. "adds r3, r3, r8\n\t"
  131892. "adcs r4, r4, r9\n\t"
  131893. "mov r2, #0\n\t"
  131894. "adc r2, r2, #0\n\t"
  131895. #endif
  131896. /* A[1] * A[3] */
  131897. "ldr r10, [%[a], #12]\n\t"
  131898. "ldr r12, [%[a], #4]\n\t"
  131899. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131900. "lsl r8, r10, #16\n\t"
  131901. "lsl r9, r12, #16\n\t"
  131902. "lsr r8, r8, #16\n\t"
  131903. "lsr r9, r9, #16\n\t"
  131904. "mul r9, r8, r9\n\t"
  131905. "adds r3, r3, r9\n\t"
  131906. "adcs r4, r4, #0\n\t"
  131907. "adc r2, r2, #0\n\t"
  131908. "adds r3, r3, r9\n\t"
  131909. "adcs r4, r4, #0\n\t"
  131910. "adc r2, r2, #0\n\t"
  131911. "lsr r9, r12, #16\n\t"
  131912. "mul r8, r9, r8\n\t"
  131913. "lsr r9, r8, #16\n\t"
  131914. "lsl r8, r8, #16\n\t"
  131915. "adds r3, r3, r8\n\t"
  131916. "adcs r4, r4, r9\n\t"
  131917. "adc r2, r2, #0\n\t"
  131918. "adds r3, r3, r8\n\t"
  131919. "adcs r4, r4, r9\n\t"
  131920. "adc r2, r2, #0\n\t"
  131921. "lsr r8, r10, #16\n\t"
  131922. "lsr r9, r12, #16\n\t"
  131923. "mul r9, r8, r9\n\t"
  131924. "adds r4, r4, r9\n\t"
  131925. "adc r2, r2, #0\n\t"
  131926. "adds r4, r4, r9\n\t"
  131927. "adc r2, r2, #0\n\t"
  131928. "lsl r9, r12, #16\n\t"
  131929. "lsr r9, r9, #16\n\t"
  131930. "mul r8, r9, r8\n\t"
  131931. "lsr r9, r8, #16\n\t"
  131932. "lsl r8, r8, #16\n\t"
  131933. "adds r3, r3, r8\n\t"
  131934. "adcs r4, r4, r9\n\t"
  131935. "adc r2, r2, #0\n\t"
  131936. "adds r3, r3, r8\n\t"
  131937. "adcs r4, r4, r9\n\t"
  131938. "adc r2, r2, #0\n\t"
  131939. #else
  131940. "umull r8, r9, r10, r12\n\t"
  131941. "adds r3, r3, r8\n\t"
  131942. "adcs r4, r4, r9\n\t"
  131943. "adc r2, r2, #0\n\t"
  131944. "adds r3, r3, r8\n\t"
  131945. "adcs r4, r4, r9\n\t"
  131946. "adc r2, r2, #0\n\t"
  131947. #endif
  131948. /* A[2] * A[2] */
  131949. "ldr r10, [%[a], #8]\n\t"
  131950. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131951. "lsl r8, r10, #16\n\t"
  131952. "lsr r9, r10, #16\n\t"
  131953. "lsr r8, r8, #16\n\t"
  131954. "mov r12, r8\n\t"
  131955. "mul r8, r12, r8\n\t"
  131956. "mov r12, r9\n\t"
  131957. "mul r9, r12, r9\n\t"
  131958. "adds r3, r3, r8\n\t"
  131959. "adcs r4, r4, r9\n\t"
  131960. "adc r2, r2, #0\n\t"
  131961. "lsr r9, r10, #16\n\t"
  131962. "lsl r8, r10, #16\n\t"
  131963. "lsr r8, r8, #16\n\t"
  131964. "mul r8, r9, r8\n\t"
  131965. "lsr r9, r8, #15\n\t"
  131966. "lsl r8, r8, #17\n\t"
  131967. "adds r3, r3, r8\n\t"
  131968. "adcs r4, r4, r9\n\t"
  131969. "adc r2, r2, #0\n\t"
  131970. #else
  131971. "umull r8, r9, r10, r10\n\t"
  131972. "adds r3, r3, r8\n\t"
  131973. "adcs r4, r4, r9\n\t"
  131974. "adc r2, r2, #0\n\t"
  131975. #endif
  131976. "str r3, [sp, #16]\n\t"
  131977. /* A[0] * A[5] */
  131978. "ldr r10, [%[a], #20]\n\t"
  131979. "ldr r12, [%[a]]\n\t"
  131980. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  131981. "lsl r8, r10, #16\n\t"
  131982. "lsl r5, r12, #16\n\t"
  131983. "lsr r8, r8, #16\n\t"
  131984. "lsr r5, r5, #16\n\t"
  131985. "mul r5, r8, r5\n\t"
  131986. "lsr r9, r12, #16\n\t"
  131987. "mul r8, r9, r8\n\t"
  131988. "lsr r6, r8, #16\n\t"
  131989. "lsl r8, r8, #16\n\t"
  131990. "adds r5, r5, r8\n\t"
  131991. "adc r6, r6, #0\n\t"
  131992. "lsr r8, r10, #16\n\t"
  131993. "mul r9, r8, r9\n\t"
  131994. "add r6, r6, r9\n\t"
  131995. "lsl r9, r12, #16\n\t"
  131996. "lsr r9, r9, #16\n\t"
  131997. "mul r8, r9, r8\n\t"
  131998. "lsr r9, r8, #16\n\t"
  131999. "lsl r8, r8, #16\n\t"
  132000. "adds r5, r5, r8\n\t"
  132001. "adc r6, r6, r9\n\t"
  132002. #else
  132003. "umull r5, r6, r10, r12\n\t"
  132004. #endif
  132005. "mov r3, #0\n\t"
  132006. "mov r7, #0\n\t"
  132007. /* A[1] * A[4] */
  132008. "ldr r10, [%[a], #16]\n\t"
  132009. "ldr r12, [%[a], #4]\n\t"
  132010. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132011. "lsl r8, r10, #16\n\t"
  132012. "lsl r9, r12, #16\n\t"
  132013. "lsr r8, r8, #16\n\t"
  132014. "lsr r9, r9, #16\n\t"
  132015. "mul r9, r8, r9\n\t"
  132016. "adds r5, r5, r9\n\t"
  132017. "adcs r6, r6, #0\n\t"
  132018. "adc r7, r7, #0\n\t"
  132019. "lsr r9, r12, #16\n\t"
  132020. "mul r8, r9, r8\n\t"
  132021. "lsr r9, r8, #16\n\t"
  132022. "lsl r8, r8, #16\n\t"
  132023. "adds r5, r5, r8\n\t"
  132024. "adcs r6, r6, r9\n\t"
  132025. "adc r7, r7, #0\n\t"
  132026. "lsr r8, r10, #16\n\t"
  132027. "lsr r9, r12, #16\n\t"
  132028. "mul r9, r8, r9\n\t"
  132029. "adds r6, r6, r9\n\t"
  132030. "adc r7, r7, #0\n\t"
  132031. "lsl r9, r12, #16\n\t"
  132032. "lsr r9, r9, #16\n\t"
  132033. "mul r8, r9, r8\n\t"
  132034. "lsr r9, r8, #16\n\t"
  132035. "lsl r8, r8, #16\n\t"
  132036. "adds r5, r5, r8\n\t"
  132037. "adcs r6, r6, r9\n\t"
  132038. "adc r7, r7, #0\n\t"
  132039. #else
  132040. "umull r8, r9, r10, r12\n\t"
  132041. "adds r5, r5, r8\n\t"
  132042. "adcs r6, r6, r9\n\t"
  132043. "adc r7, r7, #0\n\t"
  132044. #endif
  132045. /* A[2] * A[3] */
  132046. "ldr r10, [%[a], #12]\n\t"
  132047. "ldr r12, [%[a], #8]\n\t"
  132048. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132049. "lsl r8, r10, #16\n\t"
  132050. "lsl r9, r12, #16\n\t"
  132051. "lsr r8, r8, #16\n\t"
  132052. "lsr r9, r9, #16\n\t"
  132053. "mul r9, r8, r9\n\t"
  132054. "adds r5, r5, r9\n\t"
  132055. "adcs r6, r6, #0\n\t"
  132056. "adc r7, r7, #0\n\t"
  132057. "lsr r9, r12, #16\n\t"
  132058. "mul r8, r9, r8\n\t"
  132059. "lsr r9, r8, #16\n\t"
  132060. "lsl r8, r8, #16\n\t"
  132061. "adds r5, r5, r8\n\t"
  132062. "adcs r6, r6, r9\n\t"
  132063. "adc r7, r7, #0\n\t"
  132064. "lsr r8, r10, #16\n\t"
  132065. "lsr r9, r12, #16\n\t"
  132066. "mul r9, r8, r9\n\t"
  132067. "adds r6, r6, r9\n\t"
  132068. "adc r7, r7, #0\n\t"
  132069. "lsl r9, r12, #16\n\t"
  132070. "lsr r9, r9, #16\n\t"
  132071. "mul r8, r9, r8\n\t"
  132072. "lsr r9, r8, #16\n\t"
  132073. "lsl r8, r8, #16\n\t"
  132074. "adds r5, r5, r8\n\t"
  132075. "adcs r6, r6, r9\n\t"
  132076. "adc r7, r7, #0\n\t"
  132077. #else
  132078. "umull r8, r9, r10, r12\n\t"
  132079. "adds r5, r5, r8\n\t"
  132080. "adcs r6, r6, r9\n\t"
  132081. "adc r7, r7, #0\n\t"
  132082. #endif
  132083. "adds r5, r5, r5\n\t"
  132084. "adcs r6, r6, r6\n\t"
  132085. "adc r7, r7, r7\n\t"
  132086. "adds r4, r4, r5\n\t"
  132087. "adcs r2, r2, r6\n\t"
  132088. "adc r3, r3, r7\n\t"
  132089. "str r4, [sp, #20]\n\t"
  132090. /* A[0] * A[6] */
  132091. "ldr r10, [%[a], #24]\n\t"
  132092. "ldr r12, [%[a]]\n\t"
  132093. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132094. "lsl r8, r10, #16\n\t"
  132095. "lsl r5, r12, #16\n\t"
  132096. "lsr r8, r8, #16\n\t"
  132097. "lsr r5, r5, #16\n\t"
  132098. "mul r5, r8, r5\n\t"
  132099. "lsr r9, r12, #16\n\t"
  132100. "mul r8, r9, r8\n\t"
  132101. "lsr r6, r8, #16\n\t"
  132102. "lsl r8, r8, #16\n\t"
  132103. "adds r5, r5, r8\n\t"
  132104. "adc r6, r6, #0\n\t"
  132105. "lsr r8, r10, #16\n\t"
  132106. "mul r9, r8, r9\n\t"
  132107. "add r6, r6, r9\n\t"
  132108. "lsl r9, r12, #16\n\t"
  132109. "lsr r9, r9, #16\n\t"
  132110. "mul r8, r9, r8\n\t"
  132111. "lsr r9, r8, #16\n\t"
  132112. "lsl r8, r8, #16\n\t"
  132113. "adds r5, r5, r8\n\t"
  132114. "adc r6, r6, r9\n\t"
  132115. #else
  132116. "umull r5, r6, r10, r12\n\t"
  132117. #endif
  132118. "mov r4, #0\n\t"
  132119. "mov r7, #0\n\t"
  132120. /* A[1] * A[5] */
  132121. "ldr r10, [%[a], #20]\n\t"
  132122. "ldr r12, [%[a], #4]\n\t"
  132123. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132124. "lsl r8, r10, #16\n\t"
  132125. "lsl r9, r12, #16\n\t"
  132126. "lsr r8, r8, #16\n\t"
  132127. "lsr r9, r9, #16\n\t"
  132128. "mul r9, r8, r9\n\t"
  132129. "adds r5, r5, r9\n\t"
  132130. "adcs r6, r6, #0\n\t"
  132131. "adc r7, r7, #0\n\t"
  132132. "lsr r9, r12, #16\n\t"
  132133. "mul r8, r9, r8\n\t"
  132134. "lsr r9, r8, #16\n\t"
  132135. "lsl r8, r8, #16\n\t"
  132136. "adds r5, r5, r8\n\t"
  132137. "adcs r6, r6, r9\n\t"
  132138. "adc r7, r7, #0\n\t"
  132139. "lsr r8, r10, #16\n\t"
  132140. "lsr r9, r12, #16\n\t"
  132141. "mul r9, r8, r9\n\t"
  132142. "adds r6, r6, r9\n\t"
  132143. "adc r7, r7, #0\n\t"
  132144. "lsl r9, r12, #16\n\t"
  132145. "lsr r9, r9, #16\n\t"
  132146. "mul r8, r9, r8\n\t"
  132147. "lsr r9, r8, #16\n\t"
  132148. "lsl r8, r8, #16\n\t"
  132149. "adds r5, r5, r8\n\t"
  132150. "adcs r6, r6, r9\n\t"
  132151. "adc r7, r7, #0\n\t"
  132152. #else
  132153. "umull r8, r9, r10, r12\n\t"
  132154. "adds r5, r5, r8\n\t"
  132155. "adcs r6, r6, r9\n\t"
  132156. "adc r7, r7, #0\n\t"
  132157. #endif
  132158. /* A[2] * A[4] */
  132159. "ldr r10, [%[a], #16]\n\t"
  132160. "ldr r12, [%[a], #8]\n\t"
  132161. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132162. "lsl r8, r10, #16\n\t"
  132163. "lsl r9, r12, #16\n\t"
  132164. "lsr r8, r8, #16\n\t"
  132165. "lsr r9, r9, #16\n\t"
  132166. "mul r9, r8, r9\n\t"
  132167. "adds r5, r5, r9\n\t"
  132168. "adcs r6, r6, #0\n\t"
  132169. "adc r7, r7, #0\n\t"
  132170. "lsr r9, r12, #16\n\t"
  132171. "mul r8, r9, r8\n\t"
  132172. "lsr r9, r8, #16\n\t"
  132173. "lsl r8, r8, #16\n\t"
  132174. "adds r5, r5, r8\n\t"
  132175. "adcs r6, r6, r9\n\t"
  132176. "adc r7, r7, #0\n\t"
  132177. "lsr r8, r10, #16\n\t"
  132178. "lsr r9, r12, #16\n\t"
  132179. "mul r9, r8, r9\n\t"
  132180. "adds r6, r6, r9\n\t"
  132181. "adc r7, r7, #0\n\t"
  132182. "lsl r9, r12, #16\n\t"
  132183. "lsr r9, r9, #16\n\t"
  132184. "mul r8, r9, r8\n\t"
  132185. "lsr r9, r8, #16\n\t"
  132186. "lsl r8, r8, #16\n\t"
  132187. "adds r5, r5, r8\n\t"
  132188. "adcs r6, r6, r9\n\t"
  132189. "adc r7, r7, #0\n\t"
  132190. #else
  132191. "umull r8, r9, r10, r12\n\t"
  132192. "adds r5, r5, r8\n\t"
  132193. "adcs r6, r6, r9\n\t"
  132194. "adc r7, r7, #0\n\t"
  132195. #endif
  132196. /* A[3] * A[3] */
  132197. "ldr r10, [%[a], #12]\n\t"
  132198. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132199. "lsl r8, r10, #16\n\t"
  132200. "lsr r9, r10, #16\n\t"
  132201. "lsr r8, r8, #16\n\t"
  132202. "mov r12, r8\n\t"
  132203. "mul r8, r12, r8\n\t"
  132204. "mov r12, r9\n\t"
  132205. "mul r9, r12, r9\n\t"
  132206. "adds r2, r2, r8\n\t"
  132207. "adcs r3, r3, r9\n\t"
  132208. "adc r4, r4, #0\n\t"
  132209. "lsr r9, r10, #16\n\t"
  132210. "lsl r8, r10, #16\n\t"
  132211. "lsr r8, r8, #16\n\t"
  132212. "mul r8, r9, r8\n\t"
  132213. "lsr r9, r8, #15\n\t"
  132214. "lsl r8, r8, #17\n\t"
  132215. "adds r2, r2, r8\n\t"
  132216. "adcs r3, r3, r9\n\t"
  132217. "adc r4, r4, #0\n\t"
  132218. "adds r5, r5, r5\n\t"
  132219. "adcs r6, r6, r6\n\t"
  132220. "adc r7, r7, r7\n\t"
  132221. #else
  132222. "umull r8, r9, r10, r10\n\t"
  132223. "adds r5, r5, r5\n\t"
  132224. "adcs r6, r6, r6\n\t"
  132225. "adc r7, r7, r7\n\t"
  132226. "adds r2, r2, r8\n\t"
  132227. "adcs r3, r3, r9\n\t"
  132228. "adc r4, r4, #0\n\t"
  132229. #endif
  132230. "adds r2, r2, r5\n\t"
  132231. "adcs r3, r3, r6\n\t"
  132232. "adc r4, r4, r7\n\t"
  132233. "str r2, [sp, #24]\n\t"
  132234. /* A[0] * A[7] */
  132235. "ldr r10, [%[a], #28]\n\t"
  132236. "ldr r12, [%[a]]\n\t"
  132237. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132238. "lsl r8, r10, #16\n\t"
  132239. "lsl r5, r12, #16\n\t"
  132240. "lsr r8, r8, #16\n\t"
  132241. "lsr r5, r5, #16\n\t"
  132242. "mul r5, r8, r5\n\t"
  132243. "lsr r9, r12, #16\n\t"
  132244. "mul r8, r9, r8\n\t"
  132245. "lsr r6, r8, #16\n\t"
  132246. "lsl r8, r8, #16\n\t"
  132247. "adds r5, r5, r8\n\t"
  132248. "adc r6, r6, #0\n\t"
  132249. "lsr r8, r10, #16\n\t"
  132250. "mul r9, r8, r9\n\t"
  132251. "add r6, r6, r9\n\t"
  132252. "lsl r9, r12, #16\n\t"
  132253. "lsr r9, r9, #16\n\t"
  132254. "mul r8, r9, r8\n\t"
  132255. "lsr r9, r8, #16\n\t"
  132256. "lsl r8, r8, #16\n\t"
  132257. "adds r5, r5, r8\n\t"
  132258. "adc r6, r6, r9\n\t"
  132259. #else
  132260. "umull r5, r6, r10, r12\n\t"
  132261. #endif
  132262. "mov r2, #0\n\t"
  132263. "mov r7, #0\n\t"
  132264. /* A[1] * A[6] */
  132265. "ldr r10, [%[a], #24]\n\t"
  132266. "ldr r12, [%[a], #4]\n\t"
  132267. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132268. "lsl r8, r10, #16\n\t"
  132269. "lsl r9, r12, #16\n\t"
  132270. "lsr r8, r8, #16\n\t"
  132271. "lsr r9, r9, #16\n\t"
  132272. "mul r9, r8, r9\n\t"
  132273. "adds r5, r5, r9\n\t"
  132274. "adcs r6, r6, #0\n\t"
  132275. "adc r7, r7, #0\n\t"
  132276. "lsr r9, r12, #16\n\t"
  132277. "mul r8, r9, r8\n\t"
  132278. "lsr r9, r8, #16\n\t"
  132279. "lsl r8, r8, #16\n\t"
  132280. "adds r5, r5, r8\n\t"
  132281. "adcs r6, r6, r9\n\t"
  132282. "adc r7, r7, #0\n\t"
  132283. "lsr r8, r10, #16\n\t"
  132284. "lsr r9, r12, #16\n\t"
  132285. "mul r9, r8, r9\n\t"
  132286. "adds r6, r6, r9\n\t"
  132287. "adc r7, r7, #0\n\t"
  132288. "lsl r9, r12, #16\n\t"
  132289. "lsr r9, r9, #16\n\t"
  132290. "mul r8, r9, r8\n\t"
  132291. "lsr r9, r8, #16\n\t"
  132292. "lsl r8, r8, #16\n\t"
  132293. "adds r5, r5, r8\n\t"
  132294. "adcs r6, r6, r9\n\t"
  132295. "adc r7, r7, #0\n\t"
  132296. #else
  132297. "umull r8, r9, r10, r12\n\t"
  132298. "adds r5, r5, r8\n\t"
  132299. "adcs r6, r6, r9\n\t"
  132300. "adc r7, r7, #0\n\t"
  132301. #endif
  132302. /* A[2] * A[5] */
  132303. "ldr r10, [%[a], #20]\n\t"
  132304. "ldr r12, [%[a], #8]\n\t"
  132305. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132306. "lsl r8, r10, #16\n\t"
  132307. "lsl r9, r12, #16\n\t"
  132308. "lsr r8, r8, #16\n\t"
  132309. "lsr r9, r9, #16\n\t"
  132310. "mul r9, r8, r9\n\t"
  132311. "adds r5, r5, r9\n\t"
  132312. "adcs r6, r6, #0\n\t"
  132313. "adc r7, r7, #0\n\t"
  132314. "lsr r9, r12, #16\n\t"
  132315. "mul r8, r9, r8\n\t"
  132316. "lsr r9, r8, #16\n\t"
  132317. "lsl r8, r8, #16\n\t"
  132318. "adds r5, r5, r8\n\t"
  132319. "adcs r6, r6, r9\n\t"
  132320. "adc r7, r7, #0\n\t"
  132321. "lsr r8, r10, #16\n\t"
  132322. "lsr r9, r12, #16\n\t"
  132323. "mul r9, r8, r9\n\t"
  132324. "adds r6, r6, r9\n\t"
  132325. "adc r7, r7, #0\n\t"
  132326. "lsl r9, r12, #16\n\t"
  132327. "lsr r9, r9, #16\n\t"
  132328. "mul r8, r9, r8\n\t"
  132329. "lsr r9, r8, #16\n\t"
  132330. "lsl r8, r8, #16\n\t"
  132331. "adds r5, r5, r8\n\t"
  132332. "adcs r6, r6, r9\n\t"
  132333. "adc r7, r7, #0\n\t"
  132334. #else
  132335. "umull r8, r9, r10, r12\n\t"
  132336. "adds r5, r5, r8\n\t"
  132337. "adcs r6, r6, r9\n\t"
  132338. "adc r7, r7, #0\n\t"
  132339. #endif
  132340. /* A[3] * A[4] */
  132341. "ldr r10, [%[a], #16]\n\t"
  132342. "ldr r12, [%[a], #12]\n\t"
  132343. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132344. "lsl r8, r10, #16\n\t"
  132345. "lsl r9, r12, #16\n\t"
  132346. "lsr r8, r8, #16\n\t"
  132347. "lsr r9, r9, #16\n\t"
  132348. "mul r9, r8, r9\n\t"
  132349. "adds r5, r5, r9\n\t"
  132350. "adcs r6, r6, #0\n\t"
  132351. "adc r7, r7, #0\n\t"
  132352. "lsr r9, r12, #16\n\t"
  132353. "mul r8, r9, r8\n\t"
  132354. "lsr r9, r8, #16\n\t"
  132355. "lsl r8, r8, #16\n\t"
  132356. "adds r5, r5, r8\n\t"
  132357. "adcs r6, r6, r9\n\t"
  132358. "adc r7, r7, #0\n\t"
  132359. "lsr r8, r10, #16\n\t"
  132360. "lsr r9, r12, #16\n\t"
  132361. "mul r9, r8, r9\n\t"
  132362. "adds r6, r6, r9\n\t"
  132363. "adc r7, r7, #0\n\t"
  132364. "lsl r9, r12, #16\n\t"
  132365. "lsr r9, r9, #16\n\t"
  132366. "mul r8, r9, r8\n\t"
  132367. "lsr r9, r8, #16\n\t"
  132368. "lsl r8, r8, #16\n\t"
  132369. "adds r5, r5, r8\n\t"
  132370. "adcs r6, r6, r9\n\t"
  132371. "adc r7, r7, #0\n\t"
  132372. #else
  132373. "umull r8, r9, r10, r12\n\t"
  132374. "adds r5, r5, r8\n\t"
  132375. "adcs r6, r6, r9\n\t"
  132376. "adc r7, r7, #0\n\t"
  132377. #endif
  132378. "adds r5, r5, r5\n\t"
  132379. "adcs r6, r6, r6\n\t"
  132380. "adc r7, r7, r7\n\t"
  132381. "adds r3, r3, r5\n\t"
  132382. "adcs r4, r4, r6\n\t"
  132383. "adc r2, r2, r7\n\t"
  132384. "str r3, [sp, #28]\n\t"
  132385. /* A[0] * A[8] */
  132386. "ldr r10, [%[a], #32]\n\t"
  132387. "ldr r12, [%[a]]\n\t"
  132388. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132389. "lsl r8, r10, #16\n\t"
  132390. "lsl r5, r12, #16\n\t"
  132391. "lsr r8, r8, #16\n\t"
  132392. "lsr r5, r5, #16\n\t"
  132393. "mul r5, r8, r5\n\t"
  132394. "lsr r9, r12, #16\n\t"
  132395. "mul r8, r9, r8\n\t"
  132396. "lsr r6, r8, #16\n\t"
  132397. "lsl r8, r8, #16\n\t"
  132398. "adds r5, r5, r8\n\t"
  132399. "adc r6, r6, #0\n\t"
  132400. "lsr r8, r10, #16\n\t"
  132401. "mul r9, r8, r9\n\t"
  132402. "add r6, r6, r9\n\t"
  132403. "lsl r9, r12, #16\n\t"
  132404. "lsr r9, r9, #16\n\t"
  132405. "mul r8, r9, r8\n\t"
  132406. "lsr r9, r8, #16\n\t"
  132407. "lsl r8, r8, #16\n\t"
  132408. "adds r5, r5, r8\n\t"
  132409. "adc r6, r6, r9\n\t"
  132410. #else
  132411. "umull r5, r6, r10, r12\n\t"
  132412. #endif
  132413. "mov r3, #0\n\t"
  132414. "mov r7, #0\n\t"
  132415. /* A[1] * A[7] */
  132416. "ldr r10, [%[a], #28]\n\t"
  132417. "ldr r12, [%[a], #4]\n\t"
  132418. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132419. "lsl r8, r10, #16\n\t"
  132420. "lsl r9, r12, #16\n\t"
  132421. "lsr r8, r8, #16\n\t"
  132422. "lsr r9, r9, #16\n\t"
  132423. "mul r9, r8, r9\n\t"
  132424. "adds r5, r5, r9\n\t"
  132425. "adcs r6, r6, #0\n\t"
  132426. "adc r7, r7, #0\n\t"
  132427. "lsr r9, r12, #16\n\t"
  132428. "mul r8, r9, r8\n\t"
  132429. "lsr r9, r8, #16\n\t"
  132430. "lsl r8, r8, #16\n\t"
  132431. "adds r5, r5, r8\n\t"
  132432. "adcs r6, r6, r9\n\t"
  132433. "adc r7, r7, #0\n\t"
  132434. "lsr r8, r10, #16\n\t"
  132435. "lsr r9, r12, #16\n\t"
  132436. "mul r9, r8, r9\n\t"
  132437. "adds r6, r6, r9\n\t"
  132438. "adc r7, r7, #0\n\t"
  132439. "lsl r9, r12, #16\n\t"
  132440. "lsr r9, r9, #16\n\t"
  132441. "mul r8, r9, r8\n\t"
  132442. "lsr r9, r8, #16\n\t"
  132443. "lsl r8, r8, #16\n\t"
  132444. "adds r5, r5, r8\n\t"
  132445. "adcs r6, r6, r9\n\t"
  132446. "adc r7, r7, #0\n\t"
  132447. #else
  132448. "umull r8, r9, r10, r12\n\t"
  132449. "adds r5, r5, r8\n\t"
  132450. "adcs r6, r6, r9\n\t"
  132451. "adc r7, r7, #0\n\t"
  132452. #endif
  132453. /* A[2] * A[6] */
  132454. "ldr r10, [%[a], #24]\n\t"
  132455. "ldr r12, [%[a], #8]\n\t"
  132456. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132457. "lsl r8, r10, #16\n\t"
  132458. "lsl r9, r12, #16\n\t"
  132459. "lsr r8, r8, #16\n\t"
  132460. "lsr r9, r9, #16\n\t"
  132461. "mul r9, r8, r9\n\t"
  132462. "adds r5, r5, r9\n\t"
  132463. "adcs r6, r6, #0\n\t"
  132464. "adc r7, r7, #0\n\t"
  132465. "lsr r9, r12, #16\n\t"
  132466. "mul r8, r9, r8\n\t"
  132467. "lsr r9, r8, #16\n\t"
  132468. "lsl r8, r8, #16\n\t"
  132469. "adds r5, r5, r8\n\t"
  132470. "adcs r6, r6, r9\n\t"
  132471. "adc r7, r7, #0\n\t"
  132472. "lsr r8, r10, #16\n\t"
  132473. "lsr r9, r12, #16\n\t"
  132474. "mul r9, r8, r9\n\t"
  132475. "adds r6, r6, r9\n\t"
  132476. "adc r7, r7, #0\n\t"
  132477. "lsl r9, r12, #16\n\t"
  132478. "lsr r9, r9, #16\n\t"
  132479. "mul r8, r9, r8\n\t"
  132480. "lsr r9, r8, #16\n\t"
  132481. "lsl r8, r8, #16\n\t"
  132482. "adds r5, r5, r8\n\t"
  132483. "adcs r6, r6, r9\n\t"
  132484. "adc r7, r7, #0\n\t"
  132485. #else
  132486. "umull r8, r9, r10, r12\n\t"
  132487. "adds r5, r5, r8\n\t"
  132488. "adcs r6, r6, r9\n\t"
  132489. "adc r7, r7, #0\n\t"
  132490. #endif
  132491. /* A[3] * A[5] */
  132492. "ldr r10, [%[a], #20]\n\t"
  132493. "ldr r12, [%[a], #12]\n\t"
  132494. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132495. "lsl r8, r10, #16\n\t"
  132496. "lsl r9, r12, #16\n\t"
  132497. "lsr r8, r8, #16\n\t"
  132498. "lsr r9, r9, #16\n\t"
  132499. "mul r9, r8, r9\n\t"
  132500. "adds r5, r5, r9\n\t"
  132501. "adcs r6, r6, #0\n\t"
  132502. "adc r7, r7, #0\n\t"
  132503. "lsr r9, r12, #16\n\t"
  132504. "mul r8, r9, r8\n\t"
  132505. "lsr r9, r8, #16\n\t"
  132506. "lsl r8, r8, #16\n\t"
  132507. "adds r5, r5, r8\n\t"
  132508. "adcs r6, r6, r9\n\t"
  132509. "adc r7, r7, #0\n\t"
  132510. "lsr r8, r10, #16\n\t"
  132511. "lsr r9, r12, #16\n\t"
  132512. "mul r9, r8, r9\n\t"
  132513. "adds r6, r6, r9\n\t"
  132514. "adc r7, r7, #0\n\t"
  132515. "lsl r9, r12, #16\n\t"
  132516. "lsr r9, r9, #16\n\t"
  132517. "mul r8, r9, r8\n\t"
  132518. "lsr r9, r8, #16\n\t"
  132519. "lsl r8, r8, #16\n\t"
  132520. "adds r5, r5, r8\n\t"
  132521. "adcs r6, r6, r9\n\t"
  132522. "adc r7, r7, #0\n\t"
  132523. #else
  132524. "umull r8, r9, r10, r12\n\t"
  132525. "adds r5, r5, r8\n\t"
  132526. "adcs r6, r6, r9\n\t"
  132527. "adc r7, r7, #0\n\t"
  132528. #endif
  132529. /* A[4] * A[4] */
  132530. "ldr r10, [%[a], #16]\n\t"
  132531. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132532. "lsl r8, r10, #16\n\t"
  132533. "lsr r9, r10, #16\n\t"
  132534. "lsr r8, r8, #16\n\t"
  132535. "mov r12, r8\n\t"
  132536. "mul r8, r12, r8\n\t"
  132537. "mov r12, r9\n\t"
  132538. "mul r9, r12, r9\n\t"
  132539. "adds r4, r4, r8\n\t"
  132540. "adcs r2, r2, r9\n\t"
  132541. "adc r3, r3, #0\n\t"
  132542. "lsr r9, r10, #16\n\t"
  132543. "lsl r8, r10, #16\n\t"
  132544. "lsr r8, r8, #16\n\t"
  132545. "mul r8, r9, r8\n\t"
  132546. "lsr r9, r8, #15\n\t"
  132547. "lsl r8, r8, #17\n\t"
  132548. "adds r4, r4, r8\n\t"
  132549. "adcs r2, r2, r9\n\t"
  132550. "adc r3, r3, #0\n\t"
  132551. "adds r5, r5, r5\n\t"
  132552. "adcs r6, r6, r6\n\t"
  132553. "adc r7, r7, r7\n\t"
  132554. #else
  132555. "umull r8, r9, r10, r10\n\t"
  132556. "adds r5, r5, r5\n\t"
  132557. "adcs r6, r6, r6\n\t"
  132558. "adc r7, r7, r7\n\t"
  132559. "adds r4, r4, r8\n\t"
  132560. "adcs r2, r2, r9\n\t"
  132561. "adc r3, r3, #0\n\t"
  132562. #endif
  132563. "adds r4, r4, r5\n\t"
  132564. "adcs r2, r2, r6\n\t"
  132565. "adc r3, r3, r7\n\t"
  132566. "str r4, [sp, #32]\n\t"
  132567. /* A[0] * A[9] */
  132568. "ldr r10, [%[a], #36]\n\t"
  132569. "ldr r12, [%[a]]\n\t"
  132570. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132571. "lsl r8, r10, #16\n\t"
  132572. "lsl r5, r12, #16\n\t"
  132573. "lsr r8, r8, #16\n\t"
  132574. "lsr r5, r5, #16\n\t"
  132575. "mul r5, r8, r5\n\t"
  132576. "lsr r9, r12, #16\n\t"
  132577. "mul r8, r9, r8\n\t"
  132578. "lsr r6, r8, #16\n\t"
  132579. "lsl r8, r8, #16\n\t"
  132580. "adds r5, r5, r8\n\t"
  132581. "adc r6, r6, #0\n\t"
  132582. "lsr r8, r10, #16\n\t"
  132583. "mul r9, r8, r9\n\t"
  132584. "add r6, r6, r9\n\t"
  132585. "lsl r9, r12, #16\n\t"
  132586. "lsr r9, r9, #16\n\t"
  132587. "mul r8, r9, r8\n\t"
  132588. "lsr r9, r8, #16\n\t"
  132589. "lsl r8, r8, #16\n\t"
  132590. "adds r5, r5, r8\n\t"
  132591. "adc r6, r6, r9\n\t"
  132592. #else
  132593. "umull r5, r6, r10, r12\n\t"
  132594. #endif
  132595. "mov r4, #0\n\t"
  132596. "mov r7, #0\n\t"
  132597. /* A[1] * A[8] */
  132598. "ldr r10, [%[a], #32]\n\t"
  132599. "ldr r12, [%[a], #4]\n\t"
  132600. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132601. "lsl r8, r10, #16\n\t"
  132602. "lsl r9, r12, #16\n\t"
  132603. "lsr r8, r8, #16\n\t"
  132604. "lsr r9, r9, #16\n\t"
  132605. "mul r9, r8, r9\n\t"
  132606. "adds r5, r5, r9\n\t"
  132607. "adcs r6, r6, #0\n\t"
  132608. "adc r7, r7, #0\n\t"
  132609. "lsr r9, r12, #16\n\t"
  132610. "mul r8, r9, r8\n\t"
  132611. "lsr r9, r8, #16\n\t"
  132612. "lsl r8, r8, #16\n\t"
  132613. "adds r5, r5, r8\n\t"
  132614. "adcs r6, r6, r9\n\t"
  132615. "adc r7, r7, #0\n\t"
  132616. "lsr r8, r10, #16\n\t"
  132617. "lsr r9, r12, #16\n\t"
  132618. "mul r9, r8, r9\n\t"
  132619. "adds r6, r6, r9\n\t"
  132620. "adc r7, r7, #0\n\t"
  132621. "lsl r9, r12, #16\n\t"
  132622. "lsr r9, r9, #16\n\t"
  132623. "mul r8, r9, r8\n\t"
  132624. "lsr r9, r8, #16\n\t"
  132625. "lsl r8, r8, #16\n\t"
  132626. "adds r5, r5, r8\n\t"
  132627. "adcs r6, r6, r9\n\t"
  132628. "adc r7, r7, #0\n\t"
  132629. #else
  132630. "umull r8, r9, r10, r12\n\t"
  132631. "adds r5, r5, r8\n\t"
  132632. "adcs r6, r6, r9\n\t"
  132633. "adc r7, r7, #0\n\t"
  132634. #endif
  132635. /* A[2] * A[7] */
  132636. "ldr r10, [%[a], #28]\n\t"
  132637. "ldr r12, [%[a], #8]\n\t"
  132638. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132639. "lsl r8, r10, #16\n\t"
  132640. "lsl r9, r12, #16\n\t"
  132641. "lsr r8, r8, #16\n\t"
  132642. "lsr r9, r9, #16\n\t"
  132643. "mul r9, r8, r9\n\t"
  132644. "adds r5, r5, r9\n\t"
  132645. "adcs r6, r6, #0\n\t"
  132646. "adc r7, r7, #0\n\t"
  132647. "lsr r9, r12, #16\n\t"
  132648. "mul r8, r9, r8\n\t"
  132649. "lsr r9, r8, #16\n\t"
  132650. "lsl r8, r8, #16\n\t"
  132651. "adds r5, r5, r8\n\t"
  132652. "adcs r6, r6, r9\n\t"
  132653. "adc r7, r7, #0\n\t"
  132654. "lsr r8, r10, #16\n\t"
  132655. "lsr r9, r12, #16\n\t"
  132656. "mul r9, r8, r9\n\t"
  132657. "adds r6, r6, r9\n\t"
  132658. "adc r7, r7, #0\n\t"
  132659. "lsl r9, r12, #16\n\t"
  132660. "lsr r9, r9, #16\n\t"
  132661. "mul r8, r9, r8\n\t"
  132662. "lsr r9, r8, #16\n\t"
  132663. "lsl r8, r8, #16\n\t"
  132664. "adds r5, r5, r8\n\t"
  132665. "adcs r6, r6, r9\n\t"
  132666. "adc r7, r7, #0\n\t"
  132667. #else
  132668. "umull r8, r9, r10, r12\n\t"
  132669. "adds r5, r5, r8\n\t"
  132670. "adcs r6, r6, r9\n\t"
  132671. "adc r7, r7, #0\n\t"
  132672. #endif
  132673. /* A[3] * A[6] */
  132674. "ldr r10, [%[a], #24]\n\t"
  132675. "ldr r12, [%[a], #12]\n\t"
  132676. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132677. "lsl r8, r10, #16\n\t"
  132678. "lsl r9, r12, #16\n\t"
  132679. "lsr r8, r8, #16\n\t"
  132680. "lsr r9, r9, #16\n\t"
  132681. "mul r9, r8, r9\n\t"
  132682. "adds r5, r5, r9\n\t"
  132683. "adcs r6, r6, #0\n\t"
  132684. "adc r7, r7, #0\n\t"
  132685. "lsr r9, r12, #16\n\t"
  132686. "mul r8, r9, r8\n\t"
  132687. "lsr r9, r8, #16\n\t"
  132688. "lsl r8, r8, #16\n\t"
  132689. "adds r5, r5, r8\n\t"
  132690. "adcs r6, r6, r9\n\t"
  132691. "adc r7, r7, #0\n\t"
  132692. "lsr r8, r10, #16\n\t"
  132693. "lsr r9, r12, #16\n\t"
  132694. "mul r9, r8, r9\n\t"
  132695. "adds r6, r6, r9\n\t"
  132696. "adc r7, r7, #0\n\t"
  132697. "lsl r9, r12, #16\n\t"
  132698. "lsr r9, r9, #16\n\t"
  132699. "mul r8, r9, r8\n\t"
  132700. "lsr r9, r8, #16\n\t"
  132701. "lsl r8, r8, #16\n\t"
  132702. "adds r5, r5, r8\n\t"
  132703. "adcs r6, r6, r9\n\t"
  132704. "adc r7, r7, #0\n\t"
  132705. #else
  132706. "umull r8, r9, r10, r12\n\t"
  132707. "adds r5, r5, r8\n\t"
  132708. "adcs r6, r6, r9\n\t"
  132709. "adc r7, r7, #0\n\t"
  132710. #endif
  132711. /* A[4] * A[5] */
  132712. "ldr r10, [%[a], #20]\n\t"
  132713. "ldr r12, [%[a], #16]\n\t"
  132714. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132715. "lsl r8, r10, #16\n\t"
  132716. "lsl r9, r12, #16\n\t"
  132717. "lsr r8, r8, #16\n\t"
  132718. "lsr r9, r9, #16\n\t"
  132719. "mul r9, r8, r9\n\t"
  132720. "adds r5, r5, r9\n\t"
  132721. "adcs r6, r6, #0\n\t"
  132722. "adc r7, r7, #0\n\t"
  132723. "lsr r9, r12, #16\n\t"
  132724. "mul r8, r9, r8\n\t"
  132725. "lsr r9, r8, #16\n\t"
  132726. "lsl r8, r8, #16\n\t"
  132727. "adds r5, r5, r8\n\t"
  132728. "adcs r6, r6, r9\n\t"
  132729. "adc r7, r7, #0\n\t"
  132730. "lsr r8, r10, #16\n\t"
  132731. "lsr r9, r12, #16\n\t"
  132732. "mul r9, r8, r9\n\t"
  132733. "adds r6, r6, r9\n\t"
  132734. "adc r7, r7, #0\n\t"
  132735. "lsl r9, r12, #16\n\t"
  132736. "lsr r9, r9, #16\n\t"
  132737. "mul r8, r9, r8\n\t"
  132738. "lsr r9, r8, #16\n\t"
  132739. "lsl r8, r8, #16\n\t"
  132740. "adds r5, r5, r8\n\t"
  132741. "adcs r6, r6, r9\n\t"
  132742. "adc r7, r7, #0\n\t"
  132743. #else
  132744. "umull r8, r9, r10, r12\n\t"
  132745. "adds r5, r5, r8\n\t"
  132746. "adcs r6, r6, r9\n\t"
  132747. "adc r7, r7, #0\n\t"
  132748. #endif
  132749. "adds r5, r5, r5\n\t"
  132750. "adcs r6, r6, r6\n\t"
  132751. "adc r7, r7, r7\n\t"
  132752. "adds r2, r2, r5\n\t"
  132753. "adcs r3, r3, r6\n\t"
  132754. "adc r4, r4, r7\n\t"
  132755. "str r2, [sp, #36]\n\t"
  132756. /* A[0] * A[10] */
  132757. "ldr r10, [%[a], #40]\n\t"
  132758. "ldr r12, [%[a]]\n\t"
  132759. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132760. "lsl r8, r10, #16\n\t"
  132761. "lsl r5, r12, #16\n\t"
  132762. "lsr r8, r8, #16\n\t"
  132763. "lsr r5, r5, #16\n\t"
  132764. "mul r5, r8, r5\n\t"
  132765. "lsr r9, r12, #16\n\t"
  132766. "mul r8, r9, r8\n\t"
  132767. "lsr r6, r8, #16\n\t"
  132768. "lsl r8, r8, #16\n\t"
  132769. "adds r5, r5, r8\n\t"
  132770. "adc r6, r6, #0\n\t"
  132771. "lsr r8, r10, #16\n\t"
  132772. "mul r9, r8, r9\n\t"
  132773. "add r6, r6, r9\n\t"
  132774. "lsl r9, r12, #16\n\t"
  132775. "lsr r9, r9, #16\n\t"
  132776. "mul r8, r9, r8\n\t"
  132777. "lsr r9, r8, #16\n\t"
  132778. "lsl r8, r8, #16\n\t"
  132779. "adds r5, r5, r8\n\t"
  132780. "adc r6, r6, r9\n\t"
  132781. #else
  132782. "umull r5, r6, r10, r12\n\t"
  132783. #endif
  132784. "mov r2, #0\n\t"
  132785. "mov r7, #0\n\t"
  132786. /* A[1] * A[9] */
  132787. "ldr r10, [%[a], #36]\n\t"
  132788. "ldr r12, [%[a], #4]\n\t"
  132789. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132790. "lsl r8, r10, #16\n\t"
  132791. "lsl r9, r12, #16\n\t"
  132792. "lsr r8, r8, #16\n\t"
  132793. "lsr r9, r9, #16\n\t"
  132794. "mul r9, r8, r9\n\t"
  132795. "adds r5, r5, r9\n\t"
  132796. "adcs r6, r6, #0\n\t"
  132797. "adc r7, r7, #0\n\t"
  132798. "lsr r9, r12, #16\n\t"
  132799. "mul r8, r9, r8\n\t"
  132800. "lsr r9, r8, #16\n\t"
  132801. "lsl r8, r8, #16\n\t"
  132802. "adds r5, r5, r8\n\t"
  132803. "adcs r6, r6, r9\n\t"
  132804. "adc r7, r7, #0\n\t"
  132805. "lsr r8, r10, #16\n\t"
  132806. "lsr r9, r12, #16\n\t"
  132807. "mul r9, r8, r9\n\t"
  132808. "adds r6, r6, r9\n\t"
  132809. "adc r7, r7, #0\n\t"
  132810. "lsl r9, r12, #16\n\t"
  132811. "lsr r9, r9, #16\n\t"
  132812. "mul r8, r9, r8\n\t"
  132813. "lsr r9, r8, #16\n\t"
  132814. "lsl r8, r8, #16\n\t"
  132815. "adds r5, r5, r8\n\t"
  132816. "adcs r6, r6, r9\n\t"
  132817. "adc r7, r7, #0\n\t"
  132818. #else
  132819. "umull r8, r9, r10, r12\n\t"
  132820. "adds r5, r5, r8\n\t"
  132821. "adcs r6, r6, r9\n\t"
  132822. "adc r7, r7, #0\n\t"
  132823. #endif
  132824. /* A[2] * A[8] */
  132825. "ldr r10, [%[a], #32]\n\t"
  132826. "ldr r12, [%[a], #8]\n\t"
  132827. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132828. "lsl r8, r10, #16\n\t"
  132829. "lsl r9, r12, #16\n\t"
  132830. "lsr r8, r8, #16\n\t"
  132831. "lsr r9, r9, #16\n\t"
  132832. "mul r9, r8, r9\n\t"
  132833. "adds r5, r5, r9\n\t"
  132834. "adcs r6, r6, #0\n\t"
  132835. "adc r7, r7, #0\n\t"
  132836. "lsr r9, r12, #16\n\t"
  132837. "mul r8, r9, r8\n\t"
  132838. "lsr r9, r8, #16\n\t"
  132839. "lsl r8, r8, #16\n\t"
  132840. "adds r5, r5, r8\n\t"
  132841. "adcs r6, r6, r9\n\t"
  132842. "adc r7, r7, #0\n\t"
  132843. "lsr r8, r10, #16\n\t"
  132844. "lsr r9, r12, #16\n\t"
  132845. "mul r9, r8, r9\n\t"
  132846. "adds r6, r6, r9\n\t"
  132847. "adc r7, r7, #0\n\t"
  132848. "lsl r9, r12, #16\n\t"
  132849. "lsr r9, r9, #16\n\t"
  132850. "mul r8, r9, r8\n\t"
  132851. "lsr r9, r8, #16\n\t"
  132852. "lsl r8, r8, #16\n\t"
  132853. "adds r5, r5, r8\n\t"
  132854. "adcs r6, r6, r9\n\t"
  132855. "adc r7, r7, #0\n\t"
  132856. #else
  132857. "umull r8, r9, r10, r12\n\t"
  132858. "adds r5, r5, r8\n\t"
  132859. "adcs r6, r6, r9\n\t"
  132860. "adc r7, r7, #0\n\t"
  132861. #endif
  132862. /* A[3] * A[7] */
  132863. "ldr r10, [%[a], #28]\n\t"
  132864. "ldr r12, [%[a], #12]\n\t"
  132865. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132866. "lsl r8, r10, #16\n\t"
  132867. "lsl r9, r12, #16\n\t"
  132868. "lsr r8, r8, #16\n\t"
  132869. "lsr r9, r9, #16\n\t"
  132870. "mul r9, r8, r9\n\t"
  132871. "adds r5, r5, r9\n\t"
  132872. "adcs r6, r6, #0\n\t"
  132873. "adc r7, r7, #0\n\t"
  132874. "lsr r9, r12, #16\n\t"
  132875. "mul r8, r9, r8\n\t"
  132876. "lsr r9, r8, #16\n\t"
  132877. "lsl r8, r8, #16\n\t"
  132878. "adds r5, r5, r8\n\t"
  132879. "adcs r6, r6, r9\n\t"
  132880. "adc r7, r7, #0\n\t"
  132881. "lsr r8, r10, #16\n\t"
  132882. "lsr r9, r12, #16\n\t"
  132883. "mul r9, r8, r9\n\t"
  132884. "adds r6, r6, r9\n\t"
  132885. "adc r7, r7, #0\n\t"
  132886. "lsl r9, r12, #16\n\t"
  132887. "lsr r9, r9, #16\n\t"
  132888. "mul r8, r9, r8\n\t"
  132889. "lsr r9, r8, #16\n\t"
  132890. "lsl r8, r8, #16\n\t"
  132891. "adds r5, r5, r8\n\t"
  132892. "adcs r6, r6, r9\n\t"
  132893. "adc r7, r7, #0\n\t"
  132894. #else
  132895. "umull r8, r9, r10, r12\n\t"
  132896. "adds r5, r5, r8\n\t"
  132897. "adcs r6, r6, r9\n\t"
  132898. "adc r7, r7, #0\n\t"
  132899. #endif
  132900. /* A[4] * A[6] */
  132901. "ldr r10, [%[a], #24]\n\t"
  132902. "ldr r12, [%[a], #16]\n\t"
  132903. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132904. "lsl r8, r10, #16\n\t"
  132905. "lsl r9, r12, #16\n\t"
  132906. "lsr r8, r8, #16\n\t"
  132907. "lsr r9, r9, #16\n\t"
  132908. "mul r9, r8, r9\n\t"
  132909. "adds r5, r5, r9\n\t"
  132910. "adcs r6, r6, #0\n\t"
  132911. "adc r7, r7, #0\n\t"
  132912. "lsr r9, r12, #16\n\t"
  132913. "mul r8, r9, r8\n\t"
  132914. "lsr r9, r8, #16\n\t"
  132915. "lsl r8, r8, #16\n\t"
  132916. "adds r5, r5, r8\n\t"
  132917. "adcs r6, r6, r9\n\t"
  132918. "adc r7, r7, #0\n\t"
  132919. "lsr r8, r10, #16\n\t"
  132920. "lsr r9, r12, #16\n\t"
  132921. "mul r9, r8, r9\n\t"
  132922. "adds r6, r6, r9\n\t"
  132923. "adc r7, r7, #0\n\t"
  132924. "lsl r9, r12, #16\n\t"
  132925. "lsr r9, r9, #16\n\t"
  132926. "mul r8, r9, r8\n\t"
  132927. "lsr r9, r8, #16\n\t"
  132928. "lsl r8, r8, #16\n\t"
  132929. "adds r5, r5, r8\n\t"
  132930. "adcs r6, r6, r9\n\t"
  132931. "adc r7, r7, #0\n\t"
  132932. #else
  132933. "umull r8, r9, r10, r12\n\t"
  132934. "adds r5, r5, r8\n\t"
  132935. "adcs r6, r6, r9\n\t"
  132936. "adc r7, r7, #0\n\t"
  132937. #endif
  132938. /* A[5] * A[5] */
  132939. "ldr r10, [%[a], #20]\n\t"
  132940. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132941. "lsl r8, r10, #16\n\t"
  132942. "lsr r9, r10, #16\n\t"
  132943. "lsr r8, r8, #16\n\t"
  132944. "mov r12, r8\n\t"
  132945. "mul r8, r12, r8\n\t"
  132946. "mov r12, r9\n\t"
  132947. "mul r9, r12, r9\n\t"
  132948. "adds r3, r3, r8\n\t"
  132949. "adcs r4, r4, r9\n\t"
  132950. "adc r2, r2, #0\n\t"
  132951. "lsr r9, r10, #16\n\t"
  132952. "lsl r8, r10, #16\n\t"
  132953. "lsr r8, r8, #16\n\t"
  132954. "mul r8, r9, r8\n\t"
  132955. "lsr r9, r8, #15\n\t"
  132956. "lsl r8, r8, #17\n\t"
  132957. "adds r3, r3, r8\n\t"
  132958. "adcs r4, r4, r9\n\t"
  132959. "adc r2, r2, #0\n\t"
  132960. "adds r5, r5, r5\n\t"
  132961. "adcs r6, r6, r6\n\t"
  132962. "adc r7, r7, r7\n\t"
  132963. #else
  132964. "umull r8, r9, r10, r10\n\t"
  132965. "adds r5, r5, r5\n\t"
  132966. "adcs r6, r6, r6\n\t"
  132967. "adc r7, r7, r7\n\t"
  132968. "adds r3, r3, r8\n\t"
  132969. "adcs r4, r4, r9\n\t"
  132970. "adc r2, r2, #0\n\t"
  132971. #endif
  132972. "adds r3, r3, r5\n\t"
  132973. "adcs r4, r4, r6\n\t"
  132974. "adc r2, r2, r7\n\t"
  132975. "str r3, [sp, #40]\n\t"
  132976. /* A[0] * A[11] */
  132977. "ldr r10, [%[a], #44]\n\t"
  132978. "ldr r12, [%[a]]\n\t"
  132979. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  132980. "lsl r8, r10, #16\n\t"
  132981. "lsl r5, r12, #16\n\t"
  132982. "lsr r8, r8, #16\n\t"
  132983. "lsr r5, r5, #16\n\t"
  132984. "mul r5, r8, r5\n\t"
  132985. "lsr r9, r12, #16\n\t"
  132986. "mul r8, r9, r8\n\t"
  132987. "lsr r6, r8, #16\n\t"
  132988. "lsl r8, r8, #16\n\t"
  132989. "adds r5, r5, r8\n\t"
  132990. "adc r6, r6, #0\n\t"
  132991. "lsr r8, r10, #16\n\t"
  132992. "mul r9, r8, r9\n\t"
  132993. "add r6, r6, r9\n\t"
  132994. "lsl r9, r12, #16\n\t"
  132995. "lsr r9, r9, #16\n\t"
  132996. "mul r8, r9, r8\n\t"
  132997. "lsr r9, r8, #16\n\t"
  132998. "lsl r8, r8, #16\n\t"
  132999. "adds r5, r5, r8\n\t"
  133000. "adc r6, r6, r9\n\t"
  133001. #else
  133002. "umull r5, r6, r10, r12\n\t"
  133003. #endif
  133004. "mov r3, #0\n\t"
  133005. "mov r7, #0\n\t"
  133006. /* A[1] * A[10] */
  133007. "ldr r10, [%[a], #40]\n\t"
  133008. "ldr r12, [%[a], #4]\n\t"
  133009. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133010. "lsl r8, r10, #16\n\t"
  133011. "lsl r9, r12, #16\n\t"
  133012. "lsr r8, r8, #16\n\t"
  133013. "lsr r9, r9, #16\n\t"
  133014. "mul r9, r8, r9\n\t"
  133015. "adds r5, r5, r9\n\t"
  133016. "adcs r6, r6, #0\n\t"
  133017. "adc r7, r7, #0\n\t"
  133018. "lsr r9, r12, #16\n\t"
  133019. "mul r8, r9, r8\n\t"
  133020. "lsr r9, r8, #16\n\t"
  133021. "lsl r8, r8, #16\n\t"
  133022. "adds r5, r5, r8\n\t"
  133023. "adcs r6, r6, r9\n\t"
  133024. "adc r7, r7, #0\n\t"
  133025. "lsr r8, r10, #16\n\t"
  133026. "lsr r9, r12, #16\n\t"
  133027. "mul r9, r8, r9\n\t"
  133028. "adds r6, r6, r9\n\t"
  133029. "adc r7, r7, #0\n\t"
  133030. "lsl r9, r12, #16\n\t"
  133031. "lsr r9, r9, #16\n\t"
  133032. "mul r8, r9, r8\n\t"
  133033. "lsr r9, r8, #16\n\t"
  133034. "lsl r8, r8, #16\n\t"
  133035. "adds r5, r5, r8\n\t"
  133036. "adcs r6, r6, r9\n\t"
  133037. "adc r7, r7, #0\n\t"
  133038. #else
  133039. "umull r8, r9, r10, r12\n\t"
  133040. "adds r5, r5, r8\n\t"
  133041. "adcs r6, r6, r9\n\t"
  133042. "adc r7, r7, #0\n\t"
  133043. #endif
  133044. /* A[2] * A[9] */
  133045. "ldr r10, [%[a], #36]\n\t"
  133046. "ldr r12, [%[a], #8]\n\t"
  133047. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133048. "lsl r8, r10, #16\n\t"
  133049. "lsl r9, r12, #16\n\t"
  133050. "lsr r8, r8, #16\n\t"
  133051. "lsr r9, r9, #16\n\t"
  133052. "mul r9, r8, r9\n\t"
  133053. "adds r5, r5, r9\n\t"
  133054. "adcs r6, r6, #0\n\t"
  133055. "adc r7, r7, #0\n\t"
  133056. "lsr r9, r12, #16\n\t"
  133057. "mul r8, r9, r8\n\t"
  133058. "lsr r9, r8, #16\n\t"
  133059. "lsl r8, r8, #16\n\t"
  133060. "adds r5, r5, r8\n\t"
  133061. "adcs r6, r6, r9\n\t"
  133062. "adc r7, r7, #0\n\t"
  133063. "lsr r8, r10, #16\n\t"
  133064. "lsr r9, r12, #16\n\t"
  133065. "mul r9, r8, r9\n\t"
  133066. "adds r6, r6, r9\n\t"
  133067. "adc r7, r7, #0\n\t"
  133068. "lsl r9, r12, #16\n\t"
  133069. "lsr r9, r9, #16\n\t"
  133070. "mul r8, r9, r8\n\t"
  133071. "lsr r9, r8, #16\n\t"
  133072. "lsl r8, r8, #16\n\t"
  133073. "adds r5, r5, r8\n\t"
  133074. "adcs r6, r6, r9\n\t"
  133075. "adc r7, r7, #0\n\t"
  133076. #else
  133077. "umull r8, r9, r10, r12\n\t"
  133078. "adds r5, r5, r8\n\t"
  133079. "adcs r6, r6, r9\n\t"
  133080. "adc r7, r7, #0\n\t"
  133081. #endif
  133082. /* A[3] * A[8] */
  133083. "ldr r10, [%[a], #32]\n\t"
  133084. "ldr r12, [%[a], #12]\n\t"
  133085. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133086. "lsl r8, r10, #16\n\t"
  133087. "lsl r9, r12, #16\n\t"
  133088. "lsr r8, r8, #16\n\t"
  133089. "lsr r9, r9, #16\n\t"
  133090. "mul r9, r8, r9\n\t"
  133091. "adds r5, r5, r9\n\t"
  133092. "adcs r6, r6, #0\n\t"
  133093. "adc r7, r7, #0\n\t"
  133094. "lsr r9, r12, #16\n\t"
  133095. "mul r8, r9, r8\n\t"
  133096. "lsr r9, r8, #16\n\t"
  133097. "lsl r8, r8, #16\n\t"
  133098. "adds r5, r5, r8\n\t"
  133099. "adcs r6, r6, r9\n\t"
  133100. "adc r7, r7, #0\n\t"
  133101. "lsr r8, r10, #16\n\t"
  133102. "lsr r9, r12, #16\n\t"
  133103. "mul r9, r8, r9\n\t"
  133104. "adds r6, r6, r9\n\t"
  133105. "adc r7, r7, #0\n\t"
  133106. "lsl r9, r12, #16\n\t"
  133107. "lsr r9, r9, #16\n\t"
  133108. "mul r8, r9, r8\n\t"
  133109. "lsr r9, r8, #16\n\t"
  133110. "lsl r8, r8, #16\n\t"
  133111. "adds r5, r5, r8\n\t"
  133112. "adcs r6, r6, r9\n\t"
  133113. "adc r7, r7, #0\n\t"
  133114. #else
  133115. "umull r8, r9, r10, r12\n\t"
  133116. "adds r5, r5, r8\n\t"
  133117. "adcs r6, r6, r9\n\t"
  133118. "adc r7, r7, #0\n\t"
  133119. #endif
  133120. /* A[4] * A[7] */
  133121. "ldr r10, [%[a], #28]\n\t"
  133122. "ldr r12, [%[a], #16]\n\t"
  133123. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133124. "lsl r8, r10, #16\n\t"
  133125. "lsl r9, r12, #16\n\t"
  133126. "lsr r8, r8, #16\n\t"
  133127. "lsr r9, r9, #16\n\t"
  133128. "mul r9, r8, r9\n\t"
  133129. "adds r5, r5, r9\n\t"
  133130. "adcs r6, r6, #0\n\t"
  133131. "adc r7, r7, #0\n\t"
  133132. "lsr r9, r12, #16\n\t"
  133133. "mul r8, r9, r8\n\t"
  133134. "lsr r9, r8, #16\n\t"
  133135. "lsl r8, r8, #16\n\t"
  133136. "adds r5, r5, r8\n\t"
  133137. "adcs r6, r6, r9\n\t"
  133138. "adc r7, r7, #0\n\t"
  133139. "lsr r8, r10, #16\n\t"
  133140. "lsr r9, r12, #16\n\t"
  133141. "mul r9, r8, r9\n\t"
  133142. "adds r6, r6, r9\n\t"
  133143. "adc r7, r7, #0\n\t"
  133144. "lsl r9, r12, #16\n\t"
  133145. "lsr r9, r9, #16\n\t"
  133146. "mul r8, r9, r8\n\t"
  133147. "lsr r9, r8, #16\n\t"
  133148. "lsl r8, r8, #16\n\t"
  133149. "adds r5, r5, r8\n\t"
  133150. "adcs r6, r6, r9\n\t"
  133151. "adc r7, r7, #0\n\t"
  133152. #else
  133153. "umull r8, r9, r10, r12\n\t"
  133154. "adds r5, r5, r8\n\t"
  133155. "adcs r6, r6, r9\n\t"
  133156. "adc r7, r7, #0\n\t"
  133157. #endif
  133158. /* A[5] * A[6] */
  133159. "ldr r10, [%[a], #24]\n\t"
  133160. "ldr r12, [%[a], #20]\n\t"
  133161. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133162. "lsl r8, r10, #16\n\t"
  133163. "lsl r9, r12, #16\n\t"
  133164. "lsr r8, r8, #16\n\t"
  133165. "lsr r9, r9, #16\n\t"
  133166. "mul r9, r8, r9\n\t"
  133167. "adds r5, r5, r9\n\t"
  133168. "adcs r6, r6, #0\n\t"
  133169. "adc r7, r7, #0\n\t"
  133170. "lsr r9, r12, #16\n\t"
  133171. "mul r8, r9, r8\n\t"
  133172. "lsr r9, r8, #16\n\t"
  133173. "lsl r8, r8, #16\n\t"
  133174. "adds r5, r5, r8\n\t"
  133175. "adcs r6, r6, r9\n\t"
  133176. "adc r7, r7, #0\n\t"
  133177. "lsr r8, r10, #16\n\t"
  133178. "lsr r9, r12, #16\n\t"
  133179. "mul r9, r8, r9\n\t"
  133180. "adds r6, r6, r9\n\t"
  133181. "adc r7, r7, #0\n\t"
  133182. "lsl r9, r12, #16\n\t"
  133183. "lsr r9, r9, #16\n\t"
  133184. "mul r8, r9, r8\n\t"
  133185. "lsr r9, r8, #16\n\t"
  133186. "lsl r8, r8, #16\n\t"
  133187. "adds r5, r5, r8\n\t"
  133188. "adcs r6, r6, r9\n\t"
  133189. "adc r7, r7, #0\n\t"
  133190. #else
  133191. "umull r8, r9, r10, r12\n\t"
  133192. "adds r5, r5, r8\n\t"
  133193. "adcs r6, r6, r9\n\t"
  133194. "adc r7, r7, #0\n\t"
  133195. #endif
  133196. "adds r5, r5, r5\n\t"
  133197. "adcs r6, r6, r6\n\t"
  133198. "adc r7, r7, r7\n\t"
  133199. "adds r4, r4, r5\n\t"
  133200. "adcs r2, r2, r6\n\t"
  133201. "adc r3, r3, r7\n\t"
  133202. "str r4, [sp, #44]\n\t"
  133203. /* A[0] * A[12] */
  133204. "ldr r10, [%[a], #48]\n\t"
  133205. "ldr r12, [%[a]]\n\t"
  133206. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133207. "lsl r8, r10, #16\n\t"
  133208. "lsl r5, r12, #16\n\t"
  133209. "lsr r8, r8, #16\n\t"
  133210. "lsr r5, r5, #16\n\t"
  133211. "mul r5, r8, r5\n\t"
  133212. "lsr r9, r12, #16\n\t"
  133213. "mul r8, r9, r8\n\t"
  133214. "lsr r6, r8, #16\n\t"
  133215. "lsl r8, r8, #16\n\t"
  133216. "adds r5, r5, r8\n\t"
  133217. "adc r6, r6, #0\n\t"
  133218. "lsr r8, r10, #16\n\t"
  133219. "mul r9, r8, r9\n\t"
  133220. "add r6, r6, r9\n\t"
  133221. "lsl r9, r12, #16\n\t"
  133222. "lsr r9, r9, #16\n\t"
  133223. "mul r8, r9, r8\n\t"
  133224. "lsr r9, r8, #16\n\t"
  133225. "lsl r8, r8, #16\n\t"
  133226. "adds r5, r5, r8\n\t"
  133227. "adc r6, r6, r9\n\t"
  133228. #else
  133229. "umull r5, r6, r10, r12\n\t"
  133230. #endif
  133231. "mov r4, #0\n\t"
  133232. "mov r7, #0\n\t"
  133233. /* A[1] * A[11] */
  133234. "ldr r10, [%[a], #44]\n\t"
  133235. "ldr r12, [%[a], #4]\n\t"
  133236. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133237. "lsl r8, r10, #16\n\t"
  133238. "lsl r9, r12, #16\n\t"
  133239. "lsr r8, r8, #16\n\t"
  133240. "lsr r9, r9, #16\n\t"
  133241. "mul r9, r8, r9\n\t"
  133242. "adds r5, r5, r9\n\t"
  133243. "adcs r6, r6, #0\n\t"
  133244. "adc r7, r7, #0\n\t"
  133245. "lsr r9, r12, #16\n\t"
  133246. "mul r8, r9, r8\n\t"
  133247. "lsr r9, r8, #16\n\t"
  133248. "lsl r8, r8, #16\n\t"
  133249. "adds r5, r5, r8\n\t"
  133250. "adcs r6, r6, r9\n\t"
  133251. "adc r7, r7, #0\n\t"
  133252. "lsr r8, r10, #16\n\t"
  133253. "lsr r9, r12, #16\n\t"
  133254. "mul r9, r8, r9\n\t"
  133255. "adds r6, r6, r9\n\t"
  133256. "adc r7, r7, #0\n\t"
  133257. "lsl r9, r12, #16\n\t"
  133258. "lsr r9, r9, #16\n\t"
  133259. "mul r8, r9, r8\n\t"
  133260. "lsr r9, r8, #16\n\t"
  133261. "lsl r8, r8, #16\n\t"
  133262. "adds r5, r5, r8\n\t"
  133263. "adcs r6, r6, r9\n\t"
  133264. "adc r7, r7, #0\n\t"
  133265. #else
  133266. "umull r8, r9, r10, r12\n\t"
  133267. "adds r5, r5, r8\n\t"
  133268. "adcs r6, r6, r9\n\t"
  133269. "adc r7, r7, #0\n\t"
  133270. #endif
  133271. /* A[2] * A[10] */
  133272. "ldr r10, [%[a], #40]\n\t"
  133273. "ldr r12, [%[a], #8]\n\t"
  133274. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133275. "lsl r8, r10, #16\n\t"
  133276. "lsl r9, r12, #16\n\t"
  133277. "lsr r8, r8, #16\n\t"
  133278. "lsr r9, r9, #16\n\t"
  133279. "mul r9, r8, r9\n\t"
  133280. "adds r5, r5, r9\n\t"
  133281. "adcs r6, r6, #0\n\t"
  133282. "adc r7, r7, #0\n\t"
  133283. "lsr r9, r12, #16\n\t"
  133284. "mul r8, r9, r8\n\t"
  133285. "lsr r9, r8, #16\n\t"
  133286. "lsl r8, r8, #16\n\t"
  133287. "adds r5, r5, r8\n\t"
  133288. "adcs r6, r6, r9\n\t"
  133289. "adc r7, r7, #0\n\t"
  133290. "lsr r8, r10, #16\n\t"
  133291. "lsr r9, r12, #16\n\t"
  133292. "mul r9, r8, r9\n\t"
  133293. "adds r6, r6, r9\n\t"
  133294. "adc r7, r7, #0\n\t"
  133295. "lsl r9, r12, #16\n\t"
  133296. "lsr r9, r9, #16\n\t"
  133297. "mul r8, r9, r8\n\t"
  133298. "lsr r9, r8, #16\n\t"
  133299. "lsl r8, r8, #16\n\t"
  133300. "adds r5, r5, r8\n\t"
  133301. "adcs r6, r6, r9\n\t"
  133302. "adc r7, r7, #0\n\t"
  133303. #else
  133304. "umull r8, r9, r10, r12\n\t"
  133305. "adds r5, r5, r8\n\t"
  133306. "adcs r6, r6, r9\n\t"
  133307. "adc r7, r7, #0\n\t"
  133308. #endif
  133309. /* A[3] * A[9] */
  133310. "ldr r10, [%[a], #36]\n\t"
  133311. "ldr r12, [%[a], #12]\n\t"
  133312. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133313. "lsl r8, r10, #16\n\t"
  133314. "lsl r9, r12, #16\n\t"
  133315. "lsr r8, r8, #16\n\t"
  133316. "lsr r9, r9, #16\n\t"
  133317. "mul r9, r8, r9\n\t"
  133318. "adds r5, r5, r9\n\t"
  133319. "adcs r6, r6, #0\n\t"
  133320. "adc r7, r7, #0\n\t"
  133321. "lsr r9, r12, #16\n\t"
  133322. "mul r8, r9, r8\n\t"
  133323. "lsr r9, r8, #16\n\t"
  133324. "lsl r8, r8, #16\n\t"
  133325. "adds r5, r5, r8\n\t"
  133326. "adcs r6, r6, r9\n\t"
  133327. "adc r7, r7, #0\n\t"
  133328. "lsr r8, r10, #16\n\t"
  133329. "lsr r9, r12, #16\n\t"
  133330. "mul r9, r8, r9\n\t"
  133331. "adds r6, r6, r9\n\t"
  133332. "adc r7, r7, #0\n\t"
  133333. "lsl r9, r12, #16\n\t"
  133334. "lsr r9, r9, #16\n\t"
  133335. "mul r8, r9, r8\n\t"
  133336. "lsr r9, r8, #16\n\t"
  133337. "lsl r8, r8, #16\n\t"
  133338. "adds r5, r5, r8\n\t"
  133339. "adcs r6, r6, r9\n\t"
  133340. "adc r7, r7, #0\n\t"
  133341. #else
  133342. "umull r8, r9, r10, r12\n\t"
  133343. "adds r5, r5, r8\n\t"
  133344. "adcs r6, r6, r9\n\t"
  133345. "adc r7, r7, #0\n\t"
  133346. #endif
  133347. /* A[4] * A[8] */
  133348. "ldr r10, [%[a], #32]\n\t"
  133349. "ldr r12, [%[a], #16]\n\t"
  133350. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133351. "lsl r8, r10, #16\n\t"
  133352. "lsl r9, r12, #16\n\t"
  133353. "lsr r8, r8, #16\n\t"
  133354. "lsr r9, r9, #16\n\t"
  133355. "mul r9, r8, r9\n\t"
  133356. "adds r5, r5, r9\n\t"
  133357. "adcs r6, r6, #0\n\t"
  133358. "adc r7, r7, #0\n\t"
  133359. "lsr r9, r12, #16\n\t"
  133360. "mul r8, r9, r8\n\t"
  133361. "lsr r9, r8, #16\n\t"
  133362. "lsl r8, r8, #16\n\t"
  133363. "adds r5, r5, r8\n\t"
  133364. "adcs r6, r6, r9\n\t"
  133365. "adc r7, r7, #0\n\t"
  133366. "lsr r8, r10, #16\n\t"
  133367. "lsr r9, r12, #16\n\t"
  133368. "mul r9, r8, r9\n\t"
  133369. "adds r6, r6, r9\n\t"
  133370. "adc r7, r7, #0\n\t"
  133371. "lsl r9, r12, #16\n\t"
  133372. "lsr r9, r9, #16\n\t"
  133373. "mul r8, r9, r8\n\t"
  133374. "lsr r9, r8, #16\n\t"
  133375. "lsl r8, r8, #16\n\t"
  133376. "adds r5, r5, r8\n\t"
  133377. "adcs r6, r6, r9\n\t"
  133378. "adc r7, r7, #0\n\t"
  133379. #else
  133380. "umull r8, r9, r10, r12\n\t"
  133381. "adds r5, r5, r8\n\t"
  133382. "adcs r6, r6, r9\n\t"
  133383. "adc r7, r7, #0\n\t"
  133384. #endif
  133385. /* A[5] * A[7] */
  133386. "ldr r10, [%[a], #28]\n\t"
  133387. "ldr r12, [%[a], #20]\n\t"
  133388. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133389. "lsl r8, r10, #16\n\t"
  133390. "lsl r9, r12, #16\n\t"
  133391. "lsr r8, r8, #16\n\t"
  133392. "lsr r9, r9, #16\n\t"
  133393. "mul r9, r8, r9\n\t"
  133394. "adds r5, r5, r9\n\t"
  133395. "adcs r6, r6, #0\n\t"
  133396. "adc r7, r7, #0\n\t"
  133397. "lsr r9, r12, #16\n\t"
  133398. "mul r8, r9, r8\n\t"
  133399. "lsr r9, r8, #16\n\t"
  133400. "lsl r8, r8, #16\n\t"
  133401. "adds r5, r5, r8\n\t"
  133402. "adcs r6, r6, r9\n\t"
  133403. "adc r7, r7, #0\n\t"
  133404. "lsr r8, r10, #16\n\t"
  133405. "lsr r9, r12, #16\n\t"
  133406. "mul r9, r8, r9\n\t"
  133407. "adds r6, r6, r9\n\t"
  133408. "adc r7, r7, #0\n\t"
  133409. "lsl r9, r12, #16\n\t"
  133410. "lsr r9, r9, #16\n\t"
  133411. "mul r8, r9, r8\n\t"
  133412. "lsr r9, r8, #16\n\t"
  133413. "lsl r8, r8, #16\n\t"
  133414. "adds r5, r5, r8\n\t"
  133415. "adcs r6, r6, r9\n\t"
  133416. "adc r7, r7, #0\n\t"
  133417. #else
  133418. "umull r8, r9, r10, r12\n\t"
  133419. "adds r5, r5, r8\n\t"
  133420. "adcs r6, r6, r9\n\t"
  133421. "adc r7, r7, #0\n\t"
  133422. #endif
  133423. /* A[6] * A[6] */
  133424. "ldr r10, [%[a], #24]\n\t"
  133425. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133426. "lsl r8, r10, #16\n\t"
  133427. "lsr r9, r10, #16\n\t"
  133428. "lsr r8, r8, #16\n\t"
  133429. "mov r12, r8\n\t"
  133430. "mul r8, r12, r8\n\t"
  133431. "mov r12, r9\n\t"
  133432. "mul r9, r12, r9\n\t"
  133433. "adds r2, r2, r8\n\t"
  133434. "adcs r3, r3, r9\n\t"
  133435. "adc r4, r4, #0\n\t"
  133436. "lsr r9, r10, #16\n\t"
  133437. "lsl r8, r10, #16\n\t"
  133438. "lsr r8, r8, #16\n\t"
  133439. "mul r8, r9, r8\n\t"
  133440. "lsr r9, r8, #15\n\t"
  133441. "lsl r8, r8, #17\n\t"
  133442. "adds r2, r2, r8\n\t"
  133443. "adcs r3, r3, r9\n\t"
  133444. "adc r4, r4, #0\n\t"
  133445. "adds r5, r5, r5\n\t"
  133446. "adcs r6, r6, r6\n\t"
  133447. "adc r7, r7, r7\n\t"
  133448. #else
  133449. "umull r8, r9, r10, r10\n\t"
  133450. "adds r5, r5, r5\n\t"
  133451. "adcs r6, r6, r6\n\t"
  133452. "adc r7, r7, r7\n\t"
  133453. "adds r2, r2, r8\n\t"
  133454. "adcs r3, r3, r9\n\t"
  133455. "adc r4, r4, #0\n\t"
  133456. #endif
  133457. "adds r2, r2, r5\n\t"
  133458. "adcs r3, r3, r6\n\t"
  133459. "adc r4, r4, r7\n\t"
  133460. "str r2, [sp, #48]\n\t"
  133461. /* A[0] * A[13] */
  133462. "ldr r10, [%[a], #52]\n\t"
  133463. "ldr r12, [%[a]]\n\t"
  133464. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133465. "lsl r8, r10, #16\n\t"
  133466. "lsl r5, r12, #16\n\t"
  133467. "lsr r8, r8, #16\n\t"
  133468. "lsr r5, r5, #16\n\t"
  133469. "mul r5, r8, r5\n\t"
  133470. "lsr r9, r12, #16\n\t"
  133471. "mul r8, r9, r8\n\t"
  133472. "lsr r6, r8, #16\n\t"
  133473. "lsl r8, r8, #16\n\t"
  133474. "adds r5, r5, r8\n\t"
  133475. "adc r6, r6, #0\n\t"
  133476. "lsr r8, r10, #16\n\t"
  133477. "mul r9, r8, r9\n\t"
  133478. "add r6, r6, r9\n\t"
  133479. "lsl r9, r12, #16\n\t"
  133480. "lsr r9, r9, #16\n\t"
  133481. "mul r8, r9, r8\n\t"
  133482. "lsr r9, r8, #16\n\t"
  133483. "lsl r8, r8, #16\n\t"
  133484. "adds r5, r5, r8\n\t"
  133485. "adc r6, r6, r9\n\t"
  133486. #else
  133487. "umull r5, r6, r10, r12\n\t"
  133488. #endif
  133489. "mov r2, #0\n\t"
  133490. "mov r7, #0\n\t"
  133491. /* A[1] * A[12] */
  133492. "ldr r10, [%[a], #48]\n\t"
  133493. "ldr r12, [%[a], #4]\n\t"
  133494. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133495. "lsl r8, r10, #16\n\t"
  133496. "lsl r9, r12, #16\n\t"
  133497. "lsr r8, r8, #16\n\t"
  133498. "lsr r9, r9, #16\n\t"
  133499. "mul r9, r8, r9\n\t"
  133500. "adds r5, r5, r9\n\t"
  133501. "adcs r6, r6, #0\n\t"
  133502. "adc r7, r7, #0\n\t"
  133503. "lsr r9, r12, #16\n\t"
  133504. "mul r8, r9, r8\n\t"
  133505. "lsr r9, r8, #16\n\t"
  133506. "lsl r8, r8, #16\n\t"
  133507. "adds r5, r5, r8\n\t"
  133508. "adcs r6, r6, r9\n\t"
  133509. "adc r7, r7, #0\n\t"
  133510. "lsr r8, r10, #16\n\t"
  133511. "lsr r9, r12, #16\n\t"
  133512. "mul r9, r8, r9\n\t"
  133513. "adds r6, r6, r9\n\t"
  133514. "adc r7, r7, #0\n\t"
  133515. "lsl r9, r12, #16\n\t"
  133516. "lsr r9, r9, #16\n\t"
  133517. "mul r8, r9, r8\n\t"
  133518. "lsr r9, r8, #16\n\t"
  133519. "lsl r8, r8, #16\n\t"
  133520. "adds r5, r5, r8\n\t"
  133521. "adcs r6, r6, r9\n\t"
  133522. "adc r7, r7, #0\n\t"
  133523. #else
  133524. "umull r8, r9, r10, r12\n\t"
  133525. "adds r5, r5, r8\n\t"
  133526. "adcs r6, r6, r9\n\t"
  133527. "adc r7, r7, #0\n\t"
  133528. #endif
  133529. /* A[2] * A[11] */
  133530. "ldr r10, [%[a], #44]\n\t"
  133531. "ldr r12, [%[a], #8]\n\t"
  133532. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133533. "lsl r8, r10, #16\n\t"
  133534. "lsl r9, r12, #16\n\t"
  133535. "lsr r8, r8, #16\n\t"
  133536. "lsr r9, r9, #16\n\t"
  133537. "mul r9, r8, r9\n\t"
  133538. "adds r5, r5, r9\n\t"
  133539. "adcs r6, r6, #0\n\t"
  133540. "adc r7, r7, #0\n\t"
  133541. "lsr r9, r12, #16\n\t"
  133542. "mul r8, r9, r8\n\t"
  133543. "lsr r9, r8, #16\n\t"
  133544. "lsl r8, r8, #16\n\t"
  133545. "adds r5, r5, r8\n\t"
  133546. "adcs r6, r6, r9\n\t"
  133547. "adc r7, r7, #0\n\t"
  133548. "lsr r8, r10, #16\n\t"
  133549. "lsr r9, r12, #16\n\t"
  133550. "mul r9, r8, r9\n\t"
  133551. "adds r6, r6, r9\n\t"
  133552. "adc r7, r7, #0\n\t"
  133553. "lsl r9, r12, #16\n\t"
  133554. "lsr r9, r9, #16\n\t"
  133555. "mul r8, r9, r8\n\t"
  133556. "lsr r9, r8, #16\n\t"
  133557. "lsl r8, r8, #16\n\t"
  133558. "adds r5, r5, r8\n\t"
  133559. "adcs r6, r6, r9\n\t"
  133560. "adc r7, r7, #0\n\t"
  133561. #else
  133562. "umull r8, r9, r10, r12\n\t"
  133563. "adds r5, r5, r8\n\t"
  133564. "adcs r6, r6, r9\n\t"
  133565. "adc r7, r7, #0\n\t"
  133566. #endif
  133567. /* A[3] * A[10] */
  133568. "ldr r10, [%[a], #40]\n\t"
  133569. "ldr r12, [%[a], #12]\n\t"
  133570. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133571. "lsl r8, r10, #16\n\t"
  133572. "lsl r9, r12, #16\n\t"
  133573. "lsr r8, r8, #16\n\t"
  133574. "lsr r9, r9, #16\n\t"
  133575. "mul r9, r8, r9\n\t"
  133576. "adds r5, r5, r9\n\t"
  133577. "adcs r6, r6, #0\n\t"
  133578. "adc r7, r7, #0\n\t"
  133579. "lsr r9, r12, #16\n\t"
  133580. "mul r8, r9, r8\n\t"
  133581. "lsr r9, r8, #16\n\t"
  133582. "lsl r8, r8, #16\n\t"
  133583. "adds r5, r5, r8\n\t"
  133584. "adcs r6, r6, r9\n\t"
  133585. "adc r7, r7, #0\n\t"
  133586. "lsr r8, r10, #16\n\t"
  133587. "lsr r9, r12, #16\n\t"
  133588. "mul r9, r8, r9\n\t"
  133589. "adds r6, r6, r9\n\t"
  133590. "adc r7, r7, #0\n\t"
  133591. "lsl r9, r12, #16\n\t"
  133592. "lsr r9, r9, #16\n\t"
  133593. "mul r8, r9, r8\n\t"
  133594. "lsr r9, r8, #16\n\t"
  133595. "lsl r8, r8, #16\n\t"
  133596. "adds r5, r5, r8\n\t"
  133597. "adcs r6, r6, r9\n\t"
  133598. "adc r7, r7, #0\n\t"
  133599. #else
  133600. "umull r8, r9, r10, r12\n\t"
  133601. "adds r5, r5, r8\n\t"
  133602. "adcs r6, r6, r9\n\t"
  133603. "adc r7, r7, #0\n\t"
  133604. #endif
  133605. /* A[4] * A[9] */
  133606. "ldr r10, [%[a], #36]\n\t"
  133607. "ldr r12, [%[a], #16]\n\t"
  133608. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133609. "lsl r8, r10, #16\n\t"
  133610. "lsl r9, r12, #16\n\t"
  133611. "lsr r8, r8, #16\n\t"
  133612. "lsr r9, r9, #16\n\t"
  133613. "mul r9, r8, r9\n\t"
  133614. "adds r5, r5, r9\n\t"
  133615. "adcs r6, r6, #0\n\t"
  133616. "adc r7, r7, #0\n\t"
  133617. "lsr r9, r12, #16\n\t"
  133618. "mul r8, r9, r8\n\t"
  133619. "lsr r9, r8, #16\n\t"
  133620. "lsl r8, r8, #16\n\t"
  133621. "adds r5, r5, r8\n\t"
  133622. "adcs r6, r6, r9\n\t"
  133623. "adc r7, r7, #0\n\t"
  133624. "lsr r8, r10, #16\n\t"
  133625. "lsr r9, r12, #16\n\t"
  133626. "mul r9, r8, r9\n\t"
  133627. "adds r6, r6, r9\n\t"
  133628. "adc r7, r7, #0\n\t"
  133629. "lsl r9, r12, #16\n\t"
  133630. "lsr r9, r9, #16\n\t"
  133631. "mul r8, r9, r8\n\t"
  133632. "lsr r9, r8, #16\n\t"
  133633. "lsl r8, r8, #16\n\t"
  133634. "adds r5, r5, r8\n\t"
  133635. "adcs r6, r6, r9\n\t"
  133636. "adc r7, r7, #0\n\t"
  133637. #else
  133638. "umull r8, r9, r10, r12\n\t"
  133639. "adds r5, r5, r8\n\t"
  133640. "adcs r6, r6, r9\n\t"
  133641. "adc r7, r7, #0\n\t"
  133642. #endif
  133643. /* A[5] * A[8] */
  133644. "ldr r10, [%[a], #32]\n\t"
  133645. "ldr r12, [%[a], #20]\n\t"
  133646. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133647. "lsl r8, r10, #16\n\t"
  133648. "lsl r9, r12, #16\n\t"
  133649. "lsr r8, r8, #16\n\t"
  133650. "lsr r9, r9, #16\n\t"
  133651. "mul r9, r8, r9\n\t"
  133652. "adds r5, r5, r9\n\t"
  133653. "adcs r6, r6, #0\n\t"
  133654. "adc r7, r7, #0\n\t"
  133655. "lsr r9, r12, #16\n\t"
  133656. "mul r8, r9, r8\n\t"
  133657. "lsr r9, r8, #16\n\t"
  133658. "lsl r8, r8, #16\n\t"
  133659. "adds r5, r5, r8\n\t"
  133660. "adcs r6, r6, r9\n\t"
  133661. "adc r7, r7, #0\n\t"
  133662. "lsr r8, r10, #16\n\t"
  133663. "lsr r9, r12, #16\n\t"
  133664. "mul r9, r8, r9\n\t"
  133665. "adds r6, r6, r9\n\t"
  133666. "adc r7, r7, #0\n\t"
  133667. "lsl r9, r12, #16\n\t"
  133668. "lsr r9, r9, #16\n\t"
  133669. "mul r8, r9, r8\n\t"
  133670. "lsr r9, r8, #16\n\t"
  133671. "lsl r8, r8, #16\n\t"
  133672. "adds r5, r5, r8\n\t"
  133673. "adcs r6, r6, r9\n\t"
  133674. "adc r7, r7, #0\n\t"
  133675. #else
  133676. "umull r8, r9, r10, r12\n\t"
  133677. "adds r5, r5, r8\n\t"
  133678. "adcs r6, r6, r9\n\t"
  133679. "adc r7, r7, #0\n\t"
  133680. #endif
  133681. /* A[6] * A[7] */
  133682. "ldr r10, [%[a], #28]\n\t"
  133683. "ldr r12, [%[a], #24]\n\t"
  133684. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133685. "lsl r8, r10, #16\n\t"
  133686. "lsl r9, r12, #16\n\t"
  133687. "lsr r8, r8, #16\n\t"
  133688. "lsr r9, r9, #16\n\t"
  133689. "mul r9, r8, r9\n\t"
  133690. "adds r5, r5, r9\n\t"
  133691. "adcs r6, r6, #0\n\t"
  133692. "adc r7, r7, #0\n\t"
  133693. "lsr r9, r12, #16\n\t"
  133694. "mul r8, r9, r8\n\t"
  133695. "lsr r9, r8, #16\n\t"
  133696. "lsl r8, r8, #16\n\t"
  133697. "adds r5, r5, r8\n\t"
  133698. "adcs r6, r6, r9\n\t"
  133699. "adc r7, r7, #0\n\t"
  133700. "lsr r8, r10, #16\n\t"
  133701. "lsr r9, r12, #16\n\t"
  133702. "mul r9, r8, r9\n\t"
  133703. "adds r6, r6, r9\n\t"
  133704. "adc r7, r7, #0\n\t"
  133705. "lsl r9, r12, #16\n\t"
  133706. "lsr r9, r9, #16\n\t"
  133707. "mul r8, r9, r8\n\t"
  133708. "lsr r9, r8, #16\n\t"
  133709. "lsl r8, r8, #16\n\t"
  133710. "adds r5, r5, r8\n\t"
  133711. "adcs r6, r6, r9\n\t"
  133712. "adc r7, r7, #0\n\t"
  133713. #else
  133714. "umull r8, r9, r10, r12\n\t"
  133715. "adds r5, r5, r8\n\t"
  133716. "adcs r6, r6, r9\n\t"
  133717. "adc r7, r7, #0\n\t"
  133718. #endif
  133719. "adds r5, r5, r5\n\t"
  133720. "adcs r6, r6, r6\n\t"
  133721. "adc r7, r7, r7\n\t"
  133722. "adds r3, r3, r5\n\t"
  133723. "adcs r4, r4, r6\n\t"
  133724. "adc r2, r2, r7\n\t"
  133725. "str r3, [sp, #52]\n\t"
  133726. /* A[0] * A[14] */
  133727. "ldr r10, [%[a], #56]\n\t"
  133728. "ldr r12, [%[a]]\n\t"
  133729. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133730. "lsl r8, r10, #16\n\t"
  133731. "lsl r5, r12, #16\n\t"
  133732. "lsr r8, r8, #16\n\t"
  133733. "lsr r5, r5, #16\n\t"
  133734. "mul r5, r8, r5\n\t"
  133735. "lsr r9, r12, #16\n\t"
  133736. "mul r8, r9, r8\n\t"
  133737. "lsr r6, r8, #16\n\t"
  133738. "lsl r8, r8, #16\n\t"
  133739. "adds r5, r5, r8\n\t"
  133740. "adc r6, r6, #0\n\t"
  133741. "lsr r8, r10, #16\n\t"
  133742. "mul r9, r8, r9\n\t"
  133743. "add r6, r6, r9\n\t"
  133744. "lsl r9, r12, #16\n\t"
  133745. "lsr r9, r9, #16\n\t"
  133746. "mul r8, r9, r8\n\t"
  133747. "lsr r9, r8, #16\n\t"
  133748. "lsl r8, r8, #16\n\t"
  133749. "adds r5, r5, r8\n\t"
  133750. "adc r6, r6, r9\n\t"
  133751. #else
  133752. "umull r5, r6, r10, r12\n\t"
  133753. #endif
  133754. "mov r3, #0\n\t"
  133755. "mov r7, #0\n\t"
  133756. /* A[1] * A[13] */
  133757. "ldr r10, [%[a], #52]\n\t"
  133758. "ldr r12, [%[a], #4]\n\t"
  133759. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133760. "lsl r8, r10, #16\n\t"
  133761. "lsl r9, r12, #16\n\t"
  133762. "lsr r8, r8, #16\n\t"
  133763. "lsr r9, r9, #16\n\t"
  133764. "mul r9, r8, r9\n\t"
  133765. "adds r5, r5, r9\n\t"
  133766. "adcs r6, r6, #0\n\t"
  133767. "adc r7, r7, #0\n\t"
  133768. "lsr r9, r12, #16\n\t"
  133769. "mul r8, r9, r8\n\t"
  133770. "lsr r9, r8, #16\n\t"
  133771. "lsl r8, r8, #16\n\t"
  133772. "adds r5, r5, r8\n\t"
  133773. "adcs r6, r6, r9\n\t"
  133774. "adc r7, r7, #0\n\t"
  133775. "lsr r8, r10, #16\n\t"
  133776. "lsr r9, r12, #16\n\t"
  133777. "mul r9, r8, r9\n\t"
  133778. "adds r6, r6, r9\n\t"
  133779. "adc r7, r7, #0\n\t"
  133780. "lsl r9, r12, #16\n\t"
  133781. "lsr r9, r9, #16\n\t"
  133782. "mul r8, r9, r8\n\t"
  133783. "lsr r9, r8, #16\n\t"
  133784. "lsl r8, r8, #16\n\t"
  133785. "adds r5, r5, r8\n\t"
  133786. "adcs r6, r6, r9\n\t"
  133787. "adc r7, r7, #0\n\t"
  133788. #else
  133789. "umull r8, r9, r10, r12\n\t"
  133790. "adds r5, r5, r8\n\t"
  133791. "adcs r6, r6, r9\n\t"
  133792. "adc r7, r7, #0\n\t"
  133793. #endif
  133794. /* A[2] * A[12] */
  133795. "ldr r10, [%[a], #48]\n\t"
  133796. "ldr r12, [%[a], #8]\n\t"
  133797. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133798. "lsl r8, r10, #16\n\t"
  133799. "lsl r9, r12, #16\n\t"
  133800. "lsr r8, r8, #16\n\t"
  133801. "lsr r9, r9, #16\n\t"
  133802. "mul r9, r8, r9\n\t"
  133803. "adds r5, r5, r9\n\t"
  133804. "adcs r6, r6, #0\n\t"
  133805. "adc r7, r7, #0\n\t"
  133806. "lsr r9, r12, #16\n\t"
  133807. "mul r8, r9, r8\n\t"
  133808. "lsr r9, r8, #16\n\t"
  133809. "lsl r8, r8, #16\n\t"
  133810. "adds r5, r5, r8\n\t"
  133811. "adcs r6, r6, r9\n\t"
  133812. "adc r7, r7, #0\n\t"
  133813. "lsr r8, r10, #16\n\t"
  133814. "lsr r9, r12, #16\n\t"
  133815. "mul r9, r8, r9\n\t"
  133816. "adds r6, r6, r9\n\t"
  133817. "adc r7, r7, #0\n\t"
  133818. "lsl r9, r12, #16\n\t"
  133819. "lsr r9, r9, #16\n\t"
  133820. "mul r8, r9, r8\n\t"
  133821. "lsr r9, r8, #16\n\t"
  133822. "lsl r8, r8, #16\n\t"
  133823. "adds r5, r5, r8\n\t"
  133824. "adcs r6, r6, r9\n\t"
  133825. "adc r7, r7, #0\n\t"
  133826. #else
  133827. "umull r8, r9, r10, r12\n\t"
  133828. "adds r5, r5, r8\n\t"
  133829. "adcs r6, r6, r9\n\t"
  133830. "adc r7, r7, #0\n\t"
  133831. #endif
  133832. /* A[3] * A[11] */
  133833. "ldr r10, [%[a], #44]\n\t"
  133834. "ldr r12, [%[a], #12]\n\t"
  133835. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133836. "lsl r8, r10, #16\n\t"
  133837. "lsl r9, r12, #16\n\t"
  133838. "lsr r8, r8, #16\n\t"
  133839. "lsr r9, r9, #16\n\t"
  133840. "mul r9, r8, r9\n\t"
  133841. "adds r5, r5, r9\n\t"
  133842. "adcs r6, r6, #0\n\t"
  133843. "adc r7, r7, #0\n\t"
  133844. "lsr r9, r12, #16\n\t"
  133845. "mul r8, r9, r8\n\t"
  133846. "lsr r9, r8, #16\n\t"
  133847. "lsl r8, r8, #16\n\t"
  133848. "adds r5, r5, r8\n\t"
  133849. "adcs r6, r6, r9\n\t"
  133850. "adc r7, r7, #0\n\t"
  133851. "lsr r8, r10, #16\n\t"
  133852. "lsr r9, r12, #16\n\t"
  133853. "mul r9, r8, r9\n\t"
  133854. "adds r6, r6, r9\n\t"
  133855. "adc r7, r7, #0\n\t"
  133856. "lsl r9, r12, #16\n\t"
  133857. "lsr r9, r9, #16\n\t"
  133858. "mul r8, r9, r8\n\t"
  133859. "lsr r9, r8, #16\n\t"
  133860. "lsl r8, r8, #16\n\t"
  133861. "adds r5, r5, r8\n\t"
  133862. "adcs r6, r6, r9\n\t"
  133863. "adc r7, r7, #0\n\t"
  133864. #else
  133865. "umull r8, r9, r10, r12\n\t"
  133866. "adds r5, r5, r8\n\t"
  133867. "adcs r6, r6, r9\n\t"
  133868. "adc r7, r7, #0\n\t"
  133869. #endif
  133870. /* A[4] * A[10] */
  133871. "ldr r10, [%[a], #40]\n\t"
  133872. "ldr r12, [%[a], #16]\n\t"
  133873. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133874. "lsl r8, r10, #16\n\t"
  133875. "lsl r9, r12, #16\n\t"
  133876. "lsr r8, r8, #16\n\t"
  133877. "lsr r9, r9, #16\n\t"
  133878. "mul r9, r8, r9\n\t"
  133879. "adds r5, r5, r9\n\t"
  133880. "adcs r6, r6, #0\n\t"
  133881. "adc r7, r7, #0\n\t"
  133882. "lsr r9, r12, #16\n\t"
  133883. "mul r8, r9, r8\n\t"
  133884. "lsr r9, r8, #16\n\t"
  133885. "lsl r8, r8, #16\n\t"
  133886. "adds r5, r5, r8\n\t"
  133887. "adcs r6, r6, r9\n\t"
  133888. "adc r7, r7, #0\n\t"
  133889. "lsr r8, r10, #16\n\t"
  133890. "lsr r9, r12, #16\n\t"
  133891. "mul r9, r8, r9\n\t"
  133892. "adds r6, r6, r9\n\t"
  133893. "adc r7, r7, #0\n\t"
  133894. "lsl r9, r12, #16\n\t"
  133895. "lsr r9, r9, #16\n\t"
  133896. "mul r8, r9, r8\n\t"
  133897. "lsr r9, r8, #16\n\t"
  133898. "lsl r8, r8, #16\n\t"
  133899. "adds r5, r5, r8\n\t"
  133900. "adcs r6, r6, r9\n\t"
  133901. "adc r7, r7, #0\n\t"
  133902. #else
  133903. "umull r8, r9, r10, r12\n\t"
  133904. "adds r5, r5, r8\n\t"
  133905. "adcs r6, r6, r9\n\t"
  133906. "adc r7, r7, #0\n\t"
  133907. #endif
  133908. /* A[5] * A[9] */
  133909. "ldr r10, [%[a], #36]\n\t"
  133910. "ldr r12, [%[a], #20]\n\t"
  133911. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133912. "lsl r8, r10, #16\n\t"
  133913. "lsl r9, r12, #16\n\t"
  133914. "lsr r8, r8, #16\n\t"
  133915. "lsr r9, r9, #16\n\t"
  133916. "mul r9, r8, r9\n\t"
  133917. "adds r5, r5, r9\n\t"
  133918. "adcs r6, r6, #0\n\t"
  133919. "adc r7, r7, #0\n\t"
  133920. "lsr r9, r12, #16\n\t"
  133921. "mul r8, r9, r8\n\t"
  133922. "lsr r9, r8, #16\n\t"
  133923. "lsl r8, r8, #16\n\t"
  133924. "adds r5, r5, r8\n\t"
  133925. "adcs r6, r6, r9\n\t"
  133926. "adc r7, r7, #0\n\t"
  133927. "lsr r8, r10, #16\n\t"
  133928. "lsr r9, r12, #16\n\t"
  133929. "mul r9, r8, r9\n\t"
  133930. "adds r6, r6, r9\n\t"
  133931. "adc r7, r7, #0\n\t"
  133932. "lsl r9, r12, #16\n\t"
  133933. "lsr r9, r9, #16\n\t"
  133934. "mul r8, r9, r8\n\t"
  133935. "lsr r9, r8, #16\n\t"
  133936. "lsl r8, r8, #16\n\t"
  133937. "adds r5, r5, r8\n\t"
  133938. "adcs r6, r6, r9\n\t"
  133939. "adc r7, r7, #0\n\t"
  133940. #else
  133941. "umull r8, r9, r10, r12\n\t"
  133942. "adds r5, r5, r8\n\t"
  133943. "adcs r6, r6, r9\n\t"
  133944. "adc r7, r7, #0\n\t"
  133945. #endif
  133946. /* A[6] * A[8] */
  133947. "ldr r10, [%[a], #32]\n\t"
  133948. "ldr r12, [%[a], #24]\n\t"
  133949. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133950. "lsl r8, r10, #16\n\t"
  133951. "lsl r9, r12, #16\n\t"
  133952. "lsr r8, r8, #16\n\t"
  133953. "lsr r9, r9, #16\n\t"
  133954. "mul r9, r8, r9\n\t"
  133955. "adds r5, r5, r9\n\t"
  133956. "adcs r6, r6, #0\n\t"
  133957. "adc r7, r7, #0\n\t"
  133958. "lsr r9, r12, #16\n\t"
  133959. "mul r8, r9, r8\n\t"
  133960. "lsr r9, r8, #16\n\t"
  133961. "lsl r8, r8, #16\n\t"
  133962. "adds r5, r5, r8\n\t"
  133963. "adcs r6, r6, r9\n\t"
  133964. "adc r7, r7, #0\n\t"
  133965. "lsr r8, r10, #16\n\t"
  133966. "lsr r9, r12, #16\n\t"
  133967. "mul r9, r8, r9\n\t"
  133968. "adds r6, r6, r9\n\t"
  133969. "adc r7, r7, #0\n\t"
  133970. "lsl r9, r12, #16\n\t"
  133971. "lsr r9, r9, #16\n\t"
  133972. "mul r8, r9, r8\n\t"
  133973. "lsr r9, r8, #16\n\t"
  133974. "lsl r8, r8, #16\n\t"
  133975. "adds r5, r5, r8\n\t"
  133976. "adcs r6, r6, r9\n\t"
  133977. "adc r7, r7, #0\n\t"
  133978. #else
  133979. "umull r8, r9, r10, r12\n\t"
  133980. "adds r5, r5, r8\n\t"
  133981. "adcs r6, r6, r9\n\t"
  133982. "adc r7, r7, #0\n\t"
  133983. #endif
  133984. /* A[7] * A[7] */
  133985. "ldr r10, [%[a], #28]\n\t"
  133986. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  133987. "lsl r8, r10, #16\n\t"
  133988. "lsr r9, r10, #16\n\t"
  133989. "lsr r8, r8, #16\n\t"
  133990. "mov r12, r8\n\t"
  133991. "mul r8, r12, r8\n\t"
  133992. "mov r12, r9\n\t"
  133993. "mul r9, r12, r9\n\t"
  133994. "adds r4, r4, r8\n\t"
  133995. "adcs r2, r2, r9\n\t"
  133996. "adc r3, r3, #0\n\t"
  133997. "lsr r9, r10, #16\n\t"
  133998. "lsl r8, r10, #16\n\t"
  133999. "lsr r8, r8, #16\n\t"
  134000. "mul r8, r9, r8\n\t"
  134001. "lsr r9, r8, #15\n\t"
  134002. "lsl r8, r8, #17\n\t"
  134003. "adds r4, r4, r8\n\t"
  134004. "adcs r2, r2, r9\n\t"
  134005. "adc r3, r3, #0\n\t"
  134006. "adds r5, r5, r5\n\t"
  134007. "adcs r6, r6, r6\n\t"
  134008. "adc r7, r7, r7\n\t"
  134009. #else
  134010. "umull r8, r9, r10, r10\n\t"
  134011. "adds r5, r5, r5\n\t"
  134012. "adcs r6, r6, r6\n\t"
  134013. "adc r7, r7, r7\n\t"
  134014. "adds r4, r4, r8\n\t"
  134015. "adcs r2, r2, r9\n\t"
  134016. "adc r3, r3, #0\n\t"
  134017. #endif
  134018. "adds r4, r4, r5\n\t"
  134019. "adcs r2, r2, r6\n\t"
  134020. "adc r3, r3, r7\n\t"
  134021. "str r4, [sp, #56]\n\t"
  134022. /* A[0] * A[15] */
  134023. "ldr r10, [%[a], #60]\n\t"
  134024. "ldr r12, [%[a]]\n\t"
  134025. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134026. "lsl r8, r10, #16\n\t"
  134027. "lsl r5, r12, #16\n\t"
  134028. "lsr r8, r8, #16\n\t"
  134029. "lsr r5, r5, #16\n\t"
  134030. "mul r5, r8, r5\n\t"
  134031. "lsr r9, r12, #16\n\t"
  134032. "mul r8, r9, r8\n\t"
  134033. "lsr r6, r8, #16\n\t"
  134034. "lsl r8, r8, #16\n\t"
  134035. "adds r5, r5, r8\n\t"
  134036. "adc r6, r6, #0\n\t"
  134037. "lsr r8, r10, #16\n\t"
  134038. "mul r9, r8, r9\n\t"
  134039. "add r6, r6, r9\n\t"
  134040. "lsl r9, r12, #16\n\t"
  134041. "lsr r9, r9, #16\n\t"
  134042. "mul r8, r9, r8\n\t"
  134043. "lsr r9, r8, #16\n\t"
  134044. "lsl r8, r8, #16\n\t"
  134045. "adds r5, r5, r8\n\t"
  134046. "adc r6, r6, r9\n\t"
  134047. #else
  134048. "umull r5, r6, r10, r12\n\t"
  134049. #endif
  134050. "mov r4, #0\n\t"
  134051. "mov r7, #0\n\t"
  134052. /* A[1] * A[14] */
  134053. "ldr r10, [%[a], #56]\n\t"
  134054. "ldr r12, [%[a], #4]\n\t"
  134055. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134056. "lsl r8, r10, #16\n\t"
  134057. "lsl r9, r12, #16\n\t"
  134058. "lsr r8, r8, #16\n\t"
  134059. "lsr r9, r9, #16\n\t"
  134060. "mul r9, r8, r9\n\t"
  134061. "adds r5, r5, r9\n\t"
  134062. "adcs r6, r6, #0\n\t"
  134063. "adc r7, r7, #0\n\t"
  134064. "lsr r9, r12, #16\n\t"
  134065. "mul r8, r9, r8\n\t"
  134066. "lsr r9, r8, #16\n\t"
  134067. "lsl r8, r8, #16\n\t"
  134068. "adds r5, r5, r8\n\t"
  134069. "adcs r6, r6, r9\n\t"
  134070. "adc r7, r7, #0\n\t"
  134071. "lsr r8, r10, #16\n\t"
  134072. "lsr r9, r12, #16\n\t"
  134073. "mul r9, r8, r9\n\t"
  134074. "adds r6, r6, r9\n\t"
  134075. "adc r7, r7, #0\n\t"
  134076. "lsl r9, r12, #16\n\t"
  134077. "lsr r9, r9, #16\n\t"
  134078. "mul r8, r9, r8\n\t"
  134079. "lsr r9, r8, #16\n\t"
  134080. "lsl r8, r8, #16\n\t"
  134081. "adds r5, r5, r8\n\t"
  134082. "adcs r6, r6, r9\n\t"
  134083. "adc r7, r7, #0\n\t"
  134084. #else
  134085. "umull r8, r9, r10, r12\n\t"
  134086. "adds r5, r5, r8\n\t"
  134087. "adcs r6, r6, r9\n\t"
  134088. "adc r7, r7, #0\n\t"
  134089. #endif
  134090. /* A[2] * A[13] */
  134091. "ldr r10, [%[a], #52]\n\t"
  134092. "ldr r12, [%[a], #8]\n\t"
  134093. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134094. "lsl r8, r10, #16\n\t"
  134095. "lsl r9, r12, #16\n\t"
  134096. "lsr r8, r8, #16\n\t"
  134097. "lsr r9, r9, #16\n\t"
  134098. "mul r9, r8, r9\n\t"
  134099. "adds r5, r5, r9\n\t"
  134100. "adcs r6, r6, #0\n\t"
  134101. "adc r7, r7, #0\n\t"
  134102. "lsr r9, r12, #16\n\t"
  134103. "mul r8, r9, r8\n\t"
  134104. "lsr r9, r8, #16\n\t"
  134105. "lsl r8, r8, #16\n\t"
  134106. "adds r5, r5, r8\n\t"
  134107. "adcs r6, r6, r9\n\t"
  134108. "adc r7, r7, #0\n\t"
  134109. "lsr r8, r10, #16\n\t"
  134110. "lsr r9, r12, #16\n\t"
  134111. "mul r9, r8, r9\n\t"
  134112. "adds r6, r6, r9\n\t"
  134113. "adc r7, r7, #0\n\t"
  134114. "lsl r9, r12, #16\n\t"
  134115. "lsr r9, r9, #16\n\t"
  134116. "mul r8, r9, r8\n\t"
  134117. "lsr r9, r8, #16\n\t"
  134118. "lsl r8, r8, #16\n\t"
  134119. "adds r5, r5, r8\n\t"
  134120. "adcs r6, r6, r9\n\t"
  134121. "adc r7, r7, #0\n\t"
  134122. #else
  134123. "umull r8, r9, r10, r12\n\t"
  134124. "adds r5, r5, r8\n\t"
  134125. "adcs r6, r6, r9\n\t"
  134126. "adc r7, r7, #0\n\t"
  134127. #endif
  134128. /* A[3] * A[12] */
  134129. "ldr r10, [%[a], #48]\n\t"
  134130. "ldr r12, [%[a], #12]\n\t"
  134131. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134132. "lsl r8, r10, #16\n\t"
  134133. "lsl r9, r12, #16\n\t"
  134134. "lsr r8, r8, #16\n\t"
  134135. "lsr r9, r9, #16\n\t"
  134136. "mul r9, r8, r9\n\t"
  134137. "adds r5, r5, r9\n\t"
  134138. "adcs r6, r6, #0\n\t"
  134139. "adc r7, r7, #0\n\t"
  134140. "lsr r9, r12, #16\n\t"
  134141. "mul r8, r9, r8\n\t"
  134142. "lsr r9, r8, #16\n\t"
  134143. "lsl r8, r8, #16\n\t"
  134144. "adds r5, r5, r8\n\t"
  134145. "adcs r6, r6, r9\n\t"
  134146. "adc r7, r7, #0\n\t"
  134147. "lsr r8, r10, #16\n\t"
  134148. "lsr r9, r12, #16\n\t"
  134149. "mul r9, r8, r9\n\t"
  134150. "adds r6, r6, r9\n\t"
  134151. "adc r7, r7, #0\n\t"
  134152. "lsl r9, r12, #16\n\t"
  134153. "lsr r9, r9, #16\n\t"
  134154. "mul r8, r9, r8\n\t"
  134155. "lsr r9, r8, #16\n\t"
  134156. "lsl r8, r8, #16\n\t"
  134157. "adds r5, r5, r8\n\t"
  134158. "adcs r6, r6, r9\n\t"
  134159. "adc r7, r7, #0\n\t"
  134160. #else
  134161. "umull r8, r9, r10, r12\n\t"
  134162. "adds r5, r5, r8\n\t"
  134163. "adcs r6, r6, r9\n\t"
  134164. "adc r7, r7, #0\n\t"
  134165. #endif
  134166. /* A[4] * A[11] */
  134167. "ldr r10, [%[a], #44]\n\t"
  134168. "ldr r12, [%[a], #16]\n\t"
  134169. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134170. "lsl r8, r10, #16\n\t"
  134171. "lsl r9, r12, #16\n\t"
  134172. "lsr r8, r8, #16\n\t"
  134173. "lsr r9, r9, #16\n\t"
  134174. "mul r9, r8, r9\n\t"
  134175. "adds r5, r5, r9\n\t"
  134176. "adcs r6, r6, #0\n\t"
  134177. "adc r7, r7, #0\n\t"
  134178. "lsr r9, r12, #16\n\t"
  134179. "mul r8, r9, r8\n\t"
  134180. "lsr r9, r8, #16\n\t"
  134181. "lsl r8, r8, #16\n\t"
  134182. "adds r5, r5, r8\n\t"
  134183. "adcs r6, r6, r9\n\t"
  134184. "adc r7, r7, #0\n\t"
  134185. "lsr r8, r10, #16\n\t"
  134186. "lsr r9, r12, #16\n\t"
  134187. "mul r9, r8, r9\n\t"
  134188. "adds r6, r6, r9\n\t"
  134189. "adc r7, r7, #0\n\t"
  134190. "lsl r9, r12, #16\n\t"
  134191. "lsr r9, r9, #16\n\t"
  134192. "mul r8, r9, r8\n\t"
  134193. "lsr r9, r8, #16\n\t"
  134194. "lsl r8, r8, #16\n\t"
  134195. "adds r5, r5, r8\n\t"
  134196. "adcs r6, r6, r9\n\t"
  134197. "adc r7, r7, #0\n\t"
  134198. #else
  134199. "umull r8, r9, r10, r12\n\t"
  134200. "adds r5, r5, r8\n\t"
  134201. "adcs r6, r6, r9\n\t"
  134202. "adc r7, r7, #0\n\t"
  134203. #endif
  134204. /* A[5] * A[10] */
  134205. "ldr r10, [%[a], #40]\n\t"
  134206. "ldr r12, [%[a], #20]\n\t"
  134207. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134208. "lsl r8, r10, #16\n\t"
  134209. "lsl r9, r12, #16\n\t"
  134210. "lsr r8, r8, #16\n\t"
  134211. "lsr r9, r9, #16\n\t"
  134212. "mul r9, r8, r9\n\t"
  134213. "adds r5, r5, r9\n\t"
  134214. "adcs r6, r6, #0\n\t"
  134215. "adc r7, r7, #0\n\t"
  134216. "lsr r9, r12, #16\n\t"
  134217. "mul r8, r9, r8\n\t"
  134218. "lsr r9, r8, #16\n\t"
  134219. "lsl r8, r8, #16\n\t"
  134220. "adds r5, r5, r8\n\t"
  134221. "adcs r6, r6, r9\n\t"
  134222. "adc r7, r7, #0\n\t"
  134223. "lsr r8, r10, #16\n\t"
  134224. "lsr r9, r12, #16\n\t"
  134225. "mul r9, r8, r9\n\t"
  134226. "adds r6, r6, r9\n\t"
  134227. "adc r7, r7, #0\n\t"
  134228. "lsl r9, r12, #16\n\t"
  134229. "lsr r9, r9, #16\n\t"
  134230. "mul r8, r9, r8\n\t"
  134231. "lsr r9, r8, #16\n\t"
  134232. "lsl r8, r8, #16\n\t"
  134233. "adds r5, r5, r8\n\t"
  134234. "adcs r6, r6, r9\n\t"
  134235. "adc r7, r7, #0\n\t"
  134236. #else
  134237. "umull r8, r9, r10, r12\n\t"
  134238. "adds r5, r5, r8\n\t"
  134239. "adcs r6, r6, r9\n\t"
  134240. "adc r7, r7, #0\n\t"
  134241. #endif
  134242. /* A[6] * A[9] */
  134243. "ldr r10, [%[a], #36]\n\t"
  134244. "ldr r12, [%[a], #24]\n\t"
  134245. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134246. "lsl r8, r10, #16\n\t"
  134247. "lsl r9, r12, #16\n\t"
  134248. "lsr r8, r8, #16\n\t"
  134249. "lsr r9, r9, #16\n\t"
  134250. "mul r9, r8, r9\n\t"
  134251. "adds r5, r5, r9\n\t"
  134252. "adcs r6, r6, #0\n\t"
  134253. "adc r7, r7, #0\n\t"
  134254. "lsr r9, r12, #16\n\t"
  134255. "mul r8, r9, r8\n\t"
  134256. "lsr r9, r8, #16\n\t"
  134257. "lsl r8, r8, #16\n\t"
  134258. "adds r5, r5, r8\n\t"
  134259. "adcs r6, r6, r9\n\t"
  134260. "adc r7, r7, #0\n\t"
  134261. "lsr r8, r10, #16\n\t"
  134262. "lsr r9, r12, #16\n\t"
  134263. "mul r9, r8, r9\n\t"
  134264. "adds r6, r6, r9\n\t"
  134265. "adc r7, r7, #0\n\t"
  134266. "lsl r9, r12, #16\n\t"
  134267. "lsr r9, r9, #16\n\t"
  134268. "mul r8, r9, r8\n\t"
  134269. "lsr r9, r8, #16\n\t"
  134270. "lsl r8, r8, #16\n\t"
  134271. "adds r5, r5, r8\n\t"
  134272. "adcs r6, r6, r9\n\t"
  134273. "adc r7, r7, #0\n\t"
  134274. #else
  134275. "umull r8, r9, r10, r12\n\t"
  134276. "adds r5, r5, r8\n\t"
  134277. "adcs r6, r6, r9\n\t"
  134278. "adc r7, r7, #0\n\t"
  134279. #endif
  134280. /* A[7] * A[8] */
  134281. "ldr r10, [%[a], #32]\n\t"
  134282. "ldr r12, [%[a], #28]\n\t"
  134283. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134284. "lsl r8, r10, #16\n\t"
  134285. "lsl r9, r12, #16\n\t"
  134286. "lsr r8, r8, #16\n\t"
  134287. "lsr r9, r9, #16\n\t"
  134288. "mul r9, r8, r9\n\t"
  134289. "adds r5, r5, r9\n\t"
  134290. "adcs r6, r6, #0\n\t"
  134291. "adc r7, r7, #0\n\t"
  134292. "lsr r9, r12, #16\n\t"
  134293. "mul r8, r9, r8\n\t"
  134294. "lsr r9, r8, #16\n\t"
  134295. "lsl r8, r8, #16\n\t"
  134296. "adds r5, r5, r8\n\t"
  134297. "adcs r6, r6, r9\n\t"
  134298. "adc r7, r7, #0\n\t"
  134299. "lsr r8, r10, #16\n\t"
  134300. "lsr r9, r12, #16\n\t"
  134301. "mul r9, r8, r9\n\t"
  134302. "adds r6, r6, r9\n\t"
  134303. "adc r7, r7, #0\n\t"
  134304. "lsl r9, r12, #16\n\t"
  134305. "lsr r9, r9, #16\n\t"
  134306. "mul r8, r9, r8\n\t"
  134307. "lsr r9, r8, #16\n\t"
  134308. "lsl r8, r8, #16\n\t"
  134309. "adds r5, r5, r8\n\t"
  134310. "adcs r6, r6, r9\n\t"
  134311. "adc r7, r7, #0\n\t"
  134312. #else
  134313. "umull r8, r9, r10, r12\n\t"
  134314. "adds r5, r5, r8\n\t"
  134315. "adcs r6, r6, r9\n\t"
  134316. "adc r7, r7, #0\n\t"
  134317. #endif
  134318. "adds r5, r5, r5\n\t"
  134319. "adcs r6, r6, r6\n\t"
  134320. "adc r7, r7, r7\n\t"
  134321. "adds r2, r2, r5\n\t"
  134322. "adcs r3, r3, r6\n\t"
  134323. "adc r4, r4, r7\n\t"
  134324. "str r2, [sp, #60]\n\t"
  134325. /* A[1] * A[15] */
  134326. "ldr r10, [%[a], #60]\n\t"
  134327. "ldr r12, [%[a], #4]\n\t"
  134328. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134329. "lsl r8, r10, #16\n\t"
  134330. "lsl r5, r12, #16\n\t"
  134331. "lsr r8, r8, #16\n\t"
  134332. "lsr r5, r5, #16\n\t"
  134333. "mul r5, r8, r5\n\t"
  134334. "lsr r9, r12, #16\n\t"
  134335. "mul r8, r9, r8\n\t"
  134336. "lsr r6, r8, #16\n\t"
  134337. "lsl r8, r8, #16\n\t"
  134338. "adds r5, r5, r8\n\t"
  134339. "adc r6, r6, #0\n\t"
  134340. "lsr r8, r10, #16\n\t"
  134341. "mul r9, r8, r9\n\t"
  134342. "add r6, r6, r9\n\t"
  134343. "lsl r9, r12, #16\n\t"
  134344. "lsr r9, r9, #16\n\t"
  134345. "mul r8, r9, r8\n\t"
  134346. "lsr r9, r8, #16\n\t"
  134347. "lsl r8, r8, #16\n\t"
  134348. "adds r5, r5, r8\n\t"
  134349. "adc r6, r6, r9\n\t"
  134350. #else
  134351. "umull r5, r6, r10, r12\n\t"
  134352. #endif
  134353. "mov r2, #0\n\t"
  134354. "mov r7, #0\n\t"
  134355. /* A[2] * A[14] */
  134356. "ldr r10, [%[a], #56]\n\t"
  134357. "ldr r12, [%[a], #8]\n\t"
  134358. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134359. "lsl r8, r10, #16\n\t"
  134360. "lsl r9, r12, #16\n\t"
  134361. "lsr r8, r8, #16\n\t"
  134362. "lsr r9, r9, #16\n\t"
  134363. "mul r9, r8, r9\n\t"
  134364. "adds r5, r5, r9\n\t"
  134365. "adcs r6, r6, #0\n\t"
  134366. "adc r7, r7, #0\n\t"
  134367. "lsr r9, r12, #16\n\t"
  134368. "mul r8, r9, r8\n\t"
  134369. "lsr r9, r8, #16\n\t"
  134370. "lsl r8, r8, #16\n\t"
  134371. "adds r5, r5, r8\n\t"
  134372. "adcs r6, r6, r9\n\t"
  134373. "adc r7, r7, #0\n\t"
  134374. "lsr r8, r10, #16\n\t"
  134375. "lsr r9, r12, #16\n\t"
  134376. "mul r9, r8, r9\n\t"
  134377. "adds r6, r6, r9\n\t"
  134378. "adc r7, r7, #0\n\t"
  134379. "lsl r9, r12, #16\n\t"
  134380. "lsr r9, r9, #16\n\t"
  134381. "mul r8, r9, r8\n\t"
  134382. "lsr r9, r8, #16\n\t"
  134383. "lsl r8, r8, #16\n\t"
  134384. "adds r5, r5, r8\n\t"
  134385. "adcs r6, r6, r9\n\t"
  134386. "adc r7, r7, #0\n\t"
  134387. #else
  134388. "umull r8, r9, r10, r12\n\t"
  134389. "adds r5, r5, r8\n\t"
  134390. "adcs r6, r6, r9\n\t"
  134391. "adc r7, r7, #0\n\t"
  134392. #endif
  134393. /* A[3] * A[13] */
  134394. "ldr r10, [%[a], #52]\n\t"
  134395. "ldr r12, [%[a], #12]\n\t"
  134396. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134397. "lsl r8, r10, #16\n\t"
  134398. "lsl r9, r12, #16\n\t"
  134399. "lsr r8, r8, #16\n\t"
  134400. "lsr r9, r9, #16\n\t"
  134401. "mul r9, r8, r9\n\t"
  134402. "adds r5, r5, r9\n\t"
  134403. "adcs r6, r6, #0\n\t"
  134404. "adc r7, r7, #0\n\t"
  134405. "lsr r9, r12, #16\n\t"
  134406. "mul r8, r9, r8\n\t"
  134407. "lsr r9, r8, #16\n\t"
  134408. "lsl r8, r8, #16\n\t"
  134409. "adds r5, r5, r8\n\t"
  134410. "adcs r6, r6, r9\n\t"
  134411. "adc r7, r7, #0\n\t"
  134412. "lsr r8, r10, #16\n\t"
  134413. "lsr r9, r12, #16\n\t"
  134414. "mul r9, r8, r9\n\t"
  134415. "adds r6, r6, r9\n\t"
  134416. "adc r7, r7, #0\n\t"
  134417. "lsl r9, r12, #16\n\t"
  134418. "lsr r9, r9, #16\n\t"
  134419. "mul r8, r9, r8\n\t"
  134420. "lsr r9, r8, #16\n\t"
  134421. "lsl r8, r8, #16\n\t"
  134422. "adds r5, r5, r8\n\t"
  134423. "adcs r6, r6, r9\n\t"
  134424. "adc r7, r7, #0\n\t"
  134425. #else
  134426. "umull r8, r9, r10, r12\n\t"
  134427. "adds r5, r5, r8\n\t"
  134428. "adcs r6, r6, r9\n\t"
  134429. "adc r7, r7, #0\n\t"
  134430. #endif
  134431. /* A[4] * A[12] */
  134432. "ldr r10, [%[a], #48]\n\t"
  134433. "ldr r12, [%[a], #16]\n\t"
  134434. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134435. "lsl r8, r10, #16\n\t"
  134436. "lsl r9, r12, #16\n\t"
  134437. "lsr r8, r8, #16\n\t"
  134438. "lsr r9, r9, #16\n\t"
  134439. "mul r9, r8, r9\n\t"
  134440. "adds r5, r5, r9\n\t"
  134441. "adcs r6, r6, #0\n\t"
  134442. "adc r7, r7, #0\n\t"
  134443. "lsr r9, r12, #16\n\t"
  134444. "mul r8, r9, r8\n\t"
  134445. "lsr r9, r8, #16\n\t"
  134446. "lsl r8, r8, #16\n\t"
  134447. "adds r5, r5, r8\n\t"
  134448. "adcs r6, r6, r9\n\t"
  134449. "adc r7, r7, #0\n\t"
  134450. "lsr r8, r10, #16\n\t"
  134451. "lsr r9, r12, #16\n\t"
  134452. "mul r9, r8, r9\n\t"
  134453. "adds r6, r6, r9\n\t"
  134454. "adc r7, r7, #0\n\t"
  134455. "lsl r9, r12, #16\n\t"
  134456. "lsr r9, r9, #16\n\t"
  134457. "mul r8, r9, r8\n\t"
  134458. "lsr r9, r8, #16\n\t"
  134459. "lsl r8, r8, #16\n\t"
  134460. "adds r5, r5, r8\n\t"
  134461. "adcs r6, r6, r9\n\t"
  134462. "adc r7, r7, #0\n\t"
  134463. #else
  134464. "umull r8, r9, r10, r12\n\t"
  134465. "adds r5, r5, r8\n\t"
  134466. "adcs r6, r6, r9\n\t"
  134467. "adc r7, r7, #0\n\t"
  134468. #endif
  134469. /* A[5] * A[11] */
  134470. "ldr r10, [%[a], #44]\n\t"
  134471. "ldr r12, [%[a], #20]\n\t"
  134472. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134473. "lsl r8, r10, #16\n\t"
  134474. "lsl r9, r12, #16\n\t"
  134475. "lsr r8, r8, #16\n\t"
  134476. "lsr r9, r9, #16\n\t"
  134477. "mul r9, r8, r9\n\t"
  134478. "adds r5, r5, r9\n\t"
  134479. "adcs r6, r6, #0\n\t"
  134480. "adc r7, r7, #0\n\t"
  134481. "lsr r9, r12, #16\n\t"
  134482. "mul r8, r9, r8\n\t"
  134483. "lsr r9, r8, #16\n\t"
  134484. "lsl r8, r8, #16\n\t"
  134485. "adds r5, r5, r8\n\t"
  134486. "adcs r6, r6, r9\n\t"
  134487. "adc r7, r7, #0\n\t"
  134488. "lsr r8, r10, #16\n\t"
  134489. "lsr r9, r12, #16\n\t"
  134490. "mul r9, r8, r9\n\t"
  134491. "adds r6, r6, r9\n\t"
  134492. "adc r7, r7, #0\n\t"
  134493. "lsl r9, r12, #16\n\t"
  134494. "lsr r9, r9, #16\n\t"
  134495. "mul r8, r9, r8\n\t"
  134496. "lsr r9, r8, #16\n\t"
  134497. "lsl r8, r8, #16\n\t"
  134498. "adds r5, r5, r8\n\t"
  134499. "adcs r6, r6, r9\n\t"
  134500. "adc r7, r7, #0\n\t"
  134501. #else
  134502. "umull r8, r9, r10, r12\n\t"
  134503. "adds r5, r5, r8\n\t"
  134504. "adcs r6, r6, r9\n\t"
  134505. "adc r7, r7, #0\n\t"
  134506. #endif
  134507. /* A[6] * A[10] */
  134508. "ldr r10, [%[a], #40]\n\t"
  134509. "ldr r12, [%[a], #24]\n\t"
  134510. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134511. "lsl r8, r10, #16\n\t"
  134512. "lsl r9, r12, #16\n\t"
  134513. "lsr r8, r8, #16\n\t"
  134514. "lsr r9, r9, #16\n\t"
  134515. "mul r9, r8, r9\n\t"
  134516. "adds r5, r5, r9\n\t"
  134517. "adcs r6, r6, #0\n\t"
  134518. "adc r7, r7, #0\n\t"
  134519. "lsr r9, r12, #16\n\t"
  134520. "mul r8, r9, r8\n\t"
  134521. "lsr r9, r8, #16\n\t"
  134522. "lsl r8, r8, #16\n\t"
  134523. "adds r5, r5, r8\n\t"
  134524. "adcs r6, r6, r9\n\t"
  134525. "adc r7, r7, #0\n\t"
  134526. "lsr r8, r10, #16\n\t"
  134527. "lsr r9, r12, #16\n\t"
  134528. "mul r9, r8, r9\n\t"
  134529. "adds r6, r6, r9\n\t"
  134530. "adc r7, r7, #0\n\t"
  134531. "lsl r9, r12, #16\n\t"
  134532. "lsr r9, r9, #16\n\t"
  134533. "mul r8, r9, r8\n\t"
  134534. "lsr r9, r8, #16\n\t"
  134535. "lsl r8, r8, #16\n\t"
  134536. "adds r5, r5, r8\n\t"
  134537. "adcs r6, r6, r9\n\t"
  134538. "adc r7, r7, #0\n\t"
  134539. #else
  134540. "umull r8, r9, r10, r12\n\t"
  134541. "adds r5, r5, r8\n\t"
  134542. "adcs r6, r6, r9\n\t"
  134543. "adc r7, r7, #0\n\t"
  134544. #endif
  134545. /* A[7] * A[9] */
  134546. "ldr r10, [%[a], #36]\n\t"
  134547. "ldr r12, [%[a], #28]\n\t"
  134548. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134549. "lsl r8, r10, #16\n\t"
  134550. "lsl r9, r12, #16\n\t"
  134551. "lsr r8, r8, #16\n\t"
  134552. "lsr r9, r9, #16\n\t"
  134553. "mul r9, r8, r9\n\t"
  134554. "adds r5, r5, r9\n\t"
  134555. "adcs r6, r6, #0\n\t"
  134556. "adc r7, r7, #0\n\t"
  134557. "lsr r9, r12, #16\n\t"
  134558. "mul r8, r9, r8\n\t"
  134559. "lsr r9, r8, #16\n\t"
  134560. "lsl r8, r8, #16\n\t"
  134561. "adds r5, r5, r8\n\t"
  134562. "adcs r6, r6, r9\n\t"
  134563. "adc r7, r7, #0\n\t"
  134564. "lsr r8, r10, #16\n\t"
  134565. "lsr r9, r12, #16\n\t"
  134566. "mul r9, r8, r9\n\t"
  134567. "adds r6, r6, r9\n\t"
  134568. "adc r7, r7, #0\n\t"
  134569. "lsl r9, r12, #16\n\t"
  134570. "lsr r9, r9, #16\n\t"
  134571. "mul r8, r9, r8\n\t"
  134572. "lsr r9, r8, #16\n\t"
  134573. "lsl r8, r8, #16\n\t"
  134574. "adds r5, r5, r8\n\t"
  134575. "adcs r6, r6, r9\n\t"
  134576. "adc r7, r7, #0\n\t"
  134577. #else
  134578. "umull r8, r9, r10, r12\n\t"
  134579. "adds r5, r5, r8\n\t"
  134580. "adcs r6, r6, r9\n\t"
  134581. "adc r7, r7, #0\n\t"
  134582. #endif
  134583. /* A[8] * A[8] */
  134584. "ldr r10, [%[a], #32]\n\t"
  134585. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134586. "lsl r8, r10, #16\n\t"
  134587. "lsr r9, r10, #16\n\t"
  134588. "lsr r8, r8, #16\n\t"
  134589. "mov r12, r8\n\t"
  134590. "mul r8, r12, r8\n\t"
  134591. "mov r12, r9\n\t"
  134592. "mul r9, r12, r9\n\t"
  134593. "adds r3, r3, r8\n\t"
  134594. "adcs r4, r4, r9\n\t"
  134595. "adc r2, r2, #0\n\t"
  134596. "lsr r9, r10, #16\n\t"
  134597. "lsl r8, r10, #16\n\t"
  134598. "lsr r8, r8, #16\n\t"
  134599. "mul r8, r9, r8\n\t"
  134600. "lsr r9, r8, #15\n\t"
  134601. "lsl r8, r8, #17\n\t"
  134602. "adds r3, r3, r8\n\t"
  134603. "adcs r4, r4, r9\n\t"
  134604. "adc r2, r2, #0\n\t"
  134605. "adds r5, r5, r5\n\t"
  134606. "adcs r6, r6, r6\n\t"
  134607. "adc r7, r7, r7\n\t"
  134608. #else
  134609. "umull r8, r9, r10, r10\n\t"
  134610. "adds r5, r5, r5\n\t"
  134611. "adcs r6, r6, r6\n\t"
  134612. "adc r7, r7, r7\n\t"
  134613. "adds r3, r3, r8\n\t"
  134614. "adcs r4, r4, r9\n\t"
  134615. "adc r2, r2, #0\n\t"
  134616. #endif
  134617. "adds r3, r3, r5\n\t"
  134618. "adcs r4, r4, r6\n\t"
  134619. "adc r2, r2, r7\n\t"
  134620. "str r3, [%[r], #64]\n\t"
  134621. /* A[2] * A[15] */
  134622. "ldr r10, [%[a], #60]\n\t"
  134623. "ldr r12, [%[a], #8]\n\t"
  134624. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134625. "lsl r8, r10, #16\n\t"
  134626. "lsl r5, r12, #16\n\t"
  134627. "lsr r8, r8, #16\n\t"
  134628. "lsr r5, r5, #16\n\t"
  134629. "mul r5, r8, r5\n\t"
  134630. "lsr r9, r12, #16\n\t"
  134631. "mul r8, r9, r8\n\t"
  134632. "lsr r6, r8, #16\n\t"
  134633. "lsl r8, r8, #16\n\t"
  134634. "adds r5, r5, r8\n\t"
  134635. "adc r6, r6, #0\n\t"
  134636. "lsr r8, r10, #16\n\t"
  134637. "mul r9, r8, r9\n\t"
  134638. "add r6, r6, r9\n\t"
  134639. "lsl r9, r12, #16\n\t"
  134640. "lsr r9, r9, #16\n\t"
  134641. "mul r8, r9, r8\n\t"
  134642. "lsr r9, r8, #16\n\t"
  134643. "lsl r8, r8, #16\n\t"
  134644. "adds r5, r5, r8\n\t"
  134645. "adc r6, r6, r9\n\t"
  134646. #else
  134647. "umull r5, r6, r10, r12\n\t"
  134648. #endif
  134649. "mov r3, #0\n\t"
  134650. "mov r7, #0\n\t"
  134651. /* A[3] * A[14] */
  134652. "ldr r10, [%[a], #56]\n\t"
  134653. "ldr r12, [%[a], #12]\n\t"
  134654. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134655. "lsl r8, r10, #16\n\t"
  134656. "lsl r9, r12, #16\n\t"
  134657. "lsr r8, r8, #16\n\t"
  134658. "lsr r9, r9, #16\n\t"
  134659. "mul r9, r8, r9\n\t"
  134660. "adds r5, r5, r9\n\t"
  134661. "adcs r6, r6, #0\n\t"
  134662. "adc r7, r7, #0\n\t"
  134663. "lsr r9, r12, #16\n\t"
  134664. "mul r8, r9, r8\n\t"
  134665. "lsr r9, r8, #16\n\t"
  134666. "lsl r8, r8, #16\n\t"
  134667. "adds r5, r5, r8\n\t"
  134668. "adcs r6, r6, r9\n\t"
  134669. "adc r7, r7, #0\n\t"
  134670. "lsr r8, r10, #16\n\t"
  134671. "lsr r9, r12, #16\n\t"
  134672. "mul r9, r8, r9\n\t"
  134673. "adds r6, r6, r9\n\t"
  134674. "adc r7, r7, #0\n\t"
  134675. "lsl r9, r12, #16\n\t"
  134676. "lsr r9, r9, #16\n\t"
  134677. "mul r8, r9, r8\n\t"
  134678. "lsr r9, r8, #16\n\t"
  134679. "lsl r8, r8, #16\n\t"
  134680. "adds r5, r5, r8\n\t"
  134681. "adcs r6, r6, r9\n\t"
  134682. "adc r7, r7, #0\n\t"
  134683. #else
  134684. "umull r8, r9, r10, r12\n\t"
  134685. "adds r5, r5, r8\n\t"
  134686. "adcs r6, r6, r9\n\t"
  134687. "adc r7, r7, #0\n\t"
  134688. #endif
  134689. /* A[4] * A[13] */
  134690. "ldr r10, [%[a], #52]\n\t"
  134691. "ldr r12, [%[a], #16]\n\t"
  134692. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134693. "lsl r8, r10, #16\n\t"
  134694. "lsl r9, r12, #16\n\t"
  134695. "lsr r8, r8, #16\n\t"
  134696. "lsr r9, r9, #16\n\t"
  134697. "mul r9, r8, r9\n\t"
  134698. "adds r5, r5, r9\n\t"
  134699. "adcs r6, r6, #0\n\t"
  134700. "adc r7, r7, #0\n\t"
  134701. "lsr r9, r12, #16\n\t"
  134702. "mul r8, r9, r8\n\t"
  134703. "lsr r9, r8, #16\n\t"
  134704. "lsl r8, r8, #16\n\t"
  134705. "adds r5, r5, r8\n\t"
  134706. "adcs r6, r6, r9\n\t"
  134707. "adc r7, r7, #0\n\t"
  134708. "lsr r8, r10, #16\n\t"
  134709. "lsr r9, r12, #16\n\t"
  134710. "mul r9, r8, r9\n\t"
  134711. "adds r6, r6, r9\n\t"
  134712. "adc r7, r7, #0\n\t"
  134713. "lsl r9, r12, #16\n\t"
  134714. "lsr r9, r9, #16\n\t"
  134715. "mul r8, r9, r8\n\t"
  134716. "lsr r9, r8, #16\n\t"
  134717. "lsl r8, r8, #16\n\t"
  134718. "adds r5, r5, r8\n\t"
  134719. "adcs r6, r6, r9\n\t"
  134720. "adc r7, r7, #0\n\t"
  134721. #else
  134722. "umull r8, r9, r10, r12\n\t"
  134723. "adds r5, r5, r8\n\t"
  134724. "adcs r6, r6, r9\n\t"
  134725. "adc r7, r7, #0\n\t"
  134726. #endif
  134727. /* A[5] * A[12] */
  134728. "ldr r10, [%[a], #48]\n\t"
  134729. "ldr r12, [%[a], #20]\n\t"
  134730. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134731. "lsl r8, r10, #16\n\t"
  134732. "lsl r9, r12, #16\n\t"
  134733. "lsr r8, r8, #16\n\t"
  134734. "lsr r9, r9, #16\n\t"
  134735. "mul r9, r8, r9\n\t"
  134736. "adds r5, r5, r9\n\t"
  134737. "adcs r6, r6, #0\n\t"
  134738. "adc r7, r7, #0\n\t"
  134739. "lsr r9, r12, #16\n\t"
  134740. "mul r8, r9, r8\n\t"
  134741. "lsr r9, r8, #16\n\t"
  134742. "lsl r8, r8, #16\n\t"
  134743. "adds r5, r5, r8\n\t"
  134744. "adcs r6, r6, r9\n\t"
  134745. "adc r7, r7, #0\n\t"
  134746. "lsr r8, r10, #16\n\t"
  134747. "lsr r9, r12, #16\n\t"
  134748. "mul r9, r8, r9\n\t"
  134749. "adds r6, r6, r9\n\t"
  134750. "adc r7, r7, #0\n\t"
  134751. "lsl r9, r12, #16\n\t"
  134752. "lsr r9, r9, #16\n\t"
  134753. "mul r8, r9, r8\n\t"
  134754. "lsr r9, r8, #16\n\t"
  134755. "lsl r8, r8, #16\n\t"
  134756. "adds r5, r5, r8\n\t"
  134757. "adcs r6, r6, r9\n\t"
  134758. "adc r7, r7, #0\n\t"
  134759. #else
  134760. "umull r8, r9, r10, r12\n\t"
  134761. "adds r5, r5, r8\n\t"
  134762. "adcs r6, r6, r9\n\t"
  134763. "adc r7, r7, #0\n\t"
  134764. #endif
  134765. /* A[6] * A[11] */
  134766. "ldr r10, [%[a], #44]\n\t"
  134767. "ldr r12, [%[a], #24]\n\t"
  134768. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134769. "lsl r8, r10, #16\n\t"
  134770. "lsl r9, r12, #16\n\t"
  134771. "lsr r8, r8, #16\n\t"
  134772. "lsr r9, r9, #16\n\t"
  134773. "mul r9, r8, r9\n\t"
  134774. "adds r5, r5, r9\n\t"
  134775. "adcs r6, r6, #0\n\t"
  134776. "adc r7, r7, #0\n\t"
  134777. "lsr r9, r12, #16\n\t"
  134778. "mul r8, r9, r8\n\t"
  134779. "lsr r9, r8, #16\n\t"
  134780. "lsl r8, r8, #16\n\t"
  134781. "adds r5, r5, r8\n\t"
  134782. "adcs r6, r6, r9\n\t"
  134783. "adc r7, r7, #0\n\t"
  134784. "lsr r8, r10, #16\n\t"
  134785. "lsr r9, r12, #16\n\t"
  134786. "mul r9, r8, r9\n\t"
  134787. "adds r6, r6, r9\n\t"
  134788. "adc r7, r7, #0\n\t"
  134789. "lsl r9, r12, #16\n\t"
  134790. "lsr r9, r9, #16\n\t"
  134791. "mul r8, r9, r8\n\t"
  134792. "lsr r9, r8, #16\n\t"
  134793. "lsl r8, r8, #16\n\t"
  134794. "adds r5, r5, r8\n\t"
  134795. "adcs r6, r6, r9\n\t"
  134796. "adc r7, r7, #0\n\t"
  134797. #else
  134798. "umull r8, r9, r10, r12\n\t"
  134799. "adds r5, r5, r8\n\t"
  134800. "adcs r6, r6, r9\n\t"
  134801. "adc r7, r7, #0\n\t"
  134802. #endif
  134803. /* A[7] * A[10] */
  134804. "ldr r10, [%[a], #40]\n\t"
  134805. "ldr r12, [%[a], #28]\n\t"
  134806. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134807. "lsl r8, r10, #16\n\t"
  134808. "lsl r9, r12, #16\n\t"
  134809. "lsr r8, r8, #16\n\t"
  134810. "lsr r9, r9, #16\n\t"
  134811. "mul r9, r8, r9\n\t"
  134812. "adds r5, r5, r9\n\t"
  134813. "adcs r6, r6, #0\n\t"
  134814. "adc r7, r7, #0\n\t"
  134815. "lsr r9, r12, #16\n\t"
  134816. "mul r8, r9, r8\n\t"
  134817. "lsr r9, r8, #16\n\t"
  134818. "lsl r8, r8, #16\n\t"
  134819. "adds r5, r5, r8\n\t"
  134820. "adcs r6, r6, r9\n\t"
  134821. "adc r7, r7, #0\n\t"
  134822. "lsr r8, r10, #16\n\t"
  134823. "lsr r9, r12, #16\n\t"
  134824. "mul r9, r8, r9\n\t"
  134825. "adds r6, r6, r9\n\t"
  134826. "adc r7, r7, #0\n\t"
  134827. "lsl r9, r12, #16\n\t"
  134828. "lsr r9, r9, #16\n\t"
  134829. "mul r8, r9, r8\n\t"
  134830. "lsr r9, r8, #16\n\t"
  134831. "lsl r8, r8, #16\n\t"
  134832. "adds r5, r5, r8\n\t"
  134833. "adcs r6, r6, r9\n\t"
  134834. "adc r7, r7, #0\n\t"
  134835. #else
  134836. "umull r8, r9, r10, r12\n\t"
  134837. "adds r5, r5, r8\n\t"
  134838. "adcs r6, r6, r9\n\t"
  134839. "adc r7, r7, #0\n\t"
  134840. #endif
  134841. /* A[8] * A[9] */
  134842. "ldr r10, [%[a], #36]\n\t"
  134843. "ldr r12, [%[a], #32]\n\t"
  134844. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134845. "lsl r8, r10, #16\n\t"
  134846. "lsl r9, r12, #16\n\t"
  134847. "lsr r8, r8, #16\n\t"
  134848. "lsr r9, r9, #16\n\t"
  134849. "mul r9, r8, r9\n\t"
  134850. "adds r5, r5, r9\n\t"
  134851. "adcs r6, r6, #0\n\t"
  134852. "adc r7, r7, #0\n\t"
  134853. "lsr r9, r12, #16\n\t"
  134854. "mul r8, r9, r8\n\t"
  134855. "lsr r9, r8, #16\n\t"
  134856. "lsl r8, r8, #16\n\t"
  134857. "adds r5, r5, r8\n\t"
  134858. "adcs r6, r6, r9\n\t"
  134859. "adc r7, r7, #0\n\t"
  134860. "lsr r8, r10, #16\n\t"
  134861. "lsr r9, r12, #16\n\t"
  134862. "mul r9, r8, r9\n\t"
  134863. "adds r6, r6, r9\n\t"
  134864. "adc r7, r7, #0\n\t"
  134865. "lsl r9, r12, #16\n\t"
  134866. "lsr r9, r9, #16\n\t"
  134867. "mul r8, r9, r8\n\t"
  134868. "lsr r9, r8, #16\n\t"
  134869. "lsl r8, r8, #16\n\t"
  134870. "adds r5, r5, r8\n\t"
  134871. "adcs r6, r6, r9\n\t"
  134872. "adc r7, r7, #0\n\t"
  134873. #else
  134874. "umull r8, r9, r10, r12\n\t"
  134875. "adds r5, r5, r8\n\t"
  134876. "adcs r6, r6, r9\n\t"
  134877. "adc r7, r7, #0\n\t"
  134878. #endif
  134879. "adds r5, r5, r5\n\t"
  134880. "adcs r6, r6, r6\n\t"
  134881. "adc r7, r7, r7\n\t"
  134882. "adds r4, r4, r5\n\t"
  134883. "adcs r2, r2, r6\n\t"
  134884. "adc r3, r3, r7\n\t"
  134885. "str r4, [%[r], #68]\n\t"
  134886. /* A[3] * A[15] */
  134887. "ldr r10, [%[a], #60]\n\t"
  134888. "ldr r12, [%[a], #12]\n\t"
  134889. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134890. "lsl r8, r10, #16\n\t"
  134891. "lsl r5, r12, #16\n\t"
  134892. "lsr r8, r8, #16\n\t"
  134893. "lsr r5, r5, #16\n\t"
  134894. "mul r5, r8, r5\n\t"
  134895. "lsr r9, r12, #16\n\t"
  134896. "mul r8, r9, r8\n\t"
  134897. "lsr r6, r8, #16\n\t"
  134898. "lsl r8, r8, #16\n\t"
  134899. "adds r5, r5, r8\n\t"
  134900. "adc r6, r6, #0\n\t"
  134901. "lsr r8, r10, #16\n\t"
  134902. "mul r9, r8, r9\n\t"
  134903. "add r6, r6, r9\n\t"
  134904. "lsl r9, r12, #16\n\t"
  134905. "lsr r9, r9, #16\n\t"
  134906. "mul r8, r9, r8\n\t"
  134907. "lsr r9, r8, #16\n\t"
  134908. "lsl r8, r8, #16\n\t"
  134909. "adds r5, r5, r8\n\t"
  134910. "adc r6, r6, r9\n\t"
  134911. #else
  134912. "umull r5, r6, r10, r12\n\t"
  134913. #endif
  134914. "mov r4, #0\n\t"
  134915. "mov r7, #0\n\t"
  134916. /* A[4] * A[14] */
  134917. "ldr r10, [%[a], #56]\n\t"
  134918. "ldr r12, [%[a], #16]\n\t"
  134919. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134920. "lsl r8, r10, #16\n\t"
  134921. "lsl r9, r12, #16\n\t"
  134922. "lsr r8, r8, #16\n\t"
  134923. "lsr r9, r9, #16\n\t"
  134924. "mul r9, r8, r9\n\t"
  134925. "adds r5, r5, r9\n\t"
  134926. "adcs r6, r6, #0\n\t"
  134927. "adc r7, r7, #0\n\t"
  134928. "lsr r9, r12, #16\n\t"
  134929. "mul r8, r9, r8\n\t"
  134930. "lsr r9, r8, #16\n\t"
  134931. "lsl r8, r8, #16\n\t"
  134932. "adds r5, r5, r8\n\t"
  134933. "adcs r6, r6, r9\n\t"
  134934. "adc r7, r7, #0\n\t"
  134935. "lsr r8, r10, #16\n\t"
  134936. "lsr r9, r12, #16\n\t"
  134937. "mul r9, r8, r9\n\t"
  134938. "adds r6, r6, r9\n\t"
  134939. "adc r7, r7, #0\n\t"
  134940. "lsl r9, r12, #16\n\t"
  134941. "lsr r9, r9, #16\n\t"
  134942. "mul r8, r9, r8\n\t"
  134943. "lsr r9, r8, #16\n\t"
  134944. "lsl r8, r8, #16\n\t"
  134945. "adds r5, r5, r8\n\t"
  134946. "adcs r6, r6, r9\n\t"
  134947. "adc r7, r7, #0\n\t"
  134948. #else
  134949. "umull r8, r9, r10, r12\n\t"
  134950. "adds r5, r5, r8\n\t"
  134951. "adcs r6, r6, r9\n\t"
  134952. "adc r7, r7, #0\n\t"
  134953. #endif
  134954. /* A[5] * A[13] */
  134955. "ldr r10, [%[a], #52]\n\t"
  134956. "ldr r12, [%[a], #20]\n\t"
  134957. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134958. "lsl r8, r10, #16\n\t"
  134959. "lsl r9, r12, #16\n\t"
  134960. "lsr r8, r8, #16\n\t"
  134961. "lsr r9, r9, #16\n\t"
  134962. "mul r9, r8, r9\n\t"
  134963. "adds r5, r5, r9\n\t"
  134964. "adcs r6, r6, #0\n\t"
  134965. "adc r7, r7, #0\n\t"
  134966. "lsr r9, r12, #16\n\t"
  134967. "mul r8, r9, r8\n\t"
  134968. "lsr r9, r8, #16\n\t"
  134969. "lsl r8, r8, #16\n\t"
  134970. "adds r5, r5, r8\n\t"
  134971. "adcs r6, r6, r9\n\t"
  134972. "adc r7, r7, #0\n\t"
  134973. "lsr r8, r10, #16\n\t"
  134974. "lsr r9, r12, #16\n\t"
  134975. "mul r9, r8, r9\n\t"
  134976. "adds r6, r6, r9\n\t"
  134977. "adc r7, r7, #0\n\t"
  134978. "lsl r9, r12, #16\n\t"
  134979. "lsr r9, r9, #16\n\t"
  134980. "mul r8, r9, r8\n\t"
  134981. "lsr r9, r8, #16\n\t"
  134982. "lsl r8, r8, #16\n\t"
  134983. "adds r5, r5, r8\n\t"
  134984. "adcs r6, r6, r9\n\t"
  134985. "adc r7, r7, #0\n\t"
  134986. #else
  134987. "umull r8, r9, r10, r12\n\t"
  134988. "adds r5, r5, r8\n\t"
  134989. "adcs r6, r6, r9\n\t"
  134990. "adc r7, r7, #0\n\t"
  134991. #endif
  134992. /* A[6] * A[12] */
  134993. "ldr r10, [%[a], #48]\n\t"
  134994. "ldr r12, [%[a], #24]\n\t"
  134995. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  134996. "lsl r8, r10, #16\n\t"
  134997. "lsl r9, r12, #16\n\t"
  134998. "lsr r8, r8, #16\n\t"
  134999. "lsr r9, r9, #16\n\t"
  135000. "mul r9, r8, r9\n\t"
  135001. "adds r5, r5, r9\n\t"
  135002. "adcs r6, r6, #0\n\t"
  135003. "adc r7, r7, #0\n\t"
  135004. "lsr r9, r12, #16\n\t"
  135005. "mul r8, r9, r8\n\t"
  135006. "lsr r9, r8, #16\n\t"
  135007. "lsl r8, r8, #16\n\t"
  135008. "adds r5, r5, r8\n\t"
  135009. "adcs r6, r6, r9\n\t"
  135010. "adc r7, r7, #0\n\t"
  135011. "lsr r8, r10, #16\n\t"
  135012. "lsr r9, r12, #16\n\t"
  135013. "mul r9, r8, r9\n\t"
  135014. "adds r6, r6, r9\n\t"
  135015. "adc r7, r7, #0\n\t"
  135016. "lsl r9, r12, #16\n\t"
  135017. "lsr r9, r9, #16\n\t"
  135018. "mul r8, r9, r8\n\t"
  135019. "lsr r9, r8, #16\n\t"
  135020. "lsl r8, r8, #16\n\t"
  135021. "adds r5, r5, r8\n\t"
  135022. "adcs r6, r6, r9\n\t"
  135023. "adc r7, r7, #0\n\t"
  135024. #else
  135025. "umull r8, r9, r10, r12\n\t"
  135026. "adds r5, r5, r8\n\t"
  135027. "adcs r6, r6, r9\n\t"
  135028. "adc r7, r7, #0\n\t"
  135029. #endif
  135030. /* A[7] * A[11] */
  135031. "ldr r10, [%[a], #44]\n\t"
  135032. "ldr r12, [%[a], #28]\n\t"
  135033. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135034. "lsl r8, r10, #16\n\t"
  135035. "lsl r9, r12, #16\n\t"
  135036. "lsr r8, r8, #16\n\t"
  135037. "lsr r9, r9, #16\n\t"
  135038. "mul r9, r8, r9\n\t"
  135039. "adds r5, r5, r9\n\t"
  135040. "adcs r6, r6, #0\n\t"
  135041. "adc r7, r7, #0\n\t"
  135042. "lsr r9, r12, #16\n\t"
  135043. "mul r8, r9, r8\n\t"
  135044. "lsr r9, r8, #16\n\t"
  135045. "lsl r8, r8, #16\n\t"
  135046. "adds r5, r5, r8\n\t"
  135047. "adcs r6, r6, r9\n\t"
  135048. "adc r7, r7, #0\n\t"
  135049. "lsr r8, r10, #16\n\t"
  135050. "lsr r9, r12, #16\n\t"
  135051. "mul r9, r8, r9\n\t"
  135052. "adds r6, r6, r9\n\t"
  135053. "adc r7, r7, #0\n\t"
  135054. "lsl r9, r12, #16\n\t"
  135055. "lsr r9, r9, #16\n\t"
  135056. "mul r8, r9, r8\n\t"
  135057. "lsr r9, r8, #16\n\t"
  135058. "lsl r8, r8, #16\n\t"
  135059. "adds r5, r5, r8\n\t"
  135060. "adcs r6, r6, r9\n\t"
  135061. "adc r7, r7, #0\n\t"
  135062. #else
  135063. "umull r8, r9, r10, r12\n\t"
  135064. "adds r5, r5, r8\n\t"
  135065. "adcs r6, r6, r9\n\t"
  135066. "adc r7, r7, #0\n\t"
  135067. #endif
  135068. /* A[8] * A[10] */
  135069. "ldr r10, [%[a], #40]\n\t"
  135070. "ldr r12, [%[a], #32]\n\t"
  135071. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135072. "lsl r8, r10, #16\n\t"
  135073. "lsl r9, r12, #16\n\t"
  135074. "lsr r8, r8, #16\n\t"
  135075. "lsr r9, r9, #16\n\t"
  135076. "mul r9, r8, r9\n\t"
  135077. "adds r5, r5, r9\n\t"
  135078. "adcs r6, r6, #0\n\t"
  135079. "adc r7, r7, #0\n\t"
  135080. "lsr r9, r12, #16\n\t"
  135081. "mul r8, r9, r8\n\t"
  135082. "lsr r9, r8, #16\n\t"
  135083. "lsl r8, r8, #16\n\t"
  135084. "adds r5, r5, r8\n\t"
  135085. "adcs r6, r6, r9\n\t"
  135086. "adc r7, r7, #0\n\t"
  135087. "lsr r8, r10, #16\n\t"
  135088. "lsr r9, r12, #16\n\t"
  135089. "mul r9, r8, r9\n\t"
  135090. "adds r6, r6, r9\n\t"
  135091. "adc r7, r7, #0\n\t"
  135092. "lsl r9, r12, #16\n\t"
  135093. "lsr r9, r9, #16\n\t"
  135094. "mul r8, r9, r8\n\t"
  135095. "lsr r9, r8, #16\n\t"
  135096. "lsl r8, r8, #16\n\t"
  135097. "adds r5, r5, r8\n\t"
  135098. "adcs r6, r6, r9\n\t"
  135099. "adc r7, r7, #0\n\t"
  135100. #else
  135101. "umull r8, r9, r10, r12\n\t"
  135102. "adds r5, r5, r8\n\t"
  135103. "adcs r6, r6, r9\n\t"
  135104. "adc r7, r7, #0\n\t"
  135105. #endif
  135106. /* A[9] * A[9] */
  135107. "ldr r10, [%[a], #36]\n\t"
  135108. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135109. "lsl r8, r10, #16\n\t"
  135110. "lsr r9, r10, #16\n\t"
  135111. "lsr r8, r8, #16\n\t"
  135112. "mov r12, r8\n\t"
  135113. "mul r8, r12, r8\n\t"
  135114. "mov r12, r9\n\t"
  135115. "mul r9, r12, r9\n\t"
  135116. "adds r2, r2, r8\n\t"
  135117. "adcs r3, r3, r9\n\t"
  135118. "adc r4, r4, #0\n\t"
  135119. "lsr r9, r10, #16\n\t"
  135120. "lsl r8, r10, #16\n\t"
  135121. "lsr r8, r8, #16\n\t"
  135122. "mul r8, r9, r8\n\t"
  135123. "lsr r9, r8, #15\n\t"
  135124. "lsl r8, r8, #17\n\t"
  135125. "adds r2, r2, r8\n\t"
  135126. "adcs r3, r3, r9\n\t"
  135127. "adc r4, r4, #0\n\t"
  135128. "adds r5, r5, r5\n\t"
  135129. "adcs r6, r6, r6\n\t"
  135130. "adc r7, r7, r7\n\t"
  135131. #else
  135132. "umull r8, r9, r10, r10\n\t"
  135133. "adds r5, r5, r5\n\t"
  135134. "adcs r6, r6, r6\n\t"
  135135. "adc r7, r7, r7\n\t"
  135136. "adds r2, r2, r8\n\t"
  135137. "adcs r3, r3, r9\n\t"
  135138. "adc r4, r4, #0\n\t"
  135139. #endif
  135140. "adds r2, r2, r5\n\t"
  135141. "adcs r3, r3, r6\n\t"
  135142. "adc r4, r4, r7\n\t"
  135143. "str r2, [%[r], #72]\n\t"
  135144. /* A[4] * A[15] */
  135145. "ldr r10, [%[a], #60]\n\t"
  135146. "ldr r12, [%[a], #16]\n\t"
  135147. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135148. "lsl r8, r10, #16\n\t"
  135149. "lsl r5, r12, #16\n\t"
  135150. "lsr r8, r8, #16\n\t"
  135151. "lsr r5, r5, #16\n\t"
  135152. "mul r5, r8, r5\n\t"
  135153. "lsr r9, r12, #16\n\t"
  135154. "mul r8, r9, r8\n\t"
  135155. "lsr r6, r8, #16\n\t"
  135156. "lsl r8, r8, #16\n\t"
  135157. "adds r5, r5, r8\n\t"
  135158. "adc r6, r6, #0\n\t"
  135159. "lsr r8, r10, #16\n\t"
  135160. "mul r9, r8, r9\n\t"
  135161. "add r6, r6, r9\n\t"
  135162. "lsl r9, r12, #16\n\t"
  135163. "lsr r9, r9, #16\n\t"
  135164. "mul r8, r9, r8\n\t"
  135165. "lsr r9, r8, #16\n\t"
  135166. "lsl r8, r8, #16\n\t"
  135167. "adds r5, r5, r8\n\t"
  135168. "adc r6, r6, r9\n\t"
  135169. #else
  135170. "umull r5, r6, r10, r12\n\t"
  135171. #endif
  135172. "mov r2, #0\n\t"
  135173. "mov r7, #0\n\t"
  135174. /* A[5] * A[14] */
  135175. "ldr r10, [%[a], #56]\n\t"
  135176. "ldr r12, [%[a], #20]\n\t"
  135177. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135178. "lsl r8, r10, #16\n\t"
  135179. "lsl r9, r12, #16\n\t"
  135180. "lsr r8, r8, #16\n\t"
  135181. "lsr r9, r9, #16\n\t"
  135182. "mul r9, r8, r9\n\t"
  135183. "adds r5, r5, r9\n\t"
  135184. "adcs r6, r6, #0\n\t"
  135185. "adc r7, r7, #0\n\t"
  135186. "lsr r9, r12, #16\n\t"
  135187. "mul r8, r9, r8\n\t"
  135188. "lsr r9, r8, #16\n\t"
  135189. "lsl r8, r8, #16\n\t"
  135190. "adds r5, r5, r8\n\t"
  135191. "adcs r6, r6, r9\n\t"
  135192. "adc r7, r7, #0\n\t"
  135193. "lsr r8, r10, #16\n\t"
  135194. "lsr r9, r12, #16\n\t"
  135195. "mul r9, r8, r9\n\t"
  135196. "adds r6, r6, r9\n\t"
  135197. "adc r7, r7, #0\n\t"
  135198. "lsl r9, r12, #16\n\t"
  135199. "lsr r9, r9, #16\n\t"
  135200. "mul r8, r9, r8\n\t"
  135201. "lsr r9, r8, #16\n\t"
  135202. "lsl r8, r8, #16\n\t"
  135203. "adds r5, r5, r8\n\t"
  135204. "adcs r6, r6, r9\n\t"
  135205. "adc r7, r7, #0\n\t"
  135206. #else
  135207. "umull r8, r9, r10, r12\n\t"
  135208. "adds r5, r5, r8\n\t"
  135209. "adcs r6, r6, r9\n\t"
  135210. "adc r7, r7, #0\n\t"
  135211. #endif
  135212. /* A[6] * A[13] */
  135213. "ldr r10, [%[a], #52]\n\t"
  135214. "ldr r12, [%[a], #24]\n\t"
  135215. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135216. "lsl r8, r10, #16\n\t"
  135217. "lsl r9, r12, #16\n\t"
  135218. "lsr r8, r8, #16\n\t"
  135219. "lsr r9, r9, #16\n\t"
  135220. "mul r9, r8, r9\n\t"
  135221. "adds r5, r5, r9\n\t"
  135222. "adcs r6, r6, #0\n\t"
  135223. "adc r7, r7, #0\n\t"
  135224. "lsr r9, r12, #16\n\t"
  135225. "mul r8, r9, r8\n\t"
  135226. "lsr r9, r8, #16\n\t"
  135227. "lsl r8, r8, #16\n\t"
  135228. "adds r5, r5, r8\n\t"
  135229. "adcs r6, r6, r9\n\t"
  135230. "adc r7, r7, #0\n\t"
  135231. "lsr r8, r10, #16\n\t"
  135232. "lsr r9, r12, #16\n\t"
  135233. "mul r9, r8, r9\n\t"
  135234. "adds r6, r6, r9\n\t"
  135235. "adc r7, r7, #0\n\t"
  135236. "lsl r9, r12, #16\n\t"
  135237. "lsr r9, r9, #16\n\t"
  135238. "mul r8, r9, r8\n\t"
  135239. "lsr r9, r8, #16\n\t"
  135240. "lsl r8, r8, #16\n\t"
  135241. "adds r5, r5, r8\n\t"
  135242. "adcs r6, r6, r9\n\t"
  135243. "adc r7, r7, #0\n\t"
  135244. #else
  135245. "umull r8, r9, r10, r12\n\t"
  135246. "adds r5, r5, r8\n\t"
  135247. "adcs r6, r6, r9\n\t"
  135248. "adc r7, r7, #0\n\t"
  135249. #endif
  135250. /* A[7] * A[12] */
  135251. "ldr r10, [%[a], #48]\n\t"
  135252. "ldr r12, [%[a], #28]\n\t"
  135253. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135254. "lsl r8, r10, #16\n\t"
  135255. "lsl r9, r12, #16\n\t"
  135256. "lsr r8, r8, #16\n\t"
  135257. "lsr r9, r9, #16\n\t"
  135258. "mul r9, r8, r9\n\t"
  135259. "adds r5, r5, r9\n\t"
  135260. "adcs r6, r6, #0\n\t"
  135261. "adc r7, r7, #0\n\t"
  135262. "lsr r9, r12, #16\n\t"
  135263. "mul r8, r9, r8\n\t"
  135264. "lsr r9, r8, #16\n\t"
  135265. "lsl r8, r8, #16\n\t"
  135266. "adds r5, r5, r8\n\t"
  135267. "adcs r6, r6, r9\n\t"
  135268. "adc r7, r7, #0\n\t"
  135269. "lsr r8, r10, #16\n\t"
  135270. "lsr r9, r12, #16\n\t"
  135271. "mul r9, r8, r9\n\t"
  135272. "adds r6, r6, r9\n\t"
  135273. "adc r7, r7, #0\n\t"
  135274. "lsl r9, r12, #16\n\t"
  135275. "lsr r9, r9, #16\n\t"
  135276. "mul r8, r9, r8\n\t"
  135277. "lsr r9, r8, #16\n\t"
  135278. "lsl r8, r8, #16\n\t"
  135279. "adds r5, r5, r8\n\t"
  135280. "adcs r6, r6, r9\n\t"
  135281. "adc r7, r7, #0\n\t"
  135282. #else
  135283. "umull r8, r9, r10, r12\n\t"
  135284. "adds r5, r5, r8\n\t"
  135285. "adcs r6, r6, r9\n\t"
  135286. "adc r7, r7, #0\n\t"
  135287. #endif
  135288. /* A[8] * A[11] */
  135289. "ldr r10, [%[a], #44]\n\t"
  135290. "ldr r12, [%[a], #32]\n\t"
  135291. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135292. "lsl r8, r10, #16\n\t"
  135293. "lsl r9, r12, #16\n\t"
  135294. "lsr r8, r8, #16\n\t"
  135295. "lsr r9, r9, #16\n\t"
  135296. "mul r9, r8, r9\n\t"
  135297. "adds r5, r5, r9\n\t"
  135298. "adcs r6, r6, #0\n\t"
  135299. "adc r7, r7, #0\n\t"
  135300. "lsr r9, r12, #16\n\t"
  135301. "mul r8, r9, r8\n\t"
  135302. "lsr r9, r8, #16\n\t"
  135303. "lsl r8, r8, #16\n\t"
  135304. "adds r5, r5, r8\n\t"
  135305. "adcs r6, r6, r9\n\t"
  135306. "adc r7, r7, #0\n\t"
  135307. "lsr r8, r10, #16\n\t"
  135308. "lsr r9, r12, #16\n\t"
  135309. "mul r9, r8, r9\n\t"
  135310. "adds r6, r6, r9\n\t"
  135311. "adc r7, r7, #0\n\t"
  135312. "lsl r9, r12, #16\n\t"
  135313. "lsr r9, r9, #16\n\t"
  135314. "mul r8, r9, r8\n\t"
  135315. "lsr r9, r8, #16\n\t"
  135316. "lsl r8, r8, #16\n\t"
  135317. "adds r5, r5, r8\n\t"
  135318. "adcs r6, r6, r9\n\t"
  135319. "adc r7, r7, #0\n\t"
  135320. #else
  135321. "umull r8, r9, r10, r12\n\t"
  135322. "adds r5, r5, r8\n\t"
  135323. "adcs r6, r6, r9\n\t"
  135324. "adc r7, r7, #0\n\t"
  135325. #endif
  135326. /* A[9] * A[10] */
  135327. "ldr r10, [%[a], #40]\n\t"
  135328. "ldr r12, [%[a], #36]\n\t"
  135329. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135330. "lsl r8, r10, #16\n\t"
  135331. "lsl r9, r12, #16\n\t"
  135332. "lsr r8, r8, #16\n\t"
  135333. "lsr r9, r9, #16\n\t"
  135334. "mul r9, r8, r9\n\t"
  135335. "adds r5, r5, r9\n\t"
  135336. "adcs r6, r6, #0\n\t"
  135337. "adc r7, r7, #0\n\t"
  135338. "lsr r9, r12, #16\n\t"
  135339. "mul r8, r9, r8\n\t"
  135340. "lsr r9, r8, #16\n\t"
  135341. "lsl r8, r8, #16\n\t"
  135342. "adds r5, r5, r8\n\t"
  135343. "adcs r6, r6, r9\n\t"
  135344. "adc r7, r7, #0\n\t"
  135345. "lsr r8, r10, #16\n\t"
  135346. "lsr r9, r12, #16\n\t"
  135347. "mul r9, r8, r9\n\t"
  135348. "adds r6, r6, r9\n\t"
  135349. "adc r7, r7, #0\n\t"
  135350. "lsl r9, r12, #16\n\t"
  135351. "lsr r9, r9, #16\n\t"
  135352. "mul r8, r9, r8\n\t"
  135353. "lsr r9, r8, #16\n\t"
  135354. "lsl r8, r8, #16\n\t"
  135355. "adds r5, r5, r8\n\t"
  135356. "adcs r6, r6, r9\n\t"
  135357. "adc r7, r7, #0\n\t"
  135358. #else
  135359. "umull r8, r9, r10, r12\n\t"
  135360. "adds r5, r5, r8\n\t"
  135361. "adcs r6, r6, r9\n\t"
  135362. "adc r7, r7, #0\n\t"
  135363. #endif
  135364. "adds r5, r5, r5\n\t"
  135365. "adcs r6, r6, r6\n\t"
  135366. "adc r7, r7, r7\n\t"
  135367. "adds r3, r3, r5\n\t"
  135368. "adcs r4, r4, r6\n\t"
  135369. "adc r2, r2, r7\n\t"
  135370. "str r3, [%[r], #76]\n\t"
  135371. /* A[5] * A[15] */
  135372. "ldr r10, [%[a], #60]\n\t"
  135373. "ldr r12, [%[a], #20]\n\t"
  135374. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135375. "lsl r8, r10, #16\n\t"
  135376. "lsl r5, r12, #16\n\t"
  135377. "lsr r8, r8, #16\n\t"
  135378. "lsr r5, r5, #16\n\t"
  135379. "mul r5, r8, r5\n\t"
  135380. "lsr r9, r12, #16\n\t"
  135381. "mul r8, r9, r8\n\t"
  135382. "lsr r6, r8, #16\n\t"
  135383. "lsl r8, r8, #16\n\t"
  135384. "adds r5, r5, r8\n\t"
  135385. "adc r6, r6, #0\n\t"
  135386. "lsr r8, r10, #16\n\t"
  135387. "mul r9, r8, r9\n\t"
  135388. "add r6, r6, r9\n\t"
  135389. "lsl r9, r12, #16\n\t"
  135390. "lsr r9, r9, #16\n\t"
  135391. "mul r8, r9, r8\n\t"
  135392. "lsr r9, r8, #16\n\t"
  135393. "lsl r8, r8, #16\n\t"
  135394. "adds r5, r5, r8\n\t"
  135395. "adc r6, r6, r9\n\t"
  135396. #else
  135397. "umull r5, r6, r10, r12\n\t"
  135398. #endif
  135399. "mov r3, #0\n\t"
  135400. "mov r7, #0\n\t"
  135401. /* A[6] * A[14] */
  135402. "ldr r10, [%[a], #56]\n\t"
  135403. "ldr r12, [%[a], #24]\n\t"
  135404. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135405. "lsl r8, r10, #16\n\t"
  135406. "lsl r9, r12, #16\n\t"
  135407. "lsr r8, r8, #16\n\t"
  135408. "lsr r9, r9, #16\n\t"
  135409. "mul r9, r8, r9\n\t"
  135410. "adds r5, r5, r9\n\t"
  135411. "adcs r6, r6, #0\n\t"
  135412. "adc r7, r7, #0\n\t"
  135413. "lsr r9, r12, #16\n\t"
  135414. "mul r8, r9, r8\n\t"
  135415. "lsr r9, r8, #16\n\t"
  135416. "lsl r8, r8, #16\n\t"
  135417. "adds r5, r5, r8\n\t"
  135418. "adcs r6, r6, r9\n\t"
  135419. "adc r7, r7, #0\n\t"
  135420. "lsr r8, r10, #16\n\t"
  135421. "lsr r9, r12, #16\n\t"
  135422. "mul r9, r8, r9\n\t"
  135423. "adds r6, r6, r9\n\t"
  135424. "adc r7, r7, #0\n\t"
  135425. "lsl r9, r12, #16\n\t"
  135426. "lsr r9, r9, #16\n\t"
  135427. "mul r8, r9, r8\n\t"
  135428. "lsr r9, r8, #16\n\t"
  135429. "lsl r8, r8, #16\n\t"
  135430. "adds r5, r5, r8\n\t"
  135431. "adcs r6, r6, r9\n\t"
  135432. "adc r7, r7, #0\n\t"
  135433. #else
  135434. "umull r8, r9, r10, r12\n\t"
  135435. "adds r5, r5, r8\n\t"
  135436. "adcs r6, r6, r9\n\t"
  135437. "adc r7, r7, #0\n\t"
  135438. #endif
  135439. /* A[7] * A[13] */
  135440. "ldr r10, [%[a], #52]\n\t"
  135441. "ldr r12, [%[a], #28]\n\t"
  135442. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135443. "lsl r8, r10, #16\n\t"
  135444. "lsl r9, r12, #16\n\t"
  135445. "lsr r8, r8, #16\n\t"
  135446. "lsr r9, r9, #16\n\t"
  135447. "mul r9, r8, r9\n\t"
  135448. "adds r5, r5, r9\n\t"
  135449. "adcs r6, r6, #0\n\t"
  135450. "adc r7, r7, #0\n\t"
  135451. "lsr r9, r12, #16\n\t"
  135452. "mul r8, r9, r8\n\t"
  135453. "lsr r9, r8, #16\n\t"
  135454. "lsl r8, r8, #16\n\t"
  135455. "adds r5, r5, r8\n\t"
  135456. "adcs r6, r6, r9\n\t"
  135457. "adc r7, r7, #0\n\t"
  135458. "lsr r8, r10, #16\n\t"
  135459. "lsr r9, r12, #16\n\t"
  135460. "mul r9, r8, r9\n\t"
  135461. "adds r6, r6, r9\n\t"
  135462. "adc r7, r7, #0\n\t"
  135463. "lsl r9, r12, #16\n\t"
  135464. "lsr r9, r9, #16\n\t"
  135465. "mul r8, r9, r8\n\t"
  135466. "lsr r9, r8, #16\n\t"
  135467. "lsl r8, r8, #16\n\t"
  135468. "adds r5, r5, r8\n\t"
  135469. "adcs r6, r6, r9\n\t"
  135470. "adc r7, r7, #0\n\t"
  135471. #else
  135472. "umull r8, r9, r10, r12\n\t"
  135473. "adds r5, r5, r8\n\t"
  135474. "adcs r6, r6, r9\n\t"
  135475. "adc r7, r7, #0\n\t"
  135476. #endif
  135477. /* A[8] * A[12] */
  135478. "ldr r10, [%[a], #48]\n\t"
  135479. "ldr r12, [%[a], #32]\n\t"
  135480. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135481. "lsl r8, r10, #16\n\t"
  135482. "lsl r9, r12, #16\n\t"
  135483. "lsr r8, r8, #16\n\t"
  135484. "lsr r9, r9, #16\n\t"
  135485. "mul r9, r8, r9\n\t"
  135486. "adds r5, r5, r9\n\t"
  135487. "adcs r6, r6, #0\n\t"
  135488. "adc r7, r7, #0\n\t"
  135489. "lsr r9, r12, #16\n\t"
  135490. "mul r8, r9, r8\n\t"
  135491. "lsr r9, r8, #16\n\t"
  135492. "lsl r8, r8, #16\n\t"
  135493. "adds r5, r5, r8\n\t"
  135494. "adcs r6, r6, r9\n\t"
  135495. "adc r7, r7, #0\n\t"
  135496. "lsr r8, r10, #16\n\t"
  135497. "lsr r9, r12, #16\n\t"
  135498. "mul r9, r8, r9\n\t"
  135499. "adds r6, r6, r9\n\t"
  135500. "adc r7, r7, #0\n\t"
  135501. "lsl r9, r12, #16\n\t"
  135502. "lsr r9, r9, #16\n\t"
  135503. "mul r8, r9, r8\n\t"
  135504. "lsr r9, r8, #16\n\t"
  135505. "lsl r8, r8, #16\n\t"
  135506. "adds r5, r5, r8\n\t"
  135507. "adcs r6, r6, r9\n\t"
  135508. "adc r7, r7, #0\n\t"
  135509. #else
  135510. "umull r8, r9, r10, r12\n\t"
  135511. "adds r5, r5, r8\n\t"
  135512. "adcs r6, r6, r9\n\t"
  135513. "adc r7, r7, #0\n\t"
  135514. #endif
  135515. /* A[9] * A[11] */
  135516. "ldr r10, [%[a], #44]\n\t"
  135517. "ldr r12, [%[a], #36]\n\t"
  135518. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135519. "lsl r8, r10, #16\n\t"
  135520. "lsl r9, r12, #16\n\t"
  135521. "lsr r8, r8, #16\n\t"
  135522. "lsr r9, r9, #16\n\t"
  135523. "mul r9, r8, r9\n\t"
  135524. "adds r5, r5, r9\n\t"
  135525. "adcs r6, r6, #0\n\t"
  135526. "adc r7, r7, #0\n\t"
  135527. "lsr r9, r12, #16\n\t"
  135528. "mul r8, r9, r8\n\t"
  135529. "lsr r9, r8, #16\n\t"
  135530. "lsl r8, r8, #16\n\t"
  135531. "adds r5, r5, r8\n\t"
  135532. "adcs r6, r6, r9\n\t"
  135533. "adc r7, r7, #0\n\t"
  135534. "lsr r8, r10, #16\n\t"
  135535. "lsr r9, r12, #16\n\t"
  135536. "mul r9, r8, r9\n\t"
  135537. "adds r6, r6, r9\n\t"
  135538. "adc r7, r7, #0\n\t"
  135539. "lsl r9, r12, #16\n\t"
  135540. "lsr r9, r9, #16\n\t"
  135541. "mul r8, r9, r8\n\t"
  135542. "lsr r9, r8, #16\n\t"
  135543. "lsl r8, r8, #16\n\t"
  135544. "adds r5, r5, r8\n\t"
  135545. "adcs r6, r6, r9\n\t"
  135546. "adc r7, r7, #0\n\t"
  135547. #else
  135548. "umull r8, r9, r10, r12\n\t"
  135549. "adds r5, r5, r8\n\t"
  135550. "adcs r6, r6, r9\n\t"
  135551. "adc r7, r7, #0\n\t"
  135552. #endif
  135553. /* A[10] * A[10] */
  135554. "ldr r10, [%[a], #40]\n\t"
  135555. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135556. "lsl r8, r10, #16\n\t"
  135557. "lsr r9, r10, #16\n\t"
  135558. "lsr r8, r8, #16\n\t"
  135559. "mov r12, r8\n\t"
  135560. "mul r8, r12, r8\n\t"
  135561. "mov r12, r9\n\t"
  135562. "mul r9, r12, r9\n\t"
  135563. "adds r4, r4, r8\n\t"
  135564. "adcs r2, r2, r9\n\t"
  135565. "adc r3, r3, #0\n\t"
  135566. "lsr r9, r10, #16\n\t"
  135567. "lsl r8, r10, #16\n\t"
  135568. "lsr r8, r8, #16\n\t"
  135569. "mul r8, r9, r8\n\t"
  135570. "lsr r9, r8, #15\n\t"
  135571. "lsl r8, r8, #17\n\t"
  135572. "adds r4, r4, r8\n\t"
  135573. "adcs r2, r2, r9\n\t"
  135574. "adc r3, r3, #0\n\t"
  135575. "adds r5, r5, r5\n\t"
  135576. "adcs r6, r6, r6\n\t"
  135577. "adc r7, r7, r7\n\t"
  135578. #else
  135579. "umull r8, r9, r10, r10\n\t"
  135580. "adds r5, r5, r5\n\t"
  135581. "adcs r6, r6, r6\n\t"
  135582. "adc r7, r7, r7\n\t"
  135583. "adds r4, r4, r8\n\t"
  135584. "adcs r2, r2, r9\n\t"
  135585. "adc r3, r3, #0\n\t"
  135586. #endif
  135587. "adds r4, r4, r5\n\t"
  135588. "adcs r2, r2, r6\n\t"
  135589. "adc r3, r3, r7\n\t"
  135590. "str r4, [%[r], #80]\n\t"
  135591. /* A[6] * A[15] */
  135592. "ldr r10, [%[a], #60]\n\t"
  135593. "ldr r12, [%[a], #24]\n\t"
  135594. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135595. "lsl r8, r10, #16\n\t"
  135596. "lsl r5, r12, #16\n\t"
  135597. "lsr r8, r8, #16\n\t"
  135598. "lsr r5, r5, #16\n\t"
  135599. "mul r5, r8, r5\n\t"
  135600. "lsr r9, r12, #16\n\t"
  135601. "mul r8, r9, r8\n\t"
  135602. "lsr r6, r8, #16\n\t"
  135603. "lsl r8, r8, #16\n\t"
  135604. "adds r5, r5, r8\n\t"
  135605. "adc r6, r6, #0\n\t"
  135606. "lsr r8, r10, #16\n\t"
  135607. "mul r9, r8, r9\n\t"
  135608. "add r6, r6, r9\n\t"
  135609. "lsl r9, r12, #16\n\t"
  135610. "lsr r9, r9, #16\n\t"
  135611. "mul r8, r9, r8\n\t"
  135612. "lsr r9, r8, #16\n\t"
  135613. "lsl r8, r8, #16\n\t"
  135614. "adds r5, r5, r8\n\t"
  135615. "adc r6, r6, r9\n\t"
  135616. #else
  135617. "umull r5, r6, r10, r12\n\t"
  135618. #endif
  135619. "mov r4, #0\n\t"
  135620. "mov r7, #0\n\t"
  135621. /* A[7] * A[14] */
  135622. "ldr r10, [%[a], #56]\n\t"
  135623. "ldr r12, [%[a], #28]\n\t"
  135624. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135625. "lsl r8, r10, #16\n\t"
  135626. "lsl r9, r12, #16\n\t"
  135627. "lsr r8, r8, #16\n\t"
  135628. "lsr r9, r9, #16\n\t"
  135629. "mul r9, r8, r9\n\t"
  135630. "adds r5, r5, r9\n\t"
  135631. "adcs r6, r6, #0\n\t"
  135632. "adc r7, r7, #0\n\t"
  135633. "lsr r9, r12, #16\n\t"
  135634. "mul r8, r9, r8\n\t"
  135635. "lsr r9, r8, #16\n\t"
  135636. "lsl r8, r8, #16\n\t"
  135637. "adds r5, r5, r8\n\t"
  135638. "adcs r6, r6, r9\n\t"
  135639. "adc r7, r7, #0\n\t"
  135640. "lsr r8, r10, #16\n\t"
  135641. "lsr r9, r12, #16\n\t"
  135642. "mul r9, r8, r9\n\t"
  135643. "adds r6, r6, r9\n\t"
  135644. "adc r7, r7, #0\n\t"
  135645. "lsl r9, r12, #16\n\t"
  135646. "lsr r9, r9, #16\n\t"
  135647. "mul r8, r9, r8\n\t"
  135648. "lsr r9, r8, #16\n\t"
  135649. "lsl r8, r8, #16\n\t"
  135650. "adds r5, r5, r8\n\t"
  135651. "adcs r6, r6, r9\n\t"
  135652. "adc r7, r7, #0\n\t"
  135653. #else
  135654. "umull r8, r9, r10, r12\n\t"
  135655. "adds r5, r5, r8\n\t"
  135656. "adcs r6, r6, r9\n\t"
  135657. "adc r7, r7, #0\n\t"
  135658. #endif
  135659. /* A[8] * A[13] */
  135660. "ldr r10, [%[a], #52]\n\t"
  135661. "ldr r12, [%[a], #32]\n\t"
  135662. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135663. "lsl r8, r10, #16\n\t"
  135664. "lsl r9, r12, #16\n\t"
  135665. "lsr r8, r8, #16\n\t"
  135666. "lsr r9, r9, #16\n\t"
  135667. "mul r9, r8, r9\n\t"
  135668. "adds r5, r5, r9\n\t"
  135669. "adcs r6, r6, #0\n\t"
  135670. "adc r7, r7, #0\n\t"
  135671. "lsr r9, r12, #16\n\t"
  135672. "mul r8, r9, r8\n\t"
  135673. "lsr r9, r8, #16\n\t"
  135674. "lsl r8, r8, #16\n\t"
  135675. "adds r5, r5, r8\n\t"
  135676. "adcs r6, r6, r9\n\t"
  135677. "adc r7, r7, #0\n\t"
  135678. "lsr r8, r10, #16\n\t"
  135679. "lsr r9, r12, #16\n\t"
  135680. "mul r9, r8, r9\n\t"
  135681. "adds r6, r6, r9\n\t"
  135682. "adc r7, r7, #0\n\t"
  135683. "lsl r9, r12, #16\n\t"
  135684. "lsr r9, r9, #16\n\t"
  135685. "mul r8, r9, r8\n\t"
  135686. "lsr r9, r8, #16\n\t"
  135687. "lsl r8, r8, #16\n\t"
  135688. "adds r5, r5, r8\n\t"
  135689. "adcs r6, r6, r9\n\t"
  135690. "adc r7, r7, #0\n\t"
  135691. #else
  135692. "umull r8, r9, r10, r12\n\t"
  135693. "adds r5, r5, r8\n\t"
  135694. "adcs r6, r6, r9\n\t"
  135695. "adc r7, r7, #0\n\t"
  135696. #endif
  135697. /* A[9] * A[12] */
  135698. "ldr r10, [%[a], #48]\n\t"
  135699. "ldr r12, [%[a], #36]\n\t"
  135700. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135701. "lsl r8, r10, #16\n\t"
  135702. "lsl r9, r12, #16\n\t"
  135703. "lsr r8, r8, #16\n\t"
  135704. "lsr r9, r9, #16\n\t"
  135705. "mul r9, r8, r9\n\t"
  135706. "adds r5, r5, r9\n\t"
  135707. "adcs r6, r6, #0\n\t"
  135708. "adc r7, r7, #0\n\t"
  135709. "lsr r9, r12, #16\n\t"
  135710. "mul r8, r9, r8\n\t"
  135711. "lsr r9, r8, #16\n\t"
  135712. "lsl r8, r8, #16\n\t"
  135713. "adds r5, r5, r8\n\t"
  135714. "adcs r6, r6, r9\n\t"
  135715. "adc r7, r7, #0\n\t"
  135716. "lsr r8, r10, #16\n\t"
  135717. "lsr r9, r12, #16\n\t"
  135718. "mul r9, r8, r9\n\t"
  135719. "adds r6, r6, r9\n\t"
  135720. "adc r7, r7, #0\n\t"
  135721. "lsl r9, r12, #16\n\t"
  135722. "lsr r9, r9, #16\n\t"
  135723. "mul r8, r9, r8\n\t"
  135724. "lsr r9, r8, #16\n\t"
  135725. "lsl r8, r8, #16\n\t"
  135726. "adds r5, r5, r8\n\t"
  135727. "adcs r6, r6, r9\n\t"
  135728. "adc r7, r7, #0\n\t"
  135729. #else
  135730. "umull r8, r9, r10, r12\n\t"
  135731. "adds r5, r5, r8\n\t"
  135732. "adcs r6, r6, r9\n\t"
  135733. "adc r7, r7, #0\n\t"
  135734. #endif
  135735. /* A[10] * A[11] */
  135736. "ldr r10, [%[a], #44]\n\t"
  135737. "ldr r12, [%[a], #40]\n\t"
  135738. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135739. "lsl r8, r10, #16\n\t"
  135740. "lsl r9, r12, #16\n\t"
  135741. "lsr r8, r8, #16\n\t"
  135742. "lsr r9, r9, #16\n\t"
  135743. "mul r9, r8, r9\n\t"
  135744. "adds r5, r5, r9\n\t"
  135745. "adcs r6, r6, #0\n\t"
  135746. "adc r7, r7, #0\n\t"
  135747. "lsr r9, r12, #16\n\t"
  135748. "mul r8, r9, r8\n\t"
  135749. "lsr r9, r8, #16\n\t"
  135750. "lsl r8, r8, #16\n\t"
  135751. "adds r5, r5, r8\n\t"
  135752. "adcs r6, r6, r9\n\t"
  135753. "adc r7, r7, #0\n\t"
  135754. "lsr r8, r10, #16\n\t"
  135755. "lsr r9, r12, #16\n\t"
  135756. "mul r9, r8, r9\n\t"
  135757. "adds r6, r6, r9\n\t"
  135758. "adc r7, r7, #0\n\t"
  135759. "lsl r9, r12, #16\n\t"
  135760. "lsr r9, r9, #16\n\t"
  135761. "mul r8, r9, r8\n\t"
  135762. "lsr r9, r8, #16\n\t"
  135763. "lsl r8, r8, #16\n\t"
  135764. "adds r5, r5, r8\n\t"
  135765. "adcs r6, r6, r9\n\t"
  135766. "adc r7, r7, #0\n\t"
  135767. #else
  135768. "umull r8, r9, r10, r12\n\t"
  135769. "adds r5, r5, r8\n\t"
  135770. "adcs r6, r6, r9\n\t"
  135771. "adc r7, r7, #0\n\t"
  135772. #endif
  135773. "adds r5, r5, r5\n\t"
  135774. "adcs r6, r6, r6\n\t"
  135775. "adc r7, r7, r7\n\t"
  135776. "adds r2, r2, r5\n\t"
  135777. "adcs r3, r3, r6\n\t"
  135778. "adc r4, r4, r7\n\t"
  135779. "str r2, [%[r], #84]\n\t"
  135780. /* A[7] * A[15] */
  135781. "ldr r10, [%[a], #60]\n\t"
  135782. "ldr r12, [%[a], #28]\n\t"
  135783. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135784. "lsl r8, r10, #16\n\t"
  135785. "lsl r5, r12, #16\n\t"
  135786. "lsr r8, r8, #16\n\t"
  135787. "lsr r5, r5, #16\n\t"
  135788. "mul r5, r8, r5\n\t"
  135789. "lsr r9, r12, #16\n\t"
  135790. "mul r8, r9, r8\n\t"
  135791. "lsr r6, r8, #16\n\t"
  135792. "lsl r8, r8, #16\n\t"
  135793. "adds r5, r5, r8\n\t"
  135794. "adc r6, r6, #0\n\t"
  135795. "lsr r8, r10, #16\n\t"
  135796. "mul r9, r8, r9\n\t"
  135797. "add r6, r6, r9\n\t"
  135798. "lsl r9, r12, #16\n\t"
  135799. "lsr r9, r9, #16\n\t"
  135800. "mul r8, r9, r8\n\t"
  135801. "lsr r9, r8, #16\n\t"
  135802. "lsl r8, r8, #16\n\t"
  135803. "adds r5, r5, r8\n\t"
  135804. "adc r6, r6, r9\n\t"
  135805. #else
  135806. "umull r5, r6, r10, r12\n\t"
  135807. #endif
  135808. "mov r2, #0\n\t"
  135809. "mov r7, #0\n\t"
  135810. /* A[8] * A[14] */
  135811. "ldr r10, [%[a], #56]\n\t"
  135812. "ldr r12, [%[a], #32]\n\t"
  135813. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135814. "lsl r8, r10, #16\n\t"
  135815. "lsl r9, r12, #16\n\t"
  135816. "lsr r8, r8, #16\n\t"
  135817. "lsr r9, r9, #16\n\t"
  135818. "mul r9, r8, r9\n\t"
  135819. "adds r5, r5, r9\n\t"
  135820. "adcs r6, r6, #0\n\t"
  135821. "adc r7, r7, #0\n\t"
  135822. "lsr r9, r12, #16\n\t"
  135823. "mul r8, r9, r8\n\t"
  135824. "lsr r9, r8, #16\n\t"
  135825. "lsl r8, r8, #16\n\t"
  135826. "adds r5, r5, r8\n\t"
  135827. "adcs r6, r6, r9\n\t"
  135828. "adc r7, r7, #0\n\t"
  135829. "lsr r8, r10, #16\n\t"
  135830. "lsr r9, r12, #16\n\t"
  135831. "mul r9, r8, r9\n\t"
  135832. "adds r6, r6, r9\n\t"
  135833. "adc r7, r7, #0\n\t"
  135834. "lsl r9, r12, #16\n\t"
  135835. "lsr r9, r9, #16\n\t"
  135836. "mul r8, r9, r8\n\t"
  135837. "lsr r9, r8, #16\n\t"
  135838. "lsl r8, r8, #16\n\t"
  135839. "adds r5, r5, r8\n\t"
  135840. "adcs r6, r6, r9\n\t"
  135841. "adc r7, r7, #0\n\t"
  135842. #else
  135843. "umull r8, r9, r10, r12\n\t"
  135844. "adds r5, r5, r8\n\t"
  135845. "adcs r6, r6, r9\n\t"
  135846. "adc r7, r7, #0\n\t"
  135847. #endif
  135848. /* A[9] * A[13] */
  135849. "ldr r10, [%[a], #52]\n\t"
  135850. "ldr r12, [%[a], #36]\n\t"
  135851. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135852. "lsl r8, r10, #16\n\t"
  135853. "lsl r9, r12, #16\n\t"
  135854. "lsr r8, r8, #16\n\t"
  135855. "lsr r9, r9, #16\n\t"
  135856. "mul r9, r8, r9\n\t"
  135857. "adds r5, r5, r9\n\t"
  135858. "adcs r6, r6, #0\n\t"
  135859. "adc r7, r7, #0\n\t"
  135860. "lsr r9, r12, #16\n\t"
  135861. "mul r8, r9, r8\n\t"
  135862. "lsr r9, r8, #16\n\t"
  135863. "lsl r8, r8, #16\n\t"
  135864. "adds r5, r5, r8\n\t"
  135865. "adcs r6, r6, r9\n\t"
  135866. "adc r7, r7, #0\n\t"
  135867. "lsr r8, r10, #16\n\t"
  135868. "lsr r9, r12, #16\n\t"
  135869. "mul r9, r8, r9\n\t"
  135870. "adds r6, r6, r9\n\t"
  135871. "adc r7, r7, #0\n\t"
  135872. "lsl r9, r12, #16\n\t"
  135873. "lsr r9, r9, #16\n\t"
  135874. "mul r8, r9, r8\n\t"
  135875. "lsr r9, r8, #16\n\t"
  135876. "lsl r8, r8, #16\n\t"
  135877. "adds r5, r5, r8\n\t"
  135878. "adcs r6, r6, r9\n\t"
  135879. "adc r7, r7, #0\n\t"
  135880. #else
  135881. "umull r8, r9, r10, r12\n\t"
  135882. "adds r5, r5, r8\n\t"
  135883. "adcs r6, r6, r9\n\t"
  135884. "adc r7, r7, #0\n\t"
  135885. #endif
  135886. /* A[10] * A[12] */
  135887. "ldr r10, [%[a], #48]\n\t"
  135888. "ldr r12, [%[a], #40]\n\t"
  135889. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135890. "lsl r8, r10, #16\n\t"
  135891. "lsl r9, r12, #16\n\t"
  135892. "lsr r8, r8, #16\n\t"
  135893. "lsr r9, r9, #16\n\t"
  135894. "mul r9, r8, r9\n\t"
  135895. "adds r5, r5, r9\n\t"
  135896. "adcs r6, r6, #0\n\t"
  135897. "adc r7, r7, #0\n\t"
  135898. "lsr r9, r12, #16\n\t"
  135899. "mul r8, r9, r8\n\t"
  135900. "lsr r9, r8, #16\n\t"
  135901. "lsl r8, r8, #16\n\t"
  135902. "adds r5, r5, r8\n\t"
  135903. "adcs r6, r6, r9\n\t"
  135904. "adc r7, r7, #0\n\t"
  135905. "lsr r8, r10, #16\n\t"
  135906. "lsr r9, r12, #16\n\t"
  135907. "mul r9, r8, r9\n\t"
  135908. "adds r6, r6, r9\n\t"
  135909. "adc r7, r7, #0\n\t"
  135910. "lsl r9, r12, #16\n\t"
  135911. "lsr r9, r9, #16\n\t"
  135912. "mul r8, r9, r8\n\t"
  135913. "lsr r9, r8, #16\n\t"
  135914. "lsl r8, r8, #16\n\t"
  135915. "adds r5, r5, r8\n\t"
  135916. "adcs r6, r6, r9\n\t"
  135917. "adc r7, r7, #0\n\t"
  135918. #else
  135919. "umull r8, r9, r10, r12\n\t"
  135920. "adds r5, r5, r8\n\t"
  135921. "adcs r6, r6, r9\n\t"
  135922. "adc r7, r7, #0\n\t"
  135923. #endif
  135924. /* A[11] * A[11] */
  135925. "ldr r10, [%[a], #44]\n\t"
  135926. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135927. "lsl r8, r10, #16\n\t"
  135928. "lsr r9, r10, #16\n\t"
  135929. "lsr r8, r8, #16\n\t"
  135930. "mov r12, r8\n\t"
  135931. "mul r8, r12, r8\n\t"
  135932. "mov r12, r9\n\t"
  135933. "mul r9, r12, r9\n\t"
  135934. "adds r3, r3, r8\n\t"
  135935. "adcs r4, r4, r9\n\t"
  135936. "adc r2, r2, #0\n\t"
  135937. "lsr r9, r10, #16\n\t"
  135938. "lsl r8, r10, #16\n\t"
  135939. "lsr r8, r8, #16\n\t"
  135940. "mul r8, r9, r8\n\t"
  135941. "lsr r9, r8, #15\n\t"
  135942. "lsl r8, r8, #17\n\t"
  135943. "adds r3, r3, r8\n\t"
  135944. "adcs r4, r4, r9\n\t"
  135945. "adc r2, r2, #0\n\t"
  135946. "adds r5, r5, r5\n\t"
  135947. "adcs r6, r6, r6\n\t"
  135948. "adc r7, r7, r7\n\t"
  135949. #else
  135950. "umull r8, r9, r10, r10\n\t"
  135951. "adds r5, r5, r5\n\t"
  135952. "adcs r6, r6, r6\n\t"
  135953. "adc r7, r7, r7\n\t"
  135954. "adds r3, r3, r8\n\t"
  135955. "adcs r4, r4, r9\n\t"
  135956. "adc r2, r2, #0\n\t"
  135957. #endif
  135958. "adds r3, r3, r5\n\t"
  135959. "adcs r4, r4, r6\n\t"
  135960. "adc r2, r2, r7\n\t"
  135961. "str r3, [%[r], #88]\n\t"
  135962. /* A[8] * A[15] */
  135963. "ldr r10, [%[a], #60]\n\t"
  135964. "ldr r12, [%[a], #32]\n\t"
  135965. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135966. "lsl r8, r10, #16\n\t"
  135967. "lsl r5, r12, #16\n\t"
  135968. "lsr r8, r8, #16\n\t"
  135969. "lsr r5, r5, #16\n\t"
  135970. "mul r5, r8, r5\n\t"
  135971. "lsr r9, r12, #16\n\t"
  135972. "mul r8, r9, r8\n\t"
  135973. "lsr r6, r8, #16\n\t"
  135974. "lsl r8, r8, #16\n\t"
  135975. "adds r5, r5, r8\n\t"
  135976. "adc r6, r6, #0\n\t"
  135977. "lsr r8, r10, #16\n\t"
  135978. "mul r9, r8, r9\n\t"
  135979. "add r6, r6, r9\n\t"
  135980. "lsl r9, r12, #16\n\t"
  135981. "lsr r9, r9, #16\n\t"
  135982. "mul r8, r9, r8\n\t"
  135983. "lsr r9, r8, #16\n\t"
  135984. "lsl r8, r8, #16\n\t"
  135985. "adds r5, r5, r8\n\t"
  135986. "adc r6, r6, r9\n\t"
  135987. #else
  135988. "umull r5, r6, r10, r12\n\t"
  135989. #endif
  135990. "mov r3, #0\n\t"
  135991. "mov r7, #0\n\t"
  135992. /* A[9] * A[14] */
  135993. "ldr r10, [%[a], #56]\n\t"
  135994. "ldr r12, [%[a], #36]\n\t"
  135995. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  135996. "lsl r8, r10, #16\n\t"
  135997. "lsl r9, r12, #16\n\t"
  135998. "lsr r8, r8, #16\n\t"
  135999. "lsr r9, r9, #16\n\t"
  136000. "mul r9, r8, r9\n\t"
  136001. "adds r5, r5, r9\n\t"
  136002. "adcs r6, r6, #0\n\t"
  136003. "adc r7, r7, #0\n\t"
  136004. "lsr r9, r12, #16\n\t"
  136005. "mul r8, r9, r8\n\t"
  136006. "lsr r9, r8, #16\n\t"
  136007. "lsl r8, r8, #16\n\t"
  136008. "adds r5, r5, r8\n\t"
  136009. "adcs r6, r6, r9\n\t"
  136010. "adc r7, r7, #0\n\t"
  136011. "lsr r8, r10, #16\n\t"
  136012. "lsr r9, r12, #16\n\t"
  136013. "mul r9, r8, r9\n\t"
  136014. "adds r6, r6, r9\n\t"
  136015. "adc r7, r7, #0\n\t"
  136016. "lsl r9, r12, #16\n\t"
  136017. "lsr r9, r9, #16\n\t"
  136018. "mul r8, r9, r8\n\t"
  136019. "lsr r9, r8, #16\n\t"
  136020. "lsl r8, r8, #16\n\t"
  136021. "adds r5, r5, r8\n\t"
  136022. "adcs r6, r6, r9\n\t"
  136023. "adc r7, r7, #0\n\t"
  136024. #else
  136025. "umull r8, r9, r10, r12\n\t"
  136026. "adds r5, r5, r8\n\t"
  136027. "adcs r6, r6, r9\n\t"
  136028. "adc r7, r7, #0\n\t"
  136029. #endif
  136030. /* A[10] * A[13] */
  136031. "ldr r10, [%[a], #52]\n\t"
  136032. "ldr r12, [%[a], #40]\n\t"
  136033. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136034. "lsl r8, r10, #16\n\t"
  136035. "lsl r9, r12, #16\n\t"
  136036. "lsr r8, r8, #16\n\t"
  136037. "lsr r9, r9, #16\n\t"
  136038. "mul r9, r8, r9\n\t"
  136039. "adds r5, r5, r9\n\t"
  136040. "adcs r6, r6, #0\n\t"
  136041. "adc r7, r7, #0\n\t"
  136042. "lsr r9, r12, #16\n\t"
  136043. "mul r8, r9, r8\n\t"
  136044. "lsr r9, r8, #16\n\t"
  136045. "lsl r8, r8, #16\n\t"
  136046. "adds r5, r5, r8\n\t"
  136047. "adcs r6, r6, r9\n\t"
  136048. "adc r7, r7, #0\n\t"
  136049. "lsr r8, r10, #16\n\t"
  136050. "lsr r9, r12, #16\n\t"
  136051. "mul r9, r8, r9\n\t"
  136052. "adds r6, r6, r9\n\t"
  136053. "adc r7, r7, #0\n\t"
  136054. "lsl r9, r12, #16\n\t"
  136055. "lsr r9, r9, #16\n\t"
  136056. "mul r8, r9, r8\n\t"
  136057. "lsr r9, r8, #16\n\t"
  136058. "lsl r8, r8, #16\n\t"
  136059. "adds r5, r5, r8\n\t"
  136060. "adcs r6, r6, r9\n\t"
  136061. "adc r7, r7, #0\n\t"
  136062. #else
  136063. "umull r8, r9, r10, r12\n\t"
  136064. "adds r5, r5, r8\n\t"
  136065. "adcs r6, r6, r9\n\t"
  136066. "adc r7, r7, #0\n\t"
  136067. #endif
  136068. /* A[11] * A[12] */
  136069. "ldr r10, [%[a], #48]\n\t"
  136070. "ldr r12, [%[a], #44]\n\t"
  136071. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136072. "lsl r8, r10, #16\n\t"
  136073. "lsl r9, r12, #16\n\t"
  136074. "lsr r8, r8, #16\n\t"
  136075. "lsr r9, r9, #16\n\t"
  136076. "mul r9, r8, r9\n\t"
  136077. "adds r5, r5, r9\n\t"
  136078. "adcs r6, r6, #0\n\t"
  136079. "adc r7, r7, #0\n\t"
  136080. "lsr r9, r12, #16\n\t"
  136081. "mul r8, r9, r8\n\t"
  136082. "lsr r9, r8, #16\n\t"
  136083. "lsl r8, r8, #16\n\t"
  136084. "adds r5, r5, r8\n\t"
  136085. "adcs r6, r6, r9\n\t"
  136086. "adc r7, r7, #0\n\t"
  136087. "lsr r8, r10, #16\n\t"
  136088. "lsr r9, r12, #16\n\t"
  136089. "mul r9, r8, r9\n\t"
  136090. "adds r6, r6, r9\n\t"
  136091. "adc r7, r7, #0\n\t"
  136092. "lsl r9, r12, #16\n\t"
  136093. "lsr r9, r9, #16\n\t"
  136094. "mul r8, r9, r8\n\t"
  136095. "lsr r9, r8, #16\n\t"
  136096. "lsl r8, r8, #16\n\t"
  136097. "adds r5, r5, r8\n\t"
  136098. "adcs r6, r6, r9\n\t"
  136099. "adc r7, r7, #0\n\t"
  136100. #else
  136101. "umull r8, r9, r10, r12\n\t"
  136102. "adds r5, r5, r8\n\t"
  136103. "adcs r6, r6, r9\n\t"
  136104. "adc r7, r7, #0\n\t"
  136105. #endif
  136106. "adds r5, r5, r5\n\t"
  136107. "adcs r6, r6, r6\n\t"
  136108. "adc r7, r7, r7\n\t"
  136109. "adds r4, r4, r5\n\t"
  136110. "adcs r2, r2, r6\n\t"
  136111. "adc r3, r3, r7\n\t"
  136112. "str r4, [%[r], #92]\n\t"
  136113. /* A[9] * A[15] */
  136114. "ldr r10, [%[a], #60]\n\t"
  136115. "ldr r12, [%[a], #36]\n\t"
  136116. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136117. "lsl r8, r10, #16\n\t"
  136118. "lsl r5, r12, #16\n\t"
  136119. "lsr r8, r8, #16\n\t"
  136120. "lsr r5, r5, #16\n\t"
  136121. "mul r5, r8, r5\n\t"
  136122. "lsr r9, r12, #16\n\t"
  136123. "mul r8, r9, r8\n\t"
  136124. "lsr r6, r8, #16\n\t"
  136125. "lsl r8, r8, #16\n\t"
  136126. "adds r5, r5, r8\n\t"
  136127. "adc r6, r6, #0\n\t"
  136128. "lsr r8, r10, #16\n\t"
  136129. "mul r9, r8, r9\n\t"
  136130. "add r6, r6, r9\n\t"
  136131. "lsl r9, r12, #16\n\t"
  136132. "lsr r9, r9, #16\n\t"
  136133. "mul r8, r9, r8\n\t"
  136134. "lsr r9, r8, #16\n\t"
  136135. "lsl r8, r8, #16\n\t"
  136136. "adds r5, r5, r8\n\t"
  136137. "adc r6, r6, r9\n\t"
  136138. #else
  136139. "umull r5, r6, r10, r12\n\t"
  136140. #endif
  136141. "mov r4, #0\n\t"
  136142. "mov r7, #0\n\t"
  136143. /* A[10] * A[14] */
  136144. "ldr r10, [%[a], #56]\n\t"
  136145. "ldr r12, [%[a], #40]\n\t"
  136146. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136147. "lsl r8, r10, #16\n\t"
  136148. "lsl r9, r12, #16\n\t"
  136149. "lsr r8, r8, #16\n\t"
  136150. "lsr r9, r9, #16\n\t"
  136151. "mul r9, r8, r9\n\t"
  136152. "adds r5, r5, r9\n\t"
  136153. "adcs r6, r6, #0\n\t"
  136154. "adc r7, r7, #0\n\t"
  136155. "lsr r9, r12, #16\n\t"
  136156. "mul r8, r9, r8\n\t"
  136157. "lsr r9, r8, #16\n\t"
  136158. "lsl r8, r8, #16\n\t"
  136159. "adds r5, r5, r8\n\t"
  136160. "adcs r6, r6, r9\n\t"
  136161. "adc r7, r7, #0\n\t"
  136162. "lsr r8, r10, #16\n\t"
  136163. "lsr r9, r12, #16\n\t"
  136164. "mul r9, r8, r9\n\t"
  136165. "adds r6, r6, r9\n\t"
  136166. "adc r7, r7, #0\n\t"
  136167. "lsl r9, r12, #16\n\t"
  136168. "lsr r9, r9, #16\n\t"
  136169. "mul r8, r9, r8\n\t"
  136170. "lsr r9, r8, #16\n\t"
  136171. "lsl r8, r8, #16\n\t"
  136172. "adds r5, r5, r8\n\t"
  136173. "adcs r6, r6, r9\n\t"
  136174. "adc r7, r7, #0\n\t"
  136175. #else
  136176. "umull r8, r9, r10, r12\n\t"
  136177. "adds r5, r5, r8\n\t"
  136178. "adcs r6, r6, r9\n\t"
  136179. "adc r7, r7, #0\n\t"
  136180. #endif
  136181. /* A[11] * A[13] */
  136182. "ldr r10, [%[a], #52]\n\t"
  136183. "ldr r12, [%[a], #44]\n\t"
  136184. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136185. "lsl r8, r10, #16\n\t"
  136186. "lsl r9, r12, #16\n\t"
  136187. "lsr r8, r8, #16\n\t"
  136188. "lsr r9, r9, #16\n\t"
  136189. "mul r9, r8, r9\n\t"
  136190. "adds r5, r5, r9\n\t"
  136191. "adcs r6, r6, #0\n\t"
  136192. "adc r7, r7, #0\n\t"
  136193. "lsr r9, r12, #16\n\t"
  136194. "mul r8, r9, r8\n\t"
  136195. "lsr r9, r8, #16\n\t"
  136196. "lsl r8, r8, #16\n\t"
  136197. "adds r5, r5, r8\n\t"
  136198. "adcs r6, r6, r9\n\t"
  136199. "adc r7, r7, #0\n\t"
  136200. "lsr r8, r10, #16\n\t"
  136201. "lsr r9, r12, #16\n\t"
  136202. "mul r9, r8, r9\n\t"
  136203. "adds r6, r6, r9\n\t"
  136204. "adc r7, r7, #0\n\t"
  136205. "lsl r9, r12, #16\n\t"
  136206. "lsr r9, r9, #16\n\t"
  136207. "mul r8, r9, r8\n\t"
  136208. "lsr r9, r8, #16\n\t"
  136209. "lsl r8, r8, #16\n\t"
  136210. "adds r5, r5, r8\n\t"
  136211. "adcs r6, r6, r9\n\t"
  136212. "adc r7, r7, #0\n\t"
  136213. #else
  136214. "umull r8, r9, r10, r12\n\t"
  136215. "adds r5, r5, r8\n\t"
  136216. "adcs r6, r6, r9\n\t"
  136217. "adc r7, r7, #0\n\t"
  136218. #endif
  136219. /* A[12] * A[12] */
  136220. "ldr r10, [%[a], #48]\n\t"
  136221. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136222. "lsl r8, r10, #16\n\t"
  136223. "lsr r9, r10, #16\n\t"
  136224. "lsr r8, r8, #16\n\t"
  136225. "mov r12, r8\n\t"
  136226. "mul r8, r12, r8\n\t"
  136227. "mov r12, r9\n\t"
  136228. "mul r9, r12, r9\n\t"
  136229. "adds r2, r2, r8\n\t"
  136230. "adcs r3, r3, r9\n\t"
  136231. "adc r4, r4, #0\n\t"
  136232. "lsr r9, r10, #16\n\t"
  136233. "lsl r8, r10, #16\n\t"
  136234. "lsr r8, r8, #16\n\t"
  136235. "mul r8, r9, r8\n\t"
  136236. "lsr r9, r8, #15\n\t"
  136237. "lsl r8, r8, #17\n\t"
  136238. "adds r2, r2, r8\n\t"
  136239. "adcs r3, r3, r9\n\t"
  136240. "adc r4, r4, #0\n\t"
  136241. "adds r5, r5, r5\n\t"
  136242. "adcs r6, r6, r6\n\t"
  136243. "adc r7, r7, r7\n\t"
  136244. #else
  136245. "umull r8, r9, r10, r10\n\t"
  136246. "adds r5, r5, r5\n\t"
  136247. "adcs r6, r6, r6\n\t"
  136248. "adc r7, r7, r7\n\t"
  136249. "adds r2, r2, r8\n\t"
  136250. "adcs r3, r3, r9\n\t"
  136251. "adc r4, r4, #0\n\t"
  136252. #endif
  136253. "adds r2, r2, r5\n\t"
  136254. "adcs r3, r3, r6\n\t"
  136255. "adc r4, r4, r7\n\t"
  136256. "str r2, [%[r], #96]\n\t"
  136257. /* A[10] * A[15] */
  136258. "ldr r10, [%[a], #60]\n\t"
  136259. "ldr r12, [%[a], #40]\n\t"
  136260. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136261. "lsl r8, r10, #16\n\t"
  136262. "lsl r5, r12, #16\n\t"
  136263. "lsr r8, r8, #16\n\t"
  136264. "lsr r5, r5, #16\n\t"
  136265. "mul r5, r8, r5\n\t"
  136266. "lsr r9, r12, #16\n\t"
  136267. "mul r8, r9, r8\n\t"
  136268. "lsr r6, r8, #16\n\t"
  136269. "lsl r8, r8, #16\n\t"
  136270. "adds r5, r5, r8\n\t"
  136271. "adc r6, r6, #0\n\t"
  136272. "lsr r8, r10, #16\n\t"
  136273. "mul r9, r8, r9\n\t"
  136274. "add r6, r6, r9\n\t"
  136275. "lsl r9, r12, #16\n\t"
  136276. "lsr r9, r9, #16\n\t"
  136277. "mul r8, r9, r8\n\t"
  136278. "lsr r9, r8, #16\n\t"
  136279. "lsl r8, r8, #16\n\t"
  136280. "adds r5, r5, r8\n\t"
  136281. "adc r6, r6, r9\n\t"
  136282. #else
  136283. "umull r5, r6, r10, r12\n\t"
  136284. #endif
  136285. "mov r2, #0\n\t"
  136286. "mov r7, #0\n\t"
  136287. /* A[11] * A[14] */
  136288. "ldr r10, [%[a], #56]\n\t"
  136289. "ldr r12, [%[a], #44]\n\t"
  136290. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136291. "lsl r8, r10, #16\n\t"
  136292. "lsl r9, r12, #16\n\t"
  136293. "lsr r8, r8, #16\n\t"
  136294. "lsr r9, r9, #16\n\t"
  136295. "mul r9, r8, r9\n\t"
  136296. "adds r5, r5, r9\n\t"
  136297. "adcs r6, r6, #0\n\t"
  136298. "adc r7, r7, #0\n\t"
  136299. "lsr r9, r12, #16\n\t"
  136300. "mul r8, r9, r8\n\t"
  136301. "lsr r9, r8, #16\n\t"
  136302. "lsl r8, r8, #16\n\t"
  136303. "adds r5, r5, r8\n\t"
  136304. "adcs r6, r6, r9\n\t"
  136305. "adc r7, r7, #0\n\t"
  136306. "lsr r8, r10, #16\n\t"
  136307. "lsr r9, r12, #16\n\t"
  136308. "mul r9, r8, r9\n\t"
  136309. "adds r6, r6, r9\n\t"
  136310. "adc r7, r7, #0\n\t"
  136311. "lsl r9, r12, #16\n\t"
  136312. "lsr r9, r9, #16\n\t"
  136313. "mul r8, r9, r8\n\t"
  136314. "lsr r9, r8, #16\n\t"
  136315. "lsl r8, r8, #16\n\t"
  136316. "adds r5, r5, r8\n\t"
  136317. "adcs r6, r6, r9\n\t"
  136318. "adc r7, r7, #0\n\t"
  136319. #else
  136320. "umull r8, r9, r10, r12\n\t"
  136321. "adds r5, r5, r8\n\t"
  136322. "adcs r6, r6, r9\n\t"
  136323. "adc r7, r7, #0\n\t"
  136324. #endif
  136325. /* A[12] * A[13] */
  136326. "ldr r10, [%[a], #52]\n\t"
  136327. "ldr r12, [%[a], #48]\n\t"
  136328. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136329. "lsl r8, r10, #16\n\t"
  136330. "lsl r9, r12, #16\n\t"
  136331. "lsr r8, r8, #16\n\t"
  136332. "lsr r9, r9, #16\n\t"
  136333. "mul r9, r8, r9\n\t"
  136334. "adds r5, r5, r9\n\t"
  136335. "adcs r6, r6, #0\n\t"
  136336. "adc r7, r7, #0\n\t"
  136337. "lsr r9, r12, #16\n\t"
  136338. "mul r8, r9, r8\n\t"
  136339. "lsr r9, r8, #16\n\t"
  136340. "lsl r8, r8, #16\n\t"
  136341. "adds r5, r5, r8\n\t"
  136342. "adcs r6, r6, r9\n\t"
  136343. "adc r7, r7, #0\n\t"
  136344. "lsr r8, r10, #16\n\t"
  136345. "lsr r9, r12, #16\n\t"
  136346. "mul r9, r8, r9\n\t"
  136347. "adds r6, r6, r9\n\t"
  136348. "adc r7, r7, #0\n\t"
  136349. "lsl r9, r12, #16\n\t"
  136350. "lsr r9, r9, #16\n\t"
  136351. "mul r8, r9, r8\n\t"
  136352. "lsr r9, r8, #16\n\t"
  136353. "lsl r8, r8, #16\n\t"
  136354. "adds r5, r5, r8\n\t"
  136355. "adcs r6, r6, r9\n\t"
  136356. "adc r7, r7, #0\n\t"
  136357. #else
  136358. "umull r8, r9, r10, r12\n\t"
  136359. "adds r5, r5, r8\n\t"
  136360. "adcs r6, r6, r9\n\t"
  136361. "adc r7, r7, #0\n\t"
  136362. #endif
  136363. "adds r5, r5, r5\n\t"
  136364. "adcs r6, r6, r6\n\t"
  136365. "adc r7, r7, r7\n\t"
  136366. "adds r3, r3, r5\n\t"
  136367. "adcs r4, r4, r6\n\t"
  136368. "adc r2, r2, r7\n\t"
  136369. "str r3, [%[r], #100]\n\t"
  136370. /* A[11] * A[15] */
  136371. "ldr r10, [%[a], #60]\n\t"
  136372. "ldr r12, [%[a], #44]\n\t"
  136373. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136374. "lsl r8, r10, #16\n\t"
  136375. "lsl r9, r12, #16\n\t"
  136376. "lsr r8, r8, #16\n\t"
  136377. "lsr r9, r9, #16\n\t"
  136378. "mul r9, r8, r9\n\t"
  136379. "adds r4, r4, r9\n\t"
  136380. "adcs r2, r2, #0\n\t"
  136381. "mov r3, #0\n\t"
  136382. "adc r3, r3, #0\n\t"
  136383. "adds r4, r4, r9\n\t"
  136384. "adcs r2, r2, #0\n\t"
  136385. "adc r3, r3, #0\n\t"
  136386. "lsr r9, r12, #16\n\t"
  136387. "mul r8, r9, r8\n\t"
  136388. "lsr r9, r8, #16\n\t"
  136389. "lsl r8, r8, #16\n\t"
  136390. "adds r4, r4, r8\n\t"
  136391. "adcs r2, r2, r9\n\t"
  136392. "adc r3, r3, #0\n\t"
  136393. "adds r4, r4, r8\n\t"
  136394. "adcs r2, r2, r9\n\t"
  136395. "adc r3, r3, #0\n\t"
  136396. "lsr r8, r10, #16\n\t"
  136397. "lsr r9, r12, #16\n\t"
  136398. "mul r9, r8, r9\n\t"
  136399. "adds r2, r2, r9\n\t"
  136400. "adc r3, r3, #0\n\t"
  136401. "adds r2, r2, r9\n\t"
  136402. "adc r3, r3, #0\n\t"
  136403. "lsl r9, r12, #16\n\t"
  136404. "lsr r9, r9, #16\n\t"
  136405. "mul r8, r9, r8\n\t"
  136406. "lsr r9, r8, #16\n\t"
  136407. "lsl r8, r8, #16\n\t"
  136408. "adds r4, r4, r8\n\t"
  136409. "adcs r2, r2, r9\n\t"
  136410. "adc r3, r3, #0\n\t"
  136411. "adds r4, r4, r8\n\t"
  136412. "adcs r2, r2, r9\n\t"
  136413. "adc r3, r3, #0\n\t"
  136414. #else
  136415. "umull r8, r9, r10, r12\n\t"
  136416. "adds r4, r4, r8\n\t"
  136417. "adcs r2, r2, r9\n\t"
  136418. "mov r3, #0\n\t"
  136419. "adc r3, r3, #0\n\t"
  136420. "adds r4, r4, r8\n\t"
  136421. "adcs r2, r2, r9\n\t"
  136422. "mov r3, #0\n\t"
  136423. "adc r3, r3, #0\n\t"
  136424. #endif
  136425. /* A[12] * A[14] */
  136426. "ldr r10, [%[a], #56]\n\t"
  136427. "ldr r12, [%[a], #48]\n\t"
  136428. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136429. "lsl r8, r10, #16\n\t"
  136430. "lsl r9, r12, #16\n\t"
  136431. "lsr r8, r8, #16\n\t"
  136432. "lsr r9, r9, #16\n\t"
  136433. "mul r9, r8, r9\n\t"
  136434. "adds r4, r4, r9\n\t"
  136435. "adcs r2, r2, #0\n\t"
  136436. "adc r3, r3, #0\n\t"
  136437. "adds r4, r4, r9\n\t"
  136438. "adcs r2, r2, #0\n\t"
  136439. "adc r3, r3, #0\n\t"
  136440. "lsr r9, r12, #16\n\t"
  136441. "mul r8, r9, r8\n\t"
  136442. "lsr r9, r8, #16\n\t"
  136443. "lsl r8, r8, #16\n\t"
  136444. "adds r4, r4, r8\n\t"
  136445. "adcs r2, r2, r9\n\t"
  136446. "adc r3, r3, #0\n\t"
  136447. "adds r4, r4, r8\n\t"
  136448. "adcs r2, r2, r9\n\t"
  136449. "adc r3, r3, #0\n\t"
  136450. "lsr r8, r10, #16\n\t"
  136451. "lsr r9, r12, #16\n\t"
  136452. "mul r9, r8, r9\n\t"
  136453. "adds r2, r2, r9\n\t"
  136454. "adc r3, r3, #0\n\t"
  136455. "adds r2, r2, r9\n\t"
  136456. "adc r3, r3, #0\n\t"
  136457. "lsl r9, r12, #16\n\t"
  136458. "lsr r9, r9, #16\n\t"
  136459. "mul r8, r9, r8\n\t"
  136460. "lsr r9, r8, #16\n\t"
  136461. "lsl r8, r8, #16\n\t"
  136462. "adds r4, r4, r8\n\t"
  136463. "adcs r2, r2, r9\n\t"
  136464. "adc r3, r3, #0\n\t"
  136465. "adds r4, r4, r8\n\t"
  136466. "adcs r2, r2, r9\n\t"
  136467. "adc r3, r3, #0\n\t"
  136468. #else
  136469. "umull r8, r9, r10, r12\n\t"
  136470. "adds r4, r4, r8\n\t"
  136471. "adcs r2, r2, r9\n\t"
  136472. "adc r3, r3, #0\n\t"
  136473. "adds r4, r4, r8\n\t"
  136474. "adcs r2, r2, r9\n\t"
  136475. "adc r3, r3, #0\n\t"
  136476. #endif
  136477. /* A[13] * A[13] */
  136478. "ldr r10, [%[a], #52]\n\t"
  136479. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136480. "lsl r8, r10, #16\n\t"
  136481. "lsr r9, r10, #16\n\t"
  136482. "lsr r8, r8, #16\n\t"
  136483. "mov r12, r8\n\t"
  136484. "mul r8, r12, r8\n\t"
  136485. "mov r12, r9\n\t"
  136486. "mul r9, r12, r9\n\t"
  136487. "adds r4, r4, r8\n\t"
  136488. "adcs r2, r2, r9\n\t"
  136489. "adc r3, r3, #0\n\t"
  136490. "lsr r9, r10, #16\n\t"
  136491. "lsl r8, r10, #16\n\t"
  136492. "lsr r8, r8, #16\n\t"
  136493. "mul r8, r9, r8\n\t"
  136494. "lsr r9, r8, #15\n\t"
  136495. "lsl r8, r8, #17\n\t"
  136496. "adds r4, r4, r8\n\t"
  136497. "adcs r2, r2, r9\n\t"
  136498. "adc r3, r3, #0\n\t"
  136499. #else
  136500. "umull r8, r9, r10, r10\n\t"
  136501. "adds r4, r4, r8\n\t"
  136502. "adcs r2, r2, r9\n\t"
  136503. "adc r3, r3, #0\n\t"
  136504. #endif
  136505. "str r4, [%[r], #104]\n\t"
  136506. /* A[12] * A[15] */
  136507. "ldr r10, [%[a], #60]\n\t"
  136508. "ldr r12, [%[a], #48]\n\t"
  136509. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136510. "lsl r8, r10, #16\n\t"
  136511. "lsl r9, r12, #16\n\t"
  136512. "lsr r8, r8, #16\n\t"
  136513. "lsr r9, r9, #16\n\t"
  136514. "mul r9, r8, r9\n\t"
  136515. "adds r2, r2, r9\n\t"
  136516. "adcs r3, r3, #0\n\t"
  136517. "mov r4, #0\n\t"
  136518. "adc r4, r4, #0\n\t"
  136519. "adds r2, r2, r9\n\t"
  136520. "adcs r3, r3, #0\n\t"
  136521. "adc r4, r4, #0\n\t"
  136522. "lsr r9, r12, #16\n\t"
  136523. "mul r8, r9, r8\n\t"
  136524. "lsr r9, r8, #16\n\t"
  136525. "lsl r8, r8, #16\n\t"
  136526. "adds r2, r2, r8\n\t"
  136527. "adcs r3, r3, r9\n\t"
  136528. "adc r4, r4, #0\n\t"
  136529. "adds r2, r2, r8\n\t"
  136530. "adcs r3, r3, r9\n\t"
  136531. "adc r4, r4, #0\n\t"
  136532. "lsr r8, r10, #16\n\t"
  136533. "lsr r9, r12, #16\n\t"
  136534. "mul r9, r8, r9\n\t"
  136535. "adds r3, r3, r9\n\t"
  136536. "adc r4, r4, #0\n\t"
  136537. "adds r3, r3, r9\n\t"
  136538. "adc r4, r4, #0\n\t"
  136539. "lsl r9, r12, #16\n\t"
  136540. "lsr r9, r9, #16\n\t"
  136541. "mul r8, r9, r8\n\t"
  136542. "lsr r9, r8, #16\n\t"
  136543. "lsl r8, r8, #16\n\t"
  136544. "adds r2, r2, r8\n\t"
  136545. "adcs r3, r3, r9\n\t"
  136546. "adc r4, r4, #0\n\t"
  136547. "adds r2, r2, r8\n\t"
  136548. "adcs r3, r3, r9\n\t"
  136549. "adc r4, r4, #0\n\t"
  136550. #else
  136551. "umull r8, r9, r10, r12\n\t"
  136552. "adds r2, r2, r8\n\t"
  136553. "adcs r3, r3, r9\n\t"
  136554. "mov r4, #0\n\t"
  136555. "adc r4, r4, #0\n\t"
  136556. "adds r2, r2, r8\n\t"
  136557. "adcs r3, r3, r9\n\t"
  136558. "mov r4, #0\n\t"
  136559. "adc r4, r4, #0\n\t"
  136560. #endif
  136561. /* A[13] * A[14] */
  136562. "ldr r10, [%[a], #56]\n\t"
  136563. "ldr r12, [%[a], #52]\n\t"
  136564. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136565. "lsl r8, r10, #16\n\t"
  136566. "lsl r9, r12, #16\n\t"
  136567. "lsr r8, r8, #16\n\t"
  136568. "lsr r9, r9, #16\n\t"
  136569. "mul r9, r8, r9\n\t"
  136570. "adds r2, r2, r9\n\t"
  136571. "adcs r3, r3, #0\n\t"
  136572. "adc r4, r4, #0\n\t"
  136573. "adds r2, r2, r9\n\t"
  136574. "adcs r3, r3, #0\n\t"
  136575. "adc r4, r4, #0\n\t"
  136576. "lsr r9, r12, #16\n\t"
  136577. "mul r8, r9, r8\n\t"
  136578. "lsr r9, r8, #16\n\t"
  136579. "lsl r8, r8, #16\n\t"
  136580. "adds r2, r2, r8\n\t"
  136581. "adcs r3, r3, r9\n\t"
  136582. "adc r4, r4, #0\n\t"
  136583. "adds r2, r2, r8\n\t"
  136584. "adcs r3, r3, r9\n\t"
  136585. "adc r4, r4, #0\n\t"
  136586. "lsr r8, r10, #16\n\t"
  136587. "lsr r9, r12, #16\n\t"
  136588. "mul r9, r8, r9\n\t"
  136589. "adds r3, r3, r9\n\t"
  136590. "adc r4, r4, #0\n\t"
  136591. "adds r3, r3, r9\n\t"
  136592. "adc r4, r4, #0\n\t"
  136593. "lsl r9, r12, #16\n\t"
  136594. "lsr r9, r9, #16\n\t"
  136595. "mul r8, r9, r8\n\t"
  136596. "lsr r9, r8, #16\n\t"
  136597. "lsl r8, r8, #16\n\t"
  136598. "adds r2, r2, r8\n\t"
  136599. "adcs r3, r3, r9\n\t"
  136600. "adc r4, r4, #0\n\t"
  136601. "adds r2, r2, r8\n\t"
  136602. "adcs r3, r3, r9\n\t"
  136603. "adc r4, r4, #0\n\t"
  136604. #else
  136605. "umull r8, r9, r10, r12\n\t"
  136606. "adds r2, r2, r8\n\t"
  136607. "adcs r3, r3, r9\n\t"
  136608. "adc r4, r4, #0\n\t"
  136609. "adds r2, r2, r8\n\t"
  136610. "adcs r3, r3, r9\n\t"
  136611. "adc r4, r4, #0\n\t"
  136612. #endif
  136613. "str r2, [%[r], #108]\n\t"
  136614. /* A[13] * A[15] */
  136615. "ldr r10, [%[a], #60]\n\t"
  136616. "ldr r12, [%[a], #52]\n\t"
  136617. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136618. "lsl r8, r10, #16\n\t"
  136619. "lsl r9, r12, #16\n\t"
  136620. "lsr r8, r8, #16\n\t"
  136621. "lsr r9, r9, #16\n\t"
  136622. "mul r9, r8, r9\n\t"
  136623. "adds r3, r3, r9\n\t"
  136624. "adcs r4, r4, #0\n\t"
  136625. "mov r2, #0\n\t"
  136626. "adc r2, r2, #0\n\t"
  136627. "adds r3, r3, r9\n\t"
  136628. "adcs r4, r4, #0\n\t"
  136629. "adc r2, r2, #0\n\t"
  136630. "lsr r9, r12, #16\n\t"
  136631. "mul r8, r9, r8\n\t"
  136632. "lsr r9, r8, #16\n\t"
  136633. "lsl r8, r8, #16\n\t"
  136634. "adds r3, r3, r8\n\t"
  136635. "adcs r4, r4, r9\n\t"
  136636. "adc r2, r2, #0\n\t"
  136637. "adds r3, r3, r8\n\t"
  136638. "adcs r4, r4, r9\n\t"
  136639. "adc r2, r2, #0\n\t"
  136640. "lsr r8, r10, #16\n\t"
  136641. "lsr r9, r12, #16\n\t"
  136642. "mul r9, r8, r9\n\t"
  136643. "adds r4, r4, r9\n\t"
  136644. "adc r2, r2, #0\n\t"
  136645. "adds r4, r4, r9\n\t"
  136646. "adc r2, r2, #0\n\t"
  136647. "lsl r9, r12, #16\n\t"
  136648. "lsr r9, r9, #16\n\t"
  136649. "mul r8, r9, r8\n\t"
  136650. "lsr r9, r8, #16\n\t"
  136651. "lsl r8, r8, #16\n\t"
  136652. "adds r3, r3, r8\n\t"
  136653. "adcs r4, r4, r9\n\t"
  136654. "adc r2, r2, #0\n\t"
  136655. "adds r3, r3, r8\n\t"
  136656. "adcs r4, r4, r9\n\t"
  136657. "adc r2, r2, #0\n\t"
  136658. #else
  136659. "umull r8, r9, r10, r12\n\t"
  136660. "adds r3, r3, r8\n\t"
  136661. "adcs r4, r4, r9\n\t"
  136662. "mov r2, #0\n\t"
  136663. "adc r2, r2, #0\n\t"
  136664. "adds r3, r3, r8\n\t"
  136665. "adcs r4, r4, r9\n\t"
  136666. "mov r2, #0\n\t"
  136667. "adc r2, r2, #0\n\t"
  136668. #endif
  136669. /* A[14] * A[14] */
  136670. "ldr r10, [%[a], #56]\n\t"
  136671. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136672. "lsl r8, r10, #16\n\t"
  136673. "lsr r9, r10, #16\n\t"
  136674. "lsr r8, r8, #16\n\t"
  136675. "mov r12, r8\n\t"
  136676. "mul r8, r12, r8\n\t"
  136677. "mov r12, r9\n\t"
  136678. "mul r9, r12, r9\n\t"
  136679. "adds r3, r3, r8\n\t"
  136680. "adcs r4, r4, r9\n\t"
  136681. "adc r2, r2, #0\n\t"
  136682. "lsr r9, r10, #16\n\t"
  136683. "lsl r8, r10, #16\n\t"
  136684. "lsr r8, r8, #16\n\t"
  136685. "mul r8, r9, r8\n\t"
  136686. "lsr r9, r8, #15\n\t"
  136687. "lsl r8, r8, #17\n\t"
  136688. "adds r3, r3, r8\n\t"
  136689. "adcs r4, r4, r9\n\t"
  136690. "adc r2, r2, #0\n\t"
  136691. #else
  136692. "umull r8, r9, r10, r10\n\t"
  136693. "adds r3, r3, r8\n\t"
  136694. "adcs r4, r4, r9\n\t"
  136695. "adc r2, r2, #0\n\t"
  136696. #endif
  136697. "str r3, [%[r], #112]\n\t"
  136698. /* A[14] * A[15] */
  136699. "ldr r10, [%[a], #60]\n\t"
  136700. "ldr r12, [%[a], #56]\n\t"
  136701. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136702. "lsl r8, r10, #16\n\t"
  136703. "lsl r9, r12, #16\n\t"
  136704. "lsr r8, r8, #16\n\t"
  136705. "lsr r9, r9, #16\n\t"
  136706. "mul r9, r8, r9\n\t"
  136707. "adds r4, r4, r9\n\t"
  136708. "adcs r2, r2, #0\n\t"
  136709. "mov r3, #0\n\t"
  136710. "adc r3, r3, #0\n\t"
  136711. "adds r4, r4, r9\n\t"
  136712. "adcs r2, r2, #0\n\t"
  136713. "adc r3, r3, #0\n\t"
  136714. "lsr r9, r12, #16\n\t"
  136715. "mul r8, r9, r8\n\t"
  136716. "lsr r9, r8, #16\n\t"
  136717. "lsl r8, r8, #16\n\t"
  136718. "adds r4, r4, r8\n\t"
  136719. "adcs r2, r2, r9\n\t"
  136720. "adc r3, r3, #0\n\t"
  136721. "adds r4, r4, r8\n\t"
  136722. "adcs r2, r2, r9\n\t"
  136723. "adc r3, r3, #0\n\t"
  136724. "lsr r8, r10, #16\n\t"
  136725. "lsr r9, r12, #16\n\t"
  136726. "mul r9, r8, r9\n\t"
  136727. "adds r2, r2, r9\n\t"
  136728. "adc r3, r3, #0\n\t"
  136729. "adds r2, r2, r9\n\t"
  136730. "adc r3, r3, #0\n\t"
  136731. "lsl r9, r12, #16\n\t"
  136732. "lsr r9, r9, #16\n\t"
  136733. "mul r8, r9, r8\n\t"
  136734. "lsr r9, r8, #16\n\t"
  136735. "lsl r8, r8, #16\n\t"
  136736. "adds r4, r4, r8\n\t"
  136737. "adcs r2, r2, r9\n\t"
  136738. "adc r3, r3, #0\n\t"
  136739. "adds r4, r4, r8\n\t"
  136740. "adcs r2, r2, r9\n\t"
  136741. "adc r3, r3, #0\n\t"
  136742. #else
  136743. "umull r8, r9, r10, r12\n\t"
  136744. "adds r4, r4, r8\n\t"
  136745. "adcs r2, r2, r9\n\t"
  136746. "mov r3, #0\n\t"
  136747. "adc r3, r3, #0\n\t"
  136748. "adds r4, r4, r8\n\t"
  136749. "adcs r2, r2, r9\n\t"
  136750. "mov r3, #0\n\t"
  136751. "adc r3, r3, #0\n\t"
  136752. #endif
  136753. "str r4, [%[r], #116]\n\t"
  136754. /* A[15] * A[15] */
  136755. "ldr r10, [%[a], #60]\n\t"
  136756. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  136757. "lsl r8, r10, #16\n\t"
  136758. "lsr r9, r10, #16\n\t"
  136759. "lsr r8, r8, #16\n\t"
  136760. "mov r12, r8\n\t"
  136761. "mul r8, r12, r8\n\t"
  136762. "mov r12, r9\n\t"
  136763. "mul r9, r12, r9\n\t"
  136764. "adds r2, r2, r8\n\t"
  136765. "adc r3, r3, r9\n\t"
  136766. "lsr r9, r10, #16\n\t"
  136767. "lsl r8, r10, #16\n\t"
  136768. "lsr r8, r8, #16\n\t"
  136769. "mul r8, r9, r8\n\t"
  136770. "lsr r9, r8, #15\n\t"
  136771. "lsl r8, r8, #17\n\t"
  136772. "adds r2, r2, r8\n\t"
  136773. "adc r3, r3, r9\n\t"
  136774. #else
  136775. "umull r8, r9, r10, r10\n\t"
  136776. "adds r2, r2, r8\n\t"
  136777. "adc r3, r3, r9\n\t"
  136778. #endif
  136779. "str r2, [%[r], #120]\n\t"
  136780. "str r3, [%[r], #124]\n\t"
  136781. "ldm sp!, {r2, r3, r4, r8}\n\t"
  136782. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  136783. "ldm sp!, {r2, r3, r4, r8}\n\t"
  136784. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  136785. "ldm sp!, {r2, r3, r4, r8}\n\t"
  136786. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  136787. "ldm sp!, {r2, r3, r4, r8}\n\t"
  136788. "stm %[r]!, {r2, r3, r4, r8}\n\t"
  136789. : [r] "+r" (r), [a] "+r" (a)
  136790. :
  136791. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  136792. );
  136793. }
  136794. /* Add b to a into r. (r = a + b)
  136795. *
  136796. * r A single precision integer.
  136797. * a A single precision integer.
  136798. * b A single precision integer.
  136799. */
  136800. static sp_digit sp_1024_add_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  136801. {
  136802. register sp_digit* r asm ("r0") = r_p;
  136803. register const sp_digit* a asm ("r1") = a_p;
  136804. register const sp_digit* b asm ("r2") = b_p;
  136805. __asm__ __volatile__ (
  136806. "mov r12, #0\n\t"
  136807. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  136808. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  136809. "adds r3, r3, r7\n\t"
  136810. "adcs r4, r4, r8\n\t"
  136811. "adcs r5, r5, r9\n\t"
  136812. "adcs r6, r6, r10\n\t"
  136813. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  136814. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  136815. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  136816. "adcs r3, r3, r7\n\t"
  136817. "adcs r4, r4, r8\n\t"
  136818. "adcs r5, r5, r9\n\t"
  136819. "adcs r6, r6, r10\n\t"
  136820. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  136821. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  136822. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  136823. "adcs r3, r3, r7\n\t"
  136824. "adcs r4, r4, r8\n\t"
  136825. "adcs r5, r5, r9\n\t"
  136826. "adcs r6, r6, r10\n\t"
  136827. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  136828. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  136829. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  136830. "adcs r3, r3, r7\n\t"
  136831. "adcs r4, r4, r8\n\t"
  136832. "adcs r5, r5, r9\n\t"
  136833. "adcs r6, r6, r10\n\t"
  136834. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  136835. "adc %[r], r12, r12\n\t"
  136836. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  136837. :
  136838. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  136839. );
  136840. return (uint32_t)(size_t)r;
  136841. }
  136842. /* Sub b from a into a. (a -= b)
  136843. *
  136844. * a A single precision integer and result.
  136845. * b A single precision integer.
  136846. */
  136847. static sp_digit sp_1024_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p)
  136848. {
  136849. register sp_digit* a asm ("r0") = a_p;
  136850. register const sp_digit* b asm ("r1") = b_p;
  136851. __asm__ __volatile__ (
  136852. "ldm %[a], {r2, r3, r4, r5}\n\t"
  136853. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  136854. "subs r2, r2, r6\n\t"
  136855. "sbcs r3, r3, r7\n\t"
  136856. "sbcs r4, r4, r8\n\t"
  136857. "sbcs r5, r5, r9\n\t"
  136858. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  136859. "ldm %[a], {r2, r3, r4, r5}\n\t"
  136860. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  136861. "sbcs r2, r2, r6\n\t"
  136862. "sbcs r3, r3, r7\n\t"
  136863. "sbcs r4, r4, r8\n\t"
  136864. "sbcs r5, r5, r9\n\t"
  136865. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  136866. "ldm %[a], {r2, r3, r4, r5}\n\t"
  136867. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  136868. "sbcs r2, r2, r6\n\t"
  136869. "sbcs r3, r3, r7\n\t"
  136870. "sbcs r4, r4, r8\n\t"
  136871. "sbcs r5, r5, r9\n\t"
  136872. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  136873. "ldm %[a], {r2, r3, r4, r5}\n\t"
  136874. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  136875. "sbcs r2, r2, r6\n\t"
  136876. "sbcs r3, r3, r7\n\t"
  136877. "sbcs r4, r4, r8\n\t"
  136878. "sbcs r5, r5, r9\n\t"
  136879. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  136880. "ldm %[a], {r2, r3, r4, r5}\n\t"
  136881. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  136882. "sbcs r2, r2, r6\n\t"
  136883. "sbcs r3, r3, r7\n\t"
  136884. "sbcs r4, r4, r8\n\t"
  136885. "sbcs r5, r5, r9\n\t"
  136886. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  136887. "ldm %[a], {r2, r3, r4, r5}\n\t"
  136888. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  136889. "sbcs r2, r2, r6\n\t"
  136890. "sbcs r3, r3, r7\n\t"
  136891. "sbcs r4, r4, r8\n\t"
  136892. "sbcs r5, r5, r9\n\t"
  136893. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  136894. "ldm %[a], {r2, r3, r4, r5}\n\t"
  136895. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  136896. "sbcs r2, r2, r6\n\t"
  136897. "sbcs r3, r3, r7\n\t"
  136898. "sbcs r4, r4, r8\n\t"
  136899. "sbcs r5, r5, r9\n\t"
  136900. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  136901. "ldm %[a], {r2, r3, r4, r5}\n\t"
  136902. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  136903. "sbcs r2, r2, r6\n\t"
  136904. "sbcs r3, r3, r7\n\t"
  136905. "sbcs r4, r4, r8\n\t"
  136906. "sbcs r5, r5, r9\n\t"
  136907. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  136908. "sbc %[a], r9, r9\n\t"
  136909. : [a] "+r" (a), [b] "+r" (b)
  136910. :
  136911. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  136912. );
  136913. return (uint32_t)(size_t)a;
  136914. }
  136915. /* Add b to a into r. (r = a + b)
  136916. *
  136917. * r A single precision integer.
  136918. * a A single precision integer.
  136919. * b A single precision integer.
  136920. */
  136921. static sp_digit sp_1024_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  136922. {
  136923. register sp_digit* r asm ("r0") = r_p;
  136924. register const sp_digit* a asm ("r1") = a_p;
  136925. register const sp_digit* b asm ("r2") = b_p;
  136926. __asm__ __volatile__ (
  136927. "mov r12, #0\n\t"
  136928. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  136929. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  136930. "adds r3, r3, r7\n\t"
  136931. "adcs r4, r4, r8\n\t"
  136932. "adcs r5, r5, r9\n\t"
  136933. "adcs r6, r6, r10\n\t"
  136934. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  136935. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  136936. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  136937. "adcs r3, r3, r7\n\t"
  136938. "adcs r4, r4, r8\n\t"
  136939. "adcs r5, r5, r9\n\t"
  136940. "adcs r6, r6, r10\n\t"
  136941. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  136942. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  136943. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  136944. "adcs r3, r3, r7\n\t"
  136945. "adcs r4, r4, r8\n\t"
  136946. "adcs r5, r5, r9\n\t"
  136947. "adcs r6, r6, r10\n\t"
  136948. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  136949. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  136950. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  136951. "adcs r3, r3, r7\n\t"
  136952. "adcs r4, r4, r8\n\t"
  136953. "adcs r5, r5, r9\n\t"
  136954. "adcs r6, r6, r10\n\t"
  136955. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  136956. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  136957. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  136958. "adcs r3, r3, r7\n\t"
  136959. "adcs r4, r4, r8\n\t"
  136960. "adcs r5, r5, r9\n\t"
  136961. "adcs r6, r6, r10\n\t"
  136962. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  136963. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  136964. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  136965. "adcs r3, r3, r7\n\t"
  136966. "adcs r4, r4, r8\n\t"
  136967. "adcs r5, r5, r9\n\t"
  136968. "adcs r6, r6, r10\n\t"
  136969. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  136970. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  136971. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  136972. "adcs r3, r3, r7\n\t"
  136973. "adcs r4, r4, r8\n\t"
  136974. "adcs r5, r5, r9\n\t"
  136975. "adcs r6, r6, r10\n\t"
  136976. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  136977. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  136978. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  136979. "adcs r3, r3, r7\n\t"
  136980. "adcs r4, r4, r8\n\t"
  136981. "adcs r5, r5, r9\n\t"
  136982. "adcs r6, r6, r10\n\t"
  136983. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  136984. "adc %[r], r12, r12\n\t"
  136985. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  136986. :
  136987. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12"
  136988. );
  136989. return (uint32_t)(size_t)r;
  136990. }
  136991. /* AND m into each word of a and store in r.
  136992. *
  136993. * r A single precision integer.
  136994. * a A single precision integer.
  136995. * m Mask to AND against each digit.
  136996. */
  136997. static void sp_1024_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  136998. {
  136999. #ifdef WOLFSSL_SP_SMALL
  137000. int i;
  137001. for (i=0; i<16; i++) {
  137002. r[i] = a[i] & m;
  137003. }
  137004. #else
  137005. int i;
  137006. for (i = 0; i < 16; i += 8) {
  137007. r[i+0] = a[i+0] & m;
  137008. r[i+1] = a[i+1] & m;
  137009. r[i+2] = a[i+2] & m;
  137010. r[i+3] = a[i+3] & m;
  137011. r[i+4] = a[i+4] & m;
  137012. r[i+5] = a[i+5] & m;
  137013. r[i+6] = a[i+6] & m;
  137014. r[i+7] = a[i+7] & m;
  137015. }
  137016. #endif
  137017. }
  137018. /* Multiply a and b into r. (r = a * b)
  137019. *
  137020. * r A single precision integer.
  137021. * a A single precision integer.
  137022. * b A single precision integer.
  137023. */
  137024. SP_NOINLINE static void sp_1024_mul_32(sp_digit* r, const sp_digit* a,
  137025. const sp_digit* b)
  137026. {
  137027. sp_digit* z0 = r;
  137028. sp_digit z1[32];
  137029. sp_digit a1[16];
  137030. sp_digit b1[16];
  137031. sp_digit* z2 = r + 32;
  137032. sp_digit u;
  137033. sp_digit ca;
  137034. sp_digit cb;
  137035. ca = sp_1024_add_16(a1, a, &a[16]);
  137036. cb = sp_1024_add_16(b1, b, &b[16]);
  137037. u = ca & cb;
  137038. sp_1024_mul_16(z2, &a[16], &b[16]);
  137039. sp_1024_mul_16(z0, a, b);
  137040. sp_1024_mul_16(z1, a1, b1);
  137041. u += sp_1024_sub_in_place_32(z1, z0);
  137042. u += sp_1024_sub_in_place_32(z1, z2);
  137043. sp_1024_mask_16(a1, a1, 0 - cb);
  137044. u += sp_1024_add_16(z1 + 16, z1 + 16, a1);
  137045. sp_1024_mask_16(b1, b1, 0 - ca);
  137046. u += sp_1024_add_16(z1 + 16, z1 + 16, b1);
  137047. u += sp_1024_add_32(r + 16, r + 16, z1);
  137048. XMEMSET(a1 + 1, 0, sizeof(sp_digit) * (16 - 1));
  137049. a1[0] = u;
  137050. (void)sp_1024_add_16(r + 48, r + 48, a1);
  137051. }
  137052. /* Sub b from a into r. (r = a - b)
  137053. *
  137054. * r A single precision integer.
  137055. * a A single precision integer.
  137056. * b A single precision integer.
  137057. */
  137058. static sp_digit sp_1024_sub_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  137059. {
  137060. register sp_digit* r asm ("r0") = r_p;
  137061. register const sp_digit* a asm ("r1") = a_p;
  137062. register const sp_digit* b asm ("r2") = b_p;
  137063. __asm__ __volatile__ (
  137064. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  137065. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  137066. "subs r3, r3, r7\n\t"
  137067. "sbcs r4, r4, r8\n\t"
  137068. "sbcs r5, r5, r9\n\t"
  137069. "sbcs r6, r6, r10\n\t"
  137070. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  137071. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  137072. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  137073. "sbcs r3, r3, r7\n\t"
  137074. "sbcs r4, r4, r8\n\t"
  137075. "sbcs r5, r5, r9\n\t"
  137076. "sbcs r6, r6, r10\n\t"
  137077. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  137078. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  137079. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  137080. "sbcs r3, r3, r7\n\t"
  137081. "sbcs r4, r4, r8\n\t"
  137082. "sbcs r5, r5, r9\n\t"
  137083. "sbcs r6, r6, r10\n\t"
  137084. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  137085. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  137086. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  137087. "sbcs r3, r3, r7\n\t"
  137088. "sbcs r4, r4, r8\n\t"
  137089. "sbcs r5, r5, r9\n\t"
  137090. "sbcs r6, r6, r10\n\t"
  137091. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  137092. "sbc %[r], r6, r6\n\t"
  137093. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  137094. :
  137095. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  137096. );
  137097. return (uint32_t)(size_t)r;
  137098. }
  137099. /* Square a and put result in r. (r = a * a)
  137100. *
  137101. * r A single precision integer.
  137102. * a A single precision integer.
  137103. */
  137104. SP_NOINLINE static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a)
  137105. {
  137106. sp_digit* z0 = r;
  137107. sp_digit* z2 = r + 32;
  137108. sp_digit z1[32];
  137109. sp_digit* a1 = z1;
  137110. sp_digit zero[16];
  137111. sp_digit u;
  137112. sp_digit mask;
  137113. sp_digit* p1;
  137114. sp_digit* p2;
  137115. XMEMSET(zero, 0, sizeof(sp_digit) * 16);
  137116. mask = sp_1024_sub_16(a1, a, &a[16]);
  137117. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  137118. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  137119. (void)sp_1024_sub_16(a1, p1, p2);
  137120. sp_1024_sqr_16(z2, &a[16]);
  137121. sp_1024_sqr_16(z0, a);
  137122. sp_1024_sqr_16(z1, a1);
  137123. u = 0;
  137124. u -= sp_1024_sub_in_place_32(z1, z2);
  137125. u -= sp_1024_sub_in_place_32(z1, z0);
  137126. u += sp_1024_sub_in_place_32(r + 16, z1);
  137127. zero[0] = u;
  137128. (void)sp_1024_add_16(r + 48, r + 48, zero);
  137129. }
  137130. #else
  137131. /* Multiply a and b into r. (r = a * b)
  137132. *
  137133. * r A single precision integer.
  137134. * a A single precision integer.
  137135. * b A single precision integer.
  137136. */
  137137. static void sp_1024_mul_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  137138. {
  137139. register sp_digit* r asm ("r0") = r_p;
  137140. register const sp_digit* a asm ("r1") = a_p;
  137141. register const sp_digit* b asm ("r2") = b_p;
  137142. __asm__ __volatile__ (
  137143. "sub sp, sp, #0x100\n\t"
  137144. "mov r5, #0\n\t"
  137145. "mov r6, #0\n\t"
  137146. "mov r7, #0\n\t"
  137147. "mov r8, #0\n\t"
  137148. "\n"
  137149. "L_sp_1024_mul_32_outer_%=: \n\t"
  137150. "subs r3, r5, #0x7c\n\t"
  137151. "it cc\n\t"
  137152. "movcc r3, #0\n\t"
  137153. "sub r4, r5, r3\n\t"
  137154. "\n"
  137155. "L_sp_1024_mul_32_inner_%=: \n\t"
  137156. "ldr lr, [%[a], r3]\n\t"
  137157. "ldr r11, [%[b], r4]\n\t"
  137158. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  137159. "lsl r9, lr, #16\n\t"
  137160. "lsl r10, r11, #16\n\t"
  137161. "lsr r9, r9, #16\n\t"
  137162. "lsr r10, r10, #16\n\t"
  137163. "mul r10, r9, r10\n\t"
  137164. "adds r6, r6, r10\n\t"
  137165. "adcs r7, r7, #0\n\t"
  137166. "adc r8, r8, #0\n\t"
  137167. "lsr r10, r11, #16\n\t"
  137168. "mul r9, r10, r9\n\t"
  137169. "lsr r10, r9, #16\n\t"
  137170. "lsl r9, r9, #16\n\t"
  137171. "adds r6, r6, r9\n\t"
  137172. "adcs r7, r7, r10\n\t"
  137173. "adc r8, r8, #0\n\t"
  137174. "lsr r9, lr, #16\n\t"
  137175. "lsr r10, r11, #16\n\t"
  137176. "mul r10, r9, r10\n\t"
  137177. "adds r7, r7, r10\n\t"
  137178. "adc r8, r8, #0\n\t"
  137179. "lsl r10, r11, #16\n\t"
  137180. "lsr r10, r10, #16\n\t"
  137181. "mul r9, r10, r9\n\t"
  137182. "lsr r10, r9, #16\n\t"
  137183. "lsl r9, r9, #16\n\t"
  137184. "adds r6, r6, r9\n\t"
  137185. "adcs r7, r7, r10\n\t"
  137186. "adc r8, r8, #0\n\t"
  137187. #else
  137188. "umull r9, r10, lr, r11\n\t"
  137189. "adds r6, r6, r9\n\t"
  137190. "adcs r7, r7, r10\n\t"
  137191. "adc r8, r8, #0\n\t"
  137192. #endif
  137193. "add r3, r3, #4\n\t"
  137194. "sub r4, r4, #4\n\t"
  137195. "cmp r3, #0x80\n\t"
  137196. "beq L_sp_1024_mul_32_inner_done_%=\n\t"
  137197. "cmp r3, r5\n\t"
  137198. "ble L_sp_1024_mul_32_inner_%=\n\t"
  137199. "\n"
  137200. "L_sp_1024_mul_32_inner_done_%=: \n\t"
  137201. "str r6, [sp, r5]\n\t"
  137202. "mov r6, r7\n\t"
  137203. "mov r7, r8\n\t"
  137204. "mov r8, #0\n\t"
  137205. "add r5, r5, #4\n\t"
  137206. "cmp r5, #0xf8\n\t"
  137207. "ble L_sp_1024_mul_32_outer_%=\n\t"
  137208. "str r6, [sp, r5]\n\t"
  137209. "\n"
  137210. "L_sp_1024_mul_32_store_%=: \n\t"
  137211. "ldm sp!, {r6, r7, r8, r9}\n\t"
  137212. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  137213. "subs r5, r5, #16\n\t"
  137214. "bgt L_sp_1024_mul_32_store_%=\n\t"
  137215. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  137216. :
  137217. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11"
  137218. );
  137219. }
  137220. /* Square a and put result in r. (r = a * a)
  137221. *
  137222. * r A single precision integer.
  137223. * a A single precision integer.
  137224. */
  137225. static void sp_1024_sqr_32(sp_digit* r_p, const sp_digit* a_p)
  137226. {
  137227. register sp_digit* r asm ("r0") = r_p;
  137228. register const sp_digit* a asm ("r1") = a_p;
  137229. __asm__ __volatile__ (
  137230. "sub sp, sp, #0x100\n\t"
  137231. "mov r12, #0\n\t"
  137232. "mov r6, #0\n\t"
  137233. "mov r7, #0\n\t"
  137234. "mov r8, #0\n\t"
  137235. "mov r5, #0\n\t"
  137236. "\n"
  137237. "L_sp_1024_sqr_32_outer_%=: \n\t"
  137238. "subs r3, r5, #0x7c\n\t"
  137239. "it cc\n\t"
  137240. "movcc r3, r12\n\t"
  137241. "sub r4, r5, r3\n\t"
  137242. "\n"
  137243. "L_sp_1024_sqr_32_inner_%=: \n\t"
  137244. "cmp r4, r3\n\t"
  137245. "beq L_sp_1024_sqr_32_op_sqr_%=\n\t"
  137246. "ldr lr, [%[a], r3]\n\t"
  137247. "ldr r11, [%[a], r4]\n\t"
  137248. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  137249. "lsl r9, lr, #16\n\t"
  137250. "lsl r10, r11, #16\n\t"
  137251. "lsr r9, r9, #16\n\t"
  137252. "lsr r10, r10, #16\n\t"
  137253. "mul r10, r9, r10\n\t"
  137254. "adds r6, r6, r10\n\t"
  137255. "adcs r7, r7, #0\n\t"
  137256. "adc r8, r8, #0\n\t"
  137257. "adds r6, r6, r10\n\t"
  137258. "adcs r7, r7, #0\n\t"
  137259. "adc r8, r8, #0\n\t"
  137260. "lsr r10, r11, #16\n\t"
  137261. "mul r9, r10, r9\n\t"
  137262. "lsr r10, r9, #16\n\t"
  137263. "lsl r9, r9, #16\n\t"
  137264. "adds r6, r6, r9\n\t"
  137265. "adcs r7, r7, r10\n\t"
  137266. "adc r8, r8, #0\n\t"
  137267. "adds r6, r6, r9\n\t"
  137268. "adcs r7, r7, r10\n\t"
  137269. "adc r8, r8, #0\n\t"
  137270. "lsr r9, lr, #16\n\t"
  137271. "lsr r10, r11, #16\n\t"
  137272. "mul r10, r9, r10\n\t"
  137273. "adds r7, r7, r10\n\t"
  137274. "adc r8, r8, #0\n\t"
  137275. "adds r7, r7, r10\n\t"
  137276. "adc r8, r8, #0\n\t"
  137277. "lsl r10, r11, #16\n\t"
  137278. "lsr r10, r10, #16\n\t"
  137279. "mul r9, r10, r9\n\t"
  137280. "lsr r10, r9, #16\n\t"
  137281. "lsl r9, r9, #16\n\t"
  137282. "adds r6, r6, r9\n\t"
  137283. "adcs r7, r7, r10\n\t"
  137284. "adc r8, r8, #0\n\t"
  137285. "adds r6, r6, r9\n\t"
  137286. "adcs r7, r7, r10\n\t"
  137287. "adc r8, r8, #0\n\t"
  137288. #else
  137289. "umull r9, r10, lr, r11\n\t"
  137290. "adds r6, r6, r9\n\t"
  137291. "adcs r7, r7, r10\n\t"
  137292. "adc r8, r8, #0\n\t"
  137293. "adds r6, r6, r9\n\t"
  137294. "adcs r7, r7, r10\n\t"
  137295. "adc r8, r8, #0\n\t"
  137296. #endif
  137297. "bal L_sp_1024_sqr_32_op_done_%=\n\t"
  137298. "\n"
  137299. "L_sp_1024_sqr_32_op_sqr_%=: \n\t"
  137300. "ldr lr, [%[a], r3]\n\t"
  137301. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  137302. "lsl r9, lr, #16\n\t"
  137303. "lsr r10, lr, #16\n\t"
  137304. "lsr r9, r9, #16\n\t"
  137305. "mov r11, r9\n\t"
  137306. "mul r9, r11, r9\n\t"
  137307. "mov r11, r10\n\t"
  137308. "mul r10, r11, r10\n\t"
  137309. "adds r6, r6, r9\n\t"
  137310. "adcs r7, r7, r10\n\t"
  137311. "adc r8, r8, #0\n\t"
  137312. "lsr r10, lr, #16\n\t"
  137313. "lsl r9, lr, #16\n\t"
  137314. "lsr r9, r9, #16\n\t"
  137315. "mul r9, r10, r9\n\t"
  137316. "lsr r10, r9, #15\n\t"
  137317. "lsl r9, r9, #17\n\t"
  137318. "adds r6, r6, r9\n\t"
  137319. "adcs r7, r7, r10\n\t"
  137320. "adc r8, r8, #0\n\t"
  137321. #else
  137322. "umull r9, r10, lr, lr\n\t"
  137323. "adds r6, r6, r9\n\t"
  137324. "adcs r7, r7, r10\n\t"
  137325. "adc r8, r8, #0\n\t"
  137326. #endif
  137327. "\n"
  137328. "L_sp_1024_sqr_32_op_done_%=: \n\t"
  137329. "add r3, r3, #4\n\t"
  137330. "sub r4, r4, #4\n\t"
  137331. "cmp r3, #0x80\n\t"
  137332. "beq L_sp_1024_sqr_32_inner_done_%=\n\t"
  137333. "cmp r3, r4\n\t"
  137334. "bgt L_sp_1024_sqr_32_inner_done_%=\n\t"
  137335. "cmp r3, r5\n\t"
  137336. "ble L_sp_1024_sqr_32_inner_%=\n\t"
  137337. "\n"
  137338. "L_sp_1024_sqr_32_inner_done_%=: \n\t"
  137339. "str r6, [sp, r5]\n\t"
  137340. "mov r6, r7\n\t"
  137341. "mov r7, r8\n\t"
  137342. "mov r8, #0\n\t"
  137343. "add r5, r5, #4\n\t"
  137344. "cmp r5, #0xf8\n\t"
  137345. "ble L_sp_1024_sqr_32_outer_%=\n\t"
  137346. "str r6, [sp, r5]\n\t"
  137347. "\n"
  137348. "L_sp_1024_sqr_32_store_%=: \n\t"
  137349. "ldm sp!, {r6, r7, r8, r9}\n\t"
  137350. "stm %[r]!, {r6, r7, r8, r9}\n\t"
  137351. "subs r5, r5, #16\n\t"
  137352. "bgt L_sp_1024_sqr_32_store_%=\n\t"
  137353. : [r] "+r" (r), [a] "+r" (a)
  137354. :
  137355. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12"
  137356. );
  137357. }
  137358. #endif /* !WOLFSSL_SP_SMALL */
  137359. /* The modulus (prime) of the curve P1024. */
  137360. static const sp_digit p1024_mod[32] = {
  137361. 0xfea85feb,0x666d807a,0xac7ace87,0x80c5df10,0x89857db0,0xfce3e823,
  137362. 0x56971f1f,0x9f94d6af,0x1c3c09aa,0xa7cf3c52,0x31852a82,0xb6aff4a8,
  137363. 0x65681ce1,0x512ac5cd,0x326b4cd4,0xe26c6487,0xa666a6d0,0x356d27f4,
  137364. 0xf7c88a19,0xe791b39f,0x31a59cb0,0x228730d5,0xe2fc0f1b,0xf40aab27,
  137365. 0xb3e01a2e,0xbe9ae358,0x9cb48261,0x416c0ce1,0xdad0657a,0x65c61198,
  137366. 0x0a563fda,0x997abb1f
  137367. };
  137368. /* The Montgomery normalizer for modulus of the curve P1024. */
  137369. static const sp_digit p1024_norm_mod[32] = {
  137370. 0x0157a015,0x99927f85,0x53853178,0x7f3a20ef,0x767a824f,0x031c17dc,
  137371. 0xa968e0e0,0x606b2950,0xe3c3f655,0x5830c3ad,0xce7ad57d,0x49500b57,
  137372. 0x9a97e31e,0xaed53a32,0xcd94b32b,0x1d939b78,0x5999592f,0xca92d80b,
  137373. 0x083775e6,0x186e4c60,0xce5a634f,0xdd78cf2a,0x1d03f0e4,0x0bf554d8,
  137374. 0x4c1fe5d1,0x41651ca7,0x634b7d9e,0xbe93f31e,0x252f9a85,0x9a39ee67,
  137375. 0xf5a9c025,0x668544e0
  137376. };
  137377. /* The Montgomery multiplier for modulus of the curve P1024. */
  137378. static sp_digit p1024_mp_mod = 0x7c8f2f3d;
  137379. #if defined(WOLFSSL_SP_SMALL) || defined(HAVE_ECC_CHECK_KEY)
  137380. /* The order of the curve P1024. */
  137381. static const sp_digit p1024_order[32] = {
  137382. 0xbfaa17fb,0xd99b601e,0x2b1eb3a1,0x203177c4,0xe2615f6c,0xff38fa08,
  137383. 0xd5a5c7c7,0xa7e535ab,0x870f026a,0xa9f3cf14,0x0c614aa0,0x6dabfd2a,
  137384. 0x595a0738,0x144ab173,0xcc9ad335,0x389b1921,0x2999a9b4,0x4d5b49fd,
  137385. 0xfdf22286,0x39e46ce7,0x4c69672c,0xc8a1cc35,0xf8bf03c6,0xbd02aac9,
  137386. 0x2cf8068b,0x6fa6b8d6,0x672d2098,0x905b0338,0x36b4195e,0x99718466,
  137387. 0xc2958ff6,0x265eaec7
  137388. };
  137389. #endif
  137390. /* The base point of curve P1024. */
  137391. static const sp_point_1024 p1024_base = {
  137392. /* X ordinate */
  137393. {
  137394. 0xeae63895,0x880dc8ab,0x967e0979,0x80ec46c4,0xb63f73ec,0xee9163a5,
  137395. 0x80728d87,0xd5cfb4cc,0xba66910d,0xa7c1514d,0x7a60de74,0xa702c339,
  137396. 0x8b72f2e1,0x337c8654,0x5dd5bccb,0x9760af76,0x406ce890,0x718bd9e7,
  137397. 0xdb9dfa55,0x43d5f22c,0x30b09e10,0xab10db90,0xf6ce2308,0xb5edb6c0,
  137398. 0xb6ff7cbf,0x98b2f204,0x0aec69c6,0x2b1a2fd6,0x3ed9b52a,0x0a799005,
  137399. 0x332c29ad,0x53fc09ee,
  137400. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137401. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137402. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137403. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137404. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137405. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137406. (sp_digit)0, (sp_digit)0
  137407. },
  137408. /* Y ordinate */
  137409. {
  137410. 0x1bef16d7,0x75573fd7,0x6a67dcde,0xadb9b570,0xd5bb4636,0x80bdad5a,
  137411. 0xe9cb99a9,0x13515ad7,0xc5a4d5f2,0x492d979f,0x164aa989,0xac6f1e80,
  137412. 0xb7652fe0,0xcad696b5,0xad547c6c,0x70dae117,0xa9e032b9,0x416cff0c,
  137413. 0x9a140b2e,0x6b598ccf,0xf0de55f6,0xe7f7f5e5,0x654ec2b9,0xf5ea69f4,
  137414. 0x1e141178,0x3d778d82,0x02990696,0xd3e82016,0x3634a135,0xf9f1f053,
  137415. 0x3f6009f1,0x0a824906,
  137416. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137417. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137418. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137419. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137420. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137421. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137422. (sp_digit)0, (sp_digit)0
  137423. },
  137424. /* Z ordinate */
  137425. {
  137426. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  137427. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  137428. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  137429. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  137430. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  137431. 0x00000000,0x00000000,
  137432. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137433. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137434. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137435. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137436. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137437. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  137438. (sp_digit)0, (sp_digit)0
  137439. },
  137440. /* infinity */
  137441. 0
  137442. };
  137443. #ifdef WOLFSSL_SP_SMALL
  137444. /* Sub b from a into a. (a -= b)
  137445. *
  137446. * a A single precision integer.
  137447. * b A single precision integer.
  137448. */
  137449. static sp_digit sp_1024_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p)
  137450. {
  137451. register sp_digit* a asm ("r0") = a_p;
  137452. register const sp_digit* b asm ("r1") = b_p;
  137453. __asm__ __volatile__ (
  137454. "mov r10, #0\n\t"
  137455. "mov r12, #0\n\t"
  137456. "add lr, %[a], #0x80\n\t"
  137457. "\n"
  137458. "L_sp_1024_sub_in_pkace_32_word_%=: \n\t"
  137459. "subs r12, r10, r12\n\t"
  137460. "ldm %[a], {r2, r3, r4, r5}\n\t"
  137461. "ldm %[b]!, {r6, r7, r8, r9}\n\t"
  137462. "sbcs r2, r2, r6\n\t"
  137463. "sbcs r3, r3, r7\n\t"
  137464. "sbcs r4, r4, r8\n\t"
  137465. "sbcs r5, r5, r9\n\t"
  137466. "stm %[a]!, {r2, r3, r4, r5}\n\t"
  137467. "sbc r12, r10, r10\n\t"
  137468. "cmp %[a], lr\n\t"
  137469. "bne L_sp_1024_sub_in_pkace_32_word_%=\n\t"
  137470. "mov %[a], r12\n\t"
  137471. : [a] "+r" (a), [b] "+r" (b)
  137472. :
  137473. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10"
  137474. );
  137475. return (uint32_t)(size_t)a;
  137476. }
  137477. #endif /* WOLFSSL_SP_SMALL */
  137478. #ifdef WOLFSSL_SP_SMALL
  137479. /* Conditionally subtract b from a using the mask m.
  137480. * m is -1 to subtract and 0 when not copying.
  137481. *
  137482. * r A single precision number representing condition subtract result.
  137483. * a A single precision number to subtract from.
  137484. * b A single precision number to subtract.
  137485. * m Mask value to apply.
  137486. */
  137487. static sp_digit sp_1024_cond_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  137488. {
  137489. register sp_digit* r asm ("r0") = r_p;
  137490. register const sp_digit* a asm ("r1") = a_p;
  137491. register const sp_digit* b asm ("r2") = b_p;
  137492. register sp_digit m asm ("r3") = m_p;
  137493. __asm__ __volatile__ (
  137494. "mov r6, #0\n\t"
  137495. "mov r12, #0\n\t"
  137496. "mov lr, #0\n\t"
  137497. "\n"
  137498. "L_sp_1024_cond_sub_32_words_%=: \n\t"
  137499. "subs r12, r6, r12\n\t"
  137500. "ldr r4, [%[a], lr]\n\t"
  137501. "ldr r5, [%[b], lr]\n\t"
  137502. "and r5, r5, %[m]\n\t"
  137503. "sbcs r4, r4, r5\n\t"
  137504. "sbc r12, r6, r6\n\t"
  137505. "str r4, [%[r], lr]\n\t"
  137506. "add lr, lr, #4\n\t"
  137507. "cmp lr, #0x80\n\t"
  137508. "blt L_sp_1024_cond_sub_32_words_%=\n\t"
  137509. "mov %[r], r12\n\t"
  137510. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  137511. :
  137512. : "memory", "r12", "lr", "r4", "r5", "r6"
  137513. );
  137514. return (uint32_t)(size_t)r;
  137515. }
  137516. #else
  137517. /* Conditionally subtract b from a using the mask m.
  137518. * m is -1 to subtract and 0 when not copying.
  137519. *
  137520. * r A single precision number representing condition subtract result.
  137521. * a A single precision number to subtract from.
  137522. * b A single precision number to subtract.
  137523. * m Mask value to apply.
  137524. */
  137525. static sp_digit sp_1024_cond_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  137526. {
  137527. register sp_digit* r asm ("r0") = r_p;
  137528. register const sp_digit* a asm ("r1") = a_p;
  137529. register const sp_digit* b asm ("r2") = b_p;
  137530. register sp_digit m asm ("r3") = m_p;
  137531. __asm__ __volatile__ (
  137532. "mov lr, #0\n\t"
  137533. "ldm %[a]!, {r4, r5}\n\t"
  137534. "ldm %[b]!, {r6, r7}\n\t"
  137535. "and r6, r6, %[m]\n\t"
  137536. "and r7, r7, %[m]\n\t"
  137537. "subs r4, r4, r6\n\t"
  137538. "sbcs r5, r5, r7\n\t"
  137539. "stm %[r]!, {r4, r5}\n\t"
  137540. "ldm %[a]!, {r4, r5}\n\t"
  137541. "ldm %[b]!, {r6, r7}\n\t"
  137542. "and r6, r6, %[m]\n\t"
  137543. "and r7, r7, %[m]\n\t"
  137544. "sbcs r4, r4, r6\n\t"
  137545. "sbcs r5, r5, r7\n\t"
  137546. "stm %[r]!, {r4, r5}\n\t"
  137547. "ldm %[a]!, {r4, r5}\n\t"
  137548. "ldm %[b]!, {r6, r7}\n\t"
  137549. "and r6, r6, %[m]\n\t"
  137550. "and r7, r7, %[m]\n\t"
  137551. "sbcs r4, r4, r6\n\t"
  137552. "sbcs r5, r5, r7\n\t"
  137553. "stm %[r]!, {r4, r5}\n\t"
  137554. "ldm %[a]!, {r4, r5}\n\t"
  137555. "ldm %[b]!, {r6, r7}\n\t"
  137556. "and r6, r6, %[m]\n\t"
  137557. "and r7, r7, %[m]\n\t"
  137558. "sbcs r4, r4, r6\n\t"
  137559. "sbcs r5, r5, r7\n\t"
  137560. "stm %[r]!, {r4, r5}\n\t"
  137561. "ldm %[a]!, {r4, r5}\n\t"
  137562. "ldm %[b]!, {r6, r7}\n\t"
  137563. "and r6, r6, %[m]\n\t"
  137564. "and r7, r7, %[m]\n\t"
  137565. "sbcs r4, r4, r6\n\t"
  137566. "sbcs r5, r5, r7\n\t"
  137567. "stm %[r]!, {r4, r5}\n\t"
  137568. "ldm %[a]!, {r4, r5}\n\t"
  137569. "ldm %[b]!, {r6, r7}\n\t"
  137570. "and r6, r6, %[m]\n\t"
  137571. "and r7, r7, %[m]\n\t"
  137572. "sbcs r4, r4, r6\n\t"
  137573. "sbcs r5, r5, r7\n\t"
  137574. "stm %[r]!, {r4, r5}\n\t"
  137575. "ldm %[a]!, {r4, r5}\n\t"
  137576. "ldm %[b]!, {r6, r7}\n\t"
  137577. "and r6, r6, %[m]\n\t"
  137578. "and r7, r7, %[m]\n\t"
  137579. "sbcs r4, r4, r6\n\t"
  137580. "sbcs r5, r5, r7\n\t"
  137581. "stm %[r]!, {r4, r5}\n\t"
  137582. "ldm %[a]!, {r4, r5}\n\t"
  137583. "ldm %[b]!, {r6, r7}\n\t"
  137584. "and r6, r6, %[m]\n\t"
  137585. "and r7, r7, %[m]\n\t"
  137586. "sbcs r4, r4, r6\n\t"
  137587. "sbcs r5, r5, r7\n\t"
  137588. "stm %[r]!, {r4, r5}\n\t"
  137589. "ldm %[a]!, {r4, r5}\n\t"
  137590. "ldm %[b]!, {r6, r7}\n\t"
  137591. "and r6, r6, %[m]\n\t"
  137592. "and r7, r7, %[m]\n\t"
  137593. "sbcs r4, r4, r6\n\t"
  137594. "sbcs r5, r5, r7\n\t"
  137595. "stm %[r]!, {r4, r5}\n\t"
  137596. "ldm %[a]!, {r4, r5}\n\t"
  137597. "ldm %[b]!, {r6, r7}\n\t"
  137598. "and r6, r6, %[m]\n\t"
  137599. "and r7, r7, %[m]\n\t"
  137600. "sbcs r4, r4, r6\n\t"
  137601. "sbcs r5, r5, r7\n\t"
  137602. "stm %[r]!, {r4, r5}\n\t"
  137603. "ldm %[a]!, {r4, r5}\n\t"
  137604. "ldm %[b]!, {r6, r7}\n\t"
  137605. "and r6, r6, %[m]\n\t"
  137606. "and r7, r7, %[m]\n\t"
  137607. "sbcs r4, r4, r6\n\t"
  137608. "sbcs r5, r5, r7\n\t"
  137609. "stm %[r]!, {r4, r5}\n\t"
  137610. "ldm %[a]!, {r4, r5}\n\t"
  137611. "ldm %[b]!, {r6, r7}\n\t"
  137612. "and r6, r6, %[m]\n\t"
  137613. "and r7, r7, %[m]\n\t"
  137614. "sbcs r4, r4, r6\n\t"
  137615. "sbcs r5, r5, r7\n\t"
  137616. "stm %[r]!, {r4, r5}\n\t"
  137617. "ldm %[a]!, {r4, r5}\n\t"
  137618. "ldm %[b]!, {r6, r7}\n\t"
  137619. "and r6, r6, %[m]\n\t"
  137620. "and r7, r7, %[m]\n\t"
  137621. "sbcs r4, r4, r6\n\t"
  137622. "sbcs r5, r5, r7\n\t"
  137623. "stm %[r]!, {r4, r5}\n\t"
  137624. "ldm %[a]!, {r4, r5}\n\t"
  137625. "ldm %[b]!, {r6, r7}\n\t"
  137626. "and r6, r6, %[m]\n\t"
  137627. "and r7, r7, %[m]\n\t"
  137628. "sbcs r4, r4, r6\n\t"
  137629. "sbcs r5, r5, r7\n\t"
  137630. "stm %[r]!, {r4, r5}\n\t"
  137631. "ldm %[a]!, {r4, r5}\n\t"
  137632. "ldm %[b]!, {r6, r7}\n\t"
  137633. "and r6, r6, %[m]\n\t"
  137634. "and r7, r7, %[m]\n\t"
  137635. "sbcs r4, r4, r6\n\t"
  137636. "sbcs r5, r5, r7\n\t"
  137637. "stm %[r]!, {r4, r5}\n\t"
  137638. "ldm %[a]!, {r4, r5}\n\t"
  137639. "ldm %[b]!, {r6, r7}\n\t"
  137640. "and r6, r6, %[m]\n\t"
  137641. "and r7, r7, %[m]\n\t"
  137642. "sbcs r4, r4, r6\n\t"
  137643. "sbcs r5, r5, r7\n\t"
  137644. "stm %[r]!, {r4, r5}\n\t"
  137645. "sbc %[r], lr, lr\n\t"
  137646. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  137647. :
  137648. : "memory", "r12", "lr", "r4", "r5", "r6", "r7"
  137649. );
  137650. return (uint32_t)(size_t)r;
  137651. }
  137652. #endif /* WOLFSSL_SP_SMALL */
  137653. #ifdef WOLFSSL_SP_SMALL
  137654. /* Add b to a into r. (r = a + b)
  137655. *
  137656. * r A single precision integer.
  137657. * a A single precision integer.
  137658. * b A single precision integer.
  137659. */
  137660. static sp_digit sp_1024_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  137661. {
  137662. register sp_digit* r asm ("r0") = r_p;
  137663. register const sp_digit* a asm ("r1") = a_p;
  137664. register const sp_digit* b asm ("r2") = b_p;
  137665. __asm__ __volatile__ (
  137666. "mov r3, #0\n\t"
  137667. "add r12, %[a], #0x80\n\t"
  137668. "\n"
  137669. "L_sp_1024_add_32_word_%=: \n\t"
  137670. "adds r3, r3, #-1\n\t"
  137671. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  137672. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  137673. "adcs r4, r4, r8\n\t"
  137674. "adcs r5, r5, r9\n\t"
  137675. "adcs r6, r6, r10\n\t"
  137676. "adcs r7, r7, r11\n\t"
  137677. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  137678. "mov r4, #0\n\t"
  137679. "adc r3, r4, #0\n\t"
  137680. "cmp %[a], r12\n\t"
  137681. "bne L_sp_1024_add_32_word_%=\n\t"
  137682. "mov %[r], r3\n\t"
  137683. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  137684. :
  137685. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12"
  137686. );
  137687. return (uint32_t)(size_t)r;
  137688. }
  137689. #endif /* WOLFSSL_SP_SMALL */
  137690. #ifdef WOLFSSL_SP_SMALL
  137691. /* Mul a by digit b into r. (r = a * b)
  137692. *
  137693. * r A single precision integer.
  137694. * a A single precision integer.
  137695. * b A single precision digit.
  137696. */
  137697. static void sp_1024_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  137698. {
  137699. register sp_digit* r asm ("r0") = r_p;
  137700. register const sp_digit* a asm ("r1") = a_p;
  137701. register sp_digit b asm ("r2") = b_p;
  137702. __asm__ __volatile__ (
  137703. "mov r10, #0\n\t"
  137704. /* A[0] * B */
  137705. "ldr r8, [%[a]]\n\t"
  137706. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  137707. "lsl r6, %[b], #16\n\t"
  137708. "lsl r5, r8, #16\n\t"
  137709. "lsr r6, r6, #16\n\t"
  137710. "lsr r5, r5, #16\n\t"
  137711. "mul r5, r6, r5\n\t"
  137712. "lsr r7, r8, #16\n\t"
  137713. "mul r6, r7, r6\n\t"
  137714. "lsr r3, r6, #16\n\t"
  137715. "lsl r6, r6, #16\n\t"
  137716. "adds r5, r5, r6\n\t"
  137717. "adc r3, r3, #0\n\t"
  137718. "lsr r6, %[b], #16\n\t"
  137719. "mul r7, r6, r7\n\t"
  137720. "add r3, r3, r7\n\t"
  137721. "lsl r7, r8, #16\n\t"
  137722. "lsr r7, r7, #16\n\t"
  137723. "mul r6, r7, r6\n\t"
  137724. "lsr r7, r6, #16\n\t"
  137725. "lsl r6, r6, #16\n\t"
  137726. "adds r5, r5, r6\n\t"
  137727. "adc r3, r3, r7\n\t"
  137728. #else
  137729. "umull r5, r3, %[b], r8\n\t"
  137730. #endif
  137731. "mov r4, #0\n\t"
  137732. "str r5, [%[r]]\n\t"
  137733. "mov r5, #0\n\t"
  137734. "mov r9, #4\n\t"
  137735. "\n"
  137736. "L_sp_1024_mul_d_32_word_%=: \n\t"
  137737. /* A[i] * B */
  137738. "ldr r8, [%[a], r9]\n\t"
  137739. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  137740. "lsl r6, %[b], #16\n\t"
  137741. "lsl r7, r8, #16\n\t"
  137742. "lsr r6, r6, #16\n\t"
  137743. "lsr r7, r7, #16\n\t"
  137744. "mul r7, r6, r7\n\t"
  137745. "adds r3, r3, r7\n\t"
  137746. "adcs r4, r4, #0\n\t"
  137747. "adc r5, r5, #0\n\t"
  137748. "lsr r7, r8, #16\n\t"
  137749. "mul r6, r7, r6\n\t"
  137750. "lsr r7, r6, #16\n\t"
  137751. "lsl r6, r6, #16\n\t"
  137752. "adds r3, r3, r6\n\t"
  137753. "adcs r4, r4, r7\n\t"
  137754. "adc r5, r5, #0\n\t"
  137755. "lsr r6, %[b], #16\n\t"
  137756. "lsr r7, r8, #16\n\t"
  137757. "mul r7, r6, r7\n\t"
  137758. "adds r4, r4, r7\n\t"
  137759. "adc r5, r5, #0\n\t"
  137760. "lsl r7, r8, #16\n\t"
  137761. "lsr r7, r7, #16\n\t"
  137762. "mul r6, r7, r6\n\t"
  137763. "lsr r7, r6, #16\n\t"
  137764. "lsl r6, r6, #16\n\t"
  137765. "adds r3, r3, r6\n\t"
  137766. "adcs r4, r4, r7\n\t"
  137767. "adc r5, r5, #0\n\t"
  137768. #else
  137769. "umull r6, r7, %[b], r8\n\t"
  137770. "adds r3, r3, r6\n\t"
  137771. "adcs r4, r4, r7\n\t"
  137772. "adc r5, r5, #0\n\t"
  137773. #endif
  137774. "str r3, [%[r], r9]\n\t"
  137775. "mov r3, r4\n\t"
  137776. "mov r4, r5\n\t"
  137777. "mov r5, #0\n\t"
  137778. "add r9, r9, #4\n\t"
  137779. "cmp r9, #0x80\n\t"
  137780. "blt L_sp_1024_mul_d_32_word_%=\n\t"
  137781. "str r3, [%[r], #128]\n\t"
  137782. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  137783. :
  137784. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  137785. );
  137786. }
  137787. #else
  137788. /* Mul a by digit b into r. (r = a * b)
  137789. *
  137790. * r A single precision integer.
  137791. * a A single precision integer.
  137792. * b A single precision digit.
  137793. */
  137794. static void sp_1024_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p)
  137795. {
  137796. register sp_digit* r asm ("r0") = r_p;
  137797. register const sp_digit* a asm ("r1") = a_p;
  137798. register sp_digit b asm ("r2") = b_p;
  137799. __asm__ __volatile__ (
  137800. "mov r10, #0\n\t"
  137801. /* A[0] * B */
  137802. "ldr r8, [%[a]], #4\n\t"
  137803. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  137804. "lsl r6, %[b], #16\n\t"
  137805. "lsl r3, r8, #16\n\t"
  137806. "lsr r6, r6, #16\n\t"
  137807. "lsr r3, r3, #16\n\t"
  137808. "mul r3, r6, r3\n\t"
  137809. "lsr r7, r8, #16\n\t"
  137810. "mul r6, r7, r6\n\t"
  137811. "lsr r4, r6, #16\n\t"
  137812. "lsl r6, r6, #16\n\t"
  137813. "adds r3, r3, r6\n\t"
  137814. "adc r4, r4, #0\n\t"
  137815. "lsr r6, %[b], #16\n\t"
  137816. "mul r7, r6, r7\n\t"
  137817. "add r4, r4, r7\n\t"
  137818. "lsl r7, r8, #16\n\t"
  137819. "lsr r7, r7, #16\n\t"
  137820. "mul r6, r7, r6\n\t"
  137821. "lsr r7, r6, #16\n\t"
  137822. "lsl r6, r6, #16\n\t"
  137823. "adds r3, r3, r6\n\t"
  137824. "adc r4, r4, r7\n\t"
  137825. #else
  137826. "umull r3, r4, %[b], r8\n\t"
  137827. #endif
  137828. "mov r5, #0\n\t"
  137829. "str r3, [%[r]], #4\n\t"
  137830. /* A[1] * B */
  137831. "ldr r8, [%[a]], #4\n\t"
  137832. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  137833. "lsl r6, %[b], #16\n\t"
  137834. "lsl r7, r8, #16\n\t"
  137835. "lsr r6, r6, #16\n\t"
  137836. "lsr r7, r7, #16\n\t"
  137837. "mul r7, r6, r7\n\t"
  137838. "adds r4, r4, r7\n\t"
  137839. "adcs r5, r5, #0\n\t"
  137840. "mov r3, #0\n\t"
  137841. "adc r3, r3, #0\n\t"
  137842. "lsr r7, r8, #16\n\t"
  137843. "mul r6, r7, r6\n\t"
  137844. "lsr r7, r6, #16\n\t"
  137845. "lsl r6, r6, #16\n\t"
  137846. "adds r4, r4, r6\n\t"
  137847. "adcs r5, r5, r7\n\t"
  137848. "adc r3, r3, #0\n\t"
  137849. "lsr r6, %[b], #16\n\t"
  137850. "lsr r7, r8, #16\n\t"
  137851. "mul r7, r6, r7\n\t"
  137852. "adds r5, r5, r7\n\t"
  137853. "adc r3, r3, #0\n\t"
  137854. "lsl r7, r8, #16\n\t"
  137855. "lsr r7, r7, #16\n\t"
  137856. "mul r6, r7, r6\n\t"
  137857. "lsr r7, r6, #16\n\t"
  137858. "lsl r6, r6, #16\n\t"
  137859. "adds r4, r4, r6\n\t"
  137860. "adcs r5, r5, r7\n\t"
  137861. "adc r3, r3, #0\n\t"
  137862. #else
  137863. "umull r6, r7, %[b], r8\n\t"
  137864. "adds r4, r4, r6\n\t"
  137865. "adcs r5, r5, r7\n\t"
  137866. "mov r3, #0\n\t"
  137867. "adc r3, r3, #0\n\t"
  137868. #endif
  137869. "str r4, [%[r]], #4\n\t"
  137870. /* A[2] * B */
  137871. "ldr r8, [%[a]], #4\n\t"
  137872. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  137873. "lsl r6, %[b], #16\n\t"
  137874. "lsl r7, r8, #16\n\t"
  137875. "lsr r6, r6, #16\n\t"
  137876. "lsr r7, r7, #16\n\t"
  137877. "mul r7, r6, r7\n\t"
  137878. "adds r5, r5, r7\n\t"
  137879. "adcs r3, r3, #0\n\t"
  137880. "mov r4, #0\n\t"
  137881. "adc r4, r4, #0\n\t"
  137882. "lsr r7, r8, #16\n\t"
  137883. "mul r6, r7, r6\n\t"
  137884. "lsr r7, r6, #16\n\t"
  137885. "lsl r6, r6, #16\n\t"
  137886. "adds r5, r5, r6\n\t"
  137887. "adcs r3, r3, r7\n\t"
  137888. "adc r4, r4, #0\n\t"
  137889. "lsr r6, %[b], #16\n\t"
  137890. "lsr r7, r8, #16\n\t"
  137891. "mul r7, r6, r7\n\t"
  137892. "adds r3, r3, r7\n\t"
  137893. "adc r4, r4, #0\n\t"
  137894. "lsl r7, r8, #16\n\t"
  137895. "lsr r7, r7, #16\n\t"
  137896. "mul r6, r7, r6\n\t"
  137897. "lsr r7, r6, #16\n\t"
  137898. "lsl r6, r6, #16\n\t"
  137899. "adds r5, r5, r6\n\t"
  137900. "adcs r3, r3, r7\n\t"
  137901. "adc r4, r4, #0\n\t"
  137902. #else
  137903. "umull r6, r7, %[b], r8\n\t"
  137904. "adds r5, r5, r6\n\t"
  137905. "adcs r3, r3, r7\n\t"
  137906. "mov r4, #0\n\t"
  137907. "adc r4, r4, #0\n\t"
  137908. #endif
  137909. "str r5, [%[r]], #4\n\t"
  137910. /* A[3] * B */
  137911. "ldr r8, [%[a]], #4\n\t"
  137912. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  137913. "lsl r6, %[b], #16\n\t"
  137914. "lsl r7, r8, #16\n\t"
  137915. "lsr r6, r6, #16\n\t"
  137916. "lsr r7, r7, #16\n\t"
  137917. "mul r7, r6, r7\n\t"
  137918. "adds r3, r3, r7\n\t"
  137919. "adcs r4, r4, #0\n\t"
  137920. "mov r5, #0\n\t"
  137921. "adc r5, r5, #0\n\t"
  137922. "lsr r7, r8, #16\n\t"
  137923. "mul r6, r7, r6\n\t"
  137924. "lsr r7, r6, #16\n\t"
  137925. "lsl r6, r6, #16\n\t"
  137926. "adds r3, r3, r6\n\t"
  137927. "adcs r4, r4, r7\n\t"
  137928. "adc r5, r5, #0\n\t"
  137929. "lsr r6, %[b], #16\n\t"
  137930. "lsr r7, r8, #16\n\t"
  137931. "mul r7, r6, r7\n\t"
  137932. "adds r4, r4, r7\n\t"
  137933. "adc r5, r5, #0\n\t"
  137934. "lsl r7, r8, #16\n\t"
  137935. "lsr r7, r7, #16\n\t"
  137936. "mul r6, r7, r6\n\t"
  137937. "lsr r7, r6, #16\n\t"
  137938. "lsl r6, r6, #16\n\t"
  137939. "adds r3, r3, r6\n\t"
  137940. "adcs r4, r4, r7\n\t"
  137941. "adc r5, r5, #0\n\t"
  137942. #else
  137943. "umull r6, r7, %[b], r8\n\t"
  137944. "adds r3, r3, r6\n\t"
  137945. "adcs r4, r4, r7\n\t"
  137946. "mov r5, #0\n\t"
  137947. "adc r5, r5, #0\n\t"
  137948. #endif
  137949. "str r3, [%[r]], #4\n\t"
  137950. /* A[4] * B */
  137951. "ldr r8, [%[a]], #4\n\t"
  137952. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  137953. "lsl r6, %[b], #16\n\t"
  137954. "lsl r7, r8, #16\n\t"
  137955. "lsr r6, r6, #16\n\t"
  137956. "lsr r7, r7, #16\n\t"
  137957. "mul r7, r6, r7\n\t"
  137958. "adds r4, r4, r7\n\t"
  137959. "adcs r5, r5, #0\n\t"
  137960. "mov r3, #0\n\t"
  137961. "adc r3, r3, #0\n\t"
  137962. "lsr r7, r8, #16\n\t"
  137963. "mul r6, r7, r6\n\t"
  137964. "lsr r7, r6, #16\n\t"
  137965. "lsl r6, r6, #16\n\t"
  137966. "adds r4, r4, r6\n\t"
  137967. "adcs r5, r5, r7\n\t"
  137968. "adc r3, r3, #0\n\t"
  137969. "lsr r6, %[b], #16\n\t"
  137970. "lsr r7, r8, #16\n\t"
  137971. "mul r7, r6, r7\n\t"
  137972. "adds r5, r5, r7\n\t"
  137973. "adc r3, r3, #0\n\t"
  137974. "lsl r7, r8, #16\n\t"
  137975. "lsr r7, r7, #16\n\t"
  137976. "mul r6, r7, r6\n\t"
  137977. "lsr r7, r6, #16\n\t"
  137978. "lsl r6, r6, #16\n\t"
  137979. "adds r4, r4, r6\n\t"
  137980. "adcs r5, r5, r7\n\t"
  137981. "adc r3, r3, #0\n\t"
  137982. #else
  137983. "umull r6, r7, %[b], r8\n\t"
  137984. "adds r4, r4, r6\n\t"
  137985. "adcs r5, r5, r7\n\t"
  137986. "mov r3, #0\n\t"
  137987. "adc r3, r3, #0\n\t"
  137988. #endif
  137989. "str r4, [%[r]], #4\n\t"
  137990. /* A[5] * B */
  137991. "ldr r8, [%[a]], #4\n\t"
  137992. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  137993. "lsl r6, %[b], #16\n\t"
  137994. "lsl r7, r8, #16\n\t"
  137995. "lsr r6, r6, #16\n\t"
  137996. "lsr r7, r7, #16\n\t"
  137997. "mul r7, r6, r7\n\t"
  137998. "adds r5, r5, r7\n\t"
  137999. "adcs r3, r3, #0\n\t"
  138000. "mov r4, #0\n\t"
  138001. "adc r4, r4, #0\n\t"
  138002. "lsr r7, r8, #16\n\t"
  138003. "mul r6, r7, r6\n\t"
  138004. "lsr r7, r6, #16\n\t"
  138005. "lsl r6, r6, #16\n\t"
  138006. "adds r5, r5, r6\n\t"
  138007. "adcs r3, r3, r7\n\t"
  138008. "adc r4, r4, #0\n\t"
  138009. "lsr r6, %[b], #16\n\t"
  138010. "lsr r7, r8, #16\n\t"
  138011. "mul r7, r6, r7\n\t"
  138012. "adds r3, r3, r7\n\t"
  138013. "adc r4, r4, #0\n\t"
  138014. "lsl r7, r8, #16\n\t"
  138015. "lsr r7, r7, #16\n\t"
  138016. "mul r6, r7, r6\n\t"
  138017. "lsr r7, r6, #16\n\t"
  138018. "lsl r6, r6, #16\n\t"
  138019. "adds r5, r5, r6\n\t"
  138020. "adcs r3, r3, r7\n\t"
  138021. "adc r4, r4, #0\n\t"
  138022. #else
  138023. "umull r6, r7, %[b], r8\n\t"
  138024. "adds r5, r5, r6\n\t"
  138025. "adcs r3, r3, r7\n\t"
  138026. "mov r4, #0\n\t"
  138027. "adc r4, r4, #0\n\t"
  138028. #endif
  138029. "str r5, [%[r]], #4\n\t"
  138030. /* A[6] * B */
  138031. "ldr r8, [%[a]], #4\n\t"
  138032. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138033. "lsl r6, %[b], #16\n\t"
  138034. "lsl r7, r8, #16\n\t"
  138035. "lsr r6, r6, #16\n\t"
  138036. "lsr r7, r7, #16\n\t"
  138037. "mul r7, r6, r7\n\t"
  138038. "adds r3, r3, r7\n\t"
  138039. "adcs r4, r4, #0\n\t"
  138040. "mov r5, #0\n\t"
  138041. "adc r5, r5, #0\n\t"
  138042. "lsr r7, r8, #16\n\t"
  138043. "mul r6, r7, r6\n\t"
  138044. "lsr r7, r6, #16\n\t"
  138045. "lsl r6, r6, #16\n\t"
  138046. "adds r3, r3, r6\n\t"
  138047. "adcs r4, r4, r7\n\t"
  138048. "adc r5, r5, #0\n\t"
  138049. "lsr r6, %[b], #16\n\t"
  138050. "lsr r7, r8, #16\n\t"
  138051. "mul r7, r6, r7\n\t"
  138052. "adds r4, r4, r7\n\t"
  138053. "adc r5, r5, #0\n\t"
  138054. "lsl r7, r8, #16\n\t"
  138055. "lsr r7, r7, #16\n\t"
  138056. "mul r6, r7, r6\n\t"
  138057. "lsr r7, r6, #16\n\t"
  138058. "lsl r6, r6, #16\n\t"
  138059. "adds r3, r3, r6\n\t"
  138060. "adcs r4, r4, r7\n\t"
  138061. "adc r5, r5, #0\n\t"
  138062. #else
  138063. "umull r6, r7, %[b], r8\n\t"
  138064. "adds r3, r3, r6\n\t"
  138065. "adcs r4, r4, r7\n\t"
  138066. "mov r5, #0\n\t"
  138067. "adc r5, r5, #0\n\t"
  138068. #endif
  138069. "str r3, [%[r]], #4\n\t"
  138070. /* A[7] * B */
  138071. "ldr r8, [%[a]], #4\n\t"
  138072. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138073. "lsl r6, %[b], #16\n\t"
  138074. "lsl r7, r8, #16\n\t"
  138075. "lsr r6, r6, #16\n\t"
  138076. "lsr r7, r7, #16\n\t"
  138077. "mul r7, r6, r7\n\t"
  138078. "adds r4, r4, r7\n\t"
  138079. "adcs r5, r5, #0\n\t"
  138080. "mov r3, #0\n\t"
  138081. "adc r3, r3, #0\n\t"
  138082. "lsr r7, r8, #16\n\t"
  138083. "mul r6, r7, r6\n\t"
  138084. "lsr r7, r6, #16\n\t"
  138085. "lsl r6, r6, #16\n\t"
  138086. "adds r4, r4, r6\n\t"
  138087. "adcs r5, r5, r7\n\t"
  138088. "adc r3, r3, #0\n\t"
  138089. "lsr r6, %[b], #16\n\t"
  138090. "lsr r7, r8, #16\n\t"
  138091. "mul r7, r6, r7\n\t"
  138092. "adds r5, r5, r7\n\t"
  138093. "adc r3, r3, #0\n\t"
  138094. "lsl r7, r8, #16\n\t"
  138095. "lsr r7, r7, #16\n\t"
  138096. "mul r6, r7, r6\n\t"
  138097. "lsr r7, r6, #16\n\t"
  138098. "lsl r6, r6, #16\n\t"
  138099. "adds r4, r4, r6\n\t"
  138100. "adcs r5, r5, r7\n\t"
  138101. "adc r3, r3, #0\n\t"
  138102. #else
  138103. "umull r6, r7, %[b], r8\n\t"
  138104. "adds r4, r4, r6\n\t"
  138105. "adcs r5, r5, r7\n\t"
  138106. "mov r3, #0\n\t"
  138107. "adc r3, r3, #0\n\t"
  138108. #endif
  138109. "str r4, [%[r]], #4\n\t"
  138110. /* A[8] * B */
  138111. "ldr r8, [%[a]], #4\n\t"
  138112. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138113. "lsl r6, %[b], #16\n\t"
  138114. "lsl r7, r8, #16\n\t"
  138115. "lsr r6, r6, #16\n\t"
  138116. "lsr r7, r7, #16\n\t"
  138117. "mul r7, r6, r7\n\t"
  138118. "adds r5, r5, r7\n\t"
  138119. "adcs r3, r3, #0\n\t"
  138120. "mov r4, #0\n\t"
  138121. "adc r4, r4, #0\n\t"
  138122. "lsr r7, r8, #16\n\t"
  138123. "mul r6, r7, r6\n\t"
  138124. "lsr r7, r6, #16\n\t"
  138125. "lsl r6, r6, #16\n\t"
  138126. "adds r5, r5, r6\n\t"
  138127. "adcs r3, r3, r7\n\t"
  138128. "adc r4, r4, #0\n\t"
  138129. "lsr r6, %[b], #16\n\t"
  138130. "lsr r7, r8, #16\n\t"
  138131. "mul r7, r6, r7\n\t"
  138132. "adds r3, r3, r7\n\t"
  138133. "adc r4, r4, #0\n\t"
  138134. "lsl r7, r8, #16\n\t"
  138135. "lsr r7, r7, #16\n\t"
  138136. "mul r6, r7, r6\n\t"
  138137. "lsr r7, r6, #16\n\t"
  138138. "lsl r6, r6, #16\n\t"
  138139. "adds r5, r5, r6\n\t"
  138140. "adcs r3, r3, r7\n\t"
  138141. "adc r4, r4, #0\n\t"
  138142. #else
  138143. "umull r6, r7, %[b], r8\n\t"
  138144. "adds r5, r5, r6\n\t"
  138145. "adcs r3, r3, r7\n\t"
  138146. "mov r4, #0\n\t"
  138147. "adc r4, r4, #0\n\t"
  138148. #endif
  138149. "str r5, [%[r]], #4\n\t"
  138150. /* A[9] * B */
  138151. "ldr r8, [%[a]], #4\n\t"
  138152. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138153. "lsl r6, %[b], #16\n\t"
  138154. "lsl r7, r8, #16\n\t"
  138155. "lsr r6, r6, #16\n\t"
  138156. "lsr r7, r7, #16\n\t"
  138157. "mul r7, r6, r7\n\t"
  138158. "adds r3, r3, r7\n\t"
  138159. "adcs r4, r4, #0\n\t"
  138160. "mov r5, #0\n\t"
  138161. "adc r5, r5, #0\n\t"
  138162. "lsr r7, r8, #16\n\t"
  138163. "mul r6, r7, r6\n\t"
  138164. "lsr r7, r6, #16\n\t"
  138165. "lsl r6, r6, #16\n\t"
  138166. "adds r3, r3, r6\n\t"
  138167. "adcs r4, r4, r7\n\t"
  138168. "adc r5, r5, #0\n\t"
  138169. "lsr r6, %[b], #16\n\t"
  138170. "lsr r7, r8, #16\n\t"
  138171. "mul r7, r6, r7\n\t"
  138172. "adds r4, r4, r7\n\t"
  138173. "adc r5, r5, #0\n\t"
  138174. "lsl r7, r8, #16\n\t"
  138175. "lsr r7, r7, #16\n\t"
  138176. "mul r6, r7, r6\n\t"
  138177. "lsr r7, r6, #16\n\t"
  138178. "lsl r6, r6, #16\n\t"
  138179. "adds r3, r3, r6\n\t"
  138180. "adcs r4, r4, r7\n\t"
  138181. "adc r5, r5, #0\n\t"
  138182. #else
  138183. "umull r6, r7, %[b], r8\n\t"
  138184. "adds r3, r3, r6\n\t"
  138185. "adcs r4, r4, r7\n\t"
  138186. "mov r5, #0\n\t"
  138187. "adc r5, r5, #0\n\t"
  138188. #endif
  138189. "str r3, [%[r]], #4\n\t"
  138190. /* A[10] * B */
  138191. "ldr r8, [%[a]], #4\n\t"
  138192. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138193. "lsl r6, %[b], #16\n\t"
  138194. "lsl r7, r8, #16\n\t"
  138195. "lsr r6, r6, #16\n\t"
  138196. "lsr r7, r7, #16\n\t"
  138197. "mul r7, r6, r7\n\t"
  138198. "adds r4, r4, r7\n\t"
  138199. "adcs r5, r5, #0\n\t"
  138200. "mov r3, #0\n\t"
  138201. "adc r3, r3, #0\n\t"
  138202. "lsr r7, r8, #16\n\t"
  138203. "mul r6, r7, r6\n\t"
  138204. "lsr r7, r6, #16\n\t"
  138205. "lsl r6, r6, #16\n\t"
  138206. "adds r4, r4, r6\n\t"
  138207. "adcs r5, r5, r7\n\t"
  138208. "adc r3, r3, #0\n\t"
  138209. "lsr r6, %[b], #16\n\t"
  138210. "lsr r7, r8, #16\n\t"
  138211. "mul r7, r6, r7\n\t"
  138212. "adds r5, r5, r7\n\t"
  138213. "adc r3, r3, #0\n\t"
  138214. "lsl r7, r8, #16\n\t"
  138215. "lsr r7, r7, #16\n\t"
  138216. "mul r6, r7, r6\n\t"
  138217. "lsr r7, r6, #16\n\t"
  138218. "lsl r6, r6, #16\n\t"
  138219. "adds r4, r4, r6\n\t"
  138220. "adcs r5, r5, r7\n\t"
  138221. "adc r3, r3, #0\n\t"
  138222. #else
  138223. "umull r6, r7, %[b], r8\n\t"
  138224. "adds r4, r4, r6\n\t"
  138225. "adcs r5, r5, r7\n\t"
  138226. "mov r3, #0\n\t"
  138227. "adc r3, r3, #0\n\t"
  138228. #endif
  138229. "str r4, [%[r]], #4\n\t"
  138230. /* A[11] * B */
  138231. "ldr r8, [%[a]], #4\n\t"
  138232. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138233. "lsl r6, %[b], #16\n\t"
  138234. "lsl r7, r8, #16\n\t"
  138235. "lsr r6, r6, #16\n\t"
  138236. "lsr r7, r7, #16\n\t"
  138237. "mul r7, r6, r7\n\t"
  138238. "adds r5, r5, r7\n\t"
  138239. "adcs r3, r3, #0\n\t"
  138240. "mov r4, #0\n\t"
  138241. "adc r4, r4, #0\n\t"
  138242. "lsr r7, r8, #16\n\t"
  138243. "mul r6, r7, r6\n\t"
  138244. "lsr r7, r6, #16\n\t"
  138245. "lsl r6, r6, #16\n\t"
  138246. "adds r5, r5, r6\n\t"
  138247. "adcs r3, r3, r7\n\t"
  138248. "adc r4, r4, #0\n\t"
  138249. "lsr r6, %[b], #16\n\t"
  138250. "lsr r7, r8, #16\n\t"
  138251. "mul r7, r6, r7\n\t"
  138252. "adds r3, r3, r7\n\t"
  138253. "adc r4, r4, #0\n\t"
  138254. "lsl r7, r8, #16\n\t"
  138255. "lsr r7, r7, #16\n\t"
  138256. "mul r6, r7, r6\n\t"
  138257. "lsr r7, r6, #16\n\t"
  138258. "lsl r6, r6, #16\n\t"
  138259. "adds r5, r5, r6\n\t"
  138260. "adcs r3, r3, r7\n\t"
  138261. "adc r4, r4, #0\n\t"
  138262. #else
  138263. "umull r6, r7, %[b], r8\n\t"
  138264. "adds r5, r5, r6\n\t"
  138265. "adcs r3, r3, r7\n\t"
  138266. "mov r4, #0\n\t"
  138267. "adc r4, r4, #0\n\t"
  138268. #endif
  138269. "str r5, [%[r]], #4\n\t"
  138270. /* A[12] * B */
  138271. "ldr r8, [%[a]], #4\n\t"
  138272. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138273. "lsl r6, %[b], #16\n\t"
  138274. "lsl r7, r8, #16\n\t"
  138275. "lsr r6, r6, #16\n\t"
  138276. "lsr r7, r7, #16\n\t"
  138277. "mul r7, r6, r7\n\t"
  138278. "adds r3, r3, r7\n\t"
  138279. "adcs r4, r4, #0\n\t"
  138280. "mov r5, #0\n\t"
  138281. "adc r5, r5, #0\n\t"
  138282. "lsr r7, r8, #16\n\t"
  138283. "mul r6, r7, r6\n\t"
  138284. "lsr r7, r6, #16\n\t"
  138285. "lsl r6, r6, #16\n\t"
  138286. "adds r3, r3, r6\n\t"
  138287. "adcs r4, r4, r7\n\t"
  138288. "adc r5, r5, #0\n\t"
  138289. "lsr r6, %[b], #16\n\t"
  138290. "lsr r7, r8, #16\n\t"
  138291. "mul r7, r6, r7\n\t"
  138292. "adds r4, r4, r7\n\t"
  138293. "adc r5, r5, #0\n\t"
  138294. "lsl r7, r8, #16\n\t"
  138295. "lsr r7, r7, #16\n\t"
  138296. "mul r6, r7, r6\n\t"
  138297. "lsr r7, r6, #16\n\t"
  138298. "lsl r6, r6, #16\n\t"
  138299. "adds r3, r3, r6\n\t"
  138300. "adcs r4, r4, r7\n\t"
  138301. "adc r5, r5, #0\n\t"
  138302. #else
  138303. "umull r6, r7, %[b], r8\n\t"
  138304. "adds r3, r3, r6\n\t"
  138305. "adcs r4, r4, r7\n\t"
  138306. "mov r5, #0\n\t"
  138307. "adc r5, r5, #0\n\t"
  138308. #endif
  138309. "str r3, [%[r]], #4\n\t"
  138310. /* A[13] * B */
  138311. "ldr r8, [%[a]], #4\n\t"
  138312. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138313. "lsl r6, %[b], #16\n\t"
  138314. "lsl r7, r8, #16\n\t"
  138315. "lsr r6, r6, #16\n\t"
  138316. "lsr r7, r7, #16\n\t"
  138317. "mul r7, r6, r7\n\t"
  138318. "adds r4, r4, r7\n\t"
  138319. "adcs r5, r5, #0\n\t"
  138320. "mov r3, #0\n\t"
  138321. "adc r3, r3, #0\n\t"
  138322. "lsr r7, r8, #16\n\t"
  138323. "mul r6, r7, r6\n\t"
  138324. "lsr r7, r6, #16\n\t"
  138325. "lsl r6, r6, #16\n\t"
  138326. "adds r4, r4, r6\n\t"
  138327. "adcs r5, r5, r7\n\t"
  138328. "adc r3, r3, #0\n\t"
  138329. "lsr r6, %[b], #16\n\t"
  138330. "lsr r7, r8, #16\n\t"
  138331. "mul r7, r6, r7\n\t"
  138332. "adds r5, r5, r7\n\t"
  138333. "adc r3, r3, #0\n\t"
  138334. "lsl r7, r8, #16\n\t"
  138335. "lsr r7, r7, #16\n\t"
  138336. "mul r6, r7, r6\n\t"
  138337. "lsr r7, r6, #16\n\t"
  138338. "lsl r6, r6, #16\n\t"
  138339. "adds r4, r4, r6\n\t"
  138340. "adcs r5, r5, r7\n\t"
  138341. "adc r3, r3, #0\n\t"
  138342. #else
  138343. "umull r6, r7, %[b], r8\n\t"
  138344. "adds r4, r4, r6\n\t"
  138345. "adcs r5, r5, r7\n\t"
  138346. "mov r3, #0\n\t"
  138347. "adc r3, r3, #0\n\t"
  138348. #endif
  138349. "str r4, [%[r]], #4\n\t"
  138350. /* A[14] * B */
  138351. "ldr r8, [%[a]], #4\n\t"
  138352. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138353. "lsl r6, %[b], #16\n\t"
  138354. "lsl r7, r8, #16\n\t"
  138355. "lsr r6, r6, #16\n\t"
  138356. "lsr r7, r7, #16\n\t"
  138357. "mul r7, r6, r7\n\t"
  138358. "adds r5, r5, r7\n\t"
  138359. "adcs r3, r3, #0\n\t"
  138360. "mov r4, #0\n\t"
  138361. "adc r4, r4, #0\n\t"
  138362. "lsr r7, r8, #16\n\t"
  138363. "mul r6, r7, r6\n\t"
  138364. "lsr r7, r6, #16\n\t"
  138365. "lsl r6, r6, #16\n\t"
  138366. "adds r5, r5, r6\n\t"
  138367. "adcs r3, r3, r7\n\t"
  138368. "adc r4, r4, #0\n\t"
  138369. "lsr r6, %[b], #16\n\t"
  138370. "lsr r7, r8, #16\n\t"
  138371. "mul r7, r6, r7\n\t"
  138372. "adds r3, r3, r7\n\t"
  138373. "adc r4, r4, #0\n\t"
  138374. "lsl r7, r8, #16\n\t"
  138375. "lsr r7, r7, #16\n\t"
  138376. "mul r6, r7, r6\n\t"
  138377. "lsr r7, r6, #16\n\t"
  138378. "lsl r6, r6, #16\n\t"
  138379. "adds r5, r5, r6\n\t"
  138380. "adcs r3, r3, r7\n\t"
  138381. "adc r4, r4, #0\n\t"
  138382. #else
  138383. "umull r6, r7, %[b], r8\n\t"
  138384. "adds r5, r5, r6\n\t"
  138385. "adcs r3, r3, r7\n\t"
  138386. "mov r4, #0\n\t"
  138387. "adc r4, r4, #0\n\t"
  138388. #endif
  138389. "str r5, [%[r]], #4\n\t"
  138390. /* A[15] * B */
  138391. "ldr r8, [%[a]], #4\n\t"
  138392. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138393. "lsl r6, %[b], #16\n\t"
  138394. "lsl r7, r8, #16\n\t"
  138395. "lsr r6, r6, #16\n\t"
  138396. "lsr r7, r7, #16\n\t"
  138397. "mul r7, r6, r7\n\t"
  138398. "adds r3, r3, r7\n\t"
  138399. "adcs r4, r4, #0\n\t"
  138400. "mov r5, #0\n\t"
  138401. "adc r5, r5, #0\n\t"
  138402. "lsr r7, r8, #16\n\t"
  138403. "mul r6, r7, r6\n\t"
  138404. "lsr r7, r6, #16\n\t"
  138405. "lsl r6, r6, #16\n\t"
  138406. "adds r3, r3, r6\n\t"
  138407. "adcs r4, r4, r7\n\t"
  138408. "adc r5, r5, #0\n\t"
  138409. "lsr r6, %[b], #16\n\t"
  138410. "lsr r7, r8, #16\n\t"
  138411. "mul r7, r6, r7\n\t"
  138412. "adds r4, r4, r7\n\t"
  138413. "adc r5, r5, #0\n\t"
  138414. "lsl r7, r8, #16\n\t"
  138415. "lsr r7, r7, #16\n\t"
  138416. "mul r6, r7, r6\n\t"
  138417. "lsr r7, r6, #16\n\t"
  138418. "lsl r6, r6, #16\n\t"
  138419. "adds r3, r3, r6\n\t"
  138420. "adcs r4, r4, r7\n\t"
  138421. "adc r5, r5, #0\n\t"
  138422. #else
  138423. "umull r6, r7, %[b], r8\n\t"
  138424. "adds r3, r3, r6\n\t"
  138425. "adcs r4, r4, r7\n\t"
  138426. "mov r5, #0\n\t"
  138427. "adc r5, r5, #0\n\t"
  138428. #endif
  138429. "str r3, [%[r]], #4\n\t"
  138430. /* A[16] * B */
  138431. "ldr r8, [%[a]], #4\n\t"
  138432. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138433. "lsl r6, %[b], #16\n\t"
  138434. "lsl r7, r8, #16\n\t"
  138435. "lsr r6, r6, #16\n\t"
  138436. "lsr r7, r7, #16\n\t"
  138437. "mul r7, r6, r7\n\t"
  138438. "adds r4, r4, r7\n\t"
  138439. "adcs r5, r5, #0\n\t"
  138440. "mov r3, #0\n\t"
  138441. "adc r3, r3, #0\n\t"
  138442. "lsr r7, r8, #16\n\t"
  138443. "mul r6, r7, r6\n\t"
  138444. "lsr r7, r6, #16\n\t"
  138445. "lsl r6, r6, #16\n\t"
  138446. "adds r4, r4, r6\n\t"
  138447. "adcs r5, r5, r7\n\t"
  138448. "adc r3, r3, #0\n\t"
  138449. "lsr r6, %[b], #16\n\t"
  138450. "lsr r7, r8, #16\n\t"
  138451. "mul r7, r6, r7\n\t"
  138452. "adds r5, r5, r7\n\t"
  138453. "adc r3, r3, #0\n\t"
  138454. "lsl r7, r8, #16\n\t"
  138455. "lsr r7, r7, #16\n\t"
  138456. "mul r6, r7, r6\n\t"
  138457. "lsr r7, r6, #16\n\t"
  138458. "lsl r6, r6, #16\n\t"
  138459. "adds r4, r4, r6\n\t"
  138460. "adcs r5, r5, r7\n\t"
  138461. "adc r3, r3, #0\n\t"
  138462. #else
  138463. "umull r6, r7, %[b], r8\n\t"
  138464. "adds r4, r4, r6\n\t"
  138465. "adcs r5, r5, r7\n\t"
  138466. "mov r3, #0\n\t"
  138467. "adc r3, r3, #0\n\t"
  138468. #endif
  138469. "str r4, [%[r]], #4\n\t"
  138470. /* A[17] * B */
  138471. "ldr r8, [%[a]], #4\n\t"
  138472. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138473. "lsl r6, %[b], #16\n\t"
  138474. "lsl r7, r8, #16\n\t"
  138475. "lsr r6, r6, #16\n\t"
  138476. "lsr r7, r7, #16\n\t"
  138477. "mul r7, r6, r7\n\t"
  138478. "adds r5, r5, r7\n\t"
  138479. "adcs r3, r3, #0\n\t"
  138480. "mov r4, #0\n\t"
  138481. "adc r4, r4, #0\n\t"
  138482. "lsr r7, r8, #16\n\t"
  138483. "mul r6, r7, r6\n\t"
  138484. "lsr r7, r6, #16\n\t"
  138485. "lsl r6, r6, #16\n\t"
  138486. "adds r5, r5, r6\n\t"
  138487. "adcs r3, r3, r7\n\t"
  138488. "adc r4, r4, #0\n\t"
  138489. "lsr r6, %[b], #16\n\t"
  138490. "lsr r7, r8, #16\n\t"
  138491. "mul r7, r6, r7\n\t"
  138492. "adds r3, r3, r7\n\t"
  138493. "adc r4, r4, #0\n\t"
  138494. "lsl r7, r8, #16\n\t"
  138495. "lsr r7, r7, #16\n\t"
  138496. "mul r6, r7, r6\n\t"
  138497. "lsr r7, r6, #16\n\t"
  138498. "lsl r6, r6, #16\n\t"
  138499. "adds r5, r5, r6\n\t"
  138500. "adcs r3, r3, r7\n\t"
  138501. "adc r4, r4, #0\n\t"
  138502. #else
  138503. "umull r6, r7, %[b], r8\n\t"
  138504. "adds r5, r5, r6\n\t"
  138505. "adcs r3, r3, r7\n\t"
  138506. "mov r4, #0\n\t"
  138507. "adc r4, r4, #0\n\t"
  138508. #endif
  138509. "str r5, [%[r]], #4\n\t"
  138510. /* A[18] * B */
  138511. "ldr r8, [%[a]], #4\n\t"
  138512. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138513. "lsl r6, %[b], #16\n\t"
  138514. "lsl r7, r8, #16\n\t"
  138515. "lsr r6, r6, #16\n\t"
  138516. "lsr r7, r7, #16\n\t"
  138517. "mul r7, r6, r7\n\t"
  138518. "adds r3, r3, r7\n\t"
  138519. "adcs r4, r4, #0\n\t"
  138520. "mov r5, #0\n\t"
  138521. "adc r5, r5, #0\n\t"
  138522. "lsr r7, r8, #16\n\t"
  138523. "mul r6, r7, r6\n\t"
  138524. "lsr r7, r6, #16\n\t"
  138525. "lsl r6, r6, #16\n\t"
  138526. "adds r3, r3, r6\n\t"
  138527. "adcs r4, r4, r7\n\t"
  138528. "adc r5, r5, #0\n\t"
  138529. "lsr r6, %[b], #16\n\t"
  138530. "lsr r7, r8, #16\n\t"
  138531. "mul r7, r6, r7\n\t"
  138532. "adds r4, r4, r7\n\t"
  138533. "adc r5, r5, #0\n\t"
  138534. "lsl r7, r8, #16\n\t"
  138535. "lsr r7, r7, #16\n\t"
  138536. "mul r6, r7, r6\n\t"
  138537. "lsr r7, r6, #16\n\t"
  138538. "lsl r6, r6, #16\n\t"
  138539. "adds r3, r3, r6\n\t"
  138540. "adcs r4, r4, r7\n\t"
  138541. "adc r5, r5, #0\n\t"
  138542. #else
  138543. "umull r6, r7, %[b], r8\n\t"
  138544. "adds r3, r3, r6\n\t"
  138545. "adcs r4, r4, r7\n\t"
  138546. "mov r5, #0\n\t"
  138547. "adc r5, r5, #0\n\t"
  138548. #endif
  138549. "str r3, [%[r]], #4\n\t"
  138550. /* A[19] * B */
  138551. "ldr r8, [%[a]], #4\n\t"
  138552. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138553. "lsl r6, %[b], #16\n\t"
  138554. "lsl r7, r8, #16\n\t"
  138555. "lsr r6, r6, #16\n\t"
  138556. "lsr r7, r7, #16\n\t"
  138557. "mul r7, r6, r7\n\t"
  138558. "adds r4, r4, r7\n\t"
  138559. "adcs r5, r5, #0\n\t"
  138560. "mov r3, #0\n\t"
  138561. "adc r3, r3, #0\n\t"
  138562. "lsr r7, r8, #16\n\t"
  138563. "mul r6, r7, r6\n\t"
  138564. "lsr r7, r6, #16\n\t"
  138565. "lsl r6, r6, #16\n\t"
  138566. "adds r4, r4, r6\n\t"
  138567. "adcs r5, r5, r7\n\t"
  138568. "adc r3, r3, #0\n\t"
  138569. "lsr r6, %[b], #16\n\t"
  138570. "lsr r7, r8, #16\n\t"
  138571. "mul r7, r6, r7\n\t"
  138572. "adds r5, r5, r7\n\t"
  138573. "adc r3, r3, #0\n\t"
  138574. "lsl r7, r8, #16\n\t"
  138575. "lsr r7, r7, #16\n\t"
  138576. "mul r6, r7, r6\n\t"
  138577. "lsr r7, r6, #16\n\t"
  138578. "lsl r6, r6, #16\n\t"
  138579. "adds r4, r4, r6\n\t"
  138580. "adcs r5, r5, r7\n\t"
  138581. "adc r3, r3, #0\n\t"
  138582. #else
  138583. "umull r6, r7, %[b], r8\n\t"
  138584. "adds r4, r4, r6\n\t"
  138585. "adcs r5, r5, r7\n\t"
  138586. "mov r3, #0\n\t"
  138587. "adc r3, r3, #0\n\t"
  138588. #endif
  138589. "str r4, [%[r]], #4\n\t"
  138590. /* A[20] * B */
  138591. "ldr r8, [%[a]], #4\n\t"
  138592. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138593. "lsl r6, %[b], #16\n\t"
  138594. "lsl r7, r8, #16\n\t"
  138595. "lsr r6, r6, #16\n\t"
  138596. "lsr r7, r7, #16\n\t"
  138597. "mul r7, r6, r7\n\t"
  138598. "adds r5, r5, r7\n\t"
  138599. "adcs r3, r3, #0\n\t"
  138600. "mov r4, #0\n\t"
  138601. "adc r4, r4, #0\n\t"
  138602. "lsr r7, r8, #16\n\t"
  138603. "mul r6, r7, r6\n\t"
  138604. "lsr r7, r6, #16\n\t"
  138605. "lsl r6, r6, #16\n\t"
  138606. "adds r5, r5, r6\n\t"
  138607. "adcs r3, r3, r7\n\t"
  138608. "adc r4, r4, #0\n\t"
  138609. "lsr r6, %[b], #16\n\t"
  138610. "lsr r7, r8, #16\n\t"
  138611. "mul r7, r6, r7\n\t"
  138612. "adds r3, r3, r7\n\t"
  138613. "adc r4, r4, #0\n\t"
  138614. "lsl r7, r8, #16\n\t"
  138615. "lsr r7, r7, #16\n\t"
  138616. "mul r6, r7, r6\n\t"
  138617. "lsr r7, r6, #16\n\t"
  138618. "lsl r6, r6, #16\n\t"
  138619. "adds r5, r5, r6\n\t"
  138620. "adcs r3, r3, r7\n\t"
  138621. "adc r4, r4, #0\n\t"
  138622. #else
  138623. "umull r6, r7, %[b], r8\n\t"
  138624. "adds r5, r5, r6\n\t"
  138625. "adcs r3, r3, r7\n\t"
  138626. "mov r4, #0\n\t"
  138627. "adc r4, r4, #0\n\t"
  138628. #endif
  138629. "str r5, [%[r]], #4\n\t"
  138630. /* A[21] * B */
  138631. "ldr r8, [%[a]], #4\n\t"
  138632. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138633. "lsl r6, %[b], #16\n\t"
  138634. "lsl r7, r8, #16\n\t"
  138635. "lsr r6, r6, #16\n\t"
  138636. "lsr r7, r7, #16\n\t"
  138637. "mul r7, r6, r7\n\t"
  138638. "adds r3, r3, r7\n\t"
  138639. "adcs r4, r4, #0\n\t"
  138640. "mov r5, #0\n\t"
  138641. "adc r5, r5, #0\n\t"
  138642. "lsr r7, r8, #16\n\t"
  138643. "mul r6, r7, r6\n\t"
  138644. "lsr r7, r6, #16\n\t"
  138645. "lsl r6, r6, #16\n\t"
  138646. "adds r3, r3, r6\n\t"
  138647. "adcs r4, r4, r7\n\t"
  138648. "adc r5, r5, #0\n\t"
  138649. "lsr r6, %[b], #16\n\t"
  138650. "lsr r7, r8, #16\n\t"
  138651. "mul r7, r6, r7\n\t"
  138652. "adds r4, r4, r7\n\t"
  138653. "adc r5, r5, #0\n\t"
  138654. "lsl r7, r8, #16\n\t"
  138655. "lsr r7, r7, #16\n\t"
  138656. "mul r6, r7, r6\n\t"
  138657. "lsr r7, r6, #16\n\t"
  138658. "lsl r6, r6, #16\n\t"
  138659. "adds r3, r3, r6\n\t"
  138660. "adcs r4, r4, r7\n\t"
  138661. "adc r5, r5, #0\n\t"
  138662. #else
  138663. "umull r6, r7, %[b], r8\n\t"
  138664. "adds r3, r3, r6\n\t"
  138665. "adcs r4, r4, r7\n\t"
  138666. "mov r5, #0\n\t"
  138667. "adc r5, r5, #0\n\t"
  138668. #endif
  138669. "str r3, [%[r]], #4\n\t"
  138670. /* A[22] * B */
  138671. "ldr r8, [%[a]], #4\n\t"
  138672. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138673. "lsl r6, %[b], #16\n\t"
  138674. "lsl r7, r8, #16\n\t"
  138675. "lsr r6, r6, #16\n\t"
  138676. "lsr r7, r7, #16\n\t"
  138677. "mul r7, r6, r7\n\t"
  138678. "adds r4, r4, r7\n\t"
  138679. "adcs r5, r5, #0\n\t"
  138680. "mov r3, #0\n\t"
  138681. "adc r3, r3, #0\n\t"
  138682. "lsr r7, r8, #16\n\t"
  138683. "mul r6, r7, r6\n\t"
  138684. "lsr r7, r6, #16\n\t"
  138685. "lsl r6, r6, #16\n\t"
  138686. "adds r4, r4, r6\n\t"
  138687. "adcs r5, r5, r7\n\t"
  138688. "adc r3, r3, #0\n\t"
  138689. "lsr r6, %[b], #16\n\t"
  138690. "lsr r7, r8, #16\n\t"
  138691. "mul r7, r6, r7\n\t"
  138692. "adds r5, r5, r7\n\t"
  138693. "adc r3, r3, #0\n\t"
  138694. "lsl r7, r8, #16\n\t"
  138695. "lsr r7, r7, #16\n\t"
  138696. "mul r6, r7, r6\n\t"
  138697. "lsr r7, r6, #16\n\t"
  138698. "lsl r6, r6, #16\n\t"
  138699. "adds r4, r4, r6\n\t"
  138700. "adcs r5, r5, r7\n\t"
  138701. "adc r3, r3, #0\n\t"
  138702. #else
  138703. "umull r6, r7, %[b], r8\n\t"
  138704. "adds r4, r4, r6\n\t"
  138705. "adcs r5, r5, r7\n\t"
  138706. "mov r3, #0\n\t"
  138707. "adc r3, r3, #0\n\t"
  138708. #endif
  138709. "str r4, [%[r]], #4\n\t"
  138710. /* A[23] * B */
  138711. "ldr r8, [%[a]], #4\n\t"
  138712. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138713. "lsl r6, %[b], #16\n\t"
  138714. "lsl r7, r8, #16\n\t"
  138715. "lsr r6, r6, #16\n\t"
  138716. "lsr r7, r7, #16\n\t"
  138717. "mul r7, r6, r7\n\t"
  138718. "adds r5, r5, r7\n\t"
  138719. "adcs r3, r3, #0\n\t"
  138720. "mov r4, #0\n\t"
  138721. "adc r4, r4, #0\n\t"
  138722. "lsr r7, r8, #16\n\t"
  138723. "mul r6, r7, r6\n\t"
  138724. "lsr r7, r6, #16\n\t"
  138725. "lsl r6, r6, #16\n\t"
  138726. "adds r5, r5, r6\n\t"
  138727. "adcs r3, r3, r7\n\t"
  138728. "adc r4, r4, #0\n\t"
  138729. "lsr r6, %[b], #16\n\t"
  138730. "lsr r7, r8, #16\n\t"
  138731. "mul r7, r6, r7\n\t"
  138732. "adds r3, r3, r7\n\t"
  138733. "adc r4, r4, #0\n\t"
  138734. "lsl r7, r8, #16\n\t"
  138735. "lsr r7, r7, #16\n\t"
  138736. "mul r6, r7, r6\n\t"
  138737. "lsr r7, r6, #16\n\t"
  138738. "lsl r6, r6, #16\n\t"
  138739. "adds r5, r5, r6\n\t"
  138740. "adcs r3, r3, r7\n\t"
  138741. "adc r4, r4, #0\n\t"
  138742. #else
  138743. "umull r6, r7, %[b], r8\n\t"
  138744. "adds r5, r5, r6\n\t"
  138745. "adcs r3, r3, r7\n\t"
  138746. "mov r4, #0\n\t"
  138747. "adc r4, r4, #0\n\t"
  138748. #endif
  138749. "str r5, [%[r]], #4\n\t"
  138750. /* A[24] * B */
  138751. "ldr r8, [%[a]], #4\n\t"
  138752. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138753. "lsl r6, %[b], #16\n\t"
  138754. "lsl r7, r8, #16\n\t"
  138755. "lsr r6, r6, #16\n\t"
  138756. "lsr r7, r7, #16\n\t"
  138757. "mul r7, r6, r7\n\t"
  138758. "adds r3, r3, r7\n\t"
  138759. "adcs r4, r4, #0\n\t"
  138760. "mov r5, #0\n\t"
  138761. "adc r5, r5, #0\n\t"
  138762. "lsr r7, r8, #16\n\t"
  138763. "mul r6, r7, r6\n\t"
  138764. "lsr r7, r6, #16\n\t"
  138765. "lsl r6, r6, #16\n\t"
  138766. "adds r3, r3, r6\n\t"
  138767. "adcs r4, r4, r7\n\t"
  138768. "adc r5, r5, #0\n\t"
  138769. "lsr r6, %[b], #16\n\t"
  138770. "lsr r7, r8, #16\n\t"
  138771. "mul r7, r6, r7\n\t"
  138772. "adds r4, r4, r7\n\t"
  138773. "adc r5, r5, #0\n\t"
  138774. "lsl r7, r8, #16\n\t"
  138775. "lsr r7, r7, #16\n\t"
  138776. "mul r6, r7, r6\n\t"
  138777. "lsr r7, r6, #16\n\t"
  138778. "lsl r6, r6, #16\n\t"
  138779. "adds r3, r3, r6\n\t"
  138780. "adcs r4, r4, r7\n\t"
  138781. "adc r5, r5, #0\n\t"
  138782. #else
  138783. "umull r6, r7, %[b], r8\n\t"
  138784. "adds r3, r3, r6\n\t"
  138785. "adcs r4, r4, r7\n\t"
  138786. "mov r5, #0\n\t"
  138787. "adc r5, r5, #0\n\t"
  138788. #endif
  138789. "str r3, [%[r]], #4\n\t"
  138790. /* A[25] * B */
  138791. "ldr r8, [%[a]], #4\n\t"
  138792. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138793. "lsl r6, %[b], #16\n\t"
  138794. "lsl r7, r8, #16\n\t"
  138795. "lsr r6, r6, #16\n\t"
  138796. "lsr r7, r7, #16\n\t"
  138797. "mul r7, r6, r7\n\t"
  138798. "adds r4, r4, r7\n\t"
  138799. "adcs r5, r5, #0\n\t"
  138800. "mov r3, #0\n\t"
  138801. "adc r3, r3, #0\n\t"
  138802. "lsr r7, r8, #16\n\t"
  138803. "mul r6, r7, r6\n\t"
  138804. "lsr r7, r6, #16\n\t"
  138805. "lsl r6, r6, #16\n\t"
  138806. "adds r4, r4, r6\n\t"
  138807. "adcs r5, r5, r7\n\t"
  138808. "adc r3, r3, #0\n\t"
  138809. "lsr r6, %[b], #16\n\t"
  138810. "lsr r7, r8, #16\n\t"
  138811. "mul r7, r6, r7\n\t"
  138812. "adds r5, r5, r7\n\t"
  138813. "adc r3, r3, #0\n\t"
  138814. "lsl r7, r8, #16\n\t"
  138815. "lsr r7, r7, #16\n\t"
  138816. "mul r6, r7, r6\n\t"
  138817. "lsr r7, r6, #16\n\t"
  138818. "lsl r6, r6, #16\n\t"
  138819. "adds r4, r4, r6\n\t"
  138820. "adcs r5, r5, r7\n\t"
  138821. "adc r3, r3, #0\n\t"
  138822. #else
  138823. "umull r6, r7, %[b], r8\n\t"
  138824. "adds r4, r4, r6\n\t"
  138825. "adcs r5, r5, r7\n\t"
  138826. "mov r3, #0\n\t"
  138827. "adc r3, r3, #0\n\t"
  138828. #endif
  138829. "str r4, [%[r]], #4\n\t"
  138830. /* A[26] * B */
  138831. "ldr r8, [%[a]], #4\n\t"
  138832. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138833. "lsl r6, %[b], #16\n\t"
  138834. "lsl r7, r8, #16\n\t"
  138835. "lsr r6, r6, #16\n\t"
  138836. "lsr r7, r7, #16\n\t"
  138837. "mul r7, r6, r7\n\t"
  138838. "adds r5, r5, r7\n\t"
  138839. "adcs r3, r3, #0\n\t"
  138840. "mov r4, #0\n\t"
  138841. "adc r4, r4, #0\n\t"
  138842. "lsr r7, r8, #16\n\t"
  138843. "mul r6, r7, r6\n\t"
  138844. "lsr r7, r6, #16\n\t"
  138845. "lsl r6, r6, #16\n\t"
  138846. "adds r5, r5, r6\n\t"
  138847. "adcs r3, r3, r7\n\t"
  138848. "adc r4, r4, #0\n\t"
  138849. "lsr r6, %[b], #16\n\t"
  138850. "lsr r7, r8, #16\n\t"
  138851. "mul r7, r6, r7\n\t"
  138852. "adds r3, r3, r7\n\t"
  138853. "adc r4, r4, #0\n\t"
  138854. "lsl r7, r8, #16\n\t"
  138855. "lsr r7, r7, #16\n\t"
  138856. "mul r6, r7, r6\n\t"
  138857. "lsr r7, r6, #16\n\t"
  138858. "lsl r6, r6, #16\n\t"
  138859. "adds r5, r5, r6\n\t"
  138860. "adcs r3, r3, r7\n\t"
  138861. "adc r4, r4, #0\n\t"
  138862. #else
  138863. "umull r6, r7, %[b], r8\n\t"
  138864. "adds r5, r5, r6\n\t"
  138865. "adcs r3, r3, r7\n\t"
  138866. "mov r4, #0\n\t"
  138867. "adc r4, r4, #0\n\t"
  138868. #endif
  138869. "str r5, [%[r]], #4\n\t"
  138870. /* A[27] * B */
  138871. "ldr r8, [%[a]], #4\n\t"
  138872. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138873. "lsl r6, %[b], #16\n\t"
  138874. "lsl r7, r8, #16\n\t"
  138875. "lsr r6, r6, #16\n\t"
  138876. "lsr r7, r7, #16\n\t"
  138877. "mul r7, r6, r7\n\t"
  138878. "adds r3, r3, r7\n\t"
  138879. "adcs r4, r4, #0\n\t"
  138880. "mov r5, #0\n\t"
  138881. "adc r5, r5, #0\n\t"
  138882. "lsr r7, r8, #16\n\t"
  138883. "mul r6, r7, r6\n\t"
  138884. "lsr r7, r6, #16\n\t"
  138885. "lsl r6, r6, #16\n\t"
  138886. "adds r3, r3, r6\n\t"
  138887. "adcs r4, r4, r7\n\t"
  138888. "adc r5, r5, #0\n\t"
  138889. "lsr r6, %[b], #16\n\t"
  138890. "lsr r7, r8, #16\n\t"
  138891. "mul r7, r6, r7\n\t"
  138892. "adds r4, r4, r7\n\t"
  138893. "adc r5, r5, #0\n\t"
  138894. "lsl r7, r8, #16\n\t"
  138895. "lsr r7, r7, #16\n\t"
  138896. "mul r6, r7, r6\n\t"
  138897. "lsr r7, r6, #16\n\t"
  138898. "lsl r6, r6, #16\n\t"
  138899. "adds r3, r3, r6\n\t"
  138900. "adcs r4, r4, r7\n\t"
  138901. "adc r5, r5, #0\n\t"
  138902. #else
  138903. "umull r6, r7, %[b], r8\n\t"
  138904. "adds r3, r3, r6\n\t"
  138905. "adcs r4, r4, r7\n\t"
  138906. "mov r5, #0\n\t"
  138907. "adc r5, r5, #0\n\t"
  138908. #endif
  138909. "str r3, [%[r]], #4\n\t"
  138910. /* A[28] * B */
  138911. "ldr r8, [%[a]], #4\n\t"
  138912. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138913. "lsl r6, %[b], #16\n\t"
  138914. "lsl r7, r8, #16\n\t"
  138915. "lsr r6, r6, #16\n\t"
  138916. "lsr r7, r7, #16\n\t"
  138917. "mul r7, r6, r7\n\t"
  138918. "adds r4, r4, r7\n\t"
  138919. "adcs r5, r5, #0\n\t"
  138920. "mov r3, #0\n\t"
  138921. "adc r3, r3, #0\n\t"
  138922. "lsr r7, r8, #16\n\t"
  138923. "mul r6, r7, r6\n\t"
  138924. "lsr r7, r6, #16\n\t"
  138925. "lsl r6, r6, #16\n\t"
  138926. "adds r4, r4, r6\n\t"
  138927. "adcs r5, r5, r7\n\t"
  138928. "adc r3, r3, #0\n\t"
  138929. "lsr r6, %[b], #16\n\t"
  138930. "lsr r7, r8, #16\n\t"
  138931. "mul r7, r6, r7\n\t"
  138932. "adds r5, r5, r7\n\t"
  138933. "adc r3, r3, #0\n\t"
  138934. "lsl r7, r8, #16\n\t"
  138935. "lsr r7, r7, #16\n\t"
  138936. "mul r6, r7, r6\n\t"
  138937. "lsr r7, r6, #16\n\t"
  138938. "lsl r6, r6, #16\n\t"
  138939. "adds r4, r4, r6\n\t"
  138940. "adcs r5, r5, r7\n\t"
  138941. "adc r3, r3, #0\n\t"
  138942. #else
  138943. "umull r6, r7, %[b], r8\n\t"
  138944. "adds r4, r4, r6\n\t"
  138945. "adcs r5, r5, r7\n\t"
  138946. "mov r3, #0\n\t"
  138947. "adc r3, r3, #0\n\t"
  138948. #endif
  138949. "str r4, [%[r]], #4\n\t"
  138950. /* A[29] * B */
  138951. "ldr r8, [%[a]], #4\n\t"
  138952. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138953. "lsl r6, %[b], #16\n\t"
  138954. "lsl r7, r8, #16\n\t"
  138955. "lsr r6, r6, #16\n\t"
  138956. "lsr r7, r7, #16\n\t"
  138957. "mul r7, r6, r7\n\t"
  138958. "adds r5, r5, r7\n\t"
  138959. "adcs r3, r3, #0\n\t"
  138960. "mov r4, #0\n\t"
  138961. "adc r4, r4, #0\n\t"
  138962. "lsr r7, r8, #16\n\t"
  138963. "mul r6, r7, r6\n\t"
  138964. "lsr r7, r6, #16\n\t"
  138965. "lsl r6, r6, #16\n\t"
  138966. "adds r5, r5, r6\n\t"
  138967. "adcs r3, r3, r7\n\t"
  138968. "adc r4, r4, #0\n\t"
  138969. "lsr r6, %[b], #16\n\t"
  138970. "lsr r7, r8, #16\n\t"
  138971. "mul r7, r6, r7\n\t"
  138972. "adds r3, r3, r7\n\t"
  138973. "adc r4, r4, #0\n\t"
  138974. "lsl r7, r8, #16\n\t"
  138975. "lsr r7, r7, #16\n\t"
  138976. "mul r6, r7, r6\n\t"
  138977. "lsr r7, r6, #16\n\t"
  138978. "lsl r6, r6, #16\n\t"
  138979. "adds r5, r5, r6\n\t"
  138980. "adcs r3, r3, r7\n\t"
  138981. "adc r4, r4, #0\n\t"
  138982. #else
  138983. "umull r6, r7, %[b], r8\n\t"
  138984. "adds r5, r5, r6\n\t"
  138985. "adcs r3, r3, r7\n\t"
  138986. "mov r4, #0\n\t"
  138987. "adc r4, r4, #0\n\t"
  138988. #endif
  138989. "str r5, [%[r]], #4\n\t"
  138990. /* A[30] * B */
  138991. "ldr r8, [%[a]], #4\n\t"
  138992. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  138993. "lsl r6, %[b], #16\n\t"
  138994. "lsl r7, r8, #16\n\t"
  138995. "lsr r6, r6, #16\n\t"
  138996. "lsr r7, r7, #16\n\t"
  138997. "mul r7, r6, r7\n\t"
  138998. "adds r3, r3, r7\n\t"
  138999. "adcs r4, r4, #0\n\t"
  139000. "mov r5, #0\n\t"
  139001. "adc r5, r5, #0\n\t"
  139002. "lsr r7, r8, #16\n\t"
  139003. "mul r6, r7, r6\n\t"
  139004. "lsr r7, r6, #16\n\t"
  139005. "lsl r6, r6, #16\n\t"
  139006. "adds r3, r3, r6\n\t"
  139007. "adcs r4, r4, r7\n\t"
  139008. "adc r5, r5, #0\n\t"
  139009. "lsr r6, %[b], #16\n\t"
  139010. "lsr r7, r8, #16\n\t"
  139011. "mul r7, r6, r7\n\t"
  139012. "adds r4, r4, r7\n\t"
  139013. "adc r5, r5, #0\n\t"
  139014. "lsl r7, r8, #16\n\t"
  139015. "lsr r7, r7, #16\n\t"
  139016. "mul r6, r7, r6\n\t"
  139017. "lsr r7, r6, #16\n\t"
  139018. "lsl r6, r6, #16\n\t"
  139019. "adds r3, r3, r6\n\t"
  139020. "adcs r4, r4, r7\n\t"
  139021. "adc r5, r5, #0\n\t"
  139022. #else
  139023. "umull r6, r7, %[b], r8\n\t"
  139024. "adds r3, r3, r6\n\t"
  139025. "adcs r4, r4, r7\n\t"
  139026. "mov r5, #0\n\t"
  139027. "adc r5, r5, #0\n\t"
  139028. #endif
  139029. "str r3, [%[r]], #4\n\t"
  139030. /* A[31] * B */
  139031. "ldr r8, [%[a]], #4\n\t"
  139032. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  139033. "lsl r6, %[b], #16\n\t"
  139034. "lsl r7, r8, #16\n\t"
  139035. "lsr r6, r6, #16\n\t"
  139036. "lsr r7, r7, #16\n\t"
  139037. "mul r7, r6, r7\n\t"
  139038. "adds r4, r4, r7\n\t"
  139039. "adc r5, r5, #0\n\t"
  139040. "lsr r7, r8, #16\n\t"
  139041. "mul r6, r7, r6\n\t"
  139042. "lsr r7, r6, #16\n\t"
  139043. "lsl r6, r6, #16\n\t"
  139044. "adds r4, r4, r6\n\t"
  139045. "adc r5, r5, r7\n\t"
  139046. "lsr r6, %[b], #16\n\t"
  139047. "lsr r7, r8, #16\n\t"
  139048. "mul r7, r6, r7\n\t"
  139049. "add r5, r5, r7\n\t"
  139050. "lsl r7, r8, #16\n\t"
  139051. "lsr r7, r7, #16\n\t"
  139052. "mul r6, r7, r6\n\t"
  139053. "lsr r7, r6, #16\n\t"
  139054. "lsl r6, r6, #16\n\t"
  139055. "adds r4, r4, r6\n\t"
  139056. "adc r5, r5, r7\n\t"
  139057. #else
  139058. "umull r6, r7, %[b], r8\n\t"
  139059. "adds r4, r4, r6\n\t"
  139060. "adc r5, r5, r7\n\t"
  139061. #endif
  139062. "str r4, [%[r]], #4\n\t"
  139063. "str r5, [%[r]]\n\t"
  139064. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  139065. :
  139066. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10"
  139067. );
  139068. }
  139069. #endif /* WOLFSSL_SP_SMALL */
  139070. #ifdef WOLFSSL_SP_USE_UDIV
  139071. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  139072. *
  139073. * d1 The high order half of the number to divide.
  139074. * d0 The low order half of the number to divide.
  139075. * div The divisor.
  139076. * returns the result of the division.
  139077. *
  139078. * Note that this is an approximate div. It may give an answer 1 larger.
  139079. */
  139080. static sp_digit div_1024_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  139081. {
  139082. register sp_digit d1 asm ("r0") = d1_p;
  139083. register sp_digit d0 asm ("r1") = d0_p;
  139084. register sp_digit div asm ("r2") = div_p;
  139085. __asm__ __volatile__ (
  139086. "lsr r6, %[div], #16\n\t"
  139087. "add lr, r6, #1\n\t"
  139088. "udiv r4, %[d1], lr\n\t"
  139089. "lsl r5, %[div], #16\n\t"
  139090. "lsl r4, r4, #16\n\t"
  139091. "umull r3, r12, %[div], r4\n\t"
  139092. "subs %[d0], %[d0], r3\n\t"
  139093. "sbc %[d1], %[d1], r12\n\t"
  139094. "subs r3, %[d1], lr\n\t"
  139095. "sbc r7, r7, r7\n\t"
  139096. "add r7, r7, #1\n\t"
  139097. "rsb r8, r7, #0\n\t"
  139098. "lsl r7, r7, #16\n\t"
  139099. "and r5, r5, r8\n\t"
  139100. "and r6, r6, r8\n\t"
  139101. "subs %[d0], %[d0], r5\n\t"
  139102. "add r4, r4, r7\n\t"
  139103. "sbc %[d1], %[d1], r6\n\t"
  139104. "lsl r12, %[d1], #16\n\t"
  139105. "lsr r3, %[d0], #16\n\t"
  139106. "orr r3, r3, r12\n\t"
  139107. "udiv r3, r3, lr\n\t"
  139108. "add r4, r4, r3\n\t"
  139109. "umull r3, r12, %[div], r3\n\t"
  139110. "subs %[d0], %[d0], r3\n\t"
  139111. "sbc %[d1], %[d1], r12\n\t"
  139112. "lsl r12, %[d1], #16\n\t"
  139113. "lsr r3, %[d0], #16\n\t"
  139114. "orr r3, r3, r12\n\t"
  139115. "udiv r3, r3, lr\n\t"
  139116. "add r4, r4, r3\n\t"
  139117. "mul r3, %[div], r3\n\t"
  139118. "sub %[d0], %[d0], r3\n\t"
  139119. "udiv r3, %[d0], %[div]\n\t"
  139120. "add %[d1], r4, r3\n\t"
  139121. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  139122. :
  139123. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  139124. );
  139125. return (uint32_t)(size_t)d1;
  139126. }
  139127. #else
  139128. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  139129. *
  139130. * d1 The high order half of the number to divide.
  139131. * d0 The low order half of the number to divide.
  139132. * div The divisor.
  139133. * returns the result of the division.
  139134. *
  139135. * Note that this is an approximate div. It may give an answer 1 larger.
  139136. */
  139137. static sp_digit div_1024_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p)
  139138. {
  139139. register sp_digit d1 asm ("r0") = d1_p;
  139140. register sp_digit d0 asm ("r1") = d0_p;
  139141. register sp_digit div asm ("r2") = div_p;
  139142. __asm__ __volatile__ (
  139143. "lsr lr, %[div], #1\n\t"
  139144. "add lr, lr, #1\n\t"
  139145. "mov r4, %[d0]\n\t"
  139146. "mov r5, %[d1]\n\t"
  139147. /* Do top 32 */
  139148. "subs r6, lr, r5\n\t"
  139149. "sbc r6, r6, r6\n\t"
  139150. "mov r3, #0\n\t"
  139151. "sub r3, r3, r6\n\t"
  139152. "and r6, r6, lr\n\t"
  139153. "subs r5, r5, r6\n\t"
  139154. /* Next 30 bits */
  139155. "mov r12, #29\n\t"
  139156. "\n"
  139157. "L_div_1024_word_32_bit_%=: \n\t"
  139158. "lsls r4, r4, #1\n\t"
  139159. "adc r5, r5, r5\n\t"
  139160. "subs r6, lr, r5\n\t"
  139161. "sbc r6, r6, r6\n\t"
  139162. "add r3, r3, r3\n\t"
  139163. "sub r3, r3, r6\n\t"
  139164. "and r6, r6, lr\n\t"
  139165. "subs r5, r5, r6\n\t"
  139166. "subs r12, r12, #1\n\t"
  139167. "bpl L_div_1024_word_32_bit_%=\n\t"
  139168. "add r3, r3, r3\n\t"
  139169. "add r3, r3, #1\n\t"
  139170. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  139171. "lsl r7, r3, #16\n\t"
  139172. "lsl r4, %[div], #16\n\t"
  139173. "lsr r7, r7, #16\n\t"
  139174. "lsr r4, r4, #16\n\t"
  139175. "mul r4, r7, r4\n\t"
  139176. "lsr r8, %[div], #16\n\t"
  139177. "mul r7, r8, r7\n\t"
  139178. "lsr r5, r7, #16\n\t"
  139179. "lsl r7, r7, #16\n\t"
  139180. "adds r4, r4, r7\n\t"
  139181. "adc r5, r5, #0\n\t"
  139182. "lsr r7, r3, #16\n\t"
  139183. "mul r8, r7, r8\n\t"
  139184. "add r5, r5, r8\n\t"
  139185. "lsl r8, %[div], #16\n\t"
  139186. "lsr r8, r8, #16\n\t"
  139187. "mul r7, r8, r7\n\t"
  139188. "lsr r8, r7, #16\n\t"
  139189. "lsl r7, r7, #16\n\t"
  139190. "adds r4, r4, r7\n\t"
  139191. "adc r5, r5, r8\n\t"
  139192. #else
  139193. "umull r4, r5, r3, %[div]\n\t"
  139194. #endif
  139195. "subs r7, %[d0], r4\n\t"
  139196. "sbc r8, %[d1], r5\n\t"
  139197. "add r3, r3, r8\n\t"
  139198. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  139199. "lsl r7, r3, #16\n\t"
  139200. "lsl r4, %[div], #16\n\t"
  139201. "lsr r7, r7, #16\n\t"
  139202. "lsr r4, r4, #16\n\t"
  139203. "mul r4, r7, r4\n\t"
  139204. "lsr r8, %[div], #16\n\t"
  139205. "mul r7, r8, r7\n\t"
  139206. "lsr r5, r7, #16\n\t"
  139207. "lsl r7, r7, #16\n\t"
  139208. "adds r4, r4, r7\n\t"
  139209. "adc r5, r5, #0\n\t"
  139210. "lsr r7, r3, #16\n\t"
  139211. "mul r8, r7, r8\n\t"
  139212. "add r5, r5, r8\n\t"
  139213. "lsl r8, %[div], #16\n\t"
  139214. "lsr r8, r8, #16\n\t"
  139215. "mul r7, r8, r7\n\t"
  139216. "lsr r8, r7, #16\n\t"
  139217. "lsl r7, r7, #16\n\t"
  139218. "adds r4, r4, r7\n\t"
  139219. "adc r5, r5, r8\n\t"
  139220. #else
  139221. "umull r4, r5, r3, %[div]\n\t"
  139222. #endif
  139223. "subs r7, %[d0], r4\n\t"
  139224. "sbc r8, %[d1], r5\n\t"
  139225. "add r3, r3, r8\n\t"
  139226. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  139227. "lsl r7, r3, #16\n\t"
  139228. "lsl r4, %[div], #16\n\t"
  139229. "lsr r7, r7, #16\n\t"
  139230. "lsr r4, r4, #16\n\t"
  139231. "mul r4, r7, r4\n\t"
  139232. "lsr r8, %[div], #16\n\t"
  139233. "mul r7, r8, r7\n\t"
  139234. "lsr r5, r7, #16\n\t"
  139235. "lsl r7, r7, #16\n\t"
  139236. "adds r4, r4, r7\n\t"
  139237. "adc r5, r5, #0\n\t"
  139238. "lsr r7, r3, #16\n\t"
  139239. "mul r8, r7, r8\n\t"
  139240. "add r5, r5, r8\n\t"
  139241. "lsl r8, %[div], #16\n\t"
  139242. "lsr r8, r8, #16\n\t"
  139243. "mul r7, r8, r7\n\t"
  139244. "lsr r8, r7, #16\n\t"
  139245. "lsl r7, r7, #16\n\t"
  139246. "adds r4, r4, r7\n\t"
  139247. "adc r5, r5, r8\n\t"
  139248. #else
  139249. "umull r4, r5, r3, %[div]\n\t"
  139250. #endif
  139251. "subs r7, %[d0], r4\n\t"
  139252. "sbc r8, %[d1], r5\n\t"
  139253. "add r3, r3, r8\n\t"
  139254. "subs r6, %[div], r7\n\t"
  139255. "sbc r6, r6, r6\n\t"
  139256. "sub %[d1], r3, r6\n\t"
  139257. : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div)
  139258. :
  139259. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  139260. );
  139261. return (uint32_t)(size_t)d1;
  139262. }
  139263. #endif
  139264. /* AND m into each word of a and store in r.
  139265. *
  139266. * r A single precision integer.
  139267. * a A single precision integer.
  139268. * m Mask to AND against each digit.
  139269. */
  139270. static void sp_1024_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  139271. {
  139272. #ifdef WOLFSSL_SP_SMALL
  139273. int i;
  139274. for (i=0; i<32; i++) {
  139275. r[i] = a[i] & m;
  139276. }
  139277. #else
  139278. int i;
  139279. for (i = 0; i < 32; i += 8) {
  139280. r[i+0] = a[i+0] & m;
  139281. r[i+1] = a[i+1] & m;
  139282. r[i+2] = a[i+2] & m;
  139283. r[i+3] = a[i+3] & m;
  139284. r[i+4] = a[i+4] & m;
  139285. r[i+5] = a[i+5] & m;
  139286. r[i+6] = a[i+6] & m;
  139287. r[i+7] = a[i+7] & m;
  139288. }
  139289. #endif
  139290. }
  139291. /* Compare a with b in constant time.
  139292. *
  139293. * a A single precision integer.
  139294. * b A single precision integer.
  139295. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  139296. * respectively.
  139297. */
  139298. static sp_int32 sp_1024_cmp_32(const sp_digit* a_p, const sp_digit* b_p)
  139299. {
  139300. register const sp_digit* a asm ("r0") = a_p;
  139301. register const sp_digit* b asm ("r1") = b_p;
  139302. __asm__ __volatile__ (
  139303. "mov r2, #-1\n\t"
  139304. "mov r6, #1\n\t"
  139305. "mov r5, #0\n\t"
  139306. "mov r3, #-1\n\t"
  139307. #ifdef WOLFSSL_SP_SMALL
  139308. "mov r4, #0x7c\n\t"
  139309. "\n"
  139310. "L_sp_1024_cmp_32_words_%=: \n\t"
  139311. "ldr r12, [%[a], r4]\n\t"
  139312. "ldr lr, [%[b], r4]\n\t"
  139313. "and r12, r12, r3\n\t"
  139314. "and lr, lr, r3\n\t"
  139315. "subs r12, r12, lr\n\t"
  139316. "it hi\n\t"
  139317. "movhi r2, r6\n\t"
  139318. "it lo\n\t"
  139319. "movlo r2, r3\n\t"
  139320. "it ne\n\t"
  139321. "movne r3, r5\n\t"
  139322. "subs r4, r4, #4\n\t"
  139323. "bcs L_sp_1024_cmp_32_words_%=\n\t"
  139324. "eor r2, r2, r3\n\t"
  139325. #else
  139326. "ldr r12, [%[a], #124]\n\t"
  139327. "ldr lr, [%[b], #124]\n\t"
  139328. "and r12, r12, r3\n\t"
  139329. "and lr, lr, r3\n\t"
  139330. "subs r12, r12, lr\n\t"
  139331. "it hi\n\t"
  139332. "movhi r2, r6\n\t"
  139333. "it lo\n\t"
  139334. "movlo r2, r3\n\t"
  139335. "it ne\n\t"
  139336. "movne r3, r5\n\t"
  139337. "ldr r12, [%[a], #120]\n\t"
  139338. "ldr lr, [%[b], #120]\n\t"
  139339. "and r12, r12, r3\n\t"
  139340. "and lr, lr, r3\n\t"
  139341. "subs r12, r12, lr\n\t"
  139342. "it hi\n\t"
  139343. "movhi r2, r6\n\t"
  139344. "it lo\n\t"
  139345. "movlo r2, r3\n\t"
  139346. "it ne\n\t"
  139347. "movne r3, r5\n\t"
  139348. "ldr r12, [%[a], #116]\n\t"
  139349. "ldr lr, [%[b], #116]\n\t"
  139350. "and r12, r12, r3\n\t"
  139351. "and lr, lr, r3\n\t"
  139352. "subs r12, r12, lr\n\t"
  139353. "it hi\n\t"
  139354. "movhi r2, r6\n\t"
  139355. "it lo\n\t"
  139356. "movlo r2, r3\n\t"
  139357. "it ne\n\t"
  139358. "movne r3, r5\n\t"
  139359. "ldr r12, [%[a], #112]\n\t"
  139360. "ldr lr, [%[b], #112]\n\t"
  139361. "and r12, r12, r3\n\t"
  139362. "and lr, lr, r3\n\t"
  139363. "subs r12, r12, lr\n\t"
  139364. "it hi\n\t"
  139365. "movhi r2, r6\n\t"
  139366. "it lo\n\t"
  139367. "movlo r2, r3\n\t"
  139368. "it ne\n\t"
  139369. "movne r3, r5\n\t"
  139370. "ldr r12, [%[a], #108]\n\t"
  139371. "ldr lr, [%[b], #108]\n\t"
  139372. "and r12, r12, r3\n\t"
  139373. "and lr, lr, r3\n\t"
  139374. "subs r12, r12, lr\n\t"
  139375. "it hi\n\t"
  139376. "movhi r2, r6\n\t"
  139377. "it lo\n\t"
  139378. "movlo r2, r3\n\t"
  139379. "it ne\n\t"
  139380. "movne r3, r5\n\t"
  139381. "ldr r12, [%[a], #104]\n\t"
  139382. "ldr lr, [%[b], #104]\n\t"
  139383. "and r12, r12, r3\n\t"
  139384. "and lr, lr, r3\n\t"
  139385. "subs r12, r12, lr\n\t"
  139386. "it hi\n\t"
  139387. "movhi r2, r6\n\t"
  139388. "it lo\n\t"
  139389. "movlo r2, r3\n\t"
  139390. "it ne\n\t"
  139391. "movne r3, r5\n\t"
  139392. "ldr r12, [%[a], #100]\n\t"
  139393. "ldr lr, [%[b], #100]\n\t"
  139394. "and r12, r12, r3\n\t"
  139395. "and lr, lr, r3\n\t"
  139396. "subs r12, r12, lr\n\t"
  139397. "it hi\n\t"
  139398. "movhi r2, r6\n\t"
  139399. "it lo\n\t"
  139400. "movlo r2, r3\n\t"
  139401. "it ne\n\t"
  139402. "movne r3, r5\n\t"
  139403. "ldr r12, [%[a], #96]\n\t"
  139404. "ldr lr, [%[b], #96]\n\t"
  139405. "and r12, r12, r3\n\t"
  139406. "and lr, lr, r3\n\t"
  139407. "subs r12, r12, lr\n\t"
  139408. "it hi\n\t"
  139409. "movhi r2, r6\n\t"
  139410. "it lo\n\t"
  139411. "movlo r2, r3\n\t"
  139412. "it ne\n\t"
  139413. "movne r3, r5\n\t"
  139414. "ldr r12, [%[a], #92]\n\t"
  139415. "ldr lr, [%[b], #92]\n\t"
  139416. "and r12, r12, r3\n\t"
  139417. "and lr, lr, r3\n\t"
  139418. "subs r12, r12, lr\n\t"
  139419. "it hi\n\t"
  139420. "movhi r2, r6\n\t"
  139421. "it lo\n\t"
  139422. "movlo r2, r3\n\t"
  139423. "it ne\n\t"
  139424. "movne r3, r5\n\t"
  139425. "ldr r12, [%[a], #88]\n\t"
  139426. "ldr lr, [%[b], #88]\n\t"
  139427. "and r12, r12, r3\n\t"
  139428. "and lr, lr, r3\n\t"
  139429. "subs r12, r12, lr\n\t"
  139430. "it hi\n\t"
  139431. "movhi r2, r6\n\t"
  139432. "it lo\n\t"
  139433. "movlo r2, r3\n\t"
  139434. "it ne\n\t"
  139435. "movne r3, r5\n\t"
  139436. "ldr r12, [%[a], #84]\n\t"
  139437. "ldr lr, [%[b], #84]\n\t"
  139438. "and r12, r12, r3\n\t"
  139439. "and lr, lr, r3\n\t"
  139440. "subs r12, r12, lr\n\t"
  139441. "it hi\n\t"
  139442. "movhi r2, r6\n\t"
  139443. "it lo\n\t"
  139444. "movlo r2, r3\n\t"
  139445. "it ne\n\t"
  139446. "movne r3, r5\n\t"
  139447. "ldr r12, [%[a], #80]\n\t"
  139448. "ldr lr, [%[b], #80]\n\t"
  139449. "and r12, r12, r3\n\t"
  139450. "and lr, lr, r3\n\t"
  139451. "subs r12, r12, lr\n\t"
  139452. "it hi\n\t"
  139453. "movhi r2, r6\n\t"
  139454. "it lo\n\t"
  139455. "movlo r2, r3\n\t"
  139456. "it ne\n\t"
  139457. "movne r3, r5\n\t"
  139458. "ldr r12, [%[a], #76]\n\t"
  139459. "ldr lr, [%[b], #76]\n\t"
  139460. "and r12, r12, r3\n\t"
  139461. "and lr, lr, r3\n\t"
  139462. "subs r12, r12, lr\n\t"
  139463. "it hi\n\t"
  139464. "movhi r2, r6\n\t"
  139465. "it lo\n\t"
  139466. "movlo r2, r3\n\t"
  139467. "it ne\n\t"
  139468. "movne r3, r5\n\t"
  139469. "ldr r12, [%[a], #72]\n\t"
  139470. "ldr lr, [%[b], #72]\n\t"
  139471. "and r12, r12, r3\n\t"
  139472. "and lr, lr, r3\n\t"
  139473. "subs r12, r12, lr\n\t"
  139474. "it hi\n\t"
  139475. "movhi r2, r6\n\t"
  139476. "it lo\n\t"
  139477. "movlo r2, r3\n\t"
  139478. "it ne\n\t"
  139479. "movne r3, r5\n\t"
  139480. "ldr r12, [%[a], #68]\n\t"
  139481. "ldr lr, [%[b], #68]\n\t"
  139482. "and r12, r12, r3\n\t"
  139483. "and lr, lr, r3\n\t"
  139484. "subs r12, r12, lr\n\t"
  139485. "it hi\n\t"
  139486. "movhi r2, r6\n\t"
  139487. "it lo\n\t"
  139488. "movlo r2, r3\n\t"
  139489. "it ne\n\t"
  139490. "movne r3, r5\n\t"
  139491. "ldr r12, [%[a], #64]\n\t"
  139492. "ldr lr, [%[b], #64]\n\t"
  139493. "and r12, r12, r3\n\t"
  139494. "and lr, lr, r3\n\t"
  139495. "subs r12, r12, lr\n\t"
  139496. "it hi\n\t"
  139497. "movhi r2, r6\n\t"
  139498. "it lo\n\t"
  139499. "movlo r2, r3\n\t"
  139500. "it ne\n\t"
  139501. "movne r3, r5\n\t"
  139502. "ldr r12, [%[a], #60]\n\t"
  139503. "ldr lr, [%[b], #60]\n\t"
  139504. "and r12, r12, r3\n\t"
  139505. "and lr, lr, r3\n\t"
  139506. "subs r12, r12, lr\n\t"
  139507. "it hi\n\t"
  139508. "movhi r2, r6\n\t"
  139509. "it lo\n\t"
  139510. "movlo r2, r3\n\t"
  139511. "it ne\n\t"
  139512. "movne r3, r5\n\t"
  139513. "ldr r12, [%[a], #56]\n\t"
  139514. "ldr lr, [%[b], #56]\n\t"
  139515. "and r12, r12, r3\n\t"
  139516. "and lr, lr, r3\n\t"
  139517. "subs r12, r12, lr\n\t"
  139518. "it hi\n\t"
  139519. "movhi r2, r6\n\t"
  139520. "it lo\n\t"
  139521. "movlo r2, r3\n\t"
  139522. "it ne\n\t"
  139523. "movne r3, r5\n\t"
  139524. "ldr r12, [%[a], #52]\n\t"
  139525. "ldr lr, [%[b], #52]\n\t"
  139526. "and r12, r12, r3\n\t"
  139527. "and lr, lr, r3\n\t"
  139528. "subs r12, r12, lr\n\t"
  139529. "it hi\n\t"
  139530. "movhi r2, r6\n\t"
  139531. "it lo\n\t"
  139532. "movlo r2, r3\n\t"
  139533. "it ne\n\t"
  139534. "movne r3, r5\n\t"
  139535. "ldr r12, [%[a], #48]\n\t"
  139536. "ldr lr, [%[b], #48]\n\t"
  139537. "and r12, r12, r3\n\t"
  139538. "and lr, lr, r3\n\t"
  139539. "subs r12, r12, lr\n\t"
  139540. "it hi\n\t"
  139541. "movhi r2, r6\n\t"
  139542. "it lo\n\t"
  139543. "movlo r2, r3\n\t"
  139544. "it ne\n\t"
  139545. "movne r3, r5\n\t"
  139546. "ldr r12, [%[a], #44]\n\t"
  139547. "ldr lr, [%[b], #44]\n\t"
  139548. "and r12, r12, r3\n\t"
  139549. "and lr, lr, r3\n\t"
  139550. "subs r12, r12, lr\n\t"
  139551. "it hi\n\t"
  139552. "movhi r2, r6\n\t"
  139553. "it lo\n\t"
  139554. "movlo r2, r3\n\t"
  139555. "it ne\n\t"
  139556. "movne r3, r5\n\t"
  139557. "ldr r12, [%[a], #40]\n\t"
  139558. "ldr lr, [%[b], #40]\n\t"
  139559. "and r12, r12, r3\n\t"
  139560. "and lr, lr, r3\n\t"
  139561. "subs r12, r12, lr\n\t"
  139562. "it hi\n\t"
  139563. "movhi r2, r6\n\t"
  139564. "it lo\n\t"
  139565. "movlo r2, r3\n\t"
  139566. "it ne\n\t"
  139567. "movne r3, r5\n\t"
  139568. "ldr r12, [%[a], #36]\n\t"
  139569. "ldr lr, [%[b], #36]\n\t"
  139570. "and r12, r12, r3\n\t"
  139571. "and lr, lr, r3\n\t"
  139572. "subs r12, r12, lr\n\t"
  139573. "it hi\n\t"
  139574. "movhi r2, r6\n\t"
  139575. "it lo\n\t"
  139576. "movlo r2, r3\n\t"
  139577. "it ne\n\t"
  139578. "movne r3, r5\n\t"
  139579. "ldr r12, [%[a], #32]\n\t"
  139580. "ldr lr, [%[b], #32]\n\t"
  139581. "and r12, r12, r3\n\t"
  139582. "and lr, lr, r3\n\t"
  139583. "subs r12, r12, lr\n\t"
  139584. "it hi\n\t"
  139585. "movhi r2, r6\n\t"
  139586. "it lo\n\t"
  139587. "movlo r2, r3\n\t"
  139588. "it ne\n\t"
  139589. "movne r3, r5\n\t"
  139590. "ldr r12, [%[a], #28]\n\t"
  139591. "ldr lr, [%[b], #28]\n\t"
  139592. "and r12, r12, r3\n\t"
  139593. "and lr, lr, r3\n\t"
  139594. "subs r12, r12, lr\n\t"
  139595. "it hi\n\t"
  139596. "movhi r2, r6\n\t"
  139597. "it lo\n\t"
  139598. "movlo r2, r3\n\t"
  139599. "it ne\n\t"
  139600. "movne r3, r5\n\t"
  139601. "ldr r12, [%[a], #24]\n\t"
  139602. "ldr lr, [%[b], #24]\n\t"
  139603. "and r12, r12, r3\n\t"
  139604. "and lr, lr, r3\n\t"
  139605. "subs r12, r12, lr\n\t"
  139606. "it hi\n\t"
  139607. "movhi r2, r6\n\t"
  139608. "it lo\n\t"
  139609. "movlo r2, r3\n\t"
  139610. "it ne\n\t"
  139611. "movne r3, r5\n\t"
  139612. "ldr r12, [%[a], #20]\n\t"
  139613. "ldr lr, [%[b], #20]\n\t"
  139614. "and r12, r12, r3\n\t"
  139615. "and lr, lr, r3\n\t"
  139616. "subs r12, r12, lr\n\t"
  139617. "it hi\n\t"
  139618. "movhi r2, r6\n\t"
  139619. "it lo\n\t"
  139620. "movlo r2, r3\n\t"
  139621. "it ne\n\t"
  139622. "movne r3, r5\n\t"
  139623. "ldr r12, [%[a], #16]\n\t"
  139624. "ldr lr, [%[b], #16]\n\t"
  139625. "and r12, r12, r3\n\t"
  139626. "and lr, lr, r3\n\t"
  139627. "subs r12, r12, lr\n\t"
  139628. "it hi\n\t"
  139629. "movhi r2, r6\n\t"
  139630. "it lo\n\t"
  139631. "movlo r2, r3\n\t"
  139632. "it ne\n\t"
  139633. "movne r3, r5\n\t"
  139634. "ldr r12, [%[a], #12]\n\t"
  139635. "ldr lr, [%[b], #12]\n\t"
  139636. "and r12, r12, r3\n\t"
  139637. "and lr, lr, r3\n\t"
  139638. "subs r12, r12, lr\n\t"
  139639. "it hi\n\t"
  139640. "movhi r2, r6\n\t"
  139641. "it lo\n\t"
  139642. "movlo r2, r3\n\t"
  139643. "it ne\n\t"
  139644. "movne r3, r5\n\t"
  139645. "ldr r12, [%[a], #8]\n\t"
  139646. "ldr lr, [%[b], #8]\n\t"
  139647. "and r12, r12, r3\n\t"
  139648. "and lr, lr, r3\n\t"
  139649. "subs r12, r12, lr\n\t"
  139650. "it hi\n\t"
  139651. "movhi r2, r6\n\t"
  139652. "it lo\n\t"
  139653. "movlo r2, r3\n\t"
  139654. "it ne\n\t"
  139655. "movne r3, r5\n\t"
  139656. "ldr r12, [%[a], #4]\n\t"
  139657. "ldr lr, [%[b], #4]\n\t"
  139658. "and r12, r12, r3\n\t"
  139659. "and lr, lr, r3\n\t"
  139660. "subs r12, r12, lr\n\t"
  139661. "it hi\n\t"
  139662. "movhi r2, r6\n\t"
  139663. "it lo\n\t"
  139664. "movlo r2, r3\n\t"
  139665. "it ne\n\t"
  139666. "movne r3, r5\n\t"
  139667. "ldr r12, [%[a]]\n\t"
  139668. "ldr lr, [%[b]]\n\t"
  139669. "and r12, r12, r3\n\t"
  139670. "and lr, lr, r3\n\t"
  139671. "subs r12, r12, lr\n\t"
  139672. "it hi\n\t"
  139673. "movhi r2, r6\n\t"
  139674. "it lo\n\t"
  139675. "movlo r2, r3\n\t"
  139676. "it ne\n\t"
  139677. "movne r3, r5\n\t"
  139678. "eor r2, r2, r3\n\t"
  139679. #endif /*WOLFSSL_SP_SMALL */
  139680. "mov %[a], r2\n\t"
  139681. : [a] "+r" (a), [b] "+r" (b)
  139682. :
  139683. : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6"
  139684. );
  139685. return (uint32_t)(size_t)a;
  139686. }
  139687. /* Divide d in a and put remainder into r (m*d + r = a)
  139688. * m is not calculated as it is not needed at this time.
  139689. *
  139690. * a Number to be divided.
  139691. * d Number to divide with.
  139692. * m Multiplier result.
  139693. * r Remainder from the division.
  139694. * returns MP_OKAY indicating success.
  139695. */
  139696. static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m,
  139697. sp_digit* r)
  139698. {
  139699. sp_digit t1[64], t2[33];
  139700. sp_digit div, r1;
  139701. int i;
  139702. (void)m;
  139703. div = d[31];
  139704. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  139705. r1 = sp_1024_cmp_32(&t1[32], d) >= 0;
  139706. sp_1024_cond_sub_32(&t1[32], &t1[32], d, (sp_digit)0 - r1);
  139707. for (i = 31; i >= 0; i--) {
  139708. volatile sp_digit mask = (sp_digit)0 - (t1[32 + i] == div);
  139709. sp_digit hi = t1[32 + i] + mask;
  139710. r1 = div_1024_word_32(hi, t1[32 + i - 1], div);
  139711. r1 |= mask;
  139712. sp_1024_mul_d_32(t2, d, r1);
  139713. t1[32 + i] += sp_1024_sub_in_place_32(&t1[i], t2);
  139714. t1[32 + i] -= t2[32];
  139715. sp_1024_mask_32(t2, d, t1[32 + i]);
  139716. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  139717. sp_1024_mask_32(t2, d, t1[32 + i]);
  139718. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  139719. }
  139720. r1 = sp_1024_cmp_32(t1, d) >= 0;
  139721. sp_1024_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  139722. return MP_OKAY;
  139723. }
  139724. /* Reduce a modulo m into r. (r = a mod m)
  139725. *
  139726. * r A single precision number that is the reduced result.
  139727. * a A single precision number that is to be reduced.
  139728. * m A single precision number that is the modulus to reduce with.
  139729. * returns MP_OKAY indicating success.
  139730. */
  139731. static WC_INLINE int sp_1024_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  139732. {
  139733. return sp_1024_div_32(a, m, NULL, r);
  139734. }
  139735. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  139736. *
  139737. * r The resulting Montgomery form number.
  139738. * a The number to convert.
  139739. * m The modulus (prime).
  139740. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  139741. */
  139742. static int sp_1024_mod_mul_norm_32(sp_digit* r, const sp_digit* a,
  139743. const sp_digit* m)
  139744. {
  139745. sp_1024_mul_32(r, a, p1024_norm_mod);
  139746. return sp_1024_mod_32(r, r, m);
  139747. }
  139748. #ifdef WOLFCRYPT_HAVE_SAKKE
  139749. /* Create a new point.
  139750. *
  139751. * heap [in] Buffer to allocate dynamic memory from.
  139752. * sp [in] Data for point - only if not allocating.
  139753. * p [out] New point.
  139754. * returns MEMORY_E when dynamic memory allocation fails and 0 otherwise.
  139755. */
  139756. static int sp_1024_point_new_ex_32(void* heap, sp_point_1024* sp,
  139757. sp_point_1024** p)
  139758. {
  139759. int ret = MP_OKAY;
  139760. (void)heap;
  139761. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
  139762. (void)sp;
  139763. *p = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap, DYNAMIC_TYPE_ECC);
  139764. #else
  139765. *p = sp;
  139766. #endif
  139767. if (*p == NULL) {
  139768. ret = MEMORY_E;
  139769. }
  139770. return ret;
  139771. }
  139772. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
  139773. /* Allocate memory for point and return error. */
  139774. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), NULL, &(p))
  139775. #else
  139776. /* Set pointer to data and return no error. */
  139777. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), &(sp), &(p))
  139778. #endif
  139779. #endif /* WOLFCRYPT_HAVE_SAKKE */
  139780. #ifdef WOLFCRYPT_HAVE_SAKKE
  139781. /* Free the point.
  139782. *
  139783. * p [in,out] Point to free.
  139784. * clear [in] Indicates whether to zeroize point.
  139785. * heap [in] Buffer from which dynamic memory was allocate from.
  139786. */
  139787. static void sp_1024_point_free_32(sp_point_1024* p, int clear, void* heap)
  139788. {
  139789. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
  139790. /* If valid pointer then clear point data if requested and free data. */
  139791. if (p != NULL) {
  139792. if (clear != 0) {
  139793. XMEMSET(p, 0, sizeof(*p));
  139794. }
  139795. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  139796. }
  139797. #else
  139798. /* Clear point data if requested. */
  139799. if ((p != NULL) && (clear != 0)) {
  139800. XMEMSET(p, 0, sizeof(*p));
  139801. }
  139802. #endif
  139803. (void)heap;
  139804. }
  139805. #endif /* WOLFCRYPT_HAVE_SAKKE */
  139806. /* Convert an mp_int to an array of sp_digit.
  139807. *
  139808. * r A single precision integer.
  139809. * size Maximum number of bytes to convert
  139810. * a A multi-precision integer.
  139811. */
  139812. static void sp_1024_from_mp(sp_digit* r, int size, const mp_int* a)
  139813. {
  139814. #if DIGIT_BIT == 32
  139815. int i;
  139816. int j = 0;
  139817. for (i = 0; i < size; i++) {
  139818. sp_digit mask =
  139819. (((sp_digit)(a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1;
  139820. r[i] = a->dp[j] & mask;
  139821. j += (int)(((sp_digit)1) -
  139822. (((sp_digit)(a->used - i - 2)) >> (SP_WORD_SIZE - 1)));
  139823. }
  139824. #elif DIGIT_BIT > 32
  139825. int i;
  139826. int j = 0;
  139827. word32 s = 0;
  139828. r[0] = 0;
  139829. for (i = 0; i < a->used && j < size; i++) {
  139830. r[j] |= ((sp_digit)a->dp[i] << s);
  139831. r[j] &= 0xffffffff;
  139832. s = 32U - s;
  139833. if (j + 1 >= size) {
  139834. break;
  139835. }
  139836. /* lint allow cast of mismatch word32 and mp_digit */
  139837. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  139838. while ((s + 32U) <= (word32)DIGIT_BIT) {
  139839. s += 32U;
  139840. r[j] &= 0xffffffff;
  139841. if (j + 1 >= size) {
  139842. break;
  139843. }
  139844. if (s < (word32)DIGIT_BIT) {
  139845. /* lint allow cast of mismatch word32 and mp_digit */
  139846. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  139847. }
  139848. else {
  139849. r[++j] = (sp_digit)0;
  139850. }
  139851. }
  139852. s = (word32)DIGIT_BIT - s;
  139853. }
  139854. for (j++; j < size; j++) {
  139855. r[j] = 0;
  139856. }
  139857. #else
  139858. int i;
  139859. int j = 0;
  139860. int s = 0;
  139861. r[0] = 0;
  139862. for (i = 0; i < a->used && j < size; i++) {
  139863. r[j] |= ((sp_digit)a->dp[i]) << s;
  139864. if (s + DIGIT_BIT >= 32) {
  139865. r[j] &= 0xffffffff;
  139866. if (j + 1 >= size) {
  139867. break;
  139868. }
  139869. s = 32 - s;
  139870. if (s == DIGIT_BIT) {
  139871. r[++j] = 0;
  139872. s = 0;
  139873. }
  139874. else {
  139875. r[++j] = a->dp[i] >> s;
  139876. s = DIGIT_BIT - s;
  139877. }
  139878. }
  139879. else {
  139880. s += DIGIT_BIT;
  139881. }
  139882. }
  139883. for (j++; j < size; j++) {
  139884. r[j] = 0;
  139885. }
  139886. #endif
  139887. }
  139888. /* Convert a point of type ecc_point to type sp_point_1024.
  139889. *
  139890. * p Point of type sp_point_1024 (result).
  139891. * pm Point of type ecc_point.
  139892. */
  139893. static void sp_1024_point_from_ecc_point_32(sp_point_1024* p,
  139894. const ecc_point* pm)
  139895. {
  139896. XMEMSET(p->x, 0, sizeof(p->x));
  139897. XMEMSET(p->y, 0, sizeof(p->y));
  139898. XMEMSET(p->z, 0, sizeof(p->z));
  139899. sp_1024_from_mp(p->x, 32, pm->x);
  139900. sp_1024_from_mp(p->y, 32, pm->y);
  139901. sp_1024_from_mp(p->z, 32, pm->z);
  139902. p->infinity = 0;
  139903. }
  139904. /* Convert an array of sp_digit to an mp_int.
  139905. *
  139906. * a A single precision integer.
  139907. * r A multi-precision integer.
  139908. */
  139909. static int sp_1024_to_mp(const sp_digit* a, mp_int* r)
  139910. {
  139911. int err;
  139912. err = mp_grow(r, (1024 + DIGIT_BIT - 1) / DIGIT_BIT);
  139913. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  139914. #if DIGIT_BIT == 32
  139915. XMEMCPY(r->dp, a, sizeof(sp_digit) * 32);
  139916. r->used = 32;
  139917. mp_clamp(r);
  139918. #elif DIGIT_BIT < 32
  139919. int i;
  139920. int j = 0;
  139921. int s = 0;
  139922. r->dp[0] = 0;
  139923. for (i = 0; i < 32; i++) {
  139924. r->dp[j] |= (mp_digit)(a[i] << s);
  139925. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  139926. s = DIGIT_BIT - s;
  139927. r->dp[++j] = (mp_digit)(a[i] >> s);
  139928. while (s + DIGIT_BIT <= 32) {
  139929. s += DIGIT_BIT;
  139930. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  139931. if (s == SP_WORD_SIZE) {
  139932. r->dp[j] = 0;
  139933. }
  139934. else {
  139935. r->dp[j] = (mp_digit)(a[i] >> s);
  139936. }
  139937. }
  139938. s = 32 - s;
  139939. }
  139940. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  139941. mp_clamp(r);
  139942. #else
  139943. int i;
  139944. int j = 0;
  139945. int s = 0;
  139946. r->dp[0] = 0;
  139947. for (i = 0; i < 32; i++) {
  139948. r->dp[j] |= ((mp_digit)a[i]) << s;
  139949. if (s + 32 >= DIGIT_BIT) {
  139950. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  139951. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  139952. #endif
  139953. s = DIGIT_BIT - s;
  139954. r->dp[++j] = a[i] >> s;
  139955. s = 32 - s;
  139956. }
  139957. else {
  139958. s += 32;
  139959. }
  139960. }
  139961. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  139962. mp_clamp(r);
  139963. #endif
  139964. }
  139965. return err;
  139966. }
  139967. /* Convert a point of type sp_point_1024 to type ecc_point.
  139968. *
  139969. * p Point of type sp_point_1024.
  139970. * pm Point of type ecc_point (result).
  139971. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  139972. * MP_OKAY.
  139973. */
  139974. static int sp_1024_point_to_ecc_point_32(const sp_point_1024* p, ecc_point* pm)
  139975. {
  139976. int err;
  139977. err = sp_1024_to_mp(p->x, pm->x);
  139978. if (err == MP_OKAY) {
  139979. err = sp_1024_to_mp(p->y, pm->y);
  139980. }
  139981. if (err == MP_OKAY) {
  139982. err = sp_1024_to_mp(p->z, pm->z);
  139983. }
  139984. return err;
  139985. }
  139986. /* Reduce the number back to 1024 bits using Montgomery reduction.
  139987. *
  139988. * a A single precision number to reduce in place.
  139989. * m The single precision number representing the modulus.
  139990. * mp The digit representing the negative inverse of m mod 2^n.
  139991. */
  139992. static SP_NOINLINE void sp_1024_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p)
  139993. {
  139994. register sp_digit* a asm ("r0") = a_p;
  139995. register const sp_digit* m asm ("r1") = m_p;
  139996. register sp_digit mp asm ("r2") = mp_p;
  139997. __asm__ __volatile__ (
  139998. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  139999. "ldr r11, [%[m]]\n\t"
  140000. #endif
  140001. /* i = 0 */
  140002. "mov r9, #0\n\t"
  140003. "mov r3, #0\n\t"
  140004. "ldr r12, [%[a]]\n\t"
  140005. "ldr lr, [%[a], #4]\n\t"
  140006. "\n"
  140007. "L_sp_1024_mont_reduce_32_word_%=: \n\t"
  140008. /* mu = a[i] * mp */
  140009. "mul r8, %[mp], r12\n\t"
  140010. /* a[i+0] += m[0] * mu */
  140011. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140012. "ldr r11, [%[m]]\n\t"
  140013. #endif
  140014. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140015. "lsr r7, r11, #16\n\t"
  140016. "lsr r6, r8, #16\n\t"
  140017. "mul r5, r6, r7\n\t"
  140018. "lsl r7, r11, #16\n\t"
  140019. "lsr r7, r7, #16\n\t"
  140020. "mul r6, r7, r6\n\t"
  140021. "lsr r7, r6, #16\n\t"
  140022. "lsl r6, r6, #16\n\t"
  140023. "adds r12, r12, r6\n\t"
  140024. "adc r5, r5, r7\n\t"
  140025. "lsl r6, r8, #16\n\t"
  140026. "lsl r7, r11, #16\n\t"
  140027. "lsr r6, r6, #16\n\t"
  140028. "lsr r7, r7, #16\n\t"
  140029. "mul r7, r6, r7\n\t"
  140030. "adds r12, r12, r7\n\t"
  140031. "adc r5, r5, #0\n\t"
  140032. "lsr r7, r11, #16\n\t"
  140033. "mul r6, r7, r6\n\t"
  140034. "lsr r7, r6, #16\n\t"
  140035. "lsl r6, r6, #16\n\t"
  140036. "adds r12, r12, r6\n\t"
  140037. "adc r5, r5, r7\n\t"
  140038. #else
  140039. "umull r6, r7, r8, r11\n\t"
  140040. "adds r12, r12, r6\n\t"
  140041. "adc r5, r7, #0\n\t"
  140042. #endif
  140043. /* a[i+1] += m[1] * mu */
  140044. "ldr r7, [%[m], #4]\n\t"
  140045. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140046. "lsr r10, r7, #16\n\t"
  140047. "lsr r6, r8, #16\n\t"
  140048. "mul r4, r6, r10\n\t"
  140049. "lsl r10, r7, #16\n\t"
  140050. "lsr r10, r10, #16\n\t"
  140051. "mul r6, r10, r6\n\t"
  140052. "lsr r10, r6, #16\n\t"
  140053. "lsl r6, r6, #16\n\t"
  140054. "adds lr, lr, r6\n\t"
  140055. "adc r4, r4, r10\n\t"
  140056. "lsl r6, r8, #16\n\t"
  140057. "lsl r10, r7, #16\n\t"
  140058. "lsr r6, r6, #16\n\t"
  140059. "lsr r10, r10, #16\n\t"
  140060. "mul r10, r6, r10\n\t"
  140061. "adds lr, lr, r10\n\t"
  140062. "adc r4, r4, #0\n\t"
  140063. "lsr r10, r7, #16\n\t"
  140064. "mul r6, r10, r6\n\t"
  140065. "lsr r10, r6, #16\n\t"
  140066. "lsl r6, r6, #16\n\t"
  140067. "adds lr, lr, r6\n\t"
  140068. "adc r4, r4, r10\n\t"
  140069. #else
  140070. "umull r6, r10, r8, r7\n\t"
  140071. "adds lr, lr, r6\n\t"
  140072. "adc r4, r10, #0\n\t"
  140073. #endif
  140074. "mov r12, lr\n\t"
  140075. "adds r12, r12, r5\n\t"
  140076. "adc r4, r4, #0\n\t"
  140077. /* a[i+2] += m[2] * mu */
  140078. "ldr r7, [%[m], #8]\n\t"
  140079. "ldr lr, [%[a], #8]\n\t"
  140080. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140081. "lsr r10, r7, #16\n\t"
  140082. "lsr r6, r8, #16\n\t"
  140083. "mul r5, r6, r10\n\t"
  140084. "lsl r10, r7, #16\n\t"
  140085. "lsr r10, r10, #16\n\t"
  140086. "mul r6, r10, r6\n\t"
  140087. "lsr r10, r6, #16\n\t"
  140088. "lsl r6, r6, #16\n\t"
  140089. "adds lr, lr, r6\n\t"
  140090. "adc r5, r5, r10\n\t"
  140091. "lsl r6, r8, #16\n\t"
  140092. "lsl r10, r7, #16\n\t"
  140093. "lsr r6, r6, #16\n\t"
  140094. "lsr r10, r10, #16\n\t"
  140095. "mul r10, r6, r10\n\t"
  140096. "adds lr, lr, r10\n\t"
  140097. "adc r5, r5, #0\n\t"
  140098. "lsr r10, r7, #16\n\t"
  140099. "mul r6, r10, r6\n\t"
  140100. "lsr r10, r6, #16\n\t"
  140101. "lsl r6, r6, #16\n\t"
  140102. "adds lr, lr, r6\n\t"
  140103. "adc r5, r5, r10\n\t"
  140104. #else
  140105. "umull r6, r10, r8, r7\n\t"
  140106. "adds lr, lr, r6\n\t"
  140107. "adc r5, r10, #0\n\t"
  140108. #endif
  140109. "adds lr, lr, r4\n\t"
  140110. "adc r5, r5, #0\n\t"
  140111. /* a[i+3] += m[3] * mu */
  140112. "ldr r7, [%[m], #12]\n\t"
  140113. "ldr r10, [%[a], #12]\n\t"
  140114. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140115. "lsr r11, r7, #16\n\t"
  140116. "lsr r6, r8, #16\n\t"
  140117. "mul r4, r6, r11\n\t"
  140118. "lsl r11, r7, #16\n\t"
  140119. "lsr r11, r11, #16\n\t"
  140120. "mul r6, r11, r6\n\t"
  140121. "lsr r11, r6, #16\n\t"
  140122. "lsl r6, r6, #16\n\t"
  140123. "adds r10, r10, r6\n\t"
  140124. "adc r4, r4, r11\n\t"
  140125. "lsl r6, r8, #16\n\t"
  140126. "lsl r11, r7, #16\n\t"
  140127. "lsr r6, r6, #16\n\t"
  140128. "lsr r11, r11, #16\n\t"
  140129. "mul r11, r6, r11\n\t"
  140130. "adds r10, r10, r11\n\t"
  140131. "adc r4, r4, #0\n\t"
  140132. "lsr r11, r7, #16\n\t"
  140133. "mul r6, r11, r6\n\t"
  140134. "lsr r11, r6, #16\n\t"
  140135. "lsl r6, r6, #16\n\t"
  140136. "adds r10, r10, r6\n\t"
  140137. "adc r4, r4, r11\n\t"
  140138. #else
  140139. "umull r6, r7, r8, r7\n\t"
  140140. "adds r10, r10, r6\n\t"
  140141. "adc r4, r7, #0\n\t"
  140142. #endif
  140143. "adds r10, r10, r5\n\t"
  140144. "str r10, [%[a], #12]\n\t"
  140145. "adc r4, r4, #0\n\t"
  140146. /* a[i+4] += m[4] * mu */
  140147. "ldr r7, [%[m], #16]\n\t"
  140148. "ldr r10, [%[a], #16]\n\t"
  140149. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140150. "lsr r11, r7, #16\n\t"
  140151. "lsr r6, r8, #16\n\t"
  140152. "mul r5, r6, r11\n\t"
  140153. "lsl r11, r7, #16\n\t"
  140154. "lsr r11, r11, #16\n\t"
  140155. "mul r6, r11, r6\n\t"
  140156. "lsr r11, r6, #16\n\t"
  140157. "lsl r6, r6, #16\n\t"
  140158. "adds r10, r10, r6\n\t"
  140159. "adc r5, r5, r11\n\t"
  140160. "lsl r6, r8, #16\n\t"
  140161. "lsl r11, r7, #16\n\t"
  140162. "lsr r6, r6, #16\n\t"
  140163. "lsr r11, r11, #16\n\t"
  140164. "mul r11, r6, r11\n\t"
  140165. "adds r10, r10, r11\n\t"
  140166. "adc r5, r5, #0\n\t"
  140167. "lsr r11, r7, #16\n\t"
  140168. "mul r6, r11, r6\n\t"
  140169. "lsr r11, r6, #16\n\t"
  140170. "lsl r6, r6, #16\n\t"
  140171. "adds r10, r10, r6\n\t"
  140172. "adc r5, r5, r11\n\t"
  140173. #else
  140174. "umull r6, r7, r8, r7\n\t"
  140175. "adds r10, r10, r6\n\t"
  140176. "adc r5, r7, #0\n\t"
  140177. #endif
  140178. "adds r10, r10, r4\n\t"
  140179. "str r10, [%[a], #16]\n\t"
  140180. "adc r5, r5, #0\n\t"
  140181. /* a[i+5] += m[5] * mu */
  140182. "ldr r7, [%[m], #20]\n\t"
  140183. "ldr r10, [%[a], #20]\n\t"
  140184. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140185. "lsr r11, r7, #16\n\t"
  140186. "lsr r6, r8, #16\n\t"
  140187. "mul r4, r6, r11\n\t"
  140188. "lsl r11, r7, #16\n\t"
  140189. "lsr r11, r11, #16\n\t"
  140190. "mul r6, r11, r6\n\t"
  140191. "lsr r11, r6, #16\n\t"
  140192. "lsl r6, r6, #16\n\t"
  140193. "adds r10, r10, r6\n\t"
  140194. "adc r4, r4, r11\n\t"
  140195. "lsl r6, r8, #16\n\t"
  140196. "lsl r11, r7, #16\n\t"
  140197. "lsr r6, r6, #16\n\t"
  140198. "lsr r11, r11, #16\n\t"
  140199. "mul r11, r6, r11\n\t"
  140200. "adds r10, r10, r11\n\t"
  140201. "adc r4, r4, #0\n\t"
  140202. "lsr r11, r7, #16\n\t"
  140203. "mul r6, r11, r6\n\t"
  140204. "lsr r11, r6, #16\n\t"
  140205. "lsl r6, r6, #16\n\t"
  140206. "adds r10, r10, r6\n\t"
  140207. "adc r4, r4, r11\n\t"
  140208. #else
  140209. "umull r6, r7, r8, r7\n\t"
  140210. "adds r10, r10, r6\n\t"
  140211. "adc r4, r7, #0\n\t"
  140212. #endif
  140213. "adds r10, r10, r5\n\t"
  140214. "str r10, [%[a], #20]\n\t"
  140215. "adc r4, r4, #0\n\t"
  140216. /* a[i+6] += m[6] * mu */
  140217. "ldr r7, [%[m], #24]\n\t"
  140218. "ldr r10, [%[a], #24]\n\t"
  140219. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140220. "lsr r11, r7, #16\n\t"
  140221. "lsr r6, r8, #16\n\t"
  140222. "mul r5, r6, r11\n\t"
  140223. "lsl r11, r7, #16\n\t"
  140224. "lsr r11, r11, #16\n\t"
  140225. "mul r6, r11, r6\n\t"
  140226. "lsr r11, r6, #16\n\t"
  140227. "lsl r6, r6, #16\n\t"
  140228. "adds r10, r10, r6\n\t"
  140229. "adc r5, r5, r11\n\t"
  140230. "lsl r6, r8, #16\n\t"
  140231. "lsl r11, r7, #16\n\t"
  140232. "lsr r6, r6, #16\n\t"
  140233. "lsr r11, r11, #16\n\t"
  140234. "mul r11, r6, r11\n\t"
  140235. "adds r10, r10, r11\n\t"
  140236. "adc r5, r5, #0\n\t"
  140237. "lsr r11, r7, #16\n\t"
  140238. "mul r6, r11, r6\n\t"
  140239. "lsr r11, r6, #16\n\t"
  140240. "lsl r6, r6, #16\n\t"
  140241. "adds r10, r10, r6\n\t"
  140242. "adc r5, r5, r11\n\t"
  140243. #else
  140244. "umull r6, r7, r8, r7\n\t"
  140245. "adds r10, r10, r6\n\t"
  140246. "adc r5, r7, #0\n\t"
  140247. #endif
  140248. "adds r10, r10, r4\n\t"
  140249. "str r10, [%[a], #24]\n\t"
  140250. "adc r5, r5, #0\n\t"
  140251. /* a[i+7] += m[7] * mu */
  140252. "ldr r7, [%[m], #28]\n\t"
  140253. "ldr r10, [%[a], #28]\n\t"
  140254. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140255. "lsr r11, r7, #16\n\t"
  140256. "lsr r6, r8, #16\n\t"
  140257. "mul r4, r6, r11\n\t"
  140258. "lsl r11, r7, #16\n\t"
  140259. "lsr r11, r11, #16\n\t"
  140260. "mul r6, r11, r6\n\t"
  140261. "lsr r11, r6, #16\n\t"
  140262. "lsl r6, r6, #16\n\t"
  140263. "adds r10, r10, r6\n\t"
  140264. "adc r4, r4, r11\n\t"
  140265. "lsl r6, r8, #16\n\t"
  140266. "lsl r11, r7, #16\n\t"
  140267. "lsr r6, r6, #16\n\t"
  140268. "lsr r11, r11, #16\n\t"
  140269. "mul r11, r6, r11\n\t"
  140270. "adds r10, r10, r11\n\t"
  140271. "adc r4, r4, #0\n\t"
  140272. "lsr r11, r7, #16\n\t"
  140273. "mul r6, r11, r6\n\t"
  140274. "lsr r11, r6, #16\n\t"
  140275. "lsl r6, r6, #16\n\t"
  140276. "adds r10, r10, r6\n\t"
  140277. "adc r4, r4, r11\n\t"
  140278. #else
  140279. "umull r6, r7, r8, r7\n\t"
  140280. "adds r10, r10, r6\n\t"
  140281. "adc r4, r7, #0\n\t"
  140282. #endif
  140283. "adds r10, r10, r5\n\t"
  140284. "str r10, [%[a], #28]\n\t"
  140285. "adc r4, r4, #0\n\t"
  140286. /* a[i+8] += m[8] * mu */
  140287. "ldr r7, [%[m], #32]\n\t"
  140288. "ldr r10, [%[a], #32]\n\t"
  140289. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140290. "lsr r11, r7, #16\n\t"
  140291. "lsr r6, r8, #16\n\t"
  140292. "mul r5, r6, r11\n\t"
  140293. "lsl r11, r7, #16\n\t"
  140294. "lsr r11, r11, #16\n\t"
  140295. "mul r6, r11, r6\n\t"
  140296. "lsr r11, r6, #16\n\t"
  140297. "lsl r6, r6, #16\n\t"
  140298. "adds r10, r10, r6\n\t"
  140299. "adc r5, r5, r11\n\t"
  140300. "lsl r6, r8, #16\n\t"
  140301. "lsl r11, r7, #16\n\t"
  140302. "lsr r6, r6, #16\n\t"
  140303. "lsr r11, r11, #16\n\t"
  140304. "mul r11, r6, r11\n\t"
  140305. "adds r10, r10, r11\n\t"
  140306. "adc r5, r5, #0\n\t"
  140307. "lsr r11, r7, #16\n\t"
  140308. "mul r6, r11, r6\n\t"
  140309. "lsr r11, r6, #16\n\t"
  140310. "lsl r6, r6, #16\n\t"
  140311. "adds r10, r10, r6\n\t"
  140312. "adc r5, r5, r11\n\t"
  140313. #else
  140314. "umull r6, r7, r8, r7\n\t"
  140315. "adds r10, r10, r6\n\t"
  140316. "adc r5, r7, #0\n\t"
  140317. #endif
  140318. "adds r10, r10, r4\n\t"
  140319. "str r10, [%[a], #32]\n\t"
  140320. "adc r5, r5, #0\n\t"
  140321. /* a[i+9] += m[9] * mu */
  140322. "ldr r7, [%[m], #36]\n\t"
  140323. "ldr r10, [%[a], #36]\n\t"
  140324. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140325. "lsr r11, r7, #16\n\t"
  140326. "lsr r6, r8, #16\n\t"
  140327. "mul r4, r6, r11\n\t"
  140328. "lsl r11, r7, #16\n\t"
  140329. "lsr r11, r11, #16\n\t"
  140330. "mul r6, r11, r6\n\t"
  140331. "lsr r11, r6, #16\n\t"
  140332. "lsl r6, r6, #16\n\t"
  140333. "adds r10, r10, r6\n\t"
  140334. "adc r4, r4, r11\n\t"
  140335. "lsl r6, r8, #16\n\t"
  140336. "lsl r11, r7, #16\n\t"
  140337. "lsr r6, r6, #16\n\t"
  140338. "lsr r11, r11, #16\n\t"
  140339. "mul r11, r6, r11\n\t"
  140340. "adds r10, r10, r11\n\t"
  140341. "adc r4, r4, #0\n\t"
  140342. "lsr r11, r7, #16\n\t"
  140343. "mul r6, r11, r6\n\t"
  140344. "lsr r11, r6, #16\n\t"
  140345. "lsl r6, r6, #16\n\t"
  140346. "adds r10, r10, r6\n\t"
  140347. "adc r4, r4, r11\n\t"
  140348. #else
  140349. "umull r6, r7, r8, r7\n\t"
  140350. "adds r10, r10, r6\n\t"
  140351. "adc r4, r7, #0\n\t"
  140352. #endif
  140353. "adds r10, r10, r5\n\t"
  140354. "str r10, [%[a], #36]\n\t"
  140355. "adc r4, r4, #0\n\t"
  140356. /* a[i+10] += m[10] * mu */
  140357. "ldr r7, [%[m], #40]\n\t"
  140358. "ldr r10, [%[a], #40]\n\t"
  140359. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140360. "lsr r11, r7, #16\n\t"
  140361. "lsr r6, r8, #16\n\t"
  140362. "mul r5, r6, r11\n\t"
  140363. "lsl r11, r7, #16\n\t"
  140364. "lsr r11, r11, #16\n\t"
  140365. "mul r6, r11, r6\n\t"
  140366. "lsr r11, r6, #16\n\t"
  140367. "lsl r6, r6, #16\n\t"
  140368. "adds r10, r10, r6\n\t"
  140369. "adc r5, r5, r11\n\t"
  140370. "lsl r6, r8, #16\n\t"
  140371. "lsl r11, r7, #16\n\t"
  140372. "lsr r6, r6, #16\n\t"
  140373. "lsr r11, r11, #16\n\t"
  140374. "mul r11, r6, r11\n\t"
  140375. "adds r10, r10, r11\n\t"
  140376. "adc r5, r5, #0\n\t"
  140377. "lsr r11, r7, #16\n\t"
  140378. "mul r6, r11, r6\n\t"
  140379. "lsr r11, r6, #16\n\t"
  140380. "lsl r6, r6, #16\n\t"
  140381. "adds r10, r10, r6\n\t"
  140382. "adc r5, r5, r11\n\t"
  140383. #else
  140384. "umull r6, r7, r8, r7\n\t"
  140385. "adds r10, r10, r6\n\t"
  140386. "adc r5, r7, #0\n\t"
  140387. #endif
  140388. "adds r10, r10, r4\n\t"
  140389. "str r10, [%[a], #40]\n\t"
  140390. "adc r5, r5, #0\n\t"
  140391. /* a[i+11] += m[11] * mu */
  140392. "ldr r7, [%[m], #44]\n\t"
  140393. "ldr r10, [%[a], #44]\n\t"
  140394. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140395. "lsr r11, r7, #16\n\t"
  140396. "lsr r6, r8, #16\n\t"
  140397. "mul r4, r6, r11\n\t"
  140398. "lsl r11, r7, #16\n\t"
  140399. "lsr r11, r11, #16\n\t"
  140400. "mul r6, r11, r6\n\t"
  140401. "lsr r11, r6, #16\n\t"
  140402. "lsl r6, r6, #16\n\t"
  140403. "adds r10, r10, r6\n\t"
  140404. "adc r4, r4, r11\n\t"
  140405. "lsl r6, r8, #16\n\t"
  140406. "lsl r11, r7, #16\n\t"
  140407. "lsr r6, r6, #16\n\t"
  140408. "lsr r11, r11, #16\n\t"
  140409. "mul r11, r6, r11\n\t"
  140410. "adds r10, r10, r11\n\t"
  140411. "adc r4, r4, #0\n\t"
  140412. "lsr r11, r7, #16\n\t"
  140413. "mul r6, r11, r6\n\t"
  140414. "lsr r11, r6, #16\n\t"
  140415. "lsl r6, r6, #16\n\t"
  140416. "adds r10, r10, r6\n\t"
  140417. "adc r4, r4, r11\n\t"
  140418. #else
  140419. "umull r6, r7, r8, r7\n\t"
  140420. "adds r10, r10, r6\n\t"
  140421. "adc r4, r7, #0\n\t"
  140422. #endif
  140423. "adds r10, r10, r5\n\t"
  140424. "str r10, [%[a], #44]\n\t"
  140425. "adc r4, r4, #0\n\t"
  140426. /* a[i+12] += m[12] * mu */
  140427. "ldr r7, [%[m], #48]\n\t"
  140428. "ldr r10, [%[a], #48]\n\t"
  140429. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140430. "lsr r11, r7, #16\n\t"
  140431. "lsr r6, r8, #16\n\t"
  140432. "mul r5, r6, r11\n\t"
  140433. "lsl r11, r7, #16\n\t"
  140434. "lsr r11, r11, #16\n\t"
  140435. "mul r6, r11, r6\n\t"
  140436. "lsr r11, r6, #16\n\t"
  140437. "lsl r6, r6, #16\n\t"
  140438. "adds r10, r10, r6\n\t"
  140439. "adc r5, r5, r11\n\t"
  140440. "lsl r6, r8, #16\n\t"
  140441. "lsl r11, r7, #16\n\t"
  140442. "lsr r6, r6, #16\n\t"
  140443. "lsr r11, r11, #16\n\t"
  140444. "mul r11, r6, r11\n\t"
  140445. "adds r10, r10, r11\n\t"
  140446. "adc r5, r5, #0\n\t"
  140447. "lsr r11, r7, #16\n\t"
  140448. "mul r6, r11, r6\n\t"
  140449. "lsr r11, r6, #16\n\t"
  140450. "lsl r6, r6, #16\n\t"
  140451. "adds r10, r10, r6\n\t"
  140452. "adc r5, r5, r11\n\t"
  140453. #else
  140454. "umull r6, r7, r8, r7\n\t"
  140455. "adds r10, r10, r6\n\t"
  140456. "adc r5, r7, #0\n\t"
  140457. #endif
  140458. "adds r10, r10, r4\n\t"
  140459. "str r10, [%[a], #48]\n\t"
  140460. "adc r5, r5, #0\n\t"
  140461. /* a[i+13] += m[13] * mu */
  140462. "ldr r7, [%[m], #52]\n\t"
  140463. "ldr r10, [%[a], #52]\n\t"
  140464. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140465. "lsr r11, r7, #16\n\t"
  140466. "lsr r6, r8, #16\n\t"
  140467. "mul r4, r6, r11\n\t"
  140468. "lsl r11, r7, #16\n\t"
  140469. "lsr r11, r11, #16\n\t"
  140470. "mul r6, r11, r6\n\t"
  140471. "lsr r11, r6, #16\n\t"
  140472. "lsl r6, r6, #16\n\t"
  140473. "adds r10, r10, r6\n\t"
  140474. "adc r4, r4, r11\n\t"
  140475. "lsl r6, r8, #16\n\t"
  140476. "lsl r11, r7, #16\n\t"
  140477. "lsr r6, r6, #16\n\t"
  140478. "lsr r11, r11, #16\n\t"
  140479. "mul r11, r6, r11\n\t"
  140480. "adds r10, r10, r11\n\t"
  140481. "adc r4, r4, #0\n\t"
  140482. "lsr r11, r7, #16\n\t"
  140483. "mul r6, r11, r6\n\t"
  140484. "lsr r11, r6, #16\n\t"
  140485. "lsl r6, r6, #16\n\t"
  140486. "adds r10, r10, r6\n\t"
  140487. "adc r4, r4, r11\n\t"
  140488. #else
  140489. "umull r6, r7, r8, r7\n\t"
  140490. "adds r10, r10, r6\n\t"
  140491. "adc r4, r7, #0\n\t"
  140492. #endif
  140493. "adds r10, r10, r5\n\t"
  140494. "str r10, [%[a], #52]\n\t"
  140495. "adc r4, r4, #0\n\t"
  140496. /* a[i+14] += m[14] * mu */
  140497. "ldr r7, [%[m], #56]\n\t"
  140498. "ldr r10, [%[a], #56]\n\t"
  140499. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140500. "lsr r11, r7, #16\n\t"
  140501. "lsr r6, r8, #16\n\t"
  140502. "mul r5, r6, r11\n\t"
  140503. "lsl r11, r7, #16\n\t"
  140504. "lsr r11, r11, #16\n\t"
  140505. "mul r6, r11, r6\n\t"
  140506. "lsr r11, r6, #16\n\t"
  140507. "lsl r6, r6, #16\n\t"
  140508. "adds r10, r10, r6\n\t"
  140509. "adc r5, r5, r11\n\t"
  140510. "lsl r6, r8, #16\n\t"
  140511. "lsl r11, r7, #16\n\t"
  140512. "lsr r6, r6, #16\n\t"
  140513. "lsr r11, r11, #16\n\t"
  140514. "mul r11, r6, r11\n\t"
  140515. "adds r10, r10, r11\n\t"
  140516. "adc r5, r5, #0\n\t"
  140517. "lsr r11, r7, #16\n\t"
  140518. "mul r6, r11, r6\n\t"
  140519. "lsr r11, r6, #16\n\t"
  140520. "lsl r6, r6, #16\n\t"
  140521. "adds r10, r10, r6\n\t"
  140522. "adc r5, r5, r11\n\t"
  140523. #else
  140524. "umull r6, r7, r8, r7\n\t"
  140525. "adds r10, r10, r6\n\t"
  140526. "adc r5, r7, #0\n\t"
  140527. #endif
  140528. "adds r10, r10, r4\n\t"
  140529. "str r10, [%[a], #56]\n\t"
  140530. "adc r5, r5, #0\n\t"
  140531. /* a[i+15] += m[15] * mu */
  140532. "ldr r7, [%[m], #60]\n\t"
  140533. "ldr r10, [%[a], #60]\n\t"
  140534. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140535. "lsr r11, r7, #16\n\t"
  140536. "lsr r6, r8, #16\n\t"
  140537. "mul r4, r6, r11\n\t"
  140538. "lsl r11, r7, #16\n\t"
  140539. "lsr r11, r11, #16\n\t"
  140540. "mul r6, r11, r6\n\t"
  140541. "lsr r11, r6, #16\n\t"
  140542. "lsl r6, r6, #16\n\t"
  140543. "adds r10, r10, r6\n\t"
  140544. "adc r4, r4, r11\n\t"
  140545. "lsl r6, r8, #16\n\t"
  140546. "lsl r11, r7, #16\n\t"
  140547. "lsr r6, r6, #16\n\t"
  140548. "lsr r11, r11, #16\n\t"
  140549. "mul r11, r6, r11\n\t"
  140550. "adds r10, r10, r11\n\t"
  140551. "adc r4, r4, #0\n\t"
  140552. "lsr r11, r7, #16\n\t"
  140553. "mul r6, r11, r6\n\t"
  140554. "lsr r11, r6, #16\n\t"
  140555. "lsl r6, r6, #16\n\t"
  140556. "adds r10, r10, r6\n\t"
  140557. "adc r4, r4, r11\n\t"
  140558. #else
  140559. "umull r6, r7, r8, r7\n\t"
  140560. "adds r10, r10, r6\n\t"
  140561. "adc r4, r7, #0\n\t"
  140562. #endif
  140563. "adds r10, r10, r5\n\t"
  140564. "str r10, [%[a], #60]\n\t"
  140565. "adc r4, r4, #0\n\t"
  140566. /* a[i+16] += m[16] * mu */
  140567. "ldr r7, [%[m], #64]\n\t"
  140568. "ldr r10, [%[a], #64]\n\t"
  140569. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140570. "lsr r11, r7, #16\n\t"
  140571. "lsr r6, r8, #16\n\t"
  140572. "mul r5, r6, r11\n\t"
  140573. "lsl r11, r7, #16\n\t"
  140574. "lsr r11, r11, #16\n\t"
  140575. "mul r6, r11, r6\n\t"
  140576. "lsr r11, r6, #16\n\t"
  140577. "lsl r6, r6, #16\n\t"
  140578. "adds r10, r10, r6\n\t"
  140579. "adc r5, r5, r11\n\t"
  140580. "lsl r6, r8, #16\n\t"
  140581. "lsl r11, r7, #16\n\t"
  140582. "lsr r6, r6, #16\n\t"
  140583. "lsr r11, r11, #16\n\t"
  140584. "mul r11, r6, r11\n\t"
  140585. "adds r10, r10, r11\n\t"
  140586. "adc r5, r5, #0\n\t"
  140587. "lsr r11, r7, #16\n\t"
  140588. "mul r6, r11, r6\n\t"
  140589. "lsr r11, r6, #16\n\t"
  140590. "lsl r6, r6, #16\n\t"
  140591. "adds r10, r10, r6\n\t"
  140592. "adc r5, r5, r11\n\t"
  140593. #else
  140594. "umull r6, r7, r8, r7\n\t"
  140595. "adds r10, r10, r6\n\t"
  140596. "adc r5, r7, #0\n\t"
  140597. #endif
  140598. "adds r10, r10, r4\n\t"
  140599. "str r10, [%[a], #64]\n\t"
  140600. "adc r5, r5, #0\n\t"
  140601. /* a[i+17] += m[17] * mu */
  140602. "ldr r7, [%[m], #68]\n\t"
  140603. "ldr r10, [%[a], #68]\n\t"
  140604. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140605. "lsr r11, r7, #16\n\t"
  140606. "lsr r6, r8, #16\n\t"
  140607. "mul r4, r6, r11\n\t"
  140608. "lsl r11, r7, #16\n\t"
  140609. "lsr r11, r11, #16\n\t"
  140610. "mul r6, r11, r6\n\t"
  140611. "lsr r11, r6, #16\n\t"
  140612. "lsl r6, r6, #16\n\t"
  140613. "adds r10, r10, r6\n\t"
  140614. "adc r4, r4, r11\n\t"
  140615. "lsl r6, r8, #16\n\t"
  140616. "lsl r11, r7, #16\n\t"
  140617. "lsr r6, r6, #16\n\t"
  140618. "lsr r11, r11, #16\n\t"
  140619. "mul r11, r6, r11\n\t"
  140620. "adds r10, r10, r11\n\t"
  140621. "adc r4, r4, #0\n\t"
  140622. "lsr r11, r7, #16\n\t"
  140623. "mul r6, r11, r6\n\t"
  140624. "lsr r11, r6, #16\n\t"
  140625. "lsl r6, r6, #16\n\t"
  140626. "adds r10, r10, r6\n\t"
  140627. "adc r4, r4, r11\n\t"
  140628. #else
  140629. "umull r6, r7, r8, r7\n\t"
  140630. "adds r10, r10, r6\n\t"
  140631. "adc r4, r7, #0\n\t"
  140632. #endif
  140633. "adds r10, r10, r5\n\t"
  140634. "str r10, [%[a], #68]\n\t"
  140635. "adc r4, r4, #0\n\t"
  140636. /* a[i+18] += m[18] * mu */
  140637. "ldr r7, [%[m], #72]\n\t"
  140638. "ldr r10, [%[a], #72]\n\t"
  140639. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140640. "lsr r11, r7, #16\n\t"
  140641. "lsr r6, r8, #16\n\t"
  140642. "mul r5, r6, r11\n\t"
  140643. "lsl r11, r7, #16\n\t"
  140644. "lsr r11, r11, #16\n\t"
  140645. "mul r6, r11, r6\n\t"
  140646. "lsr r11, r6, #16\n\t"
  140647. "lsl r6, r6, #16\n\t"
  140648. "adds r10, r10, r6\n\t"
  140649. "adc r5, r5, r11\n\t"
  140650. "lsl r6, r8, #16\n\t"
  140651. "lsl r11, r7, #16\n\t"
  140652. "lsr r6, r6, #16\n\t"
  140653. "lsr r11, r11, #16\n\t"
  140654. "mul r11, r6, r11\n\t"
  140655. "adds r10, r10, r11\n\t"
  140656. "adc r5, r5, #0\n\t"
  140657. "lsr r11, r7, #16\n\t"
  140658. "mul r6, r11, r6\n\t"
  140659. "lsr r11, r6, #16\n\t"
  140660. "lsl r6, r6, #16\n\t"
  140661. "adds r10, r10, r6\n\t"
  140662. "adc r5, r5, r11\n\t"
  140663. #else
  140664. "umull r6, r7, r8, r7\n\t"
  140665. "adds r10, r10, r6\n\t"
  140666. "adc r5, r7, #0\n\t"
  140667. #endif
  140668. "adds r10, r10, r4\n\t"
  140669. "str r10, [%[a], #72]\n\t"
  140670. "adc r5, r5, #0\n\t"
  140671. /* a[i+19] += m[19] * mu */
  140672. "ldr r7, [%[m], #76]\n\t"
  140673. "ldr r10, [%[a], #76]\n\t"
  140674. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140675. "lsr r11, r7, #16\n\t"
  140676. "lsr r6, r8, #16\n\t"
  140677. "mul r4, r6, r11\n\t"
  140678. "lsl r11, r7, #16\n\t"
  140679. "lsr r11, r11, #16\n\t"
  140680. "mul r6, r11, r6\n\t"
  140681. "lsr r11, r6, #16\n\t"
  140682. "lsl r6, r6, #16\n\t"
  140683. "adds r10, r10, r6\n\t"
  140684. "adc r4, r4, r11\n\t"
  140685. "lsl r6, r8, #16\n\t"
  140686. "lsl r11, r7, #16\n\t"
  140687. "lsr r6, r6, #16\n\t"
  140688. "lsr r11, r11, #16\n\t"
  140689. "mul r11, r6, r11\n\t"
  140690. "adds r10, r10, r11\n\t"
  140691. "adc r4, r4, #0\n\t"
  140692. "lsr r11, r7, #16\n\t"
  140693. "mul r6, r11, r6\n\t"
  140694. "lsr r11, r6, #16\n\t"
  140695. "lsl r6, r6, #16\n\t"
  140696. "adds r10, r10, r6\n\t"
  140697. "adc r4, r4, r11\n\t"
  140698. #else
  140699. "umull r6, r7, r8, r7\n\t"
  140700. "adds r10, r10, r6\n\t"
  140701. "adc r4, r7, #0\n\t"
  140702. #endif
  140703. "adds r10, r10, r5\n\t"
  140704. "str r10, [%[a], #76]\n\t"
  140705. "adc r4, r4, #0\n\t"
  140706. /* a[i+20] += m[20] * mu */
  140707. "ldr r7, [%[m], #80]\n\t"
  140708. "ldr r10, [%[a], #80]\n\t"
  140709. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140710. "lsr r11, r7, #16\n\t"
  140711. "lsr r6, r8, #16\n\t"
  140712. "mul r5, r6, r11\n\t"
  140713. "lsl r11, r7, #16\n\t"
  140714. "lsr r11, r11, #16\n\t"
  140715. "mul r6, r11, r6\n\t"
  140716. "lsr r11, r6, #16\n\t"
  140717. "lsl r6, r6, #16\n\t"
  140718. "adds r10, r10, r6\n\t"
  140719. "adc r5, r5, r11\n\t"
  140720. "lsl r6, r8, #16\n\t"
  140721. "lsl r11, r7, #16\n\t"
  140722. "lsr r6, r6, #16\n\t"
  140723. "lsr r11, r11, #16\n\t"
  140724. "mul r11, r6, r11\n\t"
  140725. "adds r10, r10, r11\n\t"
  140726. "adc r5, r5, #0\n\t"
  140727. "lsr r11, r7, #16\n\t"
  140728. "mul r6, r11, r6\n\t"
  140729. "lsr r11, r6, #16\n\t"
  140730. "lsl r6, r6, #16\n\t"
  140731. "adds r10, r10, r6\n\t"
  140732. "adc r5, r5, r11\n\t"
  140733. #else
  140734. "umull r6, r7, r8, r7\n\t"
  140735. "adds r10, r10, r6\n\t"
  140736. "adc r5, r7, #0\n\t"
  140737. #endif
  140738. "adds r10, r10, r4\n\t"
  140739. "str r10, [%[a], #80]\n\t"
  140740. "adc r5, r5, #0\n\t"
  140741. /* a[i+21] += m[21] * mu */
  140742. "ldr r7, [%[m], #84]\n\t"
  140743. "ldr r10, [%[a], #84]\n\t"
  140744. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140745. "lsr r11, r7, #16\n\t"
  140746. "lsr r6, r8, #16\n\t"
  140747. "mul r4, r6, r11\n\t"
  140748. "lsl r11, r7, #16\n\t"
  140749. "lsr r11, r11, #16\n\t"
  140750. "mul r6, r11, r6\n\t"
  140751. "lsr r11, r6, #16\n\t"
  140752. "lsl r6, r6, #16\n\t"
  140753. "adds r10, r10, r6\n\t"
  140754. "adc r4, r4, r11\n\t"
  140755. "lsl r6, r8, #16\n\t"
  140756. "lsl r11, r7, #16\n\t"
  140757. "lsr r6, r6, #16\n\t"
  140758. "lsr r11, r11, #16\n\t"
  140759. "mul r11, r6, r11\n\t"
  140760. "adds r10, r10, r11\n\t"
  140761. "adc r4, r4, #0\n\t"
  140762. "lsr r11, r7, #16\n\t"
  140763. "mul r6, r11, r6\n\t"
  140764. "lsr r11, r6, #16\n\t"
  140765. "lsl r6, r6, #16\n\t"
  140766. "adds r10, r10, r6\n\t"
  140767. "adc r4, r4, r11\n\t"
  140768. #else
  140769. "umull r6, r7, r8, r7\n\t"
  140770. "adds r10, r10, r6\n\t"
  140771. "adc r4, r7, #0\n\t"
  140772. #endif
  140773. "adds r10, r10, r5\n\t"
  140774. "str r10, [%[a], #84]\n\t"
  140775. "adc r4, r4, #0\n\t"
  140776. /* a[i+22] += m[22] * mu */
  140777. "ldr r7, [%[m], #88]\n\t"
  140778. "ldr r10, [%[a], #88]\n\t"
  140779. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140780. "lsr r11, r7, #16\n\t"
  140781. "lsr r6, r8, #16\n\t"
  140782. "mul r5, r6, r11\n\t"
  140783. "lsl r11, r7, #16\n\t"
  140784. "lsr r11, r11, #16\n\t"
  140785. "mul r6, r11, r6\n\t"
  140786. "lsr r11, r6, #16\n\t"
  140787. "lsl r6, r6, #16\n\t"
  140788. "adds r10, r10, r6\n\t"
  140789. "adc r5, r5, r11\n\t"
  140790. "lsl r6, r8, #16\n\t"
  140791. "lsl r11, r7, #16\n\t"
  140792. "lsr r6, r6, #16\n\t"
  140793. "lsr r11, r11, #16\n\t"
  140794. "mul r11, r6, r11\n\t"
  140795. "adds r10, r10, r11\n\t"
  140796. "adc r5, r5, #0\n\t"
  140797. "lsr r11, r7, #16\n\t"
  140798. "mul r6, r11, r6\n\t"
  140799. "lsr r11, r6, #16\n\t"
  140800. "lsl r6, r6, #16\n\t"
  140801. "adds r10, r10, r6\n\t"
  140802. "adc r5, r5, r11\n\t"
  140803. #else
  140804. "umull r6, r7, r8, r7\n\t"
  140805. "adds r10, r10, r6\n\t"
  140806. "adc r5, r7, #0\n\t"
  140807. #endif
  140808. "adds r10, r10, r4\n\t"
  140809. "str r10, [%[a], #88]\n\t"
  140810. "adc r5, r5, #0\n\t"
  140811. /* a[i+23] += m[23] * mu */
  140812. "ldr r7, [%[m], #92]\n\t"
  140813. "ldr r10, [%[a], #92]\n\t"
  140814. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140815. "lsr r11, r7, #16\n\t"
  140816. "lsr r6, r8, #16\n\t"
  140817. "mul r4, r6, r11\n\t"
  140818. "lsl r11, r7, #16\n\t"
  140819. "lsr r11, r11, #16\n\t"
  140820. "mul r6, r11, r6\n\t"
  140821. "lsr r11, r6, #16\n\t"
  140822. "lsl r6, r6, #16\n\t"
  140823. "adds r10, r10, r6\n\t"
  140824. "adc r4, r4, r11\n\t"
  140825. "lsl r6, r8, #16\n\t"
  140826. "lsl r11, r7, #16\n\t"
  140827. "lsr r6, r6, #16\n\t"
  140828. "lsr r11, r11, #16\n\t"
  140829. "mul r11, r6, r11\n\t"
  140830. "adds r10, r10, r11\n\t"
  140831. "adc r4, r4, #0\n\t"
  140832. "lsr r11, r7, #16\n\t"
  140833. "mul r6, r11, r6\n\t"
  140834. "lsr r11, r6, #16\n\t"
  140835. "lsl r6, r6, #16\n\t"
  140836. "adds r10, r10, r6\n\t"
  140837. "adc r4, r4, r11\n\t"
  140838. #else
  140839. "umull r6, r7, r8, r7\n\t"
  140840. "adds r10, r10, r6\n\t"
  140841. "adc r4, r7, #0\n\t"
  140842. #endif
  140843. "adds r10, r10, r5\n\t"
  140844. "str r10, [%[a], #92]\n\t"
  140845. "adc r4, r4, #0\n\t"
  140846. /* a[i+24] += m[24] * mu */
  140847. "ldr r7, [%[m], #96]\n\t"
  140848. "ldr r10, [%[a], #96]\n\t"
  140849. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140850. "lsr r11, r7, #16\n\t"
  140851. "lsr r6, r8, #16\n\t"
  140852. "mul r5, r6, r11\n\t"
  140853. "lsl r11, r7, #16\n\t"
  140854. "lsr r11, r11, #16\n\t"
  140855. "mul r6, r11, r6\n\t"
  140856. "lsr r11, r6, #16\n\t"
  140857. "lsl r6, r6, #16\n\t"
  140858. "adds r10, r10, r6\n\t"
  140859. "adc r5, r5, r11\n\t"
  140860. "lsl r6, r8, #16\n\t"
  140861. "lsl r11, r7, #16\n\t"
  140862. "lsr r6, r6, #16\n\t"
  140863. "lsr r11, r11, #16\n\t"
  140864. "mul r11, r6, r11\n\t"
  140865. "adds r10, r10, r11\n\t"
  140866. "adc r5, r5, #0\n\t"
  140867. "lsr r11, r7, #16\n\t"
  140868. "mul r6, r11, r6\n\t"
  140869. "lsr r11, r6, #16\n\t"
  140870. "lsl r6, r6, #16\n\t"
  140871. "adds r10, r10, r6\n\t"
  140872. "adc r5, r5, r11\n\t"
  140873. #else
  140874. "umull r6, r7, r8, r7\n\t"
  140875. "adds r10, r10, r6\n\t"
  140876. "adc r5, r7, #0\n\t"
  140877. #endif
  140878. "adds r10, r10, r4\n\t"
  140879. "str r10, [%[a], #96]\n\t"
  140880. "adc r5, r5, #0\n\t"
  140881. /* a[i+25] += m[25] * mu */
  140882. "ldr r7, [%[m], #100]\n\t"
  140883. "ldr r10, [%[a], #100]\n\t"
  140884. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140885. "lsr r11, r7, #16\n\t"
  140886. "lsr r6, r8, #16\n\t"
  140887. "mul r4, r6, r11\n\t"
  140888. "lsl r11, r7, #16\n\t"
  140889. "lsr r11, r11, #16\n\t"
  140890. "mul r6, r11, r6\n\t"
  140891. "lsr r11, r6, #16\n\t"
  140892. "lsl r6, r6, #16\n\t"
  140893. "adds r10, r10, r6\n\t"
  140894. "adc r4, r4, r11\n\t"
  140895. "lsl r6, r8, #16\n\t"
  140896. "lsl r11, r7, #16\n\t"
  140897. "lsr r6, r6, #16\n\t"
  140898. "lsr r11, r11, #16\n\t"
  140899. "mul r11, r6, r11\n\t"
  140900. "adds r10, r10, r11\n\t"
  140901. "adc r4, r4, #0\n\t"
  140902. "lsr r11, r7, #16\n\t"
  140903. "mul r6, r11, r6\n\t"
  140904. "lsr r11, r6, #16\n\t"
  140905. "lsl r6, r6, #16\n\t"
  140906. "adds r10, r10, r6\n\t"
  140907. "adc r4, r4, r11\n\t"
  140908. #else
  140909. "umull r6, r7, r8, r7\n\t"
  140910. "adds r10, r10, r6\n\t"
  140911. "adc r4, r7, #0\n\t"
  140912. #endif
  140913. "adds r10, r10, r5\n\t"
  140914. "str r10, [%[a], #100]\n\t"
  140915. "adc r4, r4, #0\n\t"
  140916. /* a[i+26] += m[26] * mu */
  140917. "ldr r7, [%[m], #104]\n\t"
  140918. "ldr r10, [%[a], #104]\n\t"
  140919. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140920. "lsr r11, r7, #16\n\t"
  140921. "lsr r6, r8, #16\n\t"
  140922. "mul r5, r6, r11\n\t"
  140923. "lsl r11, r7, #16\n\t"
  140924. "lsr r11, r11, #16\n\t"
  140925. "mul r6, r11, r6\n\t"
  140926. "lsr r11, r6, #16\n\t"
  140927. "lsl r6, r6, #16\n\t"
  140928. "adds r10, r10, r6\n\t"
  140929. "adc r5, r5, r11\n\t"
  140930. "lsl r6, r8, #16\n\t"
  140931. "lsl r11, r7, #16\n\t"
  140932. "lsr r6, r6, #16\n\t"
  140933. "lsr r11, r11, #16\n\t"
  140934. "mul r11, r6, r11\n\t"
  140935. "adds r10, r10, r11\n\t"
  140936. "adc r5, r5, #0\n\t"
  140937. "lsr r11, r7, #16\n\t"
  140938. "mul r6, r11, r6\n\t"
  140939. "lsr r11, r6, #16\n\t"
  140940. "lsl r6, r6, #16\n\t"
  140941. "adds r10, r10, r6\n\t"
  140942. "adc r5, r5, r11\n\t"
  140943. #else
  140944. "umull r6, r7, r8, r7\n\t"
  140945. "adds r10, r10, r6\n\t"
  140946. "adc r5, r7, #0\n\t"
  140947. #endif
  140948. "adds r10, r10, r4\n\t"
  140949. "str r10, [%[a], #104]\n\t"
  140950. "adc r5, r5, #0\n\t"
  140951. /* a[i+27] += m[27] * mu */
  140952. "ldr r7, [%[m], #108]\n\t"
  140953. "ldr r10, [%[a], #108]\n\t"
  140954. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140955. "lsr r11, r7, #16\n\t"
  140956. "lsr r6, r8, #16\n\t"
  140957. "mul r4, r6, r11\n\t"
  140958. "lsl r11, r7, #16\n\t"
  140959. "lsr r11, r11, #16\n\t"
  140960. "mul r6, r11, r6\n\t"
  140961. "lsr r11, r6, #16\n\t"
  140962. "lsl r6, r6, #16\n\t"
  140963. "adds r10, r10, r6\n\t"
  140964. "adc r4, r4, r11\n\t"
  140965. "lsl r6, r8, #16\n\t"
  140966. "lsl r11, r7, #16\n\t"
  140967. "lsr r6, r6, #16\n\t"
  140968. "lsr r11, r11, #16\n\t"
  140969. "mul r11, r6, r11\n\t"
  140970. "adds r10, r10, r11\n\t"
  140971. "adc r4, r4, #0\n\t"
  140972. "lsr r11, r7, #16\n\t"
  140973. "mul r6, r11, r6\n\t"
  140974. "lsr r11, r6, #16\n\t"
  140975. "lsl r6, r6, #16\n\t"
  140976. "adds r10, r10, r6\n\t"
  140977. "adc r4, r4, r11\n\t"
  140978. #else
  140979. "umull r6, r7, r8, r7\n\t"
  140980. "adds r10, r10, r6\n\t"
  140981. "adc r4, r7, #0\n\t"
  140982. #endif
  140983. "adds r10, r10, r5\n\t"
  140984. "str r10, [%[a], #108]\n\t"
  140985. "adc r4, r4, #0\n\t"
  140986. /* a[i+28] += m[28] * mu */
  140987. "ldr r7, [%[m], #112]\n\t"
  140988. "ldr r10, [%[a], #112]\n\t"
  140989. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  140990. "lsr r11, r7, #16\n\t"
  140991. "lsr r6, r8, #16\n\t"
  140992. "mul r5, r6, r11\n\t"
  140993. "lsl r11, r7, #16\n\t"
  140994. "lsr r11, r11, #16\n\t"
  140995. "mul r6, r11, r6\n\t"
  140996. "lsr r11, r6, #16\n\t"
  140997. "lsl r6, r6, #16\n\t"
  140998. "adds r10, r10, r6\n\t"
  140999. "adc r5, r5, r11\n\t"
  141000. "lsl r6, r8, #16\n\t"
  141001. "lsl r11, r7, #16\n\t"
  141002. "lsr r6, r6, #16\n\t"
  141003. "lsr r11, r11, #16\n\t"
  141004. "mul r11, r6, r11\n\t"
  141005. "adds r10, r10, r11\n\t"
  141006. "adc r5, r5, #0\n\t"
  141007. "lsr r11, r7, #16\n\t"
  141008. "mul r6, r11, r6\n\t"
  141009. "lsr r11, r6, #16\n\t"
  141010. "lsl r6, r6, #16\n\t"
  141011. "adds r10, r10, r6\n\t"
  141012. "adc r5, r5, r11\n\t"
  141013. #else
  141014. "umull r6, r7, r8, r7\n\t"
  141015. "adds r10, r10, r6\n\t"
  141016. "adc r5, r7, #0\n\t"
  141017. #endif
  141018. "adds r10, r10, r4\n\t"
  141019. "str r10, [%[a], #112]\n\t"
  141020. "adc r5, r5, #0\n\t"
  141021. /* a[i+29] += m[29] * mu */
  141022. "ldr r7, [%[m], #116]\n\t"
  141023. "ldr r10, [%[a], #116]\n\t"
  141024. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  141025. "lsr r11, r7, #16\n\t"
  141026. "lsr r6, r8, #16\n\t"
  141027. "mul r4, r6, r11\n\t"
  141028. "lsl r11, r7, #16\n\t"
  141029. "lsr r11, r11, #16\n\t"
  141030. "mul r6, r11, r6\n\t"
  141031. "lsr r11, r6, #16\n\t"
  141032. "lsl r6, r6, #16\n\t"
  141033. "adds r10, r10, r6\n\t"
  141034. "adc r4, r4, r11\n\t"
  141035. "lsl r6, r8, #16\n\t"
  141036. "lsl r11, r7, #16\n\t"
  141037. "lsr r6, r6, #16\n\t"
  141038. "lsr r11, r11, #16\n\t"
  141039. "mul r11, r6, r11\n\t"
  141040. "adds r10, r10, r11\n\t"
  141041. "adc r4, r4, #0\n\t"
  141042. "lsr r11, r7, #16\n\t"
  141043. "mul r6, r11, r6\n\t"
  141044. "lsr r11, r6, #16\n\t"
  141045. "lsl r6, r6, #16\n\t"
  141046. "adds r10, r10, r6\n\t"
  141047. "adc r4, r4, r11\n\t"
  141048. #else
  141049. "umull r6, r7, r8, r7\n\t"
  141050. "adds r10, r10, r6\n\t"
  141051. "adc r4, r7, #0\n\t"
  141052. #endif
  141053. "adds r10, r10, r5\n\t"
  141054. "str r10, [%[a], #116]\n\t"
  141055. "adc r4, r4, #0\n\t"
  141056. /* a[i+30] += m[30] * mu */
  141057. "ldr r7, [%[m], #120]\n\t"
  141058. "ldr r10, [%[a], #120]\n\t"
  141059. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  141060. "lsr r11, r7, #16\n\t"
  141061. "lsr r6, r8, #16\n\t"
  141062. "mul r5, r6, r11\n\t"
  141063. "lsl r11, r7, #16\n\t"
  141064. "lsr r11, r11, #16\n\t"
  141065. "mul r6, r11, r6\n\t"
  141066. "lsr r11, r6, #16\n\t"
  141067. "lsl r6, r6, #16\n\t"
  141068. "adds r10, r10, r6\n\t"
  141069. "adc r5, r5, r11\n\t"
  141070. "lsl r6, r8, #16\n\t"
  141071. "lsl r11, r7, #16\n\t"
  141072. "lsr r6, r6, #16\n\t"
  141073. "lsr r11, r11, #16\n\t"
  141074. "mul r11, r6, r11\n\t"
  141075. "adds r10, r10, r11\n\t"
  141076. "adc r5, r5, #0\n\t"
  141077. "lsr r11, r7, #16\n\t"
  141078. "mul r6, r11, r6\n\t"
  141079. "lsr r11, r6, #16\n\t"
  141080. "lsl r6, r6, #16\n\t"
  141081. "adds r10, r10, r6\n\t"
  141082. "adc r5, r5, r11\n\t"
  141083. #else
  141084. "umull r6, r7, r8, r7\n\t"
  141085. "adds r10, r10, r6\n\t"
  141086. "adc r5, r7, #0\n\t"
  141087. #endif
  141088. "adds r10, r10, r4\n\t"
  141089. "str r10, [%[a], #120]\n\t"
  141090. "adc r5, r5, #0\n\t"
  141091. /* a[i+31] += m[31] * mu */
  141092. #if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4))
  141093. "ldr r7, [%[m], #124]\n\t"
  141094. #else
  141095. "ldr r11, [%[m], #124]\n\t"
  141096. #endif
  141097. "ldr r10, [%[a], #124]\n\t"
  141098. #if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)
  141099. "lsl r6, r8, #16\n\t"
  141100. "lsl r7, r11, #16\n\t"
  141101. "lsr r6, r6, #16\n\t"
  141102. "lsr r7, r7, #16\n\t"
  141103. "mul r7, r6, r7\n\t"
  141104. "adds r5, r5, r7\n\t"
  141105. "adcs r4, r3, #0\n\t"
  141106. "mov r3, #0\n\t"
  141107. "adc r3, r3, r3\n\t"
  141108. "lsr r7, r11, #16\n\t"
  141109. "mul r6, r7, r6\n\t"
  141110. "lsr r7, r6, #16\n\t"
  141111. "lsl r6, r6, #16\n\t"
  141112. "adds r5, r5, r6\n\t"
  141113. "adcs r4, r4, r7\n\t"
  141114. "adc r3, r3, #0\n\t"
  141115. "mov r6, r8\n\t"
  141116. "lsr r7, r11, #16\n\t"
  141117. "lsr r6, r6, #16\n\t"
  141118. "mul r7, r6, r7\n\t"
  141119. "adds r4, r4, r7\n\t"
  141120. "lsl r7, r11, #16\n\t"
  141121. "adc r3, r3, #0\n\t"
  141122. "lsr r7, r7, #16\n\t"
  141123. "mul r6, r7, r6\n\t"
  141124. "lsr r7, r6, #16\n\t"
  141125. "lsl r6, r6, #16\n\t"
  141126. "adds r5, r5, r6\n\t"
  141127. "adcs r4, r4, r7\n\t"
  141128. "adc r3, r3, #0\n\t"
  141129. #else
  141130. "umull r6, r7, r8, r7\n\t"
  141131. "adds r5, r5, r6\n\t"
  141132. "adcs r4, r7, r3\n\t"
  141133. "mov r3, #0\n\t"
  141134. "adc r3, r3, r3\n\t"
  141135. #endif
  141136. "adds r10, r10, r5\n\t"
  141137. "str r10, [%[a], #124]\n\t"
  141138. "ldr r10, [%[a], #128]\n\t"
  141139. "adcs r10, r10, r4\n\t"
  141140. "str r10, [%[a], #128]\n\t"
  141141. "adc r3, r3, #0\n\t"
  141142. /* i += 1 */
  141143. "add r9, r9, #4\n\t"
  141144. "add %[a], %[a], #4\n\t"
  141145. "cmp r9, #0x80\n\t"
  141146. "blt L_sp_1024_mont_reduce_32_word_%=\n\t"
  141147. "str r12, [%[a]]\n\t"
  141148. "str lr, [%[a], #4]\n\t"
  141149. "ldr r6, [%[m], #124]\n\t"
  141150. "subs r10, r6, r10\n\t"
  141151. "neg r3, r3\n\t"
  141152. "sbc r10, r10, r10\n\t"
  141153. "orr r3, r3, r10\n\t"
  141154. "mov %[mp], r3\n\t"
  141155. : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp)
  141156. :
  141157. : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  141158. );
  141159. sp_1024_cond_sub_32(a - 32, a, m, mp);
  141160. }
  141161. /* Multiply two Montgomery form numbers mod the modulus (prime).
  141162. * (r = a * b mod m)
  141163. *
  141164. * r Result of multiplication.
  141165. * a First number to multiply in Montgomery form.
  141166. * b Second number to multiply in Montgomery form.
  141167. * m Modulus (prime).
  141168. * mp Montgomery mulitplier.
  141169. */
  141170. SP_NOINLINE static void sp_1024_mont_mul_32(sp_digit* r, const sp_digit* a,
  141171. const sp_digit* b, const sp_digit* m, sp_digit mp)
  141172. {
  141173. sp_1024_mul_32(r, a, b);
  141174. sp_1024_mont_reduce_32(r, m, mp);
  141175. }
  141176. /* Square the Montgomery form number. (r = a * a mod m)
  141177. *
  141178. * r Result of squaring.
  141179. * a Number to square in Montgomery form.
  141180. * m Modulus (prime).
  141181. * mp Montgomery mulitplier.
  141182. */
  141183. SP_NOINLINE static void sp_1024_mont_sqr_32(sp_digit* r, const sp_digit* a,
  141184. const sp_digit* m, sp_digit mp)
  141185. {
  141186. sp_1024_sqr_32(r, a);
  141187. sp_1024_mont_reduce_32(r, m, mp);
  141188. }
  141189. /* Mod-2 for the P1024 curve. */
  141190. static const uint8_t p1024_mod_minus_2[] = {
  141191. 6,0x06, 7,0x0f, 7,0x0b, 6,0x0c, 7,0x1e, 9,0x09, 7,0x0c, 7,0x1f,
  141192. 6,0x16, 6,0x06, 7,0x0e, 8,0x10, 6,0x03, 8,0x11, 6,0x0d, 7,0x14,
  141193. 9,0x12, 6,0x0f, 7,0x04, 9,0x0d, 6,0x00, 7,0x13, 6,0x01, 6,0x07,
  141194. 8,0x0d, 8,0x00, 6,0x06, 9,0x17, 6,0x14, 6,0x15, 6,0x11, 6,0x0b,
  141195. 9,0x0c, 6,0x1e, 13,0x14, 7,0x0e, 6,0x1d, 12,0x0a, 6,0x0b, 8,0x07,
  141196. 6,0x18, 6,0x0f, 6,0x10, 8,0x1c, 7,0x16, 7,0x02, 6,0x01, 6,0x13,
  141197. 10,0x15, 7,0x06, 8,0x14, 6,0x0c, 6,0x19, 7,0x10, 6,0x19, 6,0x19,
  141198. 9,0x16, 7,0x19, 6,0x1f, 6,0x17, 6,0x12, 8,0x02, 6,0x01, 6,0x04,
  141199. 6,0x15, 7,0x16, 6,0x04, 6,0x1f, 6,0x09, 7,0x06, 7,0x13, 7,0x09,
  141200. 6,0x0d, 10,0x18, 6,0x06, 6,0x11, 6,0x04, 6,0x01, 6,0x13, 8,0x06,
  141201. 6,0x0d, 8,0x13, 7,0x08, 6,0x08, 6,0x05, 7,0x0c, 7,0x0e, 7,0x15,
  141202. 6,0x05, 7,0x14, 10,0x19, 6,0x10, 6,0x16, 6,0x15, 7,0x1f, 6,0x14,
  141203. 6,0x0a, 10,0x11, 6,0x01, 7,0x05, 7,0x08, 8,0x0a, 7,0x1e, 7,0x1c,
  141204. 6,0x1c, 7,0x09, 10,0x18, 7,0x1c, 10,0x06, 6,0x0a, 6,0x07, 6,0x19,
  141205. 7,0x06, 6,0x0d, 7,0x0f, 7,0x0b, 7,0x05, 6,0x11, 6,0x1c, 7,0x1f,
  141206. 6,0x1e, 7,0x18, 6,0x1e, 6,0x00, 6,0x03, 6,0x02, 7,0x10, 6,0x0b,
  141207. 6,0x1b, 7,0x10, 6,0x00, 8,0x11, 7,0x1b, 6,0x18, 6,0x01, 7,0x0c,
  141208. 7,0x1d, 7,0x13, 6,0x08, 7,0x1b, 8,0x13, 7,0x16, 13,0x1d, 7,0x1f,
  141209. 6,0x0a, 6,0x01, 7,0x1f, 6,0x14, 1,0x01
  141210. };
  141211. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  141212. * P1024 curve. (r = 1 / a mod m)
  141213. *
  141214. * r Inverse result.
  141215. * a Number to invert.
  141216. * td Temporary data.
  141217. */
  141218. static void sp_1024_mont_inv_32(sp_digit* r, const sp_digit* a,
  141219. sp_digit* td)
  141220. {
  141221. sp_digit* t = td;
  141222. int i;
  141223. int j;
  141224. sp_digit table[32][2 * 32];
  141225. XMEMCPY(table[0], a, sizeof(sp_digit) * 32);
  141226. for (i = 1; i < 6; i++) {
  141227. sp_1024_mont_sqr_32(table[0], table[0], p1024_mod, p1024_mp_mod);
  141228. }
  141229. for (i = 1; i < 32; i++) {
  141230. sp_1024_mont_mul_32(table[i], table[i-1], a, p1024_mod, p1024_mp_mod);
  141231. }
  141232. XMEMCPY(t, table[p1024_mod_minus_2[1]], sizeof(sp_digit) * 32);
  141233. for (i = 2; i < (int)sizeof(p1024_mod_minus_2) - 2; i += 2) {
  141234. for (j = 0; j < p1024_mod_minus_2[i]; j++) {
  141235. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  141236. }
  141237. sp_1024_mont_mul_32(t, t, table[p1024_mod_minus_2[i+1]], p1024_mod,
  141238. p1024_mp_mod);
  141239. }
  141240. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  141241. sp_1024_mont_mul_32(r, t, a, p1024_mod, p1024_mp_mod);
  141242. }
  141243. /* Normalize the values in each word to 32.
  141244. *
  141245. * a Array of sp_digit to normalize.
  141246. */
  141247. #define sp_1024_norm_32(a)
  141248. /* Map the Montgomery form projective coordinate point to an affine point.
  141249. *
  141250. * r Resulting affine coordinate point.
  141251. * p Montgomery form projective coordinate point.
  141252. * t Temporary ordinate data.
  141253. */
  141254. static void sp_1024_map_32(sp_point_1024* r, const sp_point_1024* p,
  141255. sp_digit* t)
  141256. {
  141257. sp_digit* t1 = t;
  141258. sp_digit* t2 = t + 2*32;
  141259. sp_int32 n;
  141260. sp_1024_mont_inv_32(t1, p->z, t + 2*32);
  141261. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  141262. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  141263. /* x /= z^2 */
  141264. sp_1024_mont_mul_32(r->x, p->x, t2, p1024_mod, p1024_mp_mod);
  141265. XMEMSET(r->x + 32, 0, sizeof(r->x) / 2U);
  141266. sp_1024_mont_reduce_32(r->x, p1024_mod, p1024_mp_mod);
  141267. /* Reduce x to less than modulus */
  141268. n = sp_1024_cmp_32(r->x, p1024_mod);
  141269. sp_1024_cond_sub_32(r->x, r->x, p1024_mod, ~(n >> 31));
  141270. sp_1024_norm_32(r->x);
  141271. /* y /= z^3 */
  141272. sp_1024_mont_mul_32(r->y, p->y, t1, p1024_mod, p1024_mp_mod);
  141273. XMEMSET(r->y + 32, 0, sizeof(r->y) / 2U);
  141274. sp_1024_mont_reduce_32(r->y, p1024_mod, p1024_mp_mod);
  141275. /* Reduce y to less than modulus */
  141276. n = sp_1024_cmp_32(r->y, p1024_mod);
  141277. sp_1024_cond_sub_32(r->y, r->y, p1024_mod, ~(n >> 31));
  141278. sp_1024_norm_32(r->y);
  141279. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  141280. r->z[0] = 1;
  141281. }
  141282. /* Add two Montgomery form numbers (r = a + b % m).
  141283. *
  141284. * r Result of addition.
  141285. * a First number to add in Montgomery form.
  141286. * b Second number to add in Montgomery form.
  141287. * m Modulus (prime).
  141288. */
  141289. static void sp_1024_mont_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p)
  141290. {
  141291. register sp_digit* r asm ("r0") = r_p;
  141292. register const sp_digit* a asm ("r1") = a_p;
  141293. register const sp_digit* b asm ("r2") = b_p;
  141294. register const sp_digit* m asm ("r3") = m_p;
  141295. __asm__ __volatile__ (
  141296. "mov r12, #0\n\t"
  141297. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141298. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141299. "adds r4, r4, r8\n\t"
  141300. "adcs r5, r5, r9\n\t"
  141301. "adcs r6, r6, r10\n\t"
  141302. "adcs r7, r7, r11\n\t"
  141303. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141304. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141305. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141306. "adcs r4, r4, r8\n\t"
  141307. "adcs r5, r5, r9\n\t"
  141308. "adcs r6, r6, r10\n\t"
  141309. "adcs r7, r7, r11\n\t"
  141310. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141311. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141312. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141313. "adcs r4, r4, r8\n\t"
  141314. "adcs r5, r5, r9\n\t"
  141315. "adcs r6, r6, r10\n\t"
  141316. "adcs r7, r7, r11\n\t"
  141317. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141318. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141319. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141320. "adcs r4, r4, r8\n\t"
  141321. "adcs r5, r5, r9\n\t"
  141322. "adcs r6, r6, r10\n\t"
  141323. "adcs r7, r7, r11\n\t"
  141324. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141325. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141326. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141327. "adcs r4, r4, r8\n\t"
  141328. "adcs r5, r5, r9\n\t"
  141329. "adcs r6, r6, r10\n\t"
  141330. "adcs r7, r7, r11\n\t"
  141331. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141332. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141333. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141334. "adcs r4, r4, r8\n\t"
  141335. "adcs r5, r5, r9\n\t"
  141336. "adcs r6, r6, r10\n\t"
  141337. "adcs r7, r7, r11\n\t"
  141338. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141339. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141340. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141341. "adcs r4, r4, r8\n\t"
  141342. "adcs r5, r5, r9\n\t"
  141343. "adcs r6, r6, r10\n\t"
  141344. "adcs r7, r7, r11\n\t"
  141345. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141346. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141347. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141348. "adcs r4, r4, r8\n\t"
  141349. "adcs r5, r5, r9\n\t"
  141350. "adcs r6, r6, r10\n\t"
  141351. "adcs r7, r7, r11\n\t"
  141352. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141353. "ldr r11, [%[m], #124]\n\t"
  141354. "adc r12, r12, #0\n\t"
  141355. "subs r11, r11, r7\n\t"
  141356. "neg r12, r12\n\t"
  141357. "sbc r11, r11, r11\n\t"
  141358. "sub %[r], %[r], #0x80\n\t"
  141359. "orr r12, r11\n\t"
  141360. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141361. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141362. "and r8, r8, r12\n\t"
  141363. "and r9, r9, r12\n\t"
  141364. "and r10, r10, r12\n\t"
  141365. "and r11, r11, r12\n\t"
  141366. "subs r4, r4, r8\n\t"
  141367. "sbcs r5, r5, r9\n\t"
  141368. "sbcs r6, r6, r10\n\t"
  141369. "sbcs r7, r7, r11\n\t"
  141370. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141371. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141372. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141373. "and r8, r8, r12\n\t"
  141374. "and r9, r9, r12\n\t"
  141375. "and r10, r10, r12\n\t"
  141376. "and r11, r11, r12\n\t"
  141377. "sbcs r4, r4, r8\n\t"
  141378. "sbcs r5, r5, r9\n\t"
  141379. "sbcs r6, r6, r10\n\t"
  141380. "sbcs r7, r7, r11\n\t"
  141381. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141382. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141383. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141384. "and r8, r8, r12\n\t"
  141385. "and r9, r9, r12\n\t"
  141386. "and r10, r10, r12\n\t"
  141387. "and r11, r11, r12\n\t"
  141388. "sbcs r4, r4, r8\n\t"
  141389. "sbcs r5, r5, r9\n\t"
  141390. "sbcs r6, r6, r10\n\t"
  141391. "sbcs r7, r7, r11\n\t"
  141392. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141393. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141394. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141395. "and r8, r8, r12\n\t"
  141396. "and r9, r9, r12\n\t"
  141397. "and r10, r10, r12\n\t"
  141398. "and r11, r11, r12\n\t"
  141399. "sbcs r4, r4, r8\n\t"
  141400. "sbcs r5, r5, r9\n\t"
  141401. "sbcs r6, r6, r10\n\t"
  141402. "sbcs r7, r7, r11\n\t"
  141403. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141404. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141405. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141406. "and r8, r8, r12\n\t"
  141407. "and r9, r9, r12\n\t"
  141408. "and r10, r10, r12\n\t"
  141409. "and r11, r11, r12\n\t"
  141410. "sbcs r4, r4, r8\n\t"
  141411. "sbcs r5, r5, r9\n\t"
  141412. "sbcs r6, r6, r10\n\t"
  141413. "sbcs r7, r7, r11\n\t"
  141414. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141415. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141416. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141417. "and r8, r8, r12\n\t"
  141418. "and r9, r9, r12\n\t"
  141419. "and r10, r10, r12\n\t"
  141420. "and r11, r11, r12\n\t"
  141421. "sbcs r4, r4, r8\n\t"
  141422. "sbcs r5, r5, r9\n\t"
  141423. "sbcs r6, r6, r10\n\t"
  141424. "sbcs r7, r7, r11\n\t"
  141425. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141426. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141427. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141428. "and r8, r8, r12\n\t"
  141429. "and r9, r9, r12\n\t"
  141430. "and r10, r10, r12\n\t"
  141431. "and r11, r11, r12\n\t"
  141432. "sbcs r4, r4, r8\n\t"
  141433. "sbcs r5, r5, r9\n\t"
  141434. "sbcs r6, r6, r10\n\t"
  141435. "sbcs r7, r7, r11\n\t"
  141436. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141437. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141438. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141439. "and r8, r8, r12\n\t"
  141440. "and r9, r9, r12\n\t"
  141441. "and r10, r10, r12\n\t"
  141442. "and r11, r11, r12\n\t"
  141443. "sbcs r4, r4, r8\n\t"
  141444. "sbcs r5, r5, r9\n\t"
  141445. "sbcs r6, r6, r10\n\t"
  141446. "sbc r7, r7, r11\n\t"
  141447. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141448. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  141449. :
  141450. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  141451. );
  141452. }
  141453. /* Double a Montgomery form number (r = a + a % m).
  141454. *
  141455. * r Result of doubling.
  141456. * a Number to double in Montgomery form.
  141457. * m Modulus (prime).
  141458. */
  141459. static void sp_1024_mont_dbl_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  141460. {
  141461. register sp_digit* r asm ("r0") = r_p;
  141462. register const sp_digit* a asm ("r1") = a_p;
  141463. register const sp_digit* m asm ("r2") = m_p;
  141464. __asm__ __volatile__ (
  141465. "mov r12, #0\n\t"
  141466. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141467. "adds r4, r4, r4\n\t"
  141468. "adcs r5, r5, r5\n\t"
  141469. "adcs r6, r6, r6\n\t"
  141470. "adcs r7, r7, r7\n\t"
  141471. "adcs r8, r8, r8\n\t"
  141472. "adcs r9, r9, r9\n\t"
  141473. "adcs r10, r10, r10\n\t"
  141474. "adcs r11, r11, r11\n\t"
  141475. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141476. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141477. "adcs r4, r4, r4\n\t"
  141478. "adcs r5, r5, r5\n\t"
  141479. "adcs r6, r6, r6\n\t"
  141480. "adcs r7, r7, r7\n\t"
  141481. "adcs r8, r8, r8\n\t"
  141482. "adcs r9, r9, r9\n\t"
  141483. "adcs r10, r10, r10\n\t"
  141484. "adcs r11, r11, r11\n\t"
  141485. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141486. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141487. "adcs r4, r4, r4\n\t"
  141488. "adcs r5, r5, r5\n\t"
  141489. "adcs r6, r6, r6\n\t"
  141490. "adcs r7, r7, r7\n\t"
  141491. "adcs r8, r8, r8\n\t"
  141492. "adcs r9, r9, r9\n\t"
  141493. "adcs r10, r10, r10\n\t"
  141494. "adcs r11, r11, r11\n\t"
  141495. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141496. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141497. "adcs r4, r4, r4\n\t"
  141498. "adcs r5, r5, r5\n\t"
  141499. "adcs r6, r6, r6\n\t"
  141500. "adcs r7, r7, r7\n\t"
  141501. "adcs r8, r8, r8\n\t"
  141502. "adcs r9, r9, r9\n\t"
  141503. "adcs r10, r10, r10\n\t"
  141504. "adcs r11, r11, r11\n\t"
  141505. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141506. "ldr r4, [%[m], #124]\n\t"
  141507. "adc r12, r12, #0\n\t"
  141508. "subs r4, r4, r11\n\t"
  141509. "neg r12, r12\n\t"
  141510. "sbc r4, r4, r4\n\t"
  141511. "sub %[r], %[r], #0x80\n\t"
  141512. "orr r12, r4\n\t"
  141513. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141514. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141515. "and r8, r8, r12\n\t"
  141516. "and r9, r9, r12\n\t"
  141517. "and r10, r10, r12\n\t"
  141518. "and r11, r11, r12\n\t"
  141519. "subs r4, r4, r8\n\t"
  141520. "sbcs r5, r5, r9\n\t"
  141521. "sbcs r6, r6, r10\n\t"
  141522. "sbcs r7, r7, r11\n\t"
  141523. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141524. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141525. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141526. "and r8, r8, r12\n\t"
  141527. "and r9, r9, r12\n\t"
  141528. "and r10, r10, r12\n\t"
  141529. "and r11, r11, r12\n\t"
  141530. "sbcs r4, r4, r8\n\t"
  141531. "sbcs r5, r5, r9\n\t"
  141532. "sbcs r6, r6, r10\n\t"
  141533. "sbcs r7, r7, r11\n\t"
  141534. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141535. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141536. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141537. "and r8, r8, r12\n\t"
  141538. "and r9, r9, r12\n\t"
  141539. "and r10, r10, r12\n\t"
  141540. "and r11, r11, r12\n\t"
  141541. "sbcs r4, r4, r8\n\t"
  141542. "sbcs r5, r5, r9\n\t"
  141543. "sbcs r6, r6, r10\n\t"
  141544. "sbcs r7, r7, r11\n\t"
  141545. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141546. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141547. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141548. "and r8, r8, r12\n\t"
  141549. "and r9, r9, r12\n\t"
  141550. "and r10, r10, r12\n\t"
  141551. "and r11, r11, r12\n\t"
  141552. "sbcs r4, r4, r8\n\t"
  141553. "sbcs r5, r5, r9\n\t"
  141554. "sbcs r6, r6, r10\n\t"
  141555. "sbcs r7, r7, r11\n\t"
  141556. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141557. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141558. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141559. "and r8, r8, r12\n\t"
  141560. "and r9, r9, r12\n\t"
  141561. "and r10, r10, r12\n\t"
  141562. "and r11, r11, r12\n\t"
  141563. "sbcs r4, r4, r8\n\t"
  141564. "sbcs r5, r5, r9\n\t"
  141565. "sbcs r6, r6, r10\n\t"
  141566. "sbcs r7, r7, r11\n\t"
  141567. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141568. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141569. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141570. "and r8, r8, r12\n\t"
  141571. "and r9, r9, r12\n\t"
  141572. "and r10, r10, r12\n\t"
  141573. "and r11, r11, r12\n\t"
  141574. "sbcs r4, r4, r8\n\t"
  141575. "sbcs r5, r5, r9\n\t"
  141576. "sbcs r6, r6, r10\n\t"
  141577. "sbcs r7, r7, r11\n\t"
  141578. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141579. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141580. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141581. "and r8, r8, r12\n\t"
  141582. "and r9, r9, r12\n\t"
  141583. "and r10, r10, r12\n\t"
  141584. "and r11, r11, r12\n\t"
  141585. "sbcs r4, r4, r8\n\t"
  141586. "sbcs r5, r5, r9\n\t"
  141587. "sbcs r6, r6, r10\n\t"
  141588. "sbcs r7, r7, r11\n\t"
  141589. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141590. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141591. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141592. "and r8, r8, r12\n\t"
  141593. "and r9, r9, r12\n\t"
  141594. "and r10, r10, r12\n\t"
  141595. "and r11, r11, r12\n\t"
  141596. "sbcs r4, r4, r8\n\t"
  141597. "sbcs r5, r5, r9\n\t"
  141598. "sbcs r6, r6, r10\n\t"
  141599. "sbc r7, r7, r11\n\t"
  141600. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141601. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  141602. :
  141603. : "memory", "r8", "r9", "r10", "r11", "r4", "r5", "r6", "r7", "r12"
  141604. );
  141605. }
  141606. /* Triple a Montgomery form number (r = a + a + a % m).
  141607. *
  141608. * r Result of Tripling.
  141609. * a Number to triple in Montgomery form.
  141610. * m Modulus (prime).
  141611. */
  141612. static void sp_1024_mont_tpl_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p)
  141613. {
  141614. register sp_digit* r asm ("r0") = r_p;
  141615. register const sp_digit* a asm ("r1") = a_p;
  141616. register const sp_digit* m asm ("r2") = m_p;
  141617. __asm__ __volatile__ (
  141618. "mov r12, #0\n\t"
  141619. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141620. "adds r4, r4, r4\n\t"
  141621. "adcs r5, r5, r5\n\t"
  141622. "adcs r6, r6, r6\n\t"
  141623. "adcs r7, r7, r7\n\t"
  141624. "adcs r8, r8, r8\n\t"
  141625. "adcs r9, r9, r9\n\t"
  141626. "adcs r10, r10, r10\n\t"
  141627. "adcs r11, r11, r11\n\t"
  141628. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141629. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141630. "adcs r4, r4, r4\n\t"
  141631. "adcs r5, r5, r5\n\t"
  141632. "adcs r6, r6, r6\n\t"
  141633. "adcs r7, r7, r7\n\t"
  141634. "adcs r8, r8, r8\n\t"
  141635. "adcs r9, r9, r9\n\t"
  141636. "adcs r10, r10, r10\n\t"
  141637. "adcs r11, r11, r11\n\t"
  141638. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141639. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141640. "adcs r4, r4, r4\n\t"
  141641. "adcs r5, r5, r5\n\t"
  141642. "adcs r6, r6, r6\n\t"
  141643. "adcs r7, r7, r7\n\t"
  141644. "adcs r8, r8, r8\n\t"
  141645. "adcs r9, r9, r9\n\t"
  141646. "adcs r10, r10, r10\n\t"
  141647. "adcs r11, r11, r11\n\t"
  141648. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141649. "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141650. "adcs r4, r4, r4\n\t"
  141651. "adcs r5, r5, r5\n\t"
  141652. "adcs r6, r6, r6\n\t"
  141653. "adcs r7, r7, r7\n\t"
  141654. "adcs r8, r8, r8\n\t"
  141655. "adcs r9, r9, r9\n\t"
  141656. "adcs r10, r10, r10\n\t"
  141657. "adcs r11, r11, r11\n\t"
  141658. "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
  141659. "ldr r4, [%[m], #124]\n\t"
  141660. "adc r12, r12, #0\n\t"
  141661. "subs r4, r4, r11\n\t"
  141662. "neg r12, r12\n\t"
  141663. "sbc r4, r4, r4\n\t"
  141664. "sub %[r], %[r], #0x80\n\t"
  141665. "orr r12, r4\n\t"
  141666. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141667. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141668. "and r8, r8, r12\n\t"
  141669. "and r9, r9, r12\n\t"
  141670. "and r10, r10, r12\n\t"
  141671. "and r11, r11, r12\n\t"
  141672. "subs r4, r4, r8\n\t"
  141673. "sbcs r5, r5, r9\n\t"
  141674. "sbcs r6, r6, r10\n\t"
  141675. "sbcs r7, r7, r11\n\t"
  141676. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141677. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141678. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141679. "and r8, r8, r12\n\t"
  141680. "and r9, r9, r12\n\t"
  141681. "and r10, r10, r12\n\t"
  141682. "and r11, r11, r12\n\t"
  141683. "sbcs r4, r4, r8\n\t"
  141684. "sbcs r5, r5, r9\n\t"
  141685. "sbcs r6, r6, r10\n\t"
  141686. "sbcs r7, r7, r11\n\t"
  141687. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141688. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141689. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141690. "and r8, r8, r12\n\t"
  141691. "and r9, r9, r12\n\t"
  141692. "and r10, r10, r12\n\t"
  141693. "and r11, r11, r12\n\t"
  141694. "sbcs r4, r4, r8\n\t"
  141695. "sbcs r5, r5, r9\n\t"
  141696. "sbcs r6, r6, r10\n\t"
  141697. "sbcs r7, r7, r11\n\t"
  141698. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141699. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141700. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141701. "and r8, r8, r12\n\t"
  141702. "and r9, r9, r12\n\t"
  141703. "and r10, r10, r12\n\t"
  141704. "and r11, r11, r12\n\t"
  141705. "sbcs r4, r4, r8\n\t"
  141706. "sbcs r5, r5, r9\n\t"
  141707. "sbcs r6, r6, r10\n\t"
  141708. "sbcs r7, r7, r11\n\t"
  141709. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141710. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141711. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141712. "and r8, r8, r12\n\t"
  141713. "and r9, r9, r12\n\t"
  141714. "and r10, r10, r12\n\t"
  141715. "and r11, r11, r12\n\t"
  141716. "sbcs r4, r4, r8\n\t"
  141717. "sbcs r5, r5, r9\n\t"
  141718. "sbcs r6, r6, r10\n\t"
  141719. "sbcs r7, r7, r11\n\t"
  141720. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141721. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141722. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141723. "and r8, r8, r12\n\t"
  141724. "and r9, r9, r12\n\t"
  141725. "and r10, r10, r12\n\t"
  141726. "and r11, r11, r12\n\t"
  141727. "sbcs r4, r4, r8\n\t"
  141728. "sbcs r5, r5, r9\n\t"
  141729. "sbcs r6, r6, r10\n\t"
  141730. "sbcs r7, r7, r11\n\t"
  141731. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141732. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141733. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141734. "and r8, r8, r12\n\t"
  141735. "and r9, r9, r12\n\t"
  141736. "and r10, r10, r12\n\t"
  141737. "and r11, r11, r12\n\t"
  141738. "sbcs r4, r4, r8\n\t"
  141739. "sbcs r5, r5, r9\n\t"
  141740. "sbcs r6, r6, r10\n\t"
  141741. "sbcs r7, r7, r11\n\t"
  141742. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141743. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141744. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141745. "and r8, r8, r12\n\t"
  141746. "and r9, r9, r12\n\t"
  141747. "and r10, r10, r12\n\t"
  141748. "and r11, r11, r12\n\t"
  141749. "sbcs r4, r4, r8\n\t"
  141750. "sbcs r5, r5, r9\n\t"
  141751. "sbcs r6, r6, r10\n\t"
  141752. "sbc r7, r7, r11\n\t"
  141753. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141754. "sub %[r], %[r], #0x80\n\t"
  141755. "sub %[m], %[m], #0x80\n\t"
  141756. "sub %[a], %[a], #0x80\n\t"
  141757. "mov r12, #0\n\t"
  141758. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141759. "ldm %[r], {r8, r9, r10, r11}\n\t"
  141760. "adds r8, r8, r4\n\t"
  141761. "adcs r9, r9, r5\n\t"
  141762. "adcs r10, r10, r6\n\t"
  141763. "adcs r11, r11, r7\n\t"
  141764. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  141765. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141766. "ldm %[r], {r8, r9, r10, r11}\n\t"
  141767. "adcs r8, r8, r4\n\t"
  141768. "adcs r9, r9, r5\n\t"
  141769. "adcs r10, r10, r6\n\t"
  141770. "adcs r11, r11, r7\n\t"
  141771. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  141772. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141773. "ldm %[r], {r8, r9, r10, r11}\n\t"
  141774. "adcs r8, r8, r4\n\t"
  141775. "adcs r9, r9, r5\n\t"
  141776. "adcs r10, r10, r6\n\t"
  141777. "adcs r11, r11, r7\n\t"
  141778. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  141779. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141780. "ldm %[r], {r8, r9, r10, r11}\n\t"
  141781. "adcs r8, r8, r4\n\t"
  141782. "adcs r9, r9, r5\n\t"
  141783. "adcs r10, r10, r6\n\t"
  141784. "adcs r11, r11, r7\n\t"
  141785. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  141786. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141787. "ldm %[r], {r8, r9, r10, r11}\n\t"
  141788. "adcs r8, r8, r4\n\t"
  141789. "adcs r9, r9, r5\n\t"
  141790. "adcs r10, r10, r6\n\t"
  141791. "adcs r11, r11, r7\n\t"
  141792. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  141793. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141794. "ldm %[r], {r8, r9, r10, r11}\n\t"
  141795. "adcs r8, r8, r4\n\t"
  141796. "adcs r9, r9, r5\n\t"
  141797. "adcs r10, r10, r6\n\t"
  141798. "adcs r11, r11, r7\n\t"
  141799. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  141800. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141801. "ldm %[r], {r8, r9, r10, r11}\n\t"
  141802. "adcs r8, r8, r4\n\t"
  141803. "adcs r9, r9, r5\n\t"
  141804. "adcs r10, r10, r6\n\t"
  141805. "adcs r11, r11, r7\n\t"
  141806. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  141807. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141808. "ldm %[r], {r8, r9, r10, r11}\n\t"
  141809. "adcs r8, r8, r4\n\t"
  141810. "adcs r9, r9, r5\n\t"
  141811. "adcs r10, r10, r6\n\t"
  141812. "adcs r11, r11, r7\n\t"
  141813. "stm %[r]!, {r8, r9, r10, r11}\n\t"
  141814. "ldr r7, [%[m], #124]\n\t"
  141815. "adc r12, r12, #0\n\t"
  141816. "subs r7, r7, r11\n\t"
  141817. "neg r12, r12\n\t"
  141818. "sbc r7, r7, r7\n\t"
  141819. "sub %[r], %[r], #0x80\n\t"
  141820. "orr r12, r7\n\t"
  141821. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141822. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141823. "and r8, r8, r12\n\t"
  141824. "and r9, r9, r12\n\t"
  141825. "and r10, r10, r12\n\t"
  141826. "and r11, r11, r12\n\t"
  141827. "subs r4, r4, r8\n\t"
  141828. "sbcs r5, r5, r9\n\t"
  141829. "sbcs r6, r6, r10\n\t"
  141830. "sbcs r7, r7, r11\n\t"
  141831. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141832. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141833. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141834. "and r8, r8, r12\n\t"
  141835. "and r9, r9, r12\n\t"
  141836. "and r10, r10, r12\n\t"
  141837. "and r11, r11, r12\n\t"
  141838. "sbcs r4, r4, r8\n\t"
  141839. "sbcs r5, r5, r9\n\t"
  141840. "sbcs r6, r6, r10\n\t"
  141841. "sbcs r7, r7, r11\n\t"
  141842. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141843. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141844. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141845. "and r8, r8, r12\n\t"
  141846. "and r9, r9, r12\n\t"
  141847. "and r10, r10, r12\n\t"
  141848. "and r11, r11, r12\n\t"
  141849. "sbcs r4, r4, r8\n\t"
  141850. "sbcs r5, r5, r9\n\t"
  141851. "sbcs r6, r6, r10\n\t"
  141852. "sbcs r7, r7, r11\n\t"
  141853. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141854. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141855. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141856. "and r8, r8, r12\n\t"
  141857. "and r9, r9, r12\n\t"
  141858. "and r10, r10, r12\n\t"
  141859. "and r11, r11, r12\n\t"
  141860. "sbcs r4, r4, r8\n\t"
  141861. "sbcs r5, r5, r9\n\t"
  141862. "sbcs r6, r6, r10\n\t"
  141863. "sbcs r7, r7, r11\n\t"
  141864. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141865. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141866. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141867. "and r8, r8, r12\n\t"
  141868. "and r9, r9, r12\n\t"
  141869. "and r10, r10, r12\n\t"
  141870. "and r11, r11, r12\n\t"
  141871. "sbcs r4, r4, r8\n\t"
  141872. "sbcs r5, r5, r9\n\t"
  141873. "sbcs r6, r6, r10\n\t"
  141874. "sbcs r7, r7, r11\n\t"
  141875. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141876. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141877. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141878. "and r8, r8, r12\n\t"
  141879. "and r9, r9, r12\n\t"
  141880. "and r10, r10, r12\n\t"
  141881. "and r11, r11, r12\n\t"
  141882. "sbcs r4, r4, r8\n\t"
  141883. "sbcs r5, r5, r9\n\t"
  141884. "sbcs r6, r6, r10\n\t"
  141885. "sbcs r7, r7, r11\n\t"
  141886. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141887. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141888. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141889. "and r8, r8, r12\n\t"
  141890. "and r9, r9, r12\n\t"
  141891. "and r10, r10, r12\n\t"
  141892. "and r11, r11, r12\n\t"
  141893. "sbcs r4, r4, r8\n\t"
  141894. "sbcs r5, r5, r9\n\t"
  141895. "sbcs r6, r6, r10\n\t"
  141896. "sbcs r7, r7, r11\n\t"
  141897. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141898. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141899. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141900. "and r8, r8, r12\n\t"
  141901. "and r9, r9, r12\n\t"
  141902. "and r10, r10, r12\n\t"
  141903. "and r11, r11, r12\n\t"
  141904. "sbcs r4, r4, r8\n\t"
  141905. "sbcs r5, r5, r9\n\t"
  141906. "sbcs r6, r6, r10\n\t"
  141907. "sbc r7, r7, r11\n\t"
  141908. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141909. : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m)
  141910. :
  141911. : "memory", "r8", "r9", "r10", "r11", "r4", "r5", "r6", "r7", "r12"
  141912. );
  141913. }
  141914. /* Subtract two Montgomery form numbers (r = a - b % m).
  141915. *
  141916. * r Result of subtration.
  141917. * a Number to subtract from in Montgomery form.
  141918. * b Number to subtract with in Montgomery form.
  141919. * m Modulus (prime).
  141920. */
  141921. static void sp_1024_mont_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p)
  141922. {
  141923. register sp_digit* r asm ("r0") = r_p;
  141924. register const sp_digit* a asm ("r1") = a_p;
  141925. register const sp_digit* b asm ("r2") = b_p;
  141926. register const sp_digit* m asm ("r3") = m_p;
  141927. __asm__ __volatile__ (
  141928. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141929. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141930. "subs r4, r4, r8\n\t"
  141931. "sbcs r5, r5, r9\n\t"
  141932. "sbcs r6, r6, r10\n\t"
  141933. "sbcs r7, r7, r11\n\t"
  141934. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141935. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141936. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141937. "sbcs r4, r4, r8\n\t"
  141938. "sbcs r5, r5, r9\n\t"
  141939. "sbcs r6, r6, r10\n\t"
  141940. "sbcs r7, r7, r11\n\t"
  141941. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141942. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141943. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141944. "sbcs r4, r4, r8\n\t"
  141945. "sbcs r5, r5, r9\n\t"
  141946. "sbcs r6, r6, r10\n\t"
  141947. "sbcs r7, r7, r11\n\t"
  141948. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141949. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141950. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141951. "sbcs r4, r4, r8\n\t"
  141952. "sbcs r5, r5, r9\n\t"
  141953. "sbcs r6, r6, r10\n\t"
  141954. "sbcs r7, r7, r11\n\t"
  141955. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141956. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141957. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141958. "sbcs r4, r4, r8\n\t"
  141959. "sbcs r5, r5, r9\n\t"
  141960. "sbcs r6, r6, r10\n\t"
  141961. "sbcs r7, r7, r11\n\t"
  141962. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141963. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141964. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141965. "sbcs r4, r4, r8\n\t"
  141966. "sbcs r5, r5, r9\n\t"
  141967. "sbcs r6, r6, r10\n\t"
  141968. "sbcs r7, r7, r11\n\t"
  141969. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141970. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141971. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141972. "sbcs r4, r4, r8\n\t"
  141973. "sbcs r5, r5, r9\n\t"
  141974. "sbcs r6, r6, r10\n\t"
  141975. "sbcs r7, r7, r11\n\t"
  141976. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141977. "ldm %[a]!, {r4, r5, r6, r7}\n\t"
  141978. "ldm %[b]!, {r8, r9, r10, r11}\n\t"
  141979. "sbcs r4, r4, r8\n\t"
  141980. "sbcs r5, r5, r9\n\t"
  141981. "sbcs r6, r6, r10\n\t"
  141982. "sbcs r7, r7, r11\n\t"
  141983. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141984. "sbc r12, r12, r12\n\t"
  141985. "sub %[r], %[r], #0x80\n\t"
  141986. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141987. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141988. "and r8, r8, r12\n\t"
  141989. "and r9, r9, r12\n\t"
  141990. "and r10, r10, r12\n\t"
  141991. "and r11, r11, r12\n\t"
  141992. "adds r4, r4, r8\n\t"
  141993. "adcs r5, r5, r9\n\t"
  141994. "adcs r6, r6, r10\n\t"
  141995. "adcs r7, r7, r11\n\t"
  141996. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  141997. "ldm %[r], {r4, r5, r6, r7}\n\t"
  141998. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  141999. "and r8, r8, r12\n\t"
  142000. "and r9, r9, r12\n\t"
  142001. "and r10, r10, r12\n\t"
  142002. "and r11, r11, r12\n\t"
  142003. "adcs r4, r4, r8\n\t"
  142004. "adcs r5, r5, r9\n\t"
  142005. "adcs r6, r6, r10\n\t"
  142006. "adcs r7, r7, r11\n\t"
  142007. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  142008. "ldm %[r], {r4, r5, r6, r7}\n\t"
  142009. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  142010. "and r8, r8, r12\n\t"
  142011. "and r9, r9, r12\n\t"
  142012. "and r10, r10, r12\n\t"
  142013. "and r11, r11, r12\n\t"
  142014. "adcs r4, r4, r8\n\t"
  142015. "adcs r5, r5, r9\n\t"
  142016. "adcs r6, r6, r10\n\t"
  142017. "adcs r7, r7, r11\n\t"
  142018. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  142019. "ldm %[r], {r4, r5, r6, r7}\n\t"
  142020. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  142021. "and r8, r8, r12\n\t"
  142022. "and r9, r9, r12\n\t"
  142023. "and r10, r10, r12\n\t"
  142024. "and r11, r11, r12\n\t"
  142025. "adcs r4, r4, r8\n\t"
  142026. "adcs r5, r5, r9\n\t"
  142027. "adcs r6, r6, r10\n\t"
  142028. "adcs r7, r7, r11\n\t"
  142029. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  142030. "ldm %[r], {r4, r5, r6, r7}\n\t"
  142031. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  142032. "and r8, r8, r12\n\t"
  142033. "and r9, r9, r12\n\t"
  142034. "and r10, r10, r12\n\t"
  142035. "and r11, r11, r12\n\t"
  142036. "adcs r4, r4, r8\n\t"
  142037. "adcs r5, r5, r9\n\t"
  142038. "adcs r6, r6, r10\n\t"
  142039. "adcs r7, r7, r11\n\t"
  142040. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  142041. "ldm %[r], {r4, r5, r6, r7}\n\t"
  142042. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  142043. "and r8, r8, r12\n\t"
  142044. "and r9, r9, r12\n\t"
  142045. "and r10, r10, r12\n\t"
  142046. "and r11, r11, r12\n\t"
  142047. "adcs r4, r4, r8\n\t"
  142048. "adcs r5, r5, r9\n\t"
  142049. "adcs r6, r6, r10\n\t"
  142050. "adcs r7, r7, r11\n\t"
  142051. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  142052. "ldm %[r], {r4, r5, r6, r7}\n\t"
  142053. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  142054. "and r8, r8, r12\n\t"
  142055. "and r9, r9, r12\n\t"
  142056. "and r10, r10, r12\n\t"
  142057. "and r11, r11, r12\n\t"
  142058. "adcs r4, r4, r8\n\t"
  142059. "adcs r5, r5, r9\n\t"
  142060. "adcs r6, r6, r10\n\t"
  142061. "adcs r7, r7, r11\n\t"
  142062. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  142063. "ldm %[r], {r4, r5, r6, r7}\n\t"
  142064. "ldm %[m]!, {r8, r9, r10, r11}\n\t"
  142065. "and r8, r8, r12\n\t"
  142066. "and r9, r9, r12\n\t"
  142067. "and r10, r10, r12\n\t"
  142068. "and r11, r11, r12\n\t"
  142069. "adcs r4, r4, r8\n\t"
  142070. "adcs r5, r5, r9\n\t"
  142071. "adcs r6, r6, r10\n\t"
  142072. "adc r7, r7, r11\n\t"
  142073. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  142074. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  142075. :
  142076. : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  142077. );
  142078. }
  142079. #define sp_1024_mont_sub_lower_32 sp_1024_mont_sub_32
  142080. #ifdef WOLFSSL_SP_SMALL
  142081. /* Conditionally add a and b using the mask m.
  142082. * m is -1 to add and 0 when not.
  142083. *
  142084. * r A single precision number representing conditional add result.
  142085. * a A single precision number to add with.
  142086. * b A single precision number to add.
  142087. * m Mask value to apply.
  142088. */
  142089. static sp_digit sp_1024_cond_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  142090. {
  142091. register sp_digit* r asm ("r0") = r_p;
  142092. register const sp_digit* a asm ("r1") = a_p;
  142093. register const sp_digit* b asm ("r2") = b_p;
  142094. register sp_digit m asm ("r3") = m_p;
  142095. __asm__ __volatile__ (
  142096. "mov lr, #0\n\t"
  142097. "mov r6, #0\n\t"
  142098. "mov r12, #0\n\t"
  142099. "\n"
  142100. "L_sp_1024_cond_add_32_words_%=: \n\t"
  142101. "adds lr, lr, #-1\n\t"
  142102. "ldr r4, [%[a], r12]\n\t"
  142103. "ldr r5, [%[b], r12]\n\t"
  142104. "and r5, r5, %[m]\n\t"
  142105. "adcs r4, r4, r5\n\t"
  142106. "adc lr, r6, r6\n\t"
  142107. "str r4, [%[r], r12]\n\t"
  142108. "add r12, r12, #4\n\t"
  142109. "cmp r12, #0x80\n\t"
  142110. "blt L_sp_1024_cond_add_32_words_%=\n\t"
  142111. "mov %[r], lr\n\t"
  142112. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  142113. :
  142114. : "memory", "r12", "lr", "r4", "r5", "r6"
  142115. );
  142116. return (uint32_t)(size_t)r;
  142117. }
  142118. #else
  142119. /* Conditionally add a and b using the mask m.
  142120. * m is -1 to add and 0 when not.
  142121. *
  142122. * r A single precision number representing conditional add result.
  142123. * a A single precision number to add with.
  142124. * b A single precision number to add.
  142125. * m Mask value to apply.
  142126. */
  142127. static sp_digit sp_1024_cond_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p)
  142128. {
  142129. register sp_digit* r asm ("r0") = r_p;
  142130. register const sp_digit* a asm ("r1") = a_p;
  142131. register const sp_digit* b asm ("r2") = b_p;
  142132. register sp_digit m asm ("r3") = m_p;
  142133. __asm__ __volatile__ (
  142134. "mov r8, #0\n\t"
  142135. "ldm %[a]!, {r4, r5}\n\t"
  142136. "ldm %[b]!, {r6, r7}\n\t"
  142137. "and r6, r6, %[m]\n\t"
  142138. "and r7, r7, %[m]\n\t"
  142139. "adds r4, r4, r6\n\t"
  142140. "adcs r5, r5, r7\n\t"
  142141. "stm %[r]!, {r4, r5}\n\t"
  142142. "ldm %[a]!, {r4, r5}\n\t"
  142143. "ldm %[b]!, {r6, r7}\n\t"
  142144. "and r6, r6, %[m]\n\t"
  142145. "and r7, r7, %[m]\n\t"
  142146. "adcs r4, r4, r6\n\t"
  142147. "adcs r5, r5, r7\n\t"
  142148. "stm %[r]!, {r4, r5}\n\t"
  142149. "ldm %[a]!, {r4, r5}\n\t"
  142150. "ldm %[b]!, {r6, r7}\n\t"
  142151. "and r6, r6, %[m]\n\t"
  142152. "and r7, r7, %[m]\n\t"
  142153. "adcs r4, r4, r6\n\t"
  142154. "adcs r5, r5, r7\n\t"
  142155. "stm %[r]!, {r4, r5}\n\t"
  142156. "ldm %[a]!, {r4, r5}\n\t"
  142157. "ldm %[b]!, {r6, r7}\n\t"
  142158. "and r6, r6, %[m]\n\t"
  142159. "and r7, r7, %[m]\n\t"
  142160. "adcs r4, r4, r6\n\t"
  142161. "adcs r5, r5, r7\n\t"
  142162. "stm %[r]!, {r4, r5}\n\t"
  142163. "ldm %[a]!, {r4, r5}\n\t"
  142164. "ldm %[b]!, {r6, r7}\n\t"
  142165. "and r6, r6, %[m]\n\t"
  142166. "and r7, r7, %[m]\n\t"
  142167. "adcs r4, r4, r6\n\t"
  142168. "adcs r5, r5, r7\n\t"
  142169. "stm %[r]!, {r4, r5}\n\t"
  142170. "ldm %[a]!, {r4, r5}\n\t"
  142171. "ldm %[b]!, {r6, r7}\n\t"
  142172. "and r6, r6, %[m]\n\t"
  142173. "and r7, r7, %[m]\n\t"
  142174. "adcs r4, r4, r6\n\t"
  142175. "adcs r5, r5, r7\n\t"
  142176. "stm %[r]!, {r4, r5}\n\t"
  142177. "ldm %[a]!, {r4, r5}\n\t"
  142178. "ldm %[b]!, {r6, r7}\n\t"
  142179. "and r6, r6, %[m]\n\t"
  142180. "and r7, r7, %[m]\n\t"
  142181. "adcs r4, r4, r6\n\t"
  142182. "adcs r5, r5, r7\n\t"
  142183. "stm %[r]!, {r4, r5}\n\t"
  142184. "ldm %[a]!, {r4, r5}\n\t"
  142185. "ldm %[b]!, {r6, r7}\n\t"
  142186. "and r6, r6, %[m]\n\t"
  142187. "and r7, r7, %[m]\n\t"
  142188. "adcs r4, r4, r6\n\t"
  142189. "adcs r5, r5, r7\n\t"
  142190. "stm %[r]!, {r4, r5}\n\t"
  142191. "ldm %[a]!, {r4, r5}\n\t"
  142192. "ldm %[b]!, {r6, r7}\n\t"
  142193. "and r6, r6, %[m]\n\t"
  142194. "and r7, r7, %[m]\n\t"
  142195. "adcs r4, r4, r6\n\t"
  142196. "adcs r5, r5, r7\n\t"
  142197. "stm %[r]!, {r4, r5}\n\t"
  142198. "ldm %[a]!, {r4, r5}\n\t"
  142199. "ldm %[b]!, {r6, r7}\n\t"
  142200. "and r6, r6, %[m]\n\t"
  142201. "and r7, r7, %[m]\n\t"
  142202. "adcs r4, r4, r6\n\t"
  142203. "adcs r5, r5, r7\n\t"
  142204. "stm %[r]!, {r4, r5}\n\t"
  142205. "ldm %[a]!, {r4, r5}\n\t"
  142206. "ldm %[b]!, {r6, r7}\n\t"
  142207. "and r6, r6, %[m]\n\t"
  142208. "and r7, r7, %[m]\n\t"
  142209. "adcs r4, r4, r6\n\t"
  142210. "adcs r5, r5, r7\n\t"
  142211. "stm %[r]!, {r4, r5}\n\t"
  142212. "ldm %[a]!, {r4, r5}\n\t"
  142213. "ldm %[b]!, {r6, r7}\n\t"
  142214. "and r6, r6, %[m]\n\t"
  142215. "and r7, r7, %[m]\n\t"
  142216. "adcs r4, r4, r6\n\t"
  142217. "adcs r5, r5, r7\n\t"
  142218. "stm %[r]!, {r4, r5}\n\t"
  142219. "ldm %[a]!, {r4, r5}\n\t"
  142220. "ldm %[b]!, {r6, r7}\n\t"
  142221. "and r6, r6, %[m]\n\t"
  142222. "and r7, r7, %[m]\n\t"
  142223. "adcs r4, r4, r6\n\t"
  142224. "adcs r5, r5, r7\n\t"
  142225. "stm %[r]!, {r4, r5}\n\t"
  142226. "ldm %[a]!, {r4, r5}\n\t"
  142227. "ldm %[b]!, {r6, r7}\n\t"
  142228. "and r6, r6, %[m]\n\t"
  142229. "and r7, r7, %[m]\n\t"
  142230. "adcs r4, r4, r6\n\t"
  142231. "adcs r5, r5, r7\n\t"
  142232. "stm %[r]!, {r4, r5}\n\t"
  142233. "ldm %[a]!, {r4, r5}\n\t"
  142234. "ldm %[b]!, {r6, r7}\n\t"
  142235. "and r6, r6, %[m]\n\t"
  142236. "and r7, r7, %[m]\n\t"
  142237. "adcs r4, r4, r6\n\t"
  142238. "adcs r5, r5, r7\n\t"
  142239. "stm %[r]!, {r4, r5}\n\t"
  142240. "ldm %[a]!, {r4, r5}\n\t"
  142241. "ldm %[b]!, {r6, r7}\n\t"
  142242. "and r6, r6, %[m]\n\t"
  142243. "and r7, r7, %[m]\n\t"
  142244. "adcs r4, r4, r6\n\t"
  142245. "adcs r5, r5, r7\n\t"
  142246. "stm %[r]!, {r4, r5}\n\t"
  142247. "adc %[r], r8, r8\n\t"
  142248. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m)
  142249. :
  142250. : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8"
  142251. );
  142252. return (uint32_t)(size_t)r;
  142253. }
  142254. #endif /* WOLFSSL_SP_SMALL */
  142255. static void sp_1024_rshift1_32(sp_digit* r_p, const sp_digit* a_p)
  142256. {
  142257. register sp_digit* r asm ("r0") = r_p;
  142258. register const sp_digit* a asm ("r1") = a_p;
  142259. __asm__ __volatile__ (
  142260. "ldm %[a], {r2, r3}\n\t"
  142261. "lsr r2, r2, #1\n\t"
  142262. "orr r2, r2, r3, lsl #31\n\t"
  142263. "lsr r3, r3, #1\n\t"
  142264. "ldr r4, [%[a], #8]\n\t"
  142265. "str r2, [%[r]]\n\t"
  142266. "orr r3, r3, r4, lsl #31\n\t"
  142267. "lsr r4, r4, #1\n\t"
  142268. "ldr r2, [%[a], #12]\n\t"
  142269. "str r3, [%[r], #4]\n\t"
  142270. "orr r4, r4, r2, lsl #31\n\t"
  142271. "lsr r2, r2, #1\n\t"
  142272. "ldr r3, [%[a], #16]\n\t"
  142273. "str r4, [%[r], #8]\n\t"
  142274. "orr r2, r2, r3, lsl #31\n\t"
  142275. "lsr r3, r3, #1\n\t"
  142276. "ldr r4, [%[a], #20]\n\t"
  142277. "str r2, [%[r], #12]\n\t"
  142278. "orr r3, r3, r4, lsl #31\n\t"
  142279. "lsr r4, r4, #1\n\t"
  142280. "ldr r2, [%[a], #24]\n\t"
  142281. "str r3, [%[r], #16]\n\t"
  142282. "orr r4, r4, r2, lsl #31\n\t"
  142283. "lsr r2, r2, #1\n\t"
  142284. "ldr r3, [%[a], #28]\n\t"
  142285. "str r4, [%[r], #20]\n\t"
  142286. "orr r2, r2, r3, lsl #31\n\t"
  142287. "lsr r3, r3, #1\n\t"
  142288. "ldr r4, [%[a], #32]\n\t"
  142289. "str r2, [%[r], #24]\n\t"
  142290. "orr r3, r3, r4, lsl #31\n\t"
  142291. "lsr r4, r4, #1\n\t"
  142292. "ldr r2, [%[a], #36]\n\t"
  142293. "str r3, [%[r], #28]\n\t"
  142294. "orr r4, r4, r2, lsl #31\n\t"
  142295. "lsr r2, r2, #1\n\t"
  142296. "ldr r3, [%[a], #40]\n\t"
  142297. "str r4, [%[r], #32]\n\t"
  142298. "orr r2, r2, r3, lsl #31\n\t"
  142299. "lsr r3, r3, #1\n\t"
  142300. "ldr r4, [%[a], #44]\n\t"
  142301. "str r2, [%[r], #36]\n\t"
  142302. "orr r3, r3, r4, lsl #31\n\t"
  142303. "lsr r4, r4, #1\n\t"
  142304. "ldr r2, [%[a], #48]\n\t"
  142305. "str r3, [%[r], #40]\n\t"
  142306. "orr r4, r4, r2, lsl #31\n\t"
  142307. "lsr r2, r2, #1\n\t"
  142308. "ldr r3, [%[a], #52]\n\t"
  142309. "str r4, [%[r], #44]\n\t"
  142310. "orr r2, r2, r3, lsl #31\n\t"
  142311. "lsr r3, r3, #1\n\t"
  142312. "ldr r4, [%[a], #56]\n\t"
  142313. "str r2, [%[r], #48]\n\t"
  142314. "orr r3, r3, r4, lsl #31\n\t"
  142315. "lsr r4, r4, #1\n\t"
  142316. "ldr r2, [%[a], #60]\n\t"
  142317. "str r3, [%[r], #52]\n\t"
  142318. "orr r4, r4, r2, lsl #31\n\t"
  142319. "lsr r2, r2, #1\n\t"
  142320. "ldr r3, [%[a], #64]\n\t"
  142321. "str r4, [%[r], #56]\n\t"
  142322. "orr r2, r2, r3, lsl #31\n\t"
  142323. "lsr r3, r3, #1\n\t"
  142324. "ldr r4, [%[a], #68]\n\t"
  142325. "str r2, [%[r], #60]\n\t"
  142326. "orr r3, r3, r4, lsl #31\n\t"
  142327. "lsr r4, r4, #1\n\t"
  142328. "ldr r2, [%[a], #72]\n\t"
  142329. "str r3, [%[r], #64]\n\t"
  142330. "orr r4, r4, r2, lsl #31\n\t"
  142331. "lsr r2, r2, #1\n\t"
  142332. "ldr r3, [%[a], #76]\n\t"
  142333. "str r4, [%[r], #68]\n\t"
  142334. "orr r2, r2, r3, lsl #31\n\t"
  142335. "lsr r3, r3, #1\n\t"
  142336. "ldr r4, [%[a], #80]\n\t"
  142337. "str r2, [%[r], #72]\n\t"
  142338. "orr r3, r3, r4, lsl #31\n\t"
  142339. "lsr r4, r4, #1\n\t"
  142340. "ldr r2, [%[a], #84]\n\t"
  142341. "str r3, [%[r], #76]\n\t"
  142342. "orr r4, r4, r2, lsl #31\n\t"
  142343. "lsr r2, r2, #1\n\t"
  142344. "ldr r3, [%[a], #88]\n\t"
  142345. "str r4, [%[r], #80]\n\t"
  142346. "orr r2, r2, r3, lsl #31\n\t"
  142347. "lsr r3, r3, #1\n\t"
  142348. "ldr r4, [%[a], #92]\n\t"
  142349. "str r2, [%[r], #84]\n\t"
  142350. "orr r3, r3, r4, lsl #31\n\t"
  142351. "lsr r4, r4, #1\n\t"
  142352. "ldr r2, [%[a], #96]\n\t"
  142353. "str r3, [%[r], #88]\n\t"
  142354. "orr r4, r4, r2, lsl #31\n\t"
  142355. "lsr r2, r2, #1\n\t"
  142356. "ldr r3, [%[a], #100]\n\t"
  142357. "str r4, [%[r], #92]\n\t"
  142358. "orr r2, r2, r3, lsl #31\n\t"
  142359. "lsr r3, r3, #1\n\t"
  142360. "ldr r4, [%[a], #104]\n\t"
  142361. "str r2, [%[r], #96]\n\t"
  142362. "orr r3, r3, r4, lsl #31\n\t"
  142363. "lsr r4, r4, #1\n\t"
  142364. "ldr r2, [%[a], #108]\n\t"
  142365. "str r3, [%[r], #100]\n\t"
  142366. "orr r4, r4, r2, lsl #31\n\t"
  142367. "lsr r2, r2, #1\n\t"
  142368. "ldr r3, [%[a], #112]\n\t"
  142369. "str r4, [%[r], #104]\n\t"
  142370. "orr r2, r2, r3, lsl #31\n\t"
  142371. "lsr r3, r3, #1\n\t"
  142372. "ldr r4, [%[a], #116]\n\t"
  142373. "str r2, [%[r], #108]\n\t"
  142374. "orr r3, r3, r4, lsl #31\n\t"
  142375. "lsr r4, r4, #1\n\t"
  142376. "ldr r2, [%[a], #120]\n\t"
  142377. "str r3, [%[r], #112]\n\t"
  142378. "orr r4, r4, r2, lsl #31\n\t"
  142379. "lsr r2, r2, #1\n\t"
  142380. "ldr r3, [%[a], #124]\n\t"
  142381. "str r4, [%[r], #116]\n\t"
  142382. "orr r2, r2, r3, lsl #31\n\t"
  142383. "lsr r3, r3, #1\n\t"
  142384. "str r2, [%[r], #120]\n\t"
  142385. "str r3, [%[r], #124]\n\t"
  142386. : [r] "+r" (r), [a] "+r" (a)
  142387. :
  142388. : "memory", "r2", "r3", "r4"
  142389. );
  142390. }
  142391. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  142392. *
  142393. * r Result of division by 2.
  142394. * a Number to divide.
  142395. * m Modulus (prime).
  142396. */
  142397. static void sp_1024_div2_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  142398. {
  142399. sp_digit o;
  142400. o = sp_1024_cond_add_32(r, a, m, 0 - (a[0] & 1));
  142401. sp_1024_rshift1_32(r, r);
  142402. r[31] |= o << 31;
  142403. }
  142404. /* Double the Montgomery form projective point p.
  142405. *
  142406. * r Result of doubling point.
  142407. * p Point to double.
  142408. * t Temporary ordinate data.
  142409. */
  142410. #ifdef WOLFSSL_SP_NONBLOCK
  142411. typedef struct sp_1024_proj_point_dbl_32_ctx {
  142412. int state;
  142413. sp_digit* t1;
  142414. sp_digit* t2;
  142415. sp_digit* x;
  142416. sp_digit* y;
  142417. sp_digit* z;
  142418. } sp_1024_proj_point_dbl_32_ctx;
  142419. static int sp_1024_proj_point_dbl_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, const sp_point_1024* p, sp_digit* t)
  142420. {
  142421. int err = FP_WOULDBLOCK;
  142422. sp_1024_proj_point_dbl_32_ctx* ctx = (sp_1024_proj_point_dbl_32_ctx*)sp_ctx->data;
  142423. typedef char ctx_size_test[sizeof(sp_1024_proj_point_dbl_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  142424. (void)sizeof(ctx_size_test);
  142425. switch (ctx->state) {
  142426. case 0:
  142427. ctx->t1 = t;
  142428. ctx->t2 = t + 2*32;
  142429. ctx->x = r->x;
  142430. ctx->y = r->y;
  142431. ctx->z = r->z;
  142432. /* Put infinity into result. */
  142433. if (r != p) {
  142434. r->infinity = p->infinity;
  142435. }
  142436. ctx->state = 1;
  142437. break;
  142438. case 1:
  142439. /* T1 = Z * Z */
  142440. sp_1024_mont_sqr_32(ctx->t1, p->z, p1024_mod, p1024_mp_mod);
  142441. ctx->state = 2;
  142442. break;
  142443. case 2:
  142444. /* Z = Y * Z */
  142445. sp_1024_mont_mul_32(ctx->z, p->y, p->z, p1024_mod, p1024_mp_mod);
  142446. ctx->state = 3;
  142447. break;
  142448. case 3:
  142449. /* Z = 2Z */
  142450. sp_1024_mont_dbl_32(ctx->z, ctx->z, p1024_mod);
  142451. ctx->state = 4;
  142452. break;
  142453. case 4:
  142454. /* T2 = X - T1 */
  142455. sp_1024_mont_sub_32(ctx->t2, p->x, ctx->t1, p1024_mod);
  142456. ctx->state = 5;
  142457. break;
  142458. case 5:
  142459. /* T1 = X + T1 */
  142460. sp_1024_mont_add_32(ctx->t1, p->x, ctx->t1, p1024_mod);
  142461. ctx->state = 6;
  142462. break;
  142463. case 6:
  142464. /* T2 = T1 * T2 */
  142465. sp_1024_mont_mul_32(ctx->t2, ctx->t1, ctx->t2, p1024_mod, p1024_mp_mod);
  142466. ctx->state = 7;
  142467. break;
  142468. case 7:
  142469. /* T1 = 3T2 */
  142470. sp_1024_mont_tpl_32(ctx->t1, ctx->t2, p1024_mod);
  142471. ctx->state = 8;
  142472. break;
  142473. case 8:
  142474. /* Y = 2Y */
  142475. sp_1024_mont_dbl_32(ctx->y, p->y, p1024_mod);
  142476. ctx->state = 9;
  142477. break;
  142478. case 9:
  142479. /* Y = Y * Y */
  142480. sp_1024_mont_sqr_32(ctx->y, ctx->y, p1024_mod, p1024_mp_mod);
  142481. ctx->state = 10;
  142482. break;
  142483. case 10:
  142484. /* T2 = Y * Y */
  142485. sp_1024_mont_sqr_32(ctx->t2, ctx->y, p1024_mod, p1024_mp_mod);
  142486. ctx->state = 11;
  142487. break;
  142488. case 11:
  142489. /* T2 = T2/2 */
  142490. sp_1024_div2_32(ctx->t2, ctx->t2, p1024_mod);
  142491. ctx->state = 12;
  142492. break;
  142493. case 12:
  142494. /* Y = Y * X */
  142495. sp_1024_mont_mul_32(ctx->y, ctx->y, p->x, p1024_mod, p1024_mp_mod);
  142496. ctx->state = 13;
  142497. break;
  142498. case 13:
  142499. /* X = T1 * T1 */
  142500. sp_1024_mont_sqr_32(ctx->x, ctx->t1, p1024_mod, p1024_mp_mod);
  142501. ctx->state = 14;
  142502. break;
  142503. case 14:
  142504. /* X = X - Y */
  142505. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  142506. ctx->state = 15;
  142507. break;
  142508. case 15:
  142509. /* X = X - Y */
  142510. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  142511. ctx->state = 16;
  142512. break;
  142513. case 16:
  142514. /* Y = Y - X */
  142515. sp_1024_mont_sub_lower_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  142516. ctx->state = 17;
  142517. break;
  142518. case 17:
  142519. /* Y = Y * T1 */
  142520. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t1, p1024_mod, p1024_mp_mod);
  142521. ctx->state = 18;
  142522. break;
  142523. case 18:
  142524. /* Y = Y - T2 */
  142525. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t2, p1024_mod);
  142526. ctx->state = 19;
  142527. /* fall-through */
  142528. case 19:
  142529. err = MP_OKAY;
  142530. break;
  142531. }
  142532. if (err == MP_OKAY && ctx->state != 19) {
  142533. err = FP_WOULDBLOCK;
  142534. }
  142535. return err;
  142536. }
  142537. #endif /* WOLFSSL_SP_NONBLOCK */
  142538. static void sp_1024_proj_point_dbl_32(sp_point_1024* r, const sp_point_1024* p,
  142539. sp_digit* t)
  142540. {
  142541. sp_digit* t1 = t;
  142542. sp_digit* t2 = t + 2*32;
  142543. sp_digit* x;
  142544. sp_digit* y;
  142545. sp_digit* z;
  142546. x = r->x;
  142547. y = r->y;
  142548. z = r->z;
  142549. /* Put infinity into result. */
  142550. if (r != p) {
  142551. r->infinity = p->infinity;
  142552. }
  142553. /* T1 = Z * Z */
  142554. sp_1024_mont_sqr_32(t1, p->z, p1024_mod, p1024_mp_mod);
  142555. /* Z = Y * Z */
  142556. sp_1024_mont_mul_32(z, p->y, p->z, p1024_mod, p1024_mp_mod);
  142557. /* Z = 2Z */
  142558. sp_1024_mont_dbl_32(z, z, p1024_mod);
  142559. /* T2 = X - T1 */
  142560. sp_1024_mont_sub_32(t2, p->x, t1, p1024_mod);
  142561. /* T1 = X + T1 */
  142562. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  142563. /* T2 = T1 * T2 */
  142564. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  142565. /* T1 = 3T2 */
  142566. sp_1024_mont_tpl_32(t1, t2, p1024_mod);
  142567. /* Y = 2Y */
  142568. sp_1024_mont_dbl_32(y, p->y, p1024_mod);
  142569. /* Y = Y * Y */
  142570. sp_1024_mont_sqr_32(y, y, p1024_mod, p1024_mp_mod);
  142571. /* T2 = Y * Y */
  142572. sp_1024_mont_sqr_32(t2, y, p1024_mod, p1024_mp_mod);
  142573. /* T2 = T2/2 */
  142574. sp_1024_div2_32(t2, t2, p1024_mod);
  142575. /* Y = Y * X */
  142576. sp_1024_mont_mul_32(y, y, p->x, p1024_mod, p1024_mp_mod);
  142577. /* X = T1 * T1 */
  142578. sp_1024_mont_sqr_32(x, t1, p1024_mod, p1024_mp_mod);
  142579. /* X = X - Y */
  142580. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  142581. /* X = X - Y */
  142582. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  142583. /* Y = Y - X */
  142584. sp_1024_mont_sub_lower_32(y, y, x, p1024_mod);
  142585. /* Y = Y * T1 */
  142586. sp_1024_mont_mul_32(y, y, t1, p1024_mod, p1024_mp_mod);
  142587. /* Y = Y - T2 */
  142588. sp_1024_mont_sub_32(y, y, t2, p1024_mod);
  142589. }
  142590. #ifdef WOLFSSL_SP_SMALL
  142591. /* Sub b from a into r. (r = a - b)
  142592. *
  142593. * r A single precision integer.
  142594. * a A single precision integer.
  142595. * b A single precision integer.
  142596. */
  142597. static sp_digit sp_1024_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  142598. {
  142599. register sp_digit* r asm ("r0") = r_p;
  142600. register const sp_digit* a asm ("r1") = a_p;
  142601. register const sp_digit* b asm ("r2") = b_p;
  142602. __asm__ __volatile__ (
  142603. "mov r12, #0\n\t"
  142604. "add lr, %[a], #0x80\n\t"
  142605. "\n"
  142606. "L_sp_1024_sub_32_word_%=: \n\t"
  142607. "rsbs r12, r12, #0\n\t"
  142608. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  142609. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  142610. "sbcs r3, r3, r7\n\t"
  142611. "sbcs r4, r4, r8\n\t"
  142612. "sbcs r5, r5, r9\n\t"
  142613. "sbcs r6, r6, r10\n\t"
  142614. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  142615. "sbc r12, r3, r3\n\t"
  142616. "cmp %[a], lr\n\t"
  142617. "bne L_sp_1024_sub_32_word_%=\n\t"
  142618. "mov %[r], r12\n\t"
  142619. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  142620. :
  142621. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr"
  142622. );
  142623. return (uint32_t)(size_t)r;
  142624. }
  142625. #else
  142626. /* Sub b from a into r. (r = a - b)
  142627. *
  142628. * r A single precision integer.
  142629. * a A single precision integer.
  142630. * b A single precision integer.
  142631. */
  142632. static sp_digit sp_1024_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p)
  142633. {
  142634. register sp_digit* r asm ("r0") = r_p;
  142635. register const sp_digit* a asm ("r1") = a_p;
  142636. register const sp_digit* b asm ("r2") = b_p;
  142637. __asm__ __volatile__ (
  142638. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  142639. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  142640. "subs r3, r3, r7\n\t"
  142641. "sbcs r4, r4, r8\n\t"
  142642. "sbcs r5, r5, r9\n\t"
  142643. "sbcs r6, r6, r10\n\t"
  142644. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  142645. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  142646. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  142647. "sbcs r3, r3, r7\n\t"
  142648. "sbcs r4, r4, r8\n\t"
  142649. "sbcs r5, r5, r9\n\t"
  142650. "sbcs r6, r6, r10\n\t"
  142651. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  142652. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  142653. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  142654. "sbcs r3, r3, r7\n\t"
  142655. "sbcs r4, r4, r8\n\t"
  142656. "sbcs r5, r5, r9\n\t"
  142657. "sbcs r6, r6, r10\n\t"
  142658. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  142659. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  142660. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  142661. "sbcs r3, r3, r7\n\t"
  142662. "sbcs r4, r4, r8\n\t"
  142663. "sbcs r5, r5, r9\n\t"
  142664. "sbcs r6, r6, r10\n\t"
  142665. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  142666. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  142667. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  142668. "sbcs r3, r3, r7\n\t"
  142669. "sbcs r4, r4, r8\n\t"
  142670. "sbcs r5, r5, r9\n\t"
  142671. "sbcs r6, r6, r10\n\t"
  142672. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  142673. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  142674. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  142675. "sbcs r3, r3, r7\n\t"
  142676. "sbcs r4, r4, r8\n\t"
  142677. "sbcs r5, r5, r9\n\t"
  142678. "sbcs r6, r6, r10\n\t"
  142679. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  142680. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  142681. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  142682. "sbcs r3, r3, r7\n\t"
  142683. "sbcs r4, r4, r8\n\t"
  142684. "sbcs r5, r5, r9\n\t"
  142685. "sbcs r6, r6, r10\n\t"
  142686. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  142687. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  142688. "ldm %[b]!, {r7, r8, r9, r10}\n\t"
  142689. "sbcs r3, r3, r7\n\t"
  142690. "sbcs r4, r4, r8\n\t"
  142691. "sbcs r5, r5, r9\n\t"
  142692. "sbcs r6, r6, r10\n\t"
  142693. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  142694. "sbc %[r], r6, r6\n\t"
  142695. : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
  142696. :
  142697. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  142698. );
  142699. return (uint32_t)(size_t)r;
  142700. }
  142701. #endif /* WOLFSSL_SP_SMALL */
  142702. /* Compare two numbers to determine if they are equal.
  142703. * Constant time implementation.
  142704. *
  142705. * a First number to compare.
  142706. * b Second number to compare.
  142707. * returns 1 when equal and 0 otherwise.
  142708. */
  142709. static int sp_1024_cmp_equal_32(const sp_digit* a, const sp_digit* b)
  142710. {
  142711. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  142712. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  142713. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  142714. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  142715. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  142716. (a[15] ^ b[15]) | (a[16] ^ b[16]) | (a[17] ^ b[17]) |
  142717. (a[18] ^ b[18]) | (a[19] ^ b[19]) | (a[20] ^ b[20]) |
  142718. (a[21] ^ b[21]) | (a[22] ^ b[22]) | (a[23] ^ b[23]) |
  142719. (a[24] ^ b[24]) | (a[25] ^ b[25]) | (a[26] ^ b[26]) |
  142720. (a[27] ^ b[27]) | (a[28] ^ b[28]) | (a[29] ^ b[29]) |
  142721. (a[30] ^ b[30]) | (a[31] ^ b[31])) == 0;
  142722. }
  142723. /* Returns 1 if the number of zero.
  142724. * Implementation is constant time.
  142725. *
  142726. * a Number to check.
  142727. * returns 1 if the number is zero and 0 otherwise.
  142728. */
  142729. static int sp_1024_iszero_32(const sp_digit* a)
  142730. {
  142731. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  142732. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  142733. a[16] | a[17] | a[18] | a[19] | a[20] | a[21] | a[22] | a[23] |
  142734. a[24] | a[25] | a[26] | a[27] | a[28] | a[29] | a[30] | a[31]) == 0;
  142735. }
  142736. /* Add two Montgomery form projective points.
  142737. *
  142738. * r Result of addition.
  142739. * p First point to add.
  142740. * q Second point to add.
  142741. * t Temporary ordinate data.
  142742. */
  142743. #ifdef WOLFSSL_SP_NONBLOCK
  142744. typedef struct sp_1024_proj_point_add_32_ctx {
  142745. int state;
  142746. sp_1024_proj_point_dbl_32_ctx dbl_ctx;
  142747. const sp_point_1024* ap[2];
  142748. sp_point_1024* rp[2];
  142749. sp_digit* t1;
  142750. sp_digit* t2;
  142751. sp_digit* t3;
  142752. sp_digit* t4;
  142753. sp_digit* t5;
  142754. sp_digit* t6;
  142755. sp_digit* x;
  142756. sp_digit* y;
  142757. sp_digit* z;
  142758. } sp_1024_proj_point_add_32_ctx;
  142759. static int sp_1024_proj_point_add_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r,
  142760. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  142761. {
  142762. int err = FP_WOULDBLOCK;
  142763. sp_1024_proj_point_add_32_ctx* ctx = (sp_1024_proj_point_add_32_ctx*)sp_ctx->data;
  142764. /* Ensure only the first point is the same as the result. */
  142765. if (q == r) {
  142766. const sp_point_1024* a = p;
  142767. p = q;
  142768. q = a;
  142769. }
  142770. typedef char ctx_size_test[sizeof(sp_1024_proj_point_add_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  142771. (void)sizeof(ctx_size_test);
  142772. switch (ctx->state) {
  142773. case 0: /* INIT */
  142774. ctx->t1 = t;
  142775. ctx->t2 = t + 2*32;
  142776. ctx->t3 = t + 4*32;
  142777. ctx->t4 = t + 6*32;
  142778. ctx->t5 = t + 8*32;
  142779. ctx->t6 = t + 10*32;
  142780. ctx->x = ctx->t6;
  142781. ctx->y = ctx->t1;
  142782. ctx->z = ctx->t2;
  142783. ctx->state = 1;
  142784. break;
  142785. case 1:
  142786. /* Check double */
  142787. (void)sp_1024_sub_32(ctx->t1, p1024_mod, q->y);
  142788. sp_1024_norm_32(ctx->t1);
  142789. if ((~p->infinity & ~q->infinity &
  142790. sp_1024_cmp_equal_32(p->x, q->x) & sp_1024_cmp_equal_32(p->z, q->z) &
  142791. (sp_1024_cmp_equal_32(p->y, q->y) | sp_1024_cmp_equal_32(p->y, ctx->t1))) != 0)
  142792. {
  142793. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  142794. ctx->state = 2;
  142795. }
  142796. else {
  142797. ctx->state = 3;
  142798. }
  142799. break;
  142800. case 2:
  142801. err = sp_1024_proj_point_dbl_32_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  142802. if (err == MP_OKAY)
  142803. ctx->state = 27; /* done */
  142804. break;
  142805. case 3:
  142806. {
  142807. ctx->state = 4;
  142808. break;
  142809. }
  142810. case 4:
  142811. /* U1 = X1*Z2^2 */
  142812. sp_1024_mont_sqr_32(ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  142813. ctx->state = 5;
  142814. break;
  142815. case 5:
  142816. sp_1024_mont_mul_32(ctx->t3, ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  142817. ctx->state = 6;
  142818. break;
  142819. case 6:
  142820. sp_1024_mont_mul_32(ctx->t1, ctx->t1, p->x, p1024_mod, p1024_mp_mod);
  142821. ctx->state = 7;
  142822. break;
  142823. case 7:
  142824. /* U2 = X2*Z1^2 */
  142825. sp_1024_mont_sqr_32(ctx->t2, p->z, p1024_mod, p1024_mp_mod);
  142826. ctx->state = 8;
  142827. break;
  142828. case 8:
  142829. sp_1024_mont_mul_32(ctx->t4, ctx->t2, p->z, p1024_mod, p1024_mp_mod);
  142830. ctx->state = 9;
  142831. break;
  142832. case 9:
  142833. sp_1024_mont_mul_32(ctx->t2, ctx->t2, q->x, p1024_mod, p1024_mp_mod);
  142834. ctx->state = 10;
  142835. break;
  142836. case 10:
  142837. /* S1 = Y1*Z2^3 */
  142838. sp_1024_mont_mul_32(ctx->t3, ctx->t3, p->y, p1024_mod, p1024_mp_mod);
  142839. ctx->state = 11;
  142840. break;
  142841. case 11:
  142842. /* S2 = Y2*Z1^3 */
  142843. sp_1024_mont_mul_32(ctx->t4, ctx->t4, q->y, p1024_mod, p1024_mp_mod);
  142844. ctx->state = 12;
  142845. break;
  142846. case 12:
  142847. /* H = U2 - U1 */
  142848. sp_1024_mont_sub_32(ctx->t2, ctx->t2, ctx->t1, p1024_mod);
  142849. ctx->state = 13;
  142850. break;
  142851. case 13:
  142852. /* R = S2 - S1 */
  142853. sp_1024_mont_sub_32(ctx->t4, ctx->t4, ctx->t3, p1024_mod);
  142854. ctx->state = 14;
  142855. break;
  142856. case 14:
  142857. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  142858. sp_1024_mont_sqr_32(ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  142859. ctx->state = 15;
  142860. break;
  142861. case 15:
  142862. sp_1024_mont_mul_32(ctx->y, ctx->t1, ctx->t5, p1024_mod, p1024_mp_mod);
  142863. ctx->state = 16;
  142864. break;
  142865. case 16:
  142866. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  142867. ctx->state = 17;
  142868. break;
  142869. case 17:
  142870. /* Z3 = H*Z1*Z2 */
  142871. sp_1024_mont_mul_32(ctx->z, p->z, ctx->t2, p1024_mod, p1024_mp_mod);
  142872. ctx->state = 18;
  142873. break;
  142874. case 18:
  142875. sp_1024_mont_mul_32(ctx->z, ctx->z, q->z, p1024_mod, p1024_mp_mod);
  142876. ctx->state = 19;
  142877. break;
  142878. case 19:
  142879. sp_1024_mont_sqr_32(ctx->x, ctx->t4, p1024_mod, p1024_mp_mod);
  142880. ctx->state = 20;
  142881. break;
  142882. case 20:
  142883. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t5, p1024_mod);
  142884. ctx->state = 21;
  142885. break;
  142886. case 21:
  142887. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t3, p1024_mod, p1024_mp_mod);
  142888. ctx->state = 22;
  142889. break;
  142890. case 22:
  142891. sp_1024_mont_dbl_32(ctx->t3, ctx->y, p1024_mod);
  142892. ctx->state = 23;
  142893. break;
  142894. case 23:
  142895. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t3, p1024_mod);
  142896. ctx->state = 24;
  142897. break;
  142898. case 24:
  142899. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  142900. sp_1024_mont_sub_lower_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  142901. ctx->state = 25;
  142902. break;
  142903. case 25:
  142904. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t4, p1024_mod, p1024_mp_mod);
  142905. ctx->state = 26;
  142906. break;
  142907. case 26:
  142908. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t5, p1024_mod);
  142909. ctx->state = 27;
  142910. /* fall-through */
  142911. case 27:
  142912. {
  142913. int i;
  142914. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  142915. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  142916. sp_digit maskt = ~(maskp | maskq);
  142917. for (i = 0; i < 32; i++) {
  142918. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  142919. (ctx->x[i] & maskt);
  142920. }
  142921. for (i = 0; i < 32; i++) {
  142922. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  142923. (ctx->y[i] & maskt);
  142924. }
  142925. for (i = 0; i < 32; i++) {
  142926. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  142927. (ctx->z[i] & maskt);
  142928. }
  142929. r->z[0] |= p->infinity & q->infinity;
  142930. r->infinity = p->infinity & q->infinity;
  142931. err = MP_OKAY;
  142932. break;
  142933. }
  142934. }
  142935. if (err == MP_OKAY && ctx->state != 27) {
  142936. err = FP_WOULDBLOCK;
  142937. }
  142938. return err;
  142939. }
  142940. #endif /* WOLFSSL_SP_NONBLOCK */
  142941. static void sp_1024_proj_point_add_32(sp_point_1024* r,
  142942. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  142943. {
  142944. sp_digit* t1 = t;
  142945. sp_digit* t2 = t + 2*32;
  142946. sp_digit* t3 = t + 4*32;
  142947. sp_digit* t4 = t + 6*32;
  142948. sp_digit* t5 = t + 8*32;
  142949. sp_digit* t6 = t + 10*32;
  142950. /* Check double */
  142951. (void)sp_1024_mont_sub_32(t1, p1024_mod, q->y, p1024_mod);
  142952. sp_1024_norm_32(t1);
  142953. if ((~p->infinity & ~q->infinity &
  142954. sp_1024_cmp_equal_32(p->x, q->x) & sp_1024_cmp_equal_32(p->z, q->z) &
  142955. (sp_1024_cmp_equal_32(p->y, q->y) | sp_1024_cmp_equal_32(p->y, t1))) != 0) {
  142956. sp_1024_proj_point_dbl_32(r, p, t);
  142957. }
  142958. else {
  142959. sp_digit maskp;
  142960. sp_digit maskq;
  142961. sp_digit maskt;
  142962. sp_digit* x = t6;
  142963. sp_digit* y = t1;
  142964. sp_digit* z = t2;
  142965. int i;
  142966. maskp = 0 - (q->infinity & (!p->infinity));
  142967. maskq = 0 - (p->infinity & (!q->infinity));
  142968. maskt = ~(maskp | maskq);
  142969. /* U1 = X1*Z2^2 */
  142970. sp_1024_mont_sqr_32(t1, q->z, p1024_mod, p1024_mp_mod);
  142971. sp_1024_mont_mul_32(t3, t1, q->z, p1024_mod, p1024_mp_mod);
  142972. sp_1024_mont_mul_32(t1, t1, p->x, p1024_mod, p1024_mp_mod);
  142973. /* U2 = X2*Z1^2 */
  142974. sp_1024_mont_sqr_32(t2, p->z, p1024_mod, p1024_mp_mod);
  142975. sp_1024_mont_mul_32(t4, t2, p->z, p1024_mod, p1024_mp_mod);
  142976. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  142977. /* S1 = Y1*Z2^3 */
  142978. sp_1024_mont_mul_32(t3, t3, p->y, p1024_mod, p1024_mp_mod);
  142979. /* S2 = Y2*Z1^3 */
  142980. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  142981. /* H = U2 - U1 */
  142982. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  142983. /* R = S2 - S1 */
  142984. sp_1024_mont_sub_32(t4, t4, t3, p1024_mod);
  142985. if (~p->infinity & ~q->infinity &
  142986. sp_1024_iszero_32(t2) & sp_1024_iszero_32(t4) & maskt) {
  142987. sp_1024_proj_point_dbl_32(r, p, t);
  142988. }
  142989. else {
  142990. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  142991. sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod);
  142992. sp_1024_mont_mul_32(y, t1, t5, p1024_mod, p1024_mp_mod);
  142993. sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod);
  142994. /* Z3 = H*Z1*Z2 */
  142995. sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod);
  142996. sp_1024_mont_mul_32(z, z, q->z, p1024_mod, p1024_mp_mod);
  142997. sp_1024_mont_sqr_32(x, t4, p1024_mod, p1024_mp_mod);
  142998. sp_1024_mont_sub_32(x, x, t5, p1024_mod);
  142999. sp_1024_mont_mul_32(t5, t5, t3, p1024_mod, p1024_mp_mod);
  143000. sp_1024_mont_dbl_32(t3, y, p1024_mod);
  143001. sp_1024_mont_sub_32(x, x, t3, p1024_mod);
  143002. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  143003. sp_1024_mont_sub_lower_32(y, y, x, p1024_mod);
  143004. sp_1024_mont_mul_32(y, y, t4, p1024_mod, p1024_mp_mod);
  143005. sp_1024_mont_sub_32(y, y, t5, p1024_mod);
  143006. for (i = 0; i < 32; i++) {
  143007. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  143008. (x[i] & maskt);
  143009. }
  143010. for (i = 0; i < 32; i++) {
  143011. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  143012. (y[i] & maskt);
  143013. }
  143014. for (i = 0; i < 32; i++) {
  143015. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  143016. (z[i] & maskt);
  143017. }
  143018. r->z[0] |= p->infinity & q->infinity;
  143019. r->infinity = p->infinity & q->infinity;
  143020. }
  143021. }
  143022. }
  143023. /* Multiply the point by the scalar and return the result.
  143024. * If map is true then convert result to affine coordinates.
  143025. *
  143026. * Fast implementation that generates a pre-computation table.
  143027. * 4 bits of window (no sliding!).
  143028. * Uses add and double for calculating table.
  143029. * 1024 doubles.
  143030. * 268 adds.
  143031. *
  143032. * r Resulting point.
  143033. * g Point to multiply.
  143034. * k Scalar to multiply by.
  143035. * map Indicates whether to convert result to affine.
  143036. * ct Constant time required.
  143037. * heap Heap to use for allocation.
  143038. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  143039. */
  143040. static int sp_1024_ecc_mulmod_fast_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  143041. int map, int ct, void* heap)
  143042. {
  143043. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143044. sp_point_1024* t = NULL;
  143045. sp_digit* tmp = NULL;
  143046. #else
  143047. sp_point_1024 t[16 + 1];
  143048. sp_digit tmp[2 * 32 * 6];
  143049. #endif
  143050. sp_point_1024* rt = NULL;
  143051. sp_digit n;
  143052. int i;
  143053. int c;
  143054. int y;
  143055. int err = MP_OKAY;
  143056. /* Constant time used for cache attack resistance implementation. */
  143057. (void)ct;
  143058. (void)heap;
  143059. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143060. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * (16 + 1),
  143061. heap, DYNAMIC_TYPE_ECC);
  143062. if (t == NULL)
  143063. err = MEMORY_E;
  143064. if (err == MP_OKAY) {
  143065. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 6, heap,
  143066. DYNAMIC_TYPE_ECC);
  143067. if (tmp == NULL)
  143068. err = MEMORY_E;
  143069. }
  143070. #endif
  143071. if (err == MP_OKAY) {
  143072. rt = t + 16;
  143073. /* t[0] = {0, 0, 1} * norm */
  143074. XMEMSET(&t[0], 0, sizeof(t[0]));
  143075. t[0].infinity = 1;
  143076. /* t[1] = {g->x, g->y, g->z} * norm */
  143077. (void)sp_1024_mod_mul_norm_32(t[1].x, g->x, p1024_mod);
  143078. (void)sp_1024_mod_mul_norm_32(t[1].y, g->y, p1024_mod);
  143079. (void)sp_1024_mod_mul_norm_32(t[1].z, g->z, p1024_mod);
  143080. t[1].infinity = 0;
  143081. sp_1024_proj_point_dbl_32(&t[ 2], &t[ 1], tmp);
  143082. t[ 2].infinity = 0;
  143083. sp_1024_proj_point_add_32(&t[ 3], &t[ 2], &t[ 1], tmp);
  143084. t[ 3].infinity = 0;
  143085. sp_1024_proj_point_dbl_32(&t[ 4], &t[ 2], tmp);
  143086. t[ 4].infinity = 0;
  143087. sp_1024_proj_point_add_32(&t[ 5], &t[ 3], &t[ 2], tmp);
  143088. t[ 5].infinity = 0;
  143089. sp_1024_proj_point_dbl_32(&t[ 6], &t[ 3], tmp);
  143090. t[ 6].infinity = 0;
  143091. sp_1024_proj_point_add_32(&t[ 7], &t[ 4], &t[ 3], tmp);
  143092. t[ 7].infinity = 0;
  143093. sp_1024_proj_point_dbl_32(&t[ 8], &t[ 4], tmp);
  143094. t[ 8].infinity = 0;
  143095. sp_1024_proj_point_add_32(&t[ 9], &t[ 5], &t[ 4], tmp);
  143096. t[ 9].infinity = 0;
  143097. sp_1024_proj_point_dbl_32(&t[10], &t[ 5], tmp);
  143098. t[10].infinity = 0;
  143099. sp_1024_proj_point_add_32(&t[11], &t[ 6], &t[ 5], tmp);
  143100. t[11].infinity = 0;
  143101. sp_1024_proj_point_dbl_32(&t[12], &t[ 6], tmp);
  143102. t[12].infinity = 0;
  143103. sp_1024_proj_point_add_32(&t[13], &t[ 7], &t[ 6], tmp);
  143104. t[13].infinity = 0;
  143105. sp_1024_proj_point_dbl_32(&t[14], &t[ 7], tmp);
  143106. t[14].infinity = 0;
  143107. sp_1024_proj_point_add_32(&t[15], &t[ 8], &t[ 7], tmp);
  143108. t[15].infinity = 0;
  143109. i = 30;
  143110. n = k[i+1] << 0;
  143111. c = 28;
  143112. y = (int)(n >> 28);
  143113. XMEMCPY(rt, &t[y], sizeof(sp_point_1024));
  143114. n <<= 4;
  143115. for (; i>=0 || c>=4; ) {
  143116. if (c < 4) {
  143117. n |= k[i--];
  143118. c += 32;
  143119. }
  143120. y = (n >> 28) & 0xf;
  143121. n <<= 4;
  143122. c -= 4;
  143123. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  143124. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  143125. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  143126. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  143127. sp_1024_proj_point_add_32(rt, rt, &t[y], tmp);
  143128. }
  143129. if (map != 0) {
  143130. sp_1024_map_32(r, rt, tmp);
  143131. }
  143132. else {
  143133. XMEMCPY(r, rt, sizeof(sp_point_1024));
  143134. }
  143135. }
  143136. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143137. if (tmp != NULL)
  143138. #endif
  143139. {
  143140. ForceZero(tmp, sizeof(sp_digit) * 2 * 32 * 6);
  143141. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143142. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  143143. #endif
  143144. }
  143145. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143146. if (t != NULL)
  143147. #endif
  143148. {
  143149. ForceZero(t, sizeof(sp_point_1024) * 17);
  143150. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143151. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  143152. #endif
  143153. }
  143154. return err;
  143155. }
  143156. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  143157. #define sp_1024_mont_dbl_lower_32 sp_1024_mont_dbl_32
  143158. #define sp_1024_mont_tpl_lower_32 sp_1024_mont_tpl_32
  143159. /* Double the Montgomery form projective point p a number of times.
  143160. *
  143161. * r Result of repeated doubling of point.
  143162. * p Point to double.
  143163. * n Number of times to double
  143164. * t Temporary ordinate data.
  143165. */
  143166. static void sp_1024_proj_point_dbl_n_32(sp_point_1024* p, int i,
  143167. sp_digit* t)
  143168. {
  143169. sp_digit* w = t;
  143170. sp_digit* a = t + 2*32;
  143171. sp_digit* b = t + 4*32;
  143172. sp_digit* t1 = t + 6*32;
  143173. sp_digit* t2 = t + 8*32;
  143174. sp_digit* x;
  143175. sp_digit* y;
  143176. sp_digit* z;
  143177. volatile int n = i;
  143178. x = p->x;
  143179. y = p->y;
  143180. z = p->z;
  143181. /* Y = 2*Y */
  143182. sp_1024_mont_dbl_32(y, y, p1024_mod);
  143183. /* W = Z^4 */
  143184. sp_1024_mont_sqr_32(w, z, p1024_mod, p1024_mp_mod);
  143185. sp_1024_mont_sqr_32(w, w, p1024_mod, p1024_mp_mod);
  143186. #ifndef WOLFSSL_SP_SMALL
  143187. while (--n > 0)
  143188. #else
  143189. while (--n >= 0)
  143190. #endif
  143191. {
  143192. /* A = 3*(X^2 - W) */
  143193. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  143194. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  143195. sp_1024_mont_tpl_lower_32(a, t1, p1024_mod);
  143196. /* B = X*Y^2 */
  143197. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  143198. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  143199. /* X = A^2 - 2B */
  143200. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  143201. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  143202. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  143203. /* b = 2.(B - X) */
  143204. sp_1024_mont_sub_lower_32(t2, b, x, p1024_mod);
  143205. sp_1024_mont_dbl_lower_32(b, t2, p1024_mod);
  143206. /* Z = Z*Y */
  143207. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  143208. /* t1 = Y^4 */
  143209. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  143210. #ifdef WOLFSSL_SP_SMALL
  143211. if (n != 0)
  143212. #endif
  143213. {
  143214. /* W = W*Y^4 */
  143215. sp_1024_mont_mul_32(w, w, t1, p1024_mod, p1024_mp_mod);
  143216. }
  143217. /* y = 2*A*(B - X) - Y^4 */
  143218. sp_1024_mont_mul_32(y, b, a, p1024_mod, p1024_mp_mod);
  143219. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  143220. }
  143221. #ifndef WOLFSSL_SP_SMALL
  143222. /* A = 3*(X^2 - W) */
  143223. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  143224. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  143225. sp_1024_mont_tpl_lower_32(a, t1, p1024_mod);
  143226. /* B = X*Y^2 */
  143227. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  143228. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  143229. /* X = A^2 - 2B */
  143230. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  143231. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  143232. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  143233. /* b = 2.(B - X) */
  143234. sp_1024_mont_sub_lower_32(t2, b, x, p1024_mod);
  143235. sp_1024_mont_dbl_lower_32(b, t2, p1024_mod);
  143236. /* Z = Z*Y */
  143237. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  143238. /* t1 = Y^4 */
  143239. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  143240. /* y = 2*A*(B - X) - Y^4 */
  143241. sp_1024_mont_mul_32(y, b, a, p1024_mod, p1024_mp_mod);
  143242. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  143243. #endif
  143244. /* Y = Y/2 */
  143245. sp_1024_div2_32(y, y, p1024_mod);
  143246. }
  143247. /* Convert the projective point to affine.
  143248. * Ordinates are in Montgomery form.
  143249. *
  143250. * a Point to convert.
  143251. * t Temporary data.
  143252. */
  143253. static void sp_1024_proj_to_affine_32(sp_point_1024* a, sp_digit* t)
  143254. {
  143255. sp_digit* t1 = t;
  143256. sp_digit* t2 = t + 2 * 32;
  143257. sp_digit* tmp = t + 4 * 32;
  143258. sp_1024_mont_inv_32(t1, a->z, tmp);
  143259. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  143260. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  143261. sp_1024_mont_mul_32(a->x, a->x, t2, p1024_mod, p1024_mp_mod);
  143262. sp_1024_mont_mul_32(a->y, a->y, t1, p1024_mod, p1024_mp_mod);
  143263. XMEMCPY(a->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  143264. }
  143265. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  143266. /* A table entry for pre-computed points. */
  143267. typedef struct sp_table_entry_1024 {
  143268. sp_digit x[32];
  143269. sp_digit y[32];
  143270. } sp_table_entry_1024;
  143271. #ifdef FP_ECC
  143272. #endif /* FP_ECC */
  143273. /* Add two Montgomery form projective points. The second point has a q value of
  143274. * one.
  143275. * Only the first point can be the same pointer as the result point.
  143276. *
  143277. * r Result of addition.
  143278. * p First point to add.
  143279. * q Second point to add.
  143280. * t Temporary ordinate data.
  143281. */
  143282. static void sp_1024_proj_point_add_qz1_32(sp_point_1024* r, const sp_point_1024* p,
  143283. const sp_point_1024* q, sp_digit* t)
  143284. {
  143285. sp_digit* t1 = t;
  143286. sp_digit* t2 = t + 2*32;
  143287. sp_digit* t3 = t + 4*32;
  143288. sp_digit* t4 = t + 6*32;
  143289. sp_digit* t5 = t + 8*32;
  143290. sp_digit* t6 = t + 10*32;
  143291. /* Check double */
  143292. (void)sp_1024_mont_sub_32(t1, p1024_mod, q->y, p1024_mod);
  143293. sp_1024_norm_32(t1);
  143294. if ((~p->infinity & ~q->infinity &
  143295. sp_1024_cmp_equal_32(p->x, q->x) & sp_1024_cmp_equal_32(p->z, q->z) &
  143296. (sp_1024_cmp_equal_32(p->y, q->y) | sp_1024_cmp_equal_32(p->y, t1))) != 0) {
  143297. sp_1024_proj_point_dbl_32(r, p, t);
  143298. }
  143299. else {
  143300. sp_digit maskp;
  143301. sp_digit maskq;
  143302. sp_digit maskt;
  143303. sp_digit* x = t2;
  143304. sp_digit* y = t5;
  143305. sp_digit* z = t6;
  143306. int i;
  143307. /* U2 = X2*Z1^2 */
  143308. sp_1024_mont_sqr_32(t2, p->z, p1024_mod, p1024_mp_mod);
  143309. sp_1024_mont_mul_32(t4, t2, p->z, p1024_mod, p1024_mp_mod);
  143310. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  143311. /* S2 = Y2*Z1^3 */
  143312. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  143313. /* H = U2 - X1 */
  143314. sp_1024_mont_sub_32(t2, t2, p->x, p1024_mod);
  143315. /* R = S2 - Y1 */
  143316. sp_1024_mont_sub_32(t4, t4, p->y, p1024_mod);
  143317. /* Z3 = H*Z1 */
  143318. sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod);
  143319. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  143320. sp_1024_mont_sqr_32(t1, t4, p1024_mod, p1024_mp_mod);
  143321. sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod);
  143322. sp_1024_mont_mul_32(t3, p->x, t5, p1024_mod, p1024_mp_mod);
  143323. sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod);
  143324. sp_1024_mont_sub_32(x, t1, t5, p1024_mod);
  143325. sp_1024_mont_dbl_32(t1, t3, p1024_mod);
  143326. sp_1024_mont_sub_32(x, x, t1, p1024_mod);
  143327. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  143328. sp_1024_mont_sub_lower_32(t3, t3, x, p1024_mod);
  143329. sp_1024_mont_mul_32(t3, t3, t4, p1024_mod, p1024_mp_mod);
  143330. sp_1024_mont_mul_32(t5, t5, p->y, p1024_mod, p1024_mp_mod);
  143331. sp_1024_mont_sub_32(y, t3, t5, p1024_mod);
  143332. maskp = 0 - (q->infinity & (!p->infinity));
  143333. maskq = 0 - (p->infinity & (!q->infinity));
  143334. maskt = ~(maskp | maskq);
  143335. for (i = 0; i < 32; i++) {
  143336. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt);
  143337. }
  143338. for (i = 0; i < 32; i++) {
  143339. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt);
  143340. }
  143341. for (i = 0; i < 32; i++) {
  143342. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt);
  143343. }
  143344. r->z[0] |= p->infinity & q->infinity;
  143345. r->infinity = p->infinity & q->infinity;
  143346. }
  143347. }
  143348. #ifdef WOLFSSL_SP_SMALL
  143349. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  143350. /* Generate the pre-computed table of points for the base point.
  143351. *
  143352. * width = 4
  143353. * 16 entries
  143354. * 256 bits between
  143355. *
  143356. * a The base point.
  143357. * table Place to store generated point data.
  143358. * tmp Temporary data.
  143359. * heap Heap to use for allocation.
  143360. */
  143361. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  143362. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  143363. {
  143364. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143365. sp_point_1024* t = NULL;
  143366. #else
  143367. sp_point_1024 t[3];
  143368. #endif
  143369. sp_point_1024* s1 = NULL;
  143370. sp_point_1024* s2 = NULL;
  143371. int i;
  143372. int j;
  143373. int err = MP_OKAY;
  143374. (void)heap;
  143375. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143376. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  143377. DYNAMIC_TYPE_ECC);
  143378. if (t == NULL)
  143379. err = MEMORY_E;
  143380. #endif
  143381. if (err == MP_OKAY) {
  143382. s1 = t + 1;
  143383. s2 = t + 2;
  143384. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  143385. }
  143386. if (err == MP_OKAY) {
  143387. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  143388. }
  143389. if (err == MP_OKAY) {
  143390. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  143391. }
  143392. if (err == MP_OKAY) {
  143393. t->infinity = 0;
  143394. sp_1024_proj_to_affine_32(t, tmp);
  143395. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  143396. s1->infinity = 0;
  143397. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  143398. s2->infinity = 0;
  143399. /* table[0] = {0, 0, infinity} */
  143400. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  143401. /* table[1] = Affine version of 'a' in Montgomery form */
  143402. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  143403. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  143404. for (i=1; i<4; i++) {
  143405. sp_1024_proj_point_dbl_n_32(t, 256, tmp);
  143406. sp_1024_proj_to_affine_32(t, tmp);
  143407. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  143408. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  143409. }
  143410. for (i=1; i<4; i++) {
  143411. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  143412. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  143413. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  143414. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  143415. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  143416. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  143417. sp_1024_proj_to_affine_32(t, tmp);
  143418. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  143419. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  143420. }
  143421. }
  143422. }
  143423. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143424. if (t != NULL)
  143425. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  143426. #endif
  143427. return err;
  143428. }
  143429. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  143430. /* Multiply the point by the scalar and return the result.
  143431. * If map is true then convert result to affine coordinates.
  143432. *
  143433. * Stripe implementation.
  143434. * Pre-generated: 2^0, 2^256, ...
  143435. * Pre-generated: products of all combinations of above.
  143436. * 4 doubles and adds (with qz=1)
  143437. *
  143438. * r Resulting point.
  143439. * k Scalar to multiply by.
  143440. * table Pre-computed table.
  143441. * map Indicates whether to convert result to affine.
  143442. * ct Constant time required.
  143443. * heap Heap to use for allocation.
  143444. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  143445. */
  143446. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  143447. const sp_table_entry_1024* table, const sp_digit* k, int map,
  143448. int ct, void* heap)
  143449. {
  143450. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143451. sp_point_1024* rt = NULL;
  143452. sp_digit* t = NULL;
  143453. #else
  143454. sp_point_1024 rt[2];
  143455. sp_digit t[2 * 32 * 6];
  143456. #endif
  143457. sp_point_1024* p = NULL;
  143458. int i;
  143459. int j;
  143460. int y;
  143461. int x;
  143462. int err = MP_OKAY;
  143463. (void)g;
  143464. /* Constant time used for cache attack resistance implementation. */
  143465. (void)ct;
  143466. (void)heap;
  143467. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143468. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  143469. DYNAMIC_TYPE_ECC);
  143470. if (rt == NULL)
  143471. err = MEMORY_E;
  143472. if (err == MP_OKAY) {
  143473. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 6, heap,
  143474. DYNAMIC_TYPE_ECC);
  143475. if (t == NULL)
  143476. err = MEMORY_E;
  143477. }
  143478. #endif
  143479. if (err == MP_OKAY) {
  143480. p = rt + 1;
  143481. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  143482. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  143483. y = 0;
  143484. x = 255;
  143485. for (j=0; j<4; j++) {
  143486. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  143487. x += 256;
  143488. }
  143489. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  143490. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  143491. rt->infinity = !y;
  143492. for (i=254; i>=0; i--) {
  143493. y = 0;
  143494. x = i;
  143495. for (j=0; j<4; j++) {
  143496. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  143497. x += 256;
  143498. }
  143499. sp_1024_proj_point_dbl_32(rt, rt, t);
  143500. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  143501. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  143502. p->infinity = !y;
  143503. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  143504. }
  143505. if (map != 0) {
  143506. sp_1024_map_32(r, rt, t);
  143507. }
  143508. else {
  143509. XMEMCPY(r, rt, sizeof(sp_point_1024));
  143510. }
  143511. }
  143512. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143513. if (t != NULL)
  143514. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  143515. if (rt != NULL)
  143516. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  143517. #endif
  143518. return err;
  143519. }
  143520. #ifdef FP_ECC
  143521. #ifndef FP_ENTRIES
  143522. #define FP_ENTRIES 16
  143523. #endif
  143524. /* Cache entry - holds precomputation tables for a point. */
  143525. typedef struct sp_cache_1024_t {
  143526. /* X ordinate of point that table was generated from. */
  143527. sp_digit x[32];
  143528. /* Y ordinate of point that table was generated from. */
  143529. sp_digit y[32];
  143530. /* Precomputation table for point. */
  143531. sp_table_entry_1024 table[16];
  143532. /* Count of entries in table. */
  143533. uint32_t cnt;
  143534. /* Point and table set in entry. */
  143535. int set;
  143536. } sp_cache_1024_t;
  143537. /* Cache of tables. */
  143538. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  143539. /* Index of last entry in cache. */
  143540. static THREAD_LS_T int sp_cache_1024_last = -1;
  143541. /* Cache has been initialized. */
  143542. static THREAD_LS_T int sp_cache_1024_inited = 0;
  143543. #ifndef HAVE_THREAD_LS
  143544. static volatile int initCacheMutex_1024 = 0;
  143545. static wolfSSL_Mutex sp_cache_1024_lock;
  143546. #endif
  143547. /* Get the cache entry for the point.
  143548. *
  143549. * g [in] Point scalar multipling.
  143550. * cache [out] Cache table to use.
  143551. */
  143552. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  143553. {
  143554. int i;
  143555. int j;
  143556. uint32_t least;
  143557. if (sp_cache_1024_inited == 0) {
  143558. for (i=0; i<FP_ENTRIES; i++) {
  143559. sp_cache_1024[i].set = 0;
  143560. }
  143561. sp_cache_1024_inited = 1;
  143562. }
  143563. /* Compare point with those in cache. */
  143564. for (i=0; i<FP_ENTRIES; i++) {
  143565. if (!sp_cache_1024[i].set)
  143566. continue;
  143567. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  143568. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  143569. sp_cache_1024[i].cnt++;
  143570. break;
  143571. }
  143572. }
  143573. /* No match. */
  143574. if (i == FP_ENTRIES) {
  143575. /* Find empty entry. */
  143576. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  143577. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  143578. if (!sp_cache_1024[i].set) {
  143579. break;
  143580. }
  143581. }
  143582. /* Evict least used. */
  143583. if (i == sp_cache_1024_last) {
  143584. least = sp_cache_1024[0].cnt;
  143585. for (j=1; j<FP_ENTRIES; j++) {
  143586. if (sp_cache_1024[j].cnt < least) {
  143587. i = j;
  143588. least = sp_cache_1024[i].cnt;
  143589. }
  143590. }
  143591. }
  143592. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  143593. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  143594. sp_cache_1024[i].set = 1;
  143595. sp_cache_1024[i].cnt = 1;
  143596. }
  143597. *cache = &sp_cache_1024[i];
  143598. sp_cache_1024_last = i;
  143599. }
  143600. #endif /* FP_ECC */
  143601. /* Multiply the base point of P1024 by the scalar and return the result.
  143602. * If map is true then convert result to affine coordinates.
  143603. *
  143604. * r Resulting point.
  143605. * g Point to multiply.
  143606. * k Scalar to multiply by.
  143607. * map Indicates whether to convert result to affine.
  143608. * ct Constant time required.
  143609. * heap Heap to use for allocation.
  143610. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  143611. */
  143612. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  143613. int map, int ct, void* heap)
  143614. {
  143615. #ifndef FP_ECC
  143616. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  143617. #else
  143618. sp_digit tmp[2 * 32 * 6];
  143619. sp_cache_1024_t* cache;
  143620. int err = MP_OKAY;
  143621. #ifndef HAVE_THREAD_LS
  143622. if (initCacheMutex_1024 == 0) {
  143623. wc_InitMutex(&sp_cache_1024_lock);
  143624. initCacheMutex_1024 = 1;
  143625. }
  143626. if (wc_LockMutex(&sp_cache_1024_lock) != 0)
  143627. err = BAD_MUTEX_E;
  143628. #endif /* HAVE_THREAD_LS */
  143629. if (err == MP_OKAY) {
  143630. sp_ecc_get_cache_1024(g, &cache);
  143631. if (cache->cnt == 2)
  143632. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  143633. #ifndef HAVE_THREAD_LS
  143634. wc_UnLockMutex(&sp_cache_1024_lock);
  143635. #endif /* HAVE_THREAD_LS */
  143636. if (cache->cnt < 2) {
  143637. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  143638. }
  143639. else {
  143640. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  143641. map, ct, heap);
  143642. }
  143643. }
  143644. return err;
  143645. #endif
  143646. }
  143647. #else
  143648. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  143649. /* Generate the pre-computed table of points for the base point.
  143650. *
  143651. * width = 8
  143652. * 256 entries
  143653. * 128 bits between
  143654. *
  143655. * a The base point.
  143656. * table Place to store generated point data.
  143657. * tmp Temporary data.
  143658. * heap Heap to use for allocation.
  143659. */
  143660. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  143661. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  143662. {
  143663. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143664. sp_point_1024* t = NULL;
  143665. #else
  143666. sp_point_1024 t[3];
  143667. #endif
  143668. sp_point_1024* s1 = NULL;
  143669. sp_point_1024* s2 = NULL;
  143670. int i;
  143671. int j;
  143672. int err = MP_OKAY;
  143673. (void)heap;
  143674. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143675. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  143676. DYNAMIC_TYPE_ECC);
  143677. if (t == NULL)
  143678. err = MEMORY_E;
  143679. #endif
  143680. if (err == MP_OKAY) {
  143681. s1 = t + 1;
  143682. s2 = t + 2;
  143683. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  143684. }
  143685. if (err == MP_OKAY) {
  143686. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  143687. }
  143688. if (err == MP_OKAY) {
  143689. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  143690. }
  143691. if (err == MP_OKAY) {
  143692. t->infinity = 0;
  143693. sp_1024_proj_to_affine_32(t, tmp);
  143694. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  143695. s1->infinity = 0;
  143696. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  143697. s2->infinity = 0;
  143698. /* table[0] = {0, 0, infinity} */
  143699. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  143700. /* table[1] = Affine version of 'a' in Montgomery form */
  143701. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  143702. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  143703. for (i=1; i<8; i++) {
  143704. sp_1024_proj_point_dbl_n_32(t, 128, tmp);
  143705. sp_1024_proj_to_affine_32(t, tmp);
  143706. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  143707. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  143708. }
  143709. for (i=1; i<8; i++) {
  143710. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  143711. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  143712. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  143713. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  143714. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  143715. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  143716. sp_1024_proj_to_affine_32(t, tmp);
  143717. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  143718. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  143719. }
  143720. }
  143721. }
  143722. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143723. if (t != NULL)
  143724. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  143725. #endif
  143726. return err;
  143727. }
  143728. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  143729. /* Multiply the point by the scalar and return the result.
  143730. * If map is true then convert result to affine coordinates.
  143731. *
  143732. * Stripe implementation.
  143733. * Pre-generated: 2^0, 2^128, ...
  143734. * Pre-generated: products of all combinations of above.
  143735. * 8 doubles and adds (with qz=1)
  143736. *
  143737. * r Resulting point.
  143738. * k Scalar to multiply by.
  143739. * table Pre-computed table.
  143740. * map Indicates whether to convert result to affine.
  143741. * ct Constant time required.
  143742. * heap Heap to use for allocation.
  143743. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  143744. */
  143745. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  143746. const sp_table_entry_1024* table, const sp_digit* k, int map,
  143747. int ct, void* heap)
  143748. {
  143749. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143750. sp_point_1024* rt = NULL;
  143751. sp_digit* t = NULL;
  143752. #else
  143753. sp_point_1024 rt[2];
  143754. sp_digit t[2 * 32 * 6];
  143755. #endif
  143756. sp_point_1024* p = NULL;
  143757. int i;
  143758. int j;
  143759. int y;
  143760. int x;
  143761. int err = MP_OKAY;
  143762. (void)g;
  143763. /* Constant time used for cache attack resistance implementation. */
  143764. (void)ct;
  143765. (void)heap;
  143766. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143767. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  143768. DYNAMIC_TYPE_ECC);
  143769. if (rt == NULL)
  143770. err = MEMORY_E;
  143771. if (err == MP_OKAY) {
  143772. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 6, heap,
  143773. DYNAMIC_TYPE_ECC);
  143774. if (t == NULL)
  143775. err = MEMORY_E;
  143776. }
  143777. #endif
  143778. if (err == MP_OKAY) {
  143779. p = rt + 1;
  143780. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  143781. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  143782. y = 0;
  143783. x = 127;
  143784. for (j=0; j<8; j++) {
  143785. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  143786. x += 128;
  143787. }
  143788. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  143789. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  143790. rt->infinity = !y;
  143791. for (i=126; i>=0; i--) {
  143792. y = 0;
  143793. x = i;
  143794. for (j=0; j<8; j++) {
  143795. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  143796. x += 128;
  143797. }
  143798. sp_1024_proj_point_dbl_32(rt, rt, t);
  143799. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  143800. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  143801. p->infinity = !y;
  143802. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  143803. }
  143804. if (map != 0) {
  143805. sp_1024_map_32(r, rt, t);
  143806. }
  143807. else {
  143808. XMEMCPY(r, rt, sizeof(sp_point_1024));
  143809. }
  143810. }
  143811. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143812. if (t != NULL)
  143813. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  143814. if (rt != NULL)
  143815. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  143816. #endif
  143817. return err;
  143818. }
  143819. #ifdef FP_ECC
  143820. #ifndef FP_ENTRIES
  143821. #define FP_ENTRIES 16
  143822. #endif
  143823. /* Cache entry - holds precomputation tables for a point. */
  143824. typedef struct sp_cache_1024_t {
  143825. /* X ordinate of point that table was generated from. */
  143826. sp_digit x[32];
  143827. /* Y ordinate of point that table was generated from. */
  143828. sp_digit y[32];
  143829. /* Precomputation table for point. */
  143830. sp_table_entry_1024 table[256];
  143831. /* Count of entries in table. */
  143832. uint32_t cnt;
  143833. /* Point and table set in entry. */
  143834. int set;
  143835. } sp_cache_1024_t;
  143836. /* Cache of tables. */
  143837. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  143838. /* Index of last entry in cache. */
  143839. static THREAD_LS_T int sp_cache_1024_last = -1;
  143840. /* Cache has been initialized. */
  143841. static THREAD_LS_T int sp_cache_1024_inited = 0;
  143842. #ifndef HAVE_THREAD_LS
  143843. static volatile int initCacheMutex_1024 = 0;
  143844. static wolfSSL_Mutex sp_cache_1024_lock;
  143845. #endif
  143846. /* Get the cache entry for the point.
  143847. *
  143848. * g [in] Point scalar multipling.
  143849. * cache [out] Cache table to use.
  143850. */
  143851. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  143852. {
  143853. int i;
  143854. int j;
  143855. uint32_t least;
  143856. if (sp_cache_1024_inited == 0) {
  143857. for (i=0; i<FP_ENTRIES; i++) {
  143858. sp_cache_1024[i].set = 0;
  143859. }
  143860. sp_cache_1024_inited = 1;
  143861. }
  143862. /* Compare point with those in cache. */
  143863. for (i=0; i<FP_ENTRIES; i++) {
  143864. if (!sp_cache_1024[i].set)
  143865. continue;
  143866. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  143867. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  143868. sp_cache_1024[i].cnt++;
  143869. break;
  143870. }
  143871. }
  143872. /* No match. */
  143873. if (i == FP_ENTRIES) {
  143874. /* Find empty entry. */
  143875. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  143876. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  143877. if (!sp_cache_1024[i].set) {
  143878. break;
  143879. }
  143880. }
  143881. /* Evict least used. */
  143882. if (i == sp_cache_1024_last) {
  143883. least = sp_cache_1024[0].cnt;
  143884. for (j=1; j<FP_ENTRIES; j++) {
  143885. if (sp_cache_1024[j].cnt < least) {
  143886. i = j;
  143887. least = sp_cache_1024[i].cnt;
  143888. }
  143889. }
  143890. }
  143891. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  143892. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  143893. sp_cache_1024[i].set = 1;
  143894. sp_cache_1024[i].cnt = 1;
  143895. }
  143896. *cache = &sp_cache_1024[i];
  143897. sp_cache_1024_last = i;
  143898. }
  143899. #endif /* FP_ECC */
  143900. /* Multiply the base point of P1024 by the scalar and return the result.
  143901. * If map is true then convert result to affine coordinates.
  143902. *
  143903. * r Resulting point.
  143904. * g Point to multiply.
  143905. * k Scalar to multiply by.
  143906. * map Indicates whether to convert result to affine.
  143907. * ct Constant time required.
  143908. * heap Heap to use for allocation.
  143909. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  143910. */
  143911. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  143912. int map, int ct, void* heap)
  143913. {
  143914. #ifndef FP_ECC
  143915. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  143916. #else
  143917. sp_digit tmp[2 * 32 * 6];
  143918. sp_cache_1024_t* cache;
  143919. int err = MP_OKAY;
  143920. #ifndef HAVE_THREAD_LS
  143921. if (initCacheMutex_1024 == 0) {
  143922. wc_InitMutex(&sp_cache_1024_lock);
  143923. initCacheMutex_1024 = 1;
  143924. }
  143925. if (wc_LockMutex(&sp_cache_1024_lock) != 0)
  143926. err = BAD_MUTEX_E;
  143927. #endif /* HAVE_THREAD_LS */
  143928. if (err == MP_OKAY) {
  143929. sp_ecc_get_cache_1024(g, &cache);
  143930. if (cache->cnt == 2)
  143931. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  143932. #ifndef HAVE_THREAD_LS
  143933. wc_UnLockMutex(&sp_cache_1024_lock);
  143934. #endif /* HAVE_THREAD_LS */
  143935. if (cache->cnt < 2) {
  143936. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  143937. }
  143938. else {
  143939. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  143940. map, ct, heap);
  143941. }
  143942. }
  143943. return err;
  143944. #endif
  143945. }
  143946. #endif /* WOLFSSL_SP_SMALL */
  143947. /* Multiply the point by the scalar and return the result.
  143948. * If map is true then convert result to affine coordinates.
  143949. *
  143950. * km Scalar to multiply by.
  143951. * p Point to multiply.
  143952. * r Resulting point.
  143953. * map Indicates whether to convert result to affine.
  143954. * heap Heap to use for allocation.
  143955. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  143956. */
  143957. int sp_ecc_mulmod_1024(const mp_int* km, const ecc_point* gm, ecc_point* r,
  143958. int map, void* heap)
  143959. {
  143960. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143961. sp_point_1024* point = NULL;
  143962. sp_digit* k = NULL;
  143963. #else
  143964. sp_point_1024 point[1];
  143965. sp_digit k[32];
  143966. #endif
  143967. int err = MP_OKAY;
  143968. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143969. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  143970. DYNAMIC_TYPE_ECC);
  143971. if (point == NULL)
  143972. err = MEMORY_E;
  143973. if (err == MP_OKAY) {
  143974. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  143975. DYNAMIC_TYPE_ECC);
  143976. if (k == NULL)
  143977. err = MEMORY_E;
  143978. }
  143979. #endif
  143980. if (err == MP_OKAY) {
  143981. sp_1024_from_mp(k, 32, km);
  143982. sp_1024_point_from_ecc_point_32(point, gm);
  143983. err = sp_1024_ecc_mulmod_32(point, point, k, map, 1, heap);
  143984. }
  143985. if (err == MP_OKAY) {
  143986. err = sp_1024_point_to_ecc_point_32(point, r);
  143987. }
  143988. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  143989. if (k != NULL)
  143990. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  143991. if (point != NULL)
  143992. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  143993. #endif
  143994. return err;
  143995. }
  143996. #ifdef WOLFSSL_SP_SMALL
  143997. /* Striping precomputation table.
  143998. * 4 points combined into a table of 16 points.
  143999. * Distance of 256 between points.
  144000. */
  144001. static const sp_table_entry_1024 p1024_table[16] = {
  144002. /* 0 */
  144003. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  144004. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  144005. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  144006. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  144007. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  144008. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  144009. /* 1 */
  144010. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  144011. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  144012. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  144013. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  144014. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  144015. 0x1c49f80b,0x8dfff96a },
  144016. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  144017. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  144018. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  144019. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  144020. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  144021. 0xde3c01f3,0x2aa1207b } },
  144022. /* 2 */
  144023. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  144024. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  144025. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  144026. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  144027. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  144028. 0xdf9398a4,0x40247985 },
  144029. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  144030. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  144031. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  144032. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  144033. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  144034. 0xc8b79d80,0x1a6fd1e6 } },
  144035. /* 3 */
  144036. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  144037. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  144038. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  144039. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  144040. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  144041. 0x15614750,0x29b7d4dc },
  144042. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  144043. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  144044. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  144045. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  144046. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  144047. 0x5382497e,0x5d092802 } },
  144048. /* 4 */
  144049. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  144050. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  144051. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  144052. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  144053. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  144054. 0x0f1fa7d7,0x2ab3bd47 },
  144055. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  144056. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  144057. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  144058. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  144059. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  144060. 0x4c27d229,0x93a4b416 } },
  144061. /* 5 */
  144062. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  144063. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  144064. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  144065. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  144066. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  144067. 0x32ee7763,0x342ce0d7 },
  144068. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  144069. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  144070. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  144071. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  144072. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  144073. 0xe156fd20,0x455f4af3 } },
  144074. /* 6 */
  144075. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  144076. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  144077. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  144078. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  144079. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  144080. 0x5c37c334,0x65713c29 },
  144081. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  144082. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  144083. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  144084. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  144085. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  144086. 0x3bae3c38,0x6b0e996c } },
  144087. /* 7 */
  144088. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  144089. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  144090. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  144091. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  144092. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  144093. 0x678223f8,0x4022a205 },
  144094. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  144095. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  144096. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  144097. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  144098. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  144099. 0x24a6a956,0x312179cb } },
  144100. /* 8 */
  144101. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  144102. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  144103. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  144104. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  144105. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  144106. 0x04ecf056,0x325d2796 },
  144107. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  144108. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  144109. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  144110. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  144111. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  144112. 0xe32a79d3,0x19d48546 } },
  144113. /* 9 */
  144114. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  144115. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  144116. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  144117. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  144118. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  144119. 0xb4e453b0,0x1b3ace6c },
  144120. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  144121. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  144122. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  144123. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  144124. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  144125. 0x192f0a14,0x538ec33e } },
  144126. /* 10 */
  144127. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  144128. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  144129. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  144130. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  144131. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  144132. 0xb6f8aa25,0x13cbee76 },
  144133. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  144134. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  144135. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  144136. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  144137. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  144138. 0xe02e8967,0x4e0a1ada } },
  144139. /* 11 */
  144140. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  144141. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  144142. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  144143. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  144144. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  144145. 0x9f99c999,0x733e30d9 },
  144146. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  144147. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  144148. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  144149. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  144150. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  144151. 0xb79a5c0c,0x56facb39 } },
  144152. /* 12 */
  144153. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  144154. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  144155. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  144156. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  144157. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  144158. 0xf18c2b91,0x57ea2b4b },
  144159. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  144160. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  144161. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  144162. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  144163. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  144164. 0xea7935c9,0x60480b46 } },
  144165. /* 13 */
  144166. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  144167. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  144168. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  144169. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  144170. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  144171. 0x9a8f88cc,0x0774a0d3 },
  144172. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  144173. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  144174. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  144175. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  144176. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  144177. 0x2432014b,0x08151954 } },
  144178. /* 14 */
  144179. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  144180. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  144181. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  144182. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  144183. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  144184. 0xf0860497,0x1fe09f94 },
  144185. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  144186. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  144187. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  144188. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  144189. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  144190. 0xdb62526a,0x4de95786 } },
  144191. /* 15 */
  144192. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  144193. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  144194. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  144195. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  144196. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  144197. 0xe636980c,0x1c94418b },
  144198. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  144199. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  144200. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  144201. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  144202. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  144203. 0xb55235ba,0x611bfbb2 } },
  144204. };
  144205. /* Multiply the base point of P1024 by the scalar and return the result.
  144206. * If map is true then convert result to affine coordinates.
  144207. *
  144208. * Stripe implementation.
  144209. * Pre-generated: 2^0, 2^256, ...
  144210. * Pre-generated: products of all combinations of above.
  144211. * 4 doubles and adds (with qz=1)
  144212. *
  144213. * r Resulting point.
  144214. * k Scalar to multiply by.
  144215. * map Indicates whether to convert result to affine.
  144216. * ct Constant time required.
  144217. * heap Heap to use for allocation.
  144218. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  144219. */
  144220. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  144221. int map, int ct, void* heap)
  144222. {
  144223. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  144224. k, map, ct, heap);
  144225. }
  144226. #else
  144227. /* Striping precomputation table.
  144228. * 8 points combined into a table of 256 points.
  144229. * Distance of 128 between points.
  144230. */
  144231. static const sp_table_entry_1024 p1024_table[256] = {
  144232. /* 0 */
  144233. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  144234. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  144235. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  144236. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  144237. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  144238. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  144239. /* 1 */
  144240. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  144241. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  144242. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  144243. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  144244. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  144245. 0x1c49f80b,0x8dfff96a },
  144246. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  144247. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  144248. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  144249. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  144250. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  144251. 0xde3c01f3,0x2aa1207b } },
  144252. /* 2 */
  144253. { { 0x01900955,0xa95b6dae,0xceb4656d,0xa5dc9cc1,0xe72fe95b,0x50c78907,
  144254. 0xa040c334,0xa1ae5447,0x7952ea6e,0x91191370,0x6d097305,0x54ff7343,
  144255. 0xbda4d10f,0xa4db0074,0x91644070,0xfd5306f1,0x8b24522c,0x14b9fe73,
  144256. 0x7849f762,0x1468dad6,0xb0dcd2e4,0x87b29a18,0x5e1ad492,0xadd7f1a1,
  144257. 0xdbba2a1a,0x9ac63a81,0x81223379,0x01379c5b,0xb0e53bc8,0xf402b2f0,
  144258. 0x0bf13b61,0x8c3eb27f },
  144259. { 0xe513696f,0x9a4ad3e1,0x18c81ffa,0x0350ba5c,0x3c033d13,0x1e2fc136,
  144260. 0x17a531bc,0x53da6e71,0x1aed610d,0x42ec6490,0xe99ff567,0xd33e8df7,
  144261. 0x3deed12a,0xe4aad73e,0x180f4deb,0xd983b465,0x502f30b4,0x99365269,
  144262. 0xa8918d7f,0x7e2799ab,0x700fc79a,0x0ffe84b6,0x40bfd8c2,0x7b4400d6,
  144263. 0x5d2641bd,0xc3a21d21,0xc32621cb,0x79839442,0xb1401e83,0xace6500b,
  144264. 0x251c4310,0x7bf4163e } },
  144265. /* 3 */
  144266. { { 0xe3fd589e,0x1c174f88,0xdf974a03,0xdb501790,0x3e70549f,0xd09623e3,
  144267. 0x15924f34,0x8d091eff,0xf9b65ac5,0xeef79cad,0x3f69c2cf,0xd2cc4262,
  144268. 0x52cd82bc,0x817d9032,0xa5f1dddd,0xacf4f4d9,0x5011b6bd,0xd0612635,
  144269. 0x2ed140c9,0x9f74490d,0x4db686d2,0x64092e8c,0x776b0fcc,0x225eef16,
  144270. 0xdf16aeb6,0x0e8c01e9,0x84bbd82a,0x62836741,0x8956e337,0x757574e2,
  144271. 0x705a7f07,0x9871edc6 },
  144272. { 0x776535f7,0xbd0b76d5,0x2635b3b8,0x5214d602,0x9d216f64,0xc0c25ad9,
  144273. 0x5515bf75,0xfd4df3a7,0x5e9f1675,0x24a625bc,0x406873e7,0x3c35efb7,
  144274. 0xbb2e5c4a,0xef5c9a33,0x806b198a,0xa971b35e,0xa3c690ed,0x9f5c0ca5,
  144275. 0x8e1e2341,0xa8d5dd89,0x955ad9e4,0x4cecbcce,0x248d3416,0x2ecf4407,
  144276. 0x45c0af6e,0x1abb3811,0x1c780fff,0x3f4bee82,0xc272ed57,0xd14df768,
  144277. 0x371637ad,0x397ed10a } },
  144278. /* 4 */
  144279. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  144280. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  144281. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  144282. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  144283. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  144284. 0xdf9398a4,0x40247985 },
  144285. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  144286. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  144287. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  144288. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  144289. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  144290. 0xc8b79d80,0x1a6fd1e6 } },
  144291. /* 5 */
  144292. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  144293. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  144294. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  144295. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  144296. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  144297. 0x15614750,0x29b7d4dc },
  144298. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  144299. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  144300. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  144301. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  144302. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  144303. 0x5382497e,0x5d092802 } },
  144304. /* 6 */
  144305. { { 0xff2f780d,0x583a2b7e,0xd7d76b1d,0x34d26820,0x86f74aec,0xe3c32847,
  144306. 0x10823feb,0x0fd42212,0xfb5e7bf4,0x227e417e,0xa568f8cd,0x510d49b6,
  144307. 0x1781bbec,0x53bce7d6,0x2f3718b7,0x9cfe3f22,0xd9de6c1f,0x7f44e89f,
  144308. 0x3fac9b55,0xf1cc553f,0xe6f300bc,0x9d2d0846,0x9f0ae6b1,0x976c82a2,
  144309. 0x24b8bbe0,0xe63dbf5e,0x973a5aa7,0x4cac7f45,0x84dd33c7,0xc6eb6237,
  144310. 0x142fee5d,0x0a26e434 },
  144311. { 0xacaa9a08,0x8081339f,0x5246ece1,0x40f31105,0x61393747,0x892c8170,
  144312. 0x242f02e1,0x8d8d4103,0x3b5de98a,0x482bfd20,0x5abbe952,0x89ef946b,
  144313. 0x37698249,0xb8d218b9,0x66617c7a,0xd5268e89,0x8b7d2b91,0x962e7551,
  144314. 0xfe8d67c3,0x2c5c7973,0x2b017c51,0x42e3150a,0xc1a29469,0x6f4e5ebc,
  144315. 0x531c7083,0xa39910ce,0xb77b9e50,0xaf4f6eb4,0xda120ad0,0x68cbb175,
  144316. 0xb92636ec,0x19497c61 } },
  144317. /* 7 */
  144318. { { 0x417659a8,0x6920b0c6,0x92cb28ff,0xc77ab9c7,0xb687797f,0x55b67180,
  144319. 0xe7759363,0x4caf58c1,0x5561b186,0x5155bdb6,0x780f4946,0x2e64e355,
  144320. 0x229a8b20,0xeb0ac9b7,0x2571bd60,0x88594d78,0xe3fa78f9,0x5dcc0939,
  144321. 0x2ac2d379,0x7b8b4830,0xb90f1444,0x505fbf60,0x3ce4b3c1,0xac610e81,
  144322. 0xd59b5c18,0x39a4f27a,0x7cea0222,0x5fa33973,0x8dff1c7b,0xe578730b,
  144323. 0x517bf7a6,0x96b91b8b },
  144324. { 0x9aac087c,0xc1a991f4,0x6cfdb28d,0xce62f74e,0x5f7600d6,0x08d6ff9a,
  144325. 0xf917f9c9,0xd781cd04,0x3de52dbf,0x7796f5f6,0x2ed72180,0xe7db64e0,
  144326. 0x6fa4137d,0x0f0876f6,0x3ca1f716,0x3271ee64,0x7c4ab8a3,0xcb9b2058,
  144327. 0x39481047,0xcba17107,0x598c5c37,0xdf9a190d,0x6f20e125,0x0cb6e72a,
  144328. 0xf4f2902d,0xa3142204,0x7ce2dcfb,0x42d28cb9,0xa3d3c351,0xdf261b8a,
  144329. 0xcffc249d,0x73f3d315 } },
  144330. /* 8 */
  144331. { { 0xe6fd3673,0x5d86855b,0x9d214b7b,0x309b70af,0xdcc46cd3,0x8d332f90,
  144332. 0x595510de,0xe553c015,0x38c1251c,0x5746a096,0x85cc1bc9,0xcd7cea5b,
  144333. 0x002eba8f,0x4ffa1468,0x22fcd77c,0x10a3cb70,0xc4ea05e3,0xb6999dfb,
  144334. 0x4efa756e,0x3375a0d0,0xdced5fd8,0x4d90279e,0x251fd56e,0x48192403,
  144335. 0x82a4c5f1,0xe87633a4,0x1b34105b,0x3170d130,0x7247e578,0x93998b0f,
  144336. 0x436ba1fa,0x88934f64 },
  144337. { 0x4713eabc,0xf09f43b0,0xaccdc517,0x4ca7dd91,0xef13ca7c,0x27daa63b,
  144338. 0x2588184b,0x8b2e5a7a,0xd95dc269,0x0a8cb612,0xe1f2f14c,0x346975a2,
  144339. 0xe172935c,0x1f29b8ed,0xd40bc1e3,0xc3cbfd6e,0x132623da,0xd3f46b3f,
  144340. 0xfb0b7681,0xc115be6d,0x56da4344,0x5e31c345,0xa8e43d98,0xa7c63f18,
  144341. 0x4bddb4ea,0x55cb2083,0x4a54f58c,0xb16a0c38,0x46fd69d9,0x74eacca2,
  144342. 0x153548e1,0x0d1898bb } },
  144343. /* 9 */
  144344. { { 0xe35ef043,0x4ea73461,0x3496b564,0x107b67d9,0xd0f83a3c,0xd62c173b,
  144345. 0x51d29c35,0xfad4b038,0x71b1c1a4,0x3f42882a,0x54b43b9e,0x5d2bcf66,
  144346. 0x2abdf543,0xc77b15aa,0xdabe3dc1,0x5cb38a80,0xa481673b,0x15fda0ae,
  144347. 0xe7b90ebe,0x86996b4d,0x2bc8f3d8,0x84f87e25,0x37c4e424,0xaded03d6,
  144348. 0xd7a7afd8,0xe5ede666,0xa1ccb93a,0x80dd95a2,0x46fba391,0xa55cfd25,
  144349. 0x46f82e60,0x2bdab1dc },
  144350. { 0xfa6fed61,0x7a4de22b,0xcc8dd94e,0xca458aa5,0x071222f5,0x3e372df1,
  144351. 0xe5aff377,0x06a4b44f,0x4a738e6d,0xbc2d0ba7,0x5f31f136,0x1a470e1d,
  144352. 0xe102a911,0x77ff933a,0x310c7885,0x8b380a50,0x783fc5ac,0x9f3c0228,
  144353. 0x44725d06,0xec668925,0x5ac84221,0x878f0e16,0xcfda6e8a,0x9a3af1af,
  144354. 0x78cd2aba,0x0183ed37,0x826d0eae,0x32cdbd60,0xcbee6415,0xb3234661,
  144355. 0xb9c10120,0x353eb892 } },
  144356. /* 10 */
  144357. { { 0x10b5521e,0xc8fdcad6,0x52e702f0,0x1a11b440,0x8ffda49c,0x6302680d,
  144358. 0xcbf36bad,0xcdb9654a,0x4c10a2d7,0x7b58ce11,0xe630e7e0,0x1e5d1f7d,
  144359. 0x6760a813,0x8cbe3d7d,0x6480d77f,0xeb35866b,0x7f036219,0x58728cf3,
  144360. 0x42a8a757,0xdd5865ed,0x906a2870,0x283f1f1d,0xa51f906b,0x79e23fa4,
  144361. 0x543b20a8,0xf2ac6e83,0xb81e7754,0x4f0b6379,0x840016ee,0x57fbc0d4,
  144362. 0xe621b67d,0x8da20771 },
  144363. { 0xecce65ec,0x3c855004,0xb748185e,0x76d10d1f,0x78797ad2,0x64be7bca,
  144364. 0x77e54aad,0x43444db0,0xbe0df0ff,0x17b6b0c9,0x055086a4,0x8fc4256c,
  144365. 0xfd74d5a3,0xf952c43b,0x01c4edb8,0x501e005a,0x4a57e328,0xd5172dfc,
  144366. 0x535d6ee3,0xdb40ce4e,0x0c650918,0xbaef1e5c,0x857561fc,0xe85145e7,
  144367. 0x34a224c6,0xe468536a,0x0ec0e0a2,0x69a8e227,0x242b03fc,0xb3f52247,
  144368. 0xc3bebd5f,0x862f55e2 } },
  144369. /* 11 */
  144370. { { 0x226049fe,0x2d6a390f,0xdcbbc9fb,0xcc92a578,0x97634fb7,0xa52feca4,
  144371. 0x3dea5893,0x2b340cb6,0x2a49e916,0xa39f338a,0x949e41f3,0x26b2df3d,
  144372. 0x065a7e40,0xc71c7cdb,0x468281a2,0x4a9b84a0,0x731eeeca,0x63eeb503,
  144373. 0x76cbb725,0xe6d09134,0xb94a678c,0x0cf979a9,0x808fd9f1,0xb44d8c3b,
  144374. 0xe0afc5b9,0xe60da613,0x3ea5be69,0x52dce7de,0xdc1ee74f,0x3a5d6864,
  144375. 0x3bc80790,0x71ab2891 },
  144376. { 0x3b5b60ad,0xcf618fc4,0x4a0c3184,0x0afb5e30,0xbc403302,0xd22381cc,
  144377. 0xdb1c0c66,0x33cf8953,0xa6112a8d,0x9c994e4d,0xd1967a86,0xd7aae2c3,
  144378. 0x5b7acd29,0xc28d5493,0x6c9a57fb,0x8075bd13,0x9c8427f9,0xc9c0373e,
  144379. 0x193225f5,0x2cbca18d,0x442c018c,0x73777d13,0xfbb3a727,0xebe5ed47,
  144380. 0x1962dc18,0x70437d49,0x2dc08806,0xf39c1e09,0x15fff35c,0x03e9c6f7,
  144381. 0x5e360a65,0x8d087bb6 } },
  144382. /* 12 */
  144383. { { 0x3fdc1844,0xbe212302,0x105eac56,0x6eca27ef,0xf168a348,0x2183a606,
  144384. 0xe1d7a4cb,0x295f807d,0x7ef5d43e,0x7246a632,0xc77025c7,0xae143205,
  144385. 0xf3484e3e,0x4bdfc7ca,0xdf52c075,0xec939895,0xd7a9cac0,0x82e655f6,
  144386. 0x8baeddb0,0x985dfe20,0x527de731,0x79c817e4,0x313de1ea,0x30ce0fbc,
  144387. 0xcc4f6cbb,0x9df95b89,0xf5bb20cd,0xf2aedf1e,0x1a8cfb01,0xfc1e0a89,
  144388. 0x63edb7ec,0x225ed34a },
  144389. { 0xbabb1a85,0x3e13154d,0x1e6a565a,0xd3d8dae7,0xab4b100f,0xd3217d56,
  144390. 0xebc78e1a,0xd44d934e,0x48e73d37,0x0215321b,0x201e43cb,0xbbc90bfa,
  144391. 0x27500905,0x3c23f1d0,0xc86691a1,0x2a2e5000,0x6065841c,0x08b2bad2,
  144392. 0x30026b60,0x15d41caf,0x5276ce61,0x1712c2f4,0x15932ffb,0x01c4c3e7,
  144393. 0x6a74caf2,0x7894e13d,0x0c0537a4,0x02d6f5df,0xc2b1c97e,0xa8fb7602,
  144394. 0xd0887c7b,0x612b60e5 } },
  144395. /* 13 */
  144396. { { 0xba245d6b,0xefd495cf,0xa2ce3ff6,0x5cf0cbb7,0xdff5feee,0x24da2ac0,
  144397. 0xcf28c6a3,0x90c914f8,0x4308a56b,0x72fdb50d,0x13d72034,0x03dbf779,
  144398. 0x822ac9e9,0xcfa5ec91,0x3aea3e81,0x0dde73c8,0x66289139,0x545ba962,
  144399. 0xca6acbd3,0xa52f648b,0x98a0683a,0xff6f276e,0xa378ed52,0x2536d3ac,
  144400. 0x885ac1d9,0x353c2c54,0x00bc84a7,0xcaff52da,0x37684167,0x3971f81c,
  144401. 0xd2d7986e,0x0f7334e1 },
  144402. { 0x6596067e,0xafbb5c83,0x38c19806,0x33e54e19,0x39cb0dcc,0x8285d967,
  144403. 0x424035f9,0x2b53f43d,0xdfef9095,0x38c531f8,0xdb0f571a,0x90fbe8e4,
  144404. 0xa39ca787,0x9a0c1ed2,0x606f2620,0x2fecc1d6,0x72b7cb4a,0x9dc890b1,
  144405. 0xccbb7868,0xc33ca6fb,0xfe73ee49,0xd1b11082,0xfcb66c48,0x590b7d17,
  144406. 0x86e14573,0x9356b0a6,0x053ead85,0x75d682c4,0xc54d30fb,0xb2ae55fa,
  144407. 0xf8aee949,0x67636a72 } },
  144408. /* 14 */
  144409. { { 0xb91d6bea,0x638063bc,0x923ecb96,0xae263a2e,0xc627aca6,0x9d7b0992,
  144410. 0x77af9e7e,0xc6ed001a,0x24aafebb,0x9214accf,0x78055a90,0xa3564b96,
  144411. 0xe027499d,0x00999b1c,0xe46a06a5,0xe413a4e1,0x2e51efe7,0xa05d13f6,
  144412. 0x9ba843be,0x35e87d34,0x3183159e,0x0a633825,0x54601923,0x6023e8ba,
  144413. 0xb7fd1cf2,0x9b107721,0xfdf2fd53,0x46b5542b,0x1c18af38,0xb314f4f8,
  144414. 0x60ac8965,0x086f9876 },
  144415. { 0x8cbb9850,0x76701954,0xa20d2c8c,0x6210b730,0x5335670c,0x4084d057,
  144416. 0x0324baea,0x3ecdc595,0xc76ee9b4,0x607fc5f2,0x440ffa64,0xf393d00f,
  144417. 0x2dc1463c,0xe0111796,0x9c7725e7,0xf00b8251,0x5bd1d186,0x35e60736,
  144418. 0x2cf72aac,0xf3d8554c,0xefa3497d,0xb4dd0fde,0xf646ad11,0xd712268c,
  144419. 0x9f7b8ead,0x07c20afb,0xfc06dfe5,0x630969d4,0x7245549a,0x76b7df1c,
  144420. 0xe61ae810,0x681f9403 } },
  144421. /* 15 */
  144422. { { 0xc9a0623b,0x7cad5163,0x67fab8d4,0xdbf82957,0x81af7c7c,0x2ccab0ec,
  144423. 0xe966d5c2,0x469e38c8,0xf0d4e41c,0x34430d52,0xa52b359c,0x426075a2,
  144424. 0x33bd0127,0x242dd3e3,0x9fed2341,0xcda3f635,0xd7d52ffa,0x4df33730,
  144425. 0x7640c3ef,0x5fff56f0,0x1bbde57c,0x4783c21c,0xeb8bb336,0xd8784a2a,
  144426. 0xead08405,0x1ec7c533,0xf9b62bd4,0x4b7f1423,0x7075d4af,0x5543145c,
  144427. 0xba60590a,0x0c9de94a },
  144428. { 0x95d5682b,0x8ed72735,0x2ec276ed,0x711c4283,0x8b36a0d2,0xd1f4aed5,
  144429. 0x8498a88f,0x62ab40c4,0x4480f451,0x58c8fc62,0xb79cffe2,0x8bc8ca4b,
  144430. 0x701a359d,0x90ab583c,0x3fd5d15d,0xaee31a73,0xc912333c,0x02a5597b,
  144431. 0xb6c3e3c2,0x1019cae4,0x29938088,0xe513042c,0xf47c8199,0x0e00283d,
  144432. 0xf2a00e92,0x90d68e58,0xa775ae3b,0x69e2df41,0x871c30b2,0xb8d2eca5,
  144433. 0xbb1de396,0x733dca0e } },
  144434. /* 16 */
  144435. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  144436. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  144437. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  144438. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  144439. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  144440. 0x0f1fa7d7,0x2ab3bd47 },
  144441. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  144442. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  144443. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  144444. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  144445. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  144446. 0x4c27d229,0x93a4b416 } },
  144447. /* 17 */
  144448. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  144449. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  144450. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  144451. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  144452. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  144453. 0x32ee7763,0x342ce0d7 },
  144454. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  144455. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  144456. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  144457. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  144458. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  144459. 0xe156fd20,0x455f4af3 } },
  144460. /* 18 */
  144461. { { 0x754ec21c,0xc057f262,0xe3a1ba38,0x3eacd4c9,0x116c1fe9,0x3a0210d1,
  144462. 0xeacc8ab6,0xe4ea4e94,0xea6f32ca,0x31c00c9a,0x86b975ce,0x5cb6239d,
  144463. 0xa14ea1e9,0x654d5d8c,0x5067fc8b,0x230d31f4,0x6355fecb,0x48bb90cb,
  144464. 0xdc172e8e,0x78f81ece,0xcb006737,0x288380a8,0xe162d012,0x19b02e01,
  144465. 0xc5af145c,0x0e087a06,0xb72dc354,0xf04dc8b7,0x8de3c066,0xf70ef214,
  144466. 0x13009fb7,0x4f148243 },
  144467. { 0x6e2055e2,0x5e004fce,0x86c32067,0x89e247ea,0x5f9daaa2,0x4ebcbd95,
  144468. 0xceb7f63b,0xd15f212f,0x863784a0,0x5ecc5c1f,0x75760251,0x53b3800b,
  144469. 0x8a6a2954,0xeb9301c3,0xa13cdd19,0x0f16ba18,0x887c2d24,0x8313d251,
  144470. 0x9a9413f6,0xf9923585,0xfe3fd7c5,0x423405e6,0x16e0ee05,0x678aeb34,
  144471. 0x3fadaab0,0x1f3be7bb,0x82884471,0x7901fa2c,0x4d662ff6,0xc950db30,
  144472. 0x3c01170b,0x74d5d2d4 } },
  144473. /* 19 */
  144474. { { 0x2b5bfe11,0xa3002dc0,0x52d321e7,0x0733410d,0x9679ba89,0x15920f65,
  144475. 0x685b236e,0x0e248c14,0x346f6040,0x8cfab594,0x40c717f0,0x9f57afb7,
  144476. 0x66044576,0x0dbab28c,0x9cdc3247,0x0fa09968,0xc230ed05,0x41e02ae2,
  144477. 0xe45bef74,0x0d961554,0xce4d7b6f,0x9688a982,0x5e62d22e,0xfadefac7,
  144478. 0xbd2cba28,0xaf1512a6,0xbe7c749f,0x78868e62,0xae9f5a6b,0x88048d81,
  144479. 0xc5857a29,0x6b1a5442 },
  144480. { 0x43242066,0x9f5ab9ad,0x2ccca2ae,0x0afef1b5,0x988edc4e,0xb1b43ec7,
  144481. 0x0341b0d5,0x0d0c00f1,0xb50aab37,0x4d68b8f7,0xf3a64a99,0x9a8e4e6f,
  144482. 0x7f1a684e,0x198338fb,0x351a0f5c,0x8bc0e748,0xdac44515,0x2cacf2cd,
  144483. 0x5e9ff76b,0xc14d3999,0x16393055,0x54a01b3f,0x888d8376,0x6ac3eea5,
  144484. 0x723277b1,0xb84d9a9a,0xe11dbbbf,0x99132691,0xabb67178,0x597717ae,
  144485. 0x8bb14ac8,0x4c213526 } },
  144486. /* 20 */
  144487. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  144488. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  144489. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  144490. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  144491. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  144492. 0x5c37c334,0x65713c29 },
  144493. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  144494. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  144495. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  144496. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  144497. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  144498. 0x3bae3c38,0x6b0e996c } },
  144499. /* 21 */
  144500. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  144501. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  144502. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  144503. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  144504. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  144505. 0x678223f8,0x4022a205 },
  144506. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  144507. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  144508. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  144509. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  144510. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  144511. 0x24a6a956,0x312179cb } },
  144512. /* 22 */
  144513. { { 0x07615ac2,0xa94cc3ca,0x121ad581,0x85865e64,0xa7986b79,0xae47616f,
  144514. 0x9d5e0f1d,0x395a40eb,0x3d9457ea,0xa9143264,0xfa2865d9,0x8de6d6a3,
  144515. 0x1014ae8c,0x0771db96,0x976a87cb,0x77a7cce6,0x143a0f60,0xa7de42e1,
  144516. 0xd993d934,0xe203cc09,0x98ec4c3d,0x92018693,0x3a25df4b,0xd77546d8,
  144517. 0x62b02d6b,0x0ad9eb47,0xd05a7189,0xfaaaf208,0x431221bb,0x5238181f,
  144518. 0x733511ea,0x417d6c78 },
  144519. { 0x0e91e9a8,0x3cbd81b7,0xc370d6b3,0x73340418,0x8eaa2373,0x825db10a,
  144520. 0x6c7d6756,0x8f2b09e4,0x94c33ded,0xe288ee9b,0x1695e3fb,0xcd8426bb,
  144521. 0xdce9e888,0xa6176c86,0x6165e362,0x3f4c8922,0x6063fb09,0x514e411f,
  144522. 0xc8f9e04c,0x6907ac20,0xdfd2ad61,0xcef7469c,0x8452199a,0xba30bae4,
  144523. 0x12ac3462,0x30681293,0xc92d482d,0x011be873,0xe8330995,0xff4cbf89,
  144524. 0xd1470a0a,0x02189d52 } },
  144525. /* 23 */
  144526. { { 0x92599c69,0x73e419dd,0x7fec32ca,0x5b94221b,0x09bbfbfd,0xb2bf9bd2,
  144527. 0x63ed895b,0x61ea97a4,0x3f486f79,0x6609146b,0xfd141a39,0xbd1c7a05,
  144528. 0x83d64135,0xc79ec8cf,0x9883507b,0x7f8fd42f,0x17b3d027,0xafcb53b7,
  144529. 0x67ca5a21,0x86658dcd,0xcd149786,0xa6a6c0ac,0x34b95067,0x16f3d70e,
  144530. 0xdf44958c,0x371208e3,0xec280212,0xd2dd64e6,0x30782c71,0x33b2c4ab,
  144531. 0x521176fa,0x7bbf8abd },
  144532. { 0xa78b981a,0xbe9e4aaf,0x304ec828,0x788b4e36,0x3959dea3,0x0c45cf39,
  144533. 0x240b39c7,0x70a9bdd3,0x28383b7d,0x499cd7dd,0x307a1026,0x30690b2e,
  144534. 0xee92f1b3,0x2262d598,0xb4725a48,0xc62d77de,0x7bc3aa0e,0xa16f25bc,
  144535. 0xd15ef7fa,0x62dd8b65,0x0b96d68f,0xd979221d,0xa00f1906,0xb92885c3,
  144536. 0xeb74c740,0xfa476b9b,0xc7576222,0x217ddbb5,0x5788504f,0xc2782c30,
  144537. 0xf812716b,0x860d096c } },
  144538. /* 24 */
  144539. { { 0x4d79bbf9,0xfebc337d,0x69f74f80,0x5d53eab8,0x33104d53,0xff36a095,
  144540. 0x196f8b97,0x2ab820da,0x75ce6909,0x961d3d1f,0x04683754,0xb197ec04,
  144541. 0x93a6cb9b,0xa68ce1bf,0xc5f021a3,0x503456ff,0x8940ffdb,0xb50a2db1,
  144542. 0xef004209,0x77c50f8f,0x04965875,0xd635d177,0x8bb8770a,0x725766d9,
  144543. 0xa078e53e,0x8e19b028,0xf9fc8378,0x364d4cca,0xf0dd39a0,0x1a3df411,
  144544. 0x03adf920,0x7e80e442 },
  144545. { 0x539a1ddf,0x4b5f8a57,0xee486562,0xd248e7ae,0x816021e1,0x1c7b491d,
  144546. 0xfd36d2c4,0x2e7b871b,0x0aec00d9,0xda38b504,0x6193f1b3,0xf2827612,
  144547. 0xfb1f78d6,0x69c3fe86,0xe827ac33,0x56c8b786,0x3487c8f7,0x1687f6c7,
  144548. 0x19dee5bc,0xab8f2217,0xff399418,0x04e8473f,0xa9027c80,0xf384c014,
  144549. 0xaa1d2e28,0x9967be9a,0xe065eef1,0x869686d3,0xc7bd837c,0x737c6b08,
  144550. 0x9e8bd863,0x5dcab5d1 } },
  144551. /* 25 */
  144552. { { 0x9a7d772b,0x0784283a,0xe540959b,0x6b49e525,0x86414ab5,0x546bb008,
  144553. 0x9d74b2a9,0xd4448162,0x203b0b1b,0x267890ad,0xc8d3f86b,0x1e7a82bc,
  144554. 0xd85a83c7,0x1352bfb5,0xfad07ccf,0xf29f16e3,0x41e0c43f,0xc02a63b8,
  144555. 0x6b379fef,0x904f22c5,0xb1244f26,0x19d8a653,0x3a28bdea,0x6635b6df,
  144556. 0xf6d455ce,0x18b68851,0x9cff3735,0x74ac2818,0x8b2cbdab,0xad40f9df,
  144557. 0xadc9d498,0x08cc2d9e },
  144558. { 0xc170c84b,0x2e6a6866,0x5a49a484,0xbb989e8b,0xd04c8992,0x7b0e00e0,
  144559. 0x61b3a423,0x55ad3478,0xb0d01899,0x3c952450,0xe3100cb3,0xe3922155,
  144560. 0xf03276d0,0x19265b6e,0x76d42b53,0x0fe8595a,0xfc6353b6,0x0a96dee0,
  144561. 0x246f893e,0x761e0dc8,0xf0a74cba,0x4ec902be,0x3fdfad9b,0x61008684,
  144562. 0x4fdb6975,0x5d6a60e4,0x7ef7590a,0x3f53aac8,0x12870a37,0xd29e6be0,
  144563. 0x55aa55b0,0x991fadc1 } },
  144564. /* 26 */
  144565. { { 0xb4844ffe,0x82bc4b0f,0x60f8b871,0x73922714,0x4ce3f1f3,0x8ac000e2,
  144566. 0x163519ec,0xf0d548b4,0x88288b5f,0x7aaf842b,0x2bdc9a70,0x9e8b0c4c,
  144567. 0x4ba5fd67,0xa06d5152,0xf93cdec3,0xd0b1afa0,0xdf89f8f0,0x280955ba,
  144568. 0xeea32c92,0x86cbe92d,0x3fe05be4,0x0cae3f99,0xfa6919aa,0xf2607095,
  144569. 0x6e0f1b8b,0x0f54741e,0x30ecf988,0x2aed1f74,0x734991d7,0x9296f76b,
  144570. 0x259f0fe9,0x66cf8d28 },
  144571. { 0x226f5868,0x9b01905b,0x16909e9e,0xc102e88c,0x4a37eb54,0x2bd08916,
  144572. 0xc9816323,0xf72253e8,0x86bac53c,0x37f84e9d,0xafeaaaf7,0x2e352454,
  144573. 0x2ca0046e,0x67c86f77,0x6663372e,0x86bce50e,0xb6950a04,0xf6a3a960,
  144574. 0xfc1aba93,0x61f994d7,0xc1326e6e,0x1957c12b,0x2e56b005,0x9b658fe4,
  144575. 0x8592740c,0x9cd297fc,0x177f26a5,0x7654ce9b,0xa79d2ebb,0xaaa699db,
  144576. 0x0ecb6448,0x5fca0c5a } },
  144577. /* 27 */
  144578. { { 0x569a6663,0xe26e25f3,0xe6aa4ca7,0x09597ee7,0x8d18b80c,0x25a4cda6,
  144579. 0x22926730,0x450602b5,0x07387209,0x9af5f650,0x26733a53,0xfeeedb34,
  144580. 0x86572951,0x0f5ce768,0x8398ae9a,0x872a360b,0x2b30f6c3,0x60347a80,
  144581. 0x1a162158,0xd2113b23,0xee6c6dec,0x6fd9cf92,0x5cbcf9e6,0x85f0a5a8,
  144582. 0x2ba3fe84,0xd7a5a6e4,0x51ecd727,0xaafe6720,0xa2081a10,0xe09c6bb2,
  144583. 0xb973b0b4,0x657acbf0 },
  144584. { 0xc274c8d4,0x3130466f,0x30a994d1,0x42765176,0x7079435f,0x217258ca,
  144585. 0xeb897a06,0x44850406,0x561ee130,0xf38dfeee,0xaa1778bb,0x11f4facf,
  144586. 0xb9abb9e9,0x765c6617,0xd8f10932,0xb135499b,0xa73b9159,0xc0eb6337,
  144587. 0x6f7e8b6a,0xf2c1ccf1,0x187def53,0x5b32c03a,0x830b9c62,0x89ad1d49,
  144588. 0x2f10e538,0x1735eae3,0x9d5f55bc,0xb1cbd9c2,0xe539db0d,0x42428c47,
  144589. 0xc852b3bb,0x3d2da412 } },
  144590. /* 28 */
  144591. { { 0x871f2865,0x97702b6e,0x142920d6,0x56cb639f,0x45b58611,0x328522a0,
  144592. 0xf3b13812,0xf3943ad1,0x712206e8,0xe6c2200a,0xa34d59ea,0xc2890e5a,
  144593. 0xf6b7f759,0xab52fd40,0x180bf567,0xf522c8de,0xaccee396,0x181e97b2,
  144594. 0xc4ea5cbb,0xe0375819,0xab51d3ef,0x0d9985e8,0xbcb50fd8,0xe26c96ca,
  144595. 0x97e1c80d,0xfb9d6b13,0xf796357d,0x582b1814,0x07f4c7fb,0x89a78221,
  144596. 0xc0357e61,0x02aeef2d },
  144597. { 0x2c7ec9be,0x2ba7926f,0x7258b201,0x292f307e,0xc6fa6b4a,0x74e62a10,
  144598. 0xe2bcc5ab,0x80c08549,0x7bb8c073,0xb4160db8,0x329f194d,0xd5ef0529,
  144599. 0x6dda4a9c,0x0eb8da14,0x15ea23d1,0x0b5d43d2,0xfc34bfae,0x6cebef02,
  144600. 0x848757a7,0xacd364d0,0x2d34cca3,0xc1401368,0x1d2d95e2,0x09ca6742,
  144601. 0x786eaa28,0xc3fd1d6e,0xa2965fec,0x9eb1136d,0xc0779203,0x48871baa,
  144602. 0x4b15aeb0,0x6b446c01 } },
  144603. /* 29 */
  144604. { { 0x25e8fe80,0xc819eb2e,0x98238a17,0x2b5f7906,0x81e41849,0xd6f1e996,
  144605. 0x98ea6d45,0x58ad8ad6,0xbfd02e40,0x5bae5ad4,0xa812416d,0x016dc327,
  144606. 0xa3347ca1,0x8b31a985,0x82a65391,0x0b4da610,0xb48c35fb,0x1cb91b2d,
  144607. 0xd2aaf8c4,0x9e96817c,0xcdfdcdc0,0x1a630483,0x12b69254,0x70559361,
  144608. 0xf8a2a097,0x5fdcd712,0x35cc5281,0x59ab623a,0x932b6095,0x30c8ebe0,
  144609. 0xb08e052f,0x8613424b },
  144610. { 0xb2231d8a,0x28902063,0xd9a61667,0xb0f62329,0x071a9f27,0xaafa0fe7,
  144611. 0x603f047e,0x6bcd8960,0xfd92a1c3,0x118cca76,0x71d483b6,0x3414e62b,
  144612. 0xba705262,0xa123ccdd,0xfd9b5c5a,0x1a576437,0x4c8d0fa3,0xa5301bc2,
  144613. 0x102427cd,0x96f0ad44,0xd3aa6c02,0x0e6fb5e0,0x072a3996,0xcd8c4880,
  144614. 0x840d3fad,0x4dafca12,0xde91d541,0x29f4ca3d,0x8441734d,0x0037c598,
  144615. 0x9ccfe57c,0x86333a99 } },
  144616. /* 30 */
  144617. { { 0xecf53b40,0xd213a751,0x2f78a542,0xcff2c6f2,0xf13ae56d,0x0f59f0e2,
  144618. 0x0e61748e,0x91f8ccbf,0xd72c4145,0x0aadecb9,0x4c9cdcb7,0x6b2ed852,
  144619. 0x1eaffc70,0x8e00b72c,0xaa728102,0x89b24285,0xb679cafa,0xaa7ea7e0,
  144620. 0x4f0a6f6f,0x5d2b8c26,0x0e804397,0x7ed7b173,0xc8573049,0x5a93eb45,
  144621. 0x0986e93e,0xc92bf5d4,0x6a20c0af,0x526b5a9c,0xb99dc3af,0x0adf47c9,
  144622. 0xba202cc9,0x12b25fe2 },
  144623. { 0x33eea395,0x09b8d78a,0xf633fc5c,0xc7a93618,0x270eceef,0x7e821629,
  144624. 0xc628ed0c,0x524779b8,0xa1d68939,0x91db5ca1,0x586edc90,0x8626e18e,
  144625. 0xfeb3f3bf,0xfe023e8b,0x0250171c,0x6279fde1,0x55e172de,0xe52ec7dc,
  144626. 0xc6d4ca45,0x445e8695,0xbdbc10f1,0x42de3878,0x6fc3835e,0x2b114de8,
  144627. 0x7e10b652,0x9faba456,0x390e78fe,0x4111d82a,0xaedf0aca,0x576b61c2,
  144628. 0x74accb74,0x216279a9 } },
  144629. /* 31 */
  144630. { { 0x4047f747,0xc14cdabf,0xc1315a1e,0x03ca233d,0x40e5d0a7,0x59e7cbd3,
  144631. 0xbb413869,0x1fd0c4e9,0x0f01fbd8,0x189d08b1,0xa76b823d,0x50449c42,
  144632. 0x398b00a1,0x81c224a1,0x8e8179e4,0x08084e4f,0x698e41e9,0xfd8af994,
  144633. 0x5610bf2e,0x1e30e37c,0xa7d2790f,0x4e6a043f,0xb3195388,0x9d96e60c,
  144634. 0x03799dfd,0xe75f986d,0xf8ff902f,0x3b4a8f11,0x7588416e,0xfa945378,
  144635. 0x9827535e,0x20683e3f },
  144636. { 0xd0378878,0xcb582e26,0xa7945787,0x9e214c23,0x8f6688b3,0x13d000bf,
  144637. 0x40515270,0x7548d4f5,0x40111f5d,0x7113c15d,0xa8bff902,0x3bf5a526,
  144638. 0x9b4945cc,0xbda6b010,0xbc2f3a05,0x83dcc74e,0x43efdfa1,0x2aef6284,
  144639. 0x565c5bf4,0xd2e60ee9,0x592f243a,0x4f0fa10d,0x1bc3bf51,0x6ae58b32,
  144640. 0x60576a74,0x813b0868,0x4d73081a,0x0bc023f8,0x32dcee59,0x9fd03aa0,
  144641. 0x27d6c795,0x5e416bf5 } },
  144642. /* 32 */
  144643. { { 0x026cc23c,0x24313760,0xb5b29058,0xf819aaee,0xc5d2ee17,0xa92272f8,
  144644. 0xee5cc402,0x8048e7cb,0x77def07d,0xdbc7d6ee,0xf6af821e,0x61d69244,
  144645. 0x996cbb89,0x5f7966ed,0x96a155a4,0xf81b17ea,0x03f3ed56,0xb2d9ef70,
  144646. 0xe882a5b2,0x5e6e5906,0xae947180,0x86fa1072,0x658c76f4,0x34d9fc51,
  144647. 0xcb035aa0,0x9f603dc0,0x75be6481,0xb7b39feb,0xcf04a9ef,0xca87554a,
  144648. 0x87b4fde3,0x4ff682ec },
  144649. { 0xd0a10ad5,0x3125627f,0x968e6f45,0x7fd45c72,0x806a1163,0x2981bd6b,
  144650. 0xde5033e3,0xb92de1cd,0xbf4f8988,0x3b44b45e,0xdae7e1dc,0xca1b9896,
  144651. 0x0778d878,0x52166e5a,0xa5116847,0x82d472be,0xf2895445,0xfbdd382a,
  144652. 0x5d6ec4c9,0x22ed1602,0xb6552b02,0x3614eb1c,0xa1e6210f,0x63c5df73,
  144653. 0x021a74a7,0xe9160285,0xc65cbd4d,0xa44ca400,0x0f15e299,0x48cb187e,
  144654. 0x3402507c,0x51eb818e } },
  144655. /* 33 */
  144656. { { 0xb92100ab,0x1fc1d178,0x9605b839,0xdf2e3d60,0xb71e59d0,0x12a7c255,
  144657. 0x14fcbe04,0x3f8b6675,0x59fd06af,0x0e8a3935,0x12020d07,0x56326502,
  144658. 0x528e7be5,0x6696fcd1,0x0c7b7654,0x6588514b,0x5912a5b5,0x0cd80f8c,
  144659. 0xf324cb7f,0x8bafef04,0xc6da3d75,0x6b53eecf,0x31d1df2f,0xedef48d8,
  144660. 0x73812b6d,0xf336b965,0xee626031,0xc82eae4a,0xd244f09b,0x300abd32,
  144661. 0x31d9647f,0x8b0af955 },
  144662. { 0x2e603544,0xb770180a,0x221acd9e,0x2b573ac3,0x62407032,0x3a17f665,
  144663. 0xb89abc3d,0xad3e74ad,0xd793225a,0x8a3d2e3a,0xef02564b,0x457bba04,
  144664. 0xfc2dd2b5,0x8875652f,0xe67143e8,0xd2905d15,0x02e48d70,0x6d884b42,
  144665. 0xc7636a57,0x06f99219,0x35e378df,0xa8dc3421,0x10c64a02,0x95c1d73d,
  144666. 0xcc157a66,0xcd6a4ece,0x8e24a354,0xbadcc1c8,0x9839329d,0x8024f1b2,
  144667. 0x4da48ad0,0x5363e549 } },
  144668. /* 34 */
  144669. { { 0xe23fc641,0x1f5523b7,0x86667063,0xfe54e72f,0x8e009d2f,0x294a15f5,
  144670. 0x8c57f5e1,0xf203997f,0xb16d64dc,0xa229724c,0x4baa2ffb,0x697be4fd,
  144671. 0x0a6e8ed6,0x3f507e46,0x78508536,0x0afe3a5d,0x95408208,0xeeef6cdd,
  144672. 0xf2c4237c,0x701fd889,0x5c385253,0x496d883a,0x72a212f1,0xe25c67ed,
  144673. 0x1ff78fcd,0x4b416783,0xc16f4146,0xe9967004,0xc45b0697,0xfa45c3a1,
  144674. 0x3fbd30c3,0x63334018 },
  144675. { 0xa2fbbbce,0x39c9a0cc,0xaa0cb744,0x876f6e5c,0x3438ece3,0x9ce6010e,
  144676. 0x13802d82,0x0aad148e,0x9cd45a1b,0x9c3e5c60,0x7bcfc1e0,0x875cb859,
  144677. 0xd8584dd0,0xb19ff790,0xd81c2a2b,0x2598b81e,0x02be07e3,0x118bdf2f,
  144678. 0xb9765ce9,0x074fc8ee,0xb24f95ae,0x125e9d88,0x0c98f09d,0x3bb12cdc,
  144679. 0xa0b74b27,0x4a6aee07,0xc08077ce,0x4723d2f9,0xbea8026f,0x959447d6,
  144680. 0x16280b73,0x93a7075c } },
  144681. /* 35 */
  144682. { { 0x715b27f9,0x26bbefe2,0x2a280923,0xa935a5e2,0xfd58a26a,0x5ddf23af,
  144683. 0x7c138694,0x54c83e16,0x892a2153,0x44799bc9,0x9b8d09f5,0x4e6e4710,
  144684. 0xd588ea68,0xc63af616,0x883ab1b6,0x5e896706,0x3d209336,0x3c1393a0,
  144685. 0x92c23dda,0xd02f2921,0xdcf6ea43,0xab70cb7a,0x791559e1,0x12434ea8,
  144686. 0x6d70ff0b,0x040680db,0x2832ba45,0x1a10fe52,0xe5f0cb8f,0xd69f9c08,
  144687. 0x44b141fd,0x1a7422ac },
  144688. { 0x9f40b675,0xc3a9dd2e,0xfcc71f39,0x2a7c6603,0x1948e342,0x18939a61,
  144689. 0xed0ab484,0x8f3b6158,0xee31ca6b,0xa3aa7d97,0xf7a8db63,0xbc1e865e,
  144690. 0x2c7c62e4,0x315f8c09,0x9f5c6d0f,0xa260788f,0x4b6f3ec5,0xb1833129,
  144691. 0x36b4d849,0x73adbcd6,0xbc699a9b,0x66e14890,0x2a1175e7,0xbf3790d8,
  144692. 0xfc53ca4f,0x7f43605a,0x87ff6091,0x577f6c47,0x600c82b6,0x827c7552,
  144693. 0x9d25599c,0x0944d630 } },
  144694. /* 36 */
  144695. { { 0xe6ab9620,0xcfdeb63e,0x786cd808,0xdff4fa6d,0x456320b3,0x145edd82,
  144696. 0xc4943915,0x2ae5f862,0xb73b3f87,0x9508e813,0xe52f97a9,0x3bd805f3,
  144697. 0xc9829b62,0xf71b5c28,0x86e0cefc,0xb394c70e,0x23bdb36e,0x534fb1a9,
  144698. 0xdbe27e5a,0xd64f5862,0x83ab6169,0xbae23df3,0x27c828cb,0xdd6df1b1,
  144699. 0x3a307a8a,0x1901899f,0x811ddf66,0x36cc8659,0x79943b77,0xa3cb7774,
  144700. 0x6fd86576,0x7d89f383 },
  144701. { 0xc9f92b2b,0xf8564242,0xc46e32bd,0x700c6a75,0x7f99a5c5,0x93e768b7,
  144702. 0x03149568,0xb6efe858,0xc2ce6709,0xbbfe8a19,0xee6ec493,0x721a3b1b,
  144703. 0xc371c28d,0x26eeeea9,0x15177e1d,0xd798115e,0xb068a5a5,0xd7bf3bce,
  144704. 0x46d2b4b2,0xdf8da220,0x59be9dfc,0x3df0995b,0x77640b79,0xc96897bc,
  144705. 0x5a2bd3c5,0xce0cf4c2,0x89afe744,0x16f45d6e,0x3a8509bb,0xb53f3acb,
  144706. 0x63f2a6e6,0x449af81f } },
  144707. /* 37 */
  144708. { { 0xa16d9377,0xc2fcf132,0x7e1a2f9e,0x9ab377b3,0x86d19ae5,0x72e1a12e,
  144709. 0xd013bbb1,0xd2b12e66,0xcb5f66ba,0x0972e055,0x399eab50,0xd11de1c0,
  144710. 0xc65f5ec2,0xc1f314fd,0x8a9ff593,0xfc311841,0xe05246e6,0xdf73c1ec,
  144711. 0x1625056d,0xc28d1363,0x6fb25e19,0x30a9dbd7,0x845cd2d7,0x049ed244,
  144712. 0xd36e852d,0xc779b83f,0xf68c8a83,0x85a35fc7,0xc95e8033,0x299bf1e1,
  144713. 0x20891af5,0x0e8617c3 },
  144714. { 0x67c81b5c,0x53720602,0xe737873c,0x2fa89dcd,0xa8144fd0,0x2a7430b0,
  144715. 0x26208c83,0x3006c5a7,0xd8ea40f5,0x4e066660,0x896413a4,0x9dd025f9,
  144716. 0x46b9149f,0xbdf380cc,0x0a125cc2,0x80156619,0x52793c37,0x04d6a3b7,
  144717. 0x6b7a62f2,0xb6001374,0x585d5978,0xa9cfe268,0x8395fe66,0xdcad0cb8,
  144718. 0x46b261f6,0xbab468fc,0x9d9d9218,0xca0ef5ef,0x5e452402,0xc507d4a8,
  144719. 0x326cf687,0x6f4404f1 } },
  144720. /* 38 */
  144721. { { 0x4febd3ff,0xa3e1920b,0xfdfd2bba,0xca6234d8,0xe19a9829,0xb7d1af2a,
  144722. 0xc6f5bc20,0x23de1610,0xdaa39ca9,0xe204dbf3,0x6d8c70ab,0x2a2de9b8,
  144723. 0x7c9d370b,0x272e0c37,0xe565510e,0x80914c06,0x57cbb6b0,0xb611e7a8,
  144724. 0xd8266a6e,0x076fc6ef,0x3095801c,0xdfac34ee,0xb9e24063,0x69ff40a2,
  144725. 0x787aa5c5,0xa7ba31a9,0x33c70cd2,0x0e4d1fdf,0x6895f074,0x903e3132,
  144726. 0x7fb671e2,0x905771f8 },
  144727. { 0xa4062bee,0x5199ba0d,0x94d7d9f9,0x18e7238c,0x1e0922c0,0xf53f29bc,
  144728. 0xb12d855f,0xde9b2a81,0x6d68ca29,0x649f3eed,0xc50c097f,0x64adfc34,
  144729. 0x9db398a0,0x81964ab9,0x7a587224,0x00d59c47,0x74c5903a,0x09fea396,
  144730. 0x15043dd0,0x6aafd8ee,0x5f1ecc20,0xc5721a6e,0x0db9b7b4,0xb6d6a483,
  144731. 0x66c8d52a,0x06ffc617,0xacc82a27,0x3de241d6,0x27f2f7a8,0x0605f052,
  144732. 0x6404decc,0x6a22953b } },
  144733. /* 39 */
  144734. { { 0x74fce389,0x92452d8f,0x2afa5564,0x059634c0,0xf0ed7825,0x9377ccbb,
  144735. 0x37718e0d,0x89f4045b,0x9fa69a4d,0x11074e7d,0x7295b0ba,0x5d70bb07,
  144736. 0xf107ede6,0xb22d54ad,0xa1a29c7b,0x5c39a3d8,0xd795e3ab,0x37236c02,
  144737. 0x2b589951,0xf7282d00,0x5790bee2,0x5e2265be,0xa8e65ea2,0x91e0ea11,
  144738. 0x6001cebd,0x0e71a708,0x2c1c5402,0x16900f5a,0x357f6981,0xc3b2d5c0,
  144739. 0x619e3427,0x528c9ea0 },
  144740. { 0x5f26c577,0x1edc86b4,0x9438bd45,0xf8074708,0x792582a7,0x2dfe1013,
  144741. 0xde1e569f,0xe08eaca0,0x9a55a356,0x5f952efa,0xe4976216,0xa4d80b53,
  144742. 0xcd5d71f2,0xd2b65855,0x66cea3f0,0x246704bf,0x492323ca,0x193f641f,
  144743. 0x9adb1325,0xa681855c,0x2d19d652,0x86d522ce,0x5b82ed7b,0x53609f10,
  144744. 0x8e150d29,0x3b0f0094,0x0b13e891,0x23ad8bfb,0xf794b449,0xcbb1556c,
  144745. 0x738bcf57,0x200f9093 } },
  144746. /* 40 */
  144747. { { 0x8388387f,0xf9b22fc5,0x28e883c5,0xcf26f170,0xd1b7973c,0x447cab90,
  144748. 0xf6ec9171,0x8d5d4ea2,0xc30cdbc0,0x2e16f498,0x48623c2b,0xdc92910c,
  144749. 0x30dbc545,0xeb1491b0,0x14de21b0,0x631deb2e,0x2fe830f4,0x04a21066,
  144750. 0x379c1f3f,0xa4c6979c,0xfb06a795,0x8a732b68,0x1619dfa9,0x3a44327a,
  144751. 0x8dbe2c9b,0x91a307d3,0x03989fea,0x939bc8d2,0x0f4a331f,0x3daabaf2,
  144752. 0xdd0f55dc,0x5c307e98 },
  144753. { 0x35b233da,0xbbc4e0c4,0x22f6f985,0xe3d29085,0xa8b02468,0x99dd2d21,
  144754. 0xa96916e7,0x978f40e9,0x614bcced,0x0327d86c,0xb290762c,0x95e95502,
  144755. 0xa879f2ed,0x0ffd2197,0x50e0bd33,0xc4365137,0x0827c4c4,0x26c3148a,
  144756. 0x3fcfc0b2,0xc79812a8,0x31928589,0xc3d8d17e,0x8830f42d,0x8b572cfe,
  144757. 0x4b07f83f,0x7cd9ff92,0x0a51148f,0x331ca950,0x4c59f9ac,0xd0c53968,
  144758. 0xc1434785,0x1df16dfa } },
  144759. /* 41 */
  144760. { { 0x68bcacc3,0xcc7bb4ac,0x430f58cf,0x06ded34f,0xd461855a,0xc59f9f4f,
  144761. 0x45c9f0bc,0xf5491994,0x4375c892,0xdc5f7ec6,0x3c85983a,0x1b8708f1,
  144762. 0x82fcd087,0xb32a5cc4,0x2d6b4c0f,0xefdcdc35,0x8ac6fb2d,0x4bb24f04,
  144763. 0x33906471,0x5982d4f5,0xb83a3ac4,0x162eb52f,0x2337a223,0x7130df28,
  144764. 0xcbc3dbd3,0xdce7b802,0x2467ac0e,0x8b395959,0x1b56717e,0x21d3d2e8,
  144765. 0x46512617,0x729a7f50 },
  144766. { 0x8420f90a,0x874ed1aa,0x0fe4c855,0x6368e19e,0xb0be74af,0xb62d4aaa,
  144767. 0x8ca60ca9,0x76fcc480,0x7645a867,0xf310b5a5,0xddb1b24c,0x131bac9b,
  144768. 0x2dea5b44,0xef77d71d,0x72fcc64e,0x4706d210,0x673d77f0,0x29b92691,
  144769. 0xe89e0663,0x22e00bf3,0x74077d40,0x472d0cd3,0x829232e2,0x3e21040d,
  144770. 0x38dc8533,0x2f916dfb,0x14b8f667,0x48bbb59b,0xd44be19d,0x19de9f4a,
  144771. 0x232d9d5c,0x7f6d3649 } },
  144772. /* 42 */
  144773. { { 0x6e794819,0x3bd064de,0xf82ebda1,0x5a6b694e,0xb91e2804,0x1f017fe0,
  144774. 0x07a43cd2,0x190d31f3,0x630433e9,0x6c26f226,0x0abfdcb4,0xba488aa7,
  144775. 0xa46411c0,0x418d9085,0xbffb5880,0x1b934fe6,0xe200f849,0x75d1e237,
  144776. 0xa55413db,0xdf04d63f,0xe23b3f77,0xe216ed75,0x0f91bd30,0xa05866cb,
  144777. 0x7729c509,0x84c395d9,0x452ab2d7,0xec97e188,0x0093d686,0x8cb7c1f9,
  144778. 0x628f086c,0x2d032395 },
  144779. { 0x4a44b4c5,0xa81c9407,0xcc702c98,0xb9846879,0xceb0dc97,0xcb502287,
  144780. 0x6e3aa321,0x30301126,0xe4c256c2,0xc0ac8763,0xe55b4845,0x65034d20,
  144781. 0xf240f35b,0xaa96a040,0x7cf7eedc,0x046d26d3,0x3b810656,0x62a5a8e1,
  144782. 0x83d70c2b,0x86044b97,0x59e4da8f,0x2fbaff88,0x5457f5d1,0x929d901a,
  144783. 0xb531b757,0xd29e1eb2,0x9e4e9739,0x214dabdc,0x4eaa9bd9,0x5bd724fc,
  144784. 0x1ef9bb9b,0x734c12b3 } },
  144785. /* 43 */
  144786. { { 0x92f9b086,0x98fe3c2e,0xb3fd4544,0x4641b93e,0x5c02c65c,0x47ce208b,
  144787. 0xc4f03242,0x8a52dca1,0x679d29f6,0xb5ec17d9,0x9406f5f4,0x11d2fed0,
  144788. 0x0d9ba811,0x260f63dc,0x15472a3f,0xde2b056f,0x007290e6,0x1b170d9f,
  144789. 0xb6b5c8f9,0xa2e23e8d,0xcf34c3ee,0x345a2839,0x1b973ee2,0x9bdc5461,
  144790. 0xbb24d1c5,0x65bda6c2,0x3c6141a1,0x97d52ba3,0x9d2eb201,0x47bb1612,
  144791. 0x21fbe49f,0x7c558a87 },
  144792. { 0x3f350fec,0xb9485a52,0x6a38d4c0,0x016678c5,0x0d5aa64d,0x8ef346a2,
  144793. 0xd96da2e4,0xb85daa02,0x4f647b3c,0x845ec4ea,0x0d5e946c,0xc0d1a6ca,
  144794. 0x4fa9f4ab,0x41d8d1c1,0x9c8b1303,0x43972cc5,0x434ffbfb,0x67e1f48d,
  144795. 0x819d2318,0x350ce93a,0x6ddef23f,0x49f53090,0x200cf12c,0x3c2e6cf9,
  144796. 0x640432fc,0x42691cc1,0x72496b52,0xbfff74b4,0x020a97be,0x44527c9f,
  144797. 0x7b3c4348,0x34cd7dca } },
  144798. /* 44 */
  144799. { { 0x59e7fe87,0xf031761a,0x0047cd72,0xb1eae31a,0xfae30f62,0x27902e68,
  144800. 0xb71db143,0xa666f48d,0x0e0038f4,0x75ee6678,0x02bdd76d,0x3b45ac67,
  144801. 0xa0d6cd5c,0x0d2fb828,0x9d8c5b11,0x27ce7f1d,0x120b5e96,0x141fe0e4,
  144802. 0xb9267c37,0x95a1b984,0xd60312cd,0x5206e589,0xda549356,0x1867342e,
  144803. 0x070c74ac,0x374520b9,0x9557b0b3,0x2703cbb5,0xa6ed8c14,0xf621f59c,
  144804. 0xabf7b887,0x7ceb1cc2 },
  144805. { 0xdb7fd65b,0x0647a5bb,0x36c9457c,0xd8d45cc0,0x9e12718a,0xc6da99db,
  144806. 0xe93a7fb1,0xed1dbbf4,0xbd1566a1,0x4512c95c,0xdbc0c919,0x4861ba00,
  144807. 0x9e7f5269,0x3c6cc298,0x0941aaae,0x67196150,0xc8c538e3,0xbfcf5d0f,
  144808. 0xa25a551f,0xad6e9929,0x17ca0f26,0x90710985,0xfa89ef7e,0x743b78ea,
  144809. 0x71ab4549,0x39d5ea31,0xe6d1c36d,0x7442f3f3,0x059d568d,0x25a683e0,
  144810. 0x227ced5c,0x1f629a99 } },
  144811. /* 45 */
  144812. { { 0xe45a1c3e,0x8925ddac,0x41f7545f,0x72d29365,0x37e7f828,0x45622fcb,
  144813. 0x3e4c79d2,0x88234513,0x9c2645d6,0x5dffaf84,0x994802b9,0x3078f4dd,
  144814. 0x9d339fa0,0x566927f0,0x9fd91dcc,0x9a500a1e,0x0ab0abd7,0xce008180,
  144815. 0x8194e5df,0xd97135a3,0x98adf088,0x9e876307,0x9a45a2a7,0x3baf01b8,
  144816. 0x788b4399,0x6fed6154,0xe77a997d,0x980e5722,0x2a378eed,0xaac90ffa,
  144817. 0x8bd805a2,0x4a75fda2 },
  144818. { 0x55e74cbc,0xd09a8fbb,0xfab18f25,0x737738ce,0x9764ec3a,0x0fc23ad6,
  144819. 0xe7e0ad31,0xc5a7d35b,0xe481cc9b,0xe75e068e,0x3d4aec34,0xf0c2ea99,
  144820. 0x0d4a63c4,0xf1324fe8,0x99b0592c,0x5dbb7c16,0xa7e0f46b,0x442d674d,
  144821. 0xa300faea,0x5a5d66c7,0x3333ac83,0xe83dc821,0x8c408496,0x70ef812e,
  144822. 0x99ef5fc1,0x96e1dcb6,0x1734e862,0x6e2b771b,0x583507d8,0x04629cdc,
  144823. 0x23d8179a,0x5819f9ae } },
  144824. /* 46 */
  144825. { { 0x6aa78811,0xd9969121,0x2103e7c3,0xf64ee8f4,0x22b9e698,0xddf01070,
  144826. 0x4f582cde,0xe6001f9e,0x2ecfac1a,0x24a608af,0x06393009,0x6ef4c784,
  144827. 0xebf72911,0x5262eae6,0x8c4ee5a0,0xddbd0af5,0xecd87bc7,0x875aff90,
  144828. 0x6f24f114,0x2fddb34c,0xe865f172,0x48104281,0x886c1b9a,0x95692426,
  144829. 0x9ef4231f,0x6f5f3208,0xd0a7e82e,0xaf587acf,0x9ac395c8,0xd6571917,
  144830. 0x1364a750,0x7459603c },
  144831. { 0xf41ae519,0x1c2475bf,0x4af8f251,0x34401fb1,0xaefb2c3d,0x70ddfcd2,
  144832. 0x51cdaf08,0x9b2d385b,0x8208bb19,0x8531c256,0x4c33f3f6,0x16c89df6,
  144833. 0x24571769,0xc23cfa99,0x86d010ba,0x2339b51e,0x22638313,0x08db0e8d,
  144834. 0x00fedeb7,0xf769e179,0xa3687ef1,0x3fd96dcb,0x91476475,0xcd046b23,
  144835. 0x0c45c8dd,0xf3ff2064,0xb8343d78,0xefd167bd,0x4b77ee90,0x493ccb6d,
  144836. 0xb3cf7b45,0x33025513 } },
  144837. /* 47 */
  144838. { { 0x35eaaca1,0x36f00469,0x89119102,0x0c384b75,0xe6d2954c,0xcb375665,
  144839. 0xb1e9d6d7,0xcb9199b9,0xc29c2757,0x75852349,0xb8e738d0,0x89cbd1ba,
  144840. 0x5923a427,0x9b8dbe90,0x18fe1889,0xa237793e,0xa742e083,0xa4271757,
  144841. 0x4eebd613,0x8c4979d2,0xd4f2cf77,0x40325054,0x958705de,0xa3b8a091,
  144842. 0x33d999ba,0x1b191bd9,0x3b0fee1e,0xbafefba4,0x3facdf14,0xb3bad184,
  144843. 0x4387561c,0x9328adb0 },
  144844. { 0xf906b872,0xabe84e80,0x78262665,0x705523a0,0x3398ccf7,0xd89c6a7e,
  144845. 0xf55b5323,0x2fab551d,0x0554dea8,0xa0578eca,0x375589cd,0xef26523d,
  144846. 0x864ad750,0xd8fd6242,0x178fe1fe,0x93f27fc5,0x9df87422,0x7b3e6f30,
  144847. 0x3750d054,0x2862e49e,0x5dc038a1,0x7d90c6b2,0x84db682b,0xc1a1ae22,
  144848. 0x9881930a,0x47f3dab7,0xbaf3e0a4,0x30e6bd52,0xf62d25c5,0x0680025b,
  144849. 0xadd0d5e7,0x0aa1f3cf } },
  144850. /* 48 */
  144851. { { 0x22a10453,0xa9822190,0x2a03a10b,0xdd1eb91c,0x96646f3b,0xafbb5d95,
  144852. 0xf38b6fc6,0xa58de344,0xb8cfca1d,0xce47c3e5,0x0f70da04,0xfcd8e16d,
  144853. 0xda262ed6,0xac44349b,0xc56e2f8e,0x9320d87b,0x19138e58,0x9ce3ea08,
  144854. 0xa2b236c0,0xa5862dff,0x8e7efb0d,0x6b0f9a5c,0x16ac78eb,0x4b53432b,
  144855. 0x709b51af,0x6ff43105,0x8f519628,0x08e236f8,0xeed403ad,0x1f93f176,
  144856. 0x9636545e,0x559337e0 },
  144857. { 0xd8fd807a,0x30ddf738,0xab131222,0xf4e0ec9d,0x625afbc3,0x14a2f4db,
  144858. 0x9f12f895,0xd5b70604,0xac3044fd,0xb46f3c23,0xf540148f,0x1b232d1f,
  144859. 0x39b4e554,0x61b458f5,0x0dd70b75,0xf694b24a,0x289581d9,0x0fc64299,
  144860. 0xee5fe22d,0xc05d49be,0x6a18bf63,0x7af3447f,0x7f1929d6,0xe96a1dc2,
  144861. 0xc1551e8c,0x6afe6028,0x2b5d4fa2,0x27dacaf3,0x545c2cb4,0x4a1631bc,
  144862. 0xb0c914d3,0x930070f9 } },
  144863. /* 49 */
  144864. { { 0x69a9bc05,0xd2f32c5e,0x589c4b73,0x0a5c19c6,0x94665f9c,0x095c9e5e,
  144865. 0xbcfb4c39,0x8ab0f293,0x1ddb7c31,0xb9070877,0x66b38048,0x894e9658,
  144866. 0x606bd9bd,0xf19a90cf,0xb6fd2d69,0xcc1d58df,0x461d8a69,0x886dcc4e,
  144867. 0xf9ce4831,0xc455c277,0x765f8a82,0x749a5996,0xc3badc8d,0x2ffc668c,
  144868. 0x9112cdab,0x38018396,0xb243c7cb,0xa98795c3,0x010a2224,0x8775f310,
  144869. 0x587b5e14,0x043a2141 },
  144870. { 0x3a873752,0x7bbe9dbc,0x2f442fee,0xee1493f4,0xc18c2181,0x981ca2c8,
  144871. 0xe29769e7,0x00ce3090,0xde768c5f,0xb4626ac8,0x34d7677e,0x33e9ce46,
  144872. 0xe0fa94e6,0xf89c2cad,0x41f5b5bf,0x04f5cc11,0x2228c12c,0x2565f736,
  144873. 0x0c05cce5,0xf1bf706a,0xbe487c4f,0x5d07ffff,0xa499f1a4,0x3ec43c09,
  144874. 0x98d94800,0x4f4e79bb,0x073f12f8,0x8a335a16,0x0f970d6d,0x4bb5eaf7,
  144875. 0xf24d0ae8,0x18d0747b } },
  144876. /* 50 */
  144877. { { 0x84601faf,0x58d3c77c,0xaf1c1f72,0xc9465be2,0xd116d806,0xff626798,
  144878. 0xd5b0d93c,0x3996c0c6,0x5ec6723a,0x2fa1ad75,0x03ba5349,0x966a8144,
  144879. 0x2ac34d8a,0xdc4c9422,0xed675865,0xddf471de,0x953d528f,0xd8aca597,
  144880. 0x24ebf67d,0xb2e463b5,0x7e25b4d3,0x25824871,0x43159daa,0x23c5adba,
  144881. 0x83357540,0x5458f9c6,0xf938b1a6,0xcf685da7,0xcefed231,0x981a4fda,
  144882. 0x08bb5e59,0x711093ed },
  144883. { 0x401f161a,0x12aa3fc6,0x974c5e87,0xf7358560,0x17b5df82,0x4aa252fb,
  144884. 0xa48e6299,0xb0b82b07,0x29dd847d,0x00234157,0x4529c5a6,0xf1e54d00,
  144885. 0x6d98f538,0xcc1c539e,0x28d3abcb,0x36162b53,0x2a84f0cd,0x75a37938,
  144886. 0x4dee7484,0xf717a81b,0x4c23bf1b,0x16cf35fb,0x787e8b3e,0x7fd1c29f,
  144887. 0x59b79ab0,0xb7da7e68,0x85f6c60b,0x072100a0,0xe7ed48b5,0x31840159,
  144888. 0x4d9c97d4,0x17898bda } },
  144889. /* 51 */
  144890. { { 0xae1b8cf8,0xcd8483d8,0xe9a28856,0x323d4b42,0x204a4bc2,0x7633584f,
  144891. 0xca7a69fa,0x4e0b2228,0xf757bab2,0x8afbda8b,0x6cc5f9ca,0x85b24088,
  144892. 0xd41a95c3,0x47fb4813,0xc2aabe6b,0x3f1bc53c,0x1ad1599d,0xf22cda3f,
  144893. 0xc31ea9b1,0x1b2ec081,0x01614ac1,0x048f304b,0xc6afa7ab,0xce31cee9,
  144894. 0x4140dc3d,0x55af7633,0xdce8abba,0x84b7ab37,0xc7cf3efe,0x50de7648,
  144895. 0x15356ab2,0x73a88dcf },
  144896. { 0x06e83b39,0x3f868288,0x9f44037d,0x477a4413,0x17dbc841,0xf9058b0f,
  144897. 0x54d17549,0x2db64f4f,0xf2307ffe,0xa23cea6a,0x4f126261,0x393efd55,
  144898. 0x10f37f26,0x2f4e658a,0xf4ee1e35,0xa4437ce3,0xa93cde8b,0x64ef42a7,
  144899. 0x939aa901,0x1debc9f4,0x3d7b5cd4,0x44223d6a,0xf88a3acc,0x789a6a11,
  144900. 0x2c608a2d,0x56fb9df8,0xbbf56c06,0xe79db8e3,0x668fa300,0x73c56af2,
  144901. 0xae396a1e,0x52f32b17 } },
  144902. /* 52 */
  144903. { { 0xe714f71a,0x56f524c1,0x9add8519,0xc1be1262,0x65cadbe3,0xad9189d8,
  144904. 0x5a0fb649,0xd88bf5c8,0x21d192d9,0x9efa6a92,0x6f724b6f,0xe3fe8389,
  144905. 0xb250119c,0xec3fae24,0x2ae0d3c0,0x4b6af9f6,0xd619624d,0x8fceba0b,
  144906. 0x2fdb6e3a,0x7dc3092b,0x3263cd29,0xc91da376,0xf95c43bd,0x30c0761e,
  144907. 0xcdeb44d9,0x89136400,0x43c0d31d,0xfd7dce84,0x9871899f,0x78fec3b1,
  144908. 0xefdf58c1,0x79e14d28 },
  144909. { 0x9bb40c55,0xe3822235,0x0ed07a42,0x0a27202d,0x4838c1f4,0x48e6c1a9,
  144910. 0xd864a78e,0x2b5f24a7,0x0c6c55c9,0x7e7f140a,0xce12d508,0xe62c104a,
  144911. 0xc11b1e10,0x9b0a1a7e,0xafbb3dd5,0xfd8a275f,0x9a3b6b30,0xdff354fe,
  144912. 0x46602a01,0x5a105d9e,0x93bb65f7,0x3d371b4d,0x0f82fdeb,0xda5cbf0b,
  144913. 0xde468545,0x4601229b,0xc73d517e,0x505e10b9,0x672ff492,0x77cfa541,
  144914. 0x99566ce2,0x0d8ec28a } },
  144915. /* 53 */
  144916. { { 0xcbeee995,0x014cf73e,0xd491e80c,0xb2eb88bc,0xd9aba5d4,0x615a6cad,
  144917. 0x9304c84d,0x2f7d4633,0x8ab03c9a,0xba0501d2,0x91babb94,0xc8f723de,
  144918. 0x50405772,0xc885f977,0xc7fcb094,0xb5e1d2b3,0xdf96c71a,0x61ee7995,
  144919. 0x3464499e,0xb8c8daab,0x5f607932,0xdb425ddd,0xb1243587,0x70251ca1,
  144920. 0x9fc74340,0x26d7d3be,0xc902ac89,0x8c179310,0x4559a74f,0x72522c15,
  144921. 0xc3734afc,0x86001e27 },
  144922. { 0xe7693947,0x13b00ba5,0x012c062b,0x6478641e,0xe85490a8,0xe1a438e0,
  144923. 0xd9574d5e,0x5173dbbf,0x9bd3ba61,0x9532eb8c,0x5f3ea075,0x1f41bcb8,
  144924. 0x8cbb92b9,0xac1cc247,0x1ef901b4,0x0f34648e,0xd2b3b2ee,0xdd929d1e,
  144925. 0xc3d75bfc,0x470f1eab,0x139cf4d2,0x5cdbc6f7,0xf0424953,0xcd86454d,
  144926. 0x47fcb383,0x1e079812,0x17df930c,0xb9f209b4,0x114ebc00,0x4225fc31,
  144927. 0x347946c1,0x020591cb } },
  144928. /* 54 */
  144929. { { 0x275e0af4,0xe3003721,0xe78a4a4b,0x721141ef,0xd1757485,0x666cfcf6,
  144930. 0x168e659e,0x5fa1d737,0x0e2842ee,0x263e3e54,0x948bd5f6,0xadecc3d4,
  144931. 0x246b104a,0x019de03d,0xf343d818,0xf8a9e903,0x5b0c0d31,0xcb57ba4a,
  144932. 0x51e2765f,0x8246c506,0x6519bf67,0x80c5751f,0xf2119a01,0x5f05c200,
  144933. 0x7821d4f4,0x7e6487b8,0x261c3a06,0x262f94aa,0x72146052,0x56cfe489,
  144934. 0xa1df05ef,0x5119985f },
  144935. { 0xb18586c0,0x5819497d,0xc6eeaa62,0x004415d6,0x97cda28b,0x7c6a46b6,
  144936. 0x7c194594,0x9a149b28,0x4ed3a506,0xb56369fa,0x43c94cb4,0x7092aa66,
  144937. 0xa9e9eee2,0x55bce73a,0x77893509,0x34bb2870,0x06eb5326,0x8af95fb0,
  144938. 0x9638f485,0x87cd0323,0x5ba75bf8,0x29376268,0x9d42d581,0xf32d6f3d,
  144939. 0x65c6d64d,0xa4cad574,0xb2cded41,0x985f50fb,0x9006a067,0xcf34ce0e,
  144940. 0x58a57f9a,0x59eaf265 } },
  144941. /* 55 */
  144942. { { 0x6ec3876f,0x7b407efb,0xf0f48648,0x780c6123,0xbf893039,0x2abb56ff,
  144943. 0x45a91ab0,0x9592eaa0,0x78811b82,0xce5b84d7,0x1f9f3fc9,0x86a71a34,
  144944. 0xf0e7e13b,0xc17fdd86,0x655a0880,0x88ed8297,0x81d5e666,0x75d6dc74,
  144945. 0x1d171797,0xeffc9df6,0xe3f79e1f,0x36ad4c8d,0x2046192e,0xdb15317d,
  144946. 0x274fda62,0x78c9fa7a,0x82dd9914,0x04ec924f,0x3a64971c,0x059d1e38,
  144947. 0x2620bbfb,0x3b4450ea },
  144948. { 0xc776dcdb,0x3db7a955,0x81c8ba47,0x35c4a57c,0x505760fb,0xae285003,
  144949. 0xb3aec353,0xe3e80691,0x47117be5,0x380335be,0x056ccf61,0xe1c47e3a,
  144950. 0x33977916,0x253cfdeb,0xf5cb7ee1,0x3decdfba,0x7cf4b704,0xf3c9794f,
  144951. 0x9ff81462,0x2401680c,0xbe3daa9f,0x4e440e11,0x69f91d8a,0xc5d04377,
  144952. 0xcb5e9c5d,0x4106c7a8,0x33b7d24d,0x191909a1,0x3764b4a2,0xe893c838,
  144953. 0xc429b614,0x4a7fe30c } },
  144954. /* 56 */
  144955. { { 0x2455c7c5,0xe78f3a70,0x70157754,0x5b7636e8,0x7623262c,0xf32c4524,
  144956. 0x1bc780c7,0x2c98b11e,0x915ed877,0xd48eaeac,0x199265f4,0xbb04d3c0,
  144957. 0xcfa5200f,0x6b52b19b,0x93ea3fe8,0xc46a0981,0xba758059,0xd82c733d,
  144958. 0x1896aacc,0xd324bbd6,0xce8ecd51,0xac09a2fc,0x02fc44b3,0x529918fd,
  144959. 0xaaa1784b,0xf0c45e4a,0xfe22085c,0x35626340,0xc50c7d61,0x53cbb676,
  144960. 0x65126b23,0x83fa1ea3 },
  144961. { 0x10ccc646,0x60ac86da,0x7b0451e9,0x2ce0637f,0x8a088610,0xbbbcf630,
  144962. 0x20349982,0x23c19019,0xfc0bcda0,0x707fc39c,0x1bd4fd7d,0x7f4d1f15,
  144963. 0x44713bbb,0xd6a64e74,0xc5ac9e60,0x57bdc676,0x37b61169,0x456c5303,
  144964. 0xdcf40a1d,0xd3451396,0x4997d2c7,0xf3edec25,0xc2c4a739,0x534ae9a4,
  144965. 0x6a6ad2e2,0x1401397e,0x23e95f81,0x20769d4d,0xde98fabf,0xcee007c6,
  144966. 0x931c51e0,0x61409779 } },
  144967. /* 57 */
  144968. { { 0x15156623,0x3ddb32db,0xab7a67c2,0x68137fbc,0x6f19e3c2,0x26011f50,
  144969. 0x89924c61,0x34218b02,0xc6804c1c,0x492a0b0f,0xafaae6a7,0xd65be706,
  144970. 0x0d01be61,0x3b13d23e,0xf87f4c69,0x44545b47,0x04dc1aa3,0xd42236e2,
  144971. 0x3c5161ec,0x6135261d,0xbd88bc07,0x1eb46a63,0x1599d720,0x78c6d836,
  144972. 0x69baf0f3,0xf6955fe1,0x17072820,0x467eebd6,0x3e3a340a,0x2f1b8a2a,
  144973. 0x2d0b5f88,0x636dac76 },
  144974. { 0xb4c80af3,0x94280db9,0x4e3892ab,0x9a189cd1,0xd1477ddc,0x26e702e0,
  144975. 0x68f9f14f,0xe91aee38,0x80baa0b2,0x2864f63a,0x8b714a29,0xacd81f73,
  144976. 0xc5fe7cb6,0x30e1b870,0xb10837fd,0x883ea1c3,0x6b20489f,0x2da27953,
  144977. 0x58a2da5f,0x3aeb2a68,0x03a8fa14,0xe2330bf2,0xdc70b1c4,0xb5c488b5,
  144978. 0x299678f4,0x0a78c4d9,0x25df675c,0x233bd098,0x7b67d368,0x37b5c076,
  144979. 0x4d0bef3f,0x2f6dbdfe } },
  144980. /* 58 */
  144981. { { 0x2e4da7c7,0x2f8472fd,0xae677932,0x708cfc91,0x3dc268e2,0x364af08a,
  144982. 0x799a2424,0x0f10dfe0,0x71d58bff,0xef912d58,0x988962e6,0x6bf35dfc,
  144983. 0x5f47ea0a,0x28b96fa9,0xaad308c1,0x734a79ea,0x9f437bba,0x95730337,
  144984. 0x6cf54f75,0x002cbd8e,0xe7632eec,0x47606dcf,0x53193104,0x404b5ecb,
  144985. 0x0acf729d,0x0ae0897c,0x3bddf1de,0x89628b86,0xf87d7448,0xeced154e,
  144986. 0x458d5d4e,0x5cb6e197 },
  144987. { 0x008c75ed,0x98cef197,0xf6eeaaf8,0x7cf49d3e,0x1875e96d,0x1d6f9e02,
  144988. 0xdd9b0d8a,0xfcec2cfe,0xb9576daa,0x38a61cfe,0x36a7dbb8,0x10003f39,
  144989. 0x23b814f4,0xb37c3868,0xb80e3153,0x9fb66dcb,0x059847a8,0x9e7e2eba,
  144990. 0x35a72770,0xa4ec63fd,0xfc9e0ed0,0x311f3d91,0xd515baa4,0x3c1dc094,
  144991. 0xa08cd4e3,0x75a06ebc,0x2ed5eeaa,0xab617238,0xe1f52c1f,0x2e82bbb0,
  144992. 0x5175d6e5,0x2149d630 } },
  144993. /* 59 */
  144994. { { 0x5f9311f6,0xee1a8e6f,0xbabc1f85,0xc97e3c9f,0xb494209a,0x4fa7c52e,
  144995. 0x19774fe1,0x04c2f51c,0x8555844f,0x5cefd122,0xb5873ab3,0xb53862a3,
  144996. 0xcbed19fc,0x768efdd6,0xee58469a,0xcdc12479,0x3d80c09c,0x11237e31,
  144997. 0xc044c28c,0xdd74a290,0xbd47e287,0x9ee6517a,0xad0ffeef,0xc2421228,
  144998. 0x818d281f,0x4273088f,0x43ec0de1,0xebc744bc,0xb415bd73,0x5b26eccf,
  144999. 0xcb07c26c,0x14e2f350 },
  145000. { 0x4216946b,0x548d2a10,0x7a4bd92d,0x6e801f07,0x43695160,0x5996d0a3,
  145001. 0x63a197c9,0x0f1b5c2f,0x061f77c9,0x79da3c4f,0x93ff7b22,0x1c1cd634,
  145002. 0xa234123f,0x5e61b650,0xf284033c,0x826b34c5,0xc2f34214,0x718b90e8,
  145003. 0xae806ec5,0xa5f35620,0xe324a9b4,0xa2fae345,0x8b53cb51,0x8c0bb95e,
  145004. 0xf9965778,0xc94f6ac2,0x6b9def32,0x07ec607d,0xd0ed8f27,0x63bf1dba,
  145005. 0xdcb61e4f,0x58537e02 } },
  145006. /* 60 */
  145007. { { 0x64f80ba2,0x1f64b064,0x0559a45b,0xe8e055e7,0xf1f4b634,0xc3262b34,
  145008. 0xde8c8482,0xef4f7d5f,0xc30c780a,0x9d55dea0,0xcfa1e693,0x1740afb9,
  145009. 0x7460c34b,0x2cfe6a66,0x1187c1ee,0xf6695941,0x5f974d94,0x1382f277,
  145010. 0x004549eb,0x1ca0ace4,0xbabded02,0xf8244b3f,0x4e3653ea,0xc36f4d06,
  145011. 0xc55c5f83,0xeab9f0dc,0xacebce90,0xd93b9cef,0x19061425,0x16658e72,
  145012. 0x82d7970d,0x4857835f },
  145013. { 0xd2576210,0xdcd525bc,0xd51b5443,0x9f378aa7,0x1bd83994,0xfe97bf17,
  145014. 0xf38ac621,0x930d0f63,0x818408cc,0xaf8f2c17,0x260f53f6,0x2692c87e,
  145015. 0xdb0a75e4,0x0ee45407,0xffdb1b37,0x0ec47ae5,0x7aa6a44b,0x769129dc,
  145016. 0x2e40b75d,0xb6f932b2,0x95ef3b77,0xe06764d0,0x68bc63e8,0x28fd47f5,
  145017. 0x9c0014c0,0xd1810494,0xd7995d8e,0x90e2d3fd,0x6c2a85af,0xeb39a05d,
  145018. 0xa21f3128,0x6c0277bd } },
  145019. /* 61 */
  145020. { { 0xb509e7ef,0xe41b7086,0x3d7f9f91,0x8842ec7b,0x5526b88b,0xcd285f94,
  145021. 0x051dd0ab,0x6e44e064,0x774f1ceb,0x90198c10,0x123e661b,0x6ecabe98,
  145022. 0x32f647d9,0x44811136,0x26c52aee,0x1dd82b45,0x939dc9d5,0xd650907f,
  145023. 0xfcd455bf,0xbd5eeef2,0x8d2e5d7c,0x7815a4dd,0x88bc9f2a,0x5ad4ec92,
  145024. 0x57a3b322,0xc6f10d0b,0x20b9cbdb,0xe8d0c1e7,0x9b774ee8,0x5a0b071a,
  145025. 0xf22fcf8f,0x3067bc9a },
  145026. { 0xb7ca9326,0xe0e589f2,0xb1224f63,0x17a106fd,0x747a57bd,0xb2354521,
  145027. 0x62b0882e,0x2614982d,0x4391ffcf,0x7f3af544,0xa84e440d,0x1aaa337b,
  145028. 0x941bb071,0x28ea37b0,0x2e4a7f54,0xa957dcb4,0x1a6ad5fb,0xe7ab662c,
  145029. 0xf7c36a20,0xd135e381,0x9baa0b6b,0x42e7980c,0x94e4671f,0x4237030c,
  145030. 0x8b0922e3,0x24cc63ff,0x445a589f,0xd10d5279,0xa870ff6c,0xbb99d316,
  145031. 0xa996c195,0x390c83ca } },
  145032. /* 62 */
  145033. { { 0xffc4a73f,0x50d3fa82,0x3bd53303,0x2665d635,0x264bb77d,0x80a06f8a,
  145034. 0x22d73d84,0x81c04a6e,0x0323b8aa,0x2409cff5,0x8c4c4d5a,0x31dce217,
  145035. 0x0c0f9c19,0x374aa80e,0x00186bb8,0x0b25a387,0xaaf1487f,0xd0b77a10,
  145036. 0xab498de1,0x15f39ad5,0x1aa0c116,0x92e32da6,0x96e25ce8,0x228e3dbd,
  145037. 0x5e8646d1,0xb57c88dc,0x267b1c68,0x672b1164,0x600bdec5,0x5d0d807f,
  145038. 0x223e573a,0x3ea4007d },
  145039. { 0xa595d0a3,0xd76debd0,0xaff0b3b4,0xa6bd76cb,0x9b1bdb97,0xbf2c154f,
  145040. 0x4c714c71,0x62b19ab4,0x221af663,0xc9bf33b9,0x8c941ef6,0x23d87c49,
  145041. 0xd79f0f6d,0x255804c3,0x2a7acbc1,0x6f1a1005,0x550528af,0x5dab79d9,
  145042. 0xc8d16213,0xfd77a6f0,0xde5e1029,0x40508b6d,0xf95da12b,0xd95ac0f2,
  145043. 0x758a8ba1,0x8860af71,0x7160c8fb,0x0b194c83,0xce004d34,0xa40e6c80,
  145044. 0x6b14aaa0,0x09f82a17 } },
  145045. /* 63 */
  145046. { { 0xc21366dc,0x60abe588,0xaf75daf9,0x729c0a4f,0xacb93ed4,0x70501fd9,
  145047. 0x87a16d70,0xb97e744e,0x98e7361b,0xa42e0a7a,0x28b54cf3,0x1acdaff2,
  145048. 0xb7bd9078,0xf087ccbb,0x663250e7,0xda6f3983,0xbaf07c09,0x66d693ee,
  145049. 0x8cbaf157,0x79baf4c3,0xdfca99d0,0x5a984e07,0xf26d8dab,0xab4d3247,
  145050. 0x7eba36f9,0x4d0be701,0x0e8dd216,0x37bb9e65,0x531c4f03,0x72aa4e24,
  145051. 0xb753d85a,0x77d1e984 },
  145052. { 0xd8e62367,0xd9373239,0xb9820cf1,0x3361848b,0x5a9c97c4,0x00c7e344,
  145053. 0x14f960fc,0x9a0ec9ae,0x740474b5,0xcf41f0cf,0xece065d5,0xa5eede8f,
  145054. 0x9e808610,0xb1de5a4e,0xae0cf75d,0x17c44ae4,0x6b148d0b,0x2fa56323,
  145055. 0xd29ff2dc,0x64fa740f,0x88cb212e,0xc605eb8a,0x6a863016,0xf2c771ad,
  145056. 0x607b4c17,0x6d6112e7,0x40d49785,0xfe90ec07,0xe256e0e5,0x599be18b,
  145057. 0xca54adb0,0x4e6eabec } },
  145058. /* 64 */
  145059. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  145060. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  145061. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  145062. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  145063. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  145064. 0x04ecf056,0x325d2796 },
  145065. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  145066. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  145067. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  145068. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  145069. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  145070. 0xe32a79d3,0x19d48546 } },
  145071. /* 65 */
  145072. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  145073. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  145074. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  145075. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  145076. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  145077. 0xb4e453b0,0x1b3ace6c },
  145078. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  145079. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  145080. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  145081. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  145082. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  145083. 0x192f0a14,0x538ec33e } },
  145084. /* 66 */
  145085. { { 0xa19b56cf,0x193496fe,0x7bb99acd,0x663d77f4,0x57d0a881,0x8f04afa8,
  145086. 0x082835fd,0xcced3da2,0x5d82cec7,0x7e21faed,0xf8009c85,0x6e175b99,
  145087. 0x2d05a307,0xd9c6e31b,0x81487d82,0x96948d4a,0xd46f6655,0x86ebd3f2,
  145088. 0x773ccc49,0x86851aa8,0x8b1640a6,0x3e220f22,0x41a20b75,0x9f06e3a8,
  145089. 0x90ac0a6f,0x2cfffe5e,0x8ebeb3fb,0xf5a9b1da,0x6e08e2c9,0x2587d997,
  145090. 0x03e9f401,0x6fd60298 },
  145091. { 0x8eb7516a,0x54709f8d,0xbdc598ab,0x83058a74,0x87e801ce,0xd234dd98,
  145092. 0xd17b8a96,0xfd0f9d90,0x6e90f6ab,0xaa1e549f,0x5a7ed55b,0x2496ff80,
  145093. 0x6c254c19,0x0d9f657a,0xb8962575,0x3cdea49c,0x2dff27de,0xb685a3f0,
  145094. 0xdb8bc04b,0x3c50e7fd,0x987236b0,0x904ff0ff,0xbb0d5055,0x494298fd,
  145095. 0xe14be8d0,0x34b3386d,0x7c3d30d6,0x7ad34e9c,0xe159fdd9,0x1f2b32bd,
  145096. 0xc761e5c0,0x84cfa23c } },
  145097. /* 67 */
  145098. { { 0x8b99b964,0x13bc11eb,0x58e2fc47,0x8e280c0a,0xd4c9a54b,0x870fbc49,
  145099. 0xbf6e20fa,0x37a334a2,0xd7c88cfa,0xee583d0d,0xef4af1da,0x05e029a8,
  145100. 0x0c2ef8a6,0x6d55e234,0x209e9b62,0x61b6fdfe,0xbb8e080f,0x3b1dad26,
  145101. 0x9392fc1a,0x5adbc162,0x0aae3f4e,0x02ac0fe6,0xc2bf4d5b,0x8d99801a,
  145102. 0xc282fed2,0x2333f93f,0xb52db33f,0x16dcb10c,0xc55752e7,0x09f90f84,
  145103. 0xc84a0d8e,0x287d4c51 },
  145104. { 0x0e9867da,0x5fa58201,0x1a874cda,0x614589b3,0xfbdee22e,0x005e27c5,
  145105. 0xe612bda8,0xe357fef5,0x2d3635f9,0x4e0dbedf,0x6f125a86,0x62be70e4,
  145106. 0x0d94a2e5,0xa09b9884,0x28b5e5d1,0x7eb99a15,0x751028b5,0x21b9416e,
  145107. 0xe06d2cc4,0x1b137fd7,0xfea09845,0x6fa1f517,0xffcecbd7,0x3ba1e966,
  145108. 0x832f453e,0xd4c89a4a,0xeca68fa1,0x07b1e2af,0x4bd395a3,0xd0fb4453,
  145109. 0xd8ef9e13,0x0132a3dc } },
  145110. /* 68 */
  145111. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  145112. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  145113. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  145114. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  145115. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  145116. 0xb6f8aa25,0x13cbee76 },
  145117. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  145118. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  145119. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  145120. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  145121. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  145122. 0xe02e8967,0x4e0a1ada } },
  145123. /* 69 */
  145124. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  145125. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  145126. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  145127. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  145128. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  145129. 0x9f99c999,0x733e30d9 },
  145130. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  145131. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  145132. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  145133. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  145134. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  145135. 0xb79a5c0c,0x56facb39 } },
  145136. /* 70 */
  145137. { { 0xa3018bfa,0x019165a2,0x9ffad984,0x100c6b24,0x55341a9b,0xbbf1b1f6,
  145138. 0x25dc4cc9,0xe6bd1d97,0x2bfffe60,0x52850ed5,0x7e5509ab,0x24e992cc,
  145139. 0x4ceb59f1,0xff6c502e,0x1aa7d148,0x2f0b3573,0xe7e3aa46,0xe90c1ddd,
  145140. 0xd1142880,0xbaec9f45,0x65be5dd5,0x475cfd26,0x1febce13,0x83abb14e,
  145141. 0x80942d30,0x6aba4829,0x297e82c8,0x1e1b235d,0x50d8218d,0xb771cdbe,
  145142. 0xd94d6cbb,0x88599266 },
  145143. { 0x155ccaf2,0x08847290,0x7c5b773e,0x8679ebc7,0xb2dd08ed,0xa88b2dd1,
  145144. 0x87d475db,0x960a180e,0x6694d02a,0x80fdb6b7,0x3f3f9e96,0x3e8758c9,
  145145. 0x4ad836c4,0xbda3f6fa,0x32fb387d,0x9400c581,0x2550200f,0x25a78542,
  145146. 0x776ecf18,0x2a97c351,0x566db59a,0x03ebf46e,0x26545eda,0x4743a280,
  145147. 0xcf74ab44,0xed169d84,0x88cb3f69,0xbaab931d,0xd8257196,0x70ae932c,
  145148. 0xa0c09719,0x797224a6 } },
  145149. /* 71 */
  145150. { { 0x441f3567,0x632923f8,0x2e24bf1d,0xc11c3168,0xb7671fff,0x4b97726b,
  145151. 0x7a5e1a22,0x601746a7,0x3addb417,0x53dddea0,0x7f59b846,0x57867a3c,
  145152. 0x56cd7ff7,0xb012a987,0xf19ba9a8,0x1bd5fec9,0xf8306748,0x750379a2,
  145153. 0xab8c05d1,0x7763445d,0x7903f42a,0x5d7f441b,0xa903e46d,0xc011674d,
  145154. 0xadd126c1,0x1b1d3c4d,0x61455b40,0xa2752aac,0x555c356e,0x4da42a68,
  145155. 0xd820852c,0x3ff09c15 },
  145156. { 0xf9cb7784,0x4c0a1bce,0x2422f305,0xaec539bc,0x0c414aa7,0x5f40f9fd,
  145157. 0xffd42bc4,0xd3aa316c,0x2f358e15,0x42f5a4c3,0xd6e27682,0x00bdcd9e,
  145158. 0xf8a5ecee,0x069f789f,0x05e14f5d,0x8078018e,0x8b40c741,0x2bb3e493,
  145159. 0x7917f72d,0x5dbc8c1d,0xcc57150c,0xe0eea664,0xc3fa8920,0xa25ecc5a,
  145160. 0x1c797164,0x3c21b0f5,0x634ad16b,0x8f09a2f2,0x58391d9a,0x8e730fc5,
  145161. 0x4fdfae4c,0x47ef1805 } },
  145162. /* 72 */
  145163. { { 0x3da285e4,0x9965f3d1,0x3a01e3f4,0xba7d4dba,0x61214ad0,0x4738413a,
  145164. 0x22397549,0xd3b7d535,0x5a730b92,0xa53dbdcf,0x332d165d,0x3130d92b,
  145165. 0x82f97ef4,0x44a28541,0x44dce1b6,0xbf62221c,0x7e2a0ec9,0xbba13858,
  145166. 0xcbfad998,0x33f32c8d,0xb5fed44b,0x409e5f3f,0xc66217bb,0x5c328c65,
  145167. 0xfcdf71a9,0xb00db69f,0xb8920788,0xa23c2a21,0x3ae6464b,0xf8ab28e6,
  145168. 0xb8de0861,0x1a6b6e9c },
  145169. { 0x06af77aa,0xaf6ec2b6,0xa887f065,0x2e60f5cd,0x9f498c56,0x87d21400,
  145170. 0xfcbaaf4b,0xdb595b59,0x271ab855,0x0fb592a1,0xd4349b0c,0xa0ce10e5,
  145171. 0x887d8c9c,0x9d6187d8,0x154bd6db,0x03ee95f9,0x5d06c999,0x8fe53213,
  145172. 0xfb6a64d0,0xf4a7bc30,0x66a4cb60,0x3d22af0d,0x5d37367c,0x16952cef,
  145173. 0x997d8e55,0x6f0ea734,0x731732d0,0xb447c70f,0xa9cb3942,0x00ab3034,
  145174. 0x28510fd0,0x79dd0180 } },
  145175. /* 73 */
  145176. { { 0x3ac7424e,0x04e0033a,0x60fda4d0,0xdb06b688,0xbcb772fb,0x236a9766,
  145177. 0xf297cda4,0x294a8e2b,0xdb013c6e,0x4b0aab85,0x8723a3ad,0x3d2aec98,
  145178. 0x13c84a6b,0x0cae32cd,0x70ec169e,0x21888f5e,0x42a88262,0x739633bd,
  145179. 0x7b60d9b8,0x68ac792e,0x10769fe1,0x89f2b722,0xd24bed34,0x8f3fcfe6,
  145180. 0xa3eb24aa,0xd35efb88,0x484c706b,0xddecfa3f,0x929ece0d,0x7cc119a9,
  145181. 0x8d405436,0x87e5ad45 },
  145182. { 0x7d1000a7,0xba99aa9d,0xae823833,0x8b94affc,0xdfb83dc5,0xc8229628,
  145183. 0x845a418d,0x2f59fe11,0x5d417054,0xa8b970f8,0x72b71581,0x8918c265,
  145184. 0xc0d1dd17,0xe4ef477d,0x3afad7c0,0xb50b4cf3,0x01870a5b,0x21baea79,
  145185. 0xbb3a2868,0xc77087f9,0x124a59cd,0x7857531e,0x57f43239,0xed74c26f,
  145186. 0x0164c94a,0xd5f5ae25,0xf094bf74,0x6608b7e2,0xfdceea32,0xf4cdb5ba,
  145187. 0x990cc045,0x0b712519 } },
  145188. /* 74 */
  145189. { { 0x88d5c64d,0x5a290ca1,0xa7492534,0x0596d749,0x2a00e925,0xa04b0d3d,
  145190. 0xcaf7b66b,0x082cd02c,0xecdded83,0x912b50c2,0xff31646e,0x813ce9de,
  145191. 0xc75fff95,0x62ae70c7,0x7e2a4615,0x6f6852e0,0x03804fd1,0x320fd7d0,
  145192. 0x8218e8d9,0xb1a2a4dd,0xafc645d7,0x4918a6fb,0xe8d9fdbe,0xfb080fa1,
  145193. 0x4470b6ee,0x33d4d08a,0x6d974ef7,0xd2ba2077,0x69dae5d2,0x8ecb95a7,
  145194. 0x7d69596d,0x7a3f423a },
  145195. { 0x9a929387,0x362d2ca6,0xcb1c1fff,0xabdb7581,0x7e51b6cb,0xd892ec9f,
  145196. 0x3a4e131f,0xee8d8632,0x5bd87561,0x4680e3f1,0xd4e7e732,0xe3a597e1,
  145197. 0x5581fefe,0x3cc72b7c,0xca8cae0b,0xf3e77f8a,0x5e2fd4af,0xfcc7d7dc,
  145198. 0x21355b79,0xdd3a4552,0xa2c07177,0x546b24f2,0x0689621f,0x415b532d,
  145199. 0x3f78163e,0x2be9af51,0x33d7ed21,0x27d63b9b,0x96802943,0xab019ef2,
  145200. 0x1623faf4,0x2da5fc55 } },
  145201. /* 75 */
  145202. { { 0xc8a5c600,0x62429cf3,0x3fe33e7c,0xa7a80c22,0x0a57ddcb,0x9ffda740,
  145203. 0x925b0c74,0xd1ae156d,0x6b100eb0,0x097a43f9,0xef943c81,0x169e945c,
  145204. 0x1128cf24,0xa1f734e5,0x419f0133,0x04387c4a,0x01044024,0xc007868b,
  145205. 0x90359cf2,0xe5416abf,0x478d54e3,0xf9c76fee,0x42a2173e,0x66219da6,
  145206. 0x9fe30141,0x61e03156,0x93ef247e,0xa0ff5ce3,0x072b6592,0x811792ba,
  145207. 0x70c854d3,0x855f0219 },
  145208. { 0x847314c4,0x61fbfb6c,0xeb45b96a,0x97906155,0x6ba2afac,0x7102e146,
  145209. 0xab949781,0xed51f975,0xc110c4fe,0x9d2f5b17,0xaff57667,0x7ac8ce70,
  145210. 0x6eb244e7,0xe7366a21,0x551c65c7,0xdd1bbcec,0xe1a859de,0xb525060a,
  145211. 0x8ba7d2e7,0x7a048174,0xab8ea8c4,0xe1a2c541,0x6fdff078,0x6e7824c3,
  145212. 0x14874b04,0x79b49fc7,0x06b1f733,0x22ae337f,0x6f8fe6cf,0x1c352192,
  145213. 0x525d0797,0x292236cf } },
  145214. /* 76 */
  145215. { { 0x7d8b29dc,0xcdb8d80a,0x08ea648a,0xd17a2024,0xae92be91,0x7db12c5e,
  145216. 0xfda72fbc,0x1f347d18,0x9e760c6f,0x11374b40,0xd8e38d91,0x7361e8f1,
  145217. 0x739ac1f4,0x7714be9d,0xb4df5c4e,0xc1f9701c,0x6f72cae1,0xd9138ed8,
  145218. 0x6ad180c4,0x1c7fe1f7,0x9e2dbf9c,0xf8c185be,0x7c70c44d,0x835db269,
  145219. 0xb0d15b5f,0xf997cfea,0x61e6545e,0x5101445a,0x25184e5e,0x16b06884,
  145220. 0x7521e7aa,0x7cfac359 },
  145221. { 0x3c0bc53a,0x81182167,0x7e751367,0x84b5ede3,0xa3657a18,0x3ca255fd,
  145222. 0xba1fdd98,0x096abbf4,0xc5da77d8,0x9ce8369f,0xaab342c5,0xf27b9ae7,
  145223. 0x972059f1,0x06c91bd6,0x914ecfe9,0xee0dab30,0x93f53f12,0xbb647fbb,
  145224. 0xffa57e0e,0x30c38a7a,0x9f2ad607,0x517d06ef,0xbb99dcc9,0x49728d87,
  145225. 0x446080a1,0xb0034af1,0x12b9c17d,0xcc810c3f,0x772a22a0,0x7225f14f,
  145226. 0x1ddf82bd,0x6ce3dc7f } },
  145227. /* 77 */
  145228. { { 0xa4397830,0xc07cd835,0xf4733306,0x4dd9290c,0x29989e8c,0xdd35d3a8,
  145229. 0x563d8152,0x79902559,0xe87de61b,0xf278d911,0x1024e35c,0x9c7340c7,
  145230. 0x4a0d0e59,0x2d444461,0xf32626a1,0x63e7608f,0xc4c9baa9,0x627a37e9,
  145231. 0x76fffd25,0x0c56dc51,0xcef2a1cd,0xcb6defc8,0xefc559d9,0xcbcc0d56,
  145232. 0x041cb692,0xe45f3fc5,0xe5161e09,0xcd05c239,0x5c3b559c,0x2a731ee9,
  145233. 0xa3d0a16d,0x85151122 },
  145234. { 0x86ff19e2,0x782d0335,0x1da28603,0xc2c60daa,0x557c7eed,0xb2e78cfe,
  145235. 0x1bc4e8b0,0xa8f6f984,0x3df35c67,0xcc1f9b4b,0x4764462a,0x96e13603,
  145236. 0x7c7ae0b0,0xbf910b97,0x51435956,0x27c7f305,0xf631eae5,0xc14db15c,
  145237. 0x7e69b34c,0xa51d6142,0x5fc12ff2,0xdec82851,0xfb887162,0xfcceae13,
  145238. 0xde1488bd,0xda332ac1,0x2ee3e74c,0xa20374e2,0xf0ae069c,0x597ea1a1,
  145239. 0x77bdec04,0x8b1159f2 } },
  145240. /* 78 */
  145241. { { 0x2f961d30,0x4af71a44,0x7ac7248f,0xbdf968a8,0xb1a906cd,0xd32df87c,
  145242. 0x04abf925,0x00c10e26,0xb9f04d4c,0xb8711759,0x939705da,0x00d54e60,
  145243. 0xc9f80849,0xf7587433,0x6a7a2375,0x2e9abade,0x94ac17ac,0x5676d478,
  145244. 0xc202d99c,0x4ca0525b,0xabfae73d,0x95b8bcad,0x3405991b,0x2371ed38,
  145245. 0x458a99c3,0x2b69e47a,0x2b78c866,0x7cac0b18,0xe0232c7c,0x6ceaa79b,
  145246. 0x588f7459,0x0bd86433 },
  145247. { 0x7e734189,0xdea1a8b4,0xcfe5fa17,0x52c5ac88,0x11437664,0x444a4d4e,
  145248. 0xaf9e9750,0xc2522308,0xd30c6b3b,0x78b1d0c3,0x4c6df477,0x2edae5f0,
  145249. 0x2ee88dd7,0x53131d9a,0xacc93e34,0xc4e380ee,0xa8db0e8e,0xd499b1ac,
  145250. 0x7f5d49d7,0x77348c16,0x1556ccd7,0xc9663257,0x2611d13d,0x65ce0e8c,
  145251. 0xb5a2fdcc,0x2c95fe66,0x8658faa1,0x26698832,0x31c32c98,0xda87d1f4,
  145252. 0xfcd91907,0x46650598 } },
  145253. /* 79 */
  145254. { { 0x6b4a5efa,0x4c6c13cc,0x1d07b265,0xc481989b,0x8bdc69c0,0x10b966ce,
  145255. 0x2c2531d4,0xf54cfaa2,0xcad0a100,0xcb5f1808,0xee5da449,0xbeb52538,
  145256. 0xbedd83cc,0xa6240085,0xd6255c78,0xe792dacf,0x2062058f,0x88371906,
  145257. 0xed1658c1,0x96615e83,0x7d28d542,0x4b549b27,0x83b75df3,0xeaf127db,
  145258. 0x17fbb942,0x4f60df6d,0xf6f7c930,0xd08631db,0x6018789f,0x17c38f98,
  145259. 0xb9a9280c,0x0c43574a },
  145260. { 0x1d20cad0,0x76eb324c,0x8c61108a,0x90decb09,0x6f06d36d,0xa6e9d39c,
  145261. 0xbc0da197,0x6cd978ba,0x507ac5ce,0x5948b1c0,0xc5497eb5,0x2bd47164,
  145262. 0x4d5914e3,0x2a9c4c0f,0xa759f03c,0x772c5046,0x69ac847e,0xe7d7328a,
  145263. 0x3048b330,0xa8d57d0c,0x40f7bace,0xe60034e0,0xa85f1790,0x823d9193,
  145264. 0x5c859736,0xa6e9b66c,0x679e1022,0x22ca2c7a,0x09023fa4,0x00e7a19c,
  145265. 0x2726d5b9,0x324999f1 } },
  145266. /* 80 */
  145267. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  145268. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  145269. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  145270. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  145271. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  145272. 0xf18c2b91,0x57ea2b4b },
  145273. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  145274. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  145275. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  145276. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  145277. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  145278. 0xea7935c9,0x60480b46 } },
  145279. /* 81 */
  145280. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  145281. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  145282. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  145283. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  145284. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  145285. 0x9a8f88cc,0x0774a0d3 },
  145286. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  145287. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  145288. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  145289. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  145290. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  145291. 0x2432014b,0x08151954 } },
  145292. /* 82 */
  145293. { { 0xfb7b2108,0xf9236d89,0xad75f9aa,0x3ecc83cc,0xb4e1da11,0xf7c72b15,
  145294. 0x0315c362,0x552aeaef,0xf272fe3f,0x11e140ed,0x87843ee8,0x99d79bf6,
  145295. 0x1d9bb25b,0xce6b54fd,0x5b1bad74,0xb20b0e21,0x5b84c90d,0x54a0214f,
  145296. 0xfca6cec9,0x459bbf52,0x9e4df76f,0xe363c48d,0xd64cf17e,0x3045f84e,
  145297. 0xf62ada48,0x8402a167,0x6a74ca01,0x2c9e1bf3,0xf691c42d,0xe8cf9d41,
  145298. 0xc2c4b874,0x5abf2178 },
  145299. { 0xf3b3bccd,0x4777966b,0xbe3e0caa,0x0047e0f0,0x8c7d5043,0xcb8383b3,
  145300. 0x946fd5fc,0xe77e3baf,0xe9ec0e87,0x79baa785,0xc8a18d25,0xd83c557c,
  145301. 0x25befcfe,0x9b96e5af,0x98c71b61,0x4f05d15e,0x77e62da1,0x081f991a,
  145302. 0xcbaa3821,0x1c6ec781,0xe54d9bfb,0x7522f65d,0x44ed1430,0xf5d05573,
  145303. 0x95cafdda,0x3035b31f,0x6378f5bf,0x47e67f43,0x5270b9d9,0x029f7cad,
  145304. 0x4d916a48,0x15ad1587 } },
  145305. /* 83 */
  145306. { { 0xaa588ae4,0x00de2ece,0xa371a232,0x552ebc58,0x71230444,0xd00ea934,
  145307. 0xe4b1832d,0xafbfa67d,0xb689e843,0x29216341,0x61f4e2e8,0x1f96bbbd,
  145308. 0x04c29dc5,0x95420684,0x42317fd1,0xc7fe3827,0x63483162,0xe0a0aec6,
  145309. 0x0700184f,0xfc2b94d1,0xfe1fbd85,0x07219973,0xfb074352,0x648b6ab1,
  145310. 0xc46e5392,0x23bbdaad,0x00fa56ff,0x0db8dd1f,0x866725f6,0x104815eb,
  145311. 0x52e81963,0x3f9c4cca },
  145312. { 0x32ce637e,0xff36b297,0xf5d25cdd,0x81a15f2d,0x8b02ad97,0x1a1d052d,
  145313. 0xcfbab3e9,0x2e5f3bbc,0x614eeb75,0x60d2cbd7,0xcd5a793a,0xd4491843,
  145314. 0xcdba2144,0x2242cf75,0x88b99766,0xa20705e7,0xec77e132,0x64e12cc0,
  145315. 0xb61a9b05,0xb1c14df6,0x74825b5a,0x8fd97f04,0x3da31223,0x95604821,
  145316. 0x4d30c70d,0xde486727,0x1c12ee69,0xbcab8f15,0x668d893d,0x5dc638b4,
  145317. 0x223f574b,0x6479dad6 } },
  145318. /* 84 */
  145319. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  145320. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  145321. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  145322. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  145323. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  145324. 0xf0860497,0x1fe09f94 },
  145325. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  145326. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  145327. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  145328. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  145329. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  145330. 0xdb62526a,0x4de95786 } },
  145331. /* 85 */
  145332. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  145333. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  145334. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  145335. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  145336. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  145337. 0xe636980c,0x1c94418b },
  145338. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  145339. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  145340. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  145341. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  145342. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  145343. 0xb55235ba,0x611bfbb2 } },
  145344. /* 86 */
  145345. { { 0xf00ad2a1,0xbdbaa55e,0x14a290d7,0x29efa85e,0xe92b1694,0x3b4a4768,
  145346. 0x11ec8130,0x67111bcd,0x88bd27b2,0x0e425702,0xd9a03c06,0xf28cf2a3,
  145347. 0xf318884a,0xbb7c8d2d,0xe3aaeb20,0xe2ea1462,0x43b85d77,0x33535804,
  145348. 0x554ee9bd,0x81ee4482,0xe6aa198f,0xeb2eee9e,0xc26c5944,0x7a5aa804,
  145349. 0x82ab167c,0xa0ef2da5,0x02fe21a5,0x5a2ab476,0x3370298e,0x169cb3b8,
  145350. 0x0eb3aa8d,0x86e6c544 },
  145351. { 0x0b793d9b,0xede03321,0x1ddb5ece,0xf79fade1,0x68930b64,0xf73fda92,
  145352. 0xfe4fd1b2,0x06aad97d,0x92a4dc88,0x073a5b1d,0xbc976d75,0x8af8cbd8,
  145353. 0x63ce26c0,0x60b4abb1,0xdcb1fb06,0x9c8300a9,0xda95b3d3,0x335a594c,
  145354. 0xb37eac87,0x1f97d7d4,0x20eefaab,0xa3d2eba2,0xf3e828c8,0x3258c906,
  145355. 0x85ab7781,0xc832616f,0x8c28b617,0x72597192,0x3233b82d,0xcd7196bc,
  145356. 0x19fa126d,0x83867eb9 } },
  145357. /* 87 */
  145358. { { 0x22474edb,0x774fe73e,0x1a84e1ae,0x2a766394,0x9c6dd6e3,0x270329ad,
  145359. 0x14f8bf5d,0x00c4a415,0xd2267b90,0x3ce2ea37,0x11d24fae,0x12753015,
  145360. 0x263a1b78,0x7c14d854,0x1ae0b206,0x20c8401b,0x081f49fc,0xf32a011b,
  145361. 0x959c6df8,0x1e8123fb,0x800e1d06,0xa328dc7c,0x24259a9a,0x5876a378,
  145362. 0xb7ef6c37,0x23ada8b5,0xa93d4c9f,0x023f6b6e,0xffb6389f,0x89f5414d,
  145363. 0xe628b39e,0x4b26bba2 },
  145364. { 0x5d318454,0xd30b1cb4,0xd7436cb6,0x123b749f,0x568a7461,0x3110c726,
  145365. 0x1c84fd1e,0xc85de123,0x08403d55,0xa5f8d6e6,0x9b1fabf8,0x395b6e13,
  145366. 0x3cfedce0,0xfe6d68c3,0x94b91110,0x1d90381f,0x2dcc6eb7,0xf0a8ea81,
  145367. 0x7e90ca2b,0x59e80413,0xc8a25c5a,0xbeb5fc07,0x5d84663c,0x009c253a,
  145368. 0x910b6a7c,0x00b15073,0x4108f8d5,0x8607da4c,0xcb901e65,0x02c3d9c3,
  145369. 0x2c9615c6,0x4d697bc5 } },
  145370. /* 88 */
  145371. { { 0xefa8fb40,0xe0db1ef0,0x5ba3989c,0x29021c5b,0x809d19df,0xa8d6fb15,
  145372. 0x4c1219e1,0x6b787b73,0x14ef05e2,0x6417e168,0x8f9796e2,0x449342db,
  145373. 0xbf84421b,0x2f878a5e,0xe94a4536,0xe71916d7,0xae119693,0x9818bba3,
  145374. 0x5768804e,0xec674be9,0xf8424f8a,0x0a26074c,0x466ce6ab,0xdbc93b9d,
  145375. 0xc920078b,0xb3f15a98,0x3870f1a3,0x9d10fd0d,0xe4e785a7,0xa61241d9,
  145376. 0xe6c8cd80,0x76ca87a1 },
  145377. { 0xe02e48b7,0x4357fb56,0xcc09e9c6,0xfbd14b13,0x24069cf0,0xdb5f2435,
  145378. 0x2c3b01a9,0xf878165c,0xe6956dad,0xe549e7c4,0xbbd60b68,0xf2fe9538,
  145379. 0x059dc653,0x952f856b,0xb377fe9b,0xd3f60225,0xbfe908c4,0x6a0c7328,
  145380. 0xbc8f5f2d,0xce6aa2d3,0x24425050,0xf7213443,0x3d3b3ce5,0x17e1266a,
  145381. 0xc1677512,0x75b5e43f,0x37fb894a,0x15927062,0x2be3e375,0x15260753,
  145382. 0x6da3b7be,0x27e7f2c6 } },
  145383. /* 89 */
  145384. { { 0xe6a15883,0x638f65ad,0x66afdb33,0xd4a7e68c,0xd3f12de5,0x6207b6ab,
  145385. 0x37b87810,0x1c6ff950,0x64acf6d3,0xc0d44cb2,0xf2be78c2,0x163ac601,
  145386. 0x1636980e,0x1c63cc5a,0x95c9349b,0x3e92cfe8,0x41ec7220,0x7738e0d8,
  145387. 0x2d5fa961,0x6169d764,0xc3e028e9,0x2aa776c1,0xb16d5409,0x93dc5646,
  145388. 0x706df4d9,0xa0b27fb5,0xce9c6b97,0x9e991170,0x53c85f40,0xea8e42be,
  145389. 0x83246528,0x02e96437 },
  145390. { 0xae78ea1f,0x91540add,0x7b670e96,0x51a1b74d,0xf7006826,0xf9936441,
  145391. 0x7d7520c7,0x8f97d6ea,0x69ce12e1,0x0faa6a02,0x79208342,0x2590aca8,
  145392. 0x75614436,0x7a483863,0xf381408f,0x07c6149e,0xd7853406,0x733bf584,
  145393. 0x9abbb6f7,0x8761b010,0xf528a09a,0xe4eb249f,0x2e00ae3c,0x08781ed8,
  145394. 0x2178effa,0x864c1b25,0x9d513a7e,0xcc1e62a2,0x1919062f,0xedb8b94e,
  145395. 0x4f16527d,0x739f53da } },
  145396. /* 90 */
  145397. { { 0x924adc5f,0x7a5f4a88,0xa818f56d,0x95646c16,0x7795f954,0x0ec49129,
  145398. 0xd19c5400,0x2b48753d,0x205912b4,0x16fa236b,0xe87a4946,0x6b3d65f3,
  145399. 0x045fd066,0xa7174a01,0x12a5e140,0xb6350313,0xa96b8623,0xa79c4b44,
  145400. 0x9ab003d5,0x7a339d65,0x3826f31a,0xc72f30c6,0x6f7090cd,0xb4e7390c,
  145401. 0x906ebe24,0x59ac6c36,0xbba4505a,0x39a7f06d,0xc58c413a,0x839991e1,
  145402. 0xa20e0e84,0x020c23ff },
  145403. { 0xafc74661,0x120e4ada,0x277fc065,0x37bbcf63,0xb6dce799,0x41049cf6,
  145404. 0x7b161ba1,0x5b8d6b53,0xa9610fb2,0x22218431,0xdfdde769,0xde9ec9d1,
  145405. 0x42d80630,0xd32bfa4d,0x6244df4b,0x3885702a,0x45592dfb,0xcdedd1ed,
  145406. 0xfb4e01b8,0x0e1df45b,0x86e215b0,0x8f4bded2,0x6a937e6a,0x80935487,
  145407. 0x8130f723,0x415278ba,0x38a821f8,0xc6dc4692,0xfd8b4f8a,0x2207b119,
  145408. 0xf9269cef,0x76e7bf53 } },
  145409. /* 91 */
  145410. { { 0x27ebd187,0x5f128428,0xb65aadbb,0x8d3320ab,0x72258695,0xb042765a,
  145411. 0x8f0986ab,0xda3f33f9,0xaebff503,0x411807a7,0x825f71a5,0x25c776ca,
  145412. 0xff7df24b,0xc0de7bed,0x165f1fb4,0xda8b0f42,0x731f3ae3,0x5f3ff737,
  145413. 0x193e0a52,0x4cd1d7e7,0xb6b3ba46,0x8df84aa3,0xaa1f3782,0xba84b897,
  145414. 0xe7733ac7,0x6e7960cc,0x50981a21,0x4d46d6ab,0x7cbb80ed,0x1ec12c25,
  145415. 0x2b96ef09,0x79e7ad27 },
  145416. { 0x8f30caae,0x3cd970dc,0x0a6ebef4,0x85cabcf1,0xc714616d,0x63c1863e,
  145417. 0x519e3a98,0x1c50db0b,0x64cb13d6,0xf39b8963,0x22547b69,0xdf67d81f,
  145418. 0xd67db0cc,0x7157abb9,0x889491b7,0xccca25ba,0x7a27e0dc,0xf689207c,
  145419. 0x0fd43281,0x34ae8fbe,0x5720ec09,0xa5d91f73,0xcdfd7bed,0xb2f61909,
  145420. 0x4a039e32,0x1ec10232,0xdb0d8fdc,0xd3c3d65e,0x4fe5005d,0x32c916c8,
  145421. 0x4c0bea94,0x7f8c37ac } },
  145422. /* 92 */
  145423. { { 0x43ac05e5,0x33ec1e54,0xcd8d3825,0xda4a4da4,0x88bf9e2b,0x86d88c0b,
  145424. 0xb53811dc,0x34d71dd0,0xa3c3aba4,0x655040d2,0xb61611be,0x2bc40949,
  145425. 0x279a4fa0,0x1c2d426e,0x3b065ac3,0x535a5aa2,0xc52ea890,0xdaa8a32f,
  145426. 0x9fddad22,0x5a5deca7,0x2ab3b26f,0x911f05fd,0xf37cd81e,0x5dace7db,
  145427. 0x90d16b8c,0x0e0e44e7,0xe4f5894e,0x15e68aed,0xfc92a74f,0xafe04999,
  145428. 0x970e7c2f,0x1d7703aa },
  145429. { 0x3f0062a9,0xa8a4c81d,0xd96a20ba,0xe31eb2b8,0x864bd101,0x66dd98df,
  145430. 0x4413b614,0xba05f592,0xe9a555f8,0x51a67a0d,0x2e4b52d1,0xacc2f097,
  145431. 0x7184ab23,0xab5daaec,0x7c7f691b,0xce08b43e,0x76c427f4,0x520e530b,
  145432. 0xe423ebdc,0x7d352069,0x34df14ce,0x6b5e39e8,0x446305ac,0x3dcbf295,
  145433. 0xfe34cdc1,0x682cb2e1,0x111f5afb,0xd4ac45d1,0x47f296f9,0xc5ef63cd,
  145434. 0x93c20871,0x0a2c40ec } },
  145435. /* 93 */
  145436. { { 0xaf5747db,0x09bc384f,0xc06ab86b,0x3bad6086,0x9e7c1547,0xa406882e,
  145437. 0x55977abf,0x2d5326d1,0xda81deb0,0x063a9a05,0x524b6111,0x9a86e4a7,
  145438. 0x4ab2eb90,0x1402f87a,0xd5c600ba,0x7d0721d4,0xf289fdbf,0x1a2fd9a9,
  145439. 0xecde6f07,0xf5dce66d,0xdab9fa73,0x62171277,0x6c474bab,0x6d2dc49f,
  145440. 0x76eed033,0xdc017e1f,0x4da825d3,0xb97175c0,0x54b05e43,0x6c297e3d,
  145441. 0x56c9c87e,0x2efb4546 },
  145442. { 0x8b21c064,0xa4712b00,0x4a70629e,0xd186fe42,0x9b74f0af,0x6435b340,
  145443. 0x7ec9e629,0x6965aa43,0xc4c60d08,0xdda14673,0xbf3057aa,0x0b656670,
  145444. 0x3ce86f60,0x7f05e840,0x04401a16,0xc05073a9,0x294e607e,0x16b1e638,
  145445. 0x69cf7046,0x20783252,0xe8ce7d3a,0x2941141b,0x7577053d,0xd38ad8d3,
  145446. 0xcaa6630d,0xdba68fb3,0xe9504350,0xecbeaff1,0x1d2d760b,0x9f5166d5,
  145447. 0x462891e4,0x337532ce } },
  145448. /* 94 */
  145449. { { 0x3a00bb9b,0x3f111853,0x45f66685,0x2d2ffbae,0xd4aee24d,0x9ae11a85,
  145450. 0x0341856e,0x18ba1e1b,0x2731349f,0xa9ac8178,0x545715b5,0xc13dfd4a,
  145451. 0x5daad2ea,0xa5f7423c,0x535b76a7,0x30a483b9,0xff873e9b,0x92e9ada4,
  145452. 0x723a1055,0x15662d84,0x8edac4e0,0xb935497b,0x39d8fa70,0x61b6441a,
  145453. 0x40d1589f,0x1541d756,0xf0a05f0a,0x62994237,0x6bb28908,0xfd8b0034,
  145454. 0xd4cd32bf,0x192a2b5d },
  145455. { 0x365ced07,0x63576628,0x05de1d1f,0x029f32fb,0xbf40a7aa,0x6d17b9bc,
  145456. 0x9bb50a47,0x1b1b2a08,0x795a6278,0x9389abbb,0xb34fc19b,0x52cff60f,
  145457. 0x387d8739,0xf3ab9492,0x6920ccd6,0xa8f053e6,0x63a9b4f0,0x3ef2dd4b,
  145458. 0x51e82129,0x9ab0ede1,0x0838bfa1,0xafba0c0b,0x9ffc11be,0x2bd5a7ac,
  145459. 0x95cc0878,0x058bfd95,0xf8c2f0c6,0x686d48a3,0x1d9b31ba,0xc33abaaf,
  145460. 0x3bc0c268,0x632e2289 } },
  145461. /* 95 */
  145462. { { 0x15a1ccca,0x1c851d20,0x7e522bc3,0x4efe290c,0x18eab053,0x0b741d55,
  145463. 0xbc85e217,0xae656197,0x01cf8b29,0xae13141e,0x66948478,0x2e2cb593,
  145464. 0xc31bd8ae,0xeb57bb0f,0xc264e788,0xdecef5d6,0x9cb96d86,0x6fa856cc,
  145465. 0x279183da,0x2db16813,0x383d796a,0xf03f3820,0x1d0c6fed,0x58a456ff,
  145466. 0x8a6abd9b,0x25589805,0x83f96f19,0x339f52c5,0xda7e9ea7,0xcf6ded8f,
  145467. 0x5d1ccd45,0x68c3d9c1 },
  145468. { 0xe6b392b7,0x67e26265,0x775d9509,0xcec1d9bf,0xd76514f7,0xe16abcd4,
  145469. 0x0de72e1c,0xd86f59b2,0x1adfb033,0xa66e43cd,0x05e457cc,0xdb344340,
  145470. 0x5681daa2,0xb67a7916,0xf0114731,0xc32e7bab,0xd3b1e961,0x066fe16e,
  145471. 0xf63d26e6,0x924e298e,0x541add6d,0x9bea0dd8,0x9982f971,0xef9500df,
  145472. 0xc5f076ac,0x5c876e63,0xb23d396b,0x55e12ae5,0x2ec6747a,0x09efbb36,
  145473. 0x233286a5,0x8f2055ee } },
  145474. /* 96 */
  145475. { { 0xb82c1af0,0x4a4ab9e3,0xf2cae264,0xfc65e9e7,0x60187d46,0x4feaac0a,
  145476. 0xe393b363,0x27d3f335,0x819bacce,0x9c9f7c00,0xb8aa6611,0x3f7418b5,
  145477. 0x372aae95,0xffa94557,0x8db38589,0x937d7804,0x6f1fbc1c,0xd10c86df,
  145478. 0xa2f0a0ce,0x48aebd89,0x367439eb,0xae5d5fa2,0x3f17d2d8,0x103a6a0b,
  145479. 0x411d9894,0xf233f68a,0x218b67a2,0x7fece8b3,0x2319bf06,0x0422540f,
  145480. 0x340d322e,0x1292c8c9 },
  145481. { 0x0386463d,0xf5eb5587,0x0371d97f,0xd4bbc2b2,0x0b819c5a,0x1b364571,
  145482. 0xcf04ad41,0x0cbb42d6,0x66939ec1,0x5d819c76,0xa01847e7,0x8745ac13,
  145483. 0x1c7232e4,0x4f704b02,0xacb05780,0x2c9e58a0,0xb561e295,0x9523b8b3,
  145484. 0x79f9ba35,0x3384df00,0x1eaa9628,0x78231fc2,0x8aea2b90,0xa2eac54f,
  145485. 0x30d1c263,0x8075ed77,0xfb339000,0xacb44ed5,0xf011293a,0x92546ac2,
  145486. 0xeb821764,0x7c78762b } },
  145487. /* 97 */
  145488. { { 0x067902b6,0xb8f7d6fb,0xd1735980,0xb2823a43,0x59741ddd,0x062cfb12,
  145489. 0x4033f95c,0x6e391b07,0x68589b8c,0x3831d0a3,0x522290f2,0xe3474d49,
  145490. 0x222e1f3a,0x4dab14d6,0x53f08d39,0x8f00fcde,0x707f28f5,0x559917ae,
  145491. 0x068e607c,0x166aa0ba,0xd7e1f824,0x602713e7,0x4d6a328f,0x7c255540,
  145492. 0x9890cd2a,0x0d2e3264,0xeca0b20a,0xf2207944,0x52f4e09c,0x5c98dc07,
  145493. 0xd84de81d,0x69403504 },
  145494. { 0xe5407206,0xf8b7b366,0x0d88fa8c,0x1ecf54cf,0xf7272e6f,0x6fefe548,
  145495. 0x81ab4468,0xd6531372,0x4e474408,0x52cb5f0e,0x6490737f,0x9e426b3a,
  145496. 0x4980d071,0x2576c19b,0x0f272caf,0x91f34628,0x468f31c9,0x78e60a4f,
  145497. 0x90844d89,0x8776a329,0xb951582b,0x8a55700c,0x14b1adbf,0xab1af365,
  145498. 0xfbd343ef,0x22ebff92,0xb7d81f34,0x32f9fb01,0xba6b30e1,0xad850e06,
  145499. 0xbc5f9546,0x6da9e027 } },
  145500. /* 98 */
  145501. { { 0x5c9490ce,0x21eee4c2,0x0df68381,0xa96ec4a3,0xa4a9368e,0xe6c607e0,
  145502. 0x4bc262f3,0xd8b0492a,0x460c34ff,0x0846a210,0x28df33cd,0xf7ff7a64,
  145503. 0x21827612,0x10c55044,0x149bcd01,0x9d25fce9,0xcfc613dc,0x725611cd,
  145504. 0x97f51ce5,0x159f7e88,0x4e8c08b5,0x3fa3bf31,0x75e7538f,0xea156115,
  145505. 0x91c84020,0xd1e0a951,0xcf02ad0a,0x0d2268ba,0x058b8e5f,0xa04c6ac4,
  145506. 0xb3515912,0x773b40b9 },
  145507. { 0x3631cfd2,0x00ff2cdc,0x807737bc,0x14c4c2d3,0x338a5270,0xd600616a,
  145508. 0xb32cabde,0xd0e3306d,0xa70b17ca,0x336738ea,0x79f353ee,0xf2f4aa8d,
  145509. 0x576f3ad3,0x712f6ad9,0x89b2bce0,0xe4279852,0xda92ca30,0x05d8f94d,
  145510. 0xd8492dd9,0x9891d475,0x4d15e4bd,0x3e06a5ca,0x254eabbd,0x4725d4eb,
  145511. 0xc0ed513c,0x31394ace,0xbbfaae6c,0x7e0f9859,0x833fd137,0xdc125546,
  145512. 0xc56c4f75,0x12b46385 } },
  145513. /* 99 */
  145514. { { 0x932951de,0x810dbebd,0x5aa69c94,0x96959d42,0xecb2f08d,0x5fc49c04,
  145515. 0x2250b82c,0xac74f0cc,0x3aec4e1d,0x96a439a5,0x90499acd,0xc33cab9a,
  145516. 0x54d9b3af,0x2fccde66,0x3863ae8b,0xf4af285c,0x46febf88,0x2373373e,
  145517. 0x3c9ab7ed,0x751d672c,0xfe12020c,0xc1c51130,0x52f3e56e,0xad82402f,
  145518. 0xa4a64a81,0x3489ab7a,0xd9f163f2,0x0a1fb661,0x0e553317,0x17c69be1,
  145519. 0x7d88d417,0x61c1935e },
  145520. { 0x3492ae43,0x2e722d9b,0x0538f05a,0x1ef89d95,0x200aab63,0xae77e588,
  145521. 0xeba4b117,0x2872c120,0x3a461cb8,0x5c2432c8,0xcb938f26,0x315b3434,
  145522. 0x8c4c7dc0,0x05bf2ac5,0x596b378d,0xd2e501dd,0xcb890c30,0xa8506c9f,
  145523. 0x7c361f0c,0x3d0af461,0x5a35cbae,0x21f7b718,0xf3fc0138,0xbd1035f1,
  145524. 0x8b248edf,0x74628af5,0x48c9cae0,0x8d6421d0,0x2ca18773,0x75e3da39,
  145525. 0x71d3db94,0x27ad0df2 } },
  145526. /* 100 */
  145527. { { 0x305b5aed,0x9e3bda79,0x5998d6a7,0x2c67d4a4,0x0f7eb700,0xc855e1d3,
  145528. 0x147d1c44,0xc18a7e9e,0xc89540ed,0x3ea99618,0x7e6bfd20,0xa53be20a,
  145529. 0xecc14437,0xc9487e64,0x34ef85c6,0x72979207,0xd5e1ebd5,0xfa0d4e71,
  145530. 0x4d48d6b6,0xfda2b1e6,0x66e200d4,0x782a1e05,0x5a5366a1,0x2a3c70da,
  145531. 0x1a473738,0xfe3fbd2b,0x7fe020e8,0xd7ef8c06,0xeacfb665,0xec686fde,
  145532. 0x6dd1542f,0x5d9b5e27 },
  145533. { 0xcb3e472e,0x3637c5a5,0x30a1405e,0x2153d927,0xb4498558,0x009992e5,
  145534. 0xf39a0851,0x18f00ccd,0xb5c6c560,0x26237c11,0x1343540e,0x418ed408,
  145535. 0x7e7f3184,0xfef7cbf0,0xbf48576b,0xecd92366,0xbc94c91a,0x1b75be1a,
  145536. 0x4a162276,0x8e1778de,0xc5c6bcb8,0xc52e57d3,0x5ab71858,0x5cc382c7,
  145537. 0x3f6e39f9,0xe12c2c28,0xd62735fc,0x4c7e0ef2,0x835a5996,0xe071deb1,
  145538. 0xcbb8c766,0x24f891cd } },
  145539. /* 101 */
  145540. { { 0x6778c1e2,0x24ef60bf,0x00d5be5c,0xff49c03d,0x2f01a09f,0xec11986e,
  145541. 0xae096e58,0x59a728a4,0x7077984c,0xaabbcedb,0x870ca5a5,0xfb473bd2,
  145542. 0x4de30e3d,0x8c928c61,0x4f67abca,0x3fae7f9a,0xec21a9cf,0x83c2b2eb,
  145543. 0x9cd9b5de,0xafa70d62,0xc60b18df,0xadeaea59,0x4049b54c,0xd5fef7be,
  145544. 0x6dd310e3,0xfceebc76,0x8f6321cc,0x7748efe3,0x18ee8af5,0xfe9c32b1,
  145545. 0xd42df612,0x863ac3cf },
  145546. { 0xb85a2fe2,0x0a36fca7,0xee429dc6,0xf3e70d08,0x141c3944,0x8c9ba209,
  145547. 0x67272a0a,0x306a8106,0xf968bd06,0xe69a1555,0x153c603d,0xb86f7e47,
  145548. 0xef56e4fa,0x9706614a,0x98780b4c,0xc0dc36b8,0x3a1d3263,0x43657fe2,
  145549. 0x435522c9,0x01f97a86,0xedfef679,0xd91897f6,0x6daa17a0,0xebbe31d4,
  145550. 0x85accfbd,0x6f179100,0x8f9fc1de,0xe0da6e32,0xe1e7142c,0x1c9d53db,
  145551. 0x8b86725a,0x3e3f1b1e } },
  145552. /* 102 */
  145553. { { 0x7b7fbf05,0xb7ea15c0,0x1f1a3882,0x992f11b6,0xd1dcd1bc,0xc9ddd95a,
  145554. 0xad0f7e8b,0x31f5b7fa,0xfca7ab79,0x2936e5eb,0x19a55be6,0x30f417dc,
  145555. 0x43cde554,0x1f6f4e43,0x82f044bf,0x971f5e65,0x4288c408,0x73c3b8e4,
  145556. 0xb807f575,0x61aac59f,0x818b58f0,0xa64ee2dd,0x97a3b0d3,0x6f7a0a60,
  145557. 0x0394b058,0x8b85ecc8,0xbfb3517d,0x9a059474,0xa79c3f06,0x89ad5977,
  145558. 0x700a8025,0x81208ed8 },
  145559. { 0x14c4ce37,0x10935099,0xa1aa48a6,0xf34bb843,0x580d58e8,0x86007024,
  145560. 0xb375b8ba,0x6db42c49,0xed3bde83,0xac365524,0x649233b6,0x5521e1b4,
  145561. 0x64dd946f,0xbc7cc5d5,0xbfb5b6ae,0x9c14b035,0x0146c1a3,0x7f22ba18,
  145562. 0x872214f5,0x0b62fbbc,0xb4921764,0x3acfd7f7,0xcb4d6df1,0x5ff10da1,
  145563. 0x62600a91,0x660e2620,0x81d9167f,0x7ac7da9d,0xb6e7a199,0x6e8e260c,
  145564. 0x80deb3c2,0x44383fb8 } },
  145565. /* 103 */
  145566. { { 0xe44f9af6,0xe107f01d,0x8cb1fa1c,0x36381a4d,0xfb7dd493,0xe65be3ec,
  145567. 0x26a8839f,0xd0b8435a,0x3ec789d8,0xee60f915,0x2bcc5e1f,0xe25fea50,
  145568. 0x7e44a81c,0x0477c0c5,0x230ba5b8,0x349e9f83,0xde180dd9,0xdd42f32f,
  145569. 0x64a3d11c,0x8b039eaf,0xbeb7083a,0x80ef884e,0xf12742cb,0x288e60c4,
  145570. 0x720a0262,0x44156cc5,0x7253b77f,0xcd547de6,0xa6013a59,0x9829a6ec,
  145571. 0x0d548445,0x8aee708f },
  145572. { 0x32c54409,0x18f22d9c,0x75ebaac4,0xa9ebfa46,0x86284981,0x90e2e928,
  145573. 0x6b3a8e0c,0xd0201f6f,0xbd77641e,0xc973016c,0x70170575,0xf926f2f0,
  145574. 0xfec0ce01,0x4984048f,0xf319d304,0xbf696211,0xc91a88c4,0x74b5c844,
  145575. 0xe0030a82,0x4c40fbce,0xe4f6d521,0xbed67525,0x29d67d1e,0xaf7e47cc,
  145576. 0xc21d3536,0xfa307db8,0xbbb29405,0x56b6c46a,0x033e805f,0xf059a7e3,
  145577. 0x6096a5a0,0x970f61fe } },
  145578. /* 104 */
  145579. { { 0x1bec8e4a,0x1bc53d23,0x35a6034c,0x8809ac14,0x509e464d,0x4ee081da,
  145580. 0x8a488235,0x496ae1fd,0x325864b6,0xa1ae9863,0x74cd069f,0xbaca13e9,
  145581. 0xb1d8a6b4,0x3738cc58,0xe76b9da4,0x5fa71f58,0xc7eb16fb,0xc919be88,
  145582. 0xad4e429d,0xf5c8f13f,0x2499f9ed,0x4583b671,0xa10d8bd7,0xbce20115,
  145583. 0x5790bb7e,0xf66d7605,0x482b78dd,0x9316aede,0x75f855fa,0xe0d8fb2d,
  145584. 0x5a7dcca7,0x404b5b94 },
  145585. { 0x517a15c7,0xf9ee682a,0xef880202,0xaae4cfbc,0x5106a354,0xcee2c139,
  145586. 0x170febe7,0x5de60192,0x73d0c54b,0x589e39fd,0x8c9092b7,0x195c7135,
  145587. 0x0a7bfe5f,0xcb7ed53f,0xf61cc979,0x2bd9242a,0x5395f7d9,0x8d2ef16c,
  145588. 0x70b32f09,0x0d4ac1ca,0x52d185c1,0xa587526d,0x942d6195,0x2932b04a,
  145589. 0xa500b0ac,0xfe25a979,0x562fd230,0x5fa1f4ae,0x20da253c,0x60f55af2,
  145590. 0x83146002,0x7faa11b5 } },
  145591. /* 105 */
  145592. { { 0x6e402149,0xb0ba4f0c,0x963cc119,0x3584cc1d,0xa6527476,0x7740dc1a,
  145593. 0xc95715f2,0x3f77ff75,0x3f89fb0e,0xb2f234ad,0xef9be3ff,0x55159032,
  145594. 0x04237e82,0xfc9fb21d,0xa153ed93,0xeb2eff38,0x10041d13,0x89d53ae0,
  145595. 0x7f1bd828,0xcf2e545b,0x43953ea5,0xdd4a27ce,0xd85e75c8,0x00d2e5d4,
  145596. 0x241be1c3,0xeb93ed62,0x0242032d,0x1e53f25f,0xc3a4e701,0xb9957636,
  145597. 0xed98febf,0x14b63a52 },
  145598. { 0x71c43336,0x7610b553,0x23a4824b,0x19dfd4a6,0x0286051b,0x7b97a2e0,
  145599. 0x8f5f1edb,0x86abbb9c,0x9b67daad,0x67a57d77,0xcd5ffafb,0x8ace506d,
  145600. 0x89ac3c63,0x85da9f95,0x75a3d150,0x081cbaa8,0xe9346ed2,0x03353d8f,
  145601. 0xa1f9a02d,0xb2ab61f1,0x3a659c71,0xb0cb0937,0x4f5df8a1,0xb7e0e30b,
  145602. 0xeb7d5a1d,0x77c4c741,0x728e5cf0,0x8f046c9c,0xf7c171ac,0x32dd0bc7,
  145603. 0x836d2655,0x02485873 } },
  145604. /* 106 */
  145605. { { 0x75a4cd8d,0xcd40dd23,0x97bcba78,0x132ca433,0x258d61f5,0x30c5cd84,
  145606. 0xda1e8e68,0x0a7ec059,0x1d65d40a,0x07a8f171,0xf4350d76,0x869e655e,
  145607. 0x5983ae42,0xb98ce6f0,0x9d8bebd0,0x7b61391d,0xb1ba5d49,0x3a529e25,
  145608. 0x1f6b2cf6,0x46f732e9,0x3fa3b629,0xbd66ec6a,0xc3ef0ed2,0x397950ec,
  145609. 0x5f08b476,0xee9008cb,0x965a0e2e,0xfd6be425,0x1177bc87,0x78ed513c,
  145610. 0xfe512dae,0x6798cedf },
  145611. { 0x1b97c5c6,0x49e3f8fd,0x78c3b33f,0x39fbab3e,0x40f595ba,0x44274412,
  145612. 0x5d7d4376,0x174225b9,0x79c44777,0x880b3fcc,0x3296b245,0xdc3aca83,
  145613. 0x1734e184,0x55913df7,0x9c934472,0xa4db23d3,0xd1420a11,0xcebb3733,
  145614. 0xf3608bdc,0xb9d20cf9,0x30cfe13f,0xa618acf6,0x5f30874c,0x75f06b31,
  145615. 0x9f0005a5,0x506efe7f,0x01bfc9db,0x8aaea78c,0xf78e7c41,0xf9179255,
  145616. 0x52e96395,0x3ea7aed2 } },
  145617. /* 107 */
  145618. { { 0x5b06ae25,0x98617e04,0xcb5750ef,0xbcac148d,0x604c2ba2,0x91ea2f0e,
  145619. 0x76b78975,0x00c19f6b,0x651da181,0x79b9b6d0,0xc945705b,0xf3225beb,
  145620. 0x5c005bf1,0x30b435f3,0xbc24d86d,0x440b4482,0xd6373777,0x2b8f0996,
  145621. 0x1c44b4dc,0x65fd6c56,0x30906999,0xe9405ee6,0x08aa1ec1,0x19ff0924,
  145622. 0x3d2f2895,0xeef3246a,0xbc746797,0x016c3765,0xd0705f7e,0x62d2569f,
  145623. 0x05250044,0x6a8ad39c },
  145624. { 0x46be7282,0xe45f020d,0x21380f12,0x9405afed,0xd5da6ad0,0x4cdca5bd,
  145625. 0x7f8be61e,0xc2d6f184,0x596b8178,0x20132953,0x7a8df954,0x8d3b1e7b,
  145626. 0x39572b4d,0x757c61bb,0x80cc3b56,0xd749b57b,0x37b3ffec,0x9590ff93,
  145627. 0x145dc94d,0x39bbb653,0x2335e573,0x70c1c606,0xf763feba,0x9c2e72d7,
  145628. 0xcc61b732,0x4768e424,0xaa73f2ca,0x777d2fa6,0xc5cb58cd,0xdee4dbaa,
  145629. 0x9cfae1aa,0x1a181179 } },
  145630. /* 108 */
  145631. { { 0x77575ed0,0x6f6ff62f,0x7d1da99b,0x18f14fa9,0x69efd7f6,0x2e72aefb,
  145632. 0xddc28633,0xc45ab4cb,0x586c5834,0xb0e20d48,0x39775dd8,0xd397011a,
  145633. 0xf4134498,0x0130c808,0xf5115ed8,0x2d408eba,0x0260ded9,0xc506a05c,
  145634. 0x19cab911,0x9e5b7362,0xe8693a86,0x4cf508c6,0xcc773617,0x4e71245f,
  145635. 0x95d89ca3,0x2f71aa1f,0x607bbc98,0x4bba7c6a,0x212b7fd2,0xf3a515e7,
  145636. 0x9230f5a8,0x7d2ddc75 },
  145637. { 0x4ed2cae8,0x3d05816d,0xb9c00377,0x4cf6bc7d,0x646b08d4,0xc23e98e6,
  145638. 0x4b9c0180,0xf9ee6c61,0xef9179c1,0xe11c9a13,0x8ed9688a,0xa5b6147e,
  145639. 0xd06670a7,0x7afeb648,0x17685275,0xd670333c,0x75f9e8f2,0xa89dd969,
  145640. 0x37a68ade,0xbb57228d,0x454cb186,0x21a05d5e,0x063dd550,0x4810158f,
  145641. 0x4cb6caf3,0x92dd4f08,0x7854abe7,0x70c4d852,0x6e729d76,0x845969dc,
  145642. 0xb1bf40ba,0x5a52f87a } },
  145643. /* 109 */
  145644. { { 0x09ecacbd,0xed019e91,0x7b89bdea,0x6544023d,0x5707371e,0x7cc51f0b,
  145645. 0x16c8e217,0x14832b04,0x81259ab5,0xb1aa6682,0x23e361d4,0x6e100f92,
  145646. 0xe3a95c2a,0xe593eee9,0x16c10e26,0x699b6bbd,0x9473a13f,0xad487873,
  145647. 0xb274987c,0xf1c14dc5,0x2559e2e9,0x57dc0075,0xc3d47ad2,0x8449849d,
  145648. 0xdd527793,0x83df278a,0xeefd5b99,0x770e3ec8,0x76bd02a0,0x2ae58446,
  145649. 0x3e705ffe,0x17f02764 },
  145650. { 0x29abea1f,0xdda4010d,0x2407ac4c,0x636b9695,0x0433218b,0x96a60129,
  145651. 0x163d534a,0xf221fc3b,0xccc20565,0x05ba15be,0x96285577,0x1238e54d,
  145652. 0x878804d3,0x1b144257,0xa89a9fe4,0x96fbf304,0x4be642b1,0xc8a7f06c,
  145653. 0x6e2b085e,0xdd1a20e8,0xff4a591d,0x8f7f27c2,0xa4a343b8,0xc17b0753,
  145654. 0xbb173d4d,0x684b1e88,0x3dc07bbe,0x3accea44,0x4c441d77,0xdb15c88d,
  145655. 0x53e5957e,0x0ef0309a } },
  145656. /* 110 */
  145657. { { 0xfa8e5b60,0x4fc25721,0x691c0bb2,0x646938ad,0x0b0a2248,0xe46d4b76,
  145658. 0x7de16877,0x863f9ac2,0x2721c630,0x503bb6ef,0x0b67fb02,0xf8c199df,
  145659. 0xe07abd39,0x78c1ed72,0xb32f0dda,0xcf9deb7b,0x6c3c89f3,0xaff726f0,
  145660. 0x1972225a,0xb7008b2d,0x4f145f5c,0x8f5a6117,0x457c4f37,0x4e0e6f8c,
  145661. 0x1c453c64,0x8bbdaa44,0xa6e92c80,0x57be326d,0x5d773561,0xa9bc3fd9,
  145662. 0xbb37b72a,0x3d3b6cc6 },
  145663. { 0x9722c880,0x6e6f12cc,0x286b6889,0x3a1b6ae7,0xad2fafec,0xba1cc09b,
  145664. 0x43bb8bef,0xad64ad7a,0x97c3f4c3,0xa5af6a00,0xc353a91b,0x2afcb0d9,
  145665. 0x69ccbf6b,0xca13fcab,0xf2abc190,0x699a1391,0x23a247e5,0x2dbd5542,
  145666. 0x95488d9a,0xe206180f,0x1244cc3c,0xba9e7bff,0x87d3a365,0x29297abe,
  145667. 0xfa4ca5e2,0x4054fa38,0x67be1b6c,0xb390623d,0x78f41a44,0x1fa67c57,
  145668. 0xc7b544e7,0x2e946e43 } },
  145669. /* 111 */
  145670. { { 0xc60934ae,0x2980fddf,0x164206d1,0x2c3e7eff,0x416ed75a,0xf75e7f96,
  145671. 0x5cd0b2dc,0xfac60cf3,0x1faad87b,0xddc4bece,0x9849e5dd,0x753fa87c,
  145672. 0x2c1bf1ae,0xc5d516a3,0x14732b4b,0x565dbea8,0xce48696b,0x007ebe3a,
  145673. 0xcdb97694,0x40ca74d6,0x65e4e7be,0x3f5cd270,0x3aac4ebc,0x74847c01,
  145674. 0x43d6c3a1,0x6762e034,0x467a076a,0x690d8c95,0x1eda677d,0x768d78d6,
  145675. 0x0181d8c2,0x0997ce55 },
  145676. { 0x965a0b81,0x9297746c,0xe5e12dfa,0x48b58be6,0x715f437f,0x5573b3c4,
  145677. 0xb565c459,0xe425e907,0x1582797c,0x4f43f512,0x8ea5474f,0xe5dafa6f,
  145678. 0x13de04ac,0x2aeb8fbe,0xe8a07c83,0xed7f95f0,0x662c09fe,0x3e012a6e,
  145679. 0xc742cf17,0xbf96e9b8,0xe28a1c45,0x8ea5759a,0x5cf4e2f3,0x475941b4,
  145680. 0xf901a019,0x7dd3c02d,0x70916b2e,0xe7a4deea,0x2fa9b988,0x50b272b5,
  145681. 0xd0917fe6,0x96f9f09f } },
  145682. /* 112 */
  145683. { { 0x2c310a96,0x78e8aac4,0xf7a2a734,0x32a98303,0x23962207,0xc46ca83d,
  145684. 0xd9541280,0xad131e6e,0x2cabe911,0x5791fc5e,0x841b6c68,0x50cb77eb,
  145685. 0x3d3c8878,0xaff93dea,0xf1007bce,0x06541f1d,0x55cdf1fd,0x4ee729c2,
  145686. 0x323e3972,0xe0f71317,0xad4d08c1,0xa2de7a41,0xa35e22bf,0xa9912abf,
  145687. 0x89b03325,0xa050122b,0x06514d4e,0x8b9e51f4,0x79d3e0ab,0x423c7aad,
  145688. 0x40b8fea5,0x71998e26 },
  145689. { 0xceb6ed78,0x40140fcd,0x18534516,0x653cf377,0xe8d60dcc,0x0450b65a,
  145690. 0x9dac55f8,0xce6c1a76,0xae05686c,0x8a96a92d,0x12712562,0x2fe44762,
  145691. 0xa4f39425,0x747bcb50,0xfc531fc2,0xf0ec6ff2,0x10fe9ff0,0xc97c3447,
  145692. 0x9c792cff,0xfb488783,0x026fb019,0x552c5248,0xd804c290,0x4001a29c,
  145693. 0x35c8ca73,0x742b5ad8,0x6ee5dfa0,0xc3781f17,0x3dfa4ab1,0xca6b85f0,
  145694. 0x0b0d32ac,0x8389941a } },
  145695. /* 113 */
  145696. { { 0xde067dff,0xc0f062a2,0xbcb80162,0xd4f32690,0x0707a2bd,0x98cd990d,
  145697. 0xfae4a391,0x5afc63b8,0xb32ad814,0x684f1b7b,0xf199dfb1,0xb0a2dce2,
  145698. 0x48f25848,0x2260e17f,0xc2d5e862,0x7393db00,0x338cf171,0x9e88f854,
  145699. 0x02acf522,0x00679429,0x6835af3d,0x19157cb8,0xb8a2614c,0x2faa6f92,
  145700. 0x134ec46c,0x04ff95f5,0xfb7a8135,0xcf00626e,0xb37a4704,0x454b3d05,
  145701. 0x2694ec25,0x1fbfda31 },
  145702. { 0xc8f69c77,0xfdebb657,0xa3df88fa,0x92a8278b,0xc1fb78b4,0x463b5571,
  145703. 0x11c71a33,0xd2066a1a,0x089958b0,0x10c88143,0xcf9d67a6,0xb975c7e0,
  145704. 0x73037b8f,0xdaa5d208,0x40bf5861,0x5ee5005d,0x7dba69a9,0x300e6ce7,
  145705. 0xc962cc74,0x893c3cb3,0x4cf84055,0x0ac98629,0x225c9d70,0x0a7ef63a,
  145706. 0xb91e47e8,0xfe184869,0x8c2f84be,0x1b9d7deb,0xc0e278bf,0x67788915,
  145707. 0xc426f19e,0x4f9488ca } },
  145708. /* 114 */
  145709. { { 0xdd51b8ce,0x610dfcd4,0x36230e80,0x08579278,0x36599562,0xedc7ff1c,
  145710. 0xe2cae877,0x905ead4b,0xe7967608,0xa1c325d9,0xbd38926c,0x3e39eddd,
  145711. 0x5f6f0a4e,0xda92c868,0xf47a0fa4,0xe16f800a,0xe5f60aab,0x50b4db5b,
  145712. 0x983853d3,0x3665412f,0x9b79789c,0x64b62250,0x4e0e72b2,0xea560058,
  145713. 0xe555c2bb,0xabbd4901,0x17292e11,0x378419a7,0xe174218f,0x6e0b5aaa,
  145714. 0x8f796b92,0x688e0684 },
  145715. { 0x313b8f64,0xcdfef641,0x942c7462,0xaef11b7b,0x5c0d8abd,0x067cfb77,
  145716. 0xaf4041a9,0x608ea5f0,0x6935210f,0x23d5bd82,0x27917a08,0x5ab904fc,
  145717. 0x45d22d21,0x85dbb1fe,0x4d36159f,0xc3d5e509,0x1d39b8f2,0xaebb528e,
  145718. 0xf44acef0,0xdd5ca828,0x20c57a54,0x24209adf,0x78f95f44,0x5742b433,
  145719. 0xa9337d37,0xd11fa7d9,0xc64cfdb7,0xd66a0c09,0x9bb817ec,0x56e55b8f,
  145720. 0xe4c41265,0x1723c7e3 } },
  145721. /* 115 */
  145722. { { 0xdc8b43f3,0x9a6486d8,0x26409e68,0xfc3e0e61,0xd9b46003,0x1889c437,
  145723. 0x6284ec7b,0x3a850335,0x6a9dbaea,0x5a3665c4,0xe978933c,0x7bf6941d,
  145724. 0x69341490,0x1ed5a510,0x8cb8002d,0x664a7b7a,0x60ed0a59,0x603f76e4,
  145725. 0x1f4ebf27,0xc3e06ba3,0xf2c38a7f,0x296ced41,0xcf1db08a,0x2ac18f79,
  145726. 0xcde7a3b6,0xc919e882,0xdbf68b06,0x15e77d29,0x4e947cb5,0x21978baa,
  145727. 0x7630993a,0x84bf542b },
  145728. { 0xe364f21e,0xc1decda9,0x012e557e,0x0d6cf345,0x588f90e1,0xba246848,
  145729. 0xe3b104b8,0x9f6dda4b,0xe3aef57a,0x6bf7a346,0xe8327ea9,0x210299fe,
  145730. 0xda95e6c7,0xaa99f487,0xd2cdf645,0x24ff813e,0x8bd414b8,0xd1dbb2d2,
  145731. 0xcafa1a61,0x065101af,0x9cdebda4,0x7d9f4b9a,0xe41039e4,0xaf41b395,
  145732. 0xc50adf42,0xe3e9e6ba,0x341e9e49,0x4f2133ae,0xcb157f23,0x4968c0f3,
  145733. 0xda068153,0x383f827b } },
  145734. /* 116 */
  145735. { { 0x6583ff4c,0x2ec46a21,0x4ad709e7,0x4e645a29,0xc04ca12a,0xdc66e9cf,
  145736. 0x9160a7e5,0x82f128f4,0x569c762e,0xbfb227b1,0xc2edb8e7,0xf80c7963,
  145737. 0x49a0f688,0xa7dafe06,0x2d14b8cc,0xb7e41754,0x86de40be,0x3a0c5c53,
  145738. 0x1db79331,0xf0d05286,0xfbfe071b,0xb902ce69,0x210e9903,0x61e46956,
  145739. 0xf703ebb8,0xfaef874e,0xdd5f78b6,0xf668947e,0x5af5ea3a,0x6fe86547,
  145740. 0x43f94625,0x3b121f15 },
  145741. { 0x659275e9,0x5b26e847,0x6d0fce50,0x47581cfd,0x8aa3f1ef,0x55f5cbfd,
  145742. 0xe484e60e,0x1e7be315,0xfe9698e4,0xd8f1a20f,0x7ab04784,0x25d46da9,
  145743. 0x834cdb3e,0xa526db75,0x8d08a009,0x1fd408d9,0x5b5ca816,0xfc004b20,
  145744. 0x65e4bbe8,0x5b3e3bb3,0x759bb6ef,0xf50cc125,0xc2fac737,0xf05fa817,
  145745. 0xd273951a,0x9ee102d2,0xfecb3367,0x2a8e540b,0x2a6a515f,0x673446fb,
  145746. 0x37290c83,0x5505e1d1 } },
  145747. /* 117 */
  145748. { { 0xd15e68a6,0x0c3014a1,0x64dd35e5,0x6f9f0b26,0x03ad67f9,0x18c3742d,
  145749. 0xd2c14484,0x74818c0e,0x0d41a3cb,0xc5181169,0xc49f3e9e,0x65c8c83f,
  145750. 0x2c279386,0x9b260c61,0xced04e9c,0xf6086fae,0xfd7c4758,0xa7b2cceb,
  145751. 0x90297fd8,0x4b3c3133,0x09701ac8,0xca8264e8,0x508b3762,0x9f976a87,
  145752. 0x983a8dfe,0x5d582714,0xd9d598e9,0x350d2669,0x0f6fd348,0x85cb89cb,
  145753. 0xa574317c,0x617d80d4 },
  145754. { 0x70022b67,0x4cef267e,0x3768b94a,0x80536bb5,0xd2784462,0x3153a566,
  145755. 0x38243919,0x49054d44,0x5df78c4a,0x8d11e172,0xd5a1e35a,0x9b252a71,
  145756. 0x8171e31d,0x07866c80,0x1b38a00e,0x0a8501db,0xce770236,0x2ed932b8,
  145757. 0x8edaf7d0,0xa2d77609,0xb93006e9,0x3aee5dab,0xbbfeb036,0xfaffc8c4,
  145758. 0x4e21b38b,0x077b9678,0xdca8e069,0x491fc59f,0x0e938471,0x3f624f55,
  145759. 0x7cd1780b,0x5156f508 } },
  145760. /* 118 */
  145761. { { 0x0206e8d0,0x58234e22,0x7f15af32,0xf5f6f5d4,0xd638950f,0xafab7289,
  145762. 0x7d4495f4,0x66ec4d09,0x68da80a9,0xad890c5d,0x64f8a36b,0xe4aa0920,
  145763. 0x0f4d5c5f,0x799e257e,0x24495e31,0x44c677ae,0xa5b8e352,0x720387b3,
  145764. 0x75a287b9,0x703790f4,0xc3c1f2f7,0x54895cc5,0x41a7fa41,0xb8680f9b,
  145765. 0xb00b008b,0xfcd47458,0xba6473cb,0x149cc838,0xac9be19a,0x78ed5f7a,
  145766. 0xb33765ba,0x5254599c },
  145767. { 0xa21b54c4,0x08739679,0xb6497d9d,0x029ece2a,0xc8488640,0xf14f1a92,
  145768. 0xe9fa79d9,0xae48dcff,0x46c208db,0x14b911c2,0xdae3f69e,0x5ab0fbf2,
  145769. 0xd1edb838,0x180ac87e,0x188586bb,0x146fd718,0x5467cbd0,0x210eb654,
  145770. 0x1667cfee,0xaa239408,0xb73d1a60,0xdb125c1a,0x881c1cbe,0xde685300,
  145771. 0x37c30232,0xfe34c713,0x6f3c8d18,0xc6c6070e,0xb4af4e83,0x07e365ba,
  145772. 0xdcf82b45,0x22f0a7ed } },
  145773. /* 119 */
  145774. { { 0xea7f1b7f,0xe262791f,0xdcff09d4,0x9c3d8c5d,0x39c7dc58,0x86c2a9c3,
  145775. 0x4276e8c0,0x4dad4017,0xe9fe1d56,0x0a918f59,0x2aa810c9,0xb8d79670,
  145776. 0x4aa5cdc4,0xeb7a8836,0xe7afa72e,0xfc4c23bb,0x4ac86908,0x4dbb5c9e,
  145777. 0x6a0c7e6f,0x37e39013,0x49c218d2,0x855d7001,0x94b324a2,0xe475bc67,
  145778. 0x6287a071,0xc98a8dc6,0x5fb4323c,0x395a299b,0x0c0389e9,0xe186c3ee,
  145779. 0x16734c46,0x79f81e6f },
  145780. { 0x364f3c4e,0x83f2c1f3,0x1367e14b,0x536b2ac5,0x5933e43d,0x44a6dcfc,
  145781. 0x10d961fe,0x34e59475,0x7e3f2aae,0x08234ece,0xbdea7f25,0xcb92e00a,
  145782. 0xa791a124,0x1efba4f0,0x1192d53a,0xc2086fd2,0xb51c8af6,0xfec0d0fc,
  145783. 0xdc0f1b5f,0x48d1b2ca,0x812dbe19,0xb07a388f,0xdedbdd45,0x40873a6a,
  145784. 0xd702589a,0xbc2a1268,0x17e27b64,0xbbf6e3a8,0x6d386e85,0x73ee5663,
  145785. 0x9de7c000,0x442ecd37 } },
  145786. /* 120 */
  145787. { { 0x8a2f90a6,0xb4cd1ae6,0x6f5ad0cc,0xf277d41d,0x401d4b8e,0x6a3828c4,
  145788. 0xd8376631,0xe817a134,0xf5e1124b,0x142b758d,0xfd6b95e4,0x25fbc69d,
  145789. 0xd74a9e3e,0xa30c9f5f,0xd89663ce,0x5ac0f163,0x0ce6386d,0x32a9eef7,
  145790. 0xd8ed5544,0x7a690ea5,0x9889427a,0x5de23ff0,0xeaaced58,0x75ad36a5,
  145791. 0xd3e18465,0x3514a6c1,0x7f093910,0x3d9162c3,0xe33d56e8,0x5c10add9,
  145792. 0x06aa691e,0x85176b73 },
  145793. { 0x28a21e38,0xa32110fa,0x5773d538,0x97b6379d,0x2d020dc4,0xd3697bbf,
  145794. 0x961833cd,0x59177593,0xe5fa8516,0x6d7045fa,0x786ab5d2,0x3390f29a,
  145795. 0xdc4f5b70,0xac0bda30,0xdcc615c6,0xcca0240a,0xc5146d91,0x8e1f1702,
  145796. 0xa72cef87,0xceb472d0,0x0b669ba1,0x84840708,0x7e61aa0a,0x79b08f9d,
  145797. 0x4669560b,0x388160be,0x948eb71e,0x23935c2d,0x9431590c,0xd7fd83c0,
  145798. 0x6e5768b3,0x8ab154bb } },
  145799. /* 121 */
  145800. { { 0x353c4a96,0x28686003,0x905cd835,0x4e5c60e8,0x8f66f8cc,0xbd591364,
  145801. 0x9faccf9e,0xb6b80b98,0xe32639e5,0xbc1c1fae,0x278aadeb,0x2f6396d2,
  145802. 0x1898202d,0x00a796d0,0x3a474835,0x18ab548f,0xb31b0e3e,0xacd056c3,
  145803. 0x0164512d,0x15ba68dd,0x4b03f3bc,0x203836d9,0xd8f206c5,0xd64eca6b,
  145804. 0x9f1779b6,0x931a361e,0x52ab34a8,0xd82690fc,0x92922e22,0x342bb8e0,
  145805. 0xe00b02a9,0x1bfcdd84 },
  145806. { 0x75a365d9,0x310b9a43,0x08d8fb03,0xd4ade15e,0xd742df83,0x9c9753d7,
  145807. 0xde318742,0xcf7309d4,0x3360ace0,0x1228e212,0xf7669643,0x1043d238,
  145808. 0xf90f5a53,0xfc2adbed,0x7b5f9397,0x41d64cb7,0xc446d010,0x5200b30a,
  145809. 0x231720fe,0xc3c8642d,0xb9aa2075,0xfcc0122d,0x041eae47,0x856e3b12,
  145810. 0x68c876a4,0x45864455,0x233606b1,0x1a1c7842,0x227757bf,0x9b766d1f,
  145811. 0xf7b9d4f1,0x25b78a3b } },
  145812. /* 122 */
  145813. { { 0x156707ce,0x90835718,0x4314f90a,0x9bdc2398,0x8be57dbd,0x017c885a,
  145814. 0xad63a4b8,0xd4bba225,0x15aacffd,0x5ce71b86,0x72954722,0x5f266475,
  145815. 0x4f0ad3dd,0x0a80f1f7,0xfc352ed7,0x010538a3,0x4203c6ca,0xf8a64045,
  145816. 0x330c73b4,0x2b2c7a88,0x02dcac1b,0xb3433ee6,0xed2b17c7,0x2e0499cf,
  145817. 0xbd6329c7,0x9f8681a4,0x36fadc37,0x38979946,0x92b7895b,0xdc5650c8,
  145818. 0x65a51cf0,0x70ab9570 },
  145819. { 0x7b585d93,0x46778ec4,0xa633fe4e,0xca6d3610,0x4ea0311a,0x21da154e,
  145820. 0xbd64002f,0xaf22190b,0xd91cb7a9,0x9e633ac7,0xee6837d7,0xed13c31f,
  145821. 0x1616ee8a,0xda4a07d7,0x3afcd616,0xd78a2732,0xba14d694,0xc06696e5,
  145822. 0x4df58420,0x733754d7,0x2778e3c9,0xe85e504e,0x55b5a5c2,0x3055aa0c,
  145823. 0x8a3acb5c,0x313df538,0x2a088eda,0x5896acb5,0x84c85dde,0xfc8842a0,
  145824. 0x51dde6be,0x5fec9f79 } },
  145825. /* 123 */
  145826. { { 0xfe519f99,0x5ebc2c7c,0xe5410353,0xe396bd80,0x8a3988f3,0xaded9402,
  145827. 0xd601bda1,0x1c03b735,0x14ce64ac,0xfd302036,0x01240290,0x5837ebe9,
  145828. 0xa554097d,0xcaaea1a3,0xb0b88139,0xdce73d25,0xecb090b9,0x35ed412b,
  145829. 0xd63dab3c,0x99029ff7,0x062db071,0x555437d9,0x42a4c11d,0x277d2f56,
  145830. 0x24fc9109,0x477fa645,0x2799254d,0x7b12e9b7,0xd84c618c,0x7ad2ae22,
  145831. 0xce8ed195,0x0a8d5663 },
  145832. { 0x0a21fde1,0x43ac5163,0x6903d849,0xcfcf5dd6,0x5fdd6281,0x6d2499ee,
  145833. 0x77a49a34,0x4dedc6f0,0x2875c06f,0x46bda2c0,0x347b8046,0xd0e0e0f6,
  145834. 0x5e67836f,0x1058169b,0xde8a8042,0xc961912a,0xa93b3d32,0xdf3fea0a,
  145835. 0x0c576bc5,0x9f138edb,0xd8d37e47,0x7971ad6e,0xcce5e7cb,0xeab85739,
  145836. 0x1d202b40,0x88a4b434,0xe3a1fd26,0x5d842557,0xb3a86f91,0x872fabd5,
  145837. 0x6aa4629f,0x95b93493 } },
  145838. /* 124 */
  145839. { { 0x99f951de,0x9998a701,0xf058db45,0x8fade596,0xf3d03dd3,0x4d479c1e,
  145840. 0x33b141d3,0x6e928d5d,0xacfe8a40,0x9a465800,0xc1cefa3d,0xd108ad2f,
  145841. 0xe013726e,0x64b96921,0x8e83bb9f,0xb9b6a6b6,0x1242e544,0x29f1e6dc,
  145842. 0x2f65966b,0xd3f8f676,0x5e105b41,0xa34dd096,0x16011e1c,0xd4e9139a,
  145843. 0x2515541b,0xeea4dc68,0xc822166d,0x6f8030ac,0x31d16124,0xbdc7ae1d,
  145844. 0x621afa7d,0x2e25ef51 },
  145845. { 0xdd8e7357,0x2533cf8f,0xeaceddb8,0x333ba218,0x0784d2ac,0x68e3e31d,
  145846. 0xf2804ae2,0x1c927f36,0x77e7ad7e,0x01433d22,0x587f78a0,0x0b401cf0,
  145847. 0xaa0027ae,0x9dfcf036,0x1d9a46b5,0xc9e46c8b,0x1f288d32,0xaa6de486,
  145848. 0x1b8a043d,0xdd56da2f,0xf2d0bb56,0x346230e5,0x19defb56,0x19f0b6e4,
  145849. 0x21d2c874,0x55ec37cd,0xb70e45b3,0x3dbf0397,0xac7ce852,0xf0862a8d,
  145850. 0xe141f3d6,0x87979ea7 } },
  145851. /* 125 */
  145852. { { 0x7f1c747f,0x9b7e7b3f,0xc6e63369,0x151a4c1d,0xb372dba0,0x4273ff70,
  145853. 0xd3ee54fe,0xca6d2234,0xd33cae0f,0x12fc8e0c,0x5dd6f10c,0x27328538,
  145854. 0xf01a9cf9,0xc86f3fbd,0xe36cae91,0x5322677f,0x2fefea44,0x39a70033,
  145855. 0xce8af217,0x2c9ca328,0xf6a731f4,0xc0256776,0x66a96813,0xc687b3df,
  145856. 0x8db2eda8,0x194aab12,0xeec4febd,0xde30dc5a,0x979241b2,0xc052236a,
  145857. 0xc23d4c16,0x3ec98802 },
  145858. { 0x4072f74d,0x0f9e760c,0xab594059,0xe78eb0de,0xc9b009c2,0xdb3dea40,
  145859. 0x38b59ae5,0x47e875f0,0x2b4daa06,0xf40eb436,0x090f3788,0x9a6a4f92,
  145860. 0xedbfaf8b,0xefebe9af,0x9867e256,0xf87f96a5,0x75ab6aeb,0x1e6fed23,
  145861. 0x3fdb13cb,0x17f2782a,0x70fa2621,0x5102c71e,0xfd4c0dbe,0x5d2b06ec,
  145862. 0x30347297,0x537cc268,0x2b67e780,0x8dbf5e2b,0xba25da32,0x2f633f3a,
  145863. 0xefaec914,0x3e9315e8 } },
  145864. /* 126 */
  145865. { { 0x239a9ea9,0x9255cfa5,0x0be33a62,0x20f3c690,0x9cb642bd,0x759eeb4b,
  145866. 0x00bae718,0x3316c546,0xf3410f84,0x874a76d5,0x90f129b6,0x123b502e,
  145867. 0x12851f1c,0xadc8f9a8,0x1b62408c,0xf57b764a,0x1a80777b,0x116ec01f,
  145868. 0x1f0ddc5c,0x746ecef2,0xe5a6a5a7,0x3c49d47c,0x06e955ba,0x1e15dbe7,
  145869. 0xb45d79b0,0x629c0c79,0x778d1087,0x11278308,0x8c6a22d7,0x22585dc7,
  145870. 0x0a682791,0x2ed02a0d },
  145871. { 0x4daa2682,0x53043416,0x01359625,0x0e26d32b,0xbd867097,0x449c834a,
  145872. 0xee77ae2e,0x11a19d2b,0x3af6c169,0x39bd529a,0x5cd61054,0x36cca5c0,
  145873. 0xdc6c0fe1,0x6370a59b,0xb93d5135,0xca420d27,0x554c451a,0xd8730d45,
  145874. 0x96cdebf2,0xebd258c9,0xa50f9a05,0x0cb1b990,0x7b0f0151,0x69a8c97a,
  145875. 0x11d217e1,0x2cc36d34,0x752f75e8,0xf117688a,0xa09b2a61,0x1db01394,
  145876. 0xa9efd7dd,0x14627844 } },
  145877. /* 127 */
  145878. { { 0x232803cf,0x6bca3aed,0x9a96ff34,0xc1e4398b,0x74ab788b,0xcaf6757f,
  145879. 0x7e68c04d,0xc3a53e00,0x5cb7cd20,0x5f969c19,0xdc068bca,0xf28b65a6,
  145880. 0x1d863032,0xe3ca01d3,0x87808e14,0x9b733b81,0xefe618be,0xb5d704d9,
  145881. 0xb01b946d,0x276f3542,0xfbedddbf,0xe057e19e,0x903275ce,0x7d182f2b,
  145882. 0x880f7bc6,0x3cdc5f77,0x78476c14,0xd6f03d3f,0xa9ba5072,0x035f5557,
  145883. 0xb4029628,0x7acb57b6 },
  145884. { 0x44e6b07c,0xd2413569,0xe1c7345d,0x451c4cc9,0xe273b9fb,0x407444d8,
  145885. 0xb88e34fc,0xfe496079,0xf152776d,0x77d184cf,0xc742299c,0x6d1033b9,
  145886. 0x77bf2897,0x29a0a684,0xee8f0420,0x59ffdf10,0x44bb56d6,0x4e17146c,
  145887. 0xfb9ae855,0x831d06c2,0xd93e7cd5,0xb2cb82db,0x3c96b607,0x83381c46,
  145888. 0x7549e2a8,0x06aed251,0x774a21d4,0xef97891c,0x8675fbdd,0xae9807c7,
  145889. 0x6363516c,0x6a5a05b9 } },
  145890. /* 128 */
  145891. { { 0x6a8f4f33,0x92e71ea6,0x4dea8f4a,0xf2fc6fc6,0xfee88461,0xd356252c,
  145892. 0x08954d08,0x59b0a83e,0x468ab766,0x5bd68c23,0x900f8d04,0x40281357,
  145893. 0x52b867ae,0x181c19c0,0x18764c41,0x986a5169,0x13575d24,0xcb01dfae,
  145894. 0x593677b7,0x17269ae5,0x46dc9b19,0xf6d17025,0xc40097c8,0x8de68499,
  145895. 0x259c407b,0x76df0032,0x17d29d8b,0x4091aad9,0x4a7ab5f6,0xa7f46d21,
  145896. 0x70ece48c,0x688054b4 },
  145897. { 0x51a5b86c,0xf0d168aa,0x95777247,0x2437e4d8,0xf1720329,0xae844076,
  145898. 0x9647a54e,0x0a7ac87d,0x0405622c,0x1e597a4b,0xf0a79f2f,0xedefe5c6,
  145899. 0x4d55156d,0xaf3ef0c2,0xef047cf6,0x917fb04e,0x54b62137,0x3792799f,
  145900. 0x314be0b8,0x875ea32f,0x0c466b0c,0xe157c65b,0x7e218978,0xd28c90ce,
  145901. 0xcde587af,0xb90fc3ba,0x8b877bed,0xdd32d71c,0xca8e10cd,0x3b432200,
  145902. 0xd94f6e53,0x0021f419 } },
  145903. /* 129 */
  145904. { { 0x43519d26,0x2191122c,0x40a51845,0xbdafac1d,0x548bb89f,0xcc6f71e9,
  145905. 0x16844bf9,0x9ef3375c,0x178e8d55,0xe7789f79,0x1f8be1c5,0x04f599b6,
  145906. 0x2cbbde40,0x8088c99a,0x893206c9,0x8939a260,0xfcd30851,0xa1ae4bff,
  145907. 0xe08feafe,0x664cb3fe,0xff14aabc,0x61f38099,0x2a841ef9,0x0d8394cc,
  145908. 0x17f01db6,0x75fad8ad,0x6debb773,0x6fc34576,0xa4252512,0x1e716b05,
  145909. 0x29e1ed9f,0x79855880 },
  145910. { 0x95106473,0xa2cb3aaa,0x5a61da04,0x95fafa41,0x539563c0,0xfd3c9362,
  145911. 0x95312b87,0xbaa48091,0xbf885c76,0x6c7e7582,0x230c78d5,0x70f6dab6,
  145912. 0x7747440d,0x8ce3051c,0xffdb6186,0x6dbebd14,0x190e4096,0xb0e041fa,
  145913. 0x6ee62e2a,0xba10c466,0x74f333d6,0x93d57e2a,0xfe7b9b66,0x006aadc4,
  145914. 0x06d2837d,0xfaf72f6c,0x910741ea,0x318cc5e6,0x65692477,0x9c502609,
  145915. 0x1d0fb08d,0x95d823c3 } },
  145916. /* 130 */
  145917. { { 0x140528a5,0x6aeebd86,0x53979bc8,0xf268c2ba,0x4ec144ab,0xb1bc9b8a,
  145918. 0x82a7d7ed,0x1efabb0d,0x4e0118d8,0xf12c70d1,0xa1c1558e,0x31607168,
  145919. 0xe4b7e73e,0x33e428b7,0x83aec9dd,0x63176637,0xe12ac35c,0x5172ffbe,
  145920. 0xbc17b2a4,0x37df0bfb,0x741f812a,0x4212f870,0xe2888f9c,0x3dcecbdb,
  145921. 0x756ca55d,0xa9dc15aa,0xb9028e41,0xf31918ec,0x6aeadb03,0x7ede0285,
  145922. 0x78654f54,0x0e2708d5 },
  145923. { 0xcde20f88,0x2270cc53,0x5f5b1039,0x9338272c,0x5dcb1dbf,0x5042e19e,
  145924. 0xb72d74c1,0x4b3de219,0x2aaaaa55,0x16c49a8b,0xbba86ba6,0x008443e5,
  145925. 0x20cf1695,0xee6bcd72,0xa89abd11,0x59ffac6b,0xf115639d,0x2831217b,
  145926. 0xf34cba52,0xe4d28af2,0x0727a906,0xf27f03e7,0x69017766,0x6842c79f,
  145927. 0x7a81123e,0xcb3469bd,0xa42973b8,0x48c0f346,0x23990dbd,0xfc5784a6,
  145928. 0xfb299678,0x0d3dab3b } },
  145929. /* 131 */
  145930. { { 0xce29c3cc,0x8f8376e6,0xf016cbc6,0xcb0507ec,0x5e394ce1,0xdebff996,
  145931. 0x73c50d41,0x24fc526f,0x2d16ce3d,0x4edd5a54,0x91c13141,0xbb37bdd9,
  145932. 0xe33a8606,0xe3442ef2,0xc0629da8,0x2ae90337,0x592ab331,0x57faec64,
  145933. 0xd82b857b,0x1a938997,0xa3373176,0xad6c8cb9,0x9086751f,0x82595de2,
  145934. 0x18c17196,0xa81e97fb,0xbf697357,0xe4f48a13,0x5cb89f69,0xa1387c2e,
  145935. 0x5874b426,0x530b4eeb },
  145936. { 0xbab7b5ae,0xe9f275a1,0x03a57bf4,0xbb69dc4d,0xa45c505b,0xc974dc4a,
  145937. 0x416ac402,0x726369f3,0xaed985dc,0x735e4e78,0xcdd446a1,0x0548d879,
  145938. 0x9e16b02a,0x84ceb069,0x789b11a6,0xf73f6fa4,0xb2a4e784,0x6aa0c41f,
  145939. 0x93a9b697,0xb1f76902,0xf03a8ab2,0x814cce00,0x844d66c1,0x64cb255b,
  145940. 0x30952201,0xb794e7d6,0x3da32271,0xe052d4e4,0x08b6a4d9,0x5278b2e7,
  145941. 0x80c6577f,0x90942552 } },
  145942. /* 132 */
  145943. { { 0x0d5b4c2f,0xd269a14d,0x5c8a649c,0x2b8fc59b,0xb0e37d4a,0x95becb3a,
  145944. 0x9111037e,0xfda1a768,0x94e35322,0x5810e05a,0xa178fafc,0xa24dcc12,
  145945. 0x8e3dce62,0x5c2c63b2,0x9452c444,0x995c3f17,0x42d45161,0x35330ec3,
  145946. 0xb4ef8129,0xa025a60a,0x8bae9c13,0x85493252,0xe2e3caf8,0x25d1a606,
  145947. 0x3649bf47,0xd44091ab,0x704ec5f1,0xc7d0afbf,0xbd8b3333,0x27bd1d62,
  145948. 0xcfe616f5,0x50570111 },
  145949. { 0xf534356b,0xd0084ace,0x4b4b0fbc,0x9df1de05,0xcee04dc1,0x021afe05,
  145950. 0x361b78e1,0x64bde688,0xef78d38b,0xa324fcc7,0xeb0a5e4e,0xfeb372ce,
  145951. 0x65811996,0xef04fcb3,0x5eb0ab4e,0x7dce5d50,0x238c586e,0x1e29b588,
  145952. 0xbcd80037,0xde5e3197,0x4806b9cf,0x8bf5e451,0xd18e67ab,0x4330968b,
  145953. 0xf9f63fad,0x26a7d04e,0xb5c18bb4,0xa1c7f123,0x25dce22c,0x485b8482,
  145954. 0xd540e79f,0x8ff0b36f } },
  145955. /* 133 */
  145956. { { 0x3ff42cff,0x99f2e2f4,0x1c35317c,0xa3c19f9d,0xaba1b545,0xdb749392,
  145957. 0x4afa9a32,0x84232b05,0xd7dcd436,0x0b855d46,0x45cf9915,0x8ac35e20,
  145958. 0xf001a218,0xd7cf22c7,0xed408305,0x057d35ae,0x553ccfcd,0x25a4a519,
  145959. 0x93e2b939,0x5e565793,0x3422ec27,0xa20332b0,0x3ac53958,0x9b09005e,
  145960. 0x79e9b163,0x628051a3,0xfc6618d6,0xb4a0dc09,0x6748e7af,0x9e0e857f,
  145961. 0xc577d63e,0x71b28eee },
  145962. { 0x99726bf8,0x4942b0cd,0x1c208f3c,0x1290a3b9,0xb0598eaa,0xfd7290e7,
  145963. 0xa25a9128,0xc6a7791f,0xc037d7da,0x2d33db24,0x70e2837b,0xc21efeb0,
  145964. 0xe3dae2a0,0xbf70d96e,0x85076027,0x43ed8191,0x4d4ad7e3,0x4aeb0aa8,
  145965. 0xe8c5b74c,0xbc75101f,0xad26ebdd,0xdbfb2a6e,0x6b78aa4e,0xba812068,
  145966. 0xe1159848,0xc94aa8f2,0x3eba5c4e,0x0d10d9db,0x6318295a,0xce7fec47,
  145967. 0x330d925a,0x7294711a } },
  145968. /* 134 */
  145969. { { 0x32bbd495,0xfce45904,0xbe54973f,0x330f4dd1,0x5d9c3f4e,0x006bee1d,
  145970. 0x59ba7204,0x40ee6078,0x42c2c768,0xc194fd3f,0xe9fe88be,0xa0e76b12,
  145971. 0xec2b0210,0x17cddddb,0x00811ec7,0x689d436b,0x284be9e4,0xa6a6ba37,
  145972. 0x007d4114,0xabc395b2,0x0f11e744,0xf8cdf9f3,0xe9396402,0xc5febec8,
  145973. 0xeeb46285,0x8a751743,0xc6e0d137,0x99bf8782,0xbeb292e3,0x3965e170,
  145974. 0x5801fd5f,0x001c39d8 },
  145975. { 0xda4a0912,0xf4805cb9,0x4410bca4,0xd27cb76a,0xec71d65b,0xef3dcb8e,
  145976. 0x4816849a,0x780fbb2b,0xa8b24635,0xef6a7026,0x12c44e68,0x15625c88,
  145977. 0x4d7a74a8,0x624c232c,0x4b1631e4,0x81a77037,0xdb917c2e,0x04e4f7f1,
  145978. 0x1f61ed95,0x1d0465fd,0xcbde6e3d,0xb1048049,0xd7131fcf,0x637ce0c1,
  145979. 0x8ada4715,0x22e4dbc2,0xace99726,0xf7530c5c,0xee287450,0xa0160dcc,
  145980. 0xbb91af13,0x9132e670 } },
  145981. /* 135 */
  145982. { { 0x7996099d,0x8057efe2,0xa06e608c,0xb72344db,0xd0958588,0xeb4a8740,
  145983. 0x79e5aee9,0xe53daf06,0x908a2fad,0xc9560a9a,0x107e706a,0x7f4be131,
  145984. 0x2830246a,0x6d5f3d9b,0x27cca3e6,0xa5f8e8da,0x4c28f292,0xeb51dca6,
  145985. 0xf31dfd78,0x4cfa310e,0x2ca073e5,0x92e0c7c2,0xa40da683,0x102f1694,
  145986. 0x750d38fc,0x16bb07cc,0xbadae035,0x703e83e2,0xb4d3c9dd,0xea93c066,
  145987. 0x79940ed1,0x7d0b03e5 },
  145988. { 0x4dd94c63,0x5fe7ea30,0x738b0b3a,0x57ef01c5,0xa14e6b4b,0x9534a78c,
  145989. 0xa5353276,0x07622cde,0x7c22d006,0xaf696a07,0x7d46b209,0x733c1886,
  145990. 0x626c2b4a,0x9654ccbb,0xa84f3c4c,0xa098d3a1,0x2d734b74,0x3596f9ed,
  145991. 0x5d551c90,0xdfd3021a,0x1ec5123f,0xe2ba7d2f,0xb2c1aa39,0xf9726925,
  145992. 0xf8eb2927,0xd2e75d0e,0x19192a6f,0xfaba712e,0x9b83e50e,0xa606b43a,
  145993. 0xdab5de60,0x31b1782f } },
  145994. /* 136 */
  145995. { { 0x4034db92,0x878dba45,0x8f34dc4d,0xa3977901,0xdf754c33,0x8d004f2e,
  145996. 0xcd563a88,0xeaa5954a,0xbb5ffad1,0xa29d6c89,0xb0d8bdb8,0xa8adf655,
  145997. 0x8cdbdb47,0xf7fb842d,0x80d3205b,0xb72e3a03,0x7cac7ca9,0xc335b0b2,
  145998. 0xd8a5475d,0xffc60bcb,0xeba4d25f,0x736f7719,0x0c50fca6,0x3d901c38,
  145999. 0x80c01900,0x1fdacf7b,0x5681f84d,0x75cf658f,0x5cefbbc1,0x57a7e634,
  146000. 0x3e07ed1f,0x6fc0fbe5 },
  146001. { 0xb81b0e5f,0x496d116b,0x2ac853b8,0xd82dd2a5,0x327387f0,0x357e22d4,
  146002. 0xba912c59,0x3e332a84,0x49d5dcc1,0x8b71c643,0x438d85d3,0x0c982ee9,
  146003. 0xbf7fcd4e,0x90b9553c,0x38fed5e3,0x2cb39bbc,0x5ac42903,0xa2c67c9c,
  146004. 0xbf07da55,0xebf21217,0xa0b9e4ee,0x55ac05ad,0x8ee9e0c6,0x10bb12c2,
  146005. 0x48bb6e3f,0x5cf3aee5,0x8b046e91,0x4ae7269c,0xaa0e553f,0xcb266012,
  146006. 0xa94c8fc8,0x701935a1 } },
  146007. /* 137 */
  146008. { { 0xa4626dea,0xde58d41d,0x15b9039f,0x25ef66ca,0x3164e65b,0x99a810a4,
  146009. 0x748cfccf,0x9fe6daad,0x2f142fa9,0x7ab9a6bd,0x5d471796,0xa4cba168,
  146010. 0x6bc3a39b,0x12d30b36,0x8bf45076,0x1f46a5dc,0x1421ac0e,0xb868e529,
  146011. 0x59bba1c4,0x7a686206,0xda698b90,0x2b4b552e,0xe5453707,0x5039dcd4,
  146012. 0x9e90165f,0x42a07a9e,0xd7d45dfc,0xa838fff3,0x3b5ceb30,0x41991e5a,
  146013. 0x969ca600,0x6c961ec8 },
  146014. { 0xc4e7eb46,0x703bdc1b,0x596c7b48,0xd6bac557,0x66afd74d,0x4f9917cd,
  146015. 0x656ce6f3,0x56355105,0x32497175,0x3d1fb50c,0x63effb2d,0xfda6783e,
  146016. 0xeefaa2bd,0xbd79f1f3,0x17af9ef7,0xa4efbe54,0x5a55b7a4,0x6cef6462,
  146017. 0x1a713304,0x116f3238,0xb95625a3,0xdb2a2a7f,0x0b027e96,0x6a0aa43a,
  146018. 0x4832b3bc,0x458fe5d2,0x5adfaac0,0x523418df,0xc49e7f9a,0xc05a89cb,
  146019. 0x69e24b53,0x830883d8 } },
  146020. /* 138 */
  146021. { { 0x02557389,0x959b1c62,0xadefc0bc,0x5fe5ce97,0x8330f383,0x893bbe7f,
  146022. 0x16cfb81e,0x27e0c6af,0xd04428fd,0x6f64e65b,0xb79e6182,0x53de9245,
  146023. 0x487e11ca,0x08a313c1,0x445bce93,0x65cec3b9,0xd67ed49e,0x33bc0314,
  146024. 0x30782352,0x69f36b24,0x93ad31d2,0xd78e5daf,0xc780890c,0xf2682b70,
  146025. 0x9e45efe9,0x7015c34f,0xe6cbafea,0x135d4ba4,0x7e3fcc6c,0x43a378a4,
  146026. 0x96638f8c,0x2376f97f },
  146027. { 0xae575b99,0x0a6e1ec0,0x81b970dc,0x7e14cb4f,0xd3a73947,0xf00a3824,
  146028. 0xfb235a9d,0x0b4b9c81,0x5bf62944,0x8d15115f,0x1e165d7a,0xcfd35b43,
  146029. 0xb2ee3e3b,0x5d12fea2,0xf5182e7b,0x629984a6,0xc365d08e,0x4e43e2f3,
  146030. 0x30f36e72,0x99327091,0xfd345401,0x698b4a00,0xbaf96dce,0x23c4fd0e,
  146031. 0x23675554,0xa60ba0ae,0xb0325784,0x51bdac2d,0x215464a1,0x8ab4190a,
  146032. 0x6bf10296,0x8c461661 } },
  146033. /* 139 */
  146034. { { 0x2d1f36a5,0xeffca258,0x894c5f2d,0x0eded2b2,0x43ced84f,0x35a5cdb8,
  146035. 0xdb0e3b9b,0x290f8982,0x0719a112,0xcce0eaf0,0x39a362d6,0xd0e657e4,
  146036. 0x62697e47,0x5516a55d,0x8e636514,0x269e1f77,0xd50269bc,0x5e3dedcb,
  146037. 0x441c57c5,0xecec2300,0xc705578d,0xdb83f31c,0x1e489eab,0x1bdefb73,
  146038. 0x395fcdb4,0x20b678cf,0xff9db001,0x908cf91c,0x55f52cc8,0xcbebc6f4,
  146039. 0xb4c61162,0x155ea622 },
  146040. { 0x876fa42e,0x94be2f1f,0x7fadeee7,0xab5e8749,0x38c865af,0x692e70f5,
  146041. 0xdf8059b0,0x16e99b84,0x8b5a7ac9,0x0ceb606e,0x2d463d2b,0xced23357,
  146042. 0x2a9a09a0,0x2d0f2623,0x3861fbdf,0x2529998c,0xc1be310b,0x711888a7,
  146043. 0x0d8aade3,0x9b1229c5,0x3b13533d,0xdbcf9b78,0xff029708,0x3ca746f8,
  146044. 0xda83ef88,0xa5a013a1,0x4ab28444,0x8e904d18,0xbcbd4aba,0x2fe84b3d,
  146045. 0x259058c3,0x8f570f24 } },
  146046. /* 140 */
  146047. { { 0x2ca9c508,0xdeb66c8a,0x69d6b780,0x2dc5bec2,0x88ead600,0x16d61266,
  146048. 0x49d72614,0x61841b97,0xce472e6f,0x41e40e6c,0x1fa7a876,0xada24264,
  146049. 0xcc3997a0,0x45b9fd33,0x7c15dcf4,0xb25e8fa9,0x12e9629d,0x0124ceb2,
  146050. 0x7db3d956,0x3a8c72c6,0x7c1a7844,0x8e2ded2b,0x6dd027ff,0x94ab09c6,
  146051. 0x7e7a2bc6,0xf89a057d,0xcf70c763,0xad8bf226,0xc8a26212,0x4cb268e7,
  146052. 0xb2c44c1d,0x3d171e87 },
  146053. { 0x8ce49820,0x382ac16e,0xc0c44dc9,0x24ee45e2,0x73e858c4,0x0ec67912,
  146054. 0x46327cf9,0x918cb25c,0xc6159c1f,0x43e3876b,0x37545cb3,0xb6b6e0e0,
  146055. 0x5d12347e,0x64b839ab,0xa300d541,0x72e09274,0x881c1169,0x26ab28e6,
  146056. 0xeb75a843,0x4a580fff,0x359120df,0x0a5802ca,0x3209f4a3,0x7fee82d0,
  146057. 0x8e6a9380,0xb518016b,0xc2ee11ca,0xb99c6c70,0xab9d4ec7,0x16105af1,
  146058. 0x34cd9004,0x234e98f8 } },
  146059. /* 141 */
  146060. { { 0x14db9cda,0xff435208,0x96adec90,0x99cfdc47,0xaf458b6d,0x843aaa6f,
  146061. 0x743eaa31,0x3f1f7415,0x61735d81,0x915e192e,0x0ac595d5,0x3441a22d,
  146062. 0xc044bc8d,0x704bbf67,0xbe23a236,0x2f960471,0x15d1d557,0xcc326388,
  146063. 0x76b1dd94,0x9410230b,0x0c1c8a67,0xf2e5439f,0x833c910d,0x56b141ac,
  146064. 0x865b84df,0x467c999f,0x21f02b7b,0x1b0251fa,0x96216950,0xde5b5260,
  146065. 0xce3a1e93,0x6a2130e3 },
  146066. { 0x4b3ca1a7,0xd21b67a0,0x00c0ce80,0xaf42ed53,0x932cf07a,0x22ccd368,
  146067. 0x5c25c35a,0x36523a81,0x8dd04d06,0xecdd3958,0xb2f93a3b,0x73da3502,
  146068. 0xd5e5b530,0x4c5e0c3c,0x13268777,0xef9f5486,0x1e742292,0xed87fefc,
  146069. 0xa24e5ede,0x6d9ac29e,0x33849f1a,0x08abc9f0,0x40f23905,0xb09b2292,
  146070. 0x7f934353,0x6791072c,0xe6aeb550,0x102a6381,0x96feb870,0x3ee07409,
  146071. 0x9c4d2830,0x34f06faa } },
  146072. /* 142 */
  146073. { { 0x2348f005,0x869dc79f,0xdf4920b1,0x9b5c5d71,0x6dee64a4,0xfd1b57ca,
  146074. 0xe82a4fb4,0x21b7f734,0xb9578366,0x637cb834,0x7d287d96,0xc934101b,
  146075. 0x0392ecab,0x1590f8ac,0x7f75f4e3,0x280dc373,0x6a61ac62,0x8b36f50f,
  146076. 0xa65568da,0x74f58304,0xd930870a,0x80d792a9,0xfc8895cc,0x6d17b192,
  146077. 0x4914939f,0x498392fa,0xd41d5b9e,0xaf36027d,0x5caa82b5,0x452d79e2,
  146078. 0xf4115d1a,0x764d47b1 },
  146079. { 0xa2ee8b9c,0x5df22303,0x85dfcd48,0x1b9f72d3,0x10813a37,0x6b42b983,
  146080. 0x3de741f5,0xe28c523b,0xf303bb5b,0x0857625a,0xac9bf9af,0x926f299a,
  146081. 0x0d445b34,0x21beac08,0xd6ba2c0e,0x6a523a02,0x7fce2864,0xe302a1b1,
  146082. 0xe300c1ea,0x4516a235,0x7b4a9311,0x4543736a,0xc0cc89f7,0xd3c0b9e8,
  146083. 0x40ed88de,0x0481904f,0x3cb7fc70,0x4f269b56,0x321b9738,0x09a1d53a,
  146084. 0x230a3810,0x1c0dd9c3 } },
  146085. /* 143 */
  146086. { { 0xc46a7d9a,0xffaa1f67,0xbedf91cc,0x64743334,0x47a42f2e,0x45833a74,
  146087. 0x241ffaa9,0x67980051,0x335efe6b,0x70979a84,0xf08b2403,0x5f0613f5,
  146088. 0x64f211dc,0x6bb22fcd,0xa0572cfc,0xe1b8b2a3,0x7950a14a,0x19e0eb41,
  146089. 0x3eb6cd4c,0xe634bb29,0x470a25ff,0x31a04b25,0xa3d15a0a,0xa41f7ac9,
  146090. 0xbf2fede9,0xefed85ec,0x81b94a00,0x1f581f5f,0x9ef4a15c,0xaa3996b0,
  146091. 0xb06041bc,0x52d8be39 },
  146092. { 0xfd631a2f,0xbd1536f6,0xb351a8dc,0x91fae7f0,0x9b126212,0xd1a590c7,
  146093. 0x2bd0f435,0x52d4875f,0x92b0ea70,0x9aedb6d3,0xb83ab89e,0x0bd0abdc,
  146094. 0x89fe192c,0x827a1062,0x102a0bda,0x6566a960,0xce036814,0xda083037,
  146095. 0x58639405,0x30bed79f,0xdbca8df9,0x972019b6,0xefdaa3f5,0x89201286,
  146096. 0x5236b892,0xb337b996,0x28fc2e73,0x11d3e38e,0x880e8da3,0x70787f41,
  146097. 0xdae4a45d,0x6cff6367 } },
  146098. /* 144 */
  146099. { { 0xf89a8bb4,0xbd3d0433,0x93b98f71,0x42144c33,0x03470a2d,0x82b616c8,
  146100. 0xe5da089e,0x98fcc757,0x7bf5fda6,0x542354ef,0x9ebd34cc,0x1885c253,
  146101. 0xbec5dd0d,0x2e20b285,0x782a1bca,0xe71bbbe1,0x9b854ef0,0x959ded30,
  146102. 0x8997fa6a,0x17249979,0xd81f3c45,0x50cf8fa8,0x60c11152,0xa9a3b517,
  146103. 0xecf845ea,0xc9b0ef7d,0xb9fed11b,0xc9339e23,0x28256080,0xc93e9c5c,
  146104. 0x613ec1e7,0x1d2c8217 },
  146105. { 0x987cfc93,0x7381347d,0xf187f810,0x047603bb,0x1250ca31,0x3fa6bc9d,
  146106. 0xbb055bf3,0x480091e0,0x3a3af87c,0xbdf95f1a,0x140540ab,0xe2687770,
  146107. 0xd7fe045b,0x998df730,0xb723bc2d,0xb398135f,0x15ebec46,0xac230f8c,
  146108. 0x5f5561c0,0xe08e1830,0xda60a47f,0x7c0fbf4c,0xe16d4bfc,0x06e95c24,
  146109. 0x74617e92,0x74163495,0x4ae0c20e,0x39719869,0x2131e2b6,0xfe269312,
  146110. 0x0a537722,0x25486e36 } },
  146111. /* 145 */
  146112. { { 0x53572806,0x618795ca,0x656968e1,0xb2c89449,0x3fb323ae,0x149c2c97,
  146113. 0x409bc7d6,0xfb15de26,0xc79121b3,0xa90cda72,0x204cabbb,0x6d2fa14e,
  146114. 0x91604125,0xcbcda6f7,0xb435f947,0x25086261,0xc282eb10,0xdb686c38,
  146115. 0xf1a791cb,0x51016d62,0x61a2266c,0x6b1c7ed1,0x271d74a6,0x26780666,
  146116. 0x824287a4,0xb5ffeda1,0xbbe4f0f3,0xcbe503ff,0xb9482a74,0xd7f7f0be,
  146117. 0x088493f1,0x751b2358 },
  146118. { 0xe9c9be68,0xd597b9d6,0x67d10c6c,0x1794b5c4,0x7762b2f4,0xa88cdc3d,
  146119. 0xa1b44e11,0x6d94a63a,0xaaa8eca8,0xfb0bbbb9,0xc963d87f,0xf4b0f2d0,
  146120. 0x5dc7075d,0xb753062c,0x49933989,0xfed726ac,0x57f9ccde,0x5da60638,
  146121. 0x75f8c766,0x221c392a,0x5dc672ca,0xcd264d95,0xb66ecc8d,0x7004ff22,
  146122. 0x18a458ba,0xfb1aa9ae,0x8babd653,0xea9644df,0x2ba0de7c,0xa9378e80,
  146123. 0xca2c6c75,0x144cc12d } },
  146124. /* 146 */
  146125. { { 0x2989aa3a,0x593a0a1d,0x59e6e64d,0xd83f2283,0xd32e732e,0xe938b0cb,
  146126. 0x3c3cb249,0xf4c464c5,0xf89ea6ac,0x9750a5f8,0x346cfc32,0x467e5bbf,
  146127. 0x37b2b809,0xc9bfab9d,0x3b339c6d,0xf8eb7453,0x3b766dee,0x3fe01fbe,
  146128. 0xef6aea27,0xb3154254,0x7be61b10,0x555c3df2,0xdd818488,0x70fb6d81,
  146129. 0xbbe714f9,0xda1af3a4,0x9d18f693,0x575f2017,0x2465b839,0xdc08fc6b,
  146130. 0x6b84a951,0x874ecf33 },
  146131. { 0xbbb3f6be,0x624af83e,0x08bb423d,0xf578fbb9,0xd7873527,0x5623b0ba,
  146132. 0xa62e0442,0xc3659bd8,0xfe236f79,0x2903b167,0xe53f26a6,0x55a430c6,
  146133. 0x3ad712cf,0x222547ae,0x76eb272b,0xb73890d7,0x3d628df9,0x95b4f70b,
  146134. 0x53eae4ac,0x9f0e13b0,0xe7f2174e,0x5b4f5138,0x98dbae17,0x75482cf9,
  146135. 0x44518480,0x2b69bbde,0xcafef15c,0x4f279652,0xb6bcaf19,0xa0a3ef2b,
  146136. 0xce4c634f,0x31fb8581 } },
  146137. /* 147 */
  146138. { { 0x615cd607,0x398306d1,0xaa32c3a6,0x680c9faa,0x7779131d,0xe87a705b,
  146139. 0x36708b00,0x1031013a,0x9445297f,0x814fa0e1,0xa6a79b56,0x70c5583a,
  146140. 0x4b16bed4,0x03039cbf,0xaaaaf8d3,0x18a7ca8d,0x5cdb68a5,0xf33159e7,
  146141. 0xd23814fa,0xdea0e738,0x8d0f4f9f,0xeb352718,0xdcdff032,0xb0b76609,
  146142. 0x3d48338b,0x65ba8ea9,0x55dd507a,0x18044d82,0x4a4a50b4,0x844a223e,
  146143. 0x18e19e54,0x98323000 },
  146144. { 0x57f3d5a6,0x28a21027,0x6e8cadcd,0xffce5648,0x02551f3b,0x9590381b,
  146145. 0x935ebdf1,0xb26cc64f,0xc083aa6e,0x60611291,0x88e4cf41,0xcd988a66,
  146146. 0xdd53b1b5,0x581c3f73,0x77fc621d,0x78c804a9,0xfadca2fa,0x31874330,
  146147. 0xc83ccf02,0xf7008da4,0xa79a4707,0xc4122a1d,0x4a915eb5,0x9a8e0d3f,
  146148. 0xd0123660,0xa2de157d,0x65ead2a0,0x45ef43b2,0x188db285,0xd0a22ade,
  146149. 0x922e0caa,0x8abbe39e } },
  146150. /* 148 */
  146151. { { 0x3a2d2f01,0xb4446905,0x5dc6685c,0xd27c3193,0x1d74a027,0x6a908bbf,
  146152. 0x5b50ec1d,0x01da350f,0x3f3c2e26,0x1d3dd45e,0xb836ee92,0xf66e11d0,
  146153. 0x474b979c,0x7e03908f,0x98b87834,0x19e7c5b9,0xbd3d1de9,0xa741d3fe,
  146154. 0x1ef6059b,0x63c68e8d,0x3674e247,0x9b9ff939,0x3e7e67f6,0x1d7d53e7,
  146155. 0xaee9e248,0x698dc326,0xb3bd984c,0x52f23eda,0x6f8fe8a7,0xf95e31b0,
  146156. 0xc3d0ba95,0x0f15b4d0 },
  146157. { 0x790a8d85,0x8f2f6635,0xe2595af1,0x51bffbae,0x24b51287,0xd15b7ec6,
  146158. 0x3234715d,0x7639b6ab,0x2bc5441d,0x0cdd5299,0xf6d05833,0x54800ea4,
  146159. 0xf6d6e360,0x21efd752,0x19290613,0xc0b7ffe5,0xeea898cd,0xb68a5825,
  146160. 0x22982266,0xecedba92,0xbbd06bb2,0x678a91b0,0x4bb6b0cb,0xb2436dc0,
  146161. 0xcaf8ea98,0xcf7a99e7,0x71aa05bb,0xb92d0e6e,0xf5993eb1,0xbf8d0471,
  146162. 0x20385ddb,0x515db378 } },
  146163. /* 149 */
  146164. { { 0x6f5bef22,0xee43eaaa,0x20348712,0x952d2698,0x7a3af6c6,0x1e4c484e,
  146165. 0x9a8c9403,0x18d434c6,0x5001899a,0x63e5d741,0xfe8ea40c,0x5238dbbc,
  146166. 0x96798721,0xca6cc8d2,0x04acbde8,0x73db6aee,0xb7f993ce,0xbf69328d,
  146167. 0xad45e334,0xa3f79bbf,0x7c1f1630,0x8c51ec93,0x9b00a6de,0x4907325f,
  146168. 0x12d82bc3,0x49e6acb4,0x0ec59fc9,0x5901b36d,0x9cf34e3b,0xcb09b710,
  146169. 0x1abf4c02,0x2de0487e },
  146170. { 0x8dd9d484,0x18b722f3,0x7c77bacc,0x83349393,0x93d92b8a,0x58dbb8f1,
  146171. 0x8e3fac25,0x80d78d50,0x745f4a7d,0xf0500981,0x877cc29d,0xd072bfed,
  146172. 0xc30a89f8,0x67abf8f2,0x9a0820d7,0x92c567ea,0x8a3a5738,0x425ab12e,
  146173. 0xf055521b,0xc162faeb,0xb94ea5e9,0xee1c4f26,0x3d71e546,0x1e414994,
  146174. 0x43e8be1d,0x258183b8,0xef9eae0b,0x44917c82,0x73874a30,0x6813a457,
  146175. 0xcc42f86e,0x6f6ac071 } },
  146176. /* 150 */
  146177. { { 0x4dd6e3b1,0xd38822ad,0xad620869,0xfc78e1cc,0x2cacde80,0xe7843845,
  146178. 0xa8469fe3,0x121cc14a,0xe67e8ef2,0x8e8f3da7,0x4d347448,0xdb83d16e,
  146179. 0x798631f4,0x3ba1dd98,0x0a4c4c17,0xdfab5977,0x3edc701f,0x1f0a1306,
  146180. 0x6cd8ff28,0x4649d601,0xbcc55bc9,0x2267230b,0x5760412a,0x02a19c60,
  146181. 0x328faef6,0xc719d5f1,0xf67eaad9,0x27cb969e,0x719bafb5,0xf342530e,
  146182. 0xff5a82cb,0x6e2c24cc },
  146183. { 0xadaf8793,0x6313024b,0x035c948e,0x944bccf1,0x953500bf,0xe9a066b7,
  146184. 0x1d116765,0x7991a946,0x9fd93c78,0x95addb2e,0xe92e5495,0x05d2c037,
  146185. 0x9f03e5cf,0xcb145b18,0x95aa1f72,0x81ae48ca,0x135a6e4f,0x203f2702,
  146186. 0x49b2a7d5,0x2bcef5a2,0x02d7f2a3,0x0687a900,0x6c6745b0,0x2f7d3228,
  146187. 0x86507305,0x3da8a875,0x2e8dc58f,0xbe38b884,0xdbf11185,0x6b48bf34,
  146188. 0x97c08f91,0x5af7fd0d } },
  146189. /* 151 */
  146190. { { 0xf4a224a5,0x55f9b950,0xcc50273a,0x41904574,0x643f1fd5,0x34f81330,
  146191. 0x0e50f783,0x996801bb,0x89581712,0x866d7403,0xa4091d36,0xdb9a405d,
  146192. 0x16a46fe7,0xf1e379df,0x83bf9168,0x8d04a93f,0x32b20bca,0xae4c8335,
  146193. 0xf72a1c10,0x99d334b1,0xd8195db4,0x8fbc9977,0xfba14b5d,0xcaeb3dff,
  146194. 0x76daf476,0x60fef022,0xdb5b72f4,0x4b948dfe,0xb6dfb062,0x5185c925,
  146195. 0x9609d4ae,0x27a9c381 },
  146196. { 0xf12a93af,0x73c37346,0x5536634d,0x028b707c,0x498193d1,0x8efa58d5,
  146197. 0xef21b69d,0x4f83a5cc,0xa788a0e2,0x05cbb0a3,0x65b13c98,0x01031781,
  146198. 0x2b73784c,0xfea20e58,0xe50361f2,0xdf9713a0,0xd0cc22d9,0x31449a0f,
  146199. 0x7c5e2e1b,0x183752e7,0xb67044cf,0x6e44d6bd,0x733e177a,0x012dde95,
  146200. 0x08ee2c23,0x68b49669,0x1f5f1949,0xd9bb0541,0x6acd886f,0x95182c71,
  146201. 0xfbde9244,0x1c690694 } },
  146202. /* 152 */
  146203. { { 0x3a880026,0x5db67d17,0x125d95f2,0x89c4f0a0,0x3f6cb7a4,0x29050551,
  146204. 0x5cbbdca5,0x3eb231d1,0x972bcbd3,0xf8cffc99,0xad55a03a,0xcb4ef4d4,
  146205. 0x22867c2f,0x944d47ca,0x0ead1aa5,0x96d88548,0xcbc8b045,0x76a57cf8,
  146206. 0x005e55a0,0xdfe5844b,0x1d18a097,0x5e9e7e19,0x52923c74,0x957a26e8,
  146207. 0x7f5db339,0xd0867b79,0x63bed0c8,0x2553408e,0x689ad23c,0x1596e5d5,
  146208. 0xa504c339,0x7b8c13d6 },
  146209. { 0x52fb6901,0x2fc43aad,0x16ca253b,0x1c0313f9,0x515aadc6,0x1475830a,
  146210. 0x7f577dc2,0xc93d1926,0xf723c0dd,0x26e52e8e,0x3eb9f6da,0x2f1e0eb8,
  146211. 0xf180376d,0x9979de82,0xb0834939,0x43e28ecb,0xa39c38e7,0x9a2d51dc,
  146212. 0xa8e3f6b5,0x6e6063a9,0x4b9b3270,0x4cf1da3a,0xd2f8915d,0x6e5348a2,
  146213. 0x50507912,0x5e75e3e0,0x20d383fa,0xaeffce57,0x8fd2fb29,0x1d6d53cc,
  146214. 0x696f4cd0,0x0e3c3ef6 } },
  146215. /* 153 */
  146216. { { 0x21ee1d83,0x3bc337c1,0x787b7788,0x97e08f6d,0x138fa4ce,0xbf709fcc,
  146217. 0xa0348e58,0xbaf77647,0xa55e672d,0x04f8babc,0x7d5ec5dd,0x0ed2919d,
  146218. 0x33e99218,0x8ce64bff,0x24b059af,0xac09fc57,0xdc5e32ba,0x506831f9,
  146219. 0x465af6a9,0x26a22677,0xc97f1ff8,0x3c5efe66,0xbc6087fd,0x1515e0d6,
  146220. 0xaa8edc6b,0xb1a39c5e,0x0e79ed29,0x3dd816bb,0xbc3788b8,0x6cc13769,
  146221. 0xc092a51c,0x463098e3 },
  146222. { 0xc8bd0fa7,0x3a6408c7,0xce6bde49,0xd1764311,0x283ef7be,0xe315e108,
  146223. 0x99b5d938,0x8213cc77,0x45a49a6b,0xaf7f1581,0xe529e4d1,0xd00fdb0f,
  146224. 0xce66c9d6,0x55d38f77,0x1bd4b952,0xb4f7ccc0,0xaf71f986,0x8d975b49,
  146225. 0xcd64d00a,0x12b59fcb,0xa5a3bad7,0x1860e504,0x2b5c89f1,0x6d976044,
  146226. 0x7a3e231f,0xfed0c659,0x178cba92,0x58114c33,0x6698e11e,0xe2e74c06,
  146227. 0xa348b85a,0x7f8fd093 } },
  146228. /* 154 */
  146229. { { 0xc19428af,0xf24592ca,0x3a308665,0x192a1c81,0xe30bbd7f,0x42589812,
  146230. 0x836c6bb9,0x10db0723,0x598e4987,0x9c7a41e9,0x6ead6f4b,0x8aff179e,
  146231. 0x75862c44,0x70f8f9b9,0x6f21983e,0x6b3b0237,0x98e65152,0x25d83e9b,
  146232. 0xd751218a,0x3b2d26a8,0x9d6f1da6,0x9508281a,0xa5a81f74,0x8df78d05,
  146233. 0xe4687471,0xd79ee559,0x6787d8cc,0x2060ca57,0xa8476c95,0x427a84ff,
  146234. 0xe6435131,0x87b64c51 },
  146235. { 0x4b30d3c4,0x87f46f65,0x23b4ef14,0xcdec4c5c,0x63ca4d68,0xb3b74766,
  146236. 0xcf3fb56d,0x1df34269,0x0fd7d46a,0xd4f139c4,0x6a69a8bd,0xa3b7c7c7,
  146237. 0xcbadd7d2,0xee56b4c9,0xac942334,0xb28ff342,0x786f1da3,0x0046fdfa,
  146238. 0xb700c82e,0xce5d149c,0x50966597,0xca30ef81,0xfcff4bdd,0x44a20609,
  146239. 0x44925268,0x0f2f65e7,0xd4021f38,0xe5b6552c,0x042dbbd0,0x77ea9c2a,
  146240. 0xd9c062f5,0x8c95267c } },
  146241. /* 155 */
  146242. { { 0x5fc1abb1,0x6655032e,0x12fe4743,0x2215af54,0x29f05ef5,0xfd657560,
  146243. 0xdc191be9,0xb0e73325,0xc08639b0,0x7ab3c65e,0x1c3e6673,0x67507f51,
  146244. 0xc8615555,0x638befc3,0x42f0c4ad,0x5d0188cf,0xd896186d,0x843a301c,
  146245. 0xb2c6741e,0x045603f7,0xfa3cd1d0,0xf7545c0c,0x4a40672e,0xf612affd,
  146246. 0x45b9e8dd,0x56197c9f,0x87922d74,0xb453237d,0x4b2d59bf,0xbf132e3a,
  146247. 0xb84a6a16,0x8afa1b73 },
  146248. { 0xe793ac70,0x6b3596ea,0xeef6dd10,0x4c94ef8e,0x70422e40,0x926b4fa2,
  146249. 0xe9e5d763,0xc8c71dce,0xf512aadf,0x352fcb70,0xa883975f,0x1b7ba138,
  146250. 0x058c3b13,0x57991390,0x97740fd1,0x9692092a,0x160b0697,0x19ad945b,
  146251. 0x10837ab2,0xbc634388,0xf174bb71,0x76ee11c4,0xab1b80eb,0x6111bfc1,
  146252. 0x70ec458a,0xbc82bac8,0x312d3325,0xeee60127,0xb240adc8,0xb4118b1a,
  146253. 0x2b5a093c,0x67211191 } },
  146254. /* 156 */
  146255. { { 0xf55cf9bf,0x91e99306,0xa46b96d9,0x9b045308,0x9e7a65df,0xae3c1e1d,
  146256. 0xc731bcbb,0x453cb151,0xa4d58a61,0x14be5227,0x97c74cc2,0x39dac922,
  146257. 0x822e00d6,0x4d0f7a45,0xc62b03df,0xafeb1d51,0xbaa18b2d,0xbb1dc3a4,
  146258. 0xdf2b74f0,0x7f3c7178,0x896b6a33,0xfcd328a6,0x1dce055f,0xe95ed454,
  146259. 0x6a4e2b87,0x97fbc76b,0xfa59dce9,0xe5ec67f1,0xcc0367c1,0x052368ac,
  146260. 0x54e4a3fe,0x7c863916 },
  146261. { 0xca7388cf,0x55e94b5e,0xc0335d38,0x17cc0a60,0x616f85ba,0x9b69b78b,
  146262. 0x10122980,0x705d02ef,0x1cfd0a79,0x565a6e80,0x7d1ee352,0xeb74a96d,
  146263. 0x427b9dad,0x5c8832ed,0xe6d5330f,0x96ea8528,0x18d24ee8,0x30d8862b,
  146264. 0x9ff939f7,0x9cd38ed5,0x01060252,0x690fc9a2,0x2303b3ff,0xc62d88b8,
  146265. 0xdd52b469,0xfc42d7a4,0x8cad2d93,0x06f8dfa2,0x60920438,0x50236090,
  146266. 0xfce855ad,0x32582758 } },
  146267. /* 157 */
  146268. { { 0x359e8c60,0xeb20e45f,0x364ca186,0xc71bb8a5,0xdff8e110,0x02b15071,
  146269. 0x4c93e578,0x074e91d3,0xb829d0d8,0xc0326e00,0x626a83fa,0x3c192258,
  146270. 0xfb29a09e,0x387a64d5,0xe5ac5c82,0xcaaa3d34,0xada2da29,0x8ed685e5,
  146271. 0xeb29650e,0x92720267,0x763802f3,0xf7184b19,0xdf6b1aea,0x23f5dd0e,
  146272. 0x25e6125d,0xbe1fa347,0x0c872a1a,0xd6287f9d,0xac57c3af,0x49aa93d2,
  146273. 0x5bda7656,0x1a4e6a71 },
  146274. { 0x554d1267,0x1a126ede,0x1cd02b48,0x37f94533,0xce31fb1d,0xd70af04c,
  146275. 0x097dc012,0xcf410b0b,0x36c7b6c5,0x930e1d17,0xc6891085,0x902fee41,
  146276. 0x79fb638f,0x349ba4a7,0xacd6f8df,0xa16c5821,0x2e076ace,0xfb3b83c1,
  146277. 0xe501d14d,0x6b8d033b,0x20f2d2da,0x0593d452,0x99df1880,0x3752526d,
  146278. 0x9feb33a6,0xca32351c,0x1f6ef456,0xd91343bc,0x35b9dc8a,0xc74857db,
  146279. 0x85b4e832,0x856a7c93 } },
  146280. /* 158 */
  146281. { { 0x0d0a5583,0xa007d002,0xeda4658a,0x2f1301dd,0x34d939be,0x91c07964,
  146282. 0xa70c0836,0xa0cb6780,0xbe81e540,0xc0b4df95,0x5d4ac8b8,0x6cbbcd34,
  146283. 0x54756239,0x57c52ed0,0x1805ceb6,0xcac2dca4,0x79344255,0x915ee6ab,
  146284. 0x24c9a2a6,0x366def31,0x8c12c674,0xbd3b962f,0x7dbb7c3b,0xaab64f1b,
  146285. 0xe22bb95b,0x3c0e4553,0xc4c63b74,0x2408feba,0x2a4da631,0x3ca77312,
  146286. 0xc636da40,0x62889084 },
  146287. { 0x8cb8d208,0xa457fd53,0x543f06d4,0x7a8f8009,0xf2eff2ab,0xb66de154,
  146288. 0xf72517e7,0xfddb28eb,0xf9389d2c,0x0149fe66,0xd85b88ce,0x79e8773f,
  146289. 0x0ba543f7,0x452e090b,0xb0b03fc0,0xdeb9b5cf,0x6c5ed77b,0x3113448a,
  146290. 0x8ffc0372,0x3609f3cf,0x5c1b4c4a,0x2bc9c46d,0x8fa59be9,0xe66f3bf3,
  146291. 0xcdb02691,0x1396bf5f,0x009f88f9,0xf1ec59d4,0x2ad9dfe3,0xc2903456,
  146292. 0x5ada4d58,0x79d8122c } },
  146293. /* 159 */
  146294. { { 0xaa529507,0x14d4e4ce,0x74655d00,0x056a0814,0x4f0fc474,0xc0d30a38,
  146295. 0x3443cb8e,0x8a8203ea,0x97f1728d,0x33c62fb0,0xb520ef52,0x8a38dcfd,
  146296. 0x7cac9d3e,0xa0f90d5d,0x873cea50,0x28a7b0bf,0x6c6c41cb,0xd115ae3a,
  146297. 0xa13812c1,0xa35171da,0x624d507e,0x25d4bba5,0x7e98f42f,0x91dad289,
  146298. 0x96a41371,0xffd6b1e9,0xb69e5b77,0xd46c2125,0x20c4f707,0xc7d2b424,
  146299. 0x8142557a,0x2ab3af95 },
  146300. { 0x6a5372a6,0x86ca074c,0x56292ba7,0x728fb83e,0x77741cf5,0x745596dc,
  146301. 0x520ef49d,0x70b4cea1,0x61e46472,0x1472fe34,0x3fb8ac5d,0xf4d6bd66,
  146302. 0xc10bc071,0x46e52cc9,0x371a3461,0x28794efe,0x276fe877,0xa4850718,
  146303. 0x9bef5ab4,0xedad5773,0x3f15c815,0x24c2d9ff,0x8f8395c3,0x188950e5,
  146304. 0x80b6a855,0xbae40996,0x8a8803e1,0x4f53e22c,0x039d25ee,0xaf233f61,
  146305. 0x250409ca,0x07db2c35 } },
  146306. /* 160 */
  146307. { { 0x037d4703,0xc7f3b8db,0xc5f488b9,0xe83708df,0x8471d402,0x1fba830f,
  146308. 0x5a2faae9,0xa55ee8d2,0x5404fc1e,0xc2e5bf10,0xaa2d5651,0x647d5027,
  146309. 0x7ebaf5f9,0x37a53c0c,0x95b30abf,0x7adf0bb2,0xd64c93ba,0x5a62e1fe,
  146310. 0xe2ef4a78,0x7ffc18c0,0x4d2cd04f,0x139dd9d9,0x5ea0af02,0x253fbab7,
  146311. 0x0fef9acf,0x7c8100ea,0xc8615aa7,0x74c5384d,0x9fe52069,0xcb28682d,
  146312. 0xcf7dd759,0x08b6ca8f },
  146313. { 0x036c3b5a,0xe04e5bea,0x7f9f2b4b,0x38726102,0x29797c0f,0xa9fca570,
  146314. 0x82879ea3,0x1656180b,0x607f0ddf,0x153389bb,0x67b0e087,0x99a1223c,
  146315. 0x9d897fc7,0x0d1808ec,0x916edf19,0x9470711a,0x07217118,0xf8f52f2b,
  146316. 0xd18888b6,0x5d8b29ff,0x4cc6f900,0xef1e22c5,0xeb24877f,0xc4036165,
  146317. 0x35479525,0xfda95233,0x6861468a,0xd622a421,0x74faba08,0x5d043b07,
  146318. 0x0d31a7d2,0x2c337b02 } },
  146319. /* 161 */
  146320. { { 0xea22fa65,0x7b2305bc,0xd159f63a,0xbe183ef4,0x3f35923f,0x3473d87d,
  146321. 0xc11d7753,0xb27fb306,0x2a054cff,0x702e7e6b,0xaf185619,0x3ce9f97c,
  146322. 0x4e7d51c5,0x83550243,0xf356ac5b,0xa63e3d82,0xd7645131,0x867b7caa,
  146323. 0xa671fc9d,0xee85e6af,0x2b07cd77,0x3b985ede,0xffda5193,0x07d598b0,
  146324. 0xa942dc36,0xb10eca39,0x506218a9,0x17f3dcee,0x06b7d5ca,0x3d94e8d1,
  146325. 0xed8831c9,0x509b2634 },
  146326. { 0x48caed54,0xb1b9414e,0xcbf51e97,0x77a78c6c,0x4de9b258,0xa4688c8d,
  146327. 0x91ee3d78,0x0024137c,0xe30ee64c,0xa68f9234,0x88190d78,0x573255bc,
  146328. 0xba80690b,0x41e8e05f,0xec354f4c,0x50038d84,0xdfa52816,0xb18f02d6,
  146329. 0xccb63fda,0xc47f9007,0xe98ae455,0x29d480fb,0x5d0e319d,0x4ac45d22,
  146330. 0x026db719,0xd06f3575,0x2c3587b9,0x733b9e20,0x2c317727,0x22483992,
  146331. 0x54bb8752,0x1592d5a7 } },
  146332. /* 162 */
  146333. { { 0xcf7453f0,0x5778d9a2,0xed83c1f0,0xaffb899a,0xe0a82ba7,0xae6506d3,
  146334. 0xea3d5081,0x32c84e1a,0x810aa38b,0x9ad528c0,0xbd37d041,0xb1fdb020,
  146335. 0xd06ce41f,0x78d6cbe1,0x2e74b7f6,0xd287f0f0,0xc43bb022,0xf5cd2575,
  146336. 0xf81a71b3,0x6d28f2f3,0xc633e7f4,0xe65bb1f5,0xc4fc580e,0x32e5fc1c,
  146337. 0xbb7b07a5,0xcd55539f,0xc3caaf3a,0xb5a94471,0x4cc22d2d,0xb958bdf4,
  146338. 0x77a2777c,0x1614bdbd },
  146339. { 0xed0ab04d,0x4c1f0230,0x6e2082ea,0xae347b00,0xc42c5b5f,0x9f10bc63,
  146340. 0xde019935,0xb0539e6f,0x65dd0825,0xd89bd4e7,0xbbceda16,0x92260fef,
  146341. 0xe62aca32,0x8aaa755c,0x5ec82c5f,0xed762fa9,0x18650768,0x99e64c01,
  146342. 0xc92e348c,0x57dd6245,0x31ea6d68,0x0db88a77,0x07b44736,0xef0012ab,
  146343. 0x171d70fe,0xb9356b94,0x03f891b0,0xe68b0628,0xb79c20a2,0x3a54a53a,
  146344. 0xb00b0728,0x489656c7 } },
  146345. /* 163 */
  146346. { { 0x71353c25,0xe43649ba,0x13f67e24,0x517f27a1,0x1c1eb9e3,0x10bd333a,
  146347. 0x78e29bf9,0x94e1c05c,0x4743f15d,0x84fe7d97,0x90da2df0,0x9c874908,
  146348. 0x53673be1,0x82403fa7,0x1baea1b1,0x7ebf5db4,0x24180ead,0xcfe0ae35,
  146349. 0xc2f50c3f,0x1d15873f,0x70661cd9,0x16851ad6,0xa51e8c2c,0x802968d9,
  146350. 0xe0161099,0xe7d1a9cd,0xa8a7ea56,0x2b153c89,0x06e3c498,0x6d41b789,
  146351. 0xd6769dcb,0x082bb2e9 },
  146352. { 0xc4d6615f,0x6180ef46,0x01b9829c,0xfc629dc1,0x0fb264ca,0xde222ec0,
  146353. 0x10ecc2c4,0xc5457e06,0x1eea2c4d,0x95ce599f,0x8f9c5b2c,0x0433fa72,
  146354. 0xcd6310f9,0xee035462,0xce2e2253,0x84c57c3b,0x96d87e44,0x6c8ec31a,
  146355. 0xa452c5a7,0x30bfe393,0xa047b235,0xc592b140,0xc018545e,0x7bd8be18,
  146356. 0x5c178c46,0x794e0107,0x2e23005b,0x48471946,0x622a54f3,0x2665e237,
  146357. 0x901c9042,0x36451a46 } },
  146358. /* 164 */
  146359. { { 0x19893e71,0x17802d18,0x539a2082,0xa1765d8b,0x2302ecfc,0xfc6aea01,
  146360. 0x365bf59d,0x8d4cf51b,0x0d232a80,0x87741d72,0x18e80427,0xac343eb3,
  146361. 0xe74739ec,0x553ecb2f,0x1a8b07ca,0xaeca79a8,0x56f4ab3a,0x089ff322,
  146362. 0x3fa1d1f7,0x5e95d729,0xf62a9a16,0x260569ae,0xaa08ddc2,0x5e776232,
  146363. 0x1b7bb54a,0x93fabec3,0x743d56e7,0x48a20956,0xeb0ebeff,0x749cdb12,
  146364. 0x69b8fcf1,0x705307a4 },
  146365. { 0xe488310b,0x7a8e4c04,0x5325cd7b,0x12726e32,0x4983efac,0x5d0fd8b0,
  146366. 0x02ddb913,0x796e552c,0x77b9685c,0x0eeca3f7,0xb15f24a3,0x9b766e89,
  146367. 0x48efc979,0x7c2736d6,0xa8021c6c,0x3d619685,0xa0b2f1ea,0xfe33e278,
  146368. 0xb676d6b0,0x95c69879,0x1af4e0be,0xa0747319,0x36c4ee55,0xa2fab5f1,
  146369. 0x59e5f3b9,0x6938b8ff,0x39cafe6e,0x1e114da4,0x6a6ad120,0xc9595ec3,
  146370. 0x57e62aec,0x80f79bd0 } },
  146371. /* 165 */
  146372. { { 0x60af09b3,0x3cef42a7,0x933dfe14,0x3c016ebd,0xed85eaa8,0x720cf1e0,
  146373. 0xceaa3bc9,0xd4f5e99f,0xb7106f97,0x7216b9d2,0xc9668ad2,0x65f34c36,
  146374. 0x5b0c651f,0xa8fb82bc,0xf2fda4de,0x20f42f1c,0xd21f659e,0xeb31ab2c,
  146375. 0xa13d1618,0xb7a776c7,0x38662be5,0xec441022,0xcad08e0b,0xc825da70,
  146376. 0x022c0180,0x99299079,0x2aef9ffd,0x7623bda0,0xf5c58b50,0xde84f4f3,
  146377. 0xd824ff19,0x5f5a5da4 },
  146378. { 0x7e8311dc,0x5737257e,0x466cf136,0xdef94f51,0xb05ca21a,0xa73e1645,
  146379. 0x02e4ab37,0x38ea9b3c,0x8579165b,0x7760eac9,0xc24b01a4,0xdffdd047,
  146380. 0x3fb95584,0x188d4fd1,0x25548bda,0xfaac38b8,0x59e9dcac,0x1a79a6f0,
  146381. 0x09a2700f,0x983f720f,0xfb8a7e48,0x8cbba554,0x47a1fad5,0x38a19968,
  146382. 0x5abd6b5e,0x11856547,0xf3716ec2,0x75113d31,0x4212907b,0x1391e781,
  146383. 0x0dc15889,0x5319c801 } },
  146384. /* 166 */
  146385. { { 0x6b61c3af,0x2320136e,0x07b4bb68,0x1d40f2de,0x380c97f0,0x651dee7f,
  146386. 0x6a8c313a,0xa978ba70,0x2011ca10,0x22c587d6,0xab1f445b,0x48bba218,
  146387. 0xe50444e6,0x8c5eaf07,0x442fccf9,0x5549f02a,0x3d80493d,0x2564746f,
  146388. 0x79c04591,0x42d24f61,0xabdc8887,0x1600fa18,0xded38f8f,0x5cb8600a,
  146389. 0x923aeb46,0xa4bf9b90,0x1e1c578a,0xd63fee35,0xebb9ea14,0xf3c9c5ac,
  146390. 0xf11a4ff0,0x3d13314d },
  146391. { 0xb4513d1e,0xe5cc662d,0xd55952bd,0xde78a8c5,0xe7f86d0a,0xe8a37a3f,
  146392. 0x7a04f0c5,0xca2d12a4,0x2e25d06c,0x4c6696e4,0xb2136071,0x52614698,
  146393. 0x89f6e1cb,0xf4d2701b,0x80efd95e,0xaafd6177,0xc5bb6907,0xe6d73ac4,
  146394. 0x420db35a,0x49e874ac,0xf2751fa0,0x11631de4,0xa1fa2edd,0xb29f7336,
  146395. 0xb7fd794d,0x4c406864,0xe22f92a6,0x73cb21d3,0x2043cc76,0xeae904e6,
  146396. 0xb322c6ad,0x67f28a9f } },
  146397. /* 167 */
  146398. { { 0xca148ab5,0x7c17b258,0xb3c60051,0xb9a1976f,0xc8f28df9,0xea260698,
  146399. 0xe8d45017,0x87b2cc74,0x0578a422,0x37257329,0x17bec732,0x81d5ee25,
  146400. 0x1d48bbc4,0xd7411fcf,0x487f5cfe,0x46217e6b,0x41eb8e1b,0xcb007ac5,
  146401. 0xe05a00c8,0xc41c57a6,0xd2f9fa99,0x1f954d2b,0x40941cad,0x370bd5db,
  146402. 0x3829509d,0xe487879c,0x5ceca5ee,0x4c137552,0xfd3efb9e,0xe8ef7fa4,
  146403. 0x1bd1bdb2,0x5ff09174 },
  146404. { 0x579c6632,0x791912a4,0xb8a20815,0xbb19a44f,0x535639d3,0xf4f97b84,
  146405. 0xbc3c9bce,0xe57e2bcb,0xf19e6410,0x122b3f2b,0x1357d9ad,0x1f0189da,
  146406. 0x79e5ff66,0x675573bb,0xef2f3c4c,0x444e5c98,0x04d10731,0xd6f61e20,
  146407. 0xac75d635,0x0dfa366f,0x2c854f23,0x9fc47c86,0x0ad0850b,0xc04ae43e,
  146408. 0x2f720c32,0x5ce94f64,0xa753bc9d,0x67efae65,0xb0373a63,0xc27d30d3,
  146409. 0x29721646,0x6681013a } },
  146410. /* 168 */
  146411. { { 0xe84509df,0x1385d913,0xcf339376,0xe978bedd,0x3423a148,0x2df425d3,
  146412. 0xee8cb579,0x43fa0ae3,0x31c4553c,0xf015369d,0xdfbf1d48,0x05cf08bb,
  146413. 0x9444244a,0xadff4be6,0xa35dda33,0x01635f81,0xe76fab7c,0x085c8949,
  146414. 0x16737783,0x4bd7fcde,0xa254f8d2,0xfd8cb52c,0x413ec985,0x62168a66,
  146415. 0x7a9026cc,0xf2db9741,0x50e1e1b7,0x3962ee56,0xd3beffde,0xbee0a346,
  146416. 0x0bdfab1f,0x3b35b72f },
  146417. { 0x535c3749,0xbff8de9f,0x8add9c48,0x23c1f20f,0xc8f8f663,0xa975b37b,
  146418. 0xe8f3ae49,0x2529e475,0x1d5e2628,0xc32f10d5,0x67862f1d,0x5ac0d297,
  146419. 0x854cbe36,0x13c79338,0x4b67e462,0x48f004ef,0xe5d10ee1,0xfa37a150,
  146420. 0xd28288a0,0x4974778d,0xcfb73f4d,0x96830a66,0x07804952,0x9f444013,
  146421. 0x9760b694,0x8233c709,0x25b75c99,0x8340cca5,0xc771f99c,0x3f62e40b,
  146422. 0xcd95c685,0x47d0a1eb } },
  146423. /* 169 */
  146424. { { 0x652811f1,0x266f4fff,0x62ef3002,0xeaacaa93,0x50cba0ca,0x6c387a55,
  146425. 0x007f5467,0xa350142a,0x202f2673,0xc7fd102a,0x33dc6e65,0x5daee570,
  146426. 0x064a63d9,0x60682ec3,0x462b251e,0x46cf0bb0,0x5da936e7,0x0e030ca5,
  146427. 0x434265b5,0xc87a60f2,0x69b4e8f5,0x9637b2bb,0x7ad7770a,0x601fb58c,
  146428. 0xed3a15a6,0x1f2147f6,0x2995e961,0x05b47d5e,0x83213a16,0xcb0ca9b3,
  146429. 0x4995a85c,0x8f4b614a },
  146430. { 0x4b4eb3c1,0x5aa8ec19,0x20323a70,0x8c549ac4,0x4f6cc6aa,0x00d49322,
  146431. 0x45f9a5a3,0x0e53b9bb,0x0897abbb,0xe46ef110,0xd7acd7d0,0xfe873e57,
  146432. 0x0f7cb588,0x7cfccfe5,0xc85557d1,0x0ea53d65,0x7288f2e2,0xfdd9eb44,
  146433. 0xc0eb68a8,0xab2dedfa,0x08603a0c,0x58221470,0x00feb06c,0x69464689,
  146434. 0x25e5caac,0x804cf5bf,0x9fc91ae9,0xd8559858,0x73c45eae,0xed9378b1,
  146435. 0x524c9801,0x8f942d02 } },
  146436. /* 170 */
  146437. { { 0x8e845808,0x1f1ec302,0xb77abfc5,0xc302bffa,0xf8d97dc7,0x26afd4b9,
  146438. 0x3aac594b,0x3d3a83c4,0x674d94dc,0xe3b74bd1,0xcaa5911c,0x4464b737,
  146439. 0x871c2cd2,0x62925773,0x3b4440fe,0x419f2485,0xe052ad7d,0xdda6a0f3,
  146440. 0x846c86c0,0x645280d6,0xf8324f42,0xa25689fa,0x07cf117a,0xc74ad1e8,
  146441. 0x8ddc9db7,0x5626dea0,0x966fc85d,0x52620373,0xf3b1eb53,0xe0ad57c3,
  146442. 0x949c1acb,0x38300252 },
  146443. { 0x5e744723,0xa0ef5a40,0x1ae08481,0xdb5bcf75,0xfec1f76f,0xabfad8cc,
  146444. 0xfab37fc6,0xfba5d831,0xc8fedb78,0xbe39e248,0xad93f310,0xa5cfad5f,
  146445. 0x913d5c24,0x747fdb1e,0x4518b7f5,0x052a47c9,0x7cfb4327,0x9e208d6c,
  146446. 0x70e538be,0xb135cb9c,0x5bb17916,0x36352759,0x5b3106c7,0xa2c07880,
  146447. 0xc209bb06,0xd2d42a06,0xd3c504ad,0xb525b471,0x822ce034,0xc9f4b368,
  146448. 0xeb4185a5,0x15f18796 } },
  146449. /* 171 */
  146450. { { 0x0aee4684,0x094dea06,0x7cdbdbc8,0x42b21f06,0xb1931319,0xa439e149,
  146451. 0x81a7dba6,0xea4bdd41,0x3c2ae80f,0xc6213706,0x12823dc2,0xb58b0967,
  146452. 0x832611b1,0x7443d515,0x13c20384,0x2e16f831,0x2bd992d2,0x0ce204d6,
  146453. 0xf419388b,0x499dbcd6,0x1d3778c7,0x492ded1d,0xc5ddae73,0x9d5bd74f,
  146454. 0x994b6259,0xd4813d52,0x0e86ca68,0x191d9cf6,0xf3e9c2ac,0x562179ea,
  146455. 0x9fee1238,0x6146f1f3 },
  146456. { 0x078e2aa6,0xbd06d33e,0x9dee9265,0x693af7f7,0xdaa40e84,0xd56e0f81,
  146457. 0x9b9a407e,0x05fbbb88,0xede99519,0xdcf44adc,0x092dba39,0x7f71f8d3,
  146458. 0x4231774b,0x675b5da5,0xa5f605eb,0x7456a251,0x87a39a9e,0x9031d4af,
  146459. 0x05b474bd,0xdb430006,0xb665aa91,0xbda5dbf2,0x6631eeb4,0x5d1a3df5,
  146460. 0x62377c58,0x028149ef,0x685d0bff,0x2e1af4e9,0x82a465de,0xe0ea0875,
  146461. 0x06bd0050,0x95543f9e } },
  146462. /* 172 */
  146463. { { 0x85d7c6ef,0xf7cbc6f4,0x63b1bc24,0xcad8084d,0xbf8cba62,0xdf90ce88,
  146464. 0xb455c192,0x98e4b686,0x774fc6ed,0x6146b8d5,0x7ae20077,0x70e2389e,
  146465. 0x61c22529,0x5241c479,0x3884e5f5,0x7d221510,0x17e28273,0xd6d20ce2,
  146466. 0x4f2674f8,0xe3119f51,0x70c011db,0x85459055,0xfcfb760e,0xdfab75d9,
  146467. 0x9e8c2a19,0x9546362a,0x4a7d4b27,0x4b6d3f8a,0xee5d698c,0xa5c87104,
  146468. 0x2ba296ff,0x6db43478 },
  146469. { 0x5c3f0d95,0x06486493,0x4e748895,0x8917db82,0x6b2f3e44,0xf73fdf62,
  146470. 0x2b7f574b,0xc60edc54,0xaf732723,0xbe1c09a2,0x7cad114c,0x7d34669d,
  146471. 0x321aaff9,0x9646600a,0xed0cd61c,0xb94e2bba,0xdec4750e,0x866e1a41,
  146472. 0xb1a89f58,0xa1be990d,0xf2759693,0xc39e4d6c,0xc0e0dddf,0x11cfb780,
  146473. 0xd99c8a41,0xf0afcd7f,0x6e1c3050,0xcebffadb,0x96d2c6e4,0x4f3981b0,
  146474. 0x2ae27a94,0x07a791e7 } },
  146475. /* 173 */
  146476. { { 0x1e9f0300,0xe70e9047,0xbccdf904,0xe0253ad9,0xff053078,0x51c0289d,
  146477. 0xae893462,0xf1ef092e,0xa4846845,0x2c90a91a,0xf1dad4b4,0x1946eda0,
  146478. 0x33df67b2,0xf07650f3,0x0b15a014,0xc6e988db,0xb542f0f9,0x72e0c66e,
  146479. 0xe0c0378f,0x5d4b6311,0xae86950d,0x548badaa,0xb35f1c8f,0x6801638d,
  146480. 0x944d1ad4,0x129e3216,0x40471d32,0x9951bac8,0x85e94dde,0x03cc29f3,
  146481. 0x4543ecac,0x6d6acc2e },
  146482. { 0x57b2d299,0xeb999e95,0xe3d721cd,0x3a2bcd9b,0xbb4cb444,0x2e60384f,
  146483. 0xdc060faa,0xae177709,0x8c987cde,0x74f0e6d3,0x1076fbed,0x9a237cf8,
  146484. 0x7983fbff,0x69af1513,0x323f9584,0x6c3f7a1d,0x6db64398,0x3e21cacf,
  146485. 0x96703d92,0x7cd8134f,0xb8393f76,0x0755898f,0x2e825222,0x1b5b28bc,
  146486. 0x7924aa7c,0xb78799c1,0x81427a8a,0x1db378f2,0xff289492,0xd5a451b1,
  146487. 0x3d3c46ee,0x79d18212 } },
  146488. /* 174 */
  146489. { { 0x109d5589,0x1a3edff9,0x029b4499,0xded52eb4,0xb4b54adf,0x13eb9d30,
  146490. 0xa27bff67,0x4f9214c1,0x67f0f460,0x4c817ee7,0xc3a50e28,0xbadf8d83,
  146491. 0x94026237,0xc5dc03c9,0x966647c1,0x5f29581b,0x8a0687f3,0x10b6a089,
  146492. 0x31634517,0xae787cec,0x62e75188,0x2001dba5,0x45e2c3fb,0x55d4e1a7,
  146493. 0xb67d3395,0xbfcacdeb,0xbc6842ee,0xa1a0af9c,0x3e88580b,0x50590a2b,
  146494. 0xa784cdc8,0x73104491 },
  146495. { 0x2648d676,0x44ca2cdf,0x4f1b12b1,0x9a85eca5,0x2980e1eb,0x1b9dac94,
  146496. 0x1ac8aa89,0xf30d3709,0xc719e195,0x73072ab7,0x2f703797,0xba518c82,
  146497. 0xac0067f6,0xac090e14,0x8dcd2927,0x0e6cfc70,0x21e7da63,0x4f5889e2,
  146498. 0x8371c7c6,0xb4aaa40b,0x8f7878c9,0x1f9dabe2,0xd84caf3f,0xf78aed6b,
  146499. 0x9e0e1d92,0x3c39dd07,0x122424dc,0x680be5fb,0x0bdc0099,0xf41b214d,
  146500. 0x5180c54f,0x6a8f8fc9 } },
  146501. /* 175 */
  146502. { { 0x53235132,0x62a1ed63,0x59dba88b,0x1db233f1,0x291efdd8,0x85625452,
  146503. 0xb25111ae,0xc7505297,0x1d701bd8,0xb5921af9,0x9774f45d,0xb4d05d72,
  146504. 0xf18e73ff,0x6e3d4c5e,0x899b3038,0x897d985f,0xc89b1558,0x8a9c30fb,
  146505. 0x4d13181c,0x3c92d1a3,0x2223320e,0x292e86ba,0x01ceed02,0xcf2454c2,
  146506. 0x583f309f,0x27a45f74,0xad0fd1a3,0x75a6102c,0xcb9c7538,0xdb4f45d2,
  146507. 0xdb283fd7,0x4752d8c1 },
  146508. { 0xd5dff4d5,0x514d6cea,0x45a827f4,0x74cd5fdb,0x4fc7135e,0x1070a60c,
  146509. 0x1be5778e,0xdec0bb78,0x58dc6b08,0x271e12cd,0x54bc2496,0xb765089b,
  146510. 0x619098ac,0x6ddf2c63,0x67528832,0xfd6ebac6,0xc2508af1,0xeaa2d025,
  146511. 0x4dcfc1f0,0x13c2cda8,0x45510be0,0x1c7836a8,0x1a886801,0x3904688d,
  146512. 0xafaf2545,0x643132aa,0x2830a88d,0x49685577,0x8744b470,0x569491ca,
  146513. 0x75fb8552,0x3a6518f3 } },
  146514. /* 176 */
  146515. { { 0x224042a0,0xaaa8ed50,0x2452f1e6,0x6cb4e3b0,0x768211d8,0xedca5f4c,
  146516. 0xef4d5d3f,0x4e0fe3f9,0x522d46e5,0x33a8e2a4,0xf1446775,0x5998e21f,
  146517. 0xf592d01b,0x1496c50e,0x83a67739,0x69104c2f,0x472bbf00,0x28670bcb,
  146518. 0x503177bd,0x8ea883b2,0x7d2712a2,0xc5d8bc05,0xb439c994,0x41ef9317,
  146519. 0xdcda1aff,0x9801d3a8,0x7038f6fb,0xd686eeb5,0xfbfbf820,0xe80c5cd0,
  146520. 0xedc25817,0x540ac363 },
  146521. { 0xfe7f43df,0xa71969a9,0x2c1b9e4c,0xe6653808,0x859c2917,0xad9677d8,
  146522. 0x96aa4404,0xbaca9545,0xff1297da,0x0e9d855f,0x22aea7de,0x1f61897b,
  146523. 0x36f13f8e,0x96edccfd,0x16e200df,0x627d3070,0xc98988a4,0x729f0736,
  146524. 0x97f231d2,0x95e25e60,0xf6048752,0xaf7f221b,0x4019b299,0xd6682609,
  146525. 0x26b4b1d9,0x1d99de09,0x1acdd7a3,0xec47cf66,0x6ebe15e9,0x4de9f2b3,
  146526. 0xfa16974f,0x17db32ec } },
  146527. /* 177 */
  146528. { { 0x6cf40599,0x75ef6919,0x00c020ea,0x7ea10dfb,0xfcaaf679,0x3da5ae7b,
  146529. 0x88ddd678,0x0d663ca3,0x255bcfcd,0x5a21f8fe,0xe344bc7e,0xe9c3f538,
  146530. 0x548e0632,0x35f62b1d,0x43c6e64d,0x654f2425,0x26993627,0xc755a7a6,
  146531. 0xb0f41324,0xa3b7c5f7,0x3a2180f3,0x05697f79,0x1e81675b,0x6cf85fb1,
  146532. 0xe53428f5,0x6d3cdb35,0x52d28b02,0xe3aa1591,0xf7a3fb78,0xa8470255,
  146533. 0xa194445d,0x460bd01b },
  146534. { 0xc24d8077,0xbc34dc23,0x4c720d2c,0x82f4b580,0x6f5d1ffe,0xa29da911,
  146535. 0x92783ce2,0x578af520,0xb5904af3,0xe29f51ab,0xf7aa1190,0x46c570d7,
  146536. 0x571bddf0,0x4a522fba,0xae89bb51,0xbf4e2a06,0x59f3444d,0x799b35cc,
  146537. 0x26cc2557,0xc3028367,0xafcec177,0x94a4e985,0x7c36cbd0,0xadaf7dcb,
  146538. 0x75d39077,0xed31b787,0x2d3e24bc,0x52d6904f,0x1f95421b,0xc5ca2669,
  146539. 0x1734878d,0x7d342c3c } },
  146540. /* 178 */
  146541. { { 0x11fd127f,0xe5cf2c0a,0x119e4c5e,0x66d36bb8,0x6ef56ac3,0x621ab252,
  146542. 0xe5430675,0x30cfeaee,0xac3e9619,0x2ede27d2,0xf8fce671,0x6413513a,
  146543. 0x075f4c3d,0x6159c61b,0x59069d98,0xd447efe9,0xea76aea9,0xaf8d6f68,
  146544. 0x0f5bd164,0xac5dc61b,0x1e88bb98,0xdbab446e,0x1ba92320,0x618b8b16,
  146545. 0x78989865,0xa0eafb3c,0xc08b7e82,0x0c7abcc2,0x20d160bb,0x10f09b6e,
  146546. 0x8e4c63a7,0x5be0afa6 },
  146547. { 0x1bbbf49c,0x82ab6d38,0x8c0703fe,0x3e09ce49,0xe10f4263,0xeca58b5d,
  146548. 0xda5a4532,0xd9cc6581,0xf618f7b7,0x07e18876,0x250f7fe7,0x0419a5e3,
  146549. 0xde6b86be,0xbb1a9e90,0x37359169,0x584a7deb,0x5149db2c,0x38eb3489,
  146550. 0xb0ebabb8,0x14546a33,0xc2f88a92,0x0067f0b0,0x0a2db019,0xbde0dfe7,
  146551. 0xc63e6f3e,0xba51b06c,0xe9206fad,0xa19127b9,0xfe80dc0a,0xe4eb5e87,
  146552. 0xd4de30ae,0x1e6fccf5 } },
  146553. /* 179 */
  146554. { { 0xaa8ac924,0xb57dff66,0xc298b3e8,0x06e9ad31,0x65fb080c,0xd140e329,
  146555. 0x1d95c93f,0x7dab211d,0x8a180caa,0x6d68d842,0xa20ded69,0x1a929408,
  146556. 0x38df461f,0xa8151753,0x60eae932,0xff5604ae,0x7dae4c0b,0x901b9e49,
  146557. 0xde262e89,0x4573a97f,0xf1084983,0xed69d9a4,0x64724f1d,0x8ffa022f,
  146558. 0xea85a15f,0xd5f1c2e4,0x01453794,0x4c626ce9,0xbf0907dd,0x80440cd6,
  146559. 0x5ddaa837,0x4522d461 },
  146560. { 0xebfbe7c5,0x8895f079,0x84ef3446,0x30ea1ded,0xd4a1ab96,0x716a9eb6,
  146561. 0x50a30c68,0x1a4a5d22,0x0043bbaa,0x5a16631c,0x5010e5f5,0xbd107502,
  146562. 0x3d8c0556,0xbffe3e9d,0x07772419,0x31b30b18,0x84b82297,0x90ff7ef0,
  146563. 0xf21a18c3,0x00c37d75,0x565bb8f8,0x18d0a635,0x45e3bceb,0xbac1da2a,
  146564. 0x23f0b08d,0x1c38e90c,0x5fbc5ac5,0xf1ba1aa2,0xdda71fc6,0x09d5256b,
  146565. 0x6d7e40ba,0x346501a9 } },
  146566. /* 180 */
  146567. { { 0xcc2b0f1d,0x86be448c,0xac4c3703,0xe3eb45c9,0x9fc96bbf,0x5387f65d,
  146568. 0x5ae27fda,0xcef3c4e9,0x1bc18089,0xa008f776,0x22ca18a1,0xf374a084,
  146569. 0x53b73371,0xee882842,0x7cc09354,0xcb6fc6d8,0x61496d6b,0x8489ec1b,
  146570. 0x49e325c4,0xa92c29b9,0x7bdec166,0x15c6ca52,0xdcea2813,0x95444eee,
  146571. 0x3a21154f,0x34683eb3,0xd39061cf,0x8fb26f98,0x06c940bb,0xc3b08aa8,
  146572. 0xe554c96d,0x7c1d42cf },
  146573. { 0xdc110aa7,0x766e703f,0xf362e378,0xab7b79d7,0x5aadca3c,0xd259c75d,
  146574. 0x60be3373,0x2a6eca79,0x06c4e8ff,0xf4744a4b,0xf3b705bf,0xb2842cce,
  146575. 0xae304b53,0x1a3af5aa,0x1b2d31b8,0x7bbfa201,0x4bee88d9,0xc4ba6eba,
  146576. 0x565cb839,0x2d3565ce,0xdaf7ece8,0x24808696,0xe6959745,0x2c7ccce7,
  146577. 0xe94f9837,0xefd6eb3c,0x3811a326,0x0a33b4cf,0xfffa93a6,0x14203f43,
  146578. 0x73c31d90,0x031e9828 } },
  146579. /* 181 */
  146580. { { 0x765a17ff,0x4fefecfc,0xd1290a65,0xa09f3888,0x938da038,0xbf265c46,
  146581. 0xa169ad46,0x4bb6145d,0x23a62fe8,0x33cf8214,0xabc860a5,0x562df571,
  146582. 0x815c38c4,0xbf2a90fa,0x17eda875,0x45ba1d6e,0x946fa5e1,0x799d881a,
  146583. 0xb90f5a3b,0x6c1be784,0xb10ff52a,0x0910a37c,0xa4f4fd36,0xc38c1fe4,
  146584. 0x8e2d3ba0,0xc3180fc5,0xb17a6187,0x3e2ff050,0x943a35c2,0x3a00059b,
  146585. 0xa28cc51c,0x494d3645 },
  146586. { 0x4ba021f8,0x398426b6,0x796deb6c,0xd14c9083,0x7e36c762,0x6d2e5395,
  146587. 0x751cf216,0x8f556eca,0x19b24a19,0xdaca1e00,0x4b20c2ae,0x47887da4,
  146588. 0xff41a733,0x93ed4ccd,0x5c7c0cd7,0x8d717c44,0x91bf7009,0xcc48634a,
  146589. 0x3b59bbaf,0xa1f146f9,0xe5624f15,0xdd38bb39,0x303f8443,0x96d41aad,
  146590. 0x4bf104fc,0x6b670f03,0x29706582,0x0503f9ed,0xb34200f5,0x768e1f47,
  146591. 0xbbd4c6f3,0x3cfdcc5e } },
  146592. /* 182 */
  146593. { { 0xb523e13d,0x536c2a86,0x2920d0a0,0x1014a458,0xe7571296,0x3d52b478,
  146594. 0x7eb51bea,0x05746066,0x87b0e919,0x709f7861,0x686888e8,0x028aed88,
  146595. 0xd94afcd4,0x79a809d7,0xe2129af3,0x50c6032f,0x983c4082,0x75e4be72,
  146596. 0x7ab3be8e,0x98331bbb,0xb618c728,0xd31a032c,0x3f59c4a4,0x36dd85a1,
  146597. 0xed4f61e2,0xdbece345,0x1e571715,0xba7aaccd,0x64a1ebd7,0x138c58da,
  146598. 0x3d1aeea1,0x89296d0f },
  146599. { 0xcca82c97,0xb165288f,0x1427e8dc,0x26c6c12d,0x4c3edda9,0x66a94f07,
  146600. 0xeaa01ebe,0x94600e1e,0x30f5e86d,0x14abce7c,0xcb456a31,0x741d7020,
  146601. 0x279f42c2,0xab05aa13,0xd4238468,0x70b60faf,0x318d39e6,0xa18efec1,
  146602. 0x8920b318,0xeb07f1ac,0xd8399e03,0x01e3cba8,0x3c81a301,0x65f8932e,
  146603. 0xccc667d8,0xae8bca7d,0xa268607c,0xcee1ae79,0xcac0a12c,0x3182e64c,
  146604. 0x2b1a4c54,0x9233a2f7 } },
  146605. /* 183 */
  146606. { { 0x0acbee17,0x717e8df6,0x5c24fcdc,0x0f0959c2,0xe54ffcb0,0x46f09887,
  146607. 0xd285116b,0xb993deca,0xbba1fa51,0x0bfaa4f8,0xd0f2183e,0x9c9249ef,
  146608. 0x96847779,0xf93cb358,0x2322d421,0x284bfb7f,0xd42af009,0x40cc709a,
  146609. 0x9bb1d615,0xc69f2274,0x717c3c6a,0x76f50b3a,0xbb9c5eeb,0x8b21e985,
  146610. 0xa4783b5f,0x58fb19ae,0x52e1c3e7,0x04c86b9b,0xf2971ac8,0xaca59092,
  146611. 0x21ed8291,0x2bb26a69 },
  146612. { 0x15f81416,0x98a34435,0xaaff5bb4,0x086e72e7,0x0317261c,0x3d1f64de,
  146613. 0x5c0a1cfe,0x31c0786c,0xb3683401,0x542ea4d8,0x1a39b4cd,0x2f77273a,
  146614. 0xcbef27f1,0x14fe7ee1,0x16bb27dc,0xee7fc09e,0x410e5dc7,0xc0dccc17,
  146615. 0x1943b3dd,0xa3466742,0x3f31c1b7,0x92934b60,0xc22c1070,0x0186ded9,
  146616. 0x799f966b,0xa37ee8ba,0x249b0893,0x0f3bfcb4,0x2e92d4de,0xbae61447,
  146617. 0xe196eb08,0x937cb3f8 } },
  146618. /* 184 */
  146619. { { 0x16fbfdce,0x57c0e77c,0xc98d4cc0,0xea034cc9,0x42572d20,0xe7606d72,
  146620. 0x0019a83c,0x9861b55c,0xf1597162,0x80ba2803,0x05a0fd7b,0x0f4141dd,
  146621. 0x4b0daaa2,0x8865913b,0xaa3848ec,0xe6685746,0x3e0485d2,0x16d15a5a,
  146622. 0x3b6905dd,0x81c0c774,0x818af2ba,0xcec31b7d,0xd2b74b78,0x80d8f194,
  146623. 0x543e2f28,0xca659db2,0x9fb07c1c,0x31b83a7d,0x1f1048c0,0x86537fdc,
  146624. 0x78586a11,0x4d57bb07 },
  146625. { 0x53b396b6,0xbc4b768a,0x93b51dac,0xbc8b24c4,0xa30ae1b3,0x33e511eb,
  146626. 0x945147c5,0x893bbd95,0x179fe3ce,0x6cc86031,0x3f920bd4,0x34b0a167,
  146627. 0x6b256160,0xb32912eb,0x9d168d83,0xbc69a2a4,0xef0dd128,0xb4949e7a,
  146628. 0x872699e1,0x2613419a,0xbf21376b,0x06c58477,0xa4f97147,0xe55b1909,
  146629. 0x7b9b745f,0x63d6eb75,0x08df3c85,0xb5365b29,0x55fcfae3,0x0e257e43,
  146630. 0x979f2aa8,0x1067c118 } },
  146631. /* 185 */
  146632. { { 0x32bf8883,0xc8455084,0x6fd06667,0x4755286a,0x77c2335d,0xd70b0f8f,
  146633. 0x2f4a2c94,0x678e60da,0xd118acf5,0xa468d8ac,0xbf5b90d9,0xce93830b,
  146634. 0xed4e9104,0xea4b1c74,0x27776ea4,0xac67316d,0x361bab12,0xb98ad75c,
  146635. 0x99122451,0xc323d482,0x530a43ae,0x26440220,0x3292d5a5,0x3a44532e,
  146636. 0x5fecf1bc,0xdb48694b,0xc667b8b8,0xe4e0516e,0xa4306ade,0xb3aa595f,
  146637. 0xf34e9725,0x7e4f7091 },
  146638. { 0xb7f70919,0x3f3816e9,0x16b003f5,0x765216ed,0x778c99e5,0x46c6cff4,
  146639. 0x30a51810,0xe6a5abe8,0x45e728db,0xef6f49e6,0xcaccefd6,0x6fdd73ea,
  146640. 0x8c37f3f7,0xec394e6f,0xb6407fc3,0x73320802,0x96625cbd,0x988e8f7a,
  146641. 0x7cabfb00,0x83292363,0x407f359a,0x258ba9df,0xccbfae50,0xff01aee5,
  146642. 0xfe251813,0xfbeaeace,0x83f1cba1,0x9c69f161,0x9eadcdb5,0x512c58ad,
  146643. 0x6ccce8bd,0x2ae49cd4 } },
  146644. /* 186 */
  146645. { { 0xc40849f2,0x1239b0e3,0xa441098c,0x5136a4cd,0xe547f649,0x61535a99,
  146646. 0x7a9bbac6,0x92e4bdc4,0x53547af6,0x195a1646,0x8b47a74a,0x85ecb319,
  146647. 0x9de6a2b2,0x278553fc,0x0e2ba52d,0x471c038a,0x35bcba93,0x12ba1b88,
  146648. 0x6f31eca2,0xd4bf50da,0x802b32c6,0xd146e3f6,0x3c64c8c4,0x0c9c0131,
  146649. 0xeed21297,0xad30f12d,0x9c68530f,0x9b75bffb,0x8918de51,0x23c0ad3e,
  146650. 0xa73771b7,0x180e9d52 },
  146651. { 0x29ab77b0,0xc316542f,0xf7aee628,0xdd411d9c,0x353c2f40,0x044c0685,
  146652. 0x4b0ae4cf,0x638dc7e4,0x95fc266f,0xa0924185,0xfd2feb7d,0x639da671,
  146653. 0x5ea39798,0x56858ed5,0x58f3832a,0x7a694f31,0xd316d831,0xa94233c6,
  146654. 0x30a35a7b,0x2fcacb26,0xf1ff713b,0xfef8f7dd,0x59eee2f3,0x8b9b4525,
  146655. 0x156d064a,0xd1b4f91b,0x2f5cfcfc,0x177866c2,0x3777eb41,0x12bc2566,
  146656. 0xd8ab85b4,0x21ca6f3c } },
  146657. /* 187 */
  146658. { { 0xa3e66635,0x0e162b13,0x2a9f76af,0x1ef20a2b,0x46db3356,0xab473a30,
  146659. 0x7802bb8d,0x0840bd77,0xa699b44c,0x5b6baf5e,0x1b2207f1,0xc6e11900,
  146660. 0x790b0105,0xe5de16a9,0xdb67f004,0x22b12f15,0x8a025d25,0x185fad45,
  146661. 0xdf0a1142,0xbccf6953,0xf45034c0,0x4c42129b,0x1c277bff,0x0f740400,
  146662. 0x280a9e18,0x6e440b4c,0x842aa2b4,0x767de8f5,0x05e8d94f,0x3de20ab8,
  146663. 0x20227635,0x5aff5859 },
  146664. { 0xa8458e40,0x805acd20,0x149732bd,0x5a5557d8,0x5f1ca72d,0xc7074131,
  146665. 0x952b5323,0x7f2e269c,0x6494fadf,0x5c592556,0x1a7d2666,0x153b7acd,
  146666. 0x86fe2865,0xa6df063d,0x57d53b6b,0x1e91db13,0xe93ead01,0x9195bb89,
  146667. 0x2963bfe6,0x3d71e1af,0x88278886,0xfab2b9c2,0x3b859b6f,0x77836692,
  146668. 0xf7029dd1,0x6e695174,0x7b984561,0xc7987876,0x5907d849,0x64fb4f1d,
  146669. 0x88d8a977,0x3eab7e1c } },
  146670. /* 188 */
  146671. { { 0x52e5718b,0xc73a94b6,0xf4cee1e9,0xe3aefa54,0x553eedea,0x654e9e63,
  146672. 0x5f3aca1a,0xf2541e1b,0x0d083316,0xd7129489,0xfb7f950e,0x7965af63,
  146673. 0xc74e3e4a,0xd8fc9e0d,0xeaf79ebc,0xb4ee48d2,0x8b7787e6,0xa458a86a,
  146674. 0xf7cceaf0,0xd8c7621f,0xdf67980d,0x8228eeff,0xf9106727,0x210d4742,
  146675. 0xb07e3629,0x91f63501,0x7971e29d,0x441761c6,0x03a3b8a5,0xc0ccc65f,
  146676. 0x38e09544,0x3491da4f },
  146677. { 0xcb062eae,0x6706d046,0x5d08776d,0xee7db735,0x292315d2,0x80de8052,
  146678. 0xc402bbdb,0x40785662,0x26ed3337,0x5f93525c,0x7d568ed3,0x6cea14d6,
  146679. 0x66888b1e,0x916a1189,0x5dc71675,0x0fbd5205,0xe4575df2,0x833d1077,
  146680. 0xec092335,0x4e93100a,0x6cd85389,0x2f9e1d01,0x43226368,0xeebd3725,
  146681. 0x1ba4cfd7,0x401d172b,0x574c5838,0x377dab9d,0x80d517de,0xaeaa6958,
  146682. 0x6ad15a18,0x0c843dfd } },
  146683. /* 189 */
  146684. { { 0xc9373300,0x455811ff,0x99fdc300,0x1c39332a,0x353cb655,0xe19bb81c,
  146685. 0x96a83d27,0x774b924a,0xb2ee3f1a,0xcbfc8fcb,0x010d56c7,0xaf278ec4,
  146686. 0xe0abaf79,0x6fde682f,0x7339aebf,0x7566d072,0x71205db6,0xbd35ad5d,
  146687. 0x7051c9d0,0xb5bbe694,0xd3a3067c,0x577db480,0x572d7530,0x2c70ff54,
  146688. 0xe06d853d,0xe8615aec,0x05abfb5d,0x71999ccb,0xea0a8ed7,0xeeefc96b,
  146689. 0x35f6df69,0x2dcc469d },
  146690. { 0xc65f0e77,0xcca6cd06,0xbd71b14a,0xddcc7980,0x3c93cc00,0xb6221f8b,
  146691. 0xae8cbf57,0xddfcd5b3,0x76f8e63f,0xbc92973f,0x06e132b7,0xe9848a34,
  146692. 0xd51ec9e2,0x4cc59a03,0x3a33081a,0x9c9d32bb,0x80e8466b,0x00121052,
  146693. 0x1bbe7295,0xc2b0032a,0x24938448,0xdbfc6572,0xb6bba0ff,0xe972a0ce,
  146694. 0xc0a94802,0xf60c0a4f,0x599d8bc7,0xf62c41cc,0x312da0b8,0x820c96ee,
  146695. 0xcdbdf9fc,0x5a1a65db } },
  146696. /* 190 */
  146697. { { 0x42485684,0xbfba691a,0x29c470c9,0x613116b9,0xe62a0519,0xb4b01971,
  146698. 0x5ff499da,0xf3245aa6,0xa5238eff,0xc2ef87f4,0xcc9d5515,0xc16dc6ba,
  146699. 0x2dbdacac,0x5a7f227e,0xa9bbaecb,0x8dedaac4,0x2e7c9885,0xff308a6d,
  146700. 0xe6895593,0x4c6f2fc2,0x177e0611,0x3655f285,0x300b1bee,0xa63e8d06,
  146701. 0x13c17b54,0xbed0ce79,0xc4974262,0xca4abe35,0xbc4e4037,0xf4b44a17,
  146702. 0xefe5fbd9,0x5ae95099 },
  146703. { 0x804f7455,0x122e5ee7,0x22066682,0x341a4997,0x7795e333,0x97d24c31,
  146704. 0xe48efced,0x12f4123c,0x19fbc21c,0xe8738d92,0x0663a3ae,0xbb3bdc61,
  146705. 0x8593a6db,0x3603d8c2,0xe3c1ac75,0x926227f2,0x5eaae519,0xfea92ac0,
  146706. 0xfd6812ac,0x5b596f0b,0xfc2a82dc,0x3ce7e844,0x63522b27,0x3840481a,
  146707. 0x52867895,0x836088b1,0x26588688,0x21ffb7cc,0x2f4a7cac,0x0ca33161,
  146708. 0xa3edd298,0x4110667e } },
  146709. /* 191 */
  146710. { { 0xc2d04b63,0x81830357,0xf4929a18,0x3fc5a34d,0x22d195df,0xc73bf6da,
  146711. 0xcb432473,0x14df2f89,0xe997f138,0x345afe5c,0x8b9604f4,0xd8e3f5f9,
  146712. 0x50c10ae5,0xad7942e9,0xeed25ff3,0xcefd5447,0x0e73c0cc,0xbf68e51e,
  146713. 0xab54fa4c,0x5b1ad591,0x12b61c8c,0x8bbc1105,0xb5abf760,0xbb932913,
  146714. 0x01e79649,0xdb1231be,0x040ccbe7,0xd0a83e91,0x90a96db9,0x3dde426f,
  146715. 0x34df11ea,0x1cceb645 },
  146716. { 0x0c6d0f55,0x2d210c4f,0x9c673c9d,0x6cadf61b,0xa9ce3fbb,0xdd7f9919,
  146717. 0x93b063e4,0x135f494c,0x145a93be,0x580bdb3c,0x0f52ef7c,0x4d872332,
  146718. 0x8814bb6a,0x74d876e8,0xc7a97dee,0x4f6f723a,0x3e3cd833,0x7de2b8f0,
  146719. 0xae720270,0x6162f082,0xddfa486e,0xe88ec2d4,0x8d3a17c6,0xd965c859,
  146720. 0x3980171a,0x62e59e54,0xbbef6b22,0x0ab6285d,0x4d48b203,0x3cf45195,
  146721. 0x4ea25ea3,0x1f175233 } },
  146722. /* 192 */
  146723. { { 0x3467ea91,0x808a765b,0xfd2d9c45,0x3f4632ee,0x9cf2bc6f,0x7b75dc6d,
  146724. 0x359813ae,0xefc8d240,0xe44cbd8d,0x23ecb209,0x21525622,0x59ba10e3,
  146725. 0x3f1ee19a,0xfa14d934,0xfb0c48f7,0xdf97c21b,0xea30d437,0xc4e62890,
  146726. 0x651475c2,0xb286e2a4,0x126672a5,0x291f01e4,0x31aab3b8,0x9c6fda5c,
  146727. 0xe17d22ec,0xb7277a5a,0x914f0bad,0xbd88ed83,0x6a2392e1,0xd0b05d1b,
  146728. 0x65893c2b,0x4cb8af90 },
  146729. { 0xbb4b1953,0xa2b02057,0xf597f6ee,0x4ce08b44,0x5e6412c8,0x854f5d9b,
  146730. 0xb3cd4919,0x1913262d,0x6e42bb5d,0x902762e4,0xd78e7f60,0x8355c8e6,
  146731. 0x38b6c16c,0x8efaa824,0xe550f618,0xd0173790,0xe57d778e,0x118af462,
  146732. 0x715b4714,0xa16ad5e8,0x41dea4f9,0x900596c3,0x280ca610,0x2a957c32,
  146733. 0x374c65a1,0x2faee800,0x50080414,0xdb105127,0xff080fa1,0x8c1db931,
  146734. 0xd79878fc,0x486a5c25 } },
  146735. /* 193 */
  146736. { { 0x941b4f36,0x0521e213,0xf803b4f9,0xbaacfb14,0x52a54ba8,0xfdf1e22e,
  146737. 0x8fe4796c,0xacfabbba,0x58dbacb6,0xae0788db,0xc19dfa51,0xdf98d736,
  146738. 0x35a716ee,0x155c286a,0x9c86461b,0xbe7d4676,0x63a64a5e,0x50b6380f,
  146739. 0x9f609262,0x14b41914,0xa2dfc5b3,0x0919a7d0,0xcef466ac,0xc454da55,
  146740. 0x6986aaec,0x93fa4a24,0x71a49ced,0x5090b171,0xc1fa75ad,0x602f1d6c,
  146741. 0x78e4c054,0x5d269f89 },
  146742. { 0x14920419,0x3a74030c,0x90968739,0x0845d868,0xeeb70fa6,0x81b994c4,
  146743. 0xd9fc5bcb,0xabcaa06d,0xf58f8f2d,0x06539427,0xb1dc52aa,0x35c85f67,
  146744. 0x2c911baa,0x5a7d8d72,0xaec2d834,0x4041005c,0x7a8e5347,0xb5868a44,
  146745. 0x8de512c3,0x04ee180b,0x211168eb,0x4daa66e5,0x2317cd8a,0xc0bd5dab,
  146746. 0x61164df6,0xa1d4185d,0x1dbad7c9,0xacedca26,0x09b02683,0x0fe4b5ac,
  146747. 0x26d9550f,0x8ac9995a } },
  146748. /* 194 */
  146749. { { 0x2640a39d,0xb2c8dc9b,0xede0c9f9,0x21ff0b38,0xa1ecba0a,0x74f469bd,
  146750. 0x080d0417,0x8a902ccd,0xf4994604,0xe956fa32,0x9776ab15,0x348f85cf,
  146751. 0x0066f492,0xc21fc6ee,0xfeeef367,0x35b1ebfe,0x4613e5ed,0x7804581c,
  146752. 0xea6ba071,0xcbdfe8e6,0x950d73ed,0xddfcaa32,0x1da48889,0xc9747936,
  146753. 0xdbaffbd1,0xce867c8c,0x1cbaeae7,0xd267431f,0x897912c8,0x68255045,
  146754. 0xd7ea1e4d,0x0c7c1ddc },
  146755. { 0x1ce963a7,0x53aa30cc,0xc4c5fade,0x7352f64c,0x2828afbf,0x2b9aa2f8,
  146756. 0xca212107,0x64273c56,0x85a576dc,0xaadd7654,0x90b5c77c,0x6196ac3e,
  146757. 0xd1aaf39b,0x20d43e9f,0xcd05cbc4,0xfc392062,0x4c0ff2fd,0x14163872,
  146758. 0x2ae821e6,0xcf32b8d8,0x3fa7a3f0,0x5f58f943,0xf644ca92,0xaebf1d2d,
  146759. 0x1918a75f,0x0c061563,0x6b876118,0x7989b5ed,0xad412441,0xbf342445,
  146760. 0x1df633ab,0x24ffc9ae } },
  146761. /* 195 */
  146762. { { 0x93c7cb2b,0x89fcdc05,0x590053fb,0xc1243b95,0x6182343c,0x601debcf,
  146763. 0x66c18a63,0x364546ef,0xec913287,0xa5290701,0xf9788c31,0xc35b8026,
  146764. 0x92d1f7d7,0x852b862a,0x0aa79728,0x1809cb05,0xa3cb2005,0x897d467c,
  146765. 0x9ef5b946,0xf20c77c0,0xf2241984,0xc3372c42,0xf35bb206,0xda053e0d,
  146766. 0xa9c140b5,0xbc26c6d0,0xcb56fb33,0x61cfcc0c,0x299b3968,0x1c3cf9ef,
  146767. 0x40621ba4,0x89e4d3d1 },
  146768. { 0xa45a9be3,0xd35e80e7,0x07356fbd,0xc4daa578,0xb967bc2f,0x0186d62e,
  146769. 0x47cd16e3,0xa702679e,0x5f30ce9b,0xca2f1c02,0x1f864f50,0xf1205b46,
  146770. 0x85061d66,0x7fd6d797,0x8a08809e,0x47edc4f6,0x9a4d3ae2,0x5dac0449,
  146771. 0x6d1f9da8,0xf844664a,0xd7a83a71,0x9f30ce84,0xeaac33f1,0xe9382bac,
  146772. 0x948622ab,0x1f033831,0xf7681eb2,0xb037a4ba,0x99a1b5c7,0xd156a908,
  146773. 0xe6f1d0fb,0x675d3e6f } },
  146774. /* 196 */
  146775. { { 0x707193e5,0xd9767ffd,0x810358e5,0xe478aa91,0x328d8ef7,0x5634f9ff,
  146776. 0x6dbbd9a7,0x913a0ee8,0x7e215686,0x379b2968,0x89d9da38,0x903f410a,
  146777. 0x1b1334d2,0xd9f8d7b9,0xbd82efb5,0x9fe74229,0x3803c778,0xdb568b62,
  146778. 0xd3d25344,0x93e9a350,0x724497e8,0x559c35b0,0xa169e23b,0xc472d436,
  146779. 0xcc5b4c69,0x09864632,0x83c7f531,0x9f6d759d,0x1e497888,0xa91cf1db,
  146780. 0x60af1a4b,0x5f7f92fe },
  146781. { 0x0545167e,0xf18a1cc6,0xaffa88e0,0x55ee2e02,0x432a7bcf,0x24cdff51,
  146782. 0xa7510866,0x7382da42,0x40511af7,0xe894c11f,0x2aaf1423,0xaa4e4e31,
  146783. 0xf63dd2ae,0x8c3d36f0,0xd7660635,0xfc5c9550,0x37ea7eab,0x01253731,
  146784. 0x39b950f6,0x2a5cd598,0x40e63442,0x95a0f601,0xf2ac7045,0x905e238e,
  146785. 0x446b0f73,0x44bacc0e,0xc448578a,0x4cd4206e,0xa5bd7803,0x367b1aaa,
  146786. 0x0a2b458d,0x25beced9 } },
  146787. /* 197 */
  146788. { { 0x0c33a8fb,0x079a7382,0x0f25dc1d,0xcfbf6cd1,0xc6d482b6,0x4ffc73f8,
  146789. 0x07bf844a,0x3e51f18c,0x599162f0,0xa7651236,0x14013811,0xac59a74e,
  146790. 0xe55018a0,0x957a6865,0xe3ca09b1,0xe1ec51bd,0xa960253f,0xbc0c7eb3,
  146791. 0x7de03f84,0xe83bfd14,0x52fbdb09,0xc0540ed1,0xcea15ec1,0x6ba52edd,
  146792. 0x4b261307,0xf3d30ed5,0xe8397206,0x9bd7bae8,0x096373aa,0xf20d8692,
  146793. 0xc3b0bf63,0x0a616a4b },
  146794. { 0x6e1339c9,0x2075f3ed,0xbf8b00a6,0x7afaa072,0xbccd9b47,0xdfafec82,
  146795. 0x00ca54c7,0x4713158f,0x38bc31ae,0x449102f1,0x310dfc8a,0xaf98f158,
  146796. 0x59e954d4,0xc9ef2075,0xc527a0c4,0xe8021af9,0x7a192023,0x6e801277,
  146797. 0x7fb02377,0x635f538c,0xe8c9e951,0x5df1974f,0x15cc9097,0x0287faed,
  146798. 0xf7a5115c,0xfa0728f0,0x0fac623d,0x90dbfbe6,0x0311ba09,0xa8d40fd4,
  146799. 0x07c6464c,0x876d154e } },
  146800. /* 198 */
  146801. { { 0xc2d3ea8a,0xd3a4d6d2,0xa842600e,0x36be681b,0xe4070672,0xc53f100d,
  146802. 0x6a7d7a7b,0xe3e5b6fe,0x5d5e1a83,0x6e6994f9,0x76097c2a,0x07cacd22,
  146803. 0xa6791011,0x12d98dba,0x102e0e24,0xddfc4461,0xd493272a,0x4815dbc2,
  146804. 0xa9436696,0x7e38e64b,0x32b2bf90,0x4960eb1a,0xd928e28b,0xda457525,
  146805. 0x2a077c9e,0x72f75b39,0x7fd61d00,0x27760cbb,0x0f4b1456,0xaf235d1b,
  146806. 0xe76d1700,0x3040c23b },
  146807. { 0x4efa9a70,0xb10dc55b,0x53e86610,0xd4de414f,0x09f8a27f,0x3d95c113,
  146808. 0x06661d3c,0x505109a5,0x60eb513e,0xcaa2994a,0x1e7d338b,0x3ee41537,
  146809. 0x4651e71f,0x4fd145fc,0xcbc313b4,0x51bbf838,0x1eb92150,0xb039e078,
  146810. 0x14bf5ac7,0xe8696b44,0x8be0d48c,0x2d667188,0xdd8f2b6f,0xbe93b2f5,
  146811. 0xeb8a7f8a,0xc1dfd1e7,0x90f751c5,0x862b3dd9,0xa32a74be,0x1eb1ad58,
  146812. 0x1ebbc9a2,0x5486d79a } },
  146813. /* 199 */
  146814. { { 0xa1359e13,0xcb2e34ff,0x28196051,0x202d8dbf,0x23564b5e,0xe95e023d,
  146815. 0x42f6ac12,0xfb1340b6,0xb653725d,0x543ba852,0x8d2466ad,0x81aedcd6,
  146816. 0x547c728b,0xbf780224,0x9569fb65,0x559f8a11,0xdfb22ec9,0x505b7a62,
  146817. 0x9eed5e52,0x07107540,0x299f6f11,0x9c899288,0x3db6f8c7,0xa7d69261,
  146818. 0xb3ca79a9,0x30eb7fb3,0xfb2160b0,0xcab99bb8,0xd28b409a,0xd2012568,
  146819. 0x5ac45f8b,0x380f1b0f },
  146820. { 0xe6a0068f,0xc0b99e6b,0xc8a73753,0x4b67cf2a,0xb2faeb7c,0xa6c9a548,
  146821. 0x340260c3,0x7f417f99,0xcc0f739e,0x8ee56855,0x780949da,0xf08b510f,
  146822. 0x8d5c6eff,0xb1770fc2,0xfd96a7bb,0xb4f5abee,0xf2665a2a,0xa07b1136,
  146823. 0xb601dcf9,0x2fb380a4,0x162becc6,0xcc803614,0xee6b83b3,0x3498fb96,
  146824. 0xa8c17eeb,0xea9b0fd6,0xa177efc2,0x5834b5ba,0x5b110b3e,0x929044f5,
  146825. 0xebd7285e,0x4abedded } },
  146826. /* 200 */
  146827. { { 0x700ef376,0x3355e1b9,0x66cdabff,0xd56e5d9a,0x47e87646,0xb3dc2575,
  146828. 0x00f79369,0x28f44b8a,0xa0c52e29,0x08c32b1e,0x3729b392,0x5a78de12,
  146829. 0xb26d239d,0x4184519a,0xe0ce4a6b,0x23f6b4b7,0xacb2a9f9,0x235f6f8a,
  146830. 0xe2064a59,0xbb8bc454,0x1bf3062e,0x37efd034,0x94dff6f9,0x6bac683b,
  146831. 0x8aa7fa06,0xc3364b1e,0xce0b3745,0x0616772a,0xd1e3fb0f,0x46f08d08,
  146832. 0x18e132d3,0x6a20abb3 },
  146833. { 0x6a85cbc7,0xea831016,0x934f9aa7,0xd0990946,0xe778f1b3,0xc2211088,
  146834. 0x2247b799,0x7ea4ff8f,0x454484ce,0xb3171d71,0x4f98c364,0x29403949,
  146835. 0x97df1458,0x5da911f3,0x09439116,0xa6b58093,0x174238bc,0x75f9509a,
  146836. 0x8209758d,0xfeb51821,0xa47925d0,0xae0c6021,0xaf8a315e,0x0e946694,
  146837. 0x6bad04b7,0xae7af8a3,0xf072447d,0x44c15e7f,0xa5456ffe,0x5184668a,
  146838. 0xbf36b977,0x45e353a7 } },
  146839. /* 201 */
  146840. { { 0x93092f71,0x76056764,0xf5b92d71,0xeb66b6c2,0xe2c8b6c5,0x9db3149b,
  146841. 0x20c0363e,0xf62f583a,0x03cd7097,0x688acd33,0xebb916ac,0x85d0c0f8,
  146842. 0x84c19b0e,0x1bf7462c,0x7c4a6ad1,0xc76ed5f9,0xd119f369,0xec8b88ba,
  146843. 0xebe50b83,0x59b8371b,0x866706a6,0x0cc69508,0xf8373d2c,0x531c75a3,
  146844. 0x2a5a02fb,0x4e1cd3a3,0xda39a1d0,0xe8274778,0x75da333e,0xedfc5bbb,
  146845. 0xca79bd36,0x15941f24 },
  146846. { 0xa77dd512,0x42e8c0f8,0x1dc365f6,0xa91b59a7,0x08753862,0xe80d14cd,
  146847. 0xd272faca,0x1624230d,0x4027cb5a,0xeea3ec16,0xc1ef9f03,0xc1700b59,
  146848. 0x0da3148d,0xd411c127,0xc4181af1,0x801ee448,0x9e3a900b,0xedf28559,
  146849. 0x0d09affd,0x5d67b0bd,0x8b370024,0xd839df96,0xe6f836b8,0x3b6307e0,
  146850. 0xbd3201c9,0x5382e588,0x7a1d02bb,0x636d8a6b,0x968641e9,0x70b7db76,
  146851. 0x118fad03,0x6d17c34a } },
  146852. /* 202 */
  146853. { { 0xc181c99b,0xcf608841,0xc87bdcaf,0xb65dc901,0x3720dabe,0xb460b447,
  146854. 0x5377515b,0x4c79c396,0x0a96c277,0xd447f22e,0x2ac0f440,0x0d952130,
  146855. 0xc90583ad,0x8330b26b,0x928904a0,0xe25e977a,0x85c50b18,0x1deaffd9,
  146856. 0xa5ad5f6a,0xcf4dbcb7,0xc8a37ed5,0xcbcd0019,0x1e9850b6,0x7846dd90,
  146857. 0xb0b8e605,0x1ac8194a,0x34132f90,0xb9728571,0xf56ee28b,0x4ce9f149,
  146858. 0x3e9e1d4e,0x1ab9b5a4 },
  146859. { 0x314fa7a3,0x206dab92,0x478ff963,0xcc4af0f0,0x904d9fdb,0x4cce1713,
  146860. 0x12c045fe,0xac20a2eb,0xfd8f6d7d,0x44fc5478,0xca7b6ffa,0x886e72c5,
  146861. 0x6fd6f758,0x7fa4529b,0x92a820d5,0x4df1d1b1,0x2789f149,0x3d812f9f,
  146862. 0xaabb53d2,0x9842f083,0x2a03ab32,0x2648539b,0xb1512502,0x631ce090,
  146863. 0x731f6bd5,0xe1294d15,0x9436e634,0xb229361d,0x3ca966af,0x8c4281c4,
  146864. 0xc21ab3ed,0x24b34956 } },
  146865. /* 203 */
  146866. { { 0x659824e2,0x49bdcb86,0x4e13e74c,0x6dc4ce48,0x6bbe1eea,0xa4c01a26,
  146867. 0x1e3ec457,0x47b2b8e7,0x2f5a8e4b,0x7e8b15e0,0xe333530d,0xe81eb6e6,
  146868. 0x17a45202,0xacba369e,0xd70e4c9f,0x81241431,0x3e12beb8,0xc190af4b,
  146869. 0x11f486fd,0x53270523,0x29fb2bce,0x9f6c41e1,0xb70f6c08,0xbe6287eb,
  146870. 0x3feb4477,0x1479850a,0x9bcf18bb,0xfcfdfb11,0xda80d040,0x925c292f,
  146871. 0x7e3c5bf9,0x212d65e5 },
  146872. { 0xca15cf08,0x23adb386,0x81e172eb,0x4dfa4ac4,0x4d42d0c0,0x9d1dbf93,
  146873. 0x74404dc7,0xd9cf6073,0xe932bfcd,0x60508441,0x1c682a98,0x9ae910ca,
  146874. 0x41ac1cc0,0x9528fc18,0xdbbed630,0xe6a120ae,0x30ccf250,0x94e0e1ec,
  146875. 0xe58bbf2f,0xfe84ba54,0x9faa4415,0xc66d0b4f,0xecee7ce5,0x0c58f1e7,
  146876. 0x6fa6873a,0x7a1d43eb,0x399f1348,0x96c6c5a0,0xe6727ab7,0xe6ef9aaa,
  146877. 0x9a5c2447,0x66afa554 } },
  146878. /* 204 */
  146879. { { 0xc980e91d,0xda5aaba8,0x6ac98efa,0xa93cf509,0x8da32662,0xb0990e0a,
  146880. 0x0081453e,0x01d21530,0x3d71de84,0x2bb0d33e,0x3e19a012,0x465f6d80,
  146881. 0x78a838e7,0x5902ff4c,0x1931348c,0x74e2afb7,0x9cfb057b,0xa4932757,
  146882. 0x3ad03f8f,0x761ea642,0x58ffa40a,0xb7d4c245,0x77a87e30,0xb5e9c0d9,
  146883. 0xc9c84d26,0xd1c5edba,0x3d1963a0,0xeca8839a,0xebf6bf0d,0xbc6f2f35,
  146884. 0x0d58abdf,0x01ef0631 },
  146885. { 0x3ecdcbb0,0x2bf90316,0x27c1c955,0x19e2d728,0x9575c930,0x9e527030,
  146886. 0x96983930,0x0dc1c5a9,0x7cd082df,0xef9f80ff,0xdf97e051,0xcd915075,
  146887. 0x9cc61b55,0xf286fffe,0x80f24cc4,0x352db38f,0x36523ae3,0xed9b99ec,
  146888. 0x10b104a9,0x109a8ca8,0x305203ad,0xc2700fe7,0x769400f5,0x2a2ee24e,
  146889. 0xee0c452c,0xd595d399,0xf7f02a41,0x0ab75d6a,0x0db730b7,0x34108099,
  146890. 0x5e8d1202,0x0e4f5ffd } },
  146891. /* 205 */
  146892. { { 0x0ff14c38,0xbd1c6444,0xaece11f2,0x9a5b59fa,0x22af6330,0xaa4605a7,
  146893. 0x82af24ee,0xddc9f65a,0xeb9a1159,0xf4ee4bfe,0x74e84eaf,0x2463d076,
  146894. 0x0e0baace,0x88cbe1e0,0xd5fabdcb,0x7ca568ea,0xc57eb99d,0xbd80d524,
  146895. 0xe9be9873,0x9c46572c,0x7300b85e,0x918a1dcd,0x40f54176,0x49221312,
  146896. 0xb5b14236,0xf7e324ff,0x2434f16a,0x40dda501,0xa133d97c,0x08833421,
  146897. 0x0876f020,0x33d41161 },
  146898. { 0x9878e5ec,0x7531a36b,0x46918232,0x5de3e321,0xd0a30464,0xd15f9a33,
  146899. 0xaa173659,0x734c1b87,0xf925d4fe,0xac2094a2,0xc262b0f4,0x43c965a1,
  146900. 0x447d5cbc,0x759c903e,0x05239300,0x92af215e,0x1f593f34,0xfffb6d5f,
  146901. 0xc3cddb5f,0x65943b4b,0xbfdd5408,0x9d03a29c,0x198d76c0,0x8f7cda6b,
  146902. 0xc0f27b59,0xc0790a22,0x8cb58ccf,0xba557a84,0x76c54fdc,0x5922052d,
  146903. 0x47b6b466,0x2d3de7aa } },
  146904. /* 206 */
  146905. { { 0x65add3b7,0xaade7462,0xabf24c2a,0xe5888f35,0xe1a57d93,0xd41549ca,
  146906. 0x2c76f7bf,0x0e22e18e,0xbe3202b3,0x67f288ea,0x1d1d0f0a,0xb79a66ba,
  146907. 0x2881ad18,0x0e0ab749,0xc7adb0e9,0x7d424086,0x2842132f,0x870c32c5,
  146908. 0x58f9a09e,0x858477f1,0xec025589,0x422a9372,0xa5098777,0xbe428c5c,
  146909. 0x57660058,0x45b79564,0x957f37cf,0x6c7fc631,0xd6316289,0x8b7023dd,
  146910. 0x5b1c12a6,0x47003bb6 },
  146911. { 0xc91c1c96,0xd99401c1,0x27a12970,0xaa5dcdf9,0xc3c29107,0x3ab92e17,
  146912. 0xa3fe4710,0x26fce8f7,0x4ee998ee,0xb0d09d5e,0x8e3a41f8,0xafa62204,
  146913. 0xa26ca506,0xb1c012a5,0x99b57252,0x2c6f734c,0x512f7fe1,0x1093d79f,
  146914. 0xacee19a6,0x2f30906e,0x056d1ea6,0x6bff8381,0xeff35f21,0x61c75856,
  146915. 0xc1ad2224,0x6e07e978,0x6b20fde8,0x2cca6ca1,0x633fe81b,0xab4d6d2d,
  146916. 0xb06a2ce6,0x73dff504 } },
  146917. /* 207 */
  146918. { { 0xd8e20fb8,0x8b615805,0x82b533f0,0x7c6873e4,0x56a854ca,0x5205f001,
  146919. 0xcb369211,0x87fec6ac,0xc7f092b7,0x1fa3c0ec,0xe845fe4c,0x5b36647e,
  146920. 0xf8b1f112,0xd4781e85,0x8b0f1a6f,0xc6526839,0xdcb8eb92,0xceeb8c6c,
  146921. 0x8e5f6d52,0x133f0ead,0xc8d934dc,0x31883e23,0x428ac45a,0x214ed5bd,
  146922. 0xdbbfca85,0xf77ca492,0x07e5ae13,0xdf4113fe,0x72ab05fb,0x63e4a0d2,
  146923. 0x7148f535,0x7544d0b7 },
  146924. { 0x80797ace,0x4fe8d134,0xaf86d97e,0x216d6aa0,0xef5a68fc,0xdbf0a688,
  146925. 0x9f9b2684,0x18b26f45,0x8999d2fc,0x52fefcfa,0x62423955,0xd5af8d82,
  146926. 0xf63a3780,0x8f123469,0xdcd4feaf,0x2933454f,0xa73b5d09,0xba8018b7,
  146927. 0xe5552c18,0x9af1f276,0xff26bb1c,0xc5d4773d,0x06dd4f44,0x9ef49410,
  146928. 0x5f39ba49,0xad8f12f9,0xf66ca4f2,0x5767f6dc,0x7922f59a,0xba8773f1,
  146929. 0xc1e42d49,0x220081ea } },
  146930. /* 208 */
  146931. { { 0xba37a0ba,0x3043d573,0xdd176df6,0x05a431bc,0xc42070f7,0x03322cfc,
  146932. 0x67c2d109,0x5cabd30e,0xcbf8bcfa,0x362c95de,0x7787b10b,0xd767d277,
  146933. 0x6ec05e64,0x612c915e,0xce69c30e,0x9e669631,0x682e2635,0x27c9dd8f,
  146934. 0x95ffcc38,0x79021f12,0x8a2adca2,0x06a8ee79,0x4b5d500a,0x8e00e784,
  146935. 0x8d80d6c5,0x87746fc7,0x915f10cc,0x246053be,0x219f6fd8,0x844e328b,
  146936. 0x11bd3733,0x620541ac },
  146937. { 0x509e5a29,0x0f7fd382,0xb432531e,0x8748d7d0,0xcd3883b9,0x8f749354,
  146938. 0x8bfbb17a,0xc6b8ac74,0x05f2d2c5,0xa4616a66,0x1bcb1b83,0xb3d96625,
  146939. 0x2fee265a,0xcf753104,0xdb225058,0xc70d73fb,0xf0c2d556,0x1211d434,
  146940. 0x54b259b3,0x862061d8,0xc42b3f7d,0xffe4606d,0xe86a4949,0x4c5c8585,
  146941. 0x160eedac,0x04ddcc8b,0x568e2420,0x1804ce67,0x42141656,0x91f3855a,
  146942. 0xf932be97,0x7f378198 } },
  146943. /* 209 */
  146944. { { 0xdfa6639a,0x9a374bda,0x02ab7391,0x0cbd48d4,0x47031e2d,0x5c5ef236,
  146945. 0xd0599d1f,0xb49ee2bc,0xe0d38443,0xd285eb60,0x269392e8,0xdbbea92f,
  146946. 0xb8bc538f,0x91455fbf,0xe469b768,0xae259ff1,0x41de5682,0xc1cecb1f,
  146947. 0x9952d1ae,0xc876f071,0xe7bf7446,0x1ce25181,0x282ad2f1,0xcb93ad86,
  146948. 0x6ba4ef67,0x8fa3cd31,0xe507aa3e,0xfce68a04,0xa61bb608,0xced74170,
  146949. 0xf6ac10d0,0x6de716b3 },
  146950. { 0x172d6dc5,0xd4e58d04,0x6397c65c,0xbed2cde6,0x0c9eb4e8,0x7ae77e18,
  146951. 0x75fa2edb,0x56275468,0xa91e6738,0x4b30324e,0x235c8b2e,0x6023a856,
  146952. 0xa8f92887,0x9df6d6c2,0xf6f5e8b5,0xec2c185f,0x3ad5748a,0x7892e12b,
  146953. 0xd54aefbc,0x7aebb4f2,0xee868821,0x14915448,0xb1d9bd5b,0xa26c5f71,
  146954. 0x2ff00df7,0xe5ccd166,0xb95b1dee,0xebc99f17,0x3fe1f774,0x90983616,
  146955. 0xbb3d25b0,0x51f90830 } },
  146956. /* 210 */
  146957. { { 0xf2922461,0x49376fa1,0x1650d0d1,0xdbb1b1c3,0x0dd8608d,0x92b91c33,
  146958. 0x36b89906,0x3e612c4b,0xdf560052,0xe1977b0b,0x636a2545,0xf8afff70,
  146959. 0x11723d8e,0xcda7d278,0x81bde7ba,0x0b0bc4bb,0xed2a578e,0x3cb080b2,
  146960. 0x171b2e02,0x5bda0d0d,0x941bb9ae,0xf6df38cf,0xc14a65c5,0x85dd81db,
  146961. 0xc19dd98e,0x7f98c82d,0x52206f93,0xc613747f,0x5f5bbe78,0x9e13a2c2,
  146962. 0x0aa34be7,0x5eed218e },
  146963. { 0x01d4dc0b,0xe1565754,0xf566bb07,0xa1ae5f27,0xb82225d5,0xe985ebeb,
  146964. 0x1189ec6b,0x5f3ad21c,0xecce4d9d,0x17da518c,0xd6b65b59,0xc84a2d3e,
  146965. 0x8ffa771c,0x7f988175,0x2ac69a7a,0x50d6ae12,0xc6e6846d,0xcb7f30b1,
  146966. 0x5bd0bb13,0x8c023a60,0xd73f2407,0x9a10fecd,0xe5f0a996,0x8c5158cc,
  146967. 0xbd8f5806,0xd26bf615,0x915a46e1,0xaf32ea87,0x0287d308,0xeaf74e81,
  146968. 0xa6264254,0x8c14ba06 } },
  146969. /* 211 */
  146970. { { 0xb17ee201,0x0c877895,0x88e57a77,0xc05aa471,0x97822456,0x19c3e763,
  146971. 0xc9c3ba1d,0x0be6f8c0,0xb4389ebe,0xfe85f4ff,0x0ce7fbb6,0x538bccce,
  146972. 0x65266c64,0x876eab2a,0xcf9a3842,0x5c9ac690,0xccc8f981,0x9f5cf3b1,
  146973. 0x9cf687de,0xfa17be6a,0x83835c15,0xfcfc10fc,0x150ef2eb,0x086b0fdb,
  146974. 0x884a52e6,0x9f97ecd9,0xb0cd1eb8,0x416e6fa2,0x3ecc03ba,0xe2bd1599,
  146975. 0xeabb165e,0x645c0a5d },
  146976. { 0x50aa7e31,0xd94c4205,0x2f851da5,0xaec8df0c,0x3c726e6a,0x99646909,
  146977. 0x2619bf9a,0x72dbdc36,0xe253fbd5,0x1b4260e0,0x8c709e06,0x97c259fb,
  146978. 0xcddaec5b,0xfabf7cbb,0xe4b703e9,0xb4d5e8b1,0x0734efdd,0x1b06e56e,
  146979. 0x1f55f8a5,0x02d4a4f9,0x3f565c8d,0x7f8608ba,0x816d1d94,0x822f47d2,
  146980. 0x5ce7b136,0x0cc36156,0x31d04242,0xe46ee5ef,0x683567f6,0xb2a65f70,
  146981. 0xd2fa6c91,0x27e9ff40 } },
  146982. /* 212 */
  146983. { { 0xd7e952e7,0x75251893,0xc735bf18,0x15b30583,0x96fe0491,0x732b5992,
  146984. 0x806d2fca,0x27451858,0x1b885ed9,0x71ab76a0,0x6d9f55ec,0xbdce9d97,
  146985. 0x48f2ba9c,0x3da60b20,0x592b132b,0x6977c086,0x099051d7,0xb6dca9cb,
  146986. 0xd188ae25,0xd9c2ab23,0xe20aaf3d,0x9f469f3f,0x5aad74d0,0xdbd1f7cf,
  146987. 0x22a9eb3b,0x3d5efe5c,0x137010c4,0x8c5edfa2,0x57870260,0xada2217b,
  146988. 0x3dac9776,0x4feee567 },
  146989. { 0xb5d3d780,0x30e18d52,0x07166744,0x4dadb5d3,0x5a742156,0x320d386e,
  146990. 0x8d6bbb86,0x5d8c290e,0x2d263dd1,0x981a4323,0x98984636,0x33d0e7ca,
  146991. 0xa519acb1,0x5138784d,0xdddc81ff,0x832e3fab,0x3199a43a,0xfc278594,
  146992. 0x32743163,0x5b4cabcf,0x74f94fa7,0x9fa010bd,0x5694a627,0xc28a743d,
  146993. 0xcb657a24,0xc1d2a888,0xe86a25ea,0x7eef2503,0x04c561ff,0xed11a5d3,
  146994. 0x9c9ede0e,0x4fe818e7 } },
  146995. /* 213 */
  146996. { { 0x7fc1c7ff,0x00252c9d,0x9fa89ad1,0xa9bd419d,0x4064e9cc,0xc93a124a,
  146997. 0x43942ecc,0x384cbcb8,0x8749695b,0x004c21fd,0x421165bf,0x69c81d9f,
  146998. 0xdde01102,0xe2325628,0x5a9b004d,0xec937457,0xf6dcfc21,0xfb3346bf,
  146999. 0x4d372c7d,0xac4da64b,0xf20494e2,0xcecb7ad3,0xe867c150,0x562c41b5,
  147000. 0xc2b723d8,0x299395ce,0x7ee53231,0xc91adfc5,0xf10b6597,0xe06f1161,
  147001. 0xb74d3ffc,0x81915529 },
  147002. { 0x6ed9d4ee,0x8ec12431,0x689aff01,0x3dffa154,0x2a89a3f4,0x4aba349f,
  147003. 0xd467efb2,0x2db1e8e2,0x039102e2,0x18dea354,0xe52f082b,0x422ab853,
  147004. 0xed36dd47,0x7130a2c1,0x0295d1ee,0xca60e86d,0x7c7f5ad3,0xe6ac6808,
  147005. 0xde864658,0x0f83cecf,0x461d1265,0x72e66c21,0xbd385099,0xfeef4150,
  147006. 0xa6632289,0x0f183f3a,0x792dc795,0x275454be,0x11367702,0x2744c11b,
  147007. 0xe8ea6ef3,0x7d06bcc7 } },
  147008. /* 214 */
  147009. { { 0x7090212f,0x89285942,0x5521e844,0x691b7d4c,0xbe2dbb92,0x4c038422,
  147010. 0xbd81f880,0x317721ed,0xac89bc36,0xc136cbee,0x7b8f004d,0x4f71b60b,
  147011. 0x4e218ab8,0x269132d0,0xe6cc814d,0xb0e2496e,0x75fadc15,0x0b2ce317,
  147012. 0x66d223c5,0x82e3c084,0x4c612f8b,0x9721caa6,0xa4b65355,0x59a751eb,
  147013. 0xc7d3d9d1,0x3433aad5,0xe80d4246,0x1e61b9d2,0xfc673caa,0x149f655f,
  147014. 0xd0f9cb92,0x48b52b99 },
  147015. { 0xefdc05be,0xa3915399,0x13e095e9,0xde70db18,0xcddb3fda,0x447862e9,
  147016. 0x1a009451,0xa2b03162,0x23920ea3,0x4b27980c,0xa23b8feb,0xac5394f1,
  147017. 0x3e5616d4,0x163f7256,0xb714219a,0xaa0ff93f,0x93d62474,0xd26f96d2,
  147018. 0x7dcfe276,0xdd212ea8,0x47038d15,0xab27bf2f,0xf418168e,0xe58c8325,
  147019. 0xb32a989a,0xe3704222,0xbfc9f13b,0xa3694390,0x0d0684ad,0xf16e2606,
  147020. 0x9d8c76ec,0x17c0de87 } },
  147021. /* 215 */
  147022. { { 0xdcc01958,0xbca5f453,0x1ce88393,0x7d945954,0x561f5b6d,0x5e6350a1,
  147023. 0x7e2d36bc,0x291c3c86,0xa5ac3a6c,0xf6c7ed84,0xd98006cd,0x7913c40b,
  147024. 0x5671ec3b,0xf78bb087,0xb43e89a9,0x1c928f6e,0xae1ea1ed,0xfdf28df3,
  147025. 0xb924b2b5,0x62bba5b1,0x1a116e05,0x491d2705,0x167ed3e3,0x08ec02b7,
  147026. 0x5bc0b046,0xe291cf7b,0x8c5d7f59,0x30e50169,0xf5c799b7,0x0c7c350d,
  147027. 0x0ac6e1d7,0x6862b9e2 },
  147028. { 0x9ffa1f64,0x56c6f4e7,0xa1e24349,0xfed6a91a,0xcdb75232,0xe9a0ee0c,
  147029. 0x0322d607,0xbfc90b37,0x462fef87,0x29480ad2,0xc2bfcf34,0xfc214969,
  147030. 0xa539e38f,0x6e5211e0,0x12a5149c,0x2a59ec26,0xd706b532,0x195fe212,
  147031. 0xe99c8429,0xf77fb108,0x5dc80482,0x74ceaea3,0xbd92d298,0xa5a6030b,
  147032. 0xaaea15ee,0xad42dca5,0x4987109c,0xd6ac3bc7,0x290af649,0xc64e1c40,
  147033. 0x51f8de6c,0x5093fa2d } },
  147034. /* 216 */
  147035. { { 0x4c2d553b,0xc4cf3280,0x3b966c29,0xdc1abe22,0x2296914a,0x556a549c,
  147036. 0x999976c9,0xd8c9f8b5,0x776e83f3,0xc22c57bd,0x7c85ec57,0x4f2942ab,
  147037. 0x6e2c61f5,0xef3407e5,0xf213db48,0xf005e8ca,0xf32698c7,0x470c853d,
  147038. 0xcac0a54b,0xe6f488d7,0x60b7501e,0xb6bd6bed,0x714a4bd9,0xf0103106,
  147039. 0x6e098894,0x5285bc3b,0xf5f92a00,0xec06741a,0xef7ef24a,0x32f16426,
  147040. 0x6c77a438,0x12f9c44d },
  147041. { 0x83313a1c,0x1951e964,0x33c58b37,0x98edd3da,0xc7ac4044,0x4edbbf52,
  147042. 0x0dcb5ee8,0x866ca6f7,0x6dd422f8,0xec0ae8f5,0x0661ec2e,0x1077bc54,
  147043. 0xd422523c,0x6d39913a,0x58e7cb3e,0xd105e1e8,0xc979bb45,0x47c9397f,
  147044. 0x0997b592,0x3221d4a9,0xe8952fe7,0x0ef628a3,0x4e946241,0xd08d5827,
  147045. 0x59780f40,0x64cbed0f,0x08e110ec,0x13d7c227,0x7679b1a3,0xd186d866,
  147046. 0x26ae1d18,0x02f75e4e } },
  147047. /* 217 */
  147048. { { 0x47f307d7,0x1b637ebf,0xd0141477,0x6b644a6a,0x2e05a80c,0x82a33d65,
  147049. 0xfed07b31,0xc8f1a0f3,0x3696e597,0xc09ee7f9,0xc7ffc01e,0xcdaa7ec3,
  147050. 0xf8f373b9,0x549f88fe,0xc3bb8989,0xc88d1961,0xdfcaa7b7,0xd92a4fe9,
  147051. 0x3ae4ab20,0x12ff9ee2,0xf5ecb1a5,0xf5aea641,0xe32fb47d,0xe769237f,
  147052. 0x25d085c0,0x96a5c420,0x26c755a2,0xdc912558,0x9bce9723,0x580b985f,
  147053. 0x63961941,0x72b1b566 },
  147054. { 0x790e5558,0x9d708a08,0x0689af80,0x98536041,0x42313b5f,0xe85e7b8a,
  147055. 0x55a49d1a,0xe6ba1292,0xac371b0b,0x5e76c4b0,0x938e6e19,0x58504f39,
  147056. 0x60ae9a21,0x8dd41422,0x968485ce,0xd8b04e9b,0x887efe43,0xf94c4ba5,
  147057. 0xf11c5e73,0x11268e67,0xcf6b99c4,0x92623e28,0x7a0a9662,0xf2d0aaa8,
  147058. 0x4ca02ed3,0xb266772a,0x2d63b551,0x68ee8e4e,0x2e78b5b5,0xcdebb299,
  147059. 0xe17225ad,0x5df19216 } },
  147060. /* 218 */
  147061. { { 0x8df2e7e3,0x20027e1e,0xd8da07de,0xb183cc68,0x4b4ae694,0xce35ba69,
  147062. 0x3ca62e88,0x896d97df,0x52efed2c,0x3de4713b,0x26bd084f,0xd006c40e,
  147063. 0xfc81923b,0x1e9b71bb,0x1aacc6b0,0x9991c7b6,0x8f656840,0x650c9364,
  147064. 0x87f47524,0x138561d1,0xbffd3ca2,0x610f2b11,0xfa191418,0x96915faf,
  147065. 0x955e5309,0x8f1236de,0xa1872d79,0x613cbeea,0x66a2a48b,0x7f7b44ea,
  147066. 0xe0a89c32,0x452265c2 },
  147067. { 0x25430010,0x4ad5ec79,0xebd090c0,0xcac786ff,0x20a9d3f5,0xa5f9f4ff,
  147068. 0xa3edc65f,0xfcbf4112,0x0cf3eb11,0x8824839c,0x8aa5b700,0xb8dd6d4e,
  147069. 0xb7568ab8,0xe2271dfd,0xb744560e,0xe43ec373,0x1cf75296,0x78eaf926,
  147070. 0x3fa96d9b,0x1809ae0e,0xdc25dfd5,0x0b312d2d,0x6bab7711,0x6b8f78b4,
  147071. 0xb5ecf1e4,0x069efc8d,0x609fecaa,0xc1952bae,0x5f4dbde1,0x43e302ed,
  147072. 0x1e078555,0x14b02bf9 } },
  147073. /* 219 */
  147074. { { 0xb87e5b57,0x2c71c768,0xf531a557,0x0bcc78f7,0xf7597dc8,0x4ff93f8b,
  147075. 0x139e175f,0xb28e026d,0xcb94ca6c,0x6b83b727,0x0079f7fc,0x2eafe3b2,
  147076. 0xcf3bd170,0x2aca54de,0x6af0dc6c,0x17c4133c,0xccf5e35e,0xbea1e665,
  147077. 0x345505c6,0xa6691a48,0xe6100b89,0x2633abd0,0xc17d0388,0x966c6706,
  147078. 0x1a0cf90c,0x7aefffbe,0xd0add64c,0x4d847be7,0xaea2aa46,0xd49bcdfb,
  147079. 0x2cc7d0a5,0x85e07e74 },
  147080. { 0x0bc25bca,0x23aae0a6,0xe44f64ec,0x6e8e55f1,0xb607b773,0xe1e696d8,
  147081. 0xd3005909,0xaa90a746,0x2cbc4990,0x072b1ccd,0xc68e2f5d,0x0d0fe6c6,
  147082. 0x53e28ec9,0x920ec5f0,0xf0040cc1,0x79b21fb4,0xfcc4a2c7,0xa7375bd3,
  147083. 0xe1bac7dd,0xf5f5def9,0x35c0f8d3,0xdc315d79,0x2cacd318,0x7117c170,
  147084. 0xe926f71c,0x6f2823c4,0xed02f39a,0x38db58bb,0x7db69323,0xe5b49231,
  147085. 0x8d49f430,0x0964039f } },
  147086. /* 220 */
  147087. { { 0x56999eba,0x21774f16,0xb1de6305,0x3d8ee287,0xde0b2669,0xd81af726,
  147088. 0x3f8942a1,0x37446939,0xea03e13c,0xbcf6b615,0x94e273cf,0xd30c0c35,
  147089. 0xc6725c56,0x4fd33a56,0xa8be97a2,0xa57534ad,0x7c22a251,0x799242a6,
  147090. 0x9d0c5c49,0x4e51bdb5,0xc6a42768,0xd7cd76cc,0xd426bf59,0x914097ac,
  147091. 0x66e9beb2,0x59404a2c,0x5c96e3e9,0x4738fe98,0xaad666d0,0xbcbb3e0e,
  147092. 0x63bc5e56,0x626b0fd2 },
  147093. { 0xe1a1ec42,0x47217dba,0xab5acc50,0xaa6ae7db,0x865331d1,0xb7e1ab1e,
  147094. 0x3d30126f,0xb8453070,0xdee61851,0x280649e0,0xea689544,0x8806f4a3,
  147095. 0xcb56f632,0x4bbe43ad,0xbcaff94f,0x036b9bda,0xbd0637be,0x0d941e65,
  147096. 0x686f3abb,0x82179d44,0xaad6afd6,0x1486912c,0xff7e1534,0x9a3b891e,
  147097. 0xeb86fd96,0x88c426ce,0x117928c3,0xb56e6a81,0x96399e00,0x933e7135,
  147098. 0xa17b6ac1,0x09bbddd9 } },
  147099. /* 221 */
  147100. { { 0xe4fd3673,0x75e39c1d,0xa65c8e07,0xf880d9d1,0x7289c7fe,0x4725c1dc,
  147101. 0x3529d200,0x5b6735ee,0x3c747af3,0xc1f8f2ed,0x912efdf5,0x5cf3998f,
  147102. 0x49859c39,0xed722618,0x0e69795d,0x23793a2f,0x86b1d2a7,0x8a6ab8d6,
  147103. 0x22a882e4,0x00c815de,0xf9db8d7e,0xbe77d6fc,0x02267547,0x0886fb32,
  147104. 0x49c10edc,0xb62687d4,0x7c83ed4c,0x9f1c3e17,0x5af366ea,0xe6d5d7f0,
  147105. 0xd1efad24,0x2eaa01b8 },
  147106. { 0x1f357c74,0x5e47fb70,0xa9e3b794,0x93085c4a,0x6e85a905,0x4f098733,
  147107. 0xbe0244c9,0xf53808ff,0xa3b5660d,0x91dddf93,0xf3b95ed6,0x8b76377b,
  147108. 0xbb3920d4,0x91b911b7,0x86a13cf3,0x7ccf08bf,0xea018e58,0x53ed8f97,
  147109. 0x78c55194,0xb1ea4343,0xe0d2d5a6,0x8e6adde9,0x9b96259a,0xfc2b248f,
  147110. 0xeef17ddd,0x96ebceae,0x557f9c85,0xf694b443,0x07d5bba8,0x48cd150f,
  147111. 0xb4c1986b,0x02d31de9 } },
  147112. /* 222 */
  147113. { { 0xde79499d,0xa6bb9e1e,0xfd0fc2ad,0xf6ca8ff8,0x1a7d9356,0xbec0f8e8,
  147114. 0xe8f06327,0xbc3d1c9f,0x3b300beb,0x805c7217,0x413c181b,0x00420a08,
  147115. 0xf0ca9d01,0x9e9a167e,0x1aeeddd6,0x076c909d,0x8e3a8a72,0x64a1997f,
  147116. 0xa77b429e,0x3ce7f7a7,0x5c94d3e9,0xaac0fbf4,0xe6d48407,0xf37694a7,
  147117. 0xa91921e7,0xf56679e2,0xee1dbbd6,0xf23fe0f3,0xcbf9fa99,0xc7917566,
  147118. 0xe0f4d765,0x965860f2 },
  147119. { 0x7fa5f79c,0xe734702b,0x5af2d26d,0x930bd426,0x6c73e0ce,0x45bd8b98,
  147120. 0x4ee44a2d,0x7dbe7bed,0x956c8a1a,0xc129e024,0x77cdf80e,0x6fdc05ac,
  147121. 0x589ca59b,0x70a6ba2b,0x999825af,0xfc484021,0x7a23f0b6,0x1d284b54,
  147122. 0x28a0a8af,0xb1da10a4,0x2b2af6d8,0xb1eb1b31,0x33935ee3,0xf051443a,
  147123. 0x8effa6ec,0x7a07eb26,0xd662654c,0x16ee4086,0x4549ee4c,0x7a7bc501,
  147124. 0x1fa98a52,0x65081032 } },
  147125. /* 223 */
  147126. { { 0xb67ed9b2,0x49f0e460,0xc36d93d2,0x0cda0fd0,0x88c75e1c,0xbb5963e9,
  147127. 0x614bc0c9,0x757bbe93,0x9a768605,0x9a9b8801,0x48edc544,0xa8b7e2af,
  147128. 0xb51a5985,0x9e77ed9e,0xebbf024c,0xdd025274,0x1545c636,0x598b6288,
  147129. 0x4800dba0,0x39bdaed0,0x81e2a23a,0x7fc20139,0x550cb4f2,0xdc66fd5c,
  147130. 0xb52068c7,0xad27032f,0x8169fa15,0xc9a0bcae,0x3a7ca8a2,0x60606f21,
  147131. 0x9862652f,0x98295046 },
  147132. { 0x2e11c128,0x3e374600,0x0e6dca7e,0x80dfae5d,0xd9552264,0xe44016e2,
  147133. 0x880b7143,0xf65f88f2,0x526b881c,0xca3d28d4,0xdfb86afe,0xf9c59dd1,
  147134. 0x4c74f958,0x548860c2,0x9cb69f4f,0xd06ea43c,0x7334ecec,0x5343c9ae,
  147135. 0x35329713,0x5cc2ccd6,0x5f3a6c0c,0xa95ff403,0xb372653b,0x2e01a1cc,
  147136. 0xa250523d,0x31510fdf,0xa6227eb2,0xeee538e2,0xca23cd10,0xeadfc8a0,
  147137. 0x3e78f54b,0x4b7e6e1b } },
  147138. /* 224 */
  147139. { { 0xdb5f928b,0x79c9076f,0xb7347cec,0xe6250bb6,0xac00ec41,0x54b67798,
  147140. 0x9d9619c7,0x900d20ba,0x59e4343f,0xed42c0d0,0x451935d7,0x3df39e85,
  147141. 0x64f701ce,0x26391182,0xe1f87aac,0xce8f2554,0x65f91aaa,0xfddd6789,
  147142. 0xa324539f,0x96cd163f,0x4bace995,0x5c815f2c,0xa94f9ea5,0xd78c8c2a,
  147143. 0xef24e455,0x7ab2aff4,0x1cddc26a,0xf0ed6409,0x00ca2822,0x954a420b,
  147144. 0xd3297658,0x0611c4c5 },
  147145. { 0xa9e81829,0xf192001c,0x08a282cc,0xded33320,0x8f9ded9b,0x0bfd7de1,
  147146. 0xb7889003,0x6793ac0d,0x3577a5dd,0xbb00d91d,0x802d3c2b,0xe17a23a7,
  147147. 0xfb549014,0xff95f88c,0xc71b6e07,0x7cd1bf4b,0x23588c8b,0x2e3b24a0,
  147148. 0xa4112076,0x9b5335b8,0xc4056d30,0x2481c05e,0xe916a1b5,0x55c7410c,
  147149. 0x850179f4,0xbbe03271,0xb3cd1208,0x15e6c177,0x90cbfe50,0x509a24c0,
  147150. 0x1c108566,0x82079529 } },
  147151. /* 225 */
  147152. { { 0x1c7d353e,0x5d2d3cff,0x7de0ce3b,0xd5e7eccd,0x6ca87635,0xb4b1075f,
  147153. 0x25f9ad3e,0xda8404e0,0x205cb5ae,0x6b963e89,0x09f221a1,0x9e5ee0d8,
  147154. 0xea41aca4,0xd64c85d9,0x34442a34,0x6a46c4e9,0x3cf655a4,0xac6ff97e,
  147155. 0xe5417d7c,0x76565c1e,0xeebf9c4c,0x681009a9,0x88da6388,0x95b61d39,
  147156. 0xf6b472c6,0x6402b46a,0x0b7f1171,0x1fde5165,0xbe0c05e3,0x94f8f273,
  147157. 0xa88344a7,0x7487b036 },
  147158. { 0x9c3e2370,0xa860e575,0xf8048719,0x19d58193,0xa6e2f9aa,0x3a0dbf3c,
  147159. 0x6144719b,0xb6c7e959,0xdeffec21,0xa9049c74,0x3f50cebf,0x8ba064b2,
  147160. 0x49a1de15,0xb12822c0,0xb1d527f2,0xb654b7d9,0x0ffd0430,0xc470859d,
  147161. 0x4f05446b,0x37c74a67,0xa3add995,0xe553251b,0xe33533b5,0x4a3ed6cb,
  147162. 0x27e419ce,0x2f2f44d0,0xa5d1b979,0x2d84ee82,0xdb6fa69f,0xcc76b123,
  147163. 0x21fa3bdd,0x834f85c5 } },
  147164. /* 226 */
  147165. { { 0x2ce9b31a,0x329347c1,0xfe3fb3b7,0x1d88522a,0x52ff90fd,0x4bcefb4d,
  147166. 0x2b1a081d,0x53b17386,0x2a411f08,0x538c11ba,0x141b603a,0x7895b93c,
  147167. 0xb10bd741,0x2993b9aa,0x09912986,0xccbbd046,0xeea0aba5,0x669fafb0,
  147168. 0x35661897,0xd4844622,0x367ffa54,0x4a63b89c,0x1c3478da,0xcbad5d1d,
  147169. 0xaa6034f7,0xc5339227,0xe61b1391,0x0e6d705f,0xf74ff515,0xdd14b660,
  147170. 0x5332b54c,0x639d8b0a },
  147171. { 0x162217cd,0xfa423162,0x811c28e6,0x2e0e4a2a,0x21766dc0,0x68d9ce18,
  147172. 0x046a06ef,0x51263739,0xdde92101,0x44eea231,0x114298d3,0x0607c8f2,
  147173. 0x63d957e9,0x27f272ba,0xa5e8cae1,0xe7ce80cc,0x24f7a63f,0x5816ebe2,
  147174. 0x89673e34,0x4dece5a7,0x536babd4,0x13756a22,0xe3bf77af,0x644d61ae,
  147175. 0x2bcf98bc,0x60b2bf6e,0x29fa962c,0x3b0b59f3,0xabb50023,0xb0769a1a,
  147176. 0x0c75402c,0x40903136 } },
  147177. /* 227 */
  147178. { { 0x1670433f,0x84d2873a,0x25493dfc,0xc9394df6,0x80fcf89e,0xeb05a19a,
  147179. 0xdb297616,0xe39e4310,0xd9e63046,0x50742dc9,0x1de9ca9e,0xf31ad8c8,
  147180. 0xfb7b1d0d,0x86aabf94,0x1b3c82d1,0x36cda27a,0x39702d84,0xfb1a2ef4,
  147181. 0x46081299,0x280bfddc,0xd2396238,0xe4b2b48d,0x7b3c9353,0x2db2c2f3,
  147182. 0x12fb8a69,0xd5b5b317,0x08180474,0xf9b87a3b,0x1e952578,0xd8590986,
  147183. 0xf37a2bc8,0x80668eed },
  147184. { 0xb39a0249,0xe2edcd35,0xb2f8aeae,0xaf230cd4,0x7223df05,0x295b15e4,
  147185. 0xe0e937f4,0xbb66982a,0x8cbc9162,0x019d2b72,0xcf49dca1,0x5c512ae9,
  147186. 0x630f07b4,0x11b491a7,0xa03874e9,0x48d4f34c,0x44cb7433,0xc1fd0ea6,
  147187. 0xf95b30c3,0x13f79ae1,0xed8b60ac,0x40362d4d,0x61ead81c,0x9e8314ff,
  147188. 0x498c3d28,0xed600dd4,0xc2521702,0x5fcb1c19,0x3a9c1f33,0x592329fc,
  147189. 0x1bde6ce9,0x04677548 } },
  147190. /* 228 */
  147191. { { 0x39233c96,0xee3de56e,0x80737eaf,0x868c409c,0x201abc68,0xacae11bd,
  147192. 0x2b486205,0x0f2cea9b,0x6f19056c,0xe32387e1,0xa5dc2a41,0xea75365a,
  147193. 0x12b4be86,0x76c29acc,0x8d63294d,0xa01fcab7,0x0cab9f24,0x81dbe88b,
  147194. 0xf414c054,0x76646e5b,0xcb96b7aa,0xfe111893,0x7664e097,0xb649f5b1,
  147195. 0x53fcf5a9,0xa196422e,0x0b7ff634,0x5978c9bd,0x3c229895,0xb5feb38e,
  147196. 0x0833c456,0x038a49fb },
  147197. { 0x13e93257,0x35e3818c,0xa612741b,0x14cebc9d,0x7caac06b,0x4f6e9249,
  147198. 0x3daa1116,0x82278e33,0x4de2034a,0xe7cc565e,0x0a1ba630,0xbb7dc95f,
  147199. 0x66956fbd,0x81dd9f23,0xbb132dd6,0xc63e6319,0xfc241337,0x6e22b022,
  147200. 0x7e8beb1c,0x23848193,0xd8c938ac,0x83b1994d,0xa6bb5644,0xb54cfaca,
  147201. 0x06f91807,0x1a7cd44e,0xa8f8d9f3,0x1dd439bb,0x7f74a8e6,0x660c2a78,
  147202. 0x121b5660,0x4bb76e22 } },
  147203. /* 229 */
  147204. { { 0xe6354817,0x7a151e8a,0xf038b438,0x33d494ea,0x85958986,0x4c86c688,
  147205. 0x1dcbac12,0x72153827,0xc0edad06,0xf487af8c,0xe500e5d6,0xad33051f,
  147206. 0xd6e47f55,0x0a711b1b,0x8c746ad5,0xa68709a7,0x6402f35e,0x27f17262,
  147207. 0xfb30c130,0xc6d08efa,0xc06c7497,0x9ef1c041,0xdcc3e2da,0xd0c74ece,
  147208. 0x092e1073,0x30c5f96e,0x2aa12b74,0x0f1393cf,0x2107eb02,0x24584016,
  147209. 0x7b76f98b,0x8843d25f },
  147210. { 0xedb2a83e,0x4e1501dc,0x2bb8d724,0xbcfe8fb0,0xd925df62,0x09020659,
  147211. 0x42ab6fc3,0x3c715dcf,0xa0f09dfd,0x73c05055,0xe3590aea,0x126745d8,
  147212. 0x76ff749e,0x5382f4d8,0xa920c663,0xfc69feef,0x9fd711ca,0xde160211,
  147213. 0x9075c4d5,0x4219c3bd,0x3ded6bf2,0x3800cbd1,0x6263a116,0x8c7ea0eb,
  147214. 0x7d264c37,0x35bd7958,0x7159c98c,0x56e22e45,0xfa7373b5,0x71bf2a2d,
  147215. 0x8935c949,0x0503f939 } },
  147216. /* 230 */
  147217. { { 0x71dad4f6,0x65addc66,0x024bea1b,0x238e4889,0xf605d3dd,0xfb76c8e2,
  147218. 0xb0d96b89,0x13d5f5de,0x6601b2cb,0xe0b5ba35,0x83e3d254,0xe37d491d,
  147219. 0x240c8ea7,0xe8860423,0xe91c99ba,0x374182f3,0xa87ad919,0x26c2caf9,
  147220. 0xf574f295,0x4b13040a,0x944000a3,0x5b9bced1,0x06df42e7,0x4ccc57be,
  147221. 0x4bd1089d,0x22e8ec50,0xdddbb500,0x0c53177a,0x9ecfeadb,0x690d31d2,
  147222. 0x176668f9,0x735778fe },
  147223. { 0x843c1137,0x0f86ee3e,0x3f0b73cd,0x3c1c42fa,0x8ab20e3a,0x0e75679d,
  147224. 0x16242fae,0x6f95f1f4,0x39b092e4,0x7b88e11c,0x4c236ac0,0x1629403e,
  147225. 0x2dac02e6,0x66105f41,0x862e0632,0x74dc28a7,0xf3b23c8d,0x2118ffb2,
  147226. 0x0745ffbf,0x1182417c,0x4c05711e,0x49b55a04,0xcefbe4de,0x2c665b74,
  147227. 0x97bf7107,0x1cc4c01d,0xc54f0676,0xb2ca06da,0x7450d0f8,0xfc599daa,
  147228. 0x1a3182a1,0x52e637a6 } },
  147229. /* 231 */
  147230. { { 0x6bebc6db,0x481700f1,0xf9503d92,0x4a6b45db,0x5d153919,0xc715cd3c,
  147231. 0xe5ad2abc,0x942a1c05,0xab7b466f,0x36a82433,0xba13918b,0xba413bed,
  147232. 0x90f4e6ce,0x698a5624,0xf3f1f3ca,0xbb720da6,0x63471ab3,0x2116d41d,
  147233. 0x303d3609,0xe00d2227,0x463ba69e,0x7fd4cc00,0x62845fd1,0xac609e4d,
  147234. 0x80adc9c7,0x63603b2c,0x45fafbca,0xbf16fc9a,0xc4bc94ab,0x41007f7f,
  147235. 0xa74b1698,0x7c916b4f },
  147236. { 0x78bac2d4,0xc1026f91,0x2601a875,0x8a2e8098,0x0073d640,0xad2f276e,
  147237. 0xfcc1fb88,0x443610c4,0xca6b291f,0x5727b822,0x88ec60fc,0x0645532c,
  147238. 0xed9ad48b,0x51e48899,0xf543f103,0x841b48b5,0xd591ceeb,0xa6ccb1be,
  147239. 0x9dcf5a8b,0xfc4adf0f,0xb347ddb4,0x3a7ca020,0xcb44c521,0xaa1accc2,
  147240. 0x0527c0c4,0x773b6828,0x7023cf50,0xaa374c10,0x6b74c926,0x733d1000,
  147241. 0x77a8d07c,0x1ff3916f } },
  147242. /* 232 */
  147243. { { 0xf997939d,0xaa218fe4,0x791583b3,0x3d4dfbbb,0x87f7560b,0xb3a7b5da,
  147244. 0x5da92c98,0xa9c02801,0x46666f4a,0xe1eb4aad,0x14ce9dd7,0x2eb17a51,
  147245. 0xef8f3076,0xf46a66a4,0x810e546e,0x900b45c6,0x4baf04dd,0xf7af2258,
  147246. 0x5c84d42f,0x3cc1c872,0x8e4c83de,0x3093f225,0x170d88b2,0x62fade41,
  147247. 0xac076e44,0xe19612e4,0x32dd141b,0xf48d7346,0x925e34da,0xc1b1f759,
  147248. 0x072b90c9,0x19ed1a56 },
  147249. { 0x6c735473,0x9cf7fcde,0x6003bc3e,0xaab88e67,0xfb199bb8,0x12187cbc,
  147250. 0x9accccbd,0xbb730441,0xb0f65459,0x214aff3c,0x6f926282,0x6aec81a3,
  147251. 0x9f9d20b8,0xaa82cb32,0x5773cc90,0x82f3f90f,0xf62257e1,0x4af60e6b,
  147252. 0xbd4762df,0xf18b44bf,0xdb970753,0x3948b129,0x7c22c18e,0xc6e920e9,
  147253. 0x57be97ad,0x393d6208,0x46b637f9,0xe8d7382c,0xf1fed1d5,0xf6625ccb,
  147254. 0x68681599,0x6f31e0f9 } },
  147255. /* 233 */
  147256. { { 0x82b8f204,0xc45afe55,0xd358b54a,0xac0441b6,0xacd5f5ed,0x7213e7bf,
  147257. 0x139bcd93,0x1914c70b,0x96dbcbb0,0x714b4581,0x1ed35d21,0xe9297d35,
  147258. 0x6a3e1f20,0x8f640837,0x2f3cd705,0x150a8a9d,0xdcdd9f6d,0xfb36e801,
  147259. 0x5cf56d82,0x5a54eb65,0x92aa5a21,0x7610500c,0x3b089f03,0xd10d0ae2,
  147260. 0xc42b66e8,0x491b2079,0x0eee8d48,0x4af1ae3d,0x41556f45,0x137e4c28,
  147261. 0x63d8a7e6,0x875e3308 },
  147262. { 0xaf6c0acc,0xdc80fddc,0xbb1e7c08,0xd5ad1e66,0x828585ad,0xdc717ae1,
  147263. 0x275c7da6,0xbdc54340,0xd26b9e15,0xf4b4c852,0x6a05fa50,0x5f0a1fbf,
  147264. 0x817bcb32,0xc6f81e47,0x70ff2e1d,0x2cbd4328,0x67c7f7fc,0x8a249016,
  147265. 0xb585a6c4,0xd045acb7,0x4666c057,0x2e972ad4,0xe6d7d63d,0xc74d87cf,
  147266. 0x0e274144,0xf7067d87,0x8b2584ae,0xb2ca157a,0x75f0fdeb,0x495c5bfb,
  147267. 0xf386e009,0x5abb0581 } },
  147268. /* 234 */
  147269. { { 0xf0c97f57,0x8be62d2b,0x962f28c7,0x0fe04871,0x47b50abb,0xc548a467,
  147270. 0x44fa09ed,0xf6b26e03,0xab05a96e,0xfd44c6e3,0x70e6ae82,0xedb0032c,
  147271. 0xd7e4899d,0x28bd402b,0x9b7c11c2,0x43f2e963,0xce913716,0x0ec3fc0e,
  147272. 0x02fd0f8c,0x769b8bc9,0x7cabc3ac,0x9d9cb3aa,0x06924cc9,0xe88a8892,
  147273. 0x42609014,0xa51461aa,0x962e79e0,0xc7f4aa8b,0x8b1b3e80,0x4ef0210a,
  147274. 0x1bfee4bc,0x70544680 },
  147275. { 0x121901c1,0xfab3d713,0xfead54aa,0xe90a2627,0xbc08ba23,0x64f6d285,
  147276. 0x36ec227e,0x8d993015,0x06c191ab,0x99a16ab9,0xf649ce2c,0x86b1cf5b,
  147277. 0x66be3a80,0x59206759,0xccba2cf0,0x18836279,0xeff53486,0x2c157b87,
  147278. 0x4b223af2,0xbfac9896,0x0aae7a57,0xcd0fd4f0,0x63218a80,0xdaddb940,
  147279. 0xdf88f14e,0x3844bb79,0xb71ed9fd,0xc1b3e3d4,0xd6205036,0x6c634a13,
  147280. 0xb8680a6b,0x6f56aecf } },
  147281. /* 235 */
  147282. { { 0xd9205c5d,0xb01dc803,0x67123929,0x68955f7d,0x9d9b6565,0x3debbffd,
  147283. 0xd3b1acfe,0xb844395e,0x6094eeff,0x04328b21,0x22991feb,0x6631ffa8,
  147284. 0x190dd075,0x0dde66e6,0xe8577c05,0x75b03c55,0x91722407,0x6c91ce5f,
  147285. 0x8ebb3a3f,0x9a288a40,0x058a1396,0x1d376f8a,0x9a6e0676,0xf3a59457,
  147286. 0x7b71d288,0x103029c5,0xb44c30c0,0x0843f428,0x730e0b9c,0xd8e6aff8,
  147287. 0x4ed644ad,0x7b6be811 },
  147288. { 0x3d3aa54e,0x3ec38e4a,0xd83d509a,0x10233943,0x243955e2,0xf84aa621,
  147289. 0xf51d3d44,0x29104717,0x7eca4e37,0x62d2442c,0x85fa55de,0x8c5a523d,
  147290. 0x851da1b5,0xc6f5ccda,0x20001468,0x044bcaa8,0xe01702e0,0xf7501e68,
  147291. 0xe6a0acec,0xf0819359,0xac0ef0b2,0x33dda6ad,0xfd964f01,0x97aeedc8,
  147292. 0x530b90d8,0x48dacd0e,0xb84122eb,0x4c5fad6f,0xd700a1de,0x2284ec1e,
  147293. 0xdbca5474,0x86f9a835 } },
  147294. /* 236 */
  147295. { { 0x450cc69f,0x0e1d9055,0xc9edf98f,0x50eb14bc,0xee7eba01,0x1bb94e77,
  147296. 0x998f8e53,0x5f7a6737,0x1b16eef0,0x588384e3,0xd85c5e15,0xbb928723,
  147297. 0xcbd952aa,0xfe51e345,0x7e241674,0xc5d0ee28,0x100182f0,0xfdc146ef,
  147298. 0xe7f5be2c,0x0f739e92,0xb656bd3e,0x501ab3af,0x5168e289,0xb1552dde,
  147299. 0xb8ee104a,0x940dfe31,0xc4304475,0x42923603,0xc460a913,0x9306f114,
  147300. 0x03b51f86,0x5bfa9faf },
  147301. { 0x107b258e,0x2a23f52c,0xd66341dc,0x989e82bb,0x823cff1a,0x54a3ced8,
  147302. 0x719b491f,0xf45b7794,0x2433dfb8,0x898c2218,0xc49250ee,0x0f9dd91c,
  147303. 0x4fa17655,0x50c2a2ae,0x2c327f45,0xf7aa1ce4,0x583b1e41,0x13a15ad6,
  147304. 0xa1bfad9e,0x9aa0d5a5,0x8e1fbdcd,0x9b1caa28,0x915f7f87,0xaf9283b6,
  147305. 0x87e81a1e,0xc10e4e0c,0x1080d296,0x04fdca56,0x12755bd8,0x6acc9616,
  147306. 0x828feeda,0x1b1266aa } },
  147307. /* 237 */
  147308. { { 0x774ee49c,0x4ebc0a00,0xcb6237d7,0x776f6852,0x5df938a3,0xfc0544ac,
  147309. 0xb6fbfbbd,0xc3388ec8,0x745f2eae,0x84ac8bcd,0xb1ece937,0xa9c56609,
  147310. 0x7de8fa13,0x656fb6ac,0xa532b871,0x5f8ded74,0xaa889f09,0xab0d428b,
  147311. 0x10b7aec2,0x43b27f28,0xfeecb34c,0x26426e1e,0x9e89c2db,0x44431b6b,
  147312. 0x39211090,0xaac4bc5d,0x4fd81058,0x926f7368,0x471ef60e,0x452fa691,
  147313. 0x218d7a23,0x33517fdb },
  147314. { 0x593c4a36,0xa9c33f46,0x36b1a9ee,0xac69d718,0x4277beec,0x55a20c1d,
  147315. 0x7e4f179c,0x3e8ca24e,0xd46d88a2,0x57373369,0x730702f8,0x71ceb1cc,
  147316. 0x35eed574,0x8b184d97,0x0704cec2,0x7f4517a2,0xd7062a53,0x7f129d18,
  147317. 0xb1d77e1c,0x07a4571b,0x8350d8b2,0x774ac309,0x61fab8ef,0x27b2919f,
  147318. 0xb5dd801b,0xa7c4cc13,0x1434591f,0xe7e6255b,0x5a3592b3,0x349937b8,
  147319. 0x30c77549,0x31fac63d } },
  147320. /* 238 */
  147321. { { 0x04913fb6,0x2ee8cf1b,0x1769a6b3,0x7e401350,0x783e61f0,0x790ebb71,
  147322. 0xe27f2ffe,0x1e5107f9,0xedaf89bf,0x124ba67f,0xe58de68d,0x189200e1,
  147323. 0x6df5abee,0x962732a3,0xacbeb4aa,0x72cc37cf,0xe93c5a76,0xb0c5fa96,
  147324. 0xde63393b,0x4c2a317c,0x830b2d6c,0x97f65e67,0x1be5b96a,0x4afc3504,
  147325. 0x730ce66d,0x0bf40a60,0x9340d84f,0x96a1ba79,0x07626b08,0x3ee18254,
  147326. 0x7ab0cbf5,0x01db35db },
  147327. { 0xac0efee2,0x6e0fbc2d,0xd71dbb45,0x8406ebcd,0x19b69abe,0xe72bde3e,
  147328. 0x37e01822,0x49cb7e61,0x11458b4c,0xcbb8c01c,0x687c5d63,0x420b4847,
  147329. 0x454c6776,0x1847dfa1,0xd1839d18,0xbede911d,0x278df046,0x1b9dc9c9,
  147330. 0x881a336c,0x294bd62b,0x93e77adc,0x7f096879,0x43ce3ba7,0x7ac90665,
  147331. 0x7764eefc,0x148695fd,0x9ac465cf,0xe0c20f0b,0xa6e2cdb1,0x636e8d28,
  147332. 0xd755341d,0x7b6ba98c } },
  147333. /* 239 */
  147334. { { 0xc1881ab4,0xcb1d9e03,0xb3168c88,0x19c25d55,0x282364ce,0xa82d3d47,
  147335. 0xf161aa24,0x95994390,0xe1ebb2c9,0x7838bc00,0xbdec7a75,0x8fd5dfcc,
  147336. 0x4ff7220a,0x4dd203c2,0x0efeff48,0x5ec173b3,0x16428b35,0x99f1d2b3,
  147337. 0x056e813f,0xc06bd9e5,0xc0b319f1,0x929172ba,0xfd223b15,0x6ae0e384,
  147338. 0x98d091ed,0xbd01059e,0xa654648e,0x6b3168e4,0x3375e798,0x2211447f,
  147339. 0x71eb4508,0x47e81019 },
  147340. { 0xbc8c290d,0x7045d45a,0x810fb33a,0xa33d1355,0x46fbbf2f,0x2baf0092,
  147341. 0x385c7cd9,0xacff3f1b,0xe161985c,0xc5b150ec,0x2a888748,0xc6ee0a7f,
  147342. 0x5e88dcc8,0x9d888c8e,0xccb86443,0x4dd735f2,0x3c40f6f2,0xcc1e13b7,
  147343. 0xf3fed691,0xfc3a25ff,0x257ee5c7,0x4cb43b17,0xf32db135,0xaa654f93,
  147344. 0x02dff2d3,0x44f58d0a,0xa8ca6394,0x78e3f188,0xf3e86697,0x39646cce,
  147345. 0xe0dce87b,0x785b1902 } },
  147346. /* 240 */
  147347. { { 0xa92f9a20,0xfcce2361,0x9d64540e,0xb7bdca87,0x1d00d7c5,0xd4739a85,
  147348. 0x2e97c926,0x067ac8dc,0x78da6a8b,0x2aea3ffe,0x63c51b69,0x6828bf54,
  147349. 0x7155141a,0x76f1c479,0x3977d810,0xf4bcbef6,0x541bce7a,0x75bc4949,
  147350. 0xd17041a5,0xe01f4066,0x87755eaf,0xd282d5bd,0x59e7ae80,0x6e2107dd,
  147351. 0x382ab36f,0xaa56e166,0xb9d1d634,0x65ee8ef6,0xce4ed844,0x99a2160a,
  147352. 0xb7712c27,0x6557c367 },
  147353. { 0xd75b6e52,0x561b0268,0x118d0e89,0xb0813640,0x6a2eb1ae,0xcff53330,
  147354. 0x6d090894,0x4e462226,0xb5fc1d48,0xbb351227,0x57a3062d,0x9365ea07,
  147355. 0xd66e2dc5,0x4caca37b,0xb9095887,0x220d7d23,0x8c4473bf,0x9c0fd393,
  147356. 0x6787da4f,0xadff370a,0xd057f4b8,0xef0aebcc,0x1173f33a,0x205e744c,
  147357. 0x925a26b4,0xb8d1f0a5,0x722fbbfd,0xa9364f49,0x8227d284,0xc891ae77,
  147358. 0xa0e08ab4,0x15c40d04 } },
  147359. /* 241 */
  147360. { { 0x2a0e18d1,0x9baf169a,0x4c0327c2,0x9971c017,0x7bc262ce,0xd81a323f,
  147361. 0x818ff379,0x2099db8d,0x4cd3c330,0x663f663d,0x011a0553,0xef5325c3,
  147362. 0xf980a470,0x9cd70bdc,0x1c9ed070,0xe64452d1,0xac676e13,0xafbf43f4,
  147363. 0xae85c2a5,0x97bec0a6,0x470490c4,0x2faae550,0x491e6ba9,0x0ab97a87,
  147364. 0xaafa9914,0x4055f537,0x36726557,0xfc95adbb,0xd119d6bf,0x646343b9,
  147365. 0x9d341e37,0x788e94a0 },
  147366. { 0x9c53461a,0x053a6fe5,0x08e3b6ed,0x75ec897e,0x0768d939,0xa8f5d2f3,
  147367. 0xcc213d4f,0x9bd6bff6,0x05b0147c,0x590c7b41,0x7c7b8169,0x20a3628b,
  147368. 0x5bce78e9,0xc66a086e,0x4dec1d8f,0x3dd4d282,0xc19dcce9,0x890acf44,
  147369. 0xd8435a7e,0x6632d875,0xea6381b2,0x590167c1,0xf0dcc128,0xb2259797,
  147370. 0x46f8d463,0x91a612b4,0xc15efa39,0x42185d78,0x119f6788,0xdf55ec37,
  147371. 0x780dea93,0x91b19cc6 } },
  147372. /* 242 */
  147373. { { 0xcb5d8b80,0xebf2709d,0xfc35660e,0x03b96182,0x055ef969,0xb873d991,
  147374. 0xe47c4342,0xd1ea4b4d,0xd54f8867,0xcc4b9244,0xfd8d77ef,0x93b1a2ca,
  147375. 0xe8c1f563,0x068d24e7,0x49973056,0x5f5fabb6,0x0542374f,0x83248c50,
  147376. 0x3f38e913,0xc36de2b5,0x7bb680be,0xed07e8eb,0xd8f313b5,0x964813d7,
  147377. 0xafd2d392,0x7bb6a069,0x0848a31a,0xc06d848e,0xe4f0c325,0x6867fb2f,
  147378. 0x067343af,0x3c2ba834 },
  147379. { 0x9d3ad63b,0xab62d775,0x59e0eb1f,0x3f9cab97,0x3885e117,0x70332a63,
  147380. 0xe20b2f9e,0xf22cafce,0x49eca947,0xb529ba7e,0x6228d88d,0x24954216,
  147381. 0x39239561,0x80ea23ec,0xd4370644,0x1b8907e7,0x563e4e44,0x4b7fa455,
  147382. 0xb2a4b0fa,0xcca9829e,0x48060792,0xd0a720a4,0x246991ce,0x8ccdda0c,
  147383. 0x348d086b,0x37a2325b,0xf60aee13,0x566ed509,0x147f253f,0x3d30e091,
  147384. 0xc1073bd8,0x1fa627a5 } },
  147385. /* 243 */
  147386. { { 0x42478fd4,0xa11222a2,0x670b2000,0xacf4c6f1,0x8359c6de,0xf71bb04f,
  147387. 0x7b93cdbc,0x618e2829,0x230db60b,0x96e1bae3,0x965b3b29,0xf17fd3b4,
  147388. 0xbc7055dd,0xa58639c6,0x4b817d7f,0xc3ea92ed,0xd23b08a4,0x9082b2a6,
  147389. 0xdc17010e,0x8471228a,0x20e89d97,0x753b9e46,0x03ff77c9,0xcf7e4f97,
  147390. 0x2bbe60e5,0x6c3f8245,0xb80e017d,0x9e432cbc,0xc0a45edb,0x150a5acd,
  147391. 0x4798743e,0x67b8bd05 },
  147392. { 0xf4797cf7,0xe66079b4,0xd03fde02,0xe31c998a,0x54caaef1,0x5aa3763a,
  147393. 0xf7649711,0x64d9a1fe,0xaf29b1a7,0x7ce0dc73,0xfb66ca93,0x6661b083,
  147394. 0x32fb6a78,0xbf4d74fe,0xdf00a561,0x25f6ef09,0x831d1159,0x2bc4383f,
  147395. 0x536bde37,0x6d5cc10c,0x882cc65b,0xd4945f9f,0x451a99b8,0x81f48f13,
  147396. 0x6bac11a4,0x140161cd,0xf18a4a0a,0x9d94d4ed,0xa467a824,0x65363165,
  147397. 0xa4c9aedf,0x74297aa9 } },
  147398. /* 244 */
  147399. { { 0xe21124ba,0xc49758a4,0xa87ffbd2,0x99bd8198,0x3d6638a8,0x45fbcdd1,
  147400. 0x15f7bf76,0x94645ff8,0xc4e6d57e,0x5fa6736f,0x92e61db9,0x1eae6475,
  147401. 0xcbdf944a,0x79575c0c,0x25b31d74,0xa3d13047,0x4cab5ae6,0x7881df22,
  147402. 0x1a2887f2,0x8dbfd299,0xa26ac459,0x23d07590,0xd8661d4a,0x2e589852,
  147403. 0x8a0140f7,0x37b5c13b,0x3fb3782a,0x0f94199e,0x1bc14e90,0x722aa059,
  147404. 0xd55bbb12,0x89aab7ba },
  147405. { 0xd656bdc7,0x8b345a96,0xe176cd3b,0x43bdc8af,0x32d64c43,0xd69518b6,
  147406. 0x79b82b41,0xfcf364a7,0xffb0cf82,0x907b344e,0x5101287b,0xf3d0c83c,
  147407. 0x34cd90ef,0xe9f26a59,0x07082b5c,0xe5f5aaf2,0xece7c165,0x4eb72c75,
  147408. 0xbe986cd6,0xe9590a81,0xff1536aa,0xfeef498f,0xa8263d5e,0x04560243,
  147409. 0x54ae872b,0x940be14f,0xe3207686,0xbee7bcc9,0xc1bc4d7a,0xd496a27d,
  147410. 0x5940ab46,0x002dc297 } },
  147411. /* 245 */
  147412. { { 0xb69d60c3,0xee533937,0xfe972755,0x260be552,0xc0c725a6,0xb11fb78d,
  147413. 0xcab2e7c2,0x6982c27e,0xee2322cb,0x4bceedd9,0x122704f7,0x952b19ed,
  147414. 0x854a6165,0x2df4c285,0x7b192485,0xba40b5bf,0x0119f52a,0xfcbca950,
  147415. 0xe5add86f,0x7467d1cb,0xd9d0f2c1,0x9bf536fb,0xb8d4ebc9,0x3c296e34,
  147416. 0x05a81317,0x0495f8f4,0x73335f76,0x8c59e8d6,0xe0542122,0x0b53d324,
  147417. 0x3c3bda73,0x4d564535 },
  147418. { 0x7e5c0877,0x7322f800,0x0ca9a764,0x481b43e6,0xa2c12716,0x231f4f4b,
  147419. 0xed3136c2,0x09596857,0x38db30de,0xae826322,0x99908ebc,0x652fad40,
  147420. 0xaf0d231e,0x0b8d1814,0x09cbc349,0x2680c54b,0x4bf3bf8e,0xfd4562f3,
  147421. 0x092b595f,0x2985090b,0x5e15fc34,0xe6f39ca4,0xbc378168,0x70175191,
  147422. 0x845a4a87,0x906944b3,0x82a1541a,0xacc6d74a,0xb155c8b4,0xadc9bab3,
  147423. 0x77306c62,0x1f2f89ce } },
  147424. /* 246 */
  147425. { { 0x9affefdf,0x8253ef41,0x4cf9256b,0x05d7ece5,0xb444e483,0x377002f2,
  147426. 0xcba5471f,0xb189755f,0xd5cbe015,0xc88483cb,0x6a0b8429,0x254f7c69,
  147427. 0x61f3f61d,0x18850bd4,0x0a247157,0x7ba21089,0xd92eeb0d,0x35abbc2e,
  147428. 0x965dec89,0xfb56cabe,0xbc55684a,0x9da23724,0x6a7a7492,0xd8ba396f,
  147429. 0x2ef4ba46,0xfcb90db7,0x9909b27a,0xdd234fe0,0x76f4366e,0xbdf3c164,
  147430. 0x17e50d47,0x09c8097f },
  147431. { 0x60050c07,0x6a04b140,0x43a8e37e,0xc29e8318,0xbb55e41f,0xcb9429b2,
  147432. 0x2ce60e3a,0xed2fea5a,0xdb9d82f4,0xdc7b1ff3,0x687d37fa,0x48ebecc3,
  147433. 0xecb07539,0x79153e32,0x57075692,0x6a60054f,0x800759ba,0x3871cd0c,
  147434. 0x30922df1,0x17a7386f,0x83357b7c,0x4e9fc59e,0x39415186,0x1d26b3a9,
  147435. 0xd34db889,0x912a0222,0x59fcdb71,0x6672fcf4,0x44ff3036,0x5a3f268d,
  147436. 0x6911e16c,0x6f113ed3 } },
  147437. /* 247 */
  147438. { { 0x1836f1c9,0x52a9df59,0x4232307d,0xfa6519f5,0x5ded285a,0x8406c701,
  147439. 0xaf627f75,0x0a1545ca,0xace0417d,0xae1111ee,0xa6113443,0xfb28bdf6,
  147440. 0x52dbcbcb,0xde9ef0ab,0x7813e658,0xe9dc181b,0x99127225,0x0b1dabdb,
  147441. 0x22814c59,0x5f0598e3,0xd934ee7e,0x5c3b966e,0xb99ba4bf,0x4eb84eda,
  147442. 0x3c1b55e7,0xb2919a34,0x94aa860f,0xa9addb49,0xf6811ff6,0x1b7220df,
  147443. 0xd1a183e2,0x6636a23b },
  147444. { 0x20587283,0xdf5d5a2d,0xef07fc5d,0x0b3822c9,0x0ef6de38,0x1786bd55,
  147445. 0x25d1671d,0x163cf907,0x1cdb1def,0x74bf971f,0x0842fc4a,0x5749e830,
  147446. 0x27f854f7,0x0e2edbc7,0xbce24acb,0xbb27bbda,0x05bed08d,0xc1b19cec,
  147447. 0xf7c904bc,0xaada123e,0xd89982db,0x02429f1b,0x65f6e632,0x49d3616e,
  147448. 0xee59fd32,0xa3789fa8,0xfe9f29f5,0x160ba3ba,0xaf5378a0,0x0f2d3b61,
  147449. 0x73c2a6f8,0x7aeecc76 } },
  147450. /* 248 */
  147451. { { 0xdc43b0db,0xf3a4757c,0x98119cad,0x3d8a4e85,0x4616c156,0xf8095bf6,
  147452. 0x4f533e97,0x3e2a07bc,0x39cfc5ad,0xa9824367,0xcd68052c,0x18a6ba3a,
  147453. 0x8a1cec66,0xbd60e590,0x02b1b695,0xae3841a5,0x190a195b,0x986dff12,
  147454. 0xad31fd9b,0x2df2beac,0xcc728f7b,0x7d893224,0x0cf0a992,0xc38ea738,
  147455. 0x586a44ea,0xa8439a80,0x1615f03c,0xede7f7f0,0x27a1f885,0x48249908,
  147456. 0xb78a7645,0x28ec4006 },
  147457. { 0xa2fe0009,0xe1820c2e,0xf13874e9,0xe11ba5d2,0xc524db52,0x97522454,
  147458. 0x7fede529,0x4d477426,0x9b2500d4,0x01d3419a,0x1869244b,0xce08a492,
  147459. 0xdd1be1b9,0xba169023,0x32a301e0,0x242c3e54,0x70906788,0x9b56f7ba,
  147460. 0xc74a8cc4,0xf0ad2a09,0xd76f9439,0x99cd1841,0x621fb60e,0xeddafe0b,
  147461. 0xbc397634,0x056bee54,0xff7f0a84,0x4653f860,0x2011c0af,0x6bd4876f,
  147462. 0x0c9525c3,0x134f4cc7 } },
  147463. /* 249 */
  147464. { { 0xe938dff4,0x9621a3ec,0x486a79a3,0x7d101a7b,0xde950537,0xf2c4ef97,
  147465. 0xe65d87db,0xf3184099,0x373b8cfa,0xb89c7ffb,0xe842916e,0x68baa505,
  147466. 0x4ebea764,0xa790fd09,0xe592892b,0x679df6d4,0xfcfed741,0x2023331c,
  147467. 0x9880ff21,0x0bf4efd2,0xd0344501,0x7ca78ddd,0x342858c8,0x2cb09ecb,
  147468. 0x2575487a,0x9e5eb6dc,0xebcb0491,0x50675a15,0x7381d471,0x09d2e74f,
  147469. 0x83d3d6f4,0x6ea37829 },
  147470. { 0x4e5cc40a,0xc65c094b,0x1af37dfb,0x7a2e3f6a,0xf9026e44,0xef677e9d,
  147471. 0x93880f53,0xb7878c95,0x7f644aa9,0x4aa30b07,0x2f208c3c,0xa0c51683,
  147472. 0x658d663b,0x7c0277ae,0xae1d9130,0xef0b3c38,0x695c3ea4,0x302f37a7,
  147473. 0x6a0c5e0d,0xe004c1c5,0x20cbcf9f,0x9fd495c4,0x568a0e7c,0x706d5b9d,
  147474. 0x59286454,0x8b225dff,0x8d9a709c,0x527d4465,0x87c08d68,0x47c558da,
  147475. 0xbb4ef07d,0x606ee6e6 } },
  147476. /* 250 */
  147477. { { 0x57c621f6,0x02d99fc7,0x7fe83d48,0x292e40c1,0x9ef199b0,0x1bdfc7a1,
  147478. 0xe62c7666,0x78a04102,0xe6738753,0x16cda370,0x1e3a65af,0xbc81974d,
  147479. 0xf78fe209,0x19742048,0xbf5981c6,0xc83a058a,0x9c89702d,0xf26b2434,
  147480. 0x9d1a678a,0x988b2f1e,0xff29ae29,0x472bf9b0,0x1d7cf5ec,0xa143e398,
  147481. 0xb268ddd8,0x9c9d7e45,0x5fc4ff76,0x166cda55,0xa4aa7673,0x6044cdf0,
  147482. 0xe9148707,0x49dba6f7 },
  147483. { 0xa758e37a,0x20e47fb2,0x2d8eaf66,0xaf6b31d7,0x6f9c2210,0x352ad5f9,
  147484. 0x90efc32b,0x0093f727,0x41e4b264,0x435c99dc,0x05b15795,0xbfa878e0,
  147485. 0x0e673575,0x99c520a4,0x87eea759,0xca682594,0xf12a348b,0x029f7b81,
  147486. 0x2aa2ce35,0xa547cc18,0xead5e2c5,0xa11d874b,0x55682cdf,0x9af0349b,
  147487. 0x8bbe8e66,0xf86ebfea,0xf55394ab,0x3dab8782,0xebc8eb8f,0x458bf797,
  147488. 0x9b7de78c,0x4890a7a4 } },
  147489. /* 251 */
  147490. { { 0x8da995f6,0xd7299689,0xec6156ef,0xd39eaae7,0x356a82d5,0x6959040c,
  147491. 0xc135bcfe,0xb2046b21,0x0f595c78,0xea720b64,0xe7c5fb40,0x02824efa,
  147492. 0x0edb3bfc,0x97d8fd4c,0x79f24ebe,0x12f02905,0x187ea6b9,0x16fc47cf,
  147493. 0x789d5c23,0xc219fd27,0x89263ecc,0x233a6b6c,0x8b6d30a6,0x823634b2,
  147494. 0xc9b33680,0xca352e25,0x40c77456,0x9388d6ca,0x3c92065b,0xf8e55b0b,
  147495. 0x02439a76,0x5c17474b },
  147496. { 0x8aaccab5,0xd888e7c2,0xaaced05b,0x18027836,0xccec0f65,0x185b877d,
  147497. 0x125c2882,0x93cadc1c,0x67fdc54c,0x45df540a,0xc2788a33,0x4f3c86e2,
  147498. 0xe3a0fa2c,0x3e874469,0x273983cf,0xc59daa47,0x4a96d8a5,0x3063c48b,
  147499. 0xc2e58915,0xc38d2bcf,0x84e428c3,0x90e78b87,0xf0c4fd53,0x900a292c,
  147500. 0x941e6005,0xb7f92db7,0x6ca53a1c,0x95679241,0xb1ab0fa7,0x35f6f31d,
  147501. 0x7b58408c,0x5d675eb4 } },
  147502. /* 252 */
  147503. { { 0x870c6025,0xaeee1a77,0x91a2dfca,0xfc4a23b7,0x386b64c4,0x7b0e60c4,
  147504. 0xe5ae72b1,0xd5d5b17d,0x9eefa212,0x6dfc88ac,0xd4038b96,0x4feaefbe,
  147505. 0x8e2d2ecc,0x099ac356,0x012af207,0x548ea612,0x89c31218,0x4ffed9db,
  147506. 0xe0e67331,0x1c1e91c4,0xaf8300e0,0x009bb64f,0x6773c3be,0x8780501c,
  147507. 0xc08219fa,0xe0cd6ede,0xf81b06ff,0x7c055e07,0xe080b36f,0x82b63f9c,
  147508. 0x0a9feca3,0x02fccbaf },
  147509. { 0xb47cac61,0x9991d4d1,0xab86e12c,0x2e9d1687,0x2b94f042,0x8c6855ec,
  147510. 0x48e648e5,0xca400519,0xef89ac57,0x9ba91fb2,0x1be792cd,0x4f419206,
  147511. 0xbd0f1e15,0x82d221cb,0xfc444019,0x062eb13b,0x99790fdc,0xf3a97c32,
  147512. 0x6067a64b,0x4e796d94,0x6d23775a,0xc46dd300,0xed7f0f23,0x8672c4d5,
  147513. 0x3b4f63d7,0x821851dc,0xd26273f2,0x50a3ae0c,0xeac60f6f,0x800e58fc,
  147514. 0x13845545,0x56f1e456 } },
  147515. /* 253 */
  147516. { { 0x32c24f3b,0x01ccb3f6,0x06d817e6,0x99eb1c7f,0x6aa26776,0x8dc640bb,
  147517. 0x0845d5e0,0x7838affe,0xf81a79a8,0xf34fecb1,0x3e6819b0,0x6a2e282d,
  147518. 0x8237a4b8,0xc4b977ce,0x87636439,0x0f46b3db,0x97970497,0xa465f540,
  147519. 0x8791be43,0xd7e08762,0x34198ec6,0x00220b6c,0x093d94bb,0x57b38637,
  147520. 0x29d690b2,0x84012e16,0x20aad1a4,0x02ec9db5,0x85dc34e3,0xafee2fc6,
  147521. 0x25500cf8,0x911d1936 },
  147522. { 0xf5e5af5b,0x13b1bd58,0x7b6a22a7,0xa7ca263b,0xf3af2adc,0xab6bec4d,
  147523. 0xa04420bd,0x16651e59,0x4ba36c11,0x3b448b3b,0xff424310,0x3c62bfcd,
  147524. 0xf1a96cbb,0xde15c4a5,0xe4d1f980,0xbe0ad8a1,0x36673a3a,0x812bd14e,
  147525. 0x9212acdd,0x40303af6,0x576095ce,0x8f6dab9c,0x107f5ca5,0x7df1882a,
  147526. 0x8896a3b0,0xb903e63c,0xd863b3f0,0xf5048544,0xc09887de,0x5e5019b9,
  147527. 0xa0f53865,0x2be744fe } },
  147528. /* 254 */
  147529. { { 0x5b50f324,0x054cd05f,0x1ea3c7a2,0xb9b1eb24,0x7ff8e6b7,0x4a858a5c,
  147530. 0xec040882,0xd83902fe,0xd0cba9bd,0x72b26494,0xb29c9e1e,0xd0176f90,
  147531. 0xcebadb81,0x05d4eb02,0x372b8bfc,0x874405b1,0x79ead190,0x5c412881,
  147532. 0xec2b48cd,0xd44a3dd3,0x3f4d5033,0x84499a77,0x564c3a09,0xb37b38cd,
  147533. 0xf42e803b,0x80e99497,0xb8f518b2,0xc07b47a0,0x3568fde4,0xc710e3c5,
  147534. 0xcead0e7a,0x735f542f },
  147535. { 0x38380039,0xcaa9a171,0xf74d19c8,0xadfafe17,0xccbc1a8b,0x92d4393e,
  147536. 0xfe029705,0x3c5dbf39,0x930e9b36,0x4552b5ab,0x2afd494a,0x7ee63032,
  147537. 0x3f02ac43,0x826a9ad7,0x99356298,0x98c53562,0x7342bb39,0x0c869f87,
  147538. 0xe4f9b79a,0xd7510020,0xd34789a9,0x6361d1a4,0xcfa85637,0xf0ded5ba,
  147539. 0x88ac07e4,0x407ee73f,0x09ef1cbd,0xfac7d03f,0x4d475bad,0x25d697cb,
  147540. 0x14bd399e,0x1e984c9d } },
  147541. /* 255 */
  147542. { { 0x4850c817,0xc76d0561,0x3489812d,0xb08a5b19,0x5e58cbbe,0x7273d154,
  147543. 0x4be61e5a,0x8900b5fa,0xd7aeb8e1,0xaa088691,0xd35a3d4b,0xe66666af,
  147544. 0x57ec7d3d,0x38a2c199,0x668d6f5c,0xa0648e8f,0x7adc1746,0x1f9fc92c,
  147545. 0x843065c3,0x23a116c0,0x61e6ae69,0x36370a20,0x2aa47e73,0x626c3736,
  147546. 0xdeff6d84,0x540c25f2,0xcdbed2d4,0x9804824c,0x039a9492,0x4b5bfce0,
  147547. 0x76942e01,0x6c474a56 },
  147548. { 0x7d88e3a1,0x3aeb9a41,0xc484742a,0x105d3c88,0x3fe61131,0xe59de8d1,
  147549. 0x1a869e8b,0x148f5b6b,0xaa75d90a,0x7a8abc59,0x62146013,0x2f0c9bc7,
  147550. 0xc3824cd9,0x43faa747,0x6a5d0b92,0x81763a18,0x9bcbaebc,0xbbc341bc,
  147551. 0xf745d1dd,0xe1813160,0xb75ce5f4,0xa53ce52d,0xd50de4c2,0x15eae66c,
  147552. 0x75d7656d,0x5ed8996c,0xc4ca552a,0xe4ff5711,0x3c5305b4,0x215e985a,
  147553. 0xfa1ba2ce,0x6b258954 } },
  147554. };
  147555. /* Multiply the base point of P1024 by the scalar and return the result.
  147556. * If map is true then convert result to affine coordinates.
  147557. *
  147558. * Stripe implementation.
  147559. * Pre-generated: 2^0, 2^128, ...
  147560. * Pre-generated: products of all combinations of above.
  147561. * 8 doubles and adds (with qz=1)
  147562. *
  147563. * r Resulting point.
  147564. * k Scalar to multiply by.
  147565. * map Indicates whether to convert result to affine.
  147566. * ct Constant time required.
  147567. * heap Heap to use for allocation.
  147568. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  147569. */
  147570. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  147571. int map, int ct, void* heap)
  147572. {
  147573. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  147574. k, map, ct, heap);
  147575. }
  147576. #endif
  147577. /* Multiply the base point of P1024 by the scalar and return the result.
  147578. * If map is true then convert result to affine coordinates.
  147579. *
  147580. * km Scalar to multiply by.
  147581. * r Resulting point.
  147582. * map Indicates whether to convert result to affine.
  147583. * heap Heap to use for allocation.
  147584. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  147585. */
  147586. int sp_ecc_mulmod_base_1024(const mp_int* km, ecc_point* r, int map, void* heap)
  147587. {
  147588. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  147589. sp_point_1024* point = NULL;
  147590. sp_digit* k = NULL;
  147591. #else
  147592. sp_point_1024 point[1];
  147593. sp_digit k[32];
  147594. #endif
  147595. int err = MP_OKAY;
  147596. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  147597. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  147598. DYNAMIC_TYPE_ECC);
  147599. if (point == NULL)
  147600. err = MEMORY_E;
  147601. if (err == MP_OKAY) {
  147602. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  147603. DYNAMIC_TYPE_ECC);
  147604. if (k == NULL)
  147605. err = MEMORY_E;
  147606. }
  147607. #endif
  147608. if (err == MP_OKAY) {
  147609. sp_1024_from_mp(k, 32, km);
  147610. err = sp_1024_ecc_mulmod_base_32(point, k, map, 1, heap);
  147611. }
  147612. if (err == MP_OKAY) {
  147613. err = sp_1024_point_to_ecc_point_32(point, r);
  147614. }
  147615. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  147616. if (k != NULL)
  147617. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  147618. if (point != NULL)
  147619. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  147620. #endif
  147621. return err;
  147622. }
  147623. /* Multiply the base point of P1024 by the scalar, add point a and return
  147624. * the result. If map is true then convert result to affine coordinates.
  147625. *
  147626. * km Scalar to multiply by.
  147627. * am Point to add to scalar mulitply result.
  147628. * inMont Point to add is in montgomery form.
  147629. * r Resulting point.
  147630. * map Indicates whether to convert result to affine.
  147631. * heap Heap to use for allocation.
  147632. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  147633. */
  147634. int sp_ecc_mulmod_base_add_1024(const mp_int* km, const ecc_point* am,
  147635. int inMont, ecc_point* r, int map, void* heap)
  147636. {
  147637. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  147638. sp_point_1024* point = NULL;
  147639. sp_digit* k = NULL;
  147640. #else
  147641. sp_point_1024 point[2];
  147642. sp_digit k[32 + 32 * 2 * 6];
  147643. #endif
  147644. sp_point_1024* addP = NULL;
  147645. sp_digit* tmp = NULL;
  147646. int err = MP_OKAY;
  147647. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  147648. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  147649. DYNAMIC_TYPE_ECC);
  147650. if (point == NULL)
  147651. err = MEMORY_E;
  147652. if (err == MP_OKAY) {
  147653. k = (sp_digit*)XMALLOC(
  147654. sizeof(sp_digit) * (32 + 32 * 2 * 6),
  147655. heap, DYNAMIC_TYPE_ECC);
  147656. if (k == NULL)
  147657. err = MEMORY_E;
  147658. }
  147659. #endif
  147660. if (err == MP_OKAY) {
  147661. addP = point + 1;
  147662. tmp = k + 32;
  147663. sp_1024_from_mp(k, 32, km);
  147664. sp_1024_point_from_ecc_point_32(addP, am);
  147665. }
  147666. if ((err == MP_OKAY) && (!inMont)) {
  147667. err = sp_1024_mod_mul_norm_32(addP->x, addP->x, p1024_mod);
  147668. }
  147669. if ((err == MP_OKAY) && (!inMont)) {
  147670. err = sp_1024_mod_mul_norm_32(addP->y, addP->y, p1024_mod);
  147671. }
  147672. if ((err == MP_OKAY) && (!inMont)) {
  147673. err = sp_1024_mod_mul_norm_32(addP->z, addP->z, p1024_mod);
  147674. }
  147675. if (err == MP_OKAY) {
  147676. err = sp_1024_ecc_mulmod_base_32(point, k, 0, 0, heap);
  147677. }
  147678. if (err == MP_OKAY) {
  147679. sp_1024_proj_point_add_32(point, point, addP, tmp);
  147680. if (map) {
  147681. sp_1024_map_32(point, point, tmp);
  147682. }
  147683. err = sp_1024_point_to_ecc_point_32(point, r);
  147684. }
  147685. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  147686. if (k != NULL)
  147687. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  147688. if (point)
  147689. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  147690. #endif
  147691. return err;
  147692. }
  147693. #ifndef WOLFSSL_SP_SMALL
  147694. /* Generate a pre-computation table for the point.
  147695. *
  147696. * gm Point to generate table for.
  147697. * table Buffer to hold pre-computed points table.
  147698. * len Length of table.
  147699. * heap Heap to use for allocation.
  147700. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  147701. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  147702. */
  147703. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  147704. void* heap)
  147705. {
  147706. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  147707. sp_point_1024* point = NULL;
  147708. sp_digit* t = NULL;
  147709. #else
  147710. sp_point_1024 point[1];
  147711. sp_digit t[6 * 2 * 32];
  147712. #endif
  147713. int err = MP_OKAY;
  147714. if ((gm == NULL) || (len == NULL)) {
  147715. err = BAD_FUNC_ARG;
  147716. }
  147717. if ((err == MP_OKAY) && (table == NULL)) {
  147718. *len = sizeof(sp_table_entry_1024) * 256;
  147719. err = LENGTH_ONLY_E;
  147720. }
  147721. if ((err == MP_OKAY) && (*len < (int)(sizeof(sp_table_entry_1024) * 256))) {
  147722. err = BUFFER_E;
  147723. }
  147724. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  147725. if (err == MP_OKAY) {
  147726. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  147727. DYNAMIC_TYPE_ECC);
  147728. if (point == NULL)
  147729. err = MEMORY_E;
  147730. }
  147731. if (err == MP_OKAY) {
  147732. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 2 * 32, heap,
  147733. DYNAMIC_TYPE_ECC);
  147734. if (t == NULL)
  147735. err = MEMORY_E;
  147736. }
  147737. #endif
  147738. if (err == MP_OKAY) {
  147739. sp_1024_point_from_ecc_point_32(point, gm);
  147740. err = sp_1024_gen_stripe_table_32(point,
  147741. (sp_table_entry_1024*)table, t, heap);
  147742. }
  147743. if (err == 0) {
  147744. *len = sizeof(sp_table_entry_1024) * 256;
  147745. }
  147746. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  147747. if (t != NULL)
  147748. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  147749. if (point != NULL)
  147750. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  147751. #endif
  147752. return err;
  147753. }
  147754. #else
  147755. /* Generate a pre-computation table for the point.
  147756. *
  147757. * gm Point to generate table for.
  147758. * table Buffer to hold pre-computed points table.
  147759. * len Length of table.
  147760. * heap Heap to use for allocation.
  147761. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  147762. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  147763. */
  147764. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  147765. void* heap)
  147766. {
  147767. int err = 0;
  147768. if ((gm == NULL) || (len == NULL)) {
  147769. err = BAD_FUNC_ARG;
  147770. }
  147771. if ((err == 0) && (table == NULL)) {
  147772. *len = 0;
  147773. err = LENGTH_ONLY_E;
  147774. }
  147775. if ((err == 0) && (*len != 0)) {
  147776. err = BUFFER_E;
  147777. }
  147778. if (err == 0) {
  147779. *len = 0;
  147780. }
  147781. (void)heap;
  147782. return err;
  147783. }
  147784. #endif
  147785. /* Multiply the point by the scalar and return the result.
  147786. * If map is true then convert result to affine coordinates.
  147787. *
  147788. * km Scalar to multiply by.
  147789. * gm Point to multiply.
  147790. * table Pre-computed points.
  147791. * r Resulting point.
  147792. * map Indicates whether to convert result to affine.
  147793. * heap Heap to use for allocation.
  147794. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  147795. */
  147796. int sp_ecc_mulmod_table_1024(const mp_int* km, const ecc_point* gm, byte* table,
  147797. ecc_point* r, int map, void* heap)
  147798. {
  147799. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  147800. sp_point_1024* point = NULL;
  147801. sp_digit* k = NULL;
  147802. #else
  147803. sp_point_1024 point[1];
  147804. sp_digit k[32];
  147805. #endif
  147806. int err = MP_OKAY;
  147807. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  147808. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  147809. DYNAMIC_TYPE_ECC);
  147810. if (point == NULL) {
  147811. err = MEMORY_E;
  147812. }
  147813. if (err == MP_OKAY) {
  147814. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap, DYNAMIC_TYPE_ECC);
  147815. if (k == NULL)
  147816. err = MEMORY_E;
  147817. }
  147818. #endif
  147819. if (err == MP_OKAY) {
  147820. sp_1024_from_mp(k, 32, km);
  147821. sp_1024_point_from_ecc_point_32(point, gm);
  147822. #ifndef WOLFSSL_SP_SMALL
  147823. err = sp_1024_ecc_mulmod_stripe_32(point, point,
  147824. (const sp_table_entry_1024*)table, k, map, 0, heap);
  147825. #else
  147826. (void)table;
  147827. err = sp_1024_ecc_mulmod_32(point, point, k, map, 0, heap);
  147828. #endif
  147829. }
  147830. if (err == MP_OKAY) {
  147831. err = sp_1024_point_to_ecc_point_32(point, r);
  147832. }
  147833. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  147834. if (k != NULL)
  147835. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  147836. if (point != NULL)
  147837. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  147838. #endif
  147839. return err;
  147840. }
  147841. /* Multiply p* in projective co-ordinates by q*.
  147842. *
  147843. * r.x = p.x - (p.y * q.y)
  147844. * r.y = (p.x * q.y) + p.y
  147845. *
  147846. * px [in,out] A single precision integer - X ordinate of number to multiply.
  147847. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  147848. * q [in] A single precision integer - multiplier.
  147849. * t [in] Two single precision integers - temps.
  147850. */
  147851. static void sp_1024_proj_mul_qx1_32(sp_digit* px, sp_digit* py,
  147852. const sp_digit* q, sp_digit* t)
  147853. {
  147854. sp_digit* t1 = t;
  147855. sp_digit* t2 = t + 2 * 32;
  147856. /* t1 = p.x * q.y */
  147857. sp_1024_mont_mul_32(t1, px, q, p1024_mod, p1024_mp_mod);
  147858. /* t2 = p.y * q.y */
  147859. sp_1024_mont_mul_32(t2, py, q, p1024_mod, p1024_mp_mod);
  147860. /* r.x = p.x - (p.y * q.y) */
  147861. sp_1024_mont_sub_32(px, px, t2, p1024_mod);
  147862. /* r.y = (p.x * q.y) + p.y */
  147863. sp_1024_mont_add_32(py, t1, py, p1024_mod);
  147864. }
  147865. /* Square p* in projective co-ordinates.
  147866. *
  147867. * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2
  147868. * py' = 2 * p.x * p.y
  147869. *
  147870. * px [in,out] A single precision integer - X ordinate of number to square.
  147871. * py [in,out] A single precision integer - Y ordinate of number to square.
  147872. * t [in] Two single precision integers - temps.
  147873. */
  147874. static void sp_1024_proj_sqr_32(sp_digit* px, sp_digit* py, sp_digit* t)
  147875. {
  147876. sp_digit* t1 = t;
  147877. sp_digit* t2 = t + 2 * 32;
  147878. /* t1 = p.x + p.y */
  147879. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  147880. /* t2 = p.x - p.y */
  147881. sp_1024_mont_sub_32(t2, px, py, p1024_mod);
  147882. /* r.y = p.x * p.y */
  147883. sp_1024_mont_mul_32(py, px, py, p1024_mod, p1024_mp_mod);
  147884. /* r.x = (p.x + p.y) * (p.x - p.y) */
  147885. sp_1024_mont_mul_32(px, t1, t2, p1024_mod, p1024_mp_mod);
  147886. /* r.y = (p.x * p.y) * 2 */
  147887. sp_1024_mont_dbl_32(py, py, p1024_mod);
  147888. }
  147889. #ifdef WOLFSSL_SP_SMALL
  147890. /* Perform the modular exponentiation in Fp* for SAKKE.
  147891. *
  147892. * Simple square and multiply when expontent bit is one algorithm.
  147893. * Square and multiply performed in Fp*.
  147894. *
  147895. * base [in] Base. MP integer.
  147896. * exp [in] Exponent. MP integer.
  147897. * res [out] Result. MP integer.
  147898. * returns 0 on success and MEMORY_E if memory allocation fails.
  147899. */
  147900. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  147901. {
  147902. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  147903. !defined(WOLFSSL_SP_NO_MALLOC)
  147904. sp_digit* td;
  147905. sp_digit* t;
  147906. sp_digit* tx;
  147907. sp_digit* ty;
  147908. sp_digit* b;
  147909. sp_digit* e;
  147910. #else
  147911. sp_digit t[4 * 2 * 32];
  147912. sp_digit tx[2 * 32];
  147913. sp_digit ty[2 * 32];
  147914. sp_digit b[2 * 32];
  147915. sp_digit e[2 * 32];
  147916. #endif
  147917. sp_digit* r;
  147918. int err = MP_OKAY;
  147919. int bits;
  147920. int i;
  147921. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  147922. !defined(WOLFSSL_SP_NO_MALLOC)
  147923. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8 * 32 * 2, NULL,
  147924. DYNAMIC_TYPE_TMP_BUFFER);
  147925. if (td == NULL) {
  147926. err = MEMORY_E;
  147927. }
  147928. #endif
  147929. if (err == MP_OKAY) {
  147930. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  147931. !defined(WOLFSSL_SP_NO_MALLOC)
  147932. t = td;
  147933. tx = td + 4 * 32 * 2;
  147934. ty = td + 5 * 32 * 2;
  147935. b = td + 6 * 32 * 2;
  147936. e = td + 7 * 32 * 2;
  147937. #endif
  147938. r = ty;
  147939. bits = mp_count_bits(exp);
  147940. sp_1024_from_mp(b, 32, base);
  147941. sp_1024_from_mp(e, 32, exp);
  147942. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  147943. sp_1024_mul_32(b, b, p1024_norm_mod);
  147944. err = sp_1024_mod_32(b, b, p1024_mod);
  147945. }
  147946. if (err == MP_OKAY) {
  147947. XMEMCPY(ty, b, sizeof(sp_digit) * 32);
  147948. for (i = bits - 2; i >= 0; i--) {
  147949. sp_1024_proj_sqr_32(tx, ty, t);
  147950. if ((e[i / 32] >> (i % 32)) & 1) {
  147951. sp_1024_proj_mul_qx1_32(tx, ty, b, t);
  147952. }
  147953. }
  147954. }
  147955. if (err == MP_OKAY) {
  147956. sp_1024_mont_inv_32(tx, tx, t);
  147957. XMEMSET(tx + 32, 0, sizeof(sp_digit) * 32);
  147958. sp_1024_mont_reduce_32(tx, p1024_mod, p1024_mp_mod);
  147959. XMEMSET(ty + 32, 0, sizeof(sp_digit) * 32);
  147960. sp_1024_mont_reduce_32(ty, p1024_mod, p1024_mp_mod);
  147961. sp_1024_mul_32(r, tx, ty);
  147962. err = sp_1024_mod_32(r, r, p1024_mod);
  147963. }
  147964. if (err == MP_OKAY) {
  147965. err = sp_1024_to_mp(r, res);
  147966. }
  147967. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  147968. !defined(WOLFSSL_SP_NO_MALLOC)
  147969. if (td != NULL) {
  147970. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  147971. }
  147972. #endif
  147973. return err;
  147974. }
  147975. #else
  147976. /* Pre-computed table for exponentiating g.
  147977. * Striping: 8 points at a distance of (128 combined for
  147978. * a total of 256 points.
  147979. */
  147980. static const sp_digit sp_1024_g_table[256][32] = {
  147981. { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  147982. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  147983. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  147984. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  147985. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  147986. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  147987. 0x00000000, 0x00000000 },
  147988. { 0x335c1685, 0x170a46d2, 0xe1007a58, 0xeac9e971, 0x43ca4a73,
  147989. 0x40e8f3df, 0x82642475, 0x2646f815, 0xb36576d1, 0x3af49bb4,
  147990. 0x72bf1afb, 0xd89e2d14, 0x2fd151e6, 0x27be882c, 0x8f88717c,
  147991. 0xaddedc85, 0x16ac6c6f, 0xd6d859bf, 0x2d8eae58, 0x0e741a1b,
  147992. 0x61c1f30d, 0x6faf7a00, 0x9b67e096, 0x66dbd09a, 0x7d3b4f7d,
  147993. 0x21f11c06, 0xc727c98e, 0x6152ba02, 0xe86cb221, 0xafd58891,
  147994. 0x6bd3baf4, 0x59e93c6a },
  147995. { 0x71dd4594, 0xe54dd36f, 0x00aef1e6, 0xbbc9cc9f, 0xa19f6530,
  147996. 0x9ea5a44e, 0x3f520928, 0x8588aa99, 0x8f5c1418, 0x9753794c,
  147997. 0xc11399fa, 0x118bd792, 0xf5cb6ab5, 0xb9bd3afd, 0x2ecb9652,
  147998. 0x813d1cb2, 0x40389813, 0xfd456267, 0x4ac8431c, 0x51f7119b,
  147999. 0x0a180eb6, 0xdd9f6a91, 0x9f7bfa2e, 0x13946d17, 0x50a9d0d9,
  148000. 0x16f18631, 0x6f8373d3, 0x5f19c20d, 0x9b6a52b9, 0xbe85ac6a,
  148001. 0x74f62e03, 0x63ef187b },
  148002. { 0x016f45e7, 0x7c376b7f, 0x2bec82f8, 0x1c1bdb57, 0xce429b60,
  148003. 0x7392f741, 0xc7afd81d, 0x6fdbf0a2, 0x7241098b, 0xbda41b1f,
  148004. 0xbb60f8cf, 0x5b407474, 0xb330bc4d, 0x933e0d41, 0x733fa3be,
  148005. 0xae182830, 0x0f5c6cd1, 0xa0ed299b, 0x3f9860c8, 0x7ff3354e,
  148006. 0x15559c41, 0xb1360986, 0x129f85cb, 0xab0cb63c, 0x47685fbe,
  148007. 0x682ecc49, 0xeb199633, 0x505e8ec2, 0xddac2cda, 0x90dcc794,
  148008. 0xf192da23, 0x4fe6791c },
  148009. { 0x05e8733c, 0x94a423d5, 0x1d5717c1, 0xcc845e65, 0xe961b322,
  148010. 0x237c7e88, 0xdb4181cc, 0x0c4471c6, 0x713bd721, 0x00c875e2,
  148011. 0xb2c17b09, 0x9dfde9ed, 0xe88ceaf6, 0x430a6de5, 0x7b81cea6,
  148012. 0xaaa7a61a, 0x233f98d5, 0xea52d026, 0x60689a9a, 0xb55efdd0,
  148013. 0x5cac4aab, 0x30cfa7ce, 0x8e950761, 0xfa4db114, 0x4e9a1e52,
  148014. 0x309570c4, 0x1a040170, 0x18c21f61, 0xbe78d9d2, 0x555d1ffe,
  148015. 0x561db297, 0x04482a18 },
  148016. { 0x73d486d8, 0xe7758ac2, 0x61cdc1e7, 0x8169f946, 0x2188ab4f,
  148017. 0x723c99fc, 0xf3373630, 0xa0e54f02, 0xbd8c2260, 0x560bee25,
  148018. 0x4531bc60, 0x28fc307c, 0x7e44feb5, 0xd6f21f1a, 0x57128d37,
  148019. 0xc8e4499c, 0xd7b2ea45, 0x963b053e, 0x32a3d222, 0x40c27a04,
  148020. 0x35459668, 0x5b51854d, 0xd73557e9, 0x66e1a49f, 0x8692077a,
  148021. 0x0d267fd9, 0xe7342702, 0xfa1350d3, 0x68ccdb44, 0x1a9c3f25,
  148022. 0xdedbf89f, 0x833a0ff8 },
  148023. { 0xab376b76, 0xa8c419c7, 0x27d0f0cc, 0x3b7294f3, 0xa90c514d,
  148024. 0xe56bb9e2, 0xa62575a6, 0x931ba51e, 0x098c0a88, 0x56fee07b,
  148025. 0xb4c16a2a, 0x04be5aee, 0xe6eb260b, 0xe513350b, 0xa1d5c270,
  148026. 0x339edad6, 0xe9dbadd1, 0xf366ed59, 0x2dd06ec0, 0x4213be88,
  148027. 0xcb1187db, 0x22d639c8, 0xd8a1058a, 0x1fec95e1, 0xa2b744f1,
  148028. 0x03f73ea6, 0xf4f05c0c, 0x741fd51a, 0x85f811a0, 0x2e2df95a,
  148029. 0xeb24965f, 0x692b3ce3 },
  148030. { 0xd2a127b4, 0x0ce6cb72, 0x8f92816f, 0x66a46ea5, 0x47a37616,
  148031. 0x43ecf463, 0xe0ab96ee, 0x163d9a01, 0xb2edbe8c, 0xc8145c6d,
  148032. 0x4de4e665, 0x2f426cae, 0x74e252f9, 0x174d0b40, 0x7d2af831,
  148033. 0x54c240d7, 0x3d652936, 0x581fa397, 0xa09d4695, 0x05b9491c,
  148034. 0x5452643c, 0x8c4e8533, 0xd4128327, 0x32d64331, 0x70361f25,
  148035. 0x64479038, 0x89ef09f2, 0x774191b1, 0x81de5fe0, 0xc0cf0aaf,
  148036. 0xf40042d6, 0x333e430a },
  148037. { 0xcf26d3b7, 0x5df04de4, 0xb53f79be, 0x57a77306, 0x1808b664,
  148038. 0xa4013c5f, 0x85037360, 0xef291ea4, 0x0b061037, 0x1ffc9d7d,
  148039. 0x65c913bb, 0xd9d04dd9, 0xf13b8587, 0x948a37af, 0xfe3ee755,
  148040. 0xb5443483, 0x04631386, 0x3fc21e74, 0xcddeb58c, 0xb3a104e5,
  148041. 0x6572cd52, 0x94fe1862, 0x15aaa408, 0xeb9a71a1, 0x459ea462,
  148042. 0x8adc6fe5, 0x4aeb02a3, 0xbb18d175, 0x2f7791d1, 0xae127636,
  148043. 0xd6bbd708, 0x10e8b31d },
  148044. { 0x3ed9f1af, 0xb87f03e5, 0x56676166, 0x03ad2477, 0x74ce15b8,
  148045. 0x38dcd630, 0x26b1e85b, 0x1877e2b0, 0x1af99c15, 0xb1654d17,
  148046. 0x9382547a, 0x9782e9e4, 0x26d55ef5, 0x6dc7fc7c, 0x2fbeb54c,
  148047. 0x9038f95d, 0x036c0357, 0xfe590dfe, 0x4fdc3f7f, 0xcfcb6eae,
  148048. 0xf35e1a88, 0xcb1fbc54, 0xda0a5568, 0x3c8e1db2, 0x5b6f5557,
  148049. 0x9a87393f, 0xe7ac0a06, 0x38646b32, 0x2a8495ab, 0xfd261c83,
  148050. 0x0cdcc4bc, 0x6485524c },
  148051. { 0xc4a6ff2a, 0x1abfb3e2, 0x35a6428a, 0x2aa03fba, 0x89aff742,
  148052. 0x884227f0, 0xba5dbd93, 0x2337883a, 0xd2a182cb, 0x38186ae9,
  148053. 0x49a01f05, 0xb9f0764d, 0x917b1e7a, 0x92411feb, 0x570cbb5b,
  148054. 0x700b1903, 0xb914be7c, 0x5d5181d5, 0x1981182d, 0x135c4437,
  148055. 0x574b9997, 0x32758d24, 0x632d28b2, 0xa650a8f5, 0xfa383f09,
  148056. 0x24078bac, 0x00a33d80, 0x6546a60c, 0x2df8b449, 0xa4061c7a,
  148057. 0xf234563c, 0x1f76f3f2 },
  148058. { 0x44c436b0, 0x9aa2c143, 0x1f69c87a, 0x79070556, 0x5f6db2df,
  148059. 0x35f3117b, 0xed56ba82, 0x85761f41, 0x7d0afa48, 0xf831464f,
  148060. 0x3adce71e, 0xa99f2915, 0x116b7488, 0xb27bf693, 0x9bb9443a,
  148061. 0xa98a5a8c, 0x2ee5fde8, 0x7f878026, 0x1812acb7, 0x3a6f93dd,
  148062. 0xdc84bc92, 0xaf92a4cc, 0xf1d4995a, 0x3c2562af, 0x04ed899d,
  148063. 0xfd9fc33c, 0x4ed2a538, 0xc028ca94, 0x049ea726, 0xd0f367bb,
  148064. 0x3d108e05, 0x04924ffb },
  148065. { 0xc673562f, 0x06548e3d, 0xe2eae48c, 0xd3b33025, 0x5e1c6977,
  148066. 0xe61fd32b, 0x6ebe557b, 0x424e2064, 0x41d6e18e, 0x767391c0,
  148067. 0x14d7e95b, 0x4b8ebb8e, 0x20991b8c, 0x4ae8b7d4, 0xe01290d3,
  148068. 0xf8a0df66, 0x925e5f4e, 0xc97e24a3, 0x1508272a, 0x79a7b2cb,
  148069. 0x25072661, 0xb40b072e, 0x9062fa49, 0xdad9e182, 0xf3c53bce,
  148070. 0x8780a784, 0x9f142799, 0x58a82b76, 0xc1468426, 0x08cd849c,
  148071. 0xc380ae35, 0x4dfce809 },
  148072. { 0xd527b780, 0x45069cb2, 0x977930dd, 0xd52da015, 0xe27d0263,
  148073. 0x10cc600b, 0xbb2d1b2b, 0x34102c26, 0x554adf3c, 0x4c652623,
  148074. 0x45f0ff47, 0xd6891382, 0xca916e7c, 0x83fa8cc5, 0xd15c8d8a,
  148075. 0x1e10f139, 0x81dc56b3, 0xf173dc2e, 0x5c4ed9ba, 0x7fcecb04,
  148076. 0x47d01228, 0x307fd7d8, 0x9f3a532f, 0x24a57153, 0xe2153c22,
  148077. 0x59e9e81d, 0xe428a408, 0xc562595d, 0x9339bd23, 0xdc7daff8,
  148078. 0xb8a06802, 0x0d075908 },
  148079. { 0xde085f2a, 0x870af2a7, 0xbe99b2e5, 0x88fcd24f, 0x59ca413b,
  148080. 0x88c0d261, 0x8559f851, 0x1f02a2e4, 0xf622da0d, 0x83b96021,
  148081. 0x6dca3615, 0x5c05c2f5, 0x7910c682, 0x0148cf1c, 0x272695be,
  148082. 0x392f2896, 0xa8d64ef6, 0x883d0bb5, 0x1cfcbc52, 0xef0d2244,
  148083. 0x526117e5, 0xf5dafcec, 0xf04928e9, 0xb68612b9, 0x393f2e2a,
  148084. 0x283f744d, 0x700c1151, 0xfbeed7ed, 0xa4360dfe, 0xf2cde215,
  148085. 0x2f08535a, 0x24fa961c },
  148086. { 0x616df7f6, 0x0767db3f, 0xfbd90326, 0x643057d8, 0x6e82d544,
  148087. 0x174daa90, 0x689643db, 0x2284f345, 0xcc89a060, 0x18b191df,
  148088. 0xd6c27d12, 0xbab46af4, 0xc9895145, 0x5a57f486, 0xcc942f9e,
  148089. 0xc03214e9, 0x41950158, 0x273e1c8f, 0x39ad43ab, 0x8ceb759f,
  148090. 0xe50ee173, 0x5e1b8b7f, 0x8f4d7d4e, 0xf635b1fc, 0x755603f3,
  148091. 0x8eff77e3, 0x7752fa60, 0x201f61d1, 0x4a6fb6e1, 0x94d7a03d,
  148092. 0xfc4f0114, 0x371cc23d },
  148093. { 0xda90c351, 0x289b115d, 0x364d9c06, 0x6d196ebf, 0xf650b31b,
  148094. 0x77a89202, 0x6f57642f, 0xcc28c164, 0x08100127, 0xdc4f7e36,
  148095. 0xdc4c807b, 0x8836cd08, 0xe00240f2, 0x1280f156, 0x99cb3953,
  148096. 0x3f9a6d78, 0x3a802038, 0x40a494d3, 0xe87d3474, 0x45697e91,
  148097. 0x26dde24a, 0x70d97d07, 0x7640c30e, 0x06f6a58d, 0x5ba6e6c6,
  148098. 0x03c2c0e8, 0xf1bc13e8, 0x330f6a7a, 0xc9f4d78f, 0x3e602e4f,
  148099. 0x0c80fb7f, 0x92b6bca0 },
  148100. { 0x5f00822e, 0x2e3d5c83, 0xb8b16f12, 0x0e825712, 0x92b0a330,
  148101. 0x81c329c4, 0xa7cc1954, 0x6b4e32ad, 0x1bb1413f, 0x0bee9cee,
  148102. 0x4a92ca27, 0xedfb7baa, 0xea3b9153, 0xcd472afa, 0x00f0c0f9,
  148103. 0xe8f09e7e, 0x5cdebb70, 0xa4e1d872, 0x4a9b63b6, 0xfe2bae08,
  148104. 0x3fd58f65, 0xf40141b8, 0xa3b62759, 0xd7ec5eda, 0x790e3088,
  148105. 0x9aaf6e67, 0x1f277e31, 0x215ad830, 0xcf33871c, 0xe7db4b98,
  148106. 0x4f02f89d, 0x71ff62c9 },
  148107. { 0x2a4a84d9, 0xaa4c7102, 0x5ebc71e6, 0xe2ee4acd, 0xf1cd6578,
  148108. 0x3b11a8a5, 0xfff120a5, 0x83f5ef9f, 0x09e65033, 0xa4c598e1,
  148109. 0xca044180, 0xe1e9f990, 0xf59828c1, 0x8b832d46, 0x33af536b,
  148110. 0x753f28a0, 0xb6d4f68a, 0x92edc4b1, 0x72ccd1f0, 0xedde692a,
  148111. 0xd2226432, 0xd3aa0f7d, 0xa3d2661c, 0x38dbb63e, 0xfdc37dda,
  148112. 0xf1e19fc6, 0x84ef6b4c, 0x6c18b350, 0xdf1bba69, 0xe6a83fe9,
  148113. 0x5f958273, 0x40fd47e7 },
  148114. { 0x267140a4, 0x5b88b746, 0xeab6f2fb, 0x6dbbfc1e, 0x69862548,
  148115. 0xdd9ec88e, 0x2eb6efc2, 0x69beeba1, 0x8ac8ff88, 0xcfc2214a,
  148116. 0xb5a21950, 0x95d5c96e, 0x4171fb69, 0x93389c05, 0x1b468337,
  148117. 0x2d85d452, 0x4113425c, 0x14d68a08, 0xec6c2174, 0xe52c0139,
  148118. 0xf730084d, 0x20cf0b97, 0x1f578aa3, 0x1ac16a26, 0xf9b6ae43,
  148119. 0x18b9fab3, 0xd854a695, 0x68d82111, 0xdffbe286, 0x0b334d98,
  148120. 0xe639338c, 0x5b1c1157 },
  148121. { 0x72b6bb8f, 0x90edaab1, 0x02fc92c2, 0x8dc64ed2, 0xfe694c73,
  148122. 0xf42ba3c5, 0xcb54dce4, 0x316dc65f, 0x632420dc, 0xcb2d66a3,
  148123. 0x056dcf94, 0x16e706e7, 0xa4f32c9d, 0x2809c764, 0xea6edca8,
  148124. 0xab18d830, 0x81c65f57, 0x4fd1ace6, 0x7da12c10, 0x1f91651c,
  148125. 0xc7791a48, 0x0ac3bd66, 0x785e67a3, 0xb6ad1cf4, 0xda0fd591,
  148126. 0xe4d3fc44, 0x6e1c6344, 0xce164801, 0x33e50ab3, 0x84de9cb8,
  148127. 0xa756eef4, 0x963ab83a },
  148128. { 0xdf4ea5a3, 0x944b47d8, 0x5cfe45fe, 0x96568815, 0x8a3c3564,
  148129. 0xd16e7d58, 0xe7c99e15, 0x84e55b3e, 0xf55071bc, 0x3fee204d,
  148130. 0x04057dce, 0x71006f29, 0xbba75570, 0xfe8c390d, 0x3319adac,
  148131. 0x3645bcb6, 0x7c20bfd8, 0x8189e8b0, 0x7d7d9578, 0x8e550969,
  148132. 0xb99f4e3b, 0x037d1321, 0xa60cfb6a, 0x011b2521, 0x837382da,
  148133. 0x66594aaa, 0x83c1dc07, 0xc89b91fd, 0x076b9884, 0x6b82b899,
  148134. 0xbe45c558, 0x443480fc },
  148135. { 0x9114221a, 0xf8ffffb4, 0x3e857a7a, 0x4aec4f2e, 0x0fa54787,
  148136. 0x42e2d0e4, 0xd6f96152, 0xef3e6b31, 0xfbfe9b77, 0xb2296537,
  148137. 0xfb43a86a, 0xc2a9d0f2, 0x24572ac6, 0x241284ed, 0xe721ba7b,
  148138. 0xa3868917, 0xc117a78d, 0xdbef7c00, 0xd31605ac, 0x38149071,
  148139. 0x065a8ee9, 0xc2dada9e, 0xc442be82, 0xd5b138d8, 0xf6d72b58,
  148140. 0x9b6c224b, 0x8eb03e6d, 0xb9d355cf, 0xa1700371, 0xab6d1eb0,
  148141. 0xcffaa7eb, 0x97118a88 },
  148142. { 0xcdecb5d8, 0xbf9c59a2, 0xa93a6866, 0x8083c81b, 0x04774fbf,
  148143. 0x24e0dd81, 0xa02070b4, 0xe779a3ca, 0x0fbfb781, 0x9d352fbb,
  148144. 0x3ef2a1c4, 0xa8b0d820, 0x14b3e501, 0xb858637b, 0x8a882ff2,
  148145. 0x5ba70a49, 0x3b06efa5, 0xa2730083, 0x102fee2a, 0xa42c02f4,
  148146. 0x8a0223a5, 0xe4e76299, 0x85c3fc72, 0xdba2ba26, 0xfe52eae7,
  148147. 0x554fe763, 0x270f45f6, 0x30b5405a, 0xa573387c, 0xd56a177a,
  148148. 0x4b71fa82, 0x17c0778d },
  148149. { 0x2735e37b, 0x0e6dff1d, 0x656ec572, 0xc9884e56, 0x9ebba978,
  148150. 0xa2f5ac9d, 0xba09f3c4, 0x40fa4518, 0xf5b04377, 0x8c3fa177,
  148151. 0x967a2eca, 0xa1a1decd, 0x0528bd40, 0x768bca70, 0x18691c4a,
  148152. 0xf224952b, 0xe86d5fd5, 0x16e12c45, 0x37859a6a, 0x7a0d9157,
  148153. 0xa0ffce0e, 0x723f4309, 0xa96cc9a3, 0x5a8db79b, 0x1ad23a38,
  148154. 0x6dd12ae0, 0xe2bf5d84, 0x9ffec3a1, 0xa452ed66, 0xd6ce84e1,
  148155. 0x571fe4c6, 0x1219d5c8 },
  148156. { 0x262969eb, 0x43eaa67f, 0x2f03e773, 0x3a3ab39d, 0x57bb0909,
  148157. 0xe6127e51, 0x8d150274, 0x0f82b0ed, 0xe580bdbd, 0xffffcad8,
  148158. 0xa9743e6b, 0x51d3d075, 0x8bac11d6, 0x1484bdb1, 0xeb24c388,
  148159. 0x95cd9990, 0x7fac67c6, 0x216a61d0, 0xa04e6b87, 0x4308f762,
  148160. 0xcba57cc8, 0x2865dd61, 0xd234a07a, 0x3c296b0d, 0x3a0793f9,
  148161. 0x76f92839, 0x0be29ece, 0x70b57e1f, 0x7e626f42, 0x1314a82f,
  148162. 0xd657f230, 0x2c8d7ab2 },
  148163. { 0x0825e4d6, 0x67cf5892, 0x6ef83b44, 0xdf51eaa5, 0x1310108d,
  148164. 0x63e665d8, 0x8dd0963f, 0x229f89f5, 0x9df6436a, 0x8c4b14dd,
  148165. 0xd45ebba7, 0x99dae469, 0x5a4df381, 0x118aab77, 0x29e37feb,
  148166. 0xda8978bd, 0xaca2d7ef, 0x69ced5aa, 0xc67d6a8a, 0x6c98d05d,
  148167. 0x77f84a34, 0x7474bf0d, 0xed8cd59a, 0xd4428b2e, 0xd1d398fb,
  148168. 0xb0fd1cd5, 0x94a20b11, 0x596013db, 0x1b404c44, 0x96eb705a,
  148169. 0x4b09d958, 0x2299d277 },
  148170. { 0xc64397e6, 0x5b9cd58d, 0xbf6dd31e, 0xac198f1e, 0x3e9f1db2,
  148171. 0x5866d8e1, 0x8fcdc68c, 0x405ae287, 0xe53c01fd, 0xa4b280cd,
  148172. 0x411db5f6, 0xdc963f2d, 0xbec4f8a0, 0xed5d5189, 0x916ee98b,
  148173. 0x336fd13d, 0x042df48e, 0x6925b1b3, 0xace0074e, 0x0cf56291,
  148174. 0x25317e95, 0xe8d38b48, 0x821c446b, 0xc7ad1d2b, 0xf0b65934,
  148175. 0x71c44135, 0x52ca0d50, 0x971b736f, 0x27b46c26, 0xaf9ffa57,
  148176. 0x1936618e, 0x21ac6779 },
  148177. { 0x2d7fbcd2, 0xab420e3f, 0x97bdfc18, 0x12722473, 0x4df5d4b4,
  148178. 0x492033f8, 0x3807b7d3, 0x6fcd4236, 0xb33c3625, 0xdfc19b09,
  148179. 0xa0f22814, 0x13d6f375, 0x037c19b8, 0x70978a59, 0x0ff27b9c,
  148180. 0x4f398997, 0x615a4389, 0xfc0e1a45, 0x3e602f74, 0xffa3496a,
  148181. 0xb261ca1c, 0xc3f1c431, 0xee0164cd, 0x612211db, 0xe7f7be9f,
  148182. 0x30463ee4, 0x92c2e1bb, 0x015f7e78, 0x24483a56, 0x663d88d6,
  148183. 0x0e62d9d8, 0x0e8ec1e7 },
  148184. { 0x8a0878dd, 0xa88ccc29, 0x6640071a, 0x99ac175d, 0xa5173617,
  148185. 0x90344820, 0xdd58a315, 0x316d023e, 0x88d221a1, 0x30785bd4,
  148186. 0x959c48e3, 0xb74b3de7, 0x4c67a771, 0x42ee0382, 0xe0b91453,
  148187. 0x59ef6cdd, 0x9b237e91, 0x7830ae28, 0x495d8325, 0xe1847a4c,
  148188. 0xd0773666, 0x67b1217e, 0xa294a325, 0x58192c86, 0x864d8326,
  148189. 0x76aa0f56, 0xf4b13e5b, 0xe2a2bd12, 0x1b6b73fd, 0xd850c1c0,
  148190. 0x5d103635, 0x653a795f },
  148191. { 0x50dcb199, 0xcfe28985, 0x7fa02b60, 0xb35b8e5e, 0xc97603d0,
  148192. 0xbca7d7c3, 0x27f131b5, 0xb0e5288d, 0xe2b12d52, 0x3aa704de,
  148193. 0x1db725c7, 0xe206b1d8, 0xc5d1b113, 0x0b12839a, 0xdb45d763,
  148194. 0x14f970cb, 0xb2125e8e, 0xc997f93e, 0xee7daa26, 0xbd75739c,
  148195. 0x1fef20e9, 0x46ecbd3f, 0x7c6a42b1, 0xf994a114, 0x27fb0fd1,
  148196. 0xd289eb4f, 0x9a40da4b, 0x11186d31, 0xfb9d7976, 0x083f65a5,
  148197. 0xd444675e, 0x30dfc47b },
  148198. { 0x9eaadfe8, 0xbcfc5ae2, 0xb4d4e812, 0x25027e54, 0x8b533561,
  148199. 0xab0702df, 0x56a6a214, 0xa2b9c204, 0x3059068e, 0xb1a3df7a,
  148200. 0x9883110f, 0xa3514b21, 0xc4b78e1c, 0xb7be2336, 0x3e2f6984,
  148201. 0x17073ce6, 0x2ddf7ac6, 0x86e114a6, 0x07d7c3c8, 0x276192bf,
  148202. 0xeb1ae289, 0x5da69e0b, 0x25184939, 0x983af175, 0x407a3aa0,
  148203. 0x9ac52a4d, 0xae0fe218, 0x1535c7da, 0x397f2501, 0xe16fe872,
  148204. 0x54c212cf, 0x572a591f },
  148205. { 0x09a5553a, 0x49668419, 0x327733bc, 0x3f054318, 0x3eefd690,
  148206. 0xf9ceb4b2, 0xf22126d4, 0xbd3cbf9b, 0x2fed9578, 0x6d9671c0,
  148207. 0xca0306d8, 0xbba597ce, 0x3d674fe5, 0xb705ed61, 0x67f33f76,
  148208. 0xf1d3622b, 0x11cb8c31, 0x15bcf3c6, 0xe53d1aa9, 0xa38467dc,
  148209. 0xf908ab43, 0x902fe929, 0x8d15767a, 0x6e3e499d, 0x90afd07b,
  148210. 0x8142db5c, 0x6c8b190e, 0x120c6fbc, 0x24919a4e, 0x80c86553,
  148211. 0xd8c82c3c, 0x65c2cbe1 },
  148212. { 0xa660bb63, 0x684cda20, 0x86e86245, 0x27dc3b0a, 0x6ba0eed7,
  148213. 0x76472cf6, 0x679dd158, 0x79c162e5, 0x08452d44, 0xb6884277,
  148214. 0x413f579e, 0x829bc6b3, 0x95011770, 0x92ea15ec, 0x47738183,
  148215. 0x5e34e300, 0x73e1d2f1, 0x8c3ca349, 0x229bd3de, 0xa5c4f1dc,
  148216. 0x94ef7ed3, 0x783eff1b, 0xdfae7a1a, 0x46db738d, 0x1a099852,
  148217. 0x4353d72e, 0xa0dcf4ab, 0x2533ad58, 0x0e7888b9, 0xd8055016,
  148218. 0x3ba77f66, 0x831440d5 },
  148219. { 0xf611b2da, 0xf43e2e32, 0xd0fa46ac, 0x5d066e29, 0x820b3c0d,
  148220. 0xe897f3e8, 0x1d3e44f0, 0xc45c28e6, 0xdfd27a66, 0x929d7f66,
  148221. 0x101e8517, 0x735b860a, 0x3de078dd, 0xea3fce98, 0x638ce11a,
  148222. 0xc9977db5, 0x48536b3b, 0x0488382f, 0x64cadfc6, 0x7e0c7a3c,
  148223. 0x82147b71, 0x3cd17f7f, 0x1b411e3e, 0xe95663cc, 0x985fb46d,
  148224. 0x5739ac8f, 0xbcf119ca, 0x385399cd, 0xe15a2815, 0x4a985a70,
  148225. 0x6d5f4566, 0x504c3a8a },
  148226. { 0xb8fa53c7, 0x00b55283, 0x509474e3, 0x985cff38, 0x437ce25f,
  148227. 0x234d241c, 0xe5a129ed, 0x29832430, 0xaabcc674, 0x6ad38956,
  148228. 0x7ee81ee1, 0xa2dc001d, 0x670b2702, 0x4c23c6b6, 0xa6e8a3bb,
  148229. 0xb35e567e, 0xa69673ea, 0xbc70b3ce, 0xe6e28eac, 0x85a7a9c3,
  148230. 0x5537b7da, 0x2ae684de, 0x6de937dc, 0x5ecac3e5, 0xf8430422,
  148231. 0xbf2ea6c9, 0x77fdc520, 0x38caf7d0, 0x69f56add, 0xc27af0b1,
  148232. 0xc71d21d2, 0x496e4699 },
  148233. { 0x9fa93467, 0xba14fc82, 0x0eb2a614, 0xc2e37684, 0x4833e09b,
  148234. 0x659bcfaf, 0x3686bdcc, 0xbc859752, 0x81f3216a, 0x40bfd080,
  148235. 0x17c081b8, 0xc463bda6, 0xbb04793b, 0xbd01fa86, 0x2cd640c5,
  148236. 0x5a21ece6, 0x2203d5c4, 0x97bf6a54, 0x951167b7, 0xceb40edc,
  148237. 0x765ba268, 0xd67aacaf, 0xaeab51f9, 0x8ba0d9e9, 0xb0d6863a,
  148238. 0xc14b215e, 0xe5f06952, 0x354cdcdb, 0xcb3744b5, 0x4f2b5ccf,
  148239. 0x13037fe8, 0x13389173 },
  148240. { 0x45003cd1, 0xee680640, 0x44ae2ac6, 0xfdac17bc, 0xde8e5314,
  148241. 0x4bcd419f, 0xc7cea95c, 0x81e34eb9, 0x38f37e01, 0xbb57762d,
  148242. 0x260990c8, 0xecc4cfb0, 0x50a34a7b, 0x0bc493f9, 0x543304ef,
  148243. 0x68074172, 0x6bc8aa2a, 0xaec0fcb2, 0x3b45fea5, 0x9e7a9b46,
  148244. 0x55fbdbac, 0x4bb2952e, 0x0485dff4, 0x50f0c0a6, 0x4dea4796,
  148245. 0x02c5104d, 0x695e3a02, 0xd2cefa09, 0x6da1f345, 0x4c8102b4,
  148246. 0xf3833fbd, 0x422eb573 },
  148247. { 0xa6ad3f47, 0xac592eb6, 0x9714ba0e, 0xb0861f6d, 0x07281459,
  148248. 0x57c1e919, 0x64ea5803, 0xcf7c94e2, 0x54b12723, 0x725376ac,
  148249. 0xdafb736a, 0xf2a6ba41, 0xcba03cdc, 0xc89e8920, 0x5b0fd3ad,
  148250. 0xf2e20cb4, 0xd66059fe, 0x26ea5a54, 0x889df8bc, 0xee63fa8b,
  148251. 0x66a3f2bf, 0x40f1c7e1, 0x747312e1, 0x09febc9c, 0x727999ff,
  148252. 0x7d19b9c2, 0xb7fd2b05, 0xa9fbbb4c, 0xa0da2dc6, 0xcfba27d7,
  148253. 0x2c252582, 0x368541cf },
  148254. { 0x22799d37, 0x510d3c9e, 0xacfa333a, 0x1b677de5, 0x080f795b,
  148255. 0x4e6ae18f, 0xafc8dfc2, 0x69b53c2a, 0x0e842dc2, 0x797541b6,
  148256. 0xac067fe8, 0xd5a6f2af, 0xbd07d877, 0xd0208a03, 0x654be2f2,
  148257. 0x34b473f0, 0xf515e23e, 0xe67c102a, 0x2ac1af48, 0xb00dbf9d,
  148258. 0xb6a13d00, 0xe264fa41, 0x97e94c11, 0x1669786a, 0x86a586f4,
  148259. 0x09d8cf2d, 0xc7f927e9, 0x073bf869, 0x2241a566, 0xb8977880,
  148260. 0x22261334, 0x59a5bf59 },
  148261. { 0x81347191, 0xe9d1c91e, 0xeb969972, 0x186c1abc, 0xa9d46a7f,
  148262. 0x07888767, 0xdaa7d397, 0xda93cfcc, 0xd91b9aa0, 0x08bee9f1,
  148263. 0xf8dd3c6c, 0x8267fd78, 0x94228100, 0xf93860d0, 0xdadb47fb,
  148264. 0x6a6a71aa, 0xa6156f8a, 0x9caa06b7, 0x39848bc9, 0xaa1b05e0,
  148265. 0x2aaa9135, 0x36ddc237, 0xb13f3bd1, 0x77e7e079, 0x4acc5f4d,
  148266. 0x8d0b5cbe, 0x984cfd36, 0x04da45f8, 0xd3d3e0f8, 0xf14ef618,
  148267. 0x43eb799c, 0x467564c1 },
  148268. { 0xb6fff5d7, 0x8d725904, 0x92dc4752, 0x037f33af, 0x6d20b8aa,
  148269. 0x9095d575, 0x43baec39, 0x32235fc1, 0x68a2b9b0, 0xa2feb4af,
  148270. 0x94d35c61, 0x61c50318, 0xea877486, 0xac92b6a2, 0x011bc6f3,
  148271. 0x8eb48b15, 0xc79edcb2, 0xa28fe128, 0xa5d2a006, 0x9f71bc0c,
  148272. 0x2f15b850, 0xf3167732, 0x7a036218, 0xfe8d728c, 0x4f81e09e,
  148273. 0x068f39cb, 0x7b7c50d9, 0x1773f016, 0xed6a1e03, 0x0d0f7adb,
  148274. 0x4ee984d5, 0x8a0dee16 },
  148275. { 0x47366e6f, 0x504991bf, 0xe86c3005, 0xb8084d9f, 0xa40cce36,
  148276. 0x14c4c751, 0x3f1961e2, 0xbbb46aa6, 0x40445e43, 0x56a785f9,
  148277. 0xc91e215f, 0xdb8d1b57, 0xc7ee808d, 0x6a8e453e, 0xbbaa1e8c,
  148278. 0xc0367ef8, 0xe3e18109, 0x310d91f1, 0x7e20a2c3, 0xf97cfd0e,
  148279. 0x554cc277, 0xf1e80c84, 0x7b628403, 0xe89bbc1d, 0x3fe0a17c,
  148280. 0x7778a966, 0xc1f00073, 0x9e9db19f, 0xb6f6bed2, 0x2ce7fe7d,
  148281. 0xee97ce23, 0x7b04b5d2 },
  148282. { 0x82c5faf8, 0x5b546bc7, 0x8eb81097, 0x1a734c5e, 0xe77851e0,
  148283. 0x3d566861, 0xe956d51f, 0x833a1013, 0xc3c3c37c, 0xc7351731,
  148284. 0xe0c148ec, 0x607738fb, 0xe1bbef41, 0x2ec6f0bb, 0xcfa51857,
  148285. 0x0aa2ac6e, 0x66e3adf0, 0x072902d7, 0xc622d6e3, 0xcd4d5089,
  148286. 0xa6dd802f, 0x3ae21b23, 0x33886372, 0xe5465a55, 0xa8d81822,
  148287. 0xd85119a0, 0x3786977a, 0x4f14d032, 0x9c7b272c, 0x515b081c,
  148288. 0xc99be31c, 0x1c6a95a4 },
  148289. { 0xc2821363, 0xa6b14ad5, 0x4d17de1c, 0x829c1823, 0xccade848,
  148290. 0xaef5d2c4, 0x82489e27, 0xf412ab39, 0xf081d927, 0x92c9c098,
  148291. 0x75cbad1f, 0x6f87bdf4, 0x1a1d9fb1, 0xf4aadab8, 0xb75f3b76,
  148292. 0x475a7923, 0xdbbba8fe, 0x99dd0ad6, 0x4b70ab45, 0x836f6164,
  148293. 0x34bd9af1, 0x2a464881, 0xba9abda3, 0x5c91226e, 0xe65625fb,
  148294. 0x4cec8709, 0x0818e4be, 0xd4b3919e, 0x14f6879c, 0xa5c09c84,
  148295. 0x30a864c9, 0x72708a02 },
  148296. { 0xf34a466c, 0x4f33c0b1, 0x7f9d45ba, 0xa1bae09c, 0x0e28785c,
  148297. 0xd70f0fee, 0x90880881, 0x824c7146, 0xbb043da3, 0xe2416c2a,
  148298. 0xcec6f432, 0x733da713, 0xc9793e1c, 0x2b590649, 0xb35c9365,
  148299. 0xdb62d5b0, 0x3e5c1b2a, 0x355eb6e2, 0xbb16b515, 0xcfe8b5ce,
  148300. 0xf709691c, 0x9e081869, 0x61a85bd5, 0xc865f9fb, 0xfae103f7,
  148301. 0xf169d3cc, 0x73467e9d, 0x9525c473, 0x43695113, 0x7db55c0b,
  148302. 0x73265d21, 0x7491c74c },
  148303. { 0x80d2b94d, 0x312ed5bf, 0xba4b260b, 0x1b8ac633, 0xd62219a1,
  148304. 0xac86c58c, 0xaeb82c8e, 0x317ccf6b, 0x59ef9ced, 0x2dfb29ee,
  148305. 0xe42bcd5a, 0xdaa7d898, 0x5974b201, 0x93e295c8, 0xd9fc5adc,
  148306. 0x69e75784, 0x012aa3ba, 0xd6c4709f, 0xc85d3cb9, 0x1fda9f37,
  148307. 0xd3dd4abd, 0xe5487e25, 0x0b3ba22e, 0x00fd4b01, 0xc6e8dcbb,
  148308. 0xcb591493, 0xbce68664, 0xb7329fab, 0x68906b76, 0x6829d1c2,
  148309. 0x74176841, 0x8bcfd3e5 },
  148310. { 0xd3c8c314, 0x06882734, 0x11870833, 0x95f0b2f1, 0xc068ba16,
  148311. 0xb937f7c3, 0x77924787, 0x5365e0d8, 0x1f992227, 0x15527e5e,
  148312. 0x27dffd4f, 0x0a069648, 0x2f586389, 0xd58b3df2, 0x6af20ead,
  148313. 0x83446b89, 0x50746257, 0x09d7970b, 0x4022a691, 0xd9e8d206,
  148314. 0x671ec379, 0xd1e5f8af, 0x057fe91e, 0x6f542509, 0x52890418,
  148315. 0xf14dda81, 0x1db932ad, 0xbd78010e, 0x905a9378, 0x3e18d1e4,
  148316. 0xbd37ab49, 0x53cadcf7 },
  148317. { 0x5e53d0ff, 0x1bb5edf7, 0x888abf67, 0xd886606c, 0x12206d15,
  148318. 0x6491b0f8, 0xe22b6a33, 0xb3018345, 0xb173b317, 0xaba6794b,
  148319. 0x7dc9e595, 0x8c1e5867, 0x239624d1, 0x4e106482, 0xda55dd53,
  148320. 0x61752e59, 0x9e42879c, 0x018b4eab, 0x491f2bed, 0xcaf6784b,
  148321. 0x1e79429e, 0x3dcdb9d2, 0x10f26224, 0x36941485, 0xa650ec5c,
  148322. 0x106f190a, 0xb69a9760, 0x7542a5ae, 0xc32d1046, 0x69bd75e9,
  148323. 0xbf8c62b1, 0x90849964 },
  148324. { 0x5a93c661, 0xb1390cf6, 0x9db5f056, 0x18486264, 0xa51a1788,
  148325. 0x92a93a9d, 0x6772de9a, 0x1b0cbb8f, 0x7c71487c, 0x6e67febd,
  148326. 0x4e62423e, 0xf9b4382d, 0xbb5a42f8, 0x96fda50e, 0x6089a4f2,
  148327. 0xc921b337, 0x875ec516, 0x49d32d7b, 0xc410124b, 0xbd86d2ca,
  148328. 0xc421fb7a, 0xf6862209, 0xf6b7de33, 0x3e1949ab, 0xe93c9268,
  148329. 0xcdee18f0, 0x08dc4cc0, 0xd4edbd5e, 0x73580d22, 0xc2b75be4,
  148330. 0x468cd7e8, 0x3d7f6ffa },
  148331. { 0xdffbd5d1, 0xea7b290c, 0x970338df, 0x9d759da6, 0x90feedc9,
  148332. 0x56680b08, 0x42dce68e, 0xbc690af5, 0xb2ae4d82, 0x8519df2b,
  148333. 0x7f195b60, 0x5612467f, 0xd83c21f4, 0x659a342c, 0x55651633,
  148334. 0x55771bf5, 0x548ba562, 0x5fc68935, 0x9492f23a, 0xb5419203,
  148335. 0x9c9c6017, 0x567528e3, 0x511e6019, 0x3f064ed4, 0x1d16a555,
  148336. 0x303f9eb9, 0x2254abee, 0x3e18c4fd, 0xfd434e7c, 0x40994d6f,
  148337. 0x6dde74e6, 0x8fb12d3f },
  148338. { 0x293cb7a4, 0x6c6381a2, 0xb87b7e4d, 0x453e09f0, 0x078ac3ef,
  148339. 0x4f212823, 0x578cae91, 0xe89ffad0, 0x716ba4dd, 0x4a2b696a,
  148340. 0xf6f580a0, 0x14681a14, 0x4c2f1307, 0x1358f97b, 0x2932fb89,
  148341. 0x87896996, 0x268a5af7, 0x29dd850a, 0xfe239f83, 0xaf771f6d,
  148342. 0x4f47499d, 0x5f20fd2e, 0x867ca0e9, 0x9b643e77, 0x375981ec,
  148343. 0xe7858ecd, 0x19ab1c97, 0xbe946a59, 0x06ff3453, 0x4f9303a2,
  148344. 0x75d237b1, 0x3fcc6731 },
  148345. { 0xdf21f920, 0x509debd5, 0xc1401b90, 0xfaf70e1f, 0x95a64aaf,
  148346. 0x2429cbfd, 0x2c37a122, 0xf2120855, 0x7deb926b, 0x1d4c93f4,
  148347. 0x9fb3f1dc, 0x12f3e4c0, 0x5b51bc46, 0x56085a59, 0xf10fdbd2,
  148348. 0x2a2f5d62, 0xdf0cb3c2, 0x60dd62cf, 0x6b0f254b, 0x154424a3,
  148349. 0x564612b7, 0xc3a5a05d, 0xa1f5249c, 0xbebe30cf, 0x7e62a188,
  148350. 0x24ec6903, 0xaf429939, 0x75f0fbac, 0xb3fa8685, 0xd41345dc,
  148351. 0xc7151c34, 0x645146fd },
  148352. { 0xba1924f9, 0xecec633a, 0x006326e1, 0xbba6f136, 0x7e50fc17,
  148353. 0x203757ac, 0xef3d8e00, 0xca531919, 0x51dc5a74, 0x9545a6aa,
  148354. 0xd31412b8, 0x6e21d58f, 0x7bb1d000, 0x01bc3005, 0x6ed1a9c3,
  148355. 0xf1789c69, 0x9858fa48, 0x7af2d35f, 0x8197be85, 0x434d09b9,
  148356. 0x29aa265d, 0x1dc07755, 0xc058fa80, 0xcad03be7, 0x54ba14ce,
  148357. 0x92d70a9f, 0x6c050a74, 0x6dc78505, 0x4d005dda, 0x2a7ca4a9,
  148358. 0xabfb9f2e, 0x448d3d72 },
  148359. { 0x29b33989, 0xdc56f145, 0xa9ae815a, 0x868351bc, 0x4b074414,
  148360. 0xb3f45613, 0x3cd9f33b, 0x955ce42a, 0x5ff6e4a3, 0x13ade4ec,
  148361. 0xa50eaa91, 0xd3aac715, 0x5666efdf, 0x0c61ec99, 0xf6a4470a,
  148362. 0x108a28b8, 0xe54844c9, 0x402ef584, 0xd0e2f337, 0xb825b162,
  148363. 0xb46f7cbc, 0x3dcd131f, 0x96f2fd89, 0x208178ec, 0x25928c78,
  148364. 0x4d8c5d67, 0x9963c459, 0x285a33df, 0xd92a309f, 0x72497175,
  148365. 0xcb7019a5, 0x76881479 },
  148366. { 0x91767eed, 0xba43a114, 0x92bf65db, 0x5e11b9ad, 0x03a5e21a,
  148367. 0xe8a22ce0, 0x2a335415, 0x63604421, 0x4a9ead62, 0xc2c563b4,
  148368. 0xa0b2aee5, 0x4bc06264, 0x8bf2e1d7, 0x75b8d575, 0xd08a265d,
  148369. 0x1cff0ee7, 0xb0b712a7, 0x17914e1d, 0x4b18692d, 0xc35925d0,
  148370. 0x56cce815, 0xde253f4c, 0x9fff0e3a, 0xa479241c, 0xddabed19,
  148371. 0x50b9d06e, 0x59fae506, 0x67135260, 0x532ce180, 0xf37600fb,
  148372. 0x5e5a8626, 0x670eb01c },
  148373. { 0x73cdbb43, 0xdf73c0af, 0x7f2431ad, 0xcf08ecc5, 0x2a1a3845,
  148374. 0x91780541, 0x9224ddf1, 0x69a104f2, 0xbeac7eff, 0x4352f38d,
  148375. 0x7c2d1322, 0xfc3b3b4e, 0xb5e4b476, 0xa69e9430, 0x975a46f0,
  148376. 0x7d932340, 0x5d64eece, 0x8093899e, 0xdb2345e9, 0x7b821250,
  148377. 0x7f4b796b, 0x23552932, 0x4bb90b1f, 0x2ee9cc15, 0x9112f7d6,
  148378. 0x1fa9c8f5, 0x1cbaae32, 0x2d0f2f98, 0x0075166a, 0xb77f0366,
  148379. 0x635dff27, 0x504852e7 },
  148380. { 0xa2f392fa, 0x2f0f3ce5, 0xec6c9078, 0x326c076a, 0x84baaaf6,
  148381. 0xad01de92, 0xcbe8e993, 0xb01b16d3, 0x2d950908, 0x71305c24,
  148382. 0x3853af38, 0xc66fd617, 0xd3c429a0, 0x7735140e, 0x1fabf027,
  148383. 0x8a31b12a, 0x058b3177, 0xa0530002, 0xa9c7deb9, 0xabffd9fc,
  148384. 0xe8667d30, 0xd05ef69b, 0xe9a9e13f, 0x2f3a7308, 0xb91eae9c,
  148385. 0x3f4c9a19, 0x618ce6c4, 0x50d0cee7, 0x5240f8b0, 0xfb24dc40,
  148386. 0xf7e90cc4, 0x992fe151 },
  148387. { 0x38f197aa, 0x4454db31, 0x87872f98, 0xa4ded69d, 0x44f0a828,
  148388. 0x97b427b0, 0xa31e48c6, 0x9821e1ae, 0xdd98efec, 0xe38cb09f,
  148389. 0x480cb3ae, 0x20b84fa8, 0x47475573, 0xba5bb4a8, 0xcd50e96b,
  148390. 0xa9be080a, 0xef103550, 0xc4451e9c, 0xc441325c, 0x626ee75f,
  148391. 0x38a5e33d, 0x6eea5e98, 0xa2b0abd2, 0x7321beb9, 0x9b6082a9,
  148392. 0xca92e484, 0x992bcc2a, 0x1dc8168a, 0x9c8eb9fb, 0x134ecf4b,
  148393. 0x4c5b71e0, 0x5a68bfa8 },
  148394. { 0xff0a2bfb, 0xb4ff3b45, 0x5502f8b0, 0xd105fff9, 0x5b1c0c26,
  148395. 0x14de5885, 0x0d3b9d04, 0xed16865b, 0x026d3917, 0x2f5a2453,
  148396. 0xf4db3c0e, 0x6a22f493, 0xe2418f2e, 0x4871548a, 0x509bef61,
  148397. 0x6ab363a8, 0xb8cbbbec, 0x91ca1e3a, 0x4011a396, 0x71e0dc98,
  148398. 0x0d5ca577, 0xff982e0a, 0x81897bc1, 0xeb40b045, 0x085ad5e7,
  148399. 0x4bc24a46, 0xa6337b7c, 0xd15c8fa0, 0xbef1628f, 0x56ce6ef7,
  148400. 0x9f5ef439, 0x78acfdf9 },
  148401. { 0xf8520189, 0x45bf7f15, 0xc77f61c4, 0x954202a0, 0xdfa22e1b,
  148402. 0x39edc6b9, 0x1f4a3487, 0xd2d60267, 0x4814cc52, 0xcd933929,
  148403. 0x05e9f123, 0xde76a124, 0xae36b6f7, 0xe2306ea0, 0xb83a58e0,
  148404. 0x53815218, 0xa041231a, 0x9862bb76, 0xbf31be71, 0xe8da253c,
  148405. 0x37de861f, 0x2dfc5332, 0x90ae4890, 0xf25c93f6, 0x8baa6ed2,
  148406. 0x66bcb8f0, 0x908b4a29, 0x6f10ae0f, 0xb061c949, 0x8cb4b48c,
  148407. 0xd075a366, 0x0ad92d73 },
  148408. { 0xc2ca548a, 0xbfb95fed, 0x80cd89ab, 0x4778c620, 0x3466c280,
  148409. 0xbe99154b, 0xd4be8902, 0xea3be093, 0x13e681ed, 0x847b7995,
  148410. 0x02f40161, 0xf22a8f4b, 0x4aeb7fe8, 0x3ef2cb4d, 0xb3aed5f6,
  148411. 0x9adc5151, 0x98c31163, 0xec1ccfd1, 0xa3d7d88f, 0xdc2ac17b,
  148412. 0x46421097, 0x08fa64d3, 0x94b90bcf, 0x5ebf80b7, 0x0b50a9eb,
  148413. 0x1b78b4ba, 0x279aa66b, 0x1a4fe934, 0x075b3ced, 0x8ef4dcaf,
  148414. 0x70a6e9ae, 0x95bbd8a0 },
  148415. { 0xe614bbd0, 0x59f92495, 0xb823e363, 0x7567a887, 0xfc1bd6a7,
  148416. 0xe247c9ec, 0x8e835c42, 0x2bfaaf47, 0xaade066a, 0x314ef4e0,
  148417. 0x5c16d336, 0x072baa63, 0xe2f0e389, 0xfa429c71, 0xbd07d90f,
  148418. 0xcac1e5d0, 0x514f5c04, 0x69ff35ea, 0xc0554ec1, 0x893053fc,
  148419. 0x2a35947f, 0xab1d86b7, 0x2aebe487, 0xe29fb060, 0xdfb9cf21,
  148420. 0xa0a10d6d, 0xf20dfcf5, 0xad147059, 0xb8867a2a, 0x480dc66f,
  148421. 0xc125a919, 0x375a884f },
  148422. { 0x1217f7ea, 0x178cbe2e, 0x875c6dab, 0x1a161e2a, 0x1bdb1a54,
  148423. 0xf7707ec0, 0xe4fd73ca, 0x678864a0, 0xd13a0d86, 0xbaebc664,
  148424. 0xc8d30668, 0x40325f99, 0x2f1c5950, 0xb93ed9c9, 0x541e0667,
  148425. 0xfdf36763, 0xb91a6763, 0xfd97fbb0, 0x6079c9a0, 0x26aa69ea,
  148426. 0x1eaa8c47, 0xc7303c80, 0xafa63c55, 0xdec75c81, 0x4fd12adb,
  148427. 0x01cdcde2, 0x1968838a, 0x9fe0dda7, 0x38415379, 0x66bb093b,
  148428. 0x08cb84ec, 0x268d818b },
  148429. { 0x41580555, 0x73dae358, 0x473d103b, 0x4fc32e67, 0xbeccc1ab,
  148430. 0x240c1013, 0xb24ee9de, 0xda4099f2, 0x9fa8e066, 0x37b0cb5b,
  148431. 0x6438d7ee, 0xb5ae04e4, 0x2b720140, 0x7f7d3164, 0x339e4a78,
  148432. 0x86ef4edb, 0x3a7d8375, 0xa5e77eed, 0xbd707c2e, 0x883fad37,
  148433. 0x0f979189, 0x816b633a, 0x2e7a208e, 0xe24c028a, 0x4435516a,
  148434. 0x1171fe3c, 0x4f5f2bf5, 0x3eb93b33, 0x01b53a56, 0x8419ed4b,
  148435. 0x056ca44b, 0x8b02735c },
  148436. { 0xe1019195, 0xb89bb464, 0xf3fc28c1, 0x1de4c026, 0x2bfc3b21,
  148437. 0xac120e6e, 0x91bdf92f, 0xec71bc5a, 0x0d995bc9, 0x485d7ab4,
  148438. 0xe6491ffe, 0x97c6768e, 0xafbce265, 0xd9552d19, 0x8e1b76c2,
  148439. 0xbae6c7fe, 0xd7e3ad1b, 0x167d8281, 0x5e989734, 0x3e149af9,
  148440. 0x8a0c8182, 0xd1f0024c, 0xc3006c0d, 0xf571ffdb, 0x58773d4c,
  148441. 0xb32ecf7e, 0xfd3540d8, 0x5822a782, 0x04365042, 0x5ab45c3f,
  148442. 0x4b4d85fe, 0x400e3aa0 },
  148443. { 0x5e46e4a2, 0x47321649, 0x24136074, 0x37a2ed64, 0xc60ec77d,
  148444. 0x659223b1, 0xe5e0ac2e, 0x5e13aac3, 0xc5107ab7, 0xda17c41b,
  148445. 0x73c253db, 0x65b22ec9, 0xa5012296, 0xff3867b8, 0x0621a99b,
  148446. 0xfed660d5, 0xc89fc3f5, 0xa3c28506, 0xf16451a7, 0x3ed350b9,
  148447. 0x67cb586f, 0x27c3e032, 0x967185b1, 0xc807c779, 0x4a13009b,
  148448. 0x09c157d4, 0xadaf1f4d, 0x362f7647, 0xf3a6a198, 0x4a42b9ac,
  148449. 0x8da6e039, 0x131c3da2 },
  148450. { 0xa7da83ba, 0x4a785ff1, 0xd04f4436, 0xf415b425, 0xec03f812,
  148451. 0x7c0899bd, 0x80f5f4a2, 0xc58d411a, 0xfda251b9, 0x3d32d610,
  148452. 0xcd3b2f32, 0x99bb4504, 0xf4c2083c, 0x198c444b, 0x730e83fd,
  148453. 0x60c261af, 0xcb02db90, 0x060ca4df, 0x9df1e7c8, 0x0ff7838b,
  148454. 0xc4c690c9, 0x6b79cf97, 0x5d75f154, 0x131514d7, 0x1cb0e8ff,
  148455. 0xa7c074f1, 0xb2c17615, 0xb920aac1, 0x44aa0ff0, 0xde8098ad,
  148456. 0x34545ce9, 0x71d1a46a },
  148457. { 0xfa1b382e, 0x76178f76, 0x772dda0d, 0xa0d8ecc3, 0xc5d4d130,
  148458. 0xaa5aab2a, 0x8d72622c, 0x27d38ba4, 0xca3bed06, 0xc5410db6,
  148459. 0x793ceccf, 0xf637a588, 0x6e65e3d7, 0x1f65dafd, 0x60a45641,
  148460. 0xc3b44a85, 0x4f78540b, 0x0f47b3a8, 0x5e4d60f6, 0x824fdadd,
  148461. 0x17d3b6d5, 0xd8ccf90c, 0x325fc13a, 0x008eabdf, 0x3648fab9,
  148462. 0x3e90d716, 0x24c52d4b, 0x3964ff3a, 0x533d0acb, 0xb95cc416,
  148463. 0x1167f521, 0x6cd2699f },
  148464. { 0x12f4f3ac, 0x2d8c0b3b, 0x99d1bdfb, 0xb03dcfe2, 0x30f37326,
  148465. 0x540034f8, 0x7c5a8c82, 0x22dd6893, 0xcd8f1442, 0xeb7093d0,
  148466. 0x585742f2, 0x892795a7, 0x087adadd, 0xe15f282c, 0x16ab7b5e,
  148467. 0x7bbdc749, 0xa58acbb4, 0xd30fe40b, 0xe2bac39b, 0x0de417eb,
  148468. 0xc61a04bc, 0x4b4b19a6, 0xf2735569, 0x9338c34d, 0x30ab196f,
  148469. 0xe8f03742, 0x6c88c965, 0xfa2efcb8, 0xc7eeb826, 0x19eee274,
  148470. 0xda345dc2, 0x327c063f },
  148471. { 0x5b47cd53, 0xab399eff, 0x1943aefe, 0xbbe9869d, 0x1402a866,
  148472. 0xe64ecc7b, 0xb1c25a16, 0xc3e7c2aa, 0x022de271, 0xc4216b79,
  148473. 0x366d6a5f, 0xe58dfcc8, 0xda813336, 0xd159509e, 0x130bfb7c,
  148474. 0x370400f2, 0x93b48780, 0x1be4e059, 0x39f3cd22, 0x0623a1fe,
  148475. 0xeecb4f87, 0x72aa22b2, 0x6c27b83b, 0x1af4c496, 0xda5fa5bf,
  148476. 0x7a42a94b, 0x48b01af2, 0x9afba822, 0x3670112c, 0xeb6b9d2a,
  148477. 0xc0df6856, 0x020f19d1 },
  148478. { 0xa4dbba20, 0x37051a86, 0xdb1de5c5, 0xb618ebc6, 0xe6525840,
  148479. 0x9a780a19, 0xd2bccc4d, 0x9440302d, 0x10285a24, 0xe9ff023d,
  148480. 0x3a486268, 0x3b937ee3, 0x4cd61147, 0xe37ee2f2, 0xa3d057cf,
  148481. 0x79fbbfd3, 0xccddefce, 0x5fba16d3, 0x5b231727, 0x916058ec,
  148482. 0x720c3adb, 0x47699ebe, 0x8b4f6bba, 0x26274386, 0xf18a0770,
  148483. 0x54b0092a, 0xacca1160, 0x99d090eb, 0x0c888f60, 0xf757e1ff,
  148484. 0xb0050544, 0x79e72720 },
  148485. { 0x2820a239, 0x632acf25, 0xaae6b310, 0xb1a3974e, 0x48c0a1df,
  148486. 0xd61fd6ba, 0x5a3ee7aa, 0xd2453c39, 0xb980446d, 0x548455a0,
  148487. 0xde16676f, 0x9f29d97b, 0x789375a1, 0xf252ca0c, 0x7743a985,
  148488. 0xe961af3e, 0x66cdbd8d, 0x70c79c56, 0xcbc538f9, 0x14a3854e,
  148489. 0xa126851c, 0x58daa73a, 0x2a9f558c, 0xe9b5bb45, 0xfbd15e05,
  148490. 0x37af7f83, 0x38a1939d, 0xa4487927, 0x9511a056, 0xe428b2b5,
  148491. 0x7015846d, 0x001d3ce3 },
  148492. { 0xe145b1d7, 0xd6be36b9, 0x009c5664, 0xf3e3938a, 0xe7c0f6db,
  148493. 0x2e562e7d, 0xc343f539, 0x951044e6, 0xd90897b1, 0xa5ab62b8,
  148494. 0x512f797c, 0xb1a1f70b, 0x750f28e4, 0x91cdd754, 0xffb8165d,
  148495. 0xb4c80e2f, 0x594d02b3, 0x65ed39c7, 0x56833edc, 0xcc12a49d,
  148496. 0xf3693a18, 0xe73694bc, 0xfcd2c404, 0x34cc134a, 0x11d40194,
  148497. 0x071bd5fc, 0xfc585e46, 0x05759047, 0x790b7a04, 0xb3280360,
  148498. 0x40afc684, 0x4bb8c6fc },
  148499. { 0xfd0f8796, 0x3120e2dd, 0xb133c9de, 0x6968a40d, 0xa9369c6e,
  148500. 0xfea366c0, 0x6007273b, 0x37e5b6d6, 0x8cb81439, 0x39e4ecf0,
  148501. 0x9febc005, 0x487fe9cd, 0x0199b53c, 0xeb8af444, 0x293519eb,
  148502. 0x2f124e3b, 0xc82c9c16, 0x860c218a, 0x709dc590, 0xacd1d6f2,
  148503. 0x36d50529, 0x5696d545, 0x59120bfc, 0xc03f5df9, 0x10ffa690,
  148504. 0x99a3e88d, 0x6c432827, 0xd4f9cfa5, 0x9a135d89, 0x2e8fea9e,
  148505. 0xb6a77e78, 0x3699a881 },
  148506. { 0x1eb1c64d, 0x5bca3372, 0xf1d28154, 0xe9cf3a2d, 0x6537106f,
  148507. 0xb7e2e9b3, 0x4f7cbf4d, 0x06c17151, 0x2058b37f, 0xcbde416e,
  148508. 0x8834e9c5, 0x82c53a7e, 0xe9ac3a75, 0x94dbdfe2, 0xc5e67c02,
  148509. 0x795ec6cb, 0x1426a80d, 0x8c23c25f, 0x6a8d4f9f, 0xee2cd20d,
  148510. 0xd3b7c235, 0x838daa54, 0x3d7a4d52, 0xb9e08ec0, 0x781cb473,
  148511. 0xca9475e9, 0x5ec31caa, 0x7271f39e, 0x82535187, 0x1df08e9f,
  148512. 0x208aff8b, 0x4f3a4b03 },
  148513. { 0x1ed095f8, 0x0f7b8107, 0xda226d4e, 0x23e37fa6, 0xafb36d1d,
  148514. 0x8b0f9852, 0x07d8e311, 0xb114634e, 0xe3e0f16e, 0xb9634a97,
  148515. 0x421eec37, 0x2454bb9c, 0xd72b21c1, 0xb4ecd5db, 0x6df20d7c,
  148516. 0xf9603868, 0xdf86e0a2, 0x9f5359fd, 0x5ac488aa, 0xc43d54fa,
  148517. 0xd1049df4, 0x56d714ab, 0xb020607a, 0x13152b3e, 0x7a02325e,
  148518. 0x49be1c18, 0x52ae84db, 0x44f24f4a, 0x0b5a7b80, 0x9e525c03,
  148519. 0xa6d179fd, 0x6d874446 },
  148520. { 0xbe9a42f5, 0xd29d07aa, 0x3781ccc8, 0x1fd5316c, 0x9dc69ea1,
  148521. 0x71a75a6d, 0x88fee91a, 0x4e19e0df, 0xf8d44f12, 0x99c2b4dc,
  148522. 0x31ae94e4, 0x05f6df92, 0xcf28ccc2, 0x27fba876, 0xf57f7ceb,
  148523. 0x6e1a0f01, 0xf3fd3b74, 0xe03f1f34, 0x42c1d213, 0xa0edc4a7,
  148524. 0x7deb8580, 0x5caac270, 0xaf0848bc, 0x0f5d791f, 0x07ac759d,
  148525. 0x17f514ad, 0x904fc531, 0x95a39734, 0x7bb70f3d, 0x95a4aca9,
  148526. 0xff9c5609, 0x3cf384c9 },
  148527. { 0xce1fc9e3, 0x700506ba, 0x676b0399, 0x49721742, 0xe72bf7b3,
  148528. 0x2b4a1b8d, 0x79b209f7, 0xca8602a8, 0xce26a8e1, 0x90580b90,
  148529. 0xfe24f39a, 0x1ef339b7, 0x629362e1, 0xb6c5d991, 0x577b24f4,
  148530. 0x51174e1a, 0x05e451e9, 0xf380fcb5, 0x148321bd, 0xf4d97afb,
  148531. 0x747e5d2a, 0x099806bb, 0xbe99a608, 0x85525d65, 0xd455e820,
  148532. 0x264828d9, 0xd8560a65, 0x8c8c5405, 0x71030770, 0x3c67e73c,
  148533. 0xee73df26, 0x2b248850 },
  148534. { 0x8541159f, 0x2173cde6, 0x4fb410b2, 0x78224c18, 0x1f2ca1c7,
  148535. 0x07a28619, 0xa8b23e40, 0x52c207d6, 0xa6b2344a, 0x071a0210,
  148536. 0xb5ed2945, 0xdb0e587c, 0x810fcc6c, 0x6c56b8ef, 0x62d843b9,
  148537. 0x1248c58f, 0x74c66975, 0x4b90363d, 0xe66c66f6, 0x6348f7f2,
  148538. 0xc126bcbe, 0xb2f9d441, 0x73ce49e8, 0xac07f2a3, 0xe81b0df0,
  148539. 0x52486758, 0x1d4621d1, 0xa108b54d, 0x74414a1c, 0x17261ece,
  148540. 0x6a3ac215, 0x938b3bcc },
  148541. { 0xe4ded340, 0xa9e4a16b, 0x80e88036, 0x8e65fb2a, 0xdcd73acb,
  148542. 0x97089606, 0xaaa657a9, 0x1c3a0434, 0x49101b06, 0xf304fc58,
  148543. 0xda0bb64c, 0xe60fb61a, 0xf5542df5, 0x818c2aec, 0x56f76d5f,
  148544. 0x74020576, 0x92533d97, 0xb566b790, 0x74d6eb5f, 0xae4655e5,
  148545. 0xa55b44b7, 0x60f7a1b5, 0x93747ea5, 0x7970179b, 0xf2dace56,
  148546. 0x8ae7e0e8, 0x84e83c06, 0x98474607, 0x15307341, 0x24e8c9ed,
  148547. 0xd9e89d6b, 0x6cff58a5 },
  148548. { 0x03e51f68, 0x508c01b0, 0x1d2fe7d6, 0xe1d1f225, 0x09bd8805,
  148549. 0xf7998d0b, 0x03e415b7, 0x255e907a, 0x607d9798, 0xd148467d,
  148550. 0x9b453896, 0x055c3b1e, 0x809f50f4, 0x35001013, 0xd0233fdc,
  148551. 0xfbbb2fa6, 0xff1820b8, 0x0b680b0a, 0x38d317e0, 0xb1d404dc,
  148552. 0xccc8c7df, 0x133d5444, 0x6ec13f84, 0x7fa847e6, 0x046e2e48,
  148553. 0xc33f83d8, 0x4863b3ac, 0x3c627fc5, 0xeb936af7, 0x5f67f8aa,
  148554. 0x31b79327, 0x5fe4ac8f },
  148555. { 0x8b6f401e, 0x581aa4bf, 0xad5c7ed4, 0x05db12a3, 0x6fb07b4a,
  148556. 0x7b018726, 0x9c22bcd4, 0xfdd11f04, 0x69371c95, 0x5454a7d4,
  148557. 0x99a46eaf, 0x066c55fb, 0x7fef96d0, 0x18637c7c, 0x6b83e95c,
  148558. 0xbafc1d34, 0x00bb42dc, 0x55c38593, 0x34e7e712, 0xdd8dec2b,
  148559. 0xb184cee8, 0x69c9cfb0, 0x49a27864, 0x8dcc0c42, 0x2010f2e7,
  148560. 0x290d95f2, 0x6977a420, 0x86e254c9, 0xeb2abdad, 0x20931c89,
  148561. 0x121c0548, 0x81377164 },
  148562. { 0x9c5a8edf, 0x6266b25e, 0x1078a7ad, 0x6e1388c2, 0x4876eedf,
  148563. 0x5f02737d, 0x62744617, 0x242fa7f9, 0xb385382a, 0x3e2cfbd9,
  148564. 0x02f71bef, 0xbadad7b1, 0x677d0a92, 0x562abcfa, 0x51fdff34,
  148565. 0x573ebd17, 0x7c250c78, 0xd7f65852, 0xc47ca896, 0xe0cf16ee,
  148566. 0x67622c9e, 0x8ccd79b0, 0xf8f2c075, 0x31fc5882, 0xa6008515,
  148567. 0x9232b37e, 0x82e8c5ba, 0x4d7bb361, 0xd2f146fe, 0xbf24735c,
  148568. 0x9cd2db98, 0x79c280ee },
  148569. { 0xf2b48122, 0xbdcc8203, 0xb04ac48e, 0xa8c04916, 0x9fc4885e,
  148570. 0xacf064dc, 0x82c1001c, 0xab838997, 0x676de250, 0x7339e721,
  148571. 0x8e1ab820, 0x17aa5aea, 0x6bc14b2e, 0x24d28ca0, 0x816b6230,
  148572. 0x570c5bb7, 0xcee6b606, 0x6c51235c, 0x183eae42, 0x1b2bf89f,
  148573. 0x9c66274b, 0x3e3af3c6, 0xb51e38bc, 0xe0b04426, 0x73e40e3b,
  148574. 0x26dbc58e, 0xb5be5be4, 0x3f9dd578, 0x52c8f408, 0x9fd9f791,
  148575. 0xa9e3ff4f, 0x758073a4 },
  148576. { 0x8691ca22, 0x7d27b057, 0x13a2a1b6, 0xf206bfd6, 0xac795413,
  148577. 0xe84bd385, 0x75536607, 0xc5d18a2a, 0xc8a0e24c, 0x2e166de7,
  148578. 0x3c474dbd, 0x56d5750c, 0x1366843a, 0xdef444c1, 0xcf4b8432,
  148579. 0x14646e53, 0xa9fd9783, 0x4bc0d030, 0x297ee203, 0xbda4c824,
  148580. 0xfd7be6c7, 0x3d0b10bf, 0x08c7f3ff, 0x2d216476, 0xb4fd4c45,
  148581. 0x06e52599, 0x49e9e104, 0xfbab9fa1, 0x8661d32d, 0x9342a7fa,
  148582. 0xfaf66aa8, 0x3f3e3458 },
  148583. { 0x951597aa, 0x51ec35af, 0x49df64eb, 0xb677d4ac, 0x9bf4eff5,
  148584. 0x0276cd9c, 0x515a2935, 0x423eca49, 0xfd9bb9c3, 0x8a696553,
  148585. 0xede1f09c, 0xf99ee9df, 0x199e5f98, 0xb8fa2956, 0x35292c32,
  148586. 0xb7638758, 0xfc40e81b, 0x8734eddc, 0x65457d95, 0xd82d5e9f,
  148587. 0x30c78d2b, 0xc8ee323e, 0xc1433d67, 0xe77b2e4c, 0x3c8314ae,
  148588. 0x56d9f807, 0x2a0e2f63, 0x441eede2, 0x6c48295e, 0x1e9e17ed,
  148589. 0x34c294ef, 0x640d20c4 },
  148590. { 0x3284d513, 0x4e9a0b8e, 0xf315053a, 0x074c3545, 0x45acd52a,
  148591. 0xb36e7407, 0x1de50db7, 0xd80bdcfc, 0x2549fc46, 0x8d9d47dc,
  148592. 0x303f07a8, 0x29b6ef13, 0x6d4ad4c2, 0x4e461aca, 0xfc9f1b73,
  148593. 0xca8e351d, 0x57460e65, 0x8bc4094d, 0x0f32d367, 0xb6302b33,
  148594. 0x285742e8, 0x69a074b6, 0x876c29c3, 0xdfe52b11, 0x912bd17a,
  148595. 0xf39e4609, 0x349aa639, 0x8ee40d66, 0xc72e05c1, 0xb968902a,
  148596. 0xc0d92816, 0x0f9c1ca8 },
  148597. { 0x67433df3, 0x1ebbaab3, 0x15d3628c, 0xb6aa5347, 0x97f0c5cc,
  148598. 0x13a320d8, 0x65e408f9, 0x72c918cb, 0xd5373451, 0x4b638854,
  148599. 0x0b4dca09, 0x731399a3, 0x0a3b1326, 0xcf256730, 0x6608b388,
  148600. 0x5ea60dfa, 0x7b290dfd, 0x58ad74b0, 0xd7694f9b, 0x83202789,
  148601. 0xb6630fb1, 0x48593db8, 0xc65e3eaf, 0x3db47f70, 0x3e7263f8,
  148602. 0x63949c91, 0xe6e6ff33, 0x9b9acec6, 0x098a8240, 0x34bd9ba7,
  148603. 0x45d36ec5, 0x7e31c12f },
  148604. { 0x0dfd2dd7, 0xbe281d68, 0x24ab61d8, 0x1efacb00, 0x94431f97,
  148605. 0xb9c3005f, 0x959cb3bc, 0x660c8dfa, 0xcffbb406, 0xfdd5fc30,
  148606. 0x7969a10d, 0x7a4631be, 0xde13fd1b, 0x336e309e, 0xfc947076,
  148607. 0x76b3bfad, 0xdcc72223, 0xfa91925d, 0x156c4ee1, 0x741f0d73,
  148608. 0x0e2b3747, 0x4f64ee41, 0xefc4d93c, 0x86be92d3, 0xfc4fbb2e,
  148609. 0xc53b7e03, 0x337ca1bb, 0xac196cf5, 0x7e23ba60, 0x4de41a30,
  148610. 0x326d5357, 0x1a219c45 },
  148611. { 0xaa4db0bc, 0xfdcf7ef8, 0x7b6c9963, 0x2e231806, 0x3d8a192f,
  148612. 0xc2639067, 0xffdc7771, 0xc0cec2e2, 0xa2fc0edb, 0x997c8e35,
  148613. 0x82cc6043, 0x78e10ec1, 0x2b0c8120, 0xfd0de2cb, 0x69e57f8e,
  148614. 0x4d6c457f, 0x5b53f1c3, 0x953e69b2, 0xc4f89cb8, 0x422a330a,
  148615. 0x95566be6, 0x92ff2329, 0x437442d1, 0x73cd502d, 0xbea69403,
  148616. 0xf04ce590, 0xf8030662, 0x6ac1537e, 0xb6d0bf93, 0xe02bcf77,
  148617. 0xbc90192f, 0x17aaa999 },
  148618. { 0x8e55db2e, 0x0d3d5643, 0x3b946851, 0x835dee43, 0x5b88462f,
  148619. 0x1a1440e5, 0xea17e27c, 0xa6ff3b35, 0xdd95f7a9, 0x23f99c36,
  148620. 0xbdd672cf, 0x7217fdd9, 0xdd2045c0, 0xf400ac1e, 0x4ff06b25,
  148621. 0x94b55c87, 0x0e4a49be, 0x0a44a0e5, 0xb43b6813, 0xe8925e91,
  148622. 0x214f96c5, 0x78bedde1, 0x0f97fa97, 0x0f456a4c, 0xa5bfd267,
  148623. 0xa28fd86b, 0xbe7608ef, 0x3b4b2d8f, 0x226474bc, 0xfbd5ff8c,
  148624. 0xa5f3b24a, 0x6b282af0 },
  148625. { 0x6341a595, 0x78fc025f, 0xa445e28c, 0x591c38d6, 0xeb446842,
  148626. 0x72bd6e3d, 0x75547833, 0x3f9466d3, 0x083e16c4, 0x911414d3,
  148627. 0x95a7acb4, 0x145d9466, 0x8fd2fb64, 0x102ddf09, 0x0bfd87b1,
  148628. 0x2a2b2d2d, 0x59455088, 0x69e9be5c, 0xa80245de, 0xee378bf4,
  148629. 0xb2306b0e, 0x80b0bd68, 0xc2be9f3d, 0x76a545c6, 0x4802c245,
  148630. 0x429d167b, 0x2b412dfb, 0x13e64427, 0xee8d9762, 0xb664f529,
  148631. 0x54706ebf, 0x6d4f5d23 },
  148632. { 0x00ba9f88, 0x35c8f2b6, 0x7bb6d0bf, 0xfdc807e0, 0xb3b81e5b,
  148633. 0x0a126d42, 0xa7ac781e, 0x335ce6ce, 0xf37dcba6, 0x3e308e6f,
  148634. 0x63c96487, 0x028dca62, 0x8818434d, 0x72eba57e, 0x79b78a26,
  148635. 0xa9e3d59f, 0x2f07aea3, 0xd2f0a7dd, 0x24d05f74, 0xe0fe4678,
  148636. 0x0116deb6, 0xb2085170, 0x58f37580, 0x9c2a5e92, 0x74070bb3,
  148637. 0xe78bd7a5, 0xb9977d90, 0x551fc872, 0x40db81b4, 0x6eda93c4,
  148638. 0xd65d34ad, 0x4aaf0b4f },
  148639. { 0x3514c7af, 0x9bef2506, 0xbc181ead, 0xb09e7dad, 0x8fa3ec58,
  148640. 0xef3cae87, 0x173b8685, 0xd8dbfab5, 0x921d32dd, 0xb2490fc0,
  148641. 0x8bd9c466, 0x4eef386b, 0xa061dbdb, 0xc1cdd52f, 0x25bc04db,
  148642. 0x64de989a, 0x85728636, 0x06f9836b, 0x8be44aa0, 0x11a5a804,
  148643. 0x097018c7, 0x16dede4e, 0xb2c11fb1, 0x72aec577, 0xa721ecd9,
  148644. 0x144dade1, 0xd6ebf3a9, 0xf99c526b, 0x1c2e14d7, 0xa1d4165b,
  148645. 0x82bc6337, 0x8b2cbd39 },
  148646. { 0x8a52e991, 0x28ec1bf2, 0xcf9d42ec, 0x0ba202f6, 0xc634ea45,
  148647. 0x8307d130, 0xc5762b9c, 0x3fc257b3, 0x487c2a2d, 0xbd3298d1,
  148648. 0xa319488a, 0xca14f1a7, 0x06ba06d2, 0xc70ca93b, 0xee405e89,
  148649. 0x9aa3f4b3, 0x35deeae7, 0xcc64eeb3, 0x03bf1d4c, 0xd155f578,
  148650. 0x45616bfd, 0x041ec0b5, 0x086e33f6, 0x23df80e6, 0xf0243cf5,
  148651. 0x399a79c8, 0x874ccd58, 0x86c2824e, 0x8fc5c831, 0x220eeaec,
  148652. 0x7dbe3670, 0x57e28304 },
  148653. { 0xfbcdf666, 0x6e60b698, 0x8bebb1d2, 0xbdd06a99, 0x80498436,
  148654. 0x4044adba, 0x522bc88d, 0xd76bf75e, 0x28423b20, 0x655c4b9b,
  148655. 0x53398a72, 0x65c0f492, 0x0ca37601, 0x76d4f2b7, 0x2030fa5a,
  148656. 0x46989925, 0xb6054705, 0x96b37e87, 0x53de1b2f, 0xef96f731,
  148657. 0xad54ef05, 0x5ecbbc8c, 0xa93617b0, 0xeb289d0a, 0x7cba217d,
  148658. 0x3ac0fbd5, 0x19d4a2d7, 0xd0d3cb56, 0xc91d6063, 0xe8bee9d4,
  148659. 0x696ffda6, 0x4f12e037 },
  148660. { 0x15f1a610, 0x4ccfa422, 0x3786519a, 0x804a5c55, 0x73838134,
  148661. 0x1246a454, 0x4b284e2a, 0xfa15b484, 0x146d1320, 0x36464c65,
  148662. 0x70a8a0fa, 0xfb6ba88c, 0x93c4804e, 0x74e7cee7, 0xb95ae16a,
  148663. 0x8c34d22c, 0xf9c1d4dd, 0x9d9ed89f, 0x32025371, 0x61a0866d,
  148664. 0x9bd6444a, 0x45b232b2, 0xf277bab1, 0xf888e92c, 0xa9448b02,
  148665. 0x73e69c6e, 0x5b521ecb, 0x1a496ea9, 0x5858afb2, 0xa8f78ea7,
  148666. 0xb1266f91, 0x83d2333e },
  148667. { 0x67b478d7, 0x1c633288, 0x50a2fc9c, 0xa1ee1ae1, 0x18d2241b,
  148668. 0x05b6ab30, 0x893cd696, 0x69f1f288, 0xa8117a87, 0x159d6660,
  148669. 0x70e73d77, 0xe8120119, 0x93f55f0a, 0x528fef00, 0xd854dfb2,
  148670. 0xb3978db8, 0xf45d9fbb, 0xd6b43ef6, 0xd5bee397, 0x17de4bfe,
  148671. 0x6bf76dad, 0xa01e0f59, 0x3d40754c, 0x28b2280e, 0xf8e86ef3,
  148672. 0x8edb6122, 0xb7d1e586, 0x8226b6af, 0x2f40a55b, 0x46353215,
  148673. 0xc5a31621, 0x7362f13e },
  148674. { 0x73c0c430, 0x792eb27c, 0xa51c3657, 0x8cc0a65f, 0xd2194f1b,
  148675. 0x50a5cece, 0x814b4947, 0x18945688, 0x4b6fbbf4, 0xbbf0a81a,
  148676. 0xf0aa8608, 0x376f4f58, 0x3987795e, 0xd9361d68, 0xe3a8d0d5,
  148677. 0xb6510cd8, 0xb6c1a455, 0x63e2fdbf, 0xaec891f9, 0x2c91154e,
  148678. 0xff568f64, 0x0eb1e715, 0x2f2b399e, 0xe7af9cd7, 0x89f0bf0b,
  148679. 0x1fc39bac, 0x90983695, 0xf0861d92, 0xda0a20a8, 0xd9b16f02,
  148680. 0xa38c0ead, 0x2f10693f },
  148681. { 0x0c06ded2, 0x07a6ce91, 0x2fd9087b, 0xf974842f, 0xa9f635a6,
  148682. 0xe468bfd6, 0x1ed60626, 0x04b61891, 0x369ee548, 0x1fb2f89f,
  148683. 0xdc96a201, 0x9cbd1113, 0x10d633ac, 0x6759acfe, 0x8faa629e,
  148684. 0x64ba66fc, 0x47f38283, 0xa686ae49, 0xd59cda99, 0x828c3a05,
  148685. 0x08ea2f6e, 0x7c7afb14, 0xaf3953c8, 0x2551c8e4, 0x9daa9e4f,
  148686. 0x5b53d279, 0xad6f1940, 0x1eff68d4, 0x96437cdb, 0x2775dbdd,
  148687. 0x4fe7a043, 0x985f83e4 },
  148688. { 0xeaf45294, 0x89603c16, 0xc24b5751, 0x70131160, 0x39d6b52d,
  148689. 0x4c112018, 0xed943340, 0x7079cf02, 0x74f41b68, 0x0c5b028b,
  148690. 0x9c8ac1e1, 0x3dc3f076, 0xf8b24f0e, 0x5ac5eea3, 0xe34c5c22,
  148691. 0xee6684ba, 0x9abc452a, 0xa5259e63, 0xe9df45cc, 0xb07d2cd1,
  148692. 0x1a443cfa, 0x07019c93, 0x92c003b3, 0x68fddaa9, 0x0d8cbc2e,
  148693. 0x2d9f179c, 0x1e781ca7, 0xbbf15a6f, 0x50dcc799, 0x54d779d5,
  148694. 0x0fe962f1, 0x0c88e540 },
  148695. { 0xe8f44357, 0x84f71a6a, 0x3a3cab6a, 0xf75b4bf6, 0x5aebc680,
  148696. 0x334c9d9e, 0x8a753ef2, 0xcecaf084, 0x075e3c8e, 0xe28014c1,
  148697. 0xf74f8d3a, 0xbb9d5a38, 0xb80e32ae, 0x75988464, 0xf2bc3792,
  148698. 0x7b328e6f, 0xeed0e197, 0xebbb1faf, 0x5a33065a, 0x674eac95,
  148699. 0x922dbce8, 0x8c19fd8f, 0x987b907a, 0x8c17ae85, 0x3b3a2cd7,
  148700. 0x89f33627, 0xfa87772f, 0xebaea019, 0x3a25ced6, 0x4e5de499,
  148701. 0xaf110715, 0x8e2560b8 },
  148702. { 0x3141aba6, 0x56d3746c, 0xbab2cf9e, 0x45a1079f, 0x9cdd27c7,
  148703. 0xb6382831, 0x9dfd950e, 0x22237632, 0x3a9408ff, 0x1e0b15cd,
  148704. 0xb1160118, 0x49a80200, 0xa383bba7, 0x2719db5d, 0x651046d5,
  148705. 0x6078340a, 0x97523b1f, 0x8929d4de, 0x8e0a28ab, 0x4040345c,
  148706. 0x0adf09c7, 0x61275ac2, 0x2331d611, 0xb41ab265, 0x5391ca50,
  148707. 0x230cc77c, 0x8f922315, 0x88be0c92, 0x92fd9a29, 0xfef3d92b,
  148708. 0x8324f2e5, 0x59005f22 },
  148709. { 0x3c4c1c74, 0x6bb1750c, 0xe966fb79, 0xbe73aac0, 0x66c5973f,
  148710. 0x85a75d92, 0x3a8656b6, 0x8c97f932, 0x50446cde, 0x2b7043b1,
  148711. 0x3ff3897f, 0x548916f7, 0xb18b72b2, 0x913dd01c, 0x488c0de6,
  148712. 0xd0a751f1, 0x8558ca58, 0x19175714, 0x44a663da, 0x97714301,
  148713. 0xb0e08618, 0x2df190ac, 0xf39ead9c, 0x0080fc0c, 0x17382da1,
  148714. 0x0085ac6e, 0x3262a338, 0xe9791851, 0xb43bae8d, 0xe4495936,
  148715. 0xd783df6e, 0x57a78e26 },
  148716. { 0x40dbddd8, 0x161b346f, 0x9410c3ac, 0x2b49a927, 0x1886cf3b,
  148717. 0x8c542783, 0x33b93deb, 0x72df3232, 0x40df579d, 0x9c8d59f5,
  148718. 0xc20ef500, 0xe5d7a67d, 0x67f08643, 0xc46b3918, 0xad96adc3,
  148719. 0xecfa2445, 0x0c4544d0, 0x658f589b, 0xe08417d7, 0xe6ec9301,
  148720. 0xc454e288, 0x6ca5ef6a, 0xac0f462d, 0x4191048f, 0x08d8a036,
  148721. 0x852407d8, 0xf6d35b7e, 0xb4c533a7, 0x8f6ada87, 0x3251e412,
  148722. 0x81c472e8, 0x1ca370c5 },
  148723. { 0xa801b68a, 0x94bd5171, 0xfd1998b3, 0x7312879c, 0x41163202,
  148724. 0x4905aabf, 0xf5b01fdb, 0xb5fe87f4, 0x9cda128b, 0x78de523a,
  148725. 0xc7bd31f7, 0x0bf161a1, 0x23904c35, 0xb5decfd0, 0xe188f12d,
  148726. 0x224b2882, 0xf99dae74, 0x0dd2801d, 0x08cd1cd2, 0xcad467b5,
  148727. 0xc0867e39, 0x6c311c3d, 0x2b425072, 0x71a11720, 0x2efd9003,
  148728. 0x83bf464e, 0x1dbd3b03, 0x53d0448a, 0xe6265baa, 0x32db52f4,
  148729. 0x4c33ac79, 0x2584b34c },
  148730. { 0x2aeec688, 0x3cb86389, 0x45fbe523, 0xa5e740ba, 0xfd60b5f8,
  148731. 0x422e71f7, 0x4874913d, 0x455d185c, 0xfa17d80d, 0x04c2bb36,
  148732. 0xac054524, 0x3f271854, 0xa8b9a657, 0x76dd3045, 0x62ee7cc8,
  148733. 0x2e42c3e1, 0x4df6c7d0, 0x00266706, 0xdc7cb488, 0x5927dd51,
  148734. 0x187897e0, 0x6b3faabe, 0xf2d5737c, 0xfe6ad22e, 0xff51a9ff,
  148735. 0xafb60269, 0x69807baa, 0xe1c83545, 0x951ca49a, 0xacddb6ff,
  148736. 0x3f9ab085, 0x7e811374 },
  148737. { 0x830a88b1, 0xad722a8b, 0xce1117e1, 0x91918ea8, 0x0409b47d,
  148738. 0x3e02d0b8, 0x6c46d1d3, 0xb53812d3, 0xe589669c, 0x2fd09db0,
  148739. 0x15b0cd5e, 0x9845cd06, 0x2386c453, 0x0c1c155a, 0xf5ff43cb,
  148740. 0xda774de5, 0xe391c0cd, 0xbb076b98, 0x5004f286, 0x97d71eff,
  148741. 0xaeec0bfe, 0x23e0b46c, 0x32a1ad94, 0xe4538667, 0x396da422,
  148742. 0xfe0c9f81, 0x63db2bfe, 0x6376c1a2, 0xba56fa91, 0x001c7918,
  148743. 0xdf8485a6, 0x436b8c64 },
  148744. { 0x8ab764bc, 0x88117e9d, 0xa077df84, 0xdfa61e94, 0x0c18eebd,
  148745. 0x5a7765d3, 0xfc9451dc, 0x548916af, 0x071a347a, 0x01a52e33,
  148746. 0xb23b41df, 0x633b95de, 0x43c8c286, 0xdd7d68c9, 0x18d97068,
  148747. 0xe4f9d41e, 0x8c92799d, 0x79908b90, 0xd47394a3, 0xe614148e,
  148748. 0xcd51e53f, 0xe5018517, 0x0243dcb6, 0x5060075e, 0x17954405,
  148749. 0xe5dcde62, 0x537da5ff, 0x6f7c90e1, 0x0768cb66, 0x1df7aae4,
  148750. 0x6dbe95e1, 0x5266ca9e },
  148751. { 0x1386b3db, 0x84ddee6d, 0x7c38e540, 0xf9e4af5a, 0xeb04f49d,
  148752. 0xb3418440, 0xfde5a4fd, 0x2138a1e8, 0x30257cfc, 0x3e6e6924,
  148753. 0x19fd70c1, 0x3519c6e3, 0x86c31ff0, 0x8f34e174, 0x940ce1e8,
  148754. 0xf1e298fd, 0x14960d7c, 0x6fb8cb1d, 0x2b2f3bff, 0x207c1347,
  148755. 0x146ef8ff, 0x899a20b4, 0x7bd3e220, 0x7dec362b, 0x626bea27,
  148756. 0xa975044e, 0x4fb4cb67, 0x0f32b449, 0x1fc6703a, 0xc17a0920,
  148757. 0x9cd84a2b, 0x41f325b9 },
  148758. { 0xce2843a4, 0x312ed513, 0x00728afc, 0xe748498e, 0x4d864ce5,
  148759. 0xa8ef2822, 0xa620083b, 0x34064704, 0x4bed338d, 0x5905e1d9,
  148760. 0x063e7b38, 0x2a578cb5, 0x289e7bb9, 0x98276d96, 0xf17b7341,
  148761. 0xdfe2dc47, 0x1dac8944, 0x5923521f, 0x23400aa7, 0x3db6d28d,
  148762. 0xa761ba43, 0xc647705e, 0x9bfd07dd, 0x8947ba6d, 0x242ca8fd,
  148763. 0x00f2e3ac, 0xeb8c3468, 0x49ef4670, 0xd9aa18fd, 0x7db3d37b,
  148764. 0xe58cea9e, 0x56b30fb6 },
  148765. { 0xcd80a428, 0x07ecdcaa, 0x8732c891, 0x7af922dc, 0x3ada441f,
  148766. 0x20d88798, 0x924b008a, 0x3bed9a44, 0xb2e81c3a, 0x2123533c,
  148767. 0x65f807d3, 0xc34e4075, 0x1f2faecb, 0x0bfaefa5, 0xade8a88d,
  148768. 0x78b634a5, 0x94392a91, 0xc4e0b7f8, 0x90bb1cd8, 0x30922377,
  148769. 0xf87204ae, 0xdea9b4fa, 0x85d3cd83, 0x3edf81f5, 0xc6523a79,
  148770. 0x58f88c51, 0x17c0d969, 0xe472fb8b, 0xdccf7f07, 0x899081e5,
  148771. 0x58bdd146, 0x1353cc57 },
  148772. { 0x39bf6e18, 0x28a56497, 0x649b89c7, 0x59e8b5a2, 0xdce8b8e7,
  148773. 0x8d9434a0, 0x2047040c, 0xd935bf51, 0x6a7b8e82, 0x2ab3a164,
  148774. 0x27f81294, 0xf1583ed6, 0x72d67297, 0x8416a7e0, 0xcd39e42b,
  148775. 0x49685d86, 0x958ddbad, 0x8a797fc7, 0x155ce6de, 0xa558f928,
  148776. 0xf8a36235, 0x75f4e570, 0x52877ae5, 0xbc69cfc0, 0xa6b16ebd,
  148777. 0x8f4193a9, 0xbb1cc1f1, 0x8d1df43c, 0x5a21e789, 0x723a830e,
  148778. 0xf451df58, 0x3ec2185d },
  148779. { 0x1f0bc2d7, 0xb9d4c7d7, 0x6e51d412, 0x6982c6cc, 0xa09f80f6,
  148780. 0x92e02d93, 0x047ae09c, 0xb7dd2d25, 0x37f351f9, 0x3503149f,
  148781. 0xc77850be, 0x69d49ce1, 0x12f0d2c8, 0x60242acb, 0x7bc28b9d,
  148782. 0xba188c56, 0x06bc0550, 0x8e406121, 0x8d7d4329, 0xb0d84b1f,
  148783. 0xd38951e0, 0xb4a67ae7, 0x8bc97607, 0xb527c57b, 0x5497aa72,
  148784. 0xbc93c5f3, 0x39bdd666, 0x5f1de8cc, 0xe9d447a3, 0x3087dc5c,
  148785. 0xa211abe5, 0x89b356b6 },
  148786. { 0xdfdcc837, 0xed6db0af, 0xa871b7a9, 0x0fb80baa, 0x1c1d4b72,
  148787. 0x413abfc9, 0xadac9e5c, 0xf5b56bf7, 0x8b8657a3, 0x5664a2da,
  148788. 0x0e41d94e, 0x11b04f72, 0x37433658, 0x63e11d26, 0xf426daea,
  148789. 0xee628ece, 0xcb162dc2, 0x011619c9, 0x87648643, 0x9cf5817f,
  148790. 0x5584bc86, 0xe1bb9702, 0x00bf7928, 0x2cc27cef, 0xdc60eee5,
  148791. 0x4ef3a80e, 0x87adc2f9, 0x7e1202be, 0x8a0d4f52, 0x656f18e0,
  148792. 0x57c5d126, 0x39c4f10d },
  148793. { 0xe88aecd3, 0xb3a9b68c, 0xa518aa9d, 0x555b0918, 0x4bd4ee54,
  148794. 0xedc1cdad, 0x02068d84, 0x79b68b67, 0x811ac72d, 0x7dac80d0,
  148795. 0xa81a0a78, 0x6d1e6d35, 0x3bd16283, 0xc841e9ea, 0x894c4444,
  148796. 0xa7bc1775, 0xf1aa1202, 0xf2b63725, 0xc7d4c556, 0xbec7767e,
  148797. 0xd46ff51b, 0x2817ebb3, 0x73f7e339, 0xfde5be8d, 0x5aed24c4,
  148798. 0x44c6c977, 0xb6e579cf, 0x0b9a1707, 0x9069fbcc, 0xcff16478,
  148799. 0x49152b00, 0x414b542d },
  148800. { 0x606e173b, 0x33c31e58, 0x90e6713a, 0x5b7f4e1b, 0xdebb20af,
  148801. 0x425fb512, 0x05120e70, 0xc788c617, 0x9013e4ec, 0x3ef05602,
  148802. 0x81c6e6d7, 0x9f9d35ac, 0x9450690a, 0xe131e88f, 0x44af082e,
  148803. 0x708f9b32, 0x1ba2aea9, 0xb2e4d66c, 0x740db29c, 0xaf1f4a6e,
  148804. 0xd1843007, 0x74ab9248, 0xed556a6c, 0x13338ef8, 0x270d17a6,
  148805. 0xf48e623e, 0x9608f5bf, 0x3c7362fa, 0x444e8515, 0x43977874,
  148806. 0xe00b8b2a, 0x52678d6a },
  148807. { 0xdf36aeb4, 0x5dff1c59, 0xa92bc0ab, 0x52d6653c, 0x927a5f81,
  148808. 0x0e03f496, 0x2dfd491f, 0x8509d414, 0xa571f89b, 0x258c2c52,
  148809. 0x93334485, 0x2bd61804, 0x3f7d9e09, 0x1a33e94f, 0x2c1bf906,
  148810. 0xfab418d3, 0x5aa5695c, 0xf39c490e, 0xf6d2d7ff, 0x0e41196e,
  148811. 0x0f7948a9, 0x3ecd4075, 0xd3053b4f, 0x4b58f9b2, 0x5d9974c9,
  148812. 0xb8ee842a, 0xbf22f682, 0x23a59c1d, 0xc8efcea6, 0x045ac614,
  148813. 0xc10ceedd, 0x7040ba5b },
  148814. { 0x515a1a96, 0x2c364f81, 0x184327e0, 0x31a63503, 0x1ad93d4f,
  148815. 0x0a096650, 0x273b6173, 0x9d7694f1, 0xd2cda9d2, 0x8886d876,
  148816. 0x2814c177, 0x1e01a742, 0x8667696b, 0x3492276b, 0x5b25f006,
  148817. 0x2fd4f0c6, 0xfb294c4a, 0x6527349f, 0xde1d336f, 0xc1fe0d8a,
  148818. 0xe7e3860e, 0xaf9a23e8, 0xb774c31e, 0x97d2b721, 0x4365784a,
  148819. 0xfac3e582, 0x70f4eaa3, 0xff2dff4e, 0xfe873248, 0x3d281e1a,
  148820. 0x0bd1c9c1, 0x9043a6d6 },
  148821. { 0x766c7937, 0x1511a0fe, 0xabbc3be3, 0x1b2ded5c, 0xe00888ac,
  148822. 0x2ac160cc, 0x616200f3, 0x928754bd, 0x34a2ea06, 0xb801c83d,
  148823. 0x9cbe106f, 0x8ad7a03a, 0xcedfcd94, 0x996b0822, 0xe4069880,
  148824. 0xc3c3463a, 0xf597f663, 0xfb12ea4d, 0x40c92af9, 0x2c8d3834,
  148825. 0x4e8da154, 0x79bc85c6, 0xdb4e801a, 0x95771fa2, 0x1e3579b2,
  148826. 0x7bd2c138, 0xffaad078, 0xe45c75df, 0xb73eac46, 0xb0760a3c,
  148827. 0x3a125f35, 0x26362b48 },
  148828. { 0xeefc3e89, 0x25c68d28, 0x69e9ee71, 0x2d0ee877, 0xaf5e4b75,
  148829. 0x8b07bb86, 0xcb86b333, 0xdb709072, 0xff552bac, 0xfd3d20ea,
  148830. 0x4c0da1e9, 0xa5eeb2b1, 0x44f97145, 0x391f688a, 0x1e06d485,
  148831. 0x21fbd310, 0xbea9cd49, 0x45e4f2a5, 0xa7bf21da, 0x7b60d464,
  148832. 0x054d5471, 0x193f88c8, 0xbee0f2e9, 0x5ace53d1, 0xc1439273,
  148833. 0x92c26563, 0x96c6b5ee, 0x9c86e0b2, 0x09ff59ba, 0x452fe231,
  148834. 0x555c935e, 0x2e952b20 },
  148835. { 0xd75f886e, 0x2a846bca, 0xd43dfc58, 0xe68a5dbe, 0x007b1b86,
  148836. 0x103e45b6, 0x355ff2b5, 0x580e2ec9, 0xa263ecc9, 0xbc702f26,
  148837. 0x181e5e33, 0x2835b386, 0x6c122076, 0x025113ec, 0x7fbd856d,
  148838. 0xa5c26e3a, 0x9d6ebcb1, 0x8ef83fb3, 0xa44d2fa8, 0x7aaa53f2,
  148839. 0x53b1fa97, 0x7c14ef33, 0x17559a30, 0xff604a11, 0xb09377e0,
  148840. 0x2bcd96b0, 0xdb2f0273, 0xa5c14896, 0xeb53ef06, 0x1c0a84c9,
  148841. 0x30378e4b, 0x1236d017 },
  148842. { 0xc084373b, 0xd7481c8f, 0x646097ae, 0x29ae4768, 0x613bc34b,
  148843. 0x1300dfa0, 0x934bc2b0, 0x3712714c, 0x0e2be7e2, 0x86524629,
  148844. 0xed010800, 0x554fbb9f, 0x42314576, 0xf0ec0b38, 0x330a3282,
  148845. 0x65baf594, 0x706ef817, 0x3bdde1a8, 0xba7530e9, 0x7d2c727d,
  148846. 0x74cc95cb, 0xbb0c5d66, 0x2438906d, 0xb3fcd365, 0xd14658f3,
  148847. 0x19881941, 0x6c97f0e9, 0xe616f555, 0x4b9ec7ea, 0x353c2d85,
  148848. 0x620cb56e, 0x02a48014 },
  148849. { 0x506ccd38, 0x11d6d23d, 0x9059baa6, 0x229a1c54, 0x69d011c5,
  148850. 0x717c9c27, 0xd828937d, 0xe87e1b46, 0x83835083, 0xf5d63bbb,
  148851. 0xaadac258, 0xf0a7b427, 0x9f154d1f, 0x99ab26bd, 0x8ec955fd,
  148852. 0xdec0ffbf, 0x49fcb880, 0xee957c67, 0x1e0114de, 0x32395dee,
  148853. 0x369f46c7, 0x192a64b7, 0x91eb2599, 0x43044660, 0xa2e8c3da,
  148854. 0xbe2da887, 0xc3556d18, 0xa44e2c25, 0xb55f75f3, 0x31390414,
  148855. 0x8f217fe0, 0x1d8bde6f },
  148856. { 0xa2028924, 0x03cd39f8, 0xb06ecb9f, 0x6e54f19c, 0xd6f05846,
  148857. 0x862bbcb7, 0x5a060776, 0xdbe06716, 0xb10fec10, 0x9397c97a,
  148858. 0x6f1bb65c, 0xf4213826, 0xa672ba38, 0x414deccb, 0xf88b05e6,
  148859. 0x594d4d43, 0xac94d4d1, 0x7993f57a, 0xbfb17638, 0x74fc2a6a,
  148860. 0xb6fc655a, 0xd8196b5b, 0xee8d2139, 0xdc375c84, 0x360d3a26,
  148861. 0xb9b00a02, 0xdeb93b87, 0xb36ed35c, 0xcc83209e, 0xf565b28b,
  148862. 0xc61013c1, 0x349c6943 },
  148863. { 0x4de6c88a, 0xd1b39444, 0x4700207e, 0xd5c2c471, 0x21c2b780,
  148864. 0xb6f458a2, 0x0850993e, 0x749f7564, 0xbaef0c18, 0x400ba579,
  148865. 0x737c70f0, 0x2d742938, 0x21467ebf, 0xc5a8e2ec, 0x5337f453,
  148866. 0x243a666e, 0xed0bd50a, 0xc991f1c7, 0xf4bd1f91, 0x3a7f3e90,
  148867. 0x5f0e129b, 0x96089e8a, 0x07389635, 0xd0d3a177, 0x27182ac9,
  148868. 0x9cf842d5, 0x0817c5c2, 0x21195299, 0x87255769, 0xa32f327e,
  148869. 0x89c2d8fa, 0x056587ab },
  148870. { 0x1ce4733d, 0x008562ed, 0x98e51444, 0x5faff7cb, 0xa9ab46b9,
  148871. 0x5f03021f, 0xb61a8c13, 0x89494c5e, 0x36b35976, 0x57c95036,
  148872. 0x2ac2d2f6, 0x6be84c8f, 0x9bd2703e, 0x0e5b34d8, 0x7e872abb,
  148873. 0xc4ad918f, 0xc4052ee1, 0xc2a89e9f, 0x3190b51e, 0xc2caee3f,
  148874. 0x6fff254f, 0x58fd1437, 0x883e0972, 0x6f3c0d68, 0x0fb15438,
  148875. 0x63d0a0e9, 0xf6caae00, 0xc438764b, 0x3f1d0f6c, 0x815f1565,
  148876. 0xb86cdbde, 0x1b87f2ed },
  148877. { 0x2b0b15b1, 0x35792bbb, 0xce6ba779, 0xa3e4b5a7, 0xdd8f3779,
  148878. 0xfbacffd9, 0xc298d1ef, 0x005450bd, 0xc47031c6, 0x0e3f5556,
  148879. 0x95d68066, 0x0770f07a, 0x2d1052c2, 0xce3e84e0, 0x7aa8cc54,
  148880. 0xb050791e, 0xba3223a3, 0x4d621e73, 0x39632990, 0x87b9b94d,
  148881. 0x7eb8056d, 0x8df9cb47, 0xedfca0cc, 0xe2430de8, 0x9712a0ca,
  148882. 0x374bf416, 0x88848a99, 0xbe3f3c77, 0xc4a3e59e, 0xb22b87b1,
  148883. 0x3e95bc23, 0x8e0227c4 },
  148884. { 0x3210964d, 0x000e22a8, 0xff056eeb, 0xdccd5df5, 0xdaf1ead7,
  148885. 0x02173a1f, 0x67cdcae3, 0xd02833e0, 0x8bdcc90c, 0x1cc574cb,
  148886. 0x3224b4f5, 0x86eca714, 0xbb3f8298, 0xd00e603a, 0x0c1a8deb,
  148887. 0xb98ece1b, 0x378c261d, 0x228a46e4, 0xa6165e5d, 0xc6f9dd0d,
  148888. 0x4b7ef0e2, 0xb3ae3899, 0xbda9f306, 0x3a3c16b3, 0x38a084db,
  148889. 0x5e9a26d3, 0x5394e950, 0x528e5993, 0x4ea206bc, 0x848ecb11,
  148890. 0x40545d6e, 0x14b15ab5 },
  148891. { 0x664c59a2, 0x0f6d86c9, 0x60fd7aa5, 0x3dfe2be1, 0x9072cb8e,
  148892. 0x33f9b569, 0x8176a7e0, 0x5f2325d9, 0x4587080b, 0x79a0d4e7,
  148893. 0x0d5d4e05, 0xa4ee0def, 0xc87b28e1, 0xc0ad9ffa, 0x3f09b4ee,
  148894. 0xd6f18d2f, 0x292e9d87, 0xcc896ae7, 0x6094763c, 0xca88953d,
  148895. 0x18fbf9fa, 0xdbee97a8, 0x4b63d701, 0xdf20e0e9, 0x47ea722f,
  148896. 0xcbba6e30, 0x612b571f, 0xce57e1ca, 0x009a55f5, 0x1e16ac76,
  148897. 0xc4389e2e, 0x742bbed8 },
  148898. { 0xc1dc2c73, 0x23ea86dc, 0xc1643abf, 0x4bbbfd5b, 0x24d8ca1f,
  148899. 0x07f8fa1f, 0x8cb5cac7, 0xde68a6e0, 0x54e66a7d, 0x7d54c64b,
  148900. 0xa9b7ad78, 0x789dba22, 0xe364ab94, 0x4d88d540, 0x1f72e011,
  148901. 0xc8c2e02d, 0x46e2a278, 0x4c826057, 0x4b187c7d, 0xe6c35bb3,
  148902. 0xeb8fe0c9, 0xed8b3dfe, 0x7d11e415, 0xb6bc34e8, 0xb865c7f9,
  148903. 0xb3908bbf, 0xe1ecc17c, 0x717d1ce6, 0xf7cdd69b, 0x151e3308,
  148904. 0xb5c94124, 0x97bd5a14 },
  148905. { 0x81e82861, 0xe01c62fe, 0xdd42c40e, 0x703d4b6d, 0xe65e91e5,
  148906. 0x7e52e55b, 0x5abbbfdd, 0xb8b49374, 0xc72a45f4, 0xb4f15f52,
  148907. 0x550f29d8, 0xce8435a8, 0x582de75f, 0x9df76b9b, 0xa20c8b96,
  148908. 0x52e84c5f, 0x0a8a0af4, 0xaf77d2d1, 0xca6013c3, 0x0389bbd8,
  148909. 0x26f8305f, 0xb0d9b9ba, 0x0cec8b9a, 0xf053e848, 0xffabda18,
  148910. 0x4d63367a, 0xa6424c2a, 0x50f53be4, 0x864fba2e, 0xf892c58c,
  148911. 0x48cc5469, 0x317c6d31 },
  148912. { 0x2cb7d42b, 0x0c3525b0, 0x310facae, 0x55240bc9, 0xff20408f,
  148913. 0x8d5d2022, 0xe0c10ea0, 0x6b01402f, 0x718eb23d, 0x7fbef68a,
  148914. 0x41252a19, 0xa0146b5a, 0x110e0d6e, 0x59afce48, 0x022de181,
  148915. 0xe9a1d27f, 0xdc3f49da, 0x6db96d16, 0xefbe4008, 0xfc1ae3f5,
  148916. 0xeccbc11c, 0xf9d70641, 0x525f8636, 0x49022279, 0xc2763c30,
  148917. 0x3769796a, 0x1d90630b, 0x9cc3483c, 0xee3d3f17, 0x451651f0,
  148918. 0x9da0b8fd, 0x6ae59739 },
  148919. { 0xbff4d2ee, 0x57b13bc7, 0x30b173d8, 0x20754229, 0x0794936c,
  148920. 0xb6254bd5, 0x5efd55be, 0x1d5f232a, 0x4e0c3389, 0xc06f4a85,
  148921. 0x8e61f944, 0xcf2c5b59, 0xfd5f87b7, 0xc564861f, 0x5a2afa4c,
  148922. 0xee261fb1, 0x2d97a774, 0xb0ff7226, 0xd6cf007a, 0x1a89ae22,
  148923. 0xd346f214, 0x28880534, 0x97b6497e, 0x8fe73bff, 0xfa2afffc,
  148924. 0x8a8595b2, 0xf151a726, 0x9ef9cf3e, 0xe744b82b, 0xa84ee5f1,
  148925. 0xbc63fe72, 0x6649048d },
  148926. { 0x1e8b760d, 0x91b7bb78, 0x25aadaa0, 0xd47b0bd8, 0xfab5226f,
  148927. 0x81493d9f, 0xbffc148e, 0x4a6dd226, 0xa29be3db, 0x5a032f8a,
  148928. 0x34b0ab0b, 0x318dbc70, 0x7d654868, 0xdcccbfb5, 0x9c581e46,
  148929. 0x8506ab37, 0x2830ece2, 0x09136a6e, 0xcf6c80c7, 0x48b79356,
  148930. 0xef6b1e86, 0xfa176377, 0x83f0f1c9, 0x2c9c1cc1, 0x16abeddd,
  148931. 0x96f0526d, 0xa93b0de4, 0x3e0e98e2, 0x0f13873a, 0x6f2d7ada,
  148932. 0xf3fa49ec, 0x4eb93b5c },
  148933. { 0xe11fae32, 0xbd89f7e5, 0xc4023f51, 0xd13d74f5, 0x491c3f6f,
  148934. 0x1b0014df, 0x555279b7, 0x1d849a57, 0x05ba0068, 0xbb9e8897,
  148935. 0xc13ca2ca, 0x82222419, 0xfd33676f, 0xafbbb685, 0x75878a2a,
  148936. 0x931c3f52, 0xef3d5173, 0x12aeefef, 0xbd8a6878, 0x189a5cc8,
  148937. 0xd99f0c16, 0x82cffdb3, 0xa19d48b6, 0xbf565406, 0xe9c6c4e0,
  148938. 0x5605e223, 0x86804172, 0x53e781de, 0xc7001cc8, 0xcdf5c90b,
  148939. 0x7c043f68, 0x2b582d93 },
  148940. { 0x81abc2ae, 0xa1165c82, 0xe2b69eca, 0xa73380f5, 0x07fff66f,
  148941. 0xc097b3d2, 0x54776506, 0x5d603826, 0xb57fa21c, 0xdcbac9f3,
  148942. 0xc98dbdd5, 0x78750db4, 0xd9eff32a, 0x85e21103, 0x2f11c41c,
  148943. 0xceed172c, 0x9e348c09, 0xa8e39264, 0x831eddfb, 0x71cb936b,
  148944. 0xf50864a3, 0x915c3d06, 0xe93acfcd, 0xfe8e33cd, 0xb3f2f7aa,
  148945. 0x4bee10d7, 0xeb7cee9a, 0xc1d8eb48, 0xfa574afd, 0x4fa49ce3,
  148946. 0x862db4c0, 0x78615109 },
  148947. { 0x7ae72c21, 0x3fe3f480, 0xfd0f0da5, 0x631aa144, 0xf8c3a454,
  148948. 0xc76ee1e8, 0x51b4f1ab, 0x379ae094, 0xd7cdbb24, 0x2a3a4397,
  148949. 0x82bd5fcd, 0x7a14cffe, 0xf427ef5a, 0xbbe4ed12, 0x284d3ccf,
  148950. 0x9b0a43ee, 0x8eec6e1e, 0x57b78b93, 0x67b8e87b, 0x18d404e4,
  148951. 0x34374c20, 0x0c8adc05, 0x5428deb5, 0x64373605, 0xc3afa2cf,
  148952. 0xb4d80ec0, 0x3aa956f9, 0x6d51f93c, 0x84161c68, 0x9f9a28ab,
  148953. 0x6bc9c025, 0x540b6bb7 },
  148954. { 0x321d315d, 0x04e1734c, 0xd86e05d0, 0x4ef56612, 0xbba8cd81,
  148955. 0xeafae145, 0xacdc789a, 0x1fb07a49, 0x5877570f, 0x6a21e9ad,
  148956. 0xb9bc53de, 0x2e4a837e, 0x1d6298eb, 0x436db293, 0xea362f45,
  148957. 0x43afbc78, 0xaabf6585, 0x2a973d97, 0x0c924d60, 0xdce7dabe,
  148958. 0x7cadf0e9, 0xf69d98f0, 0x75020538, 0xe0b505a1, 0x4461cd29,
  148959. 0x3db7d1a3, 0x5e20e818, 0xe1c28776, 0x52dd50f6, 0x2ca25867,
  148960. 0x92e0388c, 0x897cab14 },
  148961. { 0x0d8bab8a, 0x59ed3813, 0xa438200a, 0xc11d364c, 0x40581415,
  148962. 0x0687bf2c, 0x7ac89674, 0x86ad0d3a, 0xb97411a0, 0x44928105,
  148963. 0xf383371c, 0x74984b11, 0x0d1a831e, 0x70d2ed84, 0x6c912fe0,
  148964. 0xd883628b, 0x14fa88d2, 0x44f8f7fb, 0xcf0ac93e, 0x564f2a4d,
  148965. 0xa6c24fa6, 0x82f629aa, 0xbf6cd949, 0xab906ba3, 0x20a5182d,
  148966. 0x2c822e67, 0x30eb93a5, 0x2ff47dac, 0xfff673aa, 0xdc62c4a4,
  148967. 0x476b0ec5, 0x64b00763 },
  148968. { 0xb3c9a404, 0x1e3f533e, 0xb7ef9952, 0xb1db7f73, 0x6c253693,
  148969. 0xc7f13e29, 0x0738eed4, 0x7ce7f4c4, 0xce26cad0, 0xccfd3b33,
  148970. 0x01ec5cf1, 0xd8784935, 0xdc084e01, 0x3f8fc09d, 0xc39b5acf,
  148971. 0x217cab32, 0x9ef5551c, 0x42daf0bb, 0xe1217a95, 0xfbc76f56,
  148972. 0xc237002a, 0x80178b12, 0xb070a293, 0x0b52c39f, 0x576ca964,
  148973. 0xe3925153, 0x19d68e36, 0x25559424, 0x09e50e84, 0x291fb82c,
  148974. 0x6618ed8c, 0x7dd22ea6 },
  148975. { 0x49cbb3bf, 0x7ffe844b, 0x5562fb25, 0xde0cc704, 0x9f5a845a,
  148976. 0x1e6ee537, 0xe51277fc, 0x956d7f26, 0x30635718, 0x2c75d4b9,
  148977. 0x96957f34, 0x39a14892, 0x82e5742b, 0x8cf4eb32, 0x83247b72,
  148978. 0x6b0d3ddd, 0x201a4237, 0x67a9f633, 0x1414a485, 0x416403c1,
  148979. 0xb6f6a916, 0x60afd447, 0xdac6f790, 0x95f94930, 0xbd3b9d82,
  148980. 0x685ff94b, 0x51cadf0f, 0x5c8f98fc, 0xb13b7489, 0x9559c88a,
  148981. 0x5f18fcc8, 0x31377c66 },
  148982. { 0x7dcfb35f, 0x35c5de09, 0x01cc36f8, 0x2dccca9f, 0x7576cb63,
  148983. 0x7e93e85d, 0xf7b4b375, 0x0c2dd48a, 0xb09a19b5, 0x9d95cd4f,
  148984. 0x71bfe607, 0x752ed159, 0x2596dad2, 0x439880cf, 0x69e90a6f,
  148985. 0xe52efb53, 0x03d3e60a, 0x44097663, 0xa95070e0, 0xfcf364fa,
  148986. 0x05624dd2, 0xd8f993b6, 0x00d5e467, 0xb35a9824, 0x0c8f4524,
  148987. 0xe289d024, 0x648a0179, 0xef45423c, 0x587edabd, 0x3a5fd695,
  148988. 0xa11e5271, 0x3dacc50c },
  148989. { 0x6499ae4c, 0xcb3e4f94, 0x7053c527, 0xa46dcbe1, 0xbe782e8a,
  148990. 0x807f5ce9, 0xd8481e45, 0xb6c64d28, 0xaa286fd0, 0xf35e4518,
  148991. 0xdf1cdb49, 0xf7b7b9ba, 0xaec23eaf, 0xf3fb6210, 0xb9bfd2fb,
  148992. 0x0a9ba385, 0x8807f3a0, 0xe51a0d53, 0xb17b2842, 0x7ab24404,
  148993. 0xf9dd9f0a, 0x6fd57687, 0xf3e9df64, 0xcd1efdb4, 0x60df194d,
  148994. 0x5dd2df7a, 0xe069df05, 0xbed3f2c3, 0x23248a31, 0x469b7561,
  148995. 0x694744f7, 0x866949e1 },
  148996. { 0x3f4ab07a, 0x3a9a0da5, 0xf54a6fbf, 0x2cd6f333, 0xb23cf290,
  148997. 0x0c92e921, 0x848e3d58, 0xc9581c3e, 0xd3b218ab, 0x93af1fbd,
  148998. 0x066cb4d7, 0x38598ea1, 0x990c03a0, 0x5001394e, 0x7d0877b5,
  148999. 0x3b664b1e, 0xd74c7091, 0xd79db1bb, 0x4e2d5dd0, 0x852d4435,
  149000. 0x3329db82, 0x0d2b841b, 0x7b96d480, 0xfa844eb0, 0xc295dc46,
  149001. 0x37a50569, 0x94f7ec4e, 0xc2d38373, 0x5b083177, 0xdc3884ff,
  149002. 0x8b1fa598, 0x574352b8 },
  149003. { 0x0d5d7ce9, 0xed2193f7, 0x0b487eaf, 0x3c19fd26, 0x7be65fd0,
  149004. 0x7c44ab59, 0x78270d56, 0xdd9da860, 0xbaa70198, 0x8a84ec00,
  149005. 0x285985df, 0x2ec27e49, 0xde2028d8, 0x996ccaf0, 0x61c2201d,
  149006. 0x4e7648c7, 0x091c19eb, 0xa96335bc, 0xf0d6782b, 0x253a3a69,
  149007. 0xd2946493, 0x3f204340, 0x099f6873, 0x444521a1, 0x6996011a,
  149008. 0x5fcbcc09, 0xf853a94e, 0x3884d5d8, 0xd3b6a3a1, 0x2418c624,
  149009. 0x06ae3c4f, 0x3e431af2 },
  149010. { 0x83d381f1, 0xf967d939, 0xd0c033c3, 0x36501aae, 0x54410768,
  149011. 0xbf3af4d0, 0x5093a6d3, 0xa86d1598, 0xd92f2900, 0x43ae0741,
  149012. 0x36f0b755, 0xfeb2afa6, 0xaa456d6f, 0xd090a6a3, 0xaefdb646,
  149013. 0x336a4fda, 0x1a942f7d, 0xfd1bfe44, 0x851ee41e, 0x7fc2a3ed,
  149014. 0x11e935c5, 0x4f1c9686, 0x53bbb343, 0xcd577666, 0xad896c2a,
  149015. 0xf26931ba, 0x86bbfa41, 0x8a0fbbd1, 0xa203cef1, 0x1c3d7d82,
  149016. 0xe2664d35, 0x6dad3f15 },
  149017. { 0x12ec35a1, 0xd1940b7d, 0xe7dfb128, 0x6219c5b6, 0xf13321d5,
  149018. 0x2cc278c6, 0x33c58eb6, 0x5e76904a, 0xd9903c43, 0x15090f55,
  149019. 0xc3d96a19, 0x061bc926, 0x8c0acba7, 0x974a9f03, 0x7198b21b,
  149020. 0x7a414021, 0xf8958c6f, 0xb069599d, 0xbebd0129, 0x517f2f1d,
  149021. 0xdf3a8dc3, 0x1109a613, 0x672375c5, 0x08e58448, 0x9383d2d3,
  149022. 0x56590ba4, 0x0bff837c, 0xfc3ee7c6, 0x27d2d55f, 0xc87a5390,
  149023. 0x5f517a3f, 0x2438e9d4 },
  149024. { 0x8815af3c, 0xc4a45308, 0xf3c9bed5, 0xe55f1a32, 0x97b65ddf,
  149025. 0xaef1cdc9, 0x12e51eb5, 0x61c61d94, 0xe63f2490, 0xbd0dac54,
  149026. 0xd0b3e231, 0x6f14429c, 0xf1da6010, 0xf737c3c2, 0x6bbc4fb1,
  149027. 0x7150e04b, 0x1be281cb, 0x205b4c89, 0xd7701f5b, 0xf1b4633c,
  149028. 0x2a513490, 0x8b33ef46, 0x68f1f7f2, 0xddb47c73, 0xbd416b67,
  149029. 0xf4ada511, 0xff795bb3, 0x9d2a97cd, 0x96200e67, 0x00a8b7b2,
  149030. 0xafe30e01, 0x13f39011 },
  149031. { 0x7bd0c827, 0x3dd296ef, 0x4a29ff46, 0x506110f3, 0x1c9a515a,
  149032. 0xf8793068, 0x268bca77, 0xde8d8045, 0x998045df, 0xcbb83024,
  149033. 0x68c0e584, 0x3f90d710, 0x263b6062, 0x2a838ca8, 0x535c5d0b,
  149034. 0x293bb5e7, 0x56415110, 0xceea99d5, 0x1bbda005, 0xfe311ad0,
  149035. 0xa4d8d018, 0x2497e0bf, 0x1cf2b866, 0x33dd77a0, 0xd8c4ba8b,
  149036. 0xbc075b73, 0x722b7bc9, 0x298466d4, 0xcbda1b0b, 0x17a7ce24,
  149037. 0x680703b6, 0x458d4b6b },
  149038. { 0x4d54d8b2, 0x8a26a20e, 0x4d320a0d, 0x05a5696e, 0xf994f700,
  149039. 0x698b5858, 0x2f6549a8, 0x7a4adc3c, 0x3694d00d, 0x1812e819,
  149040. 0x730402bd, 0x46b9b000, 0xa1b36410, 0xe10a1449, 0x99230220,
  149041. 0xeae95ea5, 0x1b4820c3, 0x3efc2e9b, 0x85c9eb8a, 0xfe5b5cb5,
  149042. 0x97847064, 0x21ae0319, 0x8f27d49f, 0x68ef0b70, 0x2f72556b,
  149043. 0x3259ef18, 0x624db01a, 0x00ae0457, 0x5668f95c, 0x628e3b06,
  149044. 0xb6fbbf91, 0x5f13f5fa },
  149045. { 0x3a9b0dc6, 0x7c6ed9ae, 0x6f883ec8, 0xaea1bde9, 0xea8b3677,
  149046. 0xea66bf88, 0x9a66e3ab, 0xdefa6abc, 0x68217ffd, 0xc4d3317b,
  149047. 0x290df05c, 0xf741c8f2, 0x7d11674e, 0x1f0fdf17, 0xc35989ca,
  149048. 0xfdf0ece7, 0x6b9c482d, 0x0eed92df, 0x55bf1ca7, 0x73713e66,
  149049. 0x25cec99c, 0x90acb290, 0xe803e69c, 0x37c9e3a2, 0x17713a1a,
  149050. 0x7c0a3c53, 0x6f5a174d, 0x350dc565, 0x05f802f6, 0x11625a44,
  149051. 0xa37ba4a2, 0x2196495d },
  149052. { 0x13142680, 0x00cb2fd3, 0x65d14cf4, 0xab9e91d7, 0xdfe2669e,
  149053. 0xc6a0ceab, 0x0ae22bc5, 0xbeefce58, 0xcb6ec250, 0x3c2b7986,
  149054. 0xd738f1ff, 0x84adb1a2, 0x516ec8ec, 0x9709bc28, 0x8e8f7db5,
  149055. 0xf3693129, 0x95b197f9, 0xc48efc6b, 0x9aaaa404, 0x9ff10952,
  149056. 0x144154b0, 0x2c3c8cbd, 0x427f3435, 0x33ef7bc3, 0xd21897c1,
  149057. 0x04a17940, 0x6ce548a0, 0x5aa0c47d, 0x3d56fa62, 0x2971cea7,
  149058. 0x04475f08, 0x93ad0eb0 },
  149059. { 0x988a9963, 0x7a0b6967, 0x6515e8dd, 0x61e477f7, 0x3b6b50f2,
  149060. 0x6274e386, 0xd33922de, 0x63a9b8d5, 0x687a5b3d, 0x3c38d3fb,
  149061. 0x1302e323, 0x18f6f09c, 0xe02fcccf, 0x254c05c3, 0x26e662f7,
  149062. 0xc04ed0b7, 0x143fe079, 0x1d5646b8, 0xc9016c8c, 0xef8a9448,
  149063. 0xf823d797, 0xe5674c4b, 0xbccde451, 0x0586f72f, 0x4417eade,
  149064. 0xc5fc88d5, 0x576e588d, 0x2b952209, 0x5844d1f9, 0x4408dd42,
  149065. 0xea41c034, 0x73f8c3f0 },
  149066. { 0x5df763dd, 0x89534fc8, 0x3ac71836, 0x3b1427f3, 0x6e8f15a0,
  149067. 0x0db5be17, 0xcb20888e, 0x1d390944, 0x857caea6, 0x7804c9ad,
  149068. 0x519f7bf3, 0xaa584428, 0x293aa8cf, 0x626eecf1, 0xea36a015,
  149069. 0x749e0d98, 0x3321edcd, 0xefff6dae, 0x28b791cc, 0x963deea6,
  149070. 0x2d16e361, 0xa14e0552, 0xb15ae206, 0xa2e058fc, 0xfca325e4,
  149071. 0x0f268745, 0x21341a8a, 0x7cf9d407, 0x7caa51b8, 0xdfed25d9,
  149072. 0xadbedd75, 0x0108ae39 },
  149073. { 0xa9e88f63, 0x54d178f3, 0xab0c7325, 0xaa05b11e, 0xe261d8a6,
  149074. 0x773a53e6, 0x8d0b91c8, 0x24db7dae, 0xe9bb004d, 0xde10b073,
  149075. 0x54e3090b, 0xfc8befe7, 0x0cc69c89, 0x16af0599, 0x9d59511a,
  149076. 0xddc83803, 0x46c5dafc, 0xc3f65b99, 0x1ee0a599, 0xfbbe4be8,
  149077. 0xfb3a9b17, 0x88891e36, 0x445dad00, 0x0c9aad75, 0xd5097e1f,
  149078. 0xdffc46ab, 0xac85a4e1, 0x8848089b, 0xa0c45233, 0x348bb42f,
  149079. 0xeb13c1df, 0x807c06d8 },
  149080. { 0x98ee0ef6, 0x00a969ec, 0x8bb7b7af, 0xba9d5483, 0xa02f8fdb,
  149081. 0x24484c92, 0x8b70557c, 0x7bdb201a, 0x60ad1af2, 0xe59343e4,
  149082. 0x998c95fb, 0x53a9a942, 0xda861d3b, 0x974db3de, 0xed399c0e,
  149083. 0xce1525c9, 0xf72109bd, 0x89b56881, 0x998211a4, 0x08ff7d15,
  149084. 0xef0f275a, 0x5df76b3a, 0xfa2f358b, 0x93f180f7, 0xc39b0634,
  149085. 0xaac4ffcf, 0x17583b53, 0x2692c626, 0xb55399fc, 0xb2fdfa36,
  149086. 0x99607a61, 0x16424c6c },
  149087. { 0xdd2744a9, 0x5dd65c55, 0xfe3af418, 0x2544c1c2, 0xefe8b089,
  149088. 0x32c82e99, 0xa9df691a, 0x30b7ab25, 0x9be99674, 0x98384550,
  149089. 0xcaf2d122, 0xbcecd258, 0xbcc77272, 0x88ae4098, 0x4b8efa0c,
  149090. 0xd4396141, 0xed64d12c, 0x44ff67b9, 0x2e7f3404, 0xa9e655e4,
  149091. 0x45b0e9eb, 0x3d16fc45, 0xf03ded28, 0x474a3e14, 0xacccb85c,
  149092. 0xa3c9adff, 0x7253a51b, 0x3dfe6bc1, 0xfb5831b1, 0xdddaf4b9,
  149093. 0xa4f4478a, 0x5544e602 },
  149094. { 0xbaa80b4f, 0x897c5313, 0x63bdc8ef, 0x0122716f, 0x7b42c5a8,
  149095. 0xae2742db, 0x0883308c, 0xe9d9e1e9, 0x2d341ab1, 0x352c8c3f,
  149096. 0xed945870, 0x163d0500, 0xc290d9d8, 0x8349dd73, 0x1f6c7d29,
  149097. 0x2053c5e0, 0xcb42033c, 0x83107446, 0x09d09af1, 0x76c88bd2,
  149098. 0xb2794681, 0xd0f70e6e, 0x19b1b540, 0x720b59de, 0x22994b43,
  149099. 0x80b7ecdc, 0x2dec53cf, 0xc1a4cdce, 0x1ed60f42, 0xdd7d3edd,
  149100. 0xe241d261, 0x5735995c },
  149101. { 0xa0237056, 0xdc4ba3fb, 0x33ab3388, 0x6856c164, 0x271ec612,
  149102. 0xc01eebbd, 0xe3031bec, 0xabdeb033, 0x6118a1f5, 0x4eee4419,
  149103. 0x5b600f33, 0xec497421, 0x08868773, 0x1b7185cf, 0x7c1b7dfd,
  149104. 0x7b0c46cd, 0x4a4c5e89, 0xd143b2da, 0xbb1ff94d, 0xdb9a5984,
  149105. 0xc9cf3465, 0xac3904e4, 0xeace64c9, 0xf8729bc0, 0x768ad99a,
  149106. 0x5cc22821, 0x8a9540c2, 0xbbd3b081, 0x049a6917, 0xe468ed5f,
  149107. 0x3ec45ef0, 0x885486df },
  149108. { 0x4bdff464, 0x6a942c93, 0x25a7b451, 0x3db2719f, 0x325be324,
  149109. 0xccb0070b, 0x19fe3339, 0x2055a31b, 0x241ee8ff, 0xaca69ae8,
  149110. 0x55ef8def, 0x7607dd08, 0x1a1b73c6, 0x9e24960f, 0x71d36810,
  149111. 0xbcb0e8a2, 0x6885e6b9, 0x29e11aa2, 0x185eae19, 0x98b5d0ab,
  149112. 0x0f81f91c, 0x1a0b96e4, 0x994fc503, 0x4d0e8bcf, 0xf119d6e0,
  149113. 0x33d81697, 0xaaa4ce0c, 0x29083287, 0xc91ff9d7, 0xc5dd4d3e,
  149114. 0xd4ab962d, 0x31cecfe8 },
  149115. { 0xfc8b21e8, 0x437bfd9a, 0xb19436df, 0xe5dd32b3, 0x921c36a0,
  149116. 0xfe5902d4, 0xa3d0fa90, 0x8e9de84d, 0x5bb523bd, 0x9663e6ad,
  149117. 0xaecd6975, 0x9800a23f, 0xb4fbb59c, 0x1009c0d9, 0xc9d20ff1,
  149118. 0x839aa7bd, 0xecd6fa3d, 0xf502f66d, 0xc5516ca9, 0x480ed4fb,
  149119. 0x6c742ac4, 0x65ffa5f6, 0xff3252f8, 0x2b7c7945, 0x75d9cb3d,
  149120. 0x72fefc05, 0xd6d6f1d2, 0x11b0863b, 0x9a6a4ec3, 0x5d8f3cf0,
  149121. 0xda2547b3, 0x6961b46a },
  149122. { 0xcb35e2ac, 0xd07b587e, 0x57af14d9, 0x1ed5546b, 0xdb28a04c,
  149123. 0xeca17a5b, 0x709d54f0, 0xa1f91d44, 0x9c6f400e, 0xa6e719fd,
  149124. 0xfb8ce190, 0x4e4b88ed, 0x246e3fd2, 0xf9781edd, 0xb655af5d,
  149125. 0xd67120e6, 0x93413ca7, 0xda782d1d, 0x9707fa21, 0x697e20a2,
  149126. 0x54e84123, 0x1eb51f32, 0x36051f9f, 0x2e254d9e, 0x73ce5be9,
  149127. 0xddaec42b, 0xcd3f794f, 0x89a9a32e, 0x0781aad9, 0x1964e22f,
  149128. 0x53755212, 0x6a63a90c },
  149129. { 0x3d7acbbb, 0x76554e00, 0xb74f6108, 0x2c01668a, 0x388c519b,
  149130. 0xe4a29672, 0x3eb94d4f, 0x01667714, 0x0cd6d2f6, 0x086a3cdf,
  149131. 0x7b370f7f, 0xf8658021, 0x5a4d3e7c, 0x658880c1, 0x5ba3f4a1,
  149132. 0xd6ed5816, 0x5ca471dd, 0xabcc7813, 0xe844a576, 0x809bf074,
  149133. 0x6ea502ea, 0xa53a81b3, 0x0e021ed3, 0xc20b9307, 0x8617f165,
  149134. 0x8c27f892, 0x8235cd0b, 0xa5476446, 0x82552961, 0xffc89ffd,
  149135. 0xd151d90e, 0x51ed4a22 },
  149136. { 0x449701b4, 0x37d6963a, 0xbb27caf2, 0xea8d91a3, 0xb572965f,
  149137. 0x3ef9be15, 0xdb50bf7d, 0x75a7a055, 0xce643b9b, 0xfd67480e,
  149138. 0x6ceb5d5e, 0xf2a60d2d, 0x5ed7c897, 0x68fc320c, 0x28ce685f,
  149139. 0x41c53cf6, 0x7106615e, 0x0e29711f, 0x23500ecc, 0x7a872138,
  149140. 0x6c29fe48, 0xaf0a9260, 0xe1ef9712, 0x93df3f2a, 0xd2d169bf,
  149141. 0x0d5f6fb1, 0x74a9793c, 0xeb7afe26, 0xe9f49256, 0x4173d94a,
  149142. 0x2b8b5ce5, 0x2d6951bc },
  149143. { 0x904e222e, 0xdd007d9f, 0x86f4e109, 0x333f248f, 0x8f429eee,
  149144. 0xd4994e8b, 0xcfc77518, 0x29573415, 0x0b0f42f1, 0x6e7fea3a,
  149145. 0xc2743519, 0xc795cb7d, 0x711e71a0, 0x820a8f66, 0x2b874f55,
  149146. 0x83d95d9c, 0xe70e1627, 0xd4b64d78, 0x8b92a742, 0x924353f5,
  149147. 0x447b5e6d, 0x322048b1, 0xbcf931a0, 0x0bad730c, 0xa7af2268,
  149148. 0x75c4d089, 0xb83b93f9, 0x464904c1, 0x165b3aee, 0xa24eba02,
  149149. 0xe08cc5f0, 0x65c48e78 },
  149150. { 0xde222c22, 0x1a1c73ce, 0xfcea23b4, 0x5683d8cd, 0xb2143b06,
  149151. 0x0301cb14, 0x59fcec77, 0x284adf8f, 0x31204cef, 0xfb1c581c,
  149152. 0x94735107, 0xf54d3eee, 0x4d3188c0, 0xdbf67f0b, 0x10f18d12,
  149153. 0x76a3f2d1, 0x07d3e013, 0x3809fa28, 0x25e7ece0, 0xf06f0a46,
  149154. 0xb2895d2e, 0xd82867ed, 0x08b0553a, 0xe106f489, 0xef245445,
  149155. 0xe2280fa6, 0xa8d9a3cb, 0x402d5785, 0xd438ba2d, 0xf63dd9ff,
  149156. 0x7a6b226f, 0x36b5cd2c },
  149157. { 0x545679a7, 0x87ff4e20, 0x4520c750, 0x64d80b41, 0x9b459cd8,
  149158. 0x90a357fa, 0xc85af1a3, 0xa19eaf39, 0x8d935a5e, 0x0d475d79,
  149159. 0x781a678a, 0x74501983, 0x0cc2e810, 0x74839779, 0x2f412244,
  149160. 0xc6a21d11, 0x36a51a37, 0x8d0e85f9, 0xeaa74df8, 0xff50151e,
  149161. 0x93cf99c4, 0x14e182a7, 0x376a9ab6, 0x45593df1, 0x522389ff,
  149162. 0x18f73caf, 0xf7445e8a, 0xd27cc960, 0x39a51dc8, 0x0692f4c5,
  149163. 0xdb39bfd8, 0x08d7c144 },
  149164. { 0x3ecca773, 0x809c0d96, 0xd48c2156, 0x87ea9192, 0xdb6bd641,
  149165. 0xf0eccd74, 0x2a678cdf, 0x77312374, 0xd1587b7e, 0x7a966d8b,
  149166. 0x6130a4c6, 0xf3c1a101, 0x5fce17bd, 0x7cc6e838, 0xa8de7aa4,
  149167. 0x95e95bb8, 0x898308e3, 0x3fe1e8b5, 0xe347694a, 0x0197243e,
  149168. 0xbb0cd2bf, 0xf3fe9c42, 0x0f9b2b49, 0xb5905264, 0xc7367d1f,
  149169. 0x4c385e8b, 0xb5ee147b, 0x1d3050ae, 0x04004ad9, 0x8e2c3879,
  149170. 0xbab70202, 0x5f2aa8ee },
  149171. { 0x1266524b, 0xe208d464, 0xd0a19f66, 0xb7bf3880, 0xda106ebf,
  149172. 0xa5aa685e, 0xe642dd46, 0x0a69e8d3, 0xc682e4d6, 0xef349c61,
  149173. 0x0fcb534c, 0x26f6ee3b, 0x05eb67b8, 0x7daba127, 0x18be05f6,
  149174. 0x2babb27e, 0x8e2d85d1, 0x959afcba, 0xe2d9d386, 0xedcf2d1a,
  149175. 0x1ea6f06e, 0x59dc52e6, 0x866e5ae8, 0xc28278b4, 0x02bcd3c7,
  149176. 0xd9ff0340, 0x784be82f, 0xe884ac76, 0x83c9f224, 0xa3164980,
  149177. 0xb46ff949, 0x62501a98 },
  149178. { 0xad264086, 0x563f7d9a, 0xa5e0e4bd, 0xca6a33db, 0x8c8d3d67,
  149179. 0xe8253002, 0x46e64b19, 0xa288dac8, 0x20aa4536, 0xfa3c9197,
  149180. 0xed553eac, 0x8130c9b0, 0x2ea8abd3, 0x622806e0, 0xceccfe77,
  149181. 0x52fbf54d, 0x4f0d1b70, 0xbd9a8e31, 0xd59b1741, 0x519d2133,
  149182. 0x9a6fea8a, 0xfd74101c, 0xb5c4eb10, 0xd1acf7a0, 0x91f9da5e,
  149183. 0x78499b73, 0xc0dea586, 0xabaa4c49, 0xa1f3531a, 0xcc9c5f73,
  149184. 0xfd3fc665, 0x497b15fe },
  149185. { 0xf45568e9, 0x8a56cbaa, 0xc7192a6f, 0xf491a0fe, 0x9ab2539a,
  149186. 0xdbb03dd3, 0x4ac37da9, 0xc86522f8, 0x02a0f5b4, 0x8c8cdba2,
  149187. 0xa29c539f, 0x8109fc75, 0xca90f02e, 0x9cd06d31, 0x3e216dbf,
  149188. 0x8f31f044, 0xba3ebd91, 0x99aa68ac, 0x42c007f4, 0x2a80d0d2,
  149189. 0x86a9b7ce, 0xdd8dffbf, 0xd6308edc, 0x405d3e84, 0x068012ca,
  149190. 0xdafa33fe, 0xedea1071, 0xc2eebd13, 0x2ff637e6, 0xb7ae7e5c,
  149191. 0x9e514cb7, 0x18d46a6c },
  149192. { 0xa78b7802, 0x868cbb22, 0x497cbaf4, 0x0745ddb2, 0x42ae8add,
  149193. 0xc4eb2f3e, 0xb4ceb4e4, 0xac0abcda, 0xa325fd40, 0x2e0d8325,
  149194. 0x13ac7345, 0x6cfe0571, 0xb14171b9, 0x7407a788, 0x6da7a52b,
  149195. 0x70eb0603, 0xd85176ac, 0xab0b36f9, 0x7c2954f3, 0x14109d29,
  149196. 0xdcd705ad, 0x370de9c8, 0x7bb5e751, 0x3f0db5cd, 0xa06e708c,
  149197. 0x45f93d41, 0x7e93050d, 0x10d54f8a, 0x5a38fef9, 0x69e6f8e4,
  149198. 0xd3f62e40, 0x55044601 },
  149199. { 0x06cb9cc9, 0xd1c5c910, 0x41d00014, 0x542074d7, 0x11236fb8,
  149200. 0x7cd8663e, 0x29ad5f82, 0x39721ffe, 0x2951fc83, 0x1d21fbfa,
  149201. 0x400d144f, 0x1cde06e7, 0x91792e6b, 0x9042596b, 0x29ad5166,
  149202. 0x3365c8e5, 0x9aeefe98, 0xe2220e85, 0x70c2aee3, 0xbcb53189,
  149203. 0x9ff100bc, 0x477ca3db, 0xf532973f, 0x27074176, 0x9a2bd01b,
  149204. 0xa12118ac, 0x3dd79f93, 0xf3425209, 0xc6f5d7db, 0x563a8ff7,
  149205. 0xd7b0ec4f, 0x0da313fc },
  149206. { 0x15aa2557, 0x37125a8c, 0x00893e9c, 0xca21d70c, 0x67b8a823,
  149207. 0x48713994, 0x7cb0042a, 0x0d3e9a74, 0xc9e2ce18, 0x2d2bf4ff,
  149208. 0x049aeac2, 0xd5531a0d, 0xf03d0660, 0x4d29a616, 0x1f1b7f00,
  149209. 0x473d50d6, 0xca3de50c, 0x3af0ecbb, 0x09c28f27, 0xe2959bea,
  149210. 0xf8704664, 0x6d7c2ea0, 0x731083ef, 0xadfae4e1, 0x941c2554,
  149211. 0x50940c26, 0xa1162d03, 0x44167410, 0x1e82290e, 0x620230d8,
  149212. 0xdb414acc, 0x63630be8 },
  149213. { 0x8a7d2e41, 0xbf8d5222, 0xeb62f879, 0x49e75823, 0x6c402d89,
  149214. 0x1b4d33dd, 0xde2c59ad, 0x883e04d6, 0x49b9dc38, 0xbf3f38f4,
  149215. 0xb4b70c4c, 0x9d997d18, 0x13cea045, 0x1f69b20c, 0x58e2606d,
  149216. 0xca3d7025, 0x261d1b79, 0x3d4fd977, 0x5a1436fa, 0x56aeafa8,
  149217. 0xbb443c07, 0x369b3e98, 0xe558f6be, 0xfce5186c, 0xf8ac8f89,
  149218. 0xeb0cd478, 0xd5e5aa72, 0x68074f37, 0x68544eb0, 0x295845c0,
  149219. 0xf16688ed, 0x306a9871 },
  149220. { 0x634ec136, 0xbc451e9d, 0x0e6f658f, 0x1edf27ca, 0xc0db4120,
  149221. 0xa9be0152, 0xc5bfee67, 0x87b6ef20, 0x9a2d6023, 0x35283238,
  149222. 0xc7afb899, 0x60e564d8, 0x0ac9c2de, 0x4af22bc0, 0x82a9d22b,
  149223. 0x28e6f631, 0xf532701b, 0xc075c701, 0x82075f91, 0xf6d418f8,
  149224. 0x1beaa511, 0xf9fa628d, 0x6e72a13d, 0x551e7a17, 0x77f4c01c,
  149225. 0x9306215b, 0x93c9d588, 0x71aba731, 0x58e57cd4, 0x6443ebe0,
  149226. 0xe8103e37, 0x2833ac41 },
  149227. { 0x8da5ec5c, 0x7e564b86, 0x1c08db24, 0xac3d9da8, 0x8c57a728,
  149228. 0x9d7c1f0b, 0x9d343dc2, 0x3512afe7, 0xfdc60339, 0xb438e4cf,
  149229. 0xdcfa1941, 0x7d5a2700, 0x27320449, 0xd5f323f8, 0x1393c6e6,
  149230. 0x1b87a58e, 0x04baa431, 0xecb68bd1, 0x4722b4d7, 0xc09c1c5a,
  149231. 0x206b5faa, 0xf42faa97, 0x9976327e, 0xe1dcbcd6, 0x087787d9,
  149232. 0x655ba9e4, 0xde5c0191, 0xbd59c757, 0x0bcf3538, 0x673020ed,
  149233. 0xa49d6303, 0x120cd454 },
  149234. { 0xcab0f9ee, 0xebfdb8f4, 0x2cce58ee, 0xbc003ef0, 0x5a8d0665,
  149235. 0x9b6a6841, 0x9b957774, 0x642ed3a6, 0x4721ab5c, 0x3de487f0,
  149236. 0x21a4f0d3, 0xef2ff380, 0x29dbddcd, 0xbd16f558, 0x0e93dff2,
  149237. 0x2ef05b4b, 0x0bc9aec1, 0xde1faa12, 0xd467fa92, 0x66dae2c2,
  149238. 0x5eb33e34, 0x758daf64, 0x8f0103cb, 0xa67ad9f6, 0x9be02430,
  149239. 0x151f693a, 0xeb4054bc, 0xd5698496, 0x7019336e, 0x8ef1677e,
  149240. 0x7fdeea3e, 0x021cfd16 },
  149241. { 0xdf5c36f3, 0x5c73715f, 0xd64ad254, 0x703bde37, 0xf2cf7713,
  149242. 0x55368d10, 0x0f3993c8, 0x1e5ec7b7, 0x304ae4ca, 0xfdb16776,
  149243. 0x3d3bb18b, 0x0d8f717e, 0x66343d5a, 0x5267073f, 0x156008b5,
  149244. 0xfaeb52ef, 0x224a470f, 0xb97ad5f9, 0xed2ab51a, 0xaf86e391,
  149245. 0x9974302c, 0xdc0c7e57, 0xfd0ae28a, 0xc88fa817, 0xbf8ed59c,
  149246. 0x807c22df, 0xeb128bb6, 0x5dedc231, 0xa20595a3, 0x71edcd9c,
  149247. 0xc73cf78e, 0x07265b46 },
  149248. { 0xbd66232f, 0x73dd99f0, 0xc4027716, 0xc59aaf89, 0x5b860fc4,
  149249. 0xaf826dfa, 0x7a943f3b, 0x239ea8aa, 0x523c428d, 0x0e0e1b1a,
  149250. 0x6973b95a, 0x55ea0e3a, 0x2557753b, 0xea399caa, 0x06957b1f,
  149251. 0xf8adf72f, 0x3bd34302, 0x0389f341, 0xf8a43a97, 0x333f27d0,
  149252. 0xadaf796f, 0xcd9c0c08, 0x49c12aa2, 0x6dcca49b, 0x7a0ac6e9,
  149253. 0xdd88deee, 0x0644080e, 0x8f47575d, 0x0cc2f4bd, 0x6e9d667d,
  149254. 0x31d1496c, 0x36c5754b },
  149255. { 0xf323d84b, 0x9120046e, 0x7e789c4f, 0xa6991122, 0x921b8055,
  149256. 0x4b0eaf4e, 0x8079974e, 0x6339844a, 0x740f8c79, 0xc905466a,
  149257. 0xcd6def49, 0x1c18d0f7, 0x4b23e4ba, 0x5297da6b, 0xc41800c5,
  149258. 0x1c09dff3, 0x37ef6777, 0x6c49075b, 0x50513ded, 0xa94c3a40,
  149259. 0x6b0b1705, 0x3d6742e9, 0xc48af5ae, 0xc0784494, 0xc95822de,
  149260. 0x40c01532, 0xc164d94f, 0xa2ddade5, 0xa2975eb5, 0xfc8a8ac9,
  149261. 0x1946944e, 0x06fbf861 },
  149262. { 0x3f45aa97, 0x2d65338e, 0x1d040feb, 0xd83b58c8, 0x0fdef8b9,
  149263. 0x05fef59b, 0xe4d7417c, 0x7beb071a, 0xb30a1a23, 0x982b61f5,
  149264. 0xfb65bd03, 0x4c5f2a2a, 0x5cbf6bf3, 0xe40abc9d, 0xf06612a5,
  149265. 0x422c326d, 0x9571ae28, 0xc921e69d, 0x23d3434e, 0x7c88b10b,
  149266. 0x9da07933, 0x96d2e957, 0x3619cf4d, 0x833d46a1, 0xd95eefa1,
  149267. 0xd9d19653, 0xa03e8f0e, 0x2a7d8411, 0x04bb5ab1, 0x5e642953,
  149268. 0x1f0fa9ea, 0x5e9ca0fd },
  149269. { 0x197c5dc4, 0x5bd54571, 0xe78a95a2, 0xe2da40bf, 0xffdb0eb2,
  149270. 0x65fb9efc, 0x0d17467c, 0xe952dc2c, 0xc758c6a3, 0xc1fc9c7b,
  149271. 0xd4034a9a, 0xfc79562c, 0x61f64b56, 0x26e36fbe, 0x1e84728b,
  149272. 0x6adc4b9e, 0xa8f9ac8a, 0x7f165fd3, 0x03e3e013, 0x7bc93a45,
  149273. 0x656478e3, 0xeacc5513, 0x064ddc77, 0xd3391717, 0x76936914,
  149274. 0x75b318dc, 0x362424a6, 0x69b1f1c7, 0x49955f34, 0x8cc2045b,
  149275. 0xc6836af8, 0x940622b3 },
  149276. { 0x0d997973, 0x4710ccb7, 0xd3f8f115, 0x3b29625d, 0x5b97abd5,
  149277. 0x8cf0c4d5, 0x673e14a5, 0xc6321e0a, 0x3d262246, 0x0541af9d,
  149278. 0x6fc83b11, 0xde6d8754, 0xf01652a4, 0x47e97da8, 0xad9802b6,
  149279. 0x0f82b3a6, 0xae9c44b2, 0x69aa4075, 0xced2bf77, 0xaf3f5de2,
  149280. 0x497a40da, 0x1ef1ea8a, 0x3c23ba9c, 0x2e0f8608, 0xf190a2c8,
  149281. 0xd8a998a4, 0xcfde3368, 0xe2b49c8c, 0xbde6bd71, 0xb9f49824,
  149282. 0x785bedb6, 0x80bb1664 },
  149283. { 0xfd145cb5, 0x05e575fe, 0xac5e6883, 0x155ee561, 0x8793b273,
  149284. 0x461e70cf, 0x133b2338, 0x9f1553de, 0xa2a7ba07, 0x2fb9e0c3,
  149285. 0x3e7086fa, 0xc3bfd6a8, 0x8bb4cb93, 0xb6ba8500, 0x76f82dbd,
  149286. 0x0b66d789, 0x54eb49ff, 0x7d5a6ff6, 0x1f20b322, 0xcd65d237,
  149287. 0x54e29cdc, 0x79ea49c2, 0xcb118ff9, 0x64975963, 0xcc58000b,
  149288. 0x969598dd, 0x110c779c, 0x95107918, 0x63b85a35, 0xedfc1548,
  149289. 0x41212350, 0x077ba5ea },
  149290. { 0xcdd86f61, 0x0b3a38d3, 0x0502a0ab, 0x43121445, 0x806d0272,
  149291. 0x1912edc5, 0x8a32f10f, 0x01dc1f98, 0x0e80c760, 0xbb1d31d1,
  149292. 0xf464e8b3, 0xd46ec7e5, 0x9abf49ee, 0xd569af36, 0x2cdade77,
  149293. 0x9d286ea7, 0x45ad5920, 0x2be7020d, 0x6299ae7f, 0xabe5236e,
  149294. 0xd3f55c07, 0xc93179bd, 0x52350e80, 0x8138995a, 0xaff07586,
  149295. 0x0901265c, 0xf4739653, 0x5b3c81b2, 0x9bc77d21, 0xbaf7581d,
  149296. 0x4591a2e2, 0x6b2006df },
  149297. { 0x965b1bc1, 0xb2fe50a8, 0x962bb4fd, 0x931f536a, 0x000e7f99,
  149298. 0xd5718d33, 0x53d5125e, 0x84728f25, 0xd2125caf, 0x4f8a6184,
  149299. 0x357f679e, 0x54f1a701, 0x1531c05a, 0x70a9f40c, 0x6fa8b775,
  149300. 0x10d0cb97, 0x9dc12ce9, 0xb476f41e, 0x2755f894, 0x5c8d7a75,
  149301. 0x625741a4, 0xd6c12e10, 0xc917b16c, 0x262a6fb8, 0x38d6b0a0,
  149302. 0x24d116e6, 0x32c38e83, 0x849540c0, 0x66868afc, 0x855b911c,
  149303. 0xbd26b550, 0x53217ea6 },
  149304. { 0x259f52b4, 0xfc840473, 0xe621146c, 0x968da9cb, 0xcacbd26e,
  149305. 0x964eb85e, 0xe4a54344, 0xab7daa2d, 0x381a4ff7, 0x6dc3b848,
  149306. 0x41c815ef, 0xa07a96b3, 0xc3d4b1e1, 0xc4fae9e8, 0x42ce9ea8,
  149307. 0x0f938d1e, 0x35cc052f, 0xa727dacc, 0xe9a06f07, 0xc81e01c9,
  149308. 0x4a6d65a1, 0xa9e08dcb, 0x6044a9a6, 0xf8e2d173, 0xf2bd295b,
  149309. 0x99893dd0, 0xf9781b12, 0xa08d3379, 0x61830ac2, 0x64bd6001,
  149310. 0xd9adbeef, 0x0386931e },
  149311. { 0xd09885a5, 0xd0d7abb3, 0xe355bb07, 0xed9d2b67, 0x536ebaed,
  149312. 0x3bc238cf, 0x699ce4d6, 0x61ca2e78, 0x111594cd, 0x354ff447,
  149313. 0x03316ad2, 0x55cbe709, 0x49fff5c4, 0x418679fd, 0x0f9c6c40,
  149314. 0x75bacd75, 0x2972721a, 0x677edc88, 0xe5ef502f, 0x82596887,
  149315. 0xbf320e0e, 0x459e9367, 0x8bbdccb2, 0x81ce36ef, 0xb766863d,
  149316. 0x1ba097fc, 0xd58c6db8, 0xcd3a21d6, 0xb4a8748b, 0x0e4967cd,
  149317. 0x15041c20, 0x2caaf749 },
  149318. { 0x6ed20424, 0x44f98006, 0x22471545, 0xb3e4ea23, 0x781a8c86,
  149319. 0x268ed1a5, 0x7ae5b70b, 0x48d0ab75, 0x356d3982, 0x6ca8b320,
  149320. 0x2df31fa4, 0x9ce8e681, 0xd925dcf2, 0xb909d232, 0xf56723de,
  149321. 0x302c8f78, 0xabac96f9, 0x11725d69, 0x57d1a170, 0x656a47ca,
  149322. 0xc18a2be7, 0x6bb5d511, 0xad50d9d9, 0xb56e45f1, 0x70b05518,
  149323. 0x36e886e2, 0x09d8ff91, 0xc7c71f3d, 0x9350361e, 0x65a1bbe2,
  149324. 0x45fe3bd8, 0x86d7f532 },
  149325. { 0xb0bf719a, 0x99f16eb6, 0x8bc3d913, 0xb6975098, 0x26cd01b4,
  149326. 0xfae50e52, 0x90898d1c, 0xd3e3ac54, 0x887ec666, 0x4da3b9db,
  149327. 0xfbea45b8, 0x58300644, 0x8355b058, 0x369f3bd9, 0x579bcc13,
  149328. 0x0fb239a8, 0x6e2bd811, 0x4f5b4539, 0x24198fd2, 0x007f3baf,
  149329. 0x8837d51d, 0x68a676db, 0xeae75b16, 0x68eeea62, 0x3db6083c,
  149330. 0x5ffe5f94, 0x7d836c5a, 0x52c94d0f, 0xcbc1ff85, 0x5a4c3c6f,
  149331. 0x86c0b4dd, 0x682a55e3 },
  149332. { 0x587495aa, 0xc8f235a4, 0x34c7245d, 0x2276026c, 0xb75a46e3,
  149333. 0xd6ae0cc5, 0xecc3e5e7, 0x890d3965, 0x14296629, 0x1b13342f,
  149334. 0x8a877227, 0xc89927e6, 0x2324a68b, 0x1543f27e, 0x49cdc21a,
  149335. 0x6c447684, 0x1452d0ac, 0x9bc7fd4f, 0xff4b045c, 0x2cc30a31,
  149336. 0x852f7611, 0x415d46a0, 0xc6fdd7a6, 0xad737052, 0x7b4c7c91,
  149337. 0xdcecc3ab, 0x7688d70c, 0xd2cdf01b, 0xe40d3905, 0x054f2542,
  149338. 0xfefe4dcd, 0x02227fa6 },
  149339. { 0xb751948b, 0x1805efd9, 0xfdfd225d, 0x8efeed46, 0x4f2c8b22,
  149340. 0xcb128e09, 0x96f7c5e5, 0x9d1090bf, 0xb4cbeca0, 0x0959d044,
  149341. 0x8e08cb04, 0x21c955f9, 0x68fa4fce, 0xbc1f279d, 0x0710ae9a,
  149342. 0xb021e14e, 0x881167f4, 0x64d16e9f, 0xbbc9f1a5, 0xf5a5c22e,
  149343. 0xe3420eea, 0x5f3716df, 0xd5c4e843, 0x971eb915, 0x28ffba81,
  149344. 0x64fc55fc, 0x7dd37578, 0x3427e54d, 0x15ebc7d0, 0x446e6a62,
  149345. 0x29269778, 0x547e249a },
  149346. { 0xa1ffda27, 0x4706868a, 0x7955cf50, 0xb4e6cdcc, 0x0a63f3d8,
  149347. 0xf65151e1, 0x9de5e70a, 0x5b4127ea, 0xf9342823, 0x3d2c09ba,
  149348. 0xaa2f7d51, 0x18c99d83, 0xddeec025, 0xa0c5bb1d, 0x03dcf1ce,
  149349. 0x7ffddf84, 0x616fdeda, 0xe57e4d29, 0x7932a1f0, 0xd2456569,
  149350. 0x3191d4e3, 0x7475e0e8, 0xc220218b, 0x3479bea1, 0x8bcb2505,
  149351. 0xfceb5c90, 0x3c6132e6, 0x1c685cea, 0xbfe6c1eb, 0xc42dc745,
  149352. 0xd2b08eea, 0x45a41cc0 },
  149353. { 0x4dbbf0e1, 0x3ea9b2c7, 0xa17cf70e, 0x41ff962f, 0x5eeb4c66,
  149354. 0xdc1ea758, 0xa9beb17e, 0x4f5412d2, 0xa285741a, 0x2c9e4f52,
  149355. 0x984fd11f, 0x93df7da4, 0x0df3184e, 0xb2afbddc, 0x2421e375,
  149356. 0x96323d25, 0x49df781e, 0xc87be1e4, 0x3d589bea, 0x145601ed,
  149357. 0x28fff6dd, 0x0f0bd9bd, 0x8a0f298c, 0x2d3259d4, 0xd88e6944,
  149358. 0x362d7a77, 0xb6ac2af6, 0xa84c06b6, 0xd087da02, 0xba850ac9,
  149359. 0x42ee40c8, 0x128763c9 },
  149360. { 0xacbac178, 0x29a80f07, 0x34b08f6e, 0x7cc20044, 0x70feded2,
  149361. 0xe9631d14, 0x86615767, 0xb2115da3, 0xcb088548, 0x7c75f5c4,
  149362. 0x9a2e8e03, 0x5b29d213, 0x8b881752, 0xfe9fda66, 0xc1de7ebc,
  149363. 0x3f1d8d88, 0x03218123, 0xb476565e, 0xb1c995f3, 0x07365561,
  149364. 0xb13eb71b, 0x2160cb18, 0x99b3a0eb, 0x7e8da513, 0xb20fcd74,
  149365. 0x5e8ca1f9, 0xb4126d72, 0x6a7e0067, 0x68bb637f, 0x1e8204b7,
  149366. 0xfc4f74d2, 0x75e96bcc },
  149367. { 0x0d19716e, 0x189d1fdc, 0x7c384525, 0xdf585058, 0xea987d2a,
  149368. 0x64a846d1, 0x6c07150f, 0x12b6bf83, 0x4d6fd5b7, 0x91d85d46,
  149369. 0x4f53f55f, 0xa9788836, 0x81509129, 0x60083bd8, 0xea876f48,
  149370. 0xa7672683, 0xc15b2489, 0xe80b2e7a, 0x42d1d992, 0x985ef8d2,
  149371. 0xcf3de492, 0x9c57b029, 0xb1487627, 0xfe02f83c, 0x8ae5b687,
  149372. 0xaeba4fe4, 0x5d6b8196, 0x8a86f09b, 0xa16e523d, 0xd88f566b,
  149373. 0xba268949, 0x309a6e9a },
  149374. { 0xbdfbe97a, 0xef27ee50, 0xb8c50c4d, 0x1a5fe70f, 0x7fe09f5c,
  149375. 0xcc7beb01, 0xbed36cc5, 0x8fa15a85, 0x7550ed3a, 0xc0c3acdb,
  149376. 0xeb908681, 0xc581ef87, 0xc49d5ccb, 0xa15b3362, 0x1fa264e8,
  149377. 0x0fbb1714, 0x8e1eee88, 0x267f8d8f, 0x21c2b63d, 0xd31ccfd6,
  149378. 0x53be7efd, 0x924dbe7d, 0xdb2a358a, 0xd42e877f, 0x75d68ac1,
  149379. 0xcf9673c7, 0x714fea55, 0xe35978fd, 0x5769b202, 0xeeb36653,
  149380. 0xd7593789, 0x0458258a },
  149381. { 0xa042dbdf, 0x5df71a74, 0x5779dfa2, 0x2d405857, 0x0d2e6657,
  149382. 0x0e66cba7, 0xca2e892e, 0x285d6745, 0x0f0e6b5f, 0xf56a8def,
  149383. 0xa30767c3, 0xe0ee851d, 0x43346b9c, 0x98c05658, 0xd6b3c742,
  149384. 0xb35fce26, 0x39777e00, 0xc0895bff, 0xe7b6d886, 0x83c8f6a6,
  149385. 0x4f02904b, 0xbee14843, 0x2e84ec34, 0x7f74915b, 0x96d10991,
  149386. 0xbaaf663c, 0xe41facc0, 0x004b8757, 0x6f86c029, 0xa2b880e5,
  149387. 0x95b77358, 0x53f4a3e0 },
  149388. { 0x89fc48e7, 0x11bb08ce, 0xafab5aeb, 0xba60c577, 0xa0c1cb5a,
  149389. 0xf06bcbf8, 0x79757cb6, 0x7d2efaea, 0x76319160, 0xe26d90b1,
  149390. 0x2b77b7a9, 0x42aa1ab6, 0x285df2bf, 0x38eec0cd, 0xf3a8f7f0,
  149391. 0xd35947f5, 0xfc1cb5b5, 0x97c8dc0e, 0xc45845cf, 0xfeb8cca0,
  149392. 0x249e26f2, 0x16e8d989, 0x483ed89a, 0x7c264e6d, 0x51d91073,
  149393. 0x13a3f145, 0x305e99f0, 0x8501562e, 0x6908d563, 0xaaf98d74,
  149394. 0xd723d236, 0x0a99e653 },
  149395. { 0xabbc0559, 0x23536f46, 0x9aa1a160, 0xc163067b, 0x0c1681b5,
  149396. 0x229fd229, 0x1378e907, 0x61254be1, 0xab793a2d, 0xc60ff57a,
  149397. 0x466552db, 0xa6f2df8b, 0x8c170a36, 0x9ad31893, 0x29b74d9a,
  149398. 0xc5cd9abe, 0xf7848523, 0xcf747273, 0x0d0e3063, 0xc126a93a,
  149399. 0x4248e3d8, 0xfe2021e3, 0x8323ddfa, 0xd97343ee, 0x332639e7,
  149400. 0x9f768775, 0x75325548, 0x9650fc31, 0x3eebf7ea, 0xb595dbd1,
  149401. 0x010fcbc0, 0x3a95cb45 },
  149402. { 0x39d7ff2e, 0x954e68cb, 0xc1d5c48f, 0x8dd1cb4b, 0x7169438a,
  149403. 0x02a92c77, 0x91cad8ce, 0x7965c0b0, 0x32cd08d2, 0x0c5798ab,
  149404. 0xa6902bda, 0x1a5bc3c3, 0x5186d218, 0x545d0925, 0xd27e64db,
  149405. 0xf0077cdb, 0x8cd092da, 0x0157caa4, 0x24532ab3, 0x2a2fa3a0,
  149406. 0x41ccaba3, 0xa5fb639b, 0x4744aee6, 0x01702dc1, 0xcdba93da,
  149407. 0x485bb436, 0x329784f1, 0x93597f66, 0xdad672c3, 0x5d713c1d,
  149408. 0x030b7245, 0x366d222e },
  149409. { 0x573ea5b2, 0xd50b4875, 0xa90da44d, 0x0fce401b, 0x7a1a0310,
  149410. 0x7b53fa65, 0xcf114460, 0x722a80a5, 0xa538bf49, 0x0b8ebf05,
  149411. 0xd32acd21, 0xae141147, 0x7b5ad07d, 0x6692712c, 0x3f48ca07,
  149412. 0x6dc5fee7, 0x2b8a78d8, 0x98ed1499, 0xdd2f1759, 0x4e8b3145,
  149413. 0x5f971b8e, 0x43408de1, 0xadf1b368, 0x055ea6dd, 0xe5932b7e,
  149414. 0x4bb76e73, 0xd30893fd, 0x44287153, 0x0661bfda, 0x173dccd2,
  149415. 0x79defd25, 0x9072ba99 },
  149416. { 0x9620ea39, 0x474de4dd, 0xc831cee8, 0xfbf1649f, 0xcd3a9c43,
  149417. 0x0b0e8bb1, 0x3f3df1d5, 0x6a38286f, 0x8f0ec9b3, 0x4ed072b3,
  149418. 0x729c09e3, 0xa6e4c987, 0x8ad12242, 0xea3e8ac6, 0xfbdfa5ba,
  149419. 0x6ae0e22b, 0xb0a0f592, 0x56171ecf, 0x6b871f8d, 0x33b2886d,
  149420. 0x35e11bda, 0x6b19bea9, 0x7f0f153f, 0x4d815a40, 0x7d6c02ee,
  149421. 0x7e608d97, 0xb6a88f46, 0x7e8f23d9, 0x439d1654, 0x26ac9652,
  149422. 0x35546c29, 0x8d92c6bd },
  149423. { 0xabeb0ff7, 0xb3e0d7ce, 0x3e0e42f8, 0xfbe35254, 0xde808499,
  149424. 0x57d1b226, 0x1cd44bc3, 0x9ece2e1f, 0x435cfee1, 0x1245adbc,
  149425. 0xf93f581c, 0x874ee840, 0xbda0b947, 0x916a779c, 0xfa57ae0a,
  149426. 0xabcc815a, 0xf0a621b0, 0x97adec2d, 0x81f90bdc, 0xbe6a502b,
  149427. 0x53bde63d, 0x54bf9de1, 0x78884c25, 0xa88fdabf, 0xcbbb5470,
  149428. 0x30aa52b1, 0x29053ef5, 0xf805396c, 0x8dd827ea, 0x8d43d898,
  149429. 0x5c1ae5c0, 0x4e4bec17 },
  149430. { 0xfcc09676, 0xbf8483a2, 0x19ea9a94, 0x457c4a3f, 0xd702a5dd,
  149431. 0xa6852ef3, 0x843fe7d8, 0xe7915fd2, 0x16e35158, 0x644bba98,
  149432. 0x9ed746f0, 0x8d1b95d0, 0xb90af0b5, 0x47704581, 0xd4fd135e,
  149433. 0x0bd4bc6b, 0xb4e833a5, 0xa6dce067, 0xff56a9a1, 0x2c0e8f30,
  149434. 0xec2c63fe, 0xa9c80800, 0x98f508a8, 0x449c20a5, 0x3292813a,
  149435. 0x02b94cb3, 0xec7e81a2, 0x647e3d28, 0xb4877677, 0x72e67d1a,
  149436. 0x6f9ded24, 0x7a4aa3f5 },
  149437. { 0xe27a0045, 0x559ef1ba, 0xb242cb50, 0xdc812d4f, 0x39cf8d24,
  149438. 0x23a478e4, 0x9b3f9c54, 0x97544fc5, 0xaffa1fcf, 0x5ac68132,
  149439. 0x34a2c83b, 0x74f8fee0, 0xcd3f4bb7, 0x96cc640f, 0xb0512ea6,
  149440. 0x775dce9d, 0xcdce381e, 0x67dca19d, 0xa9d3fe55, 0xc1eeb3f3,
  149441. 0x1a19274f, 0x38e0bf42, 0x28d69b12, 0x15992fb4, 0x9fd09df8,
  149442. 0x48fcebde, 0xb41ab5df, 0xdc9dfa4f, 0xc0a269c5, 0x0cbd7dc8,
  149443. 0xf7f0ade1, 0x60282a7b },
  149444. { 0xdceea2e7, 0x7c07e538, 0x3c42061d, 0x38a322c8, 0x4f1f6516,
  149445. 0x676828f9, 0xc7776a10, 0xf21b69fb, 0xb5e6b405, 0xc63a3417,
  149446. 0x91a7b642, 0x4c99f258, 0x2cad1440, 0x38692ca8, 0x00869bcd,
  149447. 0xf1e82ffe, 0x16fe466a, 0xc30b714e, 0x19019138, 0x5fb742f9,
  149448. 0x0fa516ae, 0xe90166d0, 0xd8c73a43, 0x5550f7ac, 0xfbc5c372,
  149449. 0x2d6a407d, 0x68cc39ed, 0xe47a7539, 0x4a5fbe70, 0x3fd286d9,
  149450. 0x23c6b942, 0x5f4ae9c7 },
  149451. { 0x53f4d561, 0xd96a2dda, 0x16da1992, 0x286d45d0, 0xfdd4b051,
  149452. 0x449a01fb, 0x9f2195ea, 0x25488a0d, 0xa37661b3, 0xc4151b0a,
  149453. 0xf9e5ee02, 0xb98c471e, 0xa8658817, 0xa4bca86e, 0x7a68fc0a,
  149454. 0xbbcadb87, 0x6b7366a9, 0x88b34649, 0x15661c2d, 0x32ee98d4,
  149455. 0xc901420c, 0xf5b3b4c6, 0x2f2752af, 0xa2352735, 0x510e4d9c,
  149456. 0x2f64ce73, 0xaca4aa80, 0x939a7f26, 0x401aa503, 0x9cd3e291,
  149457. 0xdc46afd2, 0x92a01423 },
  149458. { 0x1c2f7dbd, 0xe9f24be1, 0xb7d527fa, 0xda8c900f, 0x8648f128,
  149459. 0x963e25bb, 0x48141941, 0x9ab713e2, 0x7a6756fb, 0xe87f7d01,
  149460. 0x058d90bd, 0x274dd85e, 0x82566abd, 0x823fee7a, 0x74240195,
  149461. 0x9f6230d7, 0xacb5e46e, 0x04579f2c, 0x16a4c87e, 0x2a226263,
  149462. 0xd99b0857, 0x9ca19a43, 0xe488789e, 0x86dc2ba3, 0x9406c3bd,
  149463. 0xf960b5b9, 0x8960957e, 0x6f2c428b, 0x161c515b, 0x90748706,
  149464. 0xaa88cb9b, 0x0fc8fe1e },
  149465. { 0xfeb90f2d, 0x68ae1bed, 0xa48b1559, 0xf393bb3c, 0xf64e9635,
  149466. 0x2be62f9c, 0xf8be75c2, 0x354c2410, 0x5e6f7529, 0xbd7ea703,
  149467. 0x162cab31, 0xc264868e, 0xc860f3ff, 0xb1391e70, 0x1d89837e,
  149468. 0xdf367c75, 0x2bf32941, 0xe150b6b4, 0x78c1318f, 0x95e8f46e,
  149469. 0xa2c4b160, 0x2b3f1dab, 0x701afbf3, 0xc6ccf5ce, 0x5e8874c5,
  149470. 0x3ad27530, 0x5dc6dcbe, 0x39285e51, 0xd99892dd, 0x3c954d86,
  149471. 0xdfd3789f, 0x2d0ba862 },
  149472. { 0xb472e1af, 0xeacd8ee8, 0xb76abbcc, 0xeb354eae, 0xd0d93fbd,
  149473. 0x9b520bf8, 0xfe6fc706, 0xfccd60d7, 0xa4ee2f39, 0xa9353dde,
  149474. 0x9a81e51e, 0x5eb0925e, 0xd1366777, 0xee334da1, 0xd5354d69,
  149475. 0xc1d28c9f, 0x92a5ed54, 0xb9771755, 0xb7f70d81, 0x5d3e367f,
  149476. 0xa933ae7a, 0x7be7eeca, 0xe23cfbb7, 0x264cf1f9, 0x89497681,
  149477. 0x0d129f4a, 0x09b6235b, 0x705375a4, 0x48a376da, 0xccf64c75,
  149478. 0x4d41dbfc, 0x963c8712 },
  149479. { 0xde36a814, 0xbae290cb, 0x733b12b5, 0x9bdb0195, 0xf77fe0e1,
  149480. 0x0ebad867, 0x29720cea, 0x0a7d19fd, 0x9029ec72, 0x434d7651,
  149481. 0xbb51911e, 0x856aff17, 0xd80a7f60, 0xd0a25d9a, 0xf848c106,
  149482. 0xffca86af, 0x43ad749c, 0x53e8bdf9, 0xe3e696bb, 0xfb9e0284,
  149483. 0xeeee4215, 0x3eb6630a, 0x2ecf3c63, 0x9d8fbb9e, 0x4e00c0c0,
  149484. 0x71da4ffa, 0x5d57beac, 0xb296be59, 0xa8cec7ef, 0x1751fbad,
  149485. 0xff55d7bd, 0x2d03eb3c },
  149486. { 0x04f2ec1d, 0xeb16925f, 0x0d147ee2, 0xa878f276, 0xaad9d9e0,
  149487. 0x442df604, 0x3f71035b, 0x891df44b, 0x8cb95d5b, 0xc28272b3,
  149488. 0x5ee8ed23, 0x6f14efb5, 0x13b0f3e3, 0xf3c4460f, 0x6bd7335e,
  149489. 0x889f9bd7, 0xf755ba6e, 0x889ee771, 0xed219b6c, 0x626984fe,
  149490. 0xec2ee411, 0x2d44c737, 0x63efcd37, 0xb94385a2, 0x6637826b,
  149491. 0xd909321b, 0x3ee6b7a7, 0xc24f8a79, 0xa7cf61b7, 0xa3ca8d24,
  149492. 0xc54bacd9, 0x842e40c1 },
  149493. { 0xa661d843, 0x5a268ed6, 0x4f5b30cd, 0x02328cca, 0x1311e177,
  149494. 0x16e6fed1, 0xc6695967, 0x690decb4, 0x57b2e280, 0xbdac5bf6,
  149495. 0x1efe42d0, 0x827f82ca, 0xca5fca2f, 0xc554ec0a, 0xdde45506,
  149496. 0xac5276c1, 0xe3077513, 0xb7f4cb08, 0xcc8797cc, 0x8caf6d9a,
  149497. 0x0d9332d2, 0xd5964814, 0x285a409f, 0xcc6ae297, 0x6223d093,
  149498. 0x7773c2a5, 0x5128fc09, 0x2d5266ac, 0xbc31fe6c, 0xa596b7cb,
  149499. 0xcac91328, 0x0e63319a },
  149500. { 0xf0360ac2, 0xb5cd2fad, 0x285e605a, 0x86b660de, 0xe25b9b14,
  149501. 0x82c6cf10, 0xaa9ac554, 0x9d5fa38d, 0x526c070e, 0x3dfcf1b8,
  149502. 0x3fccc52d, 0x0379a96b, 0x0bfcc7f5, 0xe3659c29, 0x69d3e6a1,
  149503. 0x5b1a3db5, 0x9b7b42d5, 0xb41528b5, 0x9c22a006, 0x934defa4,
  149504. 0x9b4ce3b6, 0x90f38018, 0xb3abaf32, 0xb073bc04, 0xff8389e2,
  149505. 0x27a5a222, 0xffa5a35b, 0x0b7a9d51, 0x28e1a7c2, 0x4939ecef,
  149506. 0x1872705a, 0x88839da2 },
  149507. { 0x701ce29a, 0x56b66c30, 0x58981d50, 0x3acaf126, 0x105f9f21,
  149508. 0xd4dafc0c, 0x373e3d13, 0xfee571e6, 0xfa2ee3ca, 0xe7269c86,
  149509. 0xdd20385a, 0xf5cca64a, 0x3000e9ac, 0x217f2757, 0x0e7273ef,
  149510. 0xc934db47, 0x355b6776, 0x4294f4f7, 0x6fc05180, 0x1faa36b9,
  149511. 0xb052190b, 0x8f88b1db, 0xe9eaef52, 0x35791b90, 0xdb681b90,
  149512. 0xf37fb2eb, 0x4415c369, 0x39d0a51d, 0x1d2e21c9, 0xfc59cca7,
  149513. 0xa1f50c26, 0x64128cfe },
  149514. { 0xe8f5b0b5, 0xf03678a2, 0xd340f059, 0x5c7e249c, 0x93ca7cec,
  149515. 0x41440441, 0xbc83af98, 0x075ca346, 0xfaa8bbb0, 0xf39f0033,
  149516. 0xf38230f7, 0x3d18f0ed, 0xd448f345, 0x78dff00c, 0xd51aa475,
  149517. 0x849228c0, 0x30c928d1, 0xdd4e2708, 0x8f12cfd3, 0xc66ba686,
  149518. 0x88b3a206, 0x091049db, 0x016dae01, 0xd865d059, 0xe253e37d,
  149519. 0x4599e905, 0x7ce9871b, 0x322cf0c2, 0x174a132e, 0x014f54da,
  149520. 0xbdabcbda, 0x93634a09 },
  149521. { 0xa9a2e304, 0x62826b27, 0xc1a4c124, 0xc57e1866, 0x22381710,
  149522. 0x913ab832, 0xa9847cfe, 0x7e9b6b85, 0x2b5f46fd, 0x29655cf1,
  149523. 0x8038e66d, 0x7295572b, 0x6fa95eab, 0xe4cba601, 0xb9deda81,
  149524. 0xbbc11071, 0x3f1cf61e, 0x97f0009a, 0x373e0cfb, 0x5372777b,
  149525. 0xd139d63b, 0x302f909c, 0x4f87d78e, 0x1ed672da, 0xb4048763,
  149526. 0x362077a3, 0x9dcc22b2, 0xc408c32d, 0x26deeee7, 0x4b4c5bf2,
  149527. 0xbc06357e, 0x266cb467 },
  149528. { 0xb56363e8, 0x6faa4154, 0x3c1aa4db, 0x4b4fd078, 0x2b9e6597,
  149529. 0x14358dde, 0xfa004b84, 0x5b34ae3e, 0xf19911a6, 0xcf44b2ec,
  149530. 0xa536bf78, 0x55caa833, 0x8870dc95, 0x606e1eb9, 0x09f3511d,
  149531. 0xe3c3287d, 0x9d5cf364, 0x68b2f4eb, 0x63ab8c9e, 0xc154e892,
  149532. 0xc36ab611, 0x1548828e, 0xa1b7d120, 0x0932bfcb, 0x5315b8d7,
  149533. 0x7ee7b5bc, 0xf7473ac1, 0x782fd0d1, 0x3c8f2af3, 0xbcb029a8,
  149534. 0x52454ee1, 0x4b1d5a1b },
  149535. { 0x63d52c0c, 0x12fe5174, 0x188c099d, 0x3735525e, 0x360e3956,
  149536. 0x5c621563, 0xacfa5a43, 0x88b3f1ca, 0x797e8107, 0x90123a0a,
  149537. 0xb15e080a, 0xba31f6b5, 0xfca3dada, 0xd7de5e12, 0x0df511c8,
  149538. 0x3287361b, 0x65757d4e, 0x7cc800d4, 0x5207ec91, 0x10810f3d,
  149539. 0x30eea0e3, 0x0d4e56f1, 0x3ea5a2ec, 0xbbf7ee13, 0xbe6abbd0,
  149540. 0x6fc07762, 0x120bf619, 0xc831fdce, 0xb622d42a, 0xe07439fa,
  149541. 0x508e4b27, 0x8186b93f },
  149542. { 0x09312867, 0xc619d154, 0xbfaf7db4, 0x7e042c05, 0x1f5f5dda,
  149543. 0xc1cf1668, 0xa4fc3d82, 0x50aa5057, 0xce68b8fe, 0xed30ed65,
  149544. 0xbeb4d644, 0xecb01c0b, 0x831c0497, 0x7b5dc444, 0x9b7d9b1c,
  149545. 0x351e6a00, 0xd9477c91, 0x4bb863b9, 0x05d4110a, 0xaba65891,
  149546. 0x43580b7a, 0x30086cf4, 0x90be357e, 0xb139c076, 0x27b5214e,
  149547. 0x12bfff1a, 0x22c3ab57, 0x79cfc6d7, 0xf34a9bfa, 0x4743de57,
  149548. 0xc9ee2b2a, 0x0bf97e97 },
  149549. { 0xdda19e96, 0x96ec4ec8, 0x6c306e8b, 0x54ce18ea, 0x65f6918a,
  149550. 0x7e83612b, 0x0d9a0d99, 0x1ac6f68b, 0x62fdcc09, 0x98a697a4,
  149551. 0x95bc3e13, 0x65ce25f1, 0xb3939730, 0x1896ecda, 0x32f12806,
  149552. 0x9eb81a0f, 0x1d2dc7df, 0xd3d7416e, 0xad473599, 0xe22c7976,
  149553. 0x9f5ef439, 0x3de37a9a, 0x9e69d94e, 0x6b7ac0ab, 0x0a9d0bc8,
  149554. 0xe6bfa9e0, 0x5676f120, 0x576a870d, 0xfeaac23f, 0x3bd91bb4,
  149555. 0x3e40aabb, 0x8fe5482c },
  149556. { 0xce9a4d1e, 0x85ae67c2, 0x4f1d2038, 0x4c3eb803, 0x25d06192,
  149557. 0x5c6c8f3a, 0x308fb41c, 0x803de0ad, 0xe71c294e, 0x9961f5bc,
  149558. 0xf02eb0da, 0xdc62078d, 0xb64ae8b6, 0xc87ef515, 0x50b4d18f,
  149559. 0x69679f1e, 0x52199f43, 0xc5c009a1, 0x0f640a5f, 0xa7d484be,
  149560. 0x23dab566, 0x4c918bb1, 0x64275d2c, 0xa67c114c, 0xcad2ded6,
  149561. 0x95a913b9, 0x6b4b5c8d, 0x189ed18b, 0xb42d3bf6, 0x4aeb6206,
  149562. 0xbbc8bc3f, 0x3928c669 },
  149563. { 0xdacb4b64, 0xde4bea4a, 0xf26179a1, 0x03f62a44, 0x7a9112a4,
  149564. 0xf3aac94e, 0xd36f331e, 0x90448fbd, 0x407b85c4, 0x426042bc,
  149565. 0x2121b77b, 0x5ad8a596, 0x67cee984, 0x31674a4f, 0x4e3b2f0d,
  149566. 0x7fae8bbe, 0xa7c930eb, 0x681df6dd, 0xc259d0d4, 0xadeefa98,
  149567. 0xbea1c1fd, 0x1b14d9e6, 0x21d405d1, 0x3baadc8b, 0x73892754,
  149568. 0xf01dff93, 0xf071cde4, 0x81c35b3e, 0x9150d0d9, 0x1704d2e1,
  149569. 0x355134f6, 0x6ccc888f },
  149570. { 0x7ad7504c, 0xf8d36f0e, 0xf7959ddd, 0xbca3265f, 0xfede67aa,
  149571. 0x0dcd1ede, 0xbaebf32f, 0x1276f4ce, 0x014edcfc, 0x6825a6e6,
  149572. 0x99ad8eb7, 0x0b8c1a82, 0x09b8ce1e, 0x312024a9, 0x9cbd351a,
  149573. 0xcb8fd98b, 0xfab1e8be, 0xa4841378, 0x3973cacf, 0x17ed0f5d,
  149574. 0x259d5254, 0xa17e1484, 0x74b91393, 0x53d5b843, 0x1aca3ce9,
  149575. 0x8f792b21, 0xc8c0f815, 0x035ff110, 0xad4ed7bd, 0x6afa6357,
  149576. 0xb26faef9, 0x2f151980 },
  149577. { 0x29d2d439, 0x0c8631da, 0xbc039955, 0x121fbbc2, 0x6c05b75b,
  149578. 0x3e5a9792, 0xb6ce47ec, 0x6d6cf4c0, 0x9d88c658, 0xbaaa1767,
  149579. 0xf3355a17, 0x031db9e7, 0x0aef5a85, 0x8381e3d8, 0x15a31bdf,
  149580. 0xc71db290, 0x9498fd7d, 0x638f6b74, 0x13beeef6, 0x44edf3f9,
  149581. 0xf4ab67b3, 0xe6173271, 0xfd22df11, 0x3a202c70, 0x205c4e92,
  149582. 0xf7be0389, 0xa8eb9920, 0x1c219085, 0xbeb54aaa, 0x6c805ce8,
  149583. 0x0ac58d65, 0x354b05b7 },
  149584. { 0x7a9170e9, 0x7171e236, 0x4cad50cd, 0x01eec42d, 0x3cddccfb,
  149585. 0xffbe824f, 0xa66cae1a, 0xa73e8ce3, 0x965c7d01, 0xb7138a7f,
  149586. 0x5c3d971e, 0x00058e3f, 0x2ff0a72b, 0x52591ac3, 0xbbbce76f,
  149587. 0xa32fb5bc, 0xa9f81a18, 0xf3241ab8, 0xeca68630, 0xf31d3332,
  149588. 0x4482f13b, 0x847af9fc, 0xa4681be2, 0x6196e217, 0xe55efcf9,
  149589. 0x9938f932, 0x70acc705, 0x3e7dacb8, 0xcf09fac2, 0xd41be893,
  149590. 0xae3523a1, 0x48dc55c4 },
  149591. { 0xa5092193, 0x8e623826, 0x6898970c, 0xe46ec362, 0x25c9eb41,
  149592. 0x2f1356af, 0x83c7d245, 0x41780640, 0x97d00e38, 0x982def67,
  149593. 0xa512151c, 0x382eb6e7, 0x8af58869, 0x154e1077, 0x8a51cf02,
  149594. 0x18707075, 0x71313c58, 0xcdeba9f7, 0xba155904, 0x5d67b973,
  149595. 0x1d0d7b3a, 0x851c9f4b, 0x8b8af2cd, 0x19f29d71, 0x986b8d62,
  149596. 0xcb94ccff, 0xb93b9c33, 0x8725e24b, 0x66e38c68, 0x405ce4c5,
  149597. 0x0b6dc021, 0x5f6a8edd },
  149598. { 0x8f9a8690, 0x83704ca5, 0x2f76a407, 0x3f369766, 0x69201028,
  149599. 0xfbc12d8c, 0xbce3a4cf, 0x4cd58f16, 0x04aab26d, 0x7804664a,
  149600. 0x4ea457a8, 0x005cfbba, 0xb8a59794, 0x537951b3, 0x4fe1f739,
  149601. 0x4ca2b9e4, 0xdf325797, 0xe4428acd, 0x0ea243db, 0x648da342,
  149602. 0xf43ce01e, 0xcce6562b, 0xf27db490, 0x840f0421, 0x8bfb7cf0,
  149603. 0x156ccb70, 0x5a8797d3, 0x9b33480d, 0x9eb814bb, 0x2e12e07a,
  149604. 0xca7f87ac, 0x1ca65072 },
  149605. { 0x2b9d25a0, 0xfbb321cf, 0x40a746db, 0x66affdca, 0x59e368b5,
  149606. 0xc1c1530e, 0x7d80068f, 0x56ed1ea4, 0x5647dd68, 0x9b74d8fe,
  149607. 0x89b78da8, 0x1d96b507, 0x8bbe3391, 0x39b75243, 0x0d858c5f,
  149608. 0xef8d443e, 0x9646aa34, 0x4dd2db49, 0xe667543c, 0x7fad3bd1,
  149609. 0x68980985, 0xd0d710c0, 0x49facaba, 0x9f7aff32, 0x14f9a192,
  149610. 0x055dec1c, 0x1fb307a1, 0xaca66399, 0x35ffff64, 0xac44fd91,
  149611. 0xcbad3cee, 0x462cafb6 },
  149612. { 0xde3237dd, 0x1660a647, 0x82b87404, 0x95f735cc, 0xddfa55f8,
  149613. 0xf7879f59, 0x726b914a, 0x15ef043e, 0x1c93e298, 0x1875393d,
  149614. 0x6ef18331, 0xa1a2be74, 0x25a9a12b, 0x4e7e8dfc, 0xa9c3917f,
  149615. 0xdfefc97d, 0x0a2ebe41, 0xbc875d03, 0xa732d1cc, 0x0f75d235,
  149616. 0xd9baa6d3, 0x06fee7fe, 0x65f48576, 0xaa784fab, 0x513f83c0,
  149617. 0x23155e22, 0x3e8f9d13, 0xd2fb7718, 0xb546eafd, 0x2a291503,
  149618. 0x6cd93608, 0x1293c98c },
  149619. { 0x49d53b77, 0x72781251, 0x96eafac7, 0xa6ab403d, 0x4a36b711,
  149620. 0xb7d7c7db, 0x87e771c1, 0x8238c708, 0x33b37522, 0x495f6abf,
  149621. 0x8c87530d, 0xb0b0289c, 0xe77b111a, 0xca83cb86, 0xa1bd189e,
  149622. 0xbe1c0fb8, 0x1ae9d7c7, 0x58cfb2fb, 0x4940c3e8, 0xd05c23c5,
  149623. 0x74ad9107, 0x16e79e41, 0x064e7142, 0xa0a47f05, 0xfdfd614f,
  149624. 0xc6929cd4, 0x3946988b, 0xedb2584c, 0xe46f8fb1, 0x73e4b5f3,
  149625. 0x68ea94ba, 0x53b79aa1 },
  149626. { 0x44bbb6a1, 0x216fafce, 0x67821728, 0xd3a5bba0, 0xa9dd939a,
  149627. 0xef1e4b30, 0xf19efafe, 0x022eaf3d, 0x7b4ec014, 0xfed5abce,
  149628. 0x512c6738, 0x64968ee6, 0x29fe89a2, 0x23119869, 0x47397c05,
  149629. 0x0d539d8d, 0x234596c4, 0x6400bc54, 0x5346611d, 0xb9287f58,
  149630. 0xc9d5da0f, 0x04099903, 0xc83af2a8, 0xe5ef4997, 0x328151e1,
  149631. 0xc89dc01b, 0x58401104, 0x150fb4a9, 0xf3872c9d, 0x40a6f7d5,
  149632. 0x56c2e833, 0x8290d6d1 },
  149633. { 0xd8546946, 0xf84637c6, 0x69ec57fa, 0xda134a39, 0xd789007e,
  149634. 0xd42359a4, 0x0dc7b809, 0xb42557fe, 0x2d6784a9, 0xe62ae52d,
  149635. 0x0bcadb5f, 0xa2714ca6, 0x33aafca5, 0xcc208de6, 0xed967811,
  149636. 0x2380ed5c, 0xdb321660, 0x6e6b55e9, 0xa675235a, 0x1bead02c,
  149637. 0xb33fa0e1, 0x51cc6ef9, 0xf06a2a08, 0xfd223e26, 0xec47b3cf,
  149638. 0x00f332e1, 0xa0aa984e, 0x459f297b, 0xee952e14, 0x6fa1d969,
  149639. 0x304fabb0, 0x506ef1ab },
  149640. { 0x35bff163, 0x11b4eb27, 0xea9fa984, 0x7130b96f, 0x9deb27ce,
  149641. 0x66aceb3f, 0x9dd1c3d5, 0xa2daf1a5, 0xa73075aa, 0xf5090a7e,
  149642. 0xe3071b58, 0x36a6af39, 0xdf73ad9c, 0xa28d633d, 0xbdc89a16,
  149643. 0xdd354cac, 0xd4dcbc3c, 0xdfea3423, 0x379d92d1, 0x6eec74d2,
  149644. 0x8eed6765, 0xe14a456f, 0xfa8feb1f, 0xfabe7743, 0xb98fcbc7,
  149645. 0x1404ccf8, 0xf71a706e, 0x6ccd2fbf, 0x4d85c678, 0xdaaf3fdb,
  149646. 0x15200344, 0x415b7dbf },
  149647. { 0x7d8377a7, 0x97010586, 0xcb803272, 0x068a3d68, 0xf03a4c32,
  149648. 0xfd67d289, 0x93c8f290, 0x4bc7095d, 0xe9e5a2b8, 0x712fa13c,
  149649. 0x0feb9f3b, 0xfc6ac6c6, 0x6e0e54c2, 0x0cda36d9, 0x86320a01,
  149650. 0x45499751, 0x97f00f11, 0xf9318c91, 0xe6936508, 0x01dc4c3f,
  149651. 0x85f068aa, 0x769a2ef9, 0xa2b5511c, 0x3522cef0, 0xb4122e05,
  149652. 0x006965ed, 0xc175d43f, 0xfce0fafc, 0xec831d59, 0x525dc9bd,
  149653. 0xaf58879d, 0x1ec314f1 },
  149654. { 0x2c8310c2, 0x0663feef, 0x457e3f74, 0xaa7e14da, 0xe5346887,
  149655. 0x392b10fc, 0x637ec2c5, 0xcde4a38f, 0xb542f8df, 0x50773320,
  149656. 0xf7de1711, 0x341302f9, 0xae4b9bc6, 0x018b1c63, 0xdd2f9e6f,
  149657. 0xf001c46e, 0x26eccfa0, 0xd3bb0a97, 0x7746e0c7, 0xa931b99d,
  149658. 0xf5875aec, 0xe0c8b6f7, 0x96939c82, 0xbb32f17c, 0x3de5a664,
  149659. 0x765135d2, 0x52abfa6b, 0x71936cb4, 0x2dc105de, 0xad5cc08f,
  149660. 0x7fff5788, 0x17e91d12 },
  149661. { 0xb7e051ca, 0xbe92ced3, 0x19c776d4, 0xc644d4fd, 0x0086784b,
  149662. 0xc8ab4b52, 0xce9d6b31, 0x3ea66227, 0xd289e9c7, 0x395249a3,
  149663. 0xd12a19ee, 0x54509e65, 0x8c365aec, 0xa7bd4692, 0x77963e0e,
  149664. 0x354997e4, 0xb599732d, 0x0d765957, 0x91d4a3b6, 0x99584aeb,
  149665. 0x1deb3e28, 0x6e653ea4, 0x572571df, 0xca7c98ed, 0xb18ae1f9,
  149666. 0xf301a38f, 0x63f7b97e, 0x1629f7c2, 0xafc4a0d5, 0xdf242282,
  149667. 0x3ddd0c01, 0x118f3b4b },
  149668. { 0x7ad4762b, 0x74a0a0a8, 0x8c58d175, 0x1aef84da, 0x4cf76d86,
  149669. 0x16ff4960, 0x7e60d98b, 0xc0be8786, 0x3ecc1dba, 0x83637ffb,
  149670. 0x5dd6147a, 0xc244a609, 0x5b0846e5, 0xa3e17834, 0xe77a4c05,
  149671. 0x735eb686, 0xdf758695, 0x5bc18b4f, 0x1bdfe52f, 0x15618d0b,
  149672. 0x00715ba1, 0x878ecc0d, 0xc2dd617f, 0x1dbdbd1a, 0x21b61710,
  149673. 0x21d2b631, 0x44f593c2, 0x22ce8a79, 0x44f17024, 0x3b9b536a,
  149674. 0x8d03e727, 0x01d0a67c },
  149675. { 0x1e46533c, 0x7b964236, 0xfb88c2ae, 0xe9477990, 0xa42c4a18,
  149676. 0x019b5d16, 0xd83c7a45, 0x7135e81d, 0x4cb663e3, 0x74a69bdd,
  149677. 0xe76c0d63, 0x7b67ecdb, 0x11e68da6, 0x03d54521, 0xd2e8650a,
  149678. 0x596cceb5, 0x2af03b37, 0xcd572dfd, 0xfabd5952, 0x52364ba1,
  149679. 0xb4ed8569, 0x7f47d456, 0xc950d5d4, 0x5ad8b572, 0x486e2f84,
  149680. 0xcadd2dfa, 0xc56bb044, 0xdd527b43, 0x997c08e6, 0xc9adba24,
  149681. 0x7da6320f, 0x1b625b06 },
  149682. { 0x4fd8446d, 0x44dfaa7b, 0xaf6febeb, 0xc01b2f01, 0xfe8838b5,
  149683. 0xbf444388, 0xbba9758b, 0xf33c434f, 0x87156bc9, 0x2b971cba,
  149684. 0x1f49098b, 0x6b245e5c, 0x2b41c5dd, 0x87dcb534, 0x34d852d7,
  149685. 0xdb1f80c6, 0x2433da34, 0x6d6e3258, 0x3f7df0c2, 0xf6682065,
  149686. 0x360cb365, 0xc4ca567c, 0x9826656a, 0x321faac2, 0xbf069768,
  149687. 0x13f5ca6f, 0xa7076639, 0x15397921, 0x8400736e, 0xbdf14328,
  149688. 0x19fc948d, 0x333eca96 },
  149689. { 0xac775d81, 0x23337948, 0xd41dbbca, 0x38c2518f, 0xbcfce948,
  149690. 0x623c7a4f, 0x54703fe7, 0xaad36236, 0x13fb3b5b, 0x2b3a13a4,
  149691. 0x7f5c01f0, 0x5db3565a, 0x52359661, 0xd72408dc, 0x1d616e91,
  149692. 0x5a17f8e5, 0xcb25b999, 0x90c16eeb, 0x3393743e, 0xf35e8cf1,
  149693. 0xe54b64a7, 0x987da74a, 0x65cd449d, 0x557b322a, 0x37e7b15d,
  149694. 0x765082a5, 0xf2cd134f, 0x4d25c742, 0x4ccf0746, 0xae9d9c07,
  149695. 0x8728d135, 0x72fc2110 },
  149696. { 0xf96004c8, 0xa906b203, 0x458055ff, 0xd83f95cf, 0x55f35909,
  149697. 0xd77d5867, 0xe550c8ee, 0x4a9ea6fb, 0x55a06081, 0x91c8cca9,
  149698. 0xbce82062, 0x4a1fee78, 0x9a3df85e, 0xeb9ade06, 0x7d3de666,
  149699. 0xfbbdcf0c, 0x5d336d51, 0x228a391b, 0x5c2ffc3c, 0x760f8d28,
  149700. 0x2f7b165b, 0x1ee48de3, 0x56177040, 0x03803d84, 0x9deff9a0,
  149701. 0xe573f648, 0xa17e35a4, 0xe1a2738e, 0x8840a6c6, 0x238ef17c,
  149702. 0xb11ed92d, 0x480946f8 },
  149703. { 0xfd71f119, 0x84c747a8, 0x53eb3695, 0x19e65c5e, 0x6298587a,
  149704. 0x0e2f6786, 0xab18d6f4, 0x48a48899, 0xc630b8c0, 0xa1a99024,
  149705. 0x2caaf892, 0x84975096, 0xe20fd624, 0xc8869aba, 0x6c2b7dd4,
  149706. 0x3b72b04d, 0x0992f7d0, 0xe2775eb6, 0x7d06e684, 0x0089c06e,
  149707. 0xe4bbd007, 0xcb3b4361, 0x4ba846e4, 0xa1ae666b, 0x46464d9e,
  149708. 0xc01c2eb2, 0xc1f8539f, 0xf86f2be6, 0xcf68afc7, 0x16e8e8ae,
  149709. 0xc7386902, 0x8dab61fd },
  149710. { 0xd54d1d45, 0x42a5c903, 0xff4f9ba2, 0xacd4297e, 0x34d478b4,
  149711. 0x2d88b520, 0x08c4621a, 0x35b2ba2b, 0x34865402, 0xd3d239bb,
  149712. 0x911f32e6, 0x1de76aed, 0x3f06fdc2, 0x877f8bcf, 0x9ec51502,
  149713. 0x802714c1, 0xa590700d, 0xa10444eb, 0x31dcc957, 0x8694229f,
  149714. 0xb8169fed, 0x5ece77ab, 0x2caf080e, 0x55be8a15, 0xcbd7cef1,
  149715. 0x3eb21b14, 0x67b97ee1, 0x9def7ad1, 0x118f690c, 0xe03ca879,
  149716. 0xf99b29e7, 0x6f77e62d },
  149717. { 0xe40bbf59, 0xa271bded, 0x6401aad6, 0x177ba453, 0x73541cd1,
  149718. 0x1755e035, 0x4b71b02f, 0x3465b466, 0xa813359f, 0x22eb7113,
  149719. 0x6f38eac7, 0x9792a8fd, 0xff3bf3b5, 0x11aa012f, 0xf85c3fbf,
  149720. 0x99aafabf, 0x06c0cc42, 0x91e0a2ef, 0x773b7b3a, 0x314d5d57,
  149721. 0xd669840a, 0xae5e2e76, 0x2e5a8be6, 0x86136073, 0xc1cf5580,
  149722. 0xee6d7578, 0x68bed102, 0x2344e00f, 0x8184f0eb, 0x799d7886,
  149723. 0xc3d2cf80, 0x63819c91 },
  149724. { 0x7884b073, 0xca5392e1, 0xeb1267ea, 0x9ec3a1fc, 0x907038a7,
  149725. 0x3d07f5f0, 0xe4c47b70, 0xcb2ac07c, 0x1bf96b91, 0xf96664ee,
  149726. 0x2aea4fbf, 0xebf57589, 0xfade6500, 0x5aabf391, 0x171d1204,
  149727. 0xc5b3376f, 0xa0d3d81a, 0x1ff60c51, 0x976a844b, 0x10b2cfe7,
  149728. 0xbda6125a, 0xe131cc9a, 0x4ebd453e, 0xe0fc16d3, 0x504b6bc1,
  149729. 0xc0d0319a, 0x0a2f8cab, 0xe43a0be7, 0x55e49b47, 0xc80afeec,
  149730. 0x8265d7ee, 0x67d48d12 },
  149731. { 0xea2d56d6, 0x068d59a7, 0x27480a63, 0xd71abd0e, 0xae7366cd,
  149732. 0x6bd11db0, 0x07204ebc, 0xfbb639ca, 0xf77e6293, 0x89a242e7,
  149733. 0x75ba8c3d, 0xdee7ca2b, 0x64a2f9a8, 0x472ddc3d, 0x7561a010,
  149734. 0x84229df4, 0xc5b649d4, 0x95f62c85, 0x4dc927cd, 0xfdd56b1b,
  149735. 0x5ee60596, 0xfe8bb120, 0xabf29401, 0x3efcaa50, 0x10d1c184,
  149736. 0xd4900d0f, 0x28b01df5, 0x2cf113a9, 0x1f0e43f5, 0xa3d7ebc3,
  149737. 0xe8384dc7, 0x27950e38 },
  149738. { 0xe1d0fa79, 0xeab21ff0, 0x048b5de9, 0x4b9fd033, 0x2fe374cb,
  149739. 0x4c934689, 0x4eb21f6b, 0xbb4827fa, 0xa925e7e7, 0x46716f79,
  149740. 0x7dd4c531, 0x1442bf36, 0xd2e96ddf, 0x2073954c, 0x8502aa89,
  149741. 0x4e0141ae, 0x8eef6cc9, 0x8ee00e1a, 0x5880cdaf, 0x55ce8491,
  149742. 0x69628046, 0xff3aba5c, 0x5d15dfbf, 0x335cc4f8, 0x9f684f25,
  149743. 0xa7f0440c, 0xbb1e5bd8, 0xae80453f, 0xff2225ab, 0xa1c99813,
  149744. 0x79b25d71, 0x54ff7884 },
  149745. { 0xde40b068, 0x27c6ee30, 0xe6f3a51e, 0x9226465b, 0xfa3b21f6,
  149746. 0xe24a4604, 0xc0418115, 0x50a5a5ad, 0x8df90d2b, 0xe3285441,
  149747. 0xdcb0c00f, 0xbb74e58f, 0x4a2c08e3, 0xc68f1b3b, 0x0ccd9ec9,
  149748. 0x339df081, 0xb786ea9f, 0x915362dc, 0xc955aead, 0x28945e31,
  149749. 0x8b6a6c6b, 0xd6a2c01d, 0x3678a427, 0x069e82dc, 0x28c9302c,
  149750. 0x17875500, 0x9fa101e6, 0x8acda965, 0xee30b286, 0x4e4e4573,
  149751. 0x3f1830fe, 0x8adbad85 },
  149752. { 0x0969d524, 0x060ae11f, 0xf39bcc79, 0xf42fdaf7, 0x7cc1fcc2,
  149753. 0x3cec6766, 0xe2336d4f, 0x456b9cf2, 0x8e1c0f7f, 0x6aa1f5de,
  149754. 0x0984fb0e, 0xcdbc2ad2, 0x1b464b28, 0x4090cfa6, 0x1243f3ef,
  149755. 0x40d86f30, 0xcd5e87e7, 0x95b16ccc, 0x3026cd41, 0x403f168c,
  149756. 0x816c0730, 0xdbe386cb, 0x58407a1d, 0x14eb86f3, 0x1717e1af,
  149757. 0xf588b4f8, 0x66cbc96c, 0xb75c41a6, 0x027e71c1, 0xf342c1aa,
  149758. 0xc0945e5f, 0x73930036 },
  149759. { 0x22cdaf42, 0x954f757d, 0xf4181aab, 0x788b591d, 0xf5514f25,
  149760. 0x8b986819, 0xf18fd5bc, 0x69642e08, 0x022ceb91, 0x92b305d1,
  149761. 0x6a4f6985, 0x1715903e, 0x61179cae, 0x4bd7d69d, 0xd29c01aa,
  149762. 0xdacdfd5d, 0xd91108cc, 0x705ddd5a, 0x64ac8f15, 0x434ac7b1,
  149763. 0xb524632f, 0x61a514e1, 0x731fc447, 0x45b9e61b, 0xe0961b31,
  149764. 0xcf561348, 0x73eaf223, 0x9c28a967, 0xaa7c99d3, 0x5bd10182,
  149765. 0xe42965e2, 0x8bc6ec4a },
  149766. { 0xe7f2a32b, 0xd096e5c0, 0x09388a30, 0xff54800c, 0x401e360c,
  149767. 0x06fe437c, 0xbb6054a6, 0x6655fc9c, 0x8457aa6e, 0x510e1860,
  149768. 0x2b29b2b7, 0xa0acfca2, 0x51b7da61, 0x732483e3, 0x6be6c8ca,
  149769. 0xe31471ee, 0x8b65c9a1, 0xe565431c, 0x48d65cbb, 0xfc9ac3b9,
  149770. 0xae9b2aa8, 0xd308fc21, 0xaa60aa6a, 0xd6a7df0d, 0x982fc0d4,
  149771. 0x2844d96a, 0x5847a4d7, 0xab012c2c, 0xdceb8955, 0x2b3c8f71,
  149772. 0xbe9c7e15, 0x8e85437d },
  149773. };
  149774. /* Perform the modular exponentiation in Fp* for SAKKE.
  149775. *
  149776. * Base is fixed to be the g parameter - a precomputed table is used.
  149777. *
  149778. * Striping: 128 points at a distance of 8 combined.
  149779. * Total of 256 points in table.
  149780. * Square and multiply performed in Fp*.
  149781. *
  149782. * base [in] Base. MP integer.
  149783. * exp [in] Exponent. MP integer.
  149784. * res [out] Result. MP integer.
  149785. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  149786. * and MEMORY_E if memory allocation fails.
  149787. */
  149788. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  149789. {
  149790. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  149791. !defined(WOLFSSL_SP_NO_MALLOC)
  149792. sp_digit* td;
  149793. sp_digit* t;
  149794. sp_digit* tx;
  149795. sp_digit* ty;
  149796. #else
  149797. sp_digit t[4 * 2 * 32];
  149798. sp_digit tx[2 * 32];
  149799. sp_digit ty[2 * 32];
  149800. #endif
  149801. sp_digit* r = NULL;
  149802. unsigned char e[128];
  149803. int err = MP_OKAY;
  149804. int i;
  149805. int y;
  149806. (void)base;
  149807. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  149808. !defined(WOLFSSL_SP_NO_MALLOC)
  149809. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 32 * 2, NULL,
  149810. DYNAMIC_TYPE_TMP_BUFFER);
  149811. if (td == NULL) {
  149812. err = MEMORY_E;
  149813. }
  149814. #endif
  149815. if (err == MP_OKAY) {
  149816. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  149817. !defined(WOLFSSL_SP_NO_MALLOC)
  149818. t = td;
  149819. tx = td + 4 * 32 * 2;
  149820. ty = td + 5 * 32 * 2;
  149821. #endif
  149822. r = ty;
  149823. (void)mp_to_unsigned_bin_len(exp, e, 128);
  149824. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  149825. y = e[112] >> 7;
  149826. y |= (e[96] >> 7) << 1;
  149827. y |= (e[80] >> 7) << 2;
  149828. y |= (e[64] >> 7) << 3;
  149829. y |= (e[48] >> 7) << 4;
  149830. y |= (e[32] >> 7) << 5;
  149831. y |= (e[16] >> 7) << 6;
  149832. y |= (e[0] >> 7) << 7;
  149833. XMEMCPY(ty, sp_1024_g_table[y], sizeof(sp_digit) * 32);
  149834. for (i = 126; i >= 0; i--) {
  149835. y = (e[127 - (i / 8)] >> (i & 0x7)) & 1;
  149836. y |= ((e[111 - (i / 8)] >> (i & 0x7)) & 1) << 1;
  149837. y |= ((e[95 - (i / 8)] >> (i & 0x7)) & 1) << 2;
  149838. y |= ((e[79 - (i / 8)] >> (i & 0x7)) & 1) << 3;
  149839. y |= ((e[63 - (i / 8)] >> (i & 0x7)) & 1) << 4;
  149840. y |= ((e[47 - (i / 8)] >> (i & 0x7)) & 1) << 5;
  149841. y |= ((e[31 - (i / 8)] >> (i & 0x7)) & 1) << 6;
  149842. y |= ((e[15 - (i / 8)] >> (i & 0x7)) & 1) << 7;
  149843. sp_1024_proj_sqr_32(tx, ty, t);
  149844. sp_1024_proj_mul_qx1_32(tx, ty, sp_1024_g_table[y], t);
  149845. }
  149846. }
  149847. if (err == MP_OKAY) {
  149848. sp_1024_mont_inv_32(tx, tx, t);
  149849. sp_1024_mont_mul_32(r, tx, ty, p1024_mod, p1024_mp_mod);
  149850. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  149851. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  149852. err = sp_1024_to_mp(r, res);
  149853. }
  149854. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  149855. !defined(WOLFSSL_SP_NO_MALLOC)
  149856. if (td != NULL) {
  149857. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  149858. }
  149859. #endif
  149860. return err;
  149861. }
  149862. #endif /* WOLFSSL_SP_SMALL */
  149863. /* Multiply p* by q* in projective co-ordinates.
  149864. *
  149865. * p.x' = (p.x * q.x) - (p.y * q.y)
  149866. * p.y' = (p.x * q.y) + (p.y * q.x)
  149867. * But applying Karatsuba:
  149868. * v0 = p.x * q.x
  149869. * v1 = p.y * q.y
  149870. * p.x' = v0 - v1
  149871. * p.y' = (px + py) * (qx + qy) - v0 - v1
  149872. *
  149873. * px [in,out] A single precision integer - X ordinate of number to multiply.
  149874. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  149875. * qx [in] A single precision integer - X ordinate of number of
  149876. * multiplier.
  149877. * qy [in] A single precision integer - Y ordinate of number of
  149878. * multiplier.
  149879. * t [in] Two single precision integers - temps.
  149880. */
  149881. static void sp_1024_proj_mul_32(sp_digit* px, sp_digit* py,
  149882. const sp_digit* qx, const sp_digit* qy, sp_digit* t)
  149883. {
  149884. sp_digit* t1 = t;
  149885. sp_digit* t2 = t + 2 * 32;
  149886. /* t1 = px + py */
  149887. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  149888. /* t2 = qx + qy */
  149889. sp_1024_mont_add_32(t2, qx, qy, p1024_mod);
  149890. /* t2 = (px + py) * (qx + qy) */
  149891. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  149892. /* t1 = py * qy */
  149893. sp_1024_mont_mul_32(t1, py, qy, p1024_mod, p1024_mp_mod);
  149894. /* t2 = (px + py) * (qx + qy) - (py * qy) */
  149895. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  149896. /* px = px * qx */
  149897. sp_1024_mont_mul_32(px, px, qx, p1024_mod, p1024_mp_mod);
  149898. /* py = (px + py) * (qx + qy) - (py * qy) - (px * qx) */
  149899. sp_1024_mont_sub_32(py, t2, px, p1024_mod);
  149900. /* px = (px * qx) - (py * qy)*/
  149901. sp_1024_mont_sub_32(px, px, t1, p1024_mod);
  149902. }
  149903. #ifndef WOLFSSL_SP_SMALL
  149904. /*
  149905. * Convert point from projective to affine but keep in Montgomery form.
  149906. *
  149907. * p [in,out] Point to convert.
  149908. * t [in] Temporary numbers: 2.
  149909. */
  149910. static void sp_1024_mont_map_32(sp_point_1024* p, sp_digit* t)
  149911. {
  149912. sp_digit* t1 = t;
  149913. sp_digit* t2 = t + 2 * 32;
  149914. sp_1024_mont_inv_32(t1, p->z, t2);
  149915. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  149916. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  149917. sp_1024_mont_mul_32(p->x, p->x, t2, p1024_mod, p1024_mp_mod);
  149918. sp_1024_mont_mul_32(p->y, p->y, t1, p1024_mod, p1024_mp_mod);
  149919. XMEMCPY(p->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  149920. }
  149921. #endif /* WOLFSSL_SP_SMALL */
  149922. /*
  149923. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  149924. * double P.
  149925. *
  149926. * Calculations:
  149927. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  149928. * r.x = l * (p.x + q.x * p.z^2) - 2 * p.y^2
  149929. * r.y = 2 * p.y * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  149930. * v* = v*^2 * r*
  149931. * p'.x = l^2 - 8 * p.y^2 * p.x
  149932. * p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4
  149933. * p'.z = 2 * p.y * p.z
  149934. *
  149935. * @param [in,out] vx X-ordinate of projective value in F*.
  149936. * @param [in,out] vy Y-ordinate of projective value in F*.
  149937. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  149938. * @param [in] q ECC point - second point on E(F_P^2).
  149939. * @param [in] t SP temporaries (6 used).
  149940. */
  149941. static void sp_1024_accumulate_line_dbl_32(sp_digit* vx, sp_digit* vy,
  149942. sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  149943. {
  149944. sp_digit* t1 = t + 0 * 32;
  149945. sp_digit* pz2 = t + 2 * 32;
  149946. sp_digit* rx = t + 4 * 32;
  149947. sp_digit* ry = t + 6 * 32;
  149948. sp_digit* l = t + 8 * 32;
  149949. sp_digit* ty = t + 10 * 32;
  149950. /* v = v^2 */
  149951. sp_1024_proj_sqr_32(vx, vy, t);
  149952. /* pz2 = p.z^2 */
  149953. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  149954. /* t1 = p.x + p.z^2 */
  149955. sp_1024_mont_add_32(ty, p->x, pz2, p1024_mod);
  149956. /* l = p.x - p.z^2 */
  149957. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  149958. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  149959. sp_1024_mont_mul_32(t1, l, ty, p1024_mod, p1024_mp_mod);
  149960. /* l = 3 * (p.x^2 - p.z^4) */
  149961. sp_1024_mont_tpl_32(l, t1, p1024_mod);
  149962. /* t1 = q.x * p.z^2 */
  149963. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  149964. /* t1 = p.x + q.x * p.z^2 */
  149965. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  149966. /* r.x = l * (p.x + q.x * p.z^2) */
  149967. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  149968. /* r.y = 2 * p.y */
  149969. sp_1024_mont_dbl_32(ry, p->y, p1024_mod);
  149970. /* ty = 4 * p.y ^ 2 */
  149971. sp_1024_mont_sqr_32(ty, ry, p1024_mod, p1024_mp_mod);
  149972. /* t1 = 2 * p.y ^ 2 */
  149973. sp_1024_div2_32(t1, ty, p1024_mod);
  149974. /* r.x -= 2 * (p.y ^ 2) */
  149975. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  149976. /* p'.z = p.y * 2 * p.z */
  149977. sp_1024_mont_mul_32(p->z, p->z, ry, p1024_mod, p1024_mp_mod);
  149978. /* r.y = p'.z * p.z^2 */
  149979. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  149980. /* r.y = p'.z * p.z^2 * q.y */
  149981. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  149982. /* v = v^2 * r */
  149983. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  149984. /* Double point using previously calculated values
  149985. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  149986. * ty = 4 * p.y^2
  149987. * p'.z = 2 * p.y * p.z
  149988. */
  149989. /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */
  149990. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  149991. /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */
  149992. sp_1024_div2_32(t1, t1, p1024_mod);
  149993. /* p'.y = 4 * p.y^2 * p.x */
  149994. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  149995. /* p'.x = l^2 */
  149996. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  149997. /* p'.x = l^2 - 4 * p.y^2 * p.x */
  149998. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  149999. /* p'.x = l^2 - 8 * p.y^2 * p.x */
  150000. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  150001. /* p'.y = 4 * p.y^2 * p.x - p.x' */
  150002. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  150003. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l */
  150004. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  150005. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4 */
  150006. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  150007. }
  150008. #ifdef WOLFSSL_SP_SMALL
  150009. /*
  150010. * Calculate gradient of line through C, P and -C-P, accumulate line and
  150011. * add P to C.
  150012. *
  150013. * Calculations:
  150014. * r.x = (q.x + p.x) * c.y - (q.x * c.z^2 + c.x) * p.y * c.z
  150015. * r.y = (c.x - p.x * c.z^2) * q.y * c.z
  150016. * v* = v* * r*
  150017. * r = p.y * c.z^3 - c.y
  150018. * c'.x = r^2 + h^3 - 2 * c.x * h^2
  150019. * c'.y = r * (c'.x - c.x * h^2) - c.y * h^3
  150020. * c'.z = (c.x - p.x * c.z^2) * c.z
  150021. *
  150022. * @param [in,out] vx X-ordinate of projective value in F*.
  150023. * @param [in,out] vy Y-ordinate of projective value in F*.
  150024. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  150025. * to.
  150026. * @param [in] p ECC point - point on E(F_p^2) to add.
  150027. * @param [in] q ECC point - second point on E(F_P^2).
  150028. * @param [in] qx_px SP that is a constant value across adds.
  150029. * @param [in] t SP temporaries (6 used).
  150030. */
  150031. static void sp_1024_accumulate_line_add_one_32(sp_digit* vx, sp_digit* vy,
  150032. sp_point_1024* c, sp_point_1024* p, sp_point_1024* q, sp_digit* qx_px,
  150033. sp_digit* t)
  150034. {
  150035. sp_digit* t1 = t;
  150036. sp_digit* t2 = t + 2 * 32;
  150037. sp_digit* rx = t + 4 * 32;
  150038. sp_digit* ry = t + 6 * 32;
  150039. sp_digit* h = t + 8 * 32;
  150040. sp_digit* r = t + 10 * 32;
  150041. /* r.x = (q.x + p.x) * c.y */
  150042. sp_1024_mont_mul_32(rx, qx_px, c->y, p1024_mod, p1024_mp_mod);
  150043. /* t2 = c.z^2 */
  150044. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  150045. /* t1 = q.x * c.z^2 */
  150046. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  150047. /* t1 = q.x * c.z^2 + c.x */
  150048. sp_1024_mont_add_32(h, t1, c->x, p1024_mod);
  150049. /* r = p.y * c.z */
  150050. sp_1024_mont_mul_32(ry, p->y, c->z, p1024_mod, p1024_mp_mod);
  150051. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  150052. sp_1024_mont_mul_32(t1, h, ry, p1024_mod, p1024_mp_mod);
  150053. /* r = p.y * c.z * c.z^2 = p.y * c.z^3 */
  150054. sp_1024_mont_mul_32(r, ry, t2, p1024_mod, p1024_mp_mod);
  150055. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  150056. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  150057. /* t1 = p.x * c.z^2 */
  150058. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  150059. /* h = c.x - p.x * c.z^2 */
  150060. sp_1024_mont_sub_32(h, c->x, t1, p1024_mod);
  150061. /* c'.z = (c.x - p.x * c.z^2) * c.z */
  150062. sp_1024_mont_mul_32(c->z, h, c->z, p1024_mod, p1024_mp_mod);
  150063. /* r.y = (c.x - p.x * c.z^2) * c.z * q.y */
  150064. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  150065. /* v = v * r */
  150066. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  150067. /* Add p to c using previously calculated values.
  150068. * h = c.x - p.x * c.z^2
  150069. * r = p.y * c.z^3
  150070. * c'.z = (c.x - p.x * c.z^2) * c.z
  150071. */
  150072. /* r = p.y * c.z^3 - c.y */
  150073. sp_1024_mont_sub_32(r, r, c->y, p1024_mod);
  150074. /* t1 = r^2 */
  150075. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  150076. /* t2 = h^2 */
  150077. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  150078. /* ry = c.x * h^2 */
  150079. sp_1024_mont_mul_32(ry, c->x, rx, p1024_mod, p1024_mp_mod);
  150080. /* t2 = h^3 */
  150081. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  150082. /* c->x = r^2 + h^3 */
  150083. sp_1024_mont_add_32(c->x, t1, t2, p1024_mod);
  150084. /* t1 = 2 * c.x * h^2 */
  150085. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  150086. /* c'.x = r^2 + h^3 - 2 * c.x * h^2 */
  150087. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  150088. /* ry = c'.x - c.x * h^2 */
  150089. sp_1024_mont_sub_32(t1, c->x, ry, p1024_mod);
  150090. /* ry = r * (c'.x - c.x * h^2) */
  150091. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  150092. /* t2 = c.y * h^3 */
  150093. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  150094. /* c'.y = r * (c'.x - c.x * h^2) - c.y * h^3 */
  150095. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  150096. }
  150097. /*
  150098. * Calculate r = pairing <P, Q>.
  150099. *
  150100. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  150101. *
  150102. * @param [in] key SAKKE key.
  150103. * @param [in] p First point on E(F_p)[q].
  150104. * @param [in] q Second point on E(F_p)[q].
  150105. * @param [in] r Result of calculation.
  150106. * @return 0 on success.
  150107. * @return MEMORY_E when dynamic memory allocation fails.
  150108. * @return Other -ve value on internal failure.
  150109. */
  150110. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  150111. {
  150112. int err = MP_OKAY;
  150113. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150114. !defined(WOLFSSL_SP_NO_MALLOC)
  150115. sp_digit* td = NULL;
  150116. sp_digit* t;
  150117. sp_digit* vx;
  150118. sp_digit* vy;
  150119. sp_digit* qx_px;
  150120. #else
  150121. sp_digit t[6 * 2 * 32];
  150122. sp_digit vx[2 * 32];
  150123. sp_digit vy[2 * 32];
  150124. sp_digit qx_px[2 * 32];
  150125. sp_point_1024 pd;
  150126. sp_point_1024 qd;
  150127. sp_point_1024 cd;
  150128. #endif
  150129. sp_point_1024* p = NULL;
  150130. sp_point_1024* q = NULL;
  150131. sp_point_1024* c = NULL;
  150132. sp_digit* r = NULL;
  150133. int i;
  150134. err = sp_1024_point_new_32(NULL, pd, p);
  150135. if (err == MP_OKAY) {
  150136. err = sp_1024_point_new_32(NULL, qd, q);
  150137. }
  150138. if (err == MP_OKAY) {
  150139. err = sp_1024_point_new_32(NULL, cd, c);
  150140. }
  150141. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150142. !defined(WOLFSSL_SP_NO_MALLOC)
  150143. if (err == MP_OKAY) {
  150144. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 9 * 32 * 2, NULL,
  150145. DYNAMIC_TYPE_TMP_BUFFER);
  150146. if (td == NULL) {
  150147. err = MEMORY_E;
  150148. }
  150149. }
  150150. #endif
  150151. if (err == MP_OKAY) {
  150152. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150153. !defined(WOLFSSL_SP_NO_MALLOC)
  150154. t = td;
  150155. vx = td + 6 * 32 * 2;
  150156. vy = td + 7 * 32 * 2;
  150157. qx_px = td + 8 * 32 * 2;
  150158. #endif
  150159. r = vy;
  150160. sp_1024_point_from_ecc_point_32(p, pm);
  150161. sp_1024_point_from_ecc_point_32(q, qm);
  150162. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  150163. }
  150164. if (err == MP_OKAY) {
  150165. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  150166. }
  150167. if (err == MP_OKAY) {
  150168. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  150169. }
  150170. if (err == MP_OKAY) {
  150171. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  150172. }
  150173. if (err == MP_OKAY) {
  150174. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  150175. }
  150176. if (err == MP_OKAY) {
  150177. XMEMCPY(c, p, sizeof(sp_point_1024));
  150178. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  150179. vx[0] = 1;
  150180. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  150181. sp_1024_mont_add_32(qx_px, q->x, p->x, p1024_mod);
  150182. for (i = 1020; i >= 0; i--) {
  150183. /* Accumulate line into v and double point. */
  150184. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  150185. if ((i > 0) && ((p1024_order[i / 32] >> (i % 32)) & 1)) {
  150186. /* Accumulate line into v and add P into C. */
  150187. sp_1024_accumulate_line_add_one_32(vx, vy, c, p, q, qx_px, t);
  150188. }
  150189. }
  150190. /* Final exponentiation */
  150191. sp_1024_proj_sqr_32(vx, vy, t);
  150192. sp_1024_proj_sqr_32(vx, vy, t);
  150193. /* Convert from PF_p[q] to F_p */
  150194. sp_1024_mont_inv_32(vx, vx, t);
  150195. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  150196. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  150197. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  150198. err = sp_1024_to_mp(r, res);
  150199. }
  150200. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150201. !defined(WOLFSSL_SP_NO_MALLOC)
  150202. if (td != NULL) {
  150203. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  150204. }
  150205. #endif
  150206. sp_1024_point_free_32(c, 1, NULL);
  150207. sp_1024_point_free_32(q, 1, NULL);
  150208. sp_1024_point_free_32(p, 1, NULL);
  150209. return err;
  150210. }
  150211. #else
  150212. /*
  150213. * Calculate gradient of line through C, P and -C-P, accumulate line and
  150214. * add P to C.
  150215. *
  150216. * Both C and P have z ordinates to use in the calculation.
  150217. *
  150218. * Calculations:
  150219. * r.x = (q.x * c.z^2 + c.x) * p.y * c.z - (q.x * p.z^2 + p.x) * c.y * p.z
  150220. * r.y = (p.x * c.z^2 - c.x * p.z^2) * q.y * p.z * c.z
  150221. * v* = v* * r*
  150222. * h = p.x * c.z^2 - c.x * p.z^2
  150223. * r = p.y * c.z^3 - c.y * p.z^3
  150224. * c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2
  150225. * c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3
  150226. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  150227. *
  150228. * @param [in,out] vx X-ordinate of projective value in F*.
  150229. * @param [in,out] vy Y-ordinate of projective value in F*.
  150230. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  150231. * to.
  150232. * @param [in,out] p ECC point - point on E(F_p^2) to add.
  150233. * @param [in,out] q ECC point - second point on E(F_P^2).
  150234. * @param [in,out] t SP temporaries (6 used).
  150235. * @param [in,out] neg Indicates to use negative P.
  150236. * @return 0 on success.
  150237. * @return MEMORY_E when dynamic memory allocation fails.
  150238. * @return Other -ve value on internal failure.
  150239. */
  150240. static void sp_1024_accumulate_line_add_n_32(sp_digit* vx, sp_digit* vy,
  150241. const sp_point_1024* p, const sp_point_1024* q,
  150242. sp_point_1024* c, sp_digit* t, int neg)
  150243. {
  150244. sp_digit* t1 = t;
  150245. sp_digit* t2 = t + 2 * 32;
  150246. sp_digit* rx = t + 4 * 32;
  150247. sp_digit* ry = t + 6 * 32;
  150248. sp_digit* h = t + 8 * 32;
  150249. sp_digit* r = t + 10 * 32;
  150250. /* h = p.z^2 */
  150251. sp_1024_mont_sqr_32(h, p->z, p1024_mod, p1024_mp_mod);
  150252. /* rx = q.x * p.z^2 */
  150253. sp_1024_mont_mul_32(rx, q->x, h, p1024_mod, p1024_mp_mod);
  150254. /* rx = q.x * p.z^2 + p.x */
  150255. sp_1024_mont_add_32(t2, rx, p->x, p1024_mod);
  150256. /* c.y = c.y * p.z */
  150257. sp_1024_mont_mul_32(t1, c->y, p->z, p1024_mod, p1024_mp_mod);
  150258. /* r.x = (q.x * p.z^2 + p.x) * c.y * p.z */
  150259. sp_1024_mont_mul_32(rx, t2, t1, p1024_mod, p1024_mp_mod);
  150260. /* c.y = c.y * p.z^3 */
  150261. sp_1024_mont_mul_32(c->y, t1, h, p1024_mod, p1024_mp_mod);
  150262. /* t2 = c.z^2 */
  150263. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  150264. /* t1 = q.x * c.z^2 */
  150265. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  150266. /* t1 = q.x * c.z^2 + c.x */
  150267. sp_1024_mont_add_32(t1, t1, c->x, p1024_mod);
  150268. /* c.x = c.x * p.z^2 */
  150269. sp_1024_mont_mul_32(c->x, c->x, h, p1024_mod, p1024_mp_mod);
  150270. /* r = p.y * c.z */
  150271. sp_1024_mont_mul_32(r, p->y, c->z, p1024_mod, p1024_mp_mod);
  150272. if (neg) {
  150273. /* r = -p.y * c.z */
  150274. sp_1024_mont_sub_32(r, p1024_mod, r, p1024_mod);
  150275. }
  150276. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  150277. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  150278. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  150279. sp_1024_mont_sub_32(rx, ry, rx, p1024_mod);
  150280. /* t1 = p.x * c.z^2 */
  150281. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  150282. /* h = p.x * c.z^2 - c.x * p.z^2 */
  150283. sp_1024_mont_sub_32(h, t1, c->x, p1024_mod);
  150284. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z */
  150285. sp_1024_mont_mul_32(t1, h, c->z, p1024_mod, p1024_mp_mod);
  150286. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z */
  150287. sp_1024_mont_mul_32(c->z, t1, p->z, p1024_mod, p1024_mp_mod);
  150288. /* r.y = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z * q.y */
  150289. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  150290. /* r = p.y * c.z^3 */
  150291. sp_1024_mont_mul_32(t1, r, t2, p1024_mod, p1024_mp_mod);
  150292. /* r = p.y * c.z^3 - c.y * p.z^3 */
  150293. sp_1024_mont_sub_32(r, t1, c->y, p1024_mod);
  150294. /* v = v * r */
  150295. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  150296. /* Add p to c using previously calculated values.
  150297. * h = p.x * c.z^2 - c.x * p.z^2
  150298. * r = p.y * c.z^3 - c.y * p.z^3
  150299. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  150300. */
  150301. /* t1 = r^2 */
  150302. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  150303. /* t2 = h^2 */
  150304. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  150305. /* ry = c.x * p.z^2 * h^2 */
  150306. sp_1024_mont_mul_32(ry, rx, c->x, p1024_mod, p1024_mp_mod);
  150307. /* t2 = h^3 */
  150308. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  150309. /* c'.x = r^2 - h^3 */
  150310. sp_1024_mont_sub_32(c->x, t1, t2, p1024_mod);
  150311. /* t1 = 2 * c.x * p.z^2 * h^2 */
  150312. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  150313. /* c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2 */
  150314. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  150315. /* ry = c.x * p.z^2 * h^2 - c'.x */
  150316. sp_1024_mont_sub_32(t1, ry, c->x, p1024_mod);
  150317. /* ry = r * (c.x * p.z^2 * h^2 - c'.x) */
  150318. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  150319. /* t2 = c.y * p.z^3 * h^3 */
  150320. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  150321. /* c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3 */
  150322. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  150323. }
  150324. /*
  150325. * Perform n accumulate doubles and doubles of P.
  150326. *
  150327. * py = 2 * p.y
  150328. *
  150329. * For each double:
  150330. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  150331. * double P.
  150332. *
  150333. * Calculations:
  150334. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  150335. * r.x = l * (p.x + q.x * p.z^2) - py^2 / 2
  150336. * r.y = py * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  150337. * v* = v*^2 * r*
  150338. * p'.x = l^2 - 2 * py^2 * p.x
  150339. * py' = (py^2 * p.x - p'.x) * l - py^4 (= 2 * p'.y)
  150340. * p'.z = py * p.z
  150341. *
  150342. * Finally:
  150343. * p'.y = py' / 2
  150344. *
  150345. * @param [in,out] vx X-ordinate of projective value in F*.
  150346. * @param [in,out] vy Y-ordinate of projective value in F*.
  150347. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  150348. * @param [in] q ECC point - second point on E(F_P^2).
  150349. * @param [in] n Number of times to double.
  150350. * @param [in] t SP temporaries (6 used).
  150351. */
  150352. static void sp_1024_accumulate_line_dbl_n_32(sp_digit* vx, sp_digit* vy,
  150353. sp_point_1024* p, const sp_point_1024* q, int n, sp_digit* t)
  150354. {
  150355. sp_digit* t1 = t + 0 * 32;
  150356. sp_digit* pz2 = t + 2 * 32;
  150357. sp_digit* rx = t + 4 * 32;
  150358. sp_digit* ry = t + 6 * 32;
  150359. sp_digit* l = t + 8 * 32;
  150360. sp_digit* ty = t + 10 * 32;
  150361. int i;
  150362. /* py = 2 * p.y */
  150363. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  150364. for (i = 0; i < n; i++) {
  150365. /* v = v^2 */
  150366. sp_1024_proj_sqr_32(vx, vy, t);
  150367. /* pz2 = p.z^2 */
  150368. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  150369. /* t1 = p.x + p.z^2 */
  150370. sp_1024_mont_add_32(t1, p->x, pz2, p1024_mod);
  150371. /* l = p.x - p.z^2 */
  150372. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  150373. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  150374. sp_1024_mont_mul_32(ty, l, t1, p1024_mod, p1024_mp_mod);
  150375. /* l = 3 * (p.x^2 - p.z^4) */
  150376. sp_1024_mont_tpl_32(l, ty, p1024_mod);
  150377. /* t1 = q.x * p.z^2 */
  150378. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  150379. /* t1 = p.x + q.x * p.z^2 */
  150380. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  150381. /* r.x = l * (p.x + q.x * p.z^2) */
  150382. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  150383. /* ty = py ^ 2 */
  150384. sp_1024_mont_sqr_32(ty, p->y, p1024_mod, p1024_mp_mod);
  150385. /* t1 = py ^ 2 / 2 */
  150386. sp_1024_div2_32(t1, ty, p1024_mod);
  150387. /* r.x -= py ^ 2 / 2 */
  150388. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  150389. /* p'.z = py * pz */
  150390. sp_1024_mont_mul_32(p->z, p->z, p->y, p1024_mod, p1024_mp_mod);
  150391. /* r.y = p'.z * p.z^2 */
  150392. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  150393. /* r.y = p'.z * p.z^2 * q.y */
  150394. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  150395. /* v = v^2 * r */
  150396. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  150397. /* Double point using previously calculated values
  150398. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  150399. * ty = py^2
  150400. * p'.z = py * p.z
  150401. */
  150402. /* t1 = py^2 ^ 2 = py^4 */
  150403. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  150404. /* py' = py^2 * p. x */
  150405. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  150406. /* p'.x = l^2 */
  150407. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  150408. /* p'.x = l^2 - py^2 * p.x */
  150409. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  150410. /* p'.x = l^2 - 2 * p.y^2 * p.x */
  150411. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  150412. /* py' = py^2 * p.x - p.x' */
  150413. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  150414. /* py' = (p.y^2 * p.x - p'.x) * l */
  150415. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  150416. /* py' = (p.y^2 * p.x - p'.x) * l * 2 */
  150417. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  150418. /* py' = (p.y^2 * p.x - p'.x) * l * 2 - p.y^4 */
  150419. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  150420. }
  150421. /* p'.y = py' / 2 */
  150422. sp_1024_div2_32(p->y, p->y, p1024_mod);
  150423. }
  150424. /* Operations to perform based on order - 1.
  150425. * Sliding window. Start at bottom and stop when bottom bit is one.
  150426. * Subtract if top bit in window is one.
  150427. * Width of 6 bits.
  150428. * Pairs: #dbls, add/subtract window value
  150429. */
  150430. static const signed char sp_1024_order_op[] = {
  150431. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  150432. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  150433. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  150434. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  150435. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  150436. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  150437. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  150438. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  150439. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  150440. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  150441. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  150442. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  150443. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  150444. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  150445. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  150446. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  150447. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  150448. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  150449. -3, 1,
  150450. };
  150451. /*
  150452. * Calculate r = pairing <P, Q>.
  150453. *
  150454. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  150455. *
  150456. * Sliding window. Start at bottom and stop when bottom bit is one.
  150457. * Subtract if top bit in window is one.
  150458. * Width of 6 bits.
  150459. *
  150460. * @param [in] pm First point on E(F_p)[q].
  150461. * @param [in] qm Second point on E(F_p)[q].
  150462. * @param [in] res Result of calculation.
  150463. * @return 0 on success.
  150464. * @return MEMORY_E when dynamic memory allocation fails.
  150465. */
  150466. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  150467. {
  150468. int err;
  150469. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150470. !defined(WOLFSSL_SP_NO_MALLOC)
  150471. sp_digit* td = NULL;
  150472. sp_digit* t;
  150473. sp_digit* vx;
  150474. sp_digit* vy;
  150475. sp_digit (*pre_vx)[64];
  150476. sp_digit (*pre_vy)[64];
  150477. sp_digit (*pre_nvy)[64];
  150478. sp_point_1024* pre_p;
  150479. #else
  150480. sp_digit t[6 * 2 * 32];
  150481. sp_digit vx[2 * 32];
  150482. sp_digit vy[2 * 32];
  150483. sp_digit pre_vx[16][64];
  150484. sp_digit pre_vy[16][64];
  150485. sp_digit pre_nvy[16][64];
  150486. sp_point_1024 pre_p[16];
  150487. sp_point_1024 pd;
  150488. sp_point_1024 qd;
  150489. sp_point_1024 cd;
  150490. #endif
  150491. sp_point_1024* p = NULL;
  150492. sp_point_1024* q = NULL;
  150493. sp_point_1024* c = NULL;
  150494. sp_digit* r = NULL;
  150495. int i;
  150496. int j;
  150497. err = sp_1024_point_new_32(NULL, pd, p);
  150498. if (err == MP_OKAY) {
  150499. err = sp_1024_point_new_32(NULL, qd, q);
  150500. }
  150501. if (err == MP_OKAY) {
  150502. err = sp_1024_point_new_32(NULL, cd, c);
  150503. }
  150504. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150505. !defined(WOLFSSL_SP_NO_MALLOC)
  150506. if (err == MP_OKAY) {
  150507. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 56 * 32 * 2 + 16 * sizeof(sp_point_1024), NULL,
  150508. DYNAMIC_TYPE_TMP_BUFFER);
  150509. if (td == NULL) {
  150510. err = MEMORY_E;
  150511. }
  150512. }
  150513. #endif
  150514. if (err == MP_OKAY) {
  150515. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150516. !defined(WOLFSSL_SP_NO_MALLOC)
  150517. t = td;
  150518. vx = td + 6 * 32 * 2;
  150519. vy = td + 7 * 32 * 2;
  150520. pre_vx = (sp_digit(*)[64])(td + 8 * 32 * 2);
  150521. pre_vy = (sp_digit(*)[64])(td + 24 * 32 * 2);
  150522. pre_nvy = (sp_digit(*)[64])(td + 40 * 32 * 2);
  150523. pre_p = (sp_point_1024*)(td + 56 * 32 * 2);
  150524. #endif
  150525. r = vy;
  150526. sp_1024_point_from_ecc_point_32(p, pm);
  150527. sp_1024_point_from_ecc_point_32(q, qm);
  150528. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  150529. }
  150530. if (err == MP_OKAY) {
  150531. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  150532. }
  150533. if (err == MP_OKAY) {
  150534. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  150535. }
  150536. if (err == MP_OKAY) {
  150537. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  150538. }
  150539. if (err == MP_OKAY) {
  150540. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  150541. }
  150542. if (err == MP_OKAY) {
  150543. /* Generate pre-computation table: 1, 3, ... , 31 */
  150544. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  150545. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  150546. pre_vx[0][0] = 1;
  150547. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  150548. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  150549. /* [2]P for adding */
  150550. XMEMCPY(c, p, sizeof(sp_point_1024));
  150551. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  150552. vx[0] = 1;
  150553. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  150554. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  150555. /* 3, 5, ... */
  150556. for (i = 1; i < 16; i++) {
  150557. XMEMCPY(&pre_p[i], &pre_p[i-1], sizeof(sp_point_1024));
  150558. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  150559. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  150560. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  150561. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  150562. q, &pre_p[i], t, 0);
  150563. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i], p1024_mod);
  150564. }
  150565. j = sp_1024_order_op[0] / 2;
  150566. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  150567. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  150568. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  150569. /* Accumulate line into v and double point n times. */
  150570. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  150571. sp_1024_order_op[1], t);
  150572. for (i = 2; i < 290; i += 2) {
  150573. j = sp_1024_order_op[i];
  150574. if (j > 0) {
  150575. j /= 2;
  150576. /* Accumulate line into v and add P into C. */
  150577. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  150578. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  150579. t, 0);
  150580. }
  150581. else {
  150582. j = -j / 2;
  150583. /* Accumulate line into v and add P into C. */
  150584. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  150585. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  150586. t, 1);
  150587. }
  150588. /* Accumulate line into v and double point n times. */
  150589. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  150590. sp_1024_order_op[i + 1], t);
  150591. }
  150592. /* Final exponentiation */
  150593. sp_1024_proj_sqr_32(vx, vy, t);
  150594. sp_1024_proj_sqr_32(vx, vy, t);
  150595. /* Convert from PF_p[q] to F_p */
  150596. sp_1024_mont_inv_32(vx, vx, t);
  150597. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  150598. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  150599. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  150600. err = sp_1024_to_mp(r, res);
  150601. }
  150602. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150603. !defined(WOLFSSL_SP_NO_MALLOC)
  150604. if (td != NULL) {
  150605. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  150606. }
  150607. #endif
  150608. sp_1024_point_free_32(c, 1, NULL);
  150609. sp_1024_point_free_32(q, 1, NULL);
  150610. sp_1024_point_free_32(p, 1, NULL);
  150611. return err;
  150612. }
  150613. #endif /* WOLFSSL_SP_SMALL */
  150614. #ifdef WOLFSSL_SP_SMALL
  150615. /*
  150616. * Generate table for pairing.
  150617. *
  150618. * Small implementation does not use a table - returns 0 length.
  150619. *
  150620. * pm [in] Point to generate table for.
  150621. * table [in] Generated table.
  150622. * len [in,out] On in, the size of the buffer.
  150623. * On out, length of table generated.
  150624. * @return 0 on success.
  150625. * LENGTH_ONLY_E when table is NULL and only length returned.
  150626. * BUFFER_E when len is too small.
  150627. */
  150628. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  150629. word32* len)
  150630. {
  150631. int err = 0;
  150632. if (table == NULL) {
  150633. *len = 0;
  150634. err = LENGTH_ONLY_E;
  150635. }
  150636. else if (*len != 0) {
  150637. err = BUFFER_E;
  150638. }
  150639. (void)*pm;
  150640. return err;
  150641. }
  150642. /*
  150643. * Calculate r = pairing <P, Q>.
  150644. *
  150645. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  150646. *
  150647. * Small implementation does not use a table - use the normal implementation.
  150648. *
  150649. * @param [in] pm First point on E(F_p)[q].
  150650. * @param [in] qm Second point on E(F_p)[q].
  150651. * @param [in] res Result of calculation.
  150652. * @param [in] table Precomputed table of values.
  150653. * @param [in] len Length of precomputed table of values in bytes.
  150654. * @return 0 on success.
  150655. * @return MEMORY_E when dynamic memory allocation fails.
  150656. */
  150657. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  150658. mp_int* res, const byte* table, word32 len)
  150659. {
  150660. (void)table;
  150661. (void)len;
  150662. return sp_Pairing_1024(pm, qm, res);
  150663. }
  150664. #else
  150665. /*
  150666. * Calc l and c for the point when doubling p.
  150667. *
  150668. * l = 3 * (p.x^2 - 1) / (2 * p.y)
  150669. * c = l * p.x - p.y
  150670. *
  150671. * @param [out] lr Gradient result - table entry.
  150672. * @param [out] cr Constant result - table entry.
  150673. * @param [in] px X-ordinate of point to double.
  150674. * @param [in] py Y-ordinate of point to double.
  150675. * @param [in] t SP temporaries (3 used).
  150676. */
  150677. static void sp_1024_accum_dbl_calc_lc_32(sp_digit* lr, sp_digit* cr,
  150678. const sp_digit* px, const sp_digit* py, sp_digit* t)
  150679. {
  150680. sp_digit* t1 = t + 0 * 2 * 32;
  150681. sp_digit* t2 = t + 2 * 2 * 32;
  150682. sp_digit* l = t + 4 * 2 * 32;
  150683. /* l = 1 / 2 * p.y */
  150684. sp_1024_mont_dbl_32(l, py, p1024_mod);
  150685. sp_1024_mont_inv_32(l, l, t);
  150686. /* t1 = p.x^2 */
  150687. sp_1024_mont_sqr_32(t1, px, p1024_mod, p1024_mp_mod);
  150688. /* t1 = p.x - 1 */
  150689. sp_1024_mont_sub_32(t1, t1, p1024_norm_mod, p1024_mod);
  150690. /* t1 = 3 * (p.x^2 - 1) */
  150691. sp_1024_mont_dbl_32(t2, t1, p1024_mod);
  150692. sp_1024_mont_add_32(t1, t1, t2, p1024_mod);
  150693. /* t1 = 3 * (p.x^2 - 1) / (2 * p.y) */
  150694. sp_1024_mont_mul_32(l, l, t1, p1024_mod, p1024_mp_mod);
  150695. /* t2 = l * p.x */
  150696. sp_1024_mont_mul_32(t2, l, px, p1024_mod, p1024_mp_mod);
  150697. /* c = t2 = l * p.x - p.y */
  150698. sp_1024_mont_sub_32(t2, t2, py, p1024_mod);
  150699. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  150700. XMEMCPY(cr, t2, sizeof(sp_digit) * 32);
  150701. }
  150702. /*
  150703. * Calc l and c when adding p and c.
  150704. *
  150705. * l = (c.y - p.y) / (c.x - p.x)
  150706. * c = (p.x * c.y - cx * p.y) / (cx - p.x)
  150707. *
  150708. * @param [out] lr Gradient result - table entry.
  150709. * @param [out] cr Constant result - table entry.
  150710. * @param [in] px X-ordinate of point to add.
  150711. * @param [in] py Y-ordinate of point to add.
  150712. * @param [in] cx X-ordinate of current point.
  150713. * @param [in] cy Y-ordinate of current point.
  150714. * @param [in] t SP temporaries (3 used).
  150715. */
  150716. static void sp_1024_accum_add_calc_lc_32(sp_digit* lr, sp_digit* cr,
  150717. const sp_digit* px, const sp_digit* py, const sp_digit* cx,
  150718. const sp_digit* cy, sp_digit* t)
  150719. {
  150720. sp_digit* t1 = t + 0 * 2 * 32;
  150721. sp_digit* c = t + 2 * 2 * 32;
  150722. sp_digit* l = t + 4 * 2 * 32;
  150723. /* l = 1 / (c.x - p.x) */
  150724. sp_1024_mont_sub_32(l, cx, px, p1024_mod);
  150725. sp_1024_mont_inv_32(l, l, t);
  150726. /* c = p.x * c.y */
  150727. sp_1024_mont_mul_32(c, px, cy, p1024_mod, p1024_mp_mod);
  150728. /* t1 = c.x * p.y */
  150729. sp_1024_mont_mul_32(t1, cx, py, p1024_mod, p1024_mp_mod);
  150730. /* c = (p.x * c.y) - (c.x * p.y) */
  150731. sp_1024_mont_sub_32(c, c, t1, p1024_mod);
  150732. /* c = ((p.x * c.y) - (c.x * p.y)) / (c.x - p.x) */
  150733. sp_1024_mont_mul_32(c, c, l, p1024_mod, p1024_mp_mod);
  150734. /* t1 = c.y - p.y */
  150735. sp_1024_mont_sub_32(t1, cy, py, p1024_mod);
  150736. /* l = (c.y - p.y) / (c.x - p.x) */
  150737. sp_1024_mont_mul_32(l, t1, l, p1024_mod, p1024_mp_mod);
  150738. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  150739. XMEMCPY(cr, c, sizeof(sp_digit) * 32);
  150740. }
  150741. /*
  150742. * Calculate vx and vy given gradient l and constant c and point q.
  150743. *
  150744. * l is a the gradient and is multiplied by q->x.
  150745. * c is a the constant that is added to the multiplicative result.
  150746. * q->y is the y-ordinate in result to multiply.
  150747. *
  150748. * if dbl
  150749. * v* = v*^2
  150750. * r.x = l * q.x + c
  150751. * r.y = q->y
  150752. * v* = v* * r*
  150753. *
  150754. * @param [in,out] vx X-ordinate of projective value in F*.
  150755. * @param [in,out] vy Y-ordinate of projective value in F*.
  150756. * @param [in] l Gradient to multiply with.
  150757. * @param [in] c Constant to add with.
  150758. * @param [in] q ECC point - second point on E(F_P^2).
  150759. * @param [in] t SP temporaries (3 used).
  150760. * @param [in] dbl Indicates whether this is for doubling. Otherwise
  150761. * adding.
  150762. */
  150763. static void sp_1024_accumulate_line_lc_32(sp_digit* vx, sp_digit* vy,
  150764. const sp_digit* l, const sp_digit* c, const sp_point_1024* q,
  150765. sp_digit* t, int dbl)
  150766. {
  150767. sp_digit* rx = t + 4 * 2 * 32;
  150768. /* v = v^2 */
  150769. if (dbl) {
  150770. sp_1024_proj_sqr_32(vx, vy, t);
  150771. }
  150772. /* rx = l * q.x + c */
  150773. sp_1024_mont_mul_32(rx, l, q->x, p1024_mod, p1024_mp_mod);
  150774. sp_1024_mont_add_32(rx, rx, c, p1024_mod);
  150775. /* v = v^2 * r */
  150776. sp_1024_proj_mul_32(vx, vy, rx, q->y, t);
  150777. }
  150778. /* Operations to perform based on order - 1.
  150779. * Sliding window. Start at bottom and stop when bottom bit is one.
  150780. * Subtract if top bit in window is one.
  150781. * Width of 6 bits.
  150782. * Pairs: #dbls, add/subtract window value
  150783. */
  150784. static const signed char sp_1024_order_op_pre[] = {
  150785. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  150786. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  150787. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  150788. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  150789. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  150790. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  150791. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  150792. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  150793. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  150794. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  150795. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  150796. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  150797. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  150798. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  150799. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  150800. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  150801. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  150802. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  150803. -3, 1,
  150804. };
  150805. /*
  150806. * Generate table for pairing.
  150807. *
  150808. * Calculate the graident (l) and constant (c) at each step of the way.
  150809. * Sliding window. Start at bottom and stop when bottom bit is one.
  150810. * Subtract if top bit in window is one.
  150811. * Width of 6 bits.
  150812. *
  150813. * pm [in] Point to generate table for.
  150814. * table [in] Generated table.
  150815. * len [in,out] On in, the size of the buffer.
  150816. * On out, length of table generated.
  150817. * @return 0 on success.
  150818. * LENGTH_ONLY_E when table is NULL and only length returned.
  150819. * BUFFER_E when len is too small.
  150820. * MEMORY_E when dynamic memory allocation fauls.
  150821. */
  150822. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  150823. word32* len)
  150824. {
  150825. int err = 0;
  150826. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150827. !defined(WOLFSSL_SP_NO_MALLOC)
  150828. sp_digit* td = NULL;
  150829. sp_digit* t;
  150830. sp_point_1024* pre_p;
  150831. #else
  150832. sp_digit t[6 * 2 * 32];
  150833. sp_point_1024 pre_p[16];
  150834. sp_point_1024 pd;
  150835. sp_point_1024 cd;
  150836. sp_point_1024 negd;
  150837. #endif
  150838. sp_point_1024* p = NULL;
  150839. sp_point_1024* c = NULL;
  150840. sp_point_1024* neg = NULL;
  150841. int i;
  150842. int j;
  150843. int k;
  150844. sp_table_entry_1024* precomp = (sp_table_entry_1024*)table;
  150845. if (table == NULL) {
  150846. *len = sizeof(sp_table_entry_1024) * 1167;
  150847. err = LENGTH_ONLY_E;
  150848. }
  150849. if ((err == MP_OKAY) &&
  150850. (*len < (int)(sizeof(sp_table_entry_1024) * 1167))) {
  150851. err = BUFFER_E;
  150852. }
  150853. if (err == MP_OKAY) {
  150854. err = sp_1024_point_new_32(NULL, pd, p);
  150855. }
  150856. if (err == MP_OKAY) {
  150857. err = sp_1024_point_new_32(NULL, cd, c);
  150858. }
  150859. if (err == MP_OKAY) {
  150860. err = sp_1024_point_new_32(NULL, negd, neg);
  150861. }
  150862. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150863. !defined(WOLFSSL_SP_NO_MALLOC)
  150864. if (err == MP_OKAY) {
  150865. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 32 * 2 + 16 * sizeof(sp_point_1024), NULL,
  150866. DYNAMIC_TYPE_TMP_BUFFER);
  150867. if (td == NULL) {
  150868. err = MEMORY_E;
  150869. }
  150870. }
  150871. #endif
  150872. if (err == MP_OKAY) {
  150873. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150874. !defined(WOLFSSL_SP_NO_MALLOC)
  150875. t = td;
  150876. pre_p = (sp_point_1024*)(td + 6 * 32 * 2);
  150877. #endif
  150878. sp_1024_point_from_ecc_point_32(p, pm);
  150879. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  150880. }
  150881. if (err == MP_OKAY) {
  150882. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  150883. }
  150884. if (err == MP_OKAY) {
  150885. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  150886. neg->infinity = 0;
  150887. c->infinity = 0;
  150888. /* Generate pre-computation table: 1, 3, ... , 31 */
  150889. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  150890. /* [2]P for adding */
  150891. sp_1024_proj_point_dbl_32(c, p, t);
  150892. /* 1, 3, ... */
  150893. for (i = 1; i < 16; i++) {
  150894. sp_1024_proj_point_add_32(&pre_p[i], &pre_p[i-1], c, t);
  150895. sp_1024_mont_map_32(&pre_p[i], t);
  150896. }
  150897. k = 0;
  150898. j = sp_1024_order_op_pre[0] / 2;
  150899. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  150900. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  150901. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x, c->y, t);
  150902. k++;
  150903. sp_1024_proj_point_dbl_32(c, c, t);
  150904. sp_1024_mont_map_32(c, t);
  150905. }
  150906. for (i = 2; i < 290; i += 2) {
  150907. j = sp_1024_order_op_pre[i];
  150908. if (j > 0) {
  150909. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  150910. pre_p[j/2].x, pre_p[j/2].y, c->x, c->y, t);
  150911. k++;
  150912. sp_1024_proj_point_add_32(c, c, &pre_p[j/2], t);
  150913. sp_1024_mont_map_32(c, t);
  150914. }
  150915. else {
  150916. XMEMCPY(neg->x, pre_p[-j / 2].x, sizeof(pre_p->x));
  150917. sp_1024_mont_sub_32(neg->y, p1024_mod, pre_p[-j / 2].y,
  150918. p1024_mod);
  150919. XMEMCPY(neg->z, pre_p[-j / 2].z, sizeof(pre_p->z));
  150920. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  150921. neg->x, neg->y, c->x, c->y, t);
  150922. k++;
  150923. sp_1024_proj_point_add_32(c, c, neg, t);
  150924. sp_1024_mont_map_32(c, t);
  150925. }
  150926. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  150927. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x, c->y, t);
  150928. k++;
  150929. sp_1024_proj_point_dbl_32(c, c, t);
  150930. sp_1024_mont_map_32(c, t);
  150931. }
  150932. }
  150933. *len = sizeof(sp_table_entry_1024) * 1167;
  150934. }
  150935. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150936. !defined(WOLFSSL_SP_NO_MALLOC)
  150937. if (td != NULL) {
  150938. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  150939. }
  150940. #endif
  150941. sp_1024_point_free_32(neg, 1, NULL);
  150942. sp_1024_point_free_32(c, 1, NULL);
  150943. sp_1024_point_free_32(p, 1, NULL);
  150944. return err;
  150945. }
  150946. /*
  150947. * Calculate r = pairing <P, Q>.
  150948. *
  150949. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  150950. *
  150951. * Sliding window. Start at bottom and stop when bottom bit is one.
  150952. * Subtract if top bit in window is one.
  150953. * Width of 6 bits.
  150954. * Pre-generate values in window (1, 3, ...) - only V.
  150955. * Table contains all gradient l and a constant for each point on the path.
  150956. *
  150957. * @param [in] pm First point on E(F_p)[q].
  150958. * @param [in] qm Second point on E(F_p)[q].
  150959. * @param [in] res Result of calculation.
  150960. * @param [in] table Precomputed table of values.
  150961. * @param [in] len Length of precomputed table of values in bytes.
  150962. * @return 0 on success.
  150963. * @return MEMORY_E when dynamic memory allocation fails.
  150964. */
  150965. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  150966. mp_int* res, const byte* table, word32 len)
  150967. {
  150968. int err = 0;
  150969. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  150970. !defined(WOLFSSL_SP_NO_MALLOC)
  150971. sp_digit* td = NULL;
  150972. sp_digit* t;
  150973. sp_digit* vx;
  150974. sp_digit* vy;
  150975. sp_digit (*pre_vx)[64];
  150976. sp_digit (*pre_vy)[64];
  150977. sp_digit (*pre_nvy)[64];
  150978. #else
  150979. sp_digit t[6 * 2 * 32];
  150980. sp_digit vx[2 * 32];
  150981. sp_digit vy[2 * 32];
  150982. sp_digit pre_vx[16][64];
  150983. sp_digit pre_vy[16][64];
  150984. sp_digit pre_nvy[16][64];
  150985. sp_point_1024 pd;
  150986. sp_point_1024 qd;
  150987. sp_point_1024 cd;
  150988. #endif
  150989. sp_point_1024* p = NULL;
  150990. sp_point_1024* q = NULL;
  150991. sp_point_1024* c = NULL;
  150992. sp_digit* r = NULL;
  150993. int i;
  150994. int j;
  150995. int k;
  150996. const sp_table_entry_1024* precomp = (const sp_table_entry_1024*)table;
  150997. if (len < (int)(sizeof(sp_table_entry_1024) * 1167)) {
  150998. err = BUFFER_E;
  150999. }
  151000. if (err == MP_OKAY) {
  151001. err = sp_1024_point_new_32(NULL, pd, p);
  151002. }
  151003. if (err == MP_OKAY) {
  151004. err = sp_1024_point_new_32(NULL, qd, q);
  151005. }
  151006. if (err == MP_OKAY) {
  151007. err = sp_1024_point_new_32(NULL, cd, c);
  151008. }
  151009. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  151010. !defined(WOLFSSL_SP_NO_MALLOC)
  151011. if (err == MP_OKAY) {
  151012. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 56 * 32 * 2, NULL,
  151013. DYNAMIC_TYPE_TMP_BUFFER);
  151014. if (td == NULL) {
  151015. err = MEMORY_E;
  151016. }
  151017. }
  151018. #endif
  151019. if (err == MP_OKAY) {
  151020. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  151021. !defined(WOLFSSL_SP_NO_MALLOC)
  151022. t = td;
  151023. vx = td + 6 * 32 * 2;
  151024. vy = td + 7 * 32 * 2;
  151025. pre_vx = (sp_digit(*)[64])(td + 8 * 32 * 2);
  151026. pre_vy = (sp_digit(*)[64])(td + 24 * 32 * 2);
  151027. pre_nvy = (sp_digit(*)[64])(td + 40 * 32 * 2);
  151028. #endif
  151029. r = vy;
  151030. sp_1024_point_from_ecc_point_32(p, pm);
  151031. sp_1024_point_from_ecc_point_32(q, qm);
  151032. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  151033. }
  151034. if (err == MP_OKAY) {
  151035. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  151036. }
  151037. if (err == MP_OKAY) {
  151038. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  151039. }
  151040. if (err == MP_OKAY) {
  151041. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  151042. }
  151043. if (err == MP_OKAY) {
  151044. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  151045. }
  151046. if (err == MP_OKAY) {
  151047. /* Generate pre-computation table: 1, 3, ... , 31 */
  151048. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  151049. pre_vx[0][0] = 1;
  151050. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  151051. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  151052. /* [2]P for adding */
  151053. XMEMCPY(c, p, sizeof(sp_point_1024));
  151054. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  151055. vx[0] = 1;
  151056. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  151057. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  151058. /* 3, 5, ... */
  151059. for (i = 1; i < 16; i++) {
  151060. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  151061. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  151062. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  151063. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  151064. q, p, t, 0);
  151065. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i],
  151066. p1024_mod);
  151067. }
  151068. XMEMCPY(c->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  151069. c->infinity = 0;
  151070. j = sp_1024_order_op_pre[0] / 2;
  151071. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  151072. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  151073. k = 0;
  151074. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  151075. /* Accumulate line into v and double point. */
  151076. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  151077. precomp[k].y, q, t, 1);
  151078. k++;
  151079. }
  151080. for (i = 2; i < 290; i += 2) {
  151081. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  151082. precomp[k].y, q, t, 0);
  151083. k++;
  151084. j = sp_1024_order_op_pre[i];
  151085. if (j > 0) {
  151086. j /= 2;
  151087. /* Accumulate line into v. */
  151088. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  151089. }
  151090. else {
  151091. j = -j / 2;
  151092. /* Accumulate line into v. */
  151093. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  151094. }
  151095. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  151096. /* Accumulate line into v and double point. */
  151097. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  151098. precomp[k].y, q, t, 1);
  151099. k++;
  151100. }
  151101. }
  151102. /* Final exponentiation */
  151103. sp_1024_proj_sqr_32(vx, vy, t);
  151104. sp_1024_proj_sqr_32(vx, vy, t);
  151105. /* Convert from PF_p[q] to F_p */
  151106. sp_1024_mont_inv_32(vx, vx, t);
  151107. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  151108. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  151109. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  151110. err = sp_1024_to_mp(r, res);
  151111. }
  151112. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  151113. !defined(WOLFSSL_SP_NO_MALLOC)
  151114. if (td != NULL) {
  151115. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  151116. }
  151117. #endif
  151118. sp_1024_point_free_32(c, 1, NULL);
  151119. sp_1024_point_free_32(q, 1, NULL);
  151120. sp_1024_point_free_32(p, 1, NULL);
  151121. return err;
  151122. }
  151123. #endif /* WOLFSSL_SP_SMALL */
  151124. #ifdef HAVE_ECC_CHECK_KEY
  151125. /* Read big endian unsigned byte array into r.
  151126. *
  151127. * r A single precision integer.
  151128. * size Maximum number of bytes to convert
  151129. * a Byte array.
  151130. * n Number of bytes in array to read.
  151131. */
  151132. static void sp_1024_from_bin(sp_digit* r, int size, const byte* a, int n)
  151133. {
  151134. int i;
  151135. int j;
  151136. byte* d;
  151137. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  151138. r[j] = ((sp_digit)a[i - 0] << 0) |
  151139. ((sp_digit)a[i - 1] << 8) |
  151140. ((sp_digit)a[i - 2] << 16) |
  151141. ((sp_digit)a[i - 3] << 24);
  151142. j++;
  151143. }
  151144. if (i >= 0) {
  151145. r[j] = 0;
  151146. d = (byte*)r;
  151147. switch (i) {
  151148. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  151149. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  151150. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  151151. }
  151152. j++;
  151153. }
  151154. for (; j < size; j++) {
  151155. r[j] = 0;
  151156. }
  151157. }
  151158. /* Check that the x and y oridinates are a valid point on the curve.
  151159. *
  151160. * point EC point.
  151161. * heap Heap to use if dynamically allocating.
  151162. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  151163. * not on the curve and MP_OKAY otherwise.
  151164. */
  151165. static int sp_1024_ecc_is_point_32(const sp_point_1024* point,
  151166. void* heap)
  151167. {
  151168. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  151169. sp_digit* t1 = NULL;
  151170. #else
  151171. sp_digit t1[32 * 4];
  151172. #endif
  151173. sp_digit* t2 = NULL;
  151174. sp_int32 n;
  151175. int err = MP_OKAY;
  151176. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  151177. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 4, heap, DYNAMIC_TYPE_ECC);
  151178. if (t1 == NULL)
  151179. err = MEMORY_E;
  151180. #endif
  151181. (void)heap;
  151182. if (err == MP_OKAY) {
  151183. t2 = t1 + 2 * 32;
  151184. sp_1024_sqr_32(t1, point->y);
  151185. (void)sp_1024_mod_32(t1, t1, p1024_mod);
  151186. sp_1024_sqr_32(t2, point->x);
  151187. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  151188. sp_1024_mul_32(t2, t2, point->x);
  151189. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  151190. (void)sp_1024_sub_32(t2, p1024_mod, t2);
  151191. sp_1024_mont_add_32(t1, t1, t2, p1024_mod);
  151192. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  151193. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  151194. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  151195. n = sp_1024_cmp_32(t1, p1024_mod);
  151196. sp_1024_cond_sub_32(t1, t1, p1024_mod, ~(n >> 31));
  151197. sp_1024_norm_32(t1);
  151198. if (!sp_1024_iszero_32(t1)) {
  151199. err = MP_VAL;
  151200. }
  151201. }
  151202. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  151203. if (t1 != NULL)
  151204. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  151205. #endif
  151206. return err;
  151207. }
  151208. /* Check that the x and y oridinates are a valid point on the curve.
  151209. *
  151210. * pX X ordinate of EC point.
  151211. * pY Y ordinate of EC point.
  151212. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  151213. * not on the curve and MP_OKAY otherwise.
  151214. */
  151215. int sp_ecc_is_point_1024(const mp_int* pX, const mp_int* pY)
  151216. {
  151217. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  151218. sp_point_1024* pub = NULL;
  151219. #else
  151220. sp_point_1024 pub[1];
  151221. #endif
  151222. const byte one[1] = { 1 };
  151223. int err = MP_OKAY;
  151224. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  151225. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), NULL,
  151226. DYNAMIC_TYPE_ECC);
  151227. if (pub == NULL)
  151228. err = MEMORY_E;
  151229. #endif
  151230. if (err == MP_OKAY) {
  151231. sp_1024_from_mp(pub->x, 32, pX);
  151232. sp_1024_from_mp(pub->y, 32, pY);
  151233. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  151234. err = sp_1024_ecc_is_point_32(pub, NULL);
  151235. }
  151236. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  151237. if (pub != NULL)
  151238. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  151239. #endif
  151240. return err;
  151241. }
  151242. /* Check that the private scalar generates the EC point (px, py), the point is
  151243. * on the curve and the point has the correct order.
  151244. *
  151245. * pX X ordinate of EC point.
  151246. * pY Y ordinate of EC point.
  151247. * privm Private scalar that generates EC point.
  151248. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  151249. * not on the curve, ECC_INF_E if the point does not have the correct order,
  151250. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  151251. * MP_OKAY otherwise.
  151252. */
  151253. int sp_ecc_check_key_1024(const mp_int* pX, const mp_int* pY,
  151254. const mp_int* privm, void* heap)
  151255. {
  151256. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  151257. sp_digit* priv = NULL;
  151258. sp_point_1024* pub = NULL;
  151259. #else
  151260. sp_digit priv[32];
  151261. sp_point_1024 pub[2];
  151262. #endif
  151263. sp_point_1024* p = NULL;
  151264. const byte one[1] = { 1 };
  151265. int err = MP_OKAY;
  151266. /* Quick check the lengs of public key ordinates and private key are in
  151267. * range. Proper check later.
  151268. */
  151269. if (((mp_count_bits(pX) > 1024) ||
  151270. (mp_count_bits(pY) > 1024) ||
  151271. ((privm != NULL) && (mp_count_bits(privm) > 1024)))) {
  151272. err = ECC_OUT_OF_RANGE_E;
  151273. }
  151274. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  151275. if (err == MP_OKAY) {
  151276. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  151277. DYNAMIC_TYPE_ECC);
  151278. if (pub == NULL)
  151279. err = MEMORY_E;
  151280. }
  151281. if (err == MP_OKAY && privm) {
  151282. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  151283. DYNAMIC_TYPE_ECC);
  151284. if (priv == NULL)
  151285. err = MEMORY_E;
  151286. }
  151287. #endif
  151288. if (err == MP_OKAY) {
  151289. p = pub + 1;
  151290. sp_1024_from_mp(pub->x, 32, pX);
  151291. sp_1024_from_mp(pub->y, 32, pY);
  151292. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  151293. if (privm)
  151294. sp_1024_from_mp(priv, 32, privm);
  151295. /* Check point at infinitiy. */
  151296. if ((sp_1024_iszero_32(pub->x) != 0) &&
  151297. (sp_1024_iszero_32(pub->y) != 0)) {
  151298. err = ECC_INF_E;
  151299. }
  151300. }
  151301. /* Check range of X and Y */
  151302. if ((err == MP_OKAY) &&
  151303. ((sp_1024_cmp_32(pub->x, p1024_mod) >= 0) ||
  151304. (sp_1024_cmp_32(pub->y, p1024_mod) >= 0))) {
  151305. err = ECC_OUT_OF_RANGE_E;
  151306. }
  151307. if (err == MP_OKAY) {
  151308. /* Check point is on curve */
  151309. err = sp_1024_ecc_is_point_32(pub, heap);
  151310. }
  151311. if (err == MP_OKAY) {
  151312. /* Point * order = infinity */
  151313. err = sp_1024_ecc_mulmod_32(p, pub, p1024_order, 1, 1, heap);
  151314. }
  151315. /* Check result is infinity */
  151316. if ((err == MP_OKAY) && ((sp_1024_iszero_32(p->x) == 0) ||
  151317. (sp_1024_iszero_32(p->y) == 0))) {
  151318. err = ECC_INF_E;
  151319. }
  151320. if (privm) {
  151321. if (err == MP_OKAY) {
  151322. /* Base * private = point */
  151323. err = sp_1024_ecc_mulmod_base_32(p, priv, 1, 1, heap);
  151324. }
  151325. /* Check result is public key */
  151326. if ((err == MP_OKAY) &&
  151327. ((sp_1024_cmp_32(p->x, pub->x) != 0) ||
  151328. (sp_1024_cmp_32(p->y, pub->y) != 0))) {
  151329. err = ECC_PRIV_KEY_E;
  151330. }
  151331. }
  151332. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  151333. if (pub != NULL)
  151334. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  151335. if (priv != NULL)
  151336. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  151337. #endif
  151338. return err;
  151339. }
  151340. #endif
  151341. #endif /* WOLFSSL_SP_1024 */
  151342. #endif /* WOLFCRYPT_HAVE_SAKKE */
  151343. #endif /* WOLFSSL_HAVE_SP_ECC */
  151344. #endif /* WOLFSSL_SP_ARM32_ASM */
  151345. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH | WOLFSSL_HAVE_SP_ECC */